xamplr 1.2.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 (142) hide show
  1. data/CHANGES.txt +13 -0
  2. data/LICENSE +3 -0
  3. data/README.rdoc +26 -0
  4. data/README.rdoc.orig +118 -0
  5. data/Rakefile +85 -0
  6. data/VERSION.yml +4 -0
  7. data/examples/random-people-shared-addresses/Makefile +16 -0
  8. data/examples/random-people-shared-addresses/batch-load-users.rb +83 -0
  9. data/examples/random-people-shared-addresses/find-mentions.rb +47 -0
  10. data/examples/random-people-shared-addresses/find-people-by-address.rb +104 -0
  11. data/examples/random-people-shared-addresses/optimise.rb +16 -0
  12. data/examples/random-people-shared-addresses/people.rb +35 -0
  13. data/examples/random-people-shared-addresses/query.rb +75 -0
  14. data/examples/random-people-shared-addresses/query2.rb +73 -0
  15. data/examples/random-people-shared-addresses/random-names.csv +10000 -0
  16. data/examples/random-people-shared-addresses/settings.rb +3 -0
  17. data/examples/random-people-shared-addresses/what-to-query-on.rb +82 -0
  18. data/examples/random-people-shared-addresses/xampl-gen.rb +36 -0
  19. data/examples/random-people-shared-addresses/xml/people.xml +14 -0
  20. data/examples/random-people/Makefile +16 -0
  21. data/examples/random-people/batch-load-users.rb +61 -0
  22. data/examples/random-people/optimise.rb +16 -0
  23. data/examples/random-people/people.rb +22 -0
  24. data/examples/random-people/query.rb +73 -0
  25. data/examples/random-people/query2.rb +73 -0
  26. data/examples/random-people/random-names.csv +10000 -0
  27. data/examples/random-people/rawtc.rb +91 -0
  28. data/examples/random-people/settings.rb +3 -0
  29. data/examples/random-people/what-to-query-on.rb +80 -0
  30. data/examples/random-people/xampl-gen.rb +36 -0
  31. data/examples/random-people/xml/people.xml +11 -0
  32. data/examples/read-testing/Makefile +10 -0
  33. data/examples/read-testing/load.rb +65 -0
  34. data/examples/read-testing/read.rb +51 -0
  35. data/examples/read-testing/rrr.rb +87 -0
  36. data/examples/read-testing/settings.rb +2 -0
  37. data/examples/read-testing/xampl-gen.rb +36 -0
  38. data/examples/read-testing/xml/text.xml +8 -0
  39. data/examples/tokyo-cabinet-experimental/expt-query.rb +42 -0
  40. data/examples/tokyo-cabinet-experimental/expt-query2.rb +42 -0
  41. data/examples/tokyo-cabinet-experimental/expt-query3.rb +41 -0
  42. data/examples/tokyo-cabinet-experimental/expt-reader.rb +32 -0
  43. data/examples/tokyo-cabinet-experimental/expt.rb +61 -0
  44. data/examples/tokyo-cabinet-experimental/xampl-gen.rb +36 -0
  45. data/examples/tokyo-cabinet-experimental/xml/tcx.xml +6 -0
  46. data/lib/xampl-generator.rb +3 -0
  47. data/lib/xampl.rb +3 -0
  48. data/lib/xamplr-generator.rb +10 -0
  49. data/lib/xamplr.rb +37 -0
  50. data/lib/xamplr/README-POSSIBLE-PROBLEMS +5 -0
  51. data/lib/xamplr/TODO +1 -0
  52. data/lib/xamplr/exceptions.rb +97 -0
  53. data/lib/xamplr/from-xml-orig.rb +350 -0
  54. data/lib/xamplr/from-xml.rb +439 -0
  55. data/lib/xamplr/gen-elements.xml +6230 -0
  56. data/lib/xamplr/gen.elements.xml +108 -0
  57. data/lib/xamplr/generate-elements.rb +15 -0
  58. data/lib/xamplr/generator.rb +5 -0
  59. data/lib/xamplr/graphml-out.rb +470 -0
  60. data/lib/xamplr/handwritten/example.rb +698 -0
  61. data/lib/xamplr/handwritten/hand-example.rb +533 -0
  62. data/lib/xamplr/handwritten/test-handwritten.rb +873 -0
  63. data/lib/xamplr/indexed-array.rb +115 -0
  64. data/lib/xamplr/mixins.rb +397 -0
  65. data/lib/xamplr/my.gen.elements.xml +461 -0
  66. data/lib/xamplr/notifications.rb +57 -0
  67. data/lib/xamplr/obsolete/fsdb.rb +62 -0
  68. data/lib/xamplr/persist-to-xml.rb +249 -0
  69. data/lib/xamplr/persistence.rb +522 -0
  70. data/lib/xamplr/persistence.rb.more_thread_safe +771 -0
  71. data/lib/xamplr/persistence.rb.partially_thread_safe +763 -0
  72. data/lib/xamplr/persister.rb +310 -0
  73. data/lib/xamplr/persisters/caches.rb +186 -0
  74. data/lib/xamplr/persisters/caching.rb +172 -0
  75. data/lib/xamplr/persisters/filesystem.rb +60 -0
  76. data/lib/xamplr/persisters/in-memory.rb +180 -0
  77. data/lib/xamplr/persisters/simple.rb +59 -0
  78. data/lib/xamplr/persisters/tokyo-cabinet.rb +641 -0
  79. data/lib/xamplr/simpleTemplate/danger.rx +4 -0
  80. data/lib/xamplr/simpleTemplate/obsolete/input-c.r4 +35 -0
  81. data/lib/xamplr/simpleTemplate/obsolete/play.r6.txt +12 -0
  82. data/lib/xamplr/simpleTemplate/obsolete/play_more.r6.txt +20 -0
  83. data/lib/xamplr/simpleTemplate/obsolete/test001.r5 +8 -0
  84. data/lib/xamplr/simpleTemplate/obsolete/test002.r5 +13 -0
  85. data/lib/xamplr/simpleTemplate/obsolete/test003.r5 +37 -0
  86. data/lib/xamplr/simpleTemplate/old/r6.000.rb +122 -0
  87. data/lib/xamplr/simpleTemplate/old/r6.001.rb +145 -0
  88. data/lib/xamplr/simpleTemplate/play.r6 +12 -0
  89. data/lib/xamplr/simpleTemplate/play_more.r6 +20 -0
  90. data/lib/xamplr/simpleTemplate/play_noblanks.r6 +21 -0
  91. data/lib/xamplr/simpleTemplate/playq.r6 +16 -0
  92. data/lib/xamplr/simpleTemplate/r6.rb +87 -0
  93. data/lib/xamplr/simpleTemplate/simple-template.rb +75 -0
  94. data/lib/xamplr/templates/child.template +47 -0
  95. data/lib/xamplr/templates/child_indexed.template +89 -0
  96. data/lib/xamplr/templates/child_modules.template +5 -0
  97. data/lib/xamplr/templates/element_classes.template +11 -0
  98. data/lib/xamplr/templates/element_data.template +282 -0
  99. data/lib/xamplr/templates/element_empty.template +285 -0
  100. data/lib/xamplr/templates/element_mixed.template +277 -0
  101. data/lib/xamplr/templates/element_simple.template +276 -0
  102. data/lib/xamplr/templates/package.template +26 -0
  103. data/lib/xamplr/test-support/Makefile +47 -0
  104. data/lib/xamplr/test-support/bench-cache.rb +80 -0
  105. data/lib/xamplr/test-support/bench-script.rb +21 -0
  106. data/lib/xamplr/test-support/bench.rb +116 -0
  107. data/lib/xamplr/test-support/bench2.rb +132 -0
  108. data/lib/xamplr/test-support/test-cache.rb +147 -0
  109. data/lib/xamplr/test-support/test-data/binding.xml +7 -0
  110. data/lib/xamplr/test-support/test-data/example.xml +14 -0
  111. data/lib/xamplr/test-support/test-data/internationalization-utf8.txt +1 -0
  112. data/lib/xamplr/test-support/test-data/labels.xml +37 -0
  113. data/lib/xamplr/test-support/test-data/labels001.xml +38 -0
  114. data/lib/xamplr/test-support/test-deep-change.rb +135 -0
  115. data/lib/xamplr/test-support/test-elements.rb +109 -0
  116. data/lib/xamplr/test-support/test-indexed-array.rb +169 -0
  117. data/lib/xamplr/test-support/test-misc.rb +73 -0
  118. data/lib/xamplr/test-support/test-names.rb +67 -0
  119. data/lib/xamplr/test-support/test-rollback.rb +106 -0
  120. data/lib/xamplr/test-support/test.rb +1504 -0
  121. data/lib/xamplr/to-ruby.rb +220 -0
  122. data/lib/xamplr/to-xml.rb +158 -0
  123. data/lib/xamplr/version.rb +67 -0
  124. data/lib/xamplr/visitor.rb +140 -0
  125. data/lib/xamplr/visitors.rb +573 -0
  126. data/lib/xamplr/xampl-generator.rb +533 -0
  127. data/lib/xamplr/xampl-hand-generated.rb +1535 -0
  128. data/lib/xamplr/xampl-module.rb +36 -0
  129. data/lib/xamplr/xampl-object-internals.rb +6 -0
  130. data/lib/xamplr/xampl-object.rb +202 -0
  131. data/lib/xamplr/xampl-persisted-object.rb +122 -0
  132. data/lib/xamplr/xml-text.rb +117 -0
  133. data/lib/xamplr/xml/document.xml +7 -0
  134. data/lib/xamplr/xml/elements.xml +101 -0
  135. data/lib/xamplr/xml/elements000.xml +73 -0
  136. data/lib/xamplr/xml/example.xml +23 -0
  137. data/lib/xamplr/xml/options.xml +12 -0
  138. data/lib/xamplr/xml/uche.xml +38 -0
  139. data/lib/xamplr/yEd-sample.graphml +300 -0
  140. data/test/test_helper.rb +10 -0
  141. data/test/xamplr_test.rb +7 -0
  142. metadata +245 -0
