Пример #1
0
    def evaluate(self):
        verbose_print('Evaluating union decomposition ({} clauses)'.format(
            len(self.mapping_generators)),
                      indent_after=True)

        sequence = make_sequence(self.union_expression())
        result = []

        for item in sequence:
            verbose_print(
                lambda: u'Visiting item {0}'.format(debug_dump_anything(item)),
                indent_after=True)

            with variable_scope():
                push_variable('_', make_sequence(item))
                if not hasattr(item, 'union_index'):
                    raise HqueryEvaluationError(
                        "Union decomposition applied to something that wasn't produced by a union"
                    )
                if item.union_index >= len(self.mapping_generators):
                    raise HqueryEvaluationError(
                        "Decomposed union had more clauses than its mapping")
                this_result = make_sequence(
                    self.mapping_generators[item.union_index]())
                verbose_print(
                    'Mapping yielded {0} results for this visit'.format(
                        len(this_result)))
                result = sequence_concat(result, this_result)

            verbose_print('Visit finished', outdent_before=True)

        verbose_print('Union decomposition completed', outdent_before=True)
        return result
Пример #2
0
    def _evaluate_iteration(self):
        with variable_scope():
            self._push_global_variables()

            sequence = make_sequence(self.sequence_expression())
            verbose_print(
                'Iterating over sequence containing {0} items'.format(
                    len(sequence)))
            result = []

            for item in sequence:
                verbose_print(lambda: u'Visiting item {0}'.format(
                    debug_dump_anything(item)),
                              indent_after=True)

                with variable_scope():
                    push_variable(self.sequence_variable, make_sequence(item))
                    self._push_iteration_variables()
                    this_result = make_sequence(self.return_expression())
                    verbose_print(
                        'Return clause yielded {0} results for this visit'.
                        format(len(this_result)))
                    result = sequence_concat(result, this_result)

                verbose_print('Visit finished', outdent_before=True)

        return result
Пример #3
0
    def evaluate(self):
        verbose_print('Evaluating union decomposition ({} clauses)'.format(len(self.mapping_generators)),
                      indent_after=True)

        sequence = make_sequence(self.union_expression())
        result = []

        for item in sequence:
            verbose_print(lambda: u'Visiting item {0}'.format(debug_dump_anything(item)), indent_after=True)

            with variable_scope():
                push_variable('_', make_sequence(item))
                if not hasattr(item, 'union_index'):
                    raise HqueryEvaluationError(
                        "Union decomposition applied to something that wasn't produced by a union"
                    )
                if item.union_index >= len(self.mapping_generators):
                    raise HqueryEvaluationError("Decomposed union had more clauses than its mapping")
                this_result = make_sequence(self.mapping_generators[item.union_index]())
                verbose_print(
                    'Mapping yielded {0} results for this visit'.format(
                        len(this_result)))
                result = sequence_concat(result, this_result)

            verbose_print('Visit finished', outdent_before=True)

        verbose_print('Union decomposition completed', outdent_before=True)
        return result
Пример #4
0
    def evaluate(self):
        result = dict()

        for item in make_sequence(
                self.contents()) if self.contents is not None else []:
            if isinstance(item, HashKeyValue):
                if is_sequence(item.value) and len(item.value) == 1:
                    item.value = item.value[0]

                if is_number(item.value) or is_boolean(item.value):
                    result[item.key] = item.value.value
                elif is_hash(item.value) or is_array(item.value):
                    result[item.key] = item.value.contents
                else:
                    result[item.key] = string_value(item.value)
            elif is_tag_node(item):
                self._gab('adding element "{0}" to contents'.format(item.name))
                self._process_tag(result, item)
            elif is_text_node(item) or is_string(item):
                self._gab('adding text "{0}" to contents'.format(
                    debug_dump_long_string(string_value(item))))
                result['text'] = self._append_to_text(
                    result['text'] if 'text' in result else '',
                    string_value(item))
            else:
                value_desc = debug_dump_node(item) if is_any_node(
                    item) else object_type_name(item)
                raise HqueryEvaluationError(
                    'Cannot use {0} as a content object in a computed JSON hash constructor'
                    .format(value_desc))

            self._process_filters(result)

        return JsonHash(result)
Пример #5
0
    def evaluate(self):
        result = dict()

        for item in make_sequence(self.contents()) if self.contents is not None else []:
            if isinstance(item, HashKeyValue):
                if is_sequence(item.value) and len(item.value) == 1:
                    item.value = item.value[0]

                if is_number(item.value) or is_boolean(item.value):
                    result[item.key] = item.value.value
                elif is_hash(item.value) or is_array(item.value):
                    result[item.key] = item.value.contents
                else:
                    result[item.key] = string_value(item.value)
            elif is_tag_node(item):
                self._gab('adding element "{0}" to contents'.format(item.name))
                self._process_tag(result, item)
            elif is_text_node(item) or is_string(item):
                self._gab('adding text "{0}" to contents'.format(debug_dump_long_string(string_value(item))))
                result['text'] = self._append_to_text(result['text'] if 'text' in result else '', string_value(item))
            else:
                value_desc = debug_dump_node(item) if is_any_node(item) else object_type_name(item)
                raise HqueryEvaluationError(
                    'Cannot use {0} as a content object in a computed JSON hash constructor'.format(value_desc)
                )

            self._process_filters(result)

        return JsonHash(result)
