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,129 @@
1
+ require 'fileutils'
2
+ require 'set'
3
+
4
+ module XamplGenerator
5
+
6
+ class YUMLOut
7
+
8
+ def initialize(elements_map)
9
+ @elements_map = elements_map
10
+ end
11
+
12
+ def generate_class_nodes(element, include_mixins)
13
+ return if ignore_package(element.package)
14
+
15
+ class_name = "#{ element.package }::#{ element.class_name }"
16
+ mixin_name = "#{ element.package }::#{ element.class_name }"
17
+
18
+ @class_by_nstag[element.nstag] = element
19
+ @class_names_by_nstag[element.nstag] = class_name
20
+
21
+ if element.persisted then
22
+ write_entity_node(class_name, element.kind)
23
+ else
24
+ write_internal_node(class_name, element.kind)
25
+ end
26
+
27
+ if include_mixins then
28
+ write_mixin_node(class_name)
29
+ end
30
+ end
31
+
32
+ def generate_edges(element, include_mixins)
33
+ return if ignore_package(element.package)
34
+
35
+ element_name = @class_names_by_nstag[ element.nstag ]
36
+
37
+ element.child_element_child.each do | celement |
38
+ next if ignore_package(celement.package)
39
+
40
+ celement_name = @class_names_by_nstag[ celement.name ]
41
+ referenced_element = @class_by_nstag[ celement.name ]
42
+
43
+ if referenced_element.persisted then
44
+ write_entity_ref_edge(element_name, celement_name)
45
+ else
46
+ write_internal_ref_edge(element_name, celement_name)
47
+ end
48
+ if include_mixins then
49
+ write_mixin_ref_edge(element_name, celement_name)
50
+ end
51
+ end
52
+ end
53
+
54
+ def ignore_package(package)
55
+ return true if @excluded_packages.member?(package)
56
+ return false if @included_packages.nil?
57
+ return true unless @included_packages.member?(package)
58
+ return false
59
+ end
60
+
61
+ def write_yuml(base_filename, excluded_packages=[ ], included_packages=nil, include_mixins=false)
62
+ filename = "#{ base_filename }.yuml"
63
+
64
+ @excluded_packages = Set.new(excluded_packages)
65
+ @included_packages = included_packages ? Set.new(included_packages) : nil
66
+
67
+ @class_names_by_nstag = {} # NOTE -- this is used by yuml!!
68
+ @class_by_nstag = {} # NOTE -- this is used by yuml!!
69
+
70
+ @initialise_output = true
71
+
72
+ File.open(filename, "w") do | out |
73
+ @out = out
74
+
75
+ @elements_map.each_value do |elements|
76
+ elements.element_child.each do |element|
77
+ generate_class_nodes(element, include_mixins)
78
+ end
79
+ end
80
+
81
+ @elements_map.each_value do |elements|
82
+ elements.element_child.each do |element|
83
+ generate_edges(element, include_mixins)
84
+ end
85
+ end
86
+ end
87
+
88
+ return nil
89
+ end
90
+
91
+ def new_statement
92
+ if @initialise_output then
93
+ @initialise_output = false
94
+ else
95
+ @out << ",\n"
96
+ end
97
+ end
98
+
99
+ def write_entity_node(class_name, kind)
100
+ new_statement
101
+ @out << "[#{ class_name }{bg:red}]"
102
+ end
103
+
104
+ def write_internal_node(class_name, kind)
105
+ new_statement
106
+ @out << "[#{ class_name }{bg:blue}]"
107
+ end
108
+
109
+ def write_mixin_node(class_name)
110
+ new_statement
111
+ @out << "[#{ class_name }Mixin]"
112
+ end
113
+
114
+ def write_entity_ref_edge(class_node, external_node)
115
+ new_statement
116
+ @out << "[#{ class_node }]->[#{ external_node }]"
117
+ end
118
+
119
+ def write_internal_ref_edge(class_node, internal_node)
120
+ new_statement
121
+ @out << "[#{ class_node }]->[#{ internal_node }]"
122
+ end
123
+
124
+ def write_mixin_ref_edge(class_node, mixin_node)
125
+ new_statement
126
+ @out << "[#{ mixin_node }Mixin]^[#{ class_node }]"
127
+ end
128
+ end
129
+ end
@@ -1,4 +1,3 @@
1
- #!/usr/bin/env ruby
2
1
 
