pretty_debug 0.1.2 → 0.1.3

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.
Files changed (3) hide show
  1. checksums.yaml +4 -4
  2. data/lib/pretty_debug.rb +42 -183
  3. metadata +2 -2
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 51103fc126497b1d9c41ee408db9dff752a4ec2b
4
- data.tar.gz: edf7ffac17899f563307fe54383d50954bb6d7b3
3
+ metadata.gz: 04efe0cf9dba9901b76596d083e6e2d7bcaedefe
4
+ data.tar.gz: 161511fa41ee80e11bbcf24d2b04449a972ad0c2
5
5
  SHA512:
6
- metadata.gz: 835c7e7c4209ee1851eac0a18ef04c11a2375051353bab015d3995536d3747402e7f292e438c970588cd8f842b540999b5841f44511dc8206a5c449b41ad73ca
7
- data.tar.gz: d20a4b0fdf35811c190c3ecbe44448f9031b8de226add2f203e4d95c33ffb3033b4893193e9616d146d94c652fbebee8267a6e4c0fd33495b6f19cd1712fb25c
6
+ metadata.gz: 49766af15d06ede86a35499730605b8dd5c618c62a2f44cf3657950a96c6a6eaf44bda77f52bd2fe3dbdd20b66a2a141d301c3a6adbe69cc0d2bc779be2dfedf
7
+ data.tar.gz: a2e8df34f7e48cb2bafe0ac02c6d1f9e1c73c4823a37a4cd4a5f0d131e58a7e63b5c1425c0442a3a01b46baf5d47da7f75773ed571c27362a54b2a54a4067c47
data/lib/pretty_debug.rb CHANGED
@@ -1,6 +1,5 @@
1
1
  #!ruby
2
2
  require "string"
3
- require "ruby-prof"
4
3
  require "utility"
5
4
 
6
5
  module Kernel
@@ -16,132 +15,42 @@ module Kernel
16
15
  end
17
16
  end
18
17
 
19
- class ValidationError < Exception; end
20
-
21
- class Object
22
- def expect s; raise ArgumentError.new("Expecting `#{s.inspect}`: #{inspect}") end
23
- def case? *kases; kases.any?{|kase| kase === self} end
24
- end
25
-
26
- class Module
27
- def basename; to_s.split("::").last end
28
- end
29
-
30
- class Array
31
- def compatible? other
32
- other.case?(Array) and
33
- other.length == length
34
- end
35
- end
36
-
37
- class Hash
38
- def compatible? other
39
- other.case?(Hash) and
40
- other.size == size and
41
- other.keys.all?{|k| key?(k)}
42
- end
43
- def ltsv *args
44
- if args.empty? then
45
- map{|k, v| "#{k}:#{v.to_s.tr("\t", " ")}"} else
46
- args.map{|k| "#{k}:#{self[k].to_s.tr("\t", " ")}"}
47
- end.join("\t")
48
- end
49
- end
50
- class String
51
- def parse_ltsv; Hash[chomp.split("\t").map{|f| f.split(":", 2)}] end
52
- end
53
-
54
18
  class PrettyDebug
55
19
  attr_accessor :backtrace, :message
56
20
  def self.new_internal
57
21
  new.tap do |error|
58
- called_location = clean(caller)[2]
22
+ called_location = clean(caller_locations)[2]
59
23
  error.backtrace = clean($@).take_while{|a| a != called_location}
60
24
  error.message = $!.message
61
25
  end
62
26
  end
