def _iter_images_by_dependency(images): images_dependency_names = {} for name, image in images.items(): # Remove external dependencies: dependencies = filter(lambda n: n in images, image.dependencies) images_dependency_names[name] = dependencies for image_name in iter_dependencies( images, images_dependency_names.__getitem__): yield images[image_name]
def test_iter_dependencies(self): data = { 'a': {'dependencies': ['b', 'c']}, 'b': {'dependencies': ['c']}, 'c': {} } def get_item_dependencies(key): return data[key].get('dependencies', []) self.assertEqual( tuple(iter_dependencies(data, get_item_dependencies)), ('c', 'b', 'a')) data = { 'a': {'dependencies': 'b'}, 'b': {'dependencies': 'a'} } with self.assertRaisesRegexp(RuntimeError, 'circular'): for item in iter_dependencies(data, get_item_dependencies): pass
def _make_containers(self, config_data): for name, config in config_data.items(): deps = self._get_container_config_dependencies(config) if not all(d in config_data for d in deps): raise ValueError( "'dependencies' for container {!r} references " "undefined container".format(name)) containers = {} for name in iter_dependencies( config_data, lambda name: self._get_container_config_dependencies( config_data[name])): containers[name] = self._make_container( name, config_data[name], containers) return containers
def __iter__(self): return iter_dependencies(self.containers, lambda c: c.dependencies)