diff --git a/README.md b/README.md index 5c680de..1cfceac 100644 --- a/README.md +++ b/README.md @@ -38,14 +38,10 @@ $ pip install connect-sdk ### Example ```python from connect import FulfillmentAutomation -from connect.config import Config from connect.logger import logger from connect.models import ActivationTemplateResponse, ActivationTileResponse from connect.models.exception import FulfillmentFail, FulfillmentInquire, Skip -# set logger level / default level ERROR -logger.setLevel("DEBUG") - class ExampleRequestProcessor(FulfillmentAutomation): def process_request(self, request): @@ -66,12 +62,12 @@ class ExampleRequestProcessor(FulfillmentAutomation): return ActivationTileResponse(tile='\n # Welcome to Fallball!\n\nYes, ' 'you decided to have an account in our amazing service!') # or - # return TemplateResource(self.config).render(pk='TEMPLATE_ID', request_id=request.id) + # return TemplateResource().render(pk='TEMPLATE_ID', request_id=request.id) # aprrove by Template return ActivationTemplateResponse(template_id="TL-497-535-242") # or - # return TemplateResource(self.config).get(pk='TEMPLATE_ID') + # return TemplateResource().get(pk='TEMPLATE_ID') elif request.type == 'change': # fail @@ -82,7 +78,7 @@ class ExampleRequestProcessor(FulfillmentAutomation): if __name__ == '__main__': - request = ExampleRequestProcessor(Config(file='config.json')) + request = ExampleRequestProcessor() request.process() ``` diff --git a/connect/config.py b/connect/config.py index fb22ac4..7f47ec7 100644 --- a/connect/config.py +++ b/connect/config.py @@ -10,7 +10,7 @@ class Config(object): - instance = None # Global instance + _instance = None # Global instance def __init__( self, @@ -65,8 +65,14 @@ def __init__( else products or [] # Store first created instance - if not Config.instance: - Config.instance = self + if not Config._instance: + Config._instance = self + + @classmethod + def get_instance(cls): + if not cls._instance: + cls._instance = Config(file='config.json') + return cls._instance @property def api_url(self): diff --git a/connect/resource/base.py b/connect/resource/base.py index 0af9a3e..600f3c3 100644 --- a/connect/resource/base.py +++ b/connect/resource/base.py @@ -18,7 +18,7 @@ class ApiClient(object): def __init__(self, config=None): # Assign passed config or globally configured instance - self.config = config or Config.instance + self.config = config or Config.get_instance() # Assert data if not isinstance(self.config, Config): @@ -73,7 +73,7 @@ class BaseResource(object): def __init__(self, config=None, *args, **kwargs): # Assign passed config or globally configured instance - self.config = config or Config.instance + self.config = config or Config.get_instance() # Assert data if not self.__class__.resource: diff --git a/example/example.py b/example/example.py index 00de113..d1e1d3c 100644 --- a/example/example.py +++ b/example/example.py @@ -14,6 +14,9 @@ # set logger level / default level ERROR logger.setLevel("DEBUG") +# If we remove this line, it is done implicitly +Config(file='config.json') + class ExampleRequestProcessor(FulfillmentAutomation): def process_request(self, request): @@ -34,12 +37,12 @@ def process_request(self, request): return ActivationTileResponse(tile='\n # Welcome to Fallball!\n\nYes, you decided ' 'to have an account in our amazing service!') # or - # return TemplateResource(self.config).render(pk='TEMPLATE_ID', request_id=request.id) + # return TemplateResource().render(pk='TEMPLATE_ID', request_id=request.id) # aprrove by Template return ActivationTemplateResponse(template_id="TL-497-535-242") # or - # return TemplateResource(self.config).get(pk='TEMPLATE_ID') + # return TemplateResource().get(pk='TEMPLATE_ID') elif request.type == 'change': # fail @@ -50,5 +53,5 @@ def process_request(self, request): if __name__ == '__main__': - request = ExampleRequestProcessor(Config(file='config.json')) + request = ExampleRequestProcessor() request.process() diff --git a/tests/test_config.py b/tests/test_config.py index 5993c29..162e209 100644 --- a/tests/test_config.py +++ b/tests/test_config.py @@ -28,6 +28,22 @@ def teardown_module(module): os.chdir(module.prev_dir) +def test_global_implicit_global_config(): + """ Global config is instantiated from config.json if not explicitly set """ + assert Config.get_instance().api_key == conf_dict.get('apiKey') + assert Config.get_instance().api_url == conf_dict.get('apiEndpoint') + assert isinstance(Config.get_instance().products, list) + assert len(Config.get_instance().products) == 1 + assert Config.get_instance().products[0] == conf_dict.get('products') + + +def test_global_config_immutable_properties(): + with pytest.raises(AttributeError): + Config.get_instance().api_key = conf_dict.get('apiKey') + Config.get_instance().api_url = conf_dict.get('apiEndpoint') + Config.get_instance().products = [conf_dict.get('products')] + + def test_init_config_with_non_existing_file(): with pytest.raises(IOError): Config(file='non_existing_config.json') @@ -62,31 +78,9 @@ def test_config_immutable_properties(): config.products = [conf_dict.get('products')] -def test_global_config(): - Config.instance = None # Reset global config - Config(file='config.json') - _assert_global_config() - - -def test_global_config_immutable_properties(): - Config(file='config.json') - with pytest.raises(AttributeError): - Config.instance.api_key = conf_dict.get('apiKey') - Config.instance.api_url = conf_dict.get('apiEndpoint') - Config.instance.products = [conf_dict.get('products')] - - def _assert_config(config): assert config.api_key == conf_dict.get('apiKey') assert config.api_url == conf_dict.get('apiEndpoint') assert isinstance(config.products, list) assert len(config.products) == 1 assert config.products[0] == conf_dict.get('products') - - -def _assert_global_config(): - assert Config.instance.api_key == conf_dict.get('apiKey') - assert Config.instance.api_url == conf_dict.get('apiEndpoint') - assert isinstance(Config.instance.products, list) - assert len(Config.instance.products) == 1 - assert Config.instance.products[0] == conf_dict.get('products')