call_logger 0.4.0 → 0.5.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/.travis.yml +5 -2
- data/Gemfile.lock +1 -1
- data/README.md +39 -3
- data/lib/call_logger/call_wrapper.rb +20 -0
- data/lib/call_logger/method_wrapper.rb +41 -12
- data/lib/call_logger/version.rb +1 -1
- data/lib/call_logger.rb +23 -7
- metadata +2 -2
- data/lib/call_logger/method_wrapper_builder.rb +0 -49
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: d6e801f833860f18014297b607e82c57aee7690df4d50d03a8a36933c8f6fed3
|
4
|
+
data.tar.gz: 3014e9a30a8e0bfdd2576b7a2f416f0bd2b89e21f610548d53924ee4fd527f19
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: fe4c591ddc244a7a4f099789e02c55db42b0471f0c0dff7508b6382cc68baf1f291ece56ed0583a2f98706cb93d4f14aa78945302d8f4ee1589129e50ed1d672
|
7
|
+
data.tar.gz: e14c310b304d4a30159bb019b9cf1ec1bf3f897cc1c51089bfeeff6dd0a2850e0ba2ea4ac2a6b99672ab88d11c7f702240f98b48dd8ec127635b9d73918243c7
|
data/.travis.yml
CHANGED
data/Gemfile.lock
CHANGED
data/README.md
CHANGED
@@ -2,6 +2,9 @@
|
|
2
2
|
|
3
3
|
A debugging tool that lets you log method usage.
|
4
4
|
|
5
|
+
[](https://travis-ci.org/mrzasa/call_logger)
|
6
|
+
[](https://codeclimate.com/github/mrzasa/call_logger/maintainability)
|
7
|
+
|
5
8
|
```
|
6
9
|
class Calculator
|
7
10
|
include CallLogger
|
@@ -22,7 +25,7 @@ end
|
|
22
25
|
Calculator.new.times(3,4)
|
23
26
|
# Calculator#times(3, 4)
|
24
27
|
# Calculator#times => 6
|
25
|
-
# =>
|
28
|
+
# => 6
|
26
29
|
|
27
30
|
Calculator.new.div(3,0)
|
28
31
|
# Calculator#div(3, 0)
|
@@ -127,6 +130,39 @@ class Calculator
|
|
127
130
|
end
|
128
131
|
```
|
129
132
|
|
133
|
+
### Wrapping a block
|
134
|
+
|
135
|
+
You can wrap a block of code using `#log_block` (in instance methods) or `.log_block` (in class methods). Block parameters will not be logged though:
|
136
|
+
|
137
|
+
```
|
138
|
+
class Calculator
|
139
|
+
include CallLogger
|
140
|
+
|
141
|
+
def times(a, b)
|
142
|
+
log_block('multiply')
|
143
|
+
a*b
|
144
|
+
end
|
145
|
+
end
|
146
|
+
end
|
147
|
+
|
148
|
+
Calculator.new.times(3,4)
|
149
|
+
# multiply
|
150
|
+
# multiply => 6
|
151
|
+
# => 6
|
152
|
+
```
|
153
|
+
|
154
|
+
Block calls may be also logged without including `CallLogger` module with `CallLogger.log_block`:
|
155
|
+
|
156
|
+
```
|
157
|
+
log_block('multiply')
|
158
|
+
a*b
|
159
|
+
end
|
160
|
+
Calculator.new.times(3,4)
|
161
|
+
# multiply
|
162
|
+
# multiply => 6
|
163
|
+
# => 6
|
164
|
+
```
|
165
|
+
|
130
166
|
### Configuration
|
131
167
|
|
132
168
|
There are two pluggable components: `Logger` and `Formatter`. `Formatter` preperes messages to be printed and `Logger` sents them to the
|
@@ -148,8 +184,8 @@ end
|
|
148
184
|
## TODO
|
149
185
|
|
150
186
|
* [+] class methods
|
151
|
-
* [] multiple method names
|
152
|
-
* [] handle blocks
|
187
|
+
* [+] multiple method names
|
188
|
+
* [+] handle blocks
|
153
189
|
* [] logging all methods defined in the class
|
154
190
|
* [] doc: Rails integration
|
155
191
|
* [] doc: API docs
|
@@ -0,0 +1,20 @@
|
|
1
|
+
module CallLogger
|
2
|
+
class CallWrapper
|
3
|
+
attr_reader :formatter, :logger
|
4
|
+
|
5
|
+
def initialize(formatter:, logger: )
|
6
|
+
@formatter = formatter
|
7
|
+
@logger = logger
|
8
|
+
end
|
9
|
+
|
10
|
+
def call(name, args)
|
11
|
+
logger.call(formatter.before(name, args))
|
12
|
+
result = yield
|
13
|
+
logger.call(formatter.after(name, result))
|
14
|
+
result
|
15
|
+
rescue StandardError => e
|
16
|
+
logger.call(formatter.error(name, e))
|
17
|
+
raise
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
@@ -1,20 +1,49 @@
|
|
1
1
|
module CallLogger
|
2
2
|
class MethodWrapper
|
3
|
-
attr_reader :
|
3
|
+
attr_reader :extended_class, :owner_class
|
4
4
|
|
5
|
-
def initialize(
|
6
|
-
@
|
7
|
-
@
|
5
|
+
def initialize(extended_class, owner_class)
|
6
|
+
@extended_class = extended_class
|
7
|
+
@owner_class = owner_class
|
8
8
|
end
|
9
9
|
|
10
|
-
def
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
10
|
+
def wrap_single(method)
|
11
|
+
owner = @owner_class
|
12
|
+
sep = separator
|
13
|
+
extended_class.alias_method "#{method}_without_log", method
|
14
|
+
extended_class.define_method method do |*args|
|
15
|
+
owner.do_log("#{owner}#{sep}#{method}", args) do
|
16
|
+
send("#{method}_without_log", *args)
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
def wrap_multiple(methods)
|
22
|
+
extended_class.prepend(build_module(methods))
|
23
|
+
end
|
24
|
+
|
25
|
+
private
|
26
|
+
|
27
|
+
def separator
|
28
|
+
if extended_class.singleton_class?
|
29
|
+
'.'
|
30
|
+
else
|
31
|
+
'#'
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
def build_module(methods)
|
36
|
+
owner = @owner_class
|
37
|
+
sep = separator
|
38
|
+
Module.new do
|
39
|
+
methods.each do |method|
|
40
|
+
define_method method do |*args|
|
41
|
+
owner.do_log("#{owner}#{sep}#{method}", args) do
|
42
|
+
super(*args)
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
18
47
|
end
|
19
48
|
end
|
20
49
|
end
|
data/lib/call_logger/version.rb
CHANGED
data/lib/call_logger.rb
CHANGED
@@ -3,8 +3,8 @@ require "call_logger/version"
|
|
3
3
|
require 'call_logger/formatter'
|
4
4
|
require 'call_logger/logger'
|
5
5
|
require 'call_logger/configuration'
|
6
|
+
require 'call_logger/call_wrapper'
|
6
7
|
require 'call_logger/method_wrapper'
|
7
|
-
require 'call_logger/method_wrapper_builder'
|
8
8
|
|
9
9
|
module CallLogger
|
10
10
|
def self.included(base)
|
@@ -21,6 +21,18 @@ module CallLogger
|
|
21
21
|
end
|
22
22
|
configure # set defaults
|
23
23
|
|
24
|
+
def log_block(name, &block)
|
25
|
+
self.class.log_block(name, &block)
|
26
|
+
end
|
27
|
+
|
28
|
+
def self.log_block(name, &block)
|
29
|
+
logger = configuration.logger
|
30
|
+
formatter = configuration.formatter
|
31
|
+
call_wrapper = CallWrapper.new(
|
32
|
+
logger: logger, formatter: formatter
|
33
|
+
)
|
34
|
+
call_wrapper.call(name, [], &block)
|
35
|
+
end
|
24
36
|
|
25
37
|
module ClassMethods
|
26
38
|
def log(*methods)
|
@@ -31,22 +43,26 @@ module CallLogger
|
|
31
43
|
wrap_log(singleton_class, methods)
|
32
44
|
end
|
33
45
|
|
46
|
+
def log_block(name, &block)
|
47
|
+
do_log(name, [], &block)
|
48
|
+
end
|
49
|
+
|
34
50
|
def wrap_log(owner, methods)
|
35
|
-
|
51
|
+
wrapper = MethodWrapper.new(owner, self)
|
36
52
|
if methods.size == 1 && owner.respond_to?(methods.first)
|
37
|
-
|
53
|
+
wrapper.wrap_single(methods.first)
|
38
54
|
else
|
39
|
-
|
55
|
+
wrapper.wrap_multiple(methods)
|
40
56
|
end
|
41
57
|
end
|
42
58
|
|
43
|
-
def do_log(
|
59
|
+
def do_log(name, args, &block)
|
44
60
|
logger = ::CallLogger.configuration.logger
|
45
61
|
formatter = ::CallLogger.configuration.formatter
|
46
|
-
|
62
|
+
call_wrapper = CallWrapper.new(
|
47
63
|
logger: logger, formatter: formatter
|
48
64
|
)
|
49
|
-
|
65
|
+
call_wrapper.call(name, args, &block)
|
50
66
|
end
|
51
67
|
end
|
52
68
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: call_logger
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.5.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Maciej Rzasa
|
@@ -99,11 +99,11 @@ files:
|
|
99
99
|
- bin/setup
|
100
100
|
- call_logger.gemspec
|
101
101
|
- lib/call_logger.rb
|
102
|
+
- lib/call_logger/call_wrapper.rb
|
102
103
|
- lib/call_logger/configuration.rb
|
103
104
|
- lib/call_logger/formatter.rb
|
104
105
|
- lib/call_logger/logger.rb
|
105
106
|
- lib/call_logger/method_wrapper.rb
|
106
|
-
- lib/call_logger/method_wrapper_builder.rb
|
107
107
|
- lib/call_logger/version.rb
|
108
108
|
homepage: https://github.com/mrzasa/call_logger
|
109
109
|
licenses:
|
@@ -1,49 +0,0 @@
|
|
1
|
-
module CallLogger
|
2
|
-
class MethodWrapperBuilder
|
3
|
-
attr_reader :extended_class, :owner_class
|
4
|
-
|
5
|
-
def initialize(extended_class, owner_class)
|
6
|
-
@extended_class = extended_class
|
7
|
-
@owner_class = owner_class
|
8
|
-
end
|
9
|
-
|
10
|
-
def wrap_single(method)
|
11
|
-
owner = @owner_class
|
12
|
-
sep = separator
|
13
|
-
extended_class.alias_method "#{method}_without_log", method
|
14
|
-
extended_class.define_method method do |*args|
|
15
|
-
owner.do_log("#{owner}#{sep}#{method}", args) do
|
16
|
-
send("#{method}_without_log", *args)
|
17
|
-
end
|
18
|
-
end
|
19
|
-
end
|
20
|
-
|
21
|
-
def wrap_multi(methods)
|
22
|
-
extended_class.prepend(build_module(methods))
|
23
|
-
end
|
24
|
-
|
25
|
-
private
|
26
|
-
|
27
|
-
def separator
|
28
|
-
if extended_class.singleton_class?
|
29
|
-
'.'
|
30
|
-
else
|
31
|
-
'#'
|
32
|
-
end
|
33
|
-
end
|
34
|
-
|
35
|
-
def build_module(methods)
|
36
|
-
owner = @owner_class
|
37
|
-
sep = separator
|
38
|
-
Module.new do
|
39
|
-
methods.each do |method|
|
40
|
-
define_method method do |*args|
|
41
|
-
owner.do_log("#{owner}#{sep}#{method}", args) do
|
42
|
-
super(*args)
|
43
|
-
end
|
44
|
-
end
|
45
|
-
end
|
46
|
-
end
|
47
|
-
end
|
48
|
-
end
|
49
|
-
end
|