praxis-mapper 4.0 → 4.1

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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 04a36d68c2385426a0b0aed2295c41299b0c3943
4
- data.tar.gz: 5eca3e994f89a94f67a7c1f0d9ec3ed64c274793
3
+ metadata.gz: 534dfb921f690285f07345acfe42725bdc8cef94
4
+ data.tar.gz: 603a6f23b61c9734595fc2358bc01f2d08de439f
5
5
  SHA512:
6
- metadata.gz: 9604920ffc4719206ee8dd41cb2e3a642bb87f8efd64fa44c310d1e6db6f4a702a94c9965724bd98d27984336d745d06b131f766752b989ccfbeb127b754bf9e
7
- data.tar.gz: 88a2a5c4c87f99701c955e4f1063e8d5169363f6250cf06b992b53f978581b6cc35cbd645c4d2c34229146e8ada75534ad5b338598038c870a2ace98f214b895
6
+ metadata.gz: 09b91f6256a04bc776a3aabc82e1b070182c2a03ecdfd9d86edb5abcee01f06529d99f0bb5667a2fc202d5089370799f19f226f5e869ae676339802b385f1f88
7
+ data.tar.gz: 88dec0ce7600e96e87bc08963f8228c18e0b963ebbaa2da448a550e5287bc6331c330559d75d574b681052f5de4d67a5cb64f614b5067bb2e4b743e09f3d9357
data/CHANGELOG.md CHANGED
@@ -1,14 +1,22 @@
1
1
  # praxis-mapper changelog
2
2
 
3
+ ## next
4
+
5
+ ## 4.1
6
+
7
+ * Added instrumentation through `ActiveSupport::Notifications`
8
+ * Use the 'praxis.mapper.load' to subscribe to `IdentityMap.load` calls
9
+ * Use the 'praxis.mapper.finalize' to subscribe to `IdentityMap.finalize!` calls
10
+
3
11
  ## 4.0
4
12
 
5
13
  * Optimization on handling repeated ids (especially noticeable when using subloads)
