コード例 #1
0
 def test_unicode(self):
     self.assertEqual(str_util.unicode(123), 123)
     self.assertEqual(str_util.unicode("foobar"), "foobar")
     self.assertEqual(
         str_util.unicode(u"fubar" if six.PY2 else str("fubar")), "fubar")
     self.assertEqual(str_util.unicode("鐵甲奇俠"), "鐵甲奇俠")
     self.assertEqual(str_util.unicode("\xe9\x90\xb5\xe7\x94\xb2"),
                      "\xe9\x90\xb5\xe7\x94\xb2")
コード例 #2
0
 def test_unicode(self):
     self.assertEqual(str_util.unicode(123), 123)
     self.assertEqual(str_util.unicode('foobar'), 'foobar')
     self.assertEqual(
         str_util.unicode(unicode('fubar') if six.PY2 else str('fubar')),
         'fubar')
     self.assertEqual(str_util.unicode('鐵甲奇俠'), '鐵甲奇俠')
     self.assertEqual(str_util.unicode('\xe9\x90\xb5\xe7\x94\xb2'),
                      '\xe9\x90\xb5\xe7\x94\xb2')
コード例 #3
0
    def _evaluate_and_expand(cls, text, data=None):
        exprs = cls._regex_parser.findall(text)
        block_exprs = cls._regex_block_parser.findall(text)
        ctx = cls.contextualize(data)
        opts = {"undefined_to_none": False}

        try:
            # If there is a Jinja block expression in the text, then process the whole text.
            if block_exprs:
                expr = text
                output = cls._jinja_env.from_string(expr).render(ctx)
                output = str_util.unicode(output)

                # Traverse and evaulate again in case additional inline epxressions are
                # introduced after the jinja block is evaluated.
                output = cls._evaluate_and_expand(output, data)
            else:
                # The output will first be the original text and the expressions
                # will be substituted by the evaluated value.
                output = str_util.unicode(text)

                # Evaluate inline jinja expressions first.
                for expr in exprs:
                    stripped = cls.strip_delimiter(expr)
                    compiled = cls._jinja_env.compile_expression(
                        stripped, **opts)
                    result = compiled(**ctx)

                    if inspect.isgenerator(result):
                        result = list(result)

                    if isinstance(result, six.string_types):
                        result = cls._evaluate_and_expand(result, data)

                    # For StrictUndefined values, UndefinedError only gets raised when the value is
                    # accessed, not when it gets created. The simplest way to access it is to try
                    # and cast it to string. When StrictUndefined is cast to str below, this will
                    # raise an exception with error description.
                    if not isinstance(result, jinja2.runtime.StrictUndefined):
                        if len(exprs) > 1 or block_exprs or len(output) > len(
                                expr):
                            output = output.replace(
                                expr, str_util.unicode(result, force=True))
                        else:
                            output = str_util.unicode(result)

        except jinja2.exceptions.UndefinedError as e:
            msg = "Unable to evaluate expression '%s'. %s: %s"
            raise JinjaEvaluationException(
                msg % (expr, e.__class__.__name__, str(e)))
        except Exception as e:
            msg = "Unable to evaluate expression '%s'. %s: %s"
            raise JinjaEvaluationException(
                msg % (expr, e.__class__.__name__, str(e)))

        return output
コード例 #4
0
    def assert_unicode_data_flow(self, input_value):
        inputs = {
            u"a1":
            (str_util.unicode(input_value, encoding_type="utf-8", force=True)
             if six.PY2 else input_value)
        }

        expected_output = {u"a5": inputs["a1"], u"b5": inputs["a1"]}

        self._assert_data_flow(inputs, expected_output)
コード例 #5
0
    def evaluate(cls, text, data=None):
        if not isinstance(text, six.string_types):
            raise ValueError('Text to be evaluated is not typeof string.')

        if data and not isinstance(data, dict):
            raise ValueError('Provided data is not typeof dict.')

        output = str_util.unicode(text)
        exprs = cls._regex_parser.findall(text)
        ctx = cls.contextualize(data)

        try:
            for expr in exprs:
                stripped = cls.strip_delimiter(expr)
                result = cls._engine(stripped).evaluate(context=ctx)

                if inspect.isgenerator(result):
                    result = list(result)

                if isinstance(result, six.string_types):
                    result = cls.evaluate(result, data)

                if len(exprs) > 1 or len(output) > len(expr):
                    output = output.replace(
                        expr, str_util.unicode(result, force=True))
                else:
                    output = str_util.unicode(result)

        except KeyError as e:
            error = str(getattr(e, 'message', e)).strip("'")
            msg = "Unable to resolve key '%s' in expression '%s' from context."
            raise YaqlEvaluationException(msg % (error, expr))
        except (yaql_exc.YaqlException, ValueError, TypeError) as e:
            msg = "Unable to evaluate expression '%s'. %s: %s"
            raise YaqlEvaluationException(
                msg % (expr, e.__class__.__name__, str(e).strip("'")))
        except Exception as e:
            msg = "Unable to evaluate expression '%s'. %s: %s"
            raise YaqlEvaluationException(msg %
                                          (expr, e.__class__.__name__, str(e)))

        return output
コード例 #6
0
 def test_unicode_force(self):
     self.assertEqual(strings.unicode(123, force=True), '123')
     self.assertEqual(strings.unicode(123.45, force=True), '123.45')
     self.assertEqual(strings.unicode(True, force=True), 'True')
     self.assertEqual(strings.unicode(None, force=True), 'None')
     self.assertEqual(strings.unicode([1, 2, 3], force=True), '[1, 2, 3]')
     self.assertEqual(strings.unicode({'k': 'v'}, force=True), "{'k': 'v'}")
コード例 #7
0
 def test_unicode_force(self):
     self.assertEqual(str_util.unicode(123, force=True), "123")
     self.assertEqual(str_util.unicode(123.45, force=True), "123.45")
     self.assertEqual(str_util.unicode(True, force=True), "True")
     self.assertEqual(str_util.unicode(None, force=True), "None")
     self.assertEqual(str_util.unicode([1, 2, 3], force=True), "[1, 2, 3]")
     self.assertEqual(str_util.unicode({"k": "v"}, force=True),
                      "{'k': 'v'}")
コード例 #8
0
 def __unicode__(self):
     return str_util.unicode(repr(self.spec))