Add injections extension

This commit is contained in:
Roman Mogilatov 2016-10-31 11:31:33 +02:00
parent d594f8018a
commit 7559959f35
2 changed files with 129 additions and 0 deletions

View File

@ -0,0 +1,63 @@
"""Dependency injector injections.
Cython optimized code.
"""
cpdef tuple parse_positional_injections(tuple args)
cpdef tuple parse_named_injections(dict kwargs)
cdef class Injection:
pass
cdef class PositionalInjection(Injection):
cdef object __value
cdef int __is_provider
cdef int __is_delegated
cdef int __call
cdef inline object get_value(self):
if self.__call == 0:
return self.__value
return self.__value()
cdef class NamedInjection(Injection):
cdef object __name
cdef object __value
cdef int __is_provider
cdef int __is_delegated
cdef int __call
cdef inline object get_name(self):
return self.__name
cdef inline object get_value(self):
if self.__call == 0:
return self.__value
return self.__value()
cdef inline tuple __provide_positional_args(tuple inj_args,
int inj_args_len,
tuple args):
cdef PositionalInjection injection
if inj_args_len > 0:
positional_args = list()
for index in range(inj_args_len):
injection = <PositionalInjection>inj_args[index]
positional_args.append(injection.get_value())
positional_args.extend(args)
args = positional_args
return args
cdef inline dict __provide_keyword_args(tuple inj_kwargs,
int inj_kwargs_len,
dict kwargs):
cdef NamedInjection kw_injection
if inj_kwargs_len > 0:
for index in range(inj_kwargs_len):
kw_injection = <NamedInjection>inj_kwargs[index]
kwargs[kw_injection.get_name()] = kw_injection.get_value()
return kwargs

View File

@ -0,0 +1,66 @@
"""Dependency injector injections.
Cython optimized code.
"""
# TODO: replace to cimport
from .utils import is_provider
cdef class Injection:
"""Abstract injection class."""
cdef class PositionalInjection(Injection):
"""Positional injection class."""
def __init__(self, value):
"""Initializer."""
self.__value = value
self.__is_provider = <int>is_provider(value)
self.__is_delegated = 0
self.__call = <int>self.__is_provider == 1 and self.__is_delegated == 0
cdef class NamedInjection(Injection):
"""Keyword injection class."""
def __init__(self, name, value):
"""Initializer."""
self.__name = name
self.__value = value
self.__is_provider = <int>is_provider(value)
self.__is_delegated = 0
self.__call = <int>self.__is_provider == 1 and self.__is_delegated == 0
cpdef tuple parse_positional_injections(tuple args):
"""Parse positional injections."""
cdef list injections = list()
cdef int args_len = len(args)
cdef object arg
cdef int index
cdef PositionalInjection injection
for index in range(args_len):
arg = args[index]
injection = PositionalInjection(arg)
injections.append(injection)
return tuple(injections)
cpdef tuple parse_named_injections(dict kwargs):
"""Parse named injections."""
cdef list injections = list()
cdef object name
cdef object arg
cdef NamedInjection injection
for name, arg in kwargs.items():
injection = NamedInjection(name, arg)
injections.append(injection)
return tuple(injections)