defaults 1.0.1 → 2.0.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +5 -5
- data/.gitignore +1 -1
- data/.travis.yml +17 -8
- data/Gemfile.lock +72 -0
- data/README.md +38 -8
- data/defaults.gemspec +4 -4
- data/gemfiles/5_0.gemfile +3 -0
- data/gemfiles/5_0.gemfile.lock +73 -0
- data/gemfiles/5_1.gemfile +3 -0
- data/gemfiles/5_1.gemfile.lock +73 -0
- data/gemfiles/5_2.gemfile +3 -0
- data/gemfiles/5_2.gemfile.lock +73 -0
- data/lib/defaults.rb +37 -18
- data/lib/defaults/version.rb +2 -2
- data/test/defaults/defaults_test.rb +93 -4
- data/test/schema.rb +2 -1
- data/test/test_helper.rb +2 -2
- metadata +18 -12
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
|
-
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: 99a898d5a8944837f464b37a61488f898031b5153d2a83ce2f84565ba982ea14
|
4
|
+
data.tar.gz: 77b4e74688d080bbf227b3ce43923c0389f89bf002e88ffcd97a6444a91ac771
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: fa5ffb6d5f0a70d54124438388a7833980ea0fe7c53928727d4f70f23b771bdec8bb0a1f01f0fd827c25f8c3ede0fab7b9259eb5c358d8dec0234a3f235da490
|
7
|
+
data.tar.gz: adac381ed1d12aa7e678e63607875c0a6512b21533e8b91c363a06476e6b7a4d076263474ea5a98c3d5df8632e7eb84ecc1ccf000dfb53c26f5c10938cb10d0e
|
data/.gitignore
CHANGED
data/.travis.yml
CHANGED
@@ -2,14 +2,23 @@ language: ruby
|
|
2
2
|
script: bundle exec rake
|
3
3
|
sudo: false
|
4
4
|
cache: bundler
|
5
|
-
addons:
|
6
|
-
code_climate:
|
7
|
-
repo_token:
|
8
|
-
secure: "aViiP4wSO11Sq/7aXMeoo4ksDj3/wPs3do+cP79jSFiF/ZyBnETWOG4BQoO+UWT1IctnlEN/jrAceZZ9VTbxrtkPbJriO4X8AZDweOq4TOvrRa+6jPfuAqh5QZeSbXucrTU54DWCyPDu404bIz+9yh1vFMBtstKQF1mx4MJVXY4="
|
9
5
|
rvm:
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
6
|
+
- 2.5.2
|
7
|
+
gemfile:
|
8
|
+
- Gemfile
|
9
|
+
- gemfiles/5_2.gemfile
|
10
|
+
- gemfiles/5_1.gemfile
|
11
|
+
- gemfiles/5_0.gemfile
|
14
12
|
notifications:
|
15
13
|
email: false
|
14
|
+
before_install:
|
15
|
+
- gem install bundler
|
16
|
+
before_script:
|
17
|
+
- curl -L https://codeclimate.com/downloads/test-reporter/test-reporter-latest-linux-amd64 > ./cc-test-reporter
|
18
|
+
- chmod +x ./cc-test-reporter
|
19
|
+
- "./cc-test-reporter before-build"
|
20
|
+
after_script:
|
21
|
+
- "./cc-test-reporter after-build --exit-code $TRAVIS_TEST_RESULT"
|
22
|
+
env:
|
23
|
+
global:
|
24
|
+
secure: G5s7bzgQzX9fcD+Wj9pNq3ePjnFxOeu7Q39q3ZX6KfJctD0VIrKR+tHyXpr08GDjB4sbQjmEAyVVypmn2UeIGd5Uzi72euM4G5h09CssD/zgTROojihMj8EvKLRj2oBVk40zCyPNdl31TGMFI6auSxNzM4VI1f4f1BV6ejgAPt4=
|
data/Gemfile.lock
ADDED
@@ -0,0 +1,72 @@
|
|
1
|
+
PATH
|
2
|
+
remote: .
|
3
|
+
specs:
|
4
|
+
defaults (2.0.0)
|
5
|
+
activerecord (>= 5.0.0)
|
6
|
+
|
7
|
+
GEM
|
8
|
+
remote: https://rubygems.org/
|
9
|
+
specs:
|
10
|
+
activemodel (5.2.2)
|
11
|
+
activesupport (= 5.2.2)
|
12
|
+
activerecord (5.2.2)
|
13
|
+
activemodel (= 5.2.2)
|
14
|
+
activesupport (= 5.2.2)
|
15
|
+
arel (>= 9.0)
|
16
|
+
activesupport (5.2.2)
|
17
|
+
concurrent-ruby (~> 1.0, >= 1.0.2)
|
18
|
+
i18n (>= 0.7, < 2)
|
19
|
+
minitest (~> 5.1)
|
20
|
+
tzinfo (~> 1.1)
|
21
|
+
arel (9.0.0)
|
22
|
+
awesome_print (1.8.0)
|
23
|
+
byebug (10.0.2)
|
24
|
+
coderay (1.1.2)
|
25
|
+
concurrent-ruby (1.1.4)
|
26
|
+
docile (1.1.5)
|
27
|
+
i18n (1.3.0)
|
28
|
+
concurrent-ruby (~> 1.0)
|
29
|
+
json (2.1.0)
|
30
|
+
method_source (0.9.2)
|
31
|
+
minitest (5.11.3)
|
32
|
+
minitest-utils (0.4.4)
|
33
|
+
minitest
|
34
|
+
pry (0.12.2)
|
35
|
+
coderay (~> 1.1.0)
|
36
|
+
method_source (~> 0.9.0)
|
37
|
+
pry-byebug (3.6.0)
|
38
|
+
byebug (~> 10.0)
|
39
|
+
pry (~> 0.10)
|
40
|
+
pry-meta (0.0.10)
|
41
|
+
awesome_print
|
42
|
+
pry
|
43
|
+
pry-byebug
|
44
|
+
pry-remote
|
45
|
+
pry-remote (0.1.8)
|
46
|
+
pry (~> 0.9)
|
47
|
+
slop (~> 3.0)
|
48
|
+
rake (12.3.2)
|
49
|
+
simplecov (0.13.0)
|
50
|
+
docile (~> 1.1.0)
|
51
|
+
json (>= 1.8, < 3)
|
52
|
+
simplecov-html (~> 0.10.0)
|
53
|
+
simplecov-html (0.10.2)
|
54
|
+
slop (3.6.0)
|
55
|
+
sqlite3 (1.3.13)
|
56
|
+
thread_safe (0.3.6)
|
57
|
+
tzinfo (1.2.5)
|
58
|
+
thread_safe (~> 0.1)
|
59
|
+
|
60
|
+
PLATFORMS
|
61
|
+
ruby
|
62
|
+
|
63
|
+
DEPENDENCIES
|
64
|
+
defaults!
|
65
|
+
minitest-utils
|
66
|
+
pry-meta
|
67
|
+
rake
|
68
|
+
simplecov
|
69
|
+
sqlite3
|
70
|
+
|
71
|
+
BUNDLED WITH
|
72
|
+
1.17.3
|
data/README.md
CHANGED
@@ -1,19 +1,34 @@
|
|
1
1
|
# Defaults
|
2
2
|
|
3
|
-
[![
|
3
|
+
[![Travis-CI](https://travis-ci.org/fnando/defaults.svg)](https://travis-ci.org/fnando/defaults)
|
4
4
|
[![Code Climate](https://codeclimate.com/github/fnando/defaults/badges/gpa.svg)](https://codeclimate.com/github/fnando/defaults)
|
5
|
-
[![Test Coverage](https://codeclimate.com/github/fnando/defaults/badges/coverage.svg)](https://codeclimate.com/github/fnando/defaults)
|
5
|
+
[![Test Coverage](https://codeclimate.com/github/fnando/defaults/badges/coverage.svg)](https://codeclimate.com/github/fnando/defaults/coverage)
|
6
|
+
[![Gem](https://img.shields.io/gem/v/defaults.svg)](https://rubygems.org/gems/defaults)
|
7
|
+
[![Gem](https://img.shields.io/gem/dt/defaults.svg)](https://rubygems.org/gems/defaults)
|
6
8
|
|
7
9
|
## Instalation
|
8
10
|
|
9
|
-
|
11
|
+
Add this line to your application's Gemfile:
|
12
|
+
|
13
|
+
```ruby
|
14
|
+
gem "defaults"
|
15
|
+
```
|
16
|
+
|
17
|
+
And then execute:
|
18
|
+
|
19
|
+
$ bundle
|
20
|
+
|
21
|
+
Or install it yourself as:
|
22
|
+
|
23
|
+
$ gem install defaults
|
24
|
+
|
10
25
|
|
11
26
|
## Usage
|
12
27
|
|
13
28
|
Here are the rules:
|
14
29
|
|
15
30
|
1. Assigned attributes have precedence over default values
|
16
|
-
2. Default values have precedence over database defaults
|
31
|
+
2. Default values have precedence over database defaults.
|
17
32
|
|
18
33
|
Add the method call `defaults` to your model.
|
19
34
|
|
@@ -31,21 +46,36 @@ Retrieve the default attribute with the `default_for` instance method:
|
|
31
46
|
@page.default_for(:title)
|
32
47
|
```
|
33
48
|
|
34
|
-
You can pass
|
49
|
+
You can pass callables (any objects that respond to `.call()` or `.call(record)`) as attribute:
|
35
50
|
|
36
51
|
```ruby
|
37
|
-
|
52
|
+
class Expiration
|
53
|
+
def self.call
|
54
|
+
Time.now
|
55
|
+
end
|
56
|
+
end
|
57
|
+
|
58
|
+
class Checksum
|
59
|
+
def self.call(user)
|
60
|
+
Digest::SHA1.hexdigest(user.name.to_s, user.email.to_s)
|
61
|
+
end
|
62
|
+
end
|
63
|
+
|
64
|
+
class User < ApplicationRecord
|
65
|
+
defaults checksum: Checksum,
|
66
|
+
expires_at: -> { Time.now }
|
67
|
+
end
|
38
68
|
```
|
39
69
|
|
40
70
|
You can override the default attributes as follow:
|
41
71
|
|
42
72
|
```ruby
|
43
|
-
Page.
|
73
|
+
Page.default_values = {title: "Here's your new page", body: "Write your page text"}
|
44
74
|
```
|
45
75
|
|
46
76
|
## Maintainer
|
47
77
|
|
48
|
-
|
78
|
+
Nando Vieira - http://nandovieira.com
|
49
79
|
|
50
80
|
## License
|
51
81
|
|
data/defaults.gemspec
CHANGED
@@ -16,10 +16,10 @@ Gem::Specification.new do |s|
|
|
16
16
|
s.executables = `git ls-files -- bin/*`.split("\n").map {|f| File.basename(f) }
|
17
17
|
s.require_paths = ["lib"]
|
18
18
|
|
19
|
-
s.
|
20
|
-
s.add_development_dependency "sqlite3-ruby"
|
21
|
-
s.add_development_dependency "rake"
|
19
|
+
s.add_dependency "activerecord", ">= 5.0.0"
|
22
20
|
s.add_development_dependency "minitest-utils"
|
23
|
-
s.add_development_dependency "codeclimate-test-reporter"
|
24
21
|
s.add_development_dependency "pry-meta"
|
22
|
+
s.add_development_dependency "rake"
|
23
|
+
s.add_development_dependency "simplecov"
|
24
|
+
s.add_development_dependency "sqlite3"
|
25
25
|
end
|
@@ -0,0 +1,73 @@
|
|
1
|
+
PATH
|
2
|
+
remote: ..
|
3
|
+
specs:
|
4
|
+
defaults (1.0.1)
|
5
|
+
activerecord (>= 5.0.0)
|
6
|
+
|
7
|
+
GEM
|
8
|
+
remote: https://rubygems.org/
|
9
|
+
specs:
|
10
|
+
activemodel (5.0.7.1)
|
11
|
+
activesupport (= 5.0.7.1)
|
12
|
+
activerecord (5.0.7.1)
|
13
|
+
activemodel (= 5.0.7.1)
|
14
|
+
activesupport (= 5.0.7.1)
|
15
|
+
arel (~> 7.0)
|
16
|
+
activesupport (5.0.7.1)
|
17
|
+
concurrent-ruby (~> 1.0, >= 1.0.2)
|
18
|
+
i18n (>= 0.7, < 2)
|
19
|
+
minitest (~> 5.1)
|
20
|
+
tzinfo (~> 1.1)
|
21
|
+
arel (7.1.4)
|
22
|
+
awesome_print (1.8.0)
|
23
|
+
byebug (10.0.2)
|
24
|
+
coderay (1.1.2)
|
25
|
+
concurrent-ruby (1.1.4)
|
26
|
+
docile (1.3.1)
|
27
|
+
i18n (1.3.0)
|
28
|
+
concurrent-ruby (~> 1.0)
|
29
|
+
json (2.1.0)
|
30
|
+
method_source (0.9.2)
|
31
|
+
minitest (5.11.3)
|
32
|
+
minitest-utils (0.4.4)
|
33
|
+
minitest
|
34
|
+
pry (0.12.2)
|
35
|
+
coderay (~> 1.1.0)
|
36
|
+
method_source (~> 0.9.0)
|
37
|
+
pry-byebug (3.6.0)
|
38
|
+
byebug (~> 10.0)
|
39
|
+
pry (~> 0.10)
|
40
|
+
pry-meta (0.0.10)
|
41
|
+
awesome_print
|
42
|
+
pry
|
43
|
+
pry-byebug
|
44
|
+
pry-remote
|
45
|
+
pry-remote (0.1.8)
|
46
|
+
pry (~> 0.9)
|
47
|
+
slop (~> 3.0)
|
48
|
+
rake (12.3.2)
|
49
|
+
simplecov (0.16.1)
|
50
|
+
docile (~> 1.1)
|
51
|
+
json (>= 1.8, < 3)
|
52
|
+
simplecov-html (~> 0.10.0)
|
53
|
+
simplecov-html (0.10.2)
|
54
|
+
slop (3.6.0)
|
55
|
+
sqlite3 (1.3.13)
|
56
|
+
thread_safe (0.3.6)
|
57
|
+
tzinfo (1.2.5)
|
58
|
+
thread_safe (~> 0.1)
|
59
|
+
|
60
|
+
PLATFORMS
|
61
|
+
ruby
|
62
|
+
|
63
|
+
DEPENDENCIES
|
64
|
+
activerecord (~> 5.0.0)
|
65
|
+
defaults!
|
66
|
+
minitest-utils
|
67
|
+
pry-meta
|
68
|
+
rake
|
69
|
+
simplecov
|
70
|
+
sqlite3
|
71
|
+
|
72
|
+
BUNDLED WITH
|
73
|
+
1.17.2
|
@@ -0,0 +1,73 @@
|
|
1
|
+
PATH
|
2
|
+
remote: ..
|
3
|
+
specs:
|
4
|
+
defaults (1.0.1)
|
5
|
+
activerecord (>= 5.0.0)
|
6
|
+
|
7
|
+
GEM
|
8
|
+
remote: https://rubygems.org/
|
9
|
+
specs:
|
10
|
+
activemodel (5.1.6.1)
|
11
|
+
activesupport (= 5.1.6.1)
|
12
|
+
activerecord (5.1.6.1)
|
13
|
+
activemodel (= 5.1.6.1)
|
14
|
+
activesupport (= 5.1.6.1)
|
15
|
+
arel (~> 8.0)
|
16
|
+
activesupport (5.1.6.1)
|
17
|
+
concurrent-ruby (~> 1.0, >= 1.0.2)
|
18
|
+
i18n (>= 0.7, < 2)
|
19
|
+
minitest (~> 5.1)
|
20
|
+
tzinfo (~> 1.1)
|
21
|
+
arel (8.0.0)
|
22
|
+
awesome_print (1.8.0)
|
23
|
+
byebug (10.0.2)
|
24
|
+
coderay (1.1.2)
|
25
|
+
concurrent-ruby (1.1.4)
|
26
|
+
docile (1.3.1)
|
27
|
+
i18n (1.3.0)
|
28
|
+
concurrent-ruby (~> 1.0)
|
29
|
+
json (2.1.0)
|
30
|
+
method_source (0.9.2)
|
31
|
+
minitest (5.11.3)
|
32
|
+
minitest-utils (0.4.4)
|
33
|
+
minitest
|
34
|
+
pry (0.12.2)
|
35
|
+
coderay (~> 1.1.0)
|
36
|
+
method_source (~> 0.9.0)
|
37
|
+
pry-byebug (3.6.0)
|
38
|
+
byebug (~> 10.0)
|
39
|
+
pry (~> 0.10)
|
40
|
+
pry-meta (0.0.10)
|
41
|
+
awesome_print
|
42
|
+
pry
|
43
|
+
pry-byebug
|
44
|
+
pry-remote
|
45
|
+
pry-remote (0.1.8)
|
46
|
+
pry (~> 0.9)
|
47
|
+
slop (~> 3.0)
|
48
|
+
rake (12.3.2)
|
49
|
+
simplecov (0.16.1)
|
50
|
+
docile (~> 1.1)
|
51
|
+
json (>= 1.8, < 3)
|
52
|
+
simplecov-html (~> 0.10.0)
|
53
|
+
simplecov-html (0.10.2)
|
54
|
+
slop (3.6.0)
|
55
|
+
sqlite3 (1.3.13)
|
56
|
+
thread_safe (0.3.6)
|
57
|
+
tzinfo (1.2.5)
|
58
|
+
thread_safe (~> 0.1)
|
59
|
+
|
60
|
+
PLATFORMS
|
61
|
+
ruby
|
62
|
+
|
63
|
+
DEPENDENCIES
|
64
|
+
activerecord (~> 5.1.0)
|
65
|
+
defaults!
|
66
|
+
minitest-utils
|
67
|
+
pry-meta
|
68
|
+
rake
|
69
|
+
simplecov
|
70
|
+
sqlite3
|
71
|
+
|
72
|
+
BUNDLED WITH
|
73
|
+
1.17.2
|
@@ -0,0 +1,73 @@
|
|
1
|
+
PATH
|
2
|
+
remote: ..
|
3
|
+
specs:
|
4
|
+
defaults (1.0.1)
|
5
|
+
activerecord (>= 5.0.0)
|
6
|
+
|
7
|
+
GEM
|
8
|
+
remote: https://rubygems.org/
|
9
|
+
specs:
|
10
|
+
activemodel (5.2.2)
|
11
|
+
activesupport (= 5.2.2)
|
12
|
+
activerecord (5.2.2)
|
13
|
+
activemodel (= 5.2.2)
|
14
|
+
activesupport (= 5.2.2)
|
15
|
+
arel (>= 9.0)
|
16
|
+
activesupport (5.2.2)
|
17
|
+
concurrent-ruby (~> 1.0, >= 1.0.2)
|
18
|
+
i18n (>= 0.7, < 2)
|
19
|
+
minitest (~> 5.1)
|
20
|
+
tzinfo (~> 1.1)
|
21
|
+
arel (9.0.0)
|
22
|
+
awesome_print (1.8.0)
|
23
|
+
byebug (10.0.2)
|
24
|
+
coderay (1.1.2)
|
25
|
+
concurrent-ruby (1.1.4)
|
26
|
+
docile (1.3.1)
|
27
|
+
i18n (1.3.0)
|
28
|
+
concurrent-ruby (~> 1.0)
|
29
|
+
json (2.1.0)
|
30
|
+
method_source (0.9.2)
|
31
|
+
minitest (5.11.3)
|
32
|
+
minitest-utils (0.4.4)
|
33
|
+
minitest
|
34
|
+
pry (0.12.2)
|
35
|
+
coderay (~> 1.1.0)
|
36
|
+
method_source (~> 0.9.0)
|
37
|
+
pry-byebug (3.6.0)
|
38
|
+
byebug (~> 10.0)
|
39
|
+
pry (~> 0.10)
|
40
|
+
pry-meta (0.0.10)
|
41
|
+
awesome_print
|
42
|
+
pry
|
43
|
+
pry-byebug
|
44
|
+
pry-remote
|
45
|
+
pry-remote (0.1.8)
|
46
|
+
pry (~> 0.9)
|
47
|
+
slop (~> 3.0)
|
48
|
+
rake (12.3.2)
|
49
|
+
simplecov (0.16.1)
|
50
|
+
docile (~> 1.1)
|
51
|
+
json (>= 1.8, < 3)
|
52
|
+
simplecov-html (~> 0.10.0)
|
53
|
+
simplecov-html (0.10.2)
|
54
|
+
slop (3.6.0)
|
55
|
+
sqlite3 (1.3.13)
|
56
|
+
thread_safe (0.3.6)
|
57
|
+
tzinfo (1.2.5)
|
58
|
+
thread_safe (~> 0.1)
|
59
|
+
|
60
|
+
PLATFORMS
|
61
|
+
ruby
|
62
|
+
|
63
|
+
DEPENDENCIES
|
64
|
+
activerecord (~> 5.2.0)
|
65
|
+
defaults!
|
66
|
+
minitest-utils
|
67
|
+
pry-meta
|
68
|
+
rake
|
69
|
+
simplecov
|
70
|
+
sqlite3
|
71
|
+
|
72
|
+
BUNDLED WITH
|
73
|
+
1.17.2
|
data/lib/defaults.rb
CHANGED
@@ -1,23 +1,51 @@
|
|
1
1
|
module Defaults
|
2
2
|
require "defaults/version"
|
3
3
|
|
4
|
+
def self.execute_callable(value, record)
|
5
|
+
callable = value.is_a?(Proc) ? value : value.method(:call)
|
6
|
+
callable.arity == 1 ? value.call(record) : value.call
|
7
|
+
end
|
8
|
+
|
9
|
+
def self.default_value_for_column(model, attribute)
|
10
|
+
column_info = model.columns_hash[attribute.to_s]
|
11
|
+
ActiveRecord::Type.lookup(column_info.type).cast(column_info.default) if column_info
|
12
|
+
end
|
13
|
+
|
14
|
+
def self.default_value(model, record, attribute)
|
15
|
+
value = model.default_values[attribute]
|
16
|
+
value = Defaults.execute_callable(value, record) if value.respond_to?(:call)
|
17
|
+
value
|
18
|
+
end
|
19
|
+
|
20
|
+
def self.resolve_default_value(model, record, attribute)
|
21
|
+
attribute = attribute.to_sym
|
22
|
+
|
23
|
+
# Check if value has been defined by `defaults`.
|
24
|
+
# If it is, try to resolve by checking if value is callable.
|
25
|
+
# Otherwise returns the default value of that column.
|
26
|
+
if model.default_values.key?(attribute)
|
27
|
+
Defaults.default_value(model, record, attribute)
|
28
|
+
else
|
29
|
+
Defaults.default_value_for_column(model, attribute)
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
4
33
|
def self.included(base)
|
5
34
|
base.extend ClassMethods
|
6
35
|
|
7
36
|
class << base
|
8
|
-
attr_accessor :
|
37
|
+
attr_accessor :default_values
|
9
38
|
end
|
10
39
|
end
|
11
40
|
|
12
41
|
module ClassMethods
|
13
|
-
# defaults :title => "Add your title here"
|
14
42
|
def defaults(attrs)
|
15
|
-
raise ArgumentError, "Hash expected; #{attrs.class} given." unless attrs.
|
43
|
+
raise ArgumentError, "Hash expected; #{attrs.class} given." unless attrs.is_a?(Hash)
|
16
44
|
|
17
45
|
include InstanceMethods
|
18
46
|
|
19
|
-
self.
|
20
|
-
self.
|
47
|
+
self.default_values ||= {}
|
48
|
+
self.default_values.merge!(attrs)
|
21
49
|
|
22
50
|
after_initialize :set_default_attributes
|
23
51
|
end
|
@@ -25,26 +53,17 @@ module Defaults
|
|
25
53
|
|
26
54
|
module InstanceMethods
|
27
55
|
def default_for(name)
|
28
|
-
|
29
|
-
value = self.class.default_options[name.to_sym]
|
30
|
-
value = value.arity == 1 ? value.call(self) : value.call if value.respond_to?(:call)
|
31
|
-
else
|
32
|
-
column_info = self.class.columns_hash[name.to_s]
|
33
|
-
value = column_info.type_cast_from_user(column_info.default) if column_info
|
34
|
-
end
|
35
|
-
|
36
|
-
value
|
56
|
+
Defaults.resolve_default_value(self.class, self, name)
|
37
57
|
end
|
38
58
|
|
39
|
-
private
|
40
|
-
def set_default_attributes
|
59
|
+
private def set_default_attributes
|
41
60
|
return unless new_record?
|
42
61
|
|
43
|
-
self.class.
|
62
|
+
self.class.default_values.keys.each do |name|
|
44
63
|
value = read_attribute(name) if changes[name]
|
45
64
|
value = default_for(name) if value.blank?
|
46
65
|
|
47
|
-
|
66
|
+
public_send "#{name}=", value
|
48
67
|
end
|
49
68
|
end
|
50
69
|
end
|
data/lib/defaults/version.rb
CHANGED
@@ -3,10 +3,17 @@ require "test_helper"
|
|
3
3
|
class Donut < ActiveRecord::Base
|
4
4
|
attr_accessor :class_name
|
5
5
|
|
6
|
+
slug_generator = Class.new do
|
7
|
+
def self.call
|
8
|
+
"delicious-donut-#{(1000..9999).to_a.sample}"
|
9
|
+
end
|
10
|
+
end
|
11
|
+
|
6
12
|
defaults flavor: "cream",
|
7
13
|
name: "Cream",
|
8
14
|
maker: proc { "Dunkin Donuts" },
|
9
|
-
class_name: ->
|
15
|
+
class_name: ->(donut) { donut.class.name },
|
16
|
+
slug: slug_generator
|
10
17
|
|
11
18
|
defaults quantity: 5
|
12
19
|
defaults available: false
|
@@ -20,11 +27,13 @@ class DefaultsTest < Minitest::Test
|
|
20
27
|
Donut.delete_all
|
21
28
|
end
|
22
29
|
|
23
|
-
test "considers
|
30
|
+
test "considers database defaults with type casting" do
|
31
|
+
assert_kind_of Float, new_donut.default_for(:price)
|
24
32
|
assert_equal 0.00, new_donut.default_for(:price)
|
25
33
|
end
|
26
34
|
|
27
35
|
test "has precedence over database defaults" do
|
36
|
+
assert ActiveRecord::Type.lookup(:boolean).cast(Donut.columns_hash["available"].default)
|
28
37
|
refute new_donut.available?
|
29
38
|
end
|
30
39
|
|
@@ -38,6 +47,7 @@ class DefaultsTest < Minitest::Test
|
|
38
47
|
assert_equal "Dunkin Donuts", new_donut.maker
|
39
48
|
assert_equal "Donut", new_donut.class_name
|
40
49
|
assert_equal 5, new_donut.quantity
|
50
|
+
assert_match /^delicious-donut-\d{4}$/, new_donut.slug
|
41
51
|
end
|
42
52
|
|
43
53
|
test "sets default values only when have blank attributes" do
|
@@ -57,10 +67,89 @@ class DefaultsTest < Minitest::Test
|
|
57
67
|
assert_equal "vanilla", Donut.first.flavor
|
58
68
|
end
|
59
69
|
|
70
|
+
test "considers arity=0 of callable (lambda)" do
|
71
|
+
donut_class = model do
|
72
|
+
defaults quantity: -> { 1234 }
|
73
|
+
end
|
74
|
+
|
75
|
+
donut = donut_class.new
|
76
|
+
|
77
|
+
assert_equal 1234, donut.default_for(:quantity)
|
78
|
+
end
|
79
|
+
|
80
|
+
test "considers arity=1 of callable (lambda)" do
|
81
|
+
record = nil
|
82
|
+
|
83
|
+
donut_class = model do
|
84
|
+
defaults quantity: ->(r) { record = r }
|
85
|
+
end
|
86
|
+
|
87
|
+
donut = donut_class.new
|
88
|
+
donut.default_for(:quantity)
|
89
|
+
|
90
|
+
assert_equal donut, record
|
91
|
+
end
|
92
|
+
|
93
|
+
test "considers arity=0 of callable (class)" do
|
94
|
+
quantity_class = Class.new do
|
95
|
+
def self.call
|
96
|
+
1234
|
97
|
+
end
|
98
|
+
end
|
99
|
+
|
100
|
+
donut_class = model do
|
101
|
+
defaults quantity: quantity_class
|
102
|
+
end
|
103
|
+
|
104
|
+
donut = donut_class.new
|
105
|
+
|
106
|
+
assert_equal 1234, donut.default_for(:quantity)
|
107
|
+
end
|
108
|
+
|
109
|
+
test "considers arity=1 of callable (class)" do
|
110
|
+
quantity_class = Class.new do
|
111
|
+
def self.record
|
112
|
+
@record
|
113
|
+
end
|
114
|
+
|
115
|
+
def self.call(record)
|
116
|
+
@record = record
|
117
|
+
end
|
118
|
+
end
|
119
|
+
|
120
|
+
donut_class = model do
|
121
|
+
defaults quantity: quantity_class
|
122
|
+
end
|
123
|
+
|
124
|
+
donut = donut_class.new
|
125
|
+
donut.default_for(:quantity)
|
126
|
+
|
127
|
+
assert_equal donut, quantity_class.record
|
128
|
+
end
|
129
|
+
|
130
|
+
test "overrides default values" do
|
131
|
+
donut_class = model do
|
132
|
+
defaults quantity: -> { 1234 }
|
133
|
+
end
|
134
|
+
|
135
|
+
donut_class.default_values[:quantity] = 42
|
136
|
+
|
137
|
+
donut = donut_class.new
|
138
|
+
|
139
|
+
assert_equal 42, donut.default_for(:quantity)
|
140
|
+
end
|
141
|
+
|
60
142
|
private
|
61
143
|
|
62
|
-
def
|
63
|
-
|
144
|
+
def model(&block)
|
145
|
+
Class.new(ActiveRecord::Base) do
|
146
|
+
self.table_name = :donuts
|
147
|
+
instance_eval(&block)
|
148
|
+
end
|
149
|
+
end
|
150
|
+
|
151
|
+
def create_donut(options = {}, model = Donut)
|
152
|
+
model.create({
|
64
153
|
flavor: "vanilla",
|
65
154
|
name: "Vanilla Sky",
|
66
155
|
maker: "Mr. Baker"
|
data/test/schema.rb
CHANGED
@@ -1,8 +1,9 @@
|
|
1
|
-
ActiveRecord::Schema.define(:
|
1
|
+
ActiveRecord::Schema.define(version: 0) do
|
2
2
|
create_table :donuts do |t|
|
3
3
|
t.string :flavor, :name, :maker
|
4
4
|
t.integer :quantity, null: false
|
5
5
|
t.float :price, default: 0.00, null: false
|
6
6
|
t.boolean :available, default: true, null: false
|
7
|
+
t.string :slug, null: false
|
7
8
|
end
|
8
9
|
end
|
data/test/test_helper.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: defaults
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version:
|
4
|
+
version: 2.0.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Nando Vieira
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2018-12-27 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: activerecord
|
@@ -16,16 +16,16 @@ dependencies:
|
|
16
16
|
requirements:
|
17
17
|
- - ">="
|
18
18
|
- !ruby/object:Gem::Version
|
19
|
-
version:
|
20
|
-
type: :
|
19
|
+
version: 5.0.0
|
20
|
+
type: :runtime
|
21
21
|
prerelease: false
|
22
22
|
version_requirements: !ruby/object:Gem::Requirement
|
23
23
|
requirements:
|
24
24
|
- - ">="
|
25
25
|
- !ruby/object:Gem::Version
|
26
|
-
version:
|
26
|
+
version: 5.0.0
|
27
27
|
- !ruby/object:Gem::Dependency
|
28
|
-
name:
|
28
|
+
name: minitest-utils
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|
30
30
|
requirements:
|
31
31
|
- - ">="
|
@@ -39,7 +39,7 @@ dependencies:
|
|
39
39
|
- !ruby/object:Gem::Version
|
40
40
|
version: '0'
|
41
41
|
- !ruby/object:Gem::Dependency
|
42
|
-
name:
|
42
|
+
name: pry-meta
|
43
43
|
requirement: !ruby/object:Gem::Requirement
|
44
44
|
requirements:
|
45
45
|
- - ">="
|
@@ -53,7 +53,7 @@ dependencies:
|
|
53
53
|
- !ruby/object:Gem::Version
|
54
54
|
version: '0'
|
55
55
|
- !ruby/object:Gem::Dependency
|
56
|
-
name:
|
56
|
+
name: rake
|
57
57
|
requirement: !ruby/object:Gem::Requirement
|
58
58
|
requirements:
|
59
59
|
- - ">="
|
@@ -67,7 +67,7 @@ dependencies:
|
|
67
67
|
- !ruby/object:Gem::Version
|
68
68
|
version: '0'
|
69
69
|
- !ruby/object:Gem::Dependency
|
70
|
-
name:
|
70
|
+
name: simplecov
|
71
71
|
requirement: !ruby/object:Gem::Requirement
|
72
72
|
requirements:
|
73
73
|
- - ">="
|
@@ -81,7 +81,7 @@ dependencies:
|
|
81
81
|
- !ruby/object:Gem::Version
|
82
82
|
version: '0'
|
83
83
|
- !ruby/object:Gem::Dependency
|
84
|
-
name:
|
84
|
+
name: sqlite3
|
85
85
|
requirement: !ruby/object:Gem::Requirement
|
86
86
|
requirements:
|
87
87
|
- - ">="
|
@@ -104,9 +104,16 @@ files:
|
|
104
104
|
- ".gitignore"
|
105
105
|
- ".travis.yml"
|
106
106
|
- Gemfile
|
107
|
+
- Gemfile.lock
|
107
108
|
- README.md
|
108
109
|
- Rakefile
|
109
110
|
- defaults.gemspec
|
111
|
+
- gemfiles/5_0.gemfile
|
112
|
+
- gemfiles/5_0.gemfile.lock
|
113
|
+
- gemfiles/5_1.gemfile
|
114
|
+
- gemfiles/5_1.gemfile.lock
|
115
|
+
- gemfiles/5_2.gemfile
|
116
|
+
- gemfiles/5_2.gemfile.lock
|
110
117
|
- lib/defaults.rb
|
111
118
|
- lib/defaults/version.rb
|
112
119
|
- test/defaults/defaults_test.rb
|
@@ -131,8 +138,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
131
138
|
- !ruby/object:Gem::Version
|
132
139
|
version: '0'
|
133
140
|
requirements: []
|
134
|
-
|
135
|
-
rubygems_version: 2.5.1
|
141
|
+
rubygems_version: 3.0.1
|
136
142
|
signing_key:
|
137
143
|
specification_version: 4
|
138
144
|
summary: Set default values for ActiveRecord attributes
|