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,115 @@
1
+ class IndexedArray
2
+ include Enumerable
3
+
4
+ def initialize(parent=nil)
5
+ @map = {}
6
+ @store = []
7
+ @parent = nil
8
+ end
9
+
10
+ def [](index)
11
+ if String === index or Symbol === index then
12
+ pos = @map[index]
13
+ if pos then
14
+ return @store[pos]
15
+ else
16
+ return nil
17
+ end
18
+ else
19
+ return @store[index]
20
+ end
21
+ end
22
+
23
+ alias slice []
24
+
25
+ def []=(index, value)
26
+ if String === index or Symbol === index then
27
+ pos = @map[index]
28
+ unless pos then
29
+ pos = @store.size
30
+ @map[index] = pos
31
+ end
32
+ return @store[pos] = value
33
+ else
34
+ raise XamplException.new(:non_string_or_symbol_key)
35
+ end
36
+ end
37
+
38
+ def clear
39
+ @map = {}
40
+ @store = []
41
+ end
42
+
43
+ def keys
44
+ return @map.keys
45
+ end
46
+
47
+ def delete(index)
48
+ if String === index or Symbol === index then
49
+ pos = @map.delete(index)
50
+ if pos then
51
+ @map.each{ | k, v| @map[k] = (v - 1) if pos < v }
52
+ return @store.delete_at(pos)
53
+ end
54
+ else
55
+ key = @map.index(index)
56
+ pos = @map.delete(key) if key
57
+ if pos then
58
+ @map.each{ | k, v | @map[k] = (v - 1) if pos < v }
59
+ return @store.delete_at(pos)
60
+ end
61
+ end
62
+ return nil
63
+ end
64
+
65
+ alias delete_at delete
66
+
67
+ def size
68
+ @store.size
69
+ end
70
+
71
+ alias length size
72
+
73
+ def first
74
+ @store.first
75
+ end
76
+
77
+ def last
78
+ @store.last
79
+ end
80
+
81
+ def each
82
+ @store.each do |obj |
83
+ yield(obj)
84
+ end
85
+ end
86
+
87
+ def each_index
88
+ @store.each_index { | i | yield(i) }
89
+ end
90
+
91
+ def each_key_value
92
+ @map.each { | k, v | yield(k, @store[v]) }
93
+ end
94
+
95
+ def sort
96
+ @store.sort { | a, b | yield(a, b) }
97
+ end
98
+
99
+ def sort!
100
+ arr = []
101
+ @map.each do |index, pos|
102
+ arr << [index, @store[pos]]
103
+ end
104
+ arr.sort! do |a, b|
105
+ yield(a[1], b[1])
106
+ end
107
+ @map = {}
108
+ @store = []
109
+ arr.each do |pair|
110
+ @map[pair[0]] = @store.size
111
+ @store << pair[1]
112
+ end
113
+ end
114
+ end
115
+
@@ -0,0 +1,397 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ module Xampl
4
+
5
+ def Xampl.make(klass, pid=nil)
6
+ xampl = klass.new
7
+ xampl.set_the_index(pid) if nil != pid
8
+ yield(xampl) if block_given?
9
+ return xampl
10
+ end
11
+
12
+ module XamplWithoutContent
13
+ def has_mixed_content
14
+ false
15
+ end
16
+
17
+ def children
18
+ return []
19
+ end
20
+
21
+ def before_visit_by_element_kind(visitor)
22
+ visitor.before_visit_without_content(self)
23
+ end
24
+
25
+ def visit_by_element_kind(visitor)
26
+ visitor.visit_without_content(self)
27
+ end
28
+
29
+ def after_visit_by_element_kind(visitor)
30
+ visitor.after_visit_without_content(self)
31
+ end
32
+
33
+ def test_to_xml(out="", rules=nil)
34
+ accessed
35
+ rules = XMLPrinter.new(out) if nil == rules
36
+
37
+ rules.attribute(self)
38
+ rules.start_root_element(tag, ns, true)
39
+
40
+ return rules.done
41
+ end
42
+
43
+ def test_to_xml_internal(rules)
44
+ if rules.persisting && self.persist_required then
45
+ rules.persist_attribute(self)
46
+ rules.persisted_element(tag, ns)
47
+ return
48
+ end
49
+
50
+ rules.attribute(self)
51
+ rules.start_element(tag, ns, true)
52
+ end
53
+
54
+ def <<(other)
55
+ if (other.respond_to?("append_to"))
56
+ other.append_to(self)
57
+ else
58
+ raise XamplException.new("no content allowed")
59
+ end
60
+ return self
61
+ end
62
+ end
63
+
64
+ module XamplWithSimpleContent
65
+ def initialize
66
+ super
67
+ @_content = nil unless defined? @_content
68
+ end
69
+
70
+ def has_mixed_content
71
+ false
72
+ end
73
+
74
+ def before_visit_by_element_kind(visitor)
75
+ visitor.before_visit_simple_content(self)
76
+ end
77
+
78
+ def visit_by_element_kind(visitor)
79
+ visitor.visit_simple_content(self)
80
+ end
81
+
82
+ def after_visit_by_element_kind(visitor)
83
+ visitor.after_visit_simple_content(self)
84
+ end
85
+
86
+ def _content
87
+ accessed
88
+ @_content
89
+ end
90
+
91
+ def _content=(v)
92
+ accessed
93
+ v = v.to_s if (v.kind_of? Symbol) and !Xampl.xampl_extends_symbols
94
+ v.extend(XamplExtensionsToRubyObjects) unless v.kind_of? Symbol
95
+ @_content = v
96
+ changed
97
+ end
98
+
99
+ alias content _content
100
+ alias content= _content=
101
+
102
+ def add_content(new_content, tokenise=false)
103
+ return if nil == new_content
104
+ accessed
105
+
106
+ if (nil == @_content) then
107
+ @_content = new_content.to_s
108
+ @_content.extend(XamplExtensionsToRubyObjects)
109
+ else
110
+ @_content << new_content.to_s
111
+ end
112
+
113
+ FromXML.tokenise_string(@_content, false) if tokenise
114
+ @_content = nil if 0 == @_content.size
115
+
116
+ changed
117
+ end
118
+
119
+ def children
120
+ return []
121
+ end
122
+
123
+ def test_to_xml(out="", rules=nil)
124
+ accessed
125
+ rules = XMLPrinter.new(out) if nil == rules
126
+
127
+ rules.attribute(self)
128
+ if (nil == self._content)
129
+ rules.start_root_element(tag, ns, true)
130
+ rules.end_root_element(tag, ns, true)
131
+ else
132
+ rules.start_root_element(tag, ns, false)
133
+ rules._content(content)
134
+ rules.end_root_element(tag, ns, false)
135
+ end
136
+
137
+ return rules.done
138
+ end
139
+
140
+ def test_to_xml_internal(rules)
141
+ if rules.persisting && self.persist_required then
142
+ rules.persist_attribute(self)
143
+ rules.persisted_element(tag, ns)
144
+ return
145
+ end
146
+
147
+ rules.attribute(self)
148
+ if (nil == self._content)
149
+ rules.start_element(tag, ns, true)
150
+ rules._content(content)
151
+ rules.end_element(tag, ns, true)
152
+ else
153
+ rules.start_element(tag, ns, false)
154
+ rules._content(content)
155
+ rules.end_element(tag, ns, false)
156
+ end
157
+ end
158
+
159
+ def <<(other)
160
+ if (other.respond_to?("append_to"))
161
+ raise XamplException.new("simple content only")
162
+ else
163
+ add_content(other)
164
+ end
165
+ return self
166
+ end
167
+ end
168
+
169
+ module XamplWithDataContent
170
+
171
+ def initialize
172
+ super
173
+ init_data_content
174
+ end
175
+
176
+ def has_mixed_content
177
+ false
178
+ end
179
+
180
+ def before_visit_by_element_kind(visitor)
181
+ visitor.before_visit_data_content(self)
182
+ end
183
+
184
+ def visit_by_element_kind(visitor)
185
+ visitor.visit_data_content(self)
186
+ end
187
+
188
+ def after_visit_by_element_kind(visitor)
189
+ visitor.after_visit_data_content(self)
190
+ end
191
+
192
+ def init_data_content
193
+ @_content = nil if not defined? @_content
194
+ @children = [] if not defined? @children
195
+ end
196
+
197
+ def children
198
+ accessed
199
+ return @children
200
+ end
201
+
202
+ def _content
203
+ accessed
204
+ @_content
205
+ end
206
+
207
+ def _content=(v)
208
+ accessed
209
+ v = v.to_s if (v.kind_of? Symbol) and !Xampl.xampl_extends_symbols
210
+ v.extend(XamplExtensionsToRubyObjects) unless v.kind_of? Symbol
211
+ @_content = v
212
+ changed
213
+ end
214
+
215
+ alias content _content
216
+ alias content= _content=
217
+
218
+ def add_content(new_content, tokenise=false)
219
+ return if nil == new_content
220
+ accessed
221
+
222
+ if (nil == @_content) then
223
+ @_content = new_content.to_s
224
+ @_content.extend(XamplExtensionsToRubyObjects)
225
+ else
226
+ @_content << new_content.to_s
227
+ end
228
+
229
+ FromXML.tokenise_string(@_content, false) if tokenise
230
+ @_content = nil if 0 == @_content.size
231
+
232
+ changed
233
+ end
234
+
235
+ def test_to_xml(out="", rules=nil)
236
+ accessed
237
+ rules = XMLPrinter.new(out) if nil == rules
238
+
239
+ rules.attribute(self)
240
+ if (0 == children.length) && (nil == content)
241
+ rules.start_root_element(tag, ns, true)
242
+ rules.end_root_element(tag, ns, true)
243
+ else
244
+ rules.start_root_element(tag, ns, false)
245
+ rules._content(content)
246
+ children.each{ | child |
247
+ child.test_to_xml_internal(rules)
248
+ }
249
+ rules.end_root_element(tag, ns, false)
250
+ end
251
+
252
+ return rules.done
253
+ end
254
+
255
+ def test_to_xml_internal(rules)
256
+ if rules.persisting && self.persist_required then
257
+ rules.persist_attribute(self)
258
+ rules.persisted_element(tag, ns)
259
+ return
260
+ end
261
+
262
+ rules.attribute(self)
263
+ if (self.persist_required && self.load_needed) || ((0 == children.length) && (nil == content))
264
+ rules.start_element(tag, ns, true)
265
+ rules.end_element(tag, ns, true)
266
+ else
267
+ rules.start_element(tag, ns, false)
268
+ rules._content(content)
269
+ children.each{ | child |
270
+ child.test_to_xml_internal(rules)
271
+ }
272
+ rules.end_element(tag, ns, false)
273
+ end
274
+ end
275
+
276
+ def <<(other)
277
+ if (other.respond_to?("append_to"))
278
+ other.append_to(self)
279
+ else
280
+ add_content(other)
281
+ end
282
+ return self
283
+ end
284
+ end
285
+
286
+ module XamplWithMixedContent
287
+ def initialize
288
+ super
289
+ init_mixed_content
290
+ end
291
+
292
+ def init_mixed_content
293
+ @children = [] if not defined? @children
294
+ end
295
+
296
+ def has_mixed_content
297
+ true
298
+ end
299
+
300
+ def before_visit_by_element_kind(visitor)
301
+ visitor.before_visit_mixed_content(self)
302
+ end
303
+
304
+ def visit_by_element_kind(visitor)
305
+ visitor.visit_mixed_content(self)
306
+ end
307
+
308
+ def after_visit_by_element_kind(visitor)
309
+ visitor.after_visit_mixed_content(self)
310
+ end
311
+
312
+ def children
313
+ accessed
314
+ return @children
315
+ end
316
+
317
+ def add_content(new_content, tokenise=false)
318
+ return if nil == new_content
319
+ accessed
320
+
321
+ new_content = new_content.to_s
322
+
323
+ last_child = @children.last
324
+ if last_child and (last_child.kind_of? String) then
325
+ last_child << new_content
326
+ FromXML.tokenise_string(last_child, false) if tokenise
327
+ else
328
+ FromXML.tokenise_string(new_content, false) if tokenise
329
+ new_content.extend(XamplExtensionsToRubyObjects)
330
+ @children << new_content unless 0 == new_content.size
331
+ end
332
+
333
+ changed
334
+ end
335
+
336
+ def test_to_xml(out="", rules=nil)
337
+ accessed
338
+ rules = XMLPrinter.new(out) if nil == rules
339
+
340
+ rules.attribute(self)
341
+ if (0 == children.length)
342
+ rules.start_root_element(tag, ns, true)
343
+ rules.end_root_element(tag, ns, true)
344
+ else
345
+ rules.start_root_element(tag, ns, false)
346
+ rules.now_as_mixed
347
+ children.each{ | child |
348
+ if (child.respond_to? "test_to_xml_internal")
349
+ child.test_to_xml_internal(rules)
350
+ else
351
+ rules._content(child)
352
+ end
353
+ }
354
+ rules.now_as_before
355
+ rules.end_root_element(tag, ns, false)
356
+ end
357
+
358
+ return rules.done
359
+ end
360
+
361
+ def test_to_xml_internal(rules)
362
+ if rules.persisting && self.persist_required then
363
+ rules.persist_attribute(self)
364
+ rules.persisted_element(tag, ns)
365
+ return
366
+ end
367
+
368
+ rules.attribute(self)
369
+ if (self.persist_required && self.load_needed) || (0 == children.length)
370
+ rules.start_element(tag, ns, true)
371
+ rules.end_element(tag, ns, true)
372
+ else
373
+ rules.start_element(tag, ns, false)
374
+ rules.now_as_mixed
375
+ children.each{ | child |
376
+ if (child.respond_to? "test_to_xml_internal")
377
+ child.test_to_xml_internal(rules)
378
+ else
379
+ rules._content(child)
380
+ end
381
+ }
382
+ rules.now_as_before
383
+ rules.end_element(tag, ns, false)
384
+ end
385
+ end
386
+
387
+ def <<(other)
388
+ if (other.respond_to?("append_to"))
389
+ other.append_to(self)
390
+ else
391
+ add_content(other)
392
+ end
393
+ return self
394
+ end
395
+ end
396
+ end
397
+