default_value_for 2.0.3 → 3.0.0

Sign up to get free protection for your applications and to get access to all the features.
data/Rakefile CHANGED
@@ -2,5 +2,25 @@ task :default => :test
2
2
 
3
3
  desc "Run unit tests."
4
4
  task :test do
5
- ruby "test.rb"
5
+ ruby "test.rb"
6
+ end
7
+
8
+ ['3.2', '4.0', '4.1'].each do |version|
9
+ dotless = version.delete('.')
10
+
11
+ namespace :bundle do
12
+ desc "Bundle with Rails #{version}.x"
13
+ task :"rails#{dotless}" do
14
+ ENV['BUNDLE_GEMFILE'] = "Gemfile.rails.#{version}.rb"
15
+ sh "bundle"
16
+ end
17
+ end
18
+
19
+ namespace :test do
20
+ desc "Test with Rails #{version}.x"
21
+ task :"rails#{dotless}" do
22
+ ENV['BUNDLE_GEMFILE'] = "Gemfile.rails.#{version}.rb"
23
+ ruby "test.rb"
24
+ end
25
+ end
6
26
  end
@@ -1,15 +1,19 @@
1
1
  Gem::Specification.new do |s|
2
2
  s.name = %q{default_value_for}
3
- s.version = "2.0.3"
3
+ s.version = "3.0.0"
4
4
  s.summary = %q{Provides a way to specify default values for ActiveRecord models}
5
5
  s.description = %q{The default_value_for plugin allows one to define default values for ActiveRecord models in a declarative manner}
6
6
  s.email = %q{software-signing@phusion.nl}
