paramore 3.5.0 → 3.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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 6340acf8c31895cbe076513a9523e161e9017f2941fd69740000c274233273fc
4
- data.tar.gz: 2c0cc6707f1876fb01cf75bcc2f5ce9f1e9e8480148523bcf5a45ebb3a4e64c3
3
+ metadata.gz: 0e3e663f7752add2ed7c167643bdc789c5aec5421455440f094942b06ca49c57
4
+ data.tar.gz: 9ccdaec01fdd4e5ce1b337d3e8ca7a84c812acd38b817d015b980d279b0d43c9
5
5
  SHA512:
6
- metadata.gz: 8d310cb628671876e4dc707f57e24aa79e11dd08da615ae1f8205aac3fd80de1c77243f7fa765ec4168464b9710bc97110c3835775de9ed5b42a09b10bcf6191
7
- data.tar.gz: cbfd5ffa27d01ad661f48d4bc8bf0d23288426ae14a73cd565c99ee8c8d0b9b2f64a4b57cbdadcabda0848ab227da951927fe75126200e347aa11abed7c55e5b
6
+ metadata.gz: a571718b5125d6d7f6078b85cb0ef4d201c33731ad8a4eb4255550746562bdd6824a5207a11ec6a3a58a044e0cc5c5a78f0acd33246f7e419e1be1049f3c4eee
7
+ data.tar.gz: 3966ac01cadb45e454b001fbd0044778794dc437af95a6c3faeefe0663a9412a910ffa4fdede25b7508c4f029185ace67af5975630bde5d970b55311df7e1a38
@@ -18,36 +18,53 @@ module Paramore
18
18
 
19
19
  case field.type
20
20
  when Hash
21
- typecast_hash(field, value || {})
21
+ typecast_hash(field, value || {}, name)
22
22
  when Array
23
- typecast_array(field, value)
23
+ typecast_array(field, value, name)
24
24
  else
25
25
  if value == '' && !field.allow_empty? && field.nullable?
26
26
  nil
27
27
  else
28
- typecast_value(field.type, value)
28
+ typecast_value(field.type, value, name)
29
29
  end
30
30
  end
31
31
  end
32
32
 
33
- def typecast_hash(field, hash)
34
- result = field
35
- .type
36
- .reject { |name, inner_field| !hash.key?(name) && !inner_field.required? }
37
- .to_h { |name, inner_field| [name, cast(inner_field, hash[name], name)] }
33
+ def typecast_hash(field, hash, name)
34
+ raise Paramore::HashExpected.new(name, hash) unless hash.is_a?(Hash)
35
+
36
+ result =
37
+ if field.wildly_keyed_hash?
38
+ value_field = field.type.values.first
39
+ key_type = field.type.keys.first
40
+ hash.to_h do |name, value|
41
+ [typecast_value(key_type, name, nil), cast(value_field, value, name)]
42
+ end
43
+ else
44
+ field
45
+ .type
46
+ .reject { |name, value_field| missing_and_optional?(hash, name, value_field) }
47
+ .to_h { |name, value_field| [name, cast(value_field, hash[name], name)] }
48
+ end
49
+
50
+
38
51
  field.compact? ? result.compact : result
39
52
  end
40
53
 
41
- def typecast_array(field, array)
54
+ def typecast_array(field, array, name)
55
+ raise Paramore::ArrayExpected.new(name, array) unless array.is_a?(Array)
56
+
42
57
  array
43
58
  .reject { |unit| unit.to_s == '' && field.compact? }
44
- .map do |unit|
45
- cast(Paramore.field(field.type.first, null: true), unit)
46
- end
59
+ .map { |unit| cast(Paramore.field(field.type.first, null: true), unit) }
47
60
  end
48
61
 
49
- def typecast_value(type, value)
62
+ def typecast_value(type, value, name)
50
63
  type.send(Paramore.configuration.type_method_name, value)
51
64
  end
65
+
66
+ def missing_and_optional?(hash, name, field)
67
+ !hash.key?(name) && !field.required?
68
+ end
52
69
  end
53
70
  end
@@ -9,3 +9,21 @@ class Paramore::NonField < StandardError
9
9
  super("`#{param_name}` defined as a `#{type.class}`, expected a call of `Paramore.field()`! Perhaps you declared a plain hash instead of Paramore.field({})?")
10
10
  end
11
11
  end
12
+
13
+ class Paramore::HashExpected < StandardError
14
+ def initialize(param_name, param)
15
+ super("Expected `#{param_name}` to be a hash, received #{param.class} instead!")
16
+ end
17
+ end
18
+
19
+ class Paramore::ArrayExpected < StandardError
20
+ def initialize(param_name, param)
21
+ super("Expected `#{param_name}` to be an array, received #{param.class} instead!")
22
+ end
23
+ end
24
+
25
+ class Paramore::HashTooWild < StandardError
26
+ def initialize(hash)
27
+ super("A hash field with a type as key may not contain any more entries! (so, eg.: { String => field } is ok, but { String => field, user_id: field } is not)")
28
+ end
29
+ end
@@ -1,4 +1,3 @@
1
- require_relative 'validate'
2
1
  require_relative 'cast_parameters'
