From ed5532c05bff18b5e733680b50df7b42f5e84380 Mon Sep 17 00:00:00 2001 From: Javier San Juan Cervera Date: Mon, 11 Mar 2019 10:50:18 +0100 Subject: [PATCH 1/8] Fixed warnings Removed warnings reported by PyCharm's Inspect Code, except most spelling reports and some things in README.md. --- README.md | 14 ++++++++------ connect/config.py | 18 +++++++++--------- connect/models/activation_response.py | 2 +- connect/models/base.py | 2 +- connect/models/exception.py | 10 ++++++---- connect/resource/base.py | 8 ++++---- connect/resource/fulfillment.py | 8 ++++---- connect/resource/template.py | 6 +++--- connect/resource/utils.py | 4 ++-- example/example.py | 15 +++++++++------ setup.py | 3 +++ tests/test_config.py | 7 ++++--- tests/test_models.py | 4 ++-- 13 files changed, 56 insertions(+), 45 deletions(-) diff --git a/README.md b/README.md index 1cfceac..6f70522 100644 --- a/README.md +++ b/README.md @@ -5,7 +5,7 @@ --- Connect Python SDK allows an easy and fast integration with Connect fulfillment API. Thanks to it you can automate the fulfillment of orders generated by your products. -In order to use this library, please ensure that you have read first the documentation available on Connect knowladge base article located here, this one will provide you a great information on the rest api that this library implements. +In order to use this library, please ensure that you have read first the documentation available on Connect knowledge base article located here, this one will provide you a great information on the rest api that this library implements. ### Class Features --- This library may be consumed in your project in order to automate the fulfillment of requests, this class once imported into your project will allow you to: @@ -45,6 +45,8 @@ from connect.models.exception import FulfillmentFail, FulfillmentInquire, Skip class ExampleRequestProcessor(FulfillmentAutomation): def process_request(self, request): + + logger.info('Processing request {}'.format(request.id)) # custom logic if request.type == 'purchase': @@ -59,12 +61,12 @@ class ExampleRequestProcessor(FulfillmentAutomation): raise FulfillmentInquire(params=[param]) # approve by ActivationTile - return ActivationTileResponse(tile='\n # Welcome to Fallball!\n\nYes, ' - 'you decided to have an account in our amazing service!') + return ActivationTileResponse('\n # Welcome to Fallball!\n\nYes, ' + 'you decided to have an account in our amazing service!') # or # return TemplateResource().render(pk='TEMPLATE_ID', request_id=request.id) - # aprrove by Template + # approve by Template return ActivationTemplateResponse(template_id="TL-497-535-242") # or # return TemplateResource().get(pk='TEMPLATE_ID') @@ -78,7 +80,7 @@ class ExampleRequestProcessor(FulfillmentAutomation): if __name__ == '__main__': - request = ExampleRequestProcessor() - request.process() + request_processor = ExampleRequestProcessor() + request_processor.process() ``` diff --git a/connect/config.py b/connect/config.py index 7f47ec7..d58607e 100644 --- a/connect/config.py +++ b/connect/config.py @@ -17,17 +17,17 @@ def __init__( api_url=None, api_key=None, products=None, - file=None + filename=None ): """ initialization config for public api :param api_url: Public api url :param api_key: Service user ApiKey :param products (optional): Id products - :param file: Config file path + :param filename: Config file path """ # Check arguments - if not file and not any([api_key, api_url]): + if not filename and not any([api_key, api_url]): raise ValueError('Filename or api_key and api_url are expected' 'in Config initialization') if products and not isinstance(products, (str, list)): @@ -35,18 +35,18 @@ def __init__( + type(products).__name__) # Load config from file name - if file: - if not os.path.exists(file): - raise IOError('Not file `{}` on directory'.format(file)) + if filename: + if not os.path.exists(filename): + raise IOError('Not file `{}` on directory'.format(filename)) - with open(file) as config_file: + with open(filename) as config_file: configs = config_file.read() try: configs = json.loads(configs) except Exception as ex: raise TypeError('Invalid config file `{}`\n' - 'ERROR: {}'.format(file, str(ex))) + 'ERROR: {}'.format(filename, str(ex))) (api_url, api_key, products) = (configs.get('apiEndpoint', ''), configs.get('apiKey', ''), @@ -71,7 +71,7 @@ def __init__( @classmethod def get_instance(cls): if not cls._instance: - cls._instance = Config(file='config.json') + cls._instance = Config(filename='config.json') return cls._instance @property diff --git a/connect/models/activation_response.py b/connect/models/activation_response.py index 5f07430..ef91f6d 100644 --- a/connect/models/activation_response.py +++ b/connect/models/activation_response.py @@ -11,7 +11,7 @@ class ActivationTileResponse(object): tile = 'Activation succeeded' - def __init__(self, markdown=None, *args, **kwargs): + def __init__(self, markdown=None): if markdown: try: self.tile = json.loads(markdown) diff --git a/connect/models/base.py b/connect/models/base.py index ad8c0db..b1fda32 100644 --- a/connect/models/base.py +++ b/connect/models/base.py @@ -9,7 +9,7 @@ class BaseModel: - def __init__(self, *args, **kwargs): + def __init__(self, **kwargs): self.id = kwargs.get('id') if kwargs: for attr, val in kwargs.items(): diff --git a/connect/models/exception.py b/connect/models/exception.py index 610eb06..e2ebc0a 100644 --- a/connect/models/exception.py +++ b/connect/models/exception.py @@ -18,20 +18,22 @@ def __init__(self, message='', code='', obj=None): class FulfillmentFail(Message): def __init__(self, *args, **kwargs): super(FulfillmentFail, self).__init__(*args, **kwargs) - self.code = 'fail' self.message = self.message or 'Request failed' + self.code = 'fail' class FulfillmentInquire(Message): def __init__(self, *args, **kwargs): super(FulfillmentInquire, self).__init__(*args, **kwargs) self.message = self.message or 'Correct user input required' - self.params = kwargs.get('params', []) self.code = 'inquire' + self.params = kwargs.get('params', []) class Skip(Message): def __init__(self, *args, **kwargs): + super(Skip, self).__init__(*args, **kwargs) + self.message = self.message or 'Request skipped' self.code = 'skip' @@ -40,11 +42,11 @@ class ServerErrorException(Exception): def __init__(self, error=None, *args, **kwargs): if error and isinstance(error, ServerError): + # noinspection PyUnresolvedReferences self.message = str({ "error_code": error.error_code, "params": kwargs.get('params', []), "errors": error.errors, }) - super(ServerErrorException, self).__init__( - self.message, *args, **kwargs) + super(ServerErrorException, self).__init__(self.message, *args) diff --git a/connect/resource/base.py b/connect/resource/base.py index 600f3c3..35316d2 100644 --- a/connect/resource/base.py +++ b/connect/resource/base.py @@ -11,7 +11,7 @@ from connect.logger import function_log, logger from connect.models import BaseSchema, ServerErrorSchema from connect.models.exception import ServerErrorException -from .utils import joinurl +from .utils import join_url class ApiClient(object): @@ -71,7 +71,7 @@ class BaseResource(object): api = None schema = BaseSchema() - def __init__(self, config=None, *args, **kwargs): + def __init__(self, config=None): # Assign passed config or globally configured instance self.config = config or Config.get_instance() @@ -94,10 +94,10 @@ def build_filter(self): @property def _list_url(self): - return joinurl(self.config.api_url, self.__class__.resource) + return join_url(self.config.api_url, self.__class__.resource) def _obj_url(self, pk): - return joinurl(self._list_url, pk) + return join_url(self._list_url, pk) def __loads_schema(self, response): objects, error = self.schema.loads(response, many=True) diff --git a/connect/resource/fulfillment.py b/connect/resource/fulfillment.py index 596912e..1709bac 100644 --- a/connect/resource/fulfillment.py +++ b/connect/resource/fulfillment.py @@ -11,7 +11,7 @@ from connect.models import FulfillmentSchema, Param from .base import BaseResource from .template import TemplateResource -from .utils import joinurl +from .utils import join_url class FulfillmentResource(BaseResource): @@ -29,16 +29,16 @@ def build_filter(self): @function_log def approve(self, pk, data): - url = joinurl(self._obj_url(pk), 'approve/') + url = join_url(self._obj_url(pk), 'approve/') return self.api.post(url=url, data=json.dumps(data if data else {})) @function_log def inquire(self, pk): - return self.api.post(url=joinurl(self._obj_url(pk), 'inquire/'), data=json.dumps({})) + return self.api.post(url=join_url(self._obj_url(pk), 'inquire/'), data=json.dumps({})) @function_log def fail(self, pk, reason): - url = joinurl(self._obj_url(pk), 'fail/') + url = join_url(self._obj_url(pk), 'fail/') return self.api.post(url=url, data=json.dumps({'reason': reason})) @function_log diff --git a/connect/resource/template.py b/connect/resource/template.py index 7b1469b..985aa75 100644 --- a/connect/resource/template.py +++ b/connect/resource/template.py @@ -7,7 +7,7 @@ from connect.models import ActivationTemplateResponse, ActivationTileResponse from .base import BaseResource -from .utils import joinurl +from .utils import join_url class TemplateResource(BaseResource): @@ -19,9 +19,9 @@ class TemplateResource(BaseResource): def render(self, pk, request_id): if not all([pk, request_id]): - raise ValueError('Invalid ids for render temlpate') + raise ValueError('Invalid ids for render template') - url = joinurl(self._obj_url(pk), 'render') + url = join_url(self._obj_url(pk), 'render') response = self.api.get(url, params={'request_id': request_id}) return ActivationTileResponse(response) diff --git a/connect/resource/utils.py b/connect/resource/utils.py index aa58823..aab6960 100644 --- a/connect/resource/utils.py +++ b/connect/resource/utils.py @@ -8,8 +8,8 @@ from requests.compat import urljoin -def joinurl(base, url, allow_fragments=True): +def join_url(base, url, allow_fragments=True): """ Method for the correct formation of the URL """ if base and isinstance(base, str): base += '/' if base[-1] != '/' else '' - return urljoin(base, url, allow_fragments=True) + return urljoin(base, url, allow_fragments=allow_fragments) diff --git a/example/example.py b/example/example.py index d1e1d3c..c481686 100644 --- a/example/example.py +++ b/example/example.py @@ -15,12 +15,14 @@ logger.setLevel("DEBUG") # If we remove this line, it is done implicitly -Config(file='config.json') +Config(filename='config.json') class ExampleRequestProcessor(FulfillmentAutomation): def process_request(self, request): + logger.info('Processing request {}'.format(request.id)) + # custom logic if request.type == 'purchase': for item in request.asset.items: @@ -34,12 +36,13 @@ def process_request(self, request): raise FulfillmentInquire(params=[param]) # approve by ActivationTile - return ActivationTileResponse(tile='\n # Welcome to Fallball!\n\nYes, you decided ' - 'to have an account in our amazing service!') + return ActivationTileResponse('\n # Welcome to Fallball!\n\nYes, you decided ' + 'to have an account in our amazing service!') # or # return TemplateResource().render(pk='TEMPLATE_ID', request_id=request.id) - # aprrove by Template + # approve by Template + # noinspection PyUnreachableCode return ActivationTemplateResponse(template_id="TL-497-535-242") # or # return TemplateResource().get(pk='TEMPLATE_ID') @@ -53,5 +56,5 @@ def process_request(self, request): if __name__ == '__main__': - request = ExampleRequestProcessor() - request.process() + request_processor = ExampleRequestProcessor() + request_processor.process() diff --git a/setup.py b/setup.py index b2c3812..8661376 100644 --- a/setup.py +++ b/setup.py @@ -11,10 +11,13 @@ from setuptools import find_packages, setup try: # for pip >= 10 + # noinspection PyProtectedMember,PyPackageRequirements from pip._internal.req import parse_requirements except ImportError: # for pip <= 9.0.3 + # noinspection PyPackageRequirements,PyUnresolvedReferences from pip.req import parse_requirements +# noinspection PyTypeChecker install_reqs = parse_requirements( join( dirname(abspath(__file__)), diff --git a/tests/test_config.py b/tests/test_config.py index 162e209..6b0cef7 100644 --- a/tests/test_config.py +++ b/tests/test_config.py @@ -46,11 +46,11 @@ def test_global_config_immutable_properties(): def test_init_config_with_non_existing_file(): with pytest.raises(IOError): - Config(file='non_existing_config.json') + Config(filename='non_existing_config.json') def test_init_config_with_file(): - _assert_config(Config(file='config.json')) + _assert_config(Config(filename='config.json')) def test_init_config_with_arguments(): @@ -70,8 +70,9 @@ def test_init_config_with_invalid_arguments(): ) +# noinspection PyPropertyAccess def test_config_immutable_properties(): - config = Config(file='config.json') + config = Config(filename='config.json') with pytest.raises(AttributeError): config.api_key = conf_dict.get('apiKey') config.api_url = conf_dict.get('apiEndpoint') diff --git a/tests/test_models.py b/tests/test_models.py index aa4a022..8ce7e65 100644 --- a/tests/test_models.py +++ b/tests/test_models.py @@ -19,8 +19,8 @@ def _get_response_ok(): response.ok = True - with open(os.path.join(os.path.dirname(__file__), 'response.json')) as file: - response.content = file.read() + with open(os.path.join(os.path.dirname(__file__), 'response.json')) as file_handle: + response.content = file_handle.read() return response From db724b2221eacc23990a0a32e8f1de0d073e54ab Mon Sep 17 00:00:00 2001 From: Javier San Juan Cervera Date: Tue, 12 Mar 2019 18:04:52 +0100 Subject: [PATCH 2/8] More noinspection clauses --- connect/models/asset.py | 2 ++ connect/models/fulfillment.py | 3 +++ 2 files changed, 5 insertions(+) diff --git a/connect/models/asset.py b/connect/models/asset.py index abde80f..e72e909 100644 --- a/connect/models/asset.py +++ b/connect/models/asset.py @@ -16,9 +16,11 @@ class Asset(BaseModel): def get_param_by_id(self, identity): + # noinspection PyUnresolvedReferences return self._get_by_id(self.params, identity) def get_item_by_id(self, identity): + # noinspection PyUnresolvedReferences return self._get_by_id(self.items, identity) diff --git a/connect/models/fulfillment.py b/connect/models/fulfillment.py index bb4490a..6c5dd17 100644 --- a/connect/models/fulfillment.py +++ b/connect/models/fulfillment.py @@ -15,18 +15,21 @@ class Fulfillment(BaseModel): @property def new_items(self): + # noinspection PyUnresolvedReferences return list(filter( lambda item: item.quantity > 0 and item.old_quantity == 0, self.asset.items)) @property def changed_items(self): + # noinspection PyUnresolvedReferences return list(filter( lambda item: item.quantity > 0 and item.old_quantity > 0, self.asset.items)) @property def removed_items(self): + # noinspection PyUnresolvedReferences return list(filter( lambda item: item.quantity == 0 and item.old_quantity > 0, self.asset.items)) From 51bbe264ee35fcbeb2ecd53f8a1a7b6cc1656a9b Mon Sep 17 00:00:00 2001 From: Javier San Juan Cervera Date: Wed, 13 Mar 2019 09:37:38 +0100 Subject: [PATCH 3/8] Removed warnings in asset.py --- connect/models/asset.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/connect/models/asset.py b/connect/models/asset.py index 7a1ddb6..35ce17e 100644 --- a/connect/models/asset.py +++ b/connect/models/asset.py @@ -17,12 +17,14 @@ class Asset(BaseModel): def get_param_by_id(self, identity): try: + # noinspection PyUnresolvedReferences return list(filter(lambda param: param.id == identity, self.params))[0] except IndexError: return None def get_item_by_mpn(self, mpn): try: + # noinspection PyUnresolvedReferences return list(filter(lambda item: item.mpn == mpn, self.items))[0] except IndexError: return None From 5628a9a968c74eb378f8c9bdeccf8f54899fca83 Mon Sep 17 00:00:00 2001 From: Javier San Juan Cervera Date: Wed, 13 Mar 2019 10:04:57 +0100 Subject: [PATCH 4/8] Comments begin with a capital letter, as per PEP-8 --- README.md | 14 +++++++------- connect/config.py | 4 ++-- example/example.py | 16 ++++++++-------- 3 files changed, 17 insertions(+), 17 deletions(-) diff --git a/README.md b/README.md index 6f70522..6e0c79a 100644 --- a/README.md +++ b/README.md @@ -48,7 +48,7 @@ class ExampleRequestProcessor(FulfillmentAutomation): logger.info('Processing request {}'.format(request.id)) - # custom logic + # Custom logic if request.type == 'purchase': for item in request.asset.items: if item.quantity > 100000: @@ -60,22 +60,22 @@ class ExampleRequestProcessor(FulfillmentAutomation): param.value_error = 'Email address has not been provided, please provide one' raise FulfillmentInquire(params=[param]) - # approve by ActivationTile + # Approve by ActivationTile return ActivationTileResponse('\n # Welcome to Fallball!\n\nYes, ' 'you decided to have an account in our amazing service!') - # or + # Or # return TemplateResource().render(pk='TEMPLATE_ID', request_id=request.id) - # approve by Template + # Approve by Template return ActivationTemplateResponse(template_id="TL-497-535-242") - # or + # Or # return TemplateResource().get(pk='TEMPLATE_ID') elif request.type == 'change': - # fail + # Fail raise FulfillmentFail() else: - # skip request + # Skip request raise Skip() diff --git a/connect/config.py b/connect/config.py index d58607e..92463e7 100644 --- a/connect/config.py +++ b/connect/config.py @@ -37,7 +37,7 @@ def __init__( # Load config from file name if filename: if not os.path.exists(filename): - raise IOError('Not file `{}` on directory'.format(filename)) + raise IOError('No filename `{}` on directory'.format(filename)) with open(filename) as config_file: configs = config_file.read() @@ -45,7 +45,7 @@ def __init__( try: configs = json.loads(configs) except Exception as ex: - raise TypeError('Invalid config file `{}`\n' + raise TypeError('Invalid config filename `{}`\n' 'ERROR: {}'.format(filename, str(ex))) (api_url, api_key, products) = (configs.get('apiEndpoint', ''), diff --git a/example/example.py b/example/example.py index c481686..b0e72bf 100644 --- a/example/example.py +++ b/example/example.py @@ -11,7 +11,7 @@ from connect.models import ActivationTemplateResponse, ActivationTileResponse from connect.models.exception import FulfillmentFail, FulfillmentInquire, Skip -# set logger level / default level ERROR +# Set logger level / default level ERROR logger.setLevel("DEBUG") # If we remove this line, it is done implicitly @@ -23,7 +23,7 @@ def process_request(self, request): logger.info('Processing request {}'.format(request.id)) - # custom logic + # Custom logic if request.type == 'purchase': for item in request.asset.items: if item.quantity > 100000: @@ -35,23 +35,23 @@ def process_request(self, request): param.value_error = 'Email address has not been provided, please provide one' raise FulfillmentInquire(params=[param]) - # approve by ActivationTile + # Approve by ActivationTile return ActivationTileResponse('\n # Welcome to Fallball!\n\nYes, you decided ' 'to have an account in our amazing service!') - # or + # Or # return TemplateResource().render(pk='TEMPLATE_ID', request_id=request.id) - # approve by Template + # Approve by Template # noinspection PyUnreachableCode return ActivationTemplateResponse(template_id="TL-497-535-242") - # or + # Or # return TemplateResource().get(pk='TEMPLATE_ID') elif request.type == 'change': - # fail + # Fail raise FulfillmentFail() else: - # skip request + # Skip request raise Skip() From fb6d307b511959a02fd5443d418b79439b47386b Mon Sep 17 00:00:00 2001 From: Javier San Juan Cervera Date: Wed, 13 Mar 2019 10:20:41 +0100 Subject: [PATCH 5/8] Updated example.py and README.md --- README.md | 2 +- example/example.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 6e0c79a..4734fcf 100644 --- a/README.md +++ b/README.md @@ -67,7 +67,7 @@ class ExampleRequestProcessor(FulfillmentAutomation): # return TemplateResource().render(pk='TEMPLATE_ID', request_id=request.id) # Approve by Template - return ActivationTemplateResponse(template_id="TL-497-535-242") + return ActivationTemplateResponse('TL-497-535-242') # Or # return TemplateResource().get(pk='TEMPLATE_ID') diff --git a/example/example.py b/example/example.py index b0e72bf..85a1c0a 100644 --- a/example/example.py +++ b/example/example.py @@ -43,7 +43,7 @@ def process_request(self, request): # Approve by Template # noinspection PyUnreachableCode - return ActivationTemplateResponse(template_id="TL-497-535-242") + return ActivationTemplateResponse('TL-497-535-242') # Or # return TemplateResource().get(pk='TEMPLATE_ID') From d7c67c6be3ea638e0315fe56c4e09fd77fb83c55 Mon Sep 17 00:00:00 2001 From: Javier San Juan Cervera Date: Tue, 19 Mar 2019 09:13:41 +0100 Subject: [PATCH 6/8] Added contract, product and marketplace to 'Processing request' log message. --- README.md | 6 +++++- example/example.py | 6 +++++- 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 4734fcf..70dbc0e 100644 --- a/README.md +++ b/README.md @@ -46,7 +46,11 @@ from connect.models.exception import FulfillmentFail, FulfillmentInquire, Skip class ExampleRequestProcessor(FulfillmentAutomation): def process_request(self, request): - logger.info('Processing request {}'.format(request.id)) + logger.info('Processing request {} for contract {}, product {}, marketplace {}' + .format(request.id, + request.contract.id, + request.asset.product.name, + request.marketplace.name)) # Custom logic if request.type == 'purchase': diff --git a/example/example.py b/example/example.py index 85a1c0a..d13817d 100644 --- a/example/example.py +++ b/example/example.py @@ -21,7 +21,11 @@ class ExampleRequestProcessor(FulfillmentAutomation): def process_request(self, request): - logger.info('Processing request {}'.format(request.id)) + logger.info('Processing request {} for contract {}, product {}, marketplace {}' + .format(request.id, + request.contract.id, + request.asset.product.name, + request.marketplace.name)) # Custom logic if request.type == 'purchase': From f34e62a88d29aa9302cc1b8c73b87414646605c5 Mon Sep 17 00:00:00 2001 From: Javier San Juan Cervera Date: Tue, 19 Mar 2019 09:21:22 +0100 Subject: [PATCH 7/8] Added link to documentation in README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 70dbc0e..27b25fd 100644 --- a/README.md +++ b/README.md @@ -5,7 +5,7 @@ --- Connect Python SDK allows an easy and fast integration with Connect fulfillment API. Thanks to it you can automate the fulfillment of orders generated by your products. -In order to use this library, please ensure that you have read first the documentation available on Connect knowledge base article located here, this one will provide you a great information on the rest api that this library implements. +In order to use this library, please ensure that you have read first the documentation available on Connect knowledge base article located [here](http://help.vendor.connect.cloud.im/support/solutions/articles/43000030735-fulfillment-management-module), this one will provide you a great information on the rest api that this library implements. ### Class Features --- This library may be consumed in your project in order to automate the fulfillment of requests, this class once imported into your project will allow you to: From f05134abcd496b6c4a96a6eb52f515617fe09849 Mon Sep 17 00:00:00 2001 From: Javier San Juan Cervera Date: Tue, 19 Mar 2019 09:27:04 +0100 Subject: [PATCH 8/8] Renamed 'filename' parameter in Config initializer back to 'file'. --- connect/config.py | 21 +++++++++++---------- example/example.py | 2 +- tests/test_config.py | 6 +++--- 3 files changed, 15 insertions(+), 14 deletions(-) diff --git a/connect/config.py b/connect/config.py index 92463e7..d6b52cd 100644 --- a/connect/config.py +++ b/connect/config.py @@ -12,22 +12,23 @@ class Config(object): _instance = None # Global instance + # noinspection PyShadowingBuiltins def __init__( self, api_url=None, api_key=None, products=None, - filename=None + file=None ): """ initialization config for public api :param api_url: Public api url :param api_key: Service user ApiKey :param products (optional): Id products - :param filename: Config file path + :param file: Config file path """ # Check arguments - if not filename and not any([api_key, api_url]): + if not file and not any([api_key, api_url]): raise ValueError('Filename or api_key and api_url are expected' 'in Config initialization') if products and not isinstance(products, (str, list)): @@ -35,18 +36,18 @@ def __init__( + type(products).__name__) # Load config from file name - if filename: - if not os.path.exists(filename): - raise IOError('No filename `{}` on directory'.format(filename)) + if file: + if not os.path.exists(file): + raise IOError('No file `{}` on directory'.format(file)) - with open(filename) as config_file: + with open(file) as config_file: configs = config_file.read() try: configs = json.loads(configs) except Exception as ex: - raise TypeError('Invalid config filename `{}`\n' - 'ERROR: {}'.format(filename, str(ex))) + raise TypeError('Invalid config file `{}`\n' + 'ERROR: {}'.format(file, str(ex))) (api_url, api_key, products) = (configs.get('apiEndpoint', ''), configs.get('apiKey', ''), @@ -71,7 +72,7 @@ def __init__( @classmethod def get_instance(cls): if not cls._instance: - cls._instance = Config(filename='config.json') + cls._instance = Config(file='config.json') return cls._instance @property diff --git a/example/example.py b/example/example.py index d13817d..f5cc439 100644 --- a/example/example.py +++ b/example/example.py @@ -15,7 +15,7 @@ logger.setLevel("DEBUG") # If we remove this line, it is done implicitly -Config(filename='config.json') +Config(file='config.json') class ExampleRequestProcessor(FulfillmentAutomation): diff --git a/tests/test_config.py b/tests/test_config.py index 6b0cef7..c4fd4fe 100644 --- a/tests/test_config.py +++ b/tests/test_config.py @@ -46,11 +46,11 @@ def test_global_config_immutable_properties(): def test_init_config_with_non_existing_file(): with pytest.raises(IOError): - Config(filename='non_existing_config.json') + Config(file='non_existing_config.json') def test_init_config_with_file(): - _assert_config(Config(filename='config.json')) + _assert_config(Config(file='config.json')) def test_init_config_with_arguments(): @@ -72,7 +72,7 @@ def test_init_config_with_invalid_arguments(): # noinspection PyPropertyAccess def test_config_immutable_properties(): - config = Config(filename='config.json') + config = Config(file='config.json') with pytest.raises(AttributeError): config.api_key = conf_dict.get('apiKey') config.api_url = conf_dict.get('apiEndpoint')