couch_potato 1.15.0 → 1.16.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.
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