xamplr 1.3.15 → 1.9.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (163) hide show
  1. data/.gitignore +1 -0
  2. data/COPYING +160 -656
  3. data/LICENSE +1 -1
  4. data/README.md +33 -0
  5. data/Rakefile +2 -2
  6. data/VERSION.yml +2 -2
  7. data/lib/xamplr.rb +1 -0
  8. data/lib/xamplr/iterator.rb +123 -0
  9. data/lib/xamplr/xml-text.rb +5 -5
  10. data/xamplr.gemspec +9 -204
  11. metadata +13 -203
  12. data/README.rdoc +0 -46
  13. data/README.rdoc.orig +0 -118
  14. data/bin/xampl-gen +0 -17
  15. data/docs/intro/.gitignore +0 -1
  16. data/docs/intro/example1/example1.rb +0 -6
  17. data/docs/intro/example1/xml/hello.xml +0 -1
  18. data/docs/intro/example2/example2.rb +0 -38
  19. data/docs/intro/example2/project-generator.rb +0 -22
  20. data/docs/intro/example2/xml/hello.xml +0 -2
  21. data/docs/intro/example3/example3.rb +0 -30
  22. data/docs/intro/example3/example3a.rb +0 -16
  23. data/docs/intro/example3/generated.png +0 -0
  24. data/docs/intro/example3/grab-yuml.rb +0 -10
  25. data/docs/intro/example3/greeter.rb +0 -15
  26. data/docs/intro/example3/greeting.rb +0 -9
  27. data/docs/intro/example3/project-generator.rb +0 -25
  28. data/docs/intro/example3/xml/greeter.xml +0 -6
  29. data/docs/intro/example4/example4.rb +0 -27
  30. data/docs/intro/example4/example4a.rb +0 -19
  31. data/docs/intro/example4/grab-yuml.rb +0 -10
  32. data/docs/intro/example4/greeter.rb +0 -15
  33. data/docs/intro/example4/greeting.rb +0 -9
  34. data/docs/intro/example4/project-generator.rb +0 -25
  35. data/docs/intro/example4/xml/greeter.xml +0 -6
  36. data/docs/intro/grab-yuml.rb +0 -10
  37. data/docs/intro/project-generator.rb +0 -51
  38. data/docs/intro/xampl.lyx +0 -1494
  39. data/docs/intro/xampl.pdf +0 -0
  40. data/examples/employees/final-xampl/xampl-gen.rb +0 -38
  41. data/examples/employees/final-xampl/xml/ddd-final-xampl.xml +0 -86
  42. data/examples/employees/final/xampl-gen.rb +0 -38
  43. data/examples/employees/final/xml/ddd-final.xml +0 -86
  44. data/examples/employees/first/xampl-gen.rb +0 -38
  45. data/examples/employees/first/xml/ddd-first.xml +0 -48
  46. data/examples/employees/twist/twist.graphml +0 -333
  47. data/examples/employees/twist/xampl-gen.rb +0 -38
  48. data/examples/employees/twist/xml/twist.xml +0 -90
  49. data/examples/employees/xamplr-twist.xml +0 -2
  50. data/examples/employees/yuml-diagrams/DDD-final-approach.graphml +0 -393
  51. data/examples/employees/yuml-diagrams/DDD-final-xampl-approach.graphml +0 -265
  52. data/examples/employees/yuml-diagrams/DDD-ideal-final-approach.graphml +0 -357
  53. data/examples/employees/yuml-diagrams/ddd-final.png +0 -0
  54. data/examples/employees/yuml-diagrams/ddd-final.yuml +0 -8
  55. data/examples/employees/yuml-diagrams/ddd-first.png +0 -0
  56. data/examples/employees/yuml-diagrams/ddd-first.yuml +0 -7
  57. data/examples/employees/yuml-diagrams/final-yed.png +0 -0
  58. data/examples/employees/yuml-diagrams/first-yed.png +0 -0
  59. data/examples/employees/yuml-diagrams/twist.png +0 -0
  60. data/examples/employees/yuml-diagrams/twist.yuml +0 -12
  61. data/examples/employees/yuml-diagrams/xamplr-final-no-mixins.png +0 -0
  62. data/examples/employees/yuml-diagrams/xamplr-final-simplified.png +0 -0
  63. data/examples/employees/yuml-diagrams/xamplr-final-with-mixins.png +0 -0
  64. data/examples/employees/yuml-diagrams/yuml-simplified.txt +0 -19
  65. data/examples/employees/yuml-diagrams/yuml-with-mixins.txt +0 -53
  66. data/examples/employees/yuml-diagrams/yuml.txt +0 -27
  67. data/examples/hobbies/Makefile +0 -5
  68. data/examples/hobbies/hobbies.rb +0 -193
  69. data/examples/hobbies/project-generator.rb +0 -25
  70. data/examples/hobbies/xampl-gen.rb +0 -38
  71. data/examples/hobbies/xml/hobby.xml +0 -3
  72. data/examples/hobbies/xml/people.xml +0 -5
  73. data/examples/random-people-shared-addresses/.gitignore +0 -2
  74. data/examples/random-people-shared-addresses/Makefile +0 -15
  75. data/examples/random-people-shared-addresses/batch-load-users-profiled.rb +0 -91
  76. data/examples/random-people-shared-addresses/batch-load-users-safe.rb +0 -81
  77. data/examples/random-people-shared-addresses/batch-load-users.rb +0 -79
  78. data/examples/random-people-shared-addresses/find-mentions.rb +0 -47
  79. data/examples/random-people-shared-addresses/find-people-by-address.rb +0 -104
  80. data/examples/random-people-shared-addresses/optimise.rb +0 -16
  81. data/examples/random-people-shared-addresses/people.rb +0 -35
  82. data/examples/random-people-shared-addresses/query.rb +0 -75
  83. data/examples/random-people-shared-addresses/query2.rb +0 -73
  84. data/examples/random-people-shared-addresses/random-names.csv +0 -10000
  85. data/examples/random-people-shared-addresses/settings.rb +0 -3
  86. data/examples/random-people-shared-addresses/what-to-query-on.rb +0 -82
  87. data/examples/random-people-shared-addresses/xampl-gen.rb +0 -38
  88. data/examples/random-people-shared-addresses/xml/people.xml +0 -14
  89. data/examples/random-people/.gitignore +0 -2
  90. data/examples/random-people/Makefile +0 -20
  91. data/examples/random-people/batch-load-users.rb +0 -61
  92. data/examples/random-people/optimise.rb +0 -16
  93. data/examples/random-people/people.rb +0 -22
  94. data/examples/random-people/query.rb +0 -73
  95. data/examples/random-people/query2.rb +0 -73
  96. data/examples/random-people/random-names.csv +0 -10000
  97. data/examples/random-people/rawtc.rb +0 -91
  98. data/examples/random-people/settings.rb +0 -3
  99. data/examples/random-people/what-to-query-on.rb +0 -80
  100. data/examples/random-people/xampl-gen.rb +0 -39
  101. data/examples/random-people/xml/people.xml +0 -11
  102. data/examples/read-testing/.gitignore +0 -2
  103. data/examples/read-testing/Makefile +0 -10
  104. data/examples/read-testing/load.rb +0 -65
  105. data/examples/read-testing/read.rb +0 -51
  106. data/examples/read-testing/rrr.rb +0 -88
  107. data/examples/read-testing/settings.rb +0 -2
  108. data/examples/read-testing/xampl-gen.rb +0 -38
  109. data/examples/read-testing/xml/text.xml +0 -8
  110. data/examples/tokyo-cabinet-experimental/.gitignore +0 -2
  111. data/examples/tokyo-cabinet-experimental/expt-query.rb +0 -42
  112. data/examples/tokyo-cabinet-experimental/expt-query2.rb +0 -42
  113. data/examples/tokyo-cabinet-experimental/expt-query3.rb +0 -41
  114. data/examples/tokyo-cabinet-experimental/expt-reader.rb +0 -32
  115. data/examples/tokyo-cabinet-experimental/expt.rb +0 -61
  116. data/examples/tokyo-cabinet-experimental/xampl-gen.rb +0 -38
  117. data/examples/tokyo-cabinet-experimental/xml/tcx.xml +0 -6
  118. data/examples/write-testing/README +0 -4
  119. data/examples/write-testing/RESULTS.home +0 -33
  120. data/examples/write-testing/RESULTS.raconteur +0 -33
  121. data/examples/write-testing/write-speed-test.rb +0 -40
  122. data/lib/xampl-generator.rb +0 -3
  123. data/lib/xamplr-generator.rb +0 -9
  124. data/lib/xamplr/gen-elements.xml +0 -6230
  125. data/lib/xamplr/gen.elements.xml +0 -108
  126. data/lib/xamplr/generate-elements.rb +0 -15
  127. data/lib/xamplr/generator.rb +0 -5
  128. data/lib/xamplr/graphml-out.rb +0 -451
  129. data/lib/xamplr/handwritten/example.rb +0 -698
  130. data/lib/xamplr/handwritten/hand-example.rb +0 -533
  131. data/lib/xamplr/handwritten/test-handwritten.rb +0 -873
  132. data/lib/xamplr/my.gen.elements.xml +0 -461
  133. data/lib/xamplr/obsolete/fsdb.rb +0 -62
  134. data/lib/xamplr/simpleTemplate/danger.rx +0 -4
  135. data/lib/xamplr/simpleTemplate/obsolete/input-c.r4 +0 -35
  136. data/lib/xamplr/simpleTemplate/obsolete/play.r6.txt +0 -12
  137. data/lib/xamplr/simpleTemplate/obsolete/play_more.r6.txt +0 -20
  138. data/lib/xamplr/simpleTemplate/obsolete/test001.r5 +0 -8
  139. data/lib/xamplr/simpleTemplate/obsolete/test002.r5 +0 -13
  140. data/lib/xamplr/simpleTemplate/obsolete/test003.r5 +0 -37
  141. data/lib/xamplr/simpleTemplate/old/r6.000.rb +0 -122
  142. data/lib/xamplr/simpleTemplate/old/r6.001.rb +0 -145
  143. data/lib/xamplr/simpleTemplate/play.r6 +0 -12
  144. data/lib/xamplr/simpleTemplate/play_more.r6 +0 -20
  145. data/lib/xamplr/simpleTemplate/play_noblanks.r6 +0 -21
  146. data/lib/xamplr/simpleTemplate/playq.r6 +0 -16
  147. data/lib/xamplr/simpleTemplate/r6.rb +0 -87
  148. data/lib/xamplr/simpleTemplate/simple-template.rb +0 -75
  149. data/lib/xamplr/templates/.cvsignore +0 -3
  150. data/lib/xamplr/templates/child.template +0 -47
  151. data/lib/xamplr/templates/child_indexed.template +0 -89
  152. data/lib/xamplr/templates/child_modules.template +0 -5
  153. data/lib/xamplr/templates/element_classes.template +0 -11
  154. data/lib/xamplr/templates/element_data.template +0 -283
  155. data/lib/xamplr/templates/element_empty.template +0 -277
  156. data/lib/xamplr/templates/element_mixed.template +0 -278
  157. data/lib/xamplr/templates/element_simple.template +0 -277
  158. data/lib/xamplr/templates/package.template +0 -38
  159. data/lib/xamplr/xampl-cl-gen.rb +0 -89
  160. data/lib/xamplr/xampl-generator.rb +0 -569
  161. data/lib/xamplr/xampl-hand-generated.rb +0 -1535
  162. data/lib/xamplr/yEd-sample.graphml +0 -300
  163. data/lib/xamplr/yuml-out.rb +0 -129
