hutch-xamplr 1.0.5 → 1.1.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 (76) hide show
  1. data/Rakefile +1 -0
  2. data/VERSION.yml +2 -2
  3. data/examples/random-people-shared-addresses/Makefile +2 -2
  4. data/examples/random-people-shared-addresses/batch-load-users.rb +2 -5
  5. data/examples/random-people-shared-addresses/find-mentions.rb +1 -4
  6. data/examples/random-people-shared-addresses/find-people-by-address.rb +1 -4
  7. data/examples/random-people-shared-addresses/optimise.rb +1 -4
  8. data/examples/random-people-shared-addresses/people.rb +0 -15
  9. data/examples/random-people-shared-addresses/query.rb +1 -4
  10. data/examples/random-people-shared-addresses/query2.rb +1 -4
  11. data/examples/random-people-shared-addresses/results.write.BASELINE +298 -0
  12. data/examples/random-people-shared-addresses/results.write.NEW_ATTR_ENCODING +294 -0
  13. data/examples/random-people-shared-addresses/settings.rb +3 -0
  14. data/examples/random-people/batch-load-users.rb +1 -4
  15. data/examples/random-people/optimise.rb +1 -4
  16. data/examples/random-people/people.rb +0 -3
  17. data/examples/random-people/query.rb +1 -5
  18. data/examples/random-people/query2.rb +1 -4
  19. data/examples/random-people/settings.rb +3 -0
  20. data/examples/random-people/what-to-query-on.rb +1 -3
  21. data/examples/read-testing/Makefile +10 -0
  22. data/examples/read-testing/load.rb +65 -0
  23. data/examples/read-testing/read.rb +51 -0
  24. data/examples/read-testing/results.read.BASELINE +6 -0
  25. data/examples/read-testing/results.read.FAST +5 -0
  26. data/examples/read-testing/rrr.rb +87 -0
  27. data/examples/read-testing/settings.rb +2 -0
  28. data/examples/read-testing/xampl-gen.rb +36 -0
  29. data/examples/read-testing/xml/text.xml +8 -0
  30. data/lib/xamplr.rb +10 -1
  31. data/lib/xamplr/exceptions.rb +97 -0
  32. data/lib/xamplr/from-xml-orig.rb +350 -0
  33. data/lib/xamplr/from-xml.rb +272 -183
  34. data/lib/xamplr/handwritten/example.rb +0 -58
  35. data/lib/xamplr/handwritten/hand-example.rb +0 -27
  36. data/lib/xamplr/handwritten/test-handwritten.rb +0 -37
  37. data/lib/xamplr/mixins.rb +10 -48
  38. data/lib/xamplr/persist-to-xml.rb +249 -0
  39. data/lib/xamplr/persistence.rb +44 -412
  40. data/lib/xamplr/persistence.rb.more_thread_safe +0 -13
  41. data/lib/xamplr/persistence.rb.partially_thread_safe +0 -13
  42. data/lib/xamplr/persister.rb +298 -0
  43. data/lib/xamplr/{persister → persisters}/caches.rb +0 -0
  44. data/lib/xamplr/{persister → persisters}/caching.rb +1 -1
  45. data/lib/xamplr/{persister → persisters}/filesystem.rb +4 -5
  46. data/lib/xamplr/{persister → persisters}/in-memory.rb +1 -1
  47. data/lib/xamplr/{persister → persisters}/simple.rb +0 -0
  48. data/lib/xamplr/{persister → persisters}/tokyo-cabinet.rb +53 -15
  49. data/lib/xamplr/simpleTemplate/{input-c.r4 → obsolete/input-c.r4} +0 -0
  50. data/lib/xamplr/simpleTemplate/{play.r6.txt → obsolete/play.r6.txt} +0 -0
  51. data/lib/xamplr/simpleTemplate/{play_more.r6.txt → obsolete/play_more.r6.txt} +0 -0
  52. data/lib/xamplr/simpleTemplate/{test001.r5 → obsolete/test001.r5} +0 -0
  53. data/lib/xamplr/simpleTemplate/{test002.r5 → obsolete/test002.r5} +0 -0
  54. data/lib/xamplr/simpleTemplate/{test003.r5 → obsolete/test003.r5} +0 -0
  55. data/lib/xamplr/templates/child_indexed.template +1 -1
  56. data/lib/xamplr/templates/element_classes.template +1 -1
  57. data/lib/xamplr/templates/element_data.template +0 -39
  58. data/lib/xamplr/templates/element_empty.template +0 -40
  59. data/lib/xamplr/templates/element_mixed.template +0 -41
  60. data/lib/xamplr/templates/element_simple.template +0 -40
  61. data/lib/xamplr/test-support/bench.rb +6 -26
  62. data/lib/xamplr/test-support/test.rb +1 -89
  63. data/lib/xamplr/visitor.rb +0 -778
  64. data/lib/xamplr/visitors.rb +573 -0
  65. data/lib/xamplr/xampl-generator.rb +1 -1
  66. data/lib/xamplr/xampl-hand-generated.rb +0 -85
  67. data/lib/xamplr/xampl-module.rb +36 -0
  68. data/lib/xamplr/xampl-object-internals.rb +6 -0
  69. data/lib/xamplr/xampl-object.rb +10 -341
  70. data/lib/xamplr/xampl-persisted-object.rb +122 -0
  71. data/lib/xamplr/xml-text.rb +117 -0
  72. metadata +53 -18
  73. data/lib/xamplr/persister/subversion.rb +0 -61
  74. data/lib/xamplr/rac.sh +0 -6
  75. data/lib/xamplr/rac_gen.sh +0 -1
  76. data/lib/xamplr/templates/child_indexed.template.000 +0 -87
