Source code for ipypublish.port_api.tpl_dct_to_json

""" a module to convert between the old (Python script) segment format,
and the new (JSON) one
"""
from typing import Dict, Tuple  # noqa: F401
import os
import ast
import json


[docs]def assess_syntax(path): with open(path) as file_obj: content = file_obj.read() syntax_tree = ast.parse(content) docstring = "" # docstring = ast.get_docstring(syntaxTree) dct = None dtype = None for i, child in enumerate(ast.iter_child_nodes(syntax_tree)): if i == 0 and isinstance(child, ast.Expr) and isinstance(child.value, ast.Str): docstring = child.value.s elif isinstance(child, ast.Assign): targets = child.targets if len(targets) > 1: continue target = child.targets[0] # type: ast.Name dtype = target.id if dtype not in ["tpl_dict", "tplx_dict"]: continue if not isinstance(child.value, ast.Dict): raise ValueError( "expected {} to be of type Dict: {}".format(dtype, child.value) ) dct = child.value break if dct is None: raise IOError("could not find tpl(x)_dict") output = {} for key, value in zip(dct.keys, dct.values): if not isinstance(key, ast.Str): raise ValueError("expected {} key to be of type Str: {}".format(dtype, key)) if not isinstance(value, ast.Str): raise ValueError( "expected {} value be of type Str: {}".format(dtype, value) ) output[key.s] = value.s return { "identifier": os.path.splitext(os.path.basename(path))[0], "description": docstring, "segments": output, "$schema": "../../schema/segment.schema.json", }
[docs]def py_to_json(path, outpath=None): output = assess_syntax(path) if outpath: with open(outpath, "w") as file_obj: json.dump(output, file_obj, indent=2) return json.dumps(output, indent=2)
if __name__ == "__main__": import glob _dir_path = os.path.dirname(os.path.realpath(__file__)) _ext = ".tpl.json" for _path in glob.glob(os.path.join(_dir_path, "**", "*.py")): _name = os.path.splitext(os.path.basename(_path))[0] _folder = os.path.basename(os.path.dirname(_path)) if _folder == "ipypublish": _prefix = "ipy-" else: _prefix = "std-" _outpath = os.path.join(os.path.dirname(_path), _prefix + _name + _ext) py_to_json(_path, _outpath)