Ejemplo n.º 1
0
 def reinitialize_with_args(self, *action_init_args, **action_init_kwargs):
     check_and_raise(
         self.init_func,
         'Cannot initialize without an initialization function. Please provide an "init" key or a class on action_info',
         KeyError)
     self.init_result = self.init_func(*action_init_args, **action_init_kwargs)
     if self.init_class:
         self.func = self.init_result.run
Ejemplo n.º 2
0
 def one_or_none(self) -> Optional[GraphObject]:
     quantity = len(self.results)
     check_and_raise(
         quantity <= 1,
         QuantityError(
             f'Expected to have one or no objects. Has {quantity}'))
     if self.results:
         return next(iter(self.results))
     else:
         return None
Ejemplo n.º 3
0
    def filter_by_relation(self, relation: Query) -> 'Query':
        check_and_raise(relation.lazy)

        def action(results: Iterable[GraphObject]):
            new_results = []

            for element in results:
                if relation.execute(element).has_any():
                    new_results.append(element)

            return new_results

        if self.lazy:
            self._calls.append(action)
        else:
            self.results = action(self.results)
        return self
Ejemplo n.º 4
0
    def __init__(self,
                 *action_run_args,
                 action_info: Union[ActionTemplate, dict, object],
                 name=None,
                 **action_run_kwargs):
        if type(action_info) is not ActionTemplate:
            check_and_raise(name, "parameter 'name' must be set when 'action_info' is not of type ActionTemplate",
                            NameError)

            action_info = ActionTemplate.make(name=name, action_info=action_info)

        self.name = action_info.name
        self.func = action_info.func
        self.run_args = action_run_args
        self.run_kwargs = action_run_kwargs
        self.init_result = action_info.init_result
        self.task_info_getter = action_info.task_info_getter
Ejemplo n.º 5
0
    def make(cls, *action_init_args, name, action_info: Union[dict, Callable],
             **action_init_kwargs) -> 'ActionTemplate':
        self = cls(name=name, func=None)
        self.init_class = None
        if type(action_info) is dict:
            if 'class' in action_info:
                self.init_class = action_info['class']
            else:
                check_and_raise('run' in action_info, 'action_info must contain a "run" key with a callable as value',
                                KeyError)
                self.func = action_info['run']
                if 'init' in action_info:
                    self.init_func = action_info['init']

            if 'description' in action_info:
                self.description = action_info['description']

            self.task_info_getter = action_info.get('task_info', None)

        elif inspect.isfunction(action_info) or inspect.isbuiltin(action_info):
            self.func = action_info

        else:
            self.init_class = action_info
            if hasattr(self.init_class, 'description'):
                self.description = self.init_class.description

        if self.init_class:
            self.init_func = self.init_class

        if self.init_func:
            self.init_result = self.init_func(*action_init_args, **action_init_kwargs)

        if self.init_class:
            check_and_raise(hasattr(self.init_class, 'run'), 'action_info must contain a "run" attribute',
                            AttributeError)
            self.func = self.init_result.run

        return self
Ejemplo n.º 6
0
def ensure_type(
        obj: Any,
        _type: Union[Type[T], Union[Type, Tuple[Union[Type, None], ...]]],
        output_type: Optional[Type[T]] = None,
        exception: Union[BaseException, Type[BaseException]] = TypeError) -> T:
    # if output_type is None:
    #     if isinstance(_type, Tuple):
    #         raise ValueError('output_type must be set when more than one type is given')
    #     else:
    #         output_type = _type

    if isinstance(_type, tuple) and None in _type:
        if obj is None:
            return None
        _type = tuple(t for t in _type if t is not None)

    if isinstance(exception, BaseException):  # is instance of exception
        check_and_raise(isinstance(obj, _type), exception=exception)
    else:  # is class
        exception_message = f"Object of type {type(obj)} does not match type {_type}"
        check_and_raise(isinstance(obj, _type),
                        exception=exception(exception_message))

    return cast(T, obj)
Ejemplo n.º 7
0
 def ensure_zero(self):
     quantity = len(self.results)
     check_and_raise(
         quantity == 0,
         QuantityError(f'Expected to have no objects. Has {quantity}'))
Ejemplo n.º 8
0
 def one(self) -> GraphObject:
     quantity = len(self.results)
     check_and_raise(
         quantity == 1,
         QuantityError(f'Expected to have one object. Has {quantity}'))
     return next(iter(self.results))
Ejemplo n.º 9
0
 def results(self, value: Iterable[GraphObject]):
     check_and_raise(not self.lazy)
     self._results = set(value)
Ejemplo n.º 10
0
 def results(self):
     check_and_raise(not self.lazy)
     return self._results
Ejemplo n.º 11
0
    def _get_real_index(self, index: int) -> int:
        if index < 0:
            index = len(self) + index

        check_and_raise(0 <= index < len(self), IndexError)
        return index