dexc 0.0.3 → 0.1.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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
- SHA1:
3
- metadata.gz: fa1312aa4c3a44113ff7fecaa6e2e1fc38e1a389
4
- data.tar.gz: 6aad9ecdde10db98b53618eecee06fa071e8d238
2
+ SHA256:
3
+ metadata.gz: d0a30f2b433ef0df84fb07b87731dd3b3c6cd63fa7d972f09915b53c3a0b9179
4
+ data.tar.gz: 52cfcbf75dd76eedee0748e831be63cbfe9cf07a404feea207346fe0772b4abe
5
5
  SHA512:
6
- metadata.gz: cc5a2f85d36d611efae7d6d133664fd5d1ea8bab46068a22b59ffdc3dfe8b3e2a64a72f46b896f1833abc77226f6541706915c919940de9fcad43f1adff4c4a7
7
- data.tar.gz: e99d13437da5c18ec260b516ccd00c4239bdab5f255d1f5f83181fd35a9d261faea915cdf801f6b73e9b0165048015af5f95b9611491844d50df39504624380e
6
+ metadata.gz: c4f4ed54edde6d05892ec6957faa2d44e0d4f3746d140b37082ea18efbc2a3d0a71d7d561ed9aa692249bc2830405f10a081e6d0401af44aec57937aadaaa265
7
+ data.tar.gz: 5781ce31f628d3d1a6d6bb7f66c902dd8f82e5b96b34656d27fcbf9ad6c439e5b6fedd95444405937d9a189e0a6427744bb1c873cfd012ea30a70bc86c436939
data/BSDL CHANGED
@@ -1,4 +1,4 @@
1
- Copyright (C) 2013-2016 Kazuki Tsujimoto, All rights reserved.
1
+ Copyright (C) 2013 Kazuki Tsujimoto, All rights reserved.
2
2
  Copyright (C) 1993-2013 Yukihiro Matsumoto. All rights reserved. (lib/irb.rb)
3
3
 
4
4
  Redistribution and use in source and binary forms, with or without
data/COPYING CHANGED
@@ -1,4 +1,4 @@
1
- Copyright (C) 2013-2016 Kazuki Tsujimoto, All rights reserved.
1
+ Copyright (C) 2013 Kazuki Tsujimoto, All rights reserved.
2
2
  Copyright (C) 1993-2013 Yukihiro Matsumoto. All rights reserved. (lib/irb.rb)
3
3
 
4
4
  You can redistribute it and/or modify it under either the terms of the
data/dexc.gemspec CHANGED
@@ -14,6 +14,8 @@ Gem::Specification.new do |s|
14
14
  s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
15
15
  s.executables = `git ls-files -- bin/*`.split("\n").map{|f| File.basename(f) }
16
16
  s.require_paths = ['lib']
17
+ s.add_runtime_dependency 'irb'
18
+ s.add_runtime_dependency 'binding_of_caller'
17
19
  s.add_development_dependency 'rake'
18
20
  s.add_development_dependency 'test-unit'
19
21
  s.extra_rdoc_files = ['README.rdoc']
data/lib/dexc.rb CHANGED
@@ -1,13 +1,16 @@
1
1
  # dexc.rb
2
2
  #
3
- # Copyright (C) 2013-2016 Kazuki Tsujimoto, All rights reserved.
3
+ # Copyright (C) 2013 Kazuki Tsujimoto, All rights reserved.
4
4
 
5
5
  raise LoadError, "TracePoint is undefined. Use Ruby 2.0.0 or later." unless defined? TracePoint
6
6
 
7
7
  require 'dexc/version'
8
+ require 'irb/color'
9
+ require 'irb/color_printer'
10
+ require 'binding_of_caller'
8
11
 
9
12
  module Dexc
10
- EXC_BINDING_VAR = :@dexc_binding
13
+ EXC_CALLERS_VAR = :@dexc_callers
11
14
 
12
15
  class RingBuffer
