mini_sanity 1.1.0 → 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
- SHA1:
3
- metadata.gz: ba5fd068770843f3044c6dade58282429e1330e5
4
- data.tar.gz: 1aa0bfd6c7f88f9a0e1d992cd18289c5a9328ac1
2
+ SHA256:
3
+ metadata.gz: 7c8c35bb9700789272562d521aac498397bbc97c889147386fd9381787ea59f0
4
+ data.tar.gz: 8be2caee26ff3dd317f5cd7efe81c2c2628fcb7870f14d0b7e8fb4295a2b32fd
5
5
  SHA512:
6
- metadata.gz: 1dfe7f149c334cd7ea7eb2330ddf834b72a17bb3009cdd45f42dd8e1347278084a65c835a1d7d438e881a64d42750ab8fda3eefd0fb498a919e76faa38a59bd3
7
- data.tar.gz: ea9642cd25487cf2f54d990843f79ba98cece1b560811ea791644e2c010707d910fb5def8800a9518bec04ef274b9db7bf9884a1612549888ee6dfe5102f7260
6
+ metadata.gz: d61148344efa1863fdf331cc9a2e42deec1e92e5d40d596b566592b3accc826f6042eeaa440340acd7e456e0ccffcef5c0fc5cc13cbf2e573cf9695d1befeb8e
7
+ data.tar.gz: bbf8dbfbb7c41a1cdd0084ab81a938e85a99d3271716d6fb2d67593a503ed026bc2439c3d489097c8fd0190c6741eed8c2ba56d197d2883e20be06904e04f728
@@ -1,5 +1,5 @@
1
- sudo: false
2
1
  language: ruby
2
+
3
3
  rvm:
4
- - 2.2.5
5
- before_install: gem install bundler -v 1.15.1
4
+ - 2.6
5
+ - 2.7
@@ -1,30 +1,66 @@
1
- ## 1.1.0
1
+ ## 2.0.0
2
+
3
+ * [BREAKING] Drop support for Ruby < 2.6
4
+ * Add `Object#assert!`
5
+ * Add `Object#refute!`
6
+ * [BREAKING] Remove methods obsoleted by `Object#assert!` and `#refute!`
7
+ * `Object#assert_equal!` => `assert!(expected *OR* Set[expected])`
8
+ * `Object#assert_in!` => `assert!(permitted.to_set)`
9
+ * `Object#assert_instance_of!` => `assert!(Set[klass], &:class)`
10
+ * `Object#assert_kind_of!` => `assert!(klass)`
11
+ * `Object#assert_nil!` => `assert!(nil)`
12
+ * `Object#refute_equal!` => `refute!(forbidden *OR* Set[forbidden])`
13
+ * `Object#refute_in!` => `refute!(prohibited.to_set)`
14
+ * `Object#refute_nil!` => `refute!(nil)`
15
+ * `Array#assert_length!` => `assert!(permitted_length, &:length)`
16
+ * `Array#refute_length!` => `refute!(prohibited_length, &:length)`
17
+ * `Enumerable#assert_empty!` => `assert!(&:empty?)`
18
+ * `Enumerable#refute_empty!` => `refute!(&:empty?)`
19
+ * `String#assert_empty!` => `assert!(&:empty?)`
20
+ * `String#assert_length!` => `assert!(permitted_length, &:length)`
21
+ * `String#assert_match!` => `assert!(pattern)`
22
+ * `String#refute_empty!` => `refute!(&:empty?)`
23
+ * `String#refute_length!` => `refute!(prohibited_length, &:length)`
24
+ * `String#refute_match!` => `refute!(pattern)`
25
+ * `Pathname#assert_dir!` => `assert!(&:directory?)`
26
+ * `Pathname#assert_exist!` => `assert!(&:exist?)`
27
+ * `Pathname#assert_file!` => `assert!(&:file?)`
28
+ * `Pathname#refute_dir!` => `refute!(&:directory?)`
29
+ * `Pathname#refute_exist!` => `refute!(&:exist?)`
30
+ * `Pathname#refute_file!` => `refute!(&:file?)`
31
+ * [BREAKING] Remove `Object#assert_respond_to!`
32
+ * [BREAKING] Remove `Enumerable#first!`
33
+ * Replacement for most cases: `assert!(n.., &:size).first(n)`
34
+ * [BREAKING] `require "mini_sanity"` now loads all pieces of the API.
35
+ However, individual pieces of the API can be loaded a la carte via
36
+ e.g. `require "mini_sanity/assert"`.
37
+ * Add `Enumerator#result!`
38
+ * Add `Enumerator#results!`
2
39
 
