virtus2 2.0.1

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.
Files changed (118) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +39 -0
  3. data/.rspec +2 -0
  4. data/.yardopts +1 -0
  5. data/CONTRIBUTING.md +18 -0
  6. data/Changelog.md +258 -0
  7. data/Gemfile +10 -0
  8. data/Guardfile +19 -0
  9. data/LICENSE +20 -0
  10. data/README.md +630 -0
  11. data/Rakefile +15 -0
  12. data/TODO.md +6 -0
  13. data/lib/virtus/attribute/accessor.rb +103 -0
  14. data/lib/virtus/attribute/boolean.rb +55 -0
  15. data/lib/virtus/attribute/builder.rb +182 -0
  16. data/lib/virtus/attribute/coercer.rb +45 -0
  17. data/lib/virtus/attribute/coercible.rb +20 -0
  18. data/lib/virtus/attribute/collection.rb +103 -0
  19. data/lib/virtus/attribute/default_value/from_callable.rb +35 -0
  20. data/lib/virtus/attribute/default_value/from_clonable.rb +35 -0
  21. data/lib/virtus/attribute/default_value/from_symbol.rb +35 -0
  22. data/lib/virtus/attribute/default_value.rb +51 -0
  23. data/lib/virtus/attribute/embedded_value.rb +67 -0
  24. data/lib/virtus/attribute/enum.rb +45 -0
  25. data/lib/virtus/attribute/hash.rb +130 -0
  26. data/lib/virtus/attribute/lazy_default.rb +18 -0
  27. data/lib/virtus/attribute/nullify_blank.rb +24 -0
  28. data/lib/virtus/attribute/strict.rb +26 -0
  29. data/lib/virtus/attribute.rb +245 -0
  30. data/lib/virtus/attribute_set.rb +240 -0
  31. data/lib/virtus/builder/hook_context.rb +51 -0
  32. data/lib/virtus/builder.rb +133 -0
  33. data/lib/virtus/class_inclusions.rb +48 -0
  34. data/lib/virtus/class_methods.rb +90 -0
  35. data/lib/virtus/coercer.rb +41 -0
  36. data/lib/virtus/configuration.rb +72 -0
  37. data/lib/virtus/const_missing_extensions.rb +18 -0
  38. data/lib/virtus/extensions.rb +105 -0
  39. data/lib/virtus/instance_methods.rb +218 -0
  40. data/lib/virtus/model.rb +68 -0
  41. data/lib/virtus/module_extensions.rb +88 -0
  42. data/lib/virtus/support/equalizer.rb +128 -0
  43. data/lib/virtus/support/options.rb +113 -0
  44. data/lib/virtus/support/type_lookup.rb +109 -0
  45. data/lib/virtus/value_object.rb +150 -0
  46. data/lib/virtus/version.rb +3 -0
  47. data/lib/virtus.rb +310 -0
  48. data/spec/integration/attributes_attribute_spec.rb +28 -0
  49. data/spec/integration/building_module_spec.rb +90 -0
  50. data/spec/integration/collection_member_coercion_spec.rb +96 -0
  51. data/spec/integration/custom_attributes_spec.rb +42 -0
  52. data/spec/integration/custom_collection_attributes_spec.rb +101 -0
  53. data/spec/integration/default_values_spec.rb +87 -0
  54. data/spec/integration/defining_attributes_spec.rb +86 -0
  55. data/spec/integration/embedded_value_spec.rb +50 -0
  56. data/spec/integration/extending_objects_spec.rb +35 -0
  57. data/spec/integration/hash_attributes_coercion_spec.rb +54 -0
  58. data/spec/integration/inheritance_spec.rb +42 -0
  59. data/spec/integration/injectible_coercers_spec.rb +48 -0
  60. data/spec/integration/mass_assignment_with_accessors_spec.rb +44 -0
  61. data/spec/integration/overriding_virtus_spec.rb +46 -0
  62. data/spec/integration/required_attributes_spec.rb +25 -0
  63. data/spec/integration/struct_as_embedded_value_spec.rb +28 -0
  64. data/spec/integration/using_modules_spec.rb +55 -0
  65. data/spec/integration/value_object_with_custom_constructor_spec.rb +42 -0
  66. data/spec/integration/virtus/instance_level_attributes_spec.rb +23 -0
  67. data/spec/integration/virtus/value_object_spec.rb +99 -0
  68. data/spec/shared/constants_helpers.rb +9 -0
  69. data/spec/shared/freeze_method_behavior.rb +40 -0
  70. data/spec/shared/idempotent_method_behaviour.rb +5 -0
  71. data/spec/shared/options_class_method.rb +19 -0
  72. data/spec/spec_helper.rb +41 -0
  73. data/spec/unit/virtus/attribute/boolean/coerce_spec.rb +43 -0
  74. data/spec/unit/virtus/attribute/boolean/value_coerced_predicate_spec.rb +25 -0
  75. data/spec/unit/virtus/attribute/class_methods/build_spec.rb +180 -0
  76. data/spec/unit/virtus/attribute/class_methods/coerce_spec.rb +32 -0
  77. data/spec/unit/virtus/attribute/coerce_spec.rb +129 -0
  78. data/spec/unit/virtus/attribute/coercible_predicate_spec.rb +20 -0
  79. data/spec/unit/virtus/attribute/collection/class_methods/build_spec.rb +105 -0
  80. data/spec/unit/virtus/attribute/collection/coerce_spec.rb +74 -0
  81. data/spec/unit/virtus/attribute/collection/value_coerced_predicate_spec.rb +31 -0
  82. data/spec/unit/virtus/attribute/comparison_spec.rb +20 -0
  83. data/spec/unit/virtus/attribute/custom_collection_spec.rb +29 -0
  84. data/spec/unit/virtus/attribute/defined_spec.rb +20 -0
  85. data/spec/unit/virtus/attribute/embedded_value/class_methods/build_spec.rb +70 -0
  86. data/spec/unit/virtus/attribute/embedded_value/coerce_spec.rb +91 -0
  87. data/spec/unit/virtus/attribute/get_spec.rb +32 -0
  88. data/spec/unit/virtus/attribute/hash/class_methods/build_spec.rb +106 -0
  89. data/spec/unit/virtus/attribute/hash/coerce_spec.rb +92 -0
  90. data/spec/unit/virtus/attribute/lazy_predicate_spec.rb +20 -0
  91. data/spec/unit/virtus/attribute/rename_spec.rb +16 -0
  92. data/spec/unit/virtus/attribute/required_predicate_spec.rb +19 -0
  93. data/spec/unit/virtus/attribute/set_default_value_spec.rb +107 -0
  94. data/spec/unit/virtus/attribute/set_spec.rb +29 -0
  95. data/spec/unit/virtus/attribute/value_coerced_predicate_spec.rb +19 -0
  96. data/spec/unit/virtus/attribute_set/append_spec.rb +47 -0
  97. data/spec/unit/virtus/attribute_set/define_reader_method_spec.rb +36 -0
  98. data/spec/unit/virtus/attribute_set/define_writer_method_spec.rb +36 -0
  99. data/spec/unit/virtus/attribute_set/each_spec.rb +65 -0
  100. data/spec/unit/virtus/attribute_set/element_reference_spec.rb +17 -0
  101. data/spec/unit/virtus/attribute_set/element_set_spec.rb +64 -0
  102. data/spec/unit/virtus/attribute_set/merge_spec.rb +34 -0
  103. data/spec/unit/virtus/attribute_set/reset_spec.rb +71 -0
  104. data/spec/unit/virtus/attribute_spec.rb +229 -0
  105. data/spec/unit/virtus/attributes_reader_spec.rb +41 -0
  106. data/spec/unit/virtus/attributes_writer_spec.rb +51 -0
  107. data/spec/unit/virtus/class_methods/finalize_spec.rb +67 -0
  108. data/spec/unit/virtus/class_methods/new_spec.rb +39 -0
  109. data/spec/unit/virtus/config_spec.rb +13 -0
  110. data/spec/unit/virtus/element_reader_spec.rb +21 -0
  111. data/spec/unit/virtus/element_writer_spec.rb +19 -0
  112. data/spec/unit/virtus/freeze_spec.rb +41 -0
  113. data/spec/unit/virtus/model_spec.rb +197 -0
  114. data/spec/unit/virtus/module_spec.rb +174 -0
  115. data/spec/unit/virtus/set_default_attributes_spec.rb +32 -0
  116. data/spec/unit/virtus/value_object_spec.rb +138 -0
  117. data/virtus2.gemspec +26 -0
  118. metadata +225 -0
