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

Reply via email to