diff options
-rw-r--r-- | morphlib/morphset.py | 20 | ||||
-rw-r--r-- | morphlib/morphset_tests.py | 14 |
2 files changed, 34 insertions, 0 deletions
diff --git a/morphlib/morphset.py b/morphlib/morphset.py index dad3c834..2343cbae 100644 --- a/morphlib/morphset.py +++ b/morphlib/morphset.py @@ -222,6 +222,26 @@ class MorphologySet(object): return known + def repoint_refs(self, repo_url, new_ref): + '''Change all specs which refer to (repo, *) to (repo, new_ref). + + This is stunningly similar to change_ref, with the exception of + ignoring the morphology name and ref fields. + + It is intended to be used before chunks are petrified + + ''' + def wanted_spec(m, kind, spec): + return spec['repo'] == repo_url + + def process_spec(m, kind, spec): + if 'unpetrify-ref' not in spec: + spec['unpetrify-ref'] = spec['ref'] + spec['ref'] = new_ref + return True + + self._traverse_specs(process_spec, wanted_spec) + def petrify_chunks(self, resolutions): '''Update _every_ chunk's ref to the value resolved in resolutions. diff --git a/morphlib/morphset_tests.py b/morphlib/morphset_tests.py index baa3e103..fa8fa030 100644 --- a/morphlib/morphset_tests.py +++ b/morphlib/morphset_tests.py @@ -192,6 +192,20 @@ class MorphologySetTests(unittest.TestCase): [('test:foo-chunk', 'master'), ('test:morphs', 'master')]) + def test_repoint_refs(self): + self.morphs.add_morphology(self.system) + self.morphs.add_morphology(self.stratum) + self.morphs.repoint_refs('test:morphs', 'test') + self.assertEqual(self.system['strata'], + [ + { + 'morph': 'foo-stratum', + 'ref': 'test', + 'repo': 'test:morphs', + 'unpetrify-ref': 'master', + } + ]) + def test_petrify_chunks(self): # TODO: test petrifying a larger morphset self.morphs.add_morphology(self.system) |