@@ -1,277 +0,0 @@
1
-
2
- class #{@element.class_name}
3
- |
4
- |if @element.persisted then
5
- |
6
- include Xampl::XamplPersistedObject
7
-
8
- #supports class based over-ride of persister format
9
- @@default_persister_format = nil
10
-
11
- def default_persister_format
12
- @@default_persister_format
13
- end
14
- def #{@element.class_name}.default_persister_format
15
- @@default_persister_format
16
- end
17
- def #{@element.class_name}.set_default_persister_format(format)
18
- @@default_persister_format = format
19
- end
20
-
21
- def #{@element.class_name}.find_by_query
22
- things = Xampl.find_xampl do | q |
23
- q.add_condition('class', :equals, self.name)
24
- yield(q)
25
- end
26
- end
27
-
28
- |
29
- |else
30
- |
31
- include Xampl::XamplObject
32
- |
33
- |end
34
- |
35
- include Xampl::XamplWithSimpleContent
36
-
37
- @@tag = "#{@element.name}"
38
- @@ns = "#{@element.namespace}"
39
- @@ns_tag = "{#{@element.namespace}}#{@element.name}"
40
- @@module_name = "#{@package_name}"
41
- @@safe_name = "#{@package_name}_#{@element.attribute_name}"
42
- @@attributes = [
43
- |
44
- |@element.attribute_child.each{ | attribute |
45
- | if attribute.namespace then
46
- |
47
- [ :@#{attribute.name}, "#{attribute.name}", "#{attribute.namespace}" ],
48
- |
49
- | else
50
- |
51
- [ :@#{attribute.name}, "#{attribute.name}" ],
52
- |
53
- | end
54
- |}
55
- |
56
- ]
57
- |
58
- |@element.child_element_child.each{ | child_element |
59
- | element_class_name = @lookup_element[child_element.name].class_name
60
- | element_package = @lookup_element[child_element.name].package
61
- |
62
- include #{element_package}::#{element_class_name}AsChild
63
- |
64
- |}
65
- |
66
- |if @element.persisted then
67
- |
68
-
69
- def #{@element.class_name}.lookup(pid)
70
- Xampl.lookup(#{@element.class_name}, pid)
71
- end
72
-
73
- def #{@element.class_name}.[](pid)
74
- Xampl.lookup(#{@element.class_name}, pid)
75
- end
76
- |
77
- |end
78
- |
79
- |@element.attribute_child.each{ | attribute |
80
- | if attribute.name == @element.indexed_by_attr and @element.persisted then
81
- |
82
-
83
- def #{attribute.name}
84
- @#{attribute.name}
85
- end
86
-
87
- def #{attribute.name}=(v)
88
- accessed
89
- # This is kind of optimistic, I think you are in trouble if you do this
90
- Xampl.auto_uncache(self) if @#{attribute.name}
91
- @#{attribute.name} = v
92
- changed
93
- Xampl.auto_cache(self) if v
94
- end
95
- |
96
- | else
97
- |
98
-
99
- def #{attribute.name}
100
- accessed
101
- @#{attribute.name}
102
- end
103
-
104
- def #{attribute.name}=(v)
105
- accessed
106
- changed
107
- @#{attribute.name} = v
108
- end
109
- |
110
- | end
111
- |}
112
- |
113
- | if @element.indexed_by_attr then
114
- |
115
-
116
- def initialize(index=nil)
117
- @#{@element.indexed_by_attr} = index if index
118
- super()
119
- |
120
- | else
121
- |
122
-
123
- def initialize
124
- super
125
- |
126
- |end
127
- |
128
- |if 0 < @element.attribute_child.size then
129
- |
130
-
131
- |
132
- |end
133
- |
134
- |@element.attribute_child.each{ | attribute |
135
- |
136
- @#{attribute.name} = nil if not defined? @#{attribute.name}
137
- |
138
- |}
139
- |
140
-
141
- init_xampl_object
142
- |
143
- |@element.child_element_child.each{ | child_element |
144
- | element_attribute_name = @lookup_element[child_element.name].attribute_name
145
- |
146
- init_#{child_element.element_attribute_name}_as_child
147
- |
148
- |}
149
- |
150
-
151
- yield(self) if block_given?
152
- init_hook
153
-
154
- changed
155
- end
156
-
157
- def clear_non_persistent_index_attributes
158
- |
159
- |@element.attribute_child.each{ | attribute |
160
- | unless attribute.name == @element.indexed_by_attr and @element.persisted then
161
- |
162
- @#{attribute.name} = nil
163
- |
164
- | end
165
- |}
166
- |
167
- end
168
-
169
- def append_to(other)
170
- other.add_#{@element.attribute_name}(self)
171
- end
172
-
173
- |
174
- |if @element.persisted then
175
- |
176
- def #{@element.class_name}.persisted?
177
- return :#{@element.indexed_by_attr}
178
- end
179
-
180
- def persisted?
181
- return :#{@element.indexed_by_attr}
182
- end
183
-
184
- |
185
- |else
186
- |
187
- def #{@element.class_name}.persisted?
188
- return nil
189
- end
190
-
191
- def persisted?
192
- return nil
193
- end
194
-
195
- |
196
- |end
197
- |
198
- def #{@element.class_name}.tag
199
- @@tag
200
- end
201
-
202
- def #{@element.class_name}.ns
203
- @@ns
204
- end
205
-
206
- def #{@element.class_name}.ns_tag
207
- @@ns_tag
208
- end
209
-
210
- def #{@element.class_name}.safe_name
211
- @@safe_name
212
- end
213
-
214
- def #{@element.class_name}.module_name
215
- @@module_name
216
- end
217
-
218
- def tag
219
- @@tag
220
- end
221
-
222
- def ns
223
- @@ns
224
- end
225
-
226
- def ns_tag
227
- @@ns_tag
228
- end
229
-
230
- def safe_name
231
- @@safe_name
232
- end
233
-
234
- def module_name
235
- @@module_name
236
- end
237
-
238
- def attributes
239
- @@attributes
240
- end
241
- |
242
- |if @element.indexed_by_attr
243
- |
244
-
245
- def indexed_by
246
- :#{@element.indexed_by_attr}
247
- end
248
-
249
- def get_the_index
250
- @#{@element.indexed_by_attr}
251
- end
252
-
253
- def set_the_index(index)
254
- @#{@element.indexed_by_attr} = index
255
- end
256
- |
257
- |end
258
- |
259
-
260
- def substitute_in_visit(visitor)
261
- return visitor.substitute_in_visit_#{@element.attribute_name}(self) || self
262
- end
263
-
264
- def before_visit(visitor)
265
- visitor.before_visit_#{@element.attribute_name}(self)
266
- end
267
-
268
- def visit(visitor)
269
- visitor.visit_#{@element.attribute_name}(self)
270
- end
271
-
272
- def after_visit(visitor)
273
- visitor.after_visit_#{@element.attribute_name}(self)
274
- end
275
-
276
- Xampl::FromXML::register(#{@element.class_name}::tag, #{@element.class_name}::ns_tag, #{@element.class_name})
277
- end
@@ -1,38 +0,0 @@
1
- |
2
- | unless 'XamplAdHoc' == package_name
3
- |
4
- module #{package_name}
5
- |
6
- | end
7
- |
8
-
9
- require "xamplr"
10
- include Xampl
11
-
12
- |
13
- | @required_packages.each_key{ | required_package_name |
14
- |
15
- require "#{required_package_name}"
16
- |
17
- | }
18
- |
19
-
20
- |
21
- | if @options then
22
- | @options.resolve_child.each{ | r |
23
- | if r.namespace and (0 < r.namespace.length) and r.preferred_prefix and (0 < r.preferred_prefix.length) then
24
- |
25
- XamplObject.ns_preferred_prefix("#{r.namespace}", "#{r.preferred_prefix}")
26
- |
27
- | end
28
- | }
29
- | end
30
- |
31
- #{place}
32
- |
33
- | unless 'XamplAdHoc' == package_name
34
- |
35
- end
36
- |
37
- | end
38
- |
@@ -1,89 +0,0 @@
1
-
2
- require 'xamplr-generator'
3
-
4
- include XamplGenerator
5
- include Xampl
6
-
7
- class ProjectGenerator
8
-
9
- def directory
10
- File.join(%w{ . xampl_generated_code })
11
- end
12
-
13
- def filenames
14
- Dir.glob("./xml/**/*.xml")
15
- end
16
-
17
- def print_base_filename
18
- File.join(%w{ . generated })
19
- end
20
-
21
- def print_options
22
- # return an array containing any (or none) of:
23
- # :schema -- a schema-like xml representation of the generated code
24
- # :graphml -- a graphml file describing the class model (compatible with yEd)
25
- # :yuml -- a yuml file that represents a simplified class model (compatible with yUML)
26
-
27
- # [:schema, :graphml, :yuml]
28
- []
29
- end
30
-
31
- def print
32
- nil
33
- end
34
-
35
- def persisted_attributes
36
- %w{ pid }
37
- end
38
-
39
- def indexed_attributes
40
- %w{ id }
41
- end
42
-
43
- def resolve_namespaces
44
- # any array of arrays
45
- # each sub-array:
46
- # 0: a string or an array of strings, containing xml namespaces found in the example xml files
47
- # an empty string is the default namespace
48
- # 1: a ruby Module name (get the cases right)
49
- # 2: a namespace prefix used when writing xml, optional. A generated prefix will be used otherwise.
50
- []
51
- end
52
-
53
- def generate
54
-
55
- # Xampl.set_default_persister_kind(:simple)
56
- Xampl.set_default_persister_kind(:in_memory)
57
- # Xampl.set_default_persister_kind(:filesystem)
58
- # Xampl.set_default_persister_kind(:tokyo_cabinet)
59
- # Xampl.set_default_persister_format(:xml_format)
60
-
61
- Xampl.transaction("project-generation") do
62
-
63
- options = Options.new do | opts |
64
- persisted_attributes.each do | pattr |
65
- opts.new_index_attribute(pattr).persisted = true
66
- end
67
-
68
- indexed_attributes.each do | iattr |
69
- opts.new_index_attribute(iattr)
70
- end
71
-
72
- resolve_namespaces.each do | namespace, ruby_module_name, output_ns_prefix |
73
- opts.resolve(namespace, ruby_module_name, output_ns_prefix)
74
- end
75
-
76
- end
77
-
78
- generator = Generator.new('generator')
79
- generator.go(:options => options,
80
- :filenames => filenames,
81
- :directory => directory)
82
-
83
- puts generator.print_elements(print_base_filename, print_options)
84
-
85
- Xampl.rollback
86
- end
87
- end
88
- end
89
-
@@ -1,569 +0,0 @@
1
- require 'fileutils'
2
- require 'getoptlong'
3
- require 'set'
4
-
5
- module XamplGenerator
6
- require "xamplr"
7
- require "xamplr/xampl-hand-generated"
8
- require "xamplr/simpleTemplate/simple-template"
9
- require "xamplr/graphml-out.rb"
10
- require "xamplr/yuml-out.rb"
11
-
12
- class Attribute
13
- attr_accessor :tag_name
14
- end
15
-
16
- class StandardGeneratorTemplates
17
- include TemplateEngine
18
-
19
- attr_accessor :element, :package_name, :place, :lookup_element, :options, :required_packages
20
-
21
- def initialize
22
- super
23
- @element = nil
24
- @package_name = nil
25
- @place = nil
26
- @lookup_element = {}
27
- @options = nil
28
- @required_packages = {}
29
- end
30
- end
31
-
32
- class Generator
33
-
34
- attr_accessor :elements_map, :options, :templates
35
-
36
- @@standard_templates = [
37
- "xamplr/templates/child_modules.template",
38
- "xamplr/templates/child.template",
39
- "xamplr/templates/child_indexed.template",
40
- "xamplr/templates/element_classes.template",
41
- "xamplr/templates/element_data.template",
42
- "xamplr/templates/element_empty.template",
43
- "xamplr/templates/element_mixed.template",
44
- "xamplr/templates/element_simple.template",
45
- "xamplr/templates/package.template",
46
- ]
47
-
48
- def initialize(options_in = nil, *predefined_elements)
49
- @elements_map = {}
50
- @xpp = nil
51
- @templates = nil
52
- @generated_package_map = nil
53
-
54
- if options_in then
55
- @options = options_in
56
- else
57
- @options = Xampl.make(Options) do |options|
58
- options.new_index_attribute("id")
59
- options.new_index_attribute("pid").persisted = true;
60
-
61
- options.new_resolve do |resolver|
62
- resolver.pkg = "XamplAdHoc"
63
- resolver.namespace=""
64
- end
65
- end
66
- end
67
-
68
- predefined_elements.each do |elements|
69
- throw :elements_need_a_pid unless elements.pid
70
- @elements_map[elements.pid] = elements
71
- end
72
- end
73
-
74
- def start_element(parent)
75
- name = @xpp.name
76
- namespace = @xpp.namespace
77
- namespace = "" unless namespace
78
- is_empty = @xpp.emptyElement
79
-
80
- nstag = "{{#{namespace}}}#{name}"
81
-
82
- elements = @elements_map[namespace]
83
- if nil == elements then
84
- elements = Elements.new
85
- @elements_map[namespace] = elements
86
- end
87
-
88
- element = elements.element_child[name]
89
- if nil == element then
90
- element = elements.new_element(name)
91
- end
92
-
93
- element.namespace = namespace
94
- element.nstag = nstag
95
- element.empty = is_empty
96
-
97
- @xpp.attributeName.each_index do |i|
98
- attribute = Attribute.new
99
- attribute.name = @xpp.attributeName[i]
100
- attribute.namespace = @xpp.attributeNamespace[i]
101
- element.add_attribute(attribute)
102
- end
103
-
104
- if parent then
105
- parent.new_child_element(nstag) do |ce|
106
- ce.element_name = name
107
- ce.namespace = namespace
108
- end
109
- end
110
- return element
111
- end
112
-
113
- def parse_filename(filename)
114
- @xpp = Xampl_PP.new
115
- @xpp.input = File.new(filename)
116
- parse
117
- end
118
-
119
- def parse_string(string)
120
- @xpp = Xampl_PP.new
121
- @xpp.input = string
122
- parse
123
- end
124
-
125
- def parse
126
- element_stack = []
127
- current_element = nil
128
-
129
- while not @xpp.endDocument? do
130
- case @xpp.nextEvent
131
- when Xampl_PP::START_ELEMENT
132
- element_stack.push current_element unless nil == current_element
133
- current_element = start_element(current_element)
134
- when Xampl_PP::END_ELEMENT
135
- current_element = element_stack.pop
136
- when Xampl_PP::TEXT,
137
- Xampl_PP::CDATA_SECTION,
138
- Xampl_PP::ENTITY_REF
139
- if current_element then
140
- text = @xpp.text
141
- if (nil != @xpp.text) then
142
- text = text.strip
143
- current_element.found_text_content if 0 < text.size
144
- end
145
- end
146
- end
147
- end
148
- end
149
-
150
- def comprehend_from_files(filenames)
151
- filenames.each do |filename|
152
- puts "comprehend file #{filename}"
153
- parse_filename(filename)
154
- end
155
- end
156
-
157
- def comprehend_from_strings(strings)
158
- strings.each do |string|
159
- parse_string(string)
160
- end
161
- end
162
-
163
- def analyse
164
- namespace_package_map = {}
165
- namespace_prefix_map = {}
166
- options.resolve_child.each do |resolve|
167
- namespace_package_map[resolve.namespace] = resolve.pkg
168
- end
169
-
170
- @elements_map.each do |ns, elements|
171
- package = namespace_package_map[ns]
172
-
173
- elements.element_child.each do |element|
174
- element.package = package
175
- element.analyse(options)
176
- end
177
- end
178
-
179
- @required_packages = {}
180
- @elements_map.each do |ns, elements|
181
- package = namespace_package_map[ns]
182
-
183
- required = @required_packages[package]
184
- unless required then
185
- required = {}
186
- @required_packages[package] = required
187
- end
188
-
189
- elements.element_child.each do |element|
190
- element.child_element_child.each do |child_element|
191
- celement = child_element.find_element(@elements_map)
192
- #required[celement.package] = celement.package
193
- unless package == celement.package then
194
- required[celement.package] = celement.package
195
- end
196
- end
197
- end
198
- end
199
- end
200
-
201
- def ensure_templates
202
- return if @templates
203
-
204
- @templates = StandardGeneratorTemplates.new
205
- @templates.compile_scripts(@@standard_templates)
206
- end
207
-
208
- def find_place(directory_name, package)
209
- #puts "find_place:: package: #{package}"
210
-
211
- @generated_package_map = {} unless @generated_package_map
212
-
213
- place = @generated_package_map[package]
214
- if nil == place then
215
- place = ""
216
- @generated_package_map[package] = place
217
- end
218
- return place
219
- end
220
-
221
- def generate(directory_name, params={:verbose => false}, &eval_context)
222
- if directory_name then
223
- FileUtils.mkdir_p(directory_name) unless File.exist?(directory_name)
224
- end
225
-
226
- ensure_templates
227
-
228
- module_names = Set.new
229
- @elements_map.each do |ns, elements|
230
- elements.element_child.each do |element|
231
- module_names << element.package
232
- break
233
- end
234
- end
235
-
236
- lookup_element = {}
237
- @elements_map.each do |ns, elements|
238
- elements.element_child.each do |element|
239
- lookup_element[element.nstag] = element
240
- end
241
- end
242
-
243
- @templates.lookup_element = lookup_element
244
-
245
- @elements_map.each do |ns, elements|
246
- elements.element_child.each do |element|
247
- place = find_place(directory_name, element.package)
248
-
249
- @templates.element = element
250
- @templates.package_name = element.package
251
-
252
- if element.class_name == element.package then
253
- puts "ERROR: Class #{ element.package } is in a module with the same name -- this NOT going to work"
254
- elsif module_names.member?(element.class_name)
255
- puts "WARNING: a Class and a Module have the same name (#{ element.package }) -- this is highly unlikely to work"
256
- end
257
-
258
- @templates.child_modules(place)
259
- end
260
- end
261
-
262
- @elements_map.each do |ns, elements|
263
- elements.element_child.each do |element|
264
- place = find_place(directory_name, element.package)
265
-
266
- @templates.element = element
267
- @templates.package_name = element.package
268
-
269
- @templates.element_classes(place)
270
- end
271
- end
272
-
273
- @generated_package_map.each do |package_name, definition|
274
- package_name = "XamplAdHoc" unless package_name
275
-
276
- @templates.element = nil
277
- @templates.package_name = package_name
278
- @templates.options = @options
279
-
280
- @templates.required_packages = @required_packages[package_name] || {}
281
-
282
- @templates.place = definition
283
-
284
- package_definition = @templates.package
285
-
286
- if directory_name then
287
- output_filename = File.join(directory_name, "#{package_name}.rb")
288
- puts "WRITE TO FILE: #{output_filename}"
289
- #puts package_definition
290
- File.open(output_filename, "w") do |file|
291
- file.puts package_definition
292
- end
293
- end
294
- if block_given? then
295
- package_name = "XamplAdHoc" unless package_name
296
- puts "EVALUATE: #{package_name}"
297
- eval_context.call(package_definition, package_name)
298
- end
299
- end
300
-
301
- report_elements if params[:verbose]
302
- end
303
-
304
- def report_elements
305
- @elements_map.each_value do |elements|
306
- puts elements.pp_xml
307
- end
308
- end
309
-
310
- def print_elements(base_filename, print_options=nil)
311
- return unless base_filename
312
- return unless print_options
313
- return if 0 == print_options.size
314
-
315
- root = Elements.new
316
- @elements_map.each_value do |elements|
317
- elements.element_child.each do |element|
318
- root.children << element
319
- end
320
- end
321
-
322
- print_options.each do | print_option |
323
- case print_option
324
- when :schema then
325
- File.open("#{base_filename}.xml", "w") do |out|
326
- root.pp_xml(out)
327
- end
328
- when :graphml then
329
- graphml_out = GraphMLOut.new(@elements_map)
330
- graphml_out.write_graph_ml(base_filename)
331
- when :yuml then
332
- yuml_out = YUMLOut.new(@elements_map)
333
- yuml_out.write_yuml(base_filename)
334
- end
335
- end
336
- end
337
-
338
- def go(args, &eval_context)
339
- options = args[:options]
340
- if options then
341
- @options = options
342
- end
343
-
344
- strings = args[:strings]
345
- if strings then
346
- comprehend_from_strings(strings)
347
- end
348
-
349
- filenames = args[:filenames]
350
- if filenames then
351
- comprehend_from_files(filenames)
352
- end
353
-
354
- directory = args[:directory]
355
- if directory then
356
- generate_to_directory(directory, args)
357
- else
358
- generate_and_eval(args) do |module_definition, name|
359
- yield(module_definition, name)
360
- end
361
- end
362
- end
363
-
364
- def generate_to_directory(directory_name, params={:verbose => false})
365
- analyse
366
- return generate(directory_name, params)
367
- end
368
-
369
- def generate_and_eval(params={:verbose => false}, &eval_context)
370
- analyse
371
- return generate(nil, params, &eval_context)
372
- end
373
-
374
- def Generator.choose_names(original_name, attr_prefix="_", attr_suffix="_")
375
-
376
- # name = original_name.gsub(/[^a-zA-Z_]+/, "_")
377
-
378
- # NOTE (2009-04-16) -- if tag starts with a number, prefix it with an 'x'
379
- name = original_name.sub(/^([0-9])/) { | m | "x" + m }
380
- name = name.gsub(/[^a-zA-Z0-9_]+/, "_")
381
-
382
-
383
- attr_name = name.gsub(/[A-Z]+/, "_\\&")
384
- attr_name.gsub!(/__+/, "_")
385
- attr_name = attr_name[1..-1] if "_"[0] == attr_name[0]
386
- attr_name.downcase!
387
-
388
- name.gsub!(/[A-Z]/, "_\\&")
389
- name.gsub!(/__+/, "_")
390
- class_name = ""
391
- #name.each("_") do |chunk|
392
- name.split("_").each do |chunk|
393
- class_name << chunk.capitalize
394
- end
395
- class_name.gsub!("_", "")
396
-
397
- return class_name, attr_name
398
- end
399
-
400
- def print_stats
401
- count = 0
402
- @elements_map.each do |ns, elements|
403
- count += elements.element_child.size
404
- printf("namespace: %s, element: %d\n", ns, elements.element_child.size)
405
- end
406
- printf("counts of:: namespace: %d, element: %d\n", @elements_map.size, count)
407
- @elements_map.each do |ns, elements|
408
- puts elements.pp_xml
409
- end
410
- end
411
- end
412
-
413
- class Options
414
- def resolve(namespace, pkg="XamplAdHoc", preferred_prefix=nil)
415
- if (namespace.kind_of?(Array)) then
416
- namespace.each do |ns, prefix|
417
- self.new_resolve do |resolver|
418
- resolver.pkg = pkg
419
- resolver.namespace = ns
420
- resolver.preferred_prefix = prefix
421
- end
422
- end
423
- else
424
- self.new_resolve do |resolver|
425
- resolver.pkg = pkg
426
- resolver.namespace = namespace
427
- resolver.preferred_prefix = preferred_prefix
428
- end
429
- end
430
- end
431
- end
432
-
433
- class ChildElement
434
- def find_element(map)
435
- elements = map[self.namespace]
436
- return elements.element[self.element_name]
437
- end
438
- end
439
-
440
- class Element
441
- def found_text_content
442
- self.has_content = true
443
- end
444
-
445
- def analyse(options)
446
- is_empty, is_simple, is_data, is_mixed = false
447
-
448
- class_name, attribute_name = Generator.choose_names(@name)
449
- @class_name = class_name unless @class_name
450
- @attribute_name = attribute_name unless @attribute_name
451
-
452
- no_children = (0 == @child_element_child.size)
453
-
454
- unless @kind then
455
- if no_children then
456
- is_simple = @has_content
457
- is_empty = !is_simple
458
- else
459
- is_mixed = @has_content
460
- is_data = !@has_content
461
- end
462
-
463
- # this isn't a very strong piece of information, can't do much about it.
464
- #attribute_like = ((0 == @attribute_child.size) and is_simple)
465
-
466
- if is_empty then
467
- @kind = "empty"
468
- elsif is_simple then
469
- @kind = "simple"
470
- elsif is_data then
471
- @kind = "data"
472
- elsif is_mixed then
473
- @kind = "mixed"
474
- else
475
- throw "no kind determined" # this should be impossible
476
- end
477
- end
478
-
479
- unless self.indexed_by_attr then
480
- attribute_child.each do |attribute|
481
- aname_orig = attribute.name
482
- class_name, aname = Generator.choose_names(aname_orig)
483
- attribute.name = aname
484
- attribute.tag_name = aname_orig
485
-
486
- options.index_attribute_child.each do |iattr|
487
- if aname == iattr.name then
488
- self.indexed_by_attr = aname
489
- self.persisted = iattr.persisted
490
- break
491
- end
492
- end
493
- end
494
-
495
- if self.persisted then
496
- attribute = Attribute.new
497
- attribute.name = 'scheduled_for_deletion_at'
498
- attribute.tag_name = 'scheduled-for-deletion-at'
499
- attribute.namespace = nil
500
- self.add_attribute(attribute)
501
- end
502
-
503
- end
504
- end
505
- end
506
-
507
- def XamplGenerator.from_command_line(options=nil)
508
- opts = GetoptLong.new(
509
- ["--options", "-o", GetoptLong::REQUIRED_ARGUMENT],
510
- ["--elements", "-e", GetoptLong::REQUIRED_ARGUMENT],
511
- ["--gen:options", "-O", GetoptLong::OPTIONAL_ARGUMENT],
512
- ["--gen:elements", "-E", GetoptLong::OPTIONAL_ARGUMENT],
513
- ["--directory", "-d", GetoptLong::REQUIRED_ARGUMENT],
514
- ["--help", "-h", GetoptLong::NO_ARGUMENT],
515
- ["--version", "-v", GetoptLong::NO_ARGUMENT]
516
- )
517
-
518
- write_options = nil
519
- write_elements = nil
520
- directory = File.join(".", "tmp")
521
-
522
- opts.each do |opt, arg|
523
- case opt
524
- when "--help" then
525
- puts "--help, -h :: this help message"
526
- puts "--options, -o :: xml file seting the generation options"
527
- puts "--elements, -e :: xml file providing a hint 'schema' (very optional)"
528
- puts "--gen:options, -O :: write an xml file describing the options used (default gen-options.xml)"
529
- puts "--gen:elements, -E :: write an xml file describing the 'schema' (default gen-elements.xml)"
530
- puts "--directory, -o :: where to write the generated files (default #{directory})"
531
- puts "--version, -o :: what version of xampl is this?"
532
- exit
533
- when "--version" then
534
- puts "version 0.0.0"
535
- exit
536
- when "--directory"
537
- directory = arg
538
- when "--options"
539
- puts "sorry, cannot read options yet"
540
- when "--elements"
541
- puts "sorry, cannot read elements yet"
542
- when "--gen:options"
543
- write_options = (arg and (0 < arg.length)) ? arg : "gen-options.xml"
544
- when "--gen:elements"
545
- write_elements = (arg and (0 < arg.length)) ? arg : "gen-elements.xml"
546
- else
547
- puts " #{opt} #{arg}"
548
- end
549
- end
550
-
551
- puts "write options to: #{write_options}" if write_options
552
- puts "write elements to: #{write_elements}" if write_elements
553
- puts "write generated code to: #{directory}" if directory
554
-
555
- generator = Generator.new(options)
556
-
557
- filenames = []
558
- ARGV.each do |name|
559
- filenames << name
560
- end
561
-
562
- if 0 < filenames.length then
563
- generator.comprehend_from_files(filenames)
564
- generator.generate_to_directory(directory)
565
-
566
- generator.print_elements(write_elements) if write_elements
567
- end
568
- end
569
- end