mug 1.2.1 → 1.4.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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: c21f58658e25bbdc5ffa1d9fc3b5a80ba7da9c4a49348681523a034e21d6972e
4
- data.tar.gz: 2db7532d87137ca0bf31ac1d460b7bf487ee15abdbc8e09f5d32310e8a5bd8d5
3
+ metadata.gz: b8aae970fd7b2f0d4ce63d9acd53ada600a0b9d946782d3fd099090cb885088a
4
+ data.tar.gz: 74abd8b7ca7cb86780d5739ec2c0bbc7fc2b0a12777f73ef5d84a1e1dc42f6b1
5
5
  SHA512:
6
- metadata.gz: 96db9c590c28244950a74746f680549234780c34a259819991b3efccc78cc2fb5294f3b9655fe3f428b50805d472b67c43c86ad7c60608e80b039cbd8f34ddc8
7
- data.tar.gz: e57ca3a0fa44884f06fb5bfc3a7b1a26d5055b1e1b6ccdcf7832df86d7c39f18d5dfad512c4666d1f466f5c0fe5ffbd76a69fee3d7482d00b853b6ed74070a0b
6
+ metadata.gz: b0975b92d3a4e818eb6c0449bffc631d8d7f508884e481a9af9c377cbb0954fad9d4e845bd4e430459672154badc374179e365f786c4f8f8cb36b38f0d1aac88
7
+ data.tar.gz: 6a14bb22a3018b6ef8ef7e79baf65bcba07485c78e9d7cfc39be3ad6d9cfd59cb3097e0a97e12e5b8c0dc2c979a7c0700a5401fe5737dfedf4809fba49516423
data/lib/mug.rb CHANGED
@@ -11,6 +11,7 @@ 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/diggable'
14
15
  require_relative 'mug/enumerable/any-and-all'
15
16
  require_relative 'mug/enumerable/chain'
16
17
  require_relative 'mug/enumerable/counts'
@@ -0,0 +1,34 @@
1
+
2
+ #
3
+ # Extend any class or object that implements a #[] method, to
4
+ # also have #dig
5
+ #
6
+ module Diggable
7
+ #
8
+ # Extracts the nested value specified by the sequence of +idx+ objects by
9
+ # calling +dig+ at each step, returning +nil+ if any intermediate step is
10
+ # +nil+.
11
+ #
12
+ def dig *idx
13
+ inner = self[idx.shift]
14
+ return inner if idx.empty? or inner.nil?
15
+ inner.dig *idx
16
+ end
17
+ end
18
+
19
+ =begin
20
+ Copyright (c) 2020, Matthew Kerwin <matthew@kerwin.net.au>
21
+
22
+ Permission to use, copy, modify, and/or distribute this software for any
23
+ purpose with or without fee is hereby granted, provided that the above
24
+ copyright notice and this permission notice appear in all copies.
25
+
26
+ THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
27
+ WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
28
+ MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
29
+ ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
30
+ WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
31
+ ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
32
+ OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
33
+ =end
34
+
@@ -14,7 +14,11 @@ module Enumerable
14
14
  end
15
15
  end
16
16
 
17
- undef chain if RUBY_VERSION >= '2.6'
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
+
18
22
  #
19
23
  # Creates a chain of Enumerables following this one, and
20
24
  # invokes a block once for each element of each Enumerable.
@@ -47,7 +47,7 @@ module Enumerable
47
47
  return v if k == key
48
48
  end
49
49
  if args.length > 1
50
- return default
50
+ default
51
51
  elsif block_given?
52
52
  yield key
53
53
  else
@@ -78,12 +78,12 @@ module Enumerable
78
78
  break if remain < 1
79
79
 
80
80
  key_indices = key_map[k]
81
- if key_indices
82
- key_indices.each do |key_index|
83
- result[key_index] = v
84
- define[key_index] = true
85
- remain -= 1
86
- end
81
+ next unless key_indices
82
+
83
+ key_indices.each do |key_index|
84
+ result[key_index] = v
85
+ define[key_index] = true
86
+ remain -= 1
87
87
  end
88
88
  end
89
89
 
@@ -34,6 +34,16 @@ class FragileMethodChain
34
34
  self
