attribool 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA256:
3
+ metadata.gz: 469b94667c5be65a2901c9049f8290711c823fc7d08226140471c4c8820e66df
4
+ data.tar.gz: 526c90658fc7f1ac712383083a5c38ced3088f3ed91fc32af3a6801e7c0352cc
5
+ SHA512:
6
+ metadata.gz: 90be0ebf1c939bf765d0dd3848cf273b00606d4e00335418b1fc44de239ffb5f2042032525a22f9b205b9b10b6ff71126ba0a3c01449d2957fe328f4be354359
7
+ data.tar.gz: 48dbb1b70a57413523a962d29432343e5c7117f06ceae8063a7de1a5306595bab5f469db638a25bed1074efee037982e4a776c75334168e9d6e0064359e9e240
data/.gitignore ADDED
@@ -0,0 +1,2 @@
1
+ attribool-*.gem
2
+ coverage/*
data/Gemfile ADDED
@@ -0,0 +1,7 @@
1
+ # frozen_string_literal: true
2
+
3
+ source "https://rubygems.org"
4
+
5
+ git_source(:github) { |repo| "https://github.com/#{repo}.git" }
6
+
7
+ gemspec
data/Gemfile.lock ADDED
@@ -0,0 +1,31 @@
1
+ PATH
2
+ remote: .
3
+ specs:
4
+ attribool (0.0.1)
5
+
6
+ GEM
7
+ remote: https://rubygems.org/
8
+ specs:
9
+ docile (1.3.5)
10
+ power_assert (2.0.0)
11
+ rake (13.0.3)
12
+ simplecov (0.21.2)
13
+ docile (~> 1.1)
14
+ simplecov-html (~> 0.11)
15
+ simplecov_json_formatter (~> 0.1)
16
+ simplecov-html (0.12.3)
17
+ simplecov_json_formatter (0.1.2)
18
+ test-unit (3.4.0)
19
+ power_assert
20
+
21
+ PLATFORMS
22
+ ruby
23
+
24
+ DEPENDENCIES
25
+ attribool!
26
+ rake (~> 13.0, >= 13.0.1)
27
+ simplecov
28
+ test-unit (~> 3.3, >= 3.3.5)
29
+
30
+ BUNDLED WITH
31
+ 2.1.4
data/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2021 Evan Gray
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
data/README.md ADDED
@@ -0,0 +1,127 @@
1
+ # Attribool
2
+ Ruby macros for creating boolean methods for attributes that may or may not be
3
+ booleans themselves. This is done via coercion based on truthiness. For example,
4
+ if you have an attribute of `@name`, and you want to know if `@name` is not
5
+ `nil`, you can declare `bool_reader :name`, which will define the method
6
+ `name?`. This method will return true if `@name` is truthy.
7
+
8
+ The `bool_reader` also comes with some handy options. For example, you can
9
+ [define a method name](#a-bool_reader-with-method-name-or-prefix) that makes
10
+ more sense. Using the same example, as above, if your attribute is `@name`, but
11
+ you'd like for your boolean method to be called `named?`, you can use
12
+ `bool_reader :name, method: :named?`.
13
+ [Conditionals](#a-bool_reader-with-method-name-and-conditional) can also be set
14
+ with lambdas via the `condition:` keyword argument.
15
+
16
+ Macros also exist for `bool_writer` and `bool_accessor`. When a writer
17
+ method is defined, the value will always be coerced into a boolean before
18
+ setting the attribute.
19
+
20
+ ## Installation
21
+ #### Via Gemfile
22
+ ```ruby
23
+ gem 'attribool'
24
+ ```
25
+
26
+ #### Via rubygems
27
+ ```sh
28
+ gem install attribool
29
+ ```
30
+
31
+ #### From source
32
+ ```sh
33
+ git clone https://github.com/evanthegrayt/attribool.git
34
+ cd attribool
35
+ bundle exec rake install
36
+ ```
37
+
38
+ ## Examples
39
+ #### Standard bool_reader
40
+ ```ruby
41
+ require 'attribool'
42
+
43
+ class Person
44
+ extend Attribool
45
+
46
+ attr_accessor :name
47
+ bool_reader :name
48
+ end
49
+
50
+ person = Person.new
51
+ person.name?
52
+ # false, because @name is nil.
53
+
54
+ person.name = 'John Smith'
55
+ person.name
56
+ # "John Smith"
57
+ person.name?
58
+ # true, because @name is truthy.
59
+ ```
60
+
61
+ #### A bool_reader with method name or prefix
62
+ ```ruby
63
+ require 'attribool'
64
+
65
+ class Person
66
+ extend Attribool
67
+
68
+ attr_accessor :name
69
+ bool_reader :name, method: :named?
70
+ bool_reader :name, prefix: :has?
71
+ end
72
+
73
+ person = Person.new
74
+ person.named?
75
+ person.has_name?
76
+ # false, because @name is nil.
77
+
78
+ person.name = 'John Smith'
79
+ person.named?
80
+ person.has_name?
81
+ # true, because @name is truthy.
82
+ ```
83
+
84
+ #### A bool_reader with method name and conditional
85
+ ```ruby
86
+ require 'attribool'
87
+
88
+ class Person
89
+ extend Attribool
90
+
91
+ attr_accessor :age
92
+ # In the condition lambdas, the argument refers to the attribute's value.
93
+ bool_reader :age, method: :adult?, condition: ->(a) { a.to_i >= 18 }
94
+ end
95
+
96
+ person = Person.new
97
+ person.adult?
98
+ # false, because @age is nil, which the to_i converts to 0.
99
+
100
+ person.age = 10
101
+ person.adult?
102
+ # false, because @age is less than 18.
103
+
104
+ person.age = 20
105
+ person.adult?
106
+ # true, because @age is greater than 18.
107
+ ```
108
+
109
+ #### Standard bool_accessor
110
+ ```ruby
111
+ require 'attribool'
112
+
113
+ class Person
114
+ extend Attribool
115
+
116
+ bool_accessor :living
117
+ end
118
+
119
+ person = Person.new
120
+ person.living?
121
+ # false, because @living is nil.
122
+
123
+ person.living = true
124
+ person.living?
125
+ # true, because @living is true.
126
+ # Be aware -- if you pass a string, it will be coerced to true!
127
+ ```
data/Rakefile ADDED
@@ -0,0 +1,21 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative 'lib/attribool'
4
+ require 'bundler/gem_tasks'
5
+ require 'rdoc/task'
6
+ require 'rake/testtask'
7
+
8
+ Rake::TestTask.new do |t|
9
+ t.libs = ['lib']
10
+ t.warning = true
11
+ t.verbose = true
12
+ t.test_files = FileList['test/**/*_test.rb']
13
+ end
14
+
15
+ RDoc::Task.new do |rdoc|
16
+ rdoc.main = 'README.md'
17
+ rdoc.rdoc_dir = 'doc'
18
+ rdoc.rdoc_files.include('README.md', 'lib/**/*.rb')
19
+ end
20
+
21
+ task default: :test
data/attribool.gemspec ADDED
@@ -0,0 +1,36 @@
1
+ require_relative 'lib/attribool/version'
2
+
3
+ Gem::Specification.new do |spec|
4
+ spec.name = 'attribool'
5
+ spec.version = Attribool::Version.to_s
6
+ spec.authors = ['Evan Gray']
7
+ spec.email = 'evanthegrayt@vivaldi.net'
8
+ spec.license = 'MIT'
9
+ spec.date = Time.now.strftime('%Y-%m-%d')
10
+
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'
14
+
15
+ unless spec.respond_to?(:metadata)
16
+ raise 'RubyGems 2.0 or newer is required to protect against ' \
17
+ 'public gem pushes.'
18
+ end
19
+
20
+ spec.metadata['allowed_push_host'] = 'https://rubygems.org'
21
+ spec.metadata['homepage_uri'] = spec.homepage
22
+ spec.metadata['source_code_uri'] =
23
+ 'https://github.com/evanthegrayt/attribool'
24
+ spec.metadata['documentation_uri'] =
25
+ 'https://evanthegrayt.github.io/attribool/doc/index.html'
26
+
27
+ spec.files = `git ls-files -z`.split("\x0").reject do |f|
28
+ f.match(%r{^(test|spec|features)/})
29
+ end
30
+ spec.bindir = 'bin'
31
+ spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
32
+ spec.require_paths = ['lib']
33
+ spec.add_development_dependency 'rake', '~> 13.0', '>= 13.0.1'
34
+ spec.add_development_dependency 'simplecov'
35
+ spec.add_development_dependency 'test-unit', '~> 3.3', '>= 3.3.5'
36
+ end
data/lib/attribool.rb ADDED
@@ -0,0 +1,96 @@
1
+ # frozen_string_literal: true
2
+
3
+ ##
4
+ # Adds macros and methods for dealing with boolean attributes.
5
+ module Attribool
6
+ def self.included(klass)
7
+ klass.extend(ClassMethods)
8
+ end
9
+
10
+ ##
11
+ # Class methods to be added to the class when included.
12
+ module ClassMethods
13
+ ##
14
+ # Creates a method that returns a boolean for attributes that may or may
15
+ # not be booleans themselves.
16
+ #
17
+ # @param [Symbol, String] attribute
18
+ #
19
+ # @kwarg [Boolean] allow_nil:
20
+ #
21
+ # @kwarg [Lambda] condition:
22
+ #
23
+ # @kwarg [Symbol, String] method:
24
+ #
25
+ # @kwarg [Symbol, String] prefix:
26
+ def bool_reader(
27
+ attribute,
28
+ allow_nil: true,
29
+ condition: nil,
30
+ prefix: nil,
31
+ method: nil
32
+ )
33
+ method ||= "#{attribute}?"
34
+ method = "#{prefix}_#{method}" if prefix
35
+ define_method(method) do
36
+ ivar = instance_variable_get("@#{attribute}")
37
+ raise TypeError, "#{attribute} is nil" if ivar.nil? && !allow_nil
38
+
39
+ condition ? condition.call(ivar) : to_boolean(ivar)
40
+ end
41
+ end
42
+
43
+ ##
44
+ # Creates a writer for boolean attributes. Always coerces to boolean based
45
+ # on truthiness.
46
+ #
47
+ # @param [Symbol, String] attribute
48
+ #
49
+ # @kwarg [Boolean] strict:
50
+ def bool_writer(attribute, strict: false)
51
+ define_method("#{attribute}=") do |v|
52
+ validate_boolean(v) if strict
53
+
54
+ instance_variable_set("@#{attribute}", to_boolean(v))
55
+ end
56
+ end
57
+
58
+ ##
59
+ # Creates a simple reader and writer for booleans. This should only be used
60
+ # when the attribute should only ever be +true+ or +false+.
61
+ #
62
+ # @param [Symbol, String] attribute
63
+ def bool_accessor(attribute)
64
+ bool_reader(attribute)
65
+ bool_writer(attribute)
66
+ end
67
+ end
68
+
69
+ ##
70
+ # Is the argument a boolean?
71
+ #
72
+ # @param [Object] attribute
73
+ #
74
+ # @return [Boolean]
75
+ def boolean?(attribute)
76
+ [TrueClass, FalseClass].include?(attribute.class)
77
+ end
78
+
79
+ ##
80
+ # Converts an Object to a boolean.
81
+ #
82
+ # @param [Object] attribute
83
+ #
84
+ # @return [Boolean]
85
+ def to_boolean(attribute)
86
+ !!attribute
87
+ end
88
+
89
+ private
90
+
91
+ ##
92
+ # Raises if argument is not a boolean.
93
+ def validate_boolean(attribute) # :nodoc:
94
+ raise ArgumentError, 'Argument must be a boolean' unless boolean?(attribute)
95
+ end
96
+ end
@@ -0,0 +1,34 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Attribool
4
+ ##
5
+ # Module that contains all gem version information. Follows semantic
6
+ # versioning. Read: https://semver.org/
7
+ module Version
8
+ ##
9
+ # Major version.
10
+ #
11
+ # @return [Integer]
12
+ MAJOR = 0
13
+
14
+ ##
15
+ # Minor version.
16
+ #
17
+ # @return [Integer]
18
+ MINOR = 0
19
+
20
+ ##
21
+ # Patch version.
22
+ #
23
+ # @return [Integer]
24
+ PATCH = 1
25
+
26
+ ##
27
+ # Version as +MAJOR.MINOR.PATCH+
28
+ #
29
+ # @return [String]
30
+ def self.to_s
31
+ "#{MAJOR}.#{MINOR}.#{PATCH}"
32
+ end
33
+ end
34
+ end
metadata ADDED
@@ -0,0 +1,109 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: attribool
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ platform: ruby
6
+ authors:
7
+ - Evan Gray
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2021-04-22 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: rake
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: '13.0'
20
+ - - ">="
21
+ - !ruby/object:Gem::Version
22
+ version: 13.0.1
23
+ type: :development
24
+ prerelease: false
25
+ version_requirements: !ruby/object:Gem::Requirement
26
+ requirements:
27
+ - - "~>"
28
+ - !ruby/object:Gem::Version
29
+ version: '13.0'
30
+ - - ">="
31
+ - !ruby/object:Gem::Version
32
+ version: 13.0.1
33
+ - !ruby/object:Gem::Dependency
34
+ name: simplecov
35
+ requirement: !ruby/object:Gem::Requirement
36
+ requirements:
37
+ - - ">="
38
+ - !ruby/object:Gem::Version
39
+ version: '0'
40
+ type: :development
41
+ prerelease: false
42
+ version_requirements: !ruby/object:Gem::Requirement
43
+ requirements:
44
+ - - ">="
45
+ - !ruby/object:Gem::Version
46
+ version: '0'
47
+ - !ruby/object:Gem::Dependency
48
+ name: test-unit
49
+ requirement: !ruby/object:Gem::Requirement
50
+ requirements:
51
+ - - "~>"
52
+ - !ruby/object:Gem::Version
53
+ version: '3.3'
54
+ - - ">="
55
+ - !ruby/object:Gem::Version
56
+ version: 3.3.5
57
+ type: :development
58
+ prerelease: false
59
+ version_requirements: !ruby/object:Gem::Requirement
60
+ requirements:
61
+ - - "~>"
62
+ - !ruby/object:Gem::Version
63
+ version: '3.3'
64
+ - - ">="
65
+ - !ruby/object:Gem::Version
66
+ version: 3.3.5
67
+ description: Macros for creating boolean attribute methods
68
+ email: evanthegrayt@vivaldi.net
69
+ executables: []
70
+ extensions: []
71
+ extra_rdoc_files: []
72
+ files:
73
+ - ".gitignore"
74
+ - Gemfile
75
+ - Gemfile.lock
76
+ - LICENSE
77
+ - README.md
78
+ - Rakefile
79
+ - attribool.gemspec
80
+ - lib/attribool.rb
81
+ - lib/attribool/version.rb
82
+ homepage: https://github.com/evanthegrayt/attribool
83
+ licenses:
84
+ - MIT
85
+ metadata:
86
+ allowed_push_host: https://rubygems.org
87
+ homepage_uri: https://github.com/evanthegrayt/attribool
88
+ source_code_uri: https://github.com/evanthegrayt/attribool
89
+ documentation_uri: https://evanthegrayt.github.io/attribool/doc/index.html
90
+ post_install_message:
91
+ rdoc_options: []
92
+ require_paths:
93
+ - lib
94
+ required_ruby_version: !ruby/object:Gem::Requirement
95
+ requirements:
96
+ - - ">="
97
+ - !ruby/object:Gem::Version
98
+ version: '0'
99
+ required_rubygems_version: !ruby/object:Gem::Requirement
100
+ requirements:
101
+ - - ">="
102
+ - !ruby/object:Gem::Version
103
+ version: '0'
104
+ requirements: []
105
+ rubygems_version: 3.2.3
106
+ signing_key:
107
+ specification_version: 4
108
+ summary: Macros for creating boolean attribute methods
109
+ test_files: []