summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAdam Coldrick <adam.coldrick@codethink.co.uk>2014-08-08 09:00:34 +0000
committerAdam Coldrick <adam.coldrick@codethink.co.uk>2014-08-14 13:24:50 +0000
commitf59856d36c267f9324fe2255c1c00464cdf4f92f (patch)
treefb29368a190073d3bd9eb52c789eb85c03727788
parent53b251f4a50eaa3684426a9e7f957fe6c2ca1468 (diff)
downloadmorph-f59856d36c267f9324fe2255c1c00464cdf4f92f.tar.gz
morphologyfactory: Use morphloader not morph2
This commit reworks morphologyfactory to stop using morph2. It removes the validation that is already handled by morphloader, and uses morphloader to load the morphology rather than using morph2. The unit tests are also changed to turn the example morphologies into YAML, and also to check for the correct exceptions.
-rw-r--r--morphlib/morphologyfactory.py76
-rw-r--r--morphlib/morphologyfactory_tests.py165
2 files changed, 75 insertions, 166 deletions
diff --git a/morphlib/morphologyfactory.py b/morphlib/morphologyfactory.py
index cd1972be..fd78c94f 100644
--- a/morphlib/morphologyfactory.py
+++ b/morphlib/morphologyfactory.py
@@ -37,31 +37,6 @@ class NotcachedError(MorphologyFactoryError):
"remote cache specified" % repo_name)
-class StratumError(MorphologyFactoryError):
- pass
-
-
-class NoChunkBuildDependsError(StratumError):
- def __init__(self, stratum, chunk):
- StratumError.__init__(
- self, 'No build dependencies in stratum %s for chunk %s '
- '(build-depends is a mandatory field)' % (stratum, chunk))
-
-
-class EmptyStratumError(StratumError):
-
- def __init__(self, stratum):
- cliapp.AppException.__init__(self,
- "Stratum %s is empty (has no dependencies)" % stratum)
-
-
-class NoStratumBuildDependsError(StratumError):
- def __init__(self, stratum):
- StratumError.__init__(
- self, 'Stratum %s has no build-dependencies listed '
- 'and has no bootstrap chunks.' % stratum)
-
-
class MorphologyFactory(object):
'''A way of creating morphologies which will provide a default'''
@@ -112,16 +87,8 @@ class MorphologyFactory(object):
def get_morphology(self, reponame, sha1, filename):
morph_name, text = self._get_morphology_text(reponame, sha1, filename)
- try:
- morphology = morphlib.morph2.Morphology(text)
- except morphlib.YAMLError as e: # pragma: no cover
- raise morphlib.Error("Error parsing %s: %s" %
- (filename, str(e)))
-
- if morph_name != morphology['name']:
- raise morphlib.Error(
- "Name %s does not match basename of morphology file %s" %
- (morphology['name'], filename))
+ loader = morphlib.morphloader.MorphologyLoader()
+ morphology = loader.load_from_string(text)
method_name = '_check_and_tweak_%s' % morphology['kind']
if hasattr(self, method_name):
@@ -133,54 +100,17 @@ class MorphologyFactory(object):
def _check_and_tweak_system(self, morphology, reponame, sha1, filename):
'''Check and tweak a system morphology.'''
- if morphology['arch'] is None: # pragma: no cover
- raise morphlib.Error('No arch specified in system %s '
- '(arch is a mandatory field)' %
- filename)
-
- if morphology['arch'] == 'armv7':
- morphology._dict['arch'] = 'armv7l'
-
- if morphology['arch'] not in morphlib.valid_archs:
- raise morphlib.Error('Unknown arch %s. This version of Morph '
- 'supports the following architectures: %s' %
- (morphology['arch'],
- ', '.join(morphlib.valid_archs)))
-
name = morphology['name']
morphology.builds_artifacts = [name + '-rootfs']
morphology.needs_artifact_metadata_cached = False
- morphlib.morphloader.MorphologyLoader._validate_stratum_specs_fields(
- morphology, 'strata')
- morphlib.morphloader.MorphologyLoader._set_stratum_specs_defaults(
- morphology, 'strata')
-
def _check_and_tweak_stratum(self, morphology, reponame, sha1, filename):
'''Check and tweak a stratum morphology.'''
- if len(morphology['chunks']) == 0:
- raise EmptyStratumError(morphology['name'])
-
- for source in morphology['chunks']:
- if source.get('build-depends', None) is None:
- name = source.get('name', source.get('repo', 'unknown'))
- raise NoChunkBuildDependsError(filename, name)
-
- if (len(morphology['build-depends'] or []) == 0 and
- not any(c.get('build-mode') in ('bootstrap', 'test')
- for c in morphology['chunks'])):
- raise NoStratumBuildDependsError(filename)
-
morphology.builds_artifacts = [morphology['name']]
morphology.needs_artifact_metadata_cached = True
- morphlib.morphloader.MorphologyLoader._validate_stratum_specs_fields(
- morphology, 'build-depends')
- morphlib.morphloader.MorphologyLoader._set_stratum_specs_defaults(
- morphology, 'build-depends')
-
def _check_and_tweak_chunk(self, morphology, reponame, sha1, filename):
'''Check and tweak a chunk morphology.'''
@@ -191,5 +121,3 @@ class MorphologyFactory(object):
morphology.builds_artifacts = [morphology['name']]
morphology.needs_artifact_metadata_cached = False
-
- morphlib.morphloader.MorphologyLoader._validate_chunk(morphology)
diff --git a/morphlib/morphologyfactory_tests.py b/morphlib/morphologyfactory_tests.py
index 47bf3153..347d93f7 100644
--- a/morphlib/morphologyfactory_tests.py
+++ b/morphlib/morphologyfactory_tests.py
@@ -17,7 +17,6 @@
import unittest
import morphlib
-from morphlib.morph2 import Morphology
from morphlib.morphologyfactory import (MorphologyFactory,
MorphologyNotFoundError,
NotcachedError)
@@ -41,94 +40,76 @@ class FakeRemoteRepoCache(object):
class FakeLocalRepo(object):
morphologies = {
- 'chunk.morph': '''{
- "name": "chunk",
- "kind": "chunk",
- "build-system": "bar"
- }''',
- 'chunk-split.morph': '''{
- "name": "chunk-split",
- "kind": "chunk",
- "build-system": "bar",
- "products": [
- {
- "artifact": "chunk-split-runtime",
- "include": []
- },
- {
- "artifact": "chunk-split-devel",
- "include": []
- }
- ]
- }''',
- 'stratum.morph': '''{
- "name": "stratum",
- "kind": "stratum",
- "chunks": [
- {
- "name": "chunk",
- "repo": "test:repo",
- "ref": "sha1",
- "build-mode": "bootstrap",
- "build-depends": []
- }
- ]
- }''',
- 'stratum-no-chunk-bdeps.morph': '''{
- "name": "stratum-no-chunk-bdeps",
- "kind": "stratum",
- "chunks": [
- {
- "name": "chunk",
- "repo": "test:repo",
- "ref": "sha1",
- "build-mode": "bootstrap"
- }
- ]
- }''',
- 'stratum-no-bdeps-no-bootstrap.morph': '''{
- "name": "stratum-no-bdeps-no-bootstrap",
- "kind": "stratum",
- "chunks": [
- {
- "name": "chunk",
- "repo": "test:repo",
- "ref": "sha1",
- "build-depends": []
- }
- ]
- }''',
- 'stratum-bdeps-no-bootstrap.morph': '''{
- "name": "stratum-bdeps-no-bootstrap",
- "kind": "stratum",
- "build-depends": [
- {
- "morph": "stratum"
- }
- ],
- "chunks": [
- {
- "name": "chunk",
- "repo": "test:repo",
- "ref": "sha1",
- "build-depends": []
- }
- ]
- }''',
- 'stratum-empty.morph': '''{
- "name": "stratum-empty",
- "kind": "stratum"
- }''',
- 'system.morph': '''{
- "name": "system",
- "kind": "system",
- "arch": "%(arch)s"
- }''',
- 'parse-error.morph': '''{ "name"''',
- 'name-mismatch.morph': '''{
- "name": "fred",
- "kind": "stratum"
- }''',
+ 'chunk.morph': '''
+ name: chunk
+ kind: chunk
+ build-system: bar
+ ''',
+ 'chunk-split.morph': '''
+ name: chunk-split
+ kind: chunk
+ build-system: bar
+ products:
+ - artifact: chunk-split-runtime
+ include: []
+ - artifact: chunk-split-devel
+ include: []
+ ''',
+ 'stratum.morph': '''
+ name: stratum
+ kind: stratum
+ chunks:
+ - name: chunk
+ repo: test:repo
+ ref: sha1
+ build-mode: bootstrap
+ build-depends: []
+ ''',
+ 'stratum-no-chunk-bdeps.morph': '''
+ name: stratum-no-chunk-bdeps
+ kind: stratum
+ chunks:
+ - name: chunk
+ repo: test:repo
+ ref: sha1
+ build-mode: bootstrap
+ ''',
+ 'stratum-no-bdeps-no-bootstrap.morph': '''
+ name: stratum-no-bdeps-no-bootstrap
+ kind: stratum
+ chunks:
+ - name: chunk
+ repo: test:repo
+ ref: sha1
+ build-depends: []
+ ''',
+ 'stratum-bdeps-no-bootstrap.morph': '''
+ name: stratum-bdeps-no-bootstrap
+ kind: stratum
+ build-depends:
+ - morph: stratum
+ chunks:
+ - name: chunk
+ repo: test:repo
+ ref: sha1
+ build-depends: []
+ ''',
+ 'stratum-empty.morph': '''
+ name: stratum-empty
+ kind: stratum
+ ''',
+ 'system.morph': '''
+ name: system
+ kind: system
+ arch: %(arch)s
+ strata:
+ - morph: stratum
+ ''',
+ 'parse-error.morph': ''' name''',
+ 'name-mismatch.morph': '''
+ name: fred
+ kind: stratum
+ ''',
}
def __init__(self):
@@ -313,13 +294,13 @@ class MorphologyFactoryTests(unittest.TestCase):
'reponame', 'sha1', 'parse-error.morph')
def test_fails_on_no_chunk_bdeps(self):
- self.assertRaises(morphlib.morphologyfactory.NoChunkBuildDependsError,
+ self.assertRaises(morphlib.morphloader.NoBuildDependenciesError,
self.mf.get_morphology, 'reponame', 'sha1',
'stratum-no-chunk-bdeps.morph')
def test_fails_on_no_bdeps_or_bootstrap(self):
self.assertRaises(
- morphlib.morphologyfactory.NoStratumBuildDependsError,
+ morphlib.morphloader.NoStratumBuildDependenciesError,
self.mf.get_morphology, 'reponame', 'sha1',
'stratum-no-bdeps-no-bootstrap.morph')
@@ -330,6 +311,6 @@ class MorphologyFactoryTests(unittest.TestCase):
def test_fails_on_empty_stratum(self):
self.assertRaises(
- morphlib.morphologyfactory.EmptyStratumError,
+ morphlib.morphloader.EmptyStratumError,
self.mf.get_morphology, 'reponame', 'sha1', 'stratum-empty.morph')