attribeauty 0.3.2 → 0.3.4

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: 16789f41e6c0cfea21c44f2f71fc3fd0c9664791ed8d1c97648834be86db6e92
4
- data.tar.gz: e8c5ac4397043090870ffeacc5f4b1ae0565f0b7e85237a47254a41e31258032
3
+ metadata.gz: 04be2abe193a7faca2c172bb90713086e2a656bada649e0356ada8a444f54993
4
+ data.tar.gz: e86ca7fb0fbc2d8e20679be174a98eced95c6facf3d98d2b3d1983961e99a9c8
5
5
  SHA512:
6
- metadata.gz: 06c7ca8c0f104cc00ac9854fd4d5c31c043daf65c4d993c32da3dc0472ce4be296ebc2640e2b8b759fb6d99ba07d54e4a8b3c251c183da2048b22eb7da23af78
7
- data.tar.gz: 13eb48b958c5cfd1da319a33326449e86683b90f9c89631964c4397d9447334a025b7b3647c87f40ad8c11465c51af7f73e32319ad0c9e344757d823f58e19a8
6
+ metadata.gz: 1fe0d80aca7c85b8a34bf233f8b72133f16b75eea1a1800e8046efe5df1b19612a060662dc4c80bbbcffd0462d8cf2dee229a1c36228bba155dcff1058d814a7
7
+ data.tar.gz: 42ab8159a2117c43956b84699f7ba9025a156e854e355f389424b810ecdfa90ee83f2fbdbdf71b43b650f723d1310288c18dc0f1e03f0f4765f193a8d58a1cc0
data/.rubocop.yml CHANGED
@@ -29,3 +29,6 @@ Metrics/PerceivedComplexity:
29
29
 
30
30
  Metrics/CyclomaticComplexity:
31
31
  Enabled: false
32
+
33
+ Naming::BlockForwarding:
34
+ Enabled: false
data/CHANGELOG.md CHANGED
@@ -1,5 +1,13 @@
1
1
  ## [Unreleased]
2
2
 
3
+ ## [0.3.4] - 2024-06-24
4
+
5
+ - tiny refactor
6
+
7
+ ## [0.3.3] - 2024-06-24
8
+
9
+ - handle nil in types. Big refactor
10
+
3
11
  ## [0.3.2] - 2024-06-24
4
12
 
5
13
  - added accept! method to raise error if "required's" are missing
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- attribeauty (0.3.2)
4
+ attribeauty (0.3.4)
5
5
 
6
6
  GEM
7
7
  remote: https://rubygems.org/
@@ -44,31 +44,14 @@ module Attribeauty
44
44
  yield
45
45
  end
46
46
 
47
- # rubocop:disable Naming::BlockForwarding
47
+ #
48
48
  def attribute(name, type = nil, **args, &block)
49
49
  value = request_params[name]
50
- return if value.nil? && args[:required].nil?
51
-
52
- if block_given?
53
- @to_h[name] =
54
- if value.is_a?(Array)
55
- value.map do |val|
56
- params = self.class.with(val).accept(&block)
57
- @errors.push(*params.errors)
58
- params
59
- end.reject(&:empty?)
60
- else
61
- params = self.class.with(value).accept(&block)
62
- @errors.push(*params.errors)
63
- params
64
- end
65
- else
66
- validator = Validator.run(name, type, value, **args)
67
- @to_h[name.to_sym] = validator.value if validator.valid?
68
- @errors.push(*validator.errors)
69
- end
50
+ return if required?(value, **args)
51
+ return hash_from_nested(name, value, &block) if block_given?
52
+
53
+ value_from_validator(name, value, type, **args)
70
54
  end
71
- # rubocop:enable Naming::BlockForwarding
72
55
 
73
56
  def inspect
74
57
  to_h.inspect
@@ -81,5 +64,32 @@ module Attribeauty
81
64
  def strict?
82
65
  strict
83
66
  end
67
+
68
+ private
69
+
70
+ def required?(value, **args)
71
+ value.nil? && args[:required].nil?
72
+ end
73
+
74
+ def value_from_validator(name, value, type, **args)
75
+ validator = Validator.run(name, value, type, **args)
76
+ @errors.push(*validator.errors)
77
+ @to_h[name.to_sym] = validator.value if validator.valid?
78
+ end
79
+
80
+ def hash_from_nested(name, value, &block)
81
+ @to_h[name.to_sym] =
82
+ if value.is_a?(Array)
83
+ value.map do |val|
84
+ params = self.class.with(val).accept(&block)
85
+ @errors.push(*params.errors)
86
+ params.to_h
87
+ end.reject(&:empty?)
88
+ else
89
+ params = self.class.with(value).accept(&block)
90
+ @errors.push(*params.errors)
91
+ params.to_h
92
+ end
93
+ end
84
94
  end
85
95
  end
@@ -16,6 +16,8 @@ module Attribeauty
16
16
  ].to_set.freeze
17
17
 
18
18
  def cast(value)
19
+ return false if value.nil?
20
+
19
21
  !FALSE_VALUES.include?(value)
