mini_form 0.2.0 → 0.2.4

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: 6d0c0c470b74ebc5e81006fa9f4f226de8d821d6
4
- data.tar.gz: 38393dfb6c142a1f85dca47a2aa16072a63f657f
2
+ SHA256:
3
+ metadata.gz: 4fae1bbe2eb9f254e0315e13364a0d9a19a87515061f066a37fd89689be9c657
4
+ data.tar.gz: 34c5ac1537cf058c0c67cdaa7ef4c88dd7aaaef63412cbabddbad5e13be73435
5
5
  SHA512:
6
- metadata.gz: 1f8c4900a91ceedd1b9f7c12b73e5b2fc30f033fd47783ae792a4c9e8dbb3f0bae93c65953da6ddebf1bbc75e3bb8c4484e863e33925b67672f11246e4b094b6
7
- data.tar.gz: 5a3a73ad3547ba949a1900918a1cdcfefc73c8bf77d0764d89fa0858c6fe8ae075a0493066f80b65d62429160e5a93d2734303d75fcc66d8b8746596d3455730
6
+ metadata.gz: ada501cc629ff6fd8701162248d095868bf2a7a9ac0e7e23f74caae5d08d1f8cbd31d9202fd47f52283cbb3117cd8c0d1a2705b9c074a09a6c95cb622ac2e4ee
7
+ data.tar.gz: 8cb38e2bf06594be100078b2d2b0ee10c4d5a356808ba4249fc2f63f060478619c97dc8d776004d20c5f52cb2b1dfef5b93099ca9307379c7921006a40bfa0ee
data/.gitignore CHANGED
@@ -15,3 +15,4 @@ spec/reports
15
15
  test/tmp
16
16
  test/version_tmp
17
17
  tmp
18
+ .vimrc.local
data/.projections.json ADDED
@@ -0,0 +1,8 @@
1
+ {
2
+ "lib/*.rb": {
3
+ "alternate": "spec/{}_spec.rb"
4
+ },
5
+ "spec/*_spec.rb": {
6
+ "alternate": "lib/{}.rb"
7
+ },
8
+ }
data/.rubocop.yml CHANGED
@@ -1,16 +1,32 @@
1
1
  require: rubocop-rspec
2
2
 
3
- AllCops:
4
- RunRailsCops: true
3
+ Rails:
4
+ Enabled: true
5
5
  Exclude:
6
6
  - example/db/**/*
7
7
  - example/config/**/*
8
8
  - search_object.gemspec
9
9
 
10
+ # Disables "Module definition is too long"
11
+ ModuleLength:
12
+ Enabled: false
13
+
10
14
  # Disables "Line is too long"
11
15
  LineLength:
12
16
  Enabled: false
13
17
 
18
+ # Disables "Method is too long"
19
+ MethodLength:
20
+ Enabled: false
21
+
22
+ # Disables "Assignment Branch Condition size for included is too high"
23
+ AbcSize:
24
+ Enabled: false
25
+
26
+ # Disables "Block has too many lines"
27
+ BlockLength:
28
+ Enabled: false
29
+
14
30
  # Disables "Missing top-level class documentation comment"
15
31
  Documentation:
16
32
  Enabled: false
@@ -22,3 +38,19 @@ Style/EachWithObject:
22
38
  # Disables "Prefer reduce over inject."
23
39
  Style/CollectionMethods:
24
40
  Enabled: false
41
+
42
+ # Disables "%i-literals should be delimited by [ and ]."
43
+ Style/PercentLiteralDelimiters:
44
+ Enabled: false
45
+
46
+ # Disables "Use tr instead of gsubs"
47
+ Performance/StringReplacement:
48
+ Enabled: false
49
+
50
+ # Disables "Example has too many expectations"
51
+ RSpec/MultipleExpectations:
52
+ Enabled: false
53
+
54
+ # Disables "Example has too many lines"
55
+ RSpec/ExampleLength:
56
+ Enabled: false
data/.travis.yml CHANGED
@@ -1,10 +1,12 @@
1
1
  language: ruby
2
2
  rvm:
3
- - 2.0
4
- - 2.1
5
- - 2.2
3
+ - 2.2.5
4
+ - 2.3.3
5
+ - 2.4.0
6
6
  script:
