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
|
|||
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 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 |
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.