diff options
author | Richard Maw <richard.maw@codethink.co.uk> | 2014-01-07 17:10:06 +0000 |
---|---|---|
committer | Richard Maw <richard.maw@codethink.co.uk> | 2014-01-10 11:49:56 +0000 |
commit | 9a6f505962e0840562e17dd4758a569c17e4e353 (patch) | |
tree | c9aa579ea78eade0bbc07b4083373089958ac4ec | |
parent | d7f9a82ee2e91c44166d39d21f611a8671c989df (diff) | |
download | morph-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.py | 29 |
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 |