Skip to content

Commit

Permalink
tests/structured_conf: default_factory for mutable dataclass args
Browse files Browse the repository at this point in the history
python3.11 no longer supports the use of mutable default arguments in
dataclasses. https://docs.python.org/3/whatsnew/3.11.html#dataclasses
  • Loading branch information
Jasha10 committed Nov 16, 2022
1 parent 2088440 commit 841d921
Show file tree
Hide file tree
Showing 4 changed files with 25 additions and 19 deletions.
4 changes: 2 additions & 2 deletions tests/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -108,7 +108,7 @@ class ConcretePlugin(Plugin):
class FoobarParams:
foo: int = 10

params: FoobarParams = FoobarParams()
params: FoobarParams = field(default_factory=FoobarParams)


@dataclass
Expand All @@ -117,7 +117,7 @@ class NestedInterpolationToMissing:
class BazParams:
baz: str = "${..name}"

subcfg: BazParams = BazParams()
subcfg: BazParams = field(default_factory=BazParams)
name: str = MISSING


Expand Down
10 changes: 6 additions & 4 deletions tests/examples/test_dataclass_example.py
Original file line number Diff line number Diff line change
Expand Up @@ -161,7 +161,9 @@ class Group:
admin: User = User # type: ignore

# You can also specify different defaults for nested classes
manager: User = User(name="manager", height=Height.TALL)
manager: User = field(
default_factory=lambda: User(name="manager", height=Height.TALL)
)


def test_nesting() -> None:
Expand Down Expand Up @@ -343,7 +345,7 @@ def test_merge() -> None:
@dataclass
class Config:
num: int = 10
user: User = User(name=MISSING, height=MISSING)
user: User = field(default_factory=lambda: User(name=MISSING, height=MISSING))
domains: Dict[str, Domain] = field(default_factory=dict)

yaml = """
Expand Down Expand Up @@ -385,8 +387,8 @@ class Log:

@dataclass
class MyConfig:
server: Server = Server()
log: Log = Log()
server: Server = field(default_factory=Server)
log: Log = field(default_factory=Log)
users: List[str] = field(default_factory=list)
numbers: List[int] = field(default_factory=list)

Expand Down
28 changes: 16 additions & 12 deletions tests/structured_conf/data/dataclasses.py
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,7 @@ class TypedDictSubclass(TypedDict):

@dataclass
class StructuredWithInvalidField:
bar: NotStructuredConfig = NotStructuredConfig()
bar: NotStructuredConfig = field(default_factory=NotStructuredConfig)


@dataclass
Expand Down Expand Up @@ -75,7 +75,7 @@ class OptionalUser:

@dataclass
class InterpolationToUser:
user: User = User("Bond", 7)
user: User = field(default_factory=lambda: User("Bond", 7))
admin: User = II("user")


Expand Down Expand Up @@ -251,14 +251,16 @@ class NestedConfig:
default_value: Nested

# with default value
user_provided_default: Nested = Nested(with_default=42)
user_provided_default: Nested = field(
default_factory=lambda: Nested(with_default=42)
)

value_at_root: int = 1000


@dataclass
class NestedWithAny:
var: Any = Nested()
var: Any = field(default_factory=Nested)


@dataclass
Expand Down Expand Up @@ -349,14 +351,14 @@ class RecursiveDict:

@dataclass
class StructuredOptional:
with_default: Optional[Nested] = Nested()
with_default: Optional[Nested] = field(default_factory=Nested)
as_none: Optional[Nested] = None
not_optional: Nested = Nested()
not_optional: Nested = field(default_factory=Nested)


@dataclass(frozen=True)
class FrozenClass:
user: User = User(name="Bart", age=10)
user: User = field(default_factory=lambda: User(name="Bart", age=10))
x: int = 10
list: List[int] = field(default_factory=lambda: [1, 2, 3])

Expand Down Expand Up @@ -522,7 +524,7 @@ class Str2IntWithStrField(Dict[str, int]):

@dataclass
class Str2UserWithField(Dict[str, User]):
foo: User = User("Bond", 7)
foo: User = field(default_factory=lambda: User("Bond", 7))

class Error:
@dataclass
Expand All @@ -544,7 +546,7 @@ class ConcretePlugin(Plugin):
class FoobarParams:
foo: int = 10

params: FoobarParams = FoobarParams()
params: FoobarParams = field(default_factory=FoobarParams)


@dataclass
Expand All @@ -563,8 +565,8 @@ class FaultyPlugin:
class PluginHolder:
none: Optional[Plugin] = None
missing: Plugin = MISSING
plugin: Plugin = Plugin()
plugin2: Plugin = ConcretePlugin()
plugin: Plugin = field(default_factory=Plugin)
plugin2: Plugin = field(default_factory=ConcretePlugin)


@dataclass
Expand All @@ -585,7 +587,9 @@ class Missing1:

@dataclass
class Missing2:
head: LinkedList = LinkedList(next=MISSING, value=1)
head: LinkedList = field(
default_factory=lambda: LinkedList(next=MISSING, value=1)
)


@dataclass
Expand Down
2 changes: 1 addition & 1 deletion tests/test_utils.py
Original file line number Diff line number Diff line change
Expand Up @@ -300,7 +300,7 @@ class _TestAttrsClass:

@dataclass
class _TestDataclassIllegalValue:
x: Any = IllegalType()
x: Any = field(default_factory=IllegalType)


@attr.s(auto_attribs=True)
Expand Down

0 comments on commit 841d921

Please sign in to comment.