20
22
  end
21
23
  end
@@ -5,6 +5,8 @@ module Attribeauty
5
5
  # custom float type
6
6
  class Float
7
7
  def cast(value)
8
+ return if value.nil?
9
+
8
10
  Float(value)
9
11
  end
10
12
  end
@@ -5,6 +5,8 @@ module Attribeauty
5
5
  # custom integer type
6
6
  class Integer
7
7
  def cast(value)
8
+ return if value.nil?
9
+
8
10
  Integer(value)
9
11
  end
10
12
  end
@@ -5,6 +5,8 @@ module Attribeauty
5
5
  # custom string type
6
6
  class String
7
7
  def cast(value)
8
+ return if value.nil?
9
+
8
10
  String(value)
9
11
  end
10
12
  end
@@ -5,6 +5,8 @@ module Attribeauty
5
5
  # custom Time type
6
6
  class Time
7
7
  def cast(value)
8
+ return if value.nil?
9
+
8
10
  case value
9
11
  when Time
10
12
  value
@@ -1,7 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require "forwardable"
4
-
5
3
  module Attribeauty
6
4
  class Validator
7
5
  ALLOWS_HASH = {
@@ -9,55 +7,82 @@ module Attribeauty
9
7
  allow_empty: :empty?
10
8
  }.freeze
11
9
 
12
- def self.run(name, type, original_value, **args)
13
- new(name, type, original_value, **args).run
10
+ def self.run(name, type, original_val, **args)
11
+ new(name, type, original_val, **args).run
14
12
  end
15
13
 
16
- attr_reader :original_value, :errors, :name, :type, :required, :default, :predicate, :value
14
+ attr_reader :original_val, :errors, :name, :type, :required, :default, :allows, :value, :valid
17
15
 
18
- def initialize(name, type, original_value, **args)
16
+ def initialize(name, original_val, type = nil, **args)
19
17
  @name = name
20
18
  @type = type
21
- @original_value = original_value
22
- @errors = []
19
+ @original_val = original_val
23
20
  @default = args[:default]
24
- @required = args[:required] if [true, false].include?(args[:required])
25
- allows = args.slice(*allows_array)
26
- return if allows.empty?
21
+ @required = args[:required] if args[:required] == true
22
+ @allows = args.slice(*allows_array).delete_if { |_key, value| value == true }
27
23
 
28
- predicate_array = allows.first
29
- predicate_array[0] = :"#{ALLOWS_HASH[predicate_array[0]]}"
30
- @predicate = predicate_array
24
+ @valid = true
25
+ @errors = []
31
26
  end
32
27
 
33
28
  def run
34
- @original_value = default if original_value.nil? && !default.nil?
35
- @value = TypeCaster.run(original_value, type)
29
+ if type.nil?
30
+ @value = original_val
31
+ else
32
+ set_default
33
+ cast_value
34
+ handle_missing_required
35
+ handle_predicates
36
+ end
36
37
 
37
38
  self
38
39
  end
39
40
 
40
41
  def valid?
41
- if required? && original_value.nil?
42
- errors << "#{name} required"
43
- return false
44
- end
45
- return true if predicate.nil?
42
+ valid
43
+ end
46
44
 
47
- method, bool = predicate
48
- return true if bool
45
+ private
49
46
 
50
- !value.public_send(method)
47
+ def set_default
48
+ return unless original_val.nil? && !default.nil?
49
+
50
+ @original_val = default
51
51
  end
52
52
 
53
- private
53
+ def cast_value
54
+ @value = TypeCaster.run(original_val, type)
55
+ end
56
+
57
+ # only returning errors if required is missing, not if nil?, or :empty?
58
+ def handle_missing_required
59
+ return unless required? && original_val.nil?
60
+
61
+ errors << "#{name} required"
62
+ @valid = false
63
+ end
64
+
65
+ def handle_predicates
66
+ return if predicate.nil? || !valid?
54
67
 
55
- def set_args; end
68
+ @valid = !value.public_send(predicate)
69
+ end
56
70
 
57
71
  def allows_array
58
72
  ALLOWS_HASH.keys
59
73
  end
60
74
 
75
+ # convert allow_nil -> :nil? or allow_empty -> :empty?
76
+ # this will be used to public_send
77
+ # NOTE: only one will be checked, if you pass both:
78
+ # allow_nil and allow_empty, one will be ignored
79
+ def predicate
80
+ return if allows.empty?
81
+
82
+ key = allows.keys.first
83
+ ALLOWS_HASH[key]
84
+ end
85
+
61
86
  def required?
62
87
  required
63
88
  end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Attribeauty
4
- VERSION = "0.3.2"
4
+ VERSION = "0.3.4"
5
5
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: attribeauty
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.2
4
+ version: 0.3.4
5
5
  platform: ruby
6
6
  authors:
7
7
  - Toby
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2024-06-24 00:00:00.000000000 Z
11
+ date: 2024-06-25 00:00:00.000000000 Z
12
12
  dependencies: []
13
13
  description: There are so many of these, I just needed this one.
14
14
  email: