paramore 2.0.0 → 3.0.0

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: 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