virtus 1.0.5 → 2.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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
- SHA1:
3
- metadata.gz: 1a85ace0a75695ebb65294da839a389e5349b660
4
- data.tar.gz: 2c8d5150758b6bab5ce1bb8484cdaff11d1fe581
2
+ SHA256:
3
+ metadata.gz: 51fade6650444cdaba10d9fee1ab99f7a5707ddacbdb9c08a734dc415c6a7af8
4
+ data.tar.gz: e8569ca6dc7f6b3bbbe6a00e1be51882dd3135b5e27ba218536f2409a3f495ec
5
5
  SHA512:
6
- metadata.gz: e92ffbfc9ee7b17c58253130ad0e5bdf45857618d04d64d5c8e58b0d3d156deac13d2cc44d3b628f08ec76cdc9bc8634aca2570e987de2cd64e07ffe21fb8d04
7
- data.tar.gz: 33db1e4a9040ce6d008062683a6eedcce3632b4854290a114795accad964233094d80f324d1b703487f6f14d6b1510e383dfce32bf7a341f9bf372d95fd37363
6
+ metadata.gz: 289ce0a7a1d1841d832df7644fe1aa4d0202dd906161fb3b3704d0823ea1adb113976e0320505d8ea9ed2e8d00beb97ba235def16c4760ec9f384ceff3a3cdaf
7
+ data.tar.gz: 7a0b0d652a88006bd1b5cd1e24157eb96700e788e6e2f6dc5e4d442f838a2fb59274f918aaab1ac93f042d0268bbd5bcee484e2e80cf2b3eeaacfb34f7448a00
data/.travis.yml CHANGED
@@ -1,22 +1,21 @@
1
+ sudo: false
1
2
  language: ruby
2
- before_install: gem install bundler
3
3
  bundler_args: --without tools
4
- script: "bundle exec rake spec"
5
- env:
6
- - CODECLIMATE_REPO_TOKEN=2b66fbb7c7c72503eb7841a479c0ad923f691729f4109b4aa8c9b4def1ebb42d
4
+ cache: bundler
7
5
  rvm:
8
- - 1.9
9
6
  - 2.0
10
7
  - 2.1
11
8
  - 2.2
9
+ - 2.3
10
+ - 2.4
11
+ - 2.5
12
+ - 2.6
13
+ - 2.7
14
+ - 3.0
12
15
  - jruby
