Skip to content

Commit fc97fd5

Browse files
committed
Fixes to CodegenParameters in edge cases
1 parent 5b156bc commit fc97fd5

File tree

3 files changed

+23
-11
lines changed

3 files changed

+23
-11
lines changed

src/ovld/core.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -208,7 +208,8 @@ def signatures(self):
208208
regs = {}
209209
for fn, priority in self.regs():
210210
ss = self.specialization_self
211-
lcl = {} if ss is MISSING else vars(ss)
211+
cgf = getattr(ss, "_ovld_codegen_fields", ())
212+
lcl = {f: getattr(ss, f) for f in cgf}
212213
sig = replace(Signature.extract(fn, lcl), priority=priority)
213214

214215
def _set(sig, fn):

src/ovld/medley.py

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -337,15 +337,20 @@ def unmeld_classes(main: type, exclude: type):
337337

338338

339339
def meld_classes(classes):
340+
def key(cls):
341+
return getattr(cls, "_ovld_specialization_parent", None) or cls
342+
340343
medleys = {}
341344
for cls in classes:
342-
medleys.update({x: True for x in getattr(cls, "_ovld_medleys", [cls])})
345+
medleys.update({key(x): x for x in getattr(cls, "_ovld_medleys", [cls])})
343346
for cls in classes:
347+
cls = key(cls)
344348
if not hasattr(cls, "_ovld_medleys"):
345349
for base in cls.mro():
346350
if base is not cls and base in medleys:
347351
del medleys[base]
348-
medleys = tuple(medleys)
352+
353+
medleys = tuple(medleys.values())
349354
if len(medleys) == 1:
350355
return medleys[0]
351356

@@ -372,7 +377,7 @@ def meld_classes(classes):
372377

373378
result = make_dataclass(
374379
cls_name="+".join(sorted(c.__name__ for c in medleys)),
375-
bases=tuple(medleys),
380+
bases=medleys,
376381
fields=dc_fields,
377382
kw_only=True,
378383
namespace=merged,

tests/test_medley.py

Lines changed: 13 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -546,16 +546,17 @@ class Lust(Lost):
546546
assert lu.xs == []
547547

548548

549-
def test_configure_dependent():
550-
class Monkey(Medley):
551-
regex: CodegenParameter[str] = "monk[iey]+"
549+
class Monkey(Medley):
550+
regex: CodegenParameter[str] = "monk[iey]+"
551+
552+
def hi(self, x: Regexp[regex]):
553+
return "hello!"
552554

553-
def hi(self, x: Regexp[regex]):
554-
return "hello!"
555+
def hi(self, x: str):
556+
return "goodbye!"
555557

556-
def hi(self, x: str):
557-
return "goodbye!"
558558

559+
def test_configure_dependent():
559560
m1 = Monkey()
560561
m2 = Monkey(regex="go+rilla")
561562

@@ -566,3 +567,8 @@ def hi(self, x: str):
566567
assert m2.hi("monki") == "goodbye!"
567568
assert m2.hi("monkeeeee") == "goodbye!"
568569
assert m2.hi("goorilla") == "hello!"
570+
571+
572+
def test_configure_dependent_pileon():
573+
m = Monkey(regex="chimpanze+") + Monkey(regex="go+rilla")
574+
assert m.hi("goorilla") == "hello!"

0 commit comments

Comments
 (0)