35
35
  end
36
36
 
37
+ # If the object is resolved, defer. Otherwise, sure, I
38
+ # respond to anything, I guess.
39
+ def respond_to_missing? meth, priv
40
+ if __defer?
41
+ @o.respond_to_missing? meth, priv
42
+ else
43
+ true
44
+ end
45
+ end
46
+
37
47
  # Explicitly invoke :_? as a method in the chain.
38
48
  def _? #:nodoc:
39
49
  # Unconditionally invoke it, so the eventual _! doesn't fail
@@ -60,7 +70,7 @@ class Object
60
70
  end
61
71
 
62
72
  =begin
63
- Copyright (c) 2013,2016, Matthew Kerwin <matthew@kerwin.net.au>
73
+ Copyright (c) 2013,2016,2020, Matthew Kerwin <matthew@kerwin.net.au>
64
74
 
65
75
  Permission to use, copy, modify, and/or distribute this software for any
66
76
  purpose with or without fee is hereby granted, provided that the above
@@ -8,6 +8,7 @@ class Hash
8
8
  # {'a'=>1, 'b'=>2}.map_values { "cat" } #=> {'a'=>"cat", 'b'=>"cat"}
9
9
  #
10
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
 
@@ -35,6 +37,7 @@ class Hash
35
37
  # {'a'=>1, 'b'=>2}.map_keys { "cat" } #=> {'cat'=>2}
36
38
  #
37
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
 
@@ -64,6 +68,7 @@ class Hash
64
68
  # {'a'=>1, 'b'=>2}.map_pairs { ["cat","dog"] } #=> {'cat'=>'dog'}
65
69
  #
66
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,11 +78,14 @@ 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
- # See: #map_values
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
@@ -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 discourages. Use Object#iter_for or
26
- # Object#to_iter instead.
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)
@@ -21,6 +21,15 @@ class MaybeDelegator
21
21
  def method_missing *a, &b #:nodoc:
22
22
  @o && @o.send(*a, &b)
23
23
  end
24
+
25
+ # This is a bit flakey, but I think it's meaningful.
26
+ def respond_to_missing? meth, priv
27
+ if @o
28
+ @o.repond_to_missing? meth, priv
29
+ else
30
+ true
31
+ end
32
+ end
24
33
  end
25
34
 
26
35
  class Object
@@ -42,7 +51,7 @@ class Object
42
51
  end
43
52
 
44
53
  =begin
45
- Copyright (c) 2013, Matthew Kerwin <matthew@kerwin.net.au>
54
+ Copyright (c) 2013,2020, Matthew Kerwin <matthew@kerwin.net.au>
46
55
 
47
56
  Permission to use, copy, modify, and/or distribute this software for any
48
57
  purpose with or without fee is hereby granted, provided that the above
@@ -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 *args
8
+ yield(*args)
9
9
  end
10
+ private :with
10
11
  end
11
12
 
12
13
  =begin
13
- Copyright (c) 2018, Matthew Kerwin <matthew@kerwin.net.au>
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
+
@@ -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, ::DummyClass.dummy_method )
18
- assert_raise(NoMethodError) { ::DummyClass.aliased_method }
17
+ assert_equal( :ok, DummyClass.dummy_method )
18
+ assert_raise(NoMethodError) { DummyClass.aliased_method }
19
19
 
20
- ::DummyClass.instance_eval do
20
+ DummyClass.instance_eval do
21
21
  alias_singleton_method :aliased_method, :dummy_method
22
22
  end
23
23
 
24
- assert_equal( :ok, ::DummyClass.dummy_method )
25
- assert_equal( :ok, ::DummyClass.aliased_method )
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, ::DummyClass.clobber_method )
29
+ assert_equal( :original, DummyClass.clobber_method )
30
30
 
31
- ::DummyClass.instance_eval do
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, ::DummyClass.clobber_method )
39
- assert_equal( :original, ::DummyClass.unclobbered_method )
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
- ::DummyClass.instance_eval do
44
+ DummyClass.instance_eval do
45
45
  result = alias_singleton_method :aliased_method2, :dummy_method
46
46
  end
