Skip to content

Commit

Permalink
Merge pull request #20 from JaviCerveraIngram/suppress-warnings
Browse files Browse the repository at this point in the history
Suppress warnings
  • Loading branch information
marcserrat authored Mar 19, 2019
2 parents 1dd2361 + f05134a commit 72b4423
Show file tree
Hide file tree
Showing 14 changed files with 72 additions and 47 deletions.
34 changes: 20 additions & 14 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -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](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:
Expand Down Expand Up @@ -45,8 +45,14 @@ from connect.models.exception import FulfillmentFail, FulfillmentInquire, Skip

class ExampleRequestProcessor(FulfillmentAutomation):
def process_request(self, request):

# custom logic

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':
for item in request.asset.items:
if item.quantity > 100000:
Expand All @@ -58,27 +64,27 @@ class ExampleRequestProcessor(FulfillmentAutomation):
param.value_error = 'Email address has not been provided, please provide one'
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!')
# or
# Approve by ActivationTile
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
return ActivationTemplateResponse(template_id="TL-497-535-242")
# or
# Approve by Template
return ActivationTemplateResponse('TL-497-535-242')
# Or
# return TemplateResource().get(pk='TEMPLATE_ID')

elif request.type == 'change':
# fail
# Fail
raise FulfillmentFail()
else:
# skip request
# Skip request
raise Skip()


if __name__ == '__main__':
request = ExampleRequestProcessor()
request.process()
request_processor = ExampleRequestProcessor()
request_processor.process()
```

3 changes: 2 additions & 1 deletion connect/config.py
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@
class Config(object):
_instance = None # Global instance

# noinspection PyShadowingBuiltins
def __init__(
self,
api_url=None,
Expand All @@ -37,7 +38,7 @@ def __init__(
# Load config from file name
if file:
if not os.path.exists(file):
raise IOError('Not file `{}` on directory'.format(file))
raise IOError('No file `{}` on directory'.format(file))

with open(file) as config_file:
configs = config_file.read()
Expand Down
2 changes: 1 addition & 1 deletion connect/models/activation_response.py
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand Down
2 changes: 2 additions & 0 deletions connect/models/asset.py
Original file line number Diff line number Diff line change
Expand Up @@ -17,12 +17,14 @@
class Asset(BaseModel):
def get_param_by_id(self, id_):
try:
# noinspection PyUnresolvedReferences
return list(filter(lambda param: param.id == id_, 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
Expand Down
2 changes: 1 addition & 1 deletion connect/models/base.py
Original file line number Diff line number Diff line change
Expand Up @@ -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():
Expand Down
10 changes: 6 additions & 4 deletions connect/models/exception.py
Original file line number Diff line number Diff line change
Expand Up @@ -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'


Expand All @@ -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)
3 changes: 3 additions & 0 deletions connect/models/fulfillment.py
Original file line number Diff line number Diff line change
Expand Up @@ -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))
Expand Down
8 changes: 4 additions & 4 deletions connect/resource/base.py
Original file line number Diff line number Diff line change
Expand Up @@ -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):
Expand Down Expand Up @@ -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()

Expand All @@ -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)
Expand Down
8 changes: 4 additions & 4 deletions connect/resource/fulfillment.py
Original file line number Diff line number Diff line change
Expand Up @@ -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):
Expand All @@ -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
Expand Down
6 changes: 3 additions & 3 deletions connect/resource/template.py
Original file line number Diff line number Diff line change
Expand Up @@ -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):
Expand All @@ -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)
Expand Down
4 changes: 2 additions & 2 deletions connect/resource/utils.py
Original file line number Diff line number Diff line change
Expand Up @@ -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)
33 changes: 20 additions & 13 deletions example/example.py
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -21,7 +21,13 @@
class ExampleRequestProcessor(FulfillmentAutomation):
def process_request(self, request):

# custom logic
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':
for item in request.asset.items:
if item.quantity > 100000:
Expand All @@ -33,25 +39,26 @@ def process_request(self, request):
param.value_error = 'Email address has not been provided, please provide one'
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!')
# or
# Approve by ActivationTile
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
return ActivationTemplateResponse(template_id="TL-497-535-242")
# or
# Approve by Template
# noinspection PyUnreachableCode
return ActivationTemplateResponse('TL-497-535-242')
# Or
# return TemplateResource().get(pk='TEMPLATE_ID')

elif request.type == 'change':
# fail
# Fail
raise FulfillmentFail()
else:
# skip request
# Skip request
raise Skip()


if __name__ == '__main__':
request = ExampleRequestProcessor()
request.process()
request_processor = ExampleRequestProcessor()
request_processor.process()
3 changes: 3 additions & 0 deletions setup.py
Original file line number Diff line number Diff line change
Expand Up @@ -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__)),
Expand Down
1 change: 1 addition & 0 deletions tests/test_config.py
Original file line number Diff line number Diff line change
Expand Up @@ -70,6 +70,7 @@ def test_init_config_with_invalid_arguments():
)


# noinspection PyPropertyAccess
def test_config_immutable_properties():
config = Config(file='config.json')
with pytest.raises(AttributeError):
Expand Down

0 comments on commit 72b4423

Please sign in to comment.