traceur 0.0.1 → 0.0.2

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.
data/README.md CHANGED
@@ -5,8 +5,8 @@ An experiment to have some fun with SVG and learn a little more
5
5
  about Ruby.
6
6
  If you want to get a visual for what is going on in your code you can
7
7
  pass in a regular expression like ".+" or "downthetube".
8
- Be specific otherwise you will end up with an SVG file so big
9
- that no program can open it.
8
+ Be specific otherwise you will end up with an SVG file so big
9
+ that no program can open it.
10
10
 
11
11
  Usage:
12
12
  ------
@@ -16,13 +16,10 @@ require 'rubygems'
16
16
  require 'traceur'
17
17
  require 'downthetube'
18
18
 
19
- Traceur.watch_paths("downthetube", ".")
20
19
 
21
- playlists = Youtube.playlists_for "stephensam"
22
- videos = playlists.last.videos
23
- puts videos.last.title
24
-
25
- Traceur.stop
20
+ Traceur.watch_paths("downthetube", "/home/mike/Desktop") do
21
+ Youtube.playlists_for "stephensam"
22
+ end
26
23
  ```
27
24
 
28
25
 
@@ -30,7 +27,7 @@ LICENSE:
30
27
 
31
28
  (The MIT License)
32
29
 
33
- Copyright © 2011 Mike Williamson
30
+ Copyright © 2013 Mike Williamson
34
31
 
35
32
 
36
33
  Permission is hereby granted, free of charge, to any person obtaining a copy of
@@ -1,20 +1,71 @@
1
1
  class Traceur
2
+
3
+ class NoBlockError < StandardError; end
2
4
  ##
3
5
  # The traceur class provides methods to trace the execution
4
- # of the Ruby interpreter and writes an SVG file into the
6
+ # of the Ruby interpreter and writes an SVG file into the
5
7
  # directory you choose.
6
8
  #
7
9
  @start_time = nil
8
- @svg_file = nil
10
+ @svg_file = nil
9
11
  @trace_points = []
10
12
  @x = 0
11
- @y = 0
13
+ @y = 100
14
+ @max_y = @y
12
15
  @footer = <<-EOSVG
13
- " style="fill:none;stroke:black;stroke-width:3" />
14
16
  </g>
15
17
  </svg>
16
18
  EOSVG
17
- @header = <<-EOXML
19
+
20
+ def self.watch_paths(expr, output_dir)
21
+ raise NoBlockError "You must call this method with a block" unless block_given?
22
+ block = Proc.new #this grabs the block
23
+
24
+ raise SystemCallError "Directory does not exist" unless Dir.exists?(output_dir)
25
+
26
+ labels = []
27
+ points = []
28
+ expression = Regexp.new expr
29
+ proc = Proc.new do |event, file, line, methodname, binding, classname|
30
+ if expression.match file
31
+ @start_time ||= Time.now.strftime("%s.%L").to_f
32
+ @x += 1
33
+ if event.to_s == "call"
34
+ points << " #{@x},#{@y}"
35
+ labels << ["#{classname}##{methodname}", [@x + 1, @y]]
36
+ @y += 10
37
+ @max_y = @y if @y > @max_y
38
+ points << " #{@x},#{@y}"
39
+ elsif event.to_s == "return"
40
+ points << " #{@x},#{@y}"
41
+ @y -= 10
42
+ points << " #{@x},#{@y}"
43
+ labels << ["#{classname}##{methodname}", [@x - 1, @y]]
44
+ end
45
+ end
46
+ end
47
+ Object.send(:set_trace_func, proc)
48
+ block.call
49
+ Object.send(:set_trace_func, nil)
50
+ write_svg points, labels, output_dir, {x: @x, y: @max_y}
51
+ end
52
+
53
+ private
54
+
55
+ def self.write_svg points, labels, directory, dimensions
56
+ filename = "trace_#{Time.now.strftime('%Y%m%d%H%M%S')}.svg"
57
+ @svg_file = File.open(File.join(directory, filename), 'w+')
58
+ @svg_file.write(header(dimensions))
59
+ @svg_file.write(polygon(points))
60
+ labels.each do |details|
61
+ @svg_file.write label(details)
62
+ end
63
+ @svg_file.write(@footer)
64
+ @svg_file.close
65
+ end
66
+
67
+ def self.header dimensions
68
+ header = <<-EOXML
18
69
  <?xml version="1.0" encoding="UTF-8" standalone="no"?>
19
70
  <!-- Created with Inkscape (http://www.inkscape.org/) -->
20
71
 
@@ -29,7 +80,9 @@ EOSVG
29
80
  id="svg2"
30
81
  version="1.1"
31
82
  inkscape:version="0.48.2 r9819"
32
- sodipodi:docname="drawing.svg">
83
+ sodipodi:docname="drawing.svg"
84
+ width="#{dimensions[:x]}"
85
+ height="#{dimensions[:y]}">
33
86
  <defs
34
87
  id="defs4" />
35
88
  <sodipodi:namedview
@@ -39,17 +92,15 @@ EOSVG
39
92
  borderopacity="1.0"
40
93
  inkscape:pageopacity="0.0"
41
94
  inkscape:pageshadow="2"
42
- inkscape:zoom="0.35"
43
- inkscape:cx="375"
44
- inkscape:cy="520"
95
+ inkscape:zoom="1"
45
96
  inkscape:document-units="px"
46
97
  inkscape:current-layer="layer1"
47
98
  showgrid="false"
48
- inkscape:window-width="1440"
49
- inkscape:window-height="876"
50
- inkscape:window-x="0"
51
- inkscape:window-y="24"
52
- inkscape:window-maximized="1" />
99
+ inkscape:window-maximized="1"
100
+ fit-margin-top="0"
101
+ fit-margin-left="0"
102
+ fit-margin-right="0"
103
+ fit-margin-bottom="0" />
53
104
  <metadata
54
105
  id="metadata7">
55
106
  <rdf:RDF>
@@ -64,40 +115,23 @@ EOSVG
64
115
  </metadata>
65
116
  <g inkscape:label="Layer 1"
66
117
  inkscape:groupmode="layer"
67
- id="layer1"><polyline points="0,0
118
+ id="layer1">
68
119
  EOXML
69
-
70
- def self.watch_paths(expr, output_dir)
71
-
72
- raise SystemCallError "Directory does not exist" unless Dir.exists?(output_dir)
73
-
74
- @svg_file = File.open(File.join(output_dir, "trace.svg"), 'w+')
75
- @svg_file.write(@header)
76
- expression = Regexp.new expr
77
- proc = Proc.new do |event, file, line, id, binding, classname|
78
- if expression.match file
79
- @start_time ||= Time.now.strftime("%s.%L").to_f
80
- @x += 1 unless ((@start_time - Time.now.strftime("%s.%L").to_f).abs <= 0.1)
81
- if event.to_s == "call"
82
- @svg_file.write " #{@x},#{@y}"
83
- @y += 10
84
- @svg_file.write " #{@x},#{@y}"
85
- elsif event.to_s == "return"
86
- @svg_file.write " #{@x},#{@y}"
87
- @y -= 10
88
- @svg_file.write " #{@x},#{@y}"
89
- end
90
- end
91
- end
92
- Object.send(:set_trace_func, proc)
93
120
  end
94
121
 
95
- def self.stop
96
- Object.send(:set_trace_func, nil)
97
-
98
- @svg_file.write(@footer)
122
+ def self.polygon points
123
+ "<polyline points=\"0,100#{ points.join }\" style=\"fill:none;stroke:black;stroke-width:1;opacity:0.5\" />"
124
+ end
99
125
 
100
- @svg_file.close
126
+ def self.label details
127
+ text =<<-EOTXT
128
+ <text style="font-size:1px;fill:#000000;stroke:none;font-family:Sans"
129
+ transform="rotate(90 #{details[1][0]},#{details[1][1]})"
130
+ x="#{details[1][0]}"
131
+ y="#{details[1][1]}"
132
+ id="text2988">#{details[0]}</text>
133
+ EOTXT
101
134
  end
135
+
102
136
  end
103
137
 
@@ -1,3 +1,3 @@
1
1
  module Traceur
2
- VERSION = "0.0.1"
2
+ VERSION = "0.0.2"
3
3
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: traceur
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.1
4
+ version: 0.0.2
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2011-12-14 00:00:00.000000000Z
12
+ date: 2013-03-21 00:00:00.000000000 Z
13
13
  dependencies: []
14
14
  description: ! ' An experimental library to trace method calls using SVG '
15
15
  email:
@@ -46,7 +46,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
46
46
  version: '0'
47
47
  requirements: []
48
48
  rubyforge_project: traceur
49
- rubygems_version: 1.8.10
49
+ rubygems_version: 1.8.24
50
50
  signing_key:
51
51
  specification_version: 3
52
52
  summary: Tracing method calls with SVG