added WTTRIN_TEST mode for proxy.py

v2
Igor Chubin 5 years ago
parent 8695664f57
commit 87d7e3c863

@ -7,6 +7,10 @@ The proxy server acts as a backend for the wttr.in service.
It caches the answers and handles various data sources transforming their It caches the answers and handles various data sources transforming their
answers into format supported by the wttr.in service. answers into format supported by the wttr.in service.
If WTTRIN_TEST is specified, it works in a special test mode:
it does not fetch and does not store the data in the cache,
but is using the fake data from "test/proxy-data".
""" """
from __future__ import print_function from __future__ import print_function
@ -35,7 +39,10 @@ from globals import PROXY_CACHEDIR, PROXY_HOST, PROXY_PORT
from translations import PROXY_LANGS from translations import PROXY_LANGS
# pylint: enable=wrong-import-position # pylint: enable=wrong-import-position
def is_testmode():
"""Server is running in the wttr.in test mode"""
return "WTTRIN_TEST" in os.environ
def load_translations(): def load_translations():
""" """
@ -67,8 +74,11 @@ def _find_srv_for_query(path, query): # pylint: disable=unused-argument
return 'http://api.worldweatheronline.com' return 'http://api.worldweatheronline.com'
def _load_content_and_headers(path, query): def _load_content_and_headers(path, query):
timestamp = time.strftime("%Y%m%d%H", time.localtime()) if is_testmode():
cache_file = os.path.join(PROXY_CACHEDIR, timestamp, path, query) cache_file = "test/proxy-data/data1"
else:
timestamp = time.strftime("%Y%m%d%H", time.localtime())
cache_file = os.path.join(PROXY_CACHEDIR, timestamp, path, query)
try: try:
return (open(cache_file, 'r').read(), return (open(cache_file, 'r').read(),
json.loads(open(cache_file+".headers", 'r').read())) json.loads(open(cache_file+".headers", 'r').read()))
@ -97,7 +107,7 @@ def translate(text, lang):
Translate `text` into `lang` Translate `text` into `lang`
""" """
translated = TRANSLATIONS.get(lang, {}).get(text, text) translated = TRANSLATIONS.get(lang, {}).get(text, text)
if text.encode('utf-8') == translated: if text == translated:
print("%s: %s" % (lang, text)) print("%s: %s" % (lang, text))
return translated return translated
@ -108,7 +118,7 @@ def cyr(to_translate):
return cyrtranslit.to_cyrillic(to_translate) return cyrtranslit.to_cyrillic(to_translate)
def _patch_greek(original): def _patch_greek(original):
return original.decode('utf-8').replace(u"Ηλιόλουστη/ο", u"Ηλιόλουστη").encode('utf-8') return original.replace(u"Ηλιόλουστη/ο", u"Ηλιόλουστη")
def add_translations(content, lang): def add_translations(content, lang):
""" """
@ -132,16 +142,16 @@ def add_translations(content, lang):
d['data']['current_condition'][0]['lang_%s' % lang] = \ d['data']['current_condition'][0]['lang_%s' % lang] = \
[{'value': cyr( [{'value': cyr(
d['data']['current_condition'][0]['lang_%s' % lang][0]['value']\ d['data']['current_condition'][0]['lang_%s' % lang][0]['value']\
.encode('utf-8'))}] )}]
elif lang == 'el': elif lang == 'el':
d['data']['current_condition'][0]['lang_%s' % lang] = \ d['data']['current_condition'][0]['lang_%s' % lang] = \
[{'value': _patch_greek( [{'value': _patch_greek(
d['data']['current_condition'][0]['lang_%s' % lang][0]['value']\ d['data']['current_condition'][0]['lang_%s' % lang][0]['value']\
.encode('utf-8'))}] )}]
elif lang == 'sr-lat': elif lang == 'sr-lat':
d['data']['current_condition'][0]['lang_%s' % lang] = \ d['data']['current_condition'][0]['lang_%s' % lang] = \
[{'value':d['data']['current_condition'][0]['lang_sr'][0]['value']\ [{'value':d['data']['current_condition'][0]['lang_sr'][0]['value']\
.encode('utf-8')}] }]
fixed_weather = [] fixed_weather = []
for w in d['data']['weather']: # pylint: disable=invalid-name for w in d['data']['weather']: # pylint: disable=invalid-name
@ -153,13 +163,13 @@ def add_translations(content, lang):
[{'value': translate(weather_condition, lang)}] [{'value': translate(weather_condition, lang)}]
elif lang == 'sr': elif lang == 'sr':
h['lang_%s' % lang] = \ h['lang_%s' % lang] = \
[{'value': cyr(h['lang_%s' % lang][0]['value'].encode('utf-8'))}] [{'value': cyr(h['lang_%s' % lang][0]['value'])}]
elif lang == 'el': elif lang == 'el':
h['lang_%s' % lang] = \ h['lang_%s' % lang] = \
[{'value': _patch_greek(h['lang_%s' % lang][0]['value'].encode('utf-8'))}] [{'value': _patch_greek(h['lang_%s' % lang][0]['value'])}]
elif lang == 'sr-lat': elif lang == 'sr-lat':
h['lang_%s' % lang] = \ h['lang_%s' % lang] = \
[{'value': h['lang_sr'][0]['value'].encode('utf-8')}] [{'value': h['lang_sr'][0]['value']}]
fixed_hourly.append(h) fixed_hourly.append(h)
w['hourly'] = fixed_hourly w['hourly'] = fixed_hourly
fixed_weather.append(w) fixed_weather.append(w)
@ -177,7 +187,7 @@ def proxy(path):
""" """
lang = request.args.get('lang', 'en') lang = request.args.get('lang', 'en')
query_string = request.query_string query_string = request.query_string.decode("utf-8")
query_string = query_string.replace('sr-lat', 'sr') query_string = query_string.replace('sr-lat', 'sr')
query_string = query_string.replace('lang=None', 'lang=en') query_string = query_string.replace('lang=None', 'lang=en')
query_string += "&extra=localObsTime" query_string += "&extra=localObsTime"
@ -187,7 +197,6 @@ def proxy(path):
if content is None: if content is None:
srv = _find_srv_for_query(path, query_string) srv = _find_srv_for_query(path, query_string)
url = '%s/%s?%s' % (srv, path, query_string) url = '%s/%s?%s' % (srv, path, query_string)
print(url)
attempts = 10 attempts = 10
response = None response = None
@ -208,10 +217,11 @@ def proxy(path):
headers = {} headers = {}
headers['Content-Type'] = response.headers['content-type'] headers['Content-Type'] = response.headers['content-type']
_save_content_and_headers(path, query_string, response.content, headers) _save_content_and_headers(path, query_string, response.content, headers)
content = add_translations(response.content, lang)
else: else:
content = "{}" content = "{}"
content = add_translations(content, lang)
return content, 200, headers return content, 200, headers
if __name__ == "__main__": if __name__ == "__main__":

Loading…
Cancel
Save