Skip to content

Commit e5bcd23

Browse files
authored
fix(types): preserve duration unit alias across schema extraction (#1213)
1 parent ad7e822 commit e5bcd23

2 files changed

Lines changed: 37 additions & 8 deletions

File tree

‎src/adcp/types/aliases.py‎

Lines changed: 13 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -2070,9 +2070,10 @@ class UnknownGroupAsset(_BaseGroupAsset):
20702070
# totals view.
20712071
# - core.notification_config.Authentication makes ``credentials`` optional;
20722072
# the other four Authentication variants require it.
2073-
# - the four ``Unit`` enums measure different dimensions (duration, overlay
2074-
# positioning, real-estate area, vehicle distance). ``adcp.types.DimensionUnit``
2075-
# is a separate, already-unambiguous enum and is not part of this collision.
2073+
# - the legacy inline duration ``Unit`` and the three remaining ``Unit``
2074+
# enums measure different dimensions. ``DurationUnit`` keeps its public
2075+
# identity when the schema moves the duration vocabulary to a shared enum.
2076+
# ``adcp.types.DimensionUnit`` is a separate, already-unambiguous enum.
20762077
from adcp.types.generated_poc.account.sync_accounts_response import (
20772078
Account as SyncAccountsAccount,
20782079
)
@@ -2106,9 +2107,15 @@ class UnknownGroupAsset(_BaseGroupAsset):
21062107
from adcp.types.generated_poc.core.canonical_proposal import (
21072108
TotalBudgetGuidance as CanonicalProposalTotalBudgetGuidance,
21082109
)
2109-
from adcp.types.generated_poc.core.duration import (
2110-
Unit as DurationUnit,
2111-
)
2110+
2111+
try:
2112+
from adcp.types.generated_poc.enums.duration_unit import DurationUnit # type: ignore[import-not-found,unused-ignore]
2113+
except ModuleNotFoundError as exc:
2114+
if exc.name != "adcp.types.generated_poc.enums.duration_unit":
2115+
raise
2116+
from adcp.types.generated_poc.core.duration import (
2117+
Unit as DurationUnit,
2118+
)
21122119
from adcp.types.generated_poc.media_buy.change_term_constraints import (
21132120
MediaBuyChangeTermConstraints1 as BudgetChangeConstraints,
21142121
)

‎tests/test_collision_aliases.py‎

Lines changed: 24 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -142,8 +142,8 @@
142142
# TmpxMacro — 2 variants
143143
("IdentityMatchTmpxMacro", "trusted_match.identity_match_response", "TmpxMacro"),
144144
("ProviderRegistrationTmpxMacro", "trusted_match.provider_registration", "TmpxMacro"),
145-
# Unit — 4 variants
146-
("DurationUnit", "core.duration", "Unit"),
145+
# Unit — 3 remaining inline variants. DurationUnit has a dedicated
146+
# compatibility test because its schema source can be inline or shared.
147147
("OverlayUnit", "core.overlay", "Unit"),
148148
("RealEstateUnit", "core.real_estate_item", "Unit"),
149149
("VehicleUnit", "core.vehicle_item", "Unit"),
@@ -155,6 +155,16 @@ def _source_class(module_suffix: str, base_name: str) -> type:
155155
return getattr(module, base_name)
156156

157157

158+
def _duration_unit_source_class() -> type:
159+
try:
160+
module = importlib.import_module("adcp.types.generated_poc.enums.duration_unit")
161+
return module.DurationUnit
162+
except ModuleNotFoundError as exc:
163+
if exc.name != "adcp.types.generated_poc.enums.duration_unit":
164+
raise
165+
return _source_class("core.duration", "Unit")
166+
167+
158168
@pytest.mark.parametrize(("alias_name", "module_suffix", "base_name"), COLLISION_ALIASES)
159169
def test_alias_resolves_to_named_module_variant(
160170
alias_name: str, module_suffix: str, base_name: str
@@ -193,6 +203,18 @@ def test_alias_in_aliases_all(alias_name: str, module_suffix: str, base_name: st
193203
assert alias_name in aliases.__all__, f"{alias_name} missing from aliases.__all__"
194204

195205

206+
def test_duration_unit_alias_survives_shared_enum_extraction() -> None:
207+
"""The public alias follows either supported generated schema layout."""
208+
import adcp.types as types_module
209+
from adcp.types import aliases
210+
211+
expected = _duration_unit_source_class()
212+
assert aliases.DurationUnit is expected
213+
assert types_module.DurationUnit is expected
214+
assert "DurationUnit" in aliases.__all__
215+
assert "DurationUnit" in types_module.__all__
216+
217+
196218
def test_alias_set_is_internally_consistent() -> None:
197219
"""The alias table has no duplicate alias names and covers each base
198220
name's set of source modules with one alias per (base, module) pair."""

0 commit comments

Comments
 (0)