Skip to content

Commit

Permalink
:add: translator factory
Browse files Browse the repository at this point in the history
  • Loading branch information
b3j0f committed Oct 26, 2016
1 parent e6e49f1 commit 5f61c00
Show file tree
Hide file tree
Showing 4 changed files with 79 additions and 21 deletions.
89 changes: 72 additions & 17 deletions b3j0f/requester/driver/custom.py
Expand Up @@ -33,7 +33,7 @@
from copy import deepcopy

from b3j0f.annotation import Annotation
from b3j0f.schema import Schema, data2schema
from b3j0f.schema import Schema, data2schema, ParamSchema, getresource

from .base import Driver
from .py import processread
Expand All @@ -56,7 +56,8 @@
'CustomDriver',
'func2crudprocessing', 'obj2driver',
'CreateAnnotation', 'ReadAnnotation', 'UpdateAnnotation',
'DeleteAnnotation', 'query2kwargs'
'DeleteAnnotation', 'query2kwargs',
'TranslatorFactory', 'registertranslator'
]


Expand Down Expand Up @@ -187,23 +188,30 @@ def _processing(crud, transaction, _func=func, **kwargs):

threads = []

for funckwargs in orfunckwargs:
ctx = transaction.ctx
translator = annotation.translator

for funckwargs in orfunckwargs:
funcvarargs = []

for param in _func.params:
if _func.params:

pname = param.name
for param in _func.params:
pname = param.name

if pname in transaction.ctx and pname not in funckwargs:
if pname in ctx and pname not in funckwargs:
val = ctx[param.name]

funckwargs[param.name] = transaction.ctx[param.name]
if translator is not None:
val = translator(pname, val, ctx)

if annotation.translator is not None:
funckwargs[param.name] = val

elif translator is not None:
for key in list(funckwargs):
val = funckwargs[key]

funckwargs[key] = annotation.translator(key, val)
funckwargs[key] = translator(key, val, ctx)

if isinstance(crud, (Create, Update)):

Expand Down Expand Up @@ -443,8 +451,9 @@ def __init__(self, crud, gateway=True, translator=None, *args, **kwargs):
:param str crud: crud name.
:param bool gateway: pass arguments from the context to the function.
:param callable translator: if gateway, translate gateway parameters to
translated data. Must take a gateway parameter name and value in
parameters. For example you could use `datafromgateway`.
translated data. Must take a gateway parameter (name) and value in
parameters. For example you could use `datafromgateway`. Default
is translator factory.
"""

super(_CRUDAnnotation, self).__init__(*args, **kwargs)
Expand All @@ -454,7 +463,7 @@ def __init__(self, crud, gateway=True, translator=None, *args, **kwargs):

self.name = crud
self.gateway = gateway
self.translator = translator
self.translator = translator or _SINGLETONTRANSLATORFACTORY


class CreateAnnotation(_CRUDAnnotation):
Expand Down Expand Up @@ -497,13 +506,19 @@ def __init__(self, *args, **kwargs):
)


def datafromgateway(name, param):
"""Get a data from parameter."""
def datafromgateway(param, val, ctx):
"""Get a data from parameter value.
result = param
:param param: parameter (name) to translate.
:param val: parameter value to translate.
:param dict ctx: expression execution context.
:return: translation of input val.
"""

if isinstance(param, dict):
for key, value in iteritems(param):
result = val

if isinstance(val, dict):
for key, value in iteritems(val):
if key == FuncName.EQ.value:
result = value[0]

Expand All @@ -514,3 +529,43 @@ def datafromgateway(name, param):
result = value

return result


class TranslatorFactory(object):
"""Register translators by data type and translate an expression."""

def __init__(self, *args, **kwargs):

super(TranslatorFactory, self).__init__(*args, **kwargs)

self.translators = {}

def register(self, cls, translator):

self.translators[cls] = translator

def __call__(self, param, val, ctx):

if isinstance(param, ParamSchema):
if param.ref in self.translators:
cls = param.ref

else:
cls = getresource(param.ref)

translator = self.translators.get(cls, datafromgateway)

else:
translator = datafromgateway

result = translator(param, val, ctx)

return result

_SINGLETONTRANSLATORFACTORY = TranslatorFactory()


def registertranslator(cls, translator):
"""Register input cls and translator in the singleton translatorfactory."""

_SINGLETONTRANSLATORFACTORY.register(cls, translator)
4 changes: 1 addition & 3 deletions b3j0f/requester/driver/test/custom.py
Expand Up @@ -38,9 +38,7 @@
obj2driver, CustomDriver, query2kwargs
)
from ..ctx import Context
from ..custom import func2crudprocessing
from ..transaction import Transaction, State
from ...request.crud.base import CRUD
from ..transaction import State
from ...request.crud.create import Create
from ...request.crud.delete import Delete
from ...request.crud.read import Read
Expand Down
2 changes: 1 addition & 1 deletion b3j0f/requester/version.py
Expand Up @@ -35,4 +35,4 @@
# thanks to https://github.com/pycontribs/jira/blob/master/jira/version.py

#: project version
__version__ = '0.0.2'
__version__ = '0.0.3'
5 changes: 5 additions & 0 deletions changelog.rst
@@ -1,6 +1,11 @@
ChangeLog
=========

0.0.3 - 2016/10/26
==================

- add translator factory in order to set the right translator for the right expression.

0.0.2 - 2016/10/14
==================

Expand Down

0 comments on commit 5f61c00

Please sign in to comment.