47
- assert_equal( ::DummyClass, result )
47
+ assert_equal( DummyClass, result )
48
48
  end
49
49
 
50
50
  def test_alias_private
51
- assert_raise(NoMethodError) { ::DummyClass.alias_singleton_method :aliased_method3, :dummy_method }
51
+ assert_raise(NoMethodError) { DummyClass.alias_singleton_method :aliased_method3, :dummy_method }
52
52
  end
53
53
 
54
54
  end
@@ -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)
@@ -1,29 +1,30 @@
1
1
  require 'test/unit'
2
2
  $VERBOSE = true
3
3
 
4
- $ARRAY = proc { 8.times.to_a }
5
- $TRIES = 40320 # 8 factorial
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
- def rand n=1.0
11
- case n
12
- when Integer
13
- n - 1
14
- when Range
15
- n.max
16
- when Float
17
- n.prev_float
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
- require_relative '../lib/mug/array/samples'
23
- class Test_array_extend < Test::Unit::TestCase
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 = $ARRAY.call
26
- $TRIES.times do
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 = $ARRAY.call
36
+ a = ARRAY.call
36
37
  # successes
37
- $TRIES.times do
38
- s = a.samples( :min => $MIN )
39
- assert( s.length >= $MIN )
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 = $ARRAY.call
49
+ a = ARRAY.call
49
50
  # successes
50
- $TRIES.times do
51
- s = a.samples( :max => $MAX )
51
+ TRIES.times do
52
+ s = a.samples( :max => MAX )
52
53
  assert( s.length >= 1 )
53
- assert( s.length <= $MAX )
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 = $ARRAY.call
62
+ a = ARRAY.call
62
63
  # successes
63
- $TRIES.times do
64
- s = a.samples( :min => $MIN, :max => $MAX )
65
- assert( s.length >= $MIN )
66
- assert( s.length <= $MAX )
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 => $MAX, :max => $MIN ) }
72
+ assert_raise( ArgumentError ) { a.samples( :min => MAX, :max => MIN ) }
72
73
  end
73
74
  def test_samples_random
74
- a = $ARRAY.call
75
- $TRIES.times do
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 = $ARRAY.call
85
- $TRIES.times do
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 )
@@ -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
- $truthy.each do |o|
38
+ TRUTHY.each do |o|
39
39
  assert_true( Bool(o), true_msg(o) )
40
40
  end
41
- $falsy.each do |o|
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
- $truthy.each do |o|
50
+ TRUTHY.each do |o|
51
51
  assert_true( o.to_bool, true_msg(o,'to_bool') )
52
52
  end
53
- $falsy.each do |o|
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
- $truthy.each do |o|
62
+ TRUTHY.each do |o|
63
63
  assert_true( o.to_b, true_msg(o,'to_b') )
64
64
  end
65
- $falsy.each do |o|
65
+ FALSY.each do |o|
66
66
  assert_false( o.to_b, false_msg(o,'to_b') )
67
67
  end
68
68
  end
@@ -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,42 @@
1
+ require 'test/unit'
2
+ $VERBOSE = true
3
+
4
+ require_relative '../lib/mug/diggable'
5
+ class Test_digabble < Test::Unit::TestCase
6
+
7
+ class DiggyClass
8
+ include Diggable
9
+
10
+ def initialize *args
11
+ @array = args
12
+ end
13
+
14
+ def [] idx
15
+ @array[idx]
16
+ end
17
+ end
18
+
19
+ def test_diggable_mid
20
+ z = [99]
21
+ y = DiggyClass.new 0, z
22
+ x = [nil, nil, y]
23
+
24
+ path = [2, 1, 0]
25
+ assert_equal( 99, x.dig(*path) )
26
+ end
27
+ def test_diggable_end
28
+ z = [99]
29
+ y = DiggyClass.new 0, z
30
+ x = [nil, nil, y]
31
+
32
+ path = [2, 1]
33
+ assert_equal( z, x.dig(*path) )
34
+ end
35
+ def test_diggable_nil
36
+ y = DiggyClass.new 0, nil
37
+ x = [nil, nil, y]
38
+
39
+ path = [2, 1, 0]
40
+ assert_equal( nil, x.dig(*path) )
41
+ end
42
+ end
@@ -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
- module FMCTest
5
- class A
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
- class B
11
- def initialize; @c = C.new; end
12
- attr_accessor :c
13
- end
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
- class C
16
- def to_i; 1; end
18
+ class C
19
+ def to_i; 1; end
20
+ end
17
21
  end
