attribool 1.0.3 → 2.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: eb6bff0b78f856fe87c3d101b3f2eaf4eeeb49fcc9d5a7171857df555ec93125
4
- data.tar.gz: fcf0a984bd435bd05c0b6039201419fb5aa3c40df94efb33e288d1ff069ca57d
3
+ metadata.gz: cee1c79ed2d93c1f4d77b14f42d59dfd7c805afe569d9e43c999484d552c64ff
4
+ data.tar.gz: becb227aebe9b9878f40b3a3de4a9737623a10f364d2788830f3b440524ce0fb
5
5
  SHA512:
6
- metadata.gz: 47e07045578ba1f698eebdcfc72d9d0de7d634f2d8950b7067bb6c4c74baabbbadf90e92e4392872c8992c09e2954833daae5b8a496f7d01efc7e2537e8f392b
7
- data.tar.gz: 70cf40cf0102b2def2b68b9c5b51103bbad23ebd9a8a01d812f6a41a766ae3fd007455ed4842f5000298d147ded173b09fd1d3b6bf6ecedf8b7ad6fd9b9f6ae2
6
+ metadata.gz: 4904af389ad68348764f519eb058aaff66cb022dcc3de3d9f1ee3ce07b620eb08552bb9f03c9316943693370ed79131d11b91950433a4950bbdc4ce7619d34a4
7
+ data.tar.gz: 0f0d3622f6214668c8fa150d7e1b89ab828a803803aaa4707c25fd53b72a734d5e07f3ecc9d6d6a600c6e47522729ad0097da600065f76ad43fd6a2675efa203
data/Gemfile.lock CHANGED
@@ -1,22 +1,52 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- attribool (1.0.3)
4
+ attribool (2.0.0)
5
5
 
6
6
  GEM
7
7
  remote: https://rubygems.org/
8
8
  specs:
9
+ ast (2.4.2)
9
10
  docile (1.3.5)
11
+ json (2.6.3)
12
+ language_server-protocol (3.17.0.2)
13
+ parallel (1.22.1)
14
+ parser (3.1.3.0)
15
+ ast (~> 2.4.1)
10
16
  power_assert (2.0.0)
17
+ rainbow (3.1.1)
11
18
  rake (13.0.3)
19
+ regexp_parser (2.6.1)
20
+ rexml (3.2.5)
21
+ rubocop (1.39.0)
22
+ json (~> 2.3)
23
+ parallel (~> 1.10)
24
+ parser (>= 3.1.2.1)
25
+ rainbow (>= 2.2.2, < 4.0)
26
+ regexp_parser (>= 1.8, < 3.0)
27
+ rexml (>= 3.2.5, < 4.0)
28
+ rubocop-ast (>= 1.23.0, < 2.0)
29
+ ruby-progressbar (~> 1.7)
30
+ unicode-display_width (>= 1.4.0, < 3.0)
31
+ rubocop-ast (1.24.0)
32
+ parser (>= 3.1.1.0)
33
+ rubocop-performance (1.15.1)
34
+ rubocop (>= 1.7.0, < 2.0)
35
+ rubocop-ast (>= 0.4.0)
36
+ ruby-progressbar (1.11.0)
12
37
  simplecov (0.21.2)
13
38
  docile (~> 1.1)
14
39
  simplecov-html (~> 0.11)
15
40
  simplecov_json_formatter (~> 0.1)
16
41
  simplecov-html (0.12.3)
17
42
  simplecov_json_formatter (0.1.2)
43
+ standard (1.19.1)
44
+ language_server-protocol (~> 3.17.0.2)
45
+ rubocop (= 1.39.0)
46
+ rubocop-performance (= 1.15.1)
18
47
  test-unit (3.4.0)
19
48
  power_assert
49
+ unicode-display_width (2.3.0)
20
50
 
21
51
  PLATFORMS
22
52
  ruby
@@ -25,6 +55,7 @@ DEPENDENCIES
25
55
  attribool!
