object_tracker 0.0.2 → 1.0.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 +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.
|