couch_potato 1.6.4 → 1.9.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (58) hide show
  1. checksums.yaml +5 -5
  2. data/.github/workflows/ruby.yml +38 -0
  3. data/.gitignore +3 -0
  4. data/CHANGES.md +193 -122
  5. data/Gemfile +4 -0
  6. data/README.md +61 -85
  7. data/Rakefile +11 -10
  8. data/couch_potato-rspec.gemspec +3 -2
  9. data/couch_potato.gemspec +9 -7
  10. data/gemfiles/active_support_5_0 +7 -0
  11. data/gemfiles/active_support_5_1 +7 -0
  12. data/gemfiles/active_support_5_2 +7 -0
  13. data/gemfiles/active_support_6_0 +7 -0
  14. data/gemfiles/active_support_6_1 +7 -0
  15. data/lib/couch_potato/database.rb +168 -71
  16. data/lib/couch_potato/persistence/dirty_attributes.rb +3 -21
  17. data/lib/couch_potato/persistence/magic_timestamps.rb +3 -3
  18. data/lib/couch_potato/persistence/properties.rb +15 -10
  19. data/lib/couch_potato/persistence/revisions.rb +14 -0
  20. data/lib/couch_potato/persistence/simple_property.rb +0 -4
  21. data/lib/couch_potato/persistence/type_caster.rb +11 -6
  22. data/lib/couch_potato/persistence.rb +5 -3
  23. data/lib/couch_potato/railtie.rb +7 -12
  24. data/lib/couch_potato/validation.rb +8 -0
  25. data/lib/couch_potato/version.rb +2 -2
  26. data/lib/couch_potato/view/base_view_spec.rb +8 -32
  27. data/lib/couch_potato/view/custom_views.rb +4 -3
  28. data/lib/couch_potato/view/flex_view_spec.rb +121 -0
  29. data/lib/couch_potato/view/view_parameters.rb +34 -0
  30. data/lib/couch_potato.rb +37 -16
  31. data/spec/callbacks_spec.rb +45 -19
  32. data/spec/conflict_handling_spec.rb +1 -2
  33. data/spec/property_spec.rb +12 -3
  34. data/spec/railtie_spec.rb +17 -1
  35. data/spec/revisions_spec.rb +25 -0
  36. data/spec/spec_helper.rb +4 -3
  37. data/spec/unit/active_model_compliance_spec.rb +7 -3
  38. data/spec/unit/attributes_spec.rb +54 -1
  39. data/spec/unit/caching_spec.rb +105 -0
  40. data/spec/unit/couch_potato_spec.rb +70 -5
  41. data/spec/unit/create_spec.rb +5 -4
  42. data/spec/unit/database_spec.rb +235 -135
  43. data/spec/unit/dirty_attributes_spec.rb +5 -26
  44. data/spec/unit/flex_view_spec_spec.rb +17 -0
  45. data/spec/unit/model_view_spec_spec.rb +1 -1
  46. data/spec/unit/rspec_stub_db_spec.rb +31 -0
  47. data/spec/unit/validation_spec.rb +42 -2
  48. data/spec/views_spec.rb +214 -103
  49. data/vendor/pouchdb-collate/LICENSE +202 -0
  50. data/vendor/pouchdb-collate/pouchdb-collate.js +430 -0
  51. metadata +46 -33
  52. data/.ruby-version +0 -1
  53. data/.travis.yml +0 -20
  54. data/gemfiles/active_support_4_0 +0 -11
  55. data/gemfiles/active_support_4_1 +0 -11
  56. data/gemfiles/active_support_4_2 +0 -11
  57. data/lib/couch_potato/persistence/deep_dirty_attributes.rb +0 -180
  58. data/spec/unit/deep_dirty_attributes_spec.rb +0 -434
@@ -10,7 +10,8 @@ class Plant
10
10
  include CouchPotato::Persistence