3
- * Standardized exception error messages
4
40
 
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!
41
+ ## 1.1.0
21
42
 
22
- * Added utility methods:
23
- * Enumerable#first!
24
- * Regexp#match!
25
- * String#change
26
- * String#change!
27
- * String#match!
43
+ * Standardize error messages
44
+ * Add `Array#assert_length!`
45
+ * Add `Array#refute_length!`
46
+ * Add `Enumerable#assert_empty!`
47
+ * Add `Object#assert_equal!`
48
+ * Add `Object#assert_in!`
49
+ * Add `Object#assert_nil!`
50
+ * Add `Object#refute_equal!`
51
+ * Add `Object#refute_in!`
52
+ * Add `Pathname#assert_dir!`
53
+ * Add `Pathname#assert_file!`
54
+ * Add `Pathname#refute_dir!`
55
+ * Add `Pathname#refute_file!`
56
+ * Add `String#assert_empty!`
57
+ * Add `String#assert_length!`
58
+ * Add `String#refute_length!`
59
+ * Add `Enumerable#first!` (loaded via `require "mini_sanity/util"`)
60
+ * Add `Regexp#match!` (loaded via `require "mini_sanity/util"`)
61
+ * Add `String#change` (loaded via `require "mini_sanity/util"`)
62
+ * Add `String#change!` (loaded via `require "mini_sanity/util"`)
63
+ * Add `String#match!` (loaded via `require "mini_sanity/util"`)
28
64
 
29
65
 
30
66
  ## 1.0.0
data/Gemfile CHANGED
@@ -2,3 +2,6 @@ source "https://rubygems.org"
2
2
 
3
3
  # Specify your gem's dependencies in mini_sanity.gemspec
4
4
  gemspec
5
+
6
+ gem "rake", "~> 12.0"
7
+ gem "minitest", "~> 5.0"
data/README.md CHANGED
@@ -1,10 +1,10 @@
1
- # mini_sanity
1
+ # mini_sanity [![Build Status](https://travis-ci.org/jonathanhefner/mini_sanity.svg?branch=master)](https://travis-ci.org/jonathanhefner/mini_sanity)
2
2
 
3
3
  In-line [sanity checks], written as extensions to core Ruby objects.
4
4
  See API listing below, or browse the [full documentation].
5
5
 
6
6
  [sanity checks]: https://en.wikipedia.org/wiki/Sanity_check
7
- [full documentation]: http://www.rubydoc.info/gems/mini_sanity/
7
+ [full documentation]: https://www.rubydoc.info/gems/mini_sanity/
8
8
 
9
9
 
10
10
  ## Example
@@ -13,91 +13,54 @@ See API listing below, or browse the [full documentation].
13
13
  require "json"
14
14
  require "pathname"
15
15
 
16
- path = Pathname.new("hosted_files.json").assert_exist!
16
+ path = Pathname.new("hosted_files.json").assert!(&:exist?)
17
17
 
18
- hosted_files = JSON.parse(path.read).assert_instance_of!(Array)
18
+ hosted_files = JSON.parse(path.read).assert!(Array)
19
19
 
20
20
  urls = hosted_files.flat_map do |file_info|
