Ejemplo n.º 1
0
    def testProtocol(self):
        def _generator():
            yield "a"

        single = lazy_repetition.LazyRepetition(_generator)
        self.assertEqual(list(repeated.getvalues(single)), ["a"])
        self.assertEqual(repeated.getvalue(single), "a")

        def _generator():
            yield "a"
            yield "b"

        double = lazy_repetition.LazyRepetition(_generator)
        self.assertEqual(list(repeated.getvalues(double)), ["a", "b"])
        self.assertEqual(repeated.getvalue(double), "a")
Ejemplo n.º 2
0
def __solve_for_scalar(expr, vars):
    """Helper: solve 'expr' always returning a scalar (not IRepeated).

    If the output of 'expr' is a single value or a single RowTuple with a single
    column then return the value in that column. Otherwise raise.

    Arguments:
        expr: Expression to solve.
        vars: The scope.

    Returns:
        A scalar value (not an IRepeated).

    Raises:
        EfilterTypeError if it cannot get a scalar.
    """
    var = solve(expr, vars).value
    try:
        scalar = repeated.getvalue(var)
    except TypeError:
        raise errors.EfilterTypeError(
            root=expr, query=expr.source,
            message="Wasn't expecting more than one value here. Got %r."
            % (var,))

    if isinstance(scalar, row_tuple.RowTuple):
        try:
            return scalar.get_singleton()
        except ValueError:
            raise errors.EfilterTypeError(
                root=expr, query=expr.source,
                message="Was expecting a scalar value here. Got %r."
                % (scalar,))
    else:
        return scalar
Ejemplo n.º 3
0
    def testProtocol(self):
        def _generator():
            yield "a"

        single = lazy_repetition.LazyRepetition(_generator)
        self.assertEqual(list(repeated.getvalues(single)), ["a"])
        self.assertEqual(repeated.getvalue(single), "a")

        def _generator():
            yield "a"
            yield "b"

        double = lazy_repetition.LazyRepetition(_generator)
        self.assertEqual(list(repeated.getvalues(double)), ["a", "b"])
        with self.assertRaises(TypeError):
            repeated.getvalue(double)
Ejemplo n.º 4
0
def __solve_for_scalar(expr, vars):
    """Helper: solve 'expr' always returning a scalar (not IRepeated).

    If the output of 'expr' is a single value or a single RowTuple with a single
    column then return the value in that column. Otherwise raise.

    Arguments:
        expr: Expression to solve.
        vars: The scope.

    Returns:
        A scalar value (not an IRepeated).

    Raises:
        EfilterTypeError if it cannot get a scalar.
    """
    var = solve(expr, vars).value
    try:
        scalar = repeated.getvalue(var)
    except TypeError:
        raise errors.EfilterTypeError(
            root=expr,
            query=expr.source,
            message="Wasn't expecting more than one value here. Got %r." %
            (var, ))

    if isinstance(scalar, row_tuple.RowTuple):
        try:
            return scalar.get_singleton()
        except ValueError:
            raise errors.EfilterTypeError(
                root=expr,
                query=expr.source,
                message="Was expecting a scalar value here. Got %r." %
                (scalar, ))
    else:
        return scalar