Пример #6
0
def sum(*args):
    if len(args) >= 1:
        sequence = make_sequence(args[0])
    else:
        sequence = make_sequence([])
    if len(args) >= 2:
        zero = args[1]
    else:
        zero = number(0)

    if len(sequence) == 0:
        return zero
    else:
        result = number(0)
        for item in sequence:
            result += number(item)
        return result
Пример #7
0
def sum(*args):
    if len(args) >= 1:
        sequence = make_sequence(args[0])
    else:
        sequence = make_sequence([])
    if len(args) >= 2:
        zero = args[1]
    else:
        zero = number(0)

    if len(sequence) == 0:
        return zero
    else:
        result = number(0)
        for item in sequence:
            result += number(item)
        return result
Пример #8
0
    def _evaluate_iteration(self):
        with variable_scope():
            self._push_global_variables()

            sequence = make_sequence(self.sequence_expression())
            verbose_print('Iterating over sequence containing {0} items'.format(len(sequence)))
            result = []

            for item in sequence:
                verbose_print(lambda: u'Visiting item {0}'.format(debug_dump_anything(item)), indent_after=True)

                with variable_scope():
                    push_variable(self.sequence_variable, make_sequence(item))
                    self._push_iteration_variables()
                    this_result = make_sequence(self.return_expression())
                    verbose_print('Return clause yielded {0} results for this visit'.format(len(this_result)))
                    result = sequence_concat(result, this_result)

                verbose_print('Visit finished', outdent_before=True)

        return result
Пример #9
0
    def evaluate(self):
        result = ''

        for value in make_sequence(self.contents()) if self.contents is not None else []:
            if is_string(value) or is_number(value) or is_boolean(value):
                result = self._append_to_contents(result, str(value))
            elif is_attribute_node(value):
                result = self._append_to_contents(result, value.value)
            elif is_tag_node(value):
                result = self._append_to_contents(result, string_value(value))
            else:
                value_desc = debug_dump_node(value) if is_any_node(value) else object_type_name(value)
                raise HqueryEvaluationError(
                    'Cannot use {0} as a content object in a computed attribute constructor'.format(value_desc)
                )

        return AttributeNode(self.name, result)
Пример #10
0
    def evaluate(self):
        soup = BeautifulSoup('<{0}></{0}>'.format(self.name), 'html.parser')
        result = getattr(soup, self.name)

        for value in make_sequence(self.contents()) if self.contents is not None else []:
            if is_tag_node(value):
                result.append(self._clone_tag(value))
            elif is_attribute_node(value):
                result[value.name] = value.value
            elif is_string(value) or is_number(value) or is_boolean(value):
                result.append(str(value))
            else:
                value_desc = debug_dump_node(value) if is_any_node(value) else object_type_name(value)
                raise HqueryEvaluationError(
                    'Cannot use {0} as a content object in a computed element constructor'.format(value_desc)
                )

        return make_node_set(result)
Пример #11
0
    def evaluate(self):
        result = ''

        for value in make_sequence(
                self.contents()) if self.contents is not None else []:
            if is_string(value) or is_number(value) or is_boolean(value):
                result = self._append_to_contents(result, str(value))
            elif is_attribute_node(value):
                result = self._append_to_contents(result, value.value)
            elif is_tag_node(value):
                result = self._append_to_contents(result, string_value(value))
            else:
                value_desc = debug_dump_node(value) if is_any_node(
                    value) else object_type_name(value)
                raise HqueryEvaluationError(
                    'Cannot use {0} as a content object in a computed attribute constructor'
                    .format(value_desc))

        return AttributeNode(self.name, result)
Пример #12
0
    def evaluate(self):
        soup = BeautifulSoup('<{0}></{0}>'.format(self.name), 'html.parser')
        result = getattr(soup, self.name)

        for value in make_sequence(
                self.contents()) if self.contents is not None else []:
            if is_tag_node(value):
                result.append(self._clone_tag(value))
            elif is_attribute_node(value):
                result[value.name] = value.value
            elif is_string(value) or is_number(value) or is_boolean(value):
                result.append(str(value))
            else:
                value_desc = debug_dump_node(value) if is_any_node(
                    value) else object_type_name(value)
                raise HqueryEvaluationError(
                    'Cannot use {0} as a content object in a computed element constructor'
                    .format(value_desc))

        return make_node_set(result)
Пример #13
0
 def evaluate(self):
     return JsonArray([
         self._make_array_item(item)
         for item in make_sequence(self.contents())
     ])
Пример #14
0
 def evaluate(self):
     return JsonArray([self._make_array_item(item) for item in make_sequence(self.contents())])