7
7
  - bundle exec rubocop
8
8
  - bundle exec rspec spec
9
+ sudo: false
10
+ cache: bundle
9
11
  notifications:
10
12
  email: false
data/CHANGELOG.md CHANGED
@@ -1,5 +1,22 @@
1
1
  # Changelog
2
2
 
3
+ ## Version 0.2.4
4
+
5
+ * Rails 6+ support (@emilov)
6
+
7
+ ## Version 0.2.3
8
+
9
+ * Fix handling delegated attributes prefixes in `attribute_names` (@rstankov)
10
+
11
+ ## Version 0.2.2
12
+
13
+ * Bump activemodel requirements (@vestimir)
14
+
15
+ ## Version 0.2.1
16
+
17
+ * Fix typo in `assignment` callbaks (@ayrton)
18
+ * Alias `assignment` to `assigment` for backwards compatibility (@ayrton)
19
+
3
20
  ## Version 0.2.0
4
21
 
5
22
  * Don't expose model name on `model`. _(security fix)_
data/README.md CHANGED
@@ -1,7 +1,7 @@
1
- [![Gem Version](https://badge.fury.io/rb/mini_form.png)](http://badge.fury.io/rb/mini_form)
2
- [![Code Climate](https://codeclimate.com/github/RStankov/MiniForm.png)](https://codeclimate.com/github/RStankov/MiniForm)
3
- [![Build Status](https://secure.travis-ci.org/RStankov/MiniForm.png)](http://travis-ci.org/RStankov/MiniForm)
4
- [![Code coverage](https://coveralls.io/repos/RStankov/MiniForm/badge.png?branch=master)](https://coveralls.io/r/RStankov/MiniForm)
1
+ [![Gem Version](https://badge.fury.io/rb/mini_form.svg)](http://badge.fury.io/rb/mini_form)
2
+ [![Code Climate](https://codeclimate.com/github/RStankov/MiniForm.svg)](https://codeclimate.com/github/RStankov/MiniForm)
3
+ [![Build Status](https://secure.travis-ci.org/RStankov/MiniForm.svg)](http://travis-ci.org/RStankov/MiniForm)
4
+ [![Code coverage](https://coveralls.io/repos/RStankov/MiniForm/badge.svg?branch=master)](https://coveralls.io/r/RStankov/MiniForm)
5
5
 
6
6
  # MiniForm
7
7
 
@@ -267,11 +267,11 @@ form.id = 42 # => raises `NoMethodError`
267
267
  <td>Meant to be overwritten.</td>
268
268
  </tr>
269
269
  <tr>
270
- <td>#before_assigment</td>
270
+ <td>#before_assignment</td>
271
271
  <td>Meant to be overwritten.</td>
272
272
  </tr>
273
273
  <tr>
274
- <td>#after_assigment</td>
274
+ <td>#after_assignment</td>
275
275
  <td>Meant to be overwritten.</td>
276
276
  </tr>
277
277
  <tr>
data/Rakefile CHANGED
@@ -5,4 +5,4 @@ require 'rubocop/rake_task'
5
5
  RSpec::Core::RakeTask.new(:spec)
6
6
  RuboCop::RakeTask.new(:rubocop)
7
7
 
8
- task default: [:rubocop, :spec]
8
+ task default: %i(rubocop spec)
@@ -5,7 +5,8 @@ module MiniForm
5
5
  def initialize(object)
6
6
  @errors = object.errors
7
7
 
8
- super "Form validation failed for: #{errors.keys.join(', ')}"
8
+ arr_obj = errors.respond_to?(:attribute_names) ? errors.attribute_names : errors.keys
9
+ super "Form validation failed for: #{arr_obj.join(', ')}"
9
10
  end
10
11
  end
11
12
  end
@@ -3,7 +3,7 @@ require 'active_model'
3
3
 
4
4
  module MiniForm
5
5
  module Model
6
- def self.included(base) # rubocop:disable MethodLength
6
+ def self.included(base)
7
7
  base.class_eval do
8
8
  include ActiveModel::Validations
9
9
  include ActiveModel::Validations::Callbacks
@@ -15,11 +15,18 @@ module MiniForm
15
15
  extend ClassMethods
16
16
 
17
17
  define_model_callbacks :update
18
+ define_model_callbacks :assignment
19
+
20
+ # For backwards compatibility purpose
18
21
  define_model_callbacks :assigment
19
22
 
20
23
  before_update :before_update
21
24
  after_update :after_update
22
25
 
26
+ before_assignment :before_assignment
27
+ after_assignment :after_assignment
28
+
29
+ # For backwards compatibility purpose
23
30
  before_assigment :before_assigment
24
31
  after_assigment :after_assigment
25
32
  end
@@ -34,14 +41,16 @@ module MiniForm
34
41
  end
35
42
 
36
43
  def attributes=(attributes)
37
- run_callbacks :assigment do
38
- attributes.slice(*self.class.attribute_names).each do |name, value|
39
- public_send "#{name}=", value
44
+ run_callbacks :assignment do
45
+ run_callbacks :assigment do
46
+ attributes.slice(*self.class.attribute_names).each do |name, value|
47
+ public_send "#{name}=", value
48
+ end
40
49
  end
41
50
  end
42
51
  end
43
52
 
44
- alias_method :assign_attributes, :attributes=
53
+ alias assign_attributes attributes=
45
54
 
46
55
  def attributes
47
56
  Hash[self.class.attribute_names.map { |name| [name, public_send(name)] }]
@@ -63,7 +72,7 @@ module MiniForm
63
72
  end
64
73
 
65
74
  def update!(attributes = {})
66
- fail InvalidForm, self unless update attributes
75
+ raise InvalidForm, self unless update attributes
67
76
  self
68
77
  end
69
78
 
@@ -94,6 +103,14 @@ module MiniForm
94
103
  # noop
95
104
  end
96
105
 
106
+ def before_assignment
107
+ # noop
108
+ end
109
+
110
+ def after_assignment
111
+ # noop
112
+ end
113
+
97
114
  def before_assigment
98
115
  # noop
99
116
  end
@@ -123,7 +140,13 @@ module MiniForm
123
140
  end
124
141
 
125
142
  def attributes(*attributes, delegate: nil, prefix: nil, allow_nil: nil)
126
- attribute_names.push(*attributes)
143
+ if prefix
144
+ attribute_names.push(*attributes.map do |name|
145
+ :"#{prefix == true ? delegate : prefix}_#{name}"
146
+ end)
147
+ else
148
+ attribute_names.push(*attributes)
149
+ end
127
150
 
128
151
  if delegate.nil?
129
152
  attr_accessor(*attributes)
@@ -5,6 +5,15 @@ module MiniForm
5
5
  def validate_each(record, _, relation)
6
6
  return if relation.valid?
7
7
 
8
+ if record.errors.respond_to?(:merge!)
9
+ # Rails 6.1+ where accessing ActiveModel::Errors as a hash has been
10
+ # deprecated and the errors array is frozen. For this reason we use the new
11
+ # method merge!() which appends the errors as NestedErrors to the array. "This is the way."
12
+ record.errors.merge!(relation.errors)
13
+ return
14
+ end
15
+
16
+ # Rails < 6.1
8
17
  relation.errors.each do |name, value|
9
18
  record.errors.add name, value
10
19
  end
@@ -1,3 +1,3 @@
1
1
  module MiniForm
2
- VERSION = '0.2.0'
2
+ VERSION = '0.2.4'.freeze
3
3
  end
data/mini_form.gemspec CHANGED
@@ -1,5 +1,5 @@
1
- # coding: utf-8
2
1
  lib = File.expand_path('../lib', __FILE__)
2
+
3
3
  $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
4
  require 'mini_form/version'
5
5
 
@@ -14,14 +14,14 @@ Gem::Specification.new do |spec|
14
14
  spec.license = 'MIT'
15
15
 
16
16
  spec.files = `git ls-files`.split($INPUT_RECORD_SEPARATOR)
17
- spec.executables = spec.files.grep(/^bin\//) { |f| File.basename(f) }
18
- spec.test_files = spec.files.grep(/^(spec)\//)
17
+ spec.executables = spec.files.grep(%r{^bin\/}) { |f| File.basename(f) }
18
+ spec.test_files = spec.files.grep(%r{^(spec)\/})
19
19
  spec.require_paths = ['lib']
20
20
 
21
- spec.add_dependency 'activemodel', '~> 4.0'
21
+ spec.add_dependency 'activemodel', '>= 4.0'
22
22
 
23
- spec.add_development_dependency 'bundler', '~> 1.3'
24
- spec.add_development_dependency 'rake'
23
+ spec.add_development_dependency 'bundler', '>= 2.1.4'
24
+ spec.add_development_dependency 'rake', '>= 12.3.3'
25
25
  spec.add_development_dependency 'rspec', '~> 2.14'
26
26
  spec.add_development_dependency 'rspec-mocks', '>= 2.12.3'
27
27
  spec.add_development_dependency 'coveralls'
@@ -24,6 +24,8 @@ module MiniForm
24
24
  attr_reader :user
25
25
 
26
26
  attributes :name, delegate: :user
27
+ attributes :id, delegate: :user, prefix: true
28
+ attributes :name, delegate: :user, prefix: 'full'
27
29
 
28
30
  def initialize(user)
29
31
  @user = user
@@ -49,6 +51,10 @@ module MiniForm
49
51
  expect(value).to eq(expected_value), message
50
52
  end
51
53
 
54
+ def assert_respond_to(klass, method, message = nil)
55
+ expect(klass).to respond_to(method), message
56
+ end
57
+
52
58
  ActiveModel::Lint::Tests.public_instance_methods.map(&:to_s).grep(/^test/).each do |method|
53
59
  example(method.gsub('_', ' ')) { send method }
54
60
  end
@@ -140,6 +146,11 @@ module MiniForm
140
146
  it 'returns attribute names' do
141
147
  expect(Example.attribute_names).to eq %i(name price)
142
148
  end
149
+
150
+ it 'can handle prefixes' do
151
+ expect(ExampleWithDelegate.attribute_names).to include :user_id
152
+ expect(ExampleWithDelegate.attribute_names).to include :full_name
153
+ end
143
154
  end
144
155
 
145
156
  describe '#initialize' do
@@ -204,7 +215,7 @@ module MiniForm
204
215
 
205
216
  model :user, attributes: %i(name), save: true
206
217
 
207
- def initialize(user: user)
218
+ def initialize(user:)
208
219
  self.user = user
209
220
  end
210
221
  end
@@ -224,9 +235,11 @@ module MiniForm
224
235
  it 'calls "perfom" method when validation pass' do
225
236
  object = ExampleForUpdate.new name: 'value'
226
237
 
227
- expect(object).to receive(:perform)
238
+ allow(object).to receive(:perform)
228
239
 
229
240
  object.update
241
+
242
+ expect(object).to have_received(:perform)
230
243
  end
231
244
 
232
245
  it 'calls "save" for the model' do
@@ -242,19 +255,37 @@ module MiniForm
242
255
  it 'supports update callbacks' do
243
256
  object = ExampleForUpdate.new name: 'value'
244
257
 
245
- expect(object).to receive(:before_update)
246
- expect(object).to receive(:after_update)
258
+ allow(object).to receive(:before_update)
259
+ allow(object).to receive(:after_update)
247
260
 
248
261
  object.update
262
+
263
+ expect(object).to have_received(:before_update)
264
+ expect(object).to have_received(:after_update)
265
+ end
266
+
267
+ it 'supports legacy assig callbacks' do
268
+ object = ExampleForUpdate.new
269
+
270
+ allow(object).to receive(:before_assigment)
271
+ allow(object).to receive(:after_assigment)
272
+
273
+ object.update name: 'value'
274
+
275
+ expect(object).to have_received(:before_assigment)
276
+ expect(object).to have_received(:after_assigment)
249
277
  end
250
278
 
251
279
  it 'supports assign callbacks' do
252
280
  object = ExampleForUpdate.new
253
281
 
254
- expect(object).to receive(:before_assigment)
255
- expect(object).to receive(:after_assigment)
282
+ allow(object).to receive(:before_assignment)
283
+ allow(object).to receive(:after_assignment)
256
284
 
257
285
  object.update name: 'value'
286
+
287
+ expect(object).to have_received(:before_assignment)
288
+ expect(object).to have_received(:after_assignment)
258
289
  end
259
290
 
260
291
  it 'returns false when validations fail' do
@@ -266,9 +297,11 @@ module MiniForm
266
297
  it 'does not call "perfom" method when validation fail' do
267
298
  object = ExampleForUpdate.new name: nil
268
299
 
269
- expect(object).not_to receive(:perform)
300
+ allow(object).to receive(:perform)
270
301
 
271
302
  object.update
303
+
304
+ expect(object).not_to have_received(:perform)
272
305
  end
273
306
  end
274
307
 
@@ -281,9 +314,11 @@ module MiniForm
281
314
  it 'calls update with given arguments' do
282
315
  object = Example.new
283
316
 
284
- expect(object).to receive(:update).with(:attributes).and_return true
317
+ allow(object).to receive(:update).and_return true
285
318
 
286
319
  object.update! :attributes
320
+
321
+ expect(object).to have_received(:update).with(:attributes)
287
322
  end
288
323
 
289
324
  it 'raises error when update fails' do
metadata CHANGED
@@ -1,57 +1,57 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: mini_form
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.0
4
+ version: 0.2.4
5
5
  platform: ruby
6
6
  authors:
7
7
  - Radoslav Stankov
8
- autorequire:
8
+ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2015-05-28 00:00:00.000000000 Z
11
+ date: 2022-01-09 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activemodel
15
15
  requirement: !ruby/object:Gem::Requirement
16
16
  requirements:
17
- - - "~>"
17
+ - - ">="
18
18
  - !ruby/object:Gem::Version
19
19
  version: '4.0'
20
20
  type: :runtime
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
- - - "~>"
24
+ - - ">="
25
25
  - !ruby/object:Gem::Version
26
26
  version: '4.0'
27
27
  - !ruby/object:Gem::Dependency
28
28
  name: bundler
29
29
  requirement: !ruby/object:Gem::Requirement
30
30
  requirements:
31
- - - "~>"
31
+ - - ">="
32
32
  - !ruby/object:Gem::Version
33
- version: '1.3'
33
+ version: 2.1.4
34
34
  type: :development
35
35
  prerelease: false
36
36
  version_requirements: !ruby/object:Gem::Requirement
37
37
  requirements:
38
- - - "~>"
38
+ - - ">="
39
39
  - !ruby/object:Gem::Version
40
- version: '1.3'
40
+ version: 2.1.4
41
41
  - !ruby/object:Gem::Dependency
42
42
  name: rake
43
43
  requirement: !ruby/object:Gem::Requirement
44
44
  requirements:
45
45
  - - ">="
46
46
  - !ruby/object:Gem::Version
47
- version: '0'
47
+ version: 12.3.3
48
48
  type: :development
49
49
  prerelease: false
50
50
  version_requirements: !ruby/object:Gem::Requirement
51
51
  requirements:
52
52
  - - ">="
53
53
  - !ruby/object:Gem::Version
54
- version: '0'
54
+ version: 12.3.3
55
55
  - !ruby/object:Gem::Dependency
56
56
  name: rspec
57
57
  requirement: !ruby/object:Gem::Requirement
@@ -130,6 +130,7 @@ extensions: []
130
130
  extra_rdoc_files: []
131
131
  files:
132
132
  - ".gitignore"
133
+ - ".projections.json"
133
134
  - ".rspec"
134
135
  - ".rubocop.yml"
135
136
  - ".travis.yml"
@@ -151,7 +152,7 @@ homepage: https://github.com/RStankov/MiniForm
151
152
  licenses:
152
153
  - MIT
153
154
  metadata: {}
154
- post_install_message:
155
+ post_install_message:
155
156
  rdoc_options: []
156
157
  require_paths:
157
158
  - lib
@@ -166,9 +167,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
166
167
  - !ruby/object:Gem::Version
167
168
  version: '0'
168
169
  requirements: []
169
- rubyforge_project:
170
- rubygems_version: 2.4.5
171
- signing_key:
170
+ rubygems_version: 3.1.4
171
+ signing_key:
172
172
  specification_version: 4
173
173
  summary: Easy to use form objects in Rails projects
174
174
  test_files: