Browse Source

Changed the way LeFactory generates python code

Added a test on LeFactory generated code
Yann Weber 9 years ago
parent
commit
589d7f2eef
3 changed files with 95 additions and 80 deletions
  1. 92
    76
      leobject/lefactory.py
  2. 3
    3
      leobject/letype.py
  3. 0
    1
      leobject/test/test_leobject.py

+ 92
- 76
leobject/lefactory.py View File

@@ -40,10 +40,68 @@ class LeFactory(object):
40 40
     def fieldtype_construct_from_field(emfield):    
41 41
         return '%s.EmFieldType(**%s)'%(
42 42
             GenericFieldType.module_name(emfield.fieldtype),
43
-            emfield._fieldtype_args.__repr__(),
43
+            repr(emfield._fieldtype_args),
44 44
         )
45
-            
45
+
46
+    ## @brief Given a Model and an EmClass instances generate python code for corresponding LeClass
47
+    # @param model Model : A Model instance
48
+    # @param emclass EmClass : An EmClass instance from model
49
+    # @return A string representing the python code for the corresponding LeClass child class
50
+    @staticmethod
51
+    def emclass_pycode(model, emclass):
52
+        cls_fields = dict()
53
+        cls_linked_types = list()
54
+        for field in emclass.fields():
55
+            cls_fields[field.name] = LeFactory.fieldtype_construct_from_field(field)
56
+            fti = field.fieldtype_instance()
57
+            if fti.name == 'rel2type':
58
+                #relationnal field/fieldtype
59
+                cls_linked_types.append(LeFactory.name2classname(model.component(fti.rel_to_type_id).name))
60
+        cls_fieldgroup = dict()
61
+        for fieldgroup in emclass.fieldgroups():
62
+            cls_fieldgroup[fieldgroup.name] = list()
63
+            for field in fieldgroup.fields():
64
+                cls_fieldgroup[fieldgroup.name].append(field.name)
46 65
         
66
+        return """
67
+{name}._fildtypes = {ftypes}
68
+{name}._linked_types = {ltypes}
69
+{name}._fieldgroups = {fgroups}
70
+""".format(
71
+    name = LeFactory.name2classname(emclass.name),
72
+    ftypes = repr(cls_fields),
73
+    ltypes = "{"+(','.join(cls_linked_types))+'}',
74
+    fgroups = repr(cls_fieldgroup)
75
+)
76
+
77
+    ## @brief Given a Model and an EmType instances generate python code for corresponding LeType
78
+    # @param model Model : A Model instance
79
+    # @param emtype EmType : An EmType instance from model
80
+    # @return A string representing the python code for the corresponding LeType child class
81
+    @staticmethod
82
+    def emtype_pycode(model, emtype):
83
+        type_fields = list()
84
+        type_superiors = list()
85
+        for field in emtype.fields():
86
+            type_fields.append(field.name)
87
+
88
+        for nat, sup_l in emtype.superiors().items():
89
+            type_superiors.append('%s:[%s]'%(
90
+                repr(nat),
91
+                ','.join([ LeFactory.name2classname(sup.name) for sup in sup_l])
92
+            ))
93
+
94
+        return """
95
+{name}._fields = {fields}
96
+{name}._superiors = {dsups}
97
+{name}._leClass = {leclass}
98
+""".format(
99
+    name = LeFactory.name2classname(emtype.name),
100
+    fields = repr(type_fields),
101
+    dsups = '{'+(','.join(type_superiors))+'}',
102
+    leclass = LeFactory.name2classname(emtype.em_class.name)
103
+)
104
+
47 105
     ## @brief Generate python code containing the LeObject API
48 106
     # @param model_args dict : Dict of Model __init__ method arguments
49 107
     # @param datasource_args dict : Dict of datasource __init__ method arguments
@@ -53,89 +111,47 @@ class LeFactory(object):
53 111
         model = Model(backend=backend_cls(**backend_args))
54 112
 
55 113
         result = ""
56
-        result += "#-*- coding: utf-8 -*-\n"
114
+        #result += "#-*- coding: utf-8 -*-\n"
57 115
         #Putting import directives in result
58
-        result += "\n\n\
59
-from EditorialModel.model import Model\n\
60
-from leobject.leobject import _LeObject\n\
61
-from leobject.leclass import LeClass\n\
62
-from leobject.letype import LeType\n\
63
-import EditorialModel.fieldtypes\n\
64
-"
65
-
66
-        result += "\n\
67
-import %s\n\
68
-import %s\n\
69
-"%(backend_cls.__module__, datasource_cls.__module__)
116
+        result += """
117
+
118
+from EditorialModel.model import Model
119
+from leobject.leobject import _LeObject
120
+from leobject.leclass import LeClass
121
+from leobject.letype import LeType
122
+import EditorialModel.fieldtypes
123
+"""
124
+
125
+        result += """
126
+import %s
127
+import %s
128
+"""%(backend_cls.__module__, datasource_cls.__module__)
70 129
 
71 130
         #Generating the code for LeObject class
72
-        backend_constructor = '%s.%s(**%s)'%(backend_cls.__module__, backend_cls.__name__, backend_args.__repr__())
131
+        backend_constructor = '%s.%s(**%s)'%(backend_cls.__module__, backend_cls.__name__, repr(backend_args))
73 132
         leobj_me_uid = dict()
74 133
         for comp in model.components('EmType') + model.components('EmClass'):
