Skip to content

Commit 23da37f

Browse files
Merge pull request #17 from JaviCerveraIngram/master
Config singleton has to be accessed as Config.get_instance()
2 parents dd6b6eb + 3e39660 commit 23da37f

File tree

5 files changed

+36
-37
lines changed

5 files changed

+36
-37
lines changed

README.md

Lines changed: 3 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -38,14 +38,10 @@ $ pip install connect-sdk
3838
### Example
3939
```python
4040
from connect import FulfillmentAutomation
41-
from connect.config import Config
4241
from connect.logger import logger
4342
from connect.models import ActivationTemplateResponse, ActivationTileResponse
4443
from connect.models.exception import FulfillmentFail, FulfillmentInquire, Skip
4544

46-
# set logger level / default level ERROR
47-
logger.setLevel("DEBUG")
48-
4945

5046
class ExampleRequestProcessor(FulfillmentAutomation):
5147
def process_request(self, request):
@@ -66,12 +62,12 @@ class ExampleRequestProcessor(FulfillmentAutomation):
6662
return ActivationTileResponse(tile='\n # Welcome to Fallball!\n\nYes, '
6763
'you decided to have an account in our amazing service!')
6864
# or
69-
# return TemplateResource(self.config).render(pk='TEMPLATE_ID', request_id=request.id)
65+
# return TemplateResource().render(pk='TEMPLATE_ID', request_id=request.id)
7066

7167
# aprrove by Template
7268
return ActivationTemplateResponse(template_id="TL-497-535-242")
7369
# or
74-
# return TemplateResource(self.config).get(pk='TEMPLATE_ID')
70+
# return TemplateResource().get(pk='TEMPLATE_ID')
7571

7672
elif request.type == 'change':
7773
# fail
@@ -82,7 +78,7 @@ class ExampleRequestProcessor(FulfillmentAutomation):
8278

8379

8480
if __name__ == '__main__':
85-
request = ExampleRequestProcessor(Config(file='config.json'))
81+
request = ExampleRequestProcessor()
8682
request.process()
8783
```
8884

connect/config.py

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@
1010

1111

1212
class Config(object):
13-
instance = None # Global instance
13+
_instance = None # Global instance
1414

1515
def __init__(
1616
self,
@@ -65,8 +65,14 @@ def __init__(
6565
else products or []
6666

6767
# Store first created instance
68-
if not Config.instance:
69-
Config.instance = self
68+
if not Config._instance:
69+
Config._instance = self
70+
71+
@classmethod
72+
def get_instance(cls):
73+
if not cls._instance:
74+
cls._instance = Config(file='config.json')
75+
return cls._instance
7076

7177
@property
7278
def api_url(self):

connect/resource/base.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ class ApiClient(object):
1818

1919
def __init__(self, config=None):
2020
# Assign passed config or globally configured instance
21-
self.config = config or Config.instance
21+
self.config = config or Config.get_instance()
2222

2323
# Assert data
2424
if not isinstance(self.config, Config):
@@ -73,7 +73,7 @@ class BaseResource(object):
7373

7474
def __init__(self, config=None, *args, **kwargs):
7575
# Assign passed config or globally configured instance
76-
self.config = config or Config.instance
76+
self.config = config or Config.get_instance()
7777

7878
# Assert data
7979
if not self.__class__.resource:

example/example.py

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,9 @@
1414
# set logger level / default level ERROR
1515
logger.setLevel("DEBUG")
1616

17+
# If we remove this line, it is done implicitly
18+
Config(file='config.json')
19+
1720

1821
class ExampleRequestProcessor(FulfillmentAutomation):
1922
def process_request(self, request):
@@ -34,12 +37,12 @@ def process_request(self, request):
3437
return ActivationTileResponse(tile='\n # Welcome to Fallball!\n\nYes, you decided '
3538
'to have an account in our amazing service!')
3639
# or
37-
# return TemplateResource(self.config).render(pk='TEMPLATE_ID', request_id=request.id)
40+
# return TemplateResource().render(pk='TEMPLATE_ID', request_id=request.id)
3841

3942
# aprrove by Template
4043
return ActivationTemplateResponse(template_id="TL-497-535-242")
4144
# or
42-
# return TemplateResource(self.config).get(pk='TEMPLATE_ID')
45+
# return TemplateResource().get(pk='TEMPLATE_ID')
4346

4447
elif request.type == 'change':
4548
# fail
@@ -50,5 +53,5 @@ def process_request(self, request):
5053

5154

5255
if __name__ == '__main__':
53-
request = ExampleRequestProcessor(Config(file='config.json'))
56+
request = ExampleRequestProcessor()
5457
request.process()

tests/test_config.py

Lines changed: 16 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,22 @@ def teardown_module(module):
2828
os.chdir(module.prev_dir)
2929

3030

31+
def test_global_implicit_global_config():
32+
""" Global config is instantiated from config.json if not explicitly set """
33+
assert Config.get_instance().api_key == conf_dict.get('apiKey')
34+
assert Config.get_instance().api_url == conf_dict.get('apiEndpoint')
35+
assert isinstance(Config.get_instance().products, list)
36+
assert len(Config.get_instance().products) == 1
37+
assert Config.get_instance().products[0] == conf_dict.get('products')
38+
39+
40+
def test_global_config_immutable_properties():
41+
with pytest.raises(AttributeError):
42+
Config.get_instance().api_key = conf_dict.get('apiKey')
43+
Config.get_instance().api_url = conf_dict.get('apiEndpoint')
44+
Config.get_instance().products = [conf_dict.get('products')]
45+
46+
3147
def test_init_config_with_non_existing_file():
3248
with pytest.raises(IOError):
3349
Config(file='non_existing_config.json')
@@ -62,31 +78,9 @@ def test_config_immutable_properties():
6278
config.products = [conf_dict.get('products')]
6379

6480

65-
def test_global_config():
66-
Config.instance = None # Reset global config
67-
Config(file='config.json')
68-
_assert_global_config()
69-
70-
71-
def test_global_config_immutable_properties():
72-
Config(file='config.json')
73-
with pytest.raises(AttributeError):
74-
Config.instance.api_key = conf_dict.get('apiKey')
75-
Config.instance.api_url = conf_dict.get('apiEndpoint')
76-
Config.instance.products = [conf_dict.get('products')]
77-
78-
7981
def _assert_config(config):
8082
assert config.api_key == conf_dict.get('apiKey')
8183
assert config.api_url == conf_dict.get('apiEndpoint')
8284
assert isinstance(config.products, list)
8385
assert len(config.products) == 1
8486
assert config.products[0] == conf_dict.get('products')
85-
86-
87-
def _assert_global_config():
88-
assert Config.instance.api_key == conf_dict.get('apiKey')
89-
assert Config.instance.api_url == conf_dict.get('apiEndpoint')
90-
assert isinstance(Config.instance.products, list)
91-
assert len(Config.instance.products) == 1
92-
assert Config.instance.products[0] == conf_dict.get('products')

0 commit comments

Comments
 (0)