@@ -76,7 +76,7 @@ module XamplGenerator
76
76
  namespace = "" unless namespace
77
77
  is_empty = @xpp.emptyElement
78
78
 
79
- nstag = "{{namespace}}#{name}"
79
+ nstag = "{{#{namespace}}}#{name}"
80
80
 
81
81
  elements = @elements_map[namespace]
82
82
  if nil == elements then
@@ -479,21 +479,6 @@ module XamplGenerator
479
479
  ]
480
480
  include ElementAsChild
481
481
 
482
- @@to_yaml_properties = [ "@pid" ]
483
- @@to_yaml_properties_all = [
484
- "@pid",
485
- "@children",
486
- "@_content"
487
- ]
488
-
489
- def to_yaml_properties
490
- if is_yaml_root(self) then
491
- return @@to_yaml_properties_all
492
- else
493
- return @@to_yaml_properties
494
- end
495
- end
496
-
497
482
  def Elements.lookup(pid)
498
483
  Xampl.lookup(Elements, pid)
499
484
  end
@@ -635,26 +620,6 @@ module XamplGenerator
635
620
  include ChildElementAsChild
636
621
  include AttributeAsChild
637
622
 
638
- @@to_yaml_properties = [
639
- "@has_content",
640
- "@class_name",
641
- "@attribute_name",
642
- "@nstag",
643
- "@empty",
644
- "@indexed_by_attr",
645
- "@persisted",
646
- "@name",
647
- "@kind",
648
- "@namespace",
649
- "@package",
650
- "@children",
651
- "@_content"
652
- ]
653
-
654
- def to_yaml_properties
655
- @@to_yaml_properties
656
- end
657
-
658
623
  def has_content
659
624
  accessed
660
625
  @has_content
@@ -911,19 +876,6 @@ module XamplGenerator
911
876
  [ :@package, "package" ],
912
877
  ]
913
878
 
914
- @@to_yaml_properties = [
915
- "@element_name",
916
- "@name",
917
- "@namespace",
918
- "@index_class",
919
- "@index",
920
- "@package",
921
- ]
922
-
923
- def to_yaml_properties
924
- @@to_yaml_properties
925
- end
926
-
927
879
  def element_name
928
880
  accessed
929
881
  @element_name
@@ -1108,15 +1060,6 @@ module XamplGenerator
1108
1060
  [ :@name, "name" ],
1109
1061
  ]
1110
1062
 
1111
- @@to_yaml_properties = [
1112
- "@namespace",
1113
- "@name",
1114
- ]
1115
-
1116
- def to_yaml_properties
1117
- @@to_yaml_properties
1118
- end
1119
-
1120
1063
  def namespace
