safebool 1.1.0 → 1.2.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
  SHA1:
3
- metadata.gz: 3259e4df2ebfb2f5359249c7d1fc87dbb03c23d3
4
- data.tar.gz: 8357baa33140416175df3b652581a30a381e0d9e
3
+ metadata.gz: b61c7f7d5196f735be3c79898e36e5fc018828ac
4
+ data.tar.gz: 99ea5034038bae80ccd19c7fa4bdd113673c124d
5
5
  SHA512:
6
- metadata.gz: 12332af592e5acda2b25cfc6919c281c304fa0ed82f3804dab36736c32476e74d9cbc2c5d7f807b111f2fbc72cd210fa6858a0feb5ff2ef3b051aa7c633bfb68
7
- data.tar.gz: ff2e864c3b041f56b78be5ef1a1342984487affd5d56b8ef440c495fd69889b4a75c7bdb701e9980c36d49c5b9481747a5eec25c54338d5666ad20c5b1438705
6
+ metadata.gz: 12fc6db01d0dab4916a22ed118aeace91b32be276a4e9c69ac4a4857b8a36a054d28705d970a9787b2567d3cda0a8f4e80cd5393ee0a1c1742fa6a00eb5e44b7
7
+ data.tar.gz: 19968f82c51794c0954a6b75b82f3417d0876d20695cef4686d0063c9b85835fd1d9972f5da07d739b47b5534c91a19abc13c0c505da48c64a9059a82e817add
data/README.md CHANGED
@@ -47,8 +47,55 @@ Bool(1) #=> NoMethodError: undefined method `Bool' for Kernel
47
47
  ...
48
48
  ```
49
49
 
50
+
51
+ **Everything is `true` except `false` and `nil`.**
52
+ Just use the bang bang (`!!`) doubled-up (logical) boolean not operator for `to_b` conversion:
53
+
54
+ ``` ruby
55
+ !! false #=> false
56
+ !! nil #=> false
57
+
58
+ !! true #=> true
59
+ !! "false" #=> true
60
+ !! "" #=> true
61
+ !! 0 #=> true
62
+ !! 1 #=> true
63
+ !! [] #=> true
64
+ !! {} #=> true
65
+ !! 0.0 #=> true
66
+ !! :false #=> true
67
+ # ...
68
+ ```
69
+
50
70
  Why? Why not? Discuss.
51
71
 
72
+ ## Intro
73
+
74
+ ### What's a Bool?
75
+
76
+ In computer science, the Boolean data type is a data type that has one of two possible values (usually denoted _true_ and _false_),
77
+ intended to represent the two truth values of logic and Boolean algebra.
78
+ It is named after George Boole, who first defined an algebraic system of logic in the mid 19th century.
79
+
80
+ (Source: [Boolean data type @ Wikipedia](https://en.wikipedia.org/wiki/Boolean_data_type))
81
+
82
+
83
+
84
+ ### Trivia Quiz - The States of Bool
85
+
86
+ Q: How many states has a boolean type in a (classic) programming language?
87
+
88
+ - [ A ] 1 - One State
89
+ - [ B ] 2 - Two States
90
+ - [ C ] 3 - Three States
91
+ - [ D ] Other. Please tell
92
+
93
+ A: In practice¹ three really :-), that is, `true`, `false` and
94
+ undefined (e.g. `nil`).
95
+
96
+ 1: with nil-able / null-able types
97
+
98
+
52
99
 
53
100
 
54
101
  ## Usage
@@ -87,14 +134,14 @@ Bool(1) #=> true
87
134
 
88
135
  How about handling errors on invalid bool values when converting / parsing?
89
136
 
90
- 1. `to_b` always returns a bool even if the conversion / parsing fails e.g. `true` (for numbers) and `false` (for strings) on error
137
+ 1. `to_b` always returns a bool even if the conversion / parsing fails e.g. `true` for invalid numbers or strings and `false` (for empty / blank strings) on error
91
138
  2. `parse_bool / to_bool` always returns `nil` if the conversion / parsing fails
92
139
  3. `Bool()` always raises an `ArgumentError` if the conversion / parsing fails
93
140
  and a `TypeError` if the conversion is unsupported (e.g. expected required `parse_bool` method missing / undefined)
94
141
 
95
142
 
96
143
  ``` ruby
97
- "2".to_b #=> false
144
+ "2".to_b #=> true
98
145
  "2".to_bool #=> nil
99
146
  "2".to_bool.bool? #=> false
100
147
  "2".to_bool.is_a?(Bool) #=> false
@@ -105,6 +152,17 @@ Bool("2") #=> ArgumentError: invalid value "2":String for Bool();
105
152
  2.to_bool.bool? #=> false
106
153
  2.to_bool.is_a?(Bool) #=> false
107
154
  Bool(2) #=> ArgumentError: invalid value 2:Integer for Bool(); parse_bool failed (returns nil)
155
+
156
+ "".to_b #=> false
157
+ "".to_bool #=> nil
158
+ "".to_bool.bool? #=> false
159
+ "".to_bool.is_a?(Bool) #=> false
160
+ Bool("") #=> ArgumentError: invalid value "":String for Bool(); parse_bool failed (returns nil)
161
+
162
+ # note: same for "blank" strings
163
+ " ".to_b #=> false
164
+ " ".to_bool #=> nil
165
+
108
166
  ...
