mug 1.1.0 → 1.2.4
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/lib/mug.rb +4 -1
- data/lib/mug/and-or.rb +5 -5
- data/lib/mug/array/delete_all.rb +2 -2
- data/lib/mug/bool.rb +4 -3
- data/lib/mug/clamp.rb +2 -4
- data/lib/mug/enumerable.rb +1 -0
- data/lib/mug/enumerable/chain.rb +51 -0
- data/lib/mug/enumerable/counts.rb +1 -1
- data/lib/mug/enumerable/hash-like.rb +1 -0
- data/lib/mug/hash/map.rb +14 -6
- data/lib/mug/hash/merge.rb +15 -16
- data/lib/mug/iterator.rb +2 -2
- data/lib/mug/matchdata/each.rb +5 -5
- data/lib/mug/matchdata/hash.rb +3 -1
- data/lib/mug/self.rb +3 -3
- data/lib/mug/top.rb +4 -4
- data/lib/mug/with.rb +3 -2
- data/test/2-6-test-clamp.rb +17 -0
- data/test/2-7-test-clamp.rb +17 -0
- data/test/test-alias.rb +21 -21
- data/test/test-apply.rb +7 -6
- data/test/test-array-samples.rb +37 -36
- data/test/test-bool.rb +20 -20
- data/test/test-clamp.rb +7 -0
- data/test/test-enumerable-chain.rb +80 -0
- data/test/test-enumerable-hash-like.rb +12 -11
- data/test/test-fragile-method-chain.rb +27 -17
- data/test/test-loop-with.rb +6 -6
- data/test/test-maybe.rb +27 -17
- data/test/test-negativity.rb +3 -3
- data/test/test-with.rb +37 -0
- metadata +39 -31
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 986518f2bdb9b2e66fa37baefbf2bb63a191dd6e97626e7626c5475cea9c674d
|
4
|
+
data.tar.gz: 0ed805639f4a57ba0a361dcd010d86ba240e31df4d0beef3209d782c8d663986
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: d03ef238645b74dff18bc5daa037403c14963406f6c2875b757543ba2acbeb219bdf70ea1fd54f228d10ceff3f21cb4325ece5f9b34dcef78cb261d01aa7b718
|
7
|
+
data.tar.gz: 5dee2f65ab4aa79e6b7d425cf5512cefb601d329884c9ae512dd450240a430ed78186c5c64d7ec7f8e59e589beb94fd877f4c2b865091655c072dae8dc4b334a
|
data/lib/mug.rb
CHANGED
@@ -11,7 +11,10 @@ require_relative 'mug/array/to_proc'
|
|
11
11
|
require_relative 'mug/bool'
|
12
12
|
require_relative 'mug/bittest'
|
13
13
|
require_relative 'mug/clamp'
|
14
|
-
require_relative 'mug/enumerable'
|
14
|
+
require_relative 'mug/enumerable/any-and-all'
|
15
|
+
require_relative 'mug/enumerable/chain'
|
16
|
+
require_relative 'mug/enumerable/counts'
|
17
|
+
require_relative 'mug/enumerable/hash-like'
|
15
18
|
require_relative 'mug/fragile-method-chain'
|
16
19
|
require_relative 'mug/hash/map'
|
17
20
|
require_relative 'mug/hash/merge'
|
data/lib/mug/and-or.rb
CHANGED
@@ -7,7 +7,7 @@ class Object
|
|
7
7
|
# If a block is given, +obj+ is yielded to it; if it returns truthy,
|
8
8
|
# +default+ is returned, otherwise +obj+ is returned.
|
9
9
|
#
|
10
|
-
def and default
|
10
|
+
def and default, &_block
|
11
11
|
if block_given?
|
12
12
|
yield(self) ? default : self
|
13
13
|
else
|
@@ -21,7 +21,7 @@ class Object
|
|
21
21
|
# If a block is given, +obj+ is yielded to it; if it returns truthy,
|
22
22
|
# +obj+ is returned, otherwise +default+ is returned.
|
23
23
|
#
|
24
|
-
def or default
|
24
|
+
def or default, &_block
|
25
25
|
if block_given?
|
26
26
|
yield(self) ? self : default
|
27
27
|
else
|
@@ -34,7 +34,7 @@ class Object
|
|
34
34
|
#
|
35
35
|
# Returns +obj+.
|
36
36
|
#
|
37
|
-
def and_then &
|
37
|
+
def and_then &_block
|
38
38
|
yield self if self
|
39
39
|
self
|
40
40
|
end
|
@@ -44,7 +44,7 @@ class Object
|
|
44
44
|
#
|
45
45
|
# Returns +obj+.
|
46
46
|
#
|
47
|
-
def or_then &
|
47
|
+
def or_then &_block
|
48
48
|
yield self unless self
|
49
49
|
self
|
50
50
|
end
|
@@ -52,7 +52,7 @@ class Object
|
|
52
52
|
end
|
53
53
|
|
54
54
|
=begin
|
55
|
-
Copyright (c)
|
55
|
+
Copyright (c) 2018, Matthew Kerwin <matthew@kerwin.net.au>
|
56
56
|
|
57
57
|
Permission to use, copy, modify, and/or distribute this software for any
|
58
58
|
purpose with or without fee is hereby granted, provided that the above
|
data/lib/mug/array/delete_all.rb
CHANGED
@@ -10,7 +10,7 @@ class Array
|
|
10
10
|
#
|
11
11
|
# See #delete_if, #reject!
|
12
12
|
#
|
13
|
-
def delete_all &
|
13
|
+
def delete_all &_block
|
14
14
|
return enum_for :delete_all unless block_given?
|
15
15
|
[].tap do |removed|
|
16
16
|
delete_if do |e|
|
@@ -25,7 +25,7 @@ class Array
|
|
25
25
|
end
|
26
26
|
|
27
27
|
=begin
|
28
|
-
Copyright (c)
|
28
|
+
Copyright (c) 2018, Matthew Kerwin <matthew@kerwin.net.au>
|
29
29
|
|
30
30
|
Permission to use, copy, modify, and/or distribute this software for any
|
31
31
|
purpose with or without fee is hereby granted, provided that the above
|
data/lib/mug/bool.rb
CHANGED
@@ -33,7 +33,7 @@ class Numeric
|
|
33
33
|
# Returns true if not zero.
|
34
34
|
#
|
35
35
|
def to_b
|
36
|
-
self
|
36
|
+
!self.zero?
|
37
37
|
end
|
38
38
|
end
|
39
39
|
|
@@ -93,9 +93,10 @@ class Enumerator
|
|
93
93
|
#
|
94
94
|
# Converts enum to a boolean.
|
95
95
|
# Returns true if there are any elements.
|
96
|
+
# An enumerator whose size cannot be calculated lazily is assumed to be true.
|
96
97
|
#
|
97
98
|
def to_b
|
98
|
-
size.to_b
|
99
|
+
(s = size).nil? || s.to_b
|
99
100
|
end
|
100
101
|
end
|
101
102
|
end
|
@@ -111,7 +112,7 @@ class Exception
|
|
111
112
|
end
|
112
113
|
|
113
114
|
=begin
|
114
|
-
Copyright (c)
|
115
|
+
Copyright (c) 2018, Matthew Kerwin <matthew@kerwin.net.au>
|
115
116
|
|
116
117
|
Permission to use, copy, modify, and/or distribute this software for any
|
117
118
|
purpose with or without fee is hereby granted, provided that the above
|
data/lib/mug/clamp.rb
CHANGED
@@ -33,9 +33,7 @@ class Range
|
|
33
33
|
|
34
34
|
b = last
|
35
35
|
if val >= b
|
36
|
-
if exclude_end?
|
37
|
-
raise ArgumentError, 'more than or equal to the exclusive range'
|
38
|
-
end
|
36
|
+
raise ArgumentError, 'greater than or equal to the exclusive range' if exclude_end?
|
39
37
|
return b
|
40
38
|
end
|
41
39
|
|
@@ -45,7 +43,7 @@ class Range
|
|
45
43
|
end
|
46
44
|
|
47
45
|
=begin
|
48
|
-
Copyright (c)
|
46
|
+
Copyright (c) 2018, Matthew Kerwin <matthew@kerwin.net.au>
|
49
47
|
|
50
48
|
Permission to use, copy, modify, and/or distribute this software for any
|
51
49
|
purpose with or without fee is hereby granted, provided that the above
|
data/lib/mug/enumerable.rb
CHANGED
@@ -0,0 +1,51 @@
|
|
1
|
+
|
2
|
+
module Enumerable
|
3
|
+
|
4
|
+
class <<self
|
5
|
+
#
|
6
|
+
# Invokes a block once for every element in a sequence of
|
7
|
+
# Enumerables.
|
8
|
+
#
|
9
|
+
def chain *enums
|
10
|
+
return enum_for(:chain, *enums) unless block_given?
|
11
|
+
enums.each do |enum|
|
12
|
+
enum.each {|*args| yield(*args) }
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
if RUBY_VERSION >= '2.6'
|
18
|
+
warn "warning: Enumerable\#chain defined since Ruby 2.6 is incompatible with this gem when used with args and a block"
|
19
|
+
undef chain
|
20
|
+
end
|
21
|
+
|
22
|
+
#
|
23
|
+
# Creates a chain of Enumerables following this one, and
|
24
|
+
# invokes a block once for each element of each Enumerable.
|
25
|
+
#
|
26
|
+
def chain *enums
|
27
|
+
return enum_for(:chain, *enums) unless block_given?
|
28
|
+
[self, *enums].each do |enum|
|
29
|
+
enum.each {|*args| yield(*args) }
|
30
|
+
end
|
31
|
+
nil
|
32
|
+
end
|
33
|
+
|
34
|
+
end
|
35
|
+
|
36
|
+
=begin
|
37
|
+
Copyright (c) 2018, Matthew Kerwin <matthew@kerwin.net.au>
|
38
|
+
|
39
|
+
Permission to use, copy, modify, and/or distribute this software for any
|
40
|
+
purpose with or without fee is hereby granted, provided that the above
|
41
|
+
copyright notice and this permission notice appear in all copies.
|
42
|
+
|
43
|
+
THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
|
44
|
+
WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
|
45
|
+
MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
|
46
|
+
ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
|
47
|
+
WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
|
48
|
+
ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
|
49
|
+
OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
50
|
+
=end
|
51
|
+
|
data/lib/mug/hash/map.rb
CHANGED
@@ -7,7 +7,8 @@ class Hash
|
|
7
7
|
# {'a'=>1, 'b'=>2}.map_values { |v| v*2 } #=> {'a'=>2, 'b'=>4}
|
8
8
|
# {'a'=>1, 'b'=>2}.map_values { "cat" } #=> {'a'=>"cat", 'b'=>"cat"}
|
9
9
|
#
|
10
|
-
def map_values &
|
10
|
+
def map_values &_block # :yields: value
|
11
|
+
return enum_for(:map_values) unless block_given?
|
11
12
|
hsh = {}
|
12
13
|
each do |k, v|
|
13
14
|
hsh[k] = yield v
|
@@ -21,6 +22,7 @@ class Hash
|
|
21
22
|
# See: #map_values
|
22
23
|
#
|
23
24
|
def map_values! &block # :yields: value
|
25
|
+
return enum_for(:map_values!) unless block_given?
|
24
26
|
replace map_values(&block)
|
25
27
|
end
|
26
28
|
|
@@ -34,7 +36,8 @@ class Hash
|
|
34
36
|
# {'a'=>1, 'b'=>2}.map_keys { |k| k*2 } #=> {'aa'=>1, 'bb'=>2}
|
35
37
|
# {'a'=>1, 'b'=>2}.map_keys { "cat" } #=> {'cat'=>2}
|
36
38
|
#
|
37
|
-
def map_keys &
|
39
|
+
def map_keys &_block # :yields: key
|
40
|
+
return enum_for(:map_keys) unless block_given?
|
38
41
|
hsh = {}
|
39
42
|
each do |k, v|
|
40
43
|
hsh[ yield k ] = v
|
@@ -50,6 +53,7 @@ class Hash
|
|
50
53
|
# See: #map_keys
|
51
54
|
#
|
52
55
|
def map_keys! &block # :yields: key
|
56
|
+
return enum_for(:map_keys!) unless block_given?
|
53
57
|
replace map_keys(&block)
|
54
58
|
end
|
55
59
|
|
@@ -63,7 +67,8 @@ class Hash
|
|
63
67
|
# {'a'=>1, 'b'=>2}.map_pairs { |k,v| [k*2, v+1] } #=> {'aa'=>2, 'bb'=>3}
|
64
68
|
# {'a'=>1, 'b'=>2}.map_pairs { ["cat","dog"] } #=> {'cat'=>'dog'}
|
65
69
|
#
|
66
|
-
def map_pairs &
|
70
|
+
def map_pairs &_block # :yields: key, value
|
71
|
+
return enum_for(:map_pairs) unless block_given?
|
67
72
|
hsh = {}
|
68
73
|
each do |k, v|
|
69
74
|
a, b = yield k, v
|
@@ -73,17 +78,20 @@ class Hash
|
|
73
78
|
end
|
74
79
|
|
75
80
|
#
|
76
|
-
# Replaces the values in +hsh+ by running them each through +block+.
|
81
|
+
# Replaces the keys and values in +hsh+ by running them each through +block+.
|
77
82
|
#
|
78
|
-
#
|
83
|
+
# If +block+ returns duplicate keys, they will be overwritten.
|
84
|
+
#
|
85
|
+
# See: #map_pairs
|
79
86
|
#
|
80
87
|
def map_pairs! &block # :yields: key, value
|
88
|
+
return enum_for(:map_pairs!) unless block_given?
|
81
89
|
replace map_pairs(&block)
|
82
90
|
end
|
83
91
|
end
|
84
92
|
|
85
93
|
=begin
|
86
|
-
Copyright (c)
|
94
|
+
Copyright (c) 2018, Matthew Kerwin <matthew@kerwin.net.au>
|
87
95
|
|
88
96
|
Permission to use, copy, modify, and/or distribute this software for any
|
89
97
|
purpose with or without fee is hereby granted, provided that the above
|
data/lib/mug/hash/merge.rb
CHANGED
@@ -1,19 +1,3 @@
|
|
1
|
-
=begin
|
2
|
-
Copyright (c) 2016, Matthew Kerwin <matthew@kerwin.net.au>
|
3
|
-
|
4
|
-
Permission to use, copy, modify, and/or distribute this software for any
|
5
|
-
purpose with or without fee is hereby granted, provided that the above
|
6
|
-
copyright notice and this permission notice appear in all copies.
|
7
|
-
|
8
|
-
THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
|
9
|
-
WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
|
10
|
-
MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
|
11
|
-
ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
|
12
|
-
WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
|
13
|
-
ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
|
14
|
-
OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
15
|
-
=end
|
16
|
-
|
17
1
|
|
18
2
|
class Hash
|
19
3
|
|
@@ -55,3 +39,18 @@ class Hash
|
|
55
39
|
|
56
40
|
end
|
57
41
|
|
42
|
+
=begin
|
43
|
+
Copyright (c) 2018, Matthew Kerwin <matthew@kerwin.net.au>
|
44
|
+
|
45
|
+
Permission to use, copy, modify, and/or distribute this software for any
|
46
|
+
purpose with or without fee is hereby granted, provided that the above
|
47
|
+
copyright notice and this permission notice appear in all copies.
|
48
|
+
|
49
|
+
THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
|
50
|
+
WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
|
51
|
+
MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
|
52
|
+
ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
|
53
|
+
WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
|
54
|
+
ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
|
55
|
+
OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
56
|
+
=end
|
data/lib/mug/iterator.rb
CHANGED
@@ -22,8 +22,8 @@ class Iterator < Enumerator
|
|
22
22
|
# In the second, deprecated, form, a generated Iterator sends the
|
23
23
|
# given method with any +args+ to the iterand.
|
24
24
|
#
|
25
|
-
# Use of this form is
|
26
|
-
#
|
25
|
+
# Use of this form is discouraged. Use Object#iter_for or
|
26
|
+
# Method#to_iter instead.
|
27
27
|
#
|
28
28
|
# @call-seq new(initial, *args) { |obj, *args| ... }
|
29
29
|
# @call-seq new(initial, method=:each, *args)
|
data/lib/mug/matchdata/each.rb
CHANGED
@@ -4,7 +4,7 @@ class MatchData
|
|
4
4
|
# Iterates over each capture group in the MatchData object,
|
5
5
|
# including +$&+ (the entire matched string), yielding the
|
6
6
|
# captured string.
|
7
|
-
def each &
|
7
|
+
def each &_b
|
8
8
|
return enum_for(:each) unless block_given?
|
9
9
|
to_a.each{|v| yield v }
|
10
10
|
end
|
@@ -15,7 +15,7 @@ class MatchData
|
|
15
15
|
# The capture positions are either all Strings or all Integers,
|
16
16
|
# depending on whether the original Regexp had named capture
|
17
17
|
# groups or not.
|
18
|
-
def each_capture &
|
18
|
+
def each_capture &_b
|
19
19
|
return enum_for(:each_capture) unless block_given?
|
20
20
|
if names.empty?
|
21
21
|
captures.each_with_index{|v,i| yield i+1, v }
|
@@ -26,7 +26,7 @@ class MatchData
|
|
26
26
|
|
27
27
|
# Iterates over each named capture group in the MatchData object,
|
28
28
|
# yielding the capture name and string.
|
29
|
-
def each_named_capture &
|
29
|
+
def each_named_capture &_b
|
30
30
|
return enum_for(:each_named_capture) unless block_given?
|
31
31
|
names.each{|n| yield n, self[n] }
|
32
32
|
end
|
@@ -39,7 +39,7 @@ class MatchData
|
|
39
39
|
#
|
40
40
|
# WARNING: if mixing named and positional captures, no positional
|
41
41
|
# captures will be available using this method!
|
42
|
-
def each_positional_capture include_names: false, &
|
42
|
+
def each_positional_capture include_names: false, &_b
|
43
43
|
return enum_for(:each_positional_capture, include_names: include_names) unless block_given?
|
44
44
|
return unless names.empty? || include_names
|
45
45
|
captures.each_with_index{|v,i| yield i+1, v }
|
@@ -48,7 +48,7 @@ class MatchData
|
|
48
48
|
end
|
49
49
|
|
50
50
|
=begin
|
51
|
-
Copyright (c)
|
51
|
+
Copyright (c) 2018, Matthew Kerwin <matthew@kerwin.net.au>
|
52
52
|
|
53
53
|
Permission to use, copy, modify, and/or distribute this software for any
|
54
54
|
purpose with or without fee is hereby granted, provided that the above
|
data/lib/mug/matchdata/hash.rb
CHANGED
@@ -14,10 +14,12 @@ class MatchData
|
|
14
14
|
end
|
15
15
|
end
|
16
16
|
|
17
|
+
if RUBY_VERSION < '2.4'
|
17
18
|
# Returns a Hash object of capture name => captured string.
|
18
19
|
def named_captures
|
19
20
|
Hash[ names.map{|n| [n, self[n]] } ]
|
20
21
|
end
|
22
|
+
end
|
21
23
|
|
22
24
|
# Returns a Hash object of capture position => captured string.
|
23
25
|
#
|
@@ -34,7 +36,7 @@ class MatchData
|
|
34
36
|
end
|
35
37
|
|
36
38
|
=begin
|
37
|
-
Copyright (c)
|
39
|
+
Copyright (c) 2018, Matthew Kerwin <matthew@kerwin.net.au>
|
38
40
|
|
39
41
|
Permission to use, copy, modify, and/or distribute this software for any
|
40
42
|
purpose with or without fee is hereby granted, provided that the above
|
data/lib/mug/self.rb
CHANGED
@@ -6,7 +6,7 @@ class Object
|
|
6
6
|
# If a block is given, this object is yielded to it, and the result
|
7
7
|
# is returned.
|
8
8
|
#
|
9
|
-
def self(&
|
9
|
+
def self(&_block)
|
10
10
|
if block_given?
|
11
11
|
yield self
|
12
12
|
else
|
@@ -26,7 +26,7 @@ class Object
|
|
26
26
|
# to a block. If no block is given, returns an
|
27
27
|
# Enumerator.
|
28
28
|
#
|
29
|
-
def revapply(*args, &
|
29
|
+
def revapply(*args, &_block)
|
30
30
|
if block_given?
|
31
31
|
yield self, *args
|
32
32
|
else
|
@@ -37,7 +37,7 @@ class Object
|
|
37
37
|
end
|
38
38
|
|
39
39
|
=begin
|
40
|
-
Copyright (c)
|
40
|
+
Copyright (c) 2018, Matthew Kerwin <matthew@kerwin.net.au>
|
41
41
|
|
42
42
|
Permission to use, copy, modify, and/or distribute this software for any
|
43
43
|
purpose with or without fee is hereby granted, provided that the above
|
data/lib/mug/top.rb
CHANGED
@@ -8,7 +8,7 @@ module Enumerable
|
|
8
8
|
#
|
9
9
|
# @see Enumerable#sort
|
10
10
|
#
|
11
|
-
def top n=1, &
|
11
|
+
def top n=1, &_blk
|
12
12
|
if block_given?
|
13
13
|
sort{|x,y| yield y, x }[0...n]
|
14
14
|
else
|
@@ -32,7 +32,7 @@ module Enumerable
|
|
32
32
|
#
|
33
33
|
# @see Enumerable#sort_by
|
34
34
|
#
|
35
|
-
def top_by n=1, &
|
35
|
+
def top_by n=1, &_blk
|
36
36
|
return enum_for(:top_by, n) unless block_given?
|
37
37
|
chain = {}
|
38
38
|
each do |x|
|
@@ -75,7 +75,7 @@ module Enumerable
|
|
75
75
|
#
|
76
76
|
# @see Enumerable#sort_by
|
77
77
|
#
|
78
|
-
def bottom_by n=1, &
|
78
|
+
def bottom_by n=1, &_blk
|
79
79
|
return enum_for(:bottom_by, n) unless block_given?
|
80
80
|
chain = {}
|
81
81
|
each do |x|
|
@@ -111,7 +111,7 @@ class Array
|
|
111
111
|
end
|
112
112
|
|
113
113
|
=begin
|
114
|
-
Copyright (c)
|
114
|
+
Copyright (c) 2018, Matthew Kerwin <matthew@kerwin.net.au>
|
115
115
|
|
116
116
|
Permission to use, copy, modify, and/or distribute this software for any
|
117
117
|
purpose with or without fee is hereby granted, provided that the above
|
data/lib/mug/with.rb
CHANGED
@@ -5,12 +5,13 @@ module Kernel
|
|
5
5
|
#
|
6
6
|
def with *args
|
7
7
|
return enum_for(:with, *args) unless block_given?
|
8
|
-
yield
|
8
|
+
yield(*args)
|
9
9
|
end
|
10
|
+
private :with
|
10
11
|
end
|
11
12
|
|
12
13
|
=begin
|
13
|
-
Copyright (c)
|
14
|
+
Copyright (c) 2019, Matthew Kerwin <matthew@kerwin.net.au>
|
14
15
|
|
15
16
|
Permission to use, copy, modify, and/or distribute this software for any
|
16
17
|
purpose with or without fee is hereby granted, provided that the above
|
@@ -0,0 +1,17 @@
|
|
1
|
+
class Test_clamp < Test::Unit::TestCase
|
2
|
+
|
3
|
+
def test_clamp__endless_range
|
4
|
+
rng = (1..)
|
5
|
+
assert_raise(RangeError) { 2.clamp(rng) }
|
6
|
+
end
|
7
|
+
|
8
|
+
def test_bound__endless
|
9
|
+
rng = (1..)
|
10
|
+
assert_raise(RangeError) { rng.bound(2) }
|
11
|
+
|
12
|
+
rng = (1...)
|
13
|
+
assert_raise(RangeError) { rng.bound(2) }
|
14
|
+
end
|
15
|
+
|
16
|
+
end
|
17
|
+
|
@@ -0,0 +1,17 @@
|
|
1
|
+
class Test_clamp < Test::Unit::TestCase
|
2
|
+
|
3
|
+
def test_clamp__beginless_range
|
4
|
+
rng = (..3)
|
5
|
+
assert_raise(RangeError) { 2.clamp(rng) }
|
6
|
+
end
|
7
|
+
|
8
|
+
def test_bound__beginless
|
9
|
+
rng = (..3)
|
10
|
+
assert_raise(RangeError) { rng.bound(2) }
|
11
|
+
|
12
|
+
rng = (...3)
|
13
|
+
assert_raise(RangeError) { rng.bound(2) }
|
14
|
+
end
|
15
|
+
|
16
|
+
end
|
17
|
+
|
data/test/test-alias.rb
CHANGED
@@ -1,54 +1,54 @@
|
|
1
1
|
require 'test/unit'
|
2
2
|
$VERBOSE = true
|
3
3
|
|
4
|
-
class ::DummyClass
|
5
|
-
def self.dummy_method
|
6
|
-
:ok
|
7
|
-
end
|
8
|
-
def self.clobber_method
|
9
|
-
:original
|
10
|
-
end
|
11
|
-
end
|
12
|
-
|
13
4
|
require_relative '../lib/mug/alias'
|
14
5
|
class Test_alias < Test::Unit::TestCase
|
15
6
|
|
7
|
+
class DummyClass
|
8
|
+
def self.dummy_method
|
9
|
+
:ok
|
10
|
+
end
|
11
|
+
def self.clobber_method
|
12
|
+
:original
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
16
|
def test_alias
|
17
|
-
assert_equal( :ok,
|
18
|
-
assert_raise(NoMethodError) {
|
17
|
+
assert_equal( :ok, DummyClass.dummy_method )
|
18
|
+
assert_raise(NoMethodError) { DummyClass.aliased_method }
|
19
19
|
|
20
|
-
|
20
|
+
DummyClass.instance_eval do
|
21
21
|
alias_singleton_method :aliased_method, :dummy_method
|
22
22
|
end
|
23
23
|
|
24
|
-
assert_equal( :ok,
|
25
|
-
assert_equal( :ok,
|
24
|
+
assert_equal( :ok, DummyClass.dummy_method )
|
25
|
+
assert_equal( :ok, DummyClass.aliased_method )
|
26
26
|
end
|
27
27
|
|
28
28
|
def test_alias_safe
|
29
|
-
assert_equal( :original,
|
29
|
+
assert_equal( :original, DummyClass.clobber_method )
|
30
30
|
|
31
|
-
|
31
|
+
DummyClass.instance_eval do
|
32
32
|
alias_singleton_method :unclobbered_method, :clobber_method
|
33
33
|
def self.clobber_method
|
34
34
|
:clobbered
|
35
35
|
end
|
36
36
|
end
|
37
37
|
|
38
|
-
assert_equal( :clobbered,
|
39
|
-
assert_equal( :original,
|
38
|
+
assert_equal( :clobbered, DummyClass.clobber_method )
|
39
|
+
assert_equal( :original, DummyClass.unclobbered_method )
|
40
40
|
end
|
41
41
|
|
42
42
|
def test_alias_return
|
43
43
|
result = nil
|
44
|
-
|
44
|
+
DummyClass.instance_eval do
|
45
45
|
result = alias_singleton_method :aliased_method2, :dummy_method
|
46
46
|
end
|
47
|
-
assert_equal(
|
47
|
+
assert_equal( DummyClass, result )
|
48
48
|
end
|
49
49
|
|
50
50
|
def test_alias_private
|
51
|
-
assert_raise(NoMethodError) {
|
51
|
+
assert_raise(NoMethodError) { DummyClass.alias_singleton_method :aliased_method3, :dummy_method }
|
52
52
|
end
|
53
53
|
|
54
54
|
end
|
data/test/test-apply.rb
CHANGED
@@ -1,14 +1,15 @@
|
|
1
1
|
require 'test/unit'
|
2
2
|
$VERBOSE = true
|
3
3
|
|
4
|
-
class Foo
|
5
|
-
def bar a, b
|
6
|
-
(a||0) + (b||0)
|
7
|
-
end
|
8
|
-
end
|
9
|
-
|
10
4
|
require_relative '../lib/mug/apply'
|
11
5
|
class Test_apply < Test::Unit::TestCase
|
6
|
+
|
7
|
+
class Foo
|
8
|
+
def bar a, b
|
9
|
+
(a||0) + (b||0)
|
10
|
+
end
|
11
|
+
end
|
12
|
+
|
12
13
|
def test_apply_proc
|
13
14
|
prc = proc{|a,b,*c| (a||0) + (b||0) + c.inject(0, &:+) }
|
14
15
|
p1 = prc.apply(1)
|
data/test/test-array-samples.rb
CHANGED
@@ -1,29 +1,30 @@
|
|
1
1
|
require 'test/unit'
|
2
2
|
$VERBOSE = true
|
3
3
|
|
4
|
-
|
5
|
-
|
6
|
-
$MIN = 4
|
7
|
-
$MAX = 6
|
4
|
+
require_relative '../lib/mug/array/samples'
|
5
|
+
class Test_array_extend < Test::Unit::TestCase
|
8
6
|
|
9
|
-
class MyPRNG
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
7
|
+
class MyPRNG
|
8
|
+
def rand n=1.0
|
9
|
+
case n
|
10
|
+
when Integer
|
11
|
+
n - 1
|
12
|
+
when Range
|
13
|
+
n.max
|
14
|
+
when Float
|
15
|
+
n.prev_float
|
16
|
+
end
|
18
17
|
end
|
19
18
|
end
|
20
|
-
end
|
21
19
|
|
22
|
-
|
23
|
-
|
20
|
+
ARRAY = proc { 8.times.to_a }
|
21
|
+
TRIES = 40320 # 8 factorial
|
22
|
+
MIN = 4
|
23
|
+
MAX = 6
|
24
|
+
|
24
25
|
def test_samples
|
25
|
-
a =
|
26
|
-
|
26
|
+
a = ARRAY.call
|
27
|
+
TRIES.times do
|
27
28
|
s = a.samples
|
28
29
|
assert( s.length >= 1 )
|
29
30
|
assert( s.length <= a.length )
|
@@ -32,11 +33,11 @@ class Test_array_extend < Test::Unit::TestCase
|
|
32
33
|
end
|
33
34
|
end
|
34
35
|
def test_samples_min
|
35
|
-
a =
|
36
|
+
a = ARRAY.call
|
36
37
|
# successes
|
37
|
-
|
38
|
-
s = a.samples( :min =>
|
39
|
-
assert( s.length >=
|
38
|
+
TRIES.times do
|
39
|
+
s = a.samples( :min => MIN )
|
40
|
+
assert( s.length >= MIN )
|
40
41
|
assert( s.length <= a.length )
|
41
42
|
assert( s.uniq == s )
|
42
43
|
assert( s.all? {|n| a.include? n } )
|
@@ -45,12 +46,12 @@ class Test_array_extend < Test::Unit::TestCase
|
|
45
46
|
assert_raise( ArgumentError ) { a.samples( :min => -1 ) }
|
46
47
|
end
|
47
48
|
def test_samples_max
|
48
|
-
a =
|
49
|
+
a = ARRAY.call
|
49
50
|
# successes
|
50
|
-
|
51
|
-
s = a.samples( :max =>
|
51
|
+
TRIES.times do
|
52
|
+
s = a.samples( :max => MAX )
|
52
53
|
assert( s.length >= 1 )
|
53
|
-
assert( s.length <=
|
54
|
+
assert( s.length <= MAX )
|
54
55
|
assert( s.uniq == s )
|
55
56
|
assert( s.all? {|n| a.include? n } )
|
56
57
|
end
|
@@ -58,21 +59,21 @@ class Test_array_extend < Test::Unit::TestCase
|
|
58
59
|
assert_raise( ArgumentError ) { a.samples( :max => -1 ) }
|
59
60
|
end
|
60
61
|
def test_samples_minmax
|
61
|
-
a =
|
62
|
+
a = ARRAY.call
|
62
63
|
# successes
|
63
|
-
|
64
|
-
s = a.samples( :min =>
|
65
|
-
assert( s.length >=
|
66
|
-
assert( s.length <=
|
64
|
+
TRIES.times do
|
65
|
+
s = a.samples( :min => MIN, :max => MAX )
|
66
|
+
assert( s.length >= MIN )
|
67
|
+
assert( s.length <= MAX )
|
67
68
|
assert( s.uniq == s )
|
68
69
|
assert( s.all? {|n| a.include? n } )
|
69
70
|
end
|
70
71
|
# failures
|
71
|
-
assert_raise( ArgumentError ) { a.samples( :min =>
|
72
|
+
assert_raise( ArgumentError ) { a.samples( :min => MAX, :max => MIN ) }
|
72
73
|
end
|
73
74
|
def test_samples_random
|
74
|
-
a =
|
75
|
-
|
75
|
+
a = ARRAY.call
|
76
|
+
TRIES.times do
|
76
77
|
s = a.samples( :random => Random.new )
|
77
78
|
assert( s.length >= 1 )
|
78
79
|
assert( s.length <= a.length )
|
@@ -81,8 +82,8 @@ class Test_array_extend < Test::Unit::TestCase
|
|
81
82
|
end
|
82
83
|
end
|
83
84
|
def test_samples_random2
|
84
|
-
a =
|
85
|
-
|
85
|
+
a = ARRAY.call
|
86
|
+
TRIES.times do
|
86
87
|
s = a.samples( :random => MyPRNG.new )
|
87
88
|
assert( s.length >= 1 )
|
88
89
|
assert( s.length <= a.length )
|
data/test/test-bool.rb
CHANGED
@@ -1,23 +1,23 @@
|
|
1
1
|
require 'test/unit'
|
2
2
|
$VERBOSE = true
|
3
3
|
|
4
|
-
class MyEnum
|
5
|
-
include Enumerable
|
6
|
-
def initialize(*a) @a=a; end
|
7
|
-
def each(&b) @a.each(&b); end
|
8
|
-
end
|
9
|
-
|
10
|
-
if RUBY_VERSION.to_i >= 2
|
11
|
-
$truthy = [ 1, 1.0, Float::INFINITY, -Float::INFINITY, (1<<100).coerce(1).first, Rational(1,1), "x", [1], {1=>1}, MyEnum.new(1), [1].each ]
|
12
|
-
$falsy = [ 0, 0.0, -0.0, Float::NAN, (1<<100).coerce(0).first, Rational(0,1), "", [], {}, MyEnum.new, [].each, RuntimeError.new ]
|
13
|
-
else
|
14
|
-
$truthy = [ 1, 1.0, Float::INFINITY, -Float::INFINITY, (1<<100).coerce(1).first, Rational(1,1), "x", [1], {1=>1}, MyEnum.new(1) ]
|
15
|
-
$falsy = [ 0, 0.0, -0.0, Float::NAN, (1<<100).coerce(0).first, Rational(0,1), "", [], {}, MyEnum.new, RuntimeError.new ]
|
16
|
-
end
|
17
|
-
|
18
4
|
require_relative '../lib/mug/bool'
|
19
5
|
class Test_bool < Test::Unit::TestCase
|
20
6
|
|
7
|
+
class MyEnum
|
8
|
+
include Enumerable
|
9
|
+
def initialize(*a) @a=a; end
|
10
|
+
def each(&b) @a.each(&b); end
|
11
|
+
end
|
12
|
+
|
13
|
+
if RUBY_VERSION.to_i >= 2
|
14
|
+
TRUTHY = [ 1, 1.0, Float::INFINITY, -Float::INFINITY, (1<<100).coerce(1).first, Rational(1,1), "x", [1], {1=>1}, MyEnum.new(1), [1].each ]
|
15
|
+
FALSY = [ 0, 0.0, -0.0, Float::NAN, (1<<100).coerce(0).first, Rational(0,1), "", [], {}, MyEnum.new, [].each, RuntimeError.new ]
|
16
|
+
else
|
17
|
+
TRUTHY = [ 1, 1.0, Float::INFINITY, -Float::INFINITY, (1<<100).coerce(1).first, Rational(1,1), "x", [1], {1=>1}, MyEnum.new(1) ]
|
18
|
+
FALSY = [ 0, 0.0, -0.0, Float::NAN, (1<<100).coerce(0).first, Rational(0,1), "", [], {}, MyEnum.new, RuntimeError.new ]
|
19
|
+
end
|
20
|
+
|
21
21
|
alias assert_true assert
|
22
22
|
def assert_false val, msg=UNASSIGNED
|
23
23
|
assert !val, msg
|
@@ -35,10 +35,10 @@ class Test_bool < Test::Unit::TestCase
|
|
35
35
|
assert_true( Bool(true), true_msg(true) )
|
36
36
|
assert_false( Bool(false), false_msg(false) )
|
37
37
|
assert_false( Bool(nil), false_msg(false) )
|
38
|
-
|
38
|
+
TRUTHY.each do |o|
|
39
39
|
assert_true( Bool(o), true_msg(o) )
|
40
40
|
end
|
41
|
-
|
41
|
+
FALSY.each do |o|
|
42
42
|
assert_true( Bool(o), true_msg(o) )
|
43
43
|
end
|
44
44
|
end
|
@@ -47,10 +47,10 @@ class Test_bool < Test::Unit::TestCase
|
|
47
47
|
assert_true( true.to_bool, true_msg(true,'to_bool') )
|
48
48
|
assert_false( false.to_bool, false_msg(false,'to_bool') )
|
49
49
|
assert_false( nil.to_bool, false_msg(nil,'to_bool') )
|
50
|
-
|
50
|
+
TRUTHY.each do |o|
|
51
51
|
assert_true( o.to_bool, true_msg(o,'to_bool') )
|
52
52
|
end
|
53
|
-
|
53
|
+
FALSY.each do |o|
|
54
54
|
assert_true( o.to_bool, true_msg(o,'to_bool') )
|
55
55
|
end
|
56
56
|
end
|
@@ -59,10 +59,10 @@ class Test_bool < Test::Unit::TestCase
|
|
59
59
|
assert_true( true.to_b, true_msg(true,'to_b') )
|
60
60
|
assert_false( false.to_b, false_msg(false,'to_b') )
|
61
61
|
assert_false( nil.to_b, false_msg(nil,'to_b') )
|
62
|
-
|
62
|
+
TRUTHY.each do |o|
|
63
63
|
assert_true( o.to_b, true_msg(o,'to_b') )
|
64
64
|
end
|
65
|
-
|
65
|
+
FALSY.each do |o|
|
66
66
|
assert_false( o.to_b, false_msg(o,'to_b') )
|
67
67
|
end
|
68
68
|
end
|
data/test/test-clamp.rb
CHANGED
@@ -46,6 +46,13 @@ class Test_clamp < Test::Unit::TestCase
|
|
46
46
|
assert_raise(ArgumentError) { rng.bound(5) }
|
47
47
|
assert_raise(ArgumentError) { rng.bound(6) }
|
48
48
|
end
|
49
|
+
end
|
50
|
+
|
51
|
+
if RUBY_VERSION.to_f >= 2.6
|
52
|
+
require_relative '2-6-test-clamp'
|
53
|
+
end
|
49
54
|
|
55
|
+
if RUBY_VERSION.to_f >= 2.7
|
56
|
+
require_relative '2-7-test-clamp'
|
50
57
|
end
|
51
58
|
|
@@ -0,0 +1,80 @@
|
|
1
|
+
require 'test/unit'
|
2
|
+
$VERBOSE = true
|
3
|
+
|
4
|
+
require_relative '../lib/mug/enumerable/chain'
|
5
|
+
class Test_enumerable_chain < Test::Unit::TestCase
|
6
|
+
def test_chain
|
7
|
+
a = [1, 2, 3, 4].each_with_index
|
8
|
+
b = [5, 6].each_with_index
|
9
|
+
c = [7, 8].each_with_index
|
10
|
+
expect = [
|
11
|
+
[1,0], [2,1], [3,2], [4,3],
|
12
|
+
[5,0], [6,1],
|
13
|
+
[7,0], [8,1],
|
14
|
+
]
|
15
|
+
|
16
|
+
result = []
|
17
|
+
a.chain(b, c) do |*x|
|
18
|
+
result << x
|
19
|
+
end
|
20
|
+
|
21
|
+
assert_equal( expect, result )
|
22
|
+
end
|
23
|
+
|
24
|
+
def test_chain__noblock
|
25
|
+
a = [1, 2, 3, 4].each_with_index
|
26
|
+
b = [5, 6].each_with_index
|
27
|
+
c = [7, 8].each_with_index
|
28
|
+
expect = [
|
29
|
+
[1,0], [2,1], [3,2], [4,3],
|
30
|
+
[5,0], [6,1],
|
31
|
+
[7,0], [8,1],
|
32
|
+
]
|
33
|
+
|
34
|
+
enum = a.chain(b, c)
|
35
|
+
assert_kind_of( Enumerator, enum )
|
36
|
+
|
37
|
+
result = []
|
38
|
+
enum.each do |*x|
|
39
|
+
result << x
|
40
|
+
end
|
41
|
+
|
42
|
+
assert_equal( expect, result )
|
43
|
+
end
|
44
|
+
|
45
|
+
def test_chain0
|
46
|
+
a = [1, 2, 3, 4].each_with_index
|
47
|
+
b = [5, 6, 7, 8].each_with_index
|
48
|
+
expect = [
|
49
|
+
[1,0], [2,1], [3,2], [4,3],
|
50
|
+
[5,0], [6,1], [7,2], [8,3],
|
51
|
+
]
|
52
|
+
|
53
|
+
result = []
|
54
|
+
Enumerable.chain(a, b) do |*x|
|
55
|
+
result << x
|
56
|
+
end
|
57
|
+
|
58
|
+
assert_equal( expect, result )
|
59
|
+
end
|
60
|
+
|
61
|
+
def test_chain0__noblock
|
62
|
+
a = [1, 2, 3, 4].each_with_index
|
63
|
+
b = [5, 6, 7, 8].each_with_index
|
64
|
+
expect = [
|
65
|
+
[1,0], [2,1], [3,2], [4,3],
|
66
|
+
[5,0], [6,1], [7,2], [8,3],
|
67
|
+
]
|
68
|
+
|
69
|
+
enum = Enumerable.chain(a, b)
|
70
|
+
assert_kind_of( Enumerator, enum )
|
71
|
+
|
72
|
+
result = []
|
73
|
+
enum.each do |*x|
|
74
|
+
result << x
|
75
|
+
end
|
76
|
+
|
77
|
+
assert_equal( expect, result )
|
78
|
+
end
|
79
|
+
end
|
80
|
+
|
@@ -1,19 +1,20 @@
|
|
1
1
|
require 'test/unit'
|
2
2
|
$VERBOSE = true
|
3
3
|
|
4
|
-
class HashLikeEnum
|
5
|
-
def each
|
6
|
-
return enum_for(:each) unless block_given?
|
7
|
-
yield 'a'
|
8
|
-
yield 'b'
|
9
|
-
yield 'c'
|
10
|
-
yield 'd'
|
11
|
-
end
|
12
|
-
include Enumerable
|
13
|
-
end
|
14
|
-
|
15
4
|
require_relative '../lib/mug/enumerable/hash-like'
|
16
5
|
class Test_hashlike < Test::Unit::TestCase
|
6
|
+
|
7
|
+
class HashLikeEnum
|
8
|
+
def each
|
9
|
+
return enum_for(:each) unless block_given?
|
10
|
+
yield 'a'
|
11
|
+
yield 'b'
|
12
|
+
yield 'c'
|
13
|
+
yield 'd'
|
14
|
+
end
|
15
|
+
include Enumerable
|
16
|
+
end
|
17
|
+
|
17
18
|
def test__each_pair__block
|
18
19
|
my_enum = HashLikeEnum.new
|
19
20
|
expect = [[0, 'a'], [1, 'b'], [2, 'c'], [3, 'd']]
|
@@ -1,28 +1,38 @@
|
|
1
1
|
require 'test/unit'
|
2
2
|
$VERBOSE = true
|
3
3
|
|
4
|
-
|
5
|
-
|
6
|
-
def initialize; @b = B.new; end
|
7
|
-
attr_accessor :b
|
8
|
-
end
|
4
|
+
require_relative '../lib/mug/fragile-method-chain'
|
5
|
+
class Test_fmc < Test::Unit::TestCase
|
9
6
|
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
7
|
+
module FMCTest
|
8
|
+
class A
|
9
|
+
def initialize; @b = B.new; end
|
10
|
+
attr_accessor :b
|
11
|
+
end
|
12
|
+
|
13
|
+
class B
|
14
|
+
def initialize; @c = C.new; end
|
15
|
+
attr_accessor :c
|
16
|
+
end
|
14
17
|
|
15
|
-
|
16
|
-
|
18
|
+
class C
|
19
|
+
def to_i; 1; end
|
20
|
+
end
|
17
21
|
end
|
18
|
-
end
|
19
22
|
|
20
|
-
def
|
21
|
-
|
22
|
-
|
23
|
+
def self.startup
|
24
|
+
class << false
|
25
|
+
def c
|
26
|
+
2
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
30
|
+
def self.shutdown
|
31
|
+
class << false
|
32
|
+
undef c
|
33
|
+
end
|
34
|
+
end
|
23
35
|
|
24
|
-
require_relative '../lib/mug/fragile-method-chain'
|
25
|
-
class Test_fmc < Test::Unit::TestCase
|
26
36
|
def test_fmc_nil
|
27
37
|
a = FMCTest::A.new
|
28
38
|
assert_equal( 1, a._?.b.c.to_i._! )
|
data/test/test-loop-with.rb
CHANGED
@@ -7,7 +7,7 @@ class Test_loop_with < Test::Unit::TestCase
|
|
7
7
|
def test_loop_with_index__block
|
8
8
|
a = []
|
9
9
|
b = []
|
10
|
-
|
10
|
+
_x = loop_with_index do |i|
|
11
11
|
a << i
|
12
12
|
break if a.length >= 3
|
13
13
|
end
|
@@ -22,7 +22,7 @@ class Test_loop_with < Test::Unit::TestCase
|
|
22
22
|
def test_loop_with_index__block_offset
|
23
23
|
a = []
|
24
24
|
b = []
|
25
|
-
|
25
|
+
_x = loop_with_index(10) do |i|
|
26
26
|
a << i
|
27
27
|
break if a.length >= 3
|
28
28
|
end
|
@@ -40,7 +40,7 @@ class Test_loop_with < Test::Unit::TestCase
|
|
40
40
|
|
41
41
|
a = []
|
42
42
|
b = []
|
43
|
-
|
43
|
+
_x = enum.each do |i|
|
44
44
|
a << i
|
45
45
|
break if a.length >= 3
|
46
46
|
end
|
@@ -58,7 +58,7 @@ class Test_loop_with < Test::Unit::TestCase
|
|
58
58
|
|
59
59
|
a = []
|
60
60
|
b = []
|
61
|
-
|
61
|
+
_x = enum.each do |i|
|
62
62
|
a << i
|
63
63
|
break if a.length >= 3
|
64
64
|
end
|
@@ -75,7 +75,7 @@ class Test_loop_with < Test::Unit::TestCase
|
|
75
75
|
o = "x"
|
76
76
|
a = []
|
77
77
|
b = []
|
78
|
-
|
78
|
+
_x = loop_with_object(o) do |e|
|
79
79
|
a << e
|
80
80
|
break if a.length >= 3
|
81
81
|
end
|
@@ -94,7 +94,7 @@ class Test_loop_with < Test::Unit::TestCase
|
|
94
94
|
|
95
95
|
a = []
|
96
96
|
b = []
|
97
|
-
|
97
|
+
_x = enum.each do |e|
|
98
98
|
a << e
|
99
99
|
break if a.length >= 3
|
100
100
|
end
|
data/test/test-maybe.rb
CHANGED
@@ -1,28 +1,38 @@
|
|
1
1
|
require 'test/unit'
|
2
2
|
$VERBOSE = true
|
3
3
|
|
4
|
-
|
5
|
-
|
6
|
-
def initialize; @b = B.new; end
|
7
|
-
attr_accessor :b
|
8
|
-
end
|
4
|
+
require_relative '../lib/mug/maybe'
|
5
|
+
class Test_maybe < Test::Unit::TestCase
|
9
6
|
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
7
|
+
module MaybeTest
|
8
|
+
class A
|
9
|
+
def initialize; @b = B.new; end
|
10
|
+
attr_accessor :b
|
11
|
+
end
|
12
|
+
|
13
|
+
class B
|
14
|
+
def initialize; @c = C.new; end
|
15
|
+
attr_accessor :c
|
16
|
+
end
|
14
17
|
|
15
|
-
|
16
|
-
|
18
|
+
class C
|
19
|
+
def to_i; 1; end
|
20
|
+
end
|
17
21
|
end
|
18
|
-
end
|
19
22
|
|
20
|
-
def
|
21
|
-
|
22
|
-
|
23
|
+
def self.startup
|
24
|
+
class << false
|
25
|
+
def c
|
26
|
+
2
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
30
|
+
def self.shutdown
|
31
|
+
class << false
|
32
|
+
undef c
|
33
|
+
end
|
34
|
+
end
|
23
35
|
|
24
|
-
require_relative '../lib/mug/maybe'
|
25
|
-
class Test_maybe < Test::Unit::TestCase
|
26
36
|
def test_maybe_block_nil
|
27
37
|
a = MaybeTest::A.new
|
28
38
|
assert_equal( 1, a.maybe{ b.maybe{ c } }.to_i )
|
data/test/test-negativity.rb
CHANGED
@@ -3,9 +3,9 @@ $VERBOSE = true
|
|
3
3
|
|
4
4
|
require 'bigdecimal'
|
5
5
|
|
6
|
-
$neg = [ -1, -(2**65), -3.14, Rational(-1,2), BigDecimal
|
7
|
-
$pos = [ +1, +(2**65), +3.14, Rational(+1,2), BigDecimal
|
8
|
-
$zer = [ 0, 0.0, BigDecimal
|
6
|
+
$neg = [ -1, -(2**65), -3.14, Rational(-1,2), BigDecimal('-1') ]
|
7
|
+
$pos = [ +1, +(2**65), +3.14, Rational(+1,2), BigDecimal('+1') ]
|
8
|
+
$zer = [ 0, 0.0, BigDecimal('0') ]
|
9
9
|
$err = [ Complex(1,1) ]
|
10
10
|
|
11
11
|
require_relative '../lib/mug/negativity'
|
data/test/test-with.rb
ADDED
@@ -0,0 +1,37 @@
|
|
1
|
+
require 'test/unit'
|
2
|
+
$VERBOSE = true
|
3
|
+
|
4
|
+
require_relative '../lib/mug/with'
|
5
|
+
class Test_with < Test::Unit::TestCase
|
6
|
+
|
7
|
+
def test_with
|
8
|
+
input = [1, 'two', :three]
|
9
|
+
output = nil
|
10
|
+
|
11
|
+
with(*input) do |a, b, c|
|
12
|
+
output = [a, b, c]
|
13
|
+
end
|
14
|
+
|
15
|
+
assert_equal( output, input )
|
16
|
+
end
|
17
|
+
|
18
|
+
def test_with__noblock
|
19
|
+
input = [1, 'two', :three]
|
20
|
+
output = nil
|
21
|
+
|
22
|
+
enum = with(*input)
|
23
|
+
assert_kind_of( Enumerator, enum )
|
24
|
+
|
25
|
+
enum.each do |a, b, c|
|
26
|
+
output = [a, b, c]
|
27
|
+
end
|
28
|
+
|
29
|
+
assert_equal( output, input )
|
30
|
+
end
|
31
|
+
|
32
|
+
def test_with__private
|
33
|
+
assert_raise(NoMethodError) { Object.new.with }
|
34
|
+
end
|
35
|
+
|
36
|
+
end
|
37
|
+
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: mug
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.
|
4
|
+
version: 1.2.4
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Matthew Kerwin
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2020-11-11 00:00:00.000000000 Z
|
12
12
|
dependencies: []
|
13
13
|
description: |
|
14
14
|
== MUG: Matty's Ultimate Gem
|
@@ -40,6 +40,7 @@ files:
|
|
40
40
|
- lib/mug/counts.rb
|
41
41
|
- lib/mug/enumerable.rb
|
42
42
|
- lib/mug/enumerable/any-and-all.rb
|
43
|
+
- lib/mug/enumerable/chain.rb
|
43
44
|
- lib/mug/enumerable/counts.rb
|
44
45
|
- lib/mug/enumerable/hash-like.rb
|
45
46
|
- lib/mug/fragile-method-chain.rb
|
@@ -69,6 +70,8 @@ files:
|
|
69
70
|
- lib/mug/to_h.rb
|
70
71
|
- lib/mug/top.rb
|
71
72
|
- lib/mug/with.rb
|
73
|
+
- test/2-6-test-clamp.rb
|
74
|
+
- test/2-7-test-clamp.rb
|
72
75
|
- test/test-affix.rb
|
73
76
|
- test/test-alias.rb
|
74
77
|
- test/test-and-or.rb
|
@@ -83,6 +86,7 @@ files:
|
|
83
86
|
- test/test-bool.rb
|
84
87
|
- test/test-clamp.rb
|
85
88
|
- test/test-counts.rb
|
89
|
+
- test/test-enumerable-chain.rb
|
86
90
|
- test/test-enumerable-hash-like.rb
|
87
91
|
- test/test-fragile-method-chain.rb
|
88
92
|
- test/test-hashmap.rb
|
@@ -104,6 +108,7 @@ files:
|
|
104
108
|
- test/test-tau.rb
|
105
109
|
- test/test-time.rb
|
106
110
|
- test/test-top.rb
|
111
|
+
- test/test-with.rb
|
107
112
|
homepage: http://phluid61.github.com/mug
|
108
113
|
licenses:
|
109
114
|
- ISC
|
@@ -123,44 +128,47 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
123
128
|
- !ruby/object:Gem::Version
|
124
129
|
version: '0'
|
125
130
|
requirements: []
|
126
|
-
|
127
|
-
rubygems_version: 2.7.6
|
131
|
+
rubygems_version: 3.1.2
|
128
132
|
signing_key:
|
129
133
|
specification_version: 4
|
130
134
|
summary: 'MUG: Matty''s Ultimate Gem'
|
131
135
|
test_files:
|
132
|
-
- test/test-
|
133
|
-
- test/test-
|
134
|
-
- test/test-
|
135
|
-
- test/test-not.rb
|
136
|
-
- test/test-loop-with.rb
|
137
|
-
- test/test-counts.rb
|
138
|
-
- test/test-array-minus.rb
|
139
|
-
- test/test-iff.rb
|
140
|
-
- test/test-affix.rb
|
141
|
-
- test/test-bool.rb
|
142
|
-
- test/test-alias.rb
|
136
|
+
- test/test-enumerable-hash-like.rb
|
137
|
+
- test/test-clamp.rb
|
138
|
+
- test/test-array-delete_all.rb
|
143
139
|
- test/test-rexproc.rb
|
144
|
-
- test/test-hashmerge.rb
|
145
|
-
- test/test-array-samples.rb
|
146
140
|
- test/test-tau.rb
|
147
|
-
- test/test-
|
148
|
-
- test/test-
|
149
|
-
- test/test-clamp.rb
|
150
|
-
- test/test-iterator-for.rb
|
141
|
+
- test/test-matchdata_each.rb
|
142
|
+
- test/test-alias.rb
|
151
143
|
- test/test-bittest.rb
|
152
|
-
- test/test-hashwhen.rb
|
153
|
-
- test/test-negativity.rb
|
154
|
-
- test/test-array-delete_all.rb
|
155
144
|
- test/test-iterator.rb
|
145
|
+
- test/test-hashwhen.rb
|
156
146
|
- test/test-matchdata_hash.rb
|
157
|
-
- test/test-
|
158
|
-
- test/test-and-or.rb
|
159
|
-
- test/test-hashmap.rb
|
160
|
-
- test/test-enumerable-hash-like.rb
|
161
|
-
- test/test-time.rb
|
162
|
-
- test/test-matchdata_each.rb
|
163
|
-
- test/test-iterator-method.rb
|
147
|
+
- test/test-not.rb
|
164
148
|
- test/test-array-extend.rb
|
149
|
+
- test/test-iterator-for.rb
|
150
|
+
- test/2-6-test-clamp.rb
|
165
151
|
- test/test-top.rb
|
152
|
+
- test/test-and-or.rb
|
166
153
|
- test/test-array-to_proc.rb
|
154
|
+
- test/test-affix.rb
|
155
|
+
- test/test-hashmerge.rb
|
156
|
+
- test/test-with.rb
|
157
|
+
- test/test-any-and-all.rb
|
158
|
+
- test/test-self.rb
|
159
|
+
- test/test-enumerable-chain.rb
|
160
|
+
- test/test-time.rb
|
161
|
+
- test/test-counts.rb
|
162
|
+
- test/test-negativity.rb
|
163
|
+
- test/test-bool.rb
|
164
|
+
- test/test-hashmap.rb
|
165
|
+
- test/test-loop-with.rb
|
166
|
+
- test/test-maybe.rb
|
167
|
+
- test/test-iff.rb
|
168
|
+
- test/test-array-samples.rb
|
169
|
+
- test/test-hashop.rb
|
170
|
+
- test/test-iterator-method.rb
|
171
|
+
- test/test-apply.rb
|
172
|
+
- test/test-array-minus.rb
|
173
|
+
- test/2-7-test-clamp.rb
|
174
|
+
- test/test-fragile-method-chain.rb
|