21
- file_info.fetch("mirror_urls").refute_empty!
21
+ file_info.fetch("mirror_urls").refute!(&:empty?)
22
22
  end
23
23
 
24
24
  domains = urls.map do |url|
25
- url.assert_match!(%r"^https?://").split("/")[2]
25
+ url.assert!(%r"^https?://").split("/")[2]
26
26
  end.uniq
27
27
  ```
28
28
 
29
29
 
30
30
  ## API
31
31
 
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)
35
- - [#assert_instance_of!](http://www.rubydoc.info/gems/mini_sanity/Object:assert_instance_of%21)
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)
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)
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)
45
- - [Enumerable](http://www.rubydoc.info/gems/mini_sanity/Enumerable)
46
- - [#assert_empty!](http://www.rubydoc.info/gems/mini_sanity/Enumerable:assert_empty%21)
47
- - [#refute_empty!](http://www.rubydoc.info/gems/mini_sanity/Enumerable:refute_empty%21)
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)
51
- - [#assert_match!](http://www.rubydoc.info/gems/mini_sanity/String:assert_match%21)
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)
54
- - [#refute_match!](http://www.rubydoc.info/gems/mini_sanity/String:refute_match%21)
55
- - [Pathname](http://www.rubydoc.info/gems/mini_sanity/Pathname)
56
- - [#assert_dir!](http://www.rubydoc.info/gems/mini_sanity/Pathname:assert_dir%21)
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)
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)
32
+ - `"mini_sanity/assert"`
33
+ - [Object#assert!](https://www.rubydoc.info/gems/mini_sanity/Object:assert%21)
34
+ - [Object#refute!](https://www.rubydoc.info/gems/mini_sanity/Object:refute%21)
35
+ - `"mini_sanity/change"`
36
+ - [String#change](https://www.rubydoc.info/gems/mini_sanity/String:change)
37
+ - [String#change!](https://www.rubydoc.info/gems/mini_sanity/String:change%21)
38
+ - `"mini_sanity/match"`
39
+ - [Regexp#match!](https://www.rubydoc.info/gems/mini_sanity/Regexp:match%21)
40
+ - [String#match!](https://www.rubydoc.info/gems/mini_sanity/String:match%21)
41
+ - `"mini_sanity/results"`
42
+ - [Enumerator#result!](https://www.rubydoc.info/gems/mini_sanity/Enumerator:result%21)
43
+ - [Enumerator#results!](https://www.rubydoc.info/gems/mini_sanity/Enumerator:results%21)
79
44
 
80
45
 
81
46
  ## Installation
82
47
 
83
- Install from [Ruby Gems](https://rubygems.org/gems/mini_sanity):
48
+ Install the [gem](https://rubygems.org/gems/mini_sanity):
84
49
 
85
50
  ```bash
86
51
  $ gem install mini_sanity
87
52
  ```
88
53
 
89
- Then require in your Ruby script:
54
+ Then require in your Ruby code:
90
55
 
91
56
  ```ruby
92
57
  require "mini_sanity"
