duck_puncher 4.1.0 → 4.2.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/README.md +18 -10
- data/bin/console +2 -2
- data/lib/duck_puncher/ancestral_hash.rb +8 -0
- data/lib/duck_puncher/decoration.rb +2 -1
- data/lib/duck_puncher/defaults.rb +20 -0
- data/lib/duck_puncher/duck.rb +7 -8
- data/lib/duck_puncher/ducks/{array.rb → enumerable.rb} +5 -1
- data/lib/duck_puncher/ducks/object.rb +1 -1
- data/lib/duck_puncher/ducks.rb +1 -1
- data/lib/duck_puncher/gem_installer.rb +2 -2
- data/lib/duck_puncher/registration.rb +1 -0
- data/lib/duck_puncher/utilities.rb +23 -0
- data/lib/duck_puncher/version.rb +1 -1
- data/lib/duck_puncher.rb +30 -61
- data/test/lib/duck_puncher/{array_test.rb → enumerable_test.rb} +7 -1
- data/test/lib/duck_puncher_test.rb +12 -3
- data/test/test_helper.rb +1 -1
- metadata +8 -5
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: f03c81056b93d66e3c9799672cc6e20c34d1ac72
|
4
|
+
data.tar.gz: 30186f7d1cc1b8ce19d94810b17e24cf7fe0b2ab
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: a27458ff3a2d1e52d381c44d91b6281b0c485870471298413a8144a070574e06a2119d75f9f61feb803167d0cf6e23c05d7a31f967dc9482eb2c46bfc62429b7
|
7
|
+
data.tar.gz: 5cb8230d00f0cf0b058b1db9f9043990beacf2c4dcafb1073aae9d74356b7fc8dd0d6a0ec7eb42a1ceb8b525c9ba21b85d9a1c4458f972e675f98799a2fdba70
|
data/README.md
CHANGED
@@ -8,28 +8,36 @@ DuckPuncher provides an interface for administering __duck punches__ (a.k.a "mon
|
|
8
8
|
Default extensions:
|
9
9
|
|
10
10
|
```ruby
|
11
|
-
|
11
|
+
Enumerable
|
12
|
+
#m => `[].m(:to_s)` => `[].map(&:to_s)`
|
12
13
|
#m! => `[].m!(:upcase)` => `[].map!(&:upcase)`
|
13
14
|
#mm => `[].mm(:sub, /[aeiou]/, '*')` => `[].map { |x| x.sub(/[aeiou]/, '*') }`
|
14
15
|
#mm! => `[].mm!(:sub, /[aeiou]/, '*')` => `[].map! { |x| x.sub(/[aeiou]/, '*') }`
|
15
16
|
#except => `[].except('foo', 'bar')` => `[] - ['foo', 'bar']`
|
16
|
-
|
17
|
+
#map_keys => `[{id: 1, name: 'foo'}, {id: 2}].map_keys(:id)` => `[1, 2]`
|
18
|
+
Hash
|
19
|
+
#dig => `{a: 1, b: {c: 2}}.dig(:b, :c)` => 2 (Part of standard lib in Ruby >= 2.3)
|
17
20
|
#compact => `{a: 1, b: nil}.compact` => {a: 1}
|
18
|
-
Numeric
|
21
|
+
Numeric
|
22
|
+
#to_currency => `25.245.to_currency` => 25.25
|
19
23
|
#to_duration => `10_000.to_duration` => '2 h 46 min'
|
20
24
|
#to_time_ago => `10_000.to_time_ago` => '2 hours ago'
|
21
25
|
#to_rad => `10.15.to_rad` => 0.17715091907742445
|
22
|
-
String
|
26
|
+
String
|
27
|
+
#pluralize => `'hour'.pluralize(2)` => "hours"
|
23
28
|
#underscore => `'DuckPuncher::JSONStorage'.underscore` => 'duck_puncher/json_storage'
|
24
29
|
#to_boolean => `'1'.to_boolean` => true
|
25
30
|
#constantize => `'MiniTest::Test'.constantize` => MiniTest::Test
|
26
|
-
Module
|
27
|
-
|
31
|
+
Module
|
32
|
+
#local_methods => `Kernel.local_methods` returns the methods defined directly in the class + nested constants w/ methods
|
33
|
+
Object
|
34
|
+
#clone! => `Object.new.clone!` => a deep clone of the object (using Marshal.dump)
|
28
35
|
#punch => `'duck'.punch` => a copy of 'duck' with String punches mixed in
|
29
36
|
#punch! => `'duck'.punch!` => destructive version applies extensions directly to the base object
|
30
37
|
#echo => `'duck'.echo.upcase` => spits out the caller and value of the object and returns the object
|
31
38
|
#track => `Object.new.track` => Traces methods calls to the object (requires [object_tracker](https://github.com/ridiculous/object_tracker), which it'll try to download)
|
32
|
-
Method
|
39
|
+
Method
|
40
|
+
#to_instruct => `Benchmark.method(:measure).to_instruct` returns the Ruby VM instruction sequence for the method
|
33
41
|
#to_source => `Benchmark.method(:measure).to_source` returns the method definition as a string
|
34
42
|
```
|
35
43
|
|
@@ -38,19 +46,19 @@ Method #to_instruct => `Benchmark.method(:measure).to_instruct` returns
|
|
38
46
|
Punch all registered ducks:
|
39
47
|
|
40
48
|
```ruby
|
41
|
-
DuckPuncher.
|
49
|
+
DuckPuncher.()
|
42
50
|
```
|
43
51
|
|
44
52
|
Punch individual ducks by name:
|
45
53
|
|
46
54
|
```ruby
|
47
|
-
DuckPuncher.
|
55
|
+
DuckPuncher.(Hash, Object)
|
48
56
|
```
|
49
57
|
|
50
58
|
One method to rule them all:
|
51
59
|
|
52
60
|
```ruby
|
53
|
-
DuckPuncher.
|
61
|
+
DuckPuncher.(Object, only: :punch)
|
54
62
|
```
|
55
63
|
|
56
64
|
### Tactical punches
|
data/bin/console
CHANGED
@@ -7,10 +7,10 @@ require 'irb'
|
|
7
7
|
require 'byebug'
|
8
8
|
require_relative '../test/fixtures/wut'
|
9
9
|
|
10
|
-
DuckPuncher.
|
10
|
+
DuckPuncher.logger.level = Logger::DEBUG
|
11
11
|
|
12
12
|
if ENV['PUNCH'] != 'no'
|
13
|
-
DuckPuncher.
|
13
|
+
DuckPuncher.()
|
14
14
|
end
|
15
15
|
|
16
16
|
IRB.start
|
@@ -1,4 +1,5 @@
|
|
1
1
|
module DuckPuncher
|
2
|
+
# @note When updating this file please update comment regarding this module in duck_puncher.rb
|
2
3
|
module Decoration
|
3
4
|
def decorators
|
4
5
|
@decorators ||= ancestral_hash
|
@@ -18,7 +19,7 @@ module DuckPuncher
|
|
18
19
|
|
19
20
|
def cached_decorators
|
20
21
|
@cached_decorators ||= Hash.new do |me, target|
|
21
|
-
me[target] = DuckPuncher.decorators.select { |klass, _| klass >= target }
|
22
|
+
me[target] = DuckPuncher.decorators.select { |klass, _| klass >= target }
|
22
23
|
end
|
23
24
|
end
|
24
25
|
|
@@ -0,0 +1,20 @@
|
|
1
|
+
DuckPuncher.logger = Logger.new(STDOUT).tap do |config|
|
2
|
+
config.formatter = proc { |*args| "[#{args[1]}] #{args[0]}: #{args[-1]}\n" }
|
3
|
+
config.level = Logger::ERROR
|
4
|
+
end
|
5
|
+
|
6
|
+
ducks = [
|
7
|
+
[String, DuckPuncher::Ducks::String],
|
8
|
+
[Enumerable, DuckPuncher::Ducks::Enumerable],
|
9
|
+
[Array, DuckPuncher::Ducks::Enumerable],
|
10
|
+
[Hash, DuckPuncher::Ducks::Enumerable],
|
11
|
+
[Numeric, DuckPuncher::Ducks::Numeric],
|
12
|
+
[Hash, DuckPuncher::Ducks::Hash],
|
13
|
+
[Object, DuckPuncher::Ducks::Object],
|
14
|
+
[Module, DuckPuncher::Ducks::Module],
|
15
|
+
[Method, DuckPuncher::Ducks::Method, { before: ->(_target) { DuckPuncher::GemInstaller.initialize! } }],
|
16
|
+
]
|
17
|
+
ducks << ['ActiveRecord::Base', DuckPuncher::Ducks::ActiveRecord] if defined? ::ActiveRecord
|
18
|
+
ducks.each do |duck|
|
19
|
+
DuckPuncher.register *duck
|
20
|
+
end
|
data/lib/duck_puncher/duck.rb
CHANGED
@@ -2,7 +2,6 @@ module DuckPuncher
|
|
2
2
|
class Duck
|
3
3
|
attr_accessor :target, :mod, :options
|
4
4
|
|
5
|
-
# @todo test punching a module
|
6
5
|
# @param target [String,Class] Class or module to punch
|
7
6
|
# @param mod [String,Module] The module that defines the extensions (@name is used by default)
|
8
7
|
# @param [Hash] options to modify the duck #punch method behavior
|
@@ -20,14 +19,14 @@ module DuckPuncher
|
|
20
19
|
# @option options [Symbol,String] :method Specifies if the methods should be included or prepended (:include)
|
21
20
|
# @return [Class] The class that was just punched
|
22
21
|
def punch(opts = {})
|
23
|
-
|
24
|
-
|
25
|
-
options[:before].call(
|
26
|
-
|
27
|
-
|
28
|
-
options[:after].call(
|
22
|
+
targets = Array(opts.delete(:target) || self.target)
|
23
|
+
targets.each do |target|
|
24
|
+
options[:before].call(target) if options[:before]
|
25
|
+
target.extend Usable
|
26
|
+
target.usable mod, only: opts[:only], method: opts[:method]
|
27
|
+
options[:after].call(target) if options[:after]
|
29
28
|
end
|
30
|
-
|
29
|
+
targets
|
31
30
|
end
|
32
31
|
|
33
32
|
#
|
@@ -1,6 +1,6 @@
|
|
1
1
|
module DuckPuncher
|
2
2
|
module Ducks
|
3
|
-
module
|
3
|
+
module Enumerable
|
4
4
|
def m(method_name)
|
5
5
|
map(&method_name)
|
6
6
|
end
|
@@ -20,6 +20,10 @@ module DuckPuncher
|
|
20
20
|
def except(*args)
|
21
21
|
self - args
|
22
22
|
end
|
23
|
+
|
24
|
+
def map_keys(key)
|
25
|
+
map { |x| x[key] }
|
26
|
+
end
|
23
27
|
end
|
24
28
|
end
|
25
29
|
end
|
@@ -34,7 +34,7 @@ module DuckPuncher
|
|
34
34
|
begin
|
35
35
|
require 'object_tracker' || raise(LoadError)
|
36
36
|
rescue LoadError
|
37
|
-
DuckPuncher.
|
37
|
+
DuckPuncher.(Object, only: :require!) unless respond_to? :require!
|
38
38
|
require! 'object_tracker'
|
39
39
|
end
|
40
40
|
extend ::ObjectTracker
|
data/lib/duck_puncher/ducks.rb
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
module DuckPuncher
|
2
2
|
module Ducks
|
3
3
|
autoload :String, 'duck_puncher/ducks/string'
|
4
|
-
autoload :
|
4
|
+
autoload :Enumerable, 'duck_puncher/ducks/enumerable'
|
5
5
|
autoload :Numeric, 'duck_puncher/ducks/numeric'
|
6
6
|
autoload :Hash, 'duck_puncher/ducks/hash'
|
7
7
|
autoload :Object, 'duck_puncher/ducks/object'
|
@@ -11,7 +11,7 @@ class DuckPuncher::GemInstaller
|
|
11
11
|
begin
|
12
12
|
require spec[:require_with]
|
13
13
|
rescue LoadError => e
|
14
|
-
DuckPuncher.
|
14
|
+
DuckPuncher.logger.error "Failed to load #{spec[:require_with]} from .duck_puncher/ #{e.inspect}"
|
15
15
|
end
|
16
16
|
end
|
17
17
|
end
|
@@ -29,6 +29,6 @@ class DuckPuncher::GemInstaller
|
|
29
29
|
end
|
30
30
|
installer.installed_gems.any?
|
31
31
|
rescue => e
|
32
|
-
DuckPuncher.
|
32
|
+
DuckPuncher.logger.error "Failed to install #{args.first}. #{e.inspect}"
|
33
33
|
end
|
34
34
|
end
|
@@ -0,0 +1,23 @@
|
|
1
|
+
module DuckPuncher
|
2
|
+
# @note When updating this file please update comment regarding this module in duck_puncher.rb
|
3
|
+
module Utilities
|
4
|
+
def lookup_constant(const)
|
5
|
+
return const if ::Module === const
|
6
|
+
if const.to_s.respond_to?(:constantize)
|
7
|
+
const.to_s.constantize
|
8
|
+
else
|
9
|
+
const.to_s.split('::').inject(::Object) { |k, part| k.const_get(part) }
|
10
|
+
end
|
11
|
+
rescue ::NameError => e
|
12
|
+
logger.error "#{e.class}: #{e.message}"
|
13
|
+
nil
|
14
|
+
end
|
15
|
+
|
16
|
+
def redefine_constant(name, const)
|
17
|
+
if const_defined? name
|
18
|
+
remove_const name
|
19
|
+
end
|
20
|
+
const_set name, const
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
data/lib/duck_puncher/version.rb
CHANGED
data/lib/duck_puncher.rb
CHANGED
@@ -1,4 +1,3 @@
|
|
1
|
-
# Standard lib
|
2
1
|
require 'pathname'
|
3
2
|
require 'fileutils'
|
4
3
|
require 'logger'
|
@@ -12,81 +11,51 @@ require 'usable'
|
|
12
11
|
require 'duck_puncher/version'
|
13
12
|
require 'duck_puncher/registration'
|
14
13
|
require 'duck_puncher/decoration'
|
14
|
+
require 'duck_puncher/utilities'
|
15
|
+
require 'duck_puncher/ancestral_hash'
|
16
|
+
require 'duck_puncher/duck'
|
17
|
+
require 'duck_puncher/ducks'
|
15
18
|
|
16
19
|
module DuckPuncher
|
17
|
-
autoload :JSONStorage, 'duck_puncher/json_storage'
|
18
20
|
autoload :GemInstaller, 'duck_puncher/gem_installer'
|
19
|
-
autoload :
|
20
|
-
autoload :Ducks, 'duck_puncher/ducks'
|
21
|
+
autoload :JSONStorage, 'duck_puncher/json_storage'
|
21
22
|
|
22
23
|
class << self
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
24
|
+
# @description Include additional functionality
|
25
|
+
# Registration[:register, :deregister]
|
26
|
+
# Decoration[:decorators, :build_decorator_class, :decorate, :cached_decorators, :undecorate]
|
27
|
+
# Utilities[:lookup_constant, :redefine_constant]
|
28
|
+
# AncestralHash[:ancestral_hash]
|
29
|
+
include Registration, Decoration, Utilities, AncestralHash
|
30
|
+
|
31
|
+
attr_accessor :logger
|
32
|
+
|
33
|
+
# Backwards compatibility
|
34
|
+
alias_method :log, :logger
|
35
|
+
alias_method :log=, :logger=
|
36
|
+
|
37
|
+
def call(*args)
|
38
|
+
options = args.last.is_a?(Hash) ? args.pop : {}
|
39
|
+
classes = args.any? ? args : Ducks.list.keys
|
30
40
|
classes.each do |klass|
|
31
41
|
klass = lookup_constant(klass)
|
32
42
|
Ducks[klass].sort.each do |duck|
|
33
|
-
punches = options[:only] || Ducks::Module.instance_method(:local_methods).bind(duck.mod).call
|
34
|
-
log.info %Q(#{duck.target}#{" <-- #{punches}" if Array(punches).any?})
|
43
|
+
punches = Array(options[:only] || Ducks::Module.instance_method(:local_methods).bind(duck.mod).call)
|
35
44
|
options[:target] = klass
|
45
|
+
logger.info %Q(#{klass}#{" <-- #{duck.mod.name}#{punches}" if punches.any?})
|
36
46
|
unless duck.punch(options)
|
37
|
-
|
47
|
+
logger.error %Q(Failed to punch #{name})
|
38
48
|
end
|
39
49
|
end
|
40
50
|
end
|
41
51
|
nil
|
42
52
|
end
|
43
53
|
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
def lookup_constant(const)
|
49
|
-
return const if Module === const
|
50
|
-
if const.to_s.respond_to?(:constantize)
|
51
|
-
const.to_s.constantize
|
52
|
-
else
|
53
|
-
const.to_s.split('::').inject(Object) { |k, part| k.const_get(part) }
|
54
|
-
end
|
55
|
-
rescue NameError => e
|
56
|
-
log.error "#{e.class}: #{e.message}"
|
57
|
-
nil
|
58
|
-
end
|
59
|
-
|
60
|
-
def redefine_constant(name, const)
|
61
|
-
if const_defined? name
|
62
|
-
remove_const name
|
63
|
-
end
|
64
|
-
const_set name, const
|
65
|
-
end
|
66
|
-
|
67
|
-
def ancestral_hash
|
68
|
-
Hash.new { |me, klass| me[klass.superclass] if klass.respond_to?(:superclass) }
|
69
|
-
end
|
70
|
-
end
|
71
|
-
|
72
|
-
self.log = Logger.new(STDOUT).tap do |config|
|
73
|
-
config.level = Logger::INFO
|
74
|
-
config.formatter = proc { |*args| "#{args.first}: #{args.last.to_s}\n" }
|
75
|
-
end
|
76
|
-
|
77
|
-
log.level = Logger::ERROR
|
78
|
-
|
79
|
-
ducks = [
|
80
|
-
[String, Ducks::String],
|
81
|
-
[Array, Ducks::Array],
|
82
|
-
[Numeric, Ducks::Numeric],
|
83
|
-
[Hash, Ducks::Hash],
|
84
|
-
[Object, Ducks::Object],
|
85
|
-
[Module, Ducks::Module],
|
86
|
-
[Method, Ducks::Method, { before: ->(*) { DuckPuncher::GemInstaller.initialize! } }],
|
87
|
-
]
|
88
|
-
ducks << ['ActiveRecord::Base', Ducks::ActiveRecord] if defined? ::ActiveRecord
|
89
|
-
ducks.each do |duck|
|
90
|
-
register *duck
|
54
|
+
# Backwards compatibility
|
55
|
+
alias punch_all! call
|
56
|
+
alias punch! call
|
91
57
|
end
|
92
58
|
end
|
59
|
+
|
60
|
+
# Everyone likes defaults
|
61
|
+
require 'duck_puncher/defaults'
|
@@ -2,7 +2,7 @@ require_relative '../../test_helper'
|
|
2
2
|
|
3
3
|
DuckPuncher.punch! Object
|
4
4
|
|
5
|
-
class
|
5
|
+
class EnumerableTest < MiniTest::Test
|
6
6
|
attr_reader :subject
|
7
7
|
|
8
8
|
def setup
|
@@ -36,4 +36,10 @@ class ArrayTest < MiniTest::Test
|
|
36
36
|
assert_equal subject.except('a', 'b', 'c'), %w[d e f g h i j k l m]
|
37
37
|
assert_equal subject.except, subject
|
38
38
|
end
|
39
|
+
|
40
|
+
def test_map_keys
|
41
|
+
@subject = [{ id: 1, name: 'a' }, { id: 2, name: 'b' }, { name: 'c' }]
|
42
|
+
assert_respond_to @subject.punch, :map_keys
|
43
|
+
assert_equal %w[a b c], @subject.punch.map_keys(:name)
|
44
|
+
end
|
39
45
|
end
|
@@ -6,7 +6,6 @@ class DuckPuncherTest < MiniTest::Test
|
|
6
6
|
def setup
|
7
7
|
@subject = Animal.new
|
8
8
|
@kaia = Kaia.new
|
9
|
-
DuckPuncher.deregister Animal, Kaia, Dog
|
10
9
|
end
|
11
10
|
|
12
11
|
def teardown
|
@@ -22,12 +21,22 @@ class DuckPuncherTest < MiniTest::Test
|
|
22
21
|
assert_respond_to @kaia.punch, :talk
|
23
22
|
end
|
24
23
|
|
25
|
-
|
26
24
|
def test_punch_all!
|
27
|
-
DuckPuncher.
|
25
|
+
DuckPuncher.()
|
26
|
+
expected_methods = DuckPuncher::Ducks.list.values.m(:to_a).flatten.m(:mod).m(:local_methods).flatten
|
27
|
+
assert expected_methods.size > 1
|
28
|
+
good_ducks = DuckPuncher::Ducks.list.select { |_, ducks|
|
29
|
+
ducks.all? { |duck| (duck.mod.local_methods - duck.target.instance_methods(:false)).size.zero? }
|
30
|
+
}
|
31
|
+
assert good_ducks.size > 5
|
32
|
+
end
|
33
|
+
|
34
|
+
def test_call
|
35
|
+
DuckPuncher.()
|
28
36
|
expected_methods = DuckPuncher::Ducks.list.values.m(:to_a).flatten.m(:mod).m(:local_methods).flatten
|
29
37
|
assert expected_methods.size > 1
|
30
38
|
good_ducks = DuckPuncher::Ducks.list.select { |_, ducks|
|
39
|
+
# Assert that all methods were copied over
|
31
40
|
ducks.all? { |duck| (duck.mod.local_methods - duck.target.instance_methods(:false)).size.zero? }
|
32
41
|
}
|
33
42
|
assert good_ducks.size > 5
|
data/test/test_helper.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: duck_puncher
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 4.
|
4
|
+
version: 4.2.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Ryan Buckley
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2016-08-
|
11
|
+
date: 2016-08-24 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: usable
|
@@ -105,11 +105,13 @@ files:
|
|
105
105
|
- bin/console
|
106
106
|
- duck_puncher.gemspec
|
107
107
|
- lib/duck_puncher.rb
|
108
|
+
- lib/duck_puncher/ancestral_hash.rb
|
108
109
|
- lib/duck_puncher/decoration.rb
|
110
|
+
- lib/duck_puncher/defaults.rb
|
109
111
|
- lib/duck_puncher/duck.rb
|
110
112
|
- lib/duck_puncher/ducks.rb
|
111
113
|
- lib/duck_puncher/ducks/active_record.rb
|
112
|
-
- lib/duck_puncher/ducks/
|
114
|
+
- lib/duck_puncher/ducks/enumerable.rb
|
113
115
|
- lib/duck_puncher/ducks/hash.rb
|
114
116
|
- lib/duck_puncher/ducks/method.rb
|
115
117
|
- lib/duck_puncher/ducks/module.rb
|
@@ -119,9 +121,10 @@ files:
|
|
119
121
|
- lib/duck_puncher/gem_installer.rb
|
120
122
|
- lib/duck_puncher/json_storage.rb
|
121
123
|
- lib/duck_puncher/registration.rb
|
124
|
+
- lib/duck_puncher/utilities.rb
|
122
125
|
- lib/duck_puncher/version.rb
|
123
126
|
- test/fixtures/wut.rb
|
124
|
-
- test/lib/duck_puncher/
|
127
|
+
- test/lib/duck_puncher/enumerable_test.rb
|
125
128
|
- test/lib/duck_puncher/hash_test.rb
|
126
129
|
- test/lib/duck_puncher/method_test.rb
|
127
130
|
- test/lib/duck_puncher/module_test.rb
|
@@ -156,7 +159,7 @@ specification_version: 4
|
|
156
159
|
summary: Administer precision extensions (a.k.a "punches") to your favorite Ruby classes
|
157
160
|
test_files:
|
158
161
|
- test/fixtures/wut.rb
|
159
|
-
- test/lib/duck_puncher/
|
162
|
+
- test/lib/duck_puncher/enumerable_test.rb
|
160
163
|
- test/lib/duck_puncher/hash_test.rb
|
161
164
|
- test/lib/duck_puncher/method_test.rb
|
162
165
|
- test/lib/duck_puncher/module_test.rb
|