mirror of
https://github.com/chubin/cheat.sh.git
synced 2026-06-20 13:16:44 +02:00
caching separated into cache.py
This commit is contained in:
@@ -4,6 +4,7 @@ class Adapter(object):
|
||||
|
||||
_adapter_name = None
|
||||
_output_format = 'code'
|
||||
_cache_needed = False
|
||||
|
||||
def __init__(self):
|
||||
self._list = {None: self._get_list()}
|
||||
@@ -30,6 +31,13 @@ class Adapter(object):
|
||||
"""
|
||||
return topic in self._list[None]
|
||||
|
||||
def is_cache_needed(self):
|
||||
"""
|
||||
Return True if answers should be cached.
|
||||
Return False if answers should not be cached.
|
||||
"""
|
||||
return self._cache_needed
|
||||
|
||||
@abc.abstractmethod
|
||||
def _get_page(self, topic, request_options=None):
|
||||
"""
|
||||
|
||||
@@ -18,6 +18,7 @@ class Tldr(Adapter):
|
||||
|
||||
_adapter_name = "tldr"
|
||||
_output_format = "code"
|
||||
_cache_needed = True
|
||||
|
||||
def _get_list(self, prefix=None):
|
||||
return [filename[:-3]
|
||||
@@ -47,6 +48,7 @@ class Cheat(Adapter):
|
||||
|
||||
_adapter_name = "cheat"
|
||||
_output_format = "code"
|
||||
_cache_needed = True
|
||||
|
||||
def _get_list(self, prefix=None):
|
||||
return _get_filenames(PATH_CHEAT_PAGES)
|
||||
@@ -75,6 +77,7 @@ class Translation(Adapter):
|
||||
|
||||
_adapter_name = "translation"
|
||||
_output_format = "text"
|
||||
_cache_needed = True
|
||||
|
||||
def _get_list(self, prefix=None):
|
||||
return []
|
||||
|
||||
@@ -794,6 +794,9 @@ _ADAPTERS = {cls.prefix: cls() for cls in vars()['LearnXYAdapter'].__subclasses_
|
||||
|
||||
class LearnXinY(Adapter):
|
||||
|
||||
_output_format = 'code'
|
||||
_cache_needed = True
|
||||
|
||||
def __init__(self):
|
||||
self.adapters = _ADAPTERS
|
||||
Adapter.__init__(self)
|
||||
|
||||
@@ -13,11 +13,13 @@ sys.path.append(os.path.abspath(os.path.join(os.path.dirname(__file__), '..')))
|
||||
from globals import MYDIR
|
||||
|
||||
from adapter import Adapter
|
||||
from languages_data import SO_NAME
|
||||
|
||||
class Question(Adapter):
|
||||
|
||||
_adapter_name = "question"
|
||||
_output_format = "code"
|
||||
_output_format = "text+code"
|
||||
_cache_needed = True
|
||||
|
||||
def _get_page(self, topic, request_options=None):
|
||||
"""
|
||||
|
||||
@@ -0,0 +1,45 @@
|
||||
import os
|
||||
import json
|
||||
import redis
|
||||
from globals import REDISHOST
|
||||
|
||||
if os.environ.get('REDIS_HOST', '').lower() != 'none':
|
||||
_REDIS = redis.StrictRedis(host=REDISHOST, port=6379, db=0)
|
||||
else:
|
||||
_REDIS = None
|
||||
|
||||
if os.environ.get('REDIS_PREFIX', '').lower() != 'none':
|
||||
_REDIS_PREFIX = os.environ.get('REDIS_PREFIX', '') + ':'
|
||||
else:
|
||||
_REDIS_PREFIX = ''
|
||||
|
||||
def put(key, value):
|
||||
"""
|
||||
Save `value` with `key`, and serialize it if needed
|
||||
"""
|
||||
|
||||
if _REDIS_PREFIX:
|
||||
key = _REDIS_PREFIX + key
|
||||
|
||||
if _REDIS:
|
||||
if isinstance(value, (dict, list)):
|
||||
value = json.dumps(value)
|
||||
|
||||
_REDIS.set(key, value)
|
||||
|
||||
def get(key):
|
||||
"""
|
||||
Read `value` by `key`, and deserialize it if needed
|
||||
"""
|
||||
|
||||
if _REDIS_PREFIX:
|
||||
key = _REDIS_PREFIX + key
|
||||
|
||||
if _REDIS:
|
||||
value = _REDIS.get(key)
|
||||
try:
|
||||
value = json.loads(value)
|
||||
except (ValueError, TypeError):
|
||||
pass
|
||||
return value
|
||||
return None
|
||||
+7
-16
@@ -31,19 +31,14 @@ import re
|
||||
from itertools import groupby, chain
|
||||
from tempfile import NamedTemporaryFile
|
||||
|
||||
import redis
|
||||
import cache
|
||||
|
||||
MYDIR = os.path.abspath(os.path.join(__file__, '..', '..'))
|
||||
sys.path.append("%s/lib/" % MYDIR)
|
||||
from languages_data import VIM_NAME
|
||||
from globals import PATH_VIM_ENVIRONMENT, REDISHOST
|
||||
from globals import PATH_VIM_ENVIRONMENT
|
||||
# pylint: enable=wrong-import-position,wrong-import-order
|
||||
|
||||
if os.environ.get('REDIS_HOST', '').lower() != 'none':
|
||||
REDIS = redis.StrictRedis(host=REDISHOST, port=6379, db=1)
|
||||
else:
|
||||
REDIS = None
|
||||
|
||||
FNULL = open(os.devnull, 'w')
|
||||
TEXT = 0
|
||||
CODE = 1
|
||||
@@ -301,16 +296,12 @@ def beautify(text, lang, options):
|
||||
# if mode is unknown, just don't transform the text at all
|
||||
return text
|
||||
|
||||
if REDIS:
|
||||
digest = "t:%s:%s:%s" % (hashlib.md5(text).hexdigest(), lang, mode)
|
||||
answer = REDIS.get(digest)
|
||||
if answer:
|
||||
return answer
|
||||
|
||||
digest = "t:%s:%s:%s" % (hashlib.md5(text).hexdigest(), lang, mode)
|
||||
answer = cache.get(digest)
|
||||
if answer:
|
||||
return answer
|
||||
answer = _beautify(text, lang, **beauty_options)
|
||||
|
||||
if REDIS:
|
||||
REDIS.set(digest, answer)
|
||||
cache.put(digest, answer)
|
||||
|
||||
return answer
|
||||
|
||||
|
||||
@@ -18,6 +18,7 @@ from languages_data import LANGUAGE_ALIAS, SO_NAME, rewrite_editor_section_name
|
||||
|
||||
import fmt.comments
|
||||
|
||||
import cache
|
||||
import adapter.cheat_sheets
|
||||
import adapter.cmd
|
||||
import adapter.internal
|
||||
Reference in New Issue
Block a user