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)
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)
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)
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)
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()
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)
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()
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]
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()]
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)
def test_handles_dataclass_without_fields(): builder = DataclassBuilder(NoFields) assert NoFields() == build(builder) builder = DataclassBuilder(NoInitFields) assert NoInitFields() == build(builder)
def test_build_field(): BuildBuilder = dataclass_builder(Build) builder = BuildBuilder(build="taken") assert builder.build == "taken" assert Build("taken") == build(builder)