11
11
  property :leaf_count
12
12
  property :typed_leaf_count, type: Fixnum
13
- property :typed_leaf_size, type: Float
13
+ property :integer_something, type: Integer
14
+ property :typed_leaf_size, type: Float
14
15
  property :branch, type: Branch
15
16
  end
16
17
 
@@ -40,6 +41,7 @@ describe 'attributes' do
40
41
  plant = Plant.new(leaf_count: 1)
41
42
 
42
43
  expect(plant.attributes).to eq('leaf_count' => 1, 'created_at' => nil,
44
+ 'integer_something' => nil,
43
45
  'updated_at' => nil, 'typed_leaf_count' => nil,
44
46
  'typed_leaf_size' => nil, 'branch' => nil)
45
47
  end
@@ -109,6 +111,57 @@ describe 'attributes' do
109
111
  end
110
112
  end
111
113
 
114
+ describe 'integer' do
115
+ it 'rounds a float to a fixnum' do
116
+ @plant.integer_something = 4.5
117
+
118
+ expect(@plant.integer_something).to eq(5)
119
+ end
120
+
121
+ it 'converts a string into a fixnum' do
122
+ @plant.integer_something = '4'
123
+
124
+ expect(@plant.integer_something).to eq(4)
125
+ end
126
+
127
+ it 'converts a string into a negative fixnum' do
128
+ @plant.integer_something = '-4'
129
+
130
+ expect(@plant.integer_something).to eq(-4)
131
+ end
132
+
133
+ it 'leaves a fixnum as is' do
134
+ @plant.integer_something = 4
135
+
136
+ expect(@plant.integer_something).to eq(4)
137
+ end
138
+
139
+ it 'leaves nil as is' do
140
+ @plant.integer_something = nil
141
+
142
+ expect(@plant.integer_something).to be_nil
143
+ end
144
+
145
+ it 'sets the attributes to zero if a string given' do
146
+ @plant.integer_something = 'x'
147
+
148
+ expect(@plant.integer_something).to eq(0)
149
+ end
150
+
151
+ it 'parses numbers out of a string' do
152
+ @plant.integer_something = 'x123'
153
+
154
+ expect(@plant.integer_something).to eq(123)
155
+ end
156
+
157
+ it 'sets the attributes to nil if given a blank string' do
158
+ @plant.integer_something = ''
159
+
160
+ expect(@plant.integer_something).to be_nil
161
+ end
162
+ end
163
+
164
+
112
165
  describe 'fixnum' do
113
166
  it 'rounds a float to a fixnum' do
114
167
  @plant.typed_leaf_count = 4.5