13
16
  def initialize(n)
@@ -29,42 +32,44 @@ module Dexc
29
32
  RaiseEvent = Struct.new(:event, :raised_exception)
30
33
  ReturnEvent = Struct.new(:event, :lineno, :path, :defined_class, :method_id, :return_value)
31
34
 
32
- # See MiniTest::Unit::TestCase::PASSTHROUGH_EXCEPTIONS,
33
- # Test::Unit::ErrorHandler::PASS_THROUGH_EXCEPTIONS
34
- # to know why Interrupt is used
35
- class ExceptionWrapper < NoMemoryError
36
- attr_reader :wrapped_exception
35
+ module IrbHelper
36
+ def dexc_print_frame
37
+ @dexc_callers.each_with_index do |i, idx|
38
+ if @dexc_callers_idx == idx
39
+ print ' => '
40
+ else
41
+ print ' '
42
+ end
43
+ print("[%#{@dexc_callers_width}d] " % idx)
44
+ filename, lineno = i.source_location
45
+ puts "#{filename}:#{lineno}:in `#{i.frame_description}'"
46
+ end
47
+ end
37
48
 
38
- def initialize(wrapped_exception)
39
- super(nil)
40
- @wrapped_exception = wrapped_exception
49
+ def dexc_current_frame
50
+ @dexc_callers[@dexc_callers_idx]
41
51
  end
42
- end
43
52
 
44
- module TestPassThroughException
45
- def run_test(*)
46
- super
47
- rescue => e
48
- raise ExceptionWrapper, e
53
+ def dexc_up_frame
54
+ if @dexc_callers_idx < @dexc_callers.length - 1
55
+ @dexc_callers_idx += 1
56
+ end
57
+ dexc_current_frame
49
58
  end
50
- end
51
59
 
52
- class ::Object
53
- prepend Module.new {
54
- def require(path)
55
- super.tap do
56
- if path == 'minitest/unit'
57
- MiniTest::Unit::TestCase.class_eval do
58
- prepend TestPassThroughException
59
- end
60
- elsif path == 'test/unit'
61
- Test::Unit::TestCase.class_eval do
62
- prepend TestPassThroughException
63
- end
64
- end
65
- end
60
+ def dexc_down_frame
61
+ if @dexc_callers_idx > 0
62
+ @dexc_callers_idx -= 1
63
+ end
64
+ dexc_current_frame
65
+ end
66
+
67
+ def dexc_change_frame(idx)
68
+ if (0...@dexc_callers.length) === idx
69
+ @dexc_callers_idx = idx
66
70
  end
67
- }
71
+ dexc_current_frame
72
+ end
68
73
  end
69
74
 
70
75
  def start
@@ -73,7 +78,7 @@ module Dexc
73
78
  tp = TracePoint.new(:raise, :return, :c_return, :b_return) do |tp|
74
79
  if tp.event == :raise
75
80
  exc = tp.raised_exception
76
- exc.instance_variable_set(EXC_BINDING_VAR, tp.binding)
81
+ exc.instance_variable_set(EXC_CALLERS_VAR, tp.binding.callers[1..-1])
77
82
  events.add(RaiseEvent.new(tp.event, exc))
78
83
  else
79
84
  events.add(ReturnEvent.new(tp.event, tp.lineno, tp.path, tp.defined_class, tp.method_id, tp.return_value))
@@ -82,19 +87,16 @@ module Dexc
82
87
 
83
88
  at_exit do
84
89
  exc = $!
85
- if exc.kind_of?(ExceptionWrapper)
86
- exc = exc.wrapped_exception
87
- end
88
90
  tp.disable
89
- b = exc.instance_variable_get(EXC_BINDING_VAR)
90
- if exc.kind_of?(StandardError) and b
91
+ callers = exc.instance_variable_get(EXC_CALLERS_VAR)
92
+ if exc.kind_of?(StandardError) and callers
91
93
  raise_idx = events.to_a.find_index {|i| i.event == :raise and i.raised_exception == exc }
