45 lines
1.4 KiB
Python
45 lines
1.4 KiB
Python
from collections.abc import Mapping
|
|
from madeleine import Component
|
|
|
|
|
|
class Generator(Component, key='main'):
|
|
|
|
def __init__(self, **data):
|
|
assert 'version' in data, 'Missing generator spec version'
|
|
assert data['version'] == '1', 'Incompatible generator spec version'
|
|
assert 'main' in data, 'Missing main component'
|
|
data.setdefault('components', {})
|
|
assert isinstance(data['components'], Mapping), \
|
|
'Components should be a mapping'
|
|
|
|
self.version = data['version']
|
|
self.components = {}
|
|
for k, v in data['components'].items():
|
|
self.components[k] = Component._make(v)
|
|
|
|
self.main = Component._make(data['main'])
|
|
# Allows components to reference the main component
|
|
self.components.setdefault('main', self.main)
|
|
|
|
# Let components resolve all their references
|
|
for k in self.components:
|
|
self.components[k].resolve_references(self.components)
|
|
self.main.resolve_references(self.components)
|
|
|
|
@property
|
|
def combinations(self):
|
|
return self.main.combinations
|
|
|
|
def generate(self):
|
|
return self.main.generate()
|
|
|
|
def serialize(self):
|
|
return {
|
|
'version': self.version,
|
|
'components': {
|
|
name: component.serialize()
|
|
for name, component in self.components.items()
|
|
},
|
|
'main': self.main.serialize()
|
|
}
|