default_value_for 2.0.3 → 3.0.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/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: []