@@ -0,0 +1,533 @@
1
+
2
+ require 'fileutils'
3
+ require 'getoptlong'
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
+
11
+ class Attribute
12
+ attr_accessor :tag_name
13
+ end
14
+
15
+ class StandardGeneratorTemplates
16
+ include TemplateEngine
17
+
18
+ attr_accessor :element, :package_name, :place, :lookup_element, :options, :required_packages
19
+
20
+ def initialize
21
+ super
22
+ @element = nil
23
+ @package_name = nil
24
+ @place = nil
25
+ @lookup_element = {}
26
+ @options = nil
27
+ @required_packages = {}
28
+ end
29
+ end
30
+
31
+ class Generator
32
+
33
+ attr_accessor :elements_map, :options, :templates
34
+
35
+ @@standard_templates = [
36
+ "xamplr/templates/child_modules.template",
37
+ "xamplr/templates/child.template",
38
+ "xamplr/templates/child_indexed.template",
39
+ "xamplr/templates/element_classes.template",
40
+ "xamplr/templates/element_data.template",
41
+ "xamplr/templates/element_empty.template",
42
+ "xamplr/templates/element_mixed.template",
43
+ "xamplr/templates/element_simple.template",
44
+ "xamplr/templates/package.template",
45
+ ]
46
+
47
+ def initialize(options = nil, *predefined_elements)
48
+ @elements_map = {}
49
+ @xpp = nil
50
+ @templates = nil
51
+ @generated_package_map = nil
52
+
53
+ if options then
54
+ @options = options
55
+ else
56
+ @options = Xampl.make(Options) do |options|
57
+ options.new_index_attribute("id")
58
+ options.new_index_attribute("pid").persisted = true;
59
+
60
+ options.new_resolve do |resolver|
61
+ resolver.pkg = "XamplAdHoc"
62
+ resolver.namespace=""
63
+ end
64
+ end
65
+ end
66
+
67
+ predefined_elements.each do |elements|
68
+ throw :elements_need_a_pid unless elements.pid
69
+ @elements_map[elements.pid] = elements
70
+ end
71
+ end
72
+
73
+ def start_element(parent)
74
+ name = @xpp.name
75
+ namespace = @xpp.namespace
76
+ namespace = "" unless namespace
77
+ is_empty = @xpp.emptyElement
78
+
79
+ nstag = "{{#{namespace}}}#{name}"
80
+
81
+ elements = @elements_map[namespace]
82
+ if nil == elements then
83
+ elements = Elements.new
84
+ @elements_map[namespace] = elements
85
+ end
86
+
87
+ element = elements.element_child[name]
88
+ if nil == element then
89
+ element = elements.new_element(name)
90
+ end
91
+
92
+ element.namespace = namespace
93
+ element.nstag = nstag
94
+ element.empty = is_empty
95
+
96
+ @xpp.attributeName.each_index do |i|
97
+ attribute = Attribute.new
98
+ attribute.name = @xpp.attributeName[i]
99
+ attribute.namespace = @xpp.attributeNamespace[i]
100
+ element.add_attribute(attribute)
101
+ end
102
+
103
+ if parent then
104
+ parent.new_child_element(nstag) do |ce|
105
+ ce.element_name = name
106
+ ce.namespace = namespace
107
+ end
108
+ end
109
+ return element
110
+ end
111
+
112
+ def parse_filename(filename)
113
+ @xpp = Xampl_PP.new
114
+ @xpp.input = File.new(filename)
115
+ parse
116
+ end
117
+
118
+ def parse_string(string)
119
+ @xpp = Xampl_PP.new
120
+ @xpp.input = string
121
+ parse
122
+ end
123
+
124
+ def parse
125
+ element_stack = []
126
+ current_element = nil
127
+
128
+ while not @xpp.endDocument? do
129
+ case @xpp.nextEvent
130
+ when Xampl_PP::START_ELEMENT
131
+ element_stack.push current_element unless nil == current_element
132
+ current_element = start_element(current_element)
133
+ when Xampl_PP::END_ELEMENT
134
+ current_element = element_stack.pop
135
+ when Xampl_PP::TEXT,
136
+ Xampl_PP::CDATA_SECTION,
137
+ Xampl_PP::ENTITY_REF
138
+ if current_element then
139
+ text = @xpp.text
140
+ if (nil != @xpp.text) then
141
+ text = text.strip
142
+ current_element.found_text_content if 0 < text.size
143
+ end
144
+ end
145
+ end
146
+ end
147
+ end
148
+
149
+ def comprehend_from_files(filenames)
150
+ filenames.each do |filename|
151
+ puts "comprehend file #{filename}"
152
+ parse_filename(filename)
153
+ end
154
+ end
155
+
156
+ def comprehend_from_strings(strings)
157
+ strings.each do |string|
158
+ parse_string(string)
159
+ end
160
+ end
161
+
162
+ def analyse
163
+ namespace_package_map = {}
164
+ namespace_prefix_map = {}
165
+ options.resolve_child.each do |resolve|
166
+ namespace_package_map[resolve.namespace] = resolve.pkg
167
+ end
168
+
169
+ @elements_map.each do |ns, elements|
170
+ package = namespace_package_map[ns]
171
+
172
+ elements.element_child.each do |element|
173
+ element.package = package
174
+ element.analyse(options)
175
+ end
176
+ end
177
+
178
+ @required_packages = {}
179
+ @elements_map.each do |ns, elements|
180
+ package = namespace_package_map[ns]
181
+
182
+ required = @required_packages[package]
183
+ unless required then
184
+ required = {}
185
+ @required_packages[package] = required
186
+ end
187
+
188
+ elements.element_child.each do |element|
189
+ element.child_element_child.each do |child_element|
190
+ celement = child_element.find_element(@elements_map)
191
+ #required[celement.package] = celement.package
192
+ unless package == celement.package then
193
+ required[celement.package] = celement.package
194
+ end
195
+ end
196
+ end
197
+ end
198
+ end
199
+
200
+ def ensure_templates
201
+ return if @templates
202
+
203
+ @templates = StandardGeneratorTemplates.new
204
+ @templates.compile_scripts(@@standard_templates)
205
+ end
206
+
207
+ def find_place(directory_name, package)
208
+ #puts "find_place:: package: #{package}"
209
+
210
+ @generated_package_map = {} unless @generated_package_map
211
+
212
+ place = @generated_package_map[package]
213
+ if nil == place then
214
+ place = ""
215
+ @generated_package_map[package] = place
216
+ end
217
+ return place
218
+ end
219
+
220
+ def generate(directory_name, params={:verbose => false}, &eval_context)
221
+ if directory_name then
222
+ FileUtils.mkdir_p(directory_name) unless File.exist?(directory_name)
223
+ end
224
+
225
+ ensure_templates
226
+
227
+ lookup_element = {}
228
+ @elements_map.each do |ns, elements|
229
+ elements.element_child.each do |element|
230
+ lookup_element[element.nstag] = element
231
+ end
232
+ end
233
+
234
+ @templates.lookup_element = lookup_element
235
+
236
+ @elements_map.each do |ns, elements|
237
+ elements.element_child.each do |element|
238
+ place = find_place(directory_name, element.package)
239
+
240
+ @templates.element = element
241
+ @templates.package_name = element.package
242
+
243
+ @templates.child_modules(place)
244
+ end
245
+ end
246
+
247
+ @elements_map.each do |ns, elements|
248
+ elements.element_child.each do |element|
249
+ place = find_place(directory_name, element.package)
250
+
251
+ @templates.element = element
252
+ @templates.package_name = element.package
253
+
254
+ @templates.element_classes(place)
255
+ end
256
+ end
257
+
258
+ @generated_package_map.each do |package_name, definition|
259
+ package_name = "XamplAdHoc" unless package_name
260
+
261
+ @templates.element = nil
262
+ @templates.package_name = package_name
263
+ @templates.options = @options
264
+
265
+ @templates.required_packages = @required_packages[package_name] || {}
266
+
267
+ @templates.place = definition
268
+
269
+ package_definition = @templates.package
270
+
271
+ if directory_name then
272
+ output_filename = File.join(directory_name, "#{package_name}.rb")
273
+ puts "WRITE TO FILE: #{output_filename}"
274
+ #puts package_definition
275
+ File.open(output_filename, "w") do |file|
276
+ file.puts package_definition
277
+ end
278
+ end
279
+ if block_given? then
280
+ package_name = "XamplAdHoc" unless package_name
281
+ puts "EVALUATE: #{package_name}"
282
+ eval_context.call(package_definition, package_name)
283
+ end
284
+ end
285
+
286
+ report_elements if params[:verbose]
287
+ end
288
+
289
+ def report_elements
290
+ @elements_map.each_value do |elements|
291
+ puts elements.pp_xml
292
+ end
293
+ end
294
+
295
+ def print_elements(filename)
296
+ root = Elements.new
297
+ @elements_map.each_value do |elements|
298
+ elements.element_child.each do |element|
299
+ root.children << element
300
+ end
301
+ end
302
+
303
+ File.open(filename, "w") do |out|
304
+ root.pp_xml(out)
305
+ end
306
+
307
+ graphml_out = GraphMLOut.new(@elements_map)
308
+ graphml_out.write_graph_ml(filename)
309
+
310
+ end
311
+
312
+ def go(args, &eval_context)
313
+ options = args[:options]
314
+ if options then
315
+ @options = options
316
+ end
317
+
318
+ strings = args[:strings]
319
+ if strings then
320
+ comprehend_from_strings(strings)
321
+ end
322
+
323
+ filenames = args[:filenames]
324
+ if filenames then
325
+ comprehend_from_files(filenames)
326
+ end
327
+
328
+ directory = args[:directory]
329
+ if directory then
330
+ generate_to_directory(directory, args)
331
+ else
332
+ generate_and_eval(args) do |module_definition, name|
333
+ yield(module_definition, name)
334
+ end
335
+ end
336
+ end
337
+
338
+ def generate_to_directory(directory_name, params={:verbose => false})
339
+ analyse
340
+ return generate(directory_name, params)
341
+ end
342
+
343
+ def generate_and_eval(params={:verbose => false}, &eval_context)
344
+ analyse
345
+ return generate(nil, params, &eval_context)
346
+ end
347
+
348
+ def Generator.choose_names(original_name, attr_prefix="_", attr_suffix="_")
349
+
350
+ # name = original_name.gsub(/[^a-zA-Z_]+/, "_")
351
+
352
+ # NOTE (2009-04-16) -- if tag starts with a number, prefix it with an 'x'
353
+ name = original_name.sub(/^([0-9])/) { | m | "x" + m }
354
+ name = name.gsub(/[^a-zA-Z0-9_]+/, "_")
355
+
356
+
357
+ attr_name = name.gsub(/[A-Z]+/, "_\\&")
358
+ attr_name.gsub!(/__+/, "_")
359
+ attr_name = attr_name[1..-1] if "_"[0] == attr_name[0]
360
+ attr_name.downcase!
361
+
362
+ name.gsub!(/[A-Z]/, "_\\&")
363
+ name.gsub!(/__+/, "_")
364
+ class_name = ""
365
+ name.each("_") do |chunk|
366
+ class_name << chunk.capitalize
367
+ end
368
+ class_name.gsub!("_", "")
369
+
370
+ return class_name, attr_name
371
+ end
372
+
373
+ def print_stats
374
+ count = 0
375
+ @elements_map.each do |ns, elements|
376
+ count += elements.element_child.size
377
+ printf("namespace: %s, element: %d\n", ns, elements.element_child.size)
378
+ end
379
+ printf("counts of:: namespace: %d, element: %d\n", @elements_map.size, count)
380
+ @elements_map.each do |ns, elements|
381
+ puts elements.pp_xml
382
+ end
383
+ end
384
+ end
385
+
386
+ class Options
387
+ def resolve(namespace, pkg="XamplAdHoc", preferred_prefix=nil)
388
+ if (namespace.kind_of?(Array)) then
389
+ namespace.each do |ns, prefix|
390
+ self.new_resolve do |resolver|
391
+ resolver.pkg = pkg
392
+ resolver.namespace = ns
393
+ resolver.preferred_prefix = prefix
394
+ end
395
+ end
396
+ else
397
+ self.new_resolve do |resolver|
398
+ resolver.pkg = pkg
399
+ resolver.namespace = namespace
400
+ resolver.preferred_prefix = preferred_prefix
401
+ end
402
+ end
403
+ end
404
+ end
405
+
406
+ class ChildElement
407
+ def find_element(map)
408
+ elements = map[self.namespace]
409
+ return elements.element[self.element_name]
410
+ end
411
+ end
412
+
413
+ class Element
414
+ def found_text_content
415
+ self.has_content = true
416
+ end
417
+
418
+ def analyse(options)
419
+ is_empty, is_simple, is_data, is_mixed = false
420
+
421
+ class_name, attribute_name = Generator.choose_names(@name)
422
+ @class_name = class_name unless @class_name
423
+ @attribute_name = attribute_name unless @attribute_name
424
+
425
+ no_children = (0 == @child_element_child.size)
426
+
427
+ unless @kind then
428
+ if no_children then
429
+ is_simple = @has_content
430
+ is_empty = !is_simple
431
+ else
432
+ is_mixed = @has_content
433
+ is_data = !@has_content
434
+ end
435
+
436
+ # this isn't a very strong piece of information, can't do much about it.
437
+ #attribute_like = ((0 == @attribute_child.size) and is_simple)
438
+
439
+ if is_empty then
440
+ @kind = "empty"
441
+ elsif is_simple then
442
+ @kind = "simple"
443
+ elsif is_data then
444
+ @kind = "data"
445
+ elsif is_mixed then
446
+ @kind = "mixed"
447
+ else
448
+ throw "no kind determined" # this should be impossible
449
+ end
450
+ end
451
+
452
+ unless self.indexed_by_attr then
453
+ attribute_child.each do |attribute|
454
+ aname_orig = attribute.name
455
+ class_name, aname = Generator.choose_names(aname_orig)
456
+ attribute.name = aname
457
+ attribute.tag_name = aname_orig
458
+
459
+ options.index_attribute_child.each do |iattr|
460
+ if aname == iattr.name then
461
+ self.indexed_by_attr = aname
462
+ self.persisted = iattr.persisted
463
+ break
464
+ end
465
+ end
466
+ end
467
+ end
468
+ end
469
+ end
470
+
471
+ def XamplGenerator.from_command_line(options=nil)
472
+ opts = GetoptLong.new(
473
+ ["--options", "-o", GetoptLong::REQUIRED_ARGUMENT],
474
+ ["--elements", "-e", GetoptLong::REQUIRED_ARGUMENT],
475
+ ["--gen:options", "-O", GetoptLong::OPTIONAL_ARGUMENT],
476
+ ["--gen:elements", "-E", GetoptLong::OPTIONAL_ARGUMENT],
477
+ ["--directory", "-d", GetoptLong::REQUIRED_ARGUMENT],
478
+ ["--help", "-h", GetoptLong::NO_ARGUMENT],
479
+ ["--version", "-v", GetoptLong::NO_ARGUMENT]
480
+ )
481
+
482
+ write_options = nil
483
+ write_elements = nil
484
+ directory = File.join(".", "tmp")
485
+
486
+ opts.each do |opt, arg|
487
+ case opt
488
+ when "--help" then
489
+ puts "--help, -h :: this help message"
490
+ puts "--options, -o :: xml file seting the generation options"
491
+ puts "--elements, -e :: xml file providing a hint 'schema' (very optional)"
492
+ puts "--gen:options, -O :: write an xml file describing the options used (default gen-options.xml)"
493
+ puts "--gen:elements, -E :: write an xml file describing the 'schema' (default gen-elements.xml)"
494
+ puts "--directory, -o :: where to write the generated files (default #{directory})"
495
+ puts "--version, -o :: what version of xampl is this?"
496
+ exit
497
+ when "--version" then
498
+ puts "version 0.0.0"
499
+ exit
500
+ when "--directory"
501
+ directory = arg
502
+ when "--options"
503
+ puts "sorry, cannot read options yet"
504
+ when "--elements"
505
+ puts "sorry, cannot read elements yet"
506
+ when "--gen:options"
507
+ write_options = (arg and (0 < arg.length)) ? arg : "gen-options.xml"
508
+ when "--gen:elements"
509
+ write_elements = (arg and (0 < arg.length)) ? arg : "gen-elements.xml"
510
+ else
511
+ puts " #{opt} #{arg}"
512
+ end
513
+ end
514
+
515
+ puts "write options to: #{write_options}" if write_options
516
+ puts "write elements to: #{write_elements}" if write_elements
517
+ puts "write generated code to: #{directory}" if directory
518
+
519
+ generator = Generator.new(options)
520
+
521
+ filenames = []
522
+ ARGV.each do |name|
523
+ filenames << name
524
+ end
525
+
526
+ if 0 < filenames.length then
527
+ generator.comprehend_from_files(filenames)
528
+ generator.generate_to_directory(directory)
529
+
530
+ generator.print_elements(write_elements) if write_elements
531
+ end
532
+ end
533
+ end