63
- Stackline = /\A(?'f'.+?):(?'l'\d+)(?::in `(?'m'.*)'|(?'m'.*))?\z/m
64
- NoncallLine = /\Ablock(?: \(\d+ levels\))? in |\A\</
65
27
  def self.message; $!.message.dup.tap{|s| s[0] = s[0].upcase}.sub(/(?<=[^.])\z/, ".") end
66
28
  def self.clean stack
67
- raise "Cannot parse. No backtrace given" unless stack
68
- return [] if stack.empty?
69
- caller_file_i = $LOADED_FEATURES.index(caller.first.match(Stackline)[:f]).to_i
29
+ return [] if stack.to_a.empty?
30
+ caller_file_i = $LOADED_FEATURES.index(caller_location(0).path).to_i
70
31
  stack
71
- .map{|l| m = l.match(Stackline); [m[:f].ellipsis(55), m[:l].to_i, m[:m]]}
32
+ .map{|l| [l.path.ellipsis(55), l.lineno, l.base_label]}
72
33
  .transpose.tap do |_, _, m|
73
34
  m.rotate!(-1)
74
35
  m[0] = ""
75
36
  while i = m.index{|m| m == "method_missing"}; m[i] = m[i - 1] end
76
37
  end.transpose
77
- .reject{|_, _, m| m =~ NoncallLine}
78
38
  # .reject{|f, _, _| $LOADED_FEATURES.include?(f)}
79
39
  # .reject{|f, _, _| $LOADED_FEATURES.index(f).to_i > caller_file_i}
80
40
  end
81
41
  end
82
42
 
83
- #############################################
84
- # Terminal formatting
85
- #############################################
86
-
87
- class String
88
- def terminal_escape; "\"#{self}\"" end
89
- def color sym; "#{vt100(30+
90
- {black: 0, red: 1, green: 2, yellow: 3, blue: 4, magenta: 5, cyan: 6, white: 7}[sym]
91
- )}#{self}#{vt100}" end
92
- def bg sym; "#{vt100(40+
93
- {black: 0, red: 1, green: 2, yellow: 3, blue: 4, magenta: 5, cyan: 6, white: 7}[sym]
94
- )}#{self}#{vt100}" end
95
- def bf; "#{vt100("01")}#{self}#{vt100}" end
96
-
97
- private
98
- def vt100 s = ""; "\e[#{s}m" end
99
- end
100
-
101
- class Object
102
- def intercept &pr
103
- tap{|x| puts "[Debug] #{caller[2][/.*?:\d+/]}:".color(:yellow); pr ? pr.call(x) : p(x)}
104
- end
105
- def forwardtrace sym
106
- tap{puts "#{inspect}##{sym} defined at:", method(sym).source_location.join(":")}
107
- end
108
- def follow m; tap{puts "Next step: #{method(m).source_location
109
- .chain{|a| a ? a.join(":") : "Unknown #{self}.#{m}"}
110
- }"} end
111
- def _?; tap{Test.testee.push(self)} end
112
- end
113
-
114
- =begin
115
- class Module
116
- def inspect
117
- ans = ancestors.map{|m| "#{m.class.send(:to_s).downcase} #{m}"}.join(" < ")
118
- var = (class_variables + instance_variables).join(", ")
119
- var.empty? ? ans : "#{ans}#$/#{var}"
120
- end
121
- end
122
- =end
123
-
124
43
  class Proc
125
- def source_location
126
- to_s.match(/\A\#\<#{self.class}:.+?@(.+)\:(\d+)(?: \(lambda\))?\>\z/).values_at(1, 2)
44
+ def inspect; f, l = source_location; "Proc@#{File.basename(f)}:#{l}"
45
+ rescue; "Proc@source_unknown"
127
46
  end
128
- def inspect
129
- f, l = source_location
130
- "Proc@#{File.basename(f)}:#{l}"
131
- rescue
132
- "Proc@source_unknown"
133
- end
134
- end
135
-
136
- class Method
137
- def inspect; to_s end
138
- def to_s; "#{receiver}.#{name}" end
139
47
  end
48
+ class Method; def inspect; "#{receiver}.#{name}" end end
49
+ class UnboundMethod; def inspect; "#{owner}##{name}" end end
140
50
 
141
- class UnboundMethod
142
- def inspect; to_s end
143
- def to_s; "#{owner}##{name}" end
144
- end
51
+ #############################################
52
+ # Terminal
53
+ #############################################
145
54
 
146
55
  class Array
147
56
  def inspect
@@ -149,25 +58,12 @@ class Array
149
58
  .chain{|s| length < 2 ? "[#{s.join}]" : "[#$/#{s.join(",#$/").indent}#$/]"}
150
59
  end
151
60
  def align ellipsis_limit = nil
152
- transpose
153
- .map do |col|
61
+ transpose.map do |col|
154
62
  just = case col.first; when Numeric then :rjust; else :ljust end
155
63
  width = col.map{|cell| cell.to_s.length}.max
156
64
  max = ellipsis_limit || width
157
65
  col.map{|cell| cell.to_s.ellipsis(max).send(just, width.at_most(max))}
158
- end
159
- .transpose
160
- =begin
161
- col_widths = transpose.map{|col| col.map{|cell| cell.to_s.length}.max}
162
- map{|row| [row, col_widths].transpose.map{|cell, l|
163
- max = ellipsis_limit || l
164
- l = l.at_most(max)
165
- case cell
166
- when Numeric then cell.to_s.ellipsis(max).rjust(l)
167
- else cell.to_s.ellipsis(max).ljust(l)
168
- end
169
- }.join(sep)}
170
- =end
66
+ end.transpose
171
67
  end
172
68
  end
173
69
 
@@ -182,79 +78,42 @@ class Hash
182
78
  end
183
79
  end
184
80
 
185
- module Test
186
- def self.testee; @@testee end
187
- def self.raise? exception = Exception, &pr
188
- pr.call; false
189
- rescue Exception => e
190
- e.kind_of?(exception)
191
- end
192
- def self.testee_clear; @@testee = [] end
193
- def self.testee_refer; @@testee end
194
- def self.test title = "Test", &pr
195
- testee_clear
196
- t = Time.now
197
- if pr.call == true
198
- puts "#{title}. Succeeded (#{"%.2e" % t.till_now} secs)".color(:green)
199
- else
200
- puts "#{title}. Failed".color(:red),
201
- *(testee_refer.map{|o| o.inspect.color(:red)} unless testee_refer.empty?)
81
+ class Object
82
+ def intercept &pr
83
+ tap do |x| puts \
84
+ "[Debug] #{caller_location(2).chain{|l| "#{l.basename}:#{l.lineno}"}}"
85
+ .color(:yellow),
86
+ x.inspect
202
87
  end
203
- rescue Exception
204
- puts "#{title} ... Test Error".color(:red),
205
- [$!.message, *PrettyDebug.clean($@).align.map{|row| row.join(":")}].map{|l| l.color(:red)}
206
88
  end
207
89
  end
208
90
 
209
- module Kernel
210
- def test *args, &pr; Test.test(*args, &pr) end
211
- def raise? *args, &pr; Test.raise?(*args, &pr) end
212
- def timer
213
- t = Time.now
214
- yield
215
- puts "(#{"%.2e" % t.till_now} secs)".color(:green)
216
- end
217
- end
91
+ class String
92
+ def terminal_escape; "\"#{self}\"" end
93
+ def color sym; "#{vt100(30+
94
+ {black: 0, red: 1, green: 2, yellow: 3, blue: 4, magenta: 5, cyan: 6, white: 7}[sym]
95
+ )}#{self}#{vt100}" end
96
+ def bg sym; "#{vt100(40+
97
+ {black: 0, red: 1, green: 2, yellow: 3, blue: 4, magenta: 5, cyan: 6, white: 7}[sym]
98
+ )}#{self}#{vt100}" end
99
+ def bf; "#{vt100("01")}#{self}#{vt100}" end
218
100
 
219
- =begin
220
- module Kernel
221
- def benchmark i, &pr
222
- Benchmark.prs = []
223
- pr.call()
224
- Benchmark.bm(i){|br| Benchmark.prs.each{|pr| br.report(""){pr.call()}}}
225
- end
226
- def alternative &pr; Benchmark.prs.push(pr) end
101
+ private
102
+ def vt100 s = ""; "\e[#{s}m" end
227
103
  end
228
104
 
229
- require "benchmark"
230
- Benchmark.singleton_class.class_eval{attr_accessor :prs}
231
- =end
232
-
233
-
234
- =begin
235
- require "ruby-prof"
236
- $prof_begin = false
237
- def profile_on; $prof_begin = true; end
238
- def profile switch = nil
239
- yield if switch && $prof_begin.!
240
- RubyProf.resume{$prof_result = yield}
241
- open("/tmp/profile", "w"){|io|
242
- # RubyProf::CallStackPrinter. # for kcachegring
243
- RubyProf::GraphHtmlPrinter.
244
- # RubyProf::GraphPrinter.
245
- # RubyProf::AbstractPrinter.
246
- new(RubyProf.stop).print(io)}
247
- # IO.popen("kcachegrind /tmp/profile > #{File::NULL} 2>&1")
248
- # IO.popen("firefox >#{File::NULL} /tmp/profile ")
249
- IO.popen("google-chrome >#{File::NULL} /tmp/profile ")
250
- $prof_result
251
- end
105
+ #############################################
106
+ # LTSV
107
+ #############################################
252
108
 
253
- module Profiling
254
- def self.start; RubyProf.start end
255
- def self.stop
256
- result = RubyProf.stop
257
- RubyProf::FlatPrinter.new(result).print
109
+ class Hash
110
+ def ltsv *args
111
+ if args.empty? then
112
+ map{|k, v| "#{k}:#{v.to_s.tr("\t", " ")}"} else
113
+ args.map{|k| "#{k}:#{self[k].to_s.tr("\t", " ")}"}
114
+ end.join("\t")
258
115
  end
259
116
  end
260
- =end
117
+ class String
118
+ def parse_ltsv; Hash[chomp.split("\t").map{|f| f.split(":", 2)}] end
119
+ end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: pretty_debug
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.2
4
+ version: 0.1.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - sawa
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2013-08-09 00:00:00.000000000 Z
11
+ date: 2013-08-12 00:00:00.000000000 Z
12
12
  dependencies: []
13
13
  description: ''
14
14
  email: []