93
- require "mini_sanity/util" # OPTIONAL
94
58
  ```
95
59
 
96
60
 
97
61
  ## Contributing
98
62
 
99
- Run `rake test` to run the tests. You can also run `rake irb` for an
100
- interactive prompt that pre-loads the project code.
63
+ Run `rake test` to run the tests.
101
64
 
102
65
 
103
66
  ## License
data/Rakefile CHANGED
@@ -1,19 +1,5 @@
1
1
  require "bundler/gem_tasks"
2
2
  require "rake/testtask"
3
- require "yard"
4
-
5
-
6
- YARD::Rake::YardocTask.new(:doc) do |t|
7
- end
8
-
9
- desc "Launch IRB with this gem pre-loaded"
10
- task :irb do
11
- require "mini_sanity"
12
- require "mini_sanity/util"
13
- require "irb"
14
- ARGV.clear
15
- IRB.start
16
- end
17
3
 
18
4
  Rake::TestTask.new(:test) do |t|
19
5
  t.libs << "test"
@@ -1,7 +1,5 @@
1
1
  require_relative "mini_sanity/version"
2
- require_relative "mini_sanity/error"
3
- require_relative "mini_sanity/array"
4
- require_relative "mini_sanity/enumerable"
5
- require_relative "mini_sanity/object"
6
- require_relative "mini_sanity/pathname"
7
- require_relative "mini_sanity/string"
2
+ require_relative "mini_sanity/assert"
3
+ require_relative "mini_sanity/change"
4
+ require_relative "mini_sanity/match"
5
+ require_relative "mini_sanity/results"
@@ -0,0 +1,163 @@
1
+ require_relative "error"
2
+
3
+
4
+ module MiniSanity
5
+ # Matches truthy values (i.e. not +false+ or +nil+).
6
+ TRUTHY = ->(x){ !!x }
7
+
8
+ def TRUTHY.inspect
9
+ "MiniSanity::TRUTHY"
10
+ end
11
+ end
12
+
13
+
14
+ class Object
15
+
16
+ # Checks that a given +pattern+ matches the Object (or a derivative
17
+ # value), and returns the Object. Raises an exception if the pattern
18
+ # does not match.
19
+ #
20
+ # If a block is given, the Object is yielded to the block, and the
21
+ # derivative value returned by the block is checked instead.
22
+ #
23
+ # @example Match truthy
24
+ # "foo".assert! # == "foo"
25
+ # nil.assert! # raises exception
26
+ #
27
+ # @example Match expected value
28
+ # "foo".assert!("foo") # == "foo"
29
+ # "bar".assert!("foo") # raises exception
30
+ #
31
+ # @example Match Set of permitted values
32
+ # "foo".assert!(Set["foo", "bar"]) # == "foo"
33
+ # "bar".assert!(Set["foo", "bar"]) # == "bar"
34
+ # "baz".assert!(Set["foo", "bar"]) # raises exception
35
+ #
36
+ # @example Match Class
37
+ # 25.assert!(Integer) # == 25
38
+ # 2.5.assert!(Integer) # raises exception
39
+ #
40
+ # @example Match Regexp
41
+ # "foo".assert!(/^f/) # == "foo"
42
+ # "bar".assert!(/^f/) # raises exception
43
+ #
44
+ # @example Match Range
45
+ # 2.assert!(1..4) # == 2
46
+ # 5.assert!(1..4) # raises exception
47
+ #
48
+ # @example Match truthy derivative value
49
+ # [2, 5].assert!(&:any?) # == [2, 5]
50
+ # [nil].assert!(&:any?) # raises exception
51
+ #
52
+ # @example Match derivative value
53
+ # [2, 5].assert!(1.., &:length) # == [2, 5]
54
+ # [].assert!(1.., &:length) # raises exception
55
+ #
56
+ # @overload assert!(pattern = MiniSanity::TRUTHY, hint: nil)
57
+ # @param pattern [#===]
58
+ # @param hint [String]
59
+ # Hint to include in the error message
60
+ # @return [self]
61
+ # @raise [MiniSanity::Error]
62
+ # if +pattern+ does not match the Object
63
+ #
64
+ # @overload assert!(pattern = MiniSanity::TRUTHY, hint: nil, &block)
65
+ # @param pattern [#===]
66
+ # @param hint [String]
67
+ # Hint to include in the error message
68
+ # @yieldparam itself [self]
69
+ # @yieldreturn [Object]
70
+ # Derivative value
71
+ # @return [self]
72
+ # @raise [MiniSanity::Error]
73
+ # if +pattern+ does not match the value returned by +block+
74
+ def assert!(pattern = MiniSanity::TRUTHY, hint: nil, &block)
75
+ result = block ? block.call(self) : self
76
+
77
+ unless pattern === result
78
+ raise MiniSanity::Error.new("Assert failed", {
79
+ "Value" => self.inspect,
80
+ "Derived value (from #{MiniSanity::Error.describe_block(&block) || "block"})" =>
81
+ (result.inspect if block),
82
+ "Assert matches" => pattern.inspect,
83
+ "Hint" => hint,
84
+ })
85
+ end
86
+
87
+ self
88
+ end
89
+
90
+ # Checks that a given +pattern+ does not match the Object (or a
91
+ # derivative value), and returns the Object. Raises an exception if
92
+ # the pattern matches.
93
+ #
94
+ # If a block is given, the Object is yielded to the block, and the
95
+ # derivative value returned by the block is checked instead.
96
+ #
97
+ # @example Refute truthy
98
+ # false.refute! # == false
99
+ # "bad".refute! # raises exception
100
+ #
101
+ # @example Refute forbidden value
102
+ # "foo".refute!("bad") # == "foo"
103
+ # "bad".refute!("bad") # raises exception
104
+ #
105
+ # @example Refute Set of prohibited values
106
+ # "foo".refute!(Set["bad", "worse"]) # == "foo"
107
+ # "bad".refute!(Set["bad", "worse"]) # raises exception
108
+ #
109
+ # @example Refute Class
110
+ # 25.refute!(Float) # == 25
111
+ # 2.5.refute!(Float) # raises exception
112
+ #
113
+ # @example Refute Regexp
114
+ # "foo".refute!(/^ba/) # == "foo"
115
+ # "bad".refute!(/^ba/) # raises exception
116
+ #
117
+ # @example Refute Range
118
+ # 2.refute!(5..) # == 2
119
+ # 5.refute!(5..) # raises exception
120
+ #
121
+ # @example Refute truthy derivative value
122
+ # [2].refute!(&:empty?) # == [2]
123
+ # [].refute!(&:empty?) # raises exception
124
+ #
125
+ # @example Refute derivative value
126
+ # [2].refute!(1.., &:length) # == [2]
127
+ # [2, 5].refute!(1.., &:length) # raises exception
128
+ #
129
+ # @overload refute!(pattern = MiniSanity::TRUTHY, hint: nil)
130
+ # @param pattern [#===]
131
+ # @param hint [String]
132
+ # Hint to include in the error message
133
+ # @return [self]
134
+ # @raise [MiniSanity::Error]
135
+ # if +pattern+ matches the Object
136
+ #
137
+ # @overload refute!(pattern = MiniSanity::TRUTHY, hint: nil, &block)
138
+ # @param pattern [#===]
139
+ # @param hint [String]
140
+ # Hint to include in the error message
141
+ # @yieldparam itself [self]
142
+ # @yieldreturn [Object]
143
+ # Derivative value
144
+ # @return [self]
145
+ # @raise [MiniSanity::Error]
146
+ # if +pattern+ matches the value returned by +block+
147
+ def refute!(pattern = MiniSanity::TRUTHY, hint: nil, &block)
148
+ result = block ? block.call(self) : self
149
+
150
+ if pattern === result
151
+ raise MiniSanity::Error.new("Refute failed", {
152
+ "Value" => self.inspect,
153
+ "Derived value (from #{MiniSanity::Error.describe_block(&block) || "block"})" =>
154
+ (result.inspect if block),
155
+ "Refute matches" => pattern.inspect,
156
+ "Hint" => hint,
157
+ })
158
+ end
159
+
160
+ self
161
+ end
162
+
163
+ end
@@ -0,0 +1,107 @@
1
+ require_relative "error"
2
+
3
+
4
+ class String
5
+
6
+ # Like {https://docs.ruby-lang.org/en/master/String.html#method-i-sub-21
7
+ # +String#sub!+}, but raises an exception if no substitution is
8
+ # performed.
9
+ #
10
+ # @example
11
+ # info = "library: LIB_NAME\nlanguage: LIB_LANG\n"
12
+ # info.change!(/\bLIB_NAME\b/, "mini_sanity") # == "library: mini_sanity\nlanguage: LIB_LANG\n"
13
+ # info # == "library: mini_sanity\nlanguage: LIB_LANG\n"
14
+ # info.change!(/\bLIB_LANGUAGE\b/, "Ruby") # raises exception
15
+ #
16
+ # @overload change!(pattern, replacement)
17
+ # @param pattern [Regexp, String]
18
+ # Pattern to search for
19
+ # @param replacement [String]
20
+ # Replacement String (see +String#sub+ documentation for more
21
+ # information)
22
+ # @return [String]
23
+ # @raise [MiniSanity::Error]
24
+ # if no substitution was performed
25
+ #
26
+ # @overload change!(pattern, hash)
27
+ # @param pattern [Regexp, String]
28
+ # Pattern to search for
29
+ # @param hash [Hash]
30
+ # Substitution Hash (see +String#sub+ documentation for more
31
+ # information)
32
+ # @return [String]
33
+ # @raise [MiniSanity::Error]
34
+ # if no substitution was performed
35
+ #
36
+ # @overload change!(pattern, &block)
37
+ # @param pattern [Regexp, String]
38
+ # Pattern to search for
39
+ # @yieldparam match [String]
40
+ # Matched String
41
+ # @yieldreturn [String]
42
+ # Replacement String
43
+ # @return [String]
44
+ # @raise [MiniSanity::Error]
45
+ # if no substitution was performed
46
+ def change!(pattern, replacement = nil, &block)
47
+ result = if replacement
48
+ self.sub!(pattern, replacement)
49
+ else
50
+ self.sub!(pattern, &block)
51
+ end
52
+
53
+ if !result
54
+ raise MiniSanity::Error.new("String does not match pattern", {
55
+ "String" => self.inspect,
56
+ "Pattern" => pattern.inspect,
57
+ })
58
+ end
59
+
60
+ result
61
+ end
62
+
63
+ # Like {https://docs.ruby-lang.org/en/master/String.html#method-i-sub
64
+ # +String#sub+}, but raises an exception if no substitution is
65
+ # performed.
66
+ #
67
+ # @example
68
+ # info = "library: LIB_NAME\nlanguage: LIB_LANG\n"
69
+ # info.change(/\bLIB_NAME\b/, "mini_sanity") # == "library: mini_sanity\nlanguage: LIB_LANG\n"
70
+ # info # == "library: LIB_NAME\nlanguage: LIB_LANG\n"
71
+ # info.change(/\bLIB_LANGUAGE\b/, "Ruby") # raises exception
72
+ #
73
+ # @overload change(pattern, replacement)
74
+ # @param pattern [Regexp, String]
75
+ # Pattern to search for
76
+ # @param replacement [String]
77
+ # Replacement String (see +String#sub+ documentation for more
78
+ # information)
79
+ # @return [String]
80
+ # @raise [MiniSanity::Error]
81
+ # if no substitution was performed
82
+ #
83
+ # @overload change(pattern, hash)
84
+ # @param pattern [Regexp, String]
85
+ # Pattern to search for
86
+ # @param hash [Hash]
87
+ # Substitution Hash (see +String#sub+ documentation for more
88
+ # information)
89
+ # @return [String]
90
+ # @raise [MiniSanity::Error]
91
+ # if no substitution was performed
92
+ #
93
+ # @overload change(pattern, &block)
94
+ # @param pattern [Regexp, String]
95
+ # Pattern to search for
96
+ # @yieldparam match [String]
97
+ # Matched String
98
+ # @yieldreturn [String]
99
+ # Replacement String
100
+ # @return [String]
101
+ # @raise [MiniSanity::Error]
102
+ # if no substitution was performed
103
+ def change(pattern, replacement = nil, &block)
104
+ self.dup.change!(pattern, replacement, &block)
105
+ end
106
+
107
+ end