6
14
  * Refactored `ConnectionManager` repository handling to improve integration with other connection-pooling (specifically Sequel's at present).
7
15
  * Added two types of connection factory under `Praxis::Mapper::ConnectionFactories::`:
8
16
  * `Simple`: Takes a `connection:` option to specify the raw object to return for all `checkout`. Also, preserves current behavior with proc-based uses when `ConnectionManager.repository` is given a block. This is the default factory type if one is not specified for the repository.
9
- * `Sequel`: Takes `connection:` option to specify a `Sequel::Database`, or hash of options to pass to `Sequel.connect`.
17
+ * `Sequel`: Takes `connection:` option to specify a `Sequel::Database`, or hash of options to pass to `Sequel.connect`.
10
18
  * `IdentityMap#finalize!` now calls `ConnectionManager#release` to ensure any connections are returned to their respective pools, if applicable.
11
- * Added `SequelCompat` module, which provides support for using `Sequel::Model` objects with an `IdentityMap` when included in model class.
19
+ * Added `SequelCompat` module, which provides support for using `Sequel::Model` objects with an `IdentityMap` when included in model class.
12
20
  * This overrides the association accessors on instances associated with an `IdentityMap` (see below for more on this) to query the map instead of database.
13
21
  * See (spec/support/spec_sequel_models.rb) for example definition.
14
22
  * Added prototype for write-path support to `IdentityMap` (for `Sequel::Model` models):
@@ -18,7 +26,7 @@
18
26
  * with no argument, or nil, given it saves all modified records in the identity map.
19
27
  * with an instance of a model, it saves just that record.
20
28
  * with a model class, it saves all modified records for that class in the identity map.
21
- * `IdentityMap#remove`: calls `detatch` with the record, and then calls`record.delete` to delete it.
29
+ * `IdentityMap#remove`: calls `detatch` with the record, and then calls`record.delete` to delete it.
22
30
 
23
31
 
24
32
  ## 3.4.0
@@ -127,16 +127,18 @@ module Praxis::Mapper
127
127
  return finalize_model!(model, query)
128
128
  end
129
129
 
130
- records = query.execute
131
- im_records = add_records(records)
130
+ ActiveSupport::Notifications.instrument 'praxis.mapper.load', model: model do
131
+ records = query.execute
132
+ im_records = add_records(records)
132
133
 
133
- # TODO: refactor this to better-hide queries?
134
- query.freeze
135
- self.queries[model].add(query)
134
+ # TODO: refactor this to better-hide queries?
135
+ query.freeze
136
+ queries[model].add(query)
136
137
 
137
- subload(model, query,records)
138
+ subload(model, query, records)
138
139
 
139
- im_records
140
+ im_records
141
+ end
140
142
  end
141
143
 
142
144
  def stage_for!(spec, records)
@@ -183,17 +185,25 @@ module Praxis::Mapper
183
185
  end
184
186
  end
185
187
 
186
- def finalize!(*models)
187
- if models.empty?
188
- models = @staged.keys
188
+ def finalize!(*models, instrument: true)
189
+ if instrument
190
+ ActiveSupport::Notifications.instrument 'praxis.mapper.finalize' do
191
+ _finalize!(*models)
192
+ end
193
+ else
194
+ _finalize!(*models)
189
195
  end
196
+ end
197
+
198
+ def _finalize!(*models)
199
+ models = @staged.keys if models.empty?
190
200
 
191
201
  did_something = models.any? do |model|
192
202
  finalize_model!(model).any?
193
203
  end
194
204
 
195
205
  if did_something
196
- finalize!
206
+ _finalize!
197
207
  else
198
208
  release
199
209
  end
@@ -205,19 +215,18 @@ module Praxis::Mapper
205
215
 
206
216
  # don't doc. never ever use yourself!
207
217
  # FIXME: make private and fix specs that break?
208
- def finalize_model!(model, query=nil)
218
+ def finalize_model!(model, query = nil)
209
219
  staged_queries = @staged[model].delete(:_queries) || []
210
220
  staged_keys = @staged[model].keys
211
- identities = staged_keys && model.identities
212
221
  non_identities = staged_keys - model.identities
213
222
 
214
223
  results = Set.new
215
224
 
216
- return results if @staged[model].all? { |(key,values)| values.empty? }
225
+ return results if @staged[model].all? { |(_key, values)| values.empty? }
217
226
 
218
227
  if query.nil?
219
228
  query_class = @connection_manager.repository(model.repository_name)[:query]
220
- query = query_class.new(self,model)
229
+ query = query_class.new(self, model)
221
230
  end
222
231
 
223
232
  # Apply any relevant blocks passed to track in the original queries
@@ -1,5 +1,5 @@
1
1
  module Praxis
2
2
  module Mapper
3
- VERSION = "4.0"
3
+ VERSION = "4.1"
4
4
  end
5
5
  end
@@ -104,6 +104,9 @@ describe Praxis::Mapper::IdentityMap do
104
104
  it 'builds a query, executes, freezes it, and returns the query results' do
105
105
  Praxis::Mapper::Support::MemoryQuery.any_instance.should_receive(:execute).and_return(records)
106
106
  Praxis::Mapper::Support::MemoryQuery.any_instance.should_receive(:freeze)
107
+ ActiveSupport::Notifications.should_receive(:instrument).
108
+ with('praxis.mapper.load', {model: model}).
109
+ and_call_original
107
110
  identity_map.load(model, &query_proc).should === records
108
111
  end
109
112
 
@@ -141,7 +144,7 @@ describe Praxis::Mapper::IdentityMap do
141
144
  identity_map.should_receive(:finalize_model!) do |model, query|
142
145
  model.should be(AddressModel)
143
146
  query.where.should be(nil)
144
- query.track.should eq(Set.new([:foobar]))
147
+ query.track.should eq(Set.new([:foobar]))
145
148
  end
146
149
  end
147
150
  end
@@ -283,7 +286,25 @@ describe Praxis::Mapper::IdentityMap do
283
286
  end
284
287
  end
285
288
 
289
+ context '#finalize!' do
290
+ let(:stage) { {:id => [1,2] } }
291
+ before do
292
+ identity_map.stage(PersonModel, stage)
293
+ end
294
+
295
+ it 'sends the correct ActiveSupport::Notification' do
296
+ ActiveSupport::Notifications.should_receive(:instrument).
297
+ with('praxis.mapper.finalize').
298
+ and_call_original
299
+ identity_map.finalize!
300
+ end
286
301
 
302
+ it 'does not send ActiveSupport::Notification if instrument: false is passed' do
303
+ ActiveSupport::Notifications.should_not_receive(:instrument)
304
+ identity_map.finalize!(instrument: false)
305
+ end
306
+
307
+ end
287
308
 
288
309
  context "#finalize_model!" do
289
310
  let(:record_query) { nil }
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: praxis-mapper
3
3
  version: !ruby/object:Gem::Version
4
- version: '4.0'
4
+ version: '4.1'
5
5
  platform: ruby
6
6
  authors:
7
7
  - Josep M. Blanquer
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2015-06-22 00:00:00.000000000 Z
12
+ date: 2015-09-18 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: randexp
@@ -316,7 +316,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
316
316
  version: '0'
317
317
  requirements: []
318
318
  rubyforge_project:
319
- rubygems_version: 2.2.2
319
+ rubygems_version: 2.4.5.1
320
320
  signing_key:
321
321
  specification_version: 4
322
322
  summary: A multi-datastore library designed for efficiency in loading large datasets.