75 134
             leobj_me_uid[comp.uid] = LeFactory.name2classname(comp.name)
76 135
 
77
-        result += "\n\
78
-class LeObject(_LeObject):\n\
79
-    _model = Model(backend=%s)\n\
80
-    _datasource = %s(**%s)\n\
81
-    _me_uid = %s\n\
82
-\n\
83
-"%(backend_constructor, datasource_cls.__name__, datasource_args.__repr__(), leobj_me_uid.__repr__())
136
+        result += """
137
+class LeObject(_LeObject):
138
+    _model = Model(backend=%s)
139
+    _datasource = %s(**%s)
140
+    _me_uid = %s
141
+
142
+"""%(backend_constructor, datasource_cls.__name__, repr(datasource_args), repr(leobj_me_uid))
84 143
         
144
+        #LeClass and LeType child classes definition
85 145
         for emclass in model.components(EditorialModel.classes.EmClass):
86
-            cls_fields = dict()
87
-            cls_linked_types = list()
88
-            for field in emclass.fields():
89
-                cls_fields[field.name] = LeFactory.fieldtype_construct_from_field(field)
90
-                fti = field.fieldtype_instance()
91
-                if fti.name == 'rel2type':
92
-                    #relationnal field/fieldtype
93
-                    cls_linked_types.append(LeFactory.name2classname(model.component(fti.rel_to_type_id).name))
94
-            cls_fieldgroup = dict()
95
-            for fieldgroup in emclass.fieldgroups():
96
-                cls_fieldgroup[fieldgroup.name] = list()
97
-                for field in fieldgroup.fields():
98
-                    cls_fieldgroup[fieldgroup.name].append(field.name)
99
-
100
-            result += "\n\
101
-class %s(LeObject, LeClass):\n\
102
-    _fieldtypes = %s\n\
103
-    _linked_types = [%s]\n\
104
-    _fieldgroups = %s\n\
105
-\n\
106
-"%(
107
-    LeFactory.name2classname(emclass.name),
108
-    cls_fields.__repr__(),
109
-    ','.join(cls_linked_types),
110
-    cls_fieldgroup.__repr__()
111
-)
112
-
146
+           result += 'class %s(LeObject,LeType): pass\n'%(LeFactory.name2classname(emclass.name))
113 147
         for emtype in model.components(EditorialModel.types.EmType):
114
-            type_fields = list()
115
-            type_superiors = list()
116
-            for field in emtype.fields():
117
-                type_fields.append(field.name)
118
-
119
-            for nat, sup_l in emtype.superiors().items():
120
-                type_superiors.append('%s:[%s]'%(
121
-                    nat.__repr__(),
122
-                    ','.join([ LeFactory.name2classname(sup.name) for sup in sup_l])
123
-                ))
124
-
125
-
126
-            result += "\n\
127
-class %s(%s,LeType):\n\
128
-    _fields = %s\n\
129
-    _superiors = {%s}\n\
130
-    _leClass = %s\n\
131
-\n\
132
-"%(
133
-    LeFactory.name2classname(emtype.name),
134
-    LeFactory.name2classname(emtype.em_class.name),
135
-    type_fields.__repr__(),
136
-    ','.join(type_superiors),
137
-    LeFactory.name2classname(emtype.em_class.name)
138
-)
139
-
148
+           result += 'class %s(%s,LeType): pass\n'%(LeFactory.name2classname(emtype.name),LeFactory.name2classname(emtype.em_class.name),)
149
+            
150
+        #Set attributes of created LeClass and LeType child classes
151
+        for emclass in model.components(EditorialModel.classes.EmClass):
152
+            result += LeFactory.emclass_pycode(model, emclass)
153
+        for emtype in model.components(EditorialModel.types.EmType):
154
+            result += LeFactory.emtype_pycode(model, emtype)
155
+            
140 156
         return result
141 157
 

+ 3
- 3
leobject/letype.py View File

@@ -26,7 +26,7 @@ class LeType(object):
26 26
         ## Populate the object from the datas received in kwargs
27 27
         for name, value in kwargs.items():
28 28
             if name not in self._fields:
29
-                raise AttributeError("No such field '%s' for %s"%(name, self.__class__.__name__)
29
+                raise AttributeError("No such field '%s' for %s"%(name, self.__class__.__name__))
30 30
             setattr(self, name, value)
31 31
 
32 32
     ## @brief Delete the LeType from Db
@@ -77,9 +77,9 @@ class LeType(object):
77 77
         autom_fields = [f.name for f in cls._fieldtypes if f.internal]
78 78
         for dname, dval in datas.items():
79 79
             if dname in autom_fields:
80
-                raise AttributeError("The field '%s' is internal"%(dname)
80
+                raise AttributeError("The field '%s' is internal"%(dname))
81 81
             if dname not in cls._fields:
82
-                raise AttributeError("No such field '%s' for %s"%(dname, self.__class__.__name__)
82
+                raise AttributeError("No such field '%s' for %s"%(dname, self.__class__.__name__))
83 83
             cls._fieldtypess[dname].check_or_raise(dval)
84 84
         
85 85
         fields = [f.name for f in cls._fieldtypes if not f.internal]

+ 0
- 1
leobject/test/test_leobject.py View File

@@ -2,7 +2,6 @@
2 2
     Tests for _LeObject
3 3
 """
4 4
 
5
-import os
6 5
 import unittest
7 6
 from unittest import TestCase
8 7
 

Loading…
Cancel
Save