3
2
  require_relative 'permitted_parameter_argument'
4
3
 
@@ -21,8 +20,6 @@ module Paramore
21
20
  required_parameter_name = parameter_configuration.keys.first
22
21
  types_definition = parameter_configuration.values.first
23
22
 
24
- Paramore::Validate.run(types_definition) if types_definition.is_a?(Paramore::Field)
25
-
26
23
  permitted_parameter_argument =
27
24
  if types_definition.is_a?(Paramore::Field)
28
25
  Paramore::PermittedParameterArgument.parse(types_definition)
@@ -45,7 +42,7 @@ module Paramore
45
42
  parameter_values =
46
43
  if types_definition.is_a?(Paramore::Field)
47
44
  permitted_params.merge(
48
- Paramore::CastParameters.run(types_definition, permitted_params)
45
+ Paramore::CastParameters.run(types_definition, permitted_params.to_hash.with_indifferent_access)
49
46
  ).permit!
50
47
  else
51
48
  permitted_params.permit!
@@ -1,3 +1,5 @@
1
+ require_relative 'validate'
2
+
1
3
  module Paramore
2
4
  class Field
3
5
  DEFAULT_OPTIONS = {
@@ -44,5 +46,17 @@ module Paramore
44
46
  def type
45
47
  @given_type
46
48
  end
49
+
50
+ def wildly_keyed_hash?
51
+ type.is_a?(Hash) && self.class.wildly_keyed_hash?(type)
52
+ end
53
+
54
+ def validate!
55
+ Paramore::Validate.run(self)
56
+ end
57
+
58
+ def self.wildly_keyed_hash?(hash)
59
+ hash.keys.any? { |key| [Class, Module].include?(key.class) }
60
+ end
47
61
  end
48
62
  end
@@ -49,4 +49,11 @@ module Paramore
49
49
  Paramore::StrippedString[input].squeeze(' ')
50
50
  end
51
51
  end
52
+
53
+ module Date
54
+ module_function
55
+ def [](input)
56
+ input.to_date
57
+ end
58
+ end
52
59
  end
@@ -26,11 +26,23 @@ module Paramore
26
26
  end
27
27
 
28
28
  def hash_types(hash)
29
+ validate_wildly_keyed_hash!(hash)
30
+
29
31
  hash.flat_map do |param_name, field|
30
32
  raise Paramore::NonField.new(param_name, field) unless field.is_a?(Paramore::Field)
31
33
 
32
34
  field.type.is_a?(Hash) ? types(field.type) : field.type
33
35
  end.uniq
34
36
  end
37
+
38
+ def validate_wildly_keyed_hash!(hash)
39
+ if Paramore::Field.wildly_keyed_hash?(hash) && hash.keys.map(&:class).count > 1
40
+ raise Paramore::HashTooWild.new(hash)
41
+ end
42
+ end
43
+
44
+ def wildly_keyed_hash?(hash)
45
+ [Class, Module].include?(hash.keys.first.class)
46
+ end
35
47
  end
36
48
  end
data/lib/paramore.rb CHANGED
@@ -20,6 +20,6 @@ module Paramore
20
20
  Paramore::Field.new(
21
21
  given_type,
22
22
  **Paramore::Field::DEFAULT_OPTIONS.merge(options)
23
- )
23
+ ).validate!
24
24
  end
25
25
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: paramore
3
3
  version: !ruby/object:Gem::Version
4
- version: 3.5.0
4
+ version: 3.6.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Lukas Kairevičius
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2021-09-27 00:00:00.000000000 Z
11
+ date: 2021-09-29 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rspec-rails
@@ -52,6 +52,20 @@ dependencies:
52
52
  - - "~>"
53
53
  - !ruby/object:Gem::Version
54
54
  version: '1.3'
55
+ - !ruby/object:Gem::Dependency
56
+ name: pry
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - ">="
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - ">="
67
+ - !ruby/object:Gem::Version
68
+ version: '0'
55
69
  - !ruby/object:Gem::Dependency
56
70
  name: rails
57
71
  requirement: !ruby/object:Gem::Requirement
@@ -101,7 +115,7 @@ licenses:
101
115
  - MIT
102
116
  metadata: {}
103
117
  post_install_message: |
104
- Thank you for installing Paramore 3.5.0 !
118
+ Thank you for installing Paramore 3.6.0 !
105
119
  From the command line you can run `paramore` to generate a configuration file
106
120
 
107
121
  More details here : https://github.com/lumzdas/paramore/blob/master/README.md
@@ -120,7 +134,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
120
134
  - !ruby/object:Gem::Version
121
135
  version: '0'
122
136
  requirements: []
123
- rubygems_version: 3.0.8
137
+ rubygems_version: 3.2.3
124
138
  signing_key:
125
139
  specification_version: 4
126
140
  summary: A declarative approach to Rails' strong parameter typing and sanitizing