Skip to content

Commit

Permalink
2025-02-05T23:22:06Z
Browse files Browse the repository at this point in the history
  • Loading branch information
wrmsr committed Feb 5, 2025
1 parent 11b7537 commit 9473bbc
Show file tree
Hide file tree
Showing 7 changed files with 182 additions and 30 deletions.
3 changes: 3 additions & 0 deletions omdev/ci/tests/test_new_ci.py
Original file line number Diff line number Diff line change
Expand Up @@ -55,6 +55,9 @@ class CacheKeyTarget(Target):

target: Target

def __post_init__(self) -> None:
check.not_isinstance(self.paths, str)

routes: ta.Sequence[Route]


Expand Down
28 changes: 22 additions & 6 deletions omdev/scripts/pyproject.py
Original file line number Diff line number Diff line change
Expand Up @@ -5353,18 +5353,34 @@ def make_obj_marshaler(
return reg

if abc.ABC in ty.__bases__:
impls = [ity for ity in deep_subclasses(ty) if abc.ABC not in ity.__bases__] # type: ignore
if all(ity.__qualname__.endswith(ty.__name__) for ity in impls):
ins = {ity: snake_case(ity.__qualname__[:-len(ty.__name__)]) for ity in impls}
else:
ins = {ity: ity.__qualname__ for ity in impls}
tn = ty.__name__
impls: ta.List[ta.Tuple[type, str]] = [ # type: ignore[var-annotated]
(ity, ity.__name__)
for ity in deep_subclasses(ty)
if abc.ABC not in ity.__bases__
]

if all(itn.endswith(tn) for _, itn in impls):
impls = [
(ity, snake_case(itn[:-len(tn)]))
for ity, itn in impls
]

dupe_tns = sorted(
dn
for dn, dc in collections.Counter(itn for _, itn in impls).items()
if dc > 1
)
if dupe_tns:
raise KeyError(f'Duplicate impl names for {ty}: {dupe_tns}')

return PolymorphicObjMarshaler.of([
PolymorphicObjMarshaler.Impl(
ity,
itn,
rec(ity),
)
for ity, itn in ins.items()
for ity, itn in impls
])

if issubclass(ty, enum.Enum):
Expand Down
28 changes: 22 additions & 6 deletions ominfra/scripts/journald2aws.py
Original file line number Diff line number Diff line change
Expand Up @@ -3388,18 +3388,34 @@ def make_obj_marshaler(
return reg

if abc.ABC in ty.__bases__:
impls = [ity for ity in deep_subclasses(ty) if abc.ABC not in ity.__bases__] # type: ignore
if all(ity.__qualname__.endswith(ty.__name__) for ity in impls):
ins = {ity: snake_case(ity.__qualname__[:-len(ty.__name__)]) for ity in impls}
else:
ins = {ity: ity.__qualname__ for ity in impls}
tn = ty.__name__
impls: ta.List[ta.Tuple[type, str]] = [ # type: ignore[var-annotated]
(ity, ity.__name__)
for ity in deep_subclasses(ty)
if abc.ABC not in ity.__bases__
]

if all(itn.endswith(tn) for _, itn in impls):
impls = [
(ity, snake_case(itn[:-len(tn)]))
for ity, itn in impls
]

dupe_tns = sorted(
dn
for dn, dc in collections.Counter(itn for _, itn in impls).items()
if dc > 1
)
if dupe_tns:
raise KeyError(f'Duplicate impl names for {ty}: {dupe_tns}')

return PolymorphicObjMarshaler.of([
PolymorphicObjMarshaler.Impl(
ity,
itn,
rec(ity),
)
for ity, itn in ins.items()
for ity, itn in impls
])

if issubclass(ty, enum.Enum):
Expand Down
28 changes: 22 additions & 6 deletions ominfra/scripts/manage.py
Original file line number Diff line number Diff line change
Expand Up @@ -6826,18 +6826,34 @@ def make_obj_marshaler(
return reg

if abc.ABC in ty.__bases__:
impls = [ity for ity in deep_subclasses(ty) if abc.ABC not in ity.__bases__] # type: ignore
if all(ity.__qualname__.endswith(ty.__name__) for ity in impls):
ins = {ity: snake_case(ity.__qualname__[:-len(ty.__name__)]) for ity in impls}
else:
ins = {ity: ity.__qualname__ for ity in impls}
tn = ty.__name__
impls: ta.List[ta.Tuple[type, str]] = [ # type: ignore[var-annotated]
(ity, ity.__name__)
for ity in deep_subclasses(ty)
if abc.ABC not in ity.__bases__
]

if all(itn.endswith(tn) for _, itn in impls):
impls = [
(ity, snake_case(itn[:-len(tn)]))
for ity, itn in impls
]

dupe_tns = sorted(
dn
for dn, dc in collections.Counter(itn for _, itn in impls).items()
if dc > 1
)
if dupe_tns:
raise KeyError(f'Duplicate impl names for {ty}: {dupe_tns}')

return PolymorphicObjMarshaler.of([
PolymorphicObjMarshaler.Impl(
ity,
itn,
rec(ity),
)
for ity, itn in ins.items()
for ity, itn in impls
])

if issubclass(ty, enum.Enum):
Expand Down
28 changes: 22 additions & 6 deletions ominfra/scripts/supervisor.py
Original file line number Diff line number Diff line change
Expand Up @@ -5997,18 +5997,34 @@ def make_obj_marshaler(
return reg

if abc.ABC in ty.__bases__:
impls = [ity for ity in deep_subclasses(ty) if abc.ABC not in ity.__bases__] # type: ignore
if all(ity.__qualname__.endswith(ty.__name__) for ity in impls):
ins = {ity: snake_case(ity.__qualname__[:-len(ty.__name__)]) for ity in impls}
else:
ins = {ity: ity.__qualname__ for ity in impls}
tn = ty.__name__
impls: ta.List[ta.Tuple[type, str]] = [ # type: ignore[var-annotated]
(ity, ity.__name__)
for ity in deep_subclasses(ty)
if abc.ABC not in ity.__bases__
]

if all(itn.endswith(tn) for _, itn in impls):
impls = [
(ity, snake_case(itn[:-len(tn)]))
for ity, itn in impls
]

dupe_tns = sorted(
dn
for dn, dc in collections.Counter(itn for _, itn in impls).items()
if dc > 1
)
if dupe_tns:
raise KeyError(f'Duplicate impl names for {ty}: {dupe_tns}')

return PolymorphicObjMarshaler.of([
PolymorphicObjMarshaler.Impl(
ity,
itn,
rec(ity),
)
for ity, itn in ins.items()
for ity, itn in impls
])

if issubclass(ty, enum.Enum):
Expand Down
28 changes: 22 additions & 6 deletions omlish/lite/marshal.py
Original file line number Diff line number Diff line change
Expand Up @@ -422,18 +422,34 @@ def make_obj_marshaler(
return reg

if abc.ABC in ty.__bases__:
impls = [ity for ity in deep_subclasses(ty) if abc.ABC not in ity.__bases__] # type: ignore
if all(ity.__qualname__.endswith(ty.__name__) for ity in impls):
ins = {ity: snake_case(ity.__qualname__[:-len(ty.__name__)]) for ity in impls}
else:
ins = {ity: ity.__qualname__ for ity in impls}
tn = ty.__name__
impls: ta.List[ta.Tuple[type, str]] = [ # type: ignore[var-annotated]
(ity, ity.__name__)
for ity in deep_subclasses(ty)
if abc.ABC not in ity.__bases__
]

if all(itn.endswith(tn) for _, itn in impls):
impls = [
(ity, snake_case(itn[:-len(tn)]))
for ity, itn in impls
]

dupe_tns = sorted(
dn
for dn, dc in collections.Counter(itn for _, itn in impls).items()
if dc > 1
)
if dupe_tns:
raise KeyError(f'Duplicate impl names for {ty}: {dupe_tns}')

return PolymorphicObjMarshaler.of([
PolymorphicObjMarshaler.Impl(
ity,
itn,
rec(ity),
)
for ity, itn in ins.items()
for ity, itn in impls
])

if issubclass(ty, enum.Enum):
Expand Down
69 changes: 69 additions & 0 deletions omlish/lite/tests/test_marshal.py
Original file line number Diff line number Diff line change
Expand Up @@ -254,3 +254,72 @@ def test_namedtuple(self):
class TestMarshalLiterals(AbstractTestMarshal):
def test_literal(self):
self._assert_marshal(('b', FooLiteral))


##


class TestInnerClassPoly(AbstractTestMarshal):
@dc.dataclass(frozen=True)
class NewCiManifest:
@dc.dataclass(frozen=True)
class Route:
paths: ta.Sequence[str]

content_type: str
content_length: int

@dc.dataclass(frozen=True)
class Target(abc.ABC): # noqa
pass

@dc.dataclass(frozen=True)
class BytesTarget(Target):
data: bytes

@dc.dataclass(frozen=True)
class CacheKeyTarget(Target):
key: str

target: Target

routes: ta.Sequence[Route]

def test_inner_class_ply(self):
manifest = self.NewCiManifest(
routes=[
self.NewCiManifest.Route(
paths=['a', 'b'],
content_type='text/plain',
content_length=4,
target=self.NewCiManifest.Route.BytesTarget(b'abcd'),
),
self.NewCiManifest.Route(
paths=['c', 'd'],
content_type='text/plain',
content_length=4,
target=self.NewCiManifest.Route.CacheKeyTarget('efgh'),
),
],
)

m = msh.marshal_obj(manifest)

x = {
'routes': [
{
'content_length': 4,
'content_type': 'text/plain',
'paths': ['a', 'b'],
'target': {'bytes': {'data': 'YWJjZA=='}},
},
{
'content_length': 4,
'content_type': 'text/plain',
'paths': ['c', 'd'],
'target': {'cache_key': {'key': 'efgh'}},
},
],
}

self.assertEqual(m, x)

0 comments on commit 9473bbc

Please sign in to comment.