Hello community, here is the log from the commit of package rubygem-virtus for openSUSE:Factory checked in at 2015-03-23 12:18:16 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Comparing /work/SRC/openSUSE:Factory/rubygem-virtus (Old) and /work/SRC/openSUSE:Factory/.rubygem-virtus.new (New) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "rubygem-virtus" Changes: -------- --- /work/SRC/openSUSE:Factory/rubygem-virtus/rubygem-virtus.changes 2015-02-23 13:19:25.000000000 +0100 +++ /work/SRC/openSUSE:Factory/.rubygem-virtus.new/rubygem-virtus.changes 2015-03-23 12:18:17.000000000 +0100 @@ -1,0 +2,6 @@ +Fri Mar 20 20:13:17 UTC 2015 - [email protected] + +- updated to version 1.0.5 + * [feature] Support for :nullify_blank option when configuring a virtus module (lucasmazza) + +------------------------------------------------------------------- Old: ---- virtus-1.0.4.gem New: ---- virtus-1.0.5.gem ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ rubygem-virtus.spec ++++++ --- /var/tmp/diff_new_pack.khKZsY/_old 2015-03-23 12:18:18.000000000 +0100 +++ /var/tmp/diff_new_pack.khKZsY/_new 2015-03-23 12:18:18.000000000 +0100 @@ -24,7 +24,7 @@ # Name: rubygem-virtus -Version: 1.0.4 +Version: 1.0.5 Release: 0 %define mod_name virtus %define mod_full_name %{mod_name}-%{version} ++++++ virtus-1.0.4.gem -> virtus-1.0.5.gem ++++++ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/Changelog.md new/Changelog.md --- old/Changelog.md 2015-01-03 16:12:38.000000000 +0100 +++ new/Changelog.md 2015-03-18 12:49:02.000000000 +0100 @@ -1,3 +1,9 @@ +# v1.0.5 2015-03-18 + +* [feature] Support for :nullify_blank option when configuring a virtus module (lucasmazza) + +[Compare v1.0.4..v1.0.5](https://github.com/solnic/virtus/compare/v1.0.4...v1.0.5) + # v1.0.4 2015-01-03 * [feature] Support for :required option when configuring a virtus module (solnic) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/README.md new/README.md --- old/README.md 2015-01-03 16:12:38.000000000 +0100 +++ new/README.md 2015-03-18 12:49:02.000000000 +0100 @@ -10,7 +10,7 @@ # Ruby Object Mapper -[][gem] +[][gem] [][travis] [][gemnasium] [][codeclimate] @@ -60,12 +60,12 @@ attribute :birthday, DateTime end -user = User.new(:name => 'Piotr', :age => 29) -user.attributes # => { :name => "Piotr", :age => 29 } +user = User.new(:name => 'Piotr', :age => 31) +user.attributes # => { :name => "Piotr", :age => 31 } user.name # => "Piotr" -user.age = '29' # => 29 +user.age = '31' # => 31 user.age.class # => Fixnum user.birthday = 'November 18th, 1983' # => #<DateTime: 1983-11-18T00:00:00+00:00 (4891313/2,0/1,2299161)> @@ -508,6 +508,22 @@ User.new :admin => "can't really say if true or false" ``` +## Nullify Blank Strings Mode + +If you want to replace empty Strings with `nil` values (since they can't be +coerced into the expected type), you can use the `:nullify_blank` option. + +``` ruby +class User + include Virtus.model(:nullify_blank => true) + + attribute :birthday, Date +end + +User.new(:birthday => "").birthday # => nil +``` + + ## Building modules with custom configuration You can also build Virtus modules that contain their own configuration. Files old/checksums.yaml.gz and new/checksums.yaml.gz differ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/lib/virtus/attribute/builder.rb new/lib/virtus/attribute/builder.rb --- old/lib/virtus/attribute/builder.rb 2015-01-03 16:12:38.000000000 +0100 +++ new/lib/virtus/attribute/builder.rb 2015-03-18 12:49:02.000000000 +0100 @@ -160,10 +160,11 @@ def initialize_attribute @attribute = klass.new(type, options) - @attribute.extend(Accessor) if options[:name] - @attribute.extend(Coercible) if options[:coerce] - @attribute.extend(Strict) if options[:strict] - @attribute.extend(LazyDefault) if options[:lazy] + @attribute.extend(Accessor) if options[:name] + @attribute.extend(Coercible) if options[:coerce] + @attribute.extend(NullifyBlank) if options[:nullify_blank] + @attribute.extend(Strict) if options[:strict] + @attribute.extend(LazyDefault) if options[:lazy] @attribute.finalize if options[:finalize] end diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/lib/virtus/attribute/nullify_blank.rb new/lib/virtus/attribute/nullify_blank.rb --- old/lib/virtus/attribute/nullify_blank.rb 1970-01-01 01:00:00.000000000 +0100 +++ new/lib/virtus/attribute/nullify_blank.rb 2015-03-18 12:49:02.000000000 +0100 @@ -0,0 +1,24 @@ +module Virtus + class Attribute + + # Attribute extension which nullifies blank attributes when coercion failed + # + module NullifyBlank + + # @see [Attribute#coerce] + # + # @api public + def coerce(input) + output = super + + if !value_coerced?(output) && input.to_s.empty? + nil + else + output + end + end + + end # NullifyBlank + + end # Attribute +end # Virtus diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/lib/virtus/attribute.rb new/lib/virtus/attribute.rb --- old/lib/virtus/attribute.rb 2015-01-03 16:12:38.000000000 +0100 +++ new/lib/virtus/attribute.rb 2015-03-18 12:49:02.000000000 +0100 @@ -20,12 +20,13 @@ include ::Equalizer.new(:type, :options) - accept_options :primitive, :accessor, :default, :lazy, :strict, :required, :finalize + accept_options :primitive, :accessor, :default, :lazy, :strict, :required, :finalize, :nullify_blank strict false required true accessor :public finalize true + nullify_blank false # @see Virtus.coerce # @@ -176,6 +177,23 @@ kind_of?(Strict) end + # Return if the attribute is in the nullify blank coercion mode + # + # @example + # + # attr = Virtus::Attribute.build(String, :nullify_blank => true) + # attr.nullify_blank? # => true + # + # attr = Virtus::Attribute.build(String, :nullify_blank => false) + # attr.nullify_blank? # => false + # + # @return [Boolean] + # + # @api public + def nullify_blank? + kind_of?(NullifyBlank) + end + # Return if the attribute is accepts nil values as valid coercion output # # @example diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/lib/virtus/configuration.rb new/lib/virtus/configuration.rb --- old/lib/virtus/configuration.rb 2015-01-03 16:12:38.000000000 +0100 +++ new/lib/virtus/configuration.rb 2015-03-18 12:49:02.000000000 +0100 @@ -12,6 +12,9 @@ # Access the strict setting for this instance attr_accessor :strict + # Access the nullify_blank setting for this instance + attr_accessor :nullify_blank + # Access the required setting for this instance attr_accessor :required @@ -30,6 +33,7 @@ @finalize = options.fetch(:finalize, true) @coerce = options.fetch(:coerce, true) @strict = options.fetch(:strict, false) + @nullify_blank = options.fetch(:nullify_blank, false) @required = options.fetch(:required, true) @constructor = options.fetch(:constructor, true) @mass_assignment = options.fetch(:mass_assignment, true) @@ -59,6 +63,7 @@ { :coerce => coerce, :finalize => finalize, :strict => strict, + :nullify_blank => nullify_blank, :required => required, :configured_coercer => coercer }.freeze end diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/lib/virtus/version.rb new/lib/virtus/version.rb --- old/lib/virtus/version.rb 2015-01-03 16:12:38.000000000 +0100 +++ new/lib/virtus/version.rb 2015-03-18 12:49:02.000000000 +0100 @@ -1,3 +1,3 @@ module Virtus - VERSION = '1.0.4'.freeze + VERSION = '1.0.5'.freeze end diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/lib/virtus.rb new/lib/virtus.rb --- old/lib/virtus.rb 2015-01-03 16:12:38.000000000 +0100 +++ new/lib/virtus.rb 2015-03-18 12:49:02.000000000 +0100 @@ -279,6 +279,7 @@ require 'virtus/attribute/coercible' require 'virtus/attribute/strict' require 'virtus/attribute/lazy_default' +require 'virtus/attribute/nullify_blank' require 'virtus/attribute/boolean' require 'virtus/attribute/collection' diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/metadata new/metadata --- old/metadata 2015-01-03 16:12:38.000000000 +0100 +++ new/metadata 2015-03-18 12:49:02.000000000 +0100 @@ -1,14 +1,14 @@ --- !ruby/object:Gem::Specification name: virtus version: !ruby/object:Gem::Version - version: 1.0.4 + version: 1.0.5 platform: ruby authors: - Piotr Solnica autorequire: bindir: bin cert_chain: [] -date: 2015-01-03 00:00:00.000000000 Z +date: 2015-03-18 00:00:00.000000000 Z dependencies: - !ruby/object:Gem::Dependency name: descendants_tracker @@ -132,6 +132,7 @@ - lib/virtus/attribute/embedded_value.rb - lib/virtus/attribute/hash.rb - lib/virtus/attribute/lazy_default.rb +- lib/virtus/attribute/nullify_blank.rb - lib/virtus/attribute/strict.rb - lib/virtus/attribute_set.rb - lib/virtus/builder.rb @@ -237,9 +238,8 @@ version: '0' requirements: [] rubyforge_project: -rubygems_version: 2.2.2 +rubygems_version: 2.4.5 signing_key: specification_version: 4 summary: Attributes on Steroids for Plain Old Ruby Objects test_files: [] -has_rdoc: diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/spec/integration/building_module_spec.rb new/spec/integration/building_module_spec.rb --- old/spec/integration/building_module_spec.rb 2015-01-03 16:12:38.000000000 +0100 +++ new/spec/integration/building_module_spec.rb 2015-03-18 12:49:02.000000000 +0100 @@ -19,6 +19,10 @@ config.strict = true } + BlankModule = Virtus.model { |config| + config.nullify_blank = true + } + class NoncoercedUser include NoncoercingModule @@ -39,6 +43,13 @@ attribute :stuff, Hash attribute :happy, Boolean, :strict => false end + + class BlankModel + include BlankModule + + attribute :stuff, Hash + attribute :happy, Boolean, :nullify_blank => false + end end end @@ -63,6 +74,17 @@ model.happy = 'foo' + expect(model.happy).to eql('foo') + end + + specify 'including a custom module with nullify blank enabled' do + model = Examples::BlankModel.new + + model.stuff = '' + expect(model.stuff).to be_nil + + model.happy = 'foo' + expect(model.happy).to eql('foo') end end diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/spec/unit/virtus/attribute/class_methods/build_spec.rb new/spec/unit/virtus/attribute/class_methods/build_spec.rb --- old/spec/unit/virtus/attribute/class_methods/build_spec.rb 2015-01-03 16:12:38.000000000 +0100 +++ new/spec/unit/virtus/attribute/class_methods/build_spec.rb 2015-03-18 12:49:02.000000000 +0100 @@ -78,6 +78,14 @@ it { is_expected.to be_strict } end + context 'when options specify nullify blank mode' do + let(:options) { { :nullify_blank => true } } + + it_behaves_like 'a valid attribute instance' + + it { is_expected.to be_nullify_blank } + end + context 'when type is a string' do let(:type) { 'Integer' } diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/spec/unit/virtus/attribute/coerce_spec.rb new/spec/unit/virtus/attribute/coerce_spec.rb --- old/spec/unit/virtus/attribute/coerce_spec.rb 2015-01-03 16:12:38.000000000 +0100 +++ new/spec/unit/virtus/attribute/coerce_spec.rb 2015-03-18 12:49:02.000000000 +0100 @@ -7,10 +7,11 @@ let(:object) { described_class.build(String, - :coercer => coercer, :strict => strict, :required => required) + :coercer => coercer, :strict => strict, :required => required, :nullify_blank => nullify_blank) } let(:required) { true } + let(:nullify_blank) { false } let(:input) { 1 } let(:output) { '1' } @@ -78,4 +79,51 @@ expect(coercer).to have_received.success?(String, input) end end + + context 'when the input is an empty String' do + let(:input) { '' } + let(:output) { '' } + + context 'when nullify_blank is turned on' do + let(:nullify_blank) { true } + let(:strict) { false } + let(:require) { false } + + it 'returns nil' do + mock(coercer).call(input) { input } + mock(coercer).success?(String, input) { false } + + expect(subject).to be_nil + + expect(coercer).to have_received.call(input) + expect(coercer).to have_received.success?(String, input) + end + + it 'returns the ouput if it was coerced' do + mock(coercer).call(input) { output } + mock(coercer).success?(String, output) { true } + + expect(subject).to be(output) + + expect(coercer).to have_received.call(input) + expect(coercer).to have_received.success?(String, output) + end + end + + context 'when both nullify_blank and strict are turned on' do + let(:nullify_blank) { true } + let(:strict) { true } + + it 'does not raises an coercion error' do + mock(coercer).call(input) { input } + mock(coercer).success?(String, input) { false } + + expect { subject }.not_to raise_error + expect(subject).to be_nil + + expect(coercer).to have_received.call(input) + expect(coercer).to have_received.success?(String, input) + end + end + end end -- To unsubscribe, e-mail: [email protected] For additional commands, e-mail: [email protected]
