def test_keyword_constant_function(self): @specs.parameter('arg', yaqltypes.Keyword()) def foo(arg): return arg context = self.context.create_child_context() context.register_function(foo) self.assertEqual('qw', self.eval('foo(qw)', context=context)) self.assertRaises(exceptions.NoMatchingFunctionException, self.eval, 'foo($)', context=context, data='asd') self.assertRaises(exceptions.NoMatchingFunctionException, self.eval, 'foo("q w")', context=context) self.assertRaises(exceptions.NoMatchingFunctionException, self.eval, 'foo(null)', context=context)
@specs.parameter('collection', yaqltypes.Iterable()) @specs.parameter('key_selector', yaqltypes.Lambda()) @specs.parameter('value_selector', yaqltypes.Lambda()) @specs.method def to_dict(collection, engine, key_selector, value_selector=None): result = {} for t in collection: key = key_selector(t) value = t if value_selector is None else value_selector(t) result[key] = value utils.limit_memory_usage(engine, (1, result)) return result @specs.parameter('d', utils.MappingType, alias='dict') @specs.parameter('key', yaqltypes.Keyword()) @specs.name('#operator_.') def dict_keyword_access(d, key): return d[key] @specs.parameter('d', utils.MappingType, alias='dict') @specs.name('#indexer') def dict_indexer(d, key): return d[key] @specs.parameter('d', utils.MappingType, alias='dict') @specs.name('#indexer') def dict_indexer_with_default(d, key, default): return d.get(key, default)
name = mappings arg_mappings = {} func = getattr(receiver, name) args, kwargs = runner.translate_args(False, expr.args, {}) args = tuple(arg(utils.NO_VALUE, context, engine) for arg in args) for key, value in six.iteritems(kwargs): kwargs[arg_mappings.get(key, key)] = value(utils.NO_VALUE, context, engine) res = func(*args, **kwargs) _auto_yaqlize(res, settings) return res @specs.parameter('obj', Yaqlized(can_access_attributes=True)) @specs.parameter('attr', yaqltypes.Keyword()) @specs.name('#operator_.') def attribution(obj, attr): settings = yaqlization.get_yaqlization_settings(obj) _validate_name(attr, settings) attr = _remap_name(attr, settings) res = getattr(obj, attr) _auto_yaqlize(res, settings) return res @specs.parameter('obj', Yaqlized(can_index=True)) @specs.name('#indexer') def indexation(obj, key): settings = yaqlization.get_yaqlization_settings(obj) _validate_name(key, settings, KeyError)
def _create_context(self, root_context): @specs.parameter('path', yaqltypes.Lambda(with_context=True)) def get_context_data(path): path = path(root_context) def set_data(value): if not path or path == '$' or path == '$this': raise ValueError() root_context[path] = value return LhsExpression.Property(lambda: root_context[path], set_data) @specs.parameter('this', LhsExpression.Property) @specs.parameter('key', yaqltypes.Keyword()) def attribution(this, key): def setter(src_property, value): src = src_property.get() if isinstance(src, utils.MappingType): src_property.set( utils.FrozenDict( itertools.chain(src.iteritems(), ((key, value), )))) elif isinstance(src, dsl_types.MuranoObject): src.set_property(key, value, root_context) else: raise ValueError('attribution may only be applied to ' 'objects and dictionaries') def getter(src): if isinstance(src, utils.MappingType): return src.get(key, {}) elif isinstance(src, dsl_types.MuranoObject): self._current_obj = src self._current_obj_name = key try: return src.get_property(key, root_context) except exceptions.UninitializedPropertyAccessError: return {} else: raise ValueError('attribution may only be applied to ' 'objects and dictionaries') return LhsExpression.Property(lambda: getter(this.get()), lambda value: setter(this, value)) @specs.parameter('this', LhsExpression.Property) @specs.parameter('index', yaqltypes.Lambda(with_context=True)) def indexation(this, index): index = index(root_context) def getter(src): if utils.is_sequence(src): return src[index] else: raise ValueError('indexation may only be applied to lists') def setter(src_property, value): src = src_property.get() if utils.is_sequence(src): src_property.set(src[:index] + (value, ) + src[index + 1:]) if isinstance(index, types.IntType): return LhsExpression.Property( lambda: getter(this.get()), lambda value: setter(this, value)) else: return attribution(this, index) context = yaql_integration.create_empty_context() context.register_function(get_context_data, '#get_context_data') context.register_function(attribution, '#operator_.') context.register_function(indexation, '#indexer') return context
def _create_context(self, root_context): @specs.parameter('name', yaqltypes.StringConstant()) def get_context_data(name): def set_data(value): if not name or name == '$' or name == '$this': raise ValueError('Cannot assign to {0}'.format(name)) ctx = root_context while constants.CTX_VARIABLE_SCOPE not in ctx: ctx = ctx.parent ctx[name] = value return LhsExpression.Property(lambda: root_context[name], set_data) @specs.parameter('this', LhsExpression.Property) @specs.parameter('key', yaqltypes.Keyword()) def attribution(this, key): def setter(src_property, value): src = src_property.get() if isinstance(src, utils.MappingType): src_property.set( utils.FrozenDict( itertools.chain(six.iteritems(src), ((key, value), )))) elif isinstance(src, dsl_types.MuranoObject): src.set_property(key, value, root_context) elif isinstance( src, (dsl_types.MuranoTypeReference, dsl_types.MuranoType)): if isinstance(src, dsl_types.MuranoTypeReference): mc = src.type else: mc = src mc.set_property(key, value, root_context) else: raise ValueError('attribution may only be applied to ' 'objects and dictionaries') def getter(src): if isinstance(src, utils.MappingType): return src.get(key, {}) elif isinstance(src, dsl_types.MuranoObject): self._current_obj = src self._current_obj_name = key try: return src.get_property(key, root_context) except exceptions.UninitializedPropertyAccessError: return {} else: raise ValueError('attribution may only be applied to ' 'objects and dictionaries') return LhsExpression.Property(lambda: getter(this.get()), lambda value: setter(this, value)) @specs.parameter('this', LhsExpression.Property) @specs.parameter('index', yaqltypes.Lambda(with_context=True)) def indexation(this, index): index = index(root_context) def getter(src): if utils.is_sequence(src): return src[index] else: raise ValueError('indexation may only be applied to lists') def setter(src_property, value): src = src_property.get() if utils.is_sequence(src): src_property.set(src[:index] + (value, ) + src[index + 1:]) elif isinstance(src, utils.MappingType): attribution(src_property, index).set(value) if isinstance(index, int): return LhsExpression.Property( lambda: getter(this.get()), lambda value: setter(this, value)) else: return attribution(this, index) def _wrap_type_reference(tr): return LhsExpression.Property(lambda: tr, self._invalid_target) @specs.parameter('prefix', yaqltypes.Keyword()) @specs.parameter('name', yaqltypes.Keyword()) @specs.name('#operator_:') def ns_resolve(prefix, name): return _wrap_type_reference( yaql_functions.ns_resolve(context, prefix, name)) @specs.parameter('name', yaqltypes.Keyword()) @specs.name('#unary_operator_:') def ns_resolve_unary(context, name): return _wrap_type_reference( yaql_functions.ns_resolve_unary(context, name)) @specs.parameter('object_', dsl_types.MuranoObject) def type_(object_): return _wrap_type_reference(yaql_functions.type_(object_)) @specs.name('type') @specs.parameter('cls', dsl.MuranoTypeParameter()) def type_from_name(cls): return _wrap_type_reference(cls) context = yaql_integration.create_empty_context() context.register_function(get_context_data, '#get_context_data') context.register_function(attribution, '#operator_.') context.register_function(indexation, '#indexer') context.register_function(ns_resolve) context.register_function(ns_resolve_unary) context.register_function(type_) context.register_function(type_from_name) return context
:arg func: function to be returned :argType func: lambda :returnType: obj type or message .. code:: yaql> let(func => lambda(2 * $)) -> [1, 2, 3].select($func($)) [2, 4, 6] yaql> [1, 2, 3, 4].where(lambda($ > 3)($ + 1)) [3, 4] """ return func @specs.name('#operator_.') @specs.parameter('name', yaqltypes.Keyword()) @specs.inject('func', yaqltypes.Delegate(use_convention=False)) def get_property(func, obj, name): """:yaql:operator . Returns value of 'name' property. :signature: left.right :arg left: object :argType left: any :arg right: object property name :argType right: keyword :returnType: any .. code::
def typeinfo_for_class(cls): return cls.type @specs.parameter('object_', dsl.MuranoObjectParameter(nullable=True)) def name(object_): return None if object_ is None else object_.name @specs.parameter('object_', dsl.MuranoObjectParameter()) def metadata(object_): return object_.object.metadata @specs.parameter('obj', dsl.MuranoObjectParameter(decorate=False)) @specs.parameter('property_name', yaqltypes.Keyword()) @specs.name('#operator_.') def obj_attribution(context, obj, property_name): return obj.get_property(property_name, context) @specs.parameter('cls', dsl_types.MuranoTypeReference) @specs.parameter('property_name', yaqltypes.Keyword()) @specs.name('#operator_.') def obj_attribution_static(context, cls, property_name): return helpers.get_executor().get_static_property(cls.type, property_name, context) @specs.parameter('receiver', dsl.MuranoObjectParameter(decorate=False)) @specs.parameter('expr', yaqltypes.Lambda(method=True))
@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)) @specs.inject('operator', yaqltypes.Delegate('#operator_.')) @specs.name('#operator_.') def collection_attribution(collection, attribute, operator): return six.moves.map( lambda t: operator(t, attribute), collection) @specs.parameter('collection', yaqltypes.Iterable()) @specs.parameter('count', int, nullable=False) @specs.method def skip(collection, count): return itertools.islice(collection, count, None) @specs.parameter('collection', yaqltypes.Iterable())