Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
10 changes: 3 additions & 7 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -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):
Expand All @@ -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
Expand All @@ -82,7 +78,7 @@ class ExampleRequestProcessor(FulfillmentAutomation):


if __name__ == '__main__':
request = ExampleRequestProcessor(Config(file='config.json'))
request = ExampleRequestProcessor()
request.process()
```

12 changes: 9 additions & 3 deletions connect/config.py
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@


class Config(object):
instance = None # Global instance
_instance = None # Global instance

def __init__(
self,
Expand Down Expand Up @@ -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):
Expand Down
4 changes: 2 additions & 2 deletions connect/resource/base.py
Original file line number Diff line number Diff line change
Expand Up @@ -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):
Expand Down Expand Up @@ -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:
Expand Down
9 changes: 6 additions & 3 deletions example/example.py
Original file line number Diff line number Diff line change
Expand Up @@ -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):
Expand All @@ -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
Expand All @@ -50,5 +53,5 @@ def process_request(self, request):


if __name__ == '__main__':
request = ExampleRequestProcessor(Config(file='config.json'))
request = ExampleRequestProcessor()
request.process()
38 changes: 16 additions & 22 deletions tests/test_config.py
Original file line number Diff line number Diff line change
Expand Up @@ -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')
Expand Down Expand Up @@ -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')