Completed
Push — develop ( d8b783...f586da )
by Jace
03:43
created

coveragespace/cache.py (2 issues)

1 1
import os
2 1
import pickle
3 1
import logging
4
5
6 1
log = logging.getLogger(__name__)
7
8
9 1
class Cache(object):
10
11 1
    PATH = os.path.join('.cache', 'coverage.space')
12
13 1
    def __init__(self):
14 1
        self._data = {}
15 1
        self._load()
16
17 1
    def _load(self):
18 1
        try:
19 1
            with open(self.PATH, 'rb') as fin:
20 1
                text = fin.read()
21 1
        except IOError:
22 1
            text = None
23
24 1
        try:
25 1
            data = pickle.loads(text)
26 1
        except (TypeError, KeyError, IndexError):
27 1
            data = None
28
29 1
        if isinstance(data, dict):
30 1
            self._data = data
31
32 1
    def _store(self):
33 1
        directory = os.path.dirname(self.PATH)
34 1
        if not os.path.exists(directory):
35 1
            os.makedirs(directory)
36
37 1
        text = pickle.dumps(self._data)
38 1
        with open(self.PATH, 'wb') as fout:
39 1
            fout.write(text)
40
41 1
    def set(self, key, value):
42 1
        try:
43 1
            url, data = key
44
        except ValueError:
45
            log.debug("Setting cache for %s", key)
46
        else:
47 1
            log.debug("Setting cache for %s: %s", url, data)
48 1
            key = self._slugify(*key)
0 ignored issues
show
Usage of * or ** arguments should usually be done with care.

Generally, there is nothing wrong with usage of * or ** arguments. For readability of the code base, we suggest to not over-use these language constructs though.

For more information, we can recommend this blog post from Ned Batchelder including its comments which also touches this aspect.

Loading history...
49 1
        self._data[key] = value
50 1
        log.debug("Cached value: %s", value)
51 1
        self._store()
52
53 1
    def get(self, key, default=None):
54 1
        try:
55 1
            url, data = key
56 1
        except ValueError:
57 1
            log.debug("Getting cache for %s", key)
58
        else:
59 1
            log.debug("Getting cache for %s: %s", url, data)
60 1
            key = self._slugify(*key)
0 ignored issues
show
Usage of * or ** arguments should usually be done with care.

Generally, there is nothing wrong with usage of * or ** arguments. For readability of the code base, we suggest to not over-use these language constructs though.

For more information, we can recommend this blog post from Ned Batchelder including its comments which also touches this aspect.

Loading history...
61 1
        value = self._data.get(key, default)
62 1
        log.debug("Cached value: %s", value)
63 1
        return value
64
65 1
    @staticmethod
66
    def _slugify(url, data):
67
        return (url, hash(frozenset(data.items())))
68