summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRichard Ipsum <richardipsum@fastmail.co.uk>2014-10-10 21:14:01 +0100
committerRichard Ipsum <richardipsum@fastmail.co.uk>2014-10-10 21:27:28 +0100
commit97f5b7fdfc7cb89748ce477653aae5c54c16668b (patch)
tree2cd9aa10acb684c84ac51890fc4904faa2b4902e
parentec09b9d5476fa313d1b43ee02bc773d195ef98e8 (diff)
downloadmorph-97f5b7fdfc7cb89748ce477653aae5c54c16668b.tar.gz
Replace resolver queue with loop
Since we're no longer adding anything to the queue we can replace it with a loop. This patch also splits the code up a little bit.
-rw-r--r--morphlib/artifactresolver.py119
1 files changed, 57 insertions, 62 deletions
diff --git a/morphlib/artifactresolver.py b/morphlib/artifactresolver.py
index 168c122c..30fb5e5a 100644
--- a/morphlib/artifactresolver.py
+++ b/morphlib/artifactresolver.py
@@ -56,78 +56,74 @@ class ArtifactResolver(object):
return [a for a in self._resolve_artifacts(source_pool)
if not a.dependents]
+ def _resolve_system_artifacts(self, source, artifacts): # pragma: no cover
+ systems = [source.artifacts[name]
+ for name in source.split_rules.artifacts]
+
+ for system in (s for s in systems if s not in self._added_artifacts):
+ artifacts.append(system)
+ self._added_artifacts.add(system)
+
+ resolved_artifacts = self._resolve_system_dependencies(systems, source)
+
+ for artifact in resolved_artifacts:
+ if not artifact in self._added_artifacts:
+ artifacts.append(artifact)
+ self._added_artifacts.add(artifact)
+
+ def _resolve_stratum_artifacts(self, source, artifacts):
+ # Iterate split_rules.artifacts, rather than
+ # artifacts.values() to preserve ordering
+ strata = [source.artifacts[name]
+ for name in source.split_rules.artifacts
+ if name in source.artifacts]
+
+ # If we were not given systems, return the strata here,
+ # rather than have the systems return them.
+ if not any(s.morphology['kind'] == 'system'
+ for s in self._source_pool):
+ for stratum in (s for s in strata
+ if s not in self._added_artifacts):
+ artifacts.append(stratum)
+ self._added_artifacts.add(stratum)
+
+ resolved_artifacts = self._resolve_stratum_dependencies(
+ strata, source)
+
+ for artifact in resolved_artifacts:
+ if not artifact in self._added_artifacts:
+ artifacts.append(artifact)
+ self._added_artifacts.add(artifact)
+
+ def _resolve_chunk_artifacts(self, source, artifacts):
+ chunks = [source.artifacts[name]
+ for name in source.split_rules.artifacts]
+ # If we were only given chunks, return them here, rather than
+ # have the strata return them.
+ if not any(s.morphology['kind'] == 'stratum'
+ for s in self._source_pool):
+ for chunk in (c for c in chunks
+ if c not in self._added_artifacts):
+ artifacts.append(chunk)
+ self._added_artifacts.add(chunk)
+
def _resolve_artifacts(self, source_pool):
self._source_pool = source_pool
self._added_artifacts = set()
+ artifacts = []
- artifacts = self._resolve_artifacts_recursively()
# TODO perform cycle detection, e.g. based on:
# http://stackoverflow.com/questions/546655/finding-all-cycles-in-graph
- return artifacts
- def _resolve_artifacts_recursively(self):
- artifacts = []
+ resolvers = {'system': self._resolve_system_artifacts,
+ 'stratum': self._resolve_stratum_artifacts,
+ 'chunk': self._resolve_chunk_artifacts}
- queue = self._create_initial_queue()
- while queue:
- source = queue.popleft()
-
- if source.morphology['kind'] == 'system': # pragma: no cover
- systems = [source.artifacts[name]
- for name in source.split_rules.artifacts]
-
- for system in (s for s in systems
- if s not in self._added_artifacts):
- artifacts.append(system)
- self._added_artifacts.add(system)
-
- resolved_artifacts = self._resolve_system_dependencies(
- systems, source)
-
- for artifact in resolved_artifacts:
- if not artifact in self._added_artifacts:
- artifacts.append(artifact)
- self._added_artifacts.add(artifact)
- elif source.morphology['kind'] == 'stratum':
- # Iterate split_rules.artifacts, rather than
- # artifacts.values() to preserve ordering
- strata = [source.artifacts[name]
- for name in source.split_rules.artifacts
- if name in source.artifacts]
-
- # If we were not given systems, return the strata here,
- # rather than have the systems return them.
- if not any(s.morphology['kind'] == 'system'
- for s in self._source_pool):
- for stratum in (s for s in strata
- if s not in self._added_artifacts):
- artifacts.append(stratum)
- self._added_artifacts.add(stratum)
-
- resolved_artifacts = self._resolve_stratum_dependencies(
- strata, source)
-
- for artifact in resolved_artifacts:
- if not artifact in self._added_artifacts:
- artifacts.append(artifact)
- self._added_artifacts.add(artifact)
- elif source.morphology['kind'] == 'chunk':
- chunks = [source.artifacts[name]
- for name in source.split_rules.artifacts]
- # If we were only given chunks, return them here, rather than
- # have the strata return them.
- if not any(s.morphology['kind'] == 'stratum'
- for s in self._source_pool):
- for chunk in (c for c in chunks
- if c not in self._added_artifacts):
- artifacts.append(chunk)
- self._added_artifacts.add(chunk)
+ for source in self._source_pool:
+ resolvers[source.morphology['kind']](source, artifacts)
return artifacts
- def _create_initial_queue(self):
- return collections.deque(self._source_pool)
-
def _resolve_system_dependencies(self, systems, source): # pragma: no cover
artifacts = []
@@ -227,7 +223,6 @@ class ArtifactResolver(object):
if chunk_artifact not in artifacts:
artifacts.append(chunk_artifact)
-
# Add these chunks to the processed artifacts, so other
# chunks may refer to them.
name_to_processed_artifacts[info['name']] = \