mini_sanity 1.0.0 → 1.1.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/CHANGELOG.md +32 -0
- data/README.md +38 -4
- data/Rakefile +1 -0
- data/lib/mini_sanity.rb +1 -0
- data/lib/mini_sanity/array.rb +63 -0
- data/lib/mini_sanity/enumerable.rb +33 -4
- data/lib/mini_sanity/error.rb +9 -0
- data/lib/mini_sanity/object.rb +141 -16
- data/lib/mini_sanity/pathname.rb +101 -11
- data/lib/mini_sanity/string.rb +87 -12
- data/lib/mini_sanity/util.rb +3 -0
- data/lib/mini_sanity/util/enumerable.rb +31 -0
- data/lib/mini_sanity/util/regexp.rb +27 -0
- data/lib/mini_sanity/util/string.rb +77 -0
- data/lib/mini_sanity/version.rb +1 -1
- metadata +9 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: ba5fd068770843f3044c6dade58282429e1330e5
|
4
|
+
data.tar.gz: 1aa0bfd6c7f88f9a0e1d992cd18289c5a9328ac1
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 1dfe7f149c334cd7ea7eb2330ddf834b72a17bb3009cdd45f42dd8e1347278084a65c835a1d7d438e881a64d42750ab8fda3eefd0fb498a919e76faa38a59bd3
|
7
|
+
data.tar.gz: ea9642cd25487cf2f54d990843f79ba98cece1b560811ea791644e2c010707d910fb5def8800a9518bec04ef274b9db7bf9884a1612549888ee6dfe5102f7260
|
data/CHANGELOG.md
ADDED
@@ -0,0 +1,32 @@
|
|
1
|
+
## 1.1.0
|
2
|
+
|
3
|
+
* Standardized exception error messages
|
4
|
+
|
5
|
+
* Added sanity check methods:
|
6
|
+
* Array#assert_length!
|
7
|
+
* Array#refute_length!
|
8
|
+
* Enumerable#assert_empty!
|
9
|
+
* Object#assert_equal!
|
10
|
+
* Object#assert_in!
|
11
|
+
* Object#assert_nil!
|
12
|
+
* Object#refute_equal!
|
13
|
+
* Object#refute_in!
|
14
|
+
* Pathname#assert_dir!
|
15
|
+
* Pathname#assert_file!
|
16
|
+
* Pathname#refute_dir!
|
17
|
+
* Pathname#refute_file!
|
18
|
+
* String#assert_empty!
|
19
|
+
* String#assert_length!
|
20
|
+
* String#refute_length!
|
21
|
+
|
22
|
+
* Added utility methods:
|
23
|
+
* Enumerable#first!
|
24
|
+
* Regexp#match!
|
25
|
+
* String#change
|
26
|
+
* String#change!
|
27
|
+
* String#match!
|
28
|
+
|
29
|
+
|
30
|
+
## 1.0.0
|
31
|
+
|
32
|
+
* Initial release
|
data/README.md
CHANGED
@@ -1,13 +1,13 @@
|
|
1
1
|
# mini_sanity
|
2
2
|
|
3
|
-
In-line [sanity checks], written as extensions to core Ruby objects.
|
4
|
-
API listing below, or browse the [full documentation].
|
3
|
+
In-line [sanity checks], written as extensions to core Ruby objects.
|
4
|
+
See API listing below, or browse the [full documentation].
|
5
5
|
|
6
6
|
[sanity checks]: https://en.wikipedia.org/wiki/Sanity_check
|
7
7
|
[full documentation]: http://www.rubydoc.info/gems/mini_sanity/
|
8
8
|
|
9
9
|
|
10
|
-
|
10
|
+
## Example
|
11
11
|
|
12
12
|
```ruby
|
13
13
|
require "json"
|
@@ -27,22 +27,55 @@ end.uniq
|
|
27
27
|
```
|
28
28
|
|
29
29
|
|
30
|
-
|
30
|
+
## API
|
31
31
|
|
32
32
|
- [Object](http://www.rubydoc.info/gems/mini_sanity/Object)
|
33
|
+
- [#assert_equal!](http://www.rubydoc.info/gems/mini_sanity/Object:assert_equal%21)
|
34
|
+
- [#assert_in!](http://www.rubydoc.info/gems/mini_sanity/Object:assert_in%21)
|
33
35
|
- [#assert_instance_of!](http://www.rubydoc.info/gems/mini_sanity/Object:assert_instance_of%21)
|
34
36
|
- [#assert_kind_of!](http://www.rubydoc.info/gems/mini_sanity/Object:assert_kind_of%21)
|
37
|
+
- [#assert_nil!](http://www.rubydoc.info/gems/mini_sanity/Object:assert_nil%21)
|
35
38
|
- [#assert_respond_to!](http://www.rubydoc.info/gems/mini_sanity/Object:assert_respond_to%21)
|
39
|
+
- [#refute_equal!](http://www.rubydoc.info/gems/mini_sanity/Object:refute_equal%21)
|
40
|
+
- [#refute_in!](http://www.rubydoc.info/gems/mini_sanity/Object:refute_in%21)
|
36
41
|
- [#refute_nil!](http://www.rubydoc.info/gems/mini_sanity/Object:refute_nil%21)
|
42
|
+
- [Array](http://www.rubydoc.info/gems/mini_sanity/Array)
|
43
|
+
- [#assert_length!](http://www.rubydoc.info/gems/mini_sanity/Array:assert_length%21)
|
44
|
+
- [#refute_length!](http://www.rubydoc.info/gems/mini_sanity/Array:refute_length%21)
|
37
45
|
- [Enumerable](http://www.rubydoc.info/gems/mini_sanity/Enumerable)
|
46
|
+
- [#assert_empty!](http://www.rubydoc.info/gems/mini_sanity/Enumerable:assert_empty%21)
|
38
47
|
- [#refute_empty!](http://www.rubydoc.info/gems/mini_sanity/Enumerable:refute_empty%21)
|
39
48
|
- [String](http://www.rubydoc.info/gems/mini_sanity/String)
|
49
|
+
- [#assert_empty!](http://www.rubydoc.info/gems/mini_sanity/String:assert_empty%21)
|
50
|
+
- [#assert_length!](http://www.rubydoc.info/gems/mini_sanity/String:assert_length%21)
|
40
51
|
- [#assert_match!](http://www.rubydoc.info/gems/mini_sanity/String:assert_match%21)
|
41
52
|
- [#refute_empty!](http://www.rubydoc.info/gems/mini_sanity/String:refute_empty%21)
|
53
|
+
- [#refute_length!](http://www.rubydoc.info/gems/mini_sanity/String:refute_length%21)
|
42
54
|
- [#refute_match!](http://www.rubydoc.info/gems/mini_sanity/String:refute_match%21)
|
43
55
|
- [Pathname](http://www.rubydoc.info/gems/mini_sanity/Pathname)
|
56
|
+
- [#assert_dir!](http://www.rubydoc.info/gems/mini_sanity/Pathname:assert_dir%21)
|
44
57
|
- [#assert_exist!](http://www.rubydoc.info/gems/mini_sanity/Pathname:assert_exist%21)
|
58
|
+
- [#assert_file!](http://www.rubydoc.info/gems/mini_sanity/Pathname:assert_file%21)
|
59
|
+
- [#refute_dir!](http://www.rubydoc.info/gems/mini_sanity/Pathname:refute_dir%21)
|
45
60
|
- [#refute_exist!](http://www.rubydoc.info/gems/mini_sanity/Pathname:refute_exist%21)
|
61
|
+
- [#refute_file!](http://www.rubydoc.info/gems/mini_sanity/Pathname:refute_file%21)
|
62
|
+
|
63
|
+
|
64
|
+
## Util API
|
65
|
+
|
66
|
+
*mini_sanity* also includes a few optional utility methods which perform
|
67
|
+
some function, check an assertion on the result, and raise an error with
|
68
|
+
a helpful message if the assertion fails. You must add
|
69
|
+
`require "mini_sanity/util"` to your script to access these methods.
|
70
|
+
|
71
|
+
- [Enumerable](http://www.rubydoc.info/gems/mini_sanity/Enumerable)
|
72
|
+
- [#first!](http://www.rubydoc.info/gems/mini_sanity/Enumerable:first%21)
|
73
|
+
- [Regexp](http://www.rubydoc.info/gems/mini_sanity/Regexp)
|
74
|
+
- [#match!](http://www.rubydoc.info/gems/mini_sanity/Regexp:match%21)
|
75
|
+
- [String](http://www.rubydoc.info/gems/mini_sanity/String)
|
76
|
+
- [#change](http://www.rubydoc.info/gems/mini_sanity/String:change)
|
77
|
+
- [#change!](http://www.rubydoc.info/gems/mini_sanity/String:change%21)
|
78
|
+
- [#match!](http://www.rubydoc.info/gems/mini_sanity/String:match%21)
|
46
79
|
|
47
80
|
|
48
81
|
## Installation
|
@@ -57,6 +90,7 @@ Then require in your Ruby script:
|
|
57
90
|
|
58
91
|
```ruby
|
59
92
|
require "mini_sanity"
|
93
|
+
require "mini_sanity/util" # OPTIONAL
|
60
94
|
```
|
61
95
|
|
62
96
|
|
data/Rakefile
CHANGED
data/lib/mini_sanity.rb
CHANGED
@@ -0,0 +1,63 @@
|
|
1
|
+
class Array
|
2
|
+
|
3
|
+
# Checks that the Array matches a given length, and returns the Array
|
4
|
+
# unmodified. If the Array fails this check, an exception is
|
5
|
+
# raised.
|
6
|
+
#
|
7
|
+
# @example
|
8
|
+
# coord = [0, 0, 0]
|
9
|
+
# coord.assert_length(3)! # == [0, 0, 0]
|
10
|
+
#
|
11
|
+
# coord = [0, 0]
|
12
|
+
# coord.assert_length(3)! # raises exception
|
13
|
+
#
|
14
|
+
# coord = [0, 0]
|
15
|
+
# coord.assert_length(2..3)! # == [0, 0]
|
16
|
+
#
|
17
|
+
# @param length [Integer, Range<Integer>]
|
18
|
+
# length to match
|
19
|
+
# @param name [String, Symbol]
|
20
|
+
# optional name to include in the error message
|
21
|
+
# @return [self]
|
22
|
+
# @raise [MiniSanity::Error]
|
23
|
+
# if the Array length does not match +length+
|
24
|
+
def assert_length!(length, name = nil)
|
25
|
+
if !(length === self.length)
|
26
|
+
raise MiniSanity::Error.new(name,
|
27
|
+
"#{self.class} having #{length} elements",
|
28
|
+
self.inspect)
|
29
|
+
end
|
30
|
+
self
|
31
|
+
end
|
32
|
+
|
33
|
+
# Checks that the Array does not match a given length, and returns the
|
34
|
+
# Array unmodified. If the Array fails this check, an exception is
|
35
|
+
# raised.
|
36
|
+
#
|
37
|
+
# @example
|
38
|
+
# some = ["one"]
|
39
|
+
# some.refute_length!(0) # == ["one"]
|
40
|
+
#
|
41
|
+
# some = []
|
42
|
+
# some.refute_length(0)! # raises exception
|
43
|
+
#
|
44
|
+
# many = ["one", "many"]
|
45
|
+
# many.refute_length!(0..1) # == ["one", "many"]
|
46
|
+
#
|
47
|
+
# @param length [Integer, Range<Integer>]
|
48
|
+
# length to not match
|
49
|
+
# @param name [String, Symbol]
|
50
|
+
# optional name to include in the error message
|
51
|
+
# @return [self]
|
52
|
+
# @raise [MiniSanity::Error]
|
53
|
+
# if the Array length matches +length+
|
54
|
+
def refute_length!(length, name = nil)
|
55
|
+
if length === self.length
|
56
|
+
raise MiniSanity::Error.new(name,
|
57
|
+
"#{self.class} not having #{length} elements",
|
58
|
+
self.inspect)
|
59
|
+
end
|
60
|
+
self
|
61
|
+
end
|
62
|
+
|
63
|
+
end
|
@@ -1,12 +1,37 @@
|
|
1
1
|
module Enumerable
|
2
2
|
|
3
|
+
# Checks that the Enumerable is empty, and returns the Enumerable
|
4
|
+
# unmodified. If the Enumerable fails this check, an exception is
|
5
|
+
# raised.
|
6
|
+
#
|
7
|
+
# @example
|
8
|
+
# errors = []
|
9
|
+
# errors.assert_empty! # == []
|
10
|
+
#
|
11
|
+
# errors = ["something went wrong"]
|
12
|
+
# errors.assert_empty! # raises exception
|
13
|
+
#
|
14
|
+
# @param name [String, Symbol]
|
15
|
+
# optional name to include in the error message
|
16
|
+
# @return [self]
|
17
|
+
# @raise [MiniSanity::Error]
|
18
|
+
# if the Enumerable is not empty
|
19
|
+
def assert_empty!(name = nil)
|
20
|
+
if self.any?{ true }
|
21
|
+
raise MiniSanity::Error.new(name,
|
22
|
+
"empty #{self.class}",
|
23
|
+
self.inspect)
|
24
|
+
end
|
25
|
+
self
|
26
|
+
end
|
27
|
+
|
3
28
|
# Checks that the Enumerable is not empty, and returns the Enumerable
|
4
29
|
# unmodified. If the Enumerable fails this check, an exception is
|
5
30
|
# raised.
|
6
31
|
#
|
7
32
|
# @example
|
8
|
-
# [
|
9
|
-
# [].refute_empty!
|
33
|
+
# ["result 1"].refute_empty! # == ["result 1"]
|
34
|
+
# [].refute_empty! # raises exception
|
10
35
|
#
|
11
36
|
# @param name [String, Symbol]
|
12
37
|
# optional name to include in the error message
|
@@ -14,8 +39,12 @@ module Enumerable
|
|
14
39
|
# @raise [MiniSanity::Error]
|
15
40
|
# if the Enumerable is empty
|
16
41
|
def refute_empty!(name = nil)
|
17
|
-
|
18
|
-
|
42
|
+
# NOTE use #any? instead of #none? because Array#none? seems to be
|
43
|
+
# significantly slower than Array#any? (and likewise for Hash)
|
44
|
+
if !self.any?{ true }
|
45
|
+
raise MiniSanity::Error.new(name,
|
46
|
+
"non-empty #{self.class}",
|
47
|
+
self.inspect)
|
19
48
|
end
|
20
49
|
self
|
21
50
|
end
|
data/lib/mini_sanity/error.rb
CHANGED
data/lib/mini_sanity/object.rb
CHANGED
@@ -1,11 +1,35 @@
|
|
1
1
|
class Object
|
2
2
|
|
3
|
+
# Checks that the Object is nil, and returns nil. If the Object fails
|
4
|
+
# this check, an exception is raised.
|
5
|
+
#
|
6
|
+
# @example
|
7
|
+
# result = {}
|
8
|
+
# result[:error].assert_nil! # == nil
|
9
|
+
#
|
10
|
+
# result = { error: "something went wrong" }
|
11
|
+
# result[:error].assert_nil! # == raises exception
|
12
|
+
#
|
13
|
+
# @param name [String, Symbol]
|
14
|
+
# optional name to include in the error message
|
15
|
+
# @return [self]
|
16
|
+
# @raise [MiniSanity::Error]
|
17
|
+
# if the Object is not nil
|
18
|
+
def assert_nil!(name = nil)
|
19
|
+
if !self.nil?
|
20
|
+
raise MiniSanity::Error.new(name,
|
21
|
+
"nil",
|
22
|
+
self.inspect)
|
23
|
+
end
|
24
|
+
self
|
25
|
+
end
|
26
|
+
|
3
27
|
# Checks that the Object is not nil, and returns the Object
|
4
28
|
# unmodified. If the Object fails this check, an exception is raised.
|
5
29
|
#
|
6
30
|
# @example
|
7
|
-
# [
|
8
|
-
# [].first.refute_nil!
|
31
|
+
# ["result 1"].first.refute_nil! # == "result 1"
|
32
|
+
# [].first.refute_nil! # raises exception
|
9
33
|
#
|
10
34
|
# @param name [String, Symbol]
|
11
35
|
# optional name to include in the error message
|
@@ -14,8 +38,105 @@ class Object
|
|
14
38
|
# if the Object is nil
|
15
39
|
def refute_nil!(name = nil)
|
16
40
|
if self.nil?
|
17
|
-
|
18
|
-
|
41
|
+
raise MiniSanity::Error.new(name,
|
42
|
+
"non-nil value",
|
43
|
+
"nil")
|
44
|
+
end
|
45
|
+
self
|
46
|
+
end
|
47
|
+
|
48
|
+
# Checks that the Object equals a given expected value, and returns
|
49
|
+
# the Object unmodified. If the Object fails this check, an exception
|
50
|
+
# is raised.
|
51
|
+
#
|
52
|
+
# @example
|
53
|
+
# "good".assert_equal!("good") # == "good"
|
54
|
+
# "bad".assert_equal!("good") # raises exception
|
55
|
+
#
|
56
|
+
# @param expect [Object]
|
57
|
+
# value to expect
|
58
|
+
# @param name [String, Symbol]
|
59
|
+
# optional name to include in the error message
|
60
|
+
# @return [self]
|
61
|
+
# @raise [MiniSanity::Error]
|
62
|
+
# if the Object does not equal +expect+
|
63
|
+
def assert_equal!(expect, name = nil)
|
64
|
+
if self != expect
|
65
|
+
raise MiniSanity::Error.new(name,
|
66
|
+
expect.inspect,
|
67
|
+
self.inspect)
|
68
|
+
end
|
69
|
+
self
|
70
|
+
end
|
71
|
+
|
72
|
+
# Checks that the Object does not equal a given reject value, and
|
73
|
+
# returns the Object unmodified. If the Object fails this check, an
|
74
|
+
# exception is raised.
|
75
|
+
#
|
76
|
+
# @example
|
77
|
+
# "good".refute_equal!("bad") # == "good"
|
78
|
+
# "bad".refute_equal!("bad") # raises exception
|
79
|
+
#
|
80
|
+
# @param reject [Object]
|
81
|
+
# value to reject
|
82
|
+
# @param name [String, Symbol]
|
83
|
+
# optional name to include in the error message
|
84
|
+
# @return [self]
|
85
|
+
# @raise [MiniSanity::Error]
|
86
|
+
# if the Object equals +reject+
|
87
|
+
def refute_equal!(reject, name = nil)
|
88
|
+
if self == reject
|
89
|
+
raise MiniSanity::Error.new(name,
|
90
|
+
"not #{reject.inspect}",
|
91
|
+
self.inspect)
|
92
|
+
end
|
93
|
+
self
|
94
|
+
end
|
95
|
+
|
96
|
+
# Checks that the Object is included in a given collection, and
|
97
|
+
# returns the Object unmodified. If the Object fails this check, an
|
98
|
+
# exception is raised.
|
99
|
+
#
|
100
|
+
# @example
|
101
|
+
# "good".assert_in!(["ok", "good", "great"]) # == "good"
|
102
|
+
# "bad".assert_in!(["ok", "good", "great"]) # raises exception
|
103
|
+
#
|
104
|
+
# @param permitted [Enumerable, #include?]
|
105
|
+
# collection of permitted values
|
106
|
+
# @param name [String, Symbol]
|
107
|
+
# optional name to include in the error message
|
108
|
+
# @return [self]
|
109
|
+
# @raise [MiniSanity::Error]
|
110
|
+
# if the Object is not included in +permitted+
|
111
|
+
def assert_in!(permitted, name = nil)
|
112
|
+
if !permitted.include?(self)
|
113
|
+
raise MiniSanity::Error.new(name,
|
114
|
+
"value included in #{permitted.inspect}",
|
115
|
+
self.inspect)
|
116
|
+
end
|
117
|
+
self
|
118
|
+
end
|
119
|
+
|
120
|
+
# Checks that the Object is not included in a given collection, and
|
121
|
+
# returns the Object unmodified. If the Object fails this check, an
|
122
|
+
# exception is raised.
|
123
|
+
#
|
124
|
+
# @example
|
125
|
+
# "good".refute_in!(["bad", "poor", "fail"]) # == "good"
|
126
|
+
# "bad".refute_in!(["bad", "poor", "fail"]) # raises exception
|
127
|
+
#
|
128
|
+
# @param prohibited [Enumerable, #include?]
|
129
|
+
# collection of prohibited values
|
130
|
+
# @param name [String, Symbol]
|
131
|
+
# optional name to include in the error message
|
132
|
+
# @return [self]
|
133
|
+
# @raise [MiniSanity::Error]
|
134
|
+
# if the Object is included in +prohibited+
|
135
|
+
def refute_in!(prohibited, name = nil)
|
136
|
+
if prohibited.include?(self)
|
137
|
+
raise MiniSanity::Error.new(name,
|
138
|
+
"value not included in #{prohibited.inspect}",
|
139
|
+
self.inspect)
|
19
140
|
end
|
20
141
|
self
|
21
142
|
end
|
@@ -25,8 +146,8 @@ class Object
|
|
25
146
|
# is raised.
|
26
147
|
#
|
27
148
|
# @example
|
28
|
-
#
|
29
|
-
#
|
149
|
+
# 123.assert_instance_of!(Numeric) # == 123
|
150
|
+
# 123.assert_instance_of!(String) # raises exception
|
30
151
|
#
|
31
152
|
# @param klass [Class]
|
32
153
|
# class to check
|
@@ -36,9 +157,10 @@ class Object
|
|
36
157
|
# @raise [MiniSanity::Error]
|
37
158
|
# if the Object is not an instance of +klass+
|
38
159
|
def assert_instance_of!(klass, name = nil)
|
39
|
-
|
40
|
-
|
41
|
-
|
160
|
+
if !self.instance_of?(klass)
|
161
|
+
raise MiniSanity::Error.new(name,
|
162
|
+
"instance of #{klass}",
|
163
|
+
"instance of #{self.class}: #{self.inspect}")
|
42
164
|
end
|
43
165
|
self
|
44
166
|
end
|
@@ -48,8 +170,8 @@ class Object
|
|
48
170
|
# this check, an exception is raised.
|
49
171
|
#
|
50
172
|
# @example
|
51
|
-
#
|
52
|
-
#
|
173
|
+
# 123.assert_kind_of!(Numeric) # == 123
|
174
|
+
# 123.assert_kind_of!(Float) # raises exception
|
53
175
|
#
|
54
176
|
# @param klass [Class]
|
55
177
|
# class to check
|
@@ -59,9 +181,10 @@ class Object
|
|
59
181
|
# @raise [MiniSanity::Error]
|
60
182
|
# if the Object is not an instance of +klass+ or its subclasses
|
61
183
|
def assert_kind_of!(klass, name = nil)
|
62
|
-
|
63
|
-
|
64
|
-
|
184
|
+
if !self.kind_of?(klass)
|
185
|
+
raise MiniSanity::Error.new(name,
|
186
|
+
"instance of #{klass} or one of its subclasses",
|
187
|
+
"instance of #{self.class}: #{self.inspect}")
|
65
188
|
end
|
66
189
|
self
|
67
190
|
end
|
@@ -82,8 +205,10 @@ class Object
|
|
82
205
|
# @raise [MiniSanity::Error]
|
83
206
|
# if the Object does not respond to +method_name+
|
84
207
|
def assert_respond_to!(method_name, name = nil)
|
85
|
-
|
86
|
-
raise MiniSanity::Error.new(
|
208
|
+
if !self.respond_to?(method_name)
|
209
|
+
raise MiniSanity::Error.new(name,
|
210
|
+
"object responding to method #{method_name}",
|
211
|
+
"instance of #{self.class}: #{self.inspect}")
|
87
212
|
end
|
88
213
|
self
|
89
214
|
end
|
data/lib/mini_sanity/pathname.rb
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
class Pathname
|
2
2
|
|
3
|
-
# Checks that the
|
3
|
+
# Checks that the Pathname represents an existing file or directory,
|
4
4
|
# and returns the Pathname unmodified. If the Pathname fails this
|
5
5
|
# check, an exception is raised.
|
6
6
|
#
|
@@ -12,18 +12,19 @@ class Pathname
|
|
12
12
|
# optional name to include in the error message
|
13
13
|
# @return [self]
|
14
14
|
# @raise [MiniSanity::Error]
|
15
|
-
# if the
|
15
|
+
# if the Pathname does not represent an existing file or directory
|
16
16
|
def assert_exist!(name = nil)
|
17
|
-
|
18
|
-
|
19
|
-
|
17
|
+
if !self.exist?
|
18
|
+
raise MiniSanity::Error.new(name,
|
19
|
+
"existent file or directory",
|
20
|
+
"#{self} does not exist")
|
20
21
|
end
|
21
22
|
self
|
22
23
|
end
|
23
24
|
|
24
|
-
# Checks that the
|
25
|
-
#
|
26
|
-
#
|
25
|
+
# Checks that the Pathname does not represent an existing file or
|
26
|
+
# directory, and returns the Pathname unmodified. If the Pathname
|
27
|
+
# fails this check, an exception is raised.
|
27
28
|
#
|
28
29
|
# @example
|
29
30
|
# Pathname.new("/dev/null/nope").refute_exist! # == Pathname.new("/dev/null/nope")
|
@@ -33,11 +34,100 @@ class Pathname
|
|
33
34
|
# optional name to include in the error message
|
34
35
|
# @return [self]
|
35
36
|
# @raise [MiniSanity::Error]
|
36
|
-
# if the
|
37
|
+
# if the Pathname represents an existing file or directory
|
37
38
|
def refute_exist!(name = nil)
|
38
39
|
if self.exist?
|
39
|
-
|
40
|
-
|
40
|
+
raise MiniSanity::Error.new(name,
|
41
|
+
"non-existent file or directory",
|
42
|
+
"#{self} already exists")
|
43
|
+
end
|
44
|
+
self
|
45
|
+
end
|
46
|
+
|
47
|
+
# Checks that the Pathname represents an existing directory, and
|
48
|
+
# returns the Pathname unmodified. If the Pathname fails this check,
|
49
|
+
# an exception is raised.
|
50
|
+
#
|
51
|
+
# @example
|
52
|
+
# Pathname.new(__dir__).assert_dir! # == Pathname.new(__dir__)
|
53
|
+
# Pathname.new(__FILE__).assert_dir! # == raises exception
|
54
|
+
#
|
55
|
+
# @param name [String, Symbol]
|
56
|
+
# optional name to include in the error message
|
57
|
+
# @return [self]
|
58
|
+
# @raise [MiniSanity::Error]
|
59
|
+
# if the Pathname does not represent an existing directory
|
60
|
+
def assert_dir!(name = nil)
|
61
|
+
if !self.directory?
|
62
|
+
raise MiniSanity::Error.new(name,
|
63
|
+
"existent directory",
|
64
|
+
"#{self} is not a directory")
|
65
|
+
end
|
66
|
+
self
|
67
|
+
end
|
68
|
+
|
69
|
+
# Checks that the Pathname does not represent an existing directory,
|
70
|
+
# and returns the Pathname unmodified. If the Pathname fails this
|
71
|
+
# check, an exception is raised.
|
72
|
+
#
|
73
|
+
# @example
|
74
|
+
# Pathname.new(__FILE__).refute_dir! # == Pathname.new(__FILE__)
|
75
|
+
# Pathname.new(__dir__).refute_dir! # raises exception
|
76
|
+
#
|
77
|
+
# @param name [String, Symbol]
|
78
|
+
# optional name to include in the error message
|
79
|
+
# @return [self]
|
80
|
+
# @raise [MiniSanity::Error]
|
81
|
+
# if the Pathname represents an existing directory
|
82
|
+
def refute_dir!(name = nil)
|
83
|
+
if self.directory?
|
84
|
+
raise MiniSanity::Error.new(name,
|
85
|
+
"not an existent directory",
|
86
|
+
"#{self} is a directory")
|
87
|
+
end
|
88
|
+
self
|
89
|
+
end
|
90
|
+
|
91
|
+
# Checks that the Pathname represents an existing file, and returns
|
92
|
+
# the Pathname unmodified. If the Pathname fails this check, an
|
93
|
+
# exception is raised.
|
94
|
+
#
|
95
|
+
# @example
|
96
|
+
# Pathname.new(__FILE__).assert_file! # == Pathname.new(__FILE__)
|
97
|
+
# Pathname.new(__dir__).assert_file! # == raises exception
|
98
|
+
#
|
99
|
+
# @param name [String, Symbol]
|
100
|
+
# optional name to include in the error message
|
101
|
+
# @return [self]
|
102
|
+
# @raise [MiniSanity::Error]
|
103
|
+
# if the Pathname does not represent an existing file
|
104
|
+
def assert_file!(name = nil)
|
105
|
+
if !self.file?
|
106
|
+
raise MiniSanity::Error.new(name,
|
107
|
+
"existent file",
|
108
|
+
"#{self} is not a file")
|
109
|
+
end
|
110
|
+
self
|
111
|
+
end
|
112
|
+
|
113
|
+
# Checks that the Pathname does not represent an existing file, and
|
114
|
+
# returns the Pathname unmodified. If the Pathname fails this check,
|
115
|
+
# an exception is raised.
|
116
|
+
#
|
117
|
+
# @example
|
118
|
+
# Pathname.new(__dir__).refute_file! # == Pathname.new(__dir__)
|
119
|
+
# Pathname.new(__FILE__).refute_file! # raises exception
|
120
|
+
#
|
121
|
+
# @param name [String, Symbol]
|
122
|
+
# optional name to include in the error message
|
123
|
+
# @return [self]
|
124
|
+
# @raise [MiniSanity::Error]
|
125
|
+
# if the Pathname represents an existing file
|
126
|
+
def refute_file!(name = nil)
|
127
|
+
if self.file?
|
128
|
+
raise MiniSanity::Error.new(name,
|
129
|
+
"not an existent file",
|
130
|
+
"#{self} is a file")
|
41
131
|
end
|
42
132
|
self
|
43
133
|
end
|
data/lib/mini_sanity/string.rb
CHANGED
@@ -1,11 +1,32 @@
|
|
1
1
|
class String
|
2
2
|
|
3
|
+
# Checks that the String is empty, and returns the String unmodified.
|
4
|
+
# If the String fails this check, an exception is raised.
|
5
|
+
#
|
6
|
+
# @example
|
7
|
+
# "".assert_empty! # == ""
|
8
|
+
# "bad".assert_empty! # raises exception
|
9
|
+
#
|
10
|
+
# @param name [String, Symbol]
|
11
|
+
# optional name to include in the error message
|
12
|
+
# @return [self]
|
13
|
+
# @raise [MiniSanity::Error]
|
14
|
+
# if the String is not empty
|
15
|
+
def assert_empty!(name = nil)
|
16
|
+
if !self.empty?
|
17
|
+
raise MiniSanity::Error.new(name,
|
18
|
+
"empty #{self.class}",
|
19
|
+
self.inspect)
|
20
|
+
end
|
21
|
+
self
|
22
|
+
end
|
23
|
+
|
3
24
|
# Checks that the String is not empty, and returns the String
|
4
25
|
# unmodified. If the String fails this check, an exception is raised.
|
5
26
|
#
|
6
27
|
# @example
|
7
|
-
# "
|
8
|
-
# "".refute_empty!
|
28
|
+
# "result".refute_empty! # == "result"
|
29
|
+
# "".refute_empty! # raises exception
|
9
30
|
#
|
10
31
|
# @param name [String, Symbol]
|
11
32
|
# optional name to include in the error message
|
@@ -14,7 +35,59 @@ class String
|
|
14
35
|
# if the String is empty
|
15
36
|
def refute_empty!(name = nil)
|
16
37
|
if self.empty?
|
17
|
-
raise MiniSanity::Error.new(
|
38
|
+
raise MiniSanity::Error.new(name,
|
39
|
+
"non-empty #{self.class}",
|
40
|
+
self.inspect)
|
41
|
+
end
|
42
|
+
self
|
43
|
+
end
|
44
|
+
|
45
|
+
# Checks that the String matches a given length, and returns the
|
46
|
+
# String unmodified. If the String fails this check, an exception is
|
47
|
+
# raised.
|
48
|
+
#
|
49
|
+
# @example
|
50
|
+
# "password".assert_length!(8) # == "password"
|
51
|
+
# "long password".assert_length!(8..64) # == "long password"
|
52
|
+
# "pass".assert_length!(8..64) # == raises exception
|
53
|
+
#
|
54
|
+
# @param length [Integer, Range<Integer>]
|
55
|
+
# length to match
|
56
|
+
# @param name [String, Symbol]
|
57
|
+
# optional name to include in the error message
|
58
|
+
# @return [self]
|
59
|
+
# @raise [MiniSanity::Error]
|
60
|
+
# if the String length does not match +length+
|
61
|
+
def assert_length!(length, name = nil)
|
62
|
+
if !(length === self.length)
|
63
|
+
raise MiniSanity::Error.new(name,
|
64
|
+
"#{self.class} having #{length} characters",
|
65
|
+
self.inspect)
|
66
|
+
end
|
67
|
+
self
|
68
|
+
end
|
69
|
+
|
70
|
+
# Checks that the String does not match a given length, and returns
|
71
|
+
# the String unmodified. If the String fails this check, an exception
|
72
|
+
# is raised.
|
73
|
+
#
|
74
|
+
# @example
|
75
|
+
# "password".refute_length!(0) # == "password"
|
76
|
+
# "long password".refute_length!(0...8) # == "long password"
|
77
|
+
# "pass".refute_length!(0...8) # == raises exception
|
78
|
+
#
|
79
|
+
# @param length [Integer, Range<Integer>]
|
80
|
+
# length to not match
|
81
|
+
# @param name [String, Symbol]
|
82
|
+
# optional name to include in the error message
|
83
|
+
# @return [self]
|
84
|
+
# @raise [MiniSanity::Error]
|
85
|
+
# if the String length matches +length+
|
86
|
+
def refute_length!(length, name = nil)
|
87
|
+
if length === self.length
|
88
|
+
raise MiniSanity::Error.new(name,
|
89
|
+
"#{self.class} not having #{length} characters",
|
90
|
+
self.inspect)
|
18
91
|
end
|
19
92
|
self
|
20
93
|
end
|
@@ -24,8 +97,8 @@ class String
|
|
24
97
|
# exception is raised.
|
25
98
|
#
|
26
99
|
# @example
|
27
|
-
# "
|
28
|
-
# "
|
100
|
+
# "good result".assert_match!(/^good/) # == "good result"
|
101
|
+
# "bad result".assert_match!(/^good/) # raises exception
|
29
102
|
#
|
30
103
|
# @param regexp [Regexp]
|
31
104
|
# regular expression to check
|
@@ -35,9 +108,10 @@ class String
|
|
35
108
|
# @raise [MiniSanity::Error]
|
36
109
|
# if the String does not match +regexp+
|
37
110
|
def assert_match!(regexp, name = nil)
|
38
|
-
|
39
|
-
|
40
|
-
|
111
|
+
if regexp !~ self
|
112
|
+
raise MiniSanity::Error.new(name,
|
113
|
+
"#{self.class} matching #{regexp.inspect}",
|
114
|
+
self.inspect)
|
41
115
|
end
|
42
116
|
self
|
43
117
|
end
|
@@ -47,8 +121,8 @@ class String
|
|
47
121
|
# an exception is raised.
|
48
122
|
#
|
49
123
|
# @example
|
50
|
-
# "
|
51
|
-
# "
|
124
|
+
# "good result".refute_match!(/^bad/) # == "good result"
|
125
|
+
# "bad result".refute_match!(/^bad/) # raises exception
|
52
126
|
#
|
53
127
|
# @param regexp [Regexp]
|
54
128
|
# regular expression to check
|
@@ -59,8 +133,9 @@ class String
|
|
59
133
|
# if the String matches +regexp+
|
60
134
|
def refute_match!(regexp, name = nil)
|
61
135
|
if regexp =~ self
|
62
|
-
|
63
|
-
|
136
|
+
raise MiniSanity::Error.new(name,
|
137
|
+
"#{self.class} not matching #{regexp.inspect}",
|
138
|
+
self.inspect)
|
64
139
|
end
|
65
140
|
self
|
66
141
|
end
|
@@ -0,0 +1,31 @@
|
|
1
|
+
module Enumerable
|
2
|
+
|
3
|
+
# Like {https://ruby-doc.org/core/Enumerable.html#method-i-first
|
4
|
+
# +Enumerable#first+}, but raises an exception if the Enumerable does
|
5
|
+
# not contain the requested number of elements.
|
6
|
+
#
|
7
|
+
# @example
|
8
|
+
# [7, 8, 9].first # == 7
|
9
|
+
# [7, 8, 9].first(1) # == [7]
|
10
|
+
# [7, 8, 9].first(2) # == [7, 8]
|
11
|
+
# [7, 8, 9].first(4) # raises exception
|
12
|
+
# [].first # raises exception
|
13
|
+
#
|
14
|
+
# @param n [Integer]
|
15
|
+
# requested number of elements
|
16
|
+
# @return [Object, Array]
|
17
|
+
# @raise [MiniSanity::Error]
|
18
|
+
# if the Enumerable does not contain the requested number of elements
|
19
|
+
def first!(n = nil)
|
20
|
+
result = n.nil? ? self.first : self.first(n)
|
21
|
+
|
22
|
+
if (result.nil? && !self.any?{ true }) || (!n.nil? && result.length < n)
|
23
|
+
raise MiniSanity::Error.new(nil,
|
24
|
+
"Enumerable having at least #{n || 1} elements",
|
25
|
+
self.inspect)
|
26
|
+
end
|
27
|
+
|
28
|
+
result
|
29
|
+
end
|
30
|
+
|
31
|
+
end
|
@@ -0,0 +1,27 @@
|
|
1
|
+
class Regexp
|
2
|
+
|
3
|
+
# Like {https://ruby-doc.org/core/Regexp.html#method-i-match
|
4
|
+
# +Regexp#match+}, but raises an exception if the match fails.
|
5
|
+
#
|
6
|
+
# @example
|
7
|
+
# /^([^@]+)@(.+)$/.match!("user@example.com") # === MatchData
|
8
|
+
# /^([^@]+)@(.+)$/.match!("@user") # raises exception
|
9
|
+
#
|
10
|
+
# @param str [String]
|
11
|
+
# string to search
|
12
|
+
# @param pos [Integer]
|
13
|
+
# position in +str+ to begin the search
|
14
|
+
# @return [MatchData]
|
15
|
+
# @raise [MiniSanity::Error]
|
16
|
+
# if the Regexp does not match +str+
|
17
|
+
def match!(str, pos = 0)
|
18
|
+
result = self.match(str, pos)
|
19
|
+
if result.nil?
|
20
|
+
raise MiniSanity::Error.new(nil,
|
21
|
+
"String matching #{self.inspect}#{" from position #{pos}" if pos != 0}",
|
22
|
+
str.inspect)
|
23
|
+
end
|
24
|
+
result
|
25
|
+
end
|
26
|
+
|
27
|
+
end
|
@@ -0,0 +1,77 @@
|
|
1
|
+
class String
|
2
|
+
|
3
|
+
# Like {https://ruby-doc.org/core/String.html#method-i-match
|
4
|
+
# +String#match+}, but raises an exception if the match fails.
|
5
|
+
#
|
6
|
+
# @example
|
7
|
+
# "user@example.com".match!(/^([^@]+)@(.+)$/) # === MatchData
|
8
|
+
# "@user".match!(/^([^@]+)@(.+)$/) # raises exception
|
9
|
+
#
|
10
|
+
# @param pattern [Regexp]
|
11
|
+
# pattern to search for
|
12
|
+
# @param pos [Integer]
|
13
|
+
# position in the String to begin the search
|
14
|
+
# @return [MatchData]
|
15
|
+
# @raise [MiniSanity::Error]
|
16
|
+
# if +pattern+ does not match the String
|
17
|
+
def match!(pattern, pos = 0)
|
18
|
+
result = self.match(pattern, pos)
|
19
|
+
if result.nil?
|
20
|
+
raise MiniSanity::Error.new(nil,
|
21
|
+
"String matching #{pattern.inspect}#{" from position #{pos}" if pos != 0}",
|
22
|
+
self.inspect)
|
23
|
+
end
|
24
|
+
result
|
25
|
+
end
|
26
|
+
|
27
|
+
# Like {https://ruby-doc.org/core/String.html#method-i-sub-21
|
28
|
+
# +String#sub!+}, but raises an exception if no substitution was
|
29
|
+
# performed.
|
30
|
+
#
|
31
|
+
# @example
|
32
|
+
# "author: YOUR_NAME".change!(/\bYOUR_NAME\b/, "Me") # == "author: Me"
|
33
|
+
# "author: TODO".change!(/\bYOUR_NAME\b/, "Me") # raises exception
|
34
|
+
#
|
35
|
+
# @param pattern [Regexp, String]
|
36
|
+
# pattern to search for
|
37
|
+
# @param replacement [String, Hash, &block]
|
38
|
+
# substitution value (see +String#sub!+ documentation for full details)
|
39
|
+
# @return [String]
|
40
|
+
# @raise [MiniSanity::Error]
|
41
|
+
# if no substitution was performed
|
42
|
+
def change!(pattern, replacement = nil, &replacement_block)
|
43
|
+
result = if replacement
|
44
|
+
self.sub!(pattern, replacement)
|
45
|
+
else
|
46
|
+
self.sub!(pattern, &replacement_block)
|
47
|
+
end
|
48
|
+
|
49
|
+
if !result
|
50
|
+
raise MiniSanity::Error.new(nil,
|
51
|
+
"String matching #{pattern.inspect}",
|
52
|
+
self.inspect)
|
53
|
+
end
|
54
|
+
|
55
|
+
result
|
56
|
+
end
|
57
|
+
|
58
|
+
# Like {https://ruby-doc.org/core/String.html#method-i-sub
|
59
|
+
# +String#sub+}, but raises an exception if no substitution was
|
60
|
+
# performed.
|
61
|
+
#
|
62
|
+
# @example
|
63
|
+
# "author: YOUR_NAME".change(/\bYOUR_NAME\b/, "Me") # == "author: Me"
|
64
|
+
# "author: TODO".change(/\bYOUR_NAME\b/, "Me") # raises exception
|
65
|
+
#
|
66
|
+
# @param pattern [Regexp, String]
|
67
|
+
# pattern to search for
|
68
|
+
# @param replacement [String, Hash, &block]
|
69
|
+
# substitution value (see +String#sub+ documentation for full details)
|
70
|
+
# @return [String]
|
71
|
+
# @raise [MiniSanity::Error]
|
72
|
+
# if no substitution was performed
|
73
|
+
def change(pattern, replacement = nil, &replacement_block)
|
74
|
+
self.dup.change!(pattern, replacement, &replacement_block)
|
75
|
+
end
|
76
|
+
|
77
|
+
end
|
data/lib/mini_sanity/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: mini_sanity
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.
|
4
|
+
version: 1.1.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Jonathan Hefner
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2018-04-11 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -75,16 +75,22 @@ extra_rdoc_files: []
|
|
75
75
|
files:
|
76
76
|
- ".gitignore"
|
77
77
|
- ".travis.yml"
|
78
|
+
- CHANGELOG.md
|
78
79
|
- Gemfile
|
79
80
|
- LICENSE.txt
|
80
81
|
- README.md
|
81
82
|
- Rakefile
|
82
83
|
- lib/mini_sanity.rb
|
84
|
+
- lib/mini_sanity/array.rb
|
83
85
|
- lib/mini_sanity/enumerable.rb
|
84
86
|
- lib/mini_sanity/error.rb
|
85
87
|
- lib/mini_sanity/object.rb
|
86
88
|
- lib/mini_sanity/pathname.rb
|
87
89
|
- lib/mini_sanity/string.rb
|
90
|
+
- lib/mini_sanity/util.rb
|
91
|
+
- lib/mini_sanity/util/enumerable.rb
|
92
|
+
- lib/mini_sanity/util/regexp.rb
|
93
|
+
- lib/mini_sanity/util/string.rb
|
88
94
|
- lib/mini_sanity/version.rb
|
89
95
|
- mini_sanity.gemspec
|
90
96
|
homepage: https://github.com/jonathanhefner/mini_sanity
|
@@ -107,7 +113,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
107
113
|
version: '0'
|
108
114
|
requirements: []
|
109
115
|
rubyforge_project:
|
110
|
-
rubygems_version: 2.
|
116
|
+
rubygems_version: 2.6.13
|
111
117
|
signing_key:
|
112
118
|
specification_version: 4
|
113
119
|
summary: In-line sanity checks
|