paramore 2.0.0 → 3.0.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: 6bc18680611ecf9983143593443a9d04e3a7b57ac77111f183960287600a9592
4
- data.tar.gz: 613b869bddc6de6a585e8de9f0448373a40da62d4daecf736e19e0955fa477ed
3
+ metadata.gz: 7f6231e51cfe1acb4969ec05739c8386d6c772d5df241dee728fa2428e6bfc2a
4
+ data.tar.gz: 7bc786c9b1a163b1bcc6774c8a709d68e80b36cca3c69c6d501f98084d6538e9
5
5
  SHA512:
6
- metadata.gz: efb59cc8e0ee2d9bb324f8d543ff7e5e22a652d4bc23b5ea067b5fdadb3d47cd85ea228d5d855e47a43980f2723b8dc7983d11f592c44404607c00967b522788
7
- data.tar.gz: aba0613b0838fd1b1d523bfe62913e33f1b4be678891c0794db7af2aa3138cd9755ff3c8c9b501e13203ccb49c94cd6d04e303d43bb7df4951279cdc22ff7c44
6
+ metadata.gz: 1665184eba554c3216a5d8185535695dcfbb9e5ce5a38559acac184130ee4f7787065ac72445c258873a7479ac1c2ecaab34f6a68b65f607da6b96542a317a0c
7
+ data.tar.gz: 834d1432f9958709891ccd285280d4dd7f21caab56c1aa7d88d5178a4ef7745d0c5340553d346fbd32d4f17a6d525fd3e872c399640820940ef8830fca34ec99
data/README.md CHANGED
@@ -75,15 +75,15 @@ class ItemsController < ApplicationController
75
75
  end
76
76
 
77
77
  param_schema :item_params,
78
- item: {
78
+ item: Paramore.field({
79
79
  name: Paramore.field(Paramore::SanitizedString),
80
80
  description: Paramore.field(Paramore::StrippedString, null: true),
81
- for_sale: Paramore.field(Paramore::Boolean),
81
+ for_sale: Paramore.field(Paramore::Boolean, default: false),
82
82
  price: Paramore.field(Paramore::Decimal),
83
83
  metadata: Paramore.field({
84
84
  tags: Paramore.field([Types::ItemTag], compact: true)
85
85
  })
86
- }
86
+ })
87
87
  end
88
88
  ```
89
89
 
@@ -133,8 +133,7 @@ This can be disabled for any type by declaring `Paramore.field(Paramore::Int, nu
133
133
 
134
134
  nils will usually not reach any of the type classes - if some parameter is nullable, the class will not be called.
135
135
  If a parameter is non-nullable, then a `Paramore::NilParameter` error will be raised before calling the class.
136
- If a, say, `item_ids` array is non-nullable, but the received parameter is `['1', '', '3']`, only the `'1'` and `'2'` will get passed to type classes, and the resulting array will contain a nil, eg.: `['1', nil, '3']`.
137
- nils inside arrays can still be passed to type classes by declaring `Paramore.field([Paramore::Int], empty: true)`.
136
+ If an incoming array contains nils, they will get passed to type classes.
138
137
  If you wish to get rid of empty array elements, declare `Paramore.field(Paramore::Int, compact: true)`.
139
138
 
140
139
  <h3>Configuration</h3>
@@ -3,59 +3,49 @@ require_relative 'errors'
3
3
  module Paramore
4
4
  module CastParameters
5
5
  module_function
6
- def run(types_definition, permitted_params)
7
- recursive_merge(
8
- recursive_typecast(
9
- types_definition, permitted_params
10
- )
11
- )
6
+ def run(field, data)
7
+ recursive_merge(cast(field, data, 'data'))
12
8
  end
13
9
 
14
10
  def recursive_merge(nested_hash_array)
15
- nested_hash_array.reduce(:merge).map do |param_name, value|
11
+ nested_hash_array.reduce(:merge).map do |name, value|
16
12
  if value.is_a?(Array) && value.all? { |_value| _value.is_a?(Hash) }
17
- { param_name => recursive_merge(value) }
13
+ { name => recursive_merge(value) }
18
14
  else
19
- { param_name => value }
15
+ { name => value }
20
16
  end
21
17
  end.reduce(:merge)
22
18
  end
23
19
 
24
- def recursive_typecast(types_definition, permitted_params)
25
- types_definition.map do |param_name, definition|
26
- value = permitted_params[param_name]
27
-
28
- if value.nil?
29
- if definition.nullable?
30
- next { param_name => nil }
31
- else
32
- raise Paramore::NilParameter, param_name
33
- end
20
+ def cast(field, value, name = nil)
21
+ if value.nil?
22
+ if field.nullable? || field.default
23
+ return field.default
24
+ else
25
+ raise Paramore::NilParameter, name
34
26
  end
35
-
36
- { param_name => cast(definition, value) }
37
27
  end
38
- end
39
28
 
40
- def cast(definition, value)
41
- case definition.type
29
+ case field.type
42
30
  when Hash
43
- recursive_typecast(definition.type, value || {})
31
+ typecast_hash(field.type, value || {})
44
32
  when Array
45
- typecast_array(definition, value)
33
+ typecast_array(field, value)
46
34
  else
47
- typecast_value(definition.type, value)
35
+ typecast_value(field.type, value)
48
36
  end
49
37
  end
50
38
 
51
- def typecast_array(definition, array)
39
+ def typecast_hash(field, hash)
40
+ field.map do |name, field|
41
+ { name => cast(field, hash[name], name) }
42
+ end
43
+ end
44
+
45
+ def typecast_array(field, array)
52
46
  array
53
- .reject { |unit| unit.to_s == '' && definition.compact? }
54
- .map do |unit|
55
- if unit.to_s != '' || definition.use_empty_strings?
56
- typecast_value(definition.type.first, unit)
57
- end
58
- end
47
+ .reject { |unit| unit.to_s == '' && field.compact? }
48
+ .map { |unit| typecast_value(field.type.first, unit) }
59
49
  end
60
50
 
61
51
  def typecast_value(type, value)
@@ -4,7 +4,7 @@ class Paramore::NilParameter < StandardError
4
4
  end
5
5
  end
6
6
 
7
- class Paramore::NonFieldSchema < StandardError
7
+ class Paramore::NonField < StandardError
8
8
  def initialize(param_name, type)
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
@@ -8,9 +8,7 @@ module Paramore
8
8
  default
9
9
  ].freeze
