pry 0.10.2-i386-mingw32 → 1.0.0.pre1-i386-mingw32
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/.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
|
|