ar_default_values 0.1.1 → 0.2.0

Sign up to get free protection for your applications and to get access to all the features.
data/README.rdoc CHANGED
@@ -1,9 +1,24 @@
1
1
  = ar_default_values
2
+ initialize with default_values
2
3
 
3
- Description goes here.
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 Yamada Masaki. See LICENSE.txt for
32
+ Copyright (c) 2012 masarakki. See LICENSE.txt for
18
33
  further details.
19
34
 
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.1.1
1
+ 0.2.0
@@ -5,11 +5,11 @@
5
5
 
6
6
  Gem::Specification.new do |s|
7
7
  s.name = "ar_default_values"
8
- s.version = "0.1.1"
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-03-24"
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 = [
@@ -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 do
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
- # lambda do
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
- hash_or_lambda = block.call
51
- hash_or_lambda = hash_or_lambda.call if hash_or_lambda.is_a? Proc
52
- attributes[0] = hash_or_lambda.merge(attributes.first || {})
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
- default_values do
6
- lambda do
7
- {
8
- :price => 0,
9
- :edition => 1,
10
- :released_at => Time.now
11
- }
12
- end
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(:edition => 3) do |t|
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.1.1
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-03-24 00:00:00.000000000 Z
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: &12866580 !ruby/object:Gem::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: *12866580
24
+ version_requirements: *14593180
25
25
  - !ruby/object:Gem::Dependency
26
26
  name: activerecord
27
- requirement: &12861600 !ruby/object:Gem::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: *12861600
35
+ version_requirements: *14592420
36
36
  - !ruby/object:Gem::Dependency
37
37
  name: rspec
38
- requirement: &12873500 !ruby/object:Gem::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: *12873500
46
+ version_requirements: *14591840
47
47
  - !ruby/object:Gem::Dependency
48
48
  name: rdoc
49
- requirement: &12870120 !ruby/object:Gem::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: *12870120
57
+ version_requirements: *14590760
58
58
  - !ruby/object:Gem::Dependency
59
59
  name: bundler
60
- requirement: &12867500 !ruby/object:Gem::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: *12867500
68
+ version_requirements: *14589540
69
69
  - !ruby/object:Gem::Dependency
70
70
  name: jeweler
71
- requirement: &12881540 !ruby/object:Gem::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: *12881540
79
+ version_requirements: *14588180
80
80
  - !ruby/object:Gem::Dependency
81
81
  name: sqlite3
82
- requirement: &12879380 !ruby/object:Gem::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: *12879380
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: -2944734096084027538
128
+ hash: -2739708549048950196
129
129
  required_rubygems_version: !ruby/object:Gem::Requirement
130
130
  none: false
131
131
  requirements: