paramore 3.4.0 → 3.6.2

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
  SHA256:
3
- metadata.gz: 8e8663a895e1498608035c7717e8a881617d1ba889e67e6115472117717963fc
4
- data.tar.gz: 3e6b5675baeae13d31abee6f1ed4b77261ed233be87e42a5277ce803f5801c0e
3
+ metadata.gz: fca99d33c8a3b32eb98a7d4594ca566d7a5c2a114b4c6b29b3d5067416760739
4
+ data.tar.gz: e42a6eb5ddb69906005d91ff8e22aa0928062c01e9e00ce7a6b4d50599d4c18e
5
5
  SHA512:
6
- metadata.gz: b51afaf562c8671afadd367cdb9388d50b77939d5aaf939cc54f3b00e0046ee8ff218a54c04e29db3979edfb46635a2fb387643dc726c61c513a658c821c9a2a
7
- data.tar.gz: 24528d33bbb924bfb1c75f7ee24a9c0853ae0c6af357695df0a3e29771a2e6084df26a4259e494d548bac1e26c781b862a5d0b4e1df9a480cdeb515d3e1ceaeb
6
+ metadata.gz: e64d230fa1408afe666295e454431aeef715d9a4fdcdc9a3284feff7bd5b57a1da33a9455d6179f9da14d65c6a09c3aa39d82ff066947bf172df5d42424bac1b
7
+ data.tar.gz: d179870cc3a1eb6013bebbf12868a4d377228d0c62899c17886cbf5d08809aa96704da6f888473989cd39e7091bc36e306464f0fce5f331bcec0d1b0f0baf38d
@@ -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
 
@@ -8,6 +7,10 @@ module Paramore
8
7
  default
9
8
  ].freeze
10
9
 
10
+ def field(*args)
11
+ Paramore.field(*args)
12
+ end
13
+
11
14
  def param_schema(accessor_name, parameter_configuration)
12
15
  unless parameter_configuration.keys.size == 1
13
16
  raise ArgumentError,
@@ -17,8 +20,6 @@ module Paramore
17
20
  required_parameter_name = parameter_configuration.keys.first
18
21
  types_definition = parameter_configuration.values.first
19
22
 
20
- Paramore::Validate.run(types_definition) if types_definition.is_a?(Paramore::Field)
21
-
22
23
  permitted_parameter_argument =
23
24
  if types_definition.is_a?(Paramore::Field)
24
25
  Paramore::PermittedParameterArgument.parse(types_definition)
@@ -41,7 +42,7 @@ module Paramore
41
42
  parameter_values =
42
43
  if types_definition.is_a?(Paramore::Field)
43
44
  permitted_params.merge(
44
- Paramore::CastParameters.run(types_definition, permitted_params)
45
+ Paramore::CastParameters.run(types_definition, permitted_params.to_hash.with_indifferent_access)
45
46
  ).permit!
46
47
  else
47
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
@@ -13,11 +13,15 @@ module Paramore
13
13
  parse_type(type.first)
14
14
  when Hash
15
15
  type.map do |name, field|
16
- case field.type
17
- when Array, Hash
18
- { name => parse_type(field.type) }
16
+ if field.wildly_keyed_hash?
17
+ { name => {} }
19
18
  else
20
- name
19
+ case field.type
20
+ when Array, Hash
21
+ { name => parse_type(field.type) }
22
+ else
23
+ name
24
+ end
21
25
  end
22
26
  end
23
27
  else
@@ -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
+ Date.parse(input)
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.4.0
4
+ version: 3.6.2
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.4.0 !
118
+ Thank you for installing Paramore 3.6.2 !
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