object_tracker 0.0.2 → 1.0.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +28 -4
- data/lib/object_tracker.rb +98 -15
- data/lib/object_tracker/version.rb +1 -1
- metadata +3 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: b64ab16d9d0b0d15225d24cf7121afb3061e88e8
|
4
|
+
data.tar.gz: 740e4ee7f4eacbbeba0c36211f4c3e032b505d1f
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: c1efef10178e161cb122b2c9a21dd4cf283251551100679c3017553dfefd66387558c3e54a3ff9d8ad64c32a9ffe52ba94a4bf2f1ec5c07766e9f1d4d894d9f7
|
7
|
+
data.tar.gz: 94ece458adbd7320c1d72b2c1f161d149179055dae3f8780baefe15262181b355c1afefb71b901d81cdc22df68510e70800b405961bea26601df63cf4350e17b
|
data/README.md
CHANGED
@@ -31,17 +31,41 @@ end
|
|
31
31
|
|
32
32
|
Dog.track_all!
|
33
33
|
Dog
|
34
|
-
|
34
|
+
* called "inspect" [RUBY CORE]
|
35
|
+
#=> Dog
|
35
36
|
Dog.new.fetch('Hudog')
|
36
|
-
|
37
|
-
|
37
|
+
* called "new" [RUBY CORE]
|
38
|
+
* called "fetch" with Hudog [(irb):4]
|
38
39
|
#=> Fetch the ball Hudog!
|
39
40
|
```
|
40
41
|
|
41
42
|
Or just track single method:
|
42
43
|
|
43
44
|
```ruby
|
44
|
-
Dog.track
|
45
|
+
Dog.track :name
|
46
|
+
```
|
47
|
+
|
48
|
+
Or track methods for a single object:
|
49
|
+
|
50
|
+
```ruby
|
51
|
+
class Go
|
52
|
+
def fish
|
53
|
+
'We go!'
|
54
|
+
end
|
55
|
+
end
|
56
|
+
|
57
|
+
a = Go.new
|
58
|
+
a.extend ObjectTracker
|
59
|
+
a.track_all!
|
60
|
+
```
|
61
|
+
|
62
|
+
## Troubleshooting
|
63
|
+
|
64
|
+
Having problems? Maybe a specific method is throwing some obscure error? Try ignoring that method, so we can get back on track!
|
65
|
+
|
66
|
+
```ruby
|
67
|
+
Dog.track_not :bad_doggy
|
68
|
+
Dog.track_all! #=> will exclude tracking for :bad_doggy
|
45
69
|
```
|
46
70
|
|
47
71
|
## Contributing
|
data/lib/object_tracker.rb
CHANGED
@@ -4,33 +4,57 @@ fail "ObjectTracker #{ObjectTracker::VERSION} only supports Ruby 2+" if RUBY_VER
|
|
4
4
|
|
5
5
|
module ObjectTracker
|
6
6
|
def track(*args)
|
7
|
-
|
8
|
-
|
7
|
+
args.each do |method_name|
|
8
|
+
next if tracking?(method_name) || track_reserved_methods.include?(method_name)
|
9
|
+
if respond_to?(method_name)
|
10
|
+
track!(method_name => track_with_source(self, method_name))
|
11
|
+
elsif respond_to?(:allocate)
|
12
|
+
inst = allocate
|
13
|
+
if inst.respond_to?(method_name)
|
14
|
+
track!(method_name => track_with_source(inst, method_name))
|
15
|
+
else
|
16
|
+
fail UntrackableMethod, method_name
|
17
|
+
end
|
18
|
+
else
|
19
|
+
fail UntrackableMethod, method_name
|
20
|
+
end
|
21
|
+
end
|
22
|
+
nil
|
9
23
|
end
|
10
24
|
|
11
|
-
def
|
12
|
-
|
13
|
-
start_tracking!
|
25
|
+
def tracking?(method_name)
|
26
|
+
tracking.keys.include?(method_name.to_sym)
|
14
27
|
end
|
15
28
|
|
16
|
-
def
|
17
|
-
|
29
|
+
def track_not(*args)
|
30
|
+
args.each do |method_name|
|
31
|
+
track_reserved_methods << method_name unless track_reserved_methods.include?(method_name)
|
32
|
+
end
|
33
|
+
nil
|
18
34
|
end
|
19
35
|
|
20
|
-
def
|
21
|
-
|
36
|
+
def track_all!
|
37
|
+
track_methods_for(self)
|
38
|
+
track_methods_for(allocate) if respond_to?(:allocate)
|
39
|
+
track!
|
22
40
|
end
|
23
41
|
|
24
|
-
|
42
|
+
#
|
43
|
+
# PRIVATE
|
44
|
+
#
|
45
|
+
|
46
|
+
def track!(method_names = nil)
|
25
47
|
mod = Module.new
|
26
|
-
|
48
|
+
Array(method_names || tracking).each do |method_name, source_def|
|
27
49
|
mod.module_eval <<-RUBY, __FILE__, __LINE__
|
28
50
|
def #{method_name}(*args, &block)
|
29
|
-
msg =
|
51
|
+
msg = %Q( * called "#{method_name}" )
|
30
52
|
msg << "with " << args.join(', ') << " " if args.any?
|
31
|
-
msg << "
|
53
|
+
msg << "[#{source_def}]"
|
32
54
|
puts msg
|
33
55
|
super
|
56
|
+
rescue NoMethodError => e
|
57
|
+
raise e if e.message !~ /no superclass/
|
34
58
|
end
|
35
59
|
RUBY
|
36
60
|
end
|
@@ -41,6 +65,65 @@ module ObjectTracker
|
|
41
65
|
end
|
42
66
|
RUBY
|
43
67
|
|
44
|
-
|
68
|
+
# Handle both instance and class level extension
|
69
|
+
if respond_to?(:prepend)
|
70
|
+
prepend(mod)
|
71
|
+
else
|
72
|
+
extend(mod)
|
73
|
+
end
|
74
|
+
end
|
75
|
+
|
76
|
+
def track_methods_for(obj)
|
77
|
+
(obj.methods - track_reserved_methods).each do |method_name|
|
78
|
+
track_with_source(obj, method_name)
|
79
|
+
end
|
80
|
+
end
|
81
|
+
|
82
|
+
def track_with_source(obj, method_name)
|
83
|
+
source = obj.method(method_name).source_location || ['RUBY CORE']
|
84
|
+
tracking[method_name.to_sym] = source.join(':').split('/').last(5).join('/')
|
85
|
+
end
|
86
|
+
|
87
|
+
def tracking
|
88
|
+
@__tracking ||= {}
|
89
|
+
end
|
90
|
+
|
91
|
+
def track_reserved_methods
|
92
|
+
@__reserved_methods ||= [
|
93
|
+
:!,
|
94
|
+
:!=,
|
95
|
+
:!~,
|
96
|
+
:<,
|
97
|
+
:<=,
|
98
|
+
:<=>,
|
99
|
+
:==,
|
100
|
+
:===,
|
101
|
+
:=~,
|
102
|
+
:>,
|
103
|
+
:>=,
|
104
|
+
:[],
|
105
|
+
:[]=,
|
106
|
+
:__id__,
|
107
|
+
:__send__,
|
108
|
+
:`,
|
109
|
+
:public_send,
|
110
|
+
:send,
|
111
|
+
:class,
|
112
|
+
:track,
|
113
|
+
:tracking?,
|
114
|
+
:track_not,
|
115
|
+
:track_all!,
|
116
|
+
:track!,
|
117
|
+
:track_methods_for,
|
118
|
+
:track_with_source,
|
119
|
+
:tracking,
|
120
|
+
:track_reserved_methods
|
121
|
+
]
|
122
|
+
end
|
123
|
+
|
124
|
+
class UntrackableMethod < StandardError
|
125
|
+
def initialize(method_name)
|
126
|
+
super "Can't track :#{method_name} because it's not defined on this class or it's instance"
|
127
|
+
end
|
45
128
|
end
|
46
|
-
end
|
129
|
+
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: object_tracker
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0
|
4
|
+
version: 1.0.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: 2015-
|
11
|
+
date: 2015-03-09 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -74,7 +74,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
74
74
|
version: '0'
|
75
75
|
requirements: []
|
76
76
|
rubyforge_project:
|
77
|
-
rubygems_version: 2.
|
77
|
+
rubygems_version: 2.2.2
|
78
78
|
signing_key:
|
79
79
|
specification_version: 4
|
80
80
|
summary: Track method calls to any object.
|