Пример #1
0
def _setup_context(data, context, finalizer, convention):
    if context is None:
        context = contexts.Context(
            convention=convention or conventions.CamelCaseConvention())

    if finalizer is None:
        @specs.parameter('iterator', yaqltypes.Iterable())
        @specs.name('#iter')
        def limit(iterator):
            return iterator

        @specs.inject('limiter', yaqltypes.Delegate('#iter'))
        @specs.inject('engine', yaqltypes.Engine())
        @specs.name('#finalize')
        def finalize(obj, limiter, engine):
            if engine.options.get('yaql.convertOutputData', True):
                return utils.convert_output_data(obj, limiter, engine)
            return obj

        context.register_function(limit)
        context.register_function(finalize)
    else:
        context.register_function(finalizer)

    if data is not utils.NO_VALUE:
        context['$'] = utils.convert_input_data(data)
    return context
Пример #2
0
    def test_nullable_collections(self):
        @specs.parameter('arg', yaqltypes.Sequence())
        def foo1(arg):
            return arg is None

        @specs.parameter('arg', yaqltypes.Sequence(nullable=True))
        def foo2(arg):
            return arg is None

        @specs.parameter('arg', yaqltypes.Iterable())
        def bar1(arg):
            return arg is None

        @specs.parameter('arg', yaqltypes.Iterable(nullable=True))
        def bar2(arg):
            return arg is None

        @specs.parameter('arg', yaqltypes.Iterator())
        def baz1(arg):
            return arg is None

        @specs.parameter('arg', yaqltypes.Iterator(nullable=True))
        def baz2(arg):
            return arg is None

        for func in (foo1, foo2, bar1, bar2, baz1, baz2):
            self.context.register_function(func)

        self.assertFalse(self.eval('foo1([1, 2])'))
        self.assertRaises(exceptions.NoMatchingFunctionException, self.eval,
                          'foo1(null)')
        self.assertFalse(self.eval('foo2([1, 2])'))
        self.assertTrue(self.eval('foo2(null)'))

        self.assertFalse(self.eval('bar1([1, 2])'))
        self.assertRaises(exceptions.NoMatchingFunctionException, self.eval,
                          'bar1(null)')
        self.assertFalse(self.eval('bar2([1, 2])'))
        self.assertTrue(self.eval('bar2(null)'))

        self.assertFalse(self.eval('baz1($)', data=iter([1, 2])))
        self.assertRaises(exceptions.NoMatchingFunctionException, self.eval,
                          'baz1(null)')
        self.assertFalse(self.eval('baz2($)', data=iter([1, 2])))
        self.assertTrue(self.eval('baz2(null)'))
Пример #3
0
@specs.parameter('args', nullable=True)
@specs.inject('delegate', yaqltypes.Delegate('to_list', method=True))
def list_(delegate, *args):
    def rec(seq):
        for t in seq:
            if utils.is_iterator(t):
                for t2 in rec(t):
                    yield t2
            else:
                yield t

    return delegate(rec(args))


@specs.method
@specs.parameter('collection', yaqltypes.Iterable())
def flatten(collection):
    for t in collection:
        if utils.is_iterable(t):
            for t2 in flatten(t):
                yield t2
        else:
            yield t


@specs.method
@specs.parameter('collection', yaqltypes.Iterable())
def to_list(collection):
    if isinstance(collection, tuple):
        return collection
    return tuple(collection)
Пример #4
0
_random_string_counter = None


@specs.parameter('value', yaqltypes.String())
@specs.extension_method
def base64encode(value):
    return base64.b64encode(value)


@specs.parameter('value', yaqltypes.String())
@specs.extension_method
def base64decode(value):
    return base64.b64decode(value)


@specs.parameter('collection', yaqltypes.Iterable())
@specs.parameter('composer', yaqltypes.Lambda())
@specs.extension_method
def pselect(collection, composer):
    return helpers.parallel_select(collection, composer)


@specs.parameter('mappings', collections.Mapping)
@specs.extension_method
def bind(obj, mappings):
    if isinstance(obj, types.StringTypes) and obj.startswith('$'):
        value = _convert_macro_parameter(obj[1:], mappings)
        if value is not None:
            return value
    elif utils.is_sequence(obj):
        return [bind(t, mappings) for t in obj]
Пример #5
0
    :argType expr: expression that can be evaluated as a method
    :returnType: expression result or null

    .. code::

        yaql> [0, 1]?.select($+1)
        [1, 2]
        yaql> null?.select($+1)
        null
    """
    if receiver is None:
        return None
    return operator(receiver, expr)


@specs.parameter('sequence', yaqltypes.Iterable())
@specs.parameter('args', yaqltypes.String())
@specs.method
def unpack(sequence, context, *args):
    """:yaql:unpack

    Returns context object with sequence values unpacked to args.
    If args size is equal to sequence size then args get appropriate
    sequence values.
    If args size is 0 then args are 1-based indexes.
    Otherwise ValueError is raised.

    :signature: sequence.unpack([args])
    :receiverArg sequence: iterable of items to be passed as context values
    :argType sequence: iterable
    :arg [args]: keys to be associated with sequence items. If args size is
Пример #6
0
            def __eq__(self, other):
                return self.compare(self.obj, other.obj) == 0

            def __le__(self, other):
                return self.compare(self.obj, other.obj) <= 0

            def __ge__(self, other):
                return self.compare(self.obj, other.obj) >= 0

            def __ne__(self, other):
                return self.compare(self.obj, other.obj) != 0

        outer_self.sorted = sorted(outer_self.collection, key=Comparator)


@specs.parameter('collection', yaqltypes.Iterable())
@specs.parameter('predicate', yaqltypes.Lambda())
@specs.method
def where(collection, predicate):
    return six.moves.filter(predicate, collection)


@specs.parameter('collection', yaqltypes.Iterable())
@specs.parameter('selector', yaqltypes.Lambda())
@specs.method
def select(collection, selector):
    return six.moves.map(selector, collection)


@specs.parameter('collection', yaqltypes.Iterable())
@specs.parameter('attribute', yaqltypes.Keyword(expand=False))