paramore 3.5.0 → 3.6.3

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: 6340acf8c31895cbe076513a9523e161e9017f2941fd69740000c274233273fc
4
- data.tar.gz: 2c0cc6707f1876fb01cf75bcc2f5ce9f1e9e8480148523bcf5a45ebb3a4e64c3
3
+ metadata.gz: e733dfa7ee459ddb6414dd08d445849699d018c2a48d1f2e0b2f2931175b129b
4
+ data.tar.gz: ca5be42b9ea963be8af195748f1fc34979fbbc0b78ee0f5cb9894b67ab98086e
5
5
  SHA512:
6
- metadata.gz: 8d310cb628671876e4dc707f57e24aa79e11dd08da615ae1f8205aac3fd80de1c77243f7fa765ec4168464b9710bc97110c3835775de9ed5b42a09b10bcf6191
7
- data.tar.gz: cbfd5ffa27d01ad661f48d4bc8bf0d23288426ae14a73cd565c99ee8c8d0b9b2f64a4b57cbdadcabda0848ab227da951927fe75126200e347aa11abed7c55e5b
6
+ metadata.gz: ae3f9d54ff493f62b2b6ca3ab8b6d091649123b91f0eaba6f5c3176785bd829576ecea2fdd7a6302e30f778c9119c9719f3d8e6bad4674619baf1bf03316b5e8
7
+ data.tar.gz: dc4d963d8e24f838419647f4a7cf2c2591466844d7dc89f99f69ffbb1d0726e2d659101b1f5f9399dcfef762ff3231b1bd3c756ecd37cfe3b1bac1be6f20317b
@@ -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
@@ -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.5.0
4
+ version: 3.6.3
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.3 !
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