xamplr 1.2.0 → 1.3.15
Sign up to get free protection for your applications and to get access to all the features.
- data/.document +5 -0
- data/.gitignore +12 -0
- data/CHANGES.txt +37 -0
- data/COPYING +661 -0
- data/Makefile +13 -0
- data/README.rdoc +24 -4
- data/Rakefile +2 -2
- data/VERSION.yml +3 -2
- data/bin/xampl-gen +17 -0
- data/docs/intro/.gitignore +1 -0
- data/docs/intro/example1/example1.rb +6 -0
- data/docs/intro/example1/xml/hello.xml +1 -0
- data/docs/intro/example2/example2.rb +38 -0
- data/docs/intro/example2/project-generator.rb +22 -0
- data/docs/intro/example2/xml/hello.xml +2 -0
- data/docs/intro/example3/example3.rb +30 -0
- data/docs/intro/example3/example3a.rb +16 -0
- data/docs/intro/example3/generated.png +0 -0
- data/docs/intro/example3/grab-yuml.rb +10 -0
- data/docs/intro/example3/greeter.rb +15 -0
- data/docs/intro/example3/greeting.rb +9 -0
- data/docs/intro/example3/project-generator.rb +25 -0
- data/docs/intro/example3/xml/greeter.xml +6 -0
- data/docs/intro/example4/example4.rb +27 -0
- data/docs/intro/example4/example4a.rb +19 -0
- data/docs/intro/example4/grab-yuml.rb +10 -0
- data/docs/intro/example4/greeter.rb +15 -0
- data/docs/intro/example4/greeting.rb +9 -0
- data/docs/intro/example4/project-generator.rb +25 -0
- data/docs/intro/example4/xml/greeter.xml +6 -0
- data/docs/intro/grab-yuml.rb +10 -0
- data/docs/intro/project-generator.rb +51 -0
- data/docs/intro/xampl.lyx +1494 -0
- data/docs/intro/xampl.pdf +0 -0
- data/examples/employees/final/xampl-gen.rb +38 -0
- data/examples/employees/final/xml/ddd-final.xml +86 -0
- data/examples/employees/final-xampl/xampl-gen.rb +38 -0
- data/examples/employees/final-xampl/xml/ddd-final-xampl.xml +86 -0
- data/examples/employees/first/xampl-gen.rb +38 -0
- data/examples/employees/first/xml/ddd-first.xml +48 -0
- data/examples/employees/twist/twist.graphml +333 -0
- data/examples/employees/twist/xampl-gen.rb +38 -0
- data/examples/employees/twist/xml/twist.xml +90 -0
- data/examples/employees/xamplr-twist.xml +2 -0
- data/examples/employees/yuml-diagrams/DDD-final-approach.graphml +393 -0
- data/examples/employees/yuml-diagrams/DDD-final-xampl-approach.graphml +265 -0
- data/examples/employees/yuml-diagrams/DDD-ideal-final-approach.graphml +357 -0
- data/examples/employees/yuml-diagrams/ddd-final.png +0 -0
- data/examples/employees/yuml-diagrams/ddd-final.yuml +8 -0
- data/examples/employees/yuml-diagrams/ddd-first.png +0 -0
- data/examples/employees/yuml-diagrams/ddd-first.yuml +7 -0
- data/examples/employees/yuml-diagrams/final-yed.png +0 -0
- data/examples/employees/yuml-diagrams/first-yed.png +0 -0
- data/examples/employees/yuml-diagrams/twist.png +0 -0
- data/examples/employees/yuml-diagrams/twist.yuml +12 -0
- data/examples/employees/yuml-diagrams/xamplr-final-no-mixins.png +0 -0
- data/examples/employees/yuml-diagrams/xamplr-final-simplified.png +0 -0
- data/examples/employees/yuml-diagrams/xamplr-final-with-mixins.png +0 -0
- data/examples/employees/yuml-diagrams/yuml-simplified.txt +19 -0
- data/examples/employees/yuml-diagrams/yuml-with-mixins.txt +53 -0
- data/examples/employees/yuml-diagrams/yuml.txt +27 -0
- data/examples/hobbies/Makefile +5 -0
- data/examples/hobbies/hobbies.rb +193 -0
- data/examples/hobbies/project-generator.rb +25 -0
- data/examples/hobbies/xampl-gen.rb +38 -0
- data/examples/hobbies/xml/hobby.xml +3 -0
- data/examples/hobbies/xml/people.xml +5 -0
- data/examples/random-people/.gitignore +2 -0
- data/examples/random-people/Makefile +5 -1
- data/examples/random-people/xampl-gen.rb +5 -2
- data/examples/random-people-shared-addresses/.gitignore +2 -0
- data/examples/random-people-shared-addresses/Makefile +8 -9
- data/examples/random-people-shared-addresses/batch-load-users-profiled.rb +91 -0
- data/examples/random-people-shared-addresses/batch-load-users-safe.rb +81 -0
- data/examples/random-people-shared-addresses/batch-load-users.rb +59 -63
- data/examples/random-people-shared-addresses/xampl-gen.rb +2 -0
- data/examples/read-testing/.gitignore +2 -0
- data/examples/read-testing/rrr.rb +2 -1
- data/examples/read-testing/xampl-gen.rb +2 -0
- data/examples/tokyo-cabinet-experimental/.gitignore +2 -0
- data/examples/tokyo-cabinet-experimental/xampl-gen.rb +2 -0
- data/examples/write-testing/README +4 -0
- data/examples/write-testing/RESULTS.home +33 -0
- data/examples/write-testing/RESULTS.raconteur +33 -0
- data/examples/write-testing/write-speed-test.rb +40 -0
- data/lib/xamplr/.cvsignore +1 -0
- data/lib/xamplr/TODO +2 -1
- data/lib/xamplr/exceptions.rb +24 -1
- data/lib/xamplr/from-xml.rb +13 -5
- data/lib/xamplr/graphml-out.rb +6 -25
- data/lib/xamplr/indexed-array.rb +10 -2
- data/lib/xamplr/persist-to-xml.rb +6 -7
- data/lib/xamplr/persistence.rb +132 -48
- data/lib/xamplr/persister.rb +48 -25
- data/lib/xamplr/persisters/filesystem.rb +8 -2
- data/lib/xamplr/persisters/tokyo-cabinet.rb +243 -63
- data/lib/xamplr/persisters/tokyo-cabinet.rb.1-DB +694 -0
- data/lib/xamplr/persisters/tokyo-cabinet.rb.N-DB +692 -0
- data/lib/xamplr/persisters/tokyo-cabinet.rb.NICE-TRY +807 -0
- data/lib/xamplr/templates/.cvsignore +3 -0
- data/lib/xamplr/templates/child_indexed.template +6 -6
- data/lib/xamplr/templates/element_data.template +2 -1
- data/lib/xamplr/templates/element_empty.template +2 -10
- data/lib/xamplr/templates/element_mixed.template +2 -1
- data/lib/xamplr/templates/element_simple.template +2 -1
- data/lib/xamplr/templates/package.template +13 -1
- data/lib/xamplr/visitor.rb +7 -6
- data/lib/xamplr/visitors.rb +2 -1
- data/lib/xamplr/xampl-cl-gen.rb +89 -0
- data/lib/xamplr/xampl-generator.rb +86 -50
- data/lib/xamplr/xampl-object.rb +51 -0
- data/lib/xamplr/xampl-persisted-object.rb +13 -4
- data/lib/xamplr/yuml-out.rb +129 -0
- data/lib/xamplr-generator.rb +0 -1
- data/lib/xamplr.rb +18 -18
- data/regression/tc-indexes-crossing-pid-boundaries/Makefile +14 -0
- data/regression/tc-indexes-crossing-pid-boundaries/bad-idea.rb +40 -0
- data/regression/tc-indexes-crossing-pid-boundaries/fail-badly.rb +17 -0
- data/regression/tc-indexes-crossing-pid-boundaries/fail.rb +11 -0
- data/regression/tc-indexes-crossing-pid-boundaries/fucking-bad-idea.rb +44 -0
- data/regression/tc-indexes-crossing-pid-boundaries/setup.rb +15 -0
- data/regression/tc-indexes-crossing-pid-boundaries/xml/bad-idea.xml +4 -0
- data/regression/tightly-nested-mutual-mentions/Makefile +14 -0
- data/regression/tightly-nested-mutual-mentions/build.rb +31 -0
- data/regression/tightly-nested-mutual-mentions/load.rb +21 -0
- data/regression/tightly-nested-mutual-mentions/repo-keep.tgz +0 -0
- data/regression/tightly-nested-mutual-mentions/setup.rb +8 -0
- data/regression/tightly-nested-mutual-mentions/xampl-gen.rb +36 -0
- data/regression/tightly-nested-mutual-mentions/xml/stuff.xml +7 -0
- data/xamplr.gemspec +322 -0
- metadata +116 -13
- data/test/test_helper.rb +0 -10
- data/test/xamplr_test.rb +0 -7
@@ -30,7 +30,7 @@
|
|
30
30
|
|
31
31
|
return existing if existing == #{element.attribute_name}
|
32
32
|
|
33
|
-
|
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
|
-
|
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
|
-
|
78
|
+
end
|
79
79
|
|
80
80
|
def remove_#{element.attribute_name}(index)
|
81
81
|
accessed
|
82
|
-
|
83
|
-
|
82
|
+
changed
|
83
|
+
unless String === index or Symbol === index then
|
84
84
|
index = index.get_the_index
|
85
|
-
|
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
|
-
|
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
|
-
|
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
|
-
|
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
|
-
|
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
|
-
|
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
|
+
|
|
data/lib/xamplr/visitor.rb
CHANGED
@@ -118,12 +118,13 @@ module Xampl
|
|
118
118
|
after_visit(xampl)
|
119
119
|
return self
|
120
120
|
|
121
|
-
rescue => e
|
122
|
-
|
123
|
-
|
124
|
-
|
125
|
-
|
126
|
-
|
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]
|
data/lib/xamplr/visitors.rb
CHANGED
@@ -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(
|
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
|
54
|
-
@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
|
-
|
131
|
-
|
132
|
-
|
133
|
-
|
134
|
-
|
135
|
-
|
136
|
-
|
137
|
-
|
138
|
-
|
139
|
-
|
140
|
-
|
141
|
-
|
142
|
-
|
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(
|
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
|
-
|
304
|
-
|
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
|
-
|
489
|
-
|
490
|
-
|
491
|
-
|
492
|
-
|
493
|
-
|
494
|
-
|
495
|
-
|
496
|
-
|
497
|
-
|
498
|
-
|
499
|
-
|
500
|
-
|
501
|
-
|
502
|
-
|
503
|
-
|
504
|
-
|
505
|
-
|
506
|
-
|
507
|
-
|
508
|
-
|
509
|
-
|
510
|
-
|
511
|
-
|
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
|
|
data/lib/xamplr/xampl-object.rb
CHANGED
@@ -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):
|
41
|
-
puts "
|
42
|
-
|
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
|
-
|
66
|
+
# puts "CHANGED: is_changed #{@is_changed} xampl #{self}"
|
58
67
|
unless Xampl.persister then
|
59
68
|
raise UnmanagedChange.new(self)
|
60
69
|
end
|