xamplr 1.2.0

Sign up to get free protection for your applications and to get access to all the features.
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