Skip to content

Commit 50f4aba

Browse files
committed
caching separated into cache.py
1 parent fefa3bc commit 50f4aba

File tree

7 files changed

+70
-17
lines changed

7 files changed

+70
-17
lines changed

lib/adapter/adapter.py

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ class Adapter(object):
44

55
_adapter_name = None
66
_output_format = 'code'
7+
_cache_needed = False
78

89
def __init__(self):
910
self._list = {None: self._get_list()}
@@ -30,6 +31,13 @@ def is_found(self, topic):
3031
"""
3132
return topic in self._list[None]
3233

34+
def is_cache_needed(self):
35+
"""
36+
Return True if answers should be cached.
37+
Return False if answers should not be cached.
38+
"""
39+
return self._cache_needed
40+
3341
@abc.abstractmethod
3442
def _get_page(self, topic, request_options=None):
3543
"""

lib/adapter/cmd.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ class Tldr(Adapter):
1818

1919
_adapter_name = "tldr"
2020
_output_format = "code"
21+
_cache_needed = True
2122

2223
def _get_list(self, prefix=None):
2324
return [filename[:-3]
@@ -47,6 +48,7 @@ class Cheat(Adapter):
4748

4849
_adapter_name = "cheat"
4950
_output_format = "code"
51+
_cache_needed = True
5052

5153
def _get_list(self, prefix=None):
5254
return _get_filenames(PATH_CHEAT_PAGES)
@@ -75,6 +77,7 @@ class Translation(Adapter):
7577

7678
_adapter_name = "translation"
7779
_output_format = "text"
80+
_cache_needed = True
7881

7982
def _get_list(self, prefix=None):
8083
return []

lib/adapter/learnxiny.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -794,6 +794,9 @@ class LearnVisualBasicAdapter(LearnXYAdapter):
794794

795795
class LearnXinY(Adapter):
796796

797+
_output_format = 'code'
798+
_cache_needed = True
799+
797800
def __init__(self):
798801
self.adapters = _ADAPTERS
799802
Adapter.__init__(self)

lib/adapter/question.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,11 +13,13 @@
1313
from globals import MYDIR
1414

1515
from adapter import Adapter
16+
from languages_data import SO_NAME
1617

1718
class Question(Adapter):
1819

1920
_adapter_name = "question"
20-
_output_format = "code"
21+
_output_format = "text+code"
22+
_cache_needed = True
2123

2224
def _get_page(self, topic, request_options=None):
2325
"""

lib/cache.py

Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
import os
2+
import json
3+
import redis
4+
from globals import REDISHOST
5+
6+
if os.environ.get('REDIS_HOST', '').lower() != 'none':
7+
_REDIS = redis.StrictRedis(host=REDISHOST, port=6379, db=0)
8+
else:
9+
_REDIS = None
10+
11+
if os.environ.get('REDIS_PREFIX', '').lower() != 'none':
12+
_REDIS_PREFIX = os.environ.get('REDIS_PREFIX', '') + ':'
13+
else:
14+
_REDIS_PREFIX = ''
15+
16+
def put(key, value):
17+
"""
18+
Save `value` with `key`, and serialize it if needed
19+
"""
20+
21+
if _REDIS_PREFIX:
22+
key = _REDIS_PREFIX + key
23+
24+
if _REDIS:
25+
if isinstance(value, (dict, list)):
26+
value = json.dumps(value)
27+
28+
_REDIS.set(key, value)
29+
30+
def get(key):
31+
"""
32+
Read `value` by `key`, and deserialize it if needed
33+
"""
34+
35+
if _REDIS_PREFIX:
36+
key = _REDIS_PREFIX + key
37+
38+
if _REDIS:
39+
value = _REDIS.get(key)
40+
try:
41+
value = json.loads(value)
42+
except (ValueError, TypeError):
43+
pass
44+
return value
45+
return None

lib/fmt/comments.py

Lines changed: 7 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -31,19 +31,14 @@
3131
from itertools import groupby, chain
3232
from tempfile import NamedTemporaryFile
3333

34-
import redis
34+
import cache
3535

3636
MYDIR = os.path.abspath(os.path.join(__file__, '..', '..'))
3737
sys.path.append("%s/lib/" % MYDIR)
3838
from languages_data import VIM_NAME
39-
from globals import PATH_VIM_ENVIRONMENT, REDISHOST
39+
from globals import PATH_VIM_ENVIRONMENT
4040
# pylint: enable=wrong-import-position,wrong-import-order
4141

42-
if os.environ.get('REDIS_HOST', '').lower() != 'none':
43-
REDIS = redis.StrictRedis(host=REDISHOST, port=6379, db=1)
44-
else:
45-
REDIS = None
46-
4742
FNULL = open(os.devnull, 'w')
4843
TEXT = 0
4944
CODE = 1
@@ -301,16 +296,12 @@ def beautify(text, lang, options):
301296
# if mode is unknown, just don't transform the text at all
302297
return text
303298

304-
if REDIS:
305-
digest = "t:%s:%s:%s" % (hashlib.md5(text).hexdigest(), lang, mode)
306-
answer = REDIS.get(digest)
307-
if answer:
308-
return answer
309-
299+
digest = "t:%s:%s:%s" % (hashlib.md5(text).hexdigest(), lang, mode)
300+
answer = cache.get(digest)
301+
if answer:
302+
return answer
310303
answer = _beautify(text, lang, **beauty_options)
311-
312-
if REDIS:
313-
REDIS.set(digest, answer)
304+
cache.put(digest, answer)
314305

315306
return answer
316307

lib/get_answer.py renamed to lib/routing.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818

1919
import fmt.comments
2020

21+
import cache
2122
import adapter.cheat_sheets
2223
import adapter.cmd
2324
import adapter.internal

0 commit comments

Comments
 (0)