7
7
  s.homepage = %q{https://github.com/FooBarWidget/default_value_for}
8
8
  s.authors = ["Hongli Lai"]
9
9
  s.files = ['default_value_for.gemspec',
10
- 'LICENSE.TXT', 'Rakefile', 'README.rdoc', 'test.rb',
10
+ 'LICENSE.TXT', 'Rakefile', 'README.md', 'test.rb',
11
11
  'init.rb',
12
12
  'lib/default_value_for.rb',
13
13
  'lib/default_value_for/railtie.rb'
14
14
  ]
15
+ s.add_dependency 'activerecord', '>= 3.2.0', '< 5.0'
16
+ s.add_development_dependency 'railties', '>= 3.2.0', '< 5.0'
17
+ s.add_development_dependency 'minitest', '>= 4.2'
18
+ s.required_ruby_version = '>= 1.9.3'
15
19
  end
@@ -56,32 +56,34 @@ module DefaultValueFor
56
56
  # * <tt>value</tt> - Sets the default value.
57
57
  # * <tt>allows_nil (default: true)</tt> - Sets explicitly passed nil values if option is set to true.
58
58
  def default_value_for(attribute, options = {}, &block)
59
- value = options.is_a?(Hash) && options.stringify_keys.has_key?('value') ? options.stringify_keys['value'] : options
60
- allows_nil = options.is_a?(Hash) && options.stringify_keys.has_key?('allows_nil') ? options.stringify_keys['allows_nil'] : true
59
+ value = options
60
+ allows_nil = true
61
+
62
+ if options.is_a?(Hash)
63
+ opts = options.stringify_keys
64
+ value = opts.fetch('value', options)
65
+ allows_nil = opts.fetch('allows_nil', true)
66
+ end
61
67
 
62
68
  if !method_defined?(:set_default_values)
63
69
  include(InstanceMethods)
64
70
 
65
71
  after_initialize :set_default_values
66
72
 
67
- if respond_to?(:class_attribute)
68
- class_attribute :_default_attribute_values
69
- class_attribute :_default_attribute_values_not_allowing_nil
70
- else
71
- class_inheritable_accessor :_default_attribute_values
72
- class_inheritable_accessor :_default_attribute_values_not_allowing_nil
73
- end
73
+ class_attribute :_default_attribute_values
74
+ class_attribute :_default_attribute_values_not_allowing_nil
74
75
 
75
76
  extend(DelayedClassMethods)
76
77
  init_hash = true
77
78
  else
78
- methods = singleton_methods(false)
79
- init_hash = !methods.include?("_default_attribute_values") && !methods.include?(:_default_attribute_values)
79
+ init_hash = !singleton_methods(false).include?(:_default_attribute_values)
80
80
  end
81
+
81
82
  if init_hash
82
- self._default_attribute_values = ActiveSupport::OrderedHash.new
83
+ self._default_attribute_values = {}
83
84
  self._default_attribute_values_not_allowing_nil = []
84
85
  end
86
+
85
87
  if block_given?
86
88
  container = BlockValueContainer.new(block)
87
89
  else
@@ -134,20 +136,31 @@ module DefaultValueFor
134
136
  end
135
137
  end
136
138
 
137
- if ActiveRecord::VERSION::MAJOR > 3 || (ActiveRecord::VERSION::MAJOR == 3 && ActiveRecord::VERSION::MINOR > 0)
139
+ if self.class.respond_to? :protected_attributes
138
140
  super(attributes, options)
139
141
  else
140
142
  super(attributes)
141
143
  end
142
144
  end
143
145
 
146
+ def attributes_for_create(attribute_names)
147
+ attribute_names += _default_attribute_values.keys.map(&:to_s)
148
+ super
149
+ end
150
+
144
151
  def set_default_values
145
152
  self.class._all_default_attribute_values.each do |attribute, container|
146
- next unless self.new_record? || self.class._all_default_attribute_values_not_allowing_nil.include?(attribute)
153
+ next unless new_record? || self.class._all_default_attribute_values_not_allowing_nil.include?(attribute)
147
154
 
148
155
  connection_default_value_defined = new_record? && respond_to?("#{attribute}_changed?") && !__send__("#{attribute}_changed?")
149
156
 
150
- next unless connection_default_value_defined || self.attributes[attribute].blank?
157
+ column = self.class.columns.detect {|c| c.name == attribute}
158
+ attribute_blank = if column && column.type == :boolean
159
+ attributes[attribute].nil?
160
+ else
161
+ attributes[attribute].blank?
162
+ end
163
+ next unless connection_default_value_defined || attribute_blank
151
164
 
152
165
  # allow explicitly setting nil through allow nil option
153
166
  next if @initialization_attributes.is_a?(Hash) && @initialization_attributes.has_key?(attribute) && !self.class._all_default_attribute_values_not_allowing_nil.include?(attribute)
@@ -21,19 +21,19 @@
21
21
  # Rails 3 initialization
22
22
 
23
23
  module DefaultValueFor
24
- def self.initialize_railtie
25
- ActiveSupport.on_load :active_record do
26
- DefaultValueFor.initialize_active_record_extensions
27
- end
28
- end
29
-
30
- def self.initialize_active_record_extensions
31
- ActiveRecord::Base.extend(DefaultValueFor::ClassMethods)
32
- end
33
-
34
- class Railtie < Rails::Railtie
35
- initializer 'default_value_for.insert_into_active_record' do
36
- DefaultValueFor.initialize_railtie
37
- end
38
- end
24
+ def self.initialize_railtie
25
+ ActiveSupport.on_load :active_record do
26
+ DefaultValueFor.initialize_active_record_extensions
27
+ end
28
+ end
29
+
30
+ def self.initialize_active_record_extensions
31
+ ActiveRecord::Base.extend(DefaultValueFor::ClassMethods)
32
+ end
33
+
34
+ class Railtie < Rails::Railtie
35
+ initializer 'default_value_for.insert_into_active_record' do
36
+ DefaultValueFor.initialize_railtie
37
+ end
38
+ end
39
39
  end
data/test.rb CHANGED
@@ -18,35 +18,36 @@
18
18
  # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
19
19
  # THE SOFTWARE.
20
20
 
21
- want_rails_version = '~> ' + ENV.fetch('WANT_RAILS_VERSION', '3.2.0')
21
+ require 'bundler/setup'
22
+ require 'minitest/autorun'
23
+ require 'active_record'
24
+ require 'active_support/dependencies'
25
+
26
+ if ActiveSupport::VERSION::MAJOR < 4
27
+ require 'active_support/core_ext/logger'
28
+ end
22
29
 
23
- require 'rubygems'
24
- gem 'rails', want_rails_version
25
- gem 'activerecord', want_rails_version
26
30
  begin
27
- require 'rails/railtie'
28
- rescue LoadError
31
+ TestCaseClass = MiniTest::Test
32
+ rescue NameError
33
+ TestCaseClass = MiniTest::Unit::TestCase
29
34
  end
30
- require 'active_record'
31
- require 'test/unit'
32
- require 'active_support/dependencies'
33
- require 'active_support/core_ext/logger'
34
- $LOAD_PATH.unshift File.expand_path("lib", File.dirname(__FILE__))
35
+
35
36
  require 'default_value_for'
36
- Dir.chdir(File.dirname(__FILE__))
37
+
38
+ puts "\nTesting with Active Record version #{ActiveRecord::VERSION::STRING}\n\n"
37
39
 
38
40
  if RUBY_PLATFORM == "java"
39
41
  database_adapter = "jdbcsqlite3"
40
42
  else
41
43
  database_adapter = "sqlite3"
42
44
  end
43
-
44
- File.unlink('test.sqlite3') rescue nil
45
+ ActiveRecord::Base.default_timezone = :local
45
46
  ActiveRecord::Base.logger = Logger.new(STDERR)
46
47
  ActiveRecord::Base.logger.level = Logger::WARN
47
48
  ActiveRecord::Base.establish_connection(
48
- :adapter => database_adapter,
49
- :database => 'test.sqlite3'
49
+ :adapter => database_adapter,
50
+ :database => ':memory:'
50
51
  )
51
52
  ActiveRecord::Base.connection.create_table(:users, :force => true) do |t|
52
53
  t.string :username
@@ -58,6 +59,7 @@ ActiveRecord::Base.connection.create_table(:numbers, :force => true) do |t|
58
59
  t.integer :count, :null => false, :default => 1
59
60
  t.integer :user_id
60
61
  t.timestamp :timestamp
62
+ t.boolean :flag
61
63
  end
62
64
 
63
65
  if defined?(Rails::Railtie)
@@ -72,7 +74,7 @@ end
72
74
  class Number < ActiveRecord::Base
73
75
  end
74
76
 
75
- class DefaultValuePluginTest < Test::Unit::TestCase
77
+ class DefaultValuePluginTest < TestCaseClass
76
78
  def setup
77
79
  Number.create(:number => 9876)
78
80
  end
@@ -115,10 +117,10 @@ class DefaultValuePluginTest < Test::Unit::TestCase
115
117
  define_model_class do
116
118
  default_value_for :number, 1234
117
119
  end
118
-
120
+
119
121
  object = TestClass.create
120
- assert_not_nil TestClass.find_by_number(1234)
121
-
122
+ refute_nil TestClass.find_by_number(1234)
123
+
122
124
  # allows nil for existing records
123
125
  object.update_attribute(:number, nil)
124
126
  assert_nil TestClass.find_by_number(1234)
@@ -129,9 +131,9 @@ class DefaultValuePluginTest < Test::Unit::TestCase
129
131
  define_model_class do
130
132
  default_value_for(:number, :allows_nil => false) { 1234 }
131
133
  end
132
-
134
+
133
135
  object = TestClass.create
134
-
136
+
135
137
  # allows nil for existing records
136
138
  object.update_attribute(:number, nil)
137
139
  assert_nil TestClass.find_by_number(1234)
@@ -257,7 +259,7 @@ class DefaultValuePluginTest < Test::Unit::TestCase
257
259
  attr_accessor :hello
258
260
  end
259
261
 
260
- assert_nothing_raised { TestSuperClass.new }
262
+ assert TestSuperClass.new
261
263
  assert !TestSuperClass._default_attribute_values.include?(:hello)
262
264
  end
263
265
 
@@ -265,7 +267,7 @@ class DefaultValuePluginTest < Test::Unit::TestCase
265
267
  define_model_class do
266
268
  default_value_for :number, 1234
267
269
  end
268
- assert_equal 9876, TestClass.find(:first).number
270
+ assert_equal 9876, TestClass.first.number
269
271
  end
270
272
 
271
273
  def test_also_works_on_attributes_that_arent_database_columns
@@ -277,31 +279,33 @@ class DefaultValuePluginTest < Test::Unit::TestCase
277
279
  assert_equal 'hi', object.hello
278
280
  end
279
281
 
280
- def test_constructor_ignores_forbidden_mass_assignment_attributes
281
- define_model_class do
282
- default_value_for :number, 1234
283
- attr_protected :number
282
+ if ActiveRecord::VERSION::MAJOR < 4
283
+ def test_constructor_ignores_forbidden_mass_assignment_attributes
284
+ define_model_class do
285
+ default_value_for :number, 1234
286
+ attr_protected :number
287
+ end
288
+ object = TestClass.new(:number => 5678, :count => 987)
289
+ assert_equal 1234, object.number
290
+ assert_equal 987, object.count
284
291
  end
285
- object = TestClass.new(:number => 5678, :count => 987)
286
- assert_equal 1234, object.number
287
- assert_equal 987, object.count
288
- end
289
292
 
290
- def test_constructor_respects_without_protection_option
291
- define_model_class do
292
- default_value_for :number, 1234
293
- attr_protected :number
294
-
295
- def respond_to_mass_assignment_options?
296
- respond_to? :mass_assignment_options
293
+ def test_constructor_respects_without_protection_option
294
+ define_model_class do
295
+ default_value_for :number, 1234
296
+ attr_protected :number
297
+
298
+ def respond_to_mass_assignment_options?
299
+ respond_to? :mass_assignment_options
300
+ end
301
+ end
302
+
303
+ if TestClass.new.respond_to_mass_assignment_options?
304
+ # test without protection feature if available in current ActiveRecord version
305
+ object = TestClass.create!({:number => 5678, :count => 987}, :without_protection => true)
306
+ assert_equal 5678, object.number
307
+ assert_equal 987, object.count
297
308
  end
298
- end
299
-
300
- if TestClass.new.respond_to_mass_assignment_options?
301
- # test without protection feature if available in current ActiveRecord version
302
- object = TestClass.create!({:number => 5678, :count => 987}, :without_protection => true)
303
- assert_equal 5678, object.number
304
- assert_equal 987, object.count
305
309
  end
306
310
  end
307
311
 
@@ -413,7 +417,7 @@ class DefaultValuePluginTest < Test::Unit::TestCase
413
417
  user2 = TestClass.new
414
418
  assert_equal([1], user2.hash[1])
415
419
  end
416
-
420
+
417
421
  def test_constructor_does_not_affect_the_hash_passed_to_it
418
422
  define_model_class do
419
423
  default_value_for :count, 5
@@ -431,6 +435,18 @@ class DefaultValuePluginTest < Test::Unit::TestCase
431
435
  end
432
436
  define_model_class("SpecialNumber", "TestClass")
433
437
  n = SpecialNumber.create
434
- assert_nothing_raised { SpecialNumber.find(n.id) }
438
+ assert SpecialNumber.find(n.id)
439
+ end
440
+
441
+ def test_does_not_see_false_as_blank_at_boolean_columns_for_existing_records
442
+ define_model_class do
443
+ default_value_for(:flag, :allows_nil => false) { true }
444
+ end
445
+
446
+ object = TestClass.create
447
+
448
+ # allows nil for existing records
449
+ object.update_attribute(:flag, false)
450
+ assert_equal false, TestClass.find(object.id).flag
435
451
  end
436
452
  end
metadata CHANGED
@@ -1,16 +1,69 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: default_value_for
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.0.3
5
- prerelease:
4
+ version: 3.0.0
6
5
  platform: ruby
7
6
  authors:
8
7
  - Hongli Lai
9
8
  autorequire:
10
9
  bindir: bin
11
10
  cert_chain: []
12
- date: 2013-05-23 00:00:00.000000000 Z
13
- dependencies: []
11
+ date: 2014-01-08 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: activerecord
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ! '>='
18
+ - !ruby/object:Gem::Version
19
+ version: 3.2.0
20
+ - - <
21
+ - !ruby/object:Gem::Version
22
+ version: '5.0'
23
+ type: :runtime
24
+ prerelease: false
25
+ version_requirements: !ruby/object:Gem::Requirement
26
+ requirements:
27
+ - - ! '>='
28
+ - !ruby/object:Gem::Version
29
+ version: 3.2.0
30
+ - - <
31
+ - !ruby/object:Gem::Version
32
+ version: '5.0'
33
+ - !ruby/object:Gem::Dependency
34
+ name: railties
35
+ requirement: !ruby/object:Gem::Requirement
36
+ requirements:
37
+ - - ! '>='
38
+ - !ruby/object:Gem::Version
39
+ version: 3.2.0
40
+ - - <
41
+ - !ruby/object:Gem::Version
42
+ version: '5.0'
43
+ type: :development
44
+ prerelease: false
45
+ version_requirements: !ruby/object:Gem::Requirement
46
+ requirements:
47
+ - - ! '>='
48
+ - !ruby/object:Gem::Version
49
+ version: 3.2.0
50
+ - - <
51
+ - !ruby/object:Gem::Version
52
+ version: '5.0'
53
+ - !ruby/object:Gem::Dependency
54
+ name: minitest
55
+ requirement: !ruby/object:Gem::Requirement
56
+ requirements:
57
+ - - ! '>='
58
+ - !ruby/object:Gem::Version
59
+ version: '4.2'
60
+ type: :development
61
+ prerelease: false
62
+ version_requirements: !ruby/object:Gem::Requirement
63
+ requirements:
64
+ - - ! '>='
65
+ - !ruby/object:Gem::Version
66
+ version: '4.2'
14
67
  description: The default_value_for plugin allows one to define default values for
15
68
  ActiveRecord models in a declarative manner
16
69
  email: software-signing@phusion.nl
@@ -18,36 +71,35 @@ executables: []
18
71
  extensions: []
19
72
  extra_rdoc_files: []
20
73
  files:
21
- - default_value_for.gemspec
22
74
  - LICENSE.TXT
75
+ - README.md
23
76
  - Rakefile
24
- - README.rdoc
25
- - test.rb
77
+ - default_value_for.gemspec
26
78
  - init.rb
27
79
  - lib/default_value_for.rb
28
80
  - lib/default_value_for/railtie.rb
81
+ - test.rb
29
82
  homepage: https://github.com/FooBarWidget/default_value_for
30
83
  licenses: []
84
+ metadata: {}
31
85
  post_install_message:
32
86
  rdoc_options: []
33
87
  require_paths:
34
88
  - lib
35
89
  required_ruby_version: !ruby/object:Gem::Requirement
36
- none: false
37
90
  requirements:
38
91
  - - ! '>='
39
92
  - !ruby/object:Gem::Version
40
- version: '0'
93
+ version: 1.9.3
41
94
  required_rubygems_version: !ruby/object:Gem::Requirement
42
- none: false
43
95
  requirements:
44
96
  - - ! '>='
45
97
  - !ruby/object:Gem::Version
46
98
  version: '0'
47
99
  requirements: []
48
100
  rubyforge_project:
49
- rubygems_version: 1.8.25
101
+ rubygems_version: 2.2.0
50
102
  signing_key:
51
- specification_version: 3
103
+ specification_version: 4
52
104
  summary: Provides a way to specify default values for ActiveRecord models
53
105
  test_files: []