Make the templating system work(!)

pull/977/head
Kegan Dougal 10 years ago
parent 4e64d9e340
commit 7563f1058b

1
.gitignore vendored

@ -1 +1,2 @@
scripts/gen scripts/gen
*.pyc

@ -55,6 +55,9 @@ def load_sections(env, units):
def create_from_skeleton(skeleton, sections): def create_from_skeleton(skeleton, sections):
print "Creating spec from skeleton..." print "Creating spec from skeleton..."
print "Section keys: %s" % (sections.keys())
return skeleton.render(sections.data)
def check_unaccessed(name, store): def check_unaccessed(name, store):
unaccessed_keys = store.get_unaccessed_set() unaccessed_keys = store.get_unaccessed_set()
@ -80,12 +83,14 @@ def main():
sections = load_sections(env, units) sections = load_sections(env, units)
# combine all the RST sections into a coherent spec # combine all the RST sections into a coherent spec
skeleton = "foo" skeleton = env.get_template("skeleton.rst")
spec = create_from_skeleton(skeleton, sections) spec = create_from_skeleton(skeleton, sections)
check_unaccessed("units", units) check_unaccessed("units", units)
check_unaccessed("sections", sections) check_unaccessed("sections", sections)
print spec
with open("spec.rst", "w") as f:
f.write(spec)
if __name__ == '__main__': if __name__ == '__main__':

@ -9,6 +9,9 @@ class AccessKeyStore(object):
self.data = {} self.data = {}
self.accessed_set = Set() self.accessed_set = Set()
def keys(self):
return self.data.keys()
def add(self, key, unit_dict): def add(self, key, unit_dict):
self.data[key] = unit_dict self.data[key] = unit_dict

@ -4,15 +4,26 @@ import os
def _render_section_room_events(env, units): def _render_section_room_events(env, units):
template = env.get_template("events.tmpl") template = env.get_template("events.tmpl")
return template.render(example=example, event=event) examples = units.get("event-examples")
schemas = units.get("event-schemas")
sections = []
for event_name in schemas:
sections.append(template.render(
example=examples[event_name],
event=schemas[event_name]
))
return "\n\n".join(sections)
SECTION_DICT = { SECTION_DICT = {
"room-events": _render_section_room_events "room_events": _render_section_room_events
} }
def load(env, units): def load(env, units):
store = AccessKeyStore() store = AccessKeyStore()
for unit_key in SECTION_DICT: for section_key in SECTION_DICT:
unit = SECTION_DICT[unit_key](env, units) section = SECTION_DICT[section_key](env, units)
store.add(unit_key, unit) print "Generated section '%s' : %s" % (
section_key, section[:60].replace("\n","")
)
store.add(section_key, section)
return store return store

@ -1,18 +1,101 @@
"""Contains all the units for the spec.""" """Contains all the units for the spec."""
from . import AccessKeyStore from . import AccessKeyStore
import json
import os import os
def prop(obj, path):
# Helper method to extract nested property values
nested_keys = path.split("/")
val = obj
for key in nested_keys:
val = val.get(key, {})
return val
def _load_examples(): def _load_examples():
path = "../event-schemas/examples" path = "../event-schemas/examples"
examples = {} examples = {}
for filename in os.listdir(path): for filename in os.listdir(path):
with open(filename, "r") as f: if not filename.startswith("m."):
print filename continue
with open(os.path.join(path, filename), "r") as f:
examples[filename] = json.loads(f.read())
if filename == "m.room.message_m.text":
examples["m.room.message"] = examples[filename]
return examples return examples
def _load_schemas():
path = "../event-schemas/schema"
schemata = {}
def format_for_obj(obj):
obj_type = "<%s>" % obj.get("type")
if obj_type == "<object>":
if obj.get("properties"):
format = {}
for key in obj.get("properties"):
format[key] = format_for_obj(obj.get("properties")[key])
return format
elif obj.get("additionalProperties"):
return {
"<string>": (
"<%s>" % obj.get("additionalProperties").get("type")
)
}
enum_text = ""
# add on enum info
enum = obj.get("enum")
if enum:
if len(enum) > 1:
obj_type = "<enum>"
enum_text = " (" + "|".join(enum) + ")"
else:
obj_type = enum[0]
return obj_type + enum_text
for filename in os.listdir(path):
if not filename.startswith("m."):
continue
with open(os.path.join(path, filename), "r") as f:
json_schema = json.loads(f.read())
schema = {
"typeof": None,
"type": None,
"summary": None,
"desc": None,
"json_format": None
}
# add typeof
base_defs = {
"core#/definitions/room_event": "Room Event",
"core#/definitions/state_event": "State Event"
}
if type(json_schema.get("allOf")) == list:
schema["typeof"] = base_defs.get(
json_schema["allOf"][0].get("$ref")
)
# add type
schema["type"] = prop(json_schema, "properties/type/enum")[0]
# add summary and desc
schema["summary"] = json_schema.get("title")
schema["desc"] = json_schema.get("description")
# add json_format
content_props = prop(json_schema, "properties/content")
if content_props:
schema["json_format"] = format_for_obj(content_props)
schemata[filename] = schema
return schemata
UNIT_DICT = { UNIT_DICT = {
"event-examples": _load_examples "event-examples": _load_examples,
"event-schemas": _load_schemas
} }
@ -20,5 +103,8 @@ def load():
store = AccessKeyStore() store = AccessKeyStore()
for unit_key in UNIT_DICT: for unit_key in UNIT_DICT:
unit = UNIT_DICT[unit_key]() unit = UNIT_DICT[unit_key]()
print "Generated unit '%s' : %s" % (
unit_key, json.dumps(unit)[:50].replace("\n","")
)
store.add(unit_key, unit) store.add(unit_key, unit)
return store return store

@ -1,7 +1,7 @@
{{event.type}} {{event.type}}
-------------- --------------
Summary: {{event.summary}} Summary: {{event.summary}}
Type: {{event.parent}} Type: {{event.typeof}}
Description: {{event.desc}} Description: {{event.desc}}
JSON Format: {{event.content | jsonify}} JSON Format: {{event.json_format | jsonify}}
Example: {{example.content | jsonify}} Example: {{example.content | jsonify}}

@ -0,0 +1,6 @@
This is the skeleton of the spec.
{{room_events}}
Here a footer thingy.
Loading…
Cancel
Save