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.
- 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
|