intercepted 0.1.0 → 0.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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 2e389fb3fb65d7b7ee9b5ad6cf418e1cbe1cf16269b3233435c3d21fc2503e17
4
- data.tar.gz: 9452cd4c9f2c78a8f1e8c7330640b0cd1fbac248c5617f8d6f646ef295b5e0a5
3
+ metadata.gz: 00a78d119bf1ea6cb2d1976c62cfa7cc42a36d1c8f152d61e6ea7b4d9fa103a1
4
+ data.tar.gz: de72b68afa62eb25fe8dca8c38c9f6fa54e3087cfec0e5726ff2ecccba0863a3
5
5
  SHA512:
6
- metadata.gz: a460d3297e64d92cdd9dcdb1eeae77b2d17827c09e2f22b393bf5490617d7bf18935199c8489028b34dac02e3b4f5a39419f275c0fb573eb4e461f3985507e45
7
- data.tar.gz: cb33a093e41a3a568f129c5dfd3627cf6df9c0348451b5c80ae6e20beb0a7a7093fa7e402f0dd1ff47e02e3b54eff289199fdd907ece3dce0588b2b3bc50de28
6
+ metadata.gz: fb7c784de7bf2014d9e89e6db0fe013c261a7e53e72a8d640d17462d4aea3832603d983cb0752d1629852f8ab8bb7029f6957a121bca095ee2489d8951f7b629
7
+ data.tar.gz: f99de9f29fcf823df4a5a9b9d8c1f3bb56a9cf3a93c8aeb7864b11758207bec1b68de3ea244acba81078b39bbb09a23d27ecb1adc7e7da8f043036fb582ab33f
data/.rubocop.yml CHANGED
@@ -14,6 +14,8 @@ plugins:
14
14
  - rubocop-rake
15
15
  - rubocop-minitest
16
16
  - rubocop-performance
17
+ Minitest/EmptyLineBeforeAssertionMethods:
18
+ Enabled: false
17
19
  Layout/EndOfLine:
18
20
  EnforcedStyle: lf
19
21
  Style/EvalWithLocation:
data/README.md CHANGED
@@ -16,10 +16,10 @@ to all its methods:
16
16
 
17
17
  ```ruby
18
18
  require 'intercepted'
19
- i = intercepted(42) do |o, name, *args, &block|
20
- r = o.__send__(name, *args, &block)
21
- puts "#{name}(#{args.join(', ')}) -> #{r}"
22
- r
19
+ i = intercepted(42) do |e, m, args, r|
20
+ if e == :after
21
+ puts "#{m}(#{args.join(', ')}) -> #{r}"
22
+ end
23
23
  end
24
24
  puts i + 4
25
25
  ```
@@ -27,9 +27,14 @@ puts i + 4
27
27
  Prints:
28
28
 
29
29
  ```text
30
-
30
+ +(4) -> 46
31
31
  ```
32
32
 
33
+ The value of `e` may either be `:after` or `:before`.
34
+ The value of `m` is the name of the method called (a symbol).
35
+ The list of arguments passed are in the `args`.
36
+ The result of method execution is in the `r` (it's nil when `e` is `:before`).
37
+
33
38
  That's it.
34
39
 
35
40
  ## How to contribute
data/intercepted.gemspec CHANGED
@@ -9,7 +9,7 @@ Gem::Specification.new do |s|
9
9
  s.required_rubygems_version = Gem::Requirement.new('>= 0') if s.respond_to? :required_rubygems_version=
10
10
  s.required_ruby_version = '>=3.2'
11
11
  s.name = 'intercepted'
12
- s.version = '0.1.0'
12
+ s.version = '0.2.0'
13
13
  s.license = 'MIT'
14
14
  s.summary = 'Intercepts All Method Calls to a Ruby Object'
15
15
  s.description =
data/lib/intercepted.rb CHANGED
@@ -5,16 +5,31 @@
5
5
 
6
6
  # System module.
7
7
  module Kernel
8
- def intercepted(origin = nil, &pipe)
8
+ def intercepted(origin = nil)
9
9
  raise 'Block is expected by intercepted()' unless block_given?
10
10
 
11
11
  Class.new(BasicObject) do
12
12
  define_method(:initialize) { @o = origin }
13
- define_method(:method_missing) do |name, *args, &block|
14
- pipe.call(@o, name, *args, &block)
13
+ define_method(:method_missing) do |mtd, *args, &block|
14
+ yield(:before, mtd, args)
15
+ params = @o.method(mtd).parameters
16
+ reqs = params.count { |p| p[0] == :req }
17
+ maybe = %i[key keyreq]
18
+ r =
19
+ if params.any? { |p| maybe.include?(p[0]) } && args.size > reqs
20
+ @o.__send__(mtd, *args[0..-2], **args.last) do |*a|
21
+ block&.call(*a)
22
+ end
23
+ else
24
+ @o.__send__(mtd, *args) do |*a|
25
+ block&.call(*a)
26
+ end
27
+ end
28
+ yield(:after, mtd, args, r)
29
+ r
15
30
  end
16
- define_method(:respond_to?) do |name, include_private = false|
17
- @o.respond_to?(name, include_private)
31
+ define_method(:respond_to?) do |mtd, include_private = false|
32
+ @o.respond_to?(mtd, include_private)
18
33
  end
19
34
  end.new
20
35
  end
@@ -4,6 +4,7 @@
4
4
  # SPDX-License-Identifier: MIT
5
5
 
6
6
  require_relative '../lib/intercepted'
7
+ require_relative 'test__helper'
7
8
 
8
9
  # Test.
9
10
  # Author:: Yegor Bugayenko (yegor256@gmail.com)
@@ -11,13 +12,46 @@ require_relative '../lib/intercepted'
11
12
  # License:: MIT
12
13
  class Testintercepted < Minitest::Test
13
14
  def test_simple
14
- i = intercepted(42) do |o, name, *args, &block|
15
- r = o.__send__(name, *args, &block)
16
- puts "#{name}(#{args.join(', ')}) -> #{r}"
17
- r
15
+ i = intercepted(42) do |e, m, args, r|
16
+ puts "#{m}(#{args.join(', ')}) -> #{r}" if e == :after
18
17
  end
19
-
20
18
  assert_equal(46, i + 4)
21
19
  assert_respond_to(i, :+)
22
20
  end
21
+
22
+ def test_only_passes_named_arguments
23
+ o = Class.new do
24
+ def foo(bar: 0)
25
+ bar + yield
26
+ end
27
+ end.new
28
+ i = intercepted(o) do |_e, _m, _args, _r|
29
+ 'none'
30
+ end
31
+ assert_equal(11, i.foo(bar: 8) { 3 })
32
+ end
33
+
34
+ def test_passes_named_arguments_through
35
+ o = Class.new do
36
+ def foo(one, bar: 0)
37
+ one + bar + yield
38
+ end
39
+ end.new
40
+ i = intercepted(o) do |_e, _m, _args, _r|
41
+ true
42
+ end
43
+ assert_equal(21, i.foo(7, bar: 8) { 6 })
44
+ end
45
+
46
+ def test_passes_stared_args
47
+ o = Class.new do
48
+ def foo(*_args)
49
+ yield
50
+ end
51
+ end.new
52
+ i = intercepted(o) do |_e, _m, _args, _r|
53
+ true
54
+ end
55
+ assert_equal(77, i.foo(8, 8, 8) { 77 })
56
+ end
23
57
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: intercepted
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0
4
+ version: 0.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Yegor Bugayenko