datamapper-dm-core 0.9.11 → 0.10.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 (192) hide show
  1. data/.autotest +17 -14
  2. data/.gitignore +3 -1
  3. data/FAQ +6 -5
  4. data/History.txt +5 -39
  5. data/Manifest.txt +67 -76
  6. data/QUICKLINKS +1 -1
  7. data/README.txt +21 -15
  8. data/Rakefile +16 -15
  9. data/SPECS +2 -29
  10. data/TODO +1 -1
  11. data/dm-core.gemspec +11 -15
  12. data/lib/dm-core/adapters/abstract_adapter.rb +182 -185
  13. data/lib/dm-core/adapters/data_objects_adapter.rb +482 -534
  14. data/lib/dm-core/adapters/in_memory_adapter.rb +90 -69
  15. data/lib/dm-core/adapters/mysql_adapter.rb +22 -115
  16. data/lib/dm-core/adapters/oracle_adapter.rb +249 -0
  17. data/lib/dm-core/adapters/postgres_adapter.rb +7 -173
  18. data/lib/dm-core/adapters/sqlite3_adapter.rb +4 -97
  19. data/lib/dm-core/adapters/yaml_adapter.rb +116 -0
  20. data/lib/dm-core/adapters.rb +135 -16
  21. data/lib/dm-core/associations/many_to_many.rb +372 -90
  22. data/lib/dm-core/associations/many_to_one.rb +220 -73
  23. data/lib/dm-core/associations/one_to_many.rb +319 -255
  24. data/lib/dm-core/associations/one_to_one.rb +66 -53
  25. data/lib/dm-core/associations/relationship.rb +560 -158
  26. data/lib/dm-core/collection.rb +1104 -381
  27. data/lib/dm-core/core_ext/kernel.rb +12 -0
  28. data/lib/dm-core/core_ext/symbol.rb +10 -0
  29. data/lib/dm-core/identity_map.rb +4 -34
  30. data/lib/dm-core/migrations.rb +1283 -0
  31. data/lib/dm-core/model/descendant_set.rb +81 -0
  32. data/lib/dm-core/model/hook.rb +45 -0
  33. data/lib/dm-core/model/is.rb +32 -0
  34. data/lib/dm-core/model/property.rb +248 -0
  35. data/lib/dm-core/model/relationship.rb +335 -0
  36. data/lib/dm-core/model/scope.rb +90 -0
  37. data/lib/dm-core/model.rb +570 -369
  38. data/lib/dm-core/property.rb +753 -280
  39. data/lib/dm-core/property_set.rb +141 -98
  40. data/lib/dm-core/query/conditions/comparison.rb +814 -0
  41. data/lib/dm-core/query/conditions/operation.rb +247 -0
  42. data/lib/dm-core/query/direction.rb +43 -0
  43. data/lib/dm-core/query/operator.rb +42 -0
  44. data/lib/dm-core/query/path.rb +102 -0
  45. data/lib/dm-core/query/sort.rb +45 -0
  46. data/lib/dm-core/query.rb +974 -492
  47. data/lib/dm-core/repository.rb +147 -107
  48. data/lib/dm-core/resource.rb +644 -429
  49. data/lib/dm-core/spec/adapter_shared_spec.rb +294 -0
  50. data/lib/dm-core/spec/data_objects_adapter_shared_spec.rb +106 -0
  51. data/lib/dm-core/support/chainable.rb +20 -0
  52. data/lib/dm-core/support/deprecate.rb +12 -0
  53. data/lib/dm-core/support/equalizer.rb +23 -0
  54. data/lib/dm-core/support/logger.rb +13 -0
  55. data/lib/dm-core/{naming_conventions.rb → support/naming_conventions.rb} +6 -6
  56. data/lib/dm-core/transaction.rb +333 -92
  57. data/lib/dm-core/type.rb +98 -60
  58. data/lib/dm-core/types/boolean.rb +1 -1
  59. data/lib/dm-core/types/discriminator.rb +34 -20
  60. data/lib/dm-core/types/object.rb +7 -4
  61. data/lib/dm-core/types/paranoid_boolean.rb +11 -9
  62. data/lib/dm-core/types/paranoid_datetime.rb +11 -9
  63. data/lib/dm-core/types/serial.rb +3 -3
  64. data/lib/dm-core/types/text.rb +3 -4
  65. data/lib/dm-core/version.rb +1 -1
  66. data/lib/dm-core.rb +106 -110
  67. data/script/performance.rb +102 -109
  68. data/script/profile.rb +169 -38
  69. data/spec/lib/adapter_helpers.rb +105 -0
  70. data/spec/lib/collection_helpers.rb +18 -0
  71. data/spec/lib/counter_adapter.rb +34 -0
  72. data/spec/lib/pending_helpers.rb +27 -0
  73. data/spec/lib/rspec_immediate_feedback_formatter.rb +53 -0
  74. data/spec/public/associations/many_to_many_spec.rb +193 -0
  75. data/spec/public/associations/many_to_one_spec.rb +73 -0
  76. data/spec/public/associations/one_to_many_spec.rb +77 -0
  77. data/spec/public/associations/one_to_one_spec.rb +156 -0
  78. data/spec/public/collection_spec.rb +65 -0
  79. data/spec/public/model/relationship_spec.rb +924 -0
  80. data/spec/public/model_spec.rb +159 -0
  81. data/spec/public/property_spec.rb +829 -0
  82. data/spec/public/resource_spec.rb +71 -0
  83. data/spec/public/sel_spec.rb +44 -0
  84. data/spec/public/setup_spec.rb +145 -0
  85. data/spec/public/shared/association_collection_shared_spec.rb +317 -0
  86. data/spec/public/shared/collection_shared_spec.rb +1723 -0
  87. data/spec/public/shared/finder_shared_spec.rb +1619 -0
  88. data/spec/public/shared/resource_shared_spec.rb +924 -0
  89. data/spec/public/shared/sel_shared_spec.rb +112 -0
  90. data/spec/public/transaction_spec.rb +129 -0
  91. data/spec/public/types/discriminator_spec.rb +130 -0
  92. data/spec/semipublic/adapters/abstract_adapter_spec.rb +30 -0
  93. data/spec/semipublic/adapters/in_memory_adapter_spec.rb +12 -0
  94. data/spec/semipublic/adapters/mysql_adapter_spec.rb +17 -0
  95. data/spec/semipublic/adapters/oracle_adapter_spec.rb +194 -0
  96. data/spec/semipublic/adapters/postgres_adapter_spec.rb +17 -0
  97. data/spec/semipublic/adapters/sqlite3_adapter_spec.rb +17 -0
  98. data/spec/semipublic/adapters/yaml_adapter_spec.rb +12 -0
  99. data/spec/semipublic/associations/many_to_one_spec.rb +53 -0
  100. data/spec/semipublic/associations/relationship_spec.rb +194 -0
  101. data/spec/semipublic/associations_spec.rb +177 -0
  102. data/spec/semipublic/collection_spec.rb +142 -0
  103. data/spec/semipublic/property_spec.rb +61 -0
  104. data/spec/semipublic/query/conditions_spec.rb +528 -0
  105. data/spec/semipublic/query/path_spec.rb +443 -0
  106. data/spec/semipublic/query_spec.rb +2626 -0
  107. data/spec/semipublic/resource_spec.rb +47 -0
  108. data/spec/semipublic/shared/resource_shared_spec.rb +126 -0
  109. data/spec/spec.opts +3 -1
  110. data/spec/spec_helper.rb +80 -57
  111. data/tasks/ci.rb +19 -31
  112. data/tasks/dm.rb +43 -48
  113. data/tasks/doc.rb +8 -11
  114. data/tasks/gemspec.rb +5 -5
  115. data/tasks/hoe.rb +15 -16
  116. data/tasks/install.rb +8 -10
  117. metadata +72 -93
  118. data/lib/dm-core/associations/relationship_chain.rb +0 -81
  119. data/lib/dm-core/associations.rb +0 -207
  120. data/lib/dm-core/auto_migrations.rb +0 -105
  121. data/lib/dm-core/dependency_queue.rb +0 -32
  122. data/lib/dm-core/hook.rb +0 -11
  123. data/lib/dm-core/is.rb +0 -16
  124. data/lib/dm-core/logger.rb +0 -232
  125. data/lib/dm-core/migrations/destructive_migrations.rb +0 -17
  126. data/lib/dm-core/migrator.rb +0 -29
  127. data/lib/dm-core/scope.rb +0 -58
  128. data/lib/dm-core/support/array.rb +0 -13
  129. data/lib/dm-core/support/assertions.rb +0 -8
  130. data/lib/dm-core/support/errors.rb +0 -23
  131. data/lib/dm-core/support/kernel.rb +0 -11
  132. data/lib/dm-core/support/symbol.rb +0 -41
  133. data/lib/dm-core/support.rb +0 -7
  134. data/lib/dm-core/type_map.rb +0 -80
  135. data/lib/dm-core/types.rb +0 -19
  136. data/script/all +0 -4
  137. data/spec/integration/association_spec.rb +0 -1382
  138. data/spec/integration/association_through_spec.rb +0 -203
  139. data/spec/integration/associations/many_to_many_spec.rb +0 -449
  140. data/spec/integration/associations/many_to_one_spec.rb +0 -163
  141. data/spec/integration/associations/one_to_many_spec.rb +0 -188
  142. data/spec/integration/auto_migrations_spec.rb +0 -413
  143. data/spec/integration/collection_spec.rb +0 -1073
  144. data/spec/integration/data_objects_adapter_spec.rb +0 -32
  145. data/spec/integration/dependency_queue_spec.rb +0 -46
  146. data/spec/integration/model_spec.rb +0 -197
  147. data/spec/integration/mysql_adapter_spec.rb +0 -85
  148. data/spec/integration/postgres_adapter_spec.rb +0 -731
  149. data/spec/integration/property_spec.rb +0 -253
  150. data/spec/integration/query_spec.rb +0 -514
  151. data/spec/integration/repository_spec.rb +0 -61
  152. data/spec/integration/resource_spec.rb +0 -513
  153. data/spec/integration/sqlite3_adapter_spec.rb +0 -352
  154. data/spec/integration/sti_spec.rb +0 -273
  155. data/spec/integration/strategic_eager_loading_spec.rb +0 -156
  156. data/spec/integration/transaction_spec.rb +0 -75
  157. data/spec/integration/type_spec.rb +0 -275
  158. data/spec/lib/logging_helper.rb +0 -18
  159. data/spec/lib/mock_adapter.rb +0 -27
  160. data/spec/lib/model_loader.rb +0 -100
  161. data/spec/lib/publicize_methods.rb +0 -28
  162. data/spec/models/content.rb +0 -16
  163. data/spec/models/vehicles.rb +0 -34
  164. data/spec/models/zoo.rb +0 -48
  165. data/spec/unit/adapters/abstract_adapter_spec.rb +0 -133
  166. data/spec/unit/adapters/adapter_shared_spec.rb +0 -15
  167. data/spec/unit/adapters/data_objects_adapter_spec.rb +0 -632
  168. data/spec/unit/adapters/in_memory_adapter_spec.rb +0 -98
  169. data/spec/unit/adapters/postgres_adapter_spec.rb +0 -133
  170. data/spec/unit/associations/many_to_many_spec.rb +0 -32
  171. data/spec/unit/associations/many_to_one_spec.rb +0 -159
  172. data/spec/unit/associations/one_to_many_spec.rb +0 -393
  173. data/spec/unit/associations/one_to_one_spec.rb +0 -7
  174. data/spec/unit/associations/relationship_spec.rb +0 -71
  175. data/spec/unit/associations_spec.rb +0 -242
  176. data/spec/unit/auto_migrations_spec.rb +0 -111
  177. data/spec/unit/collection_spec.rb +0 -182
  178. data/spec/unit/data_mapper_spec.rb +0 -35
  179. data/spec/unit/identity_map_spec.rb +0 -126
  180. data/spec/unit/is_spec.rb +0 -80
  181. data/spec/unit/migrator_spec.rb +0 -33
  182. data/spec/unit/model_spec.rb +0 -321
  183. data/spec/unit/naming_conventions_spec.rb +0 -36
  184. data/spec/unit/property_set_spec.rb +0 -90
  185. data/spec/unit/property_spec.rb +0 -753
  186. data/spec/unit/query_spec.rb +0 -571
  187. data/spec/unit/repository_spec.rb +0 -93
  188. data/spec/unit/resource_spec.rb +0 -649
  189. data/spec/unit/scope_spec.rb +0 -142
  190. data/spec/unit/transaction_spec.rb +0 -493
  191. data/spec/unit/type_map_spec.rb +0 -114
  192. data/spec/unit/type_spec.rb +0 -119
