easy_params 0.5.0 → 0.6.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 +4 -4
- data/.ruby-version +1 -0
- data/Gemfile +1 -0
- data/Gemfile.lock +67 -52
- data/README.md +44 -10
- data/easy_params.gemspec +1 -1
- data/lib/easy_params/base.rb +13 -11
- data/lib/easy_params/types/collection.rb +4 -4
- data/lib/easy_params/types/generic.rb +0 -8
- data/lib/easy_params/types/struct.rb +7 -1
- data/lib/easy_params/version.rb +1 -1
- metadata +4 -6
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: c59e34205e7543bb5d58358d8e93b92ff911cacac58b4dbd55069b1398d10691
|
4
|
+
data.tar.gz: 7ba6653bb5b7ecd3e10d3e23be396f9482b0cf336f8807d5cc09a8d9fa1b9750
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 6b6b302946b9eb92cbcedf61a6eae529030154ec251ce4a98928d0cd31cffb069e43ad2fd98f4768ca208ea1f7f65e5cf0be89fa16bce1d3fd7f2c02d8d837c1
|
7
|
+
data.tar.gz: ee6bdb5edaf5a37230c631036936a3dc8a520aa0ed5a344ad69cdf03ff9d77d817f2c346d0b8a27ca0a421f6c25f16a80190262ead23877af6a7a4f7a706a8ad
|
data/.ruby-version
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
3.4.1
|
data/Gemfile
CHANGED
data/Gemfile.lock
CHANGED
@@ -1,96 +1,111 @@
|
|
1
1
|
PATH
|
2
2
|
remote: .
|
3
3
|
specs:
|
4
|
-
easy_params (0.
|
4
|
+
easy_params (0.6.0)
|
5
5
|
activemodel (>= 3.2)
|
6
6
|
|
7
7
|
GEM
|
8
8
|
remote: https://rubygems.org/
|
9
9
|
specs:
|
10
|
-
activemodel (
|
11
|
-
activesupport (=
|
12
|
-
activesupport (
|
10
|
+
activemodel (8.0.2)
|
11
|
+
activesupport (= 8.0.2)
|
12
|
+
activesupport (8.0.2)
|
13
13
|
base64
|
14
|
+
benchmark (>= 0.3)
|
14
15
|
bigdecimal
|
15
|
-
concurrent-ruby (~> 1.0, >= 1.
|
16
|
+
concurrent-ruby (~> 1.0, >= 1.3.1)
|
16
17
|
connection_pool (>= 2.2.5)
|
17
18
|
drb
|
18
19
|
i18n (>= 1.6, < 2)
|
20
|
+
logger (>= 1.4.2)
|
19
21
|
minitest (>= 5.1)
|
20
|
-
|
21
|
-
tzinfo (~> 2.0)
|
22
|
-
|
23
|
-
|
24
|
-
|
22
|
+
securerandom (>= 0.3)
|
23
|
+
tzinfo (~> 2.0, >= 2.0.5)
|
24
|
+
uri (>= 0.13.1)
|
25
|
+
ast (2.4.3)
|
26
|
+
base64 (0.3.0)
|
27
|
+
benchmark (0.4.1)
|
28
|
+
bigdecimal (3.2.2)
|
25
29
|
coderay (1.1.3)
|
26
|
-
concurrent-ruby (1.
|
27
|
-
connection_pool (2.
|
28
|
-
diff-lcs (1.
|
29
|
-
docile (1.
|
30
|
-
drb (2.2.
|
31
|
-
|
32
|
-
i18n (1.14.1)
|
30
|
+
concurrent-ruby (1.3.5)
|
31
|
+
connection_pool (2.5.3)
|
32
|
+
diff-lcs (1.6.2)
|
33
|
+
docile (1.4.1)
|
34
|
+
drb (2.2.3)
|
35
|
+
i18n (1.14.7)
|
33
36
|
concurrent-ruby (~> 1.0)
|
34
|
-
json (2.
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
37
|
+
json (2.13.2)
|
38
|
+
language_server-protocol (3.17.0.5)
|
39
|
+
lint_roller (1.1.0)
|
40
|
+
logger (1.7.0)
|
41
|
+
method_source (1.1.0)
|
42
|
+
minitest (5.25.5)
|
43
|
+
ostruct (0.6.2)
|
44
|
+
parallel (1.27.0)
|
45
|
+
parser (3.3.9.0)
|
40
46
|
ast (~> 2.4.1)
|
41
47
|
racc
|
42
|
-
|
48
|
+
prism (1.4.0)
|
49
|
+
pry (0.15.2)
|
43
50
|
coderay (~> 1.1)
|
44
51
|
method_source (~> 1.0)
|
45
|
-
racc (1.
|
52
|
+
racc (1.8.1)
|
46
53
|
rainbow (3.1.1)
|
47
54
|
rake (12.3.3)
|
48
|
-
regexp_parser (2.
|
49
|
-
|
50
|
-
|
51
|
-
rspec-
|
52
|
-
rspec-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
rspec-expectations (3.10.0)
|
55
|
+
regexp_parser (2.10.0)
|
56
|
+
rspec (3.13.1)
|
57
|
+
rspec-core (~> 3.13.0)
|
58
|
+
rspec-expectations (~> 3.13.0)
|
59
|
+
rspec-mocks (~> 3.13.0)
|
60
|
+
rspec-core (3.13.5)
|
61
|
+
rspec-support (~> 3.13.0)
|
62
|
+
rspec-expectations (3.13.5)
|
57
63
|
diff-lcs (>= 1.2.0, < 2.0)
|
58
|
-
rspec-support (~> 3.
|
59
|
-
rspec-mocks (3.
|
64
|
+
rspec-support (~> 3.13.0)
|
65
|
+
rspec-mocks (3.13.5)
|
60
66
|
diff-lcs (>= 1.2.0, < 2.0)
|
61
|
-
rspec-support (~> 3.
|
62
|
-
rspec-support (3.
|
67
|
+
rspec-support (~> 3.13.0)
|
68
|
+
rspec-support (3.13.4)
|
63
69
|
rspec_vars_helper (0.1.0)
|
64
70
|
rspec (>= 2.4)
|
65
|
-
rubocop (1.
|
71
|
+
rubocop (1.79.0)
|
66
72
|
json (~> 2.3)
|
73
|
+
language_server-protocol (~> 3.17.0.2)
|
74
|
+
lint_roller (~> 1.1.0)
|
67
75
|
parallel (~> 1.10)
|
68
|
-
parser (>= 3.
|
76
|
+
parser (>= 3.3.0.2)
|
69
77
|
rainbow (>= 2.2.2, < 4.0)
|
70
|
-
regexp_parser (>=
|
71
|
-
|
72
|
-
rubocop-ast (>= 1.28.0, < 2.0)
|
78
|
+
regexp_parser (>= 2.9.3, < 3.0)
|
79
|
+
rubocop-ast (>= 1.46.0, < 2.0)
|
73
80
|
ruby-progressbar (~> 1.7)
|
74
|
-
|
75
|
-
|
76
|
-
|
81
|
+
tsort (>= 0.2.0)
|
82
|
+
unicode-display_width (>= 2.4.0, < 4.0)
|
83
|
+
rubocop-ast (1.46.0)
|
84
|
+
parser (>= 3.3.7.2)
|
85
|
+
prism (~> 1.4)
|
77
86
|
ruby-progressbar (1.13.0)
|
78
|
-
|
79
|
-
simplecov (0.
|
87
|
+
securerandom (0.4.1)
|
88
|
+
simplecov (0.22.0)
|
80
89
|
docile (~> 1.1)
|
81
90
|
simplecov-html (~> 0.11)
|
82
91
|
simplecov_json_formatter (~> 0.1)
|
83
|
-
simplecov-html (0.
|
84
|
-
simplecov_json_formatter (0.1.
|
92
|
+
simplecov-html (0.13.2)
|
93
|
+
simplecov_json_formatter (0.1.4)
|
94
|
+
tsort (0.2.0)
|
85
95
|
tzinfo (2.0.6)
|
86
96
|
concurrent-ruby (~> 1.0)
|
87
|
-
unicode-display_width (
|
97
|
+
unicode-display_width (3.1.4)
|
98
|
+
unicode-emoji (~> 4.0, >= 4.0.4)
|
99
|
+
unicode-emoji (4.0.4)
|
100
|
+
uri (1.0.3)
|
88
101
|
|
89
102
|
PLATFORMS
|
103
|
+
arm64-darwin-24
|
90
104
|
ruby
|
91
105
|
|
92
106
|
DEPENDENCIES
|
93
107
|
easy_params!
|
108
|
+
ostruct
|
94
109
|
pry
|
95
110
|
rake (~> 12.0)
|
96
111
|
rspec (~> 3.0)
|
@@ -99,4 +114,4 @@ DEPENDENCIES
|
|
99
114
|
simplecov (~> 0.17)
|
100
115
|
|
101
116
|
BUNDLED WITH
|
102
|
-
2.
|
117
|
+
2.7.1
|
data/README.md
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
# EasyParams
|
2
2
|
|
3
|
-
[](https://badge.fury.io/rb/easy_params)
|
4
4
|
[](https://codeclimate.com/github/andriy-baran/easy_params/maintainability)
|
5
5
|
[](https://codeclimate.com/github/andriy-baran/easy_params/test_coverage)
|
6
6
|
|
7
|
-
Provides an easy way define structure, validation rules, type coercion and
|
7
|
+
Provides an easy way to define structure, validation rules, type coercion, and default values for any hash-like structure. It's built on top of `ActiveModel`.
|
8
8
|
|
9
9
|
## Types
|
10
10
|
|
11
|
-
|
11
|
+
Available types: `integer`, `decimal`, `float`, `bool`, `string`, `array`, `date`, `datetime`, `time`
|
12
12
|
|
13
13
|
## Installation
|
14
14
|
|
@@ -32,20 +32,54 @@ To define attribute we have a set of methods which match types list. Ex.
|
|
32
32
|
```ruby
|
33
33
|
integer(param_name, default: nil, normalize: nil, **validations)
|
34
34
|
```
|
35
|
-
* `:default` provides a value to return if
|
36
|
-
*
|
37
|
-
* `validations`
|
35
|
+
* `:default` provides a value to return if we get `nil` as input or there were errors during coercion.
|
36
|
+
* `:normalize` is a Proc or lambda that accepts a single argument and transforms it. It gets called before coercion.
|
37
|
+
* `validations` mimic ActiveModel validations; can be any supported validation, e.g., `presence: true, numericality: { only_integer: true, greater_than: 0 }`
|
38
38
|
|
39
|
-
In addition
|
39
|
+
In addition, there is a special option for the `array` type:
|
40
40
|
* `:of` accepts `:integer`, `:decimal`, `:float`, `:bool`, `:string`, `:date`, `:datetime`, `:time` (`:array` is not supported)
|
41
41
|
|
42
42
|
There are two special types:
|
43
43
|
|
44
44
|
| type | method to define | default |
|
45
45
|
|-------------------|------------------|---------|
|
46
|
-
| :struct | has |
|
46
|
+
| :struct | has | nil |
|
47
47
|
| :array_of_structs | each | [] |
|
48
48
|
|
49
|
+
### Defaults for nested types
|
50
|
+
|
51
|
+
- **has (struct)**: `default:` must be a Hash. When the input is `nil`, the nested struct is instantiated with that hash; otherwise the provided input is used. If no `default:` is given and the input is `nil`, the value will be `nil`.
|
52
|
+
|
53
|
+
```ruby
|
54
|
+
has :shipping_address, default: { country: 'US' } do
|
55
|
+
string :country, default: 'US'
|
56
|
+
string :city
|
57
|
+
end
|
58
|
+
```
|
59
|
+
|
60
|
+
- **each (array_of_structs)**: `default:` should be an Array (typically an array of hashes). When the input is `nil`, the collection defaults to an empty array `[]`. If you provide a default array, each element will be coerced into the nested struct.
|
61
|
+
|
62
|
+
```ruby
|
63
|
+
each :items, default: [{ qty: 1 }] do
|
64
|
+
integer :qty, default: 1
|
65
|
+
end
|
66
|
+
```
|
67
|
+
|
68
|
+
- **Override precedence**: Container-level defaults override attribute-level defaults for the same keys. Attribute defaults apply only when the key is absent (or `nil`) in the provided default/input.
|
69
|
+
|
70
|
+
```ruby
|
71
|
+
has :user, default: { role: 'admin' } do
|
72
|
+
string :role, default: 'guest'
|
73
|
+
string :name, default: 'Anonymous'
|
74
|
+
end
|
75
|
+
# input: nil => role: 'admin', name: 'Anonymous'
|
76
|
+
|
77
|
+
each :items, default: [{ qty: 2 }, {}] do
|
78
|
+
integer :qty, default: 1
|
79
|
+
end
|
80
|
+
# input: nil => items.map(&:qty) == [2, 1]
|
81
|
+
```
|
82
|
+
|
49
83
|
```ruby
|
50
84
|
# app/params/api/v2/icqa/move_params.rb
|
51
85
|
class Api::V1::Carts::MoveParams < EasyParams::Base
|
@@ -83,7 +117,7 @@ To install this gem onto your local machine, run `bundle exec rake install`. To
|
|
83
117
|
|
84
118
|
## Contributing
|
85
119
|
|
86
|
-
Bug reports and pull requests are welcome on GitHub at https://github.com/
|
120
|
+
Bug reports and pull requests are welcome on GitHub at [github.com/andriy-baran/easy_params](https://github.com/andriy-baran/easy_params). This project is intended to be a safe, welcoming space for collaboration, and contributors are expected to adhere to the [code of conduct](https://github.com/andriy-baran/easy_params/blob/master/CODE_OF_CONDUCT.md).
|
87
121
|
|
88
122
|
|
89
123
|
## License
|
@@ -92,4 +126,4 @@ The gem is available as open source under the terms of the [MIT License](https:/
|
|
92
126
|
|
93
127
|
## Code of Conduct
|
94
128
|
|
95
|
-
Everyone interacting in the EasyParams project's codebases, issue trackers, chat rooms and mailing lists is expected to follow the [code of conduct](https://github.com/
|
129
|
+
Everyone interacting in the EasyParams project's codebases, issue trackers, chat rooms and mailing lists is expected to follow the [code of conduct](https://github.com/andriy-baran/easy_params/blob/master/CODE_OF_CONDUCT.md).
|
data/easy_params.gemspec
CHANGED
data/lib/easy_params/base.rb
CHANGED
@@ -7,9 +7,11 @@ module EasyParams
|
|
7
7
|
include EasyParams::Types::Struct
|
8
8
|
include EasyParams::Validation
|
9
9
|
|
10
|
+
attr_writer :default
|
11
|
+
|
10
12
|
def initialize(params = {})
|
11
13
|
self.class.schema.each do |attr, type|
|
12
|
-
public_send("#{attr}=", type.coerce(params[attr]))
|
14
|
+
public_send("#{attr}=", type.coerce(params.to_h[attr]))
|
13
15
|
end
|
14
16
|
end
|
15
17
|
|
@@ -28,25 +30,25 @@ module EasyParams
|
|
28
30
|
@schema ||= {}
|
29
31
|
end
|
30
32
|
|
31
|
-
def each(param_name, normalize: nil, **validations, &block)
|
33
|
+
def each(param_name, default: nil, normalize: nil, **validations, &block)
|
32
34
|
validates param_name, **validations if validations.any?
|
33
35
|
type = EasyParams::Types::Each.with_type(&block)
|
34
|
-
type = customize_type(type,
|
35
|
-
|
36
|
+
type = customize_type(type, default, &normalize)
|
37
|
+
attribute(param_name, type)
|
36
38
|
end
|
37
39
|
|
38
|
-
def has(param_name, normalize: nil, **validations, &block)
|
40
|
+
def has(param_name, default: nil, normalize: nil, **validations, &block)
|
39
41
|
validates param_name, **validations if validations.any?
|
40
42
|
type = Class.new(EasyParams::Types::Struct.class).tap { |c| c.class_eval(&block) }.new
|
41
|
-
type = customize_type(type,
|
42
|
-
|
43
|
+
type = customize_type(type, default, &normalize)
|
44
|
+
attribute(param_name, type)
|
43
45
|
end
|
44
46
|
|
45
|
-
def array(param_name, of:, normalize: nil, **validations)
|
47
|
+
def array(param_name, of:, default: nil, normalize: nil, **validations)
|
46
48
|
validates param_name, **validations if validations.any?
|
47
49
|
type = EasyParams::Types::Array.of(EasyParams::Types.const_get(of.to_s.camelcase))
|
48
|
-
type = customize_type(type,
|
49
|
-
|
50
|
+
type = customize_type(type, default, &normalize)
|
51
|
+
attribute(param_name, type)
|
50
52
|
end
|
51
53
|
|
52
54
|
private
|
@@ -64,7 +66,7 @@ module EasyParams
|
|
64
66
|
validates param_name, **validations if validations.any?
|
65
67
|
type = EasyParams::Types.const_get(type_name)
|
66
68
|
type = customize_type(type, default, &normalize)
|
67
|
-
|
69
|
+
attribute(param_name, type)
|
68
70
|
end
|
69
71
|
end
|
70
72
|
|
@@ -16,10 +16,10 @@ module EasyParams
|
|
16
16
|
end
|
17
17
|
|
18
18
|
def coerce(value)
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
19
|
+
input = value || @default
|
20
|
+
input = @normalize_proc.call(Array(input)) if @normalize_proc
|
21
|
+
coerced = Array(input).map { |v| @of_type.coerce(v) }
|
22
|
+
self.class.new(@title, coerced, @normalize_proc, of: @of_type, &@coerce_proc)
|
23
23
|
end
|
24
24
|
|
25
25
|
def normalize(&block)
|
@@ -19,14 +19,6 @@ module EasyParams
|
|
19
19
|
self.class.new(@title, value, @normalize_proc, &@coerce_proc)
|
20
20
|
end
|
21
21
|
|
22
|
-
def optional
|
23
|
-
self.class.new(@title, @default, @normalize_proc, &@coerce_proc)
|
24
|
-
end
|
25
|
-
|
26
|
-
def optional?
|
27
|
-
@optional
|
28
|
-
end
|
29
|
-
|
30
22
|
def normalize(&block)
|
31
23
|
self.class.new(@title, @default, block, &@coerce_proc)
|
32
24
|
end
|
@@ -8,8 +8,14 @@ module EasyParams
|
|
8
8
|
false
|
9
9
|
end
|
10
10
|
|
11
|
+
def default(value)
|
12
|
+
self.default = value
|
13
|
+
self
|
14
|
+
end
|
15
|
+
|
11
16
|
def coerce(input)
|
12
|
-
return if input.
|
17
|
+
return if input.nil? && @default.nil?
|
18
|
+
return self.class.new(@default) if input.nil? && @default.is_a?(Hash)
|
13
19
|
|
14
20
|
self.class.new(input)
|
15
21
|
end
|
data/lib/easy_params/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,13 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: easy_params
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.6.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Andrii Baran
|
8
|
-
autorequire:
|
9
8
|
bindir: exe
|
10
9
|
cert_chain: []
|
11
|
-
date:
|
10
|
+
date: 1980-01-02 00:00:00.000000000 Z
|
12
11
|
dependencies:
|
13
12
|
- !ruby/object:Gem::Dependency
|
14
13
|
name: activemodel
|
@@ -36,6 +35,7 @@ files:
|
|
36
35
|
- ".gitignore"
|
37
36
|
- ".rspec"
|
38
37
|
- ".rubocop.yml"
|
38
|
+
- ".ruby-version"
|
39
39
|
- ".travis.yml"
|
40
40
|
- CODE_OF_CONDUCT.md
|
41
41
|
- Gemfile
|
@@ -61,7 +61,6 @@ metadata:
|
|
61
61
|
allowed_push_host: https://rubygems.org
|
62
62
|
homepage_uri: https://github.com/andriy-baran/easy_params
|
63
63
|
source_code_uri: https://github.com/andriy-baran/easy_params
|
64
|
-
post_install_message:
|
65
64
|
rdoc_options: []
|
66
65
|
require_paths:
|
67
66
|
- lib
|
@@ -76,8 +75,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
76
75
|
- !ruby/object:Gem::Version
|
77
76
|
version: '0'
|
78
77
|
requirements: []
|
79
|
-
rubygems_version: 3.
|
80
|
-
signing_key:
|
78
|
+
rubygems_version: 3.7.1
|
81
79
|
specification_version: 4
|
82
80
|
summary: A tool that handles common tasks needed when working with params in Rails
|
83
81
|
test_files: []
|