From a54c8b705c79c4f82fe75a7b39dc146e90e3fd03 Mon Sep 17 00:00:00 2001 From: Fiddle-Config Team Date: Wed, 6 May 2026 10:31:32 -0700 Subject: [PATCH] Fix module prefix matching by splitting dot-separated paths. PiperOrigin-RevId: 911416588 --- fiddle/_src/absl_flags/utils.py | 5 ++++- fiddle/_src/absl_flags/utils_test.py | 24 ++++++++++++++++++++++++ 2 files changed, 28 insertions(+), 1 deletion(-) diff --git a/fiddle/_src/absl_flags/utils.py b/fiddle/_src/absl_flags/utils.py index 84a547d2..07fa5682 100644 --- a/fiddle/_src/absl_flags/utils.py +++ b/fiddle/_src/absl_flags/utils.py @@ -117,7 +117,10 @@ def _import_dotted_name( # If e.name is a prefix of name_pieces, the path simply doesn't # exist at this split point. Otherwise, the module # exists but broke importing an unrelated dependency. - if (missing := e.name.split('.')) != name_pieces[: len(missing)]: + splitted_name_pieces = [] + for pieces in name_pieces: + splitted_name_pieces += pieces.split('.') + if (missing := e.name.split('.')) != splitted_name_pieces[: len(missing)]: raise if i == 1: # Final iteration through the loop. raise diff --git a/fiddle/_src/absl_flags/utils_test.py b/fiddle/_src/absl_flags/utils_test.py index 2919dcd2..ae846666 100644 --- a/fiddle/_src/absl_flags/utils_test.py +++ b/fiddle/_src/absl_flags/utils_test.py @@ -191,6 +191,30 @@ def test_nonexistent_module_raises_module_not_found(self): module=None, ) + def test_dotted_module_prefix_matching(self): + """Test that dot-separated module paths are split correctly for matching.""" + import types # pylint: disable=g-import-not-at-top + + parent_a = types.ModuleType('a') + sub_b = types.ModuleType('a.b') + + class C: + d = 42 + + sub_b.c = C + + sys.modules['a'] = parent_a + sys.modules['a.b'] = sub_b + self.addCleanup(lambda: sys.modules.pop('a', None)) + self.addCleanup(lambda: sys.modules.pop('a.b', None)) + + result = utils._import_dotted_name( + 'c.d', + mode=_IRRELEVANT_MODE, + module=sub_b, + ) + self.assertEqual(result, 42) + if __name__ == '__main__': absltest.main()