terrestrial 0.1.1 → 0.3.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.ruby-version +1 -1
- data/Gemfile.lock +29 -24
- data/README.md +35 -17
- data/Rakefile +4 -9
- data/TODO.md +25 -18
- data/bin/test +31 -0
- data/docs/domain_object_contract.md +50 -0
- data/features/env.rb +4 -6
- data/features/example.feature +28 -28
- data/features/step_definitions/example_steps.rb +2 -2
- data/lib/terrestrial/adapters/memory_adapter.rb +241 -0
- data/lib/terrestrial/collection_mutability_proxy.rb +7 -2
- data/lib/terrestrial/dirty_map.rb +5 -0
- data/lib/terrestrial/error.rb +69 -0
- data/lib/terrestrial/graph_loader.rb +58 -35
- data/lib/terrestrial/graph_serializer.rb +37 -30
- data/lib/terrestrial/inspection_string.rb +19 -0
- data/lib/terrestrial/lazy_collection.rb +2 -2
- data/lib/terrestrial/lazy_object_proxy.rb +1 -1
- data/lib/terrestrial/many_to_one_association.rb +17 -11
- data/lib/terrestrial/public_conveniencies.rb +125 -95
- data/lib/terrestrial/relation_mapping.rb +30 -0
- data/lib/terrestrial/{mapper_facade.rb → relational_store.rb} +11 -1
- data/lib/terrestrial/version.rb +1 -1
- data/spec/config_override_spec.rb +10 -14
- data/spec/custom_serializers_spec.rb +4 -6
- data/spec/deletion_spec.rb +12 -14
- data/spec/error_handling/factory_error_handling_spec.rb +61 -0
- data/spec/error_handling/serialization_error_spec.rb +50 -0
- data/spec/error_handling/upsert_error_spec.rb +132 -0
- data/spec/graph_persistence_spec.rb +80 -24
- data/spec/graph_traversal_spec.rb +14 -6
- data/spec/new_graph_persistence_spec.rb +43 -9
- data/spec/object_identity_spec.rb +5 -7
- data/spec/ordered_association_spec.rb +4 -6
- data/spec/predefined_queries_spec.rb +4 -6
- data/spec/querying_spec.rb +4 -12
- data/spec/readme_examples_spec.rb +3 -6
- data/spec/{persistence_efficiency_spec.rb → sequel_query_efficiency_spec.rb} +101 -19
- data/spec/spec_helper.rb +24 -2
- data/spec/support/memory_adapter_test_support.rb +21 -0
- data/spec/support/{mapper_setup.rb → object_store_setup.rb} +5 -5
- data/spec/support/seed_data_setup.rb +3 -1
- data/spec/support/sequel_test_support.rb +58 -25
- data/spec/{sequel_mapper → terrestrial}/abstract_record_spec.rb +0 -0
- data/spec/{sequel_mapper → terrestrial}/collection_mutability_proxy_spec.rb +0 -0
- data/spec/{sequel_mapper → terrestrial}/deleted_record_spec.rb +0 -0
- data/spec/{sequel_mapper → terrestrial}/dirty_map_spec.rb +38 -6
- data/spec/{sequel_mapper → terrestrial}/lazy_collection_spec.rb +2 -3
- data/spec/{sequel_mapper → terrestrial}/lazy_object_proxy_spec.rb +0 -0
- data/spec/{sequel_mapper → terrestrial}/public_conveniencies_spec.rb +12 -7
- data/spec/{sequel_mapper → terrestrial}/upserted_record_spec.rb +0 -0
- data/{sequel_mapper.gemspec → terrestrial.gemspec} +3 -3
- metadata +47 -39
- data/lib/terrestrial/short_inspection_string.rb +0 -18
- data/spec/proxying_spec.rb +0 -88
- data/spec/support/mock_sequel.rb +0 -193
- data/spec/support/sequel_persistence_setup.rb +0 -19
File without changes
|
File without changes
|
File without changes
|
@@ -11,7 +11,7 @@ RSpec.describe Terrestrial::DirtyMap do
|
|
11
11
|
|
12
12
|
let(:storage) { {} }
|
13
13
|
|
14
|
-
let(:
|
14
|
+
let(:record) {
|
15
15
|
create_record( namespace, identity_fields, attributes, depth)
|
16
16
|
}
|
17
17
|
|
@@ -27,15 +27,47 @@ RSpec.describe Terrestrial::DirtyMap do
|
|
27
27
|
}
|
28
28
|
}
|
29
29
|
|
30
|
+
describe "#load_if_new" do
|
31
|
+
context "when a record is new" do
|
32
|
+
it "adds it to the map" do
|
33
|
+
dirty_map.load_if_new(record)
|
34
|
+
|
35
|
+
expect(storage).to include([:table_name, { id: "record/id" }])
|
36
|
+
end
|
37
|
+
|
38
|
+
it "returns the record" do
|
39
|
+
expect(dirty_map.load_if_new(record)).to eq(record)
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
43
|
+
context "when the record has already been loaded" do
|
44
|
+
let(:storage) {
|
45
|
+
{
|
46
|
+
[:table_name, { id: "record/id" }] => record
|
47
|
+
}
|
48
|
+
}
|
49
|
+
|
50
|
+
it "has no effect on the storage" do
|
51
|
+
expect {
|
52
|
+
dirty_map.load_if_new(record)
|
53
|
+
}.not_to change { storage }
|
54
|
+
end
|
55
|
+
|
56
|
+
it "returns the record" do
|
57
|
+
expect(dirty_map.load_if_new(record)).to eq(record)
|
58
|
+
end
|
59
|
+
end
|
60
|
+
end
|
61
|
+
|
30
62
|
describe "#load" do
|
31
63
|
it "adds the record to its storage" do
|
32
|
-
dirty_map.load(
|
64
|
+
dirty_map.load(record)
|
33
65
|
|
34
|
-
expect(storage.values).to include(
|
66
|
+
expect(storage.values).to include(record)
|
35
67
|
end
|
36
68
|
|
37
69
|
it "returns the loaded record" do
|
38
|
-
expect(dirty_map.load(
|
70
|
+
expect(dirty_map.load(record)).to eq(record)
|
39
71
|
end
|
40
72
|
end
|
41
73
|
|
@@ -61,7 +93,7 @@ RSpec.describe Terrestrial::DirtyMap do
|
|
61
93
|
|
62
94
|
context "when a record with same identity has been loaded (existing record)" do
|
63
95
|
before do
|
64
|
-
dirty_map.load(
|
96
|
+
dirty_map.load(record)
|
65
97
|
end
|
66
98
|
|
67
99
|
context "when the record is unchanged" do
|
@@ -181,7 +213,7 @@ RSpec.describe Terrestrial::DirtyMap do
|
|
181
213
|
|
182
214
|
context "when a record with same identity has been loaded (existing record)" do
|
183
215
|
before do
|
184
|
-
dirty_map.load(
|
216
|
+
dirty_map.load(record)
|
185
217
|
end
|
186
218
|
|
187
219
|
context "with a equivalent record" do
|
@@ -7,7 +7,7 @@ RSpec.describe Terrestrial::LazyCollection do
|
|
7
7
|
Terrestrial::LazyCollection.new(
|
8
8
|
database_enum,
|
9
9
|
loader,
|
10
|
-
|
10
|
+
queries,
|
11
11
|
)
|
12
12
|
}
|
13
13
|
|
@@ -24,8 +24,7 @@ RSpec.describe Terrestrial::LazyCollection do
|
|
24
24
|
let(:collection_size) { row_object_map.size }
|
25
25
|
|
26
26
|
let(:database_enum) { [row1, row2].each.lazy }
|
27
|
-
|
28
|
-
let(:mapper) { double(:mapper) }
|
27
|
+
let(:queries) { {} }
|
29
28
|
|
30
29
|
let(:loader_count) { @loader_count }
|
31
30
|
let(:loader) {
|
File without changes
|
@@ -1,6 +1,7 @@
|
|
1
1
|
require "spec_helper"
|
2
2
|
|
3
3
|
require "terrestrial/public_conveniencies"
|
4
|
+
require "ostruct"
|
4
5
|
|
5
6
|
RSpec.describe Terrestrial::PublicConveniencies do
|
6
7
|
subject(:conveniences) {
|
@@ -13,7 +14,7 @@ RSpec.describe Terrestrial::PublicConveniencies do
|
|
13
14
|
end
|
14
15
|
end
|
15
16
|
|
16
|
-
describe "#
|
17
|
+
describe "#object_store" do
|
17
18
|
let(:datastore) {
|
18
19
|
MockDatastore.new(
|
19
20
|
{
|
@@ -22,7 +23,7 @@ RSpec.describe Terrestrial::PublicConveniencies do
|
|
22
23
|
)
|
23
24
|
}
|
24
25
|
|
25
|
-
let(:
|
26
|
+
let(:mappings) {
|
26
27
|
{
|
27
28
|
things: double(
|
28
29
|
:thing_config,
|
@@ -31,7 +32,7 @@ RSpec.describe Terrestrial::PublicConveniencies do
|
|
31
32
|
fields: [:id],
|
32
33
|
associations: [],
|
33
34
|
primary_key: [],
|
34
|
-
|
35
|
+
load: thing_object,
|
35
36
|
)
|
36
37
|
}
|
37
38
|
}
|
@@ -44,14 +45,18 @@ RSpec.describe Terrestrial::PublicConveniencies do
|
|
44
45
|
}
|
45
46
|
}
|
46
47
|
|
47
|
-
|
48
|
-
|
49
|
-
|
48
|
+
let(:thing_object) {
|
49
|
+
OpenStruct.new(thing_record)
|
50
|
+
}
|
51
|
+
|
52
|
+
it "returns an object store for given mappings" do
|
53
|
+
object_store = conveniences.object_store(
|
54
|
+
mappings: mappings,
|
50
55
|
datastore: datastore,
|
51
56
|
)
|
52
57
|
|
53
58
|
expect(
|
54
|
-
|
59
|
+
object_store[:things].all.first.id
|
55
60
|
).to eq("THE THING")
|
56
61
|
end
|
57
62
|
end
|
File without changes
|
@@ -8,8 +8,8 @@ Gem::Specification.new do |spec|
|
|
8
8
|
spec.version = Terrestrial::VERSION
|
9
9
|
spec.authors = ["Stephen Best"]
|
10
10
|
spec.email = ["bestie@gmail.com"]
|
11
|
-
spec.summary = %q{A data
|
12
|
-
spec.description = %q{
|
11
|
+
spec.summary = %q{A data mapper ORM for Ruby}
|
12
|
+
spec.description = %q{A data mapper ORM for Ruby. Persists POROs, enables DDD and fast tests. Makes your objects less alien.}
|
13
13
|
spec.homepage = "https://github.com/bestie/terrestrial"
|
14
14
|
spec.license = "MIT"
|
15
15
|
|
@@ -22,7 +22,7 @@ Gem::Specification.new do |spec|
|
|
22
22
|
spec.add_development_dependency "rake", "~> 10.0"
|
23
23
|
spec.add_development_dependency "pry", "~> 0.10.1"
|
24
24
|
spec.add_development_dependency "rspec", "~> 3.1"
|
25
|
-
spec.add_development_dependency "cucumber"
|
25
|
+
spec.add_development_dependency "cucumber", "~> 2.4"
|
26
26
|
spec.add_development_dependency "pg", "~> 0.17.1"
|
27
27
|
|
28
28
|
spec.add_dependency "sequel", "~> 4.16"
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: terrestrial
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.3.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Stephen Best
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2017-01-26 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -70,16 +70,16 @@ dependencies:
|
|
70
70
|
name: cucumber
|
71
71
|
requirement: !ruby/object:Gem::Requirement
|
72
72
|
requirements:
|
73
|
-
- - "
|
73
|
+
- - "~>"
|
74
74
|
- !ruby/object:Gem::Version
|
75
|
-
version: '
|
75
|
+
version: '2.4'
|
76
76
|
type: :development
|
77
77
|
prerelease: false
|
78
78
|
version_requirements: !ruby/object:Gem::Requirement
|
79
79
|
requirements:
|
80
|
-
- - "
|
80
|
+
- - "~>"
|
81
81
|
- !ruby/object:Gem::Version
|
82
|
-
version: '
|
82
|
+
version: '2.4'
|
83
83
|
- !ruby/object:Gem::Dependency
|
84
84
|
name: pg
|
85
85
|
requirement: !ruby/object:Gem::Requirement
|
@@ -136,10 +136,12 @@ dependencies:
|
|
136
136
|
- - "~>"
|
137
137
|
- !ruby/object:Gem::Version
|
138
138
|
version: '1.0'
|
139
|
-
description:
|
139
|
+
description: A data mapper ORM for Ruby. Persists POROs, enables DDD and fast tests.
|
140
|
+
Makes your objects less alien.
|
140
141
|
email:
|
141
142
|
- bestie@gmail.com
|
142
|
-
executables:
|
143
|
+
executables:
|
144
|
+
- test
|
143
145
|
extensions: []
|
144
146
|
extra_rdoc_files: []
|
145
147
|
files:
|
@@ -154,11 +156,14 @@ files:
|
|
154
156
|
- README.md
|
155
157
|
- Rakefile
|
156
158
|
- TODO.md
|
159
|
+
- bin/test
|
160
|
+
- docs/domain_object_contract.md
|
157
161
|
- features/env.rb
|
158
162
|
- features/example.feature
|
159
163
|
- features/step_definitions/example_steps.rb
|
160
164
|
- lib/terrestrial.rb
|
161
165
|
- lib/terrestrial/abstract_record.rb
|
166
|
+
- lib/terrestrial/adapters/memory_adapter.rb
|
162
167
|
- lib/terrestrial/association_loaders.rb
|
163
168
|
- lib/terrestrial/collection_mutability_proxy.rb
|
164
169
|
- lib/terrestrial/configurations/conventional_association_configuration.rb
|
@@ -166,55 +171,57 @@ files:
|
|
166
171
|
- lib/terrestrial/dataset.rb
|
167
172
|
- lib/terrestrial/deleted_record.rb
|
168
173
|
- lib/terrestrial/dirty_map.rb
|
174
|
+
- lib/terrestrial/error.rb
|
169
175
|
- lib/terrestrial/graph_loader.rb
|
170
176
|
- lib/terrestrial/graph_serializer.rb
|
171
177
|
- lib/terrestrial/identity_map.rb
|
178
|
+
- lib/terrestrial/inspection_string.rb
|
172
179
|
- lib/terrestrial/lazy_collection.rb
|
173
180
|
- lib/terrestrial/lazy_object_proxy.rb
|
174
181
|
- lib/terrestrial/many_to_many_association.rb
|
175
182
|
- lib/terrestrial/many_to_one_association.rb
|
176
|
-
- lib/terrestrial/mapper_facade.rb
|
177
183
|
- lib/terrestrial/one_to_many_association.rb
|
178
184
|
- lib/terrestrial/public_conveniencies.rb
|
179
185
|
- lib/terrestrial/query_order.rb
|
180
186
|
- lib/terrestrial/relation_mapping.rb
|
187
|
+
- lib/terrestrial/relational_store.rb
|
181
188
|
- lib/terrestrial/serializer.rb
|
182
|
-
- lib/terrestrial/short_inspection_string.rb
|
183
189
|
- lib/terrestrial/struct_factory.rb
|
184
190
|
- lib/terrestrial/subset_queries_proxy.rb
|
185
191
|
- lib/terrestrial/upserted_record.rb
|
186
192
|
- lib/terrestrial/version.rb
|
187
|
-
- sequel_mapper.gemspec
|
188
193
|
- spec/config_override_spec.rb
|
189
194
|
- spec/custom_serializers_spec.rb
|
190
195
|
- spec/deletion_spec.rb
|
196
|
+
- spec/error_handling/factory_error_handling_spec.rb
|
197
|
+
- spec/error_handling/serialization_error_spec.rb
|
198
|
+
- spec/error_handling/upsert_error_spec.rb
|
191
199
|
- spec/graph_persistence_spec.rb
|
192
200
|
- spec/graph_traversal_spec.rb
|
193
201
|
- spec/new_graph_persistence_spec.rb
|
194
202
|
- spec/object_identity_spec.rb
|
195
203
|
- spec/ordered_association_spec.rb
|
196
|
-
- spec/persistence_efficiency_spec.rb
|
197
204
|
- spec/predefined_queries_spec.rb
|
198
|
-
- spec/proxying_spec.rb
|
199
205
|
- spec/querying_spec.rb
|
200
206
|
- spec/readme_examples_spec.rb
|
201
|
-
- spec/
|
202
|
-
- spec/sequel_mapper/collection_mutability_proxy_spec.rb
|
203
|
-
- spec/sequel_mapper/deleted_record_spec.rb
|
204
|
-
- spec/sequel_mapper/dirty_map_spec.rb
|
205
|
-
- spec/sequel_mapper/lazy_collection_spec.rb
|
206
|
-
- spec/sequel_mapper/lazy_object_proxy_spec.rb
|
207
|
-
- spec/sequel_mapper/public_conveniencies_spec.rb
|
208
|
-
- spec/sequel_mapper/upserted_record_spec.rb
|
207
|
+
- spec/sequel_query_efficiency_spec.rb
|
209
208
|
- spec/spec_helper.rb
|
210
209
|
- spec/support/blog_schema.rb
|
211
210
|
- spec/support/have_persisted_matcher.rb
|
212
|
-
- spec/support/
|
213
|
-
- spec/support/mock_sequel.rb
|
211
|
+
- spec/support/memory_adapter_test_support.rb
|
214
212
|
- spec/support/object_graph_setup.rb
|
213
|
+
- spec/support/object_store_setup.rb
|
215
214
|
- spec/support/seed_data_setup.rb
|
216
|
-
- spec/support/sequel_persistence_setup.rb
|
217
215
|
- spec/support/sequel_test_support.rb
|
216
|
+
- spec/terrestrial/abstract_record_spec.rb
|
217
|
+
- spec/terrestrial/collection_mutability_proxy_spec.rb
|
218
|
+
- spec/terrestrial/deleted_record_spec.rb
|
219
|
+
- spec/terrestrial/dirty_map_spec.rb
|
220
|
+
- spec/terrestrial/lazy_collection_spec.rb
|
221
|
+
- spec/terrestrial/lazy_object_proxy_spec.rb
|
222
|
+
- spec/terrestrial/public_conveniencies_spec.rb
|
223
|
+
- spec/terrestrial/upserted_record_spec.rb
|
224
|
+
- terrestrial.gemspec
|
218
225
|
homepage: https://github.com/bestie/terrestrial
|
219
226
|
licenses:
|
220
227
|
- MIT
|
@@ -235,10 +242,10 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
235
242
|
version: '0'
|
236
243
|
requirements: []
|
237
244
|
rubyforge_project:
|
238
|
-
rubygems_version: 2.
|
245
|
+
rubygems_version: 2.5.1
|
239
246
|
signing_key:
|
240
247
|
specification_version: 4
|
241
|
-
summary: A data
|
248
|
+
summary: A data mapper ORM for Ruby
|
242
249
|
test_files:
|
243
250
|
- features/env.rb
|
244
251
|
- features/example.feature
|
@@ -246,30 +253,31 @@ test_files:
|
|
246
253
|
- spec/config_override_spec.rb
|
247
254
|
- spec/custom_serializers_spec.rb
|
248
255
|
- spec/deletion_spec.rb
|
256
|
+
- spec/error_handling/factory_error_handling_spec.rb
|
257
|
+
- spec/error_handling/serialization_error_spec.rb
|
258
|
+
- spec/error_handling/upsert_error_spec.rb
|
249
259
|
- spec/graph_persistence_spec.rb
|
250
260
|
- spec/graph_traversal_spec.rb
|
251
261
|
- spec/new_graph_persistence_spec.rb
|
252
262
|
- spec/object_identity_spec.rb
|
253
263
|
- spec/ordered_association_spec.rb
|
254
|
-
- spec/persistence_efficiency_spec.rb
|
255
264
|
- spec/predefined_queries_spec.rb
|
256
|
-
- spec/proxying_spec.rb
|
257
265
|
- spec/querying_spec.rb
|
258
266
|
- spec/readme_examples_spec.rb
|
259
|
-
- spec/
|
260
|
-
- spec/sequel_mapper/collection_mutability_proxy_spec.rb
|
261
|
-
- spec/sequel_mapper/deleted_record_spec.rb
|
262
|
-
- spec/sequel_mapper/dirty_map_spec.rb
|
263
|
-
- spec/sequel_mapper/lazy_collection_spec.rb
|
264
|
-
- spec/sequel_mapper/lazy_object_proxy_spec.rb
|
265
|
-
- spec/sequel_mapper/public_conveniencies_spec.rb
|
266
|
-
- spec/sequel_mapper/upserted_record_spec.rb
|
267
|
+
- spec/sequel_query_efficiency_spec.rb
|
267
268
|
- spec/spec_helper.rb
|
268
269
|
- spec/support/blog_schema.rb
|
269
270
|
- spec/support/have_persisted_matcher.rb
|
270
|
-
- spec/support/
|
271
|
-
- spec/support/mock_sequel.rb
|
271
|
+
- spec/support/memory_adapter_test_support.rb
|
272
272
|
- spec/support/object_graph_setup.rb
|
273
|
+
- spec/support/object_store_setup.rb
|
273
274
|
- spec/support/seed_data_setup.rb
|
274
|
-
- spec/support/sequel_persistence_setup.rb
|
275
275
|
- spec/support/sequel_test_support.rb
|
276
|
+
- spec/terrestrial/abstract_record_spec.rb
|
277
|
+
- spec/terrestrial/collection_mutability_proxy_spec.rb
|
278
|
+
- spec/terrestrial/deleted_record_spec.rb
|
279
|
+
- spec/terrestrial/dirty_map_spec.rb
|
280
|
+
- spec/terrestrial/lazy_collection_spec.rb
|
281
|
+
- spec/terrestrial/lazy_object_proxy_spec.rb
|
282
|
+
- spec/terrestrial/public_conveniencies_spec.rb
|
283
|
+
- spec/terrestrial/upserted_record_spec.rb
|
@@ -1,18 +0,0 @@
|
|
1
|
-
module Terrestrial
|
2
|
-
module ShortInspectionString
|
3
|
-
def inspect
|
4
|
-
"\#<#{self.class.name}:#{self.object_id.<<(1).to_s(16)} " +
|
5
|
-
inspectable_properties.map { |property|
|
6
|
-
[
|
7
|
-
property,
|
8
|
-
instance_variable_get("@#{property}").inspect
|
9
|
-
].join("=")
|
10
|
-
}
|
11
|
-
.join(" ") + ">"
|
12
|
-
end
|
13
|
-
|
14
|
-
def inspectable_properties
|
15
|
-
[]
|
16
|
-
end
|
17
|
-
end
|
18
|
-
end
|
data/spec/proxying_spec.rb
DELETED
@@ -1,88 +0,0 @@
|
|
1
|
-
require "spec_helper"
|
2
|
-
|
3
|
-
require "support/mapper_setup"
|
4
|
-
require "support/sequel_persistence_setup"
|
5
|
-
require "support/seed_data_setup"
|
6
|
-
require "terrestrial"
|
7
|
-
|
8
|
-
RSpec.describe "Proxying associations" do
|
9
|
-
include_context "mapper setup"
|
10
|
-
include_context "sequel persistence setup"
|
11
|
-
include_context "seed data setup"
|
12
|
-
|
13
|
-
context "of type `has_many`" do
|
14
|
-
subject(:mapper) { user_mapper }
|
15
|
-
|
16
|
-
let(:user) {
|
17
|
-
mapper.where(id: "users/1").first
|
18
|
-
}
|
19
|
-
|
20
|
-
let(:posts) { user.posts }
|
21
|
-
|
22
|
-
describe "limiting datastore reads" do
|
23
|
-
context "when loading the root node" do
|
24
|
-
it "only performs one read" do
|
25
|
-
expect {
|
26
|
-
user
|
27
|
-
}.to change { query_counter.read_count }.by(1)
|
28
|
-
end
|
29
|
-
end
|
30
|
-
|
31
|
-
context "when getting a reference to an association proxy" do
|
32
|
-
before { user }
|
33
|
-
|
34
|
-
it "does no additional reads" do
|
35
|
-
expect{
|
36
|
-
user.posts
|
37
|
-
}.to change { query_counter.read_count }.by(0)
|
38
|
-
end
|
39
|
-
end
|
40
|
-
|
41
|
-
context "when iteratiing over a has many association" do
|
42
|
-
before { posts }
|
43
|
-
|
44
|
-
it "does a single additional read for the association collection" do
|
45
|
-
expect {
|
46
|
-
user.posts.each { |x| x }
|
47
|
-
}.to change { query_counter.read_count }.by(1)
|
48
|
-
end
|
49
|
-
|
50
|
-
context "when doing this more than once" do
|
51
|
-
before do
|
52
|
-
posts.each { |x| x }
|
53
|
-
end
|
54
|
-
|
55
|
-
it "performs no additional reads" do
|
56
|
-
expect {
|
57
|
-
user.posts.each { |x| x }
|
58
|
-
}.not_to change { query_counter.read_count }
|
59
|
-
end
|
60
|
-
end
|
61
|
-
end
|
62
|
-
|
63
|
-
context "when getting a reference to a many to many association" do
|
64
|
-
before { post }
|
65
|
-
|
66
|
-
let(:post) { user.posts.first }
|
67
|
-
|
68
|
-
it "does no additional reads" do
|
69
|
-
expect {
|
70
|
-
post.categories
|
71
|
-
}.to change { query_counter.read_count }.by(0)
|
72
|
-
end
|
73
|
-
end
|
74
|
-
|
75
|
-
context "when iterating over a many to many association" do
|
76
|
-
let(:category_count) { 3 }
|
77
|
-
|
78
|
-
it "does 1 read" do
|
79
|
-
post = user.posts.first
|
80
|
-
|
81
|
-
expect {
|
82
|
-
post.categories.each { |x| x }
|
83
|
-
}.to change { query_counter.read_count }.by(1)
|
84
|
-
end
|
85
|
-
end
|
86
|
-
end
|
87
|
-
end
|
88
|
-
end
|