summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRichard Maw <richard.maw@codethink.co.uk>2014-01-07 17:10:06 +0000
committerRichard Maw <richard.maw@codethink.co.uk>2014-01-10 11:49:56 +0000
commit9a6f505962e0840562e17dd4758a569c17e4e353 (patch)
treec9aa579ea78eade0bbc07b4083373089958ac4ec
parentd7f9a82ee2e91c44166d39d21f611a8671c989df (diff)
downloadmorph-9a6f505962e0840562e17dd4758a569c17e4e353.tar.gz
source: Memoize artifact creation in Source object
This can simplify logic in the ArtifactResolver, since it no longer needs its own cache, and it allows you to go from a Source to its Artifacts later.
-rw-r--r--morphlib/source.py29
1 files changed, 28 insertions, 1 deletions
diff --git a/morphlib/source.py b/morphlib/source.py
index 99b0a993..e7b8086a 100644
--- a/morphlib/source.py
+++ b/morphlib/source.py
@@ -1,4 +1,4 @@
-# Copyright (C) 2012-2013 Codethink Limited
+# Copyright (C) 2012-2014 Codethink Limited
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
@@ -30,6 +30,9 @@ class Source(object):
* ``tree`` -- the SHA1 of the tree corresponding to the commit
* ``morphology`` -- the in-memory representation of the morphology we use
* ``filename`` -- basename of the morphology filename
+ * ``artifacts`` -- the set of artifacts this source produces, or
+ None if it has not yet been set by the
+ ArtifactResolver.
'''
@@ -42,8 +45,32 @@ class Source(object):
self.tree = tree
self.morphology = morphology
self.filename = filename
+ self.artifacts = None
def __str__(self): # pragma: no cover
return '%s|%s|%s' % (self.repo_name,
self.original_ref,
self.filename[:-len('.morph')])
+
+ def get_artifact(self, name): # pragma: no cover
+ '''Get the artifact of this source named ``name``.
+
+ This initialises a new Artifact object with this source as a
+ parent, if it does not already exist.
+
+ The same Artifact object is returned if the same name is given
+ later.
+
+ The set of Artifacts a Source has may be iterated over with the
+ ``artifacts`` field, which has the sentinel value of ``None``
+ if no Artifacts have been initialised yet.
+
+ '''
+ if self.artifacts is None:
+ self.artifacts = {}
+ try:
+ return self.artifacts[name]
+ except KeyError:
+ a = morphlib.artifact.Artifact(self, name)
+ self.artifacts[name] = a
+ return a