1121
1064
  accessed
1122
1065
  @namespace
@@ -1249,15 +1192,6 @@ module XamplGenerator
1249
1192
  include IndexAttributeAsChild
1250
1193
  include ResolveAsChild
1251
1194
 
1252
- @@to_yaml_properties = [
1253
- "@children",
1254
- "@_content"
1255
- ]
1256
-
1257
- def to_yaml_properties
1258
- @@to_yaml_properties
1259
- end
1260
-
1261
1195
  def initialize
1262
1196
  super
1263
1197
 
@@ -1353,15 +1287,6 @@ module XamplGenerator
1353
1287
  [ :@persisted, "persisted" ],
1354
1288
  ]
1355
1289
 
1356
- @@to_yaml_properties = [
1357
- "@name",
1358
- "@persisted",
1359
- ]
1360
-
1361
- def to_yaml_properties
1362
- @@to_yaml_properties
1363
- end
1364
-
1365
1290
  def name
1366
1291
  accessed
1367
1292
  @name
@@ -1495,16 +1420,6 @@ module XamplGenerator
1495
1420
  [ :@preferred_prefix, "preferred_prefix" ],
1496
1421
  ]
1497
1422
 
1498
- @@to_yaml_properties = [
1499
- "@namespace",
1500
- "@pkg",
1501
- "@preferred_prefix",
1502
- ]
1503
-
1504
- def to_yaml_properties
1505
- @@to_yaml_properties
1506
- end
1507
-
1508
1423
  def namespace
1509
1424
  accessed
1510
1425
  @namespace
@@ -0,0 +1,36 @@
1
+
2
+ require "xamplr/persister"
3
+
4
+
5
+ module Xampl
6
+
7
+ @@xampl_extends_symbols = false
8
+
9
+ def Xampl.xampl_extends_symbols
10
+ @@xampl_extends_symbols
11
+ end
12
+
13
+ def Xampl.xampl_extends_symbols=(v)
14
+ @@xampl_extends_symbols = v
15
+
16
+ if @@xampl_extends_symbols then
17
+ Symbol.module_eval("include XamplExtensionsToRubyObjects")
18
+ end
19
+ end
20
+
21
+ class XamplLiteralRubyObject
22
+ def initialize(thing)
23
+ @thing = thing
24
+ end
25
+
26
+ def to_xml(out="")
27
+ out << @thing.to_s
28
+ end
29
+ end
30
+
31
+ module XamplExtensionsToRubyObjects
32
+ def to_xml(out="")
33
+ out << self.to_s
34
+ end
35
+ end
36
+ end
@@ -0,0 +1,6 @@
1
+ module Xampl
2
+
3
+ module InvalidXampl
4
+ end
5
+
6
+ end
@@ -1,14 +1,9 @@
1
- #!/usr/bin/env ruby
2
1
 
3
2
  module Xampl
4
3
 
5
- module InvalidXampl
6
- end
7
-
8
4
  module XamplObject
9
5
  attr_accessor :is_changed, :parents
10
6
 
11
- @@yaml_root = nil
12
7
  @@preferred_ns_prefix = { "http://xampl.com/" => "xampl",
13
8
  "http://xampl.com/generator" => "xampl-gen",
14
9
  "http://www.w3.org/XML/1998/namespace" => "xml" }
@@ -76,8 +71,8 @@ module Xampl
76
71
  def init_attributes(attr_name, attr_namespace, attr_value)
77
72
  return unless attr_name
78
73
 
79
- attr_name.each_index{ | i |
80
- self.attributes.each{ | attr_spec |
74
+ attr_name.each_index do |i|
75
+ self.attributes.each do |attr_spec|
81
76
  if (2 == attr_spec.size) then
82
77
  if (attr_spec[1] == attr_name[i]) then
83
78
  self.instance_variable_set(attr_spec[0], attr_value[i])
@@ -87,8 +82,8 @@ module Xampl
87
82
  self.instance_variable_set(attr_spec[0], attr_value[i])
88
83
  end
89
84
  end
90
- }
91
- }
85
+ end
86
+ end
92
87
  end
93
88
 
