xamplr 1.2.0
Sign up to get free protection for your applications and to get access to all the features.
- data/CHANGES.txt +13 -0
- data/LICENSE +3 -0
- data/README.rdoc +26 -0
- data/README.rdoc.orig +118 -0
- data/Rakefile +85 -0
- data/VERSION.yml +4 -0
- data/examples/random-people-shared-addresses/Makefile +16 -0
- data/examples/random-people-shared-addresses/batch-load-users.rb +83 -0
- data/examples/random-people-shared-addresses/find-mentions.rb +47 -0
- data/examples/random-people-shared-addresses/find-people-by-address.rb +104 -0
- data/examples/random-people-shared-addresses/optimise.rb +16 -0
- data/examples/random-people-shared-addresses/people.rb +35 -0
- data/examples/random-people-shared-addresses/query.rb +75 -0
- data/examples/random-people-shared-addresses/query2.rb +73 -0
- data/examples/random-people-shared-addresses/random-names.csv +10000 -0
- data/examples/random-people-shared-addresses/settings.rb +3 -0
- data/examples/random-people-shared-addresses/what-to-query-on.rb +82 -0
- data/examples/random-people-shared-addresses/xampl-gen.rb +36 -0
- data/examples/random-people-shared-addresses/xml/people.xml +14 -0
- data/examples/random-people/Makefile +16 -0
- data/examples/random-people/batch-load-users.rb +61 -0
- data/examples/random-people/optimise.rb +16 -0
- data/examples/random-people/people.rb +22 -0
- data/examples/random-people/query.rb +73 -0
- data/examples/random-people/query2.rb +73 -0
- data/examples/random-people/random-names.csv +10000 -0
- data/examples/random-people/rawtc.rb +91 -0
- data/examples/random-people/settings.rb +3 -0
- data/examples/random-people/what-to-query-on.rb +80 -0
- data/examples/random-people/xampl-gen.rb +36 -0
- data/examples/random-people/xml/people.xml +11 -0
- data/examples/read-testing/Makefile +10 -0
- data/examples/read-testing/load.rb +65 -0
- data/examples/read-testing/read.rb +51 -0
- data/examples/read-testing/rrr.rb +87 -0
- data/examples/read-testing/settings.rb +2 -0
- data/examples/read-testing/xampl-gen.rb +36 -0
- data/examples/read-testing/xml/text.xml +8 -0
- data/examples/tokyo-cabinet-experimental/expt-query.rb +42 -0
- data/examples/tokyo-cabinet-experimental/expt-query2.rb +42 -0
- data/examples/tokyo-cabinet-experimental/expt-query3.rb +41 -0
- data/examples/tokyo-cabinet-experimental/expt-reader.rb +32 -0
- data/examples/tokyo-cabinet-experimental/expt.rb +61 -0
- data/examples/tokyo-cabinet-experimental/xampl-gen.rb +36 -0
- data/examples/tokyo-cabinet-experimental/xml/tcx.xml +6 -0
- data/lib/xampl-generator.rb +3 -0
- data/lib/xampl.rb +3 -0
- data/lib/xamplr-generator.rb +10 -0
- data/lib/xamplr.rb +37 -0
- data/lib/xamplr/README-POSSIBLE-PROBLEMS +5 -0
- data/lib/xamplr/TODO +1 -0
- data/lib/xamplr/exceptions.rb +97 -0
- data/lib/xamplr/from-xml-orig.rb +350 -0
- data/lib/xamplr/from-xml.rb +439 -0
- data/lib/xamplr/gen-elements.xml +6230 -0
- data/lib/xamplr/gen.elements.xml +108 -0
- data/lib/xamplr/generate-elements.rb +15 -0
- data/lib/xamplr/generator.rb +5 -0
- data/lib/xamplr/graphml-out.rb +470 -0
- data/lib/xamplr/handwritten/example.rb +698 -0
- data/lib/xamplr/handwritten/hand-example.rb +533 -0
- data/lib/xamplr/handwritten/test-handwritten.rb +873 -0
- data/lib/xamplr/indexed-array.rb +115 -0
- data/lib/xamplr/mixins.rb +397 -0
- data/lib/xamplr/my.gen.elements.xml +461 -0
- data/lib/xamplr/notifications.rb +57 -0
- data/lib/xamplr/obsolete/fsdb.rb +62 -0
- data/lib/xamplr/persist-to-xml.rb +249 -0
- data/lib/xamplr/persistence.rb +522 -0
- data/lib/xamplr/persistence.rb.more_thread_safe +771 -0
- data/lib/xamplr/persistence.rb.partially_thread_safe +763 -0
- data/lib/xamplr/persister.rb +310 -0
- data/lib/xamplr/persisters/caches.rb +186 -0
- data/lib/xamplr/persisters/caching.rb +172 -0
- data/lib/xamplr/persisters/filesystem.rb +60 -0
- data/lib/xamplr/persisters/in-memory.rb +180 -0
- data/lib/xamplr/persisters/simple.rb +59 -0
- data/lib/xamplr/persisters/tokyo-cabinet.rb +641 -0
- data/lib/xamplr/simpleTemplate/danger.rx +4 -0
- data/lib/xamplr/simpleTemplate/obsolete/input-c.r4 +35 -0
- data/lib/xamplr/simpleTemplate/obsolete/play.r6.txt +12 -0
- data/lib/xamplr/simpleTemplate/obsolete/play_more.r6.txt +20 -0
- data/lib/xamplr/simpleTemplate/obsolete/test001.r5 +8 -0
- data/lib/xamplr/simpleTemplate/obsolete/test002.r5 +13 -0
- data/lib/xamplr/simpleTemplate/obsolete/test003.r5 +37 -0
- data/lib/xamplr/simpleTemplate/old/r6.000.rb +122 -0
- data/lib/xamplr/simpleTemplate/old/r6.001.rb +145 -0
- data/lib/xamplr/simpleTemplate/play.r6 +12 -0
- data/lib/xamplr/simpleTemplate/play_more.r6 +20 -0
- data/lib/xamplr/simpleTemplate/play_noblanks.r6 +21 -0
- data/lib/xamplr/simpleTemplate/playq.r6 +16 -0
- data/lib/xamplr/simpleTemplate/r6.rb +87 -0
- data/lib/xamplr/simpleTemplate/simple-template.rb +75 -0
- data/lib/xamplr/templates/child.template +47 -0
- data/lib/xamplr/templates/child_indexed.template +89 -0
- data/lib/xamplr/templates/child_modules.template +5 -0
- data/lib/xamplr/templates/element_classes.template +11 -0
- data/lib/xamplr/templates/element_data.template +282 -0
- data/lib/xamplr/templates/element_empty.template +285 -0
- data/lib/xamplr/templates/element_mixed.template +277 -0
- data/lib/xamplr/templates/element_simple.template +276 -0
- data/lib/xamplr/templates/package.template +26 -0
- data/lib/xamplr/test-support/Makefile +47 -0
- data/lib/xamplr/test-support/bench-cache.rb +80 -0
- data/lib/xamplr/test-support/bench-script.rb +21 -0
- data/lib/xamplr/test-support/bench.rb +116 -0
- data/lib/xamplr/test-support/bench2.rb +132 -0
- data/lib/xamplr/test-support/test-cache.rb +147 -0
- data/lib/xamplr/test-support/test-data/binding.xml +7 -0
- data/lib/xamplr/test-support/test-data/example.xml +14 -0
- data/lib/xamplr/test-support/test-data/internationalization-utf8.txt +1 -0
- data/lib/xamplr/test-support/test-data/labels.xml +37 -0
- data/lib/xamplr/test-support/test-data/labels001.xml +38 -0
- data/lib/xamplr/test-support/test-deep-change.rb +135 -0
- data/lib/xamplr/test-support/test-elements.rb +109 -0
- data/lib/xamplr/test-support/test-indexed-array.rb +169 -0
- data/lib/xamplr/test-support/test-misc.rb +73 -0
- data/lib/xamplr/test-support/test-names.rb +67 -0
- data/lib/xamplr/test-support/test-rollback.rb +106 -0
- data/lib/xamplr/test-support/test.rb +1504 -0
- data/lib/xamplr/to-ruby.rb +220 -0
- data/lib/xamplr/to-xml.rb +158 -0
- data/lib/xamplr/version.rb +67 -0
- data/lib/xamplr/visitor.rb +140 -0
- data/lib/xamplr/visitors.rb +573 -0
- data/lib/xamplr/xampl-generator.rb +533 -0
- data/lib/xamplr/xampl-hand-generated.rb +1535 -0
- data/lib/xamplr/xampl-module.rb +36 -0
- data/lib/xamplr/xampl-object-internals.rb +6 -0
- data/lib/xamplr/xampl-object.rb +202 -0
- data/lib/xamplr/xampl-persisted-object.rb +122 -0
- data/lib/xamplr/xml-text.rb +117 -0
- data/lib/xamplr/xml/document.xml +7 -0
- data/lib/xamplr/xml/elements.xml +101 -0
- data/lib/xamplr/xml/elements000.xml +73 -0
- data/lib/xamplr/xml/example.xml +23 -0
- data/lib/xamplr/xml/options.xml +12 -0
- data/lib/xamplr/xml/uche.xml +38 -0
- data/lib/xamplr/yEd-sample.graphml +300 -0
- data/test/test_helper.rb +10 -0
- data/test/xamplr_test.rb +7 -0
- 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
|