virtus_model 0.2.6 → 0.3.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 1bbee737381701a5de5826e177046f6b1ef5af3d
4
- data.tar.gz: 26d0b9439bc0e8fcd53bc87c16c6bd1b244d17ef
3
+ metadata.gz: 4889888392103490330641562a43bbc90466a8c4
4
+ data.tar.gz: 13c865c370ea09c3e0a4857bd6b82ab511191f1c
5
5
  SHA512:
6
- metadata.gz: b6ac3acec28f5c6608da6a94ed263fac68774384b8dcf7f282141adb8b72b5ae7bdc4d548fbe40f89259d5d90494f1a9d8192a4a2c979ea8e3c01a9ec2ef2809
7
- data.tar.gz: 15db98ac93f9e88d7e3eb69ffb59a79e681f2b1ed845a8ae92140f49e1940b4875bc8034f0ade4f62e05f90a8650cd71aa8cd91ba4455b2e61281f8aba7a11c1
6
+ metadata.gz: 295d96a01e5a71b31db621c6a5de0a1b4a9ac47848d20eced14d6fdf197f5aabcbeaa4b19314b150410b6f04e519505601eb3ad24f62cc1dc83e31fdc65d504a
7
+ data.tar.gz: e1fb74537b824ebb7cb722694970a357aa707ca0ed011275c0bb9b7eba49cf1d48070e0a2160da5969f403a66f26719e5e68840bf7697de6ce2c7373100db90e
data/README.md ADDED
@@ -0,0 +1,87 @@
1
+ # VirtusModel
2
+
3
+ A practical and pleasant union of [Virtus](https://rubygems.org/gems/virtus) and [ActiveModel](https://rubygems.org/gems/activemodel).
4
+
5
+ ## Installation
6
+
7
+ Ruby version 2.2.2 or greater is required.
8
+
9
+ ```shell
10
+ $ gem install virtus_model
11
+ ```
12
+
13
+ ## Examples
14
+
15
+ First, familiarize yourself with the Virtus and ActiveModel libraries.
16
+
17
+ ```ruby
18
+ #
19
+ # Class definitions
20
+ #
21
+
22
+ class ModelOne < VirtusModel::Base
23
+ attribute :name, String
24
+
25
+ validates :name, presence: true
26
+ end
27
+
28
+ class ModelTwo < VirtusModel::Base
29
+ attribute :models, Array[ModelOne]
30
+
31
+ validates :models, presence: true
32
+ end
33
+
34
+ #
35
+ # Class methods
36
+ #
37
+
38
+ raise unless ModelOne.attributes == [:name]
39
+
40
+ raise unless ModelOne.attribute?(:name)
41
+
42
+ raise if ModelOne.attribute?(:other)
43
+
44
+ raise unless ModelTwo.associations == [:models]
45
+
46
+ raise unless ModelTwo.association?(:models)
47
+
48
+ raise if ModelTwo.association?(:other)
49
+
50
+ #
51
+ # Instance methods
52
+ #
53
+
54
+ model1 = ModelOne.new(name: 'hello')
55
+
56
+ raise unless model1.attributes == { name: 'hello' }
57
+
58
+ raise unless model1.valid?
59
+
60
+ model1.assign_attributes(name: nil)
61
+
62
+ raise if model1.valid?
63
+
64
+ raise unless model1.errors[:name] == ["can't be blank"]
65
+
66
+ raise unless model1.update(name: 'hello')
67
+
68
+ model2 = ModelTwo.new(models: [model1.attributes])
69
+
70
+ raise unless model2.valid?
71
+
72
+ model2.assign_attributes(models: [])
73
+
74
+ raise if model2.valid?
75
+
76
+ raise unless model2.errors[:models] == ["can't be blank"]
77
+
78
+ raise if model2.update(models: [{ name: nil }])
79
+
80
+ raise unless model2.errors[:'models[0][name]'] == ["can't be blank"]
81
+
82
+ raise unless model2.update(models: [model1])
83
+
84
+ raise unless model2.export == { models: [{ name: 'hello' }] }
85
+
86
+ raise unless ModelTwo.new(model2.export) == model2
87
+ ```
@@ -6,9 +6,10 @@ module VirtusModel
6
6
  class Base
7
7
  include ActiveModel::Conversion
8
8
  include ActiveModel::Validations
9
- include Virtus.model
9
+ include ActiveModel::Validations::Callbacks
10
+ include Virtus.model(nullify_blank: true)
10
11
 
11
- set_callback :validate, :validate_associations
12
+ before_validation :validate_associations
12
13
 
13
14
  # Get an array of attribute names.
14
15
  def self.attributes
@@ -107,7 +108,7 @@ module VirtusModel
107
108
  self.class.attributes.reduce({}) do |result, name|
108
109
  if model.respond_to?(name)
109
110
  result[name] = model.public_send(name)
110
- elsif model.respond_to?(:[])
111
+ elsif model.respond_to?(:[]) && model.respond_to?(:key?) && model.key?(name)
111
112
  result[name] = model[name]
112
113
  end
113
114
  result
@@ -1,3 +1,3 @@
1
1
  module VirtusModel
2
- VERSION = '0.2.6'.freeze
2
+ VERSION = '0.3.0'.freeze
3
3
  end
data/spec/spec_helper.rb CHANGED
@@ -6,6 +6,7 @@ Bundler.setup
6
6
 
7
7
  require 'virtus_model'
8
8
  require 'shoulda/matchers'
9
+ require 'shoulda/callback/matchers'
9
10
  require 'active_support/core_ext/object/try'
10
11
 
11
12
  Shoulda::Matchers.configure do |config|
@@ -8,6 +8,7 @@ describe VirtusModel::Base do
8
8
  let(:simple_model_attributes) { { name: 'test' } }
9
9
 
10
10
  describe SimpleModel, type: :model do
11
+ it { is_expected.to callback(:validate_associations).before(:validation) }
11
12
  it { is_expected.to validate_presence_of(:name) }
12
13
  end
13
14
 
@@ -27,6 +28,7 @@ describe VirtusModel::Base do
27
28
  end
28
29
 
29
30
  describe ComplexModel, type: :model do
31
+ it { is_expected.to callback(:validate_associations).before(:validation) }
30
32
  it { is_expected.to validate_presence_of(:model) }
31
33
  it { is_expected.to validate_presence_of(:models) }
32
34
  end
@@ -36,10 +38,21 @@ describe VirtusModel::Base do
36
38
  end
37
39
 
38
40
  describe InheritedModel, type: :model do
41
+ it { is_expected.to callback(:validate_associations).before(:validation) }
39
42
  it { is_expected.to validate_presence_of(:model) }
40
43
  it { is_expected.to validate_presence_of(:models) }
41
44
  end
42
45
 
46
+ class CallbackModel < ComplexModel
47
+ after_validation :child_callback
48
+ end
49
+
50
+ describe CallbackModel, type: :model do
51
+ before(:example) { allow(subject).to receive(:child_callback) }
52
+ it { is_expected.to callback(:validate_associations).before(:validation) }
53
+ it { is_expected.to callback(:child_callback).after(:validation) }
54
+ end
55
+
43
56
  describe '.attribute?' do
44
57
  context SimpleModel do
45
58
  subject { SimpleModel }
@@ -130,8 +143,14 @@ describe VirtusModel::Base do
130
143
 
131
144
  context 'hash' do
132
145
  let(:attributes) { { name: 'test', other: 'test' } }
146
+
133
147
  it { expect(subject.attributes).to include(name: 'test') }
134
148
  it { expect(subject.attributes).not_to include(other: 'test') }
149
+
150
+ it 'does not overwrite omitted fields' do
151
+ expect(subject.assign_attributes({})).to be_a(SimpleModel)
152
+ expect(subject.attributes[:name]).to eq('test')
153
+ end
135
154
  end
136
155
 
137
156
  context 'object' do
@@ -146,9 +165,16 @@ describe VirtusModel::Base do
146
165
  context 'hash' do
147
166
  let(:attributes) { { model: model, models: [model], other: 'test' } }
148
167
  let(:model) { { name: 'test', other: 'test' } }
168
+
149
169
  it { expect(subject.attributes[:model]).to eq(SimpleModel.new(model)) }
150
170
  it { expect(subject.attributes[:models]).to eq([SimpleModel.new(model)]) }
151
171
  it { expect(subject.attributes).not_to include(other: 'test') }
172
+
173
+ it 'does not overwrite omitted fields' do
174
+ expect(subject.assign_attributes(model: nil)).to be_a(ComplexModel)
175
+ expect(subject.attributes[:model]).to be(nil)
176
+ expect(subject.attributes[:models]).to eq([SimpleModel.new(model)])
177
+ end
152
178
  end
153
179
 
154
180
  context 'object' do
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: virtus_model
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.6
4
+ version: 0.3.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Derek Schaefer
8
- autorequire:
8
+ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2016-05-01 00:00:00.000000000 Z
11
+ date: 2022-01-05 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: virtus
@@ -28,44 +28,56 @@ dependencies:
28
28
  name: activemodel
29
29
  requirement: !ruby/object:Gem::Requirement
30
30
  requirements:
31
- - - "~>"
31
+ - - ">="
32
32
  - !ruby/object:Gem::Version
33
33
  version: '4.2'
34
+ - - "<"
35
+ - !ruby/object:Gem::Version
36
+ version: '6'
34
37
  type: :runtime
35
38
  prerelease: false
36
39
  version_requirements: !ruby/object:Gem::Requirement
37
40
  requirements:
38
- - - "~>"
41
+ - - ">="
39
42
  - !ruby/object:Gem::Version
40
43
  version: '4.2'
44
+ - - "<"
45
+ - !ruby/object:Gem::Version
46
+ version: '6'
41
47
  - !ruby/object:Gem::Dependency
42
48
  name: activesupport
43
49
  requirement: !ruby/object:Gem::Requirement
44
50
  requirements:
45
- - - "~>"
51
+ - - ">="
46
52
  - !ruby/object:Gem::Version
47
53
  version: '4.2'
54
+ - - "<"
55
+ - !ruby/object:Gem::Version
56
+ version: '6'
48
57
  type: :runtime
49
58
  prerelease: false
50
59
  version_requirements: !ruby/object:Gem::Requirement
51
60
  requirements:
52
- - - "~>"
61
+ - - ">="
53
62
  - !ruby/object:Gem::Version
54
63
  version: '4.2'
64
+ - - "<"
65
+ - !ruby/object:Gem::Version
66
+ version: '6'
55
67
  - !ruby/object:Gem::Dependency
56
68
  name: rake
57
69
  requirement: !ruby/object:Gem::Requirement
58
70
  requirements:
59
71
  - - "~>"
60
72
  - !ruby/object:Gem::Version
61
- version: '11.1'
73
+ version: '13.0'
62
74
  type: :development
63
75
  prerelease: false
64
76
  version_requirements: !ruby/object:Gem::Requirement
65
77
  requirements:
66
78
  - - "~>"
67
79
  - !ruby/object:Gem::Version
68
- version: '11.1'
80
+ version: '13.0'
69
81
  - !ruby/object:Gem::Dependency
70
82
  name: rdoc
71
83
  requirement: !ruby/object:Gem::Requirement
@@ -86,49 +98,64 @@ dependencies:
86
98
  requirements:
87
99
  - - "~>"
88
100
  - !ruby/object:Gem::Version
89
- version: '3.4'
101
+ version: '3.10'
90
102
  type: :development
91
103
  prerelease: false
92
104
  version_requirements: !ruby/object:Gem::Requirement
93
105
  requirements:
94
106
  - - "~>"
95
107
  - !ruby/object:Gem::Version
96
- version: '3.4'
108
+ version: '3.10'
97
109
  - !ruby/object:Gem::Dependency
98
110
  name: shoulda-matchers
99
111
  requirement: !ruby/object:Gem::Requirement
100
112
  requirements:
101
113
  - - "~>"
102
114
  - !ruby/object:Gem::Version
103
- version: '3.1'
115
+ version: '4.0'
116
+ type: :development
117
+ prerelease: false
118
+ version_requirements: !ruby/object:Gem::Requirement
119
+ requirements:
120
+ - - "~>"
121
+ - !ruby/object:Gem::Version
122
+ version: '4.0'
123
+ - !ruby/object:Gem::Dependency
124
+ name: shoulda-callback-matchers
125
+ requirement: !ruby/object:Gem::Requirement
126
+ requirements:
127
+ - - "~>"
128
+ - !ruby/object:Gem::Version
129
+ version: '1.1'
104
130
  type: :development
105
131
  prerelease: false
106
132
  version_requirements: !ruby/object:Gem::Requirement
107
133
  requirements:
108
134
  - - "~>"
109
135
  - !ruby/object:Gem::Version
110
- version: '3.1'
136
+ version: '1.1'
111
137
  - !ruby/object:Gem::Dependency
112
138
  name: simplecov
113
139
  requirement: !ruby/object:Gem::Requirement
114
140
  requirements:
115
141
  - - "~>"
116
142
  - !ruby/object:Gem::Version
117
- version: '0.11'
143
+ version: '0.17'
118
144
  type: :development
119
145
  prerelease: false
120
146
  version_requirements: !ruby/object:Gem::Requirement
121
147
  requirements:
122
148
  - - "~>"
123
149
  - !ruby/object:Gem::Version
124
- version: '0.11'
125
- description: VirtusModel
150
+ version: '0.17'
151
+ description: A practical and pleasant union of Virtus and ActiveModel.
126
152
  email:
127
153
  - derek.schaefer@gmail.com
128
154
  executables: []
129
155
  extensions: []
130
156
  extra_rdoc_files: []
131
157
  files:
158
+ - README.md
132
159
  - lib/virtus_model.rb
133
160
  - lib/virtus_model/base.rb
134
161
  - lib/virtus_model/version.rb
@@ -138,7 +165,7 @@ homepage: https://github.com/derek-schaefer/virtus_model
138
165
  licenses:
139
166
  - MIT
140
167
  metadata: {}
141
- post_install_message:
168
+ post_install_message:
142
169
  rdoc_options: []
143
170
  require_paths:
144
171
  - lib
@@ -146,18 +173,18 @@ required_ruby_version: !ruby/object:Gem::Requirement
146
173
  requirements:
147
174
  - - ">="
148
175
  - !ruby/object:Gem::Version
149
- version: 2.0.0
176
+ version: 2.2.2
150
177
  required_rubygems_version: !ruby/object:Gem::Requirement
151
178
  requirements:
152
179
  - - ">="
153
180
  - !ruby/object:Gem::Version
154
181
  version: '0'
155
182
  requirements: []
156
- rubyforge_project:
157
- rubygems_version: 2.5.1
158
- signing_key:
183
+ rubyforge_project:
184
+ rubygems_version: 2.5.2.3
185
+ signing_key:
159
186
  specification_version: 4
160
- summary: VirtusModel
187
+ summary: VirtusModel = Virtus + ActiveModel
161
188
  test_files:
162
189
  - spec/spec_helper.rb
163
190
  - spec/virtus_model/base_spec.rb