94
89
  def compare_xampl(other)
@@ -96,14 +91,14 @@ module Xampl
96
91
  other.accessed if other
97
92
  return false unless self.class == other.class
98
93
  return false unless self.children.size == other.children.size
99
- self.children.zip(other.children).each{ | c1, c2 |
94
+ self.children.zip(other.children).each do |c1, c2|
100
95
  return false unless c1.class == c2.class
101
96
  if c1.kind_of? String then
102
97
  return false unless c1 == c2
103
98
  else
104
99
  return false unless c1.compare_xampl(c2)
105
100
  end
106
- }
101
+ end
107
102
  if (defined? self._content) and (defined? other._content) then
108
103
  return false unless self._content == other._content
109
104
  else
@@ -117,14 +112,14 @@ module Xampl
117
112
  other.accessed if other
118
113
  return false unless self.class == other.class
119
114
  return false unless self.children.size == other.children.size
120
- self.children.zip(other.children).each{ | c1, c2 |
115
+ self.children.zip(other.children).each do |c1, c2|
121
116
  return false unless c1.class == c2.class
122
117
  if c1.kind_of? String then
123
118
  return false unless c1 == c2
124
119
  else
125
120
  return false unless c1 === c2
126
121
  end
127
- }
122
+ end
128
123
  if (defined? self._content) and (defined? other._content) then
129
124
  return false unless self._content == other._content
130
125
  else
@@ -140,9 +135,6 @@ module Xampl
140
135
 
141
136
  module XamplRubyDefinition
142
137
  @@proc = nil
143
- # def initialize
144
- # @@proc = nil
145
- # end
146
138
 
147
139
  def XamplRubyDefinition.build(target = nil)
148
140
  xampl = nil
@@ -186,33 +178,9 @@ module Xampl
186
178
  xampl = XamplRubyDefinition.build(target)
187
179
  end
188
180
 
189
- def XamplObject.from_yaml(yaml_string, target=nil)
190
- unstitched = YAML::load(yaml_string)
191
- unstitched.stitch_yaml
192
- if target then
193
- vars = unstitched.instance_variables
194
- vars.each { | ivar |
195
- v = unstitched.instance_variable_get(ivar)
196
- target.instance_variable_set(ivar, v)
197
- }
198
- unstitched = target
199
- end
200
- return unstitched
201
- end
202
-
203
- def is_yaml_root(xampl)
204
- xampl == @@yaml_root
205
- end
206
-
207
- def as_yaml
208
- @@yaml_root = self unless @@yaml_root
209
- result = YAML::dump(self)
210
- @@yaml_root = nil if self == @@yaml_root
211
- return result
212
- end
213
-
214
181
  def persist(out="", mentions=nil, rules=nil)
215
- return PersistXML.new(out, mentions).start(self).done
182
+ persist_xml_new = PersistXML.new(out, mentions)
183
+ return persist_xml_new.start(self).done
216
184
  end
217
185
 
218
186
  def XamplObject.realise_from_xml_string(xml_string, target=nil, tokenise=true)
@@ -229,305 +197,6 @@ module Xampl
229
197
  end
230
198
  end
231
199
 
