Skip to content

Commit efeac01

Browse files
Added globally accessible Config.instance.
1 parent 786a908 commit efeac01

File tree

5 files changed

+46
-13
lines changed

5 files changed

+46
-13
lines changed

README.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -66,12 +66,12 @@ class ExampleRequestProcessor(FulfillmentAutomation):
6666
return ActivationTileResponse(tile='\n # Welcome to Fallball!\n\nYes, '
6767
'you decided to have an account in our amazing service!')
6868
# or
69-
# return TemplateResource().render(pk='TEMPLATE_ID', request_id=request.id)
69+
# return TemplateResource(self.config).render(pk='TEMPLATE_ID', request_id=request.id)
7070

7171
# aprrove by Template
7272
return ActivationTemplateResponse(template_id="TL-497-535-242")
7373
# or
74-
# return TemplateResource().get(pk='TEMPLATE_ID')
74+
# return TemplateResource(self.config).get(pk='TEMPLATE_ID')
7575

7676
elif request.type == 'change':
7777
# fail

connect/config.py

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,8 @@
1010

1111

1212
class Config(object):
13+
instance = None # Global instance
14+
1315
def __init__(
1416
self,
1517
api_url=None,
@@ -62,6 +64,9 @@ def __init__(
6264
if isinstance(products, str) \
6365
else products or []
6466

67+
# Store last created instance
68+
Config.instance = self
69+
6570
@property
6671
def api_url(self):
6772
return self._api_url

connect/resource/base.py

Lines changed: 14 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -16,10 +16,13 @@
1616

1717
class ApiClient(object):
1818

19-
def __init__(self, config):
20-
if not isinstance(config, Config):
19+
def __init__(self, config=None):
20+
# Assign passed config or globally configured instance
21+
self.config = config or Config.instance
22+
23+
# Assert data
24+
if not isinstance(self.config, Config):
2125
raise ValueError('A valid Config object is required to create an ApiClient')
22-
self.config = config
2326

2427
@property
2528
def headers(self):
@@ -68,15 +71,19 @@ class BaseResource(object):
6871
api = None
6972
schema = BaseSchema()
7073

71-
def __init__(self, config, *args, **kwargs):
74+
def __init__(self, config=None, *args, **kwargs):
75+
# Assign passed config or globally configured instance
76+
self.config = config or Config.instance
77+
78+
# Assert data
7279
if not self.__class__.resource:
7380
raise AttributeError('Resource name not specified in class {}'.format(
7481
self.__class__.__name__) + '. Add an attribute `resource` name of the resource')
75-
if not isinstance(config, Config):
76-
raise ValueError('A valid Config object is required to create a ' + type(self).__name__)
82+
if not isinstance(self.config, Config):
83+
raise ValueError('A valid Config object must be passed or globally configured '
84+
'to create a ' + type(self).__name__)
7785
if not BaseResource.api:
7886
BaseResource.api = ApiClient(config)
79-
self.config = config
8087

8188
def build_filter(self):
8289
res_filter = {}

example/example.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -34,12 +34,12 @@ def process_request(self, request):
3434
return ActivationTileResponse(tile='\n # Welcome to Fallball!\n\nYes, you decided '
3535
'to have an account in our amazing service!')
3636
# or
37-
# return TemplateResource().render(pk='TEMPLATE_ID', request_id=request.id)
37+
# return TemplateResource(self.config).render(pk='TEMPLATE_ID', request_id=request.id)
3838

3939
# aprrove by Template
4040
return ActivationTemplateResponse(template_id="TL-497-535-242")
4141
# or
42-
# return TemplateResource().get(pk='TEMPLATE_ID')
42+
# return TemplateResource(self.config).get(pk='TEMPLATE_ID')
4343

4444
elif request.type == 'change':
4545
# fail

tests/test_config.py

Lines changed: 23 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -58,14 +58,35 @@ def test_config_immutable_properties():
5858
config = Config(file='config.json')
5959
with pytest.raises(AttributeError):
6060
config.api_key = conf_dict.get('apiKey')
61-
with pytest.raises(AttributeError):
6261
config.api_url = conf_dict.get('apiEndpoint')
63-
with pytest.raises(AttributeError):
6462
config.products = [conf_dict.get('products')]
6563

64+
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+
6679
def _assert_config(config):
6780
assert config.api_key == conf_dict.get('apiKey')
6881
assert config.api_url == conf_dict.get('apiEndpoint')
6982
assert isinstance(config.products, list)
7083
assert len(config.products) == 1
7184
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)