Ejemplo n.º 1
0
 def with_input_types(self, *arg_hints, **kwarg_hints):
     # type: (WithTypeHintsT, *Any, **Any) -> WithTypeHintsT
     arg_hints = native_type_compatibility.convert_to_beam_types(arg_hints)
     kwarg_hints = native_type_compatibility.convert_to_beam_types(
         kwarg_hints)
     self._type_hints = self._get_or_create_type_hints().with_input_types(
         *arg_hints, **kwarg_hints)
     return self
Ejemplo n.º 2
0
    def with_input_types(self, input_type_hint, *side_inputs_arg_hints,
                         **side_input_kwarg_hints):
        """Annotates the types of main inputs and side inputs for the PTransform.

    Args:
      input_type_hint: An instance of an allowed built-in type, a custom class,
        or an instance of a typehints.TypeConstraint.
      *side_inputs_arg_hints: A variable length argument composed of
        of an allowed built-in type, a custom class, or a
        typehints.TypeConstraint.
      **side_input_kwarg_hints: A dictionary argument composed of
        of an allowed built-in type, a custom class, or a
        typehints.TypeConstraint.

    Example of annotating the types of side-inputs::

      FlatMap().with_input_types(int, int, bool)

    Raises:
      :class:`TypeError`: If **type_hint** is not a valid type-hint.
        See
        :func:`~apache_beam.typehints.typehints.validate_composite_type_param`
        for further details.

    Returns:
      :class:`PTransform`: A reference to the instance of this particular
      :class:`PTransform` object. This allows chaining type-hinting related
      methods.
    """
        super(PTransformWithSideInputs, self).with_input_types(input_type_hint)

        side_inputs_arg_hints = native_type_compatibility.convert_to_beam_types(
            side_inputs_arg_hints)
        side_input_kwarg_hints = native_type_compatibility.convert_to_beam_types(
            side_input_kwarg_hints)

        for si in side_inputs_arg_hints:
            validate_composite_type_param(si, 'Type hints for a PTransform')
        for si in side_input_kwarg_hints.values():
            validate_composite_type_param(si, 'Type hints for a PTransform')

        self.side_inputs_types = side_inputs_arg_hints
        return WithTypeHints.with_input_types(self, input_type_hint,
                                              *side_inputs_arg_hints,
                                              **side_input_kwarg_hints)
Ejemplo n.º 3
0
 def test_convert_to_beam_types(self):
   typing_types = [bytes, typing.List[bytes],
                   typing.List[typing.Tuple[bytes, int]],
                   typing.Union[int, typing.List[int]]]
   beam_types = [bytes, typehints.List[bytes],
                 typehints.List[typehints.Tuple[bytes, int]],
                 typehints.Union[int, typehints.List[int]]]
   self.assertEqual(
       native_type_compatibility.convert_to_beam_types(typing_types),
       beam_types)
 def test_convert_to_beam_types(self):
   typing_types = [bytes, typing.List[bytes],
                   typing.List[typing.Tuple[bytes, int]],
                   typing.Union[int, typing.List[int]]]
   beam_types = [bytes, typehints.List[bytes],
                 typehints.List[typehints.Tuple[bytes, int]],
                 typehints.Union[int, typehints.List[int]]]
   self.assertEqual(
       native_type_compatibility.convert_to_beam_types(typing_types),
       beam_types)
Ejemplo n.º 5
0
 def test_convert_to_beam_types(self):
   typing_types = [bytes, typing.List[bytes],
                   typing.List[typing.Tuple[bytes, int]],
                   typing.Union[int, typing.List[int]]]
   beam_types = [bytes, typehints.List[bytes],
                 typehints.List[typehints.Tuple[bytes, int]],
                 typehints.Union[int, typehints.List[int]]]
   converted_beam_types = convert_to_beam_types(typing_types)
   self.assertEqual(converted_beam_types, beam_types)
   converted_typing_types = convert_to_typing_types(converted_beam_types)
   self.assertEqual(converted_typing_types, typing_types)
