duck_puncher 4.4.1 → 4.4.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/CHANGELOG.md +5 -0
- data/README.md +5 -1
- data/bin/console +15 -1
- data/lib/duck_puncher/defaults.rb +1 -1
- data/lib/duck_puncher/duck.rb +9 -5
- data/lib/duck_puncher/ducks/active_record.rb +1 -1
- data/lib/duck_puncher/version.rb +1 -1
- data/test/lib/duck_puncher/duck_test.rb +45 -0
- metadata +4 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 62f4cac1d15e159d6ba58d71681cec7e34be8c71
|
4
|
+
data.tar.gz: 53ee95a89344c33f8960cf5d957cbb5dbf6d3562
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: ea6d68c9efd49449907ccfb6aab5b810f6b0081ce399817afc78804a813cf0c66feea9ea0cfe74492e3b1091baa3011cc0cc1492d2bdb2ed6ca5e27433f9e9eb
|
7
|
+
data.tar.gz: dd5bf802c09382798460d26c81650588f10f64de8e2cba77fec53d82e55fffb932fe785178233037d96965b53b9093c7088e2c2f87c608c23828df71f81b05c8
|
data/CHANGELOG.md
CHANGED
data/README.md
CHANGED
@@ -155,7 +155,11 @@ DuckPuncher allows you to utilize the `punch` and `punch!` interface to __decora
|
|
155
155
|
call `DuckPuncher.register` with the name of your module (or an array of names) and any of
|
156
156
|
[these options](https://github.com/ridiculous/duck_puncher/blob/master/lib/duck_puncher/duck.rb#L10).
|
157
157
|
|
158
|
+
```ruby
|
159
|
+
DuckPuncher.register <class>, [<module>, ...]
|
160
|
+
```
|
158
161
|
|
162
|
+
A full example:
|
159
163
|
```ruby
|
160
164
|
# Define some extensions
|
161
165
|
module Billable
|
@@ -181,7 +185,7 @@ class User < Struct.new(:name)
|
|
181
185
|
end
|
182
186
|
|
183
187
|
# Register the extensions
|
184
|
-
DuckPuncher.register User,
|
188
|
+
DuckPuncher.register User, Billable, Retryable
|
185
189
|
|
186
190
|
# Add the #punch method to User instances
|
187
191
|
DuckPuncher.(Object, only: :punch)
|
data/bin/console
CHANGED
@@ -2,9 +2,23 @@
|
|
2
2
|
|
3
3
|
require 'bundler/setup'
|
4
4
|
require 'pp'
|
5
|
-
require 'duck_puncher'
|
6
5
|
require 'irb'
|
7
6
|
require 'byebug'
|
7
|
+
|
8
|
+
# Stub out Rails
|
9
|
+
module Rails
|
10
|
+
module VERSION
|
11
|
+
MAJOR = 4
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
15
|
+
# And AR
|
16
|
+
module ActiveRecord
|
17
|
+
class Base
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
require 'duck_puncher'
|
8
22
|
require_relative '../test/fixtures/wut'
|
9
23
|
|
10
24
|
DuckPuncher.logger.level = Logger::DEBUG
|
@@ -22,7 +22,7 @@ ducks = [
|
|
22
22
|
[Module, DuckPuncher::Ducks::Module],
|
23
23
|
[Method, DuckPuncher::Ducks::Method, { before: ->(_target) { DuckPuncher::GemInstaller.initialize! } }],
|
24
24
|
]
|
25
|
-
ducks << [
|
25
|
+
ducks << [ActiveRecord::Base, DuckPuncher::Ducks::ActiveRecord] if defined?(Rails) && defined?(ActiveRecord) && defined?(ActiveRecord::Base)
|
26
26
|
ducks.each do |duck|
|
27
27
|
DuckPuncher.register *duck
|
28
28
|
end
|
data/lib/duck_puncher/duck.rb
CHANGED
@@ -18,19 +18,23 @@ module DuckPuncher
|
|
18
18
|
# @option options [Array,Symbol] :only Specifies the methods to extend onto the current object
|
19
19
|
# @option options [Symbol,String] :method Specifies if the methods should be included or prepended (:include)
|
20
20
|
# @return [Class] The class that was just punched
|
21
|
-
def
|
21
|
+
def call(opts = {})
|
22
22
|
opts = options.merge(opts)
|
23
23
|
targets = Array(opts[:target] || self.target)
|
24
24
|
targets.each do |target|
|
25
|
-
|
25
|
+
opts[:before].call(target) if opts[:before]
|
26
26
|
punches = Array(opts[:only] || Ducks::Module.instance_method(:local_methods).bind(mod).call)
|
27
|
+
unless target.is_a?(::Module)
|
28
|
+
fail ArgumentError, "Invalid target #{target}. Please pass a module as :target"
|
29
|
+
end
|
27
30
|
DuckPuncher.logger.info %Q(#{target}#{" <-- #{mod.name}#{punches}" if punches.any?})
|
28
|
-
extender = Usable::ModExtender.new(mod, only:
|
31
|
+
extender = Usable::ModExtender.new(mod, only: opts.delete(:only), method: opts.delete(:method))
|
29
32
|
extender.call target
|
30
|
-
|
31
|
-
options[:after].call(target) if options[:after]
|
33
|
+
opts[:after].call(target) if opts[:after]
|
32
34
|
end
|
33
35
|
targets
|
34
36
|
end
|
37
|
+
|
38
|
+
alias punch call
|
35
39
|
end
|
36
40
|
end
|
data/lib/duck_puncher/version.rb
CHANGED
@@ -0,0 +1,45 @@
|
|
1
|
+
require_relative '../../test_helper'
|
2
|
+
|
3
|
+
class DuckTest < MiniTest::Test
|
4
|
+
def setup
|
5
|
+
@class = Class.new
|
6
|
+
@object = @class.new
|
7
|
+
@mod = Module.new { %w[foo bar baz].each { |x| define_method(x, -> {}) } }
|
8
|
+
@subject = DuckPuncher::Duck.new(@class, @mod)
|
9
|
+
end
|
10
|
+
|
11
|
+
def test_punch
|
12
|
+
@subject.target = Kaia
|
13
|
+
refute_respond_to Kaia.new, :baz
|
14
|
+
@subject.call
|
15
|
+
assert_respond_to Kaia.new, :foo
|
16
|
+
assert_respond_to Kaia.new, :bar
|
17
|
+
assert_respond_to Kaia.new, :baz
|
18
|
+
end
|
19
|
+
|
20
|
+
def test_punch_with_instance
|
21
|
+
e = assert_raises ArgumentError do
|
22
|
+
@subject.call target: @object
|
23
|
+
end
|
24
|
+
assert_match /Invalid target #<#{@class}:.*>\. Please pass a module as :target/,
|
25
|
+
e.message
|
26
|
+
end
|
27
|
+
|
28
|
+
def test_punch_with_only
|
29
|
+
refute_respond_to @object, :foo
|
30
|
+
refute_respond_to @object, :bar
|
31
|
+
@subject.call(only: :foo)
|
32
|
+
refute_respond_to @object, :bar
|
33
|
+
assert_respond_to @object, :foo
|
34
|
+
@subject.call(only: :bar)
|
35
|
+
assert_respond_to @object, :bar
|
36
|
+
end
|
37
|
+
|
38
|
+
def test_punch_with_only_target
|
39
|
+
refute_respond_to @object, :bar
|
40
|
+
@subject.call target: @class, only: [:foo, :bar]
|
41
|
+
assert_respond_to @object, :bar
|
42
|
+
assert_respond_to @object, :foo
|
43
|
+
refute_respond_to @object, :baz
|
44
|
+
end
|
45
|
+
end
|
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.
|
4
|
+
version: 4.4.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Ryan Buckley
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2017-01-11 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: usable
|
@@ -121,6 +121,7 @@ files:
|
|
121
121
|
- lib/duck_puncher/version.rb
|
122
122
|
- test/fixtures/test_classes.rb
|
123
123
|
- test/fixtures/wut.rb
|
124
|
+
- test/lib/duck_puncher/duck_test.rb
|
124
125
|
- test/lib/duck_puncher/enumerable_test.rb
|
125
126
|
- test/lib/duck_puncher/hash_test.rb
|
126
127
|
- test/lib/duck_puncher/method_test.rb
|
@@ -157,6 +158,7 @@ summary: Administer precision extensions (a.k.a "punches") to your favorite Ruby
|
|
157
158
|
test_files:
|
158
159
|
- test/fixtures/test_classes.rb
|
159
160
|
- test/fixtures/wut.rb
|
161
|
+
- test/lib/duck_puncher/duck_test.rb
|
160
162
|
- test/lib/duck_puncher/enumerable_test.rb
|
161
163
|
- test/lib/duck_puncher/hash_test.rb
|
162
164
|
- test/lib/duck_puncher/method_test.rb
|