summaryrefslogtreecommitdiff
path: root/morphlib/morphologyloader.py
diff options
context:
space:
mode:
Diffstat (limited to 'morphlib/morphologyloader.py')
-rw-r--r--morphlib/morphologyloader.py30
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)
+