xamplr 1.2.0 → 1.3.15

Sign up to get free protection for your applications and to get access to all the features.
Files changed (133) hide show
  1. data/.document +5 -0
  2. data/.gitignore +12 -0
  3. data/CHANGES.txt +37 -0
  4. data/COPYING +661 -0
  5. data/Makefile +13 -0
  6. data/README.rdoc +24 -4
  7. data/Rakefile +2 -2
  8. data/VERSION.yml +3 -2
  9. data/bin/xampl-gen +17 -0
  10. data/docs/intro/.gitignore +1 -0
  11. data/docs/intro/example1/example1.rb +6 -0
  12. data/docs/intro/example1/xml/hello.xml +1 -0
  13. data/docs/intro/example2/example2.rb +38 -0
  14. data/docs/intro/example2/project-generator.rb +22 -0
  15. data/docs/intro/example2/xml/hello.xml +2 -0
  16. data/docs/intro/example3/example3.rb +30 -0
  17. data/docs/intro/example3/example3a.rb +16 -0
  18. data/docs/intro/example3/generated.png +0 -0
  19. data/docs/intro/example3/grab-yuml.rb +10 -0
  20. data/docs/intro/example3/greeter.rb +15 -0
  21. data/docs/intro/example3/greeting.rb +9 -0
  22. data/docs/intro/example3/project-generator.rb +25 -0
  23. data/docs/intro/example3/xml/greeter.xml +6 -0
  24. data/docs/intro/example4/example4.rb +27 -0
  25. data/docs/intro/example4/example4a.rb +19 -0
  26. data/docs/intro/example4/grab-yuml.rb +10 -0
  27. data/docs/intro/example4/greeter.rb +15 -0
  28. data/docs/intro/example4/greeting.rb +9 -0
  29. data/docs/intro/example4/project-generator.rb +25 -0
  30. data/docs/intro/example4/xml/greeter.xml +6 -0
  31. data/docs/intro/grab-yuml.rb +10 -0
  32. data/docs/intro/project-generator.rb +51 -0
  33. data/docs/intro/xampl.lyx +1494 -0
  34. data/docs/intro/xampl.pdf +0 -0
  35. data/examples/employees/final/xampl-gen.rb +38 -0
  36. data/examples/employees/final/xml/ddd-final.xml +86 -0
  37. data/examples/employees/final-xampl/xampl-gen.rb +38 -0
  38. data/examples/employees/final-xampl/xml/ddd-final-xampl.xml +86 -0
  39. data/examples/employees/first/xampl-gen.rb +38 -0
  40. data/examples/employees/first/xml/ddd-first.xml +48 -0
  41. data/examples/employees/twist/twist.graphml +333 -0
  42. data/examples/employees/twist/xampl-gen.rb +38 -0
  43. data/examples/employees/twist/xml/twist.xml +90 -0
  44. data/examples/employees/xamplr-twist.xml +2 -0
  45. data/examples/employees/yuml-diagrams/DDD-final-approach.graphml +393 -0
  46. data/examples/employees/yuml-diagrams/DDD-final-xampl-approach.graphml +265 -0
  47. data/examples/employees/yuml-diagrams/DDD-ideal-final-approach.graphml +357 -0
  48. data/examples/employees/yuml-diagrams/ddd-final.png +0 -0
  49. data/examples/employees/yuml-diagrams/ddd-final.yuml +8 -0
  50. data/examples/employees/yuml-diagrams/ddd-first.png +0 -0
  51. data/examples/employees/yuml-diagrams/ddd-first.yuml +7 -0
  52. data/examples/employees/yuml-diagrams/final-yed.png +0 -0
  53. data/examples/employees/yuml-diagrams/first-yed.png +0 -0
  54. data/examples/employees/yuml-diagrams/twist.png +0 -0
  55. data/examples/employees/yuml-diagrams/twist.yuml +12 -0
  56. data/examples/employees/yuml-diagrams/xamplr-final-no-mixins.png +0 -0
  57. data/examples/employees/yuml-diagrams/xamplr-final-simplified.png +0 -0
  58. data/examples/employees/yuml-diagrams/xamplr-final-with-mixins.png +0 -0
  59. data/examples/employees/yuml-diagrams/yuml-simplified.txt +19 -0
  60. data/examples/employees/yuml-diagrams/yuml-with-mixins.txt +53 -0
  61. data/examples/employees/yuml-diagrams/yuml.txt +27 -0
  62. data/examples/hobbies/Makefile +5 -0
  63. data/examples/hobbies/hobbies.rb +193 -0
  64. data/examples/hobbies/project-generator.rb +25 -0
  65. data/examples/hobbies/xampl-gen.rb +38 -0
  66. data/examples/hobbies/xml/hobby.xml +3 -0
  67. data/examples/hobbies/xml/people.xml +5 -0
  68. data/examples/random-people/.gitignore +2 -0
  69. data/examples/random-people/Makefile +5 -1
  70. data/examples/random-people/xampl-gen.rb +5 -2
  71. data/examples/random-people-shared-addresses/.gitignore +2 -0
  72. data/examples/random-people-shared-addresses/Makefile +8 -9
  73. data/examples/random-people-shared-addresses/batch-load-users-profiled.rb +91 -0
  74. data/examples/random-people-shared-addresses/batch-load-users-safe.rb +81 -0
  75. data/examples/random-people-shared-addresses/batch-load-users.rb +59 -63
  76. data/examples/random-people-shared-addresses/xampl-gen.rb +2 -0
  77. data/examples/read-testing/.gitignore +2 -0
  78. data/examples/read-testing/rrr.rb +2 -1
  79. data/examples/read-testing/xampl-gen.rb +2 -0
  80. data/examples/tokyo-cabinet-experimental/.gitignore +2 -0
  81. data/examples/tokyo-cabinet-experimental/xampl-gen.rb +2 -0
  82. data/examples/write-testing/README +4 -0
  83. data/examples/write-testing/RESULTS.home +33 -0
  84. data/examples/write-testing/RESULTS.raconteur +33 -0
  85. data/examples/write-testing/write-speed-test.rb +40 -0
  86. data/lib/xamplr/.cvsignore +1 -0
  87. data/lib/xamplr/TODO +2 -1
  88. data/lib/xamplr/exceptions.rb +24 -1
  89. data/lib/xamplr/from-xml.rb +13 -5
  90. data/lib/xamplr/graphml-out.rb +6 -25
  91. data/lib/xamplr/indexed-array.rb +10 -2
  92. data/lib/xamplr/persist-to-xml.rb +6 -7
  93. data/lib/xamplr/persistence.rb +132 -48
  94. data/lib/xamplr/persister.rb +48 -25
  95. data/lib/xamplr/persisters/filesystem.rb +8 -2
  96. data/lib/xamplr/persisters/tokyo-cabinet.rb +243 -63
  97. data/lib/xamplr/persisters/tokyo-cabinet.rb.1-DB +694 -0
  98. data/lib/xamplr/persisters/tokyo-cabinet.rb.N-DB +692 -0
  99. data/lib/xamplr/persisters/tokyo-cabinet.rb.NICE-TRY +807 -0
  100. data/lib/xamplr/templates/.cvsignore +3 -0
  101. data/lib/xamplr/templates/child_indexed.template +6 -6
  102. data/lib/xamplr/templates/element_data.template +2 -1
  103. data/lib/xamplr/templates/element_empty.template +2 -10
  104. data/lib/xamplr/templates/element_mixed.template +2 -1
  105. data/lib/xamplr/templates/element_simple.template +2 -1
  106. data/lib/xamplr/templates/package.template +13 -1
  107. data/lib/xamplr/visitor.rb +7 -6
  108. data/lib/xamplr/visitors.rb +2 -1
  109. data/lib/xamplr/xampl-cl-gen.rb +89 -0
  110. data/lib/xamplr/xampl-generator.rb +86 -50
  111. data/lib/xamplr/xampl-object.rb +51 -0
  112. data/lib/xamplr/xampl-persisted-object.rb +13 -4
  113. data/lib/xamplr/yuml-out.rb +129 -0
  114. data/lib/xamplr-generator.rb +0 -1
  115. data/lib/xamplr.rb +18 -18
  116. data/regression/tc-indexes-crossing-pid-boundaries/Makefile +14 -0
  117. data/regression/tc-indexes-crossing-pid-boundaries/bad-idea.rb +40 -0
  118. data/regression/tc-indexes-crossing-pid-boundaries/fail-badly.rb +17 -0
  119. data/regression/tc-indexes-crossing-pid-boundaries/fail.rb +11 -0
  120. data/regression/tc-indexes-crossing-pid-boundaries/fucking-bad-idea.rb +44 -0
  121. data/regression/tc-indexes-crossing-pid-boundaries/setup.rb +15 -0
  122. data/regression/tc-indexes-crossing-pid-boundaries/xml/bad-idea.xml +4 -0
  123. data/regression/tightly-nested-mutual-mentions/Makefile +14 -0
  124. data/regression/tightly-nested-mutual-mentions/build.rb +31 -0
  125. data/regression/tightly-nested-mutual-mentions/load.rb +21 -0
  126. data/regression/tightly-nested-mutual-mentions/repo-keep.tgz +0 -0
  127. data/regression/tightly-nested-mutual-mentions/setup.rb +8 -0
  128. data/regression/tightly-nested-mutual-mentions/xampl-gen.rb +36 -0
  129. data/regression/tightly-nested-mutual-mentions/xml/stuff.xml +7 -0
  130. data/xamplr.gemspec +322 -0
  131. metadata +116 -13
  132. data/test/test_helper.rb +0 -10
  133. data/test/xamplr_test.rb +0 -7
