attribool 2.0.2 → 2.0.3

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: d928a7ac0b90deb248cfcbb3a9b638baa6a38a8c62691c884df1e2db2f7c6d04
4
- data.tar.gz: 525256019fd56a8bc53695c1772e6367fcb6dac0ac05da4a4f457431029d21d9
3
+ metadata.gz: 63c34a661a7575ad39598073bbfc995f6e18d822c9587ee4cf9b28ed6ead7d96
4
+ data.tar.gz: 4d3b761b8ed920a44e145727e7d07eb6d2fa2c22ea0b0d91d24569248362f03a
5
5
  SHA512:
6
- metadata.gz: 3719316d9feaa069f64748a23ef1ba9531dbecb6b7cb3188e8292f9f70a7cdd3a262522b63a8a6c7b9673a232a3c6e2dc86953cba6527ea6c9727d5e32360c0f
7
- data.tar.gz: 792822e7f8e5ee0242d8a60cd5ab0870613794a26652bcb7025dbdda5dd3500bee8004c66fdd297c8e0a26c0e6ec1a458967e69186a91a1795bb5ee92e65a4d6
6
+ metadata.gz: 927ecdcc2b35fa4448beda19e02c968441cd858933bfdbcb261b11e494e5a46676b9c36e17f61e9f4f9400f6af547662b84d11b28c17df664a710a840595ed79
7
+ data.tar.gz: d7a9895258e80fb76ba7eee27a8af15b16cef705097bbc2a1a77d459c100f3a54b52c3127251455308a5aa2f744a0e0596b802b24792c6e0ef0ff9d0ea2f1b95
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- attribool (2.0.2)
4
+ attribool (2.0.3)
5
5
 
6
6
  GEM
7
7
  remote: https://rubygems.org/
@@ -1,17 +1,38 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Attribool
4
+ ##
5
+ # A simple interface to run validators, which should implement a +valid?+
6
+ # method which returns true if conditions are valid, and an +error+ method
7
+ # which returns an exception class and message to be raised when validations
8
+ # fail.
4
9
  class ValidatorService
5
- def self.call(validator, *args)
6
- new(validator, *args).validate
10
+ ##
11
+ # Run the validator.
12
+ #
13
+ # @param [Symbol] validator_name
14
+ #
15
+ # @param [Object] *args to be forwarded to validator
16
+ def self.call(validator_name, *args)
17
+ new(::Attribool::Validators.fetch(validator_name), *args).validate
7
18
  end
8
19
 
20
+ ##
21
+ # Construct the service and inject the validator.
22
+ #
23
+ # @param [Class] Validator
24
+ #
25
+ # @param [Object] *args
9
26
  def initialize(validator, *args)
10
- @validator = ::Attribool::Validators.const_get(
11
- "#{validator.to_s.split("_").map(&:capitalize).join}Validator"
12
- ).new(*args)
27
+ @validator = validator.new(*args)
13
28
  end
14
29
 
30
+ ##
31
+ # Raises the validator's exception unless its conditions are met.
32
+ #
33
+ # @return [Boolean]
34
+ #
35
+ # @raise [Exception] if validation fails
15
36
  def validate
16
37
  @validator.valid? || raise(@validator.error)
17
38
  end
@@ -1,15 +1,29 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Attribool::Validators
4
+ ##
5
+ # Ensures that every item is an instance of +Attribool::Attribute+.
4
6
  class AttributeListValidator
7
+ ##
8
+ # Construct the validator.
9
+ #
10
+ # @param [Attribool::Attribute] *items
5
11
  def initialize(*items)
6
12
  @items = items
7
13
  end
8
14
 
15
+ ##
16
+ # Are all items an instance of +Attribool::Attribute+?
17
+ #
18
+ # @return [Boolean]
9
19
  def valid?
10
20
  @items.all?(Attribool::Attribute)
11
21
  end
12
22
 
23
+ ##
24
+ # The exception to raise if validations fail.
25
+ #
26
+ # @return [TypeError] the exception with message
13
27
  def error
14
28
  TypeError.new("All items must be an instance of Attribool::Attribute")
15
29
  end
@@ -1,15 +1,29 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Attribool::Validators
4
+ ##
5
+ # Ensures that a condition is either +nil+ or a +Proc+.
4
6
  class ConditionValidator
7
+ ##
8
+ # Construct the validator.
9
+ #
10
+ # @param [nil, Proc] condition
5
11
  def initialize(condition)
6
12
  @condition = condition
7
13
  end
8
14
 
15
+ ##
16
+ # Is the condition either +nil+ or a +Proc+?
17
+ #
18
+ # @return [Boolean]
9
19
  def valid?
10
20
  @condition.nil? || @condition.is_a?(Proc)
11
21
  end
12
22
 
23
+ ##
24
+ # The exception to raise if validations fail.
25
+ #
26
+ # @return [ArgumentError] the exception with message
13
27
  def error
14
28
  ArgumentError.new("Condition is not a proc")
15
29
  end
@@ -5,15 +5,25 @@ module Attribool::Validators
5
5
  # Ensures that if multiple attributes are being defined, and +method_name+
6
6
  # is provided, that +method_name+ is a +Proc+.
7
7
  class MethodNameValidator
8
+ ##
9
+ # Construct the validator.
10
+ #
11
+ # @param [Attribool::Attribute] *items
8
12
  def initialize(method_name, number_of_attributes)
9
13
  @method_name = method_name
10
14
  @number_of_attributes = number_of_attributes
11
15
  end
12
16
 