10
10
 
11
- def param_schema(accessor_name, configuration)
12
- parameter_configuration = configuration.except(*OPTIONS)
13
-
11
+ def param_schema(accessor_name, parameter_configuration)
14
12
  unless parameter_configuration.keys.size == 1
15
13
  raise ArgumentError,
16
14
  "Paramore: exactly one required attribute allowed! Given: #{parameter_configuration.keys}"
@@ -19,10 +17,10 @@ module Paramore
19
17
  required_parameter_name = parameter_configuration.keys.first
20
18
  types_definition = parameter_configuration.values.first
21
19
 
22
- Paramore::Validate.run(types_definition) if types_definition.is_a?(Hash)
20
+ Paramore::Validate.run(types_definition) if types_definition.is_a?(Paramore::Field)
23
21
 
24
22
  permitted_parameter_argument =
25
- if types_definition.is_a?(Hash)
23
+ if types_definition.is_a?(Paramore::Field)
26
24
  Paramore::PermittedParameterArgument.parse(types_definition)
27
25
  else
28
26
  types_definition
@@ -31,8 +29,8 @@ module Paramore
31
29
  define_method(accessor_name) do |rails_parameters = params|
32
30
  return instance_variable_get("@#{accessor_name}") if instance_variable_defined?("@#{accessor_name}")
33
31
 
34
- if rails_parameters[required_parameter_name].nil? && configuration[:default]
35
- instance_variable_set("@#{accessor_name}", configuration[:default])
32
+ if rails_parameters[required_parameter_name].nil? && types_definition.default
33
+ instance_variable_set("@#{accessor_name}", types_definition.default)
36
34
  return instance_variable_get("@#{accessor_name}")
37
35
  end
38
36
 
@@ -41,7 +39,7 @@ module Paramore
41
39
  .permit(permitted_parameter_argument)
42
40
 
43
41
  parameter_values =
44
- if types_definition.is_a?(Hash)
42
+ if types_definition.is_a?(Paramore::Field)
45
43
  permitted_params.merge(
46
44
  Paramore::CastParameters.run(types_definition, permitted_params)
47
45
  ).permit!
@@ -1,36 +1,32 @@
1
1
  module Paramore
2
- class FieldSchema
2
+ class Field
3
3
  DEFAULT_OPTIONS = {
4
4
  null: false,
5
- empty: false,
6
5
  compact: false,
6
+ default: nil,
7
7
  }.freeze
8
8
 
9
- def initialize(given_type, null:, empty:, compact:)
9
+ def initialize(given_type, null:, compact:, default:)
10
10
  @given_type = given_type
11
11
  @nullable = null
12
- @empty = empty
13
12
  @compact = compact
13
+ @default = default
14
14
  end
15
15
 
16
- def compact?
17
- compact
16
+ def default
17
+ @default
18
18
  end
19
19
 
20
- def nullable?
21
- nullable
20
+ def compact?
21
+ @compact
22
22
  end
23
23
 