92
94
  latest_events = raise_idx ? events.to_a[0...raise_idx] : []
93
95
  return_events = latest_events.find_all {|i| i.event != :raise }
94
96
  return_values = return_events.map(&:return_value)
95
97
 
96
98
  show_trace(return_events)
97
- error_print(exc)
99
+ puts exc.full_message
98
100
 
99
101
  Kernel.module_eval do
100
102
  define_method(:dexc_hist) do
@@ -109,18 +111,24 @@ module Dexc
109
111
  pry.last_exception = exc
110
112
  pry.backtrace = (exc.backtrace || [])
111
113
  end
112
- b.pry
114
+ callers[0].pry
113
115
  rescue LoadError
114
116
  require 'irb'
115
- IRB::Irb.class_eval do
116
- alias_method :eval_input_orig, :eval_input
117
- define_method(:eval_input) do
118
- IRB::Irb.class_eval { alias_method :eval_input, :eval_input_orig }
119
- require 'irb/ext/multi-irb'
120
- IRB.irb(nil, b)
121
- end
117
+ IRB::Context.include(IrbHelper)
118
+ require 'dexc/irb/cmd/stack_explorer'
119
+ b = callers[0]
120
+ filename = b.source_location[0]
121
+ IRB.setup(filename, argv: [])
122
+ workspace = IRB::WorkSpace.new(b)
123
+ STDOUT.print(workspace.code_around_binding)
124
+ binding_irb = IRB::Irb.new(workspace)
125
+ binding_irb.context.irb_path = File.expand_path(filename)
126
+ binding_irb.context.instance_eval do
127
+ @dexc_callers = callers
128
+ @dexc_callers_width = Math.log10(callers.length).floor + 1
129
+ @dexc_callers_idx = 0
122
130
  end
123
- IRB.start
131
+ binding_irb.run(IRB.conf)
124
132
  end
125
133
  exit!
126
134
  end
@@ -135,7 +143,7 @@ module Dexc
135
143
  file_cache = {}
136
144
  events.each_with_index do |i, idx|
137
145
  show_line(i.path, i.lineno, idx, idx_width, file_cache)
138
- puts " " * (idx_width + 1) + "#{i.defined_class}##{i.method_id}#{i.event == :b_return ? '(block)' : ''}: #{i.return_value.inspect}"
146
+ puts " " * (idx_width + 1) + "#{i.defined_class}##{i.method_id}#{i.event == :b_return ? '(block)' : ''}: #{IRB::ColorPrinter.pp(i.return_value.inspect, '')}"
139
147
  end
140
148
  puts
141
149
  end
@@ -145,41 +153,13 @@ module Dexc
145
153
  print "#{"%#{index_width}d" % index}:#{path}:#{lineno}"
146
154
  begin
147
155
  cache[path] ||= open(path).each_line.map(&:chomp)
148
- print "> #{lineno > 0 ? cache[path][lineno - 1] : ''}"
156
+ print "> #{lineno > 0 ? ::IRB::Color.colorize_code(cache[path][lineno - 1], complete: false, ignore_error: true) : ''}"
149
157
  rescue Errno::ENOENT
150
158
  cache[path] = []
151
159
  end
152
160
  puts
153
161
  end
154
162
  module_function :show_line
155
-
156
- # from Irb#eval_input(lib/irb.rb)
157
- def error_print(exc)
158
- print exc.class, ": ", exc, "\n"
159
- messages = []
160
- lasts = []
161
- levels = 0
162
- back_trace_limit = 30
163
- for m in exc.backtrace
164
- if m
165
- if messages.size < back_trace_limit
166
- messages.push "\tfrom "+m
167
- else
168
- lasts.push "\tfrom "+m
169
- if lasts.size > back_trace_limit
170
- lasts.shift
171
- levels += 1
172
- end
173
- end
174
- end
175
- end
176
- print messages.join("\n"), "\n"
177
- unless lasts.empty?
178
- printf "... %d levels...\n", levels if levels > 0
179
- print lasts.join("\n")
180
- end
181
- end
182
- module_function :error_print
183
163
  end
