ar_default_values 0.1.1 → 0.2.0
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.
- data/README.rdoc +18 -3
- data/VERSION +1 -1
- data/ar_default_values.gemspec +2 -2
- data/lib/ar_default_values.rb +22 -17
- data/spec/ar_default_values_spec.rb +23 -11
- metadata +17 -17
data/README.rdoc
CHANGED
@@ -1,9 +1,24 @@
|
|
1
1
|
= ar_default_values
|
2
|
+
initialize with default_values
|
2
3
|
|
3
|
-
|
4
|
+
== sample
|
5
|
+
you can specify default values with hash:
|
6
|
+
|
7
|
+
class Book < ActiveRecord::Base
|
8
|
+
default_values rating: 'r18', type: 'comic' do
|
9
|
+
t = Time.now
|
10
|
+
{ :released_at => t, :edition_updated_at => t }
|
11
|
+
end
|
12
|
+
end
|
13
|
+
|
14
|
+
book = Book.new
|
15
|
+
book.rating # => "r18"
|
16
|
+
book.type # => "comic"
|
17
|
+
book.title # => nil
|
18
|
+
book.released_at == book.edition_updated_at # => true
|
4
19
|
|
5
20
|
== Contributing to ar_default_values
|
6
|
-
|
21
|
+
|
7
22
|
* Check out the latest master to make sure the feature hasn't been implemented or the bug hasn't been fixed yet.
|
8
23
|
* Check out the issue tracker to make sure someone already hasn't requested it and/or contributed it.
|
9
24
|
* Fork the project.
|
@@ -14,6 +29,6 @@ Description goes here.
|
|
14
29
|
|
15
30
|
== Copyright
|
16
31
|
|
17
|
-
Copyright (c) 2012
|
32
|
+
Copyright (c) 2012 masarakki. See LICENSE.txt for
|
18
33
|
further details.
|
19
34
|
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.
|
1
|
+
0.2.0
|
data/ar_default_values.gemspec
CHANGED
@@ -5,11 +5,11 @@
|
|
5
5
|
|
6
6
|
Gem::Specification.new do |s|
|
7
7
|
s.name = "ar_default_values"
|
8
|
-
s.version = "0.
|
8
|
+
s.version = "0.2.0"
|
9
9
|
|
10
10
|
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
11
11
|
s.authors = ["masarakki"]
|
12
|
-
s.date = "2012-
|
12
|
+
s.date = "2012-04-02"
|
13
13
|
s.description = "ActiveRecord with default values"
|
14
14
|
s.email = "masaki@hisme.net"
|
15
15
|
s.extra_rdoc_files = [
|
data/lib/ar_default_values.rb
CHANGED
@@ -9,12 +9,7 @@ require 'active_record'
|
|
9
9
|
# you can specify default values with hash:
|
10
10
|
#
|
11
11
|
# class Book < ActiveRecord::Base
|
12
|
-
# default_values
|
13
|
-
# {
|
14
|
-
# :rating => 'r18',
|
15
|
-
# :type => 'comic'
|
16
|
-
# }
|
17
|
-
# end
|
12
|
+
# default_values rating: 'r18', type: 'comic'
|
18
13
|
# end
|
19
14
|
#
|
20
15
|
# book = Book.new
|
@@ -23,15 +18,15 @@ require 'active_record'
|
|
23
18
|
# book.title # => nil
|
24
19
|
#
|
25
20
|
# you can use instance values with lambda:
|
21
|
+
# class Book < ActiveRecord::Base
|
22
|
+
# default_values type: 'comic', released_at: lambda { Time.now }
|
23
|
+
# end
|
26
24
|
#
|
25
|
+
# or with block:
|
27
26
|
# class Book < ActiveRecord::Base
|
28
|
-
# default_values do
|
29
|
-
#
|
30
|
-
#
|
31
|
-
# :type => 'comic',
|
32
|
-
# :released_at => Time.now
|
33
|
-
# }
|
34
|
-
# end
|
27
|
+
# default_values type: 'comic' do
|
28
|
+
# t = Time.now
|
29
|
+
# {released_at: t, edition_updated_at: t}
|
35
30
|
# end
|
36
31
|
# end
|
37
32
|
#
|
@@ -39,19 +34,29 @@ require 'active_record'
|
|
39
34
|
# # wait 10 sec
|
40
35
|
# book2 = Book.new
|
41
36
|
# book1.release_at == book2.release_at # => false
|
37
|
+
# book1.released_at == book1.edition_updated_at # => true
|
42
38
|
#
|
43
39
|
module ActiveRecord
|
44
40
|
module DefaultValue
|
45
41
|
extend ActiveSupport::Concern
|
46
42
|
|
47
43
|
module ClassMethods
|
48
|
-
def default_values(&block)
|
44
|
+
def default_values(defaults = {}, &block)
|
49
45
|
define_method(:initialize_with_default_values) do |*attributes, &inner_block|
|
50
|
-
|
51
|
-
|
52
|
-
|
46
|
+
defaults = defaults.merge(block.call) if block_given?
|
47
|
+
defaults = Hash[defaults.each_pair.map{ |key, value| [key, value.kind_of?(Proc) ? value.call : value]}]
|
48
|
+
sanitized_defaults = sanitize_for_mass_assignment(defaults)
|
49
|
+
protected_defaults = defaults.reject do |key, value|
|
50
|
+
sanitized_defaults.has_key?(key)
|
51
|
+
end
|
52
|
+
|
53
|
+
attributes[0] = sanitized_defaults.merge(attributes.first || {})
|
53
54
|
initialize_without_default_values(*attributes, &inner_block)
|
55
|
+
protected_defaults.each_pair do |key, value|
|
56
|
+
self.send("#{key}=", value)
|
57
|
+
end
|
54
58
|
end
|
59
|
+
|
55
60
|
alias_method_chain :initialize, :default_values
|
56
61
|
end
|
57
62
|
end
|
@@ -1,22 +1,24 @@
|
|
1
1
|
require File.expand_path(File.dirname(__FILE__) + '/spec_helper')
|
2
2
|
|
3
|
-
|
4
3
|
class Book < ActiveRecord::Base
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
4
|
+
attr_protected :edition
|
5
|
+
|
6
|
+
default_values price: 0, edition: 1, released_at: lambda { Time.now }
|
7
|
+
end
|
8
|
+
|
9
|
+
class Book2 < ActiveRecord::Base
|
10
|
+
self.table_name = :books
|
11
|
+
|
12
|
+
default_values price: 0 do
|
13
|
+
t = Time.now
|
14
|
+
{:released_at => t }
|
13
15
|
end
|
14
16
|
end
|
15
17
|
|
16
18
|
describe "ArDefaultValues" do
|
17
19
|
subject { @sample }
|
18
20
|
before do
|
19
|
-
@now = Time.now
|
21
|
+
@now = Time.at(Time.now.to_i)
|
20
22
|
Time.stub(:now).and_return(@now)
|
21
23
|
end
|
22
24
|
context :without_attributes do
|
@@ -39,12 +41,22 @@ describe "ArDefaultValues" do
|
|
39
41
|
end
|
40
42
|
context :with_block do
|
41
43
|
before do
|
42
|
-
@sample = Book.new
|
44
|
+
@sample = Book.new do |t|
|
43
45
|
t.title = 'foo'
|
44
46
|
end
|
45
47
|
end
|
46
48
|
its(:title) { should == 'foo' }
|
47
49
|
its(:price) { should == 0 }
|
50
|
+
its(:edition) { should == 1 }
|
51
|
+
its(:released_at) { should == @now }
|
52
|
+
end
|
53
|
+
|
54
|
+
context :consider_attr_protected do
|
55
|
+
before do
|
56
|
+
@sample = Book2.new(:edition => 3)
|
57
|
+
end
|
58
|
+
its(:title) { should be_nil }
|
59
|
+
its(:price) { should == 0 }
|
48
60
|
its(:edition) { should == 3 }
|
49
61
|
its(:released_at) { should == @now }
|
50
62
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: ar_default_values
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.2.0
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,11 +9,11 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2012-
|
12
|
+
date: 2012-04-02 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: activesupport
|
16
|
-
requirement: &
|
16
|
+
requirement: &14593180 !ruby/object:Gem::Requirement
|
17
17
|
none: false
|
18
18
|
requirements:
|
19
19
|
- - ! '>='
|
@@ -21,10 +21,10 @@ dependencies:
|
|
21
21
|
version: '0'
|
22
22
|
type: :runtime
|
23
23
|
prerelease: false
|
24
|
-
version_requirements: *
|
24
|
+
version_requirements: *14593180
|
25
25
|
- !ruby/object:Gem::Dependency
|
26
26
|
name: activerecord
|
27
|
-
requirement: &
|
27
|
+
requirement: &14592420 !ruby/object:Gem::Requirement
|
28
28
|
none: false
|
29
29
|
requirements:
|
30
30
|
- - ! '>='
|
@@ -32,10 +32,10 @@ dependencies:
|
|
32
32
|
version: '0'
|
33
33
|
type: :runtime
|
34
34
|
prerelease: false
|
35
|
-
version_requirements: *
|
35
|
+
version_requirements: *14592420
|
36
36
|
- !ruby/object:Gem::Dependency
|
37
37
|
name: rspec
|
38
|
-
requirement: &
|
38
|
+
requirement: &14591840 !ruby/object:Gem::Requirement
|
39
39
|
none: false
|
40
40
|
requirements:
|
41
41
|
- - ! '>='
|
@@ -43,10 +43,10 @@ dependencies:
|
|
43
43
|
version: '0'
|
44
44
|
type: :development
|
45
45
|
prerelease: false
|
46
|
-
version_requirements: *
|
46
|
+
version_requirements: *14591840
|
47
47
|
- !ruby/object:Gem::Dependency
|
48
48
|
name: rdoc
|
49
|
-
requirement: &
|
49
|
+
requirement: &14590760 !ruby/object:Gem::Requirement
|
50
50
|
none: false
|
51
51
|
requirements:
|
52
52
|
- - ! '>='
|
@@ -54,10 +54,10 @@ dependencies:
|
|
54
54
|
version: '0'
|
55
55
|
type: :development
|
56
56
|
prerelease: false
|
57
|
-
version_requirements: *
|
57
|
+
version_requirements: *14590760
|
58
58
|
- !ruby/object:Gem::Dependency
|
59
59
|
name: bundler
|
60
|
-
requirement: &
|
60
|
+
requirement: &14589540 !ruby/object:Gem::Requirement
|
61
61
|
none: false
|
62
62
|
requirements:
|
63
63
|
- - ! '>='
|
@@ -65,10 +65,10 @@ dependencies:
|
|
65
65
|
version: '0'
|
66
66
|
type: :development
|
67
67
|
prerelease: false
|
68
|
-
version_requirements: *
|
68
|
+
version_requirements: *14589540
|
69
69
|
- !ruby/object:Gem::Dependency
|
70
70
|
name: jeweler
|
71
|
-
requirement: &
|
71
|
+
requirement: &14588180 !ruby/object:Gem::Requirement
|
72
72
|
none: false
|
73
73
|
requirements:
|
74
74
|
- - ! '>='
|
@@ -76,10 +76,10 @@ dependencies:
|
|
76
76
|
version: '0'
|
77
77
|
type: :development
|
78
78
|
prerelease: false
|
79
|
-
version_requirements: *
|
79
|
+
version_requirements: *14588180
|
80
80
|
- !ruby/object:Gem::Dependency
|
81
81
|
name: sqlite3
|
82
|
-
requirement: &
|
82
|
+
requirement: &14587200 !ruby/object:Gem::Requirement
|
83
83
|
none: false
|
84
84
|
requirements:
|
85
85
|
- - ! '>='
|
@@ -87,7 +87,7 @@ dependencies:
|
|
87
87
|
version: '0'
|
88
88
|
type: :development
|
89
89
|
prerelease: false
|
90
|
-
version_requirements: *
|
90
|
+
version_requirements: *14587200
|
91
91
|
description: ActiveRecord with default values
|
92
92
|
email: masaki@hisme.net
|
93
93
|
executables: []
|
@@ -125,7 +125,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
125
125
|
version: '0'
|
126
126
|
segments:
|
127
127
|
- 0
|
128
|
-
hash: -
|
128
|
+
hash: -2739708549048950196
|
129
129
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
130
130
|
none: false
|
131
131
|
requirements:
|