Ejemplo n.º 6
0
def with_input_types(*positional_hints, **keyword_hints):
    """A decorator that type-checks defined type-hints with passed func arguments.

  All type-hinted arguments can be specified using positional arguments,
  keyword arguments, or a mix of both. Additionaly, all function arguments must
  be type-hinted in totality if even one parameter is type-hinted.

  Once fully decorated, if the arguments passed to the resulting function
  violate the type-hint constraints defined, a :class:`TypeCheckError`
  detailing the error will be raised.

  To be used as:

  .. testcode::

    from apache_beam.typehints import with_input_types

    @with_input_types(str)
    def upper(s):
      return s.upper()

  Or:

  .. testcode::

    from apache_beam.typehints import with_input_types
    from apache_beam.typehints import List
    from apache_beam.typehints import Tuple

    @with_input_types(ls=List[Tuple[int, int]])
    def increment(ls):
      [(i + 1, j + 1) for (i,j) in ls]

  Args:
    *positional_hints: Positional type-hints having identical order as the
      function's formal arguments. Values for this argument must either be a
      built-in Python type or an instance of a
      :class:`~apache_beam.typehints.typehints.TypeConstraint` created by
      'indexing' a
      :class:`~apache_beam.typehints.typehints.CompositeTypeHint` instance
      with a type parameter.
    **keyword_hints: Keyword arguments mirroring the names of the parameters to
      the decorated functions. The value of each keyword argument must either
      be one of the allowed built-in Python types, a custom class, or an
      instance of a :class:`~apache_beam.typehints.typehints.TypeConstraint`
      created by 'indexing' a
      :class:`~apache_beam.typehints.typehints.CompositeTypeHint` instance
      with a type parameter.

  Raises:
    :class:`~exceptions.ValueError`: If not all function arguments have
      corresponding type-hints specified. Or if the inner wrapper function isn't
      passed a function object.
    :class:`TypeCheckError`: If the any of the passed type-hint
      constraints are not a type or
      :class:`~apache_beam.typehints.typehints.TypeConstraint` instance.

  Returns:
    The original function decorated such that it enforces type-hint constraints
    for all received function arguments.
  """

    converted_positional_hints = (
        native_type_compatibility.convert_to_beam_types(positional_hints))
    converted_keyword_hints = (
        native_type_compatibility.convert_to_beam_types(keyword_hints))
    del positional_hints
    del keyword_hints

    def annotate(f):
        if isinstance(f, types.FunctionType):
            for t in (list(converted_positional_hints) +
                      list(converted_keyword_hints.values())):
                validate_composite_type_param(
                    t, error_msg_prefix='All type hint arguments')

        get_type_hints(f).set_input_types(*converted_positional_hints,
                                          **converted_keyword_hints)
        return f

    return annotate
Ejemplo n.º 7
0
 def assertCompatible(self, base, sub):  # pylint: disable=invalid-name
     base, sub = native_type_compatibility.convert_to_beam_types(
         [base, sub])
     self.assertTrue(is_consistent_with(sub, base),
                     '%s is not consistent with %s' % (sub, base))
Ejemplo n.º 8
0
 def with_output_types(self, *arg_hints, **kwarg_hints):
   arg_hints = native_type_compatibility.convert_to_beam_types(arg_hints)
   kwarg_hints = native_type_compatibility.convert_to_beam_types(kwarg_hints)
   self._get_or_create_type_hints().set_output_types(*arg_hints, **kwarg_hints)
   return self
Ejemplo n.º 9
0
def with_input_types(*positional_hints, **keyword_hints):
  """A decorator that type-checks defined type-hints with passed func arguments.

  All type-hinted arguments can be specified using positional arguments,
  keyword arguments, or a mix of both. Additionaly, all function arguments must
  be type-hinted in totality if even one parameter is type-hinted.

  Once fully decorated, if the arguments passed to the resulting function
  violate the type-hint constraints defined, a :class:`TypeCheckError`
  detailing the error will be raised.

  To be used as:

  .. testcode::

    from apache_beam.typehints import with_input_types

    @with_input_types(str)
    def upper(s):
      return s.upper()

  Or:

  .. testcode::

    from apache_beam.typehints import with_input_types
    from apache_beam.typehints import List
    from apache_beam.typehints import Tuple

    @with_input_types(ls=List[Tuple[int, int]])
    def increment(ls):
      [(i + 1, j + 1) for (i,j) in ls]

  Args:
    *positional_hints: Positional type-hints having identical order as the
      function's formal arguments. Values for this argument must either be a
      built-in Python type or an instance of a
      :class:`~apache_beam.typehints.typehints.TypeConstraint` created by
      'indexing' a
      :class:`~apache_beam.typehints.typehints.CompositeTypeHint` instance
      with a type parameter.
    **keyword_hints: Keyword arguments mirroring the names of the parameters to
      the decorated functions. The value of each keyword argument must either
      be one of the allowed built-in Python types, a custom class, or an
      instance of a :class:`~apache_beam.typehints.typehints.TypeConstraint`
      created by 'indexing' a
      :class:`~apache_beam.typehints.typehints.CompositeTypeHint` instance
      with a type parameter.

  Raises:
    :class:`~exceptions.ValueError`: If not all function arguments have
      corresponding type-hints specified. Or if the inner wrapper function isn't
      passed a function object.
    :class:`TypeCheckError`: If the any of the passed type-hint
      constraints are not a type or
      :class:`~apache_beam.typehints.typehints.TypeConstraint` instance.

  Returns:
    The original function decorated such that it enforces type-hint constraints
    for all received function arguments.
  """

  converted_positional_hints = (
      native_type_compatibility.convert_to_beam_types(positional_hints))
  converted_keyword_hints = (
      native_type_compatibility.convert_to_beam_types(keyword_hints))
  del positional_hints
  del keyword_hints

  def annotate(f):
    if isinstance(f, types.FunctionType):
      for t in (list(converted_positional_hints) +
                list(converted_keyword_hints.values())):
        validate_composite_type_param(
            t, error_msg_prefix='All type hint arguments')

    get_type_hints(f).set_input_types(*converted_positional_hints,
                                      **converted_keyword_hints)
    return f
  return annotate