Serialize components, close #8

This commit is contained in:
Lucidiot 2019-09-28 15:35:29 +02:00
parent fba52b9da6
commit 834d4dc8a1
Signed by: lucidiot
GPG Key ID: 3358C1CA6906FB8D
3 changed files with 44 additions and 0 deletions

View File

@ -46,6 +46,13 @@ class Component(metaclass=ComponentMetaclass, register=False):
def generate(self):
pass
def serialize(self):
"""
Should return a JSON/YAML/TOML-compatible structure which can be used
to export a component to a file.
"""
return self.__dict__.copy()
@abstractproperty
def combinations(self):
"""
@ -136,6 +143,11 @@ class Reference(Component, key='ref'):
raise TypeError('Unresolved reference to {!r}'.format(self.ref))
return self.to.generate()
def serialize(self):
return {
'ref': self.ref,
}
class Value(Component, key='value'):
"""
@ -157,6 +169,14 @@ class Value(Component, key='value'):
if not self.optional or random.randrange(2):
return self.value
def serialize(self):
if self.optional:
return {
'optional': True,
'value': self.value,
}
return self.value
class Include(Component, key='include'):
"""
@ -180,3 +200,9 @@ class Include(Component, key='include'):
def generate(self):
return self.to.generate()
def serialize(self):
return {
'include': self.include,
'format': self.format,
}

View File

@ -32,3 +32,13 @@ class Generator(Component, key='main'):
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()
}

View File

@ -82,6 +82,14 @@ class CompoundComponent(Component, register=False):
for item in self.items:
item.resolve_references(references)
def serialize(self):
data = super().serialize()
del data['items']
data[self.items_key] = [
child.serialize() for child in self.items
]
return data
class AllOf(CompoundComponent, key='allOf'):
"""