couch_potato 1.15.0 → 1.16.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: ffcaae6b2815d237b48cc3e4ad553f66920fe4df2c84c59ae38177260949ba6b
4
- data.tar.gz: bd266a1033fa83fcba822a19e3de86b2c1aac2d80ba2dd1d3aef0920d4819d8f
3
+ metadata.gz: 3fd11db6b5bb37ef9b0d12115ae4586f8f0ec8afff586e7a2b381e1839af0196
4
+ data.tar.gz: 7f03e40ec9297bb669f28559e251b72f5b8e849010b8861d992c75c5ed7737a3
5
5
  SHA512:
6
- metadata.gz: 16f3e1748e3b3314f1cf3d658fb175dd90c5e7c7cd717ab42477961c364bac527b262642a29f208c4aad200e9a31ce7470c0a538db8bf8d641e13da92f85debb
7
- data.tar.gz: '089f1c9e5dc7238b659a4d1b2d0f3d341a084fe52f6d9c2d058ea8440f197f7d64b6f5a9d78c8cebbd19b131aede038329ab6c0f79b503d220f1f20d2e7d8a20'
6
+ metadata.gz: 72bc1831a2b773d3f64682f1fbe20fb10acccad204fd057e92676c53fe03f5f56b462c02905b3f3ee52ddb6fa640f6dfe6a05a3f1e1aeb8e750eaecb76922a38
7
+ data.tar.gz: 4a49349375cabe65b465c99336e3c0b05564d0b720faa6ae4d956633809ea52d6a73119118c7bc923d0ffde0aefd5af93f3fbdc587fed89696942b05ce421025
data/CHANGES.md CHANGED
@@ -1,5 +1,10 @@
1
1
  ## Changes
2
2
 
3
+ # 1.16.0
4
+
5
+ - add payload to ActiveSupport instrumentation calls
6
+ - only notify load.cached when there are cached documents
7
+
3
8
  # 1.15.0
4
9
 
5
10
  - cache loading multiple documents
@@ -150,7 +150,7 @@ module CouchPotato
150
150
  cached = cache && cache[id]
151
151
  if cache
152
152
  if cached
153
- ActiveSupport::Notifications.instrument('couch_potato.load.cached') do
153
+ ActiveSupport::Notifications.instrument('couch_potato.load.cached', id: id, doc: cached) do
154
154
  cached
155
155
  end
156
156
  else
@@ -168,15 +168,18 @@ module CouchPotato
168
168
 
169
169
  uncached_ids = ids - (cache&.keys || [])
170
170
  uncached_docs_by_id = bulk_load(uncached_ids).index_by {|doc| doc.id if doc.respond_to?(:id) }
171
+ cached_docs_by_id = cache&.slice(*ids) || {}
172
+ if cached_docs_by_id.any?
173
+ ActiveSupport::Notifications.instrument('couch_potato.load.cached', ids: cached_docs_by_id.keys, docs: cached_docs_by_id.values) do
174
+ cached_docs_by_id
175
+ end
176
+ end
171
177
  if cache
172
178
  uncached_ids.each do |id|
173
179
  doc = uncached_docs_by_id[id]
174
180
  cache[id] = doc if doc
175
181
  end
176
182
  end
177
- cached_docs_by_id = ActiveSupport::Notifications.instrument('couch_potato.load.cached') do
178
- cache&.slice(*ids) || {}
179
- end
180
183
  ids.filter_map { |id| (cached_docs_by_id[id]) || uncached_docs_by_id[id] }
181
184
  end
182
185
 
@@ -278,9 +281,11 @@ module CouchPotato
278
281
  def load_document_without_caching(id)
279
282
  raise "Can't load a document without an id (got nil)" if id.nil?
280
283
 
281
- ActiveSupport::Notifications.instrument('couch_potato.load') do
284
+ payload = {id: id}
285
+ ActiveSupport::Notifications.instrument('couch_potato.load', payload) do
282
286
  instance = couchrest_database.get(id)
283
287
  instance.database = self if instance
288
+ payload[:doc] = instance
284
289
  instance
285
290
  end
286
291
  end
@@ -321,9 +326,11 @@ module CouchPotato
321
326
  def bulk_load(ids)
322
327
  return [] if ids.empty?
323
328
 
324
- ActiveSupport::Notifications.instrument('couch_potato.load') do
329
+ payload = {ids: ids}
330
+ ActiveSupport::Notifications.instrument('couch_potato.load', payload) do
325
331
  response = couchrest_database.bulk_load ids
326
- docs = response['rows'].map { |row| row['doc'] }.compact
332
+ docs = response["rows"].map { |row| row["doc"] }.compact
333
+ payload[:docs] = docs
327
334
  docs.each do |doc|
328
335
  doc.database = self if doc.respond_to?(:database=)
329
336
  doc.database_collection = docs if doc.respond_to?(:database_collection=)
@@ -1,12 +1,16 @@
1
1
  module CouchPotato
2
- module GhostAttributes #:nodoc:
3
- def method_missing(name, *args)
4
- if(value = _document && _document[name.to_s])
2
+ module GhostAttributes # :nodoc:
3
+ def method_missing(name, *)
4
+ if (value = _document && _document[name.to_s])
5
5
  value
6
6
  else
7
7
  super
8
8
  end
9
9
  end
10
+
11
+ def respond_to_missing?(name, *)
12
+ _document && _document[name.to_s]
13
+ end
10
14
  end
11
15
  end
12
16
 
@@ -1,4 +1,4 @@
1
1
  module CouchPotato
