pry 0.10.2-i386-mingw32 → 1.0.0.pre1-i386-mingw32
Sign up to get free protection for your applications and to get access to all the features.
- data/.document +2 -0
- data/.gitignore +16 -0
- data/.travis.yml +21 -0
- data/.yardopts +3 -0
- data/CHANGELOG +503 -0
- data/CONTRIBUTORS +55 -0
- data/Gemfile +9 -0
- data/Guardfile +62 -0
- data/LICENSE +2 -2
- data/{README.md → README.markdown} +31 -37
- data/Rakefile +144 -0
- data/TODO +117 -0
- data/lib/pry.rb +146 -33
- data/lib/pry/cli.rb +13 -35
- data/lib/pry/code.rb +63 -24
- data/lib/pry/code/loc.rb +2 -2
- data/lib/pry/code_object.rb +21 -40
- data/lib/pry/command.rb +6 -9
- data/lib/pry/command_set.rb +37 -80
- data/lib/pry/commands.rb +1 -1
- data/lib/pry/commands/amend_line.rb +1 -1
- data/lib/pry/commands/bang.rb +1 -1
- data/lib/pry/commands/cat.rb +2 -11
- data/lib/pry/commands/cat/abstract_formatter.rb +1 -1
- data/lib/pry/commands/cat/exception_formatter.rb +7 -6
- data/lib/pry/commands/cat/file_formatter.rb +32 -15
- data/lib/pry/commands/cat/input_expression_formatter.rb +1 -1
- data/lib/pry/commands/cd.rb +3 -14
- data/lib/pry/commands/code_collector.rb +4 -4
- data/lib/pry/commands/easter_eggs.rb +3 -3
- data/lib/pry/commands/edit.rb +22 -10
- data/lib/pry/commands/edit/exception_patcher.rb +1 -1
- data/lib/pry/commands/edit/file_and_line_locator.rb +2 -0
- data/lib/pry/{method/patcher.rb → commands/edit/method_patcher.rb} +37 -40
- data/lib/pry/commands/find_method.rb +22 -16
- data/lib/pry/commands/gem_install.rb +2 -5
- data/lib/pry/commands/gem_open.rb +1 -1
- data/lib/pry/commands/gist.rb +11 -10
- data/lib/pry/commands/help.rb +14 -14
- data/lib/pry/commands/hist.rb +5 -24
- data/lib/pry/commands/ls.rb +287 -56
- data/lib/pry/commands/play.rb +10 -44
- data/lib/pry/commands/pry_backtrace.rb +2 -1
- data/lib/pry/commands/raise_up.rb +1 -1
- data/lib/pry/commands/reload_code.rb +15 -31
- data/lib/pry/commands/ri.rb +3 -7
- data/lib/pry/commands/shell_command.rb +12 -17
- data/lib/pry/commands/shell_mode.rb +2 -2
- data/lib/pry/commands/show_doc.rb +0 -5
- data/lib/pry/commands/show_info.rb +10 -11
- data/lib/pry/commands/show_source.rb +3 -15
- data/lib/pry/commands/simple_prompt.rb +1 -1
- data/lib/pry/commands/toggle_color.rb +4 -8
- data/lib/pry/commands/whereami.rb +10 -18
- data/lib/pry/completion.rb +293 -0
- data/lib/pry/config.rb +233 -20
- data/lib/pry/core_extensions.rb +19 -29
- data/lib/pry/custom_completions.rb +6 -0
- data/lib/pry/editor.rb +103 -109
- data/lib/pry/helpers/base_helpers.rb +109 -22
- data/lib/pry/helpers/command_helpers.rb +8 -10
- data/lib/pry/helpers/documentation_helpers.rb +2 -1
- data/lib/pry/helpers/text.rb +5 -4
- data/lib/pry/history.rb +10 -21
- data/lib/pry/history_array.rb +0 -5
- data/lib/pry/hooks.rb +29 -9
- data/lib/pry/indent.rb +10 -5
- data/lib/pry/method.rb +86 -81
- data/lib/pry/method/weird_method_locator.rb +2 -4
- data/lib/pry/module_candidate.rb +14 -5
- data/lib/pry/pager.rb +48 -193
- data/lib/pry/plugins.rb +2 -2
- data/lib/pry/pry_class.rb +193 -104
- data/lib/pry/pry_instance.rb +154 -152
- data/lib/pry/rbx_method.rb +13 -0
- data/lib/pry/rbx_path.rb +1 -1
- data/lib/pry/repl.rb +14 -17
- data/lib/pry/repl_file_loader.rb +3 -8
- data/lib/pry/rubygem.rb +3 -3
- data/lib/pry/terminal.rb +3 -4
- data/lib/pry/test/helper.rb +11 -6
- data/lib/pry/version.rb +1 -1
- data/lib/pry/wrapped_module.rb +56 -49
- data/man/pry.1 +195 -0
- data/man/pry.1.html +204 -0
- data/man/pry.1.ronn +141 -0
- data/pry.gemspec +31 -0
- data/spec/Procfile +3 -0
- data/spec/cli_spec.rb +78 -0
- data/spec/code_object_spec.rb +277 -0
- data/spec/code_spec.rb +219 -0
- data/spec/command_helpers_spec.rb +29 -0
- data/spec/command_integration_spec.rb +562 -0
- data/spec/command_set_spec.rb +627 -0
- data/spec/command_spec.rb +821 -0
- data/spec/commands/amend_line_spec.rb +247 -0
- data/spec/commands/bang_spec.rb +18 -0
- data/spec/commands/cat_spec.rb +164 -0
- data/spec/commands/cd_spec.rb +250 -0
- data/spec/commands/disable_pry_spec.rb +25 -0
- data/spec/commands/edit_spec.rb +725 -0
- data/spec/commands/exit_all_spec.rb +27 -0
- data/spec/commands/exit_program_spec.rb +19 -0
- data/spec/commands/exit_spec.rb +28 -0
- data/spec/commands/find_method_spec.rb +70 -0
- data/spec/commands/gem_list_spec.rb +26 -0
- data/spec/commands/gist_spec.rb +79 -0
- data/spec/commands/help_spec.rb +56 -0
- data/spec/commands/hist_spec.rb +172 -0
- data/spec/commands/jump_to_spec.rb +15 -0
- data/spec/commands/ls_spec.rb +189 -0
- data/spec/commands/play_spec.rb +136 -0
- data/spec/commands/raise_up_spec.rb +56 -0
- data/spec/commands/save_file_spec.rb +177 -0
- data/spec/commands/show_doc_spec.rb +488 -0
- data/spec/commands/show_input_spec.rb +17 -0
- data/spec/commands/show_source_spec.rb +760 -0
- data/spec/commands/whereami_spec.rb +203 -0
- data/spec/completion_spec.rb +221 -0
- data/spec/control_d_handler_spec.rb +62 -0
- data/spec/documentation_helper_spec.rb +73 -0
- data/spec/editor_spec.rb +79 -0
- data/spec/exception_whitelist_spec.rb +21 -0
- data/spec/fixtures/candidate_helper1.rb +11 -0
- data/spec/fixtures/candidate_helper2.rb +8 -0
- data/spec/fixtures/example.erb +5 -0
- data/spec/fixtures/example_nesting.rb +33 -0
- data/spec/fixtures/show_source_doc_examples.rb +15 -0
- data/spec/fixtures/testlinkrc +2 -0
- data/spec/fixtures/testrc +2 -0
- data/spec/fixtures/testrcbad +2 -0
- data/spec/fixtures/whereami_helper.rb +6 -0
- data/spec/helper.rb +35 -0
- data/spec/helpers/bacon.rb +86 -0
- data/spec/helpers/mock_pry.rb +44 -0
- data/spec/helpers/repl_tester.rb +112 -0
- data/spec/helpers/table_spec.rb +105 -0
- data/spec/history_array_spec.rb +67 -0
- data/spec/hooks_spec.rb +522 -0
- data/spec/indent_spec.rb +301 -0
- data/spec/method_spec.rb +482 -0
- data/spec/prompt_spec.rb +61 -0
- data/spec/pry_defaults_spec.rb +420 -0
- data/spec/pry_history_spec.rb +69 -0
- data/spec/pry_output_spec.rb +95 -0
- data/spec/pry_repl_spec.rb +86 -0
- data/spec/pry_spec.rb +394 -0
- data/spec/pryrc_spec.rb +97 -0
- data/spec/run_command_spec.rb +25 -0
- data/spec/sticky_locals_spec.rb +147 -0
- data/spec/syntax_checking_spec.rb +81 -0
- data/spec/wrapped_module_spec.rb +261 -0
- data/wiki/Customizing-pry.md +397 -0
- data/wiki/Home.md +4 -0
- metadata +272 -61
- checksums.yaml +0 -7
- data/CHANGELOG.md +0 -714
- data/lib/pry/code/code_file.rb +0 -103
- data/lib/pry/color_printer.rb +0 -55
- data/lib/pry/commands/change_inspector.rb +0 -27
- data/lib/pry/commands/change_prompt.rb +0 -26
- data/lib/pry/commands/list_inspectors.rb +0 -35
- data/lib/pry/commands/list_prompts.rb +0 -35
- data/lib/pry/commands/ls/constants.rb +0 -47
- data/lib/pry/commands/ls/formatter.rb +0 -49
- data/lib/pry/commands/ls/globals.rb +0 -48
- data/lib/pry/commands/ls/grep.rb +0 -21
- data/lib/pry/commands/ls/instance_vars.rb +0 -39
- data/lib/pry/commands/ls/interrogatable.rb +0 -18
- data/lib/pry/commands/ls/jruby_hacks.rb +0 -49
- data/lib/pry/commands/ls/local_names.rb +0 -35
- data/lib/pry/commands/ls/local_vars.rb +0 -39
- data/lib/pry/commands/ls/ls_entity.rb +0 -70
- data/lib/pry/commands/ls/methods.rb +0 -57
- data/lib/pry/commands/ls/methods_helper.rb +0 -46
- data/lib/pry/commands/ls/self_methods.rb +0 -32
- data/lib/pry/commands/watch_expression.rb +0 -105
- data/lib/pry/commands/watch_expression/expression.rb +0 -38
- data/lib/pry/config/behavior.rb +0 -139
- data/lib/pry/config/convenience.rb +0 -25
- data/lib/pry/config/default.rb +0 -161
- data/lib/pry/exceptions.rb +0 -78
- data/lib/pry/input_completer.rb +0 -242
- data/lib/pry/input_lock.rb +0 -132
- data/lib/pry/inspector.rb +0 -27
- data/lib/pry/last_exception.rb +0 -61
- data/lib/pry/object_path.rb +0 -82
- data/lib/pry/output.rb +0 -50
- data/lib/pry/prompt.rb +0 -26
@@ -104,10 +104,8 @@ class Pry
|
|
104
104
|
# TODO: Fix up the exception handling so we don't need a bare rescue
|
105
105
|
if normal_method?(guess)
|
106
106
|
return guess
|
107
|
-
elsif guess != guess.super
|
108
|
-
guess = guess.super
|
109
107
|
else
|
110
|
-
|
108
|
+
guess = guess.super
|
111
109
|
end
|
112
110
|
end
|
113
111
|
|
@@ -166,7 +164,7 @@ class Pry
|
|
166
164
|
end
|
167
165
|
|
168
166
|
def valid_file?(file)
|
169
|
-
(File.
|
167
|
+
(File.exists?(file) && !File.directory?(file)) || Pry.eval_path == file
|
170
168
|
end
|
171
169
|
|
172
170
|
def lines_for_file(file)
|
data/lib/pry/module_candidate.rb
CHANGED
@@ -23,10 +23,9 @@ class Pry
|
|
23
23
|
# Methods to delegate to associated `Pry::WrappedModule
|
24
24
|
# instance`.
|
25
25
|
private_delegates = [:lines_for_file, :method_candidates,
|
26
|
-
:yard_docs
|
26
|
+
:yard_docs?, :number_of_candidates]
|
27
27
|
|
28
|
-
public_delegates = [:wrapped, :module?, :class?, :name, :nonblank_name
|
29
|
-
:number_of_candidates]
|
28
|
+
public_delegates = [:wrapped, :module?, :class?, :name, :nonblank_name]
|
30
29
|
|
31
30
|
def_delegators :@wrapper, *(private_delegates + public_delegates)
|
32
31
|
private(*private_delegates)
|
@@ -112,13 +111,13 @@ class Pry
|
|
112
111
|
# @return [Array] The source location of the base method used to
|
113
112
|
# calculate the source location of the candidate.
|
114
113
|
def first_method_source_location
|
115
|
-
@first_method_source_location ||= method_candidates[@rank].first.source_location
|
114
|
+
@first_method_source_location ||= adjusted_source_location(method_candidates[@rank].first.source_location)
|
116
115
|
end
|
117
116
|
|
118
117
|
# @return [Array] The source location of the last method in this
|
119
118
|
# candidate's module definition.
|
120
119
|
def last_method_source_location
|
121
|
-
@end_method_source_location ||= method_candidates[@rank].last.source_location
|
120
|
+
@end_method_source_location ||= adjusted_source_location(method_candidates[@rank].last.source_location)
|
122
121
|
end
|
123
122
|
|
124
123
|
# Return the number of lines between the start of the class definition
|
@@ -131,6 +130,16 @@ class Pry
|
|
131
130
|
|
132
131
|
end_method_line - line
|
133
132
|
end
|
133
|
+
|
134
|
+
def adjusted_source_location(sl)
|
135
|
+
file, line = sl
|
136
|
+
|
137
|
+
if file && RbxPath.is_core_path?(file)
|
138
|
+
file = RbxPath.convert_path_to_full(file)
|
139
|
+
end
|
140
|
+
|
141
|
+
[file, line]
|
142
|
+
end
|
134
143
|
end
|
135
144
|
end
|
136
145
|
end
|
data/lib/pry/pager.rb
CHANGED
@@ -1,133 +1,64 @@
|
|
1
1
|
require 'pry/terminal'
|
2
|
-
|
3
|
-
# A pager is an `IO`-like object that accepts text and either prints it
|
4
|
-
# immediately, prints it one page at a time, or streams it to an external
|
5
|
-
# program to print one page at a time.
|
6
2
|
class Pry::Pager
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
# pagers accept output with `#puts`, `#print`, `#write`, and `#<<`.
|
30
|
-
# @param [IO] output (`$stdout`) An object to send output to.
|
31
|
-
def open
|
32
|
-
pager = best_available
|
33
|
-
yield pager
|
34
|
-
rescue StopPaging
|
35
|
-
ensure
|
36
|
-
pager.close if pager
|
37
|
-
end
|
38
|
-
|
39
|
-
private
|
40
|
-
|
41
|
-
def enabled?; !!@enabled; end
|
42
|
-
|
43
|
-
def output; @output; end
|
44
|
-
|
45
|
-
# Return an instance of the "best" available pager class -- `SystemPager` if
|
46
|
-
# possible, `SimplePager` if `SystemPager` isn't available, and `NullPager`
|
47
|
-
# if the user has disabled paging. All pagers accept output with `#puts`,
|
48
|
-
# `#print`, `#write`, and `#<<`. You must call `#close` when you're done
|
49
|
-
# writing output to a pager, and you must rescue `Pry::Pager::StopPaging`.
|
50
|
-
# These requirements can be avoided by using `.open` instead.
|
51
|
-
# @param [#<<] output ($stdout) An object to send output to.
|
52
|
-
def best_available
|
53
|
-
if !_pry_.config.pager
|
54
|
-
NullPager.new(_pry_.output)
|
55
|
-
elsif !SystemPager.available? || Pry::Helpers::BaseHelpers.jruby?
|
56
|
-
SimplePager.new(_pry_.output)
|
3
|
+
# @param [String] text
|
4
|
+
# A piece of text to run through a pager.
|
5
|
+
# @param [Symbol?] pager
|
6
|
+
# `:simple` -- Use the pure ruby pager.
|
7
|
+
# `:system` -- Use the system pager (less) or the environment variable
|
8
|
+
# $PAGER if set.
|
9
|
+
# `nil` -- Infer what pager to use from the environment. What this
|
10
|
+
# really means is that JRuby and systems that do not have
|
11
|
+
# access to 'less' will run through the pure ruby pager.
|
12
|
+
def self.page(text, pager = nil)
|
13
|
+
case pager
|
14
|
+
when nil
|
15
|
+
no_pager = !SystemPager.available?
|
16
|
+
if no_pager || Pry::Helpers::BaseHelpers.jruby?
|
17
|
+
SimplePager.new(text).page
|
18
|
+
else
|
19
|
+
SystemPager.new(text).page
|
20
|
+
end
|
21
|
+
when :simple
|
22
|
+
SimplePager.new(text).page
|
23
|
+
when :system
|
24
|
+
SystemPager.new(text).page
|
57
25
|
else
|
58
|
-
|
26
|
+
raise "'#{pager}' is not a recognized pager."
|
59
27
|
end
|
60
28
|
end
|
61
29
|
|
62
|
-
|
63
|
-
|
64
|
-
class NullPager
|
65
|
-
def initialize(out)
|
66
|
-
@out = out
|
67
|
-
end
|
68
|
-
|
69
|
-
def puts(str)
|
70
|
-
print "#{str.chomp}\n"
|
71
|
-
end
|
72
|
-
|
73
|
-
def print(str)
|
74
|
-
write str
|
75
|
-
end
|
76
|
-
alias << print
|
77
|
-
|
78
|
-
def write(str)
|
79
|
-
@out.write str
|
80
|
-
end
|
81
|
-
|
82
|
-
def close
|
83
|
-
end
|
84
|
-
|
85
|
-
private
|
86
|
-
|
87
|
-
def height
|
88
|
-
@height ||= Pry::Terminal.height!
|
89
|
-
end
|
90
|
-
|
91
|
-
def width
|
92
|
-
@width ||= Pry::Terminal.width!
|
93
|
-
end
|
30
|
+
def self.page_size
|
31
|
+
@page_size ||= Pry::Terminal.height!
|
94
32
|
end
|
95
33
|
|
96
|
-
|
97
|
-
|
98
|
-
|
99
|
-
def initialize(*)
|
100
|
-
super
|
101
|
-
@tracker = PageTracker.new(height - 3, width)
|
102
|
-
end
|
103
|
-
|
104
|
-
def write(str)
|
105
|
-
str.lines.each do |line|
|
106
|
-
@out.print line
|
107
|
-
@tracker.record line
|
34
|
+
def initialize(text)
|
35
|
+
@text = text
|
36
|
+
end
|
108
37
|
|
109
|
-
|
110
|
-
|
111
|
-
|
112
|
-
|
113
|
-
|
114
|
-
|
115
|
-
|
38
|
+
class SimplePager < Pry::Pager
|
39
|
+
def page
|
40
|
+
# The pager size minus the number of lines used by the simple pager info bar.
|
41
|
+
page_size = Pry::Pager.page_size - 3
|
42
|
+
text_array = @text.lines.to_a
|
43
|
+
|
44
|
+
text_array.each_slice(page_size) do |chunk|
|
45
|
+
puts chunk.join
|
46
|
+
break if chunk.size < page_size
|
47
|
+
if text_array.size > page_size
|
48
|
+
puts "\n<page break> --- Press enter to continue ( q<enter> to break ) --- <page break>"
|
49
|
+
break if $stdin.gets.chomp == "q"
|
116
50
|
end
|
117
51
|
end
|
118
52
|
end
|
119
53
|
end
|
120
54
|
|
121
|
-
|
122
|
-
# long, then invokes an external pager and starts streaming output to it. If
|
123
|
-
# `#close` is called before then, it just prints out the buffered content.
|
124
|
-
class SystemPager < NullPager
|
55
|
+
class SystemPager < Pry::Pager
|
125
56
|
def self.default_pager
|
126
57
|
pager = ENV["PAGER"] || ""
|
127
58
|
|
128
59
|
# Default to less, and make sure less is being passed the correct options
|
129
|
-
if pager.strip.empty? or pager =~ /^less\
|
130
|
-
pager = "less -R -F -X"
|
60
|
+
if pager.strip.empty? or pager =~ /^less\s*/
|
61
|
+
pager = "less -R -S -F -X"
|
131
62
|
end
|
132
63
|
|
133
64
|
pager
|
@@ -137,8 +68,7 @@ class Pry::Pager
|
|
137
68
|
if @system_pager.nil?
|
138
69
|
@system_pager = begin
|
139
70
|
pager_executable = default_pager.split(' ').first
|
140
|
-
`which #{pager_executable}`
|
141
|
-
$?.success?
|
71
|
+
`which #{ pager_executable }`
|
142
72
|
rescue
|
143
73
|
false
|
144
74
|
end
|
@@ -149,88 +79,13 @@ class Pry::Pager
|
|
149
79
|
|
150
80
|
def initialize(*)
|
151
81
|
super
|
152
|
-
@
|
153
|
-
@buffer = ""
|
154
|
-
end
|
155
|
-
|
156
|
-
def write(str)
|
157
|
-
if invoked_pager?
|
158
|
-
write_to_pager str
|
159
|
-
else
|
160
|
-
@tracker.record str
|
161
|
-
@buffer << str
|
162
|
-
|
163
|
-
if @tracker.page?
|
164
|
-
write_to_pager @buffer
|
165
|
-
end
|
166
|
-
end
|
167
|
-
rescue Errno::EPIPE
|
168
|
-
raise StopPaging
|
82
|
+
@pager = SystemPager.default_pager
|
169
83
|
end
|
170
84
|
|
171
|
-
def
|
172
|
-
|
173
|
-
|
174
|
-
else
|
175
|
-
@out.puts @buffer
|
85
|
+
def page
|
86
|
+
IO.popen(@pager, 'w') do |io|
|
87
|
+
io.write @text
|
176
88
|
end
|
177
89
|
end
|
178
|
-
|
179
|
-
private
|
180
|
-
|
181
|
-
def write_to_pager(text)
|
182
|
-
pager.write @out.decolorize_maybe(text)
|
183
|
-
end
|
184
|
-
|
185
|
-
def invoked_pager?
|
186
|
-
@pager
|
187
|
-
end
|
188
|
-
|
189
|
-
def pager
|
190
|
-
@pager ||= IO.popen(self.class.default_pager, 'w')
|
191
|
-
end
|
192
|
-
end
|
193
|
-
|
194
|
-
# `PageTracker` tracks output to determine whether it's likely to take up a
|
195
|
-
# whole page. This doesn't need to be super precise, but we can use it for
|
196
|
-
# `SimplePager` and to avoid invoking the system pager unnecessarily.
|
197
|
-
#
|
198
|
-
# One simplifying assumption is that we don't need `#page?` to return `true`
|
199
|
-
# on the basis of an incomplete line. Long lines should be counted as
|
200
|
-
# multiple lines, but we don't have to transition from `false` to `true`
|
201
|
-
# until we see a newline.
|
202
|
-
class PageTracker
|
203
|
-
def initialize(rows, cols)
|
204
|
-
@rows, @cols = rows, cols
|
205
|
-
reset
|
206
|
-
end
|
207
|
-
|
208
|
-
def record(str)
|
209
|
-
str.lines.each do |line|
|
210
|
-
if line.end_with? "\n"
|
211
|
-
@row += ((@col + line_length(line) - 1) / @cols) + 1
|
212
|
-
@col = 0
|
213
|
-
else
|
214
|
-
@col += line_length(line)
|
215
|
-
end
|
216
|
-
end
|
217
|
-
end
|
218
|
-
|
219
|
-
def page?
|
220
|
-
@row >= @rows
|
221
|
-
end
|
222
|
-
|
223
|
-
def reset
|
224
|
-
@row = 0
|
225
|
-
@col = 0
|
226
|
-
end
|
227
|
-
|
228
|
-
private
|
229
|
-
|
230
|
-
# Approximation of the printable length of a given line, without the
|
231
|
-
# newline and without ANSI color codes.
|
232
|
-
def line_length(line)
|
233
|
-
line.chomp.gsub(/\e\[[\d;]*m/, '').length
|
234
|
-
end
|
235
90
|
end
|
236
91
|
end
|
data/lib/pry/plugins.rb
CHANGED
@@ -35,7 +35,7 @@ class Pry
|
|
35
35
|
# Load the Command line options defined by this plugin (if they exist)
|
36
36
|
def load_cli_options
|
37
37
|
cli_options_file = File.join(spec.full_gem_path, "lib/#{spec.name}/cli.rb")
|
38
|
-
require cli_options_file if File.
|
38
|
+
require cli_options_file if File.exists?(cli_options_file)
|
39
39
|
end
|
40
40
|
# Activate the plugin (require the gem - enables/loads the
|
41
41
|
# plugin immediately at point of call, even if plugin is
|
@@ -43,7 +43,7 @@ class Pry
|
|
43
43
|
# Does not reload plugin if it's already active.
|
44
44
|
def activate!
|
45
45
|
# Create the configuration object for the plugin.
|
46
|
-
Pry.config.send("#{gem_name.gsub('-', '_')}=",
|
46
|
+
Pry.config.send("#{gem_name.gsub('-', '_')}=", OpenStruct.new)
|
47
47
|
|
48
48
|
begin
|
49
49
|
require gem_name if !active?
|
data/lib/pry/pry_class.rb
CHANGED
@@ -1,57 +1,70 @@
|
|
1
|
+
require 'ostruct'
|
2
|
+
require 'forwardable'
|
1
3
|
require 'pry/config'
|
4
|
+
|
2
5
|
class Pry
|
3
6
|
|
4
|
-
|
7
|
+
# The RC Files to load.
|
8
|
+
HOME_RC_FILE = "~/.pryrc"
|
5
9
|
LOCAL_RC_FILE = "./.pryrc"
|
6
10
|
|
11
|
+
# @return [Hash] Pry's `Thread.current` hash
|
12
|
+
def self.current
|
13
|
+
Thread.current[:__pry__] ||= {}
|
14
|
+
end
|
15
|
+
|
16
|
+
# class accessors
|
7
17
|
class << self
|
8
18
|
extend Forwardable
|
19
|
+
|
20
|
+
# convenience method
|
21
|
+
def self.delegate_accessors(delagatee, *names)
|
22
|
+
def_delegators delagatee, *names
|
23
|
+
def_delegators delagatee, *names.map { |v| "#{v}=" }
|
24
|
+
end
|
25
|
+
|
26
|
+
# Get/Set the Proc that defines extra Readline completions (on top
|
27
|
+
# of the ones defined for IRB).
|
28
|
+
# @return [Proc] The Proc that defines extra Readline completions (on top
|
29
|
+
# @example Add file names to completion list
|
30
|
+
# Pry.custom_completions = proc { Dir.entries('.') }
|
9
31
|
attr_accessor :custom_completions
|
32
|
+
|
33
|
+
# @return [Fixnum] The current input line.
|
10
34
|
attr_accessor :current_line
|
35
|
+
|
36
|
+
# @return [Array] The Array of evaluated expressions.
|
11
37
|
attr_accessor :line_buffer
|
38
|
+
|
39
|
+
# @return [String] The __FILE__ for the `eval()`. Should be "(pry)"
|
40
|
+
# by default.
|
12
41
|
attr_accessor :eval_path
|
13
|
-
attr_accessor :cli
|
14
|
-
attr_accessor :quiet
|
15
|
-
attr_accessor :last_internal_error
|
16
|
-
attr_accessor :config
|
17
|
-
attr_writer :history
|
18
42
|
|
19
|
-
|
43
|
+
# @return [OpenStruct] Return Pry's config object.
|
44
|
+
attr_accessor :config
|
20
45
|
|
21
|
-
|
22
|
-
|
46
|
+
# @return [History] Return Pry's line history object.
|
47
|
+
attr_accessor :history
|
23
48
|
|
24
|
-
|
25
|
-
|
26
|
-
end
|
49
|
+
# @return [Boolean] Whether Pry was activated from the command line.
|
50
|
+
attr_accessor :cli
|
27
51
|
|
28
|
-
|
29
|
-
|
30
|
-
end
|
52
|
+
# @return [Boolean] Whether Pry sessions are quiet by default.
|
53
|
+
attr_accessor :quiet
|
31
54
|
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
end
|
55
|
+
# @return [Exception, nil] The last pry internal error.
|
56
|
+
# (a CommandError in most cases)
|
57
|
+
attr_accessor :last_internal_error
|
36
58
|
|
37
|
-
|
38
|
-
|
39
|
-
# returns the special instance of Object, "main".
|
40
|
-
#
|
41
|
-
def self.main
|
42
|
-
@main ||= TOPLEVEL_BINDING.eval "self"
|
43
|
-
end
|
59
|
+
# plugin forwardables
|
60
|
+
def_delegators :@plugin_manager, :plugins, :load_plugins, :locate_plugins
|
44
61
|
|
45
|
-
|
46
|
-
|
47
|
-
# Returns a value store for an instance of Pry running on the current thread.
|
48
|
-
#
|
49
|
-
def self.current
|
50
|
-
Thread.current[:__pry__] ||= Pry::Config.from_hash({}, nil)
|
62
|
+
delegate_accessors :@config, :input, :output, :commands, :prompt, :print, :exception_handler,
|
63
|
+
:hooks, :color, :pager, :editor, :memory_size, :extra_sticky_locals
|
51
64
|
end
|
52
65
|
|
53
66
|
# Load the given file in the context of `Pry.toplevel_binding`
|
54
|
-
# @param [String]
|
67
|
+
# @param [String] file_name The unexpanded file path.
|
55
68
|
def self.load_file_at_toplevel(file)
|
56
69
|
toplevel_binding.eval(File.read(file), file)
|
57
70
|
rescue RescuableException => e
|
@@ -62,9 +75,7 @@ class Pry
|
|
62
75
|
# This method can also be used to reload the files if they have changed.
|
63
76
|
def self.load_rc_files
|
64
77
|
rc_files_to_load.each do |file|
|
65
|
-
|
66
|
-
load_file_at_toplevel(file)
|
67
|
-
end
|
78
|
+
load_file_at_toplevel(file)
|
68
79
|
end
|
69
80
|
end
|
70
81
|
|
@@ -98,28 +109,12 @@ class Pry
|
|
98
109
|
trap('INT'){ raise Interrupt }
|
99
110
|
end
|
100
111
|
|
101
|
-
def self.load_win32console
|
102
|
-
begin
|
103
|
-
require 'win32console'
|
104
|
-
# The mswin and mingw versions of pry require win32console, so this should
|
105
|
-
# only fail on jruby (where win32console doesn't work).
|
106
|
-
# Instead we'll recommend ansicon, which does.
|
107
|
-
rescue LoadError
|
108
|
-
warn <<-WARNING if Pry.config.windows_console_warning
|
109
|
-
For a better Pry experience on Windows, please use ansicon:
|
110
|
-
https://github.com/adoxa/ansicon
|
111
|
-
If you use an alternative to ansicon and don't want to see this warning again,
|
112
|
-
you can add "Pry.config.windows_console_warning = false" to your .pryrc.
|
113
|
-
WARNING
|
114
|
-
end
|
115
|
-
end
|
116
|
-
|
117
112
|
# Do basic setup for initial session.
|
118
113
|
# Including: loading .pryrc, loading plugins, loading requires, and
|
119
114
|
# loading history.
|
120
115
|
def self.initial_session_setup
|
121
|
-
|
122
|
-
|
116
|
+
|
117
|
+
return if !initial_session?
|
123
118
|
|
124
119
|
# note these have to be loaded here rather than in pry_instance as
|
125
120
|
# we only want them loaded once per entire Pry lifetime.
|
@@ -128,7 +123,8 @@ you can add "Pry.config.windows_console_warning = false" to your .pryrc.
|
|
128
123
|
load_requires if Pry.config.should_load_requires
|
129
124
|
load_history if Pry.config.history.should_load
|
130
125
|
load_traps if Pry.config.should_trap_interrupts
|
131
|
-
|
126
|
+
|
127
|
+
@initial_session = false
|
132
128
|
end
|
133
129
|
|
134
130
|
# Start a Pry REPL.
|
@@ -141,7 +137,6 @@ you can add "Pry.config.windows_console_warning = false" to your .pryrc.
|
|
141
137
|
# Pry.start(Object.new, :input => MyInput.new)
|
142
138
|
def self.start(target=nil, options={})
|
143
139
|
return if ENV['DISABLE_PRY']
|
144
|
-
options = options.to_hash
|
145
140
|
|
146
141
|
if in_critical_section?
|
147
142
|
output.puts "ERROR: Pry started inside Pry."
|
@@ -150,7 +145,7 @@ you can add "Pry.config.windows_console_warning = false" to your .pryrc.
|
|
150
145
|
end
|
151
146
|
|
152
147
|
options[:target] = Pry.binding_for(target || toplevel_binding)
|
153
|
-
|
148
|
+
|
154
149
|
initial_session_setup
|
155
150
|
|
156
151
|
# Unless we were given a backtrace, save the current one
|
@@ -179,40 +174,23 @@ you can add "Pry.config.windows_console_warning = false" to your .pryrc.
|
|
179
174
|
REPLFileLoader.new(file_name).load
|
180
175
|
end
|
181
176
|
|
182
|
-
#
|
183
177
|
# An inspector that clips the output to `max_length` chars.
|
184
178
|
# In case of > `max_length` chars the `#<Object...> notation is used.
|
185
|
-
#
|
186
|
-
# @param
|
187
|
-
#
|
188
|
-
|
189
|
-
|
190
|
-
# @option options [Integer] :max_length (60)
|
191
|
-
# The maximum number of chars before clipping occurs.
|
192
|
-
#
|
193
|
-
# @option options [Boolean] :id (false)
|
194
|
-
# Boolean to indicate whether or not a hex reprsentation of the object ID
|
195
|
-
# is attached to the return value when the length of inspect is greater than
|
196
|
-
# value of `:max_length`.
|
197
|
-
#
|
198
|
-
# @return [String]
|
199
|
-
# The string representation of `obj`.
|
200
|
-
#
|
201
|
-
def self.view_clip(obj, options = {})
|
202
|
-
max = options.fetch :max_length, 60
|
203
|
-
id = options.fetch :id, false
|
204
|
-
if obj.kind_of?(Module) && obj.name.to_s != "" && obj.name.to_s.length <= max
|
179
|
+
# @param obj The object to view.
|
180
|
+
# @param max_length The maximum number of chars before clipping occurs.
|
181
|
+
# @return [String] The string representation of `obj`.
|
182
|
+
def self.view_clip(obj, max_length = 60)
|
183
|
+
if obj.kind_of?(Module) && obj.name.to_s != "" && obj.name.to_s.length <= max_length
|
205
184
|
obj.name.to_s
|
206
|
-
elsif
|
207
|
-
# special
|
208
|
-
# fixed as of https://github.com/jruby/jruby/commit/d365ebd309cf9df3dde28f5eb36ea97056e0c039
|
209
|
-
# we can drop in the future.
|
185
|
+
elsif TOPLEVEL_BINDING.eval('self') == obj
|
186
|
+
# special case for 'main' object :)
|
210
187
|
obj.to_s
|
211
|
-
elsif
|
188
|
+
elsif [String, Numeric, Symbol, nil, true, false].any? { |v| v === obj } && obj.inspect.length <= max_length
|
212
189
|
obj.inspect
|
213
190
|
else
|
214
|
-
|
191
|
+
"#<#{obj.class}>"#:%x>"# % (obj.object_id << 1)
|
215
192
|
end
|
193
|
+
|
216
194
|
rescue RescuableException
|
217
195
|
"unknown"
|
218
196
|
end
|
@@ -229,7 +207,7 @@ you can add "Pry.config.windows_console_warning = false" to your .pryrc.
|
|
229
207
|
end
|
230
208
|
|
231
209
|
# Run a Pry command from outside a session. The commands available are
|
232
|
-
# those referenced by `Pry.
|
210
|
+
# those referenced by `Pry.commands` (the default command set).
|
233
211
|
# @param [String] command_string The Pry command (including arguments,
|
234
212
|
# if any).
|
235
213
|
# @param [Hash] options Optional named parameters.
|
@@ -248,8 +226,8 @@ you can add "Pry.config.windows_console_warning = false" to your .pryrc.
|
|
248
226
|
options = {
|
249
227
|
:target => TOPLEVEL_BINDING,
|
250
228
|
:show_output => true,
|
251
|
-
:output => Pry.
|
252
|
-
:commands => Pry.
|
229
|
+
:output => Pry.output,
|
230
|
+
:commands => Pry.commands
|
253
231
|
}.merge!(options)
|
254
232
|
|
255
233
|
# :context for compatibility with <= 0.9.11.4
|
@@ -263,6 +241,7 @@ you can add "Pry.config.windows_console_warning = false" to your .pryrc.
|
|
263
241
|
def self.default_editor_for_platform
|
264
242
|
return ENV['VISUAL'] if ENV['VISUAL'] and not ENV['VISUAL'].empty?
|
265
243
|
return ENV['EDITOR'] if ENV['EDITOR'] and not ENV['EDITOR'].empty?
|
244
|
+
|
266
245
|
if Helpers::BaseHelpers.windows?
|
267
246
|
'notepad'
|
268
247
|
else
|
@@ -273,22 +252,15 @@ you can add "Pry.config.windows_console_warning = false" to your .pryrc.
|
|
273
252
|
end
|
274
253
|
|
275
254
|
def self.auto_resize!
|
276
|
-
|
277
|
-
|
278
|
-
if !defined?(Readline) || Pry.config.input != Readline
|
279
|
-
warn "Sorry, you must be using Readline for Pry.auto_resize! to work."
|
280
|
-
return
|
281
|
-
end
|
282
|
-
|
283
|
-
if Readline::VERSION =~ /edit/i
|
255
|
+
ver = Readline::VERSION
|
256
|
+
if ver[/edit/i]
|
284
257
|
warn <<-EOT
|
285
|
-
Readline version #{
|
258
|
+
Readline version #{ver} detected - will not auto_resize! correctly.
|
286
259
|
For the fix, use GNU Readline instead:
|
287
260
|
https://github.com/guard/guard/wiki/Add-proper-Readline-support-to-Ruby-on-Mac-OS-X
|
288
261
|
EOT
|
289
262
|
return
|
290
263
|
end
|
291
|
-
|
292
264
|
trap :WINCH do
|
293
265
|
begin
|
294
266
|
Readline.set_screen_size(*Terminal.size!)
|
@@ -303,19 +275,136 @@ Readline version #{Readline::VERSION} detected - will not auto_resize! correctly
|
|
303
275
|
end
|
304
276
|
end
|
305
277
|
|
278
|
+
def self.set_config_defaults
|
279
|
+
config.input = Readline
|
280
|
+
config.output = $stdout
|
281
|
+
config.commands = Pry::Commands
|
282
|
+
config.prompt_name = DEFAULT_PROMPT_NAME
|
283
|
+
config.prompt = DEFAULT_PROMPT
|
284
|
+
config.print = DEFAULT_PRINT
|
285
|
+
config.exception_handler = DEFAULT_EXCEPTION_HANDLER
|
286
|
+
config.exception_whitelist = DEFAULT_EXCEPTION_WHITELIST
|
287
|
+
config.default_window_size = 5
|
288
|
+
config.hooks = DEFAULT_HOOKS
|
289
|
+
config.color = Helpers::BaseHelpers.use_ansi_codes?
|
290
|
+
config.pager = true
|
291
|
+
config.system = DEFAULT_SYSTEM
|
292
|
+
config.editor = default_editor_for_platform
|
293
|
+
config.should_load_rc = true
|
294
|
+
config.should_load_local_rc = true
|
295
|
+
config.should_trap_interrupts = Helpers::BaseHelpers.jruby?
|
296
|
+
config.disable_auto_reload = false
|
297
|
+
config.command_prefix = ""
|
298
|
+
config.auto_indent = Helpers::BaseHelpers.use_ansi_codes?
|
299
|
+
config.correct_indent = true
|
300
|
+
config.collision_warning = false
|
301
|
+
config.output_prefix = "=> "
|
302
|
+
|
303
|
+
if defined?(Bond) && Readline::VERSION !~ /editline/i
|
304
|
+
config.completer = Pry::BondCompleter.start
|
305
|
+
else
|
306
|
+
config.completer = Pry::InputCompleter.start
|
307
|
+
end
|
308
|
+
|
309
|
+
config.gist ||= OpenStruct.new
|
310
|
+
config.gist.inspecter = proc(&:pretty_inspect)
|
311
|
+
|
312
|
+
config.should_load_plugins = true
|
313
|
+
|
314
|
+
config.requires ||= []
|
315
|
+
config.should_load_requires = true
|
316
|
+
|
317
|
+
config.history ||= OpenStruct.new
|
318
|
+
config.history.should_save = true
|
319
|
+
config.history.should_load = true
|
320
|
+
config.history.file = File.expand_path("~/.pry_history") rescue nil
|
321
|
+
|
322
|
+
if config.history.file.nil?
|
323
|
+
config.should_load_rc = false
|
324
|
+
config.history.should_save = false
|
325
|
+
config.history.should_load = false
|
326
|
+
end
|
327
|
+
|
328
|
+
config.control_d_handler = DEFAULT_CONTROL_D_HANDLER
|
329
|
+
|
330
|
+
config.memory_size = 100
|
331
|
+
|
332
|
+
config.extra_sticky_locals = {}
|
333
|
+
|
334
|
+
config.ls ||= OpenStruct.new({
|
335
|
+
:heading_color => :bright_blue,
|
336
|
+
|
337
|
+
:public_method_color => :default,
|
338
|
+
:private_method_color => :blue,
|
339
|
+
:protected_method_color => :blue,
|
340
|
+
:method_missing_color => :bright_red,
|
341
|
+
|
342
|
+
:local_var_color => :yellow,
|
343
|
+
:pry_var_color => :default, # e.g. _, _pry_, _file_
|
344
|
+
|
345
|
+
:instance_var_color => :blue, # e.g. @foo
|
346
|
+
:class_var_color => :bright_blue, # e.g. @@foo
|
347
|
+
|
348
|
+
:global_var_color => :default, # e.g. $CODERAY_DEBUG, $eventmachine_library
|
349
|
+
:builtin_global_color => :cyan, # e.g. $stdin, $-w, $PID
|
350
|
+
:pseudo_global_color => :cyan, # e.g. $~, $1..$9, $LAST_MATCH_INFO
|
351
|
+
|
352
|
+
:constant_color => :default, # e.g. VERSION, ARGF
|
353
|
+
:class_constant_color => :blue, # e.g. Object, Kernel
|
354
|
+
:exception_constant_color => :magenta, # e.g. Exception, RuntimeError
|
355
|
+
:unloaded_constant_color => :yellow, # Any constant that is still in .autoload? state
|
356
|
+
|
357
|
+
# What should separate items listed by ls? (TODO: we should allow a columnar layout)
|
358
|
+
:separator => " ",
|
359
|
+
|
360
|
+
# Any methods defined on these classes, or modules included into these classes, will not
|
361
|
+
# be shown by ls unless the -v flag is used.
|
362
|
+
# A user of Rails may wih to add ActiveRecord::Base to the list.
|
363
|
+
# add the following to your .pryrc:
|
364
|
+
# Pry.config.ls.ceiling << ActiveRecord::Base if defined? ActiveRecordBase
|
365
|
+
:ceiling => [Object, Module, Class]
|
366
|
+
})
|
367
|
+
end
|
368
|
+
|
306
369
|
# Set all the configurable options back to their default values
|
307
370
|
def self.reset_defaults
|
371
|
+
set_config_defaults
|
372
|
+
|
308
373
|
@initial_session = true
|
309
|
-
|
374
|
+
|
375
|
+
self.custom_completions = DEFAULT_CUSTOM_COMPLETIONS
|
310
376
|
self.cli = false
|
311
377
|
self.current_line = 1
|
312
378
|
self.line_buffer = [""]
|
313
379
|
self.eval_path = "(pry)"
|
380
|
+
|
381
|
+
fix_coderay_colors
|
382
|
+
end
|
383
|
+
|
384
|
+
# To avoid mass-confusion, we change the default colour of "white" to
|
385
|
+
# "blue" enabling global legibility
|
386
|
+
def self.fix_coderay_colors
|
387
|
+
to_fix = if (CodeRay::Encoders::Terminal::TOKEN_COLORS rescue nil)
|
388
|
+
# CodeRay 1.0.0
|
389
|
+
CodeRay::Encoders::Terminal::TOKEN_COLORS
|
390
|
+
else
|
391
|
+
# CodeRay 0.9
|
392
|
+
begin
|
393
|
+
require 'coderay/encoders/term'
|
394
|
+
CodeRay::Encoders::Term::TOKEN_COLORS
|
395
|
+
rescue
|
396
|
+
end
|
397
|
+
end
|
398
|
+
|
399
|
+
to_fix[:comment] = "0;34" if to_fix
|
314
400
|
end
|
315
401
|
|
316
402
|
# Basic initialization.
|
317
403
|
def self.init
|
318
404
|
@plugin_manager ||= PluginManager.new
|
405
|
+
self.config ||= Config.new
|
406
|
+
self.history ||= History.new
|
407
|
+
|
319
408
|
reset_defaults
|
320
409
|
locate_plugins
|
321
410
|
end
|
@@ -329,7 +418,7 @@ Readline version #{Readline::VERSION} detected - will not auto_resize! correctly
|
|
329
418
|
if Binding === target
|
330
419
|
target
|
331
420
|
else
|
332
|
-
if
|
421
|
+
if TOPLEVEL_BINDING.eval('self') == target
|
333
422
|
TOPLEVEL_BINDING
|
334
423
|
else
|
335
424
|
target.__binding__
|
@@ -359,16 +448,16 @@ Readline version #{Readline::VERSION} detected - will not auto_resize! correctly
|
|
359
448
|
end
|
360
449
|
|
361
450
|
def self.in_critical_section?
|
362
|
-
|
363
|
-
|
451
|
+
@critical_section ||= 0
|
452
|
+
@critical_section > 0
|
364
453
|
end
|
365
454
|
|
366
455
|
def self.critical_section(&block)
|
367
|
-
|
368
|
-
|
456
|
+
@critical_section ||= 0
|
457
|
+
@critical_section += 1
|
369
458
|
yield
|
370
459
|
ensure
|
371
|
-
|
460
|
+
@critical_section -= 1
|
372
461
|
end
|
373
462
|
end
|
374
463
|
|