tracy 0.0.1
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 +7 -0
- data/README.md +40 -0
- data/Rakefile +5 -0
- data/bin/callsites +45 -0
- data/lib/tracy.rb +31 -0
- metadata +90 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: fd60e31e3f6e8541482229b04bce7fe5965113e0
|
4
|
+
data.tar.gz: a395a7a7db2b9a6514a3c2ef2f07a7d91ce0b562
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 3c0f8b853662f0a1c9bd886bd7ab4895d2b61a072baf29868628fbd8ac1e2a9c0a150709e764b973ca2a767821dc759173b918ba4ab77e98df3cf0666a5e5b05
|
7
|
+
data.tar.gz: a716884b8a957751392dd7503e8b27f707a5d861e108041157106362b4136594532ad5fa978324756c8c14081017ddfe980d7fe736b346576af3532c2fe23e0e
|
data/README.md
ADDED
@@ -0,0 +1,40 @@
|
|
1
|
+
# Fun with tracing
|
2
|
+
|
3
|
+
A set of experiments to investigate the possibility of using tracing
|
4
|
+
information gathered during, e.g., the running of a test suite to aid in
|
5
|
+
refactoring.
|
6
|
+
|
7
|
+
If the gem is not installed, you should run the commands listed below using
|
8
|
+
`bundle exec`.
|
9
|
+
|
10
|
+
## Gathering caller info
|
11
|
+
|
12
|
+
Running `ruby experiment.rb` will generate `callsite-info.yml` containing a
|
13
|
+
list of callers for each method in `experiment.rb`.
|
14
|
+
|
15
|
+
## Showing caller info
|
16
|
+
|
17
|
+
The `callsites` script simply fetches info from `callsites-info.yml`. The
|
18
|
+
following will display callers of the method defined on line 7 of
|
19
|
+
`experiment.rb`:
|
20
|
+
|
21
|
+
callsites experiment.rb:7
|
22
|
+
|
23
|
+
Alternatively, you can fetch call sites for a method by name like so:
|
24
|
+
|
25
|
+
callsites Foo#baz
|
26
|
+
|
27
|
+
## Renaming methods
|
28
|
+
|
29
|
+
The `rename-method.rb` script performs a simple informed method renaming. It
|
30
|
+
will only rename methods on the caller locations found in `callsites-info.yml`.
|
31
|
+
|
32
|
+
Because this script currently does a simple string replace on the listed lines,
|
33
|
+
it could get confused if the method name occurs more than once on the same
|
34
|
+
line. Therefore, it aborts if this happens, rather than accidentally renaming
|
35
|
+
the wrong thing.
|
36
|
+
|
37
|
+
The following example will rename the method `Foo#baz`, but not `OtherFoo#baz`:
|
38
|
+
|
39
|
+
ruby rename-method.rb experiment.rb:17 baz foodeldoo
|
40
|
+
|
data/Rakefile
ADDED
data/bin/callsites
ADDED
@@ -0,0 +1,45 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
require 'yaml'
|
3
|
+
|
4
|
+
Location = Struct.new(:method_name, :class_name, :line, :file) do
|
5
|
+
def match(other)
|
6
|
+
(other.method_name.nil? || other.method_name == method_name) &&
|
7
|
+
(other.class_name.nil? || other.class_name == class_name) &&
|
8
|
+
(other.line.nil? || other.line == line) &&
|
9
|
+
(other.file.nil? || other.file == file)
|
10
|
+
end
|
11
|
+
|
12
|
+
def pretty_print
|
13
|
+
if method_name
|
14
|
+
name = "#{class_name}##{method_name}"
|
15
|
+
else
|
16
|
+
name = '<main>'
|
17
|
+
end
|
18
|
+
"#{name} at #{file}:#{line}"
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
location = ARGV[0]
|
23
|
+
if location =~ /:/
|
24
|
+
file, line = location.split ':'
|
25
|
+
line = line.to_i
|
26
|
+
else
|
27
|
+
class_name, method_name = location.split '#'
|
28
|
+
method_name = method_name.to_sym
|
29
|
+
end
|
30
|
+
|
31
|
+
target_location = Location.new(method_name, class_name, line, file)
|
32
|
+
|
33
|
+
location_data = YAML.load(File.read('callsite-info.yml'))
|
34
|
+
|
35
|
+
selection = location_data.select do |key, callers|
|
36
|
+
loc = Location.new(*key)
|
37
|
+
loc.match(target_location)
|
38
|
+
end
|
39
|
+
|
40
|
+
selection.each do |key, callers|
|
41
|
+
puts "#{Location.new(*key).pretty_print} is called by"
|
42
|
+
callers.each do |call_site|
|
43
|
+
puts " #{Location.new(*call_site).pretty_print}"
|
44
|
+
end
|
45
|
+
end
|
data/lib/tracy.rb
ADDED
@@ -0,0 +1,31 @@
|
|
1
|
+
require 'yaml'
|
2
|
+
|
3
|
+
class Tracy
|
4
|
+
def initialize
|
5
|
+
@callers = Hash.new { |hash, key| hash[key] = [] }
|
6
|
+
@trace = TracePoint.new(:call, :line) do |tp|
|
7
|
+
case tp.event
|
8
|
+
when :call
|
9
|
+
@callers[data_array(tp)].push @current_location
|
10
|
+
when :line
|
11
|
+
@current_location = data_array(tp)
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
def start
|
17
|
+
@trace.enable
|
18
|
+
end
|
19
|
+
|
20
|
+
def done
|
21
|
+
@trace.disable
|
22
|
+
IO.write('callsite-info.yml', YAML.dump(@callers))
|
23
|
+
end
|
24
|
+
|
25
|
+
private
|
26
|
+
|
27
|
+
def data_array(trace_point)
|
28
|
+
klass = trace_point.defined_class
|
29
|
+
[trace_point.method_id, klass ? klass.name : '', trace_point.lineno, trace_point.path]
|
30
|
+
end
|
31
|
+
end
|
metadata
ADDED
@@ -0,0 +1,90 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: tracy
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.1
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Matijs van Zuijlen
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2016-01-23 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: rake
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - "~>"
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '10.3'
|
20
|
+
type: :development
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - "~>"
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '10.3'
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: aruba
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - "~>"
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: 0.10.2
|
34
|
+
type: :development
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - "~>"
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: 0.10.2
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: cucumber
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - "~>"
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: '2.0'
|
48
|
+
type: :development
|
49
|
+
prerelease: false
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - "~>"
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: '2.0'
|
55
|
+
description:
|
56
|
+
email: matijs@matijs.net
|
57
|
+
executables:
|
58
|
+
- callsites
|
59
|
+
extensions: []
|
60
|
+
extra_rdoc_files: []
|
61
|
+
files:
|
62
|
+
- README.md
|
63
|
+
- Rakefile
|
64
|
+
- bin/callsites
|
65
|
+
- lib/tracy.rb
|
66
|
+
homepage: http://www.matijs.net
|
67
|
+
licenses: []
|
68
|
+
metadata: {}
|
69
|
+
post_install_message:
|
70
|
+
rdoc_options: []
|
71
|
+
require_paths:
|
72
|
+
- lib
|
73
|
+
- lib
|
74
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
75
|
+
requirements:
|
76
|
+
- - ">="
|
77
|
+
- !ruby/object:Gem::Version
|
78
|
+
version: '0'
|
79
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
80
|
+
requirements:
|
81
|
+
- - ">="
|
82
|
+
- !ruby/object:Gem::Version
|
83
|
+
version: '0'
|
84
|
+
requirements: []
|
85
|
+
rubyforge_project:
|
86
|
+
rubygems_version: 2.4.5.1
|
87
|
+
signing_key:
|
88
|
+
specification_version: 4
|
89
|
+
summary: Fun with tracing
|
90
|
+
test_files: []
|