17
+ ##
18
+ # Is there either one attribute, or is +method_name+ +nil+ or a +Proc+?
13
19
  def valid?
14
20
  @number_of_attributes == 1 || nil_or_proc?
15
21
  end
16
22
 
23
+ ##
24
+ # The exception to raise if validations fail.
25
+ #
26
+ # @return [ArgumentError] the exception with message
17
27
  def error
18
28
  ArgumentError.new("Must use a Proc when creating multiple methods")
19
29
  end
@@ -1,17 +1,35 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Attribool::Validators
4
+ ##
5
+ # Ensures that a value is not +nil+, unless +nil+ is allowed as a value.
4
6
  class NilAttributeValidator
7
+ ##
8
+ # Construct the validator.
9
+ #
10
+ # @param [String, Symbol] ivar
11
+ #
12
+ # @param [Object] value
13
+ #
14
+ # @param [Boolean] allow_nil
5
15
  def initialize(ivar, value, allow_nil)
6
16
  @ivar = ivar
7
17
  @value = value
8
18
  @allow_nil = allow_nil
9
19
  end
10
20
 
21
+ ##
22
+ # Do we either allow values to be +nil+, or is the value not +nil+?
23
+ #
24
+ # @return [Boolean]
11
25
  def valid?
12
26
  @allow_nil || !@value.nil?
13
27
  end
14
28
 
29
+ ##
30
+ # The exception to raise if validations fail.
31
+ #
32
+ # @return [TypeError] the exception with message
15
33
  def error
16
34
  TypeError.new("#{@ivar} is nil")
17
35
  end
@@ -1,16 +1,32 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Attribool::Validators
4
+ ##
5
+ # Ensures that a value is a boolean, unless strictness isn't enforced.
4
6
  class StrictBooleanValidator
7
+ ##
8
+ # Construct the validator.
9
+ #
10
+ # @param [Object] value
11
+ #
12
+ # @param [Boolean] strict
5
13
  def initialize(value, strict)
6
14
  @value = value
7
15
  @strict = strict
8
16
  end
9
17
 
18
+ ##
19
+ # Is +strict+ set to +false+, or is +@value+ a boolean?
20
+ #
21
+ # @return [Boolean]
10
22
  def valid?
11
23
  !@strict || [TrueClass, FalseClass].include?(@value.class)
12
24
  end
13
25
 
26
+ ##
27
+ # The exception to raise if validations fail.
28
+ #
29
+ # @return [ArgumentError] the exception with message
14
30
  def error
15
31
  ArgumentError.new("#{@value} is not a boolean")
16
32
  end
@@ -0,0 +1,25 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Attribool
4
+ ##
5
+ # Namespace for Validators. Also provides a method for fetching a validator.
6
+ module Validators
7
+ module_function
8
+
9
+ ##
10
+ # Fetches a Validator class.
11
+ #
12
+ # @param [String, Symbol] validator_name
13
+ #
14
+ # @return [Class]
15
+ #
16
+ # @example
17
+ # Attribool::Validators.fetch(:nil_attribute)
18
+ # # => NilAttributeValidator
19
+ def fetch(validator_name)
20
+ const_get(
21
+ "#{validator_name.to_s.split("_").map(&:capitalize).join}Validator"
22
+ )
23
+ end
24
+ end
25
+ end
@@ -1,13 +1,25 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Attribool
4
+ ##
5
+ # An abstraction of any class that can convert itself to a boolean.
4
6
  class Value
7
+ ##
8
+ # Construct the value with an optional +Proc+ condition.
9
+ #
10
+ # @param [Object] value
11
+ #
12
+ # @param [Proc] condition (default: nil)
5
13
  def initialize(value, condition = nil)
6
14
  ValidatorService.call(:condition, condition)
7
15
  @value = value
8
16
  @condition = condition
9
17
  end
10
18
 
19
+ ##
20
+ # Convert the value or the condition to a boolean based off truthiness.
21
+ #
22
+ # @return [Boolean]
11
23
  def to_boolean
12
24
  !!(@condition ? @condition.call(@value) : @value)
13
25
  end
@@ -21,14 +21,14 @@ module Attribool
21
21
  # Patch version.
22
22
  #
23
23
  # @return [Integer]
24
- PATCH = 2
24
+ PATCH = 3
25
25
 
26
26
  module_function
27
27
 
28
28
  ##
29
29
  # Version as +[MAJOR, MINOR, PATCH]+
30
30
  #
31
- # @return [Array]
31
+ # @return [Array<Integer>]
32
32
  def to_a
33
33
  [MAJOR, MINOR, PATCH]
34
34
  end
data/lib/attribool.rb CHANGED
@@ -3,6 +3,7 @@
3
3
  require_relative "attribool/version"
4
4
  require_relative "attribool/value"
5
5
  require_relative "attribool/attribute"
6
+ require_relative "attribool/validators"
6
7
  require_relative "attribool/reader_name"
7
8
  require_relative "attribool/attribute_list"
8
9
  require_relative "attribool/validator_service"
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: attribool
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.0.2
4
+ version: 2.0.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - Evan Gray
@@ -111,6 +111,7 @@ files:
111
111
  - lib/attribool/attribute_list.rb
112
112
  - lib/attribool/reader_name.rb
113
113
  - lib/attribool/validator_service.rb
114
+ - lib/attribool/validators.rb
114
115
  - lib/attribool/validators/attribute_list_validator.rb
115
116
  - lib/attribool/validators/condition_validator.rb
116
117
  - lib/attribool/validators/method_name_validator.rb