24
- def use_empty_strings?
25
- empty
24
+ def nullable?
25
+ @nullable
26
26
  end
27
27
 
28
28
  def type
29
- given_type
29
+ @given_type
30
30
  end
31
-
32
- private
33
-
34
- attr_reader :given_type, :nullable, :empty, :compact
35
31
  end
36
32
  end
@@ -2,22 +2,26 @@ module Paramore
2
2
  module PermittedParameterArgument
3
3
  module_function
4
4
 
5
- def parse(types_definition)
5
+ def parse(field)
6
+ parse_type(field.type)
7
+ end
8
+
9
+ def parse_type(type)
6
10
  merge_hashes(
7
- types_definition.map do |key, definition|
8
- case definition
9
- when Hash
10
- { key => merge_hashes(parse(definition)) }
11
- when Paramore::FieldSchema
12
- case definition.type
13
- when Array
14
- { key => [] }
15
- when Hash
16
- { key => merge_hashes(parse(definition.type)) }
11
+ case type
12
+ when Array
13
+ parse_type(type.first)
14
+ when Hash
15
+ type.map do |name, field|
16
+ case field.type
17
+ when Array, Hash
18
+ { name => parse_type(field.type) }
17
19
  else
18
- key
20
+ name
19
21
  end
20
22
  end
23
+ else
24
+ []
21
25
  end
22
26
  )
23
27
  end
@@ -2,8 +2,8 @@ module Paramore
2
2
  module Validate
3
3
  module_function
4
4
 
5
- def run(types_definition)
6
- types(types_definition).each do |type|
5
+ def run(root_field)
6
+ types(root_field.type).uniq.each do |type|
7
7
  unless type.respond_to?(Paramore.configuration.type_method_name)
8
8
  raise NoMethodError,
9
9
  "Paramore: type `#{type}` does not respond to " +
@@ -12,13 +12,22 @@ module Paramore
12
12
  end
13
13
  end
14
14
 
15
- def types(types_definition)
16
- types_definition.flat_map do |param_name, field_schema|
17
- unless field_schema.is_a?(Paramore::FieldSchema)
18
- raise Paramore::NonFieldSchema.new(param_name, field_schema)
19
- end
15
+ def types(type)
16
+ case type
17
+ when Hash
18
+ hash_types(type)
19
+ when Array
20
+ type.flat_map { |subtype| types(subtype) }
21
+ else
22
+ [type]
23
+ end
24
+ end
25
+
26
+ def hash_types(hash)
27
+ hash.flat_map do |param_name, field|
28
+ raise Paramore::NonField.new(param_name, field) unless field.is_a?(Paramore::Field)
20
29
 
21
- field_schema.type.is_a?(Hash) ? types(field_schema.type) : field_schema.type
30
+ field.type.is_a?(Hash) ? types(field.type) : field.type
22
31
  end.uniq
23
32
  end
24
33
  end
data/lib/paramore.rb CHANGED
@@ -1,7 +1,7 @@
1
1
  require_relative 'paramore/configuration'
2
2
  require_relative 'paramore/railtie'
3
3
  require_relative 'paramore/types'
4
- require_relative 'paramore/field_schema'
4
+ require_relative 'paramore/field'
5
5
 
6
6
  module Paramore
7
7
  class << self
@@ -17,9 +17,9 @@ module Paramore
17
17
  end
18
18
 
19
19
  def self.field(given_type, options = {})
20
- Paramore::FieldSchema.new(
20
+ Paramore::Field.new(
21
21
  given_type,
22
- **Paramore::FieldSchema::DEFAULT_OPTIONS.merge(options)
22
+ **Paramore::Field::DEFAULT_OPTIONS.merge(options)
23
23
  )
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: 2.0.0
4
+ version: 3.0.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-08-30 00:00:00.000000000 Z
11
+ date: 2021-09-15 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rspec-rails
@@ -91,7 +91,7 @@ files:
91
91
  - lib/paramore/configuration.rb
92
92
  - lib/paramore/errors.rb
93
93
  - lib/paramore/extension.rb
94
- - lib/paramore/field_schema.rb
94
+ - lib/paramore/field.rb
95
95
  - lib/paramore/permitted_parameter_argument.rb
96
96
  - lib/paramore/railtie.rb
97
97
  - lib/paramore/types.rb
@@ -101,7 +101,7 @@ licenses:
101
101
  - MIT
102
102
  metadata: {}
103
103
  post_install_message: |
104
- Thank you for installing Paramore 2.0.0 !
104
+ Thank you for installing Paramore 3.0.0 !
105
105
  From the command line you can run `paramore` to generate a configuration file
106
106
 
107
107
  More details here : https://github.com/lumzdas/paramore/blob/master/README.md