Sapan Bhatia | 3a45f8b | 2014-01-14 21:20:16 -0500 | [diff] [blame] | 1 | #!/usr/bin/python |
| 2 | |
| 3 | import os |
| 4 | import pdb |
Sapan Bhatia | cdd90b7 | 2014-01-28 20:03:13 -0500 | [diff] [blame] | 5 | import copy |
Sapan Bhatia | 3a45f8b | 2014-01-14 21:20:16 -0500 | [diff] [blame] | 6 | import sys |
| 7 | import json |
| 8 | import re |
Scott Baker | be53ac1 | 2017-01-04 15:41:10 -0800 | [diff] [blame] | 9 | import jinja2 |
Scott Baker | 77f7d6f | 2015-10-23 12:20:15 -0700 | [diff] [blame] | 10 | from optparse import OptionParser |
Sapan Bhatia | 3a45f8b | 2014-01-14 21:20:16 -0500 | [diff] [blame] | 11 | |
| 12 | # Django set up |
| 13 | |
Sapan Bhatia | 879e4e4 | 2016-03-04 22:03:07 +0100 | [diff] [blame] | 14 | import django |
Sapan Bhatia | 3a45f8b | 2014-01-14 21:20:16 -0500 | [diff] [blame] | 15 | sys.path.append('.') |
Sapan Bhatia | 879e4e4 | 2016-03-04 22:03:07 +0100 | [diff] [blame] | 16 | sys.path.append('/opt/xos') |
Scott Baker | c63b4f6 | 2015-02-16 22:43:01 -0800 | [diff] [blame] | 17 | os.environ.setdefault("DJANGO_SETTINGS_MODULE", "xos.settings") |
Sapan Bhatia | eb62ad6 | 2014-01-28 14:29:08 -0500 | [diff] [blame] | 18 | from django.db.models.fields.related import ForeignKey, ManyToManyField |
Scott Baker | 87fb302 | 2017-02-09 09:33:59 -0800 | [diff] [blame] | 19 | from django.conf import settings |
Sapan Bhatia | 3a45f8b | 2014-01-14 21:20:16 -0500 | [diff] [blame] | 20 | |
Sapan Bhatia | 879e4e4 | 2016-03-04 22:03:07 +0100 | [diff] [blame] | 21 | django.setup() |
| 22 | |
Scott Baker | 77f7d6f | 2015-10-23 12:20:15 -0700 | [diff] [blame] | 23 | options = None |
| 24 | |
Sapan Bhatia | 958226f | 2016-02-24 19:07:37 +0100 | [diff] [blame] | 25 | |
Sapan Bhatia | eb62ad6 | 2014-01-28 14:29:08 -0500 | [diff] [blame] | 26 | def singular(foo, keys): |
| 27 | for k in keys: |
| 28 | if (foo==k+'es'): |
| 29 | return k |
| 30 | elif (foo==k+'s'): |
| 31 | return k |
| 32 | raise Exception('Plural to singular error for %s'%foo) |
| 33 | |
Sapan Bhatia | 3a45f8b | 2014-01-14 21:20:16 -0500 | [diff] [blame] | 34 | g = globals() |
| 35 | |
Scott Baker | 49cf7a5 | 2015-10-20 11:13:50 -0700 | [diff] [blame] | 36 | def enum_classes(apps): |
Sapan Bhatia | 958226f | 2016-02-24 19:07:37 +0100 | [diff] [blame] | 37 | global app_map |
Sapan Bhatia | 879e4e4 | 2016-03-04 22:03:07 +0100 | [diff] [blame] | 38 | global class_map |
Sapan Bhatia | 958226f | 2016-02-24 19:07:37 +0100 | [diff] [blame] | 39 | app_map = {} |
Sapan Bhatia | 879e4e4 | 2016-03-04 22:03:07 +0100 | [diff] [blame] | 40 | class_map = {} |
Scott Baker | 49cf7a5 | 2015-10-20 11:13:50 -0700 | [diff] [blame] | 41 | model_classes = [] |
| 42 | for app in apps: |
Sapan Bhatia | 958226f | 2016-02-24 19:07:37 +0100 | [diff] [blame] | 43 | orig_app=app |
Scott Baker | 49cf7a5 | 2015-10-20 11:13:50 -0700 | [diff] [blame] | 44 | app = app + ".models" |
| 45 | models_module = __import__(app) |
| 46 | for part in app.split(".")[1:]: |
| 47 | if hasattr(models_module, "PlCoreBase"): |
| 48 | break |
| 49 | models_module = getattr(models_module,part) |
Sapan Bhatia | 3a45f8b | 2014-01-14 21:20:16 -0500 | [diff] [blame] | 50 | |
Sapan Bhatia | 958226f | 2016-02-24 19:07:37 +0100 | [diff] [blame] | 51 | global PlCoreBase |
Scott Baker | 49cf7a5 | 2015-10-20 11:13:50 -0700 | [diff] [blame] | 52 | PlCoreBase = getattr(models_module,"PlCoreBase") |
| 53 | |
| 54 | for classname in dir(models_module): |
| 55 | c = getattr(models_module, classname, None) |
Scott Baker | 87fb302 | 2017-02-09 09:33:59 -0800 | [diff] [blame] | 56 | |
| 57 | # For services, prevent loading of core models as it causes |
| 58 | # duplication. |
| 59 | if hasattr(c,"_meta") and hasattr(c._meta, "app_label"): |
| 60 | if (c._meta.app_label == "core") and (orig_app!="core"): |
| 61 | continue |
| 62 | |
Scott Baker | 77f7d6f | 2015-10-23 12:20:15 -0700 | [diff] [blame] | 63 | if type(c)==type(PlCoreBase) and c.__name__ not in options.blacklist: |
Scott Baker | 49cf7a5 | 2015-10-20 11:13:50 -0700 | [diff] [blame] | 64 | model_classes.append(c) |
Sapan Bhatia | 958226f | 2016-02-24 19:07:37 +0100 | [diff] [blame] | 65 | app_map[c.__name__]=orig_app |
Sapan Bhatia | 879e4e4 | 2016-03-04 22:03:07 +0100 | [diff] [blame] | 66 | c.class_name = c.__name__ |
| 67 | file_name = c.__module__.rsplit('.',1)[1] |
| 68 | try: |
| 69 | if (file_name not in class_map[orig_app]): |
| 70 | class_map[orig_app].append({file_name:[c]}) |
| 71 | else: |
| 72 | class_map[orig_app][file_name].append(c) |
| 73 | |
| 74 | except KeyError: |
| 75 | class_map[orig_app] = [{file_name:[c]}] |
Sapan Bhatia | 958226f | 2016-02-24 19:07:37 +0100 | [diff] [blame] | 76 | |
Scott Baker | 49cf7a5 | 2015-10-20 11:13:50 -0700 | [diff] [blame] | 77 | |
| 78 | return model_classes |
Sapan Bhatia | 3a45f8b | 2014-01-14 21:20:16 -0500 | [diff] [blame] | 79 | |
| 80 | class GenObj(object): |
| 81 | def __str__(self): |
| 82 | return str(self.model.__name__.lower()) |
| 83 | |
| 84 | def __init__(self, m): |
| 85 | self.model = m |
| 86 | self.props = [] |
Sapan Bhatia | 958226f | 2016-02-24 19:07:37 +0100 | [diff] [blame] | 87 | self.fields = [] |
Scott Baker | 841f642 | 2017-01-04 18:28:55 -0800 | [diff] [blame] | 88 | self.all_fields = [] |
Sapan Bhatia | 958226f | 2016-02-24 19:07:37 +0100 | [diff] [blame] | 89 | self.field_dict = [] |
Sapan Bhatia | 3a45f8b | 2014-01-14 21:20:16 -0500 | [diff] [blame] | 90 | self.refs = [] |
Scott Baker | 32fbfcf | 2017-02-07 17:00:27 -0800 | [diff] [blame] | 91 | self.reverse_refs = [] |
Sapan Bhatia | be42fba | 2014-01-28 23:53:49 -0500 | [diff] [blame] | 92 | self.plural_name = None |
Sapan Bhatia | 3a45f8b | 2014-01-14 21:20:16 -0500 | [diff] [blame] | 93 | |
| 94 | def plural(self): |
Sapan Bhatia | be42fba | 2014-01-28 23:53:49 -0500 | [diff] [blame] | 95 | if (self.plural_name): |
| 96 | return self.plural_name |
Sapan Bhatia | 3a45f8b | 2014-01-14 21:20:16 -0500 | [diff] [blame] | 97 | else: |
Sapan Bhatia | be42fba | 2014-01-28 23:53:49 -0500 | [diff] [blame] | 98 | name = str(self) |
| 99 | if (name.endswith('s')): |
| 100 | return name+'es' |
| 101 | else: |
| 102 | return name+'s' |
Sapan Bhatia | 3a45f8b | 2014-01-14 21:20:16 -0500 | [diff] [blame] | 103 | |
Scott Baker | 8ffd7d7 | 2014-11-10 15:58:58 -0800 | [diff] [blame] | 104 | def singular(self): |
| 105 | return str(self) |
| 106 | |
| 107 | def rest_name(self): |
| 108 | # These are things that either for historic reasons or due to incorrect naming, |
| 109 | # got called something different than the autogen thinks they should be |
| 110 | # called. |
Tony Mack | 336e0f9 | 2014-11-30 15:53:08 -0500 | [diff] [blame] | 111 | REST_FIXUP = {'controllernetworkses': 'controllernetworks', |
| 112 | 'controllerimageses': 'controllerimages', |
| 113 | 'controllersliceses': 'controllerslices', |
| 114 | 'controlleruserses': 'controllerusers', |
Scott Baker | 8ffd7d7 | 2014-11-10 15:58:58 -0800 | [diff] [blame] | 115 | 'sitedeploymentses': 'sitedeployments', |
| 116 | 'siteroles': 'site_roles', |
| 117 | 'sliceprivileges': 'slice_privileges', |
| 118 | 'sliceroles': 'slice_roles', |
| 119 | } |
| 120 | return REST_FIXUP.get(self.plural(), self.plural()) |
| 121 | |
Sapan Bhatia | 3a45f8b | 2014-01-14 21:20:16 -0500 | [diff] [blame] | 122 | def camel(self): |
| 123 | name = str(self.model.__name__) |
Sapan Bhatia | df2b49e | 2014-01-28 19:41:07 -0500 | [diff] [blame] | 124 | return name |
Sapan Bhatia | 3a45f8b | 2014-01-14 21:20:16 -0500 | [diff] [blame] | 125 | |
| 126 | class Generator(dict): |
Sapan Bhatia | 879e4e4 | 2016-03-04 22:03:07 +0100 | [diff] [blame] | 127 | def __init__(self): |
| 128 | self.apps = {} |
| 129 | |
Sapan Bhatia | 3a45f8b | 2014-01-14 21:20:16 -0500 | [diff] [blame] | 130 | def all(self): |
| 131 | return self.values() |
Scott Baker | 57d66aa | 2015-10-23 13:09:49 -0700 | [diff] [blame] | 132 | |
| 133 | def rest_models(self): |
| 134 | norest = [x.lower() for x in options.norest] |
| 135 | return [v for v in self.values() if not (str(v) in norest)] |
Sapan Bhatia | 3a45f8b | 2014-01-14 21:20:16 -0500 | [diff] [blame] | 136 | |
| 137 | def regex(self, r): |
| 138 | filtered = filter(lambda o:re.match(r,str(o)), self.values()) |
| 139 | return filtered |
| 140 | |
| 141 | def add_object(self, o): |
Sapan Bhatia | 958226f | 2016-02-24 19:07:37 +0100 | [diff] [blame] | 142 | global app_map |
Sapan Bhatia | 3a45f8b | 2014-01-14 21:20:16 -0500 | [diff] [blame] | 143 | obj = GenObj(o) |
| 144 | fields = o._meta.fields |
Sapan Bhatia | 958226f | 2016-02-24 19:07:37 +0100 | [diff] [blame] | 145 | try: |
Scott Baker | 87fb302 | 2017-02-09 09:33:59 -0800 | [diff] [blame] | 146 | obj.app = app_map[o.__name__] # full name |
| 147 | obj.app_name = app_map[o.__name__].split(".")[-1] # only the last part |
Sapan Bhatia | 958226f | 2016-02-24 19:07:37 +0100 | [diff] [blame] | 148 | except KeyError: |
| 149 | print "KeyError: %r"%o.__name__ |
Sapan Bhatia | 879e4e4 | 2016-03-04 22:03:07 +0100 | [diff] [blame] | 150 | obj.class_name = o.class_name |
| 151 | |
| 152 | file_name = o.__module__.rsplit('.',1)[1] |
| 153 | |
| 154 | try: |
| 155 | if (file_name not in self.apps[obj.app]): |
| 156 | self.apps[obj.app][file_name]=[obj] |
| 157 | else: |
| 158 | self.apps[obj.app][file_name].append(obj) |
| 159 | |
| 160 | except KeyError: |
| 161 | self.apps[obj.app] = {file_name:[obj]} |
| 162 | |
Sapan Bhatia | 3a45f8b | 2014-01-14 21:20:16 -0500 | [diff] [blame] | 163 | self[str(obj).lower()]=obj |
| 164 | |
| 165 | def compute_links(self): |
Sapan Bhatia | 958226f | 2016-02-24 19:07:37 +0100 | [diff] [blame] | 166 | base_props = [f.name for f in PlCoreBase._meta.fields] |
| 167 | |
Sapan Bhatia | 3a45f8b | 2014-01-14 21:20:16 -0500 | [diff] [blame] | 168 | for obj in self.values(): |
Sapan Bhatia | b588540 | 2014-01-29 10:32:09 -0500 | [diff] [blame] | 169 | #if (str(obj)=='network'): |
Sapan Bhatia | cdd90b7 | 2014-01-28 20:03:13 -0500 | [diff] [blame] | 170 | # pdb.set_trace() |
Sapan Bhatia | 3a45f8b | 2014-01-14 21:20:16 -0500 | [diff] [blame] | 171 | fields = obj.model._meta.fields |
| 172 | for f in fields: |
Sapan Bhatia | b588540 | 2014-01-29 10:32:09 -0500 | [diff] [blame] | 173 | if (f and f.rel): |
| 174 | to_name = str(f.rel.to) |
| 175 | else: |
| 176 | to_name = None |
| 177 | |
| 178 | if type(f)==ForeignKey and to_name and to_name in self.keys(): |
| 179 | refobj = self[f.to_name] |
| 180 | |
| 181 | if (str(obj)=='slice' and f.to_name=='networks'): |
| 182 | obj.refs.append(refobj) |
Sapan Bhatia | be42fba | 2014-01-28 23:53:49 -0500 | [diff] [blame] | 183 | related_name = f.related_query_name() |
Sapan Bhatia | b588540 | 2014-01-29 10:32:09 -0500 | [diff] [blame] | 184 | if (related_name!='+' and related_name.lower()!=str(obj).lower()): |
Sapan Bhatia | be42fba | 2014-01-28 23:53:49 -0500 | [diff] [blame] | 185 | cobj = copy.deepcopy(obj) |
| 186 | cobj.multi = True |
| 187 | cobj.plural_name = related_name |
| 188 | refobj.refs.append(cobj) |
Scott Baker | f71e3d8 | 2015-10-30 09:42:34 -0700 | [diff] [blame] | 189 | elif f.name.endswith("_ptr"): |
| 190 | # django inherited model, for example HPCService |
| 191 | # cause swagger and REST to break |
| 192 | pass |
Sapan Bhatia | 3a45f8b | 2014-01-14 21:20:16 -0500 | [diff] [blame] | 193 | else: |
Sapan Bhatia | 958226f | 2016-02-24 19:07:37 +0100 | [diff] [blame] | 194 | f.type = f.__class__.__name__ |
Sapan Bhatia | 879e4e4 | 2016-03-04 22:03:07 +0100 | [diff] [blame] | 195 | if (type(f)==ForeignKey): |
| 196 | f.related.model.class_name = f.related.model.__name__ |
Sapan Bhatia | 958226f | 2016-02-24 19:07:37 +0100 | [diff] [blame] | 197 | if (f.name not in base_props): |
Scott Baker | 841f642 | 2017-01-04 18:28:55 -0800 | [diff] [blame] | 198 | obj.fields.append(f) |
| 199 | obj.all_fields.append(f) |
Sapan Bhatia | 958226f | 2016-02-24 19:07:37 +0100 | [diff] [blame] | 200 | obj.props.append(f.name) |
Sapan Bhatia | b588540 | 2014-01-29 10:32:09 -0500 | [diff] [blame] | 201 | |
Sapan Bhatia | eb62ad6 | 2014-01-28 14:29:08 -0500 | [diff] [blame] | 202 | m2m = obj.model._meta.many_to_many |
| 203 | for f in m2m: |
| 204 | try: |
| 205 | related_model_name = f.m2m_reverse_field_name() |
| 206 | except: |
| 207 | related_model_name = f.m2m_db_table().rsplit('_',1)[-1] |
| 208 | |
Sapan Bhatia | b588540 | 2014-01-29 10:32:09 -0500 | [diff] [blame] | 209 | related_name = f.related_query_name() |
Sapan Bhatia | eb62ad6 | 2014-01-28 14:29:08 -0500 | [diff] [blame] | 210 | if related_model_name in self.keys(): |
Scott Baker | f640493 | 2014-12-15 16:12:43 -0800 | [diff] [blame] | 211 | #print "XXX1", obj, f, related_name, related_model_name |
Sapan Bhatia | eb62ad6 | 2014-01-28 14:29:08 -0500 | [diff] [blame] | 212 | refobj = self[related_model_name] |
Sapan Bhatia | cdd90b7 | 2014-01-28 20:03:13 -0500 | [diff] [blame] | 213 | cobj = copy.deepcopy(obj) |
| 214 | cobj.multi=True |
| 215 | refobj.refs.append(cobj) |
Scott Baker | 1e67bb4 | 2014-07-03 17:58:10 -0700 | [diff] [blame] | 216 | |
| 217 | # deal with upgradeFrom_rel_+ |
| 218 | if (related_name.endswith("+")): |
| 219 | continue |
| 220 | |
Scott Baker | 57d66aa | 2015-10-23 13:09:49 -0700 | [diff] [blame] | 221 | if (related_name!='+') and related_model_name in self: # and related_name.lower()!=str(obj).lower()): |
Scott Baker | f640493 | 2014-12-15 16:12:43 -0800 | [diff] [blame] | 222 | refobj = self[related_model_name] |
Scott Baker | 57d66aa | 2015-10-23 13:09:49 -0700 | [diff] [blame] | 223 | #print "XXX2", obj, f, related_name, related_model_name, refobj.plural_name |
Scott Baker | f640493 | 2014-12-15 16:12:43 -0800 | [diff] [blame] | 224 | cobj = copy.deepcopy(refobj) |
Sapan Bhatia | be42fba | 2014-01-28 23:53:49 -0500 | [diff] [blame] | 225 | cobj.multi = True |
Sapan Bhatia | b588540 | 2014-01-29 10:32:09 -0500 | [diff] [blame] | 226 | |
Scott Baker | f640493 | 2014-12-15 16:12:43 -0800 | [diff] [blame] | 227 | obj.refs.append(cobj) |
Sapan Bhatia | b588540 | 2014-01-29 10:32:09 -0500 | [diff] [blame] | 228 | |
Scott Baker | 32fbfcf | 2017-02-07 17:00:27 -0800 | [diff] [blame] | 229 | for obj in self.values(): |
| 230 | # generate foreign key reverse references |
| 231 | for f in obj.model._meta.related_objects: |
| 232 | related_model = getattr(f, "related_model", None) |
| 233 | if not f.related_name: |
| 234 | continue |
| 235 | if "+" in f.related_name: |
| 236 | continue |
| 237 | if related_model and (related_model.__name__.lower() in self.keys()): |
| 238 | cobj = copy.deepcopy(self[related_model.__name__.lower()]) |
| 239 | cobj.related_name = f.related_name |
| 240 | obj.reverse_refs.append(cobj) |
| 241 | |
| 242 | |
Scott Baker | 87fb302 | 2017-02-09 09:33:59 -0800 | [diff] [blame] | 243 | def app_has_models(app): |
| 244 | """ check whether 'app' includes XOS models """ |
Sapan Bhatia | be42fba | 2014-01-28 23:53:49 -0500 | [diff] [blame] | 245 | |
Scott Baker | 87fb302 | 2017-02-09 09:33:59 -0800 | [diff] [blame] | 246 | app = app + ".models" |
| 247 | try: |
| 248 | models_module = __import__(app) |
| 249 | except ImportError: |
| 250 | return False |
| 251 | for part in app.split(".")[1:]: |
| 252 | if hasattr(models_module, "PlCoreBase"): |
| 253 | return True |
| 254 | models_module = getattr(models_module,part) |
Sapan Bhatia | eb62ad6 | 2014-01-28 14:29:08 -0500 | [diff] [blame] | 255 | |
Scott Baker | 87fb302 | 2017-02-09 09:33:59 -0800 | [diff] [blame] | 256 | if hasattr(models_module, "PlCoreBase"): |
| 257 | return True |
| 258 | |
| 259 | return False |
Scott Baker | 77f7d6f | 2015-10-23 12:20:15 -0700 | [diff] [blame] | 260 | |
Sapan Bhatia | 3a45f8b | 2014-01-14 21:20:16 -0500 | [diff] [blame] | 261 | def main(): |
Scott Baker | 77f7d6f | 2015-10-23 12:20:15 -0700 | [diff] [blame] | 262 | global options |
| 263 | parser = OptionParser(usage="modelgen [options] <template_fn>", ) |
| 264 | |
Sapan Bhatia | 879e4e4 | 2016-03-04 22:03:07 +0100 | [diff] [blame] | 265 | parser.add_option("-d", "--dict", dest="dict", |
| 266 | help="dictionary to replace text in output", metavar="DICT", default=[], action="append") |
| 267 | |
Scott Baker | 77f7d6f | 2015-10-23 12:20:15 -0700 | [diff] [blame] | 268 | parser.add_option("-a", "--app", dest="apps", |
| 269 | help="list of applications to parse", metavar="APP", default=[], action="append") |
| 270 | parser.add_option("-b", "--blacklist", dest="blacklist", |
| 271 | help="add model name to blacklist", metavar="MODEL", default=["SingletonModel", "PlCoreBase"], action="append") |
Scott Baker | 57d66aa | 2015-10-23 13:09:49 -0700 | [diff] [blame] | 272 | parser.add_option("-n", "--no-rest", dest="norest", |
| 273 | help="do not generate rest api for model", metavar="MODEL", default=["SingletonModel", "PlCoreBase"], action="append") |
Scott Baker | 77f7d6f | 2015-10-23 12:20:15 -0700 | [diff] [blame] | 274 | |
| 275 | (options, args) = parser.parse_args(sys.argv[1:]) |
| 276 | |
Scott Baker | 50f76c9 | 2015-12-31 13:24:55 -0800 | [diff] [blame] | 277 | template_name = os.path.abspath(args[0]) |
| 278 | |
| 279 | # try to make sure we're running from the right place |
| 280 | if (not os.path.exists("core")): |
| 281 | if (os.path.exists("../core")): |
| 282 | os.chdir("..") |
| 283 | elif (os.path.exists("../../core")): |
| 284 | os.chdir("../..") |
| 285 | else: |
| 286 | print >> sys.stderr, "Are you sure you're running modelgen from the root of an XOS installation" |
| 287 | sys.exit(-1) |
Sapan Bhatia | 3a45f8b | 2014-01-14 21:20:16 -0500 | [diff] [blame] | 288 | |
Scott Baker | 87fb302 | 2017-02-09 09:33:59 -0800 | [diff] [blame] | 289 | if not options.apps: |
| 290 | options.apps = ["core"] |
| 291 | |
| 292 | if options.apps == ["*"]: |
| 293 | options.apps = [x for x in settings.INSTALLED_APPS if app_has_models(x)] |
| 294 | |
| 295 | if len(args)!=1: |
| 296 | print 'Usage: modelgen [options] <template_fn>' |
| 297 | exit(1) |
| 298 | |
Sapan Bhatia | 3a45f8b | 2014-01-14 21:20:16 -0500 | [diff] [blame] | 299 | generator = Generator() |
| 300 | |
Scott Baker | 77f7d6f | 2015-10-23 12:20:15 -0700 | [diff] [blame] | 301 | models = enum_classes(options.apps) |
Sapan Bhatia | 3a45f8b | 2014-01-14 21:20:16 -0500 | [diff] [blame] | 302 | |
| 303 | for m in models: |
| 304 | generator.add_object(m) |
| 305 | |
| 306 | generator.compute_links() |
Scott Baker | be53ac1 | 2017-01-04 15:41:10 -0800 | [diff] [blame] | 307 | |
| 308 | os_template_loader = jinja2.FileSystemLoader( searchpath=[os.path.split(template_name)[0]]) |
| 309 | os_template_env = jinja2.Environment(loader=os_template_loader) |
| 310 | |
| 311 | template = os_template_env.get_template(os.path.split(template_name)[1]) |
| 312 | rendered = template.render({"generator": generator}) |
| 313 | |
Sapan Bhatia | 879e4e4 | 2016-03-04 22:03:07 +0100 | [diff] [blame] | 314 | lines = rendered.splitlines() |
| 315 | current_buffer = [] |
| 316 | for l in lines: |
| 317 | if (l.startswith('+++')): |
| 318 | filename = l[4:] |
| 319 | fil = open(filename,'w') |
| 320 | buf = '\n'.join(current_buffer) |
| 321 | |
| 322 | obuf = buf |
| 323 | for d in options.dict: |
| 324 | df = open(d).read() |
| 325 | d = json.loads(df) |
| 326 | |
| 327 | pattern = re.compile(r'\b(' + '|'.join(d.keys()) + r')\b') |
| 328 | obuf = pattern.sub(lambda x: d[x.group()], buf) |
| 329 | fil.write(obuf) |
| 330 | fil.close() |
| 331 | |
| 332 | print 'Written to file %s'%filename |
| 333 | current_buffer = [] |
| 334 | else: |
| 335 | current_buffer.append(l) |
| 336 | if (current_buffer): |
| 337 | print '\n'.join(current_buffer) |
Sapan Bhatia | 3a45f8b | 2014-01-14 21:20:16 -0500 | [diff] [blame] | 338 | |
| 339 | |
| 340 | if (__name__=='__main__'): |
| 341 | main() |