232
- @@xampl_extends_symbols = false
233
-
234
- def Xampl.xampl_extends_symbols
235
- @@xampl_extends_symbols
236
- end
237
-
238
- def Xampl.xampl_extends_symbols=(v)
239
- @@xampl_extends_symbols = v
240
-
241
- if @@xampl_extends_symbols then
242
- Symbol.module_eval("include XamplExtensionsToRubyObjects")
243
- end
244
- end
245
-
246
- class XamplLiteralRubyObject
247
- def initialize(thing)
248
- @thing = thing
249
- end
250
-
251
- def to_xml(out="")
252
- out << @thing.to_s
253
- end
254
- end
255
-
256
- module XamplExtensionsToRubyObjects
257
- def to_xml(out="")
258
- out << self.to_s
259
- end
260
- end
261
-
262
- module XamplPersistedObject
263
- include XamplObject
264
-
265
- attr_reader :persister
266
- attr_accessor :load_needed
267
-
268
- def persist_required
269
- return true
270
- end
271
-
272
- def accessed
273
- raise XamplIsInvalid.new(self) if invalid
274
- # TODO -- why do I need to get rid of this line, alternatively, why
275
- # is this next line even there? Well, because accessed is now called
276
- # differently. But???
277
- #raise NoActivePersister unless @persister
278
-
279
- if @load_needed and @persister then
280
- raise NoActivePersister.new unless @persister
281
-
282
- if nil == Xampl.persister then
283
- #raise UnmanagedChange.new(self)
284
- if not @persister.syncing then
285
- Xampl.read_only(@persister){
286
- Xampl.lazy_load(self)
287
- }
288
- else
289
- puts "LOAD NEEDED(2): REFUSED (persister: #{@persister.name})"
290
- puts " pid: #{self.get_the_index} #{self}"
291
- caller(0).each { | trace | puts " #{trace}"}
292
- end
293
- elsif Xampl.persister != @persister then
294
- raise MixedPersisters.new(@persister, self)
295
- elsif Xampl.persister == @persister then
296
- if not @persister.syncing then
297
- Xampl.lazy_load(self)
298
- else
299
- puts "LOAD NEEDED(3): REFUSED (persister: #{@persister.name})"
300
- puts " pid: #{self.get_the_index} #{self}"
301
- caller(0).each { | trace | puts " #{trace}"}
302
- end
303
- else
304
- puts "LOAD NEEDED(4): REFUSED (persister: #{@persister.name})"
305
- puts " pid: #{self.get_the_index} #{self}"
306
- caller(0).each { | trace | puts " #{trace}"}
307
- end
308
- else
309
- puts "LOAD NEEDED(5): REFUSED (persister: #{@persister})" if @load_needed
310
- puts " pid: #{self.get_the_index} #{self}" if @load_needed
311
- caller(0).each { | trace | puts " #{trace}"} if @load_needed
312
- end
313
- end
314
-
315
- def changed
316
- #puts "CHANGED: is_changed #{@is_changed} xampl #{self}"
317
- unless Xampl.persister then
318
- raise UnmanagedChange.new(self)
319
- end
320
- if @persister then
321
- if Xampl.persister != @persister then
322
- raise UnmanagedChange.new(self)
323
- end
324
- if @persister.block_changes then
325
- raise BlockedChange.new(self)
326
- end
327
- end
328
- unless @is_changed then
329
- @is_changed = true
330
- if @persister then
331
- @persister.has_changed self
332
- end
333
- end
334
- end
335
-
336
- def force_load
337
- @load_needed = true
338
- @is_changed = false
339
- @persister.has_not_changed(self) if @persister
340
- self.clear_non_persistent_index_attributes
341
- self.methods.grep(/init_.*_as_child/).each{ | method_name |
342
- self.send(method_name)
343
- }
344
- @children = []
345
- end
346
-
347
- def reset_contents
348
- self.clear_non_persistent_index_attributes
349
- self.methods.grep(/init_.*_as_child/).each{ | method_name |
350
- self.send(method_name)
351
- }
352
- @children = []
353
- end
354
200
 
355
- def introduce_persister(persister)
356
- #accessed
357
- if @persister and (@persister != persister) then
358
- raise AlreadyKnownToPersister.new(self, persister)
359
- end
360
- @persister = persister
361
- return true
362
- end
363
-
364
- def init_xampl_object
365
- super
366
- @persister = nil
367
- @load_needed = false
368
- if (Xampl.persister and Xampl.persister.automatic) then
369
- Xampl.persister.introduce(self)
370
- else
371
- introduce_persister(nil)
372
- end
373
- end
374
-
375
- def describe_yourself
376
- nil
377
- end
378
- end
379
-
380
- class XMLText
381
- attr_accessor :namespaces, :prefix_ns_map, :ns, :first_text, :text
382
-
383
- def initialize
384
- @namespaces = []
385
- @prefix_ns_map = {}
386
- @first_text = nil
387
- @text = nil
388
- @ns = nil
389
- end
390
-
391
- def start_element(pp, depth)
392
- @namespaces = {}
393
- @namespaces[pp.namespace] = pp.namespace
394
-
395
- depth += 1
396
-
397
- if @first_text then
398
- @text << "<" << pp.qname
399
-
400
- pp.attributeCount.times{ | i |
401
- @text << " " << pp.attributeQName(i) << "='" << pp.attributeValue(i) << "'"
402
-
403
- prefix = pp.attributePrefix(i)
404
- if prefix then
405
- @prefix_ns_map[prefix] = pp.attributeNamespace(i)
406
- end
407
- }
408
- else
409
- @first_text = "<" << pp.qname
410
-
411
- pp.attributeCount.times{ | i |
412
- @first_text << " " << pp.attributeQName(i) << "='" << pp.attributeValue(i) << "'"
413
-
414
- prefix = pp.attributePrefix(i)
415
- if prefix then
416
- @prefix_ns_map[prefix] = pp.attributeNamespace(i)
417
- end
418
- }
419
- @text = ""
420
- end
421
-
422
- prefix = pp.prefix
423
- if prefix then
424
- @prefix_ns_map[prefix] = pp.namespace
425
- end
426
-
427
- if @ns != pp.namespace then
428
- @text << " xmlns='" << pp.namespace << "'"
429
- end
430
-
431
- @text << ">"
432
-
433
- return depth
434
- end
435
-
436
- def end_element(pp, depth)
437
- depth -= 1
438
-
439
- @text << "</"
440
- @text << pp.prefix << ":" if pp.prefix
441
- @text << pp.name << ">"
442
-
443
- return depth
444
- end
445
-
446
- def to_s
447
- @text
448
- end
449
-
450
- def to_xml(xml_printer=nil)
451
- @text
452
- end
453
-
454
- def build(pp)
455
- @namespaces = {}
456
- @first_text = nil
457
- @text = nil
458
-
459
- depth = start_element(pp, 0)
460
-
461
- while true
462
- raise XamplException.new("unexpected end of document") if pp.endDocument?
463
-
464
- case pp.nextEvent
465
- when Xampl_PP::START_DOCUMENT
466
- raise XamplException.new("unexpected start of document")
467
- when Xampl_PP::END_DOCUMENT
468
- raise XamplException.new("unexpected end of document")
469
- when Xampl_PP::START_ELEMENT
470
- depth = start_element(pp, depth)
471
- when Xampl_PP::END_ELEMENT
472
- depth = end_element(pp, depth)
473
- break if depth <= 0
474
- when Xampl_PP::TEXT, Xampl_PP::CDATA_SECTION, Xampl_PP::ENTITY_REF
475
- @text << pp.text
476
- #when Xampl_PP::IGNORABLE_WHITESPACE
477
- #when Xampl_PP::PROCESSING_INSTRUCTION
478
- #when Xampl_PP::COMMENT
479
- #when Xampl_PP::DOCTYPE
480
- end
481
- end
482
-
483
- @namespaces = @namespaces.keys
484
-
485
- @prefix_ns_map.sort.each { | prefix, ns |
486
- @first_text << " xmlns:" << prefix << "='" << ns << "'"
487
- }
488
- @first_text << @text
489
- @text = @first_text
490
- @first_text = nil
491
- end
492
- end
493
-
494
- class XamplIsInvalid < Exception
495
- attr_reader :msg, :xampl
496
-
497
- def initialize(xampl)
498
- @xampl = xampl
499
- @msg = "Invalid Xampl:: #{xampl}"
500
- end
501
-
502
- def message
503
- @msg
504
- end
505
- end
506
-
507
- class AlreadyKnownToPersister < Exception
508
- attr_reader :msg, :xampl
509
-
510
- def initialize(xampl, persister)
511
- @xampl = xampl
512
- @msg = "#{xampl} #{xampl.get_the_index} is already known by a persister: #{xampl.persister.name}, so cannot use persister #{persister.name}"
513
- end
514
-
515
- def message
516
- @msg
517
- end
518
- end
519
-
520
- class XamplException < Exception
521
- attr_reader :name, :msg
522
-
523
- def initialize(name, message=nil)
524
- @name = name
525
- @msg = message ? message : ""
526
- end
527
-
528
- def message
529
- "XamplException #{@name} #{@msg}"
530
- end
531
- end
532
201
  end
533
202