couch_potato 1.7.0 → 1.7.1
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/.travis.yml +6 -6
- data/CHANGES.md +4 -0
- data/README.md +6 -10
- data/Rakefile +1 -1
- data/couch_potato.gemspec +3 -3
- data/gemfiles/active_support_5_0 +11 -0
- data/lib/couch_potato.rb +10 -12
- data/lib/couch_potato/database.rb +3 -1
- data/lib/couch_potato/persistence/type_caster.rb +3 -1
- data/lib/couch_potato/version.rb +1 -1
- data/spec/conflict_handling_spec.rb +1 -1
- data/spec/property_spec.rb +10 -1
- data/spec/unit/attributes_spec.rb +53 -0
- metadata +18 -12
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 7afdf21007e24fddeb4df04575ea8ee1062e4b29
|
4
|
+
data.tar.gz: 815dc0bd6c4a35a2770a28aff57e1901da66fc62
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: d0aedb24caecaac662bd3758683b74cb723d3361f0b25ad55463c102dfe6242b62a877337fa0c43091a4d52f0220371fb227fea2307c0fcc631d4767b5ae807a
|
7
|
+
data.tar.gz: fdbdea5fa1179b9026480fd128537e36e7b61edd385edbaf87899725a7af63540fddae8bd747471739307e1b6de4695e2e75c61fcb686402412f85d182c86d6c
|
data/.travis.yml
CHANGED
@@ -1,16 +1,16 @@
|
|
1
|
+
language: ruby
|
1
2
|
rvm:
|
2
|
-
- 2.
|
3
|
-
- 2.
|
4
|
-
-
|
5
|
-
-
|
6
|
-
- jruby-9.0.1.0
|
7
|
-
- rbx-2.5.8
|
3
|
+
- "2.2"
|
4
|
+
- "2.3.0"
|
5
|
+
- "jruby-9.0.5.0"
|
6
|
+
- "rbx-3.9"
|
8
7
|
services:
|
9
8
|
- couchdb
|
10
9
|
gemfile:
|
11
10
|
- gemfiles/active_support_4_0
|
12
11
|
- gemfiles/active_support_4_1
|
13
12
|
- gemfiles/active_support_4_2
|
13
|
+
- gemfiles/active_support_5_0
|
14
14
|
before_install:
|
15
15
|
gem install bundler --version 1.11.2
|
16
16
|
before_script:
|
data/CHANGES.md
CHANGED
data/README.md
CHANGED
@@ -27,11 +27,7 @@ Lastly Couch Potato aims to provide a seamless integration with Ruby on Rails, e
|
|
27
27
|
|
28
28
|
### Supported Environments
|
29
29
|
|
30
|
-
|
31
|
-
* CouchDB 1.6.0
|
32
|
-
* ActiveSupport 4.0, 4.1, 4.2
|
33
|
-
|
34
|
-
(Supported means I run the specs against those before releasing a new gem.)
|
30
|
+
Check travis.yml for supported Ruby/ActiveSupport versions.
|
35
31
|
|
36
32
|
### Installation
|
37
33
|
|
@@ -164,18 +160,18 @@ end
|
|
164
160
|
```
|
165
161
|
|
166
162
|
In this case `Address` also implements `CouchPotato::Persistence` which means its JSON representation will be added to the user document.
|
167
|
-
Couch Potato also has support for the basic types (right now `
|
163
|
+
Couch Potato also has support for the basic types (right now `Integer`, `Date`, `Time` and `:boolean` are supported):
|
168
164
|
|
169
165
|
```ruby
|
170
166
|
class User
|
171
167
|
include CouchPotato::Persistence
|
172
168
|
|
173
|
-
property :age, :type =>
|
169
|
+
property :age, :type => Integer
|
174
170
|
property :receive_newsletter, :type => :boolean
|
175
171
|
end
|
176
172
|
```
|
177
173
|
|
178
|
-
With this in place when you set the user's age as a String (e.g. using an HTML form) it will be converted into a `
|
174
|
+
With this in place when you set the user's age as a String (e.g. using an HTML form) it will be converted into a `Integer` automatically.
|
179
175
|
|
180
176
|
|
181
177
|
Properties can have a default value:
|
@@ -472,7 +468,7 @@ You can pass in your own view specifications by passing in `:type => MyViewSpecC
|
|
472
468
|
|
473
469
|
##### Digest view names
|
474
470
|
|
475
|
-
If turned on, Couch Potato will append an MD5 digest of the map function to each view name. This makes sure (together with split_design_documents_per_view) that no views/design documents are ever updated. Instead, new ones are created. Since reindexing can take a long time once your database is larger, you want to avoid blocking your app while CouchDB is busy. Instead, you create a new view, warm it up, and only then start using it.
|
471
|
+
If turned on, Couch Potato will append an MD5 digest of the map function to each view name. This makes sure (together with split_design_documents_per_view) that no views/design documents are ever updated. Instead, new ones are created. Since reindexing can take a long time once your database is larger, you want to avoid blocking your app while CouchDB is busy. Instead, you create a new view, warm it up, and only then start using it.
|
476
472
|
|
477
473
|
##### Lists
|
478
474
|
|
@@ -630,7 +626,7 @@ class User
|
|
630
626
|
include CouchPotato::Persistence
|
631
627
|
|
632
628
|
property :name
|
633
|
-
property :age, :type =>
|
629
|
+
property :age, :type => Integer
|
634
630
|
|
635
631
|
view :by_name, :key => :name
|
636
632
|
view :by_age, :key => :age
|
data/Rakefile
CHANGED
@@ -24,7 +24,7 @@ task :spec do
|
|
24
24
|
Rake::Task[:spec_unit].execute
|
25
25
|
Rake::Task[:spec_functional].execute
|
26
26
|
else
|
27
|
-
%w(4_0 4_1 4_2).each do |version|
|
27
|
+
%w(4_0 4_1 4_2 5_0).each do |version|
|
28
28
|
Bundler.with_clean_env do
|
29
29
|
puts "Running tests with ActiveSupport #{version.sub('_', '.')}"
|
30
30
|
sh "env BUNDLE_GEMFILE=gemfiles/active_support_#{version} bundle install"
|
data/couch_potato.gemspec
CHANGED
@@ -12,13 +12,13 @@ Gem::Specification.new do |s|
|
|
12
12
|
s.platform = Gem::Platform::RUBY
|
13
13
|
|
14
14
|
s.add_dependency 'json', '~> 1.6'
|
15
|
-
s.add_dependency 'couchrest', '~>2.0.0
|
16
|
-
s.add_dependency 'activemodel', '
|
15
|
+
s.add_dependency 'couchrest', '~>2.0.0'
|
16
|
+
s.add_dependency 'activemodel', ['>= 4.0', '< 6.0']
|
17
17
|
|
18
18
|
s.add_development_dependency 'rspec', '~>3.2.0'
|
19
19
|
s.add_development_dependency 'timecop'
|
20
20
|
s.add_development_dependency 'tzinfo'
|
21
|
-
s.add_development_dependency 'rake'
|
21
|
+
s.add_development_dependency 'rake', '< 11.0'
|
22
22
|
|
23
23
|
s.files = `git ls-files | grep -v "lib/couch_potato/rspec"`.split("\n")
|
24
24
|
s.test_files = `git ls-files -- {test,spec,features}/* | grep -v rspec_matchers`.split("\n")
|
data/lib/couch_potato.rb
CHANGED
@@ -12,7 +12,7 @@ module CouchPotato
|
|
12
12
|
Config.split_design_documents_per_view = false
|
13
13
|
Config.digest_view_names = false
|
14
14
|
Config.default_language = :javascript
|
15
|
-
Config.database_host =
|
15
|
+
Config.database_host = 'http://127.0.0.1:5984'
|
16
16
|
|
17
17
|
class NotFound < StandardError; end
|
18
18
|
class Conflict < StandardError; end
|
@@ -25,19 +25,19 @@ module CouchPotato
|
|
25
25
|
|
26
26
|
# Returns a database instance which you can then use to create objects and query views. You have to set the CouchPotato::Config.database_name before this works.
|
27
27
|
def self.database
|
28
|
-
|
28
|
+
Thread.current[:__couch_potato_database] ||= Database.new(couchrest_database)
|
29
29
|
end
|
30
30
|
|
31
31
|
# Returns the underlying CouchRest database object if you want low level access to your CouchDB. You have to set the CouchPotato::Config.database_name before this works.
|
32
32
|
def self.couchrest_database
|
33
|
-
|
33
|
+
Thread.current[:__couchrest_database] ||= CouchRest.database(full_url_to_database(CouchPotato::Config.database_name, CouchPotato::Config.database_host))
|
34
34
|
end
|
35
35
|
|
36
36
|
# Returns a specific database instance
|
37
37
|
def self.use(database_name)
|
38
|
-
|
39
|
-
|
40
|
-
|
38
|
+
Thread.current[:__couch_potato_databases] ||= {}
|
39
|
+
Thread.current[:__couch_potato_databases][database_name] = Database.new(couchrest_database_for_name!(database_name)) unless Thread.current[:__couch_potato_databases][database_name]
|
40
|
+
Thread.current[:__couch_potato_databases][database_name]
|
41
41
|
end
|
42
42
|
|
43
43
|
# Executes a block of code and yields a datbase with the given name.
|
@@ -48,9 +48,9 @@ module CouchPotato
|
|
48
48
|
# end
|
49
49
|
#
|
50
50
|
def self.with_database(database_name)
|
51
|
-
|
52
|
-
|
53
|
-
yield
|
51
|
+
Thread.current[:__couch_potato_databases] ||= {}
|
52
|
+
Thread.current[:__couch_potato_databases][database_name] = Database.new(couchrest_database_for_name(database_name)) unless Thread.current[:__couch_potato_databases][database_name]
|
53
|
+
yield Thread.current[:__couch_potato_databases][database_name]
|
54
54
|
end
|
55
55
|
|
56
56
|
# Returns a CouchRest-Database for directly accessing that functionality.
|
@@ -63,9 +63,7 @@ module CouchPotato
|
|
63
63
|
CouchRest.database!(full_url_to_database(database_name))
|
64
64
|
end
|
65
65
|
|
66
|
-
|
67
|
-
|
68
|
-
def self.full_url_to_database(database_name=CouchPotato::Config.database_name, database_host = CouchPotato::Config.database_host)
|
66
|
+
def self.full_url_to_database(database_name = CouchPotato::Config.database_name, database_host = CouchPotato::Config.database_host)
|
69
67
|
raise('No Database configured. Set CouchPotato::Config.database_name') unless database_name
|
70
68
|
if database_name.match(%r{https?://})
|
71
69
|
database_name
|
@@ -145,10 +145,12 @@ module CouchPotato
|
|
145
145
|
private
|
146
146
|
|
147
147
|
def handle_write_conflict(document, validate, retries, &block)
|
148
|
-
document = document.reload
|
149
148
|
if retries == 5
|
150
149
|
raise CouchPotato::Conflict.new
|
151
150
|
else
|
151
|
+
reloaded = document.reload
|
152
|
+
document.attributes = reloaded.attributes
|
153
|
+
document._rev = reloaded._rev
|
152
154
|
save_document document, validate, retries + 1, &block
|
153
155
|
end
|
154
156
|
end
|
@@ -28,7 +28,7 @@ module CouchPotato
|
|
28
28
|
|
29
29
|
def cast_native(value, type)
|
30
30
|
if type && !value.is_a?(type)
|
31
|
-
if
|
31
|
+
if [Fixnum, Integer].include? type
|
32
32
|
BigDecimal.new(value.to_s.scan(NUMBER_REGEX).join).round unless value.blank?
|
33
33
|
elsif type == Float
|
34
34
|
value.to_s.scan(NUMBER_REGEX).join.to_f unless value.blank?
|
@@ -36,6 +36,8 @@ module CouchPotato
|
|
36
36
|
BigDecimal.new(value.to_s) unless value.blank?
|
37
37
|
elsif type == Hash
|
38
38
|
value.to_hash unless value.blank?
|
39
|
+
elsif type.ancestors.include?(CouchPotato::Persistence)
|
40
|
+
type.new value unless value.blank?
|
39
41
|
else
|
40
42
|
type.json_create value unless value.blank?
|
41
43
|
end
|
data/lib/couch_potato/version.rb
CHANGED
data/spec/property_spec.rb
CHANGED
@@ -114,12 +114,21 @@ describe 'properties' do
|
|
114
114
|
end
|
115
115
|
|
116
116
|
it "should persist subclasses of the specified type" do
|
117
|
-
w = Watch.new(:custom_address => [Address2.new])
|
117
|
+
w = Watch.new(:custom_address => [Address2.new(id: 'a1', city: 'Berlin')])
|
118
118
|
CouchPotato.database.save_document! w
|
119
119
|
w = CouchPotato.database.load_document w.id
|
120
|
+
|
120
121
|
expect(w.custom_address[0]).to be_an_instance_of Address2
|
121
122
|
end
|
122
123
|
|
124
|
+
it 'initializes an typed array property from an array of hashes' do
|
125
|
+
w = Watch.new(custom_address: [{id: 'a1', city: 'Berlin'}])
|
126
|
+
|
127
|
+
expect(w.custom_address.map(&:class)).to eq([Address])
|
128
|
+
expect(w.custom_address.map(&:id)).to eq(['a1'])
|
129
|
+
expect(w.custom_address.map(&:city)).to eq(['Berlin'])
|
130
|
+
end
|
131
|
+
|
123
132
|
def it_should_persist value
|
124
133
|
c = Comment.new :title => value
|
125
134
|
CouchPotato.database.save_document! c
|
@@ -10,6 +10,7 @@ class Plant
|
|
10
10
|
include CouchPotato::Persistence
|
11
11
|
property :leaf_count
|
12
12
|
property :typed_leaf_count, type: Fixnum
|
13
|
+
property :integer_something, type: Integer
|
13
14
|
property :typed_leaf_size, type: Float
|
14
15
|
property :branch, type: Branch
|
15
16
|
end
|
@@ -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
|
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.7.
|
4
|
+
version: 1.7.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Alexander Lang
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2017-07-12 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: json
|
@@ -30,28 +30,34 @@ dependencies:
|
|
30
30
|
requirements:
|
31
31
|
- - "~>"
|
32
32
|
- !ruby/object:Gem::Version
|
33
|
-
version: 2.0.0
|
33
|
+
version: 2.0.0
|
34
34
|
type: :runtime
|
35
35
|
prerelease: false
|
36
36
|
version_requirements: !ruby/object:Gem::Requirement
|
37
37
|
requirements:
|
38
38
|
- - "~>"
|
39
39
|
- !ruby/object:Gem::Version
|
40
|
-
version: 2.0.0
|
40
|
+
version: 2.0.0
|
41
41
|
- !ruby/object:Gem::Dependency
|
42
42
|
name: activemodel
|
43
43
|
requirement: !ruby/object:Gem::Requirement
|
44
44
|
requirements:
|
45
|
-
- - "
|
45
|
+
- - ">="
|
46
46
|
- !ruby/object:Gem::Version
|
47
47
|
version: '4.0'
|
48
|
+
- - "<"
|
49
|
+
- !ruby/object:Gem::Version
|
50
|
+
version: '6.0'
|
48
51
|
type: :runtime
|
49
52
|
prerelease: false
|
50
53
|
version_requirements: !ruby/object:Gem::Requirement
|
51
54
|
requirements:
|
52
|
-
- - "
|
55
|
+
- - ">="
|
53
56
|
- !ruby/object:Gem::Version
|
54
57
|
version: '4.0'
|
58
|
+
- - "<"
|
59
|
+
- !ruby/object:Gem::Version
|
60
|
+
version: '6.0'
|
55
61
|
- !ruby/object:Gem::Dependency
|
56
62
|
name: rspec
|
57
63
|
requirement: !ruby/object:Gem::Requirement
|
@@ -98,16 +104,16 @@ dependencies:
|
|
98
104
|
name: rake
|
99
105
|
requirement: !ruby/object:Gem::Requirement
|
100
106
|
requirements:
|
101
|
-
- - "
|
107
|
+
- - "<"
|
102
108
|
- !ruby/object:Gem::Version
|
103
|
-
version: '0'
|
109
|
+
version: '11.0'
|
104
110
|
type: :development
|
105
111
|
prerelease: false
|
106
112
|
version_requirements: !ruby/object:Gem::Requirement
|
107
113
|
requirements:
|
108
|
-
- - "
|
114
|
+
- - "<"
|
109
115
|
- !ruby/object:Gem::Version
|
110
|
-
version: '0'
|
116
|
+
version: '11.0'
|
111
117
|
description: Ruby persistence layer for CouchDB
|
112
118
|
email: alex@upstre.am
|
113
119
|
executables: []
|
@@ -128,6 +134,7 @@ files:
|
|
128
134
|
- gemfiles/active_support_4_0
|
129
135
|
- gemfiles/active_support_4_1
|
130
136
|
- gemfiles/active_support_4_2
|
137
|
+
- gemfiles/active_support_5_0
|
131
138
|
- init.rb
|
132
139
|
- lib/core_ext/date.rb
|
133
140
|
- lib/core_ext/time.rb
|
@@ -223,7 +230,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
223
230
|
version: '0'
|
224
231
|
requirements: []
|
225
232
|
rubyforge_project:
|
226
|
-
rubygems_version: 2.4.
|
233
|
+
rubygems_version: 2.4.5
|
227
234
|
signing_key:
|
228
235
|
specification_version: 4
|
229
236
|
summary: Ruby persistence layer for CouchDB
|
@@ -270,4 +277,3 @@ test_files:
|
|
270
277
|
- spec/update_spec.rb
|
271
278
|
- spec/view_updates_spec.rb
|
272
279
|
- spec/views_spec.rb
|
273
|
-
has_rdoc:
|