3
2
  module Xampl
4
3
 
data/lib/xamplr.rb CHANGED
@@ -1,11 +1,11 @@
1
- #!/usr/bin/env ruby
2
1
 
3
2
  module Xampl
4
3
 
5
- require "yaml"
6
- require "logger"
4
+ require 'rubygems'
5
+ require 'yaml'
6
+ require 'logger'
7
7
 
8
- require "xamplr-pp"
8
+ require 'xamplr-pp'
9
9
 
10
10
  @@logger = Logger.new(STDOUT)
11
11
  @@logger.level = Logger::WARN
@@ -14,23 +14,23 @@ module Xampl
14
14
  return @@logger
15
15
  end
16
16
 
17
- require "xamplr/xampl-module"
18
- require "xamplr/xampl-object-internals"
19
- require "xamplr/xampl-object"
20
- require "xamplr/xampl-persisted-object"
17
+ require 'xamplr/xampl-module'
18
+ require 'xamplr/xampl-object-internals'
19
+ require 'xamplr/xampl-object'
20
+ require 'xamplr/xampl-persisted-object'
21
21
 
22
- require "xamplr/exceptions"
23
- require "xamplr/xml-text"
24
- require "xamplr/notifications"
25
- require "xamplr/mixins"
22
+ require 'xamplr/exceptions'
23
+ require 'xamplr/xml-text'
24
+ require 'xamplr/notifications'
25
+ require 'xamplr/mixins'
26
26
 
27
- require "xamplr/from-xml"
28
- require "xamplr/to-xml"
29
- require "xamplr/to-ruby"
27
+ require 'xamplr/from-xml'
28
+ require 'xamplr/to-xml'
29
+ require 'xamplr/to-ruby'
30
30
 
31
- require "xamplr/visitor"
32
- require "xamplr/persist-to-xml"
33
- require "xamplr/visitors"
31
+ require 'xamplr/visitor'
32
+ require 'xamplr/persist-to-xml'
33
+ require 'xamplr/visitors'
34
34
 
35
35
  end
36
36
 
