Added new templates
authorSapan Bhatia <gwsapan@gmail.com>
Wed, 15 Jan 2014 02:20:16 +0000 (21:20 -0500)
committerSapan Bhatia <gwsapan@gmail.com>
Wed, 15 Jan 2014 02:20:16 +0000 (21:20 -0500)
planetstack/apigen/deps.template.json [new file with mode: 0755]
planetstack/apigen/dot.template.dot [new file with mode: 0755]
planetstack/apigen/modelgen [new file with mode: 0755]
planetstack/apigen/simple.template.txt [new file with mode: 0644]

diff --git a/planetstack/apigen/deps.template.json b/planetstack/apigen/deps.template.json
new file mode 100755 (executable)
index 0000000..e4164cf
--- /dev/null
@@ -0,0 +1,8 @@
+{
+{% for o in generator.all %}
+    "{{ o.camel }}": [
+       {% for f in o.refs %}"{{ f.camel }}",
+       {% endfor %}]
+{% endfor %}
+}
+
diff --git a/planetstack/apigen/dot.template.dot b/planetstack/apigen/dot.template.dot
new file mode 100755 (executable)
index 0000000..eade386
--- /dev/null
@@ -0,0 +1,7 @@
+digraph plstack {
+{% for o in generator.all %}
+{% for f in o.refs %}
+  "{{ o.camel }}"->"{{ f.camel }}";
+{% endfor %}
+{% endfor %}
+}
diff --git a/planetstack/apigen/modelgen b/planetstack/apigen/modelgen
new file mode 100755 (executable)
index 0000000..4c8a0f1
--- /dev/null
@@ -0,0 +1,92 @@
+#!/usr/bin/python
+
+import os
+import pdb
+import sys
+import json
+import re
+from django.template import Context, Template
+
+# Django set up
+
+sys.path.append('.')
+os.environ.setdefault("DJANGO_SETTINGS_MODULE", "planetstack.settings")
+from django.db.models.fields.related import ForeignKey
+from core.models import *
+
+g = globals()
+
+def enum_classes():
+       model_classes = []
+       for c in g.values():
+               if type(c)==type(PlCoreBase):
+                       model_classes.append(c)
+       return model_classes
+
+
+class GenObj(object):
+       def __str__(self):
+               return str(self.model.__name__.lower())
+
+       def __init__(self, m):
+               self.model = m
+               self.props = []
+               self.refs = []
+
+       def plural(self):
+               name = str(self)
+               if (name.endswith('s')):
+                       return name+'es'
+               else:
+                       return name+'s'
+
+       def camel(self):
+               name = str(self.model.__name__)
+               return name.title()
+               
+class Generator(dict):
+       def all(self):
+               return self.values()
+       
+       def regex(self, r):
+               filtered = filter(lambda o:re.match(r,str(o)), self.values())
+               return filtered
+
+       def add_object(self, o):
+               obj = GenObj(o)
+               fields = o._meta.fields
+               self[str(obj).lower()]=obj
+
+       def compute_links(self):
+               for obj in self.values():
+                       fields = obj.model._meta.fields
+                       for f in fields:
+                               if type(f)==ForeignKey and f.name in self.keys():
+                                       refobj = self[f.name]
+                                       obj.refs.append(refobj)
+                               else:
+                                       obj.props.append(f.name)
+                       
+def main():
+       try:
+               output = sys.argv[1]
+       except:
+               print 'Usage: modelgen <output template>'
+               exit(1)
+
+       generator = Generator()
+
+       models = enum_classes()
+
+       for m in models:
+               generator.add_object(m)
+
+       generator.compute_links()
+       template_contents = open(output).read()
+       template = Template(template_contents)
+       context = Context({'generator':generator})
+       print template.render(context)
+
+
+if (__name__=='__main__'):
+       main()
diff --git a/planetstack/apigen/simple.template.txt b/planetstack/apigen/simple.template.txt
new file mode 100644 (file)
index 0000000..109927e
--- /dev/null
@@ -0,0 +1,8 @@
+{% for object in generator.all %}
+Object {{ object }}:
+Refs:
+{% for ref in object.refs %}{{ ref }}{% endfor %}
+Props:
+{% for prop in object.props %}{{ prop }}
+{% endfor %}
+{% endfor %}