2
- VERSION = '1.15.0'.freeze
2
+ VERSION = '1.16.0'.freeze
3
3
  RSPEC_VERSION = '4.1.0'.freeze
4
4
  end
@@ -18,6 +18,10 @@ RSpec.describe 'database caching' do
18
18
  {}
19
19
  end
20
20
 
21
+ after(:each) do
22
+ ActiveSupport::Notifications.unsubscribe(@subscriber) if @subscriber
23
+ end
24
+
21
25
  context 'for a single document' do
22
26
  it 'gets an object from the cache the 2nd time via #load_documemt' do
23
27
  expect(couchrest_db).to receive(:get).with('1').exactly(1).times
@@ -47,6 +51,29 @@ RSpec.describe 'database caching' do
47
51
  db.load_document '1'
48
52
  expect(db.load_document('1')).to eql(doc)
49
53
  end
54
+
55
+ it 'instruments the load call' do
56
+ doc = double("doc").as_null_object
57
+ allow(couchrest_db).to receive(:get).and_return(doc)
58
+ events = []
59
+ @subscriber = ActiveSupport::Notifications.subscribe(
60
+ 'couch_potato.load.cached'
61
+ ) do |event|
62
+ events << event
63
+ end
64
+
65
+ db.load("1")
66
+ db.load("1")
67
+
68
+ expect(events.size).to eq(1)
69
+ expect(events.first.payload).to eq(
70
+ {
71
+ id: "1",
72
+ doc: doc
73
+ }
74
+ )
75
+
76
+ end
50
77
  end
51
78
 
52
79
  context 'for multiple documents' do
@@ -65,6 +92,31 @@ RSpec.describe 'database caching' do
65
92
  expect(couchrest_db).to have_received(:bulk_load).with(['2']).exactly(1).times
66
93
  end
67
94
 
95
+ it 'instruments the load call' do
96
+ allow(couchrest_db).to receive(:bulk_load).with(['1'])
97
+ .and_return('rows' => [{'doc' => doc1}])
98
+ allow(couchrest_db).to receive(:bulk_load).with(['2'])
99
+ .and_return('rows' => [{'doc' => doc2}])
100
+ events = []
101
+ @subscriber = ActiveSupport::Notifications.subscribe(
102
+ 'couch_potato.load.cached'
103
+ ) do |event|
104
+ events << event
105
+ end
106
+
107
+
108
+ db.load_document(['1'])
109
+ db.load_document(['1', '2'])
110
+
111
+ expect(events.size).to eq(1)
112
+ expect(events.first.payload).to eq(
113
+ {
114
+ ids: ["1"],
115
+ docs: [doc1]
116
+ }
117
+ )
118
+ end
119
+
68
120
  it 'loads nothing if all documents are cached' do
69
121
  allow(couchrest_db).to receive(:bulk_load).with(['1', '2'])
70
122
  .and_return('rows' => [{'doc' => doc1}, {'doc' => doc2}])
@@ -94,7 +146,7 @@ RSpec.describe 'database caching' do
94
146
  'id' => '2',
95
147
  }
96
148
  allow(couchrest_db).to receive(:bulk_load).with(['1', '2'])
97
- .and_return('rows' => [{'doc' => doc1}, {'doc' => doc1}])
149
+ .and_return('rows' => [{'doc' => doc1}, {'doc' => doc2}])
98
150
 
99
151
  db.load_document(['1', '2'])
100
152
  db.load_document(['1', '2'])
@@ -42,6 +42,11 @@ describe CouchPotato::Database, 'load' do
42
42
  let(:couchrest_db) { double('couchrest db', info: nil).as_null_object }
43
43
  let(:db) { CouchPotato::Database.new couchrest_db }
44
44
 
45
+
46
+ after(:each) do
47
+ ActiveSupport::Notifications.unsubscribe(@subscriber) if @subscriber
48
+ end
49
+
45
50
  it 'should raise an exception if nil given' do
46
51
  expect do
47
52
  db.load nil
@@ -130,6 +135,46 @@ describe CouchPotato::Database, 'load' do
130
135
  it 'returns an empty array when passing an empty array' do
131
136
  expect(db.load([])).to eq([])
132
137
  end
138
+
139
+ it 'instruments the load call' do
140
+ events = []
141
+ @subscriber = ActiveSupport::Notifications.subscribe(
142
+ 'couch_potato.load'
143
+ ) do |event|
144
+ events << event
145
+ end
146
+
147
+ db.load(["1", "2"])
148
+
149
+ expect(events.size).to eq(1)
150
+ expect(events.first.payload).to eq(
151
+ {
152
+ ids: ["1", "2"],
153
+ docs: [doc1, doc2]
154
+ }
155
+ )
156
+ end
157
+ end
158
+
159
+ it 'instruments the load call' do
160
+ doc = double("doc").as_null_object
161
+ allow(couchrest_db).to receive(:get).and_return(doc)
162
+ events = []
163
+ @subscriber = ActiveSupport::Notifications.subscribe(
164
+ 'couch_potato.load'
165
+ ) do |event|
166
+ events << event
167
+ end
168
+
169
+ db.load("1")
170
+
171
+ expect(events.size).to eq(1)
172
+ expect(events.first.payload).to eq(
173
+ {
174
+ id: "1",
175
+ doc: doc
176
+ }
177
+ )
133
178
  end
134
179
  end
135
180
 
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: couch_potato
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.15.0
4
+ version: 1.16.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Alexander Lang
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2024-03-28 00:00:00.000000000 Z
11
+ date: 2024-04-02 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activemodel