# -*- coding: utf-8 -*-
from ruamel.yaml import YAML
import copy
from jinja2 import Template
[docs]def expand_namespace(namespaces, description_property):
"""Function to expand namespaces
Args:
namespaces (dict): namespaces dictionary
description_property (str): Exapanded namespace for property.
Returns:
uri+property(str): Returns an expanded property string with URI.
"""
property_prefix, property_property = description_property.split(":")
for prefix, uri in namespaces.items():
if prefix == property_prefix:
return uri + property_property
[docs]def generate_statements(statements_dictionary, namespaces):
"""Function to generate statements
Args:
namespaces (dict): namespaces dictionary
statements_dictionary (dict): Dictionary of statements.
Returns:
statemets(dict): Updated statements dictionary.
"""
statements = {}
for statement_id, statement in statements_dictionary.items():
statement['property'] = expand_namespace(
namespaces, statement['property'])
statements[statement_id] = statement
return statements
[docs]def generate_descriptions(descriptions_dictionary, statements_dictionary):
"""Function to generate description
Args:
descriptions_dictionary (dict): Dictionary of statements
statements_dictionary (dict): Dictionary of statements.
Returns:
descriptions (dict): Updated descriptions dictionary.
"""
descriptions = {}
for description_id, description in descriptions_dictionary.items():
statement_list = description['statements']
description['statements'] = {}
for statement in statement_list:
description['statements'][statement] = copy.deepcopy(
statements_dictionary[statement])
descriptions[description_id] = description
return descriptions
[docs]def generate_description_set(description_set, descriptions_dictionary):
"""Function to generate description set
Args:
descriptions_set (dict): Dictionary of description set
descriptions_dictionary (dict): Dictionary of descriptions.
Returns:
descriptionset(dict): Updated description set dictionary.
"""
descriptionset = {}
description_list = description_set['descriptions']
description_set['descriptions'] = {}
for description in description_list:
description_set['descriptions'][description] = copy.deepcopy(
descriptions_dictionary[description])
descriptionset = description_set
return descriptionset
[docs]class YAMA:
"""YAMA Core class.
`YAMA` call is used to handle YAMA docuemnts through a
YAMA object. This object can be hadled Application Profiles
programatically.
Args:
yama_file (str): Accessible location of a YAMA file, this YAMA docuemnt
will be parsed and the Application Profile object will be returend.
Returns:
YAMA (object): Extandable Application Profile object is
returned.
"""
def __init__(self, yama_file):
yaml = YAML(typ='safe')
with open(yama_file, 'r') as ymlfile:
dsp = yaml.load(ymlfile)
dspm = {}
dspm['description_set'] = copy.deepcopy(dsp['description_set'])
namespaces = dsp['namespaces']
statements_dictionary = copy.deepcopy(dsp['statements'])
descriptions_dictionary = copy.deepcopy(dsp['descriptions'])
statements = generate_statements(statements_dictionary, namespaces)
descriptions = generate_descriptions(
descriptions_dictionary, statements)
description_set = copy.deepcopy(dsp['description_set'])
new_dsp = generate_description_set(description_set, descriptions)
self.dsp = new_dsp
[docs] def render(self, template_file):
"""A renderer for Application Profile Object, which will render
any given template to specific output.
Note:
At this stage of development, only Jinja2 templates are
supported.
Args:
template_file: Location of the template file.
Returns:
A rendered output of the DSP using provided template.
"""
with open(template_file) as file_:
template = Template(file_.read())
return (template.render(dsp=self.dsp))
[docs] def version(self):
"""Access the version number of DSP, if the version is declared
in the YAMA docuemnt.
Note:
This methode will be expanded to deal with automatic
versioning.
Returns:
Version of the Application Profile declared in the
YAMA docuemnt.
"""
return self.dsp.get('version')