@@ -0,0 +1,3 @@
1
+ nice-try
2
+ old
3
+ .cvs.log
@@ -30,7 +30,7 @@
30
30
 
31
31
  return existing if existing == #{element.attribute_name}
32
32
 
33
- self.remove_#{element.attribute_name}(index) if existing
33
+ self.remove_#{element.attribute_name}(index) if existing
34
34
 
35
35
  @children << #{element.attribute_name}
36
36
  @#{element.attribute_name}_child[index] = #{element.attribute_name}
@@ -62,7 +62,7 @@
62
62
  accessed
63
63
 
64
64
  #{element.attribute_name} = @#{element.attribute_name}_child[index]
65
- return #{element.attribute_name} if #{element.attribute_name}
65
+ return #{element.attribute_name} if #{element.attribute_name}
66
66
 
67
67
  |
68
68
  |if @element.persisted then
@@ -75,14 +75,14 @@
75
75
 
76
76
  yield(#{element.attribute_name}) if block_given?
77
77
  return add_#{element.attribute_name}(#{element.attribute_name})
78
- end
78
+ end
79
79
 
80
80
  def remove_#{element.attribute_name}(index)
81
81
  accessed
82
- changed
83
- unless String === index or Symbol === index then
82
+ changed
83
+ unless String === index or Symbol === index then
84
84
  index = index.get_the_index
85
- end
85
+ end
86
86
  #{element.attribute_name} = @#{element.attribute_name}_child.delete(index) if index
87
87
  @children.delete(#{element.attribute_name})
88
88
  end
@@ -6,6 +6,7 @@
6
6
  |
7
7
  include Xampl::XamplPersistedObject
8
8
 
9
+ #supports class based over-ride of persister format
9
10
  @@default_persister_format = nil
10
11
 
11
12
  def default_persister_format
@@ -90,7 +91,7 @@
90
91
 
91
92
  def #{attribute.name}=(v)
92
93
  accessed
93
- # This is kind of optimistic, I think you are in trouble if you do this
94
+ # This is kind of optimistic, I think you are in trouble if you do this
94
95
  Xampl.auto_uncache(self) if @#{attribute.name}
95
96
  @#{attribute.name} = v
96
97
  changed
@@ -5,6 +5,7 @@
5
5
  |
6
6
  include Xampl::XamplPersistedObject
7
7
 
8
+ #supports class based over-ride of persister format
8
9
  @@default_persister_format = nil
9
10
 
10
11
  def default_persister_format
@@ -83,18 +84,9 @@
83
84
  @#{attribute.name}
84
85
  end
85
86
 
86
- def xxx#{attribute.name}=(v)
87
- accessed
88
- # This is kind of optimistic, I think you are in trouble if you do this
89
- Xampl.auto_uncache(self) if @#{attribute.name}
90
- @#{attribute.name} = v
91
- changed
92
- Xampl.auto_cache(self) if v
93
- end
94
-
95
87
  def #{attribute.name}=(v)
96
88
  accessed
97
- # This is kind of optimistic, I think you are in trouble if you do this
89
+ # This is kind of optimistic, I think you are in trouble if you do this
98
90
  Xampl.auto_uncache(self) if @#{attribute.name}
99
91
  @#{attribute.name} = v
100
92
  changed
@@ -5,6 +5,7 @@
5
5
  |
6
6
  include Xampl::XamplPersistedObject
7
7
 
8
+ #supports class based over-ride of persister format
8
9
  @@default_persister_format = nil
9
10
 
10
11
  def default_persister_format
@@ -85,7 +86,7 @@
85
86
 
86
87
  def #{attribute.name}=(v)
87
88
  accessed
88
- # This is kind of optimistic, I think you are in trouble if you do this
89
+ # This is kind of optimistic, I think you are in trouble if you do this
89
90
  Xampl.auto_uncache(self) if @#{attribute.name}
90
91
  @#{attribute.name} = v
91
92
  changed
@@ -5,6 +5,7 @@
5
5
  |
6
6
  include Xampl::XamplPersistedObject
7
7
 
8
+ #supports class based over-ride of persister format
8
9
  @@default_persister_format = nil
9
10
 
10
11
  def default_persister_format
@@ -85,7 +86,7 @@
85
86
 
86
87
  def #{attribute.name}=(v)
87
88
  accessed
88
- # This is kind of optimistic, I think you are in trouble if you do this
89
+ # This is kind of optimistic, I think you are in trouble if you do this
89
90
  Xampl.auto_uncache(self) if @#{attribute.name}
90
91
  @#{attribute.name} = v
91
92
  changed
@@ -1,7 +1,13 @@
1
+ |
2
+ | unless 'XamplAdHoc' == package_name
3
+ |
1
4
  module #{package_name}
5
+ |
6
+ | end
7
+ |
2
8
 
3
9
  require "xamplr"
4
- include Xampl
10
+ include Xampl
5
11
 
6
12
  |
7
13
  | @required_packages.each_key{ | required_package_name |
@@ -23,4 +29,10 @@ module #{package_name}
23
29
  | end
24
30
  |
25
31
  #{place}
32
+ |
33
+ | unless 'XamplAdHoc' == package_name
34
+ |
26
35
  end
36
+ |
37
+ | end
38
+ |
@@ -118,12 +118,13 @@ module Xampl
118
118
  after_visit(xampl)
119
119
  return self
120
120
 
121
- rescue => e
122
- puts "visit failed !!!!! #{ e }"
123
- e.backtrace.each do | trace |
124
- puts " #{trace}"
125
- break if /actionpack/ =~ trace
126
- end
121
+ #rescue => e
122
+ # puts "visit failed !!!!! #{ e }"
123
+ # e.backtrace.each do | trace |
124
+ # puts " #{trace}"
125
+ # break if /actionpack/ =~ trace
126
+ # end
127
+ # raise e
127
128
 
128
129
  ensure
129
130
  n = @visiting[xampl]
@@ -320,7 +320,8 @@ module Xampl
320
320
  @pid_translations_old_to_new = translate_pids
321
321
  @pid_translations_new_to_old = translate_pids.invert
322
322
 
323
- @persisted_xampl_found = { @current_root.get_the_index => root }
323
+ # @persisted_xampl_found = { @current_root.get_the_index => root }
324
+ @persisted_xampl_found = { (@current_root || root).get_the_index => root } #TODO -- is root ever okay here?
324
325
  @copies_by_old_pid = {}
325
326
 
326
327
  while true do
@@ -0,0 +1,89 @@
1
+
2
+ require 'xamplr-generator'
3
+
4
+ include XamplGenerator
5
+ include Xampl
6
+
7
+ class ProjectGenerator
8
+
9
+ def directory
10
+ File.join(%w{ . xampl_generated_code })
11
+ end
12
+
13
+ def filenames
14
+ Dir.glob("./xml/**/*.xml")
15
+ end
16
+
17
+ def print_base_filename
18
+ File.join(%w{ . generated })
19
+ end
20
+
21
+ def print_options
22
+ # return an array containing any (or none) of:
23
+ # :schema -- a schema-like xml representation of the generated code
24
+ # :graphml -- a graphml file describing the class model (compatible with yEd)
25
+ # :yuml -- a yuml file that represents a simplified class model (compatible with yUML)
26
+
27
+ # [:schema, :graphml, :yuml]
28
+ []
29
+ end
30
+
31
+ def print
32
+ nil
33
+ end
34
+
35
+ def persisted_attributes
36
+ %w{ pid }
37
+ end
38
+
39
+ def indexed_attributes
40
+ %w{ id }
41
+ end
42
+
43
+ def resolve_namespaces
44
+ # any array of arrays
45
+ # each sub-array:
46
+ # 0: a string or an array of strings, containing xml namespaces found in the example xml files
47
+ # an empty string is the default namespace
48
+ # 1: a ruby Module name (get the cases right)
49
+ # 2: a namespace prefix used when writing xml, optional. A generated prefix will be used otherwise.
50
+ []
51
+ end
52
+
53
+ def generate
54
+
55
+ # Xampl.set_default_persister_kind(:simple)
56
+ Xampl.set_default_persister_kind(:in_memory)
57
+ # Xampl.set_default_persister_kind(:filesystem)
58
+ # Xampl.set_default_persister_kind(:tokyo_cabinet)
59
+ # Xampl.set_default_persister_format(:xml_format)
60
+
61
+ Xampl.transaction("project-generation") do
62
+
63
+ options = Options.new do | opts |
64
+ persisted_attributes.each do | pattr |
65
+ opts.new_index_attribute(pattr).persisted = true
66
+ end
67
+
68
+ indexed_attributes.each do | iattr |
69
+ opts.new_index_attribute(iattr)
70
+ end
71
+
72
+ resolve_namespaces.each do | namespace, ruby_module_name, output_ns_prefix |
73
+ opts.resolve(namespace, ruby_module_name, output_ns_prefix)
74
+ end
75
+
76
+ end
77
+
78
+ generator = Generator.new('generator')
79
+ generator.go(:options => options,
80
+ :filenames => filenames,
81
+ :directory => directory)
82
+
83
+ puts generator.print_elements(print_base_filename, print_options)
84
+
85
+ Xampl.rollback
86
+ end
87
+ end
88
+ end
89
+
@@ -1,12 +1,13 @@
1
-
2
1
  require 'fileutils'
3
2
  require 'getoptlong'
3
+ require 'set'
4
4
 
5
5
  module XamplGenerator
6
6
  require "xamplr"
7
7
  require "xamplr/xampl-hand-generated"
8
8
  require "xamplr/simpleTemplate/simple-template"
9
9
  require "xamplr/graphml-out.rb"
10
+ require "xamplr/yuml-out.rb"
10
11
 
11
12
  class Attribute
12
13
  attr_accessor :tag_name
@@ -44,14 +45,14 @@ module XamplGenerator
44
45
  "xamplr/templates/package.template",
45
46
  ]
46
47
 
47
- def initialize(options = nil, *predefined_elements)
48
+ def initialize(options_in = nil, *predefined_elements)
48
49
  @elements_map = {}
49
50
  @xpp = nil
50
51
  @templates = nil
51
52
  @generated_package_map = nil
52
53
 
53
- if options then
54
- @options = options
54
+ if options_in then
55
+ @options = options_in
55
56
  else
56
57
  @options = Xampl.make(Options) do |options|
57
58
  options.new_index_attribute("id")
@@ -127,21 +128,21 @@ module XamplGenerator
127
128
 
128
129
  while not @xpp.endDocument? do
129
130
  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
131
+ when Xampl_PP::START_ELEMENT
132
+ element_stack.push current_element unless nil == current_element
133
+ current_element = start_element(current_element)
134
+ when Xampl_PP::END_ELEMENT
135
+ current_element = element_stack.pop
136
+ when Xampl_PP::TEXT,
137
+ Xampl_PP::CDATA_SECTION,
138
+ Xampl_PP::ENTITY_REF
139
+ if current_element then
140
+ text = @xpp.text
141
+ if (nil != @xpp.text) then
142
+ text = text.strip
143
+ current_element.found_text_content if 0 < text.size
144
+ end
143
145
  end
144
- end
145
146
  end
146
147
  end
147
148
  end
@@ -224,6 +225,14 @@ module XamplGenerator
224
225
 
225
226
  ensure_templates
226
227
 
228
+ module_names = Set.new
229
+ @elements_map.each do |ns, elements|
230
+ elements.element_child.each do |element|
231
+ module_names << element.package
232
+ break
233
+ end
234
+ end
235
+
227
236
  lookup_element = {}
228
237
  @elements_map.each do |ns, elements|
229
238
  elements.element_child.each do |element|
@@ -240,6 +249,12 @@ module XamplGenerator
240
249
  @templates.element = element
241
250
  @templates.package_name = element.package
242
251
 
252
+ if element.class_name == element.package then
253
+ puts "ERROR: Class #{ element.package } is in a module with the same name -- this NOT going to work"
254
+ elsif module_names.member?(element.class_name)
255
+ puts "WARNING: a Class and a Module have the same name (#{ element.package }) -- this is highly unlikely to work"
256
+ end
257
+
243
258
  @templates.child_modules(place)
244
259
  end
245
260
  end
@@ -292,7 +307,11 @@ module XamplGenerator
292
307
  end
293
308
  end
294
309
 
295
- def print_elements(filename)
310
+ def print_elements(base_filename, print_options=nil)
311
+ return unless base_filename
312
+ return unless print_options
313
+ return if 0 == print_options.size
314
+
296
315
  root = Elements.new
297
316
  @elements_map.each_value do |elements|
298
317
  elements.element_child.each do |element|
@@ -300,13 +319,20 @@ module XamplGenerator
300
319
  end
301
320
  end
302
321
 
303
- File.open(filename, "w") do |out|
304
- root.pp_xml(out)
322
+ print_options.each do | print_option |
323
+ case print_option
324
+ when :schema then
325
+ File.open("#{base_filename}.xml", "w") do |out|
326
+ root.pp_xml(out)
327
+ end
328
+ when :graphml then
329
+ graphml_out = GraphMLOut.new(@elements_map)
330
+ graphml_out.write_graph_ml(base_filename)
331
+ when :yuml then
332
+ yuml_out = YUMLOut.new(@elements_map)
333
+ yuml_out.write_yuml(base_filename)
334
+ end
305
335
  end
306
-
307
- graphml_out = GraphMLOut.new(@elements_map)
308
- graphml_out.write_graph_ml(filename)
309
-
310
336
  end
311
337
 
312
338
  def go(args, &eval_context)
@@ -362,7 +388,8 @@ module XamplGenerator
362
388
  name.gsub!(/[A-Z]/, "_\\&")
363
389
  name.gsub!(/__+/, "_")
364
390
  class_name = ""
365
- name.each("_") do |chunk|
391
+ #name.each("_") do |chunk|
392
+ name.split("_").each do |chunk|
366
393
  class_name << chunk.capitalize
367
394
  end
368
395
  class_name.gsub!("_", "")
@@ -464,6 +491,15 @@ module XamplGenerator
464
491
  end
465
492
  end
466
493
  end
494
+
495
+ if self.persisted then
496
+ attribute = Attribute.new
497
+ attribute.name = 'scheduled_for_deletion_at'
498
+ attribute.tag_name = 'scheduled-for-deletion-at'
499
+ attribute.namespace = nil
500
+ self.add_attribute(attribute)
501
+ end
502
+
467
503
  end
468
504
  end
469
505
  end
@@ -485,30 +521,30 @@ module XamplGenerator
485
521
 
486
522
  opts.each do |opt, arg|
487
523
  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}"
524
+ when "--help" then
525
+ puts "--help, -h :: this help message"
526
+ puts "--options, -o :: xml file seting the generation options"
527
+ puts "--elements, -e :: xml file providing a hint 'schema' (very optional)"
528
+ puts "--gen:options, -O :: write an xml file describing the options used (default gen-options.xml)"
529
+ puts "--gen:elements, -E :: write an xml file describing the 'schema' (default gen-elements.xml)"
530
+ puts "--directory, -o :: where to write the generated files (default #{directory})"
531
+ puts "--version, -o :: what version of xampl is this?"
532
+ exit
533
+ when "--version" then
534
+ puts "version 0.0.0"
535
+ exit
536
+ when "--directory"
537
+ directory = arg
538
+ when "--options"
539
+ puts "sorry, cannot read options yet"
540
+ when "--elements"
541
+ puts "sorry, cannot read elements yet"
542
+ when "--gen:options"
543
+ write_options = (arg and (0 < arg.length)) ? arg : "gen-options.xml"
544
+ when "--gen:elements"
545
+ write_elements = (arg and (0 < arg.length)) ? arg : "gen-elements.xml"
546
+ else
547
+ puts " #{opt} #{arg}"
512
548
  end
513
549
  end
514
550
 
@@ -128,6 +128,24 @@ module Xampl
128
128
  return true
129
129
  end
130
130
 
131
+ def indexed_by
132
+ nil
133
+ end
134
+
135
+ def to_s
136
+ if self.persisted? then
137
+ "<<#{ self.class.name } #{ self.object_id } [#{ self.get_the_index }]#{ @is_changed ? ' DIRTY' : ''}>>"
138
+ elsif self.indexed_by then
139
+ "<<#{ self.class.name } #{ self.object_id } [#{ self.get_the_index }]>>"
140
+ else
141
+ "<<#{ self.class.name } #{ self.object_id }>>"
142
+ end
143
+ end
144
+
145
+ def inspect
146
+ self.to_s
147
+ end
148
+
131
149
  def to_ruby(mentions=nil)
132
150
  accessed
133
151
  return RubyPrinter.new(mentions).to_ruby(self)
@@ -183,6 +201,32 @@ module Xampl
183
201
  return persist_xml_new.start(self).done
184
202
  end
185
203
 
204
+ ################################################################################################
205
+ ################################################################################################
206
+ ################################################################################################
207
+
208
+ def Xampl.find_things_to_delete(scheduled_before=Time.now.to_i)
209
+ things = Xampl.query do | q |
210
+ q.add_condition('scheduled-delete-at', :lte, scheduled_before)
211
+ end
212
+ things
213
+ end
214
+
215
+ def should_schedule_delete?
216
+ #puts "Xampl#should_schedule_delete? is NOT IMPLEMENTED FOR: #{ self.class.name }"
217
+ false
218
+ end
219
+
220
+ def schedule_a_deletion_if_needed(at=Time.now.to_i)
221
+ @scheduled_for_deletion_at = should_schedule_delete? ? at.to_s : nil #TODO -- necessary??
222
+ end
223
+
224
+ ################################################################################################
225
+ ################################################################################################
226
+ ################################################################################################
227
+
228
+
229
+
186
230
  def XamplObject.realise_from_xml_string(xml_string, target=nil, tokenise=true)
187
231
  xampl = FromXML.new.realise_string(xml_string, tokenise, target)
188
232
  return xampl
@@ -197,6 +241,13 @@ module Xampl
197
241
  end
198
242
  end
199
243
 
244
+ def Xampl.from_xml_string(xml_string, tokenise=true)
245
+ return FromXML.new.parse_string(xml_string, tokenise)
246
+ end
247
+
248
+ def Xampl.from_xml_file(file_name, tokenise=true)
249
+ return FromXML.new.parse(file_name, tokenise)
250
+ end
200
251
 
201
252
  end
202
253
 
@@ -37,9 +37,14 @@ module Xampl
37
37
  if not @persister.syncing then
38
38
  Xampl.lazy_load(self)
39
39
  else
40
- puts "LOAD NEEDED(3): REFUSED (persister: #{@persister.name})"
41
- puts " pid: #{self.get_the_index} #{self}"
42
- caller(0).each { | trace | puts " #{trace}"}
40
+ puts "LOAD NEEDED(3): BAD IDEA, but load anyway (persister: #{@persister.name})"
41
+ puts " #{self.class.name}"
42
+ puts " pid: #{self.get_the_index}"
43
+ Xampl.lazy_load(self)
44
+ # puts "LOAD NEEDED(3): REFUSED (persister: #{@persister.name})"
45
+ # puts " #{self.class.name}"
46
+ # puts " pid: #{self.get_the_index}"
47
+ # caller(0).each { | trace | puts " #{trace}"}
43
48
  end
44
49
  else
45
50
  puts "LOAD NEEDED(4): REFUSED (persister: #{@persister.name})"
@@ -53,8 +58,12 @@ module Xampl
53
58
  end
54
59
  end
55
60
 
61
+ def changed?
62
+ @is_changed = true
63
+ end
64
+
56
65
  def changed
57
- #puts "CHANGED: is_changed #{@is_changed} xampl #{self}"
66
+ # puts "CHANGED: is_changed #{@is_changed} xampl #{self}"
58
67
  unless Xampl.persister then
59
68
  raise UnmanagedChange.new(self)
60
69
  end