ObjectModel 0.3.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 (90) hide show
  1. data/README +849 -0
  2. data/lib/ObjectModel.res/config.yaml +5 -0
  3. data/lib/ObjectModel/AnEntity/BackReferences.rb +113 -0
  4. data/lib/ObjectModel/AnEntity/Bag.rb +129 -0
  5. data/lib/ObjectModel/AnEntity/BagCopy.rb +29 -0
  6. data/lib/ObjectModel/AnEntity/ChildrenBag.rb +10 -0
  7. data/lib/ObjectModel/AnEntity/EntityCopy.rb +38 -0
  8. data/lib/ObjectModel/AnEntity/EntityType.rb +408 -0
  9. data/lib/ObjectModel/AnEntity/ReferencesBag.rb +10 -0
  10. data/lib/ObjectModel/AnEntity/entity_cm.rb +108 -0
  11. data/lib/ObjectModel/Entity.rb +278 -0
  12. data/lib/ObjectModel/Errors/LoadError.rb +3 -0
  13. data/lib/ObjectModel/Errors/NoTransactionError.rb +3 -0
  14. data/lib/ObjectModel/Errors/NotFoundError.rb +2 -0
  15. data/lib/ObjectModel/Errors/OutdatedError.rb +8 -0
  16. data/lib/ObjectModel/Errors/ValidationError.rb +3 -0
  17. data/lib/ObjectModel/Indexes/HashIndex.rb +64 -0
  18. data/lib/ObjectModel/Indexes/IndexStorage.rb +64 -0
  19. data/lib/ObjectModel/Indexes/Manager.rb +72 -0
  20. data/lib/ObjectModel/Metadata.rb +34 -0
  21. data/lib/ObjectModel/Metadata.res/after_event_types.rb +25 -0
  22. data/lib/ObjectModel/Metadata.res/attribute_types_shortcuts.rb +10 -0
  23. data/lib/ObjectModel/Metadata.res/before_event_types.rb +25 -0
  24. data/lib/ObjectModel/Metadata.res/child_types_shortcuts.rb +4 -0
  25. data/lib/ObjectModel/Metadata.res/metadata_checks.rb +9 -0
  26. data/lib/ObjectModel/Metadata.res/reference_types_shortcuts.rb +4 -0
  27. data/lib/ObjectModel/Metadata/DSL.rb +11 -0
  28. data/lib/ObjectModel/Metadata/attribute.rb +56 -0
  29. data/lib/ObjectModel/Metadata/child.rb +50 -0
  30. data/lib/ObjectModel/Metadata/events.rb +109 -0
  31. data/lib/ObjectModel/Metadata/name.rb +20 -0
  32. data/lib/ObjectModel/Metadata/reference.rb +50 -0
  33. data/lib/ObjectModel/Metadata/require.rb +10 -0
  34. data/lib/ObjectModel/Metadata/validate.rb +66 -0
  35. data/lib/ObjectModel/Repository.rb +326 -0
  36. data/lib/ObjectModel/Repository/EventProcessor.rb +58 -0
  37. data/lib/ObjectModel/Repository/ObjectStorage.rb +102 -0
  38. data/lib/ObjectModel/Repository/StreamID.rb +20 -0
  39. data/lib/ObjectModel/Repository/StreamStorage.rb +121 -0
  40. data/lib/ObjectModel/Repository/SystemListener.rb +143 -0
  41. data/lib/ObjectModel/Repository/Transaction.rb +63 -0
  42. data/lib/ObjectModel/Repository/TransactionProcessor.rb +36 -0
  43. data/lib/ObjectModel/Tools/DefaultTransactionStrategy.rb +9 -0
  44. data/lib/ObjectModel/Tools/InMemoryCache.rb +9 -0
  45. data/lib/ObjectModel/Tools/NoCache.rb +18 -0
  46. data/lib/ObjectModel/Tools/OGLRUCache.rb +37 -0
  47. data/lib/ObjectModel/Types/BagType.rb +94 -0
  48. data/lib/ObjectModel/Types/BooleanType.rb +42 -0
  49. data/lib/ObjectModel/Types/ClassType.rb +43 -0
  50. data/lib/ObjectModel/Types/DataType.rb +44 -0
  51. data/lib/ObjectModel/Types/DateType.rb +43 -0
  52. data/lib/ObjectModel/Types/NumberType.rb +62 -0
  53. data/lib/ObjectModel/Types/ObjectType.rb +164 -0
  54. data/lib/ObjectModel/Types/ProcType.rb +43 -0
  55. data/lib/ObjectModel/Types/SingleType.rb +59 -0
  56. data/lib/ObjectModel/Types/StringType.rb +39 -0
  57. data/lib/ObjectModel/_require.rb +43 -0
  58. data/lib/ObjectModel/require.rb +1 -0
  59. data/rakefile +62 -0
  60. data/spec/ObjectModel/BasicSpec/BaseClass.rb +7 -0
  61. data/spec/ObjectModel/BasicSpec/BaseTypes.rb +11 -0
  62. data/spec/ObjectModel/BasicSpec/Descendant.rb +5 -0
  63. data/spec/ObjectModel/BasicSpec/EachTest.rb +14 -0
  64. data/spec/ObjectModel/BasicSpec/UpChild.rb +10 -0
  65. data/spec/ObjectModel/BasicSpec/UpParent.rb +11 -0
  66. data/spec/ObjectModel/ErrorsSpec/AfterCommitError.rb +9 -0
  67. data/spec/ObjectModel/ExtendedSpec/CustomInitialization.rb +11 -0
  68. data/spec/ObjectModel/ExtendedSpec/UpNotNil.rb +8 -0
  69. data/spec/ObjectModel/ExtendedSpec/UpParent.rb +11 -0
  70. data/spec/ObjectModel/ValidationSpec/BaseTypes.rb +11 -0
  71. data/spec/aspect_spec.rb +55 -0
  72. data/spec/back_references_spec.rb +161 -0
  73. data/spec/basic_spec.rb +162 -0
  74. data/spec/cascade_delete_spec.rb +168 -0
  75. data/spec/complex_events_spec.rb +134 -0
  76. data/spec/concurrency_spec.rb +186 -0
  77. data/spec/containment_spec.rb +146 -0
  78. data/spec/data_migration_spec.rb +51 -0
  79. data/spec/errors_spec.rb +65 -0
  80. data/spec/events_spec.rb +173 -0
  81. data/spec/extended_spec.rb +171 -0
  82. data/spec/indexing_spec.rb +56 -0
  83. data/spec/set_in_memory.rb +2 -0
  84. data/spec/set_no_cache.rb +2 -0
  85. data/spec/smoke_test_spec.rb +85 -0
  86. data/spec/stream_spec.rb +143 -0
  87. data/spec/stream_storage.rb +148 -0
  88. data/spec/timer.rb +5 -0
  89. data/spec/validation_spec.rb +87 -0
  90. metadata +186 -0
