Updated schema generator to generate YAML

This commit is contained in:
Maxim Kulkin 2013-11-11 13:23:54 +04:00
parent f11534b503
commit 08b8cdc3c5
1 changed files with 46 additions and 12 deletions

View File

@ -8,15 +8,16 @@ from copy import copy
from oslo.config import cfg
def identity(x):
return x
__builtins__._ = identity
class SchemaWriter(object):
class SchemaBuilderSchemaWriter(object):
def __init__(self, file, project, version):
super(SchemaWriter, self).__init__()
super(SchemaBuilderSchemaWriter, self).__init__()
self.file = file
self.project = project
self.version = version
@ -55,6 +56,39 @@ with {0}.version('{1}') as {2}:""".format(self.project, self.version,
self.file.write("\n\n # %s" % text)
class YamlSchemaWriter(object):
def __init__(self, file, project, version):
super(YamlSchemaWriter, self).__init__()
self.file = file
self.project = project
self.version = version
self._output_header()
def _output_header(self):
self.file.write("project: %s\n" % self.project)
self.file.write("version: %s\n" % self.version)
self.file.write("parameters:\n")
def section(self, name):
self._current_section = name
def param(self, name, type, default_value=None, description=None):
fullname = name
if self._current_section and self._current_section != 'DEFAULT':
fullname = '%s.%s' % (self._current_section, name)
self.file.write(" - name: %s\n" % fullname)
self.file.write(" type: %s\n" % type)
self.file.write(" default: %s\n" % repr(default_value))
if description:
self.file.write(" help: %s\n" % repr(description))
self.file.write("\n")
def comment(self, text):
self.file.write("\n# %s\n" % text)
def parse_args(argv):
parser = argparse.ArgumentParser()
parser.add_argument('project',
@ -97,13 +131,10 @@ def sanitize_type_and_value(param_name, param_type, param_value):
return (param_type, param_value)
def generate_schema_from_sample_config(project, version, config_file,
schema_file=sys.stdout):
def generate_schema_from_sample_config(project, version, config_file, writer):
with open(config_file, 'r') as f:
config_lines = f.readlines()
writer = SchemaWriter(schema_file, project, version)
description_lines = []
for line in config_lines:
if line.startswith('['):
@ -153,8 +184,7 @@ OPT_TYPE_MAPPING = {
OPTION_REGEX = re.compile(r"(%s)" % "|".join(OPT_TYPE_MAPPING.keys()))
def generate_schema_from_code(project, version, module_path,
schema_file=sys.stdout):
def generate_schema_from_code(project, version, module_path, writer):
old_sys_path = copy(sys.path)
mods_by_pkg = dict()
@ -223,7 +253,6 @@ def generate_schema_from_code(project, version, module_path,
for group, opts in _list_opts(mod_obj):
opts_by_group.setdefault(group, []).append((mod_str, opts))
writer = SchemaWriter(schema_file, project, version)
print_group_opts(writer, 'DEFAULT', opts_by_group.pop('DEFAULT', []))
for group, opts in opts_by_group.items():
print_group_opts(writer, group, opts)
@ -239,7 +268,7 @@ def _import_module(mod_str):
else:
__import__(mod_str)
return sys.modules[mod_str]
except ImportError as ie:
except ImportError:
traceback.print_exc()
# sys.stderr.write("%s\n" % str(ie))
return None
@ -331,10 +360,15 @@ def main(argv):
project = params.pop('project')
version = params.pop('version')
path = params.pop('config_or_module')
writer = YamlSchemaWriter(sys.stdout, project, version)
if os.path.isdir(path) or path.endswith('.py'):
generate_schema_from_code(project, version, path)
generate_schema_from_code(project, version, path,
writer=writer)
else:
generate_schema_from_sample_config(project, version, path)
generate_schema_from_sample_config(project, version, path,
writer=writer)
if __name__ == '__main__':