diff --git a/hshetl/editor.py b/hshetl/editor.py
new file mode 100644
index 0000000000000000000000000000000000000000..ec93a1b155e8bfe7c2a268a51415b49eaaf88cf2
--- /dev/null
+++ b/hshetl/editor.py
@@ -0,0 +1,56 @@
+from __future__ import print_function
+import hshetl
+import yaml
+import json
+
+def find_subclasses(cls):
+ result = []
+ for subcls in cls.__subclasses__():
+ if not subcls.__module__.startswith("hshetl"):
+ continue
+ result.append(subcls)
+ result += find_subclasses(subcls)
+ return result
+
+def json_encode_class(cls):
+ arg_resolver = hshetl.ConfigurationArgumentMatcher()
+ props, required = arg_resolver.get_constructor_arguments(cls)
+ cfg = {"yaml_tag": cls.yaml_tag,
+ "verbose_name": cls.__name__,
+ "properties": {}}
+ for prop in props:
+ cfg["properties"][prop] = {"type": "!!str",
+ "form": {"display": "textfield"}}
+ if prop in required:
+ cfg["properties"][prop]["defaults"] = "foo"
+
+def dump_schema():
+ yaml_subclasses = {}
+ for cls in find_subclasses(yaml.YAMLObject):
+ name = cls.__module__ + "." + cls.__name__
+ yaml_subclasses.setdefault(name, cls)
+ docs = {"order": ["connectors", "entities", "jobs"],
+ "children": {"connectors": [],
+ "entities": ["!entity"],
+ "jobs": []}}
+ classes = []
+ for cls in sorted(yaml_subclasses):
+ print(yaml_subclasses[cls])
+ continue
+ return
+ if True:
+ if "job" in cls.__name__.lower():
+ docs["children"]["jobs"].append(cls.yaml_tag)
+ elif "connector" in cls.__name__.lower():
+ docs["children"]["connectors"].append(cls.yaml_tag)
+ classes.append(json_encode_class(cls))
+ with open('editor_data.js','w') as f:
+ print("\"use strict\";\n\nvar hshetl_editor_data = " +
+ json.dumps({"documents": docs, "classes": classes},
+ indent=4,
+ separators=(',', ': ')),
+ file=f)
+
+
+if __name__ == '__main__':
+ dump_schema()