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 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: