Reorganized the entrypoint into xosgen to make it easier to access it
programmatically
Change-Id: I280715c8f0c6d26dfd46b01f241b7cc2d7ef0be3
diff --git a/xos/genx/tool/generator.py b/xos/genx/tool/generator.py
new file mode 100755
index 0000000..293dc87
--- /dev/null
+++ b/xos/genx/tool/generator.py
@@ -0,0 +1,131 @@
+import plyproto.model as m
+import pdb
+import plyproto.parser as plyproto
+import traceback
+import sys
+import jinja2
+import os
+from xos2jinja import XOS2Jinja
+from proto2xproto import Proto2XProto
+
+import lib
+
+
+
+loader = jinja2.PackageLoader(__name__, 'templates')
+env = jinja2.Environment(loader=loader)
+
+class XOSGenerator:
+ def __init__(self, args):
+ self.args = args
+
+ def file_exists(self):
+ def file_exists2(name):
+ return (os.path.exists(self.args.attic+'/'+name))
+ return file_exists2
+
+ def include_file(self):
+ def include_file2(name):
+ return open(self.args.attic+'/'+name).read()
+ return include_file2
+ # FIXME: Support templates in the future
+ #return jinja2.Markup(loader.get_source(env, name)[0])
+
+ def generate(self):
+ try:
+ parser = plyproto.ProtobufAnalyzer()
+ input = open(self.args.input).read()
+ ast = parser.parse_string(input,debug=0)
+
+ if (self.args.rev):
+ v = Proto2XProto()
+ ast.accept(v)
+
+ v = XOS2Jinja()
+ ast.accept(v)
+
+ try:
+ template_name = self.args.template_dir + '/' + self.args.target
+ except AttributeError:
+ template_name = os.path.abspath(self.args.target)
+
+ os_template_loader = jinja2.FileSystemLoader( searchpath=[os.path.split(template_name)[0]])
+ os_template_env = jinja2.Environment(loader=os_template_loader)
+ os_template_env.globals['include_file'] = self.include_file() # Generates a function
+ os_template_env.globals['file_exists'] = self.file_exists() # Generates a function
+
+ for f in dir(lib):
+ if f.startswith('xproto'):
+ os_template_env.globals[f] = getattr(lib, f)
+
+ template = os_template_env.get_template(os.path.split(template_name)[1])
+ context = {}
+
+ try:
+ for s in self.args.kv.split(','):
+ k,val=s.split(':')
+ context[k]=val
+ except:
+ pass
+
+ rendered = template.render({"proto": {'messages':v.messages, 'message_names':[m['name'] for m in v.messages]},"context":context,"options":v.options})
+
+ lines = rendered.splitlines()
+ current_buffer = []
+ for l in lines:
+ if (l.startswith('+++')):
+ prefix = ''
+ prefixes = self.args.output.rsplit('/',1)
+ if (len(prefixes)>1):
+ path = prefix+'/'+l[4:]
+ direc = prefix
+ if (direc):
+ os.system('mkdir -p %s'%direc)
+ else:
+ path = l[4:]
+
+ fil = open(path,'w')
+ buf = '\n'.join(current_buffer)
+
+ obuf = buf
+
+ """
+ for d in options.dict:
+ df = open(d).read()
+ d = json.loads(df)
+
+ pattern = re.compile(r'\b(' + '|'.join(d.keys()) + r')\b')
+ obuf = pattern.sub(lambda x: d[x.group()], buf)
+ """
+
+ fil.write(obuf)
+ fil.close()
+
+ try:
+ quiet = self.args.quiet
+ except:
+ quiet = False
+ if (not quiet):
+ print 'Written to file %s'%path
+
+ current_buffer = []
+ else:
+ current_buffer.append(l)
+
+ if (current_buffer):
+ print '\n'.join(current_buffer)
+
+
+ except Exception as e:
+ print " Error occurred! file[%s]" % (self.args.input), e
+ print '-'*60
+ traceback.print_exc(file=sys.stdout)
+ print '-'*60
+ exit(1)
+
+def main():
+ generator = XOSGenerator(args)
+ generator.generate()
+
+if __name__=='__main__':
+ main()
diff --git a/xos/genx/tool/xosgen b/xos/genx/tool/xosgen
index ca6f070..6528b09 100755
--- a/xos/genx/tool/xosgen
+++ b/xos/genx/tool/xosgen
@@ -1,17 +1,11 @@
#!/usr/bin/python
-import plyproto.model as m
import pdb
import argparse
-import plyproto.parser as plyproto
import traceback
import sys
-import jinja2
import os
-from xos2jinja import XOS2Jinja
-from proto2xproto import Proto2XProto
-
-import lib
+from generator import *
parse = argparse.ArgumentParser(description='XOS code generator')
parse.add_argument('--rev', dest='rev', action='store_true',default=False, help='Convert proto to xproto')
@@ -23,98 +17,9 @@
args = parse.parse_args()
-def file_exists(name):
- return (os.path.exists(args.attic+'/'+name))
-
-def include_file(name):
- return open(args.attic+'/'+name).read()
- # FIXME: Support templates in the future
- #return jinja2.Markup(loader.get_source(env, name)[0])
-
-loader = jinja2.PackageLoader(__name__, 'templates')
-env = jinja2.Environment(loader=loader)
-
def main():
- try:
-
- parser = plyproto.ProtobufAnalyzer()
- input = open(args.input).read()
- ast = parser.parse_string(input,debug=0)
-
- if (args.rev):
- v = Proto2XProto()
- ast.accept(v)
-
- v = XOS2Jinja()
- ast.accept(v)
-
- template_name = os.path.abspath(args.target)
-
- os_template_loader = jinja2.FileSystemLoader( searchpath=[os.path.split(template_name)[0]])
- os_template_env = jinja2.Environment(loader=os_template_loader)
- os_template_env.globals['include_file'] = include_file
- os_template_env.globals['file_exists'] = file_exists
-
- for f in dir(lib):
- if f.startswith('xproto'):
- os_template_env.globals[f] = getattr(lib, f)
-
- template = os_template_env.get_template(os.path.split(template_name)[1])
- context = {}
-
- try:
- for s in args.kv.split(','):
- k,val=s.split(':')
- context[k]=val
- except:
- pass
-
- rendered = template.render({"proto": {'messages':v.messages, 'message_names':[m['name'] for m in v.messages]},"context":context,"options":v.options})
-
- lines = rendered.splitlines()
- current_buffer = []
- for l in lines:
- if (l.startswith('+++')):
- prefixes = args.output.rsplit('/',1)
- if (len(prefixes)>1):
- path = prefix+'/'+l[4:]
- direc = prefix
- os.system('mkdir -p %s'%direc)
- else:
- path = l[4:]
-
- fil = open(path,'w')
- buf = '\n'.join(current_buffer)
-
- obuf = buf
-
- """
- for d in options.dict:
- df = open(d).read()
- d = json.loads(df)
-
- pattern = re.compile(r'\b(' + '|'.join(d.keys()) + r')\b')
- obuf = pattern.sub(lambda x: d[x.group()], buf)
- """
-
- fil.write(obuf)
- fil.close()
-
- print 'Written to file %s'%path
- current_buffer = []
- else:
- current_buffer.append(l)
-
- if (current_buffer):
- print '\n'.join(current_buffer)
-
-
- except Exception as e:
- print " Error occurred! file[%s]" % (args.input), e
- print '-'*60
- traceback.print_exc(file=sys.stdout)
- print '-'*60
- exit(1)
+ generator = XOSGenerator(args)
+ generator.generate()
if __name__=='__main__':
main()