attribool 0.1.0 → 1.0.0
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 +4 -4
- data/Gemfile.lock +1 -1
- data/README.md +38 -10
- data/lib/attribool/attribute.rb +10 -0
- data/lib/attribool/method_name.rb +18 -0
- data/lib/attribool/version.rb +2 -2
- data/lib/attribool.rb +32 -34
- metadata +4 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: dc735929535da353af1b584656aafb3ba6ba46b7996af32ae37dedc30bcfb0a2
|
4
|
+
data.tar.gz: 116a6a7fd8f9803773d10a6fff0b294f73bb9f5eb872db573f11273f8fc1ddcb
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 73fc2ab7f625fdfbb7577cda39c60eb86f6f53511fa685b2c0b86a79c90d22876123fcd34db74a76deb25eabc223cf891964fac36f962732af87a0c0c9aabcb0
|
7
|
+
data.tar.gz: ec6dc2496637c4c21c3c252a4c02fa1d574b4e4e033b74bd9019d5a8c286febba0990cd6d5659cc15be20b6a6c6dc3428f23a8bcb11ded8ed6a884403f78f682
|
data/Gemfile.lock
CHANGED
data/README.md
CHANGED
@@ -4,17 +4,18 @@
|
|
4
4
|
[](https://opensource.org/licenses/MIT)
|
5
5
|
|
6
6
|
Ruby macros for creating boolean methods for attributes that may or may not be
|
7
|
-
booleans themselves. This is done via coercion based on truthiness
|
7
|
+
booleans themselves. This is done via either coercion based on truthiness, or a
|
8
|
+
user-defined condition.
|
8
9
|
|
9
10
|
For example, if you have an attribute of `@name`, and you want to know if
|
10
11
|
`@name` is not `nil`, you can declare `bool_reader :name`, which will define the
|
11
12
|
method `name?`. This method will return true if `@name` is truthy.
|
12
13
|
|
13
14
|
The `bool_reader` also comes with some handy options. For example, you can
|
14
|
-
[define a method name](#a-bool_reader-with-method-name
|
15
|
+
[define a method name](#a-bool_reader-with-method-name) that makes
|
15
16
|
more sense. Using the same example as above, if your attribute is `@name`, but
|
16
17
|
you'd like for your boolean method to be called `named?`, you can use
|
17
|
-
`bool_reader :name,
|
18
|
+
`bool_reader :name, method_name: :named?`.
|
18
19
|
[Conditionals](#a-bool_reader-with-method-name-and-conditional) can also be set
|
19
20
|
with lambdas via the `condition:` keyword argument.
|
20
21
|
|
@@ -57,7 +58,9 @@ class Person
|
|
57
58
|
attr_accessor :name
|
58
59
|
bool_reader :name
|
59
60
|
# OR
|
60
|
-
bool_reader :@name
|
61
|
+
# bool_reader :@name
|
62
|
+
# bool_reader 'name'
|
63
|
+
# bool_reader '@name'
|
61
64
|
end
|
62
65
|
|
63
66
|
person = Person.new
|
@@ -71,7 +74,7 @@ person.name?
|
|
71
74
|
# true, because @name is truthy.
|
72
75
|
```
|
73
76
|
|
74
|
-
#### A bool_reader with method name
|
77
|
+
#### A bool_reader with method name
|
75
78
|
```ruby
|
76
79
|
require 'attribool'
|
77
80
|
|
@@ -79,18 +82,15 @@ class Person
|
|
79
82
|
extend Attribool
|
80
83
|
|
81
84
|
attr_accessor :name
|
82
|
-
bool_reader :name,
|
83
|
-
bool_reader :name, prefix: :has
|
85
|
+
bool_reader :name, method_name: :named?
|
84
86
|
end
|
85
87
|
|
86
88
|
person = Person.new
|
87
89
|
person.named?
|
88
|
-
person.has_name?
|
89
90
|
# false, because @name is nil.
|
90
91
|
|
91
92
|
person.name = 'John Smith'
|
92
93
|
person.named?
|
93
|
-
person.has_name?
|
94
94
|
# true, because @name is truthy.
|
95
95
|
```
|
96
96
|
|
@@ -103,7 +103,7 @@ class Person
|
|
103
103
|
|
104
104
|
attr_accessor :age
|
105
105
|
# In the condition lambdas, the argument refers to the attribute's value.
|
106
|
-
bool_reader :age,
|
106
|
+
bool_reader :age, method_name: :adult?, condition: ->(a) { a.to_i >= 18 }
|
107
107
|
end
|
108
108
|
|
109
109
|
person = Person.new
|
@@ -119,6 +119,34 @@ person.adult?
|
|
119
119
|
# true, because @age is greater than 18.
|
120
120
|
```
|
121
121
|
|
122
|
+
#### Assigning more than one bool_reader with a method name at once
|
123
|
+
```ruby
|
124
|
+
require 'attribool'
|
125
|
+
|
126
|
+
class Person
|
127
|
+
extend Attribool
|
128
|
+
|
129
|
+
attr_accessor :name, :age
|
130
|
+
# When creating multiple readers at once, if you want to specify a
|
131
|
+
# method_name, you must provide a Proc as the argument, where the attribute
|
132
|
+
# name is the argument.
|
133
|
+
bool_reader :age, :name, method_name: ->(m) { "has_#{m}?" }
|
134
|
+
end
|
135
|
+
|
136
|
+
person = Person.new
|
137
|
+
person.has_age?
|
138
|
+
person.has_name?
|
139
|
+
# Both false, because @age and @name are nil.
|
140
|
+
|
141
|
+
person.age = 10
|
142
|
+
person.has_age?
|
143
|
+
# true, because @age is not nil.
|
144
|
+
|
145
|
+
person.name = 'Bob'
|
146
|
+
person.has_name?
|
147
|
+
# true, because @name is not nil.
|
148
|
+
```
|
149
|
+
|
122
150
|
#### Standard bool_accessor
|
123
151
|
```ruby
|
124
152
|
require 'attribool'
|
@@ -0,0 +1,18 @@
|
|
1
|
+
class Attribool::MethodName
|
2
|
+
attr_reader :name
|
3
|
+
|
4
|
+
def self.validate(method_name, number_of_attributes)
|
5
|
+
if number_of_attributes > 1 && method_name && !method_name.is_a?(Proc)
|
6
|
+
raise ArgumentError, "Must use a Proc when creating multiple methods"
|
7
|
+
end
|
8
|
+
end
|
9
|
+
|
10
|
+
def initialize(attribute, method_name)
|
11
|
+
@name =
|
12
|
+
case method_name
|
13
|
+
when Proc then method_name.call(attribute)
|
14
|
+
when nil then "#{attribute}?"
|
15
|
+
else method_name
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
data/lib/attribool/version.rb
CHANGED
data/lib/attribool.rb
CHANGED
@@ -1,39 +1,37 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
3
|
require_relative 'attribool/version'
|
4
|
+
require_relative 'attribool/method_name'
|
5
|
+
require_relative 'attribool/attribute'
|
4
6
|
|
5
7
|
##
|
6
|
-
# Adds macros
|
8
|
+
# Adds macros for dealing with boolean attributes.
|
7
9
|
module Attribool
|
8
10
|
##
|
9
|
-
# Creates
|
10
|
-
#
|
11
|
+
# Creates methods that return a boolean for attributes that may or may not be
|
12
|
+
# booleans themselves. Multiple readers can be created at once
|
11
13
|
#
|
12
|
-
# @param [Symbol, String]
|
14
|
+
# @param [Symbol, String] *attributes
|
13
15
|
#
|
14
|
-
# @kwarg [Boolean] allow_nil
|
16
|
+
# @kwarg [Boolean] allow_nil
|
15
17
|
#
|
16
|
-
# @kwarg [
|
18
|
+
# @kwarg [Proc] condition
|
17
19
|
#
|
18
|
-
# @kwarg [Symbol, String]
|
19
|
-
#
|
20
|
-
# @kwarg [Symbol, String] prefix:
|
20
|
+
# @kwarg [Symbol, String, Proc] method_name
|
21
21
|
def bool_reader(
|
22
|
-
|
22
|
+
*attributes,
|
23
23
|
allow_nil: true,
|
24
24
|
condition: nil,
|
25
|
-
|
26
|
-
method: nil
|
25
|
+
method_name: nil
|
27
26
|
)
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
ivar = instance_variable_get(attribute)
|
34
|
-
raise TypeError, "#{attribute} is nil" if ivar.nil? && !allow_nil
|
27
|
+
MethodName.validate(method_name, attributes.size)
|
28
|
+
attributes.map { |a| Attribute.new(a) }.each do |attribute|
|
29
|
+
define_method(MethodName.new(attribute.name, method_name).name) do
|
30
|
+
value = instance_variable_get(attribute.ivar)
|
31
|
+
raise TypeError, "#{attribute.ivar} is nil" if value.nil? && !allow_nil
|
35
32
|
|
36
|
-
|
33
|
+
condition ? condition.call(value) : !!(value)
|
34
|
+
end
|
37
35
|
end
|
38
36
|
end
|
39
37
|
|
@@ -41,18 +39,18 @@ module Attribool
|
|
41
39
|
# Creates a writer for boolean attributes. Always coerces to boolean based
|
42
40
|
# on truthiness.
|
43
41
|
#
|
44
|
-
# @param [Symbol, String]
|
42
|
+
# @param [Symbol, String] *attributes
|
45
43
|
#
|
46
|
-
# @kwarg [Boolean] strict
|
47
|
-
def bool_writer(
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
end
|
44
|
+
# @kwarg [Boolean] strict
|
45
|
+
def bool_writer(*attributes, strict: false)
|
46
|
+
attributes.map { |a| Attribute.new(a) }.each do |attribute|
|
47
|
+
define_method("#{attribute.name}=") do |v|
|
48
|
+
if strict && ![TrueClass, FalseClass].include?(v.class)
|
49
|
+
raise ArgumentError, 'Argument must be a boolean'
|
50
|
+
end
|
54
51
|
|
55
|
-
|
52
|
+
instance_variable_set(attribute.ivar, !!v)
|
53
|
+
end
|
56
54
|
end
|
57
55
|
end
|
58
56
|
|
@@ -60,9 +58,9 @@ module Attribool
|
|
60
58
|
# Creates a simple reader and writer for booleans. This should only be used
|
61
59
|
# when the attribute should only ever be +true+ or +false+.
|
62
60
|
#
|
63
|
-
# @param [Symbol, String]
|
64
|
-
def bool_accessor(
|
65
|
-
bool_reader(
|
66
|
-
bool_writer(
|
61
|
+
# @param [Symbol, String] *attributes
|
62
|
+
def bool_accessor(*attributes)
|
63
|
+
bool_reader(*attributes)
|
64
|
+
bool_writer(*attributes)
|
67
65
|
end
|
68
66
|
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:
|
4
|
+
version: 1.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:
|
11
|
+
date: 2022-01-06 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rake
|
@@ -79,6 +79,8 @@ files:
|
|
79
79
|
- Rakefile
|
80
80
|
- attribool.gemspec
|
81
81
|
- lib/attribool.rb
|
82
|
+
- lib/attribool/attribute.rb
|
83
|
+
- lib/attribool/method_name.rb
|
82
84
|
- lib/attribool/version.rb
|
83
85
|
homepage: https://github.com/evanthegrayt/attribool
|
84
86
|
licenses:
|