From 7559959f35b1ebba8512ffe873ee6e8278132ef4 Mon Sep 17 00:00:00 2001 From: Roman Mogilatov Date: Mon, 31 Oct 2016 11:31:33 +0200 Subject: [PATCH] Add injections extension --- dependency_injector/injections.pxd | 63 ++++++++++++++++++++++++++++ dependency_injector/injections.pyx | 66 ++++++++++++++++++++++++++++++ 2 files changed, 129 insertions(+) create mode 100644 dependency_injector/injections.pxd create mode 100644 dependency_injector/injections.pyx diff --git a/dependency_injector/injections.pxd b/dependency_injector/injections.pxd new file mode 100644 index 00000000..5f9abfc4 --- /dev/null +++ b/dependency_injector/injections.pxd @@ -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 = 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 = inj_kwargs[index] + kwargs[kw_injection.get_name()] = kw_injection.get_value() + return kwargs diff --git a/dependency_injector/injections.pyx b/dependency_injector/injections.pyx new file mode 100644 index 00000000..3e431927 --- /dev/null +++ b/dependency_injector/injections.pyx @@ -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 = is_provider(value) + self.__is_delegated = 0 + self.__call = 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 = is_provider(value) + self.__is_delegated = 0 + self.__call = 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)