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
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)'))
@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)
_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]
: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
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))