@@ -1,156 +0,0 @@
1
- require File.expand_path(File.join(File.dirname(__FILE__), '..', 'spec_helper'))
2
-
3
- describe "Strategic Eager Loading" do
4
- include LoggingHelper
5
-
6
- before :all do
7
- class ::Zoo
8
- include DataMapper::Resource
9
- def self.default_repository_name; ADAPTER end
10
-
11
- property :id, Serial
12
- property :name, String
13
-
14
- has n, :exhibits
15
- end
16
-
17
- class ::Exhibit
18
- include DataMapper::Resource
19
- def self.default_repository_name; ADAPTER end
20
-
21
- property :id, Serial
22
- property :name, String
23
- property :zoo_id, Integer
24
-
25
- belongs_to :zoo
26
- has n, :animals
27
- end
28
-
29
- class ::Animal
30
- include DataMapper::Resource
31
- def self.default_repository_name; ADAPTER end
32
-
33
- property :id, Serial
34
- property :name, String
35
- property :exhibit_id, Integer
36
-
37
- belongs_to :exhibit
38
- end
39
-
40
- [Zoo, Exhibit, Animal].each { |k| k.auto_migrate!(ADAPTER) }
41
-
42
- repository(ADAPTER) do
43
- Zoo.create(:name => "Dallas Zoo")
44
- Exhibit.create(:name => "Primates", :zoo_id => 1)
45
- Animal.create(:name => "Chimpanzee", :exhibit_id => 1)
46
- Animal.create(:name => "Orangutan", :exhibit_id => 1)
47
-
48
- Zoo.create(:name => "San Diego")
49
- Exhibit.create(:name => "Aviary", :zoo_id => 2)
50
- Exhibit.create(:name => "Insectorium", :zoo_id => 2)
51
- Exhibit.create(:name => "Bears", :zoo_id => 2)
52
- Animal.create(:name => "Bald Eagle", :exhibit_id => 2)
53
- Animal.create(:name => "Parakeet", :exhibit_id => 2)
54
- Animal.create(:name => "Roach", :exhibit_id => 3)
55
- Animal.create(:name => "Brown Bear", :exhibit_id => 4)
56
- end
57
- end
58
-
59
- it "should eager load children" do
60
- zoo_ids = Zoo.all.map { |z| z.key }
61
- exhibit_ids = Exhibit.all.map { |e| e.key }
62
-
63
- repository(ADAPTER) do
64
- zoos = Zoo.all.entries # load all zoos
65
- dallas = zoos.find { |z| z.name == 'Dallas Zoo' }
66
-
67
- logger do |log|
68
- dallas.exhibits.entries # load all exhibits for zoos in identity_map
69
- dallas.exhibits.size.should == 1
70
-
71
- log.readlines.size.should == 1
72
-
73
- repository.identity_map(Zoo).keys.sort.should == zoo_ids
74
- repository.identity_map(Exhibit).keys.sort.should == exhibit_ids
75
- end
76
-
77
- logger do |log|
78
- zoos.each { |zoo| zoo.exhibits.entries } # issues no queries
79
- log.readlines.should be_empty
80
- end
81
-
82
- dallas.exhibits << Exhibit.new(:name => "Reptiles")
83
- dallas.exhibits.size.should == 2
84
- dallas.save
85
- end
86
- repository(ADAPTER) do
87
- Zoo.first.exhibits.size.should == 2
88
- end
89
- end
90
-
91
- it "should not eager load children when a query is provided" do
92
- repository(ADAPTER) do
93
- dallas = Zoo.all.entries.find { |z| z.name == 'Dallas Zoo' }
94
- exhibits = dallas.exhibits.entries # load all exhibits
95
-
96
- reptiles, primates = nil, nil
97
-
98
- logger do |log|
99
- reptiles = dallas.exhibits(:name => 'Reptiles')
100
- reptiles.size.should == 1
101
-
102
- log.readlines.size.should == 1
103
- end
104
-
105
- logger do |log|
106
- primates = dallas.exhibits(:name => 'Primates')
107
- primates.size.should == 1
108
- primates.should_not == reptiles
109
-
110
- log.readlines.size.should == 1
111
- end
112
- end
113
- end
114
-
115
- it "should eager load parents" do
116
- animal_ids = Animal.all.map { |a| a.key }
117
- exhibit_ids = Exhibit.all.map { |e| e.key }.sort
118
- exhibit_ids.pop # remove Reptile exhibit, which has no Animals
119
-
120
- repository(ADAPTER) do
121
- animals = Animal.all.entries
122
- bear = animals.find { |a| a.name == 'Brown Bear' }
123
-
124
- logger do |log|
125
- bear.exhibit
126
-
127
- repository.identity_map(Animal).keys.sort.should == animal_ids
128
- repository.identity_map(Exhibit).keys.sort.should == exhibit_ids
129
-
130
- log.readlines.size.should == 1
131
- end
132
- end
133
- end
134
-
135
- it "should not eager load parents when parent is in IM" do
136
- repository(ADAPTER) do
137
- animal = Animal.first
138
- exhibit = Exhibit.get(1) # load exhibit into IM
139
-
140
- logger do |log|
141
- animal.exhibit # load exhibit from IM
142
- log.readlines.should be_empty
143
- end
144
-
145
- repository.identity_map(Exhibit).keys.should == [exhibit.key]
146
- end
147
- end
148
-
149
- it "should return a Collection when no children" do
150
- Zoo.create(:name => 'Portland')
151
-
152
- Zoo.all.each do |zoo|
153
- zoo.exhibits.should be_kind_of(DataMapper::Collection)
154
- end
155
- end
156
- end
@@ -1,75 +0,0 @@
1
- require File.expand_path(File.join(File.dirname(__FILE__), '..', 'spec_helper'))
2
-
3
- # transaction capable adapters
4
- ADAPTERS = []
5
- ADAPTERS << :postgres if HAS_POSTGRES
6
- ADAPTERS << :mysql if HAS_MYSQL
7
- ADAPTERS << :sqlite3 if HAS_SQLITE3
8
-
9
- if ADAPTERS.any?
10
- class Sputnik
11
- include DataMapper::Resource
12
-
13
- property :id, Serial
14
- property :name, DM::Text
15
- end
16
-
17
- describe DataMapper::Transaction do
18
- before :all do
19
- @repositories = []
20
-
21
- ADAPTERS.each do |name|
22
- @repositories << repository(name)
23
- end
24
- end
25
-
26
- before :each do
27
- ADAPTERS.each do |name|
28
- Sputnik.auto_migrate!(name)
29
- end
30
- end
31
-
32
- it "should commit changes to all involved adapters on a two phase commit" do
33
- DataMapper::Transaction.new(*@repositories) do
34
- ADAPTERS.each do |name|
35
- repository(name) { Sputnik.create(:name => 'hepp') }
36
- end
37
- end
38
-
39
- ADAPTERS.each do |name|
40
- repository(name) { Sputnik.all.size.should == 1 }
41
- end
42
- end
43
-
44
- it "should not commit any changes if the block raises an exception" do
45
- lambda do
46
- DataMapper::Transaction.new(*@repositories) do
47
- ADAPTERS.each do |name|
48
- repository(name) { Sputnik.create(:name => 'hepp') }
49
- end
50
- raise "plur"
51
- end
52
- end.should raise_error(Exception, /plur/)
53
-
54
- ADAPTERS.each do |name|
55
- repository(name) { Sputnik.all.size.should == 0 }
56
- end
57
- end
58
-
59
- it "should not commit any changes if any of the adapters doesnt prepare properly" do
60
- lambda do
61
- DataMapper::Transaction.new(*@repositories) do |transaction|
62
- ADAPTERS.each do |name|
63
- repository(name) { Sputnik.create(:name => 'hepp') }
64
- end
65
-
66
- transaction.primitive_for(@repositories.last.adapter).should_receive(:prepare).and_throw(Exception.new("I am the famous test exception"))
67
- end
68
- end.should raise_error(Exception, /I am the famous test exception/)
69
-
70
- ADAPTERS.each do |name|
71
- repository(name) { Sputnik.all.size.should == 0 }
72
- end
73
- end
74
- end
75
- end
@@ -1,275 +0,0 @@
1
- require File.expand_path(File.join(File.dirname(__FILE__), '..', 'spec_helper'))
2
-
3
- # if RUBY_VERSION >= '1.9.0'
4
- # require 'csv'
5
- # else
6
- # gem 'fastercsv', '~>1.4.0'
7
- # require 'fastercsv'
8
- # end
9
-
10
- if ADAPTER
11
- module ::TypeTests
12
- class Impostor < DataMapper::Type
13
- primitive String
14
- end
15
-
16
- class Coconut
17
- include DataMapper::Resource
18
-
19
- storage_names[ADAPTER] = 'coconuts'
20
-
21
- def self.default_repository_name
22
- ADAPTER
23
- end
24
-
25
- property :id, Serial
26
- property :faked, Impostor
27
- property :active, Boolean
28
- property :note, Text
29
- end
30
- end
31
-
32
- class ::Lemon
33
- include DataMapper::Resource
34
-
35
- def self.default_repository_name
36
- ADAPTER
37
- end
38
-
39
- property :id, Serial
40
- property :color, String
41
- property :deleted_at, DataMapper::Types::ParanoidDateTime
42
- end
43
-
44
- class ::Lime
45
- include DataMapper::Resource
46
-
47
- def self.default_repository_name
48
- ADAPTER
49
- end
50
-
51
- property :id, Serial
52
- property :color, String
53
- property :deleted_at, DataMapper::Types::ParanoidBoolean
54
- end
55
-
56
- describe DataMapper::Type, "with #{ADAPTER}" do
57
- before do
58
- TypeTests::Coconut.auto_migrate!(ADAPTER)
59
-
60
- @document = <<-EOS.margin
61
- NAME, RATING, CONVENIENCE
62
- Freebird's, 3, 3
63
- Whataburger, 1, 5
64
- Jimmy John's, 3, 4
65
- Mignon, 5, 2
66
- Fuzi Yao's, 5, 1
67
- Blue Goose, 5, 1
68
- EOS
69
-
70
- @stuff = YAML::dump({ 'Happy Cow!' => true, 'Sad Cow!' => false })
71
-
72
- @active = true
73
- @note = "This is a note on our ol' guy bob"
74
- end
75
-
76
- it "should instantiate an object with custom types" do
77
- coconut = TypeTests::Coconut.new(:faked => 'bob', :active => @active, :note => @note)
78
- coconut.faked.should == 'bob'
79
- coconut.active.should be_a_kind_of(TrueClass)
80
- coconut.note.should be_a_kind_of(String)
81
- end
82
-
83
- it "should CRUD an object with custom types" do
84
- repository(ADAPTER) do
85
- coconut = TypeTests::Coconut.new(:faked => 'bob', :active => @active, :note => @note)
86
- coconut.save.should be_true
87
- coconut.id.should_not be_nil
88
-
89
- fred = TypeTests::Coconut.get!(coconut.id)
90
- fred.faked.should == 'bob'
91
- fred.active.should be_a_kind_of(TrueClass)
92
- fred.note.should be_a_kind_of(String)
93
-
94
- note = "Seems like bob is just mockin' around"
95
- fred.note = note
96
-
97
- fred.save.should be_true
98
-
99
- active = false
100
- fred.active = active
101
-
102
- fred.save.should be_true
103
-
104
- # Can't call coconut.reload since coconut.collection isn't setup.
105
- mac = TypeTests::Coconut.get!(fred.id)
106
- mac.active.should == active
107
- mac.note.should == note
108
- end
109
- end
110
-
111
- it "should respect paranoia with a datetime" do
112
- Lemon.auto_migrate!(ADAPTER)
113
-
114
- lemon = nil
115
-
116
- repository(ADAPTER) do |repository|
117
- lemon = Lemon.new
118
- lemon.color = 'green'
119
-
120
- lemon.save
121
- lemon.destroy
122
-
123
- lemon.deleted_at.should be_kind_of(DateTime)
124
- end
125
-
126
- repository(ADAPTER) do |repository|
127
- Lemon.all.should be_empty
128
- Lemon.get(lemon.id).should be_nil
129
- end
130
- end
131
-
132
- it "should provide access to paranoid items with DateTime" do
133
- Lemon.auto_migrate!(ADAPTER)
134
-
135
- lemon = nil
136
-
137
- repository(ADAPTER) do |repository|
138
- %w(red green yellow blue).each do |color|
139
- Lemon.create(:color => color)
140
- end
141
-
142
- Lemon.all.size.should == 4
143
- Lemon.first.destroy
144
- Lemon.all.size.should == 3
145
- Lemon.with_deleted{Lemon.all.size.should == 1}
146
- end
147
- end
148
-
149
- it "should set paranoid datetime to a date time" do
150
- tmp = (DateTime.now - 0.5)
151
- dt = DateTime.now
152
- DateTime.stub!(:now).and_return(tmp)
153
-
154
- repository(ADAPTER) do |repository|
155
- lemon = Lemon.new
156
- lemon.color = 'green'
157
- lemon.save
158
- lemon.destroy
159
- lemon.deleted_at.should == tmp
160
- end
161
- end
162
-
163
- it "should respect paranoia with a boolean" do
164
- Lime.auto_migrate!(ADAPTER)
165
-
166
- lime = nil
167
-
168
- repository(ADAPTER) do |repository|
169
- lime = Lime.new
170
- lime.color = 'green'
171
-
172
- lime.save
173
- lime.destroy
174
-
175
- lime.deleted_at.should be_kind_of(TrueClass)
176
- end
177
-
178
- repository(ADAPTER) do |repository|
179
- Lime.all.should be_empty
180
- Lime.get(lime.id).should be_nil
181
- end
182
- end
183
-
184
- it "should provide access to paranoid items with Boolean" do
185
- Lime.auto_migrate!(ADAPTER)
186
-
187
- lemon = nil
188
-
189
- repository(ADAPTER) do |repository|
190
- %w(red green yellow blue).each do |color|
191
- Lime.create(:color => color)
192
- end
193
-
194
- Lime.all.size.should == 4
195
- Lime.first.destroy
196
- Lime.all.size.should == 3
197
- Lime.with_deleted{Lime.all.size.should == 1}
198
- end
199
- end
200
-
201
- describe "paranoid types across repositories" do
202
- before(:all) do
203
- DataMapper::Repository.adapters[:alternate_paranoid] = repository(ADAPTER).adapter.dup
204
-
205
- Object.send(:remove_const, :Orange) if defined?(Orange)
206
- class ::Orange
207
- include DataMapper::Resource
208
-
209
- def self.default_repository_name
210
- ADAPTER
211
- end
212
-
213
- property :id, Serial
214
- property :color, String
215
-
216
- repository(:alternate_paranoid) do
217
- property :deleted, DataMapper::Types::ParanoidBoolean
218
- property :deleted_at, DataMapper::Types::ParanoidDateTime
219
- end
220
- end
221
-
222
- repository(:alternate_paranoid){Orange.auto_migrate!}
223
- end
224
-
225
- before(:each) do
226
- %w(red orange blue green).each{|color| o = Orange.create(:color => color)}
227
- end
228
-
229
- after(:each) do
230
- Orange.repository.adapter.execute("DELETE FROM oranges")
231
- end
232
-
233
- it "should setup the correct objects for the spec" do
234
- repository(:alternate_paranoid){Orange.all.should have(4).items}
235
- end
236
-
237
- it "should allow access the the default repository" do
238
- Orange.all.should have(4).items
239
- end
240
-
241
- it "should mark the objects as deleted in the alternate_paranoid repository" do
242
- repository(:alternate_paranoid) do
243
- Orange.first.destroy
244
- Orange.all.should have(3).items
245
- Orange.find_by_sql("SELECT * FROM oranges").should have(4).items
246
- end
247
- end
248
-
249
- it "should mark the objects as deleted in the alternate_paranoid repository but ignore it in the #{ADAPTER} repository" do
250
- repository(:alternate_paranoid) do
251
- Orange.first.destroy
252
- end
253
- Orange.all.should have(4).items
254
- end
255
-
256
- it "should raise an error when trying to destroy from a repository that is not paranoid" do
257
- lambda do
258
- Orange.first.destroy
259
- end.should raise_error(ArgumentError)
260
- end
261
-
262
- it "should set all paranoid attributes on delete" do
263
- repository(:alternate_paranoid) do
264
- orange = Orange.first
265
- orange.deleted.should be_false
266
- orange.deleted_at.should be_nil
267
- orange.destroy
268
-
269
- orange.deleted.should be_true
270
- orange.deleted_at.should be_a_kind_of(DateTime)
271
- end
272
- end
273
- end
274
- end
275
- end
@@ -1,18 +0,0 @@
1
- module LoggingHelper
2
- def logger
3
- class << DataMapper.logger
4
- attr_writer :log
5
- end
6
-
7
- old_log = DataMapper.logger.log
8
-
9
- begin
10
- StringIO.new('') do |io|
11
- DataMapper.logger.log = io
12
- yield io
13
- end
14
- ensure
15
- DataMapper.logger.log = old_log
16
- end
17
- end
18
- end
@@ -1,27 +0,0 @@
1
- module DataMapper
2
- module Adapters
3
- class MockAdapter < DataMapper::Adapters::DataObjectsAdapter
4
-
5
- def create(resources)
6
- 1
7
- end
8
-
9
- def exists?(storage_name)
10
- true
11
- end
12
-
13
- end
14
- end
15
- end
16
-
17
- module DataObjects
18
- module Mock
19
-
20
- def self.logger
21
- end
22
-
23
- def self.logger=(value)
24
- end
25
-
26
- end
27
- end
@@ -1,100 +0,0 @@
1
- # ---
2
- # Overview
3
- # ========
4
- # ModelLoader is a method for loading methods models for specs in a way
5
- # that will ensure that each spec will be an a pristine state when run.
6
- #
7
- # The problem is that if a spec needs to modify a model, the modifications
8
- # should not carry over to the next spec. As such, all models are
9
- # destroyed at the end of the spec and reloaded at the start.
10
- #
11
- # The second problem is that DataMapper::Resource keeps track
12
- # of every class that it is included in. This is used for automigration.
13
- # A number of specs run automigrate, and we don't want all the classes
14
- # that were defined in other specs to be migrated as well.
15
- #
16
- # Usage
17
- # =====
18
- #
19
- # Sets the specified model metaphors to be loaded before each spec and
20
- # destroyed after each spec in the current example group. This method
21
- # can be used in a describe block or in a before block.
22
- #
23
- # ==== Parameters
24
- # *metaphor<Symbol>:: The name of the metaphor to load (this is just the filename of
25
- # file in specs/models)
26
- #
27
- # ==== Example
28
- #
29
- # describe "DataMapper::Associations" do
30
- #
31
- # load_models_for_metaphor :zoo, :blog
32
- #
33
- # it "should be awesome" do
34
- # Zoo.new.should be_awesome
35
- # end
36
- # end
37
- module ModelLoader
38
-
39
- def self.included(base)
40
- base.extend(ClassMethods)
41
- base.class_eval { include InstanceMethods }
42
- # base.before(:each) { load_models(:global) }
43
- base.after(:each) { unload_models }
44
- end
45
-
46
- module ClassMethods
47
-
48
- def load_models_for_metaphor(*metaphors)
49
- before(:each) { load_models_for_metaphor(*metaphors) }
50
- end
51
-
52
- end
53
-
54
- module InstanceMethods
55
-
56
- def load_models_for_metaphor(*metaphors)
57
- files = metaphors.map { |m| DataMapper.root / "spec" / "models" / "#{m}.rb" }
58
-
59
- klasses = object_space_classes.dup
60
- files.each { |file| load file }
61
- loaded_models.concat(object_space_classes - klasses)
62
- end
63
-
64
- def unload_models
65
- while model = loaded_models.pop
66
- remove_model(model)
67
- end
68
- end
69
-
70
- def loaded_models
71
- @loaded_models ||= []
72
- end
73
-
74
- private
75
-
76
- def object_space_classes
77
- klasses = []
78
- ObjectSpace.each_object(Class) {|o| klasses << o}
79
- klasses
80
- end
81
-
82
- def remove_model(klass)
83
- DataMapper::Resource.descendants.delete(klass)
84
- # Check to see if the model is living inside a module
85
- klass_name = klass.to_s
86
- if klass_name.index("::")
87
- mod = klass_name.match(/(\S+)::/)[1]
88
- child_class = klass_name.match(/\S+::(\S+)/)[1]
89
-
90
- Object.const_get(mod).module_eval { remove_const child_class }
91
- else
92
- Object.module_eval { remove_const klass.to_s }
93
- end
94
- end
95
- end
96
- end
97
-
98
- Spec::Runner.configure do |config|
99
- config.include(ModelLoader)
100
- end
@@ -1,28 +0,0 @@
1
- class Class
2
- def publicize_methods
3
- klass = class << self; self; end
4
-
5
- saved_private_class_methods = klass.private_instance_methods
6
- saved_protected_class_methods = klass.protected_instance_methods
7
- saved_private_instance_methods = self.private_instance_methods
8
- saved_protected_instance_methods = self.protected_instance_methods
9
-
10
- self.class_eval do
11
- klass.send(:public, *saved_private_class_methods)
12
- klass.send(:public, *saved_protected_class_methods)
13
- public(*saved_private_instance_methods)
14
- public(*saved_protected_instance_methods)
15
- end
16
-
17
- begin
18
- yield
19
- ensure
20
- self.class_eval do
21
- klass.send(:private, *saved_private_class_methods)
22
- klass.send(:protected, *saved_protected_class_methods)
23
- private(*saved_private_instance_methods)
24
- protected(*saved_protected_instance_methods)
25
- end
26
- end
27
- end
28
- end
@@ -1,16 +0,0 @@
1
- module Content
2
- class Dialect
3
- include DataMapper::Resource
4
-
5
- property :id, Serial
6
- property :name, String
7
- property :code, String
8
- end
9
-
10
- class Locale
11
- include DataMapper::Resource
12
-
13
- property :id, Serial
14
- property :name, String
15
- end
16
- end