@@ -0,0 +1,14 @@
1
+
2
+ fb:
3
+ ruby fail-badly.rb
4
+
5
+ b:
6
+ ruby fail.rb
7
+
8
+ s:
9
+ rm -rf repo
10
+ ruby setup.rb
11
+
12
+ g:
13
+ /Users/hutch/xamplr/xamplr/bin/xampl-gen
14
+
@@ -0,0 +1,40 @@
1
+ require 'xampl_generated_code/XamplAdHoc.rb'
2
+
3
+ Xampl.set_default_persister_kind(:tokyo_cabinet)
4
+
5
+ class Widget
6
+
7
+ def Widget.indexed_attributes
8
+ %w{ value gadget-value }
9
+ end
10
+
11
+ Xampl::TokyoCabinetPersister.add_lexical_indexs(Widget.indexed_attributes)
12
+
13
+ def describe_yourself
14
+ description = {
15
+ 'value' => self.value
16
+ }
17
+
18
+ secondary_descriptions = []
19
+
20
+ self.gadget.each do | gadget |
21
+ secondary_descriptions << {
22
+ 'gadget-value' => gadget.value
23
+ }
24
+
25
+
26
+ end
27
+
28
+ puts "\n\n\n\n#{ __FILE__ }:#{ __LINE__ } WIDGET(#{ self.pid })"
29
+ # puts pp_xml
30
+ puts "#{ __FILE__ }:#{ __LINE__ } description: #{ description.inspect }"
31
+ secondary_descriptions.each do | secondary |
32
+ puts "#{ __FILE__ }:#{ __LINE__ } secondary: #{ secondary.inspect }"
33
+ end
34
+ puts "\n\n\n"
35
+
36
+ return description, secondary_descriptions
37
+ end
38
+
39
+ end
40
+
@@ -0,0 +1,17 @@
1
+ require 'xampl_generated_code/XamplAdHoc.rb'
2
+ require 'fucking-bad-idea.rb'
3
+
4
+ Xampl.set_default_persister_kind(:tokyo_cabinet)
5
+
6
+ puts "#{ __method__} #{ __LINE__ }"
7
+ Xampl.transaction("bad-idea") do
8
+ puts "#{ __method__} #{ __LINE__ }"
9
+ car = Widget['the-car']
10
+ puts "#{ __method__} #{ __LINE__ }"
11
+ # engine = Gadget['the-engine']
12
+ puts "#{ __method__} #{ __LINE__ }"
13
+ car.value = 'ex-pinto'
14
+ puts "#{ __method__} #{ __LINE__ }"
15
+ end
16
+ puts "#{ __method__} #{ __LINE__ }"
17
+
@@ -0,0 +1,11 @@
1
+ require 'xampl_generated_code/XamplAdHoc.rb'
2
+ require 'bad-idea.rb'
3
+
4
+ Xampl.set_default_persister_kind(:tokyo_cabinet)
5
+
6
+ Xampl.transaction("bad-idea") do
7
+ car = Widget['the-car']
8
+ # engine = Gadget['the-engine']
9
+ car.value = 'ex-pinto'
10
+ end
11
+
@@ -0,0 +1,44 @@
1
+ require 'xampl_generated_code/XamplAdHoc.rb'
2
+
3
+ Xampl.set_default_persister_kind(:tokyo_cabinet)
4
+
5
+ class Widget
6
+
7
+ def Widget.indexed_attributes
8
+ %w{ value gadget-value }
9
+ end
10
+
11
+ Xampl::TokyoCabinetPersister.add_lexical_indexs(Widget.indexed_attributes)
12
+
13
+ def describe_yourself
14
+ description = {
15
+ 'value' => self.value
16
+ }
17
+
18
+ secondary_descriptions = []
19
+
20
+ puts "#{ __method__} #{ __LINE__ }"
21
+ self.gadget.each do | gadget |
22
+ puts "#{ __method__} #{ __LINE__ }"
23
+ secondary_descriptions << {
24
+ 'gadget-value' => gadget.value
25
+ }
26
+ puts "#{ __method__} #{ __LINE__ }"
27
+ gadget.extra = 'fucking stupid change'
28
+ puts "#{ __method__} #{ __LINE__ }"
29
+ end
30
+ puts "#{ __method__} #{ __LINE__ }"
31
+
32
+ puts "\n\n\n\n#{ __FILE__ }:#{ __LINE__ } WIDGET(#{ self.pid })"
33
+ # puts pp_xml
34
+ puts "#{ __FILE__ }:#{ __LINE__ } description: #{ description.inspect }"
35
+ secondary_descriptions.each do | secondary |
36
+ puts "#{ __FILE__ }:#{ __LINE__ } secondary: #{ secondary.inspect }"
37
+ end
38
+ puts "\n\n\n"
39
+
40
+ return description, secondary_descriptions
41
+ end
42
+
43
+ end
44
+
@@ -0,0 +1,15 @@
1
+ require 'xampl_generated_code/XamplAdHoc.rb'
2
+ require 'bad-idea.rb'
3
+
4
+ Xampl.set_default_persister_kind(:tokyo_cabinet)
5
+
6
+ Xampl.transaction("bad-idea") do
7
+ car = Widget.new('the-car')
8
+ car.value = "pinto"
9
+
10
+ engine = car.new_gadget('the-engine')
11
+ engine.value = 'guzzler'
12
+
13
+ gas_tank = car.new_gadget('the-gas-tank')
14
+ gas_tank.value = 'the burner'
15
+ end
@@ -0,0 +1,4 @@
1
+
2
+ <widget pid='' value=''>
3
+ <gadget pid='' value='' extra=''/>
4
+ </widget>
@@ -0,0 +1,14 @@
1
+
2
+ nope:
3
+
4
+ build:
5
+ rm -rf repo
6
+ ruby build.rb
7
+
8
+ snap:
9
+ tar czf repo.tgz repo
10
+
11
+ load:
12
+ tar zxf repo.tgz
13
+ time ruby load.rb
14
+
@@ -0,0 +1,31 @@
1
+
2
+ require 'setup'
3
+
4
+ module TestingStuff
5
+
6
+ # <stuff pid='' xmlns="http://xampl.com/stuff">
7
+ # <parent pid=''>
8
+ # <child pid=''>
9
+ # <parent pid=''/>
10
+ # </child>
11
+ # </parent>
12
+ # </stuff>
13
+
14
+ Xampl.transaction("stuff") do
15
+
16
+
17
+ parent = Parent.new('parent1')
18
+ parent.info = "one"
19
+ child = Child.new('child1')
20
+ child.info = "two"
21
+
22
+ parent << child
23
+ child << parent
24
+
25
+ puts "parent ---------------------------------------"
26
+ puts parent.pp_xml
27
+ puts "child ----------------------------------------"
28
+ puts child.pp_xml
29
+ end
30
+
31
+ end
@@ -0,0 +1,21 @@
1
+
2
+ require 'setup'
3
+
4
+ module TestingStuff
5
+
6
+ # <stuff pid='' xmlns="http://xampl.com/stuff">
7
+ # <parent pid=''>
8
+ # <child pid=''>
9
+ # <parent pid=''/>
10
+ # </child>
11
+ # </parent>
12
+ # </stuff>
13
+
14
+ Xampl.transaction("stuff") do
15
+ parent = Parent['parent1']
16
+ puts "parent has info: #{ parent.info }"
17
+ child = parent.child.first
18
+ puts "child has info: #{ child.info }"
19
+ end
20
+
21
+ end
@@ -0,0 +1,8 @@
1
+
2
+ require 'xampl_generated_code/TestingStuff'
3
+
4
+ #Xampl.set_default_persister_kind(:tokyo_cabinet)
5
+ Xampl.set_default_persister_kind(:filesystem)
6
+ #Xampl.set_default_persister_format(:ruby_format)
7
+ Xampl.set_default_persister_format(:xml_format)
8
+
@@ -0,0 +1,36 @@
1
+ #!/usr/bin/env ruby -w -I..
2
+
3
+ if $0 == __FILE__ then
4
+
5
+ class File
6
+ def File.sjoin(*args)
7
+ File.join(args.select{ | o | o })
8
+ end
9
+ end
10
+
11
+ require 'xamplr-generator'
12
+
13
+ include XamplGenerator
14
+ include Xampl
15
+
16
+ Xampl.transaction("setup", :in_memory) do
17
+ directory = File.sjoin(".", "xampl_generated_code")
18
+
19
+ options = Xampl.make(Options) do |options|
20
+ options.new_index_attribute("pid").persisted = true
21
+ options.new_index_attribute("id")
22
+
23
+ options.resolve("http://xampl.com/stuff", "TestingStuff", "s")
24
+ end
25
+
26
+ filenames = Dir.glob("./xml/**/*.xml")
27
+
28
+ generator = Generator.new
29
+ generator.go(:options => options,
30
+ :filenames => filenames,
31
+ :directory => directory)
32
+
33
+ #puts generator.print_elements("./generated-elements.xml")
34
+ exit!
35
+ end
36
+ end
@@ -0,0 +1,7 @@
1
+ <stuff pid='' xmlns="http://xampl.com/stuff">
2
+ <parent pid='' info=''>
3
+ <child pid='' info=''>
4
+ <parent pid=''/>
5
+ </child>
6
+ </parent>
7
+ </stuff>