diff options
-rw-r--r-- | gemato/recursiveloader.py | 8 | ||||
-rw-r--r-- | tests/test_recursiveloader.py | 20 |
2 files changed, 27 insertions, 1 deletions
diff --git a/gemato/recursiveloader.py b/gemato/recursiveloader.py index 659049b..96a5365 100644 --- a/gemato/recursiveloader.py +++ b/gemato/recursiveloader.py @@ -65,8 +65,14 @@ class ManifestRecursiveLoader(object): Iterate over loaded Manifests that can apply to path. If @recursive is True, returns also Manifests for subdirectories of @path. Yields a tuple of (relative_path, manifest). + + The function guarantees that the Manifests for subdirectories + (more specific) will always be returned before the Manifests + for parent directories. The order is otherwise undefined. """ - for k, v in self.loaded_manifests.items(): + for k, v in sorted(self.loaded_manifests.items(), + key=lambda x: len(x[0]), + reverse=True): d = os.path.dirname(k) if gemato.util.path_starts_with(path, d): yield (d, v) diff --git a/tests/test_recursiveloader.py b/tests/test_recursiveloader.py index 8eac573..29bfb0f 100644 --- a/tests/test_recursiveloader.py +++ b/tests/test_recursiveloader.py @@ -75,6 +75,26 @@ DATA test 0 MD5 d41d8cd98f00b204e9800998ecf8427e self.assertIn('sub/deeper/Manifest', m.loaded_manifests) self.assertIn('other/Manifest', m.loaded_manifests) + def test__iter_manifests_for_path_order(self): + m = gemato.recursiveloader.ManifestRecursiveLoader( + os.path.join(self.dir, 'Manifest')) + m.load_manifests_for_path('', recursive=True) + self.assertListEqual([d for d, k + in m._iter_manifests_for_path('sub/deeper')], + ['sub/deeper', 'sub', '']) + self.assertListEqual([d for d, k + in m._iter_manifests_for_path('other')], + ['other', '']) + + def test__iter_manifests_for_path_recursively_order(self): + m = gemato.recursiveloader.ManifestRecursiveLoader( + os.path.join(self.dir, 'Manifest')) + m.load_manifests_for_path('', recursive=True) + self.assertListEqual([d for d, k + in m._iter_manifests_for_path('sub', + recursive=True)], + ['sub/deeper', 'sub', '']) + def test_load_sub_manifest_recursively(self): m = gemato.recursiveloader.ManifestRecursiveLoader( os.path.join(self.dir, 'Manifest')) |