26
56
  rake (~> 13.0, >= 13.0.1)
27
57
  simplecov
58
+ standard
28
59
  test-unit (~> 3.3, >= 3.3.5)
29
60
 
30
61
  BUNDLED WITH
data/README.md CHANGED
@@ -20,8 +20,6 @@ you'd like for your boolean method to be called `named?`, you can use
20
20
  with lambdas via the `condition:` keyword argument.
21
21
 
22
22
  The first argument is always the instance variable to check for truthiness.
23
- Because of this, it is also valid syntax to use `bool_reader :@name`, if it
24
- makes more sense to you.
25
23
 
26
24
  Macros also exist for `bool_writer` and `bool_accessor`. When a writer
27
25
  method is defined, the value will always be coerced into a boolean before
@@ -32,7 +30,7 @@ You can read the documentation [here](https://evanthegrayt.github.io/attribool/)
32
30
  ## Installation
33
31
  #### Via Gemfile
34
32
  ```ruby
35
- gem 'attribool'
33
+ gem "attribool"
36
34
  ```
37
35
 
38
36
  #### Via rubygems
@@ -50,24 +48,20 @@ bundle exec rake install
50
48
  ## Examples
51
49
  #### Standard bool_reader
52
50
  ```ruby
53
- require 'attribool'
51
+ require "attribool"
54
52
 
55
53
  class Person
56
54
  extend Attribool
57
55
 
58
56
  attr_accessor :name
59
57
  bool_reader :name
60
- # OR
61
- # bool_reader :@name
62
- # bool_reader 'name'
63
- # bool_reader '@name'
64
58
  end
65
59
 
66
60
  person = Person.new
67
61
  person.name?
68
62
  # false, because @name is nil.
69
63
 
70
- person.name = 'John Smith'
64
+ person.name = "John Smith"
71
65
  person.name
72
66
  # "John Smith"
73
67
  person.name?
@@ -76,7 +70,7 @@ person.name?
76
70
 
77
71
  #### A bool_reader with method name
78
72
  ```ruby
79
- require 'attribool'
73
+ require "attribool"
80
74
 
81
75
  class Person
82
76
  extend Attribool
@@ -89,14 +83,14 @@ person = Person.new
89
83
  person.named?
90
84
  # false, because @name is nil.
91
85
 
92
- person.name = 'John Smith'
86
+ person.name = "John Smith"
93
87
  person.named?
94
88
  # true, because @name is truthy.
95
89
  ```
96
90
 
97
91
  #### A bool_reader with method name and conditional
98
92
  ```ruby
99
- require 'attribool'
93
+ require "attribool"
100
94
 
101
95
  class Person
102
96
  extend Attribool
@@ -119,9 +113,12 @@ person.adult?
119
113
  # true, because @age is greater than 18.
120
114
  ```
121
115
 
116
+ Note that, the result of the proc will also be coerced into a boolean, so the
117
+ condition can just return a truthy or falsey value.
118
+
122
119
  #### Assigning more than one bool_reader with a method name at once
123
120
  ```ruby
124
- require 'attribool'
121
+ require "attribool"
125
122
 
126
123
  class Person
127
124
  extend Attribool
@@ -142,14 +139,14 @@ person.age = 10
142
139
  person.has_age?
143
140
  # true, because @age is not nil.
144
141
 
145
- person.name = 'Bob'
142
+ person.name = "Bob"
146
143
  person.has_name?
147
144
  # true, because @name is not nil.
148
145
  ```
149
146
 
150
147
  #### Standard bool_accessor
151
148
  ```ruby
152
- require 'attribool'
149
+ require "attribool"
153
150
 
154
151
  class Person
155
152
  extend Attribool
@@ -172,7 +169,7 @@ In most cases where you'd use a `bool_writer`, you'd probably want to just use
172
169
  `bool_accessor`. This example is to show that, even when using `bool_accessor`,
173
170
  the value is coerced to a boolean when the value is set by `bool_writer`.
174
171
  ```ruby
175
- require 'attribool'
172
+ require "attribool"
176
173
 
177
174
  class Person
178
175
  extend Attribool
@@ -185,9 +182,9 @@ person = Person.new
185
182
  person.living
186
183
  # nil
187
184
 
188
- person.living = 'blah'
185
+ person.living = "blah"
189
186
  person.living
190
- # true, because 'blah' was coerced into a boolean because strings are truthy.
187
+ # true, because "blah" was coerced into a boolean because strings are truthy.
191
188
  ```
192
189
 
193
190
  ## Reporting Bugs and Requesting Features
data/Rakefile CHANGED
@@ -1,21 +1,21 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require_relative 'lib/attribool'
4
- require 'bundler/gem_tasks'
5
- require 'rdoc/task'
6
- require 'rake/testtask'
3
+ require_relative "lib/attribool"
4
+ require "bundler/gem_tasks"
5
+ require "rdoc/task"
6
+ require "rake/testtask"
7
7
 
8
8
  Rake::TestTask.new do |t|
9
- t.libs = ['lib']
9
+ t.libs = ["lib"]
10
10
  t.warning = true
11
11
  t.verbose = true
12
- t.test_files = FileList['test/**/*_test.rb']
12
+ t.test_files = FileList["test/**/*_test.rb"]
13
13
  end
14
14
 
15
15
  RDoc::Task.new do |rdoc|
16
- rdoc.main = 'README.md'
17
- rdoc.rdoc_dir = 'docs'
18
- rdoc.rdoc_files.include('README.md', 'lib/**/*.rb')
16
+ rdoc.main = "README.md"
17
+ rdoc.rdoc_dir = "docs"
18
+ rdoc.rdoc_files.include("README.md", "lib/**/*.rb")
19
19
  end
20
20
 
21
21
  task default: :test
data/attribool.gemspec CHANGED
@@ -1,34 +1,34 @@
1
- require_relative 'lib/attribool/version'
1
+ require_relative "lib/attribool/version"
2
2
 
3
3
  Gem::Specification.new do |spec|
4
- spec.name = 'attribool'
5
- spec.version = Attribool::VERSION
6
- spec.authors = ['Evan Gray']
7
- spec.email = 'evanthegrayt@vivaldi.net'
8
- spec.license = 'MIT'
9
- spec.date = Time.now.strftime('%Y-%m-%d')
4
+ spec.name = "attribool"
5
+ spec.version = Attribool::VERSION
6
+ spec.authors = ["Evan Gray"]
7
+ spec.email = "evanthegrayt@vivaldi.net"
8
+ spec.license = "MIT"
10
9
 
11
- spec.summary = %(Macros for creating boolean attribute methods)
12
- spec.description = %(Macros for creating boolean attribute methods)
13
- spec.homepage = 'https://github.com/evanthegrayt/attribool'
10
+ spec.summary = %(Macros for creating boolean attribute methods)
11
+ spec.description = %(Macros for creating boolean attribute methods)
12
+ spec.homepage = "https://github.com/evanthegrayt/attribool"
14
13
 
15
14
  unless spec.respond_to?(:metadata)
16
- raise 'RubyGems 2.0 or newer is required to protect against ' \
17
- 'public gem pushes.'
15
+ raise "RubyGems 2.0 or newer is required to protect against " \
16
+ "public gem pushes."
18
17
  end
19
18
 
20
- spec.metadata['allowed_push_host'] = 'https://rubygems.org'
21
- spec.metadata['homepage_uri'] = spec.homepage
22
- spec.metadata['source_code_uri'] = 'https://github.com/evanthegrayt/attribool'
23
- spec.metadata['documentation_uri'] = 'https://evanthegrayt.github.io/attribool/'
19
+ spec.metadata["allowed_push_host"] = "https://rubygems.org"
20
+ spec.metadata["homepage_uri"] = spec.homepage
21
+ spec.metadata["source_code_uri"] = "https://github.com/evanthegrayt/attribool"
22
+ spec.metadata["documentation_uri"] = "https://evanthegrayt.github.io/attribool/"
24
23
 
25
24
  spec.files = `git ls-files -z`.split("\x0").reject do |f|
26
25
  f.match(%r{^(test|spec|features)/})
27
26
  end
28
- spec.bindir = 'bin'
29
- spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
30
- spec.require_paths = ['lib']
31
- spec.add_development_dependency 'rake', '~> 13.0', '>= 13.0.1'
32
- spec.add_development_dependency 'simplecov'
33
- spec.add_development_dependency 'test-unit', '~> 3.3', '>= 3.3.5'
27
+ spec.bindir = "bin"
28
+ spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
29
+ spec.require_paths = ["lib"]
30
+ spec.add_development_dependency "rake", "~> 13.0", ">= 13.0.1"
31
+ spec.add_development_dependency "simplecov"
32
+ spec.add_development_dependency "standard"
33
+ spec.add_development_dependency "test-unit", "~> 3.3", ">= 3.3.5"
34
34
  end
@@ -1,72 +1,47 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- ##
4
- # Abstraction for an attribute to determine its name, reader, writer, and
5
- # instance variable name.
6
- class Attribool::Attribute
3
+ module Attribool
7
4
  ##
8
- # The name of the attribute, without the leading "@".
9
- #
10
- # @return [String]
11
- attr_reader :name
5
+ # Abstraction for an attribute to determine its name, reader, writer, and
6
+ # instance variable name.
7
+ class Attribute
8
+ ##
9
+ # The name of the attribute, without the leading "@".
10
+ #
11
+ # @return [String]
12
+ attr_reader :name
12
13
 
13
- ##
14
- # The name of the instance variable for the attribute, with the leading "@".
15
- #
16
- # @return [String]
17
- attr_reader :ivar
14
+ ##
15
+ # The name of the instance variable for the attribute, with the leading "@".
16
+ #
17
+ # @return [String]
18
+ attr_reader :ivar
18
19
 
19
- ##
20
- # The name of the reader for the attribute.
21
- #
22
- # @return [String]
23
- attr_reader :reader
20
+ ##
21
+ # The name of the reader for the attribute.
22
+ #
23
+ # @return [String]
24
+ attr_reader :reader
24
25
 
25
- ##
26
- # The name of the writer for the attribute.
27
- #
28
- # @return [String]
29
- attr_reader :writer
26
+ ##
27
+ # The name of the writer for the attribute.
28
+ #
29
+ # @return [String]
30
+ attr_reader :writer
30
31
 
31
- class << self
32
32
  ##
33
- # Ensures that if multiple attributes are being defined, and +method_name+
34
- # is provided, that +method_name+ is a +Proc+.
33
+ # Create an Attribute. The attribute can either be a String or a Symbol.
35
34
  #
36
- # @param [Integer] number_of_attributes
35
+ # @param [String, Symbol] attribute
37
36
  #
38
- # @param [String, Symbol, Proc] method_name
39
- def validate_method_name(method_name, number_of_attributes)
40
- return if number_of_attributes == 1 || nil_or_proc?(method_name)
41
-
42
- raise ArgumentError, "Must use a Proc when creating multiple methods"
43
- end
44
-
45
- private
46
-
47
- def nil_or_proc?(method_name) # :nodoc:
48
- method_name.nil? || (method_name.is_a?(Proc) && method_name.arity == 1)
49
- end
50
- end
51
-
52
- ##
53
- # Create an Attribute. The attribute can either be a String or a Symbol, and
54
- # can also start with an "@", or not.
55
- #
56
- # @param [String, Symbol] attribute
57
- #
58
- # @param [String, Symbol, Proc, nil] reader_name
59
- def initialize(attribute, reader_name = nil)
60
- attribute.to_s.tap do |a|
61
- @ivar = a.start_with?('@') ? a : "@#{a}"
62
- @name = @ivar.delete_prefix('@')
63
- @reader =
64
- case reader_name
65
- when Proc then reader_name.call(name)
66
- when nil then "#{name}?"
67
- else reader_name.to_s
68
- end
69
- @writer = "#{name}="
37
+ # @param [String, Symbol, Proc, nil] reader_name
38
+ def initialize(attribute, reader_name = nil)
39
+ attribute.to_s.then do |a|
40
+ @name = a
41
+ @ivar = "@#{a}"
42
+ @reader = Attribool::ReaderName.new(name, reader_name).to_s
43
+ @writer = "#{name}="
44
+ end
70
45
  end
71
46
  end
72
47
  end
@@ -0,0 +1,30 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Attribool
4
+ ##
5
+ # Enumerable class that generates a list of attributes from a list of strings
6
+ # or symbols.
7
+ class AttributeList
8
+ include Enumerable
9
+
10
+ ##
11
+ # Generate the list.
12
+ #
13
+ # @param [String, Symbol] *attributes
14
+ #
15
+ # @kwarg [nil, String, Symbol, Proc] method_name
16
+ def initialize(*attributes, method_name: nil)
17
+ @entries = attributes.map { |a| Attribool::Attribute.new(a, method_name) }
18
+ end
19
+
20
+ ##
21
+ # Yield every entry in the list to a block.
22
+ #
23
+ # @param [block] &block
24
+ #
25
+ # @return [Enumerable]
26
+ def each(&block)
27
+ @entries.each(&block)
28
+ end
29
+ end
30
+ end
@@ -0,0 +1,30 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Attribool
4
+ ##
5
+ # Abstraction of a reader's method name.
6
+ class ReaderName
7
+ ##
8
+ # Instantiate new instance of ReaderName.
9
+ #
10
+ # @param [String, Syumbol] attribute
11
+ #
12
+ # @param [proc, nil, String, Symbol] name
13
+ def initialize(attribute, name)
14
+ @attribute = attribute
15
+ @name = name
16
+ end
17
+
18
+ ##
19
+ # Convert instance to a string.
20
+ #
21
+ # @return [String]
22
+ def to_s
23
+ case @name
24
+ when Proc then @name.call(@attribute)
25
+ when nil then "#{@attribute}?"
26
+ else @name.to_s
27
+ end
28
+ end
29
+ end
30
+ end
@@ -0,0 +1,28 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Attribool::Validators
4
+ ##
5
+ # Ensures that if multiple attributes are being defined, and +method_name+
6
+ # is provided, that +method_name+ is a +Proc+.
7
+ class MethodNameValidator < Attribool::Validators::Validator
8
+ def initialize(method_name, number_of_attributes)
9
+ @method_name = method_name
10
+ @number_of_attributes = number_of_attributes
11
+ super
12
+ end
13
+
14
+ def valid?
15
+ @number_of_attributes == 1 || nil_or_proc?
16
+ end
17
+
18
+ def error
19
+ ArgumentError.new("Must use a Proc when creating multiple methods")
20
+ end
21
+
22
+ private
23
+
24
+ def nil_or_proc? # :nodoc:
25
+ @method_name.nil? || (@method_name.is_a?(Proc) && @method_name.arity == 1)
26
+ end
27
+ end
28
+ end
@@ -0,0 +1,20 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Attribool::Validators
4
+ class NilAttributeValidator < Attribool::Validators::Validator
5
+ def initialize(ivar, value, allow_nil)
6
+ @ivar = ivar
7
+ @value = value
8
+ @allow_nil = allow_nil
9
+ super
10
+ end
11
+
12
+ def valid?
13
+ @allow_nil || !@value.nil?
14
+ end
15
+
16
+ def error
17
+ TypeError.new("#{@ivar} is nil")
18
+ end
19
+ end
20
+ end
@@ -0,0 +1,19 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Attribool::Validators
4
+ class StrictBooleanValidator < Attribool::Validators::Validator
5
+ def initialize(value, strict)
6
+ @value = value
7
+ @strict = strict
8
+ super
9
+ end
10
+
11
+ def valid?
12
+ !@strict || [TrueClass, FalseClass].include?(@value.class)
13
+ end
14
+
15
+ def error
16
+ ArgumentError.new("#{@value} is not a boolean")
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,31 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Attribool::Validators
4
+ class Validator
5
+ def self.validate(*args)
6
+ new(*args).validate
7
+ end
8
+
9
+ def initialize(*)
10
+ raise "#{self.class} is an abstract class" if base_class?
11
+ end
12
+
13
+ def validate
14
+ valid? || raise(error)
15
+ end
16
+
17
+ def valid?
18
+ raise NoMethodError, "Validator must implement `valid?'"
19
+ end
20
+
21
+ def error
22
+ raise NoMethodError, "Validator must implement `error'"
23
+ end
24
+
25
+ private
26
+
27
+ def base_class?
28
+ instance_of?(Attribool::Validators::Validator)
29
+ end
30
+ end
31
+ end
@@ -9,7 +9,7 @@ module Attribool
9
9
  # Major version.
10
10
  #
11
11
  # @return [Integer]
12
- MAJOR = 1
12
+ MAJOR = 2
13
13
 
14
14
  ##
15
15
  # Minor version.
@@ -21,13 +21,15 @@ module Attribool
21
21
  # Patch version.
22
22
  #
23
23
  # @return [Integer]
24
- PATCH = 3
24
+ PATCH = 0
25
+
26
+ module_function
25
27
 
26
28
  ##
27
29
  # Version as +[MAJOR, MINOR, PATCH]+
28
30
  #
29
31
  # @return [Array]
30
- def self.to_a
32
+ def to_a
31
33
  [MAJOR, MINOR, PATCH]
32
34
  end
33
35
 
@@ -35,15 +37,15 @@ module Attribool
35
37
  # Version as +MAJOR.MINOR.PATCH+
36
38
  #
37
39
  # @return [String]
38
- def self.to_s
39
- to_a.join('.')
40
+ def to_s
41
+ to_a.join(".")
40
42
  end
41
43
 
42
44
  ##
43
45
  # Version as +{major: MAJOR, minor: MINOR, patch: PATCH}+
44
46
  #
45
47
  # @return [Hash]
46
- def self.to_h
48
+ def to_h
47
49
  %i[major minor patch].zip(to_a).to_h
48
50
  end
49
51
  end
data/lib/attribool.rb CHANGED
@@ -1,10 +1,32 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require_relative 'attribool/version'
4
- require_relative 'attribool/attribute'
3
+ require_relative "attribool/version"
4
+ require_relative "attribool/attribute"
5
+ require_relative "attribool/reader_name"
6
+ require_relative "attribool/attribute_list"
7
+ require_relative "attribool/validators/validator"
8
+ require_relative "attribool/validators/method_name_validator"
9
+ require_relative "attribool/validators/nil_attribute_validator"
10
+ require_relative "attribool/validators/strict_boolean_validator"
5
11
 
6
12
  ##
7
13
  # Adds macros for dealing with boolean attributes.
14
+ #
15
+ # @example
16
+ # require "attribool"
17
+ # class Person
18
+ # extend Attribool
19
+ # attr_accessor :name
20
+ # bool_reader :name
21
+ # ends
22
+ # person = Person.new
23
+ # person.name?
24
+ # # false, because @name is nil.
25
+ # person.name = "John Smith"
26
+ # person.name
27
+ # # "John Smith"
28
+ # person.name?
29
+ # # true, because @name is truthy.
8
30
  module Attribool
9
31
  ##
10
32
  # Creates methods that return a boolean for attributes that may or may not be
@@ -17,20 +39,16 @@ module Attribool
17
39
  # @kwarg [Proc] condition
18
40
  #
19
41
  # @kwarg [Symbol, String, Proc] method_name
20
- def bool_reader(
21
- *attributes,
22
- allow_nil: true,
23
- condition: nil,
24
- method_name: nil
25
- )
26
- Attribute.validate_method_name(method_name, attributes.size)
42
+ def bool_reader(*attributes, allow_nil: true, method_name: nil, condition: nil)
43
+ Validators::MethodNameValidator.validate(method_name, attributes.size)
27
44
 
28
- attributes.map { |a| Attribute.new(a, method_name) }.each do |attribute|
45
+ AttributeList.new(*attributes, method_name: method_name).each do |attribute|
29
46
  define_method(attribute.reader) do
30
- value = instance_variable_get(attribute.ivar)
31
- raise TypeError, "#{attribute.ivar} is nil" if value.nil? && !allow_nil
47
+ instance_variable_get(attribute.ivar).then do |value|
48
+ Validators::NilAttributeValidator.validate(attribute.ivar, value, allow_nil)
32
49
 
33
- condition ? condition.call(value) : !!(value)
50
+ !!(condition ? condition.call(value) : value)
51
+ end
34
52
  end
35
53
  end
36
54
  end
@@ -43,13 +61,11 @@ module Attribool
43
61
  #
44
62
  # @kwarg [Boolean] strict
45
63
  def bool_writer(*attributes, strict: false)
46
- attributes.map { |a| Attribute.new(a) }.each do |attribute|
47
- define_method(attribute.writer) do |v|
48
- if strict && ![TrueClass, FalseClass].include?(v.class)
49
- raise ArgumentError, 'Argument must be a boolean'
50
- end
64
+ AttributeList.new(*attributes).each do |attribute|
65
+ define_method(attribute.writer) do |value|
66
+ Validators::StrictBooleanValidator.validate(value, strict)
51
67
 
52
- instance_variable_set(attribute.ivar, !!v)
68
+ instance_variable_set(attribute.ivar, !!value)
53
69
  end
54
70
  end
55
71
  end
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: 1.0.3
4
+ version: 2.0.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Evan Gray
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2022-01-29 00:00:00.000000000 Z
11
+ date: 2022-12-19 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rake
@@ -44,6 +44,20 @@ dependencies:
44
44
  - - ">="
45
45
  - !ruby/object:Gem::Version
46
46
  version: '0'
47
+ - !ruby/object:Gem::Dependency
48
+ name: standard
49
+ requirement: !ruby/object:Gem::Requirement
50
+ requirements:
51
+ - - ">="
52
+ - !ruby/object:Gem::Version
53
+ version: '0'
54
+ type: :development
55
+ prerelease: false
56
+ version_requirements: !ruby/object:Gem::Requirement
57
+ requirements:
58
+ - - ">="
59
+ - !ruby/object:Gem::Version
60
+ version: '0'
47
61
  - !ruby/object:Gem::Dependency
48
62
  name: test-unit
49
63
  requirement: !ruby/object:Gem::Requirement
@@ -80,6 +94,12 @@ files:
80
94
  - attribool.gemspec
81
95
  - lib/attribool.rb
82
96
  - lib/attribool/attribute.rb
97
+ - lib/attribool/attribute_list.rb
98
+ - lib/attribool/reader_name.rb
99
+ - lib/attribool/validators/method_name_validator.rb
100
+ - lib/attribool/validators/nil_attribute_validator.rb
101
+ - lib/attribool/validators/strict_boolean_validator.rb
102
+ - lib/attribool/validators/validator.rb
83
103
  - lib/attribool/version.rb
84
104
  homepage: https://github.com/evanthegrayt/attribool
85
105
  licenses:
@@ -104,7 +124,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
104
124
  - !ruby/object:Gem::Version
105
125
  version: '0'
106
126
  requirements: []
107
- rubygems_version: 3.2.3
127
+ rubygems_version: 3.3.7
108
128
  signing_key:
109
129
  specification_version: 4
110
130
  summary: Macros for creating boolean attribute methods