184
164
 
185
165
  Dexc.start
@@ -0,0 +1,41 @@
1
+ require "irb"
2
+ require "irb/cmd/nop"
3
+ require "irb/cmd/chws"
4
+
5
+ module IRB
6
+ module ExtendCommand
7
+
8
+ class DexcFrame < Nop
9
+ def execute(idx = nil)
10
+ if idx
11
+ irb_context.dexc_change_frame(idx)
12
+ STDOUT.print(irb_context.workspace.code_around_binding)
13
+ end
14
+ irb_context.dexc_print_frame
15
+ irb_context.main
16
+ end
17
+ end
18
+
19
+ class DexcUp < Nop
20
+ def execute(*)
21
+ irb_context.change_workspace(irb_context.dexc_up_frame)
22
+ STDOUT.print(irb_context.workspace.code_around_binding)
23
+ irb_context.dexc_print_frame
24
+ irb_context.main
25
+ end
26
+ end
27
+
28
+ class DexcDown < Nop
29
+ def execute(*)
30
+ irb_context.change_workspace(irb_context.dexc_down_frame)
31
+ STDOUT.print(irb_context.workspace.code_around_binding)
32
+ irb_context.dexc_print_frame
33
+ irb_context.main
34
+ end
35
+ end
36
+ end
37
+ end
38
+
39
+ IRB::ExtendCommandBundle.def_extend_command(:irb_frame, :DexcFrame, "dexc/irb/cmd/stack_explorer", [:frame, IRB::ExtendCommandBundle::OVERRIDE_ALL])
40
+ IRB::ExtendCommandBundle.def_extend_command(:irb_up, :DexcUp, "dexc/irb/cmd/stack_explorer", [:up, IRB::ExtendCommandBundle::OVERRIDE_ALL])
41
+ IRB::ExtendCommandBundle.def_extend_command(:irb_down, :DexcDown, "dexc/irb/cmd/stack_explorer", [:down, IRB::ExtendCommandBundle::OVERRIDE_ALL])
data/lib/dexc/version.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  module Dexc
2
- VERSION = "0.0.3"
2
+ VERSION = "0.1.0"
3
3
  end
metadata CHANGED
@@ -1,15 +1,43 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: dexc
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.3
4
+ version: 0.1.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Kazuki Tsujimoto
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2016-04-09 00:00:00.000000000 Z
11
+ date: 2021-02-14 00:00:00.000000000 Z
12
12
  dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: irb
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ">="
18
+ - !ruby/object:Gem::Version
19
+ version: '0'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ">="
25
+ - !ruby/object:Gem::Version
26
+ version: '0'
27
+ - !ruby/object:Gem::Dependency
28
+ name: binding_of_caller
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ">="
32
+ - !ruby/object:Gem::Version
33
+ version: '0'
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - ">="
39
+ - !ruby/object:Gem::Version
40
+ version: '0'
13
41
  - !ruby/object:Gem::Dependency
14
42
  name: rake
15
43
  requirement: !ruby/object:Gem::Requirement
@@ -54,6 +82,7 @@ files:
54
82
  - Rakefile
55
83
  - dexc.gemspec
56
84
  - lib/dexc.rb
85
+ - lib/dexc/irb/cmd/stack_explorer.rb
57
86
  - lib/dexc/version.rb
58
87
  - test/test_dexc.rb
59
88
  homepage: https://github.com/k-tsj/dexc
@@ -76,8 +105,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
76
105
  - !ruby/object:Gem::Version
77
106
  version: '0'
78
107
  requirements: []
79
- rubyforge_project:
80
- rubygems_version: 2.5.1
108
+ rubygems_version: 3.3.0.dev
81
109
  signing_key:
82
110
  specification_version: 4
83
111
  summary: A library that helps you to debug an exception