@@ -0,0 +1,105 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'spec_helper'
4
+
5
+ RSpec.describe 'database caching' do
6
+ let(:couchrest_db) do
7
+ double(:couchrest_db, info: double(:info),
8
+ root: '', get: double.as_null_object)
9
+ end
10
+
11
+ let(:db) do
12
+ CouchPotato::Database.new(couchrest_db).tap do |db|
13
+ db.cache = cache
14
+ end
15
+ end
16
+
17
+ let(:cache) do
18
+ {}
19
+ end
20
+
21
+ it 'gets an object from the cache the 2nd time via #load_documemt' do
22
+ expect(couchrest_db).to receive(:get).with('1').exactly(1).times
23
+
24
+ db.load_document '1'
25
+ db.load_document '1'
26
+ end
27
+
28
+ it 'gets an object from the cache the 2nd time via #load' do
29
+ expect(couchrest_db).to receive(:get).with('1').exactly(1).times
30
+
31
+ db.load '1'
32
+ db.load '1'
33
+ end
34
+
35
+ it 'gets an object from the cache the 2nd time via #load!' do
36
+ expect(couchrest_db).to receive(:get).with('1').exactly(1).times
37
+
38
+ db.load! '1'
39
+ db.load! '1'
40
+ end
41
+
42
+ it 'returns the correct object' do
43
+ doc = double(:doc, 'database=': nil)
44
+ allow(couchrest_db).to receive_messages(get: doc)
45
+
46
+ db.load_document '1'
47
+ expect(db.load_document('1')).to eql(doc)
48
+ end
49
+
50
+ it 'does not cache bulk loads' do
51
+ allow(couchrest_db).to receive_messages(bulk_load: {'rows' => []})
52
+ expect(couchrest_db).to receive(:bulk_load).with(['1']).exactly(2).times
53
+
54
+ db.load_document ['1']
55
+ db.load_document ['1']
56
+ end
57
+
58
+ it 'clears the cache when destroying a document via #destroy_document' do
59
+ expect(couchrest_db).to receive(:get).with('1').exactly(2).times
60
+
61
+ db.load_document '1'
62
+ db.destroy_document double.as_null_object
63
+ db.load_document '1'
64
+ end
65
+
66
+ it 'clears the cache when destroying a document via #destroy' do
67
+ expect(couchrest_db).to receive(:get).with('1').exactly(2).times
68
+
69
+ db.load_document '1'
70
+ db.destroy double.as_null_object
71
+ db.load_document '1'
72
+ end
73
+
74
+ it 'clears the cache when updating a document via #save_document' do
75
+ expect(couchrest_db).to receive(:get).with('1').exactly(2).times
76
+
77
+ db.load_document '1'
78
+ db.save_document double.as_null_object
79
+ db.load_document '1'
80
+ end
81
+
82
+ it 'clears the cache when updating a document via #save_document!' do
83
+ expect(couchrest_db).to receive(:get).with('1').exactly(2).times
84
+
85
+ db.load_document '1'
86
+ db.save_document! double.as_null_object
87
+ db.load_document '1'
88
+ end
89
+
90
+ it 'clears the cache when updating a document via #save' do
91
+ expect(couchrest_db).to receive(:get).with('1').exactly(2).times
92
+
93
+ db.load_document '1'
94
+ db.save double.as_null_object
95
+ db.load_document '1'
96
+ end
97
+
98
+ it 'clears the cache when updating a document via #save!' do
99
+ expect(couchrest_db).to receive(:get).with('1').exactly(2).times
100
+
101
+ db.load_document '1'
102
+ db.save! double.as_null_object
103
+ db.load_document '1'
104
+ end
105
+ end
@@ -1,6 +1,62 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'spec_helper'
2
4
 
3
- describe CouchPotato, 'full_url_to_database' do
5
+ describe CouchPotato, '.configure' do
6
+ after(:example) do
7
+ # reset defaults
8
+ CouchPotato::Config.database_name = nil
9
+ CouchPotato::Config.split_design_documents_per_view = false
10
+ CouchPotato::Config.digest_view_names = false
11
+ CouchPotato::Config.default_language = :javascript
12
+ CouchPotato::Config.database_host = 'http://127.0.0.1:5984'
13
+ CouchPotato::Config.additional_databases = {}
14
+ end
15
+
16
+ it 'sets the database name when config is a string' do
17
+ CouchPotato.configure('testdb')
18
+
19
+ expect(CouchPotato::Config.database_name).to eq('testdb')
20
+ end
21
+
22
+ it 'does not override database_host if not given' do
23
+ CouchPotato.configure(
24
+ database: 'testdb'
25
+ )
26
+
27
+ expect(CouchPotato::Config.database_host).to eq('http://127.0.0.1:5984')
28
+ end
29
+
30
+ it 'sets the given config options' do
31
+ CouchPotato.configure(
32
+ database: 'testdb',
33
+ database_host: 'http://10.0.0.1:2000',
34
+ additional_databases: {
35
+ test2: 'test2_db'
36
+ },
37
+ split_design_documents_per_view: true,
38
+ digest_view_names: true,
39
+ default_language: 'erlang'
40
+ )
41
+
42
+ expect(CouchPotato::Config.database_name).to eq('testdb')
43
+ expect(CouchPotato::Config.split_design_documents_per_view).to eq(true)
44
+ expect(CouchPotato::Config.digest_view_names).to eq(true)
45
+ expect(CouchPotato::Config.default_language).to eq('erlang')
46
+ expect(CouchPotato::Config.database_host).to eq('http://10.0.0.1:2000')
47
+ expect(CouchPotato::Config.additional_databases).to eq('test2' => 'test2_db')
48
+ end
49
+
50
+ it 'works with string keys' do
51
+ CouchPotato.configure(
52
+ 'database' => 'testdb'
53
+ )
54
+
55
+ expect(CouchPotato::Config.database_name).to eq('testdb')
56
+ end
57
+ end
58
+
59
+ describe CouchPotato, '.full_url_to_database' do
4
60
  before(:each) do
