Skip to content

Instantly share code, notes, and snippets.

@xmonader
Created August 15, 2016 09:35
Show Gist options
  • Select an option

  • Save xmonader/f947f8a48bf208e9a7fe8db547104d02 to your computer and use it in GitHub Desktop.

Select an option

Save xmonader/f947f8a48bf208e9a7fe8db547104d02 to your computer and use it in GitHub Desktop.
genjs8stub.py
import sys
import json
jsonfile = None
if len(sys.argv) == 1: exit()
jsonfile = sys.argv[1]
loaded = None
with open(jsonfile) as f:
loaded = json.load(f)
def generate_class(info, level): #name, type, doc
name, t, doc, objpath, filepath, extra = info
#we got all the subclasses of this one
#and foreach subclass we generate its template based on indenetation level as well
generated_fields=generate_fields_for(objpath, level+1) or "{spaces}\tpass".format(spaces=level * " ")
tmpl=""
tmpl += """
{spaces}class {name}:
{generated_fields}
""".format(spaces=level * " ", name=name, generated_fields=generate_fields_for(objpath, level+1))
return tmpl
def generate_fields_for(objpath, level=0):
keys=sorted([k for k in loaded.keys() if objpath +"." in k])
vals = [loaded[key] for key in keys]
ret = ""
for val in vals:
if len(val) == 6:
name, t, doc, objp, filepath, extra = val
if t in ("const"):
ret += generate_field(val, level)
if t in ("method", "property"):
ret += generate_method(val, level)
if t in ('class'):
ret += generate_innerclass(val, level)
# import pudb; pu.db
return ret
def generate_innerclass(info, level):
name, t, doc, objpath, filepath, extra = info
tmpl = """
{spaces}class {name}:
{generated_fields}
""".format(spaces=(level)*" ", name=name, generated_fields=generate_fields_for(objpath, level+1) or (level+1)*" "+"\tpass")
return tmpl
def generate_field(info, level):
name, t, doc, objpath, filepath, extra = info
return "{spaces}{name} = None\n".format(spaces=" "*level, name=name)
def generate_method(info, level):
name, t, doc, objpath, filepath, extra = info
if doc is not None:
doc=doc.replace("'", '"')
return """\n
{spaces}@staticmethod
{spaces}def {methodname}({methodargs}):
{spaces}\t'''
{spaces}{doc}
{spaces}\t'''
{spaces}\tpass\n""".format(spaces=(level)*" ", methodname=name, methodargs=extra or '', doc=doc)
classes = [(k,v) for (k,v) in loaded.items() if len(v)==6 and v[1]=='class']
with open("res.py", "w") as f:
for c, v in classes:
tmpl = ""
name, t, doc, objpath, filepath, extra = v
#is it a main or a sub?
parent=".".join(objpath.split(".")[:-1])
if parent in loaded and loaded[parent][1] == 'class':
continue
else:
print("Main: ", name)
tmpl += generate_class(v, 0)
tmpl = tmpl.replace("\t", " ")
f.write(tmpl)
#print(classes)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment