hammertime19 0.0.4 → 0.0.5

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.rdoc CHANGED
@@ -7,6 +7,8 @@ hammertime19 is a fork of Avid Grimm's hammertime gem: https://github.com/avdi/h
7
7
  hammertime19 is a Ruby 1.9.2+ (MRI and RBX) only version that adds support for starting a pry (https://github.com/pry/pry)
8
8
  session at the exception raise site.
9
9
 
10
+ hammertime19 also adds basic support for intercepting C-level based exceptions.
11
+
10
12
  == Install
11
13
 
12
14
  gem install hammertime19
@@ -81,7 +83,7 @@ This enables a fix-and-continue style of development:
81
83
  4. Permit by line (don't ask about future errors raised from this point)
82
84
  5. Backtrace (show the call stack leading up to the error)
83
85
  6. Debug (start a debugger)
84
- 7. Console (start an IRB session)
86
+ 7. Console (start a pry session)
85
87
  What now?
86
88
  2
87
89
  No error raised
@@ -90,13 +92,47 @@ This enables a fix-and-continue style of development:
90
92
  Attempt (3/3)
91
93
  No error raised
92
94
 
95
+ About non-explicitly raised errors:
96
+
97
+ An example of a non-explicitly raised error is if you divide by 0 which creates a
98
+ ZeroDivisionError.
99
+ Hammertime19 cannot process these errors in the same way as user raised errors can be processed.
100
+ However, they can be intercepted, and a pry session can be started at the exception site.
101
+
102
+ For example running this code:
103
+
104
+ require 'hammertime19'
105
+ 1 / 0
106
+
107
+ Gives you a pry console like this:
108
+
109
+ === Stop! Hammertime. ===
110
+ A C-level error has occurred at h.rb:2:in `/'
111
+ The error is: <ZeroDivisionError> divided by 0
112
+
113
+ From: h.rb @ line 2 :
114
+
115
+ 1: require 'hammertime19.'
116
+ => 2: 1 / 0
117
+
118
+ [1] pry(main)>
119
+
120
+ These types of errors cannot be recovered from, so when the pry session ends the program exits.
121
+
122
+ Hammertime19 doesn't know if the exception will be rescued, so therefore all exceptions that
123
+ are not explicitly raised will be intercepted in this way.
124
+
125
+ If you find that annoying, you can turn of this feature by calling:
126
+
127
+ Hammertime.intercept_native = false
128
+
93
129
  == Known Bugs
94
130
 
95
- * Hammertime cannot intercept exceptions which are raised from native code.
131
+ * Hammertime19 cannot recover from errors that are raised from native code.
132
+ * Hammertime19 cannot distinguish between native code exceptions that will be rescued and those that won't.
96
133
 
97
134
  == TODO
98
135
 
99
- * Better integration with IRB to enable a "Retry" option.
100
136
  * Tests
101
137
 
102
138
  == Dependencies
data/hammertime19.gemspec CHANGED
@@ -2,10 +2,10 @@
2
2
 
3
3
  Gem::Specification.new do |s|
4
4
  s.name = "hammertime19"
5
- s.version = "0.0.4"
5
+ s.version = "0.0.5"
6
6
 
7
7
  s.authors = ["Kalle Lindstrom"]
8
- s.date = "2012-08-20"
8
+ s.date = "2012-08-22"
9
9
  s.description = "When this library is required, it replaces the default Ruby exception-raising\nbehavior. When an error is raised, the developer is presented with a menu\nenabling them to ignore the error, view a stack trace, debug the error using IRB\nor ruby-debug, and more.\n"
10
10
  s.email = "lindstrom.kalle@gmail.com"
11
11
  s.extra_rdoc_files = [
data/lib/hammertime19.rb CHANGED
@@ -1,9 +1,10 @@
1
1
  #encoding: utf-8
2
2
 
3
- # https://github.com/kl/hammertime
3
+ # https://github.com/kl/hammertime19
4
4
  # Forked from https://github.com/avdi/hammertime
5
5
  # This fork works only with MRI 1.9.2+ and RBX
6
- # Adds support for starting a Pry session at the call site of the exception.
6
+ # Adds support for starting a Pry session at the call site of the exception
7
+ # and interception (not recovering from) non-raised exceptions.
7
8
 
8
9
  require 'thread'
9
10
  require 'highline'
@@ -11,6 +12,12 @@ require 'pry'
11
12
  require 'binding_of_caller'
12
13
 
13
14
  module Hammertime
15
+
16
+ class << self
17
+ attr_accessor :intercept_native
18
+ end
19
+ @intercept_native = true
20
+
14
21
  def self.ignored_errors
15
22
  @ignored_errors ||= [LoadError]
16
23
  end
@@ -163,6 +170,43 @@ module Hammertime
163
170
 
164
171
  end
165
172
 
173
+ #
174
+ # Modifies the Exception class so that all low level errors
175
+ # (errors that are not explicitly raised) are intercepted
176
+ # and a pry session is started at the error source location.
177
+ # Note it is not (yet?) possible to recover from these
178
+ # errors. After the pry session is over the program exits.
179
+ #
180
+ unless ::Object < Hammertime
181
+ class Exception
182
+
183
+ alias_method :exception_hammertime19_orig, :exception
184
+ def exception(*args, &block)
185
+ if ::Hammertime.intercept_native
186
+
187
+ # When binding.of_caller(1).pry is called several exceptions
188
+ # are raised but we only want to start a pry session on the
189
+ # first (original) exception.
190
+ # We also don't want to start a pry session if the exception
191
+ # originates from the hammertime library itself (for example
192
+ # when hammertime tries to require ruby-debug)
193
+ unless caller.any? { |t| t.include?("pry/core_extensions.rb") || t.include?("hammertime_raise") }
194
+
195
+ puts "\n"
196
+ puts "=== Stop! Hammertime. ==="
197
+ puts "A C-level error has occurred at #{caller(2).first}"
198
+ puts "The error is: <#{self.class}> #{self.message}"
199
+
200
+ binding.of_caller(1).pry
201
+ end
202
+ end
203
+
204
+ # Call the original method
205
+ exception_hammertime19_orig(*args, &block)
206
+ end
207
+ end
208
+ end
209
+
166
210
  unless ::Object < Hammertime
167
211
  class ::Object
168
212
  include ::Hammertime
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: hammertime19
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.4
4
+ version: 0.0.5
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: 2012-08-20 00:00:00.000000000 Z
12
+ date: 2012-08-22 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: highline