xamplr 1.3.15 → 1.9.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
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