@@ -0,0 +1,7 @@
1
+ class BaseClass
2
+ inherit Entity
3
+
4
+ metadata do
5
+ attribute :base_class_method, :string
6
+ end
7
+ end
@@ -0,0 +1,11 @@
1
+ class BaseTypes
2
+ inherit Entity
3
+ metadata do
4
+ attribute :string, :string
5
+ attribute :number, :number
6
+ attribute :boolean, :boolean
7
+ attribute :object, :object
8
+ attribute :data, :data
9
+ attribute :date, :date
10
+ end
11
+ end
@@ -0,0 +1,5 @@
1
+ class Descendant < BaseClass
2
+ metadata do
3
+ attribute :descendant_method
4
+ end
5
+ end
@@ -0,0 +1,14 @@
1
+ class EachTest
2
+ inherit Entity
3
+
4
+ metadata do
5
+ attribute :a1, :string, :initialize => "a1"
6
+ attribute :a2, :string, :initialize => "a2"
7
+
8
+ child :child
9
+ child :children, :bag
10
+
11
+ reference :reference
12
+ reference :references, :bag
13
+ end
14
+ end
@@ -0,0 +1,10 @@
1
+ class UpChild
2
+ inherit Entity
3
+
4
+ def up_child params
5
+ :up_child
6
+ end
7
+
8
+ metadata do
9
+ end
10
+ end
@@ -0,0 +1,11 @@
1
+ class UpParent
2
+ inherit Entity
3
+
4
+ def up_parent params
5
+ :up_parent
6
+ end
7
+
8
+ metadata do
9
+ child :child
10
+ end
11
+ end
@@ -0,0 +1,9 @@
1
+ class AfterCommitError
2
+ inherit Entity
3
+
4
+ metadata do
5
+ after :commit do
6
+ name.should_not! :be_nil
7
+ end
8
+ end
9
+ end
@@ -0,0 +1,11 @@
1
+ class CustomInitialization
2
+ inherit Entity
3
+ metadata do
4
+ attribute :string, :string, :initialize => lambda{|e| e.name}
5
+ attribute :number, :number, :initialize => 1
6
+ attribute :boolean, :boolean, :initialize => true
7
+ attribute :object, :object, :initialize => 45
8
+ attribute :data, :data, :initialize => lambda{|e| StreamID.new("sid")}
9
+ attribute :date, :date, :initialize => DateTime.new(2009, 1, 1)
10
+ end
11
+ end
@@ -0,0 +1,8 @@
1
+ class UpNotNil
2
+ inherit Entity
3
+
4
+ metadata do
5
+ attribute :value, :object
6
+ child :child
7
+ end
8
+ end
@@ -0,0 +1,11 @@
1
+ class UpParent
2
+ inherit Entity
3
+
4
+ def up_parent params
5
+ :up_parent
6
+ end
7
+
8
+ metadata do
9
+ child :child
10
+ end
11
+ end
@@ -0,0 +1,11 @@
1
+ class BaseTypes
2
+ inherit Entity
3
+ metadata do
4
+ attribute :string, :string
5
+ attribute :number, :number
6
+ attribute :boolean, :boolean
7
+ attribute :object, :object
8
+ attribute :data, :data
9
+ attribute :date, :date
10
+ end
11
+ end
@@ -0,0 +1,55 @@
1
+ require 'ObjectModel/require'
2
+ require 'spec'
3
+
4
+ module ObjectModel
5
+ module AspectSpec
6
+ describe "AspectSpec" do
7
+ class BaseClass
8
+ inherit Entity
9
+ metadata do
10
+ attribute :base, :string
11
+ end
12
+ end
13
+
14
+ module AspectClass
15
+ inherit Entity
16
+ metadata do
17
+ attribute :aspect, :string
18
+ end
19
+ end
20
+
21
+
22
+ class ChildClass < BaseClass
23
+ inherit AspectClass
24
+
25
+ metadata do
26
+ attribute :child, :string
27
+ end
28
+ end
29
+
30
+ it "Aspect" do
31
+ ChildClass.meta.attributes.keys.to_set.should == [:aspect, :child, :base].to_set
32
+ end
33
+
34
+ it "Should be properly initialized" do
35
+ @r.transaction{
36
+ c = ChildClass.new
37
+ c.base.should == ""
38
+ c.aspect.should == ""
39
+ c.child.should == ""
40
+ }
41
+ end
42
+
43
+ before :each do
44
+ ObjectModel::CONFIG[:directory] = "#{File.dirname __FILE__}/data"
45
+ Repository.delete :test
46
+ @r = Repository.new :test
47
+ end
48
+
49
+ after :each do
50
+ @r.close
51
+ Repository.delete :test
52
+ end
53
+ end
54
+ end
55
+ end
@@ -0,0 +1,161 @@
1
+ require 'ObjectModel/require'
2
+ require 'spec'
3
+
4
+ module ObjectModel
5
+ module BackReferences
6
+ describe "BackReferences" do
7
+ class SimpleEntity
8
+ inherit Entity
9
+ metadata do
10
+ reference :reference
11
+ reference :references, :bag
12
+ end
13
+ end
14
+
15
+ it "Adding & Deleting" do
16
+ @r.transaction{
17
+ e1 = SimpleEntity.new 'e1'
18
+ e2 = SimpleEntity.new 'e2'
19
+
20
+ e1.reference = e2
21
+ e1.references << e2
22
+ }.commit
23
+
24
+ @r['e1'].back_references.size.should == 0
25
+ @r['e2'].back_references.size.should == 2
26
+
27
+ @r.transaction{
28
+ @r['e1'].reference = nil
29
+ @r['e1'].references.clear
30
+ }.commit
31
+
32
+ @r['e1'].back_references.size.should == 0
33
+ @r['e2'].back_references.size.should == 0
34
+ end
35
+
36
+ class EntityWithVO
37
+ inherit Entity
38
+ metadata do
39
+ attribute :object, :object
40
+ end
41
+ end
42
+
43
+ it "Shouldn't count ValueObjects" do
44
+ @r.transaction{
45
+ e = EntityWithVO.new 'e'
46
+ e.object = []
47
+ }.commit
48
+ @r['e'].back_references.size.should == 0
49
+ end
50
+
51
+
52
+ it "Create & Delete cycle Reference" do
53
+ @r.transaction{
54
+ e1 = SimpleEntity.new 'e1'
55
+ e2 = SimpleEntity.new 'e2'
56
+ e1.reference = e2
57
+ e2.reference = e1
58
+ }.commit
59
+ @r['e1'].back_references.size.should == 1
60
+ @r['e2'].back_references.size.should == 1
61
+
62
+ @r.transaction{
63
+ @r['e1'].reference = nil
64
+ @r['e2'].reference = nil
65
+ }.commit
66
+ @r['e1'].back_references.size.should == 0
67
+ @r['e2'].back_references.size.should == 0
68
+ end
69
+
70
+ it "Reference to themself" do
71
+ @r.transaction{
72
+ e = SimpleEntity.new 'e'
73
+ e.reference = e
74
+ }.commit
75
+ @r['e'].back_references.size.should == 1
76
+
77
+ @r.transaction{
78
+ @r['e'].reference = nil
79
+ }.commit
80
+ @r['e'].back_references.size.should == 0
81
+ end
82
+
83
+ it "Should not update BackReferences until_Commit" do
84
+ @r.transaction{
85
+ SimpleEntity.new 'e1'
86
+ SimpleEntity.new 'e2'
87
+ }.commit
88
+
89
+ tr = @r.transaction{
90
+ @r['e1'].reference = @r['e2']
91
+ @r['e2'].back_references.size.should == 1
92
+ }
93
+ @r['e2'].back_references.size.should == 0
94
+
95
+ tr.commit
96
+ @r['e2'].back_references.size.should == 1
97
+ end
98
+
99
+ it "Deleting Entities should cause deleting all references to thouse Entities" do
100
+ @r.transaction{
101
+ e1 = SimpleEntity.new 'e1', 'e1'
102
+ e2 = SimpleEntity.new 'e2', 'e2'
103
+ e2.reference = e2
104
+ e1.reference = e2
105
+ e1.references << e2
106
+ }.commit
107
+ @r['e1'].reference.should_not be_nil
108
+ @r['e2'].back_references.size.should == 3
109
+
110
+ @r.transaction{
111
+ @r['e2'].delete
112
+ @r['e2'].reference.should be_nil
113
+ }.commit
114
+ @r['e1'].reference.should be_nil
115
+ @r['e1'].references.size.should == 0
116
+ @r['e1'].back_references.size.should == 0
117
+ end
118
+
119
+ class CascadeDeleteEntity
120
+ inherit Entity
121
+ metadata do
122
+ reference :reference
123
+ child :child
124
+ end
125
+ end
126
+
127
+ it "Cascade BackReferences delete" do
128
+ @r.transaction{
129
+ p = CascadeDeleteEntity.new 'parent'
130
+ c = SimpleEntity.new 'child'
131
+ p.child = c
132
+
133
+ referrer = SimpleEntity.new 'referrer'
134
+ referrer.reference = c
135
+ referrer.references << c
136
+ referrer.references << p
137
+ }.commit
138
+ @r['referrer'].reference.should_not be_nil
139
+ @r['referrer'].references.size.should == 2
140
+
141
+ @r.transaction{
142
+ @r['parent'].delete
143
+ }.commit
144
+ @r['referrer'].reference.should be_nil
145
+ @r['referrer'].references.size.should == 0
146
+ end
147
+
148
+ before :each do
149
+ ObjectModel::CONFIG[:directory] = "#{File.dirname __FILE__}/data"
150
+
151
+ Repository.delete :test
152
+ @r = Repository.new :test
153
+ end
154
+
155
+ after :each do
156
+ @r.close
157
+ Repository.delete :test
158
+ end
159
+ end
160
+ end
161
+ end
@@ -0,0 +1,162 @@
1
+ require 'ObjectModel/require'
2
+ require 'spec'
3
+
4
+ module ObjectModel
5
+ module BasicSpec
6
+ describe "BasicSpec" do
7
+
8
+ it "Base Types, Initialization and Save & Load" do
9
+ @r.transaction{
10
+ BaseTypes.new 'bt'
11
+ }.commit
12
+ e = @r['bt']
13
+ [e.string, e.number, e.boolean, e.object, e.data, e.date].should ==
14
+ ["", 0, false, nil, nil, nil]
15
+ end
16
+
17
+ it "Should Asquise Parent's methods" do
18
+ @r.transaction{
19
+ UpParent.new 'parent'
20
+ UpChild.new 'child'
21
+ }.commit
22
+ @r['child'].up(:up_child, "Some param").should == :up_child
23
+ # lambda{
24
+ @r['child'].up(:up_parent, "Some param").should == nil
25
+ # }.should raise_error(NoMethodError)
26
+
27
+ @r.transaction{@r['parent'].child = @r['child']}.commit
28
+ @r['parent/child'].up(:up_parent, "Some param").should == :up_parent
29
+ end
30
+
31
+ it "DMeta inheritance" do
32
+ Descendant.meta.attributes.keys.sort.should == [:base_class_method, :descendant_method]
33
+ end
34
+
35
+ it "each" do
36
+ @r.transaction{
37
+ p = EachTest.new 'p', 'p_id'
38
+ c1 = EachTest.new 'c1', 'c1_id'
39
+ c2 = EachTest.new 'c2', 'c2_id'
40
+
41
+ p.child = c1
42
+ p.children << c2
43
+
44
+ p.reference = c1
45
+ p.references << c2
46
+ p.references << c2
47
+
48
+ c3 = EachTest.new 'c3', 'c3_id'
49
+ c2.child = c3
50
+ c2.reference = c3
51
+ }.commit
52
+
53
+ list = []
54
+ @r['p'].each(:attribute){|value| list << value}
55
+ list.size.should == 2
56
+ list.to_set.should == ["a1", "a2"].to_set
57
+
58
+ list = []
59
+ @r['p'].each(:child){|child| list << child.name}
60
+ list.size.should == 2
61
+ list.to_set.should == ["c1", "c2"].to_set
62
+
63
+ list = []
64
+ @r['p'].each(:reference){|value| list << value.name
65
+ }
66
+ list.size.should == 3
67
+ list.to_set.should == ["c1", "c2", "c2"].to_set
68
+ end
69
+
70
+ class SimpleEntity
71
+ inherit Entity
72
+
73
+ metadata do
74
+ attribute :label, :string
75
+ attribute :value, :object
76
+ end
77
+ end
78
+
79
+ it "Write & Read" do
80
+ @r.should_not include('e')
81
+ tr = @r.transaction{SimpleEntity.new('e').label = "name"}
82
+ @r.should_not include('e')
83
+ tr.commit
84
+ @r.should include('e')
85
+ @r['e'].label.should == "name"
86
+ @r['e'].name.should == 'e'
87
+ end
88
+
89
+ it "Should return used transaction in commit" do
90
+ tr = @r.transaction{SimpleEntity.new}.commit
91
+ tr.copies.size.should == 1
92
+ end
93
+
94
+ it "Long transaction" do
95
+ e = nil
96
+ tr = @r.transaction{e = SimpleEntity.new 'e'}
97
+ @r.should_not include('e')
98
+ @r.transaction(tr){e.label = "name"}
99
+ tr.commit
100
+ @r['e'].label.should == "name"
101
+ end
102
+
103
+ it "Set name by hand" do
104
+ @r.transaction{
105
+ SimpleEntity.new('e', 'entity_id').set :label => 'name'
106
+ }.commit
107
+ @r.should include('e')
108
+ @r.by_id('entity_id').label.should == 'name'
109
+ end
110
+
111
+ it "Rollback" do
112
+ @r.transaction{SimpleEntity.new 'e'}
113
+ @r.should_not include('e')
114
+ end
115
+
116
+ it "Should correct save ValueObject" do
117
+ @r.transaction{SimpleEntity.new('e').set :value => ["value"]}.commit
118
+ @r['e'].value.should == ["value"]
119
+ end
120
+
121
+ it "Should freeze ValueObject" do
122
+ @r.transaction{SimpleEntity.new('e').set :value => ["value"]}.commit
123
+ lambda{@r['e'].value << 1}.should raise_error(/frozen/)
124
+ end
125
+
126
+ it "Each Entity in Repository" do
127
+ @r.transaction{
128
+ SimpleEntity.new 'e'
129
+ SimpleEntity.new 'e2'
130
+ }.commit
131
+
132
+ list = []
133
+ @r.each{|e| list << e.name}
134
+ list.size.should == 2
135
+ list.to_set.should == ["e", "e2"].to_set
136
+ end
137
+
138
+ it "Not allowed to change objects outside transaction" do
139
+ @r.transaction{SimpleEntity.new 'e'}.commit
140
+ lambda{SimpleEntity.new}.should raise_error(NoTransactionError)
141
+ lambda{@r['e'].value = :value}.should raise_error(NoTransactionError)
142
+ end
143
+
144
+ it "Should not allow to start two the same simultaneously" do
145
+ lambda {
146
+ Repository.new 'test'
147
+ }.should raise_error(/the same/)
148
+ end
149
+
150
+ before :each do
151
+ ObjectModel::CONFIG[:directory] = "#{File.dirname __FILE__}/data"
152
+ Repository.delete :test
153
+ @r = Repository.new :test
154
+ end
155
+
156
+ after :each do
157
+ @r.close
158
+ Repository.delete :test
159
+ end
160
+ end
161
+ end
162
+ end