diff options
Diffstat (limited to 'morphlib/morphologyloader.py')
-rw-r--r-- | morphlib/morphologyloader.py | 30 |
1 files changed, 28 insertions, 2 deletions
diff --git a/morphlib/morphologyloader.py b/morphlib/morphologyloader.py index dd2dd183..02c58f80 100644 --- a/morphlib/morphologyloader.py +++ b/morphlib/morphologyloader.py @@ -27,20 +27,46 @@ class MorphologyLoader(object): self.settings = settings self.morphologies = {} - def load(self, treeish, filename): + def load(self, treeish, filename, chunk_name=None): key = (treeish, filename) if key in self.morphologies: return self.morphologies[key] else: - morph = self._get_morph_from_git(treeish, filename) + try: + morph = self._get_morph_from_git(treeish, filename) + except morphlib.excecute.CommandFailure: # pragma: no cover + morph = None + if morph is None and chunk_name is not None: # pragma: no cover + morph = self._autodetect_morph(treeish, filename, chunk_name) + if morph is None: # pragma: no cover + raise Exception("Can't find morphology %s" % filename) self.morphologies[key] = morph return morph + def _autodetect_morph(self, treeish, filename, chunk): # pragma: no cover + def exists(x): + try: + self._get_morph_text(treeish, x) + except morphlib.execute.CommandFailure: + return False + else: + return True + bs = morphlib.buildsystem.detect_build_system(exists) + if bs is not None: + morph_text = bs.get_morphology_text(chunk) + return self._get_morph(treeish, filename, morph_text) + else: + return None + def _get_morph_text(self, treeish, filename): # pragma: no cover return morphlib.git.get_morph_text(treeish, filename) def _get_morph_from_git(self, treeish, filename): morph_text = self._get_morph_text(treeish, filename) + return self._get_morph(treeish, filename, morph_text) + + def _get_morph(self, treeish, filename, morph_text): fp = StringIO.StringIO(morph_text) fp.name = filename return morphlib.morphology.Morphology(treeish, fp) + |