pry-rescue 1.4.5 → 1.6.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 +5 -5
- data/.rspec +1 -0
- data/.travis.yml +3 -4
- data/CHANGELOG.md +14 -0
- data/README.md +6 -0
- data/Rakefile +1 -0
- data/bin/rescue +8 -3
- data/lib/pry-rescue/commands.rb +2 -0
- data/lib/pry-rescue/rspec.rb +27 -17
- data/lib/pry-rescue/source_location.rb +13 -0
- data/lib/pry-rescue.rb +13 -4
- data/pry-rescue.gemspec +2 -21
- data/spec/commands_spec.rb +25 -0
- data/spec/core_ext_spec.rb +21 -21
- data/spec/fixtures/template_error.rb +13 -0
- data/spec/peek_spec.rb +4 -4
- data/spec/pry_rescue_spec.rb +52 -44
- data/spec/source_location_spec.rb +19 -0
- data/spec/spec_helper.rb +0 -2
- metadata +10 -20
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
|
-
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: 9858e248a006df546dbc0e2e4a5b0055e9f0e2276bce651729af051d88741ec7
|
4
|
+
data.tar.gz: dbc440ce345d54877bd894a8dfe89c9d497e4f144ffcc5dadf702bb89887c7cc
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: cccaff14cd38dfe24cfa8a85d7121b90f526e214cb6accf474e1237429a372d871eb5189e696ea18b4eb34371f236ebfeee0559202d1301be11b0bf8d06ebdd9
|
7
|
+
data.tar.gz: 5236813e00b7a5198159d181c1b660c4aad9b4f8c1b7c50a9c69d39753d5641d8f8efe24176a51f709b91d1f28301baae577d930c5cfe393d93ebbc8f958db89
|
data/.rspec
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
--require spec_helper
|
data/.travis.yml
CHANGED
data/CHANGELOG.md
ADDED
@@ -0,0 +1,14 @@
|
|
1
|
+
## v1.6.0 (9 January 2024)
|
2
|
+
* Fix ruby 3.2 compatibility
|
3
|
+
|
4
|
+
## v1.5.2 (24 June 2020)
|
5
|
+
* RSpec: Fix Rescue opening after transactional tests are rolled back.
|
6
|
+
(issue #99 - PR #118) (@joallard)
|
7
|
+
|
8
|
+
* bin/rescue: Use realpaths (issue #109 - PR #110)
|
9
|
+
|
10
|
+
*(Damien Robert)*
|
11
|
+
|
12
|
+
## v1.5.1 (22 May 2020)
|
13
|
+
* Make Binding#source_location polyfill. (Removes deprecation warnings
|
14
|
+
for Ruby 2.6+)
|
data/README.md
CHANGED
@@ -109,6 +109,12 @@ Unfortunately using `edit -c` to edit `_spec.rb` files does not yet reload the
|
|
109
109
|
code in a way that the `try-again` command can understand. You can still use
|
110
110
|
`try-again` if you edit code that is not in spec files.
|
111
111
|
|
112
|
+
If you want pry-rescue to *always* be enabled when you run tests, simply add this line to your `test_helper.rb`:
|
113
|
+
|
114
|
+
```ruby
|
115
|
+
require 'pry-rescue/rspec'
|
116
|
+
```
|
117
|
+
|
112
118
|
### Minitest
|
113
119
|
|
114
120
|
Add the following to your `test_helper.rb` or to the top of your test file.
|
data/Rakefile
CHANGED
data/bin/rescue
CHANGED
@@ -39,7 +39,11 @@ else
|
|
39
39
|
when 'rails'
|
40
40
|
ENV['PRY_RESCUE_RAILS'] = 'true'
|
41
41
|
exec(*ARGV)
|
42
|
-
when
|
42
|
+
when 'rake'
|
43
|
+
require File.realpath(File.expand_path('../../lib/pry-rescue.rb', __FILE__))
|
44
|
+
PryRescue.load_rake ARGV[1]
|
45
|
+
exit
|
46
|
+
when /^re?spec$/
|
43
47
|
ENV['SPEC_OPTS'] = "#{ENV['SPEC_OPTS']} -r pry-rescue/rspec"
|
44
48
|
exec(*ARGV)
|
45
49
|
end
|
@@ -47,8 +51,9 @@ end
|
|
47
51
|
|
48
52
|
if script = ARGV.shift
|
49
53
|
$0 = File.expand_path(script)
|
50
|
-
|
51
|
-
|
54
|
+
|
55
|
+
if File.exist? script
|
56
|
+
require File.realpath(File.expand_path('../../lib/pry-rescue.rb', __FILE__))
|
52
57
|
PryRescue.load $0, ensure_repl
|
53
58
|
else
|
54
59
|
$stderr.puts "Error: #{script.inspect} not found."
|
data/lib/pry-rescue/commands.rb
CHANGED
@@ -47,6 +47,8 @@ Pry::Commands.create_command "cd-cause", "Move to the exception that caused this
|
|
47
47
|
ex = ex.instance_variable_get(:@rescue_cause) if rescued == ex
|
48
48
|
raise Pry::CommandError, "No previous exception to cd-cause into" if ex.nil? || ex == rescued
|
49
49
|
|
50
|
+
ex = ex.cause if ex.respond_to?(:cause) && !ex.cause.nil?
|
51
|
+
|
50
52
|
Pry.rescued ex
|
51
53
|
end
|
52
54
|
end
|
data/lib/pry-rescue/rspec.rb
CHANGED
@@ -1,4 +1,5 @@
|
|
1
1
|
require 'pry-rescue'
|
2
|
+
require 'pry-stack_explorer'
|
2
3
|
require 'rspec' unless defined?(RSpec)
|
3
4
|
|
4
5
|
class PryRescue
|
@@ -7,29 +8,23 @@ class PryRescue
|
|
7
8
|
# Run an Rspec example within Pry::rescue{ }.
|
8
9
|
#
|
9
10
|
# Takes care to ensure that `try-again` will work.
|
11
|
+
#
|
12
|
+
# `example` is a RSpec::Core::Example::Procsy
|
10
13
|
def self.run(example)
|
11
14
|
Pry::rescue do
|
12
15
|
begin
|
13
16
|
before
|
14
17
|
|
15
|
-
example.
|
16
|
-
example.
|
17
|
-
|
18
|
-
example.binding.eval('@example && @example.example_group_instance.instance_variable_set(:@__init_memoized, true)')
|
19
|
-
example.binding.eval('example.example_group_instance.instance_variable_set(:@__init_memoized, true) if defined?(example)')
|
20
|
-
else
|
21
|
-
example.binding.eval('@example && @example.example_group_instance.instance_variable_set(:@__memoized, {})')
|
22
|
-
example.binding.eval('example.example_group_instance.instance_variable_set(:@__memoized, {}) if defined?(example)')
|
23
|
-
end
|
18
|
+
example.example.instance_variable_set(:@exception, nil)
|
19
|
+
example.example_group_instance.instance_variable_set(:@__init_memoized, true)
|
20
|
+
|
24
21
|
example.run
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
Pry::rescued(e)
|
29
|
-
end
|
22
|
+
|
23
|
+
# Rescued will be called in :after hook, which is ran before the second
|
24
|
+
# :around leg
|
30
25
|
|
31
26
|
ensure
|
32
|
-
|
27
|
+
after_outside
|
33
28
|
end
|
34
29
|
end
|
35
30
|
end
|
@@ -38,7 +33,12 @@ class PryRescue
|
|
38
33
|
monkeypatch_capybara if defined?(Capybara)
|
39
34
|
end
|
40
35
|
|
41
|
-
def self.after
|
36
|
+
def self.after(example)
|
37
|
+
e = example.exception
|
38
|
+
Pry::rescued(e) if e
|
39
|
+
end
|
40
|
+
|
41
|
+
def self.after_outside
|
42
42
|
after_filters.each(&:call)
|
43
43
|
end
|
44
44
|
|
@@ -50,7 +50,13 @@ class PryRescue
|
|
50
50
|
unless Capybara.respond_to?(:reset_sessions_after_rescue!)
|
51
51
|
class << Capybara
|
52
52
|
alias_method :reset_sessions_after_rescue!, :reset_sessions!
|
53
|
-
def reset_sessions
|
53
|
+
def reset_sessions!
|
54
|
+
return if Capybara.raise_server_errors
|
55
|
+
|
56
|
+
session_pool.reverse_each do |_mode, session|
|
57
|
+
session.server.reset_error!
|
58
|
+
end
|
59
|
+
end
|
54
60
|
end
|
55
61
|
|
56
62
|
after_filters << Capybara.method(:reset_sessions_after_rescue!)
|
@@ -67,4 +73,8 @@ RSpec.configure do |c|
|
|
67
73
|
c.around(:each) do |example|
|
68
74
|
PryRescue::RSpec.run example
|
69
75
|
end
|
76
|
+
|
77
|
+
c.after(:each) do |example|
|
78
|
+
PryRescue::RSpec.after(example)
|
79
|
+
end
|
70
80
|
end
|
@@ -0,0 +1,13 @@
|
|
1
|
+
class PryRescue
|
2
|
+
module SourceLocation
|
3
|
+
DEPRECATION_TIME = Time.new(2021,4,1)
|
4
|
+
|
5
|
+
WithRuby2_5 = ->(b){ [b.eval("__FILE__"), b.eval("__LINE__")] }
|
6
|
+
WithRuby2_6 = ->(b){ b.source_location }
|
7
|
+
|
8
|
+
define_singleton_method(
|
9
|
+
:call,
|
10
|
+
(RUBY_VERSION < "2.6.0") ? WithRuby2_5 : WithRuby2_6
|
11
|
+
)
|
12
|
+
end
|
13
|
+
end
|
data/lib/pry-rescue.rb
CHANGED
@@ -6,13 +6,14 @@ require File.expand_path('../pry-rescue/core_ext', __FILE__)
|
|
6
6
|
require File.expand_path('../pry-rescue/commands', __FILE__)
|
7
7
|
require File.expand_path('../pry-rescue/rack', __FILE__)
|
8
8
|
require File.expand_path('../pry-rescue/peek.rb', __FILE__)
|
9
|
+
require File.expand_path('../pry-rescue/source_location.rb', __FILE__)
|
9
10
|
|
10
11
|
if ENV['PRY_RESCUE_RAILS']
|
11
12
|
require File.expand_path('../pry-rescue/rails', __FILE__)
|
12
13
|
end
|
13
14
|
case ENV['PRY_PEEK']
|
14
15
|
when nil
|
15
|
-
PryRescue.peek_on_signal('QUIT') unless Pry::Helpers::
|
16
|
+
PryRescue.peek_on_signal('QUIT') unless Pry::Helpers::Platform.windows?
|
16
17
|
when ''
|
17
18
|
# explicitly disable QUIT.
|
18
19
|
else
|
@@ -79,6 +80,14 @@ class PryRescue
|
|
79
80
|
end
|
80
81
|
end
|
81
82
|
|
83
|
+
def load_rake(task)
|
84
|
+
require 'rake'
|
85
|
+
Pry::rescue do
|
86
|
+
load "#{Dir.pwd}/Rakefile"
|
87
|
+
Rake::Task[task].invoke
|
88
|
+
end
|
89
|
+
end
|
90
|
+
|
82
91
|
# Is the user currently inside pry rescue?
|
83
92
|
# @return [Boolean]
|
84
93
|
def in_exception_context?
|
@@ -95,7 +104,7 @@ class PryRescue
|
|
95
104
|
# @param [Exception] e The raised exception
|
96
105
|
def phantom_load_raise?(e)
|
97
106
|
bindings = e.instance_variable_get(:@rescue_bindings)
|
98
|
-
bindings.any? && bindings.first
|
107
|
+
bindings.any? && SourceLocation.call(bindings.first)[0] == __FILE__
|
99
108
|
end
|
100
109
|
|
101
110
|
# When using pry-stack-explorer we want to start the rescue session outside of gems
|
@@ -105,7 +114,7 @@ class PryRescue
|
|
105
114
|
# @return [Fixnum] The offset of the first binding of user code
|
106
115
|
def initial_frame(bindings)
|
107
116
|
bindings.each_with_index do |binding, i|
|
108
|
-
return i if user_path?(
|
117
|
+
return i if user_path?(SourceLocation.call(binding)[0])
|
109
118
|
end
|
110
119
|
|
111
120
|
0
|
@@ -162,7 +171,7 @@ class PryRescue
|
|
162
171
|
def without_bindings_below_raise(bindings)
|
163
172
|
return bindings if bindings.size <= 1
|
164
173
|
bindings.drop_while do |b|
|
165
|
-
|
174
|
+
SourceLocation.call(b)[0] == File.expand_path("../pry-rescue/core_ext.rb", __FILE__)
|
166
175
|
end.drop_while do |b|
|
167
176
|
Interception == b.eval("self")
|
168
177
|
end
|
data/pry-rescue.gemspec
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
Gem::Specification.new do |s|
|
2
2
|
s.name = 'pry-rescue'
|
3
|
-
s.version = '1.
|
3
|
+
s.version = '1.6.0'
|
4
4
|
s.summary = 'Open a pry session on any unhandled exceptions'
|
5
5
|
s.description = 'Allows you to wrap code in Pry::rescue{ } to open a pry session at any unhandled exceptions'
|
6
6
|
s.homepage = 'https://github.com/ConradIrwin/pry-rescue'
|
@@ -11,7 +11,7 @@ Gem::Specification.new do |s|
|
|
11
11
|
s.require_paths = ['lib']
|
12
12
|
s.executables = s.files.grep(%r{^bin/}).map{|f| File.basename f}
|
13
13
|
|
14
|
-
s.add_dependency 'pry'
|
14
|
+
s.add_dependency 'pry', '>= 0.12.0'
|
15
15
|
s.add_dependency 'interception', '>= 0.5'
|
16
16
|
|
17
17
|
s.add_development_dependency 'pry-stack_explorer' # upgrade to regular dep?
|
@@ -20,23 +20,4 @@ Gem::Specification.new do |s|
|
|
20
20
|
s.add_development_dependency 'rspec'
|
21
21
|
s.add_development_dependency 'redcarpet'
|
22
22
|
s.add_development_dependency 'capybara'
|
23
|
-
|
24
|
-
# SPECIAL DEVELOPMENT GEM FOR OLD RUBY
|
25
|
-
# DONT USE THIS TRICK FOR RUNTIME GEM
|
26
|
-
if Gem::Version.create(RUBY_VERSION) < Gem::Version.create("2.2.2")
|
27
|
-
s.add_development_dependency 'yard', '< 0.9.6'
|
28
|
-
s.add_development_dependency 'rack', ['~> 1.6', '< 1.7']
|
29
|
-
else
|
30
|
-
s.add_development_dependency 'yard'
|
31
|
-
end
|
32
|
-
if Gem::Version.create(RUBY_VERSION) < Gem::Version.create("2.1")
|
33
|
-
# capybara > nokogiri
|
34
|
-
s.add_development_dependency 'nokogiri', ['~> 1.6', '< 1.7.0']
|
35
|
-
end
|
36
|
-
if Gem::Version.create(RUBY_VERSION) < Gem::Version.create("2.0")
|
37
|
-
# capybara > addressable > public_suffix
|
38
|
-
s.add_development_dependency 'public_suffix', ['~> 1.4', '< 1.5']
|
39
|
-
# capybara > mime-types
|
40
|
-
s.add_development_dependency 'mime-types', ['~> 2.6', '< 2.99']
|
41
|
-
end
|
42
23
|
end
|
data/spec/commands_spec.rb
CHANGED
@@ -1,4 +1,5 @@
|
|
1
1
|
require './spec/spec_helper'
|
2
|
+
require './spec/fixtures/template_error'
|
2
3
|
|
3
4
|
describe "pry-rescue commands" do
|
4
5
|
describe "try-again" do
|
@@ -56,6 +57,30 @@ describe "pry-rescue commands" do
|
|
56
57
|
end
|
57
58
|
|
58
59
|
describe "cd-cause" do
|
60
|
+
context 're-raising with custom Exception' do
|
61
|
+
it "should not loop through same context" do
|
62
|
+
_ex_ = nil
|
63
|
+
e1 = nil
|
64
|
+
Pry::rescue do
|
65
|
+
begin
|
66
|
+
begin
|
67
|
+
_b1 = binding
|
68
|
+
raise "original"
|
69
|
+
rescue => e1
|
70
|
+
_b2 = binding
|
71
|
+
raise TemplateError.new(e1)
|
72
|
+
end
|
73
|
+
rescue => e2
|
74
|
+
_ex_ = e2
|
75
|
+
end
|
76
|
+
end
|
77
|
+
|
78
|
+
expect(PryRescue).to receive(:enter_exception_context).once.with(e1)
|
79
|
+
|
80
|
+
Pry.new.tap{ |p| p.push_binding(binding) }.process_command 'cd-cause'
|
81
|
+
end
|
82
|
+
end
|
83
|
+
|
59
84
|
it "should enter the next exception's context" do
|
60
85
|
_ex_ = nil
|
61
86
|
e1 = nil
|
data/spec/core_ext_spec.rb
CHANGED
@@ -2,25 +2,25 @@ require File.expand_path('../../lib/pry-rescue.rb', __FILE__)
|
|
2
2
|
|
3
3
|
describe 'Pry.rescue' do
|
4
4
|
it 'should call PryRescue.enter_exception_context' do
|
5
|
-
lambda{
|
6
|
-
PryRescue.
|
5
|
+
expect(lambda {
|
6
|
+
expect(PryRescue).to receive(:enter_exception_context).once
|
7
7
|
Pry::rescue{ raise "foobar" }
|
8
|
-
}.
|
8
|
+
}).to raise_error(/foobar/)
|
9
9
|
end
|
10
10
|
|
11
11
|
it "should retry on try-again" do
|
12
12
|
@called = 0
|
13
|
-
PryRescue.
|
13
|
+
expect(PryRescue).to receive(:enter_exception_context).once{ throw :try_again }
|
14
14
|
Pry::rescue do
|
15
15
|
@called += 1
|
16
16
|
raise "foobar" if @called == 1
|
17
17
|
end
|
18
|
-
@called.
|
18
|
+
expect(@called).to be(2)
|
19
19
|
end
|
20
20
|
|
21
21
|
it "should try-again from innermost block" do
|
22
22
|
@outer = @inner = 0
|
23
|
-
PryRescue.
|
23
|
+
expect(PryRescue).to receive(:enter_exception_context).once{ throw :try_again }
|
24
24
|
Pry::rescue do
|
25
25
|
@outer += 1
|
26
26
|
Pry::rescue do
|
@@ -29,13 +29,13 @@ describe 'Pry.rescue' do
|
|
29
29
|
end
|
30
30
|
end
|
31
31
|
|
32
|
-
@outer.
|
33
|
-
@inner.
|
32
|
+
expect(@outer).to be(1)
|
33
|
+
expect(@inner).to be(2)
|
34
34
|
end
|
35
35
|
|
36
36
|
it "should enter the first occurence of an exception that is re-raised" do
|
37
|
-
PryRescue.
|
38
|
-
lambda do
|
37
|
+
expect(PryRescue).to receive(:enter_exception_context).once{ |raised| raised.size.should == 1 }
|
38
|
+
expect(lambda do
|
39
39
|
Pry::rescue do
|
40
40
|
begin
|
41
41
|
raise "first_occurance"
|
@@ -43,26 +43,26 @@ describe 'Pry.rescue' do
|
|
43
43
|
raise
|
44
44
|
end
|
45
45
|
end
|
46
|
-
end.
|
46
|
+
end).to raise_error(/first_occurance/)
|
47
47
|
end
|
48
48
|
|
49
49
|
it "should not catch SystemExit" do
|
50
|
-
PryRescue.
|
50
|
+
expect(PryRescue).to_not receive(:enter_exception_context)
|
51
51
|
|
52
|
-
lambda do
|
52
|
+
expect(lambda do
|
53
53
|
Pry::rescue do
|
54
54
|
exit
|
55
55
|
end
|
56
|
-
end.
|
56
|
+
end).to raise_error SystemExit
|
57
57
|
end
|
58
58
|
|
59
59
|
it 'should not catch Ctrl+C' do
|
60
|
-
PryRescue.
|
61
|
-
lambda do
|
60
|
+
expect(PryRescue).to_not receive(:enter_exception_context)
|
61
|
+
expect(lambda do
|
62
62
|
Pry::rescue do
|
63
63
|
raise Interrupt, "ctrl+c (fake)"
|
64
64
|
end
|
65
|
-
end.
|
65
|
+
end).to raise_error Interrupt
|
66
66
|
end
|
67
67
|
end
|
68
68
|
|
@@ -72,15 +72,15 @@ describe "Pry.rescued" do
|
|
72
72
|
begin
|
73
73
|
raise "foo"
|
74
74
|
rescue => e
|
75
|
-
Pry.
|
75
|
+
expect(Pry).to receive(:warn)
|
76
76
|
Pry.rescued(e)
|
77
77
|
end
|
78
78
|
end
|
79
79
|
|
80
80
|
it "should raise an error if used on an exception not raised" do
|
81
81
|
Pry::rescue do
|
82
|
-
Pry.
|
83
|
-
message.
|
82
|
+
expect(Pry).to receive(:warn) do |message|
|
83
|
+
expect(message).to match(/^WARNING: Tried to inspect exception outside of Pry::rescue/)
|
84
84
|
end
|
85
85
|
Pry.rescued(RuntimeError.new("foo").exception)
|
86
86
|
end
|
@@ -91,7 +91,7 @@ describe "Pry.rescued" do
|
|
91
91
|
begin
|
92
92
|
raise "foo"
|
93
93
|
rescue => e
|
94
|
-
PryRescue.
|
94
|
+
expect(PryRescue).to receive(:enter_exception_context).once
|
95
95
|
Pry::rescued(e)
|
96
96
|
end
|
97
97
|
end
|
@@ -0,0 +1,13 @@
|
|
1
|
+
# This Exception Class behaves same as ActionView::Template::Error
|
2
|
+
# https://github.com/rails/rails/blob/master/actionview/lib/action_view/template/error.rb#L68
|
3
|
+
#
|
4
|
+
# It encapsulates an Exception and stores the latest Exception raised in its
|
5
|
+
# `cause` attribute
|
6
|
+
class TemplateError < StandardError
|
7
|
+
attr_reader :cause
|
8
|
+
|
9
|
+
def initialize(cause)
|
10
|
+
@cause = $!
|
11
|
+
end
|
12
|
+
end
|
13
|
+
|
data/spec/peek_spec.rb
CHANGED
@@ -6,9 +6,9 @@ describe "PryRescue.peek!" do
|
|
6
6
|
Pry.config.output = StringIO.new
|
7
7
|
foo = 5
|
8
8
|
|
9
|
-
lambda do
|
9
|
+
expect(lambda do
|
10
10
|
PryRescue.peek!
|
11
|
-
end.
|
11
|
+
end).to change{ foo }.from(5).to(6)
|
12
12
|
end
|
13
13
|
|
14
14
|
# this will fail, or not?
|
@@ -22,8 +22,8 @@ describe "PryRescue.peek!" do
|
|
22
22
|
|
23
23
|
foo = 5
|
24
24
|
|
25
|
-
lambda do
|
25
|
+
expect(lambda do
|
26
26
|
PryRescue.peek!
|
27
|
-
end.
|
27
|
+
end).to change{ foo }.from(5).to(6)
|
28
28
|
end
|
29
29
|
end
|
data/spec/pry_rescue_spec.rb
CHANGED
@@ -2,54 +2,62 @@ require File.expand_path('../../lib/pry-rescue.rb', __FILE__)
|
|
2
2
|
require 'uri'
|
3
3
|
|
4
4
|
describe "PryRescue.load" do
|
5
|
+
before :all do
|
6
|
+
if !binding.respond_to?(:source_location)
|
7
|
+
Binding.define_method :source_location do
|
8
|
+
PryRescue::SourceLocation.call(self)
|
9
|
+
end
|
10
|
+
end
|
11
|
+
end
|
12
|
+
|
5
13
|
if defined?(PryStackExplorer)
|
6
14
|
it "should open at the correct point" do
|
7
|
-
PryRescue.
|
8
|
-
opts[:call_stack].first.
|
15
|
+
expect(PryRescue).to receive(:pry).once { |opts|
|
16
|
+
expect(opts[:call_stack].first.source_location[0]).to end_with('spec/fixtures/simple.rb')
|
9
17
|
}
|
10
|
-
lambda{
|
18
|
+
expect(lambda {
|
11
19
|
PryRescue.load("spec/fixtures/simple.rb")
|
12
|
-
}.
|
20
|
+
}).to raise_error(/simple-exception/)
|
13
21
|
end
|
14
22
|
|
15
23
|
it "should open above the standard library" do
|
16
|
-
PryRescue.
|
17
|
-
opts[:call_stack][opts[:initial_frame]].
|
24
|
+
expect(PryRescue).to receive(:pry).once do |opts|
|
25
|
+
expect(opts[:call_stack][opts[:initial_frame]].source_location[0]).to end_with('spec/fixtures/uri.rb')
|
18
26
|
end
|
19
|
-
lambda{
|
27
|
+
expect(lambda{
|
20
28
|
PryRescue.load("spec/fixtures/uri.rb")
|
21
|
-
}.
|
29
|
+
}).to raise_error(URI::InvalidURIError)
|
22
30
|
end
|
23
31
|
|
24
32
|
it "should keep the standard library on the binding stack" do
|
25
|
-
PryRescue.
|
26
|
-
opts[:call_stack].first.
|
33
|
+
expect(PryRescue).to receive(:pry).once do |opts|
|
34
|
+
expect(opts[:call_stack].first.source_location[0]).to start_with(RbConfig::CONFIG['libdir'])
|
27
35
|
end
|
28
|
-
lambda{
|
36
|
+
expect(lambda{
|
29
37
|
PryRescue.load("spec/fixtures/uri.rb")
|
30
|
-
}.
|
38
|
+
}).to raise_error(URI::InvalidURIError)
|
31
39
|
end
|
32
40
|
|
33
41
|
it "should open above gems" do
|
34
|
-
PryRescue.
|
35
|
-
opts[:call_stack][opts[:initial_frame]].
|
42
|
+
expect(PryRescue).to receive(:pry).once do |opts|
|
43
|
+
expect(opts[:call_stack][opts[:initial_frame]].source_location[0]).to end_with('spec/fixtures/coderay.rb')
|
36
44
|
end
|
37
|
-
lambda{
|
45
|
+
expect(lambda{
|
38
46
|
PryRescue.load("spec/fixtures/coderay.rb")
|
39
|
-
}.
|
47
|
+
}).to raise_error(ArgumentError)
|
40
48
|
end
|
41
49
|
|
42
50
|
it "should open above gems" do
|
43
|
-
PryRescue.
|
51
|
+
expect(PryRescue).to receive(:pry).once do |opts|
|
44
52
|
coderay_path = Gem::Specification.respond_to?(:detect) ?
|
45
53
|
Gem::Specification.detect{|x| x.name == 'coderay' }.full_gem_path :
|
46
54
|
Gem.all_load_paths.grep(/coderay/).last
|
47
55
|
|
48
|
-
opts[:call_stack].first.
|
56
|
+
expect(opts[:call_stack].first.source_location[0]).to start_with(coderay_path)
|
49
57
|
end
|
50
|
-
lambda{
|
58
|
+
expect(lambda{
|
51
59
|
PryRescue.load("spec/fixtures/coderay.rb")
|
52
|
-
}.
|
60
|
+
}).to raise_error(ArgumentError)
|
53
61
|
end
|
54
62
|
|
55
63
|
it "should skip pwd, even if it is a gem (but not vendor stuff)" do
|
@@ -66,56 +74,56 @@ describe "PryRescue.load" do
|
|
66
74
|
end
|
67
75
|
|
68
76
|
it "should filter out duplicate stack frames" do
|
69
|
-
PryRescue.
|
70
|
-
opts[:call_stack][0].
|
71
|
-
opts[:call_stack][1].
|
77
|
+
expect(PryRescue).to receive(:pry).once do |opts|
|
78
|
+
expect(opts[:call_stack][0].source_location[1]).to be(4)
|
79
|
+
expect(opts[:call_stack][1].source_location[1]).to be(12)
|
72
80
|
end
|
73
|
-
lambda{
|
81
|
+
expect(lambda{
|
74
82
|
PryRescue.load("spec/fixtures/super.rb")
|
75
|
-
}.
|
83
|
+
}).to raise_error(/super-exception/)
|
76
84
|
end
|
77
85
|
|
78
86
|
it "should calculate correct initial frame even when duplicates are present" do
|
79
|
-
PryRescue.
|
80
|
-
opts[:call_stack][0].
|
81
|
-
opts[:call_stack][opts[:initial_frame]].
|
87
|
+
expect(PryRescue).to receive(:pry).once do |opts|
|
88
|
+
expect(opts[:call_stack][0].source_location[0]).to end_with('fake.rb')
|
89
|
+
expect(opts[:call_stack][opts[:initial_frame]].source_location[0]).to end_with('spec/fixtures/initial.rb')
|
82
90
|
end
|
83
|
-
lambda{
|
91
|
+
expect(lambda{
|
84
92
|
PryRescue.load("spec/fixtures/initial.rb")
|
85
|
-
}.
|
93
|
+
}).to raise_error(/no :baz please/)
|
86
94
|
end
|
87
95
|
|
88
96
|
it "should skip over reraises from within gems" do
|
89
|
-
PryRescue.
|
90
|
-
opts[:call_stack][0].
|
97
|
+
expect(PryRescue).to receive(:pry).once do |opts|
|
98
|
+
expect(opts[:call_stack][0].source_location[0]).to end_with('spec/fixtures/reraise.rb')
|
91
99
|
end
|
92
|
-
lambda{
|
100
|
+
expect(lambda{
|
93
101
|
PryRescue.load("spec/fixtures/reraise.rb")
|
94
|
-
}.
|
102
|
+
}).to raise_error(/reraise-exception/)
|
95
103
|
end
|
96
104
|
|
97
105
|
it "should not skip over independent raises within gems" do
|
98
|
-
PryRescue.
|
99
|
-
opts[:call_stack][0].
|
106
|
+
expect(PryRescue).to receive(:pry).once do |opts|
|
107
|
+
expect(opts[:call_stack][0].source_location[0]).to end_with('fake.rb')
|
100
108
|
end
|
101
|
-
lambda{
|
109
|
+
expect(lambda{
|
102
110
|
PryRescue.load("spec/fixtures/raiseother.rb")
|
103
|
-
}.
|
111
|
+
}).to raise_error(/raiseother_exception/)
|
104
112
|
end
|
105
113
|
|
106
114
|
it "should output a warning if the exception was not raised" do
|
107
|
-
PryRescue.
|
108
|
-
Pry.
|
115
|
+
expect(PryRescue).to_not receive(:enter_exception_context)
|
116
|
+
expect(Pry).to receive(:warn).once
|
109
117
|
Pry.rescued(RuntimeError.new("foo"))
|
110
118
|
end
|
111
119
|
else
|
112
120
|
it "should open at the correct point" do
|
113
|
-
Pry.
|
114
|
-
binding.
|
121
|
+
expect(Pry).to receive(:start).once { |binding, h|
|
122
|
+
expect(binding.source_location[0]).to end_with('spec/fixtures/simple.rb')
|
115
123
|
}
|
116
|
-
lambda{
|
124
|
+
expect(lambda{
|
117
125
|
PryRescue.load("spec/fixtures/simple.rb")
|
118
|
-
}.
|
126
|
+
}).to raise_error(/simple-exception/)
|
119
127
|
end
|
120
128
|
end
|
121
129
|
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
describe PryRescue::SourceLocation do
|
2
|
+
describe ".call" do
|
3
|
+
subject{ described_class.call(binding) }
|
4
|
+
|
5
|
+
it "matches [file, line]" do
|
6
|
+
is_expected.to match([__FILE__, be_between(2,30)])
|
7
|
+
end
|
8
|
+
end
|
9
|
+
|
10
|
+
it "will be removed when Ruby 2.5 is EOL" do
|
11
|
+
time = Time.now
|
12
|
+
|
13
|
+
if time >= described_class::DEPRECATION_TIME
|
14
|
+
expect(
|
15
|
+
defined?(PryRescue::SourceLocation)
|
16
|
+
).to be false
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
data/spec/spec_helper.rb
CHANGED
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: pry-rescue
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.
|
4
|
+
version: 1.6.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Conrad Irwin
|
@@ -10,7 +10,7 @@ authors:
|
|
10
10
|
autorequire:
|
11
11
|
bindir: bin
|
12
12
|
cert_chain: []
|
13
|
-
date:
|
13
|
+
date: 2024-01-10 00:00:00.000000000 Z
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|
16
16
|
name: pry
|
@@ -18,14 +18,14 @@ dependencies:
|
|
18
18
|
requirements:
|
19
19
|
- - ">="
|
20
20
|
- !ruby/object:Gem::Version
|
21
|
-
version:
|
21
|
+
version: 0.12.0
|
22
22
|
type: :runtime
|
23
23
|
prerelease: false
|
24
24
|
version_requirements: !ruby/object:Gem::Requirement
|
25
25
|
requirements:
|
26
26
|
- - ">="
|
27
27
|
- !ruby/object:Gem::Version
|
28
|
-
version:
|
28
|
+
version: 0.12.0
|
29
29
|
- !ruby/object:Gem::Dependency
|
30
30
|
name: interception
|
31
31
|
requirement: !ruby/object:Gem::Requirement
|
@@ -110,20 +110,6 @@ dependencies:
|
|
110
110
|
- - ">="
|
111
111
|
- !ruby/object:Gem::Version
|
112
112
|
version: '0'
|
113
|
-
- !ruby/object:Gem::Dependency
|
114
|
-
name: yard
|
115
|
-
requirement: !ruby/object:Gem::Requirement
|
116
|
-
requirements:
|
117
|
-
- - ">="
|
118
|
-
- !ruby/object:Gem::Version
|
119
|
-
version: '0'
|
120
|
-
type: :development
|
121
|
-
prerelease: false
|
122
|
-
version_requirements: !ruby/object:Gem::Requirement
|
123
|
-
requirements:
|
124
|
-
- - ">="
|
125
|
-
- !ruby/object:Gem::Version
|
126
|
-
version: '0'
|
127
113
|
description: Allows you to wrap code in Pry::rescue{ } to open a pry session at any
|
128
114
|
unhandled exceptions
|
129
115
|
email:
|
@@ -137,7 +123,9 @@ extensions: []
|
|
137
123
|
extra_rdoc_files: []
|
138
124
|
files:
|
139
125
|
- ".gitignore"
|
126
|
+
- ".rspec"
|
140
127
|
- ".travis.yml"
|
128
|
+
- CHANGELOG.md
|
141
129
|
- Gemfile
|
142
130
|
- LICENSE.MIT
|
143
131
|
- README.md
|
@@ -168,6 +156,7 @@ files:
|
|
168
156
|
- lib/pry-rescue/rack.rb
|
169
157
|
- lib/pry-rescue/rails.rb
|
170
158
|
- lib/pry-rescue/rspec.rb
|
159
|
+
- lib/pry-rescue/source_location.rb
|
171
160
|
- lib/pry/rescue.rb
|
172
161
|
- pry-rescue.gemspec
|
173
162
|
- spec/commands_spec.rb
|
@@ -178,9 +167,11 @@ files:
|
|
178
167
|
- spec/fixtures/reraise.rb
|
179
168
|
- spec/fixtures/simple.rb
|
180
169
|
- spec/fixtures/super.rb
|
170
|
+
- spec/fixtures/template_error.rb
|
181
171
|
- spec/fixtures/uri.rb
|
182
172
|
- spec/peek_spec.rb
|
183
173
|
- spec/pry_rescue_spec.rb
|
174
|
+
- spec/source_location_spec.rb
|
184
175
|
- spec/spec_helper.rb
|
185
176
|
homepage: https://github.com/ConradIrwin/pry-rescue
|
186
177
|
licenses:
|
@@ -201,8 +192,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
201
192
|
- !ruby/object:Gem::Version
|
202
193
|
version: '0'
|
203
194
|
requirements: []
|
204
|
-
|
205
|
-
rubygems_version: 2.6.8
|
195
|
+
rubygems_version: 3.0.3.1
|
206
196
|
signing_key:
|
207
197
|
specification_version: 4
|
208
198
|
summary: Open a pry session on any unhandled exceptions
|