@@ -0,0 +1,174 @@
1
+ require 'spec_helper'
2
+
3
+ describe Virtus, '.module' do
4
+ shared_examples_for 'a valid virtus object' do
5
+ it 'reads and writes attribute' do
6
+ instance.name = 'John'
7
+ expect(instance.name).to eql('John')
8
+ end
9
+ end
10
+
11
+ shared_examples_for 'an object extended with virtus module' do
12
+ context 'with default configuration' do
13
+ subject { Virtus.module }
14
+
15
+ it_behaves_like 'a valid virtus object' do
16
+ let(:instance) { model.new }
17
+ end
18
+
19
+ it 'sets defaults' do
20
+ expect(instance.name).to eql('Jane')
21
+ end
22
+ end
23
+
24
+ context 'with constructor turned off' do
25
+ subject { Virtus.module(:constructor => false) }
26
+
27
+ it_behaves_like 'a valid virtus object' do
28
+ let(:instance) { model.new }
29
+ end
30
+
31
+ it 'skips including constructor' do
32
+ expect { model.new({}) }.to raise_error(ArgumentError)
33
+ end
34
+ end
35
+
36
+ context 'with mass assignment is turned off' do
37
+ subject { Virtus.module(:mass_assignment => false) }
38
+
39
+ it_behaves_like 'a valid virtus object'
40
+
41
+ it 'skips including mass assignment' do
42
+ expect(instance).not_to respond_to(:attributes)
43
+ expect(instance).not_to respond_to(:attributes=)
44
+ end
45
+ end
46
+
47
+ context 'with coercion turned off' do
48
+ subject { Virtus.module(:coerce => false) }
49
+
50
+ it_behaves_like 'a valid virtus object'
51
+
52
+ it 'builds non-coercible attributes' do
53
+ expect(object.send(:attribute_set)[:name]).not_to be_coercible
54
+ end
55
+ end
56
+ end
57
+
58
+ let(:mod) { Module.new }
59
+ let(:model) { Class.new }
60
+ let(:instance) { model.new }
61
+
62
+ before do
63
+ mod.send(:include, subject)
64
+ mod.attribute :name, String, :default => 'Jane'
65
+ mod.attribute :something
66
+ end
67
+
68
+ context 'with a class' do
69
+ let(:object) { model }
70
+
71
+ before do
72
+ model.send(:include, mod)
73
+ end
74
+
75
+ it 'provides attributes for the model' do
76
+ expect(model.attribute_set[:name]).to be_kind_of(Virtus::Attribute)
77
+ end
78
+
79
+ it 'defaults to Object for attribute type' do
80
+ expect(model.attribute_set[:something].type).to be(Axiom::Types::Object)
81
+ end
82
+
83
+ it_behaves_like 'an object extended with virtus module'
84
+ end
85
+
86
+ context 'with a model instance' do
87
+ let(:object) { instance }
88
+
89
+ before do
90
+ instance.extend(mod)
91
+ end
92
+
93
+ it 'provides attributes for the instance' do
94
+ expect(instance.send(:attribute_set)[:name]).to be_kind_of(Virtus::Attribute)
95
+ end
96
+
97
+ it_behaves_like 'an object extended with virtus module'
98
+ end
99
+
100
+ context 'with another module' do
101
+ let(:other) { Module.new }
102
+
103
+ let(:object) { instance }
104
+
105
+ before do
106
+ other.send(:include, mod)
107
+ model.send(:include, other)
108
+ end
109
+
110
+ it_behaves_like 'an object extended with virtus module'
111
+
112
+ it 'provides attributes for the model' do
113
+ expect(model.attribute_set[:name]).to be_kind_of(Virtus::Attribute)
114
+ end
115
+ end
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
+
174
+ end
@@ -0,0 +1,32 @@
1
+ require 'spec_helper'
2
+
3
+ describe Virtus, '#set_default_attributes!' do
4
+ subject { object.set_default_attributes! }
5
+
6
+ let(:model) {
7
+ Class.new {
8
+ include Virtus
9
+
10
+ attribute :name, String, :default => 'foo', :lazy => true
11
+ attribute :age, Integer, :default => 30
12
+ }
13
+ }
14
+
15
+ let(:object) { model.new }
16
+
17
+ before do
18
+ object.set_default_attributes!
19
+ end
20
+
21
+ it { is_expected.to be(object) }
22
+
23
+ describe '#name' do
24
+ subject { super().name }
25
+ it { is_expected.to eql('foo') }
26
+ end
27
+
28
+ describe '#age' do
29
+ subject { super().age }
30
+ it { is_expected.to be(30) }
31
+ end
32
+ end
@@ -0,0 +1,138 @@
1
+ require 'spec_helper'
2
+
3
+ describe Virtus::ValueObject do
4
+ shared_examples_for 'a valid value object' do
5
+ subject { model.new(attributes) }
6
+
7
+ let(:attributes) { Hash[:id => 1, :name => 'Jane Doe'] }
8
+
9
+ describe '#id' do
10
+ subject { super().id }
11
+ it { is_expected.to be(1) }
12
+ end
13
+
14
+ describe '#name' do
15
+ subject { super().name }
16
+ it { is_expected.to eql('Jane Doe') }
17
+ end
18
+
19
+ it 'sets private writers' do
20
+ expect(subject.class.attribute_set[:id]).to_not be_public_writer
21
+ expect(subject.class.attribute_set[:name]).to_not be_public_writer
22
+ end
23
+
24
+ it 'disallows cloning' do
25
+ expect(subject.clone).to be(subject)
26
+ end
27
+
28
+ it 'defines #eql?' do
29
+ expect(subject).to eql(subject.class.new(attributes))
30
+ end
31
+
32
+ it 'defines #==' do
33
+ expect(subject == subject.class.new(attributes)).to be(true)
34
+ end
35
+
36
+ it 'defines #hash' do
37
+ expect(subject.hash).to eql(subject.class.new(attributes).hash)
38
+ end
39
+
40
+ it 'defines #inspect' do
41
+ expect(subject.inspect).to eql(
42
+ %(#<Model #{attributes.map { |k, v| "#{k}=#{v.inspect}" }.join(' ')}>)
43
+ )
44
+ end
45
+
46
+ it 'allows to construct new values using #with' do
47
+ new_instance = subject.with(:name => "John Doe")
48
+ expect(new_instance.id).to eql(subject.id)
49
+ expect(new_instance.name).to eql("John Doe")
50
+ end
51
+ end
52
+
53
+ shared_examples_for 'a valid value object with mass-assignment turned on' do
54
+ subject { model.new }
55
+
56
+ it 'disallows mass-assignment' do
57
+ expect(subject.private_methods).to include(:attributes=)
58
+ end
59
+ end
60
+
61
+ context 'using new values {} block' do
62
+ let(:model) {
63
+ model = Virtus.value_object(:coerce => false, :mass_assignment => mass_assignment)
64
+
65
+ Class.new {
66
+ include model
67
+
68
+ def self.name
69
+ 'Model'
70
+ end
71
+
72
+ values do
73
+ attribute :id, Integer
74
+ attribute :name, String
75
+ end
76
+ }
77
+ }
78
+
79
+ context 'without mass-assignment' do
80
+ let(:mass_assignment) { false }
81
+
82
+ it_behaves_like 'a valid value object'
83
+ end
84
+
85
+ context 'with mass-assignment' do
86
+ let(:mass_assignment) { true }
87
+
88
+ it_behaves_like 'a valid value object'
89
+ it_behaves_like 'a valid value object with mass-assignment turned on'
90
+
91
+ context 'with a model subclass' do
92
+ let(:subclass) {
93
+ Class.new(model) {
94
+ values do
95
+ attribute :email, String
96
+ end
97
+ }
98
+ }
99
+
100
+ it_behaves_like 'a valid value object' do
101
+ subject { subclass.new(attributes) }
102
+
103
+ let(:attributes) { Hash[:id => 1, :name => 'Jane Doe', :email => 'jane@doe.com'] }
104
+
105
+ describe '#email' do
106
+ subject { super().email }
107
+ it { is_expected.to eql('jane@doe.com') }
108
+ end
109
+
110
+ it 'sets private writers for additional values' do
111
+ expect(subclass.attribute_set[:email]).to_not be_public_writer
112
+ end
113
+
114
+ it 'defines valid #== for a subclass' do
115
+ expect(subject == subject.class.new(attributes.merge(:id => 2))).to be(false)
116
+ end
117
+ end
118
+ end
119
+ end
120
+ end
121
+
122
+ context 'using deprecated inclusion' do
123
+ let(:model) {
124
+ Class.new {
125
+ include Virtus::ValueObject
126
+
127
+ def self.name
128
+ 'Model'
129
+ end
130
+
131
+ attribute :id, Integer
132
+ attribute :name, String
133
+ }
134
+ }
135
+
136
+ it_behaves_like 'a valid value object'
137
+ end
138
+ end
data/virtus2.gemspec ADDED
@@ -0,0 +1,26 @@
1
+ # -*- encoding: utf-8 -*-
2
+
3
+ require File.expand_path('../lib/virtus/version', __FILE__)
4
+
5
+ Gem::Specification.new do |gem|
6
+ gem.name = "virtus2"
7
+ gem.version = Virtus::VERSION.dup
8
+ gem.authors = [ "Piotr Solnica", "Daniel Orner" ]
9
+ gem.email = [ "dmorner@gmail.com" ]
10
+ gem.description = "Attributes on Steroids for Plain Old Ruby Objects"
11
+ gem.summary = gem.description
12
+ gem.homepage = "https://github.com/wishabi/virtus2"
13
+ gem.license = 'MIT'
14
+
15
+ gem.require_paths = [ "lib" ]
16
+ gem.files = `git ls-files`.split("\n")
17
+ gem.test_files = `git ls-files -- {spec}/*`.split("\n")
18
+ gem.extra_rdoc_files = %w[LICENSE README.md TODO.md]
19
+
20
+ gem.add_dependency('descendants_tracker', '~> 0.0', '>= 0.0.3')
21
+ gem.add_dependency('coercible', '~> 1.0')
22
+ gem.add_dependency('axiom-types', '~> 0.1')
23
+
24
+ gem.add_development_dependency 'rake'
25
+ gem.required_ruby_version = '>= 2.0'
26
+ end
metadata ADDED
@@ -0,0 +1,225 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: virtus2
3
+ version: !ruby/object:Gem::Version
4
+ version: 2.0.1
5
+ platform: ruby
6
+ authors:
7
+ - Piotr Solnica
8
+ - Daniel Orner
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+ date: 2021-09-15 00:00:00.000000000 Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
15
+ name: descendants_tracker
16
+ requirement: !ruby/object:Gem::Requirement
17
+ requirements:
18
+ - - "~>"
19
+ - !ruby/object:Gem::Version
20
+ version: '0.0'
21
+ - - ">="
22
+ - !ruby/object:Gem::Version
23
+ version: 0.0.3
24
+ type: :runtime
25
+ prerelease: false
26
+ version_requirements: !ruby/object:Gem::Requirement
27
+ requirements:
28
+ - - "~>"
29
+ - !ruby/object:Gem::Version
30
+ version: '0.0'
31
+ - - ">="
32
+ - !ruby/object:Gem::Version
33
+ version: 0.0.3
34
+ - !ruby/object:Gem::Dependency
35
+ name: coercible
36
+ requirement: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: '1.0'
41
+ type: :runtime
42
+ prerelease: false
43
+ version_requirements: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - "~>"
46
+ - !ruby/object:Gem::Version
47
+ version: '1.0'
48
+ - !ruby/object:Gem::Dependency
49
+ name: axiom-types
50
+ requirement: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - "~>"
53
+ - !ruby/object:Gem::Version
54
+ version: '0.1'
55
+ type: :runtime
56
+ prerelease: false
57
+ version_requirements: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - "~>"
60
+ - !ruby/object:Gem::Version
61
+ version: '0.1'
62
+ - !ruby/object:Gem::Dependency
63
+ name: rake
64
+ requirement: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - ">="
67
+ - !ruby/object:Gem::Version
68
+ version: '0'
69
+ type: :development
70
+ prerelease: false
71
+ version_requirements: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - ">="
74
+ - !ruby/object:Gem::Version
75
+ version: '0'
76
+ description: Attributes on Steroids for Plain Old Ruby Objects
77
+ email:
78
+ - dmorner@gmail.com
79
+ executables: []
80
+ extensions: []
81
+ extra_rdoc_files:
82
+ - LICENSE
83
+ - README.md
84
+ - TODO.md
85
+ files:
86
+ - ".gitignore"
87
+ - ".rspec"
88
+ - ".yardopts"
89
+ - CONTRIBUTING.md
90
+ - Changelog.md
91
+ - Gemfile
92
+ - Guardfile
93
+ - LICENSE
94
+ - README.md
95
+ - Rakefile
96
+ - TODO.md
97
+ - lib/virtus.rb
98
+ - lib/virtus/attribute.rb
99
+ - lib/virtus/attribute/accessor.rb
100
+ - lib/virtus/attribute/boolean.rb
101
+ - lib/virtus/attribute/builder.rb
102
+ - lib/virtus/attribute/coercer.rb
103
+ - lib/virtus/attribute/coercible.rb
104
+ - lib/virtus/attribute/collection.rb
105
+ - lib/virtus/attribute/default_value.rb
106
+ - lib/virtus/attribute/default_value/from_callable.rb
107
+ - lib/virtus/attribute/default_value/from_clonable.rb
108
+ - lib/virtus/attribute/default_value/from_symbol.rb
109
+ - lib/virtus/attribute/embedded_value.rb
110
+ - lib/virtus/attribute/enum.rb
111
+ - lib/virtus/attribute/hash.rb
112
+ - lib/virtus/attribute/lazy_default.rb
113
+ - lib/virtus/attribute/nullify_blank.rb
114
+ - lib/virtus/attribute/strict.rb
115
+ - lib/virtus/attribute_set.rb
116
+ - lib/virtus/builder.rb
117
+ - lib/virtus/builder/hook_context.rb
118
+ - lib/virtus/class_inclusions.rb
119
+ - lib/virtus/class_methods.rb
120
+ - lib/virtus/coercer.rb
121
+ - lib/virtus/configuration.rb
122
+ - lib/virtus/const_missing_extensions.rb
123
+ - lib/virtus/extensions.rb
124
+ - lib/virtus/instance_methods.rb
125
+ - lib/virtus/model.rb
126
+ - lib/virtus/module_extensions.rb
127
+ - lib/virtus/support/equalizer.rb
128
+ - lib/virtus/support/options.rb
129
+ - lib/virtus/support/type_lookup.rb
130
+ - lib/virtus/value_object.rb
131
+ - lib/virtus/version.rb
132
+ - spec/integration/attributes_attribute_spec.rb
133
+ - spec/integration/building_module_spec.rb
134
+ - spec/integration/collection_member_coercion_spec.rb
135
+ - spec/integration/custom_attributes_spec.rb
136
+ - spec/integration/custom_collection_attributes_spec.rb
137
+ - spec/integration/default_values_spec.rb
138
+ - spec/integration/defining_attributes_spec.rb
139
+ - spec/integration/embedded_value_spec.rb
140
+ - spec/integration/extending_objects_spec.rb
141
+ - spec/integration/hash_attributes_coercion_spec.rb
142
+ - spec/integration/inheritance_spec.rb
143
+ - spec/integration/injectible_coercers_spec.rb
144
+ - spec/integration/mass_assignment_with_accessors_spec.rb
145
+ - spec/integration/overriding_virtus_spec.rb
146
+ - spec/integration/required_attributes_spec.rb
147
+ - spec/integration/struct_as_embedded_value_spec.rb
148
+ - spec/integration/using_modules_spec.rb
149
+ - spec/integration/value_object_with_custom_constructor_spec.rb
150
+ - spec/integration/virtus/instance_level_attributes_spec.rb
151
+ - spec/integration/virtus/value_object_spec.rb
152
+ - spec/shared/constants_helpers.rb
153
+ - spec/shared/freeze_method_behavior.rb
154
+ - spec/shared/idempotent_method_behaviour.rb
155
+ - spec/shared/options_class_method.rb
156
+ - spec/spec_helper.rb
157
+ - spec/unit/virtus/attribute/boolean/coerce_spec.rb
158
+ - spec/unit/virtus/attribute/boolean/value_coerced_predicate_spec.rb
159
+ - spec/unit/virtus/attribute/class_methods/build_spec.rb
160
+ - spec/unit/virtus/attribute/class_methods/coerce_spec.rb
161
+ - spec/unit/virtus/attribute/coerce_spec.rb
162
+ - spec/unit/virtus/attribute/coercible_predicate_spec.rb
163
+ - spec/unit/virtus/attribute/collection/class_methods/build_spec.rb
164
+ - spec/unit/virtus/attribute/collection/coerce_spec.rb
165
+ - spec/unit/virtus/attribute/collection/value_coerced_predicate_spec.rb
166
+ - spec/unit/virtus/attribute/comparison_spec.rb
167
+ - spec/unit/virtus/attribute/custom_collection_spec.rb
168
+ - spec/unit/virtus/attribute/defined_spec.rb
169
+ - spec/unit/virtus/attribute/embedded_value/class_methods/build_spec.rb
170
+ - spec/unit/virtus/attribute/embedded_value/coerce_spec.rb
171
+ - spec/unit/virtus/attribute/get_spec.rb
172
+ - spec/unit/virtus/attribute/hash/class_methods/build_spec.rb
173
+ - spec/unit/virtus/attribute/hash/coerce_spec.rb
174
+ - spec/unit/virtus/attribute/lazy_predicate_spec.rb
175
+ - spec/unit/virtus/attribute/rename_spec.rb
176
+ - spec/unit/virtus/attribute/required_predicate_spec.rb
177
+ - spec/unit/virtus/attribute/set_default_value_spec.rb
178
+ - spec/unit/virtus/attribute/set_spec.rb
179
+ - spec/unit/virtus/attribute/value_coerced_predicate_spec.rb
180
+ - spec/unit/virtus/attribute_set/append_spec.rb
181
+ - spec/unit/virtus/attribute_set/define_reader_method_spec.rb
182
+ - spec/unit/virtus/attribute_set/define_writer_method_spec.rb
183
+ - spec/unit/virtus/attribute_set/each_spec.rb
184
+ - spec/unit/virtus/attribute_set/element_reference_spec.rb
185
+ - spec/unit/virtus/attribute_set/element_set_spec.rb
186
+ - spec/unit/virtus/attribute_set/merge_spec.rb
187
+ - spec/unit/virtus/attribute_set/reset_spec.rb
188
+ - spec/unit/virtus/attribute_spec.rb
189
+ - spec/unit/virtus/attributes_reader_spec.rb
190
+ - spec/unit/virtus/attributes_writer_spec.rb
191
+ - spec/unit/virtus/class_methods/finalize_spec.rb
192
+ - spec/unit/virtus/class_methods/new_spec.rb
193
+ - spec/unit/virtus/config_spec.rb
194
+ - spec/unit/virtus/element_reader_spec.rb
195
+ - spec/unit/virtus/element_writer_spec.rb
196
+ - spec/unit/virtus/freeze_spec.rb
197
+ - spec/unit/virtus/model_spec.rb
198
+ - spec/unit/virtus/module_spec.rb
199
+ - spec/unit/virtus/set_default_attributes_spec.rb
200
+ - spec/unit/virtus/value_object_spec.rb
201
+ - virtus2.gemspec
202
+ homepage: https://github.com/wishabi/virtus2
203
+ licenses:
204
+ - MIT
205
+ metadata: {}
206
+ post_install_message:
207
+ rdoc_options: []
208
+ require_paths:
209
+ - lib
210
+ required_ruby_version: !ruby/object:Gem::Requirement
211
+ requirements:
212
+ - - ">="
213
+ - !ruby/object:Gem::Version
214
+ version: '2.0'
215
+ required_rubygems_version: !ruby/object:Gem::Requirement
216
+ requirements:
217
+ - - ">="
218
+ - !ruby/object:Gem::Version
219
+ version: '0'
220
+ requirements: []
221
+ rubygems_version: 3.2.21
222
+ signing_key:
223
+ specification_version: 4
224
+ summary: Attributes on Steroids for Plain Old Ruby Objects
225
+ test_files: []