couch_potato 1.19.0 → 1.19.2
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 +4 -4
- data/CHANGES.md +8 -0
- data/lib/couch_potato/version.rb +1 -1
- data/lib/couch_potato/view/view_query.rb +31 -17
- data/spec/single_design_document_spec.rb +12 -0
- data/spec/unit/view_query_spec.rb +25 -1
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 3e1d161e4bd65577a3de846d945bc5787dbdacdec35c7e38f3129e8108cfa5a3
|
4
|
+
data.tar.gz: 967bcb265ed7886130a9fa79acb51a2f4420ec16e45ac7373d1b39a4895951c0
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: f5b282eda9e2c8bcaf1ad191cd5f5f867dfc2ef406a6db2f079a5882b198149ef416e07ef3a3fd5ed7c82bbd5ddb9f82243cce16509dce0f8b7d7fa8d9e1768a
|
7
|
+
data.tar.gz: 713b759678703c0bbdf935e17405dd07f62f0b1e2d92a1afed81bde89620c16514320088887f275af8fcfc9114684f754687ed5306b1f8a52ca1bca3888c2407
|
data/CHANGES.md
CHANGED
@@ -1,5 +1,13 @@
|
|
1
1
|
## Changes
|
2
2
|
|
3
|
+
# 1.19.2
|
4
|
+
|
5
|
+
- fix 404/409 error when querying single design doc with `digest_view_names` enabled
|
6
|
+
|
7
|
+
# 1.19.1
|
8
|
+
|
9
|
+
- add digest to design doc name if `single_design_document` and `digest_view_names` are enabled
|
10
|
+
|
3
11
|
# 1.19.0 / rspec-matchers 4.2.0
|
4
12
|
|
5
13
|
- add `single_design_document` config option
|
data/lib/couch_potato/version.rb
CHANGED
@@ -25,6 +25,8 @@ module CouchPotato
|
|
25
25
|
# only after clearing the cache design docs will be updated/re-created.
|
26
26
|
def self.clear_cache
|
27
27
|
__updated_views.clear
|
28
|
+
@all_views = nil
|
29
|
+
@all_views_digest = nil
|
28
30
|
end
|
29
31
|
|
30
32
|
def self.__updated_views
|
@@ -32,50 +34,62 @@ module CouchPotato
|
|
32
34
|
@updated_views
|
33
35
|
end
|
34
36
|
|
37
|
+
def self.all_views
|
38
|
+
@all_views ||= CouchPotato.views.flat_map do |klass|
|
39
|
+
specs = klass.views.map { |view_name, view| klass.execute_view(view_name, {}) }
|
40
|
+
specs.map do |klass_spec|
|
41
|
+
{ klass_spec.view_name => view_functions(klass_spec.map_function, klass_spec.reduce_function) }
|
42
|
+
end
|
43
|
+
end.inject(&:merge)
|
44
|
+
end
|
45
|
+
|
46
|
+
def self.all_views_digest
|
47
|
+
@all_views_digest ||= Digest::SHA256.hexdigest(all_views.to_json)
|
48
|
+
end
|
49
|
+
|
35
50
|
private
|
36
51
|
|
37
52
|
def update_view
|
38
|
-
design_doc = @database.get "_design/#{
|
53
|
+
design_doc = @database.get "_design/#{design_document_name}" rescue nil
|
39
54
|
original_views = design_doc && design_doc['views'].dup
|
40
55
|
view_updated
|
41
56
|
design_doc ||= empty_design_document
|
42
57
|
if CouchPotato::Config.single_design_document
|
43
|
-
design_doc['views'] = all_views
|
58
|
+
design_doc['views'] = self.class.all_views
|
44
59
|
else
|
45
|
-
design_doc['views'][@view_name.to_s] = view_functions
|
60
|
+
design_doc['views'][@view_name.to_s] = self.class.view_functions(@map_function, @reduce_function)
|
46
61
|
end
|
47
62
|
if original_views != design_doc['views']
|
48
63
|
@database.save_doc(design_doc)
|
49
64
|
end
|
50
65
|
end
|
51
66
|
|
52
|
-
def
|
53
|
-
CouchPotato.views.flat_map do |klass|
|
54
|
-
specs = klass.views.map { |view_name, view| klass.execute_view(view_name, {}) }
|
55
|
-
specs.map do |klass_spec|
|
56
|
-
{ klass_spec.view_name => view_functions(klass_spec.map_function, klass_spec.reduce_function) }
|
57
|
-
end
|
58
|
-
end.inject(&:merge)
|
59
|
-
end
|
60
|
-
|
61
|
-
def view_functions(map_function = @map_function, reduce_function = @reduce_function)
|
67
|
+
def self.view_functions(map_function, reduce_function)
|
62
68
|
{'map' => map_function, 'reduce' => reduce_function}.compact
|
63
69
|
end
|
64
70
|
|
65
71
|
def empty_design_document
|
66
|
-
{'views' => {}, "_id" => "_design/#{
|
72
|
+
{'views' => {}, "_id" => "_design/#{design_document_name}", "language" => @language.to_s}
|
73
|
+
end
|
74
|
+
|
75
|
+
def design_document_name
|
76
|
+
name = @design_document_name
|
77
|
+
if CouchPotato::Config.digest_view_names && CouchPotato::Config.single_design_document
|
78
|
+
name += "-#{self.class.all_views_digest}"
|
79
|
+
end
|
80
|
+
name
|
67
81
|
end
|
68
82
|
|
69
83
|
def view_has_been_updated?
|
70
84
|
if CouchPotato::Config.single_design_document
|
71
85
|
updated_views.any?
|
72
86
|
else
|
73
|
-
updated_views[[
|
87
|
+
updated_views[[design_document_name, @view_name]]
|
74
88
|
end
|
75
89
|
end
|
76
90
|
|
77
91
|
def view_updated
|
78
|
-
updated_views[[
|
92
|
+
updated_views[[design_document_name, @view_name]] = true
|
79
93
|
end
|
80
94
|
|
81
95
|
def updated_views
|
@@ -87,7 +101,7 @@ module CouchPotato
|
|
87
101
|
end
|
88
102
|
|
89
103
|
def view_url
|
90
|
-
"#{
|
104
|
+
"#{design_document_name}/#{@view_name}"
|
91
105
|
end
|
92
106
|
end
|
93
107
|
end
|
@@ -30,10 +30,13 @@ describe 'single design document' do
|
|
30
30
|
recreate_db
|
31
31
|
CouchPotato::Config.single_design_document = true
|
32
32
|
CouchPotato.views.select! { |v| [Thing1, Thing2, Thing3].include?(v) } # clear classes from other specs
|
33
|
+
CouchPotato::View::ViewQuery.clear_cache
|
33
34
|
end
|
34
35
|
|
35
36
|
after(:each) do
|
36
37
|
CouchPotato::Config.single_design_document = false
|
38
|
+
CouchPotato::Config.digest_view_names = false
|
39
|
+
CouchPotato::View::ViewQuery.clear_cache
|
37
40
|
end
|
38
41
|
|
39
42
|
it 'creates a single design document for all views' do
|
@@ -60,4 +63,13 @@ describe 'single design document' do
|
|
60
63
|
expect(db.view(Thing2.all('n2'))).to eq([thing2])
|
61
64
|
expect(db.view(Thing3.by_tag('tag1'))).to eq([thing3])
|
62
65
|
end
|
66
|
+
|
67
|
+
it 'queries the single design doc with digest_view_names enabled' do
|
68
|
+
CouchPotato::Config.digest_view_names = true
|
69
|
+
|
70
|
+
thing1 = Thing1.new title: 't1'
|
71
|
+
db.save! thing1
|
72
|
+
|
73
|
+
expect(db.view(Thing1.all)).to(eq([thing1]))
|
74
|
+
end
|
63
75
|
end
|
@@ -8,6 +8,11 @@ describe CouchPotato::View::ViewQuery, 'query_view!' do
|
|
8
8
|
CouchPotato::View::ViewQuery.clear_cache
|
9
9
|
end
|
10
10
|
|
11
|
+
after(:each) do
|
12
|
+
CouchPotato::Config.single_design_document = false
|
13
|
+
CouchPotato::Config.digest_view_names = false
|
14
|
+
end
|
15
|
+
|
11
16
|
it 'does not pass a key if conditions are empty' do
|
12
17
|
expect(db).to receive(:view).with(anything, {})
|
13
18
|
CouchPotato::View::ViewQuery.new(db, '', {:view0 => {}}).query_view!
|
@@ -81,4 +86,23 @@ describe CouchPotato::View::ViewQuery, 'query_view!' do
|
|
81
86
|
expect(db).to receive(:save_doc)
|
82
87
|
CouchPotato::View::ViewQuery.new(db, 'design', :view8 => {:map => '<map_code>', :reduce => '<new reduce_code>'}).query_view!
|
83
88
|
end
|
84
|
-
|
89
|
+
|
90
|
+
it 'adds a digest of all views to the design document if single_design_doc is true' do
|
91
|
+
CouchPotato::Config.single_design_document = true
|
92
|
+
CouchPotato::Config.digest_view_names = true
|
93
|
+
|
94
|
+
allow(db).to receive(:get).and_return(nil)
|
95
|
+
allow(db).to receive(:save_doc).and_return(true)
|
96
|
+
view_class = double('view_class',
|
97
|
+
views: {view: {map: '<map_code>'}},
|
98
|
+
execute_view: double('view_spec', view_name: 'view', map_function: '<map_code>', reduce_function: nil))
|
99
|
+
allow(CouchPotato).to receive(:views).and_return([view_class])
|
100
|
+
|
101
|
+
CouchPotato::View::ViewQuery.new(
|
102
|
+
db,
|
103
|
+
'couch_potato',
|
104
|
+
{:view => {:map => '<map_code>'}}).query_view!
|
105
|
+
|
106
|
+
expect(db).to have_received(:save_doc).with(hash_including({"_id" => "_design/couch_potato-56d286b4f0cd3a50fdd2ad428034d08a6483311539f7e138c45e781611b9dbbc"}))
|
107
|
+
end
|
108
|
+
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.19.
|
4
|
+
version: 1.19.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Alexander Lang
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2025-06-
|
11
|
+
date: 2025-06-08 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: activemodel
|