Package: python3-pytoolconfig
Version: 1.3.1-5
Severity: minor
Tags: upstream
With `fall_through=False` the configuration goes through
`_dict_to_dataclass()`, which converts Enum fields. With
`fall_through=True` it goes through `_recursive_merge()`, which assigns
the raw value, so the field ends up holding a plain string. Invalid
values are not reported either.
pyproject.toml:
[tool.t]
mode = "fast"
test.py:
import enum
from dataclasses import dataclass
from pathlib import Path
from pytoolconfig import PyToolConfig
class Mode(enum.Enum):
fast = "fast"
slow = "slow"
@dataclass
class Config:
mode: Mode = Mode.slow
print(repr(PyToolConfig("t", Path("."), Config).parse().mode))
print(repr(PyToolConfig("t", Path("."), Config,
fall_through=True).parse().mode))
Actual:
<Mode.fast: 'fast'>
'fast'
Expected: `<Mode.fast: 'fast'>` in both cases.
With an invalid value (`mode = "bogus"`), `fall_through=False` emits a
warning and keeps the default, while `fall_through=True` silently sets
the field to the string `'bogus'`.
`_recursive_merge()` should apply the same Enum handling (conversion and
warning on invalid values) as `_dict_to_dataclass()`; moving it into a
shared helper would keep the two paths consistent.
Reproduced with python3-pytoolconfig 1.3.1-5 (code unchanged in 1.3.1-6)
on Python 3.13 and 3.14, and with upstream main (bee6db4).
This is an upstream bug, it will be forwarded.
-- System Information:
Debian Release: forky/sid
APT prefers unstable
APT policy: (500, 'unstable')
Architecture: amd64 (x86_64)
Foreign Architectures: i386
Kernel: Linux 7.2.9+deb14-amd64 (SMP w/12 CPU threads; PREEMPT)
Locale: LANG=it_IT.UTF-8, LC_CTYPE=it_IT.UTF-8 (charmap=UTF-8), LANGUAGE=it
Shell: /bin/sh linked to /usr/bin/dash
Init: systemd (via /run/systemd/system)
LSM: AppArmor: enabled