13
- - rbx
14
- - ruby-head
15
- matrix:
16
- allow_failures:
17
- - rvm: ruby-head
18
- - rvm: rbx
19
- notifications:
20
- email:
21
- - piotr.solnica@gmail.com
22
- - dan.kubb@gmail.com
16
+ before_script:
17
+ - curl -L https://codeclimate.com/downloads/test-reporter/test-reporter-latest-linux-amd64 > ./cc-test-reporter
18
+ - chmod +x ./cc-test-reporter
19
+ - ./cc-test-reporter before-build
20
+ after_script:
21
+ - ./cc-test-reporter after-build --exit-code $TRAVIS_TEST_RESULT
data/Changelog.md CHANGED
@@ -1,3 +1,13 @@
1
+ # v2.0.0 2021-06-07
2
+
3
+ * [added] New method `Virtus::Atrribute::Collection#value_coerced?` (dslh)
4
+ * [changed] inflecto was replaced with dry-inflector (solnic)
5
+ * [changed] equalizer was replaced with the internal virtus/equalizer (solnic)
6
+ * [changed] `Virtus::Attribute#==` was revised (see ef57af319334a1d4f3e0860acbde7c6d6f0eb8ef) (novikserg)
7
+ * [fixed] Mass assignment bug fix (see #325) (novikserg)
8
+
9
+ [Compare v1.0.5..v2.0.0](https://github.com/solnic/virtus/compare/v1.0.5...v2.0.0)
10
+
1
11
  # v1.0.5 2015-03-18
2
12
 
3
13
  * [feature] Support for :nullify_blank option when configuring a virtus module (lucasmazza)
data/Gemfile CHANGED
@@ -2,20 +2,9 @@ source 'https://rubygems.org'
2
2
 
3
3
  gemspec
4
4
 
5
- gem 'bogus', '~> 0.1'
6
- gem 'inflecto', '~> 0.0.2'
7
- gem 'rspec', '~> 3.1'
5
+ gem 'dry-inflector'
6
+ gem 'rspec'
7
+ gem 'bogus'
8
+ gem 'simplecov', platform: :ruby
8
9
 
9
10
  gem "codeclimate-test-reporter", group: :test, require: false
10
-
11
- group :tools do
12
- gem 'guard'
13
- gem 'guard-rspec'
14
-
15
- gem 'rubocop'
16
-
17
- platform :mri do
18
- gem 'mutant'
19
- gem 'mutant-rspec'
20
- end
21
- end
data/README.md CHANGED
@@ -1,18 +1,21 @@
1
1
  [gem]: https://rubygems.org/gems/virtus
2
2
  [travis]: https://travis-ci.org/solnic/virtus
3
- [gemnasium]: https://gemnasium.com/solnic/virtus
4
3
  [codeclimate]: https://codeclimate.com/github/solnic/virtus
5
4
  [coveralls]: https://coveralls.io/r/solnic/virtus
6
5
  [inchpages]: http://inch-ci.org/github/solnic/virtus/
7
6
 
7
+ DISCONTINUED
8
+ ------------
9
+
10
+ > Working on virtus taught me a lot about handling data in Ruby, which involves coercions, type safety and validation (amongst other things). Even though the project has been successful, and serving well for many people, I decided to build something better. As a result, [dry-types](https://github.com/dry-rb/dry-types), [dry-struct](https://github.com/dry-rb/dry-struct) and [dry-schema](https://github.com/dry-rb/dry-schema) were born. These projects should be considered as virtus' successors, with better separation of concerns and better features. If you're interested in a modern take on same problems that virtus tried to solve, please check out these projects!
11
+ >
12
+ > @solnic
13
+
8
14
  Virtus
9
15
  ======
10
16
 
11
- # Ruby Object Mapper
12
-
13
17
  [![Gem Version](https://badge.fury.io/rb/virtus.svg)][gem]
14
18
  [![Build Status](https://travis-ci.org/solnic/virtus.svg?branch=master)][travis]
15
- [![Dependency Status](https://gemnasium.com/solnic/virtus.png)][gemnasium]
16
19
  [![Code Climate](https://codeclimate.com/github/solnic/virtus/badges/gpa.svg)][codeclimate]
17
20
  [![Test Coverage](https://codeclimate.com/github/solnic/virtus/badges/coverage.svg)][codeclimate]
18
21
  [![Inline docs](http://inch-ci.org/github/solnic/virtus.svg?branch=master)][inchpages]
@@ -61,7 +64,7 @@ class User
61
64
  end
62
65
 
63
66
  user = User.new(:name => 'Piotr', :age => 31)
64
- user.attributes # => { :name => "Piotr", :age => 31 }
67
+ user.attributes # => { :name => "Piotr", :age => 31, :birthday => nil }
65
68
 
66
69
  user.name # => "Piotr"
67
70
 
@@ -579,6 +582,13 @@ Blog.attribute_set[:posts].member_type.primitive # => Post
579
582
  Post.attribute_set[:blog].type.primitive # => Blog
580
583
  ```
581
584
 
585
+ ## Plugins / Extensions
586
+
587
+ List of plugins/extensions that add features to Virtus:
588
+
589
+ * [virtus-localized](https://github.com/XescuGC/virtus-localized): Localize the attributes
590
+ * [virtus-relations](https://github.com/smanolloff/virtus-relations): Add relations to Virtus objects
591
+
582
592
  Ruby version support
583
593
  --------------------
584
594
 
data/lib/virtus.rb CHANGED
@@ -207,6 +207,25 @@ module Virtus
207
207
  @configuration ||= Configuration.new
208
208
  end
209
209
 
210
+ # @api private
211
+ def self.constantize(type)
212
+ inflector.constantize(type)
213
+ end
214
+
215
+ # @api private
216
+ def self.inflector
217
+ @inflector ||=
218
+ begin
219
+ require 'dry/inflector'
220
+ Dry::Inflector.new
221
+ rescue LoadError
222
+ raise(
223
+ NotImplementedError,
224
+ 'Virtus needs dry-inflector gem to constantize namespaced constant names'
225
+ )
226
+ end
227
+ end
228
+
210
229
  # Finalize pending attributes
211
230
  #
212
231
  # @example
@@ -241,7 +260,6 @@ module Virtus
241
260
  end # module Virtus
242
261
 
243
262
  require 'descendants_tracker'
244
- require 'equalizer'
245
263
  require 'axiom-types'
246
264
  require 'coercible'
247
265
 
@@ -13,12 +13,12 @@ module Virtus
13
13
  # # strict mode
14
14
  # attr = Virtus::Attribute.build(Integer, :strict => true)
15
15
  # attr.coerce('not really coercible')
16
- # # => Virtus::CoercionError: Failed to coerce "fsafa" into Integer
16
+ # # => Virtus::CoercionError: Failed to coerce "not really coercible" into Integer
17
17
  #
18
18
  class Attribute
19
19
  extend DescendantsTracker, Options, TypeLookup
20
20
 
21
- include ::Equalizer.new(:type, :options)
21
+ include Equalizer.new(inspect) << :type << :options
22
22
 
23
23
  accept_options :primitive, :accessor, :default, :lazy, :strict, :required, :finalize, :nullify_blank
24
24
 
@@ -25,13 +25,7 @@ module Virtus
25
25
  # @api private
26
26
  def determine_type
27
27
  if type.include?('::')
28
- # TODO: wrap it up in Virtus.constantize and use feature-detection to
29
- # pick up either Inflecto or ActiveSupport, whateve is available
30
- if defined?(Inflecto)
31
- Inflecto.constantize(type)
32
- else
33
- raise NotImplementedError, 'Virtus needs inflecto gem to constantize namespaced constant names'
34
- end
28
+ Virtus.constantize(type)
35
29
  else
36
30
  Object.const_get(type)
37
31
  end
@@ -80,6 +80,11 @@ module Virtus
80
80
  end
81
81
  end
82
82
 
83
+ # @api public
84
+ def value_coerced?(value)
85
+ super && value.all? { |item| member_type.value_coerced? item }
86
+ end
87
+
83
88
  # @api private
84
89
  def finalize
85
90
  return self if finalized?
@@ -7,6 +7,8 @@ module Virtus
7
7
  class DefaultValue
8
8
  extend DescendantsTracker
9
9
 
10
+ include Equalizer.new(inspect) << :value
11
+
10
12
  # Builds a default value instance
11
13
  #
12
14
  # @return [Virtus::Attribute::DefaultValue]
@@ -120,11 +120,7 @@ module Virtus
120
120
 
121
121
  # @api private
122
122
  def extensions
123
- super + [
124
- Extensions::AllowedWriterMethods,
125
- ValueObject::AllowedWriterMethods,
126
- ValueObject::InstanceMethods
127
- ]
123
+ super << ValueObject::AllowedWriterMethods << ValueObject::InstanceMethods
128
124
  end
129
125
 
130
126
  # @api private
@@ -13,7 +13,6 @@ module Virtus
13
13
  def self.included(descendant)
14
14
  super
15
15
  descendant.extend(ClassMethods)
16
- descendant.extend(Extensions::AllowedWriterMethods)
17
16
  descendant.class_eval { include Methods }
18
17
  descendant.class_eval { include InstanceMethods }
19
18
  descendant.class_eval { include InstanceMethods::Constructor }
@@ -3,6 +3,7 @@ module Virtus
3
3
  # Abstract coercer class
4
4
  #
5
5
  class Coercer
6
+ include Equalizer.new(inspect) << :primitive << :type
6
7
 
7
8
  # @api private
8
9
  attr_reader :primitive, :type
@@ -18,7 +18,6 @@ module Virtus
18
18
  object.instance_eval do
19
19
  extend Methods
20
20
  extend InstanceMethods
21
- extend AllowedWriterMethods
22
21
  extend InstanceMethods::MassAssignment
23
22
  end
24
23
  end
@@ -72,26 +71,9 @@ module Virtus
72
71
  def values(&block)
73
72
  private :attributes= if instance_methods.include?(:attributes=)
74
73
  yield
75
- include(::Equalizer.new(*attribute_set.map(&:name)))
74
+ include(Equalizer.new(name, attribute_set.map(&:name)))
76
75
  end
77
76
 
78
- private
79
-
80
- # Return an attribute set for that instance
81
- #
82
- # @return [AttributeSet]
83
- #
84
- # @api private
85
- def attribute_set
86
- @attribute_set
87
- end
88
-
89
- end # Methods
90
-
91
- module AllowedWriterMethods
92
- WRITER_METHOD_REGEXP = /=\z/.freeze
93
- INVALID_WRITER_METHODS = %w[ == != === []= attributes= ].to_set.freeze
94
-
95
77
  # The list of writer methods that can be mass-assigned to in #attributes=
96
78
  #
97
79
  # @return [Set]
@@ -106,8 +88,18 @@ module Virtus
106
88
  end
107
89
  end
108
90
 
109
- end # AllowedWriterMethods
91
+ private
110
92
 
111
- end # module Extensions
93
+ # Return an attribute set for that instance
94
+ #
95
+ # @return [AttributeSet]
96
+ #
97
+ # @api private
98
+ def attribute_set
99
+ @attribute_set
100
+ end
112
101
 
102
+ end # Methods
103
+
104
+ end # module Extensions
113
105
  end # module Virtus
@@ -14,7 +14,7 @@ module Virtus
14
14
  #
15
15
  # @api private
16
16
  def initialize(attributes = nil)
17
- self.class.attribute_set.set(self, attributes) if attributes
17
+ attribute_set.set(self, attributes) if attributes
18
18
  set_default_attributes
19
19
  end
20
20
 
data/lib/virtus/model.rb CHANGED
@@ -31,7 +31,7 @@ module Virtus
31
31
  descendant.extend(Extensions::Methods)
32
32
  descendant.extend(InstanceMethods)
33
33
  end
34
- private_class_method :included
34
+ private_class_method :extended
35
35
 
36
36
  end # Core
37
37
 
@@ -51,7 +51,6 @@ module Virtus
51
51
  # @api private
52
52
  def self.included(descendant)
53
53
  super
54
- descendant.extend(Extensions::AllowedWriterMethods)
55
54
  descendant.send(:include, InstanceMethods::MassAssignment)
56
55
  end
57
56
  private_class_method :included
@@ -59,7 +58,6 @@ module Virtus
59
58
  # @api private
60
59
  def self.extended(descendant)
61
60
  super
62
- descendant.extend(Extensions::AllowedWriterMethods)
63
61
  descendant.extend(InstanceMethods::MassAssignment)
64
62
  end
65
63
  private_class_method :extended
@@ -37,7 +37,7 @@ module Virtus
37
37
  # Defines which options are valid for a given attribute class
38
38
  #
39
39
  # @example
40
- # class MyAttribute < Virtus::Attribute::Object
40
+ # class MyAttribute < Virtus::Attribute
41
41
  # accept_options :foo, :bar
42
42
  # end
43
43
  #
@@ -1,3 +1,3 @@
1
1
  module Virtus
2
- VERSION = '1.0.5'.freeze
2
+ VERSION = '2.0.0'.freeze
3
3
  end
@@ -0,0 +1,28 @@
1
+ require 'spec_helper'
2
+
3
+ describe "Adding attribute called 'attributes'" do
4
+
5
+ context "when mass assignment is disabled" do
6
+ before do
7
+ module Examples
8
+ class User
9
+ include Virtus.model(mass_assignment: false)
10
+
11
+ attribute :attributes
12
+ end
13
+ end
14
+ end
15
+
16
+ it "allows model to use `attributes` attribute" do
17
+ user = Examples::User.new
18
+ expect(user.attributes).to eq(nil)
19
+ user.attributes = "attributes string"
20
+ expect(user.attributes).to eq("attributes string")
21
+ end
22
+
23
+ it "doesn't accept `attributes` key in initializer" do
24
+ user = Examples::User.new(attributes: 'attributes string')
25
+ expect(user.attributes).to eq(nil)
26
+ end
27
+ end
28
+ end
data/spec/spec_helper.rb CHANGED
@@ -1,12 +1,11 @@
1
- if RUBY_ENGINE == "rbx"
2
- require "codeclimate-test-reporter"
3
- CodeClimate::TestReporter.start
1
+ if RUBY_ENGINE == 'ruby' && RUBY_VERSION >= '3.0'
2
+ require 'simplecov'
3
+ SimpleCov.start
4
4
  end
5
5
 
6
6
  require 'rspec'
7
7
  require 'bogus/rspec'
8
8
  require 'virtus'
9
- require 'inflecto' # for resolving namespaced constant names
10
9
 
11
10
  module Virtus
12
11
  def self.warn(*)
@@ -0,0 +1,31 @@
1
+ require 'spec_helper'
2
+ require 'set'
3
+
4
+ describe Virtus::Attribute::Collection, '#value_coerced?' do
5
+ subject { object.value_coerced?(input) }
6
+
7
+ let(:object) { described_class.build(Array[Integer]) }
8
+
9
+ context 'when input has correctly typed members' do
10
+ let(:input) { [1, 2, 3] }
11
+
12
+ it { is_expected.to be(true) }
13
+ end
14
+
15
+ context 'when input has incorrectly typed members' do
16
+ let(:input) { [1, 2, '3'] }
17
+
18
+ it { is_expected.to be(false) }
19
+ end
20
+
21
+ context 'when the collection type is incorrect' do
22
+ let(:input) { Set[1, 2, 3] }
23
+
24
+ it { is_expected.to be(false) }
25
+ end
26
+
27
+ context 'when the input is empty' do
28
+ let(:input) { [] }
29
+ it { is_expected.to be(true) }
30
+ end
31
+ end
@@ -0,0 +1,20 @@
1
+ require 'spec_helper'
2
+
3
+ describe Virtus::Attribute, '#== (defined by including Virtus::Equalizer)' do
4
+ let(:attribute) { described_class.build(String, :name => :name) }
5
+
6
+ it 'returns true when attributes have same type and options' do
7
+ equal_attribute = described_class.build(String, :name => :name)
8
+ expect(attribute == equal_attribute).to be_truthy
9
+ end
10
+
11
+ it 'returns false when attributes have different type' do
12
+ different_attribute = described_class.build(Integer, :name => :name)
13
+ expect(attribute == different_attribute).to be_falsey
14
+ end
15
+
16
+ it 'returns false when attributes have different options' do
17
+ different_attribute = described_class.build(Integer, :name => :name_two)
18
+ expect(attribute == different_attribute).to be_falsey
19
+ end
20
+ end
@@ -38,10 +38,10 @@ describe Virtus::AttributeSet, '#<<' do
38
38
 
39
39
  it { is_expected.to equal(object) }
40
40
 
41
- it 'replaces the original attribute' do
42
- expect { subject }.to change { object.to_a }.
43
- from(attributes).
44
- to([ attribute ])
41
+ it "replaces the original attribute object" do
42
+ expect { subject }.to change { object.to_a.map(&:__id__) }.
43
+ from(attributes.map(&:__id__)).
44
+ to([attribute.__id__])
45
45
  end
46
46
  end
47
47
  end
@@ -37,20 +37,28 @@ describe Virtus::AttributeSet, '#[]=' do
37
37
 
38
38
  it { is_expected.to equal(attribute) }
39
39
 
40
- it 'replaces the original attribute' do
41
- expect { subject }.to change { object.to_a }.from(attributes).to([ attribute ])
40
+ it "replaces the original attribute object" do
41
+ expect { subject }.to change { object.to_a.map(&:__id__) }.
42
+ from(attributes.map(&:__id__)).
43
+ to([attribute.__id__])
42
44
  end
43
45
 
44
- it 'allows #[] to access the attribute with a symbol' do
45
- expect { subject }.to change { object['name'] }.from(original).to(attribute)
46
+ it 'allows #[] to access the attribute with a string' do
47
+ expect { subject }.to change { object['name'].__id__ }.
48
+ from(original.__id__).
49
+ to(attribute.__id__)
46
50
  end
47
51
 
48
- it 'allows #[] to access the attribute with a string' do
49
- expect { subject }.to change { object[:name] }.from(original).to(attribute)
52
+ it 'allows #[] to access the attribute with a symbol' do
53
+ expect { subject }.to change { object[:name].__id__ }.
54
+ from(original.__id__).
55
+ to(attribute.__id__)
50
56
  end
51
57
 
52
58
  it 'allows #reset to track overridden attributes' do
53
- expect { subject }.to change { object.reset.to_a }.from(attributes).to([ attribute ])
59
+ expect { subject }.to change { object.reset.to_a.map(&:__id__) }.
60
+ from(attributes.map(&:__id__)).
61
+ to([attribute.__id__])
54
62
  end
55
63
  end
56
64
  end
@@ -21,12 +21,14 @@ describe Virtus::AttributeSet, '#merge' do
21
21
 
22
22
  context 'with a duplicate attribute' do
23
23
  let(:attributes) { [Virtus::Attribute.build(String, :name => name)] }
24
- let(:attribute) { Virtus::Attribute.build(String, :name => name) }
24
+ let(:attribute) { Virtus::Attribute.build(String, :name => name) }
25
25
 
26
26
  it { is_expected.to equal(object) }
27
27
 
28
- it 'replaces the original attribute' do
29
- expect { subject }.to change { object.to_a }.from(attributes).to([attribute])
28
+ it "replaces the original attribute object" do
29
+ expect { subject }.to change { object.to_a.map(&:__id__) }.
30
+ from(attributes.map(&:__id__)).
31
+ to([attribute.__id__])
30
32
  end
31
33
  end
32
34
  end
data/virtus.gemspec CHANGED
@@ -18,9 +18,9 @@ Gem::Specification.new do |gem|
18
18
  gem.extra_rdoc_files = %w[LICENSE README.md TODO.md]
19
19
 
20
20
  gem.add_dependency('descendants_tracker', '~> 0.0', '>= 0.0.3')
21
- gem.add_dependency('equalizer', '~> 0.0', '>= 0.0.9')
22
21
  gem.add_dependency('coercible', '~> 1.0')
23
22
  gem.add_dependency('axiom-types', '~> 0.1')
24
23
 
25
24
  gem.add_development_dependency 'rake'
25
+ gem.required_ruby_version = '>= 2.0'
26
26
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: virtus
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.5
4
+ version: 2.0.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Piotr Solnica
8
- autorequire:
8
+ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2015-03-18 00:00:00.000000000 Z
11
+ date: 2021-06-07 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: descendants_tracker
@@ -30,26 +30,6 @@ dependencies:
30
30
  - - ">="
31
31
  - !ruby/object:Gem::Version
32
32
  version: 0.0.3
33
- - !ruby/object:Gem::Dependency
34
- name: equalizer
35
- requirement: !ruby/object:Gem::Requirement
36
- requirements:
37
- - - "~>"
38
- - !ruby/object:Gem::Version
39
- version: '0.0'
40
- - - ">="
41
- - !ruby/object:Gem::Version
42
- version: 0.0.9
43
- type: :runtime
44
- prerelease: false
45
- version_requirements: !ruby/object:Gem::Requirement
46
- requirements:
47
- - - "~>"
48
- - !ruby/object:Gem::Version
49
- version: '0.0'
50
- - - ">="
51
- - !ruby/object:Gem::Version
52
- version: 0.0.9
53
33
  - !ruby/object:Gem::Dependency
54
34
  name: coercible
55
35
  requirement: !ruby/object:Gem::Requirement
@@ -106,7 +86,6 @@ files:
106
86
  - ".pelusa.yml"
107
87
  - ".rspec"
108
88
  - ".ruby-gemset"
109
- - ".ruby-version"
110
89
  - ".travis.yml"
111
90
  - ".yardopts"
112
91
  - CONTRIBUTING.md
@@ -151,6 +130,7 @@ files:
151
130
  - lib/virtus/support/type_lookup.rb
152
131
  - lib/virtus/value_object.rb
153
132
  - lib/virtus/version.rb
133
+ - spec/integration/attributes_attribute_spec.rb
154
134
  - spec/integration/building_module_spec.rb
155
135
  - spec/integration/collection_member_coercion_spec.rb
156
136
  - spec/integration/custom_attributes_spec.rb
@@ -183,6 +163,8 @@ files:
183
163
  - spec/unit/virtus/attribute/coercible_predicate_spec.rb
184
164
  - spec/unit/virtus/attribute/collection/class_methods/build_spec.rb
185
165
  - spec/unit/virtus/attribute/collection/coerce_spec.rb
166
+ - spec/unit/virtus/attribute/collection/value_coerced_predicate_spec.rb
167
+ - spec/unit/virtus/attribute/comparison_spec.rb
186
168
  - spec/unit/virtus/attribute/custom_collection_spec.rb
187
169
  - spec/unit/virtus/attribute/defined_spec.rb
188
170
  - spec/unit/virtus/attribute/embedded_value/class_methods/build_spec.rb
@@ -222,7 +204,7 @@ homepage: https://github.com/solnic/virtus
222
204
  licenses:
223
205
  - MIT
224
206
  metadata: {}
225
- post_install_message:
207
+ post_install_message:
226
208
  rdoc_options: []
227
209
  require_paths:
228
210
  - lib
@@ -230,16 +212,15 @@ required_ruby_version: !ruby/object:Gem::Requirement
230
212
  requirements:
231
213
  - - ">="
232
214
  - !ruby/object:Gem::Version
233
- version: '0'
215
+ version: '2.0'
234
216
  required_rubygems_version: !ruby/object:Gem::Requirement
235
217
  requirements:
236
218
  - - ">="
237
219
  - !ruby/object:Gem::Version
238
220
  version: '0'
239
221
  requirements: []
240
- rubyforge_project:
241
- rubygems_version: 2.4.5
242
- signing_key:
222
+ rubygems_version: 3.2.15
223
+ signing_key:
243
224
  specification_version: 4
244
225
  summary: Attributes on Steroids for Plain Old Ruby Objects
245
226
  test_files: []
data/.ruby-version DELETED
@@ -1 +0,0 @@
1
- 2.1