Source code for subway.components.genfiles

"""
smarter file rendered can be utilized in _render_input of SSlurmChk
"""
import json

from ..utils import simple_template_render, flatten_dict

# TODO: provide smart unified API to generate files with given python data structure
# .xml .json .yaml/toml .txt .csv
[docs]def generate_file( data, output_path, output_format=None, output_config=None, output_template=None ): if not output_config: output_config = {} # firstly transform everything to standard intermediate state as a dict json like data = jsonify(data, _outer_most=True) if output_template: simple_template_render(output_template, output_path, flatten_dict(data)) if output_format == "json": with open(output_path, "w") as f: json.dump(data, f) return
[docs]def jsonify(data, _outer_most=False, _outer=True, func=None): if data is None: return None elif isinstance(data, dict): # auto support collections.OrderedDict for k, v in data.items(): data[k] = jsonify(v, _outer=False, func=func) elif isinstance(data, list) or isinstance(data, set) or isinstance(data, tuple): data = list(data) for i, d in enumerate(data): data[i] = jsonify(d, _outer=True, func=func) if _outer: data = {"list": data} elif isinstance(data, str) or isinstance(data, int) or isinstance(data, float): if _outer_most: data = {type(data).__name__: data} else: if func: data = func(data) else: raise ValueError("Unsupported data type %s to jsonify" % type(data)) return data