109
167
  ```
110
168
 
@@ -114,7 +172,7 @@ Bool(2) #=> ArgumentError: invalid value 2:Integer for Bool(); p
114
172
  - Returns `true` if string is one of these values: **t**, **true**, **on**, **y**, **yes**, **1**.
115
173
  - Returns `false` if string is one of these values: **f**, **false**, **off**, **n**, **no**, **0**.
116
174
 
117
- For invalid boolean string values `to_b` returns `false` by default.
175
+ For invalid boolean string values `to_b` returns `true` by default except for empty / blank strings where `to_b` returns `false`.
118
176
  See the "Handling Errors" section for more options.
119
177
 
120
178
  Note: The `Bool.parse` method ignores leading and trailing spaces and upper and lower cases e.g. ` FaLSe ` is the same as `false`.
@@ -170,8 +228,9 @@ Note: The `Bool.parse` method ignores leading and trailing spaces and upper and
170
228
 
171
229
  ''.to_b #=> false
172
230
  ' '.to_b #=> false
173
- 'xxx'.to_b #=> false
174
- 'bool'.to_b #=> false
231
+
232
+ 'xxx'.to_b #=> true
233
+ 'bool'.to_b #=> true
175
234
 
176
235
  ''.to_bool #=> nil
177
236
  ' '.to_bool #=> nil
@@ -198,8 +257,8 @@ Same as `self.to_s.to_b` or `self.to_s.to_bool`.
198
257
  :n.to_b #=> false
199
258
  :no.to_b #=> false
200
259
 
201
- :xxx.to_b #=> false
202
- :bool.to_b #=> false
260
+ :xxx.to_b #=> true
261
+ :bool.to_b #=> true
203
262
 
204
263
  :xxx.to_bool #=> nil
205
264
  :bool.to_bool #=> nil
@@ -140,9 +140,13 @@ end
140
140
 
141
141
  class String
142
142
  def to_b
143
- value = parse_bool()
144
- value = false if value.nil? ## note: return false (!) for all undefined / unknown string values that cannot convert to bool
145
- value
143
+ if strip.empty? ## add special case for empty / blank strings - return false (!)
144
+ value = false
145
+ else
146
+ value = parse_bool()
147
+ value = true if value.nil? ## note: return true for all undefined / unknown string values that cannot convert to bool (except empty string)
148
+ value
149
+ end
146
150
  end
147
151
  def parse_bool() Bool.parse( self ); end
148
152
  end
@@ -9,7 +9,7 @@
9
9
  module SaferBool
10
10
 
11
11
  MAJOR = 1
12
- MINOR = 1
12
+ MINOR = 2
13
13
  PATCH = 0
14
14
  VERSION = [MAJOR,MINOR,PATCH].join('.')
15
15
 
@@ -36,6 +36,20 @@ class TestBool < MiniTest::Test
36
36
 
37
37
  assert_equal true, false.frozen? ## (always) true by default
38
38
  assert_equal true, true.frozen? ## (always) true by default
39
+
40
+
41
+ assert_equal false, !! false
42
+ assert_equal false, !! nil
43
+
44
+ assert_equal true, !! true
45
+ assert_equal true, !! "false"
46
+ assert_equal true, !! ""
47
+ assert_equal true, !! 0
48
+ assert_equal true, !! 1
49
+ assert_equal true, !! []
50
+ assert_equal true, !! {}
51
+ assert_equal true, !! 0.0
52
+ assert_equal true, !! :false
39
53
  end
40
54
 
41
55
  def test_parse
@@ -88,6 +102,12 @@ class TestBool < MiniTest::Test
88
102
  assert_equal true, Bool("y")
89
103
  assert_equal true, Bool("1")
90
104
 
105
+
106
+ assert_equal false, "".to_b
107
+ assert_equal false, " ".to_b
108
+ assert_equal true, "2".to_b
109
+ assert_equal true, "xxx".to_b
110
+
91
111
  assert_equal true, "".to_bool == nil
92
112
  assert_equal true, " ".to_bool == nil
93
113
  assert_equal true, "2".to_bool == nil
@@ -123,8 +143,12 @@ class TestBool < MiniTest::Test
123
143
  assert_equal true, Bool(:y)
124
144
  assert_equal true, Bool(:"1")
125
145
 
126
- assert_equal true, :'2'.to_bool == nil
127
- assert_equal true, :xxx.to_bool == nil
146
+ assert_equal false, :" ".to_b
147
+ assert_equal true, :"2".to_b
148
+ assert_equal true, :"xxx".to_b
149
+
150
+ assert_equal true, :'2'.to_bool == nil
151
+ assert_equal true, :xxx.to_bool == nil
128
152
 
129
153
  assert_equal false, :'2'.to_bool.bool?
130
154
  assert_equal false, :'xxx'.to_bool.bool?
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: safebool
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.1.0
4
+ version: 1.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Gerald Bauer
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2019-04-02 00:00:00.000000000 Z
11
+ date: 2019-04-05 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rdoc