virtus 1.0.2 → 1.0.3
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/.ruby-version +1 -1
- data/.travis.yml +2 -2
- data/Changelog.md +11 -0
- data/Gemfile +4 -2
- data/Gemfile.devtools +25 -19
- data/README.md +56 -4
- data/lib/virtus.rb +26 -5
- data/lib/virtus/attribute/builder.rb +2 -2
- data/lib/virtus/attribute/collection.rb +7 -3
- data/lib/virtus/attribute/hash.rb +3 -3
- data/lib/virtus/attribute/strict.rb +1 -1
- data/lib/virtus/builder.rb +1 -1
- data/lib/virtus/configuration.rb +7 -36
- data/lib/virtus/instance_methods.rb +1 -0
- data/lib/virtus/module_extensions.rb +8 -2
- data/lib/virtus/support/options.rb +1 -0
- data/lib/virtus/support/type_lookup.rb +1 -1
- data/lib/virtus/version.rb +1 -1
- data/spec/integration/custom_attributes_spec.rb +2 -2
- data/spec/integration/custom_collection_attributes_spec.rb +6 -6
- data/spec/integration/default_values_spec.rb +8 -8
- data/spec/integration/defining_attributes_spec.rb +25 -18
- data/spec/integration/embedded_value_spec.rb +5 -5
- data/spec/integration/extending_objects_spec.rb +5 -5
- data/spec/integration/hash_attributes_coercion_spec.rb +11 -7
- data/spec/integration/mass_assignment_with_accessors_spec.rb +5 -5
- data/spec/integration/overriding_virtus_spec.rb +4 -4
- data/spec/integration/required_attributes_spec.rb +1 -1
- data/spec/integration/struct_as_embedded_value_spec.rb +4 -4
- data/spec/integration/using_modules_spec.rb +8 -8
- data/spec/integration/value_object_with_custom_constructor_spec.rb +4 -4
- data/spec/integration/virtus/instance_level_attributes_spec.rb +1 -1
- data/spec/integration/virtus/value_object_spec.rb +14 -14
- data/spec/shared/freeze_method_behavior.rb +1 -1
- data/spec/spec_helper.rb +1 -0
- data/spec/unit/virtus/attribute/class_methods/build_spec.rb +9 -1
- data/spec/unit/virtus/attribute/collection/class_methods/build_spec.rb +13 -2
- data/spec/unit/virtus/attribute/collection/coerce_spec.rb +21 -0
- data/spec/unit/virtus/attribute/hash/class_methods/build_spec.rb +14 -2
- data/spec/unit/virtus/attribute_set/each_spec.rb +21 -16
- data/spec/unit/virtus/attribute_set/element_reference_spec.rb +1 -1
- data/spec/unit/virtus/attribute_set/reset_spec.rb +5 -3
- data/spec/unit/virtus/attribute_spec.rb +4 -3
- data/spec/unit/virtus/attributes_reader_spec.rb +1 -1
- data/spec/unit/virtus/attributes_writer_spec.rb +1 -1
- data/spec/unit/virtus/model_spec.rb +3 -3
- data/spec/unit/virtus/module_spec.rb +59 -2
- data/spec/unit/virtus/value_object_spec.rb +2 -2
- data/virtus.gemspec +2 -2
- metadata +34 -32
data/spec/spec_helper.rb
CHANGED
@@ -7,7 +7,7 @@ describe Virtus::Attribute, '.build' do
|
|
7
7
|
let(:type) { String }
|
8
8
|
let(:options) { {} }
|
9
9
|
|
10
|
-
|
10
|
+
shared_examples_for 'a valid attribute instance' do
|
11
11
|
it { should be_instance_of(Virtus::Attribute) }
|
12
12
|
|
13
13
|
it { should be_frozen }
|
@@ -83,6 +83,14 @@ describe Virtus::Attribute, '.build' do
|
|
83
83
|
its(:type) { should be(Axiom::Types::Integer) }
|
84
84
|
end
|
85
85
|
|
86
|
+
context 'when type is a range' do
|
87
|
+
let(:type) { 0..10 }
|
88
|
+
|
89
|
+
it_behaves_like 'a valid attribute instance'
|
90
|
+
|
91
|
+
its(:type) { should be(Axiom::Types.infer(Range)) }
|
92
|
+
end
|
93
|
+
|
86
94
|
context 'when type is a symbol of an existing class constant' do
|
87
95
|
let(:type) { :String }
|
88
96
|
|
@@ -1,9 +1,11 @@
|
|
1
1
|
require 'spec_helper'
|
2
2
|
|
3
3
|
describe Virtus::Attribute, '.build' do
|
4
|
-
subject { described_class.build(type) }
|
4
|
+
subject { described_class.build(type, options) }
|
5
5
|
|
6
|
-
|
6
|
+
let(:options) { {} }
|
7
|
+
|
8
|
+
shared_examples_for 'a valid collection attribute instance' do
|
7
9
|
it { should be_instance_of(Virtus::Attribute::Collection) }
|
8
10
|
|
9
11
|
it { should be_frozen }
|
@@ -91,4 +93,13 @@ describe Virtus::Attribute, '.build' do
|
|
91
93
|
expect(subject.type.member_type).to be(Axiom::Types::String)
|
92
94
|
end
|
93
95
|
end
|
96
|
+
|
97
|
+
context 'when strict mode is used' do
|
98
|
+
let(:type) { Array[String] }
|
99
|
+
let(:options) { { strict: true } }
|
100
|
+
|
101
|
+
it 'sets strict mode for member type' do
|
102
|
+
expect(subject.member_type).to be_strict
|
103
|
+
end
|
104
|
+
end
|
94
105
|
end
|
@@ -50,4 +50,25 @@ describe Virtus::Attribute::Collection, '#coerce' do
|
|
50
50
|
end
|
51
51
|
end
|
52
52
|
end
|
53
|
+
|
54
|
+
context 'when input is nil' do
|
55
|
+
let(:input) { nil }
|
56
|
+
|
57
|
+
fake(:coercer) { Virtus::Attribute::Coercer }
|
58
|
+
fake(:member_type) { Virtus::Attribute }
|
59
|
+
|
60
|
+
let(:member_primitive) { Integer }
|
61
|
+
|
62
|
+
let(:object) {
|
63
|
+
described_class.build(
|
64
|
+
Array[member_primitive], coercer: coercer, member_type: member_type
|
65
|
+
)
|
66
|
+
}
|
67
|
+
|
68
|
+
it 'returns nil' do
|
69
|
+
stub(coercer).call(input) { input }
|
70
|
+
|
71
|
+
expect(subject).to be(input)
|
72
|
+
end
|
73
|
+
end
|
53
74
|
end
|
@@ -1,9 +1,11 @@
|
|
1
1
|
require 'spec_helper'
|
2
2
|
|
3
3
|
describe Virtus::Attribute::Hash, '.build' do
|
4
|
-
subject { described_class.build(type) }
|
4
|
+
subject { described_class.build(type, options) }
|
5
5
|
|
6
|
-
|
6
|
+
let(:options) { {} }
|
7
|
+
|
8
|
+
shared_examples_for 'a valid hash attribute instance' do
|
7
9
|
it { should be_instance_of(Virtus::Attribute::Hash) }
|
8
10
|
|
9
11
|
it { should be_frozen }
|
@@ -91,4 +93,14 @@ describe Virtus::Attribute::Hash, '.build' do
|
|
91
93
|
)
|
92
94
|
end
|
93
95
|
end
|
96
|
+
|
97
|
+
context 'when strict mode is used' do
|
98
|
+
let(:type) { Hash[String => Integer] }
|
99
|
+
let(:options) { { :strict => true } }
|
100
|
+
|
101
|
+
it 'sets the strict mode for key/value types' do
|
102
|
+
expect(subject.key_type).to be_strict
|
103
|
+
expect(subject.value_type).to be_strict
|
104
|
+
end
|
105
|
+
end
|
94
106
|
end
|
@@ -1,28 +1,31 @@
|
|
1
1
|
require 'spec_helper'
|
2
2
|
|
3
3
|
describe Virtus::AttributeSet, '#each' do
|
4
|
-
|
4
|
+
subject(:attribute_set) { described_class.new(parent, attributes) }
|
5
|
+
|
6
|
+
let(:name) { :name }
|
5
7
|
let(:attribute) { Virtus::Attribute.build(String, :name => :name) }
|
6
|
-
let(:attributes) { [ attribute ]
|
7
|
-
let(:parent) { described_class.new
|
8
|
-
let(:
|
9
|
-
let(:yields) { Set[] }
|
8
|
+
let(:attributes) { [ attribute ] }
|
9
|
+
let(:parent) { described_class.new }
|
10
|
+
let(:yields) { Set[] }
|
10
11
|
|
11
12
|
context 'with no block' do
|
12
|
-
|
13
|
-
|
14
|
-
|
13
|
+
it 'returns an enumerator when block is not provided' do
|
14
|
+
expect(attribute_set.each).to be_kind_of(Enumerator)
|
15
|
+
end
|
15
16
|
|
16
17
|
it 'yields the expected attributes' do
|
17
|
-
|
18
|
+
result = []
|
19
|
+
attribute_set.each { |attribute| result << attribute }
|
20
|
+
expect(result).to eql(attributes)
|
18
21
|
end
|
19
22
|
end
|
20
23
|
|
21
24
|
context 'with a block' do
|
22
|
-
subject {
|
25
|
+
subject { attribute_set.each { |attribute| yields << attribute } }
|
23
26
|
|
24
27
|
context 'when the parent has no attributes' do
|
25
|
-
it { should equal(
|
28
|
+
it { should equal(attribute_set) }
|
26
29
|
|
27
30
|
it 'yields the expected attributes' do
|
28
31
|
expect { subject }.to change { yields.dup }.
|
@@ -35,12 +38,14 @@ describe Virtus::AttributeSet, '#each' do
|
|
35
38
|
let(:parent_attribute) { Virtus::Attribute.build(String, :name => :parent_name) }
|
36
39
|
let(:parent) { described_class.new([ parent_attribute ]) }
|
37
40
|
|
38
|
-
it { should equal(
|
41
|
+
it { should equal(attribute_set) }
|
39
42
|
|
40
43
|
it 'yields the expected attributes' do
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
+
result = []
|
45
|
+
|
46
|
+
attribute_set.each { |attribute| result << attribute }
|
47
|
+
|
48
|
+
expect(result).to eql([parent_attribute, attribute])
|
44
49
|
end
|
45
50
|
end
|
46
51
|
|
@@ -48,7 +53,7 @@ describe Virtus::AttributeSet, '#each' do
|
|
48
53
|
let(:parent_attribute) { Virtus::Attribute.build(String, :name => name) }
|
49
54
|
let(:parent) { described_class.new([ parent_attribute ]) }
|
50
55
|
|
51
|
-
it { should equal(
|
56
|
+
it { should equal(attribute_set) }
|
52
57
|
|
53
58
|
it 'yields the expected attributes' do
|
54
59
|
expect { subject }.to change { yields.dup }.
|
@@ -12,6 +12,6 @@ describe Virtus::AttributeSet, '#[]' do
|
|
12
12
|
it { should equal(attribute) }
|
13
13
|
|
14
14
|
it 'allows indexed access to attributes by the string representation of their name' do
|
15
|
-
object[name.to_s].
|
15
|
+
expect(object[name.to_s]).to equal(attribute)
|
16
16
|
end
|
17
17
|
end
|
@@ -42,9 +42,11 @@ describe Virtus::AttributeSet, '#reset' do
|
|
42
42
|
it { should equal(object) }
|
43
43
|
|
44
44
|
it 'includes changes from the parent' do
|
45
|
-
expect
|
46
|
-
|
47
|
-
|
45
|
+
expect(object.to_set).to eql(Set[attribute, parent_attribute])
|
46
|
+
|
47
|
+
parent << new_attribute
|
48
|
+
|
49
|
+
expect(subject.to_set).to eql(Set[attribute, new_attribute])
|
48
50
|
end
|
49
51
|
end
|
50
52
|
|
@@ -4,14 +4,15 @@ describe Virtus, '#attribute' do
|
|
4
4
|
let(:name) { :test }
|
5
5
|
let(:options) { {} }
|
6
6
|
|
7
|
-
|
7
|
+
shared_examples_for 'a class with boolean attribute' do
|
8
8
|
subject { Test }
|
9
9
|
|
10
10
|
let(:object) { subject.new }
|
11
11
|
|
12
12
|
it 'defines reader and writer' do
|
13
13
|
object.test = true
|
14
|
-
|
14
|
+
|
15
|
+
expect(object).to be_test
|
15
16
|
end
|
16
17
|
|
17
18
|
it 'defines predicate method' do
|
@@ -21,7 +22,7 @@ describe Virtus, '#attribute' do
|
|
21
22
|
end
|
22
23
|
end
|
23
24
|
|
24
|
-
|
25
|
+
shared_examples_for 'an object with string attribute' do
|
25
26
|
it { should respond_to(:test) }
|
26
27
|
it { should respond_to(:test=) }
|
27
28
|
|
@@ -1,14 +1,14 @@
|
|
1
1
|
require 'spec_helper'
|
2
2
|
|
3
3
|
describe Virtus, '.model' do
|
4
|
-
|
4
|
+
shared_examples_for 'a model with constructor' do
|
5
5
|
it 'accepts attribute hash' do
|
6
6
|
instance = subject.new(:name => 'Jane')
|
7
7
|
expect(instance.name).to eql('Jane')
|
8
8
|
end
|
9
9
|
end
|
10
10
|
|
11
|
-
|
11
|
+
shared_examples_for 'a model with mass-assignment' do
|
12
12
|
let(:attributes) do
|
13
13
|
{ :name => 'Jane', :something => nil }
|
14
14
|
end
|
@@ -22,7 +22,7 @@ describe Virtus, '.model' do
|
|
22
22
|
end
|
23
23
|
end
|
24
24
|
|
25
|
-
|
25
|
+
shared_examples_for 'a model with strict mode turned off' do
|
26
26
|
it 'has attributes with strict set to false' do
|
27
27
|
expect(subject.send(:attribute_set)[:name]).to_not be_strict
|
28
28
|
end
|
@@ -1,14 +1,14 @@
|
|
1
1
|
require 'spec_helper'
|
2
2
|
|
3
3
|
describe Virtus, '.module' do
|
4
|
-
|
4
|
+
shared_examples_for 'a valid virtus object' do
|
5
5
|
it 'reads and writes attribute' do
|
6
6
|
instance.name = 'John'
|
7
7
|
expect(instance.name).to eql('John')
|
8
8
|
end
|
9
9
|
end
|
10
10
|
|
11
|
-
|
11
|
+
shared_examples_for 'an object extended with virtus module' do
|
12
12
|
context 'with default configuration' do
|
13
13
|
subject { Virtus.module }
|
14
14
|
|
@@ -114,4 +114,61 @@ describe Virtus, '.module' do
|
|
114
114
|
end
|
115
115
|
end
|
116
116
|
|
117
|
+
context 'as a peer to another module within a class' do
|
118
|
+
subject { Virtus.module }
|
119
|
+
let(:other) { Module.new }
|
120
|
+
|
121
|
+
before do
|
122
|
+
other.send(:include, Virtus.module)
|
123
|
+
other.attribute :last_name, String, :default => 'Doe'
|
124
|
+
other.attribute :something_else
|
125
|
+
model.send(:include, mod)
|
126
|
+
model.send(:include, other)
|
127
|
+
end
|
128
|
+
|
129
|
+
it 'provides attributes for the model from both modules' do
|
130
|
+
expect(model.attribute_set[:name]).to be_kind_of(Virtus::Attribute)
|
131
|
+
expect(model.attribute_set[:something]).to be_kind_of(Virtus::Attribute)
|
132
|
+
expect(model.attribute_set[:last_name]).to be_kind_of(Virtus::Attribute)
|
133
|
+
expect(model.attribute_set[:something_else]).to be_kind_of(Virtus::Attribute)
|
134
|
+
end
|
135
|
+
|
136
|
+
it 'includes the attributes from both modules' do
|
137
|
+
expect(model.new.attributes.keys).to eq(
|
138
|
+
[:name, :something, :last_name, :something_else]
|
139
|
+
)
|
140
|
+
end
|
141
|
+
end
|
142
|
+
|
143
|
+
context 'with multiple other modules mixed into it' do
|
144
|
+
subject { Virtus.module }
|
145
|
+
let(:other) { Module.new }
|
146
|
+
let(:yet_another) { Module.new }
|
147
|
+
|
148
|
+
before do
|
149
|
+
other.send(:include, Virtus.module)
|
150
|
+
other.attribute :last_name, String, :default => 'Doe'
|
151
|
+
other.attribute :something_else
|
152
|
+
yet_another.send(:include, Virtus.module)
|
153
|
+
yet_another.send(:include, mod)
|
154
|
+
yet_another.send(:include, other)
|
155
|
+
yet_another.attribute :middle_name, String, :default => 'Foobar'
|
156
|
+
model.send(:include, yet_another)
|
157
|
+
end
|
158
|
+
|
159
|
+
it 'provides attributes for the model from all modules' do
|
160
|
+
expect(model.attribute_set[:name]).to be_kind_of(Virtus::Attribute)
|
161
|
+
expect(model.attribute_set[:something]).to be_kind_of(Virtus::Attribute)
|
162
|
+
expect(model.attribute_set[:last_name]).to be_kind_of(Virtus::Attribute)
|
163
|
+
expect(model.attribute_set[:something_else]).to be_kind_of(Virtus::Attribute)
|
164
|
+
expect(model.attribute_set[:middle_name]).to be_kind_of(Virtus::Attribute)
|
165
|
+
end
|
166
|
+
|
167
|
+
it 'includes the attributes from all modules' do
|
168
|
+
expect(model.new.attributes.keys).to eq(
|
169
|
+
[:name, :something, :last_name, :something_else, :middle_name]
|
170
|
+
)
|
171
|
+
end
|
172
|
+
end
|
173
|
+
|
117
174
|
end
|
@@ -1,7 +1,7 @@
|
|
1
1
|
require 'spec_helper'
|
2
2
|
|
3
3
|
describe Virtus::ValueObject do
|
4
|
-
|
4
|
+
shared_examples_for 'a valid value object' do
|
5
5
|
subject { model.new(attributes) }
|
6
6
|
|
7
7
|
let(:attributes) { Hash[:id => 1, :name => 'Jane Doe'] }
|
@@ -43,7 +43,7 @@ describe Virtus::ValueObject do
|
|
43
43
|
end
|
44
44
|
end
|
45
45
|
|
46
|
-
|
46
|
+
shared_examples_for 'a valid value object with mass-assignment turned on' do
|
47
47
|
subject { model.new }
|
48
48
|
|
49
49
|
it 'disallows mass-assignment' do
|
data/virtus.gemspec
CHANGED
@@ -17,8 +17,8 @@ Gem::Specification.new do |gem|
|
|
17
17
|
gem.test_files = `git ls-files -- {spec}/*`.split("\n")
|
18
18
|
gem.extra_rdoc_files = %w[LICENSE README.md TODO.md]
|
19
19
|
|
20
|
-
gem.add_dependency('descendants_tracker', '~> 0.0.3')
|
21
|
-
gem.add_dependency('equalizer', '~> 0.0.9')
|
20
|
+
gem.add_dependency('descendants_tracker', '~> 0.0', '>= 0.0.3')
|
21
|
+
gem.add_dependency('equalizer', '~> 0.0', '>= 0.0.9')
|
22
22
|
gem.add_dependency('coercible', '~> 1.0')
|
23
23
|
gem.add_dependency('axiom-types', '~> 0.1')
|
24
24
|
end
|
metadata
CHANGED
@@ -1,78 +1,81 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: virtus
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.0.
|
5
|
-
prerelease:
|
4
|
+
version: 1.0.3
|
6
5
|
platform: ruby
|
7
6
|
authors:
|
8
7
|
- Piotr Solnica
|
9
8
|
autorequire:
|
10
9
|
bindir: bin
|
11
10
|
cert_chain: []
|
12
|
-
date: 2014-
|
11
|
+
date: 2014-07-24 00:00:00.000000000 Z
|
13
12
|
dependencies:
|
14
13
|
- !ruby/object:Gem::Dependency
|
15
14
|
name: descendants_tracker
|
16
15
|
requirement: !ruby/object:Gem::Requirement
|
17
|
-
none: false
|
18
16
|
requirements:
|
19
|
-
- - ~>
|
17
|
+
- - "~>"
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '0.0'
|
20
|
+
- - ">="
|
20
21
|
- !ruby/object:Gem::Version
|
21
22
|
version: 0.0.3
|
22
23
|
type: :runtime
|
23
24
|
prerelease: false
|
24
25
|
version_requirements: !ruby/object:Gem::Requirement
|
25
|
-
none: false
|
26
26
|
requirements:
|
27
|
-
- - ~>
|
27
|
+
- - "~>"
|
28
|
+
- !ruby/object:Gem::Version
|
29
|
+
version: '0.0'
|
30
|
+
- - ">="
|
28
31
|
- !ruby/object:Gem::Version
|
29
32
|
version: 0.0.3
|
30
33
|
- !ruby/object:Gem::Dependency
|
31
34
|
name: equalizer
|
32
35
|
requirement: !ruby/object:Gem::Requirement
|
33
|
-
none: false
|
34
36
|
requirements:
|
35
|
-
- - ~>
|
37
|
+
- - "~>"
|
38
|
+
- !ruby/object:Gem::Version
|
39
|
+
version: '0.0'
|
40
|
+
- - ">="
|
36
41
|
- !ruby/object:Gem::Version
|
37
42
|
version: 0.0.9
|
38
43
|
type: :runtime
|
39
44
|
prerelease: false
|
40
45
|
version_requirements: !ruby/object:Gem::Requirement
|
41
|
-
none: false
|
42
46
|
requirements:
|
43
|
-
- - ~>
|
47
|
+
- - "~>"
|
48
|
+
- !ruby/object:Gem::Version
|
49
|
+
version: '0.0'
|
50
|
+
- - ">="
|
44
51
|
- !ruby/object:Gem::Version
|
45
52
|
version: 0.0.9
|
46
53
|
- !ruby/object:Gem::Dependency
|
47
54
|
name: coercible
|
48
55
|
requirement: !ruby/object:Gem::Requirement
|
49
|
-
none: false
|
50
56
|
requirements:
|
51
|
-
- - ~>
|
57
|
+
- - "~>"
|
52
58
|
- !ruby/object:Gem::Version
|
53
59
|
version: '1.0'
|
54
60
|
type: :runtime
|
55
61
|
prerelease: false
|
56
62
|
version_requirements: !ruby/object:Gem::Requirement
|
57
|
-
none: false
|
58
63
|
requirements:
|
59
|
-
- - ~>
|
64
|
+
- - "~>"
|
60
65
|
- !ruby/object:Gem::Version
|
61
66
|
version: '1.0'
|
62
67
|
- !ruby/object:Gem::Dependency
|
63
68
|
name: axiom-types
|
64
69
|
requirement: !ruby/object:Gem::Requirement
|
65
|
-
none: false
|
66
70
|
requirements:
|
67
|
-
- - ~>
|
71
|
+
- - "~>"
|
68
72
|
- !ruby/object:Gem::Version
|
69
73
|
version: '0.1'
|
70
74
|
type: :runtime
|
71
75
|
prerelease: false
|
72
76
|
version_requirements: !ruby/object:Gem::Requirement
|
73
|
-
none: false
|
74
77
|
requirements:
|
75
|
-
- - ~>
|
78
|
+
- - "~>"
|
76
79
|
- !ruby/object:Gem::Version
|
77
80
|
version: '0.1'
|
78
81
|
description: Attributes on Steroids for Plain Old Ruby Objects
|
@@ -85,13 +88,13 @@ extra_rdoc_files:
|
|
85
88
|
- README.md
|
86
89
|
- TODO.md
|
87
90
|
files:
|
88
|
-
- .gitignore
|
89
|
-
- .pelusa.yml
|
90
|
-
- .rspec
|
91
|
-
- .ruby-gemset
|
92
|
-
- .ruby-version
|
93
|
-
- .travis.yml
|
94
|
-
- .yardopts
|
91
|
+
- ".gitignore"
|
92
|
+
- ".pelusa.yml"
|
93
|
+
- ".rspec"
|
94
|
+
- ".ruby-gemset"
|
95
|
+
- ".ruby-version"
|
96
|
+
- ".travis.yml"
|
97
|
+
- ".yardopts"
|
95
98
|
- CONTRIBUTING.md
|
96
99
|
- Changelog.md
|
97
100
|
- Gemfile
|
@@ -209,27 +212,26 @@ files:
|
|
209
212
|
homepage: https://github.com/solnic/virtus
|
210
213
|
licenses:
|
211
214
|
- MIT
|
215
|
+
metadata: {}
|
212
216
|
post_install_message:
|
213
217
|
rdoc_options: []
|
214
218
|
require_paths:
|
215
219
|
- lib
|
216
220
|
required_ruby_version: !ruby/object:Gem::Requirement
|
217
|
-
none: false
|
218
221
|
requirements:
|
219
|
-
- -
|
222
|
+
- - ">="
|
220
223
|
- !ruby/object:Gem::Version
|
221
224
|
version: '0'
|
222
225
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
223
|
-
none: false
|
224
226
|
requirements:
|
225
|
-
- -
|
227
|
+
- - ">="
|
226
228
|
- !ruby/object:Gem::Version
|
227
229
|
version: '0'
|
228
230
|
requirements: []
|
229
231
|
rubyforge_project:
|
230
|
-
rubygems_version:
|
232
|
+
rubygems_version: 2.2.2
|
231
233
|
signing_key:
|
232
|
-
specification_version:
|
234
|
+
specification_version: 4
|
233
235
|
summary: Attributes on Steroids for Plain Old Ruby Objects
|
234
236
|
test_files: []
|
235
237
|
has_rdoc:
|