couch_potato 1.10.1 → 1.12.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.github/workflows/ruby.yml +3 -10
- data/CHANGES.md +9 -0
- data/gemfiles/active_support_6_0 +2 -1
- data/gemfiles/active_support_6_1 +2 -1
- data/gemfiles/active_support_7_0 +2 -1
- data/lib/couch_potato/database.rb +45 -23
- data/lib/couch_potato/railtie.rb +4 -1
- data/lib/couch_potato/version.rb +1 -1
- data/spec/unit/database_spec.rb +28 -9
- data/spec/views_spec.rb +11 -0
- metadata +3 -6
- data/gemfiles/active_support_5_0 +0 -6
- data/gemfiles/active_support_5_1 +0 -7
- data/gemfiles/active_support_5_2 +0 -6
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 5a7bdcd820492f1ac93c757f8438d2659610ed06dc8b6dd2dcb62d6bcfa8434f
|
4
|
+
data.tar.gz: 4d3d52005c4d7647291d35f1437c7be05326526f71ab3232d46556f398b2d0fe
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: ac20227b8dfb0288d09e70dc515e90f0625660606ab130b0d0b8433591a2fd3247030b88c6137e60f20cf9e87862fa683276143ddfee3c8f7016e42deb69ea9d
|
7
|
+
data.tar.gz: 4c57160eb81d99070ee30bcb53723ece6de752af76b97ea7349f1bd0a5266bdd27f50b71461203d9b57799891a5f933333689a18a53e0badc1d304957d70337b
|
data/.github/workflows/ruby.yml
CHANGED
@@ -16,11 +16,8 @@ jobs:
|
|
16
16
|
strategy:
|
17
17
|
fail-fast: false
|
18
18
|
matrix:
|
19
|
-
ruby: [2.7,
|
19
|
+
ruby: [2.7, "3.0", "3.1", "jruby"]
|
20
20
|
gemfile:
|
21
|
-
- "active_support_5_0"
|
22
|
-
- "active_support_5_1"
|
23
|
-
- "active_support_5_2"
|
24
21
|
- "active_support_6_0"
|
25
22
|
- "active_support_6_1"
|
26
23
|
- "active_support_7_0"
|
@@ -28,12 +25,8 @@ jobs:
|
|
28
25
|
- ruby: "jruby"
|
29
26
|
gemfile: "active_support_7_0"
|
30
27
|
- ruby: "3.0"
|
31
|
-
gemfile: "
|
32
|
-
- ruby: "3.
|
33
|
-
gemfile: "active_support_5_1"
|
34
|
-
- ruby: "3.0"
|
35
|
-
gemfile: "active_support_5_2"
|
36
|
-
- ruby: "3.0"
|
28
|
+
gemfile: "active_support_6_0"
|
29
|
+
- ruby: "3.1"
|
37
30
|
gemfile: "active_support_6_0"
|
38
31
|
steps:
|
39
32
|
- uses: actions/checkout@v2
|
data/CHANGES.md
CHANGED
@@ -1,5 +1,14 @@
|
|
1
1
|
## Changes
|
2
2
|
|
3
|
+
# 1.12.0
|
4
|
+
|
5
|
+
- remove active_support 5.x
|
6
|
+
- add Ruby 3.1 support (active_support 6.1, 7.0)
|
7
|
+
|
8
|
+
# 1.11.0
|
9
|
+
|
10
|
+
- improve view_in_batches performance by switching to using startkey_docid over skip
|
11
|
+
|
3
12
|
### 1.10.1
|
4
13
|
|
5
14
|
- support passing an empty array to CouchPotato::Database#load
|
data/gemfiles/active_support_6_0
CHANGED
data/gemfiles/active_support_6_1
CHANGED
data/gemfiles/active_support_7_0
CHANGED
@@ -65,12 +65,27 @@ module CouchPotato
|
|
65
65
|
# to a given block in batches of the given size, making multiple
|
66
66
|
# requests with according skip/limit params sent to CouchDB.
|
67
67
|
def view_in_batches(spec, batch_size: default_batch_size)
|
68
|
+
rows = nil
|
68
69
|
batch = 0
|
69
70
|
loop do
|
70
|
-
spec.view_parameters = spec
|
71
|
-
|
72
|
-
|
73
|
-
|
71
|
+
spec.view_parameters = spec
|
72
|
+
.view_parameters
|
73
|
+
.merge({limit: batch_size})
|
74
|
+
.merge(
|
75
|
+
if rows
|
76
|
+
{
|
77
|
+
startkey: rows&.last&.dig('key'),
|
78
|
+
startkey_docid: rows&.last&.dig('id'),
|
79
|
+
skip: 1
|
80
|
+
}
|
81
|
+
else
|
82
|
+
{}
|
83
|
+
end
|
84
|
+
)
|
85
|
+
result = raw_view(spec)
|
86
|
+
rows = result['rows']
|
87
|
+
yield process_view_results(result, spec)
|
88
|
+
break if rows.size < batch_size
|
74
89
|
|
75
90
|
batch += 1
|
76
91
|
end
|
@@ -198,27 +213,34 @@ module CouchPotato
|
|
198
213
|
|
199
214
|
def view_without_caching(spec)
|
200
215
|
ActiveSupport::Notifications.instrument('couch_potato.view', name: "#{spec.design_document}/#{spec.view_name}") do
|
201
|
-
|
202
|
-
|
203
|
-
|
204
|
-
|
205
|
-
|
206
|
-
|
207
|
-
|
208
|
-
|
209
|
-
|
210
|
-
|
211
|
-
|
212
|
-
processed_results = spec.process_results results
|
213
|
-
if processed_results.respond_to?(:database=)
|
214
|
-
processed_results.database = self
|
215
|
-
elsif processed_results.respond_to?(:each)
|
216
|
-
processed_results.each do |document|
|
217
|
-
document.database = self if document.respond_to?(:database=)
|
218
|
-
end
|
216
|
+
process_view_results(raw_view(spec), spec)
|
217
|
+
end
|
218
|
+
end
|
219
|
+
|
220
|
+
def process_view_results(results, spec)
|
221
|
+
processed_results = spec.process_results results
|
222
|
+
if processed_results.respond_to?(:database=)
|
223
|
+
processed_results.database = self
|
224
|
+
elsif processed_results.respond_to?(:each)
|
225
|
+
processed_results.each do |document|
|
226
|
+
document.database = self if document.respond_to?(:database=)
|
219
227
|
end
|
220
|
-
processed_results
|
221
228
|
end
|
229
|
+
processed_results
|
230
|
+
end
|
231
|
+
|
232
|
+
def raw_view(spec)
|
233
|
+
CouchPotato::View::ViewQuery.new(
|
234
|
+
couchrest_database,
|
235
|
+
spec.design_document,
|
236
|
+
{ spec.view_name => {
|
237
|
+
map: spec.map_function,
|
238
|
+
reduce: spec.reduce_function
|
239
|
+
} },
|
240
|
+
({ spec.list_name => spec.list_function } unless spec.list_name.nil?),
|
241
|
+
spec.lib,
|
242
|
+
spec.language
|
243
|
+
).query_view!(spec.view_parameters)
|
222
244
|
end
|
223
245
|
|
224
246
|
def load_document_without_caching(id)
|
data/lib/couch_potato/railtie.rb
CHANGED
@@ -8,7 +8,10 @@ module CouchPotato
|
|
8
8
|
path = Rails.root.join('config/couchdb.yml')
|
9
9
|
if File.exist?(path)
|
10
10
|
require 'yaml'
|
11
|
-
config = YAML.safe_load(
|
11
|
+
config = YAML.safe_load(
|
12
|
+
ERB.new(File.read(path)).result,
|
13
|
+
permitted_classes: [Symbol],
|
14
|
+
)[Rails.env]
|
12
15
|
CouchPotato.configure(config)
|
13
16
|
else
|
14
17
|
Rails.logger.warn 'Rails.root/config/couchdb.yml does not exist. Not configuring a database.'
|
data/lib/couch_potato/version.rb
CHANGED
data/spec/unit/database_spec.rb
CHANGED
@@ -430,11 +430,11 @@ describe CouchPotato::Database, '#view_in_batches' do
|
|
430
430
|
let(:view_query) do
|
431
431
|
instance_double(
|
432
432
|
CouchPotato::View::ViewQuery,
|
433
|
-
query_view!: { 'rows' => [
|
433
|
+
query_view!: { 'rows' => [] }
|
434
434
|
)
|
435
435
|
end
|
436
|
-
let(:
|
437
|
-
let(:spec) { double('view spec', process_results:
|
436
|
+
let(:processed_result) { double(:processed_result) }
|
437
|
+
let(:spec) { double('view spec', process_results: processed_result).as_null_object }
|
438
438
|
let(:couchrest_db) { double('couchrest db').as_null_object }
|
439
439
|
let(:db) { CouchPotato::Database.new(couchrest_db) }
|
440
440
|
|
@@ -443,22 +443,41 @@ describe CouchPotato::Database, '#view_in_batches' do
|
|
443
443
|
.to receive_messages(new: view_query)
|
444
444
|
end
|
445
445
|
|
446
|
-
it 'sets skip/
|
447
|
-
allow(spec).to receive(:process_results).and_return([result, result], [result]) # run twice
|
446
|
+
it 'sets no skip/startkey/startkey_docid for the first batch' do
|
448
447
|
allow(spec).to receive(:view_parameters) { { key: 'x' } }
|
449
448
|
|
450
449
|
expect(spec).to receive(:view_parameters=)
|
451
|
-
.with({key: 'x',
|
450
|
+
.with({key: 'x', limit: 2})
|
451
|
+
|
452
|
+
db.view_in_batches(spec, batch_size: 2) { |results| }
|
453
|
+
end
|
454
|
+
|
455
|
+
it 'sets skip/startkey/startkey_docid for each other batch' do
|
456
|
+
allow(spec).to receive(:view_parameters) { { key: 'x' } }
|
457
|
+
allow(view_query).to receive(:query_view!)
|
458
|
+
.and_return({'rows' => [{}, {'key' => 'k1', 'id' => 'id1'}]}, {'rows' => [{}]})
|
459
|
+
allow(spec).to receive(:view_parameters=)
|
460
|
+
|
452
461
|
expect(spec).to receive(:view_parameters=)
|
453
|
-
.with({key: 'x',
|
462
|
+
.with({key: 'x', limit: 2, startkey: 'k1', startkey_docid: 'id1', skip: 1})
|
454
463
|
|
455
464
|
db.view_in_batches(spec, batch_size: 2) { |results| }
|
456
465
|
end
|
457
466
|
|
467
|
+
it 'yields processed results to the block' do
|
468
|
+
allow(view_query).to receive(:query_view!)
|
469
|
+
.and_return({'rows' => [{'key' => 'k1', 'id' => 'id1'}]})
|
470
|
+
allow(spec).to receive(:view_parameters=)
|
471
|
+
|
472
|
+
expect { |x| db.view_in_batches(spec, batch_size: 2, &x) }.to yield_with_args(processed_result)
|
473
|
+
end
|
474
|
+
|
458
475
|
it 'yields batches until running out of data' do
|
459
|
-
allow(
|
476
|
+
allow(view_query).to receive(:query_view!)
|
477
|
+
.and_return({'rows' => [{}, {}]}, {'rows' => [{}]})
|
478
|
+
allow(spec).to receive(:process_results).and_return([processed_result, processed_result], [processed_result])
|
460
479
|
|
461
|
-
expect { |b| db.view_in_batches(spec, batch_size: 2, &b) }.to yield_successive_args([
|
480
|
+
expect { |b| db.view_in_batches(spec, batch_size: 2, &b) }.to yield_successive_args([processed_result, processed_result], [processed_result])
|
462
481
|
end
|
463
482
|
end
|
464
483
|
|
data/spec/views_spec.rb
CHANGED
@@ -405,4 +405,15 @@ describe 'views' do
|
|
405
405
|
expect(@db.view(Build.timeline(stale: 'ok'))).to be_empty
|
406
406
|
end
|
407
407
|
end
|
408
|
+
|
409
|
+
describe 'view_in_batches' do
|
410
|
+
it 'yields docs in batches until all gone' do
|
411
|
+
build1 = Build.new(time: 1).tap {|b| @db.save!(b) }
|
412
|
+
build2 = Build.new(time: 2).tap {|b| @db.save!(b) }
|
413
|
+
build3 = Build.new(time: 3).tap {|b| @db.save!(b) }
|
414
|
+
|
415
|
+
expect {|block| @db.view_in_batches(Build.timeline, batch_size: 2, &block)}
|
416
|
+
.to yield_successive_args([build1, build2], [build3])
|
417
|
+
end
|
418
|
+
end
|
408
419
|
end
|
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.
|
4
|
+
version: 1.12.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: 2022-
|
11
|
+
date: 2022-10-31 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: activemodel
|
@@ -130,9 +130,6 @@ files:
|
|
130
130
|
- Rakefile
|
131
131
|
- couch_potato-rspec.gemspec
|
132
132
|
- couch_potato.gemspec
|
133
|
-
- gemfiles/active_support_5_0
|
134
|
-
- gemfiles/active_support_5_1
|
135
|
-
- gemfiles/active_support_5_2
|
136
133
|
- gemfiles/active_support_6_0
|
137
134
|
- gemfiles/active_support_6_1
|
138
135
|
- gemfiles/active_support_7_0
|
@@ -234,7 +231,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
234
231
|
- !ruby/object:Gem::Version
|
235
232
|
version: '0'
|
236
233
|
requirements: []
|
237
|
-
rubygems_version: 3.
|
234
|
+
rubygems_version: 3.3.3
|
238
235
|
signing_key:
|
239
236
|
specification_version: 4
|
240
237
|
summary: Ruby persistence layer for CouchDB
|
data/gemfiles/active_support_5_0
DELETED
data/gemfiles/active_support_5_1
DELETED