attribool 2.0.2 → 2.0.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: d928a7ac0b90deb248cfcbb3a9b638baa6a38a8c62691c884df1e2db2f7c6d04
4
- data.tar.gz: 525256019fd56a8bc53695c1772e6367fcb6dac0ac05da4a4f457431029d21d9
3
+ metadata.gz: d04f89c318e02c603522d41b99a64ef3cc228da4132ac58122abde616c955486
4
+ data.tar.gz: 9555723018f19c3a5fd8a77c86c975597c21ee8b525d9571977b8287d8685844
5
5
  SHA512:
6
- metadata.gz: 3719316d9feaa069f64748a23ef1ba9531dbecb6b7cb3188e8292f9f70a7cdd3a262522b63a8a6c7b9673a232a3c6e2dc86953cba6527ea6c9727d5e32360c0f
7
- data.tar.gz: 792822e7f8e5ee0242d8a60cd5ab0870613794a26652bcb7025dbdda5dd3500bee8004c66fdd297c8e0a26c0e6ec1a458967e69186a91a1795bb5ee92e65a4d6
6
+ metadata.gz: 64c66f2a26f7b2280f961b97ed373703e55696a1ae741032909355565da7313b9c166b04037855c062f76681234478d8d230ab9bc36114e288ed6a5ce61ccba4
7
+ data.tar.gz: 6287a1d91606e76e595c8b1670d1dff3066e313dc25f70ba5fbb0722a1a2601e7648f2ff9cd6899df84da504c02d4caa263e7a2fef4a9eca140c9b867c01234b
@@ -13,7 +13,7 @@ jobs:
13
13
 
14
14
  strategy:
15
15
  matrix:
16
- ruby-version: ['3.2', '3.1', '3.0', '2.7', '2.6']
16
+ ruby-version: ['3.2', '3.1', '3.0']
17
17
 
18
18
  steps:
19
19
  - uses: actions/checkout@v3
data/.projections.json ADDED
@@ -0,0 +1,40 @@
1
+ {
2
+ "lib/attribool/validators/*_validator.rb": {
3
+ "command": "validator",
4
+ "related": "lib/attribool/validator_service.rb",
5
+ "alternate": "test/attribool/validators/{}_test.rb",
6
+ "template": [
7
+ "# frozen_string_literal: true",
8
+ "",
9
+ "module Attribool::Validators",
10
+ " ##",
11
+ " # Ensures that {blank} is validated.",
12
+ " class {capitalize|camelcase}Validator",
13
+ " ##",
14
+ " # Construct the validator.",
15
+ " #",
16
+ " # @param [Todo] todo",
17
+ " def initialize(todo)",
18
+ " @todo = todo",
19
+ " end",
20
+ "",
21
+ " ##",
22
+ " # Todo?",
23
+ " #",
24
+ " # @return [Boolean]",
25
+ " def valid?",
26
+ " # TODO",
27
+ " end",
28
+ "",
29
+ " ##",
30
+ " # The exception to raise if validations fail.",
31
+ " #",
32
+ " # @return [TodoError] the exception with message",
33
+ " def error",
34
+ " TodoError.new(\"todo\")",
35
+ " end",
36
+ " end",
37
+ "end"
38
+ ]
39
+ }
40
+ }
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.4)
5
5
 
6
6
  GEM
7
7
  remote: https://rubygems.org/
data/Rakefile CHANGED
@@ -19,3 +19,48 @@ RDoc::Task.new do |rdoc|
19
19
  end
20
20
 
21
21
  task default: :test
22
+
23
+ namespace :version do
24
+ desc "Print the current version from the version.rb file"
25
+ task :current do
26
+ puts Attribool::VERSION
27
+ end
28
+
29
+ namespace :increment do
30
+ desc "Increment the version's PATCH level"
31
+ task :patch do
32
+ File.join(__dir__, "lib", "attribool", "version.rb").then do |version_file|
33
+ File.write(
34
+ version_file,
35
+ File.read(version_file).sub(/(PATCH\s=\s)(\d+)/) { "#{$1}#{$2.next}" }
36
+ )
37
+ end
38
+ system("bundle lock")
39
+ end
40
+ desc "Increment the version's MINOR level"
41
+ task :minor do
42
+ File.join(__dir__, "lib", "attribool", "version.rb").then do |version_file|
43
+ File.write(
44
+ version_file,
45
+ File.read(version_file)
46
+ .sub(/(PATCH\s=\s)(\d+)/) { "#{$1}0" }
47
+ .sub(/(MINOR\s=\s)(\d+)/) { "#{$1}#{$2.next}" }
48
+ )
49
+ end
50
+ system("bundle lock")
51
+ end
52
+ desc "Increment the version's MAJOR level"
53
+ task :major do
54
+ File.join(__dir__, "lib", "attribool", "version.rb").then do |version_file|
55
+ File.write(
56
+ version_file,
57
+ File.read(version_file)
58
+ .sub(/(PATCH\s=\s)(\d+)/) { "#{$1}0" }
59
+ .sub(/(MINOR\s=\s)(\d+)/) { "#{$1}0" }
60
+ .sub(/(MAJOR\s=\s)(\d+)/) { "#{$1}#{$2.next}" }
61
+ )
62
+ end
63
+ system("bundle lock")
64
+ end
65
+ end
66
+ end
@@ -1,11 +1,23 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+ require "forwardable"
4
+
3
5
  module Attribool
4
6
  ##
5
7
  # Enumerable class that generates a list of attributes from a list of strings
6
8
  # or symbols.
7
9
  class AttributeList
8
10
  include Enumerable
11
+ extend Forwardable
12
+
13
+ ##
14
+ # :method: each
15
+ # Yield every entry in the list to a block.
16
+ #
17
+ # @param [block] &block
18
+ #
19
+ # @return [Enumerable]
20
+ def_delegators :@entries, :each
9
21
 
10
22
  ##
11
23
  # Create an +AttributeList+ from a list of attribute names.
@@ -27,15 +39,5 @@ module Attribool
27
39
  ValidatorService.call(:attribute_list, *attributes)
28
40
  @entries = attributes
29
41
  end
30
-
31
- ##
32
- # Yield every entry in the list to a block.
33
- #
34
- # @param [block] &block
35
- #
36
- # @return [Enumerable]
37
- def each(&block)
38
- @entries.each(&block)
39
- end
40
42
  end
41
43
  end
@@ -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 = 4
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
@@ -54,5 +54,5 @@ module Attribool
54
54
  # The version, as a string.
55
55
  #
56
56
  # @return [String]
57
- VERSION = Version.to_s.freeze
57
+ VERSION = Version.to_s
58
58
  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,14 +1,14 @@
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.4
5
5
  platform: ruby
6
6
  authors:
7
7
  - Evan Gray
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2023-06-23 00:00:00.000000000 Z
11
+ date: 2024-08-02 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: pry
@@ -100,6 +100,7 @@ extra_rdoc_files: []
100
100
  files:
101
101
  - ".github/workflows/ruby.yml"
102
102
  - ".gitignore"
103
+ - ".projections.json"
103
104
  - Gemfile
104
105
  - Gemfile.lock
105
106
  - LICENSE
@@ -111,6 +112,7 @@ files:
111
112
  - lib/attribool/attribute_list.rb
112
113
  - lib/attribool/reader_name.rb
113
114
  - lib/attribool/validator_service.rb
115
+ - lib/attribool/validators.rb
114
116
  - lib/attribool/validators/attribute_list_validator.rb
115
117
  - lib/attribool/validators/condition_validator.rb
116
118
  - lib/attribool/validators/method_name_validator.rb