hutch-xamplr 1.0.5 → 1.1.0

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