5
61
  @original_database_name = CouchPotato::Config.database_name
6
62
  end
@@ -8,12 +64,12 @@ describe CouchPotato, 'full_url_to_database' do
8
64
  CouchPotato::Config.database_name = @original_database_name
9
65
  end
10
66
 
11
- it "should add the default localhost and port if only a name is set" do
67
+ it 'should add the default localhost and port if only a name is set' do
12
68
  CouchPotato::Config.database_name = 'test'
13
69
  expect(CouchPotato.full_url_to_database).to eq('http://127.0.0.1:5984/test')
14
70
  end
15
71
 
16
- it "should return the set url" do
72
+ it 'should return the set url' do
17
73
  CouchPotato::Config.database_name = 'http://db.local/test'
18
74
  expect(CouchPotato.full_url_to_database).to eq('http://db.local/test')
19
75
  end
@@ -21,13 +77,22 @@ end
21
77
 
22
78
  describe CouchPotato, 'use' do
23
79
  it 'should return the db object' do
24
- db = CouchPotato.use("testdb")
80
+ db = CouchPotato.use('testdb')
25
81
  expect(db.couchrest_database.root.to_s).to eq('http://127.0.0.1:5984/testdb')
26
82
  end
83
+
84
+ it 'returns a db from the additional_databases pool' do
85
+ CouchPotato::Config.database_host = 'http://127.0.0.1:5984'
86
+ CouchPotato::Config.additional_databases = { '1' => 'db1', '2' => 'db2' }
87
+
88
+ db = CouchPotato.use('2')
89
+
90
+ expect(db.couchrest_database.root.to_s).to eq('http://127.0.0.1:5984/db2')
91
+ end
27
92
  end
28
93
 
29
94
  describe CouchPotato, '.models' do
30
- it "returns all classes that have implemented CouchPotato::Persistence" do
95
+ it 'returns all classes that have implemented CouchPotato::Persistence' do
31
96
  clazz = Class.new
32
97
  clazz.send(:include, CouchPotato::Persistence)
33
98
 
@@ -39,7 +39,8 @@ describe "create" do
39
39
  describe "fails" do
40
40
  before(:each) do
41
41
  @comment = Comment.new
42
- CouchPotato::Database.new(double('database', :info => nil)).save_document(@comment)
42
+ @db = CouchPotato::Database.new(double('database', :info => nil))
43
+ @db.save_document(@comment)
43
44
  end
44
45
 
45
46
  it "should not assign an id" do
@@ -58,11 +59,11 @@ describe "create" do
58
59
  expect(@comment.updated_at).to be_nil
59
60
  end
60
61
 
61
- describe "with bank" do
62
+ describe "with !" do
62
63
  it "should raise an exception" do
63
64
  expect {
64
- @comment.save!
65
- }.to raise_error
65
+ @db.save! @comment
66
+ }.to raise_error(CouchPotato::Database::ValidationsFailedError)
66
67
  end
67
68
  end
68
69
  end