Exemplo n.º 1
0
def test_init_false_field_not_required():
    # fields passed in constructor
    builder = DataclassBuilder(Circle, radius=3.0)
    assert Circle(3.0) == build(builder)
    # fields set by assignment
    builder = DataclassBuilder(Circle)
    builder.radius = 9.0
    assert Circle(9.0) == build(builder)
Exemplo n.º 2
0
def test_order_invariant():
    # fields passed in constructor
    builder = DataclassBuilder(PixelCoord, y=7, x=3)
    assert PixelCoord(3, 7) == build(builder)
    # fields set by assignment
    builder = DataclassBuilder(PixelCoord)
    builder.y = 1
    builder.x = 9
    assert PixelCoord(9, 1) == build(builder)
Exemplo n.º 3
0
def test_all_fields_set():
    # fields passed in constructor
    builder = DataclassBuilder(PixelCoord, x=3, y=7)
    assert PixelCoord(3, 7) == build(builder)
    # fields set by assignment
    builder = DataclassBuilder(PixelCoord)
    builder.x = 9
    builder.y = 1
    assert PixelCoord(9, 1) == build(builder)
Exemplo n.º 4
0
def test_optional_field_not_required():
    # fields passed in constructor
    builder = DataclassBuilder(Point, x=3.0, y=7.0)
    assert Point(3.0, 7.0, 1.0) == build(builder)
    # fields set by assignment
    builder = DataclassBuilder(Point)
    builder.x = 9.0
    builder.y = 1.0
    assert Point(9.0, 1.0, 1.0) == build(builder)
Exemplo n.º 5
0
def test_handles_dataclass_without_fields():
    NoFieldsBuilder = dataclass_builder(NoFields)
    builder = NoFieldsBuilder()
    assert NoFields() == build(builder)
    assert NoFields() == builder.build()
    NoInitFieldsBuilder = dataclass_builder(NoInitFields)
    builder = NoInitFieldsBuilder()
    assert NoInitFields() == build(builder)
    assert NoInitFields() == builder.build()
Exemplo n.º 6
0
def test_optional_field_can_be_set():
    # fields passed in constructor
    builder = DataclassBuilder(Point, x=3.0, y=7.0, w=0.3)
    assert Point(3.0, 7.0, 0.3) == build(builder)
    # fields set by assignment
    builder = DataclassBuilder(Point)
    builder.x = 9.0
    builder.y = 1.0
    builder.w = 1.7
    assert Point(9.0, 1.0, 1.7) == build(builder)
Exemplo n.º 7
0
def test_all_fields_set():
    # fields passed in constructor
    PixelCoordBuilder = dataclass_builder(PixelCoord)
    builder = PixelCoordBuilder(x=3, y=7)
    assert PixelCoord(3, 7) == build(builder)
    assert PixelCoord(3, 7) == builder.build()
    # fields set by assignment
    builder = PixelCoordBuilder()
    builder.x = 9
    builder.y = 1
    assert PixelCoord(9, 1) == build(builder)
    assert PixelCoord(9, 1) == builder.build()
Exemplo n.º 8
0
def test_missing_field():
    PixelCoordBuilder = dataclass_builder(PixelCoord)
    # fields passed in constructor
    builder = PixelCoordBuilder(y=7)
    with pytest.raises(MissingFieldError):
        build(builder)
    with pytest.raises(MissingFieldError):
        builder.build()
    try:
        build(builder)
    except MissingFieldError as err:
        assert err.dataclass == PixelCoord
        assert err.field == dataclasses.fields(PixelCoord)[0]
    try:
        builder.build()
    except MissingFieldError as err:
        assert err.dataclass == PixelCoord
        assert err.field == dataclasses.fields(PixelCoord)[0]
    # fields set by assignment
    builder = PixelCoordBuilder()
    builder.x = 9
    with pytest.raises(MissingFieldError):
        build(builder)
    with pytest.raises(MissingFieldError):
        builder.build()
    try:
        build(builder)
    except MissingFieldError as err:
        assert err.dataclass == PixelCoord
        assert err.field == dataclasses.fields(PixelCoord)[1]
    try:
        builder.build()
    except MissingFieldError as err:
        assert err.dataclass == PixelCoord
        assert err.field == dataclasses.fields(PixelCoord)[1]
Exemplo n.º 9
0
def test_class_inheritance():
    builder = ExtendedBuilder(Point, y=4, w=10)
    builder.x = 8
    assert Point(8, 4, 10) == build(builder)
    fields_ = fields(ExtendedBuilder(Types))
    assert ["int_", "float_", "str_"] == list(fields_.keys())
    assert ["int_", "float_", "str_"] == [f.name for f in fields_.values()]
    assert [int, float, str] == [f.type for f in fields_.values()]
Exemplo n.º 10
0
    def _build(self, builder: Any) -> Any:
        """Build a given builder, converting MissingFieldError to ASTEvaluationError.

        This should be used by :func:`_update_or_store` implementations to
        build dataclasses with the proper error handling.

        :param builder:
            The dataclass builder to build.

        :return:
            The built dataclass.

        :raises ASTEvaluationError:
            If there is a missing required field in the builder.
        """
        try:
            return build(builder)
        except MissingFieldError as err:
            raise ASTEvaluationError(
                f"missing required attribute '{err.field.name}'",
                source=self.source)
Exemplo n.º 11
0
def test_handles_dataclass_without_fields():
    builder = DataclassBuilder(NoFields)
    assert NoFields() == build(builder)
    builder = DataclassBuilder(NoInitFields)
    assert NoInitFields() == build(builder)
Exemplo n.º 12
0
def test_build_field():
    BuildBuilder = dataclass_builder(Build)
    builder = BuildBuilder(build="taken")
    assert builder.build == "taken"
    assert Build("taken") == build(builder)