18
- end
19
22
 
20
- def false.c
21
- 2
22
- end
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._! )
@@ -1,28 +1,38 @@
1
1
  require 'test/unit'
2
2
  $VERBOSE = true
3
3
 
4
- module MaybeTest
5
- class A
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
- class B
11
- def initialize; @c = C.new; end
12
- attr_accessor :c
13
- end
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
- class C
16
- def to_i; 1; end
18
+ class C
19
+ def to_i; 1; end
20
+ end
17
21
  end
18
- end
19
22
 
20
- def false.c
21
- 2
22
- end
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 )
@@ -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.2.1
4
+ version: 1.4.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Matthew Kerwin
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2018-11-30 00:00:00.000000000 Z
11
+ date: 2020-11-19 00:00:00.000000000 Z
12
12
  dependencies: []
13
13
  description: |
14
14
  == MUG: Matty's Ultimate Gem
@@ -38,6 +38,7 @@ files:
38
38
  - lib/mug/bool.rb
39
39
  - lib/mug/clamp.rb
40
40
  - lib/mug/counts.rb
41
+ - lib/mug/diggable.rb
41
42
  - lib/mug/enumerable.rb
42
43
  - lib/mug/enumerable/any-and-all.rb
43
44
  - lib/mug/enumerable/chain.rb
@@ -70,6 +71,8 @@ files:
70
71
  - lib/mug/to_h.rb
71
72
  - lib/mug/top.rb
72
73
  - lib/mug/with.rb
74
+ - test/2-6-test-clamp.rb
75
+ - test/2-7-test-clamp.rb
73
76
  - test/test-affix.rb
74
77
  - test/test-alias.rb
75
78
  - test/test-and-or.rb
@@ -84,6 +87,7 @@ files:
84
87
  - test/test-bool.rb
85
88
  - test/test-clamp.rb
86
89
  - test/test-counts.rb
90
+ - test/test-diggable.rb
87
91
  - test/test-enumerable-chain.rb
88
92
  - test/test-enumerable-hash-like.rb
89
93
  - test/test-fragile-method-chain.rb
@@ -106,6 +110,7 @@ files:
106
110
  - test/test-tau.rb
107
111
  - test/test-time.rb
108
112
  - test/test-top.rb
113
+ - test/test-with.rb
109
114
  homepage: http://phluid61.github.com/mug
110
115
  licenses:
111
116
  - ISC
@@ -125,8 +130,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
125
130
  - !ruby/object:Gem::Version
126
131
  version: '0'
127
132
  requirements: []
128
- rubyforge_project:
129
- rubygems_version: 2.7.6
133
+ rubygems_version: 3.1.2
130
134
  signing_key:
131
135
  specification_version: 4
132
136
  summary: 'MUG: Matty''s Ultimate Gem'
@@ -142,14 +146,17 @@ test_files:
142
146
  - test/test-iterator.rb
143
147
  - test/test-hashwhen.rb
144
148
  - test/test-matchdata_hash.rb
149
+ - test/test-diggable.rb
145
150
  - test/test-not.rb
146
151
  - test/test-array-extend.rb
147
152
  - test/test-iterator-for.rb
153
+ - test/2-6-test-clamp.rb
148
154
  - test/test-top.rb
149
155
  - test/test-and-or.rb
150
156
  - test/test-array-to_proc.rb
151
157
  - test/test-affix.rb
152
158
  - test/test-hashmerge.rb
159
+ - test/test-with.rb
153
160
  - test/test-any-and-all.rb
154
161
  - test/test-self.rb
155
162
  - test/test-enumerable-chain.rb
@@ -166,4 +173,5 @@ test_files:
166
173
  - test/test-iterator-method.rb
167
174
  - test/test-apply.rb
168
175
  - test/test-array-minus.rb
176
+ - test/2-7-test-clamp.rb
169
177
  - test/test-fragile-method-chain.rb