pry 0.9.6.2 → 0.9.7
Sign up to get free protection for your applications and to get access to all the features.
- data/.gitignore +6 -0
- data/CHANGELOG +19 -1
- data/CONTRIBUTORS +22 -16
- data/Rakefile +12 -6
- data/bin/pry +15 -12
- data/lib/pry.rb +39 -28
- data/lib/pry/command_context.rb +1 -0
- data/lib/pry/command_processor.rb +9 -2
- data/lib/pry/command_set.rb +7 -0
- data/lib/pry/config.rb +8 -0
- data/lib/pry/default_commands/basic.rb +7 -10
- data/lib/pry/default_commands/context.rb +36 -26
- data/lib/pry/default_commands/documentation.rb +31 -123
- data/lib/pry/default_commands/gems.rb +9 -4
- data/lib/pry/default_commands/input.rb +21 -11
- data/lib/pry/default_commands/introspection.rb +79 -88
- data/lib/pry/default_commands/ls.rb +165 -176
- data/lib/pry/default_commands/shell.rb +8 -8
- data/lib/pry/extended_commands/experimental.rb +1 -5
- data/lib/pry/extended_commands/user_command_api.rb +17 -5
- data/lib/pry/helpers.rb +1 -0
- data/lib/pry/helpers/base_helpers.rb +5 -1
- data/lib/pry/helpers/command_helpers.rb +22 -241
- data/lib/pry/helpers/options_helpers.rb +58 -0
- data/lib/pry/helpers/text.rb +10 -4
- data/lib/pry/history.rb +1 -1
- data/lib/pry/indent.rb +205 -0
- data/lib/pry/method.rb +412 -0
- data/lib/pry/pry_class.rb +56 -15
- data/lib/pry/pry_instance.rb +63 -16
- data/lib/pry/rbx_method.rb +20 -0
- data/lib/pry/rbx_path.rb +34 -0
- data/lib/pry/version.rb +1 -1
- data/pry.gemspec +16 -16
- data/test/helper.rb +8 -4
- data/test/test_command_helpers.rb +1 -69
- data/test/test_command_set.rb +29 -28
- data/test/test_default_commands/test_documentation.rb +23 -10
- data/test/test_default_commands/test_introspection.rb +58 -13
- data/test/test_default_commands/test_ls.rb +148 -0
- data/test/test_indent.rb +234 -0
- data/test/test_input_stack.rb +13 -0
- data/test/test_method.rb +291 -0
- data/test/test_pry.rb +10 -1
- metadata +82 -65
data/.gitignore
CHANGED
data/CHANGELOG
CHANGED
@@ -1,3 +1,21 @@
|
|
1
|
+
25/10/2011 version 0.9.7
|
2
|
+
|
3
|
+
MAJOR NEW FEATURES:
|
4
|
+
- upgraded ls command to have a more intuitive interface
|
5
|
+
- added automatic indentation (thanks YorickPeterse!)
|
6
|
+
- added Pry::Method wrapper class to encapsulate method-related functionality
|
7
|
+
|
8
|
+
complete CHANGELOG:
|
9
|
+
* fixed syntax highlighting for object literals
|
10
|
+
* fixed ActiveSupport method-naming conflict with "in?"
|
11
|
+
* started using JRuby parser for input validation in JRuby (thanks pangloss!)
|
12
|
+
* fixed bug where ~/.pryrc could be loaded more than once (thanks kelseyjudson!)
|
13
|
+
* added parse_options! helper to pull option parsing out of commands
|
14
|
+
* Pry now respects the terminal's input encoding
|
15
|
+
* moved some requires out of the startup process for improved speed
|
16
|
+
* added input_array info to DEFAULT_PROMPT, e.g [1] pry(main)>
|
17
|
+
* added --no-history option to pry binary (prevent history being LOADED, history will still be saved)
|
18
|
+
|
1
19
|
27/9/2011 version 0.9.6.2 HOTFIX release
|
2
20
|
* downgrading to CodeRay 0.9.8 due to problems with 1.0 and rails (autoloading problem) see #280 on pry and #6 on CodeRay
|
3
21
|
* also added (as a minor feature) cirwin's implementation of edit --in
|
@@ -77,7 +95,7 @@ complete CHANGELOG:
|
|
77
95
|
* ls separator configurable via, e.g Pry.config.ls.separator = " "
|
78
96
|
* Pry.view_clip() now only calls inspect on a few immediates, otherwise uses the #<> syntax, which has been truncated further to exclude teh mem address, again related to #245
|
79
97
|
|
80
|
-
|
98
|
+
27/7/2011 version 0.9.3
|
81
99
|
* cat --ex (cats 5 lines above and below line in file where exception was raised)
|
82
100
|
* edit --ex (edits line in file where exception was raised)
|
83
101
|
* edit -t (opens a temporary file and evals it in current context when closed)
|
data/CONTRIBUTORS
CHANGED
@@ -1,16 +1,22 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
13 epitron
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
2
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
1
|
1
|
+
687 John Mair <jrmair@gmail.com>
|
2
|
+
82 Conrad Irwin <conrad.irwin@gmail.com>
|
3
|
+
76 Rob Gleeson <rob@flowof.info>
|
4
|
+
70 Ryan Fitzgerald <rwfitzge@gmail.com>
|
5
|
+
50 Lee Jarvis <lee@jarvis.co>
|
6
|
+
47 Mon ouïe <mon.ouie@gmail.com>
|
7
|
+
18 David Palm <dpalm@elctech.com>
|
8
|
+
13 epitron <chris@ill-logic.com>
|
9
|
+
8 Eero Saynatkari <projects@kittensoft.org>
|
10
|
+
6 Yorick Peterse <yorickpeterse@gmail.com>
|
11
|
+
3 Darrick Wiebe <darrick@innatesoftware.com>
|
12
|
+
2 robgleeson <rob@flowof.info>
|
13
|
+
2 Eric Christopherson <echristopherson@gmail.com>
|
14
|
+
2 Kelsey Judson <kelseyjudson@gmail.com>
|
15
|
+
2 Xavier Shay <xavier@rhnh.net>
|
16
|
+
1 Josh Cheek <josh.cheek@gmail.com>
|
17
|
+
1 Tim Pope <code@tpope.net>
|
18
|
+
1 Gosha Arinich <me@goshakkk.name>
|
19
|
+
1 Shawn Anderson <shawn42@gmail.com>
|
20
|
+
1 Jordan Running <jrunning@gmail.com>
|
21
|
+
1 fowlmouth <phowl.mouth@gmail.com>
|
22
|
+
1 Lars Haugseth <git@larshaugseth.com>
|
data/Rakefile
CHANGED
@@ -1,6 +1,5 @@
|
|
1
1
|
require 'rake/clean'
|
2
|
-
require
|
3
|
-
require "rubygems/package_task"
|
2
|
+
require 'rake/gempackagetask'
|
4
3
|
|
5
4
|
$:.unshift 'lib'
|
6
5
|
require 'pry/version'
|
@@ -21,7 +20,7 @@ def apply_spec_defaults(s)
|
|
21
20
|
s.executables = ["pry"]
|
22
21
|
s.files = `git ls-files`.split("\n")
|
23
22
|
s.test_files = `git ls-files -- test/*`.split("\n")
|
24
|
-
s.add_dependency("ruby_parser","~>2.
|
23
|
+
s.add_dependency("ruby_parser","~>2.3.1")
|
25
24
|
s.add_dependency("coderay","~>0.9.8")
|
26
25
|
s.add_dependency("slop","~>2.1.0")
|
27
26
|
s.add_dependency("method_source","~>0.6.5")
|
@@ -38,6 +37,13 @@ task :test do
|
|
38
37
|
sh "bacon -Itest -rubygems -a -q"
|
39
38
|
end
|
40
39
|
|
40
|
+
desc "profile pry's startup time"
|
41
|
+
task :profile do
|
42
|
+
require 'profile'
|
43
|
+
require 'pry'
|
44
|
+
Pry.start(TOPLEVEL_BINDING, :input => StringIO.new('exit'))
|
45
|
+
end
|
46
|
+
|
41
47
|
desc "run pry"
|
42
48
|
task :pry do
|
43
49
|
load 'bin/pry'
|
@@ -54,7 +60,7 @@ namespace :ruby do
|
|
54
60
|
s.platform = Gem::Platform::RUBY
|
55
61
|
end
|
56
62
|
|
57
|
-
|
63
|
+
Rake::GemPackageTask.new(spec) do |pkg|
|
58
64
|
pkg.need_zip = false
|
59
65
|
pkg.need_tar = false
|
60
66
|
end
|
@@ -74,7 +80,7 @@ namespace :jruby do
|
|
74
80
|
s.platform = "java"
|
75
81
|
end
|
76
82
|
|
77
|
-
|
83
|
+
Rake::GemPackageTask.new(spec) do |pkg|
|
78
84
|
pkg.need_zip = false
|
79
85
|
pkg.need_tar = false
|
80
86
|
end
|
@@ -89,7 +95,7 @@ end
|
|
89
95
|
s.platform = "i386-#{v}"
|
90
96
|
end
|
91
97
|
|
92
|
-
|
98
|
+
Rake::GemPackageTask.new(spec) do |pkg|
|
93
99
|
pkg.need_zip = false
|
94
100
|
pkg.need_tar = false
|
95
101
|
end
|
data/bin/pry
CHANGED
@@ -15,14 +15,19 @@ end
|
|
15
15
|
opts = Slop.parse(:help => true, :multiple_switches => false) do
|
16
16
|
banner %{Usage: pry [OPTIONS]
|
17
17
|
Start a Pry session.
|
18
|
-
See: `https://github.com/
|
18
|
+
See: `https://github.com/pry` for more information.
|
19
|
+
Copyright (c) 2011 John Mair (banisterfiend)
|
19
20
|
--
|
20
21
|
}
|
21
22
|
|
22
23
|
on :e, :exec, "A line of code to execute in context before the session starts", true
|
23
24
|
|
24
25
|
on "no-pager", "Disable pager for long output" do
|
25
|
-
Pry.pager = false
|
26
|
+
Pry.config.pager = false
|
27
|
+
end
|
28
|
+
|
29
|
+
on "no-history", "Disable history loading" do
|
30
|
+
Pry.config.history.should_load = false
|
26
31
|
end
|
27
32
|
|
28
33
|
on "no-color", "Disable syntax highlighting for session" do
|
@@ -39,7 +44,14 @@ See: `https://github.com/banister` for more information.
|
|
39
44
|
Pry.config.plugins.enabled = false
|
40
45
|
end
|
41
46
|
|
42
|
-
on "installed-plugins", "List installed plugins."
|
47
|
+
on "installed-plugins", "List installed plugins." do
|
48
|
+
puts "Installed Plugins:"
|
49
|
+
puts "--"
|
50
|
+
Pry.locate_plugins.each do |plugin|
|
51
|
+
puts "#{plugin.name}".ljust(18) + plugin.spec.summary
|
52
|
+
end
|
53
|
+
exit
|
54
|
+
end
|
43
55
|
|
44
56
|
on "simple-prompt", "Enable simple prompt mode" do
|
45
57
|
Pry.prompt = Pry::SIMPLE_PROMPT
|
@@ -65,15 +77,6 @@ See: `https://github.com/banister` for more information.
|
|
65
77
|
)
|
66
78
|
end
|
67
79
|
|
68
|
-
if opts["installed-plugins"]
|
69
|
-
puts "Installed Plugins:"
|
70
|
-
puts "--"
|
71
|
-
Pry.locate_plugins.each do |plugin|
|
72
|
-
puts "#{plugin.name}".ljust(18) + plugin.spec.summary
|
73
|
-
end
|
74
|
-
exit
|
75
|
-
end
|
76
|
-
|
77
80
|
# invoked via cli
|
78
81
|
Pry.cli = true
|
79
82
|
|
data/lib/pry.rb
CHANGED
@@ -1,5 +1,6 @@
|
|
1
1
|
# (C) John Mair (banisterfiend) 2011
|
2
2
|
# MIT License
|
3
|
+
#
|
3
4
|
|
4
5
|
require 'pp'
|
5
6
|
require 'pry/helpers/base_helpers'
|
@@ -11,7 +12,7 @@ class Pry
|
|
11
12
|
file = target.eval('__FILE__')
|
12
13
|
|
13
14
|
# /unknown/ for rbx
|
14
|
-
if file !~ /(\(.*\))|<.*>/ && file !~ /__unknown__/ && file != "" && file != "-e"
|
15
|
+
if file == Pry.eval_path || (file !~ /(\(.*\))|<.*>/ && file !~ /__unknown__/ && file != "" && file != "-e")
|
15
16
|
_pry_.process_line("whereami 5", "", target)
|
16
17
|
end
|
17
18
|
end
|
@@ -31,7 +32,11 @@ class Pry
|
|
31
32
|
stringified = "#<#{klass}:0x#{value.__id__.to_s(16)}>"
|
32
33
|
end
|
33
34
|
|
34
|
-
|
35
|
+
nonce = rand(0x100000000).to_s(16) # whatever
|
36
|
+
|
37
|
+
colorized = Helpers::BaseHelpers.colorize_code(stringified.gsub(/#</, "%<#{nonce}"))
|
38
|
+
|
39
|
+
Helpers::BaseHelpers.stagger_output("=> #{colorized.gsub(/%<(.*?)#{nonce}/, '#<\1')}", output)
|
35
40
|
end
|
36
41
|
|
37
42
|
# may be convenient when working with enormous objects and
|
@@ -60,42 +65,23 @@ class Pry
|
|
60
65
|
|
61
66
|
# The default prompt; includes the target and nesting level
|
62
67
|
DEFAULT_PROMPT = [
|
63
|
-
proc { |target_self, nest_level,
|
68
|
+
proc { |target_self, nest_level, pry|
|
64
69
|
if nest_level == 0
|
65
|
-
"pry(#{Pry.view_clip(target_self)})> "
|
70
|
+
"[#{pry.input_array.size}] pry(#{Pry.view_clip(target_self)})> "
|
66
71
|
else
|
67
|
-
"pry(#{Pry.view_clip(target_self)}):#{nest_level}> "
|
72
|
+
"[#{pry.input_array.size}] pry(#{Pry.view_clip(target_self)}):#{nest_level}> "
|
68
73
|
end
|
69
74
|
},
|
70
75
|
|
71
|
-
proc { |target_self, nest_level,
|
76
|
+
proc { |target_self, nest_level, pry|
|
72
77
|
if nest_level == 0
|
73
|
-
"pry(#{Pry.view_clip(target_self)})* "
|
78
|
+
"[#{pry.input_array.size}] pry(#{Pry.view_clip(target_self)})* "
|
74
79
|
else
|
75
|
-
"pry(#{Pry.view_clip(target_self)}):#{nest_level}* "
|
80
|
+
"[#{pry.input_array.size}] pry(#{Pry.view_clip(target_self)}):#{nest_level}* "
|
76
81
|
end
|
77
82
|
}
|
78
83
|
]
|
79
84
|
|
80
|
-
# Deal with the ^D key being pressed, different behaviour in
|
81
|
-
# different cases:
|
82
|
-
# 1) In an expression - behave like `!` command (clear input buffer)
|
83
|
-
# 2) At top-level session - behave like `exit command (break out of repl loop)
|
84
|
-
# 3) In a nested session - behave like `cd ..` (pop a binding)
|
85
|
-
DEFAULT_CONTROL_D_HANDLER = proc do |eval_string, _pry_|
|
86
|
-
if !eval_string.empty?
|
87
|
-
# clear input buffer
|
88
|
-
eval_string.replace("")
|
89
|
-
elsif _pry_.binding_stack.one?
|
90
|
-
# ^D at top-level breaks out of loop
|
91
|
-
_pry_.binding_stack.clear
|
92
|
-
throw(:breakout)
|
93
|
-
else
|
94
|
-
# otherwise just pops a binding
|
95
|
-
_pry_.binding_stack.pop
|
96
|
-
end
|
97
|
-
end
|
98
|
-
|
99
85
|
# A simple prompt - doesn't display target or nesting level
|
100
86
|
SIMPLE_PROMPT = [proc { ">> " }, proc { " | " }]
|
101
87
|
|
@@ -117,6 +103,25 @@ class Pry
|
|
117
103
|
end,
|
118
104
|
]
|
119
105
|
|
106
|
+
# Deal with the ^D key being pressed, different behaviour in
|
107
|
+
# different cases:
|
108
|
+
# 1) In an expression - behave like `!` command (clear input buffer)
|
109
|
+
# 2) At top-level session - behave like `exit command (break out of repl loop)
|
110
|
+
# 3) In a nested session - behave like `cd ..` (pop a binding)
|
111
|
+
DEFAULT_CONTROL_D_HANDLER = proc do |eval_string, _pry_|
|
112
|
+
if !eval_string.empty?
|
113
|
+
# clear input buffer
|
114
|
+
eval_string.replace("")
|
115
|
+
elsif _pry_.binding_stack.one?
|
116
|
+
# ^D at top-level breaks out of loop
|
117
|
+
_pry_.binding_stack.clear
|
118
|
+
throw(:breakout)
|
119
|
+
else
|
120
|
+
# otherwise just pops a binding
|
121
|
+
_pry_.binding_stack.pop
|
122
|
+
end
|
123
|
+
end
|
124
|
+
|
120
125
|
DEFAULT_SYSTEM = proc do |output, cmd, _|
|
121
126
|
if !system(cmd)
|
122
127
|
output.puts "Error: there was a problem executing system command: #{cmd}"
|
@@ -144,6 +149,10 @@ class Pry
|
|
144
149
|
end
|
145
150
|
end
|
146
151
|
|
152
|
+
# CommandErrors are caught by the REPL loop and displayed to the user. They
|
153
|
+
# indicate an exceptional condition that's fatal to the current command.
|
154
|
+
class CommandError < StandardError
|
155
|
+
end
|
147
156
|
end
|
148
157
|
|
149
158
|
require "method_source"
|
@@ -153,7 +162,6 @@ require "stringio"
|
|
153
162
|
require "coderay"
|
154
163
|
require "optparse"
|
155
164
|
require "slop"
|
156
|
-
require "rubygems/dependency_installer"
|
157
165
|
|
158
166
|
if RUBY_PLATFORM =~ /jruby/
|
159
167
|
begin
|
@@ -173,6 +181,9 @@ if RUBY_PLATFORM =~ /mswin/ || RUBY_PLATFORM =~ /mingw/
|
|
173
181
|
end
|
174
182
|
|
175
183
|
require "pry/version"
|
184
|
+
require "pry/rbx_method"
|
185
|
+
require "pry/rbx_path"
|
186
|
+
require "pry/method"
|
176
187
|
require "pry/history_array"
|
177
188
|
require "pry/helpers"
|
178
189
|
require "pry/history"
|
data/lib/pry/command_context.rb
CHANGED
@@ -126,7 +126,11 @@ class Pry
|
|
126
126
|
# remove the one leading space if it exists
|
127
127
|
arg_string.slice!(0) if arg_string.start_with?(" ")
|
128
128
|
|
129
|
-
|
129
|
+
if arg_string
|
130
|
+
args = command.options[:shellwords] ? Shellwords.shellwords(arg_string) : arg_string.split(" ")
|
131
|
+
else
|
132
|
+
args = []
|
133
|
+
end
|
130
134
|
|
131
135
|
options = {
|
132
136
|
:val => val,
|
@@ -164,7 +168,10 @@ class Pry
|
|
164
168
|
|
165
169
|
context.command_processor = self
|
166
170
|
|
167
|
-
ret =
|
171
|
+
ret = nil
|
172
|
+
catch(:command_done) do
|
173
|
+
ret = commands.run_command(context, command, *args)
|
174
|
+
end
|
168
175
|
|
169
176
|
options[:val].replace("")
|
170
177
|
|
data/lib/pry/command_set.rb
CHANGED
@@ -11,6 +11,8 @@ class Pry
|
|
11
11
|
class Command < Struct.new(:name, :description, :options, :block)
|
12
12
|
|
13
13
|
def call(context, *args)
|
14
|
+
context.command_name = options[:listing]
|
15
|
+
|
14
16
|
if stub_block = options[:stub_info]
|
15
17
|
context.instance_eval(&stub_block)
|
16
18
|
else
|
@@ -81,6 +83,9 @@ class Pry
|
|
81
83
|
# @option options [Boolean] :use_prefix Whether the command uses
|
82
84
|
# `Pry.config.command_prefix` prefix (if one is defined). Defaults
|
83
85
|
# to true.
|
86
|
+
# @option options [Boolean] :shellwords Whether the command's arguments
|
87
|
+
# should be split using Shellwords instead of just split on spaces.
|
88
|
+
# Defaults to true.
|
84
89
|
# @yield The action to perform. The parameters in the block
|
85
90
|
# determines the parameters the command will receive. All
|
86
91
|
# parameters passed into the block will be strings. Successive
|
@@ -118,6 +123,7 @@ class Pry
|
|
118
123
|
:keep_retval => false,
|
119
124
|
:argument_required => false,
|
120
125
|
:interpolate => true,
|
126
|
+
:shellwords => true,
|
121
127
|
:listing => name,
|
122
128
|
:use_prefix => true
|
123
129
|
}.merge!(options)
|
@@ -254,6 +260,7 @@ class Pry
|
|
254
260
|
end
|
255
261
|
|
256
262
|
command "install-command", "Install a disabled command." do |name|
|
263
|
+
require 'rubygems/dependency_installer' unless defined? Gem::DependencyInstaller
|
257
264
|
command = find_command(name)
|
258
265
|
stub_info = command.options[:stub_info]
|
259
266
|
|
data/lib/pry/config.rb
CHANGED
@@ -32,6 +32,10 @@ class Pry
|
|
32
32
|
# @return [Array] The classes of exception that will not be caught by Pry.
|
33
33
|
attr_accessor :exception_whitelist
|
34
34
|
|
35
|
+
# @return [Fixnum] The number of lines of context to show before and after
|
36
|
+
# the exception when using cat --ex.
|
37
|
+
attr_accessor :exception_window_size
|
38
|
+
|
35
39
|
# Get/Set the Hash that defines Pry hooks used by default by all Pry
|
36
40
|
# instances.
|
37
41
|
# @return [Hash] The hooks used by default by all Pry instances.
|
@@ -126,6 +130,10 @@ class Pry
|
|
126
130
|
# The proc is passed the pry output object, the command string
|
127
131
|
# to eval, and a reference to the pry instance
|
128
132
|
attr_accessor :system
|
133
|
+
|
134
|
+
# @return [Boolean] Whether or not code should be indented
|
135
|
+
# using Pry::Indent.
|
136
|
+
attr_accessor :auto_indent
|
129
137
|
end
|
130
138
|
end
|
131
139
|
|
@@ -21,24 +21,21 @@ class Pry
|
|
21
21
|
end
|
22
22
|
|
23
23
|
command "import-set", "Import a command set" do |command_set_name|
|
24
|
-
|
24
|
+
raise CommandError, "Provide a command set name" if command_set.nil?
|
25
25
|
|
26
26
|
set = target.eval(arg_string)
|
27
27
|
_pry_.commands.import set
|
28
28
|
end
|
29
29
|
|
30
30
|
command "reload-method", "Reload the source file that contains the specified method" do |meth_name|
|
31
|
-
|
32
|
-
output.puts "Invalid method name: #{meth_name}."
|
33
|
-
next
|
34
|
-
end
|
31
|
+
meth = get_method_or_raise(meth_name, target, {}, :omit_help)
|
35
32
|
|
36
|
-
if
|
37
|
-
|
38
|
-
elsif
|
39
|
-
|
33
|
+
if meth.source_type == :c
|
34
|
+
raise CommandError, "Can't reload a C method."
|
35
|
+
elsif meth.dynamically_defined?
|
36
|
+
raise CommandError, "Can't reload an eval method."
|
40
37
|
else
|
41
|
-
file_name = meth.
|
38
|
+
file_name = meth.source_file
|
42
39
|
load file_name
|
43
40
|
output.puts "Reloaded #{file_name}."
|
44
41
|
end
|
@@ -50,7 +50,7 @@ class Pry
|
|
50
50
|
selection = selection.to_i
|
51
51
|
|
52
52
|
if selection < 0 || selection > _pry_.binding_stack.size - 1
|
53
|
-
|
53
|
+
raise CommandError, "Invalid binding index #{selection} - use `nesting` command to view valid indices."
|
54
54
|
else
|
55
55
|
Pry.start(_pry_.binding_stack[selection])
|
56
56
|
end
|
@@ -137,42 +137,52 @@ class Pry
|
|
137
137
|
i_num = 5
|
138
138
|
end
|
139
139
|
|
140
|
-
|
141
|
-
|
140
|
+
if (meth = Pry::Method.from_binding(target))
|
141
|
+
meth_name = meth.name
|
142
|
+
else
|
143
|
+
meth_name = "N/A"
|
144
|
+
end
|
142
145
|
|
143
|
-
if file =~ /(\(.*\))|<.*>/ || file == "" || file == "-e"
|
144
|
-
|
145
|
-
next
|
146
|
+
if file != Pry.eval_path && (file =~ /(\(.*\))|<.*>/ || file == "" || file == "-e")
|
147
|
+
raise CommandError, "Cannot find local context. Did you use `binding.pry`?"
|
146
148
|
end
|
147
149
|
|
148
150
|
set_file_and_dir_locals(file)
|
149
151
|
output.puts "\n#{text.bold('From:')} #{file} @ line #{line_num} in #{klass}##{meth_name}:\n\n"
|
150
152
|
|
151
|
-
|
152
|
-
|
153
|
-
|
153
|
+
if file == Pry.eval_path
|
154
|
+
f = Pry.line_buffer[1..-1]
|
155
|
+
else
|
156
|
+
unless File.readable?(file)
|
157
|
+
raise CommandError, "Cannot open #{file.inspect} for reading."
|
158
|
+
end
|
159
|
+
f = File.open(file)
|
154
160
|
end
|
155
161
|
|
156
162
|
# This method inspired by http://rubygems.org/gems/ir_b
|
157
|
-
|
158
|
-
|
159
|
-
|
160
|
-
|
161
|
-
|
162
|
-
|
163
|
-
|
164
|
-
|
165
|
-
|
166
|
-
|
167
|
-
|
168
|
-
|
169
|
-
|
170
|
-
|
171
|
-
|
163
|
+
begin
|
164
|
+
f.each_with_index do |line, index|
|
165
|
+
line_n = index + 1
|
166
|
+
next unless line_n > (line_num - i_num - 1)
|
167
|
+
break if line_n > (line_num + i_num)
|
168
|
+
if line_n == line_num
|
169
|
+
code =" =>#{line_n.to_s.rjust(3)}: #{line.chomp}"
|
170
|
+
if Pry.color
|
171
|
+
code = CodeRay.scan(code, :ruby).term
|
172
|
+
end
|
173
|
+
output.puts code
|
174
|
+
code
|
175
|
+
else
|
176
|
+
code = "#{line_n.to_s.rjust(6)}: #{line.chomp}"
|
177
|
+
if Pry.color
|
178
|
+
code = CodeRay.scan(code, :ruby).term
|
179
|
+
end
|
180
|
+
output.puts code
|
181
|
+
code
|
172
182
|
end
|
173
|
-
output.puts code
|
174
|
-
code
|
175
183
|
end
|
184
|
+
ensure
|
185
|
+
f.close if f.respond_to?(:close)
|
176
186
|
end
|
177
187
|
end
|
178
188
|
|