Add server config storage classes
This commit is contained in:
@@ -0,0 +1,35 @@
|
||||
# NOTE: This init function must be called from plpythonu entry points to
|
||||
# initialize cartodb_services module properly. E.g:
|
||||
#
|
||||
# CREATE OR REPLACE FUNCTION cdb_dataservices_server.cdb_isochrone(...)
|
||||
# RETURNS SETOF cdb_dataservices_server.isoline AS $$
|
||||
#
|
||||
# import cartodb_services
|
||||
# cartodb_services.init(plpy, GD)
|
||||
#
|
||||
# # rest of the code here
|
||||
# cartodb_services.GD[key] = val
|
||||
# cartodb_services.plpy.execute('SELECT * FROM ...')
|
||||
#
|
||||
# $$ LANGUAGE plpythonu;
|
||||
|
||||
plpy = None
|
||||
GD = None
|
||||
|
||||
def init(_plpy, _GD):
|
||||
global plpy
|
||||
global GD
|
||||
|
||||
if plpy is None:
|
||||
plpy = _plpy
|
||||
|
||||
if GD is None:
|
||||
GD = _GD
|
||||
|
||||
def _reset():
|
||||
# NOTE: just for testing
|
||||
global plpy
|
||||
global GD
|
||||
|
||||
plpy = None
|
||||
GD = None
|
||||
|
||||
@@ -0,0 +1,11 @@
|
||||
import abc
|
||||
|
||||
class ConfigStorageInterface(object):
|
||||
"""This is an interface that all config storages must abide to"""
|
||||
|
||||
__metaclass__ = abc.ABCMeta
|
||||
|
||||
@abc.abstractmethod
|
||||
def get(self, key):
|
||||
"""Return a value based on the key supplied from some storage"""
|
||||
pass
|
||||
@@ -0,0 +1,26 @@
|
||||
import json
|
||||
import cartodb_services
|
||||
from interfaces import ConfigStorageInterface
|
||||
|
||||
class InDbServerConfigStorage(ConfigStorageInterface):
|
||||
|
||||
def get(self, key):
|
||||
sql = "SELECT cdb_dataservices_server.cdb_conf_getconf('{0}') as conf".format(key)
|
||||
rows = cartodb_services.plpy.execute(sql, 1)
|
||||
json_output = rows[0]['conf']
|
||||
if json_output:
|
||||
return json.loads(json_output)
|
||||
else:
|
||||
return None
|
||||
|
||||
|
||||
class InMemoryConfigStorage(ConfigStorageInterface):
|
||||
|
||||
def __init__(self, config_hash={}):
|
||||
self._config_hash = config_hash
|
||||
|
||||
def get(self, key):
|
||||
try:
|
||||
return self._config_hash[key]
|
||||
except KeyError:
|
||||
return None
|
||||
@@ -0,0 +1,42 @@
|
||||
from unittest import TestCase
|
||||
from mock import Mock, MagicMock
|
||||
from nose.tools import raises
|
||||
from cartodb_services.refactor.storage.server_config import *
|
||||
import cartodb_services
|
||||
|
||||
class TestInDbServerConfigStorage(TestCase):
|
||||
|
||||
def setUp(self):
|
||||
self.plpy_mock = Mock()
|
||||
cartodb_services.init(self.plpy_mock, _GD={})
|
||||
|
||||
def tearDown(self):
|
||||
cartodb_services._reset()
|
||||
|
||||
def test_gets_configs_from_db(self):
|
||||
self.plpy_mock.execute = MagicMock(return_value=[{'conf': '"any_value"'}])
|
||||
server_config = InDbServerConfigStorage()
|
||||
assert server_config.get('any_config') == 'any_value'
|
||||
self.plpy_mock.execute.assert_called_once_with("SELECT cdb_dataservices_server.cdb_conf_getconf('any_config') as conf", 1)
|
||||
|
||||
def test_gets_none_if_cannot_retrieve_key(self):
|
||||
self.plpy_mock.execute = MagicMock(return_value=[{'conf': None}])
|
||||
server_config = InDbServerConfigStorage()
|
||||
assert server_config.get('any_non_existing_key') is None
|
||||
|
||||
def test_deserializes_from_db_to_plain_dict(self):
|
||||
self.plpy_mock.execute = MagicMock(return_value=[{'conf': '{"environment": "testing"}'}])
|
||||
server_config = InDbServerConfigStorage()
|
||||
assert server_config.get('server_conf') == {'environment': 'testing'}
|
||||
self.plpy_mock.execute.assert_called_once_with("SELECT cdb_dataservices_server.cdb_conf_getconf('server_conf') as conf", 1)
|
||||
|
||||
|
||||
class TestInMemoryConfigStorage(TestCase):
|
||||
|
||||
def test_can_provide_values_from_hash(self):
|
||||
server_config = InMemoryConfigStorage({'any_key': 'any_value'})
|
||||
assert server_config.get('any_key') == 'any_value'
|
||||
|
||||
def test_gets_none_if_cannot_retrieve_key(self):
|
||||
server_config = InMemoryConfigStorage()
|
||||
assert server_config.get('any_non_existing_key') == None
|
||||
Reference in New Issue
Block a user