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
@@ -6,6 +6,8 @@ class Pry
|
|
6
6
|
group 'Context'
|
7
7
|
description 'Recursively search for a method within a Class/Module or the current namespace.'
|
8
8
|
command_options :shellwords => false
|
9
|
+
command_options :requires_gem => 'ruby18_source_location' if mri_18?
|
10
|
+
|
9
11
|
|
10
12
|
banner <<-'BANNER'
|
11
13
|
Usage: find-method [-n|-c] METHOD [NAMESPACE]
|
@@ -24,9 +26,13 @@ class Pry
|
|
24
26
|
find-method -c 'output.puts' Pry
|
25
27
|
BANNER
|
26
28
|
|
27
|
-
def
|
28
|
-
|
29
|
-
|
29
|
+
def setup
|
30
|
+
require 'ruby18_source_location' if mri_18?
|
31
|
+
end
|
32
|
+
|
33
|
+
def options(opti)
|
34
|
+
opti.on :n, :name, "Search for a method by name"
|
35
|
+
opti.on :c, :content, "Search for a method based on content in Regex form"
|
30
36
|
end
|
31
37
|
|
32
38
|
def process
|
@@ -76,7 +82,7 @@ class Pry
|
|
76
82
|
|
77
83
|
# pretty-print a list of matching methods.
|
78
84
|
#
|
79
|
-
# @param [
|
85
|
+
# @param Array[Method]
|
80
86
|
def print_matches(matches)
|
81
87
|
grouped = matches.group_by(&:owner)
|
82
88
|
order = grouped.keys.sort_by{ |x| x.name || x.to_s }
|
@@ -99,7 +105,7 @@ class Pry
|
|
99
105
|
# if `-c` was not given
|
100
106
|
def additional_info(header, method)
|
101
107
|
if opts.content?
|
102
|
-
": "
|
108
|
+
": " + colorize_code(matched_method_lines(header, method))
|
103
109
|
else
|
104
110
|
""
|
105
111
|
end
|
@@ -111,9 +117,9 @@ class Pry
|
|
111
117
|
|
112
118
|
# Run the given block against every constant in the provided namespace.
|
113
119
|
#
|
114
|
-
# @param
|
115
|
-
# @param [
|
116
|
-
# @yieldparam
|
120
|
+
# @param Module The namespace in which to start the search.
|
121
|
+
# @param Hash[Module,Boolean] The namespaces we've already visited (private)
|
122
|
+
# @yieldparam klazz Each class/module in the namespace.
|
117
123
|
#
|
118
124
|
def recurse_namespace(klass, done={}, &block)
|
119
125
|
return if !(Module === klass) || done[klass]
|
@@ -139,10 +145,10 @@ class Pry
|
|
139
145
|
|
140
146
|
# Gather all the methods in a namespace that pass the given block.
|
141
147
|
#
|
142
|
-
# @param
|
143
|
-
# @yieldparam
|
144
|
-
# @yieldreturn
|
145
|
-
# @return [
|
148
|
+
# @param Module The namespace in which to search.
|
149
|
+
# @yieldparam Method The method to test
|
150
|
+
# @yieldreturn Boolean
|
151
|
+
# @return Array[Method]
|
146
152
|
#
|
147
153
|
def search_all_methods(namespace)
|
148
154
|
done = Hash.new{ |h,k| h[k] = {} }
|
@@ -163,8 +169,8 @@ class Pry
|
|
163
169
|
# Search for all methods with a name that matches the given regex
|
164
170
|
# within a namespace.
|
165
171
|
#
|
166
|
-
# @param
|
167
|
-
# @return [
|
172
|
+
# @param Module The namespace to search
|
173
|
+
# @return Array[Method]
|
168
174
|
#
|
169
175
|
def name_search(namespace)
|
170
176
|
search_all_methods(namespace) do |meth|
|
@@ -175,8 +181,8 @@ class Pry
|
|
175
181
|
# Search for all methods who's implementation matches the given regex
|
176
182
|
# within a namespace.
|
177
183
|
#
|
178
|
-
# @param
|
179
|
-
# @return [
|
184
|
+
# @param Module The namespace to search
|
185
|
+
# @return Array[Method]
|
180
186
|
#
|
181
187
|
def content_search(namespace)
|
182
188
|
search_all_methods(namespace) do |meth|
|
@@ -8,8 +8,8 @@ class Pry
|
|
8
8
|
banner <<-'BANNER'
|
9
9
|
Usage: gem-install GEM_NAME
|
10
10
|
|
11
|
-
Installs the given gem
|
12
|
-
|
11
|
+
Installs the given gem and refreshes the gem cache so that you can immediately
|
12
|
+
'require GEM_FILE'.
|
13
13
|
|
14
14
|
gem-install pry-stack_explorer
|
15
15
|
BANNER
|
@@ -22,9 +22,6 @@ class Pry
|
|
22
22
|
Rubygem.install(gem)
|
23
23
|
output.puts "Gem `#{ text.green(gem) }` installed."
|
24
24
|
require gem
|
25
|
-
rescue LoadError
|
26
|
-
require_path = gem.split('-').join('/')
|
27
|
-
require require_path
|
28
25
|
end
|
29
26
|
end
|
30
27
|
|
@@ -2,7 +2,7 @@ class Pry
|
|
2
2
|
class Command::GemOpen < Pry::ClassCommand
|
3
3
|
match 'gem-open'
|
4
4
|
group 'Gems'
|
5
|
-
description 'Opens the working directory of the gem in your editor
|
5
|
+
description 'Opens the working directory of the gem in your editor'
|
6
6
|
command_options :argument_required => true
|
7
7
|
|
8
8
|
banner <<-'BANNER'
|
data/lib/pry/commands/gist.rb
CHANGED
@@ -2,8 +2,8 @@ class Pry
|
|
2
2
|
class Command::Gist < Pry::ClassCommand
|
3
3
|
match 'gist'
|
4
4
|
group 'Misc'
|
5
|
-
description '
|
6
|
-
command_options :requires_gem => "
|
5
|
+
description 'Playback a string variable or a method or a file as input.'
|
6
|
+
command_options :requires_gem => "jist"
|
7
7
|
|
8
8
|
banner <<-'BANNER'
|
9
9
|
Usage: gist [OPTIONS] [--help]
|
@@ -16,18 +16,18 @@ class Pry
|
|
16
16
|
BANNER
|
17
17
|
|
18
18
|
def setup
|
19
|
-
require '
|
19
|
+
require 'jist'
|
20
20
|
end
|
21
21
|
|
22
22
|
def options(opt)
|
23
23
|
CodeCollector.inject_options(opt)
|
24
|
-
opt.on :login, "Authenticate the
|
24
|
+
opt.on :login, "Authenticate the jist gem with GitHub"
|
25
25
|
opt.on :p, :public, "Create a public gist (default: false)", :default => false
|
26
26
|
opt.on :clip, "Copy the selected content to clipboard instead, do NOT gist it", :default => false
|
27
27
|
end
|
28
28
|
|
29
29
|
def process
|
30
|
-
return
|
30
|
+
return Jist.login! if opts.present?(:login)
|
31
31
|
cc = CodeCollector.new(args, opts, _pry_)
|
32
32
|
|
33
33
|
if cc.content =~ /\A\s*\z/
|
@@ -45,7 +45,7 @@ class Pry
|
|
45
45
|
end
|
46
46
|
|
47
47
|
def clipboard_content(content)
|
48
|
-
|
48
|
+
Jist.copy(content)
|
49
49
|
output.puts "Copied content to clipboard!"
|
50
50
|
end
|
51
51
|
|
@@ -58,7 +58,7 @@ class Pry
|
|
58
58
|
if code && code != ""
|
59
59
|
content << code
|
60
60
|
if code !~ /;\Z/
|
61
|
-
content << "#{comment_expression_result_for_gist(
|
61
|
+
content << "#{comment_expression_result_for_gist(Pry.config.gist.inspecter.call(_pry_.output_array[corrected_index]))}"
|
62
62
|
end
|
63
63
|
end
|
64
64
|
end
|
@@ -81,14 +81,14 @@ class Pry
|
|
81
81
|
end
|
82
82
|
|
83
83
|
def gist_content(content, filename)
|
84
|
-
response =
|
84
|
+
response = Jist.gist(content, :filename => filename || "pry_gist.rb", :public => !!opts[:p])
|
85
85
|
if response
|
86
86
|
url = response['html_url']
|
87
87
|
message = "Gist created at URL #{url}"
|
88
88
|
begin
|
89
|
-
|
89
|
+
Jist.copy(url)
|
90
90
|
message << ", which is now in the clipboard."
|
91
|
-
rescue ::
|
91
|
+
rescue Jist::ClipboardError
|
92
92
|
end
|
93
93
|
|
94
94
|
output.puts message
|
@@ -98,4 +98,5 @@ class Pry
|
|
98
98
|
|
99
99
|
Pry::Commands.add_command(Pry::Command::Gist)
|
100
100
|
Pry::Commands.alias_command 'clipit', 'gist --clip'
|
101
|
+
Pry::Commands.alias_command 'jist', 'gist'
|
101
102
|
end
|
data/lib/pry/commands/help.rb
CHANGED
@@ -2,14 +2,14 @@ class Pry
|
|
2
2
|
class Command::Help < Pry::ClassCommand
|
3
3
|
match 'help'
|
4
4
|
group 'Help'
|
5
|
-
description 'Show a list of commands or information about a specific command
|
5
|
+
description 'Show a list of commands or information about a specific command'
|
6
6
|
|
7
7
|
banner <<-'BANNER'
|
8
8
|
Usage: help [COMMAND]
|
9
9
|
|
10
|
-
With no arguments, help lists all the available commands
|
11
|
-
|
12
|
-
for that command.
|
10
|
+
With no arguments, help lists all the available commands in the current
|
11
|
+
command-set along with their description. When given a command name as an
|
12
|
+
argument, shows the help for that command.
|
13
13
|
BANNER
|
14
14
|
|
15
15
|
# We only want to show commands that have descriptions, so that the
|
@@ -37,7 +37,7 @@ class Pry
|
|
37
37
|
|
38
38
|
# Display the index view, with headings and short descriptions per command.
|
39
39
|
#
|
40
|
-
# @param [
|
40
|
+
# @param Hash[String => Array[Commands]]
|
41
41
|
def display_index(groups)
|
42
42
|
help_text = []
|
43
43
|
|
@@ -49,18 +49,18 @@ class Pry
|
|
49
49
|
end
|
50
50
|
end
|
51
51
|
|
52
|
-
|
52
|
+
stagger_output(help_text.join("\n\n"))
|
53
53
|
end
|
54
54
|
|
55
55
|
# Given a group name and an array of commands,
|
56
56
|
# return the help string for those commands.
|
57
57
|
#
|
58
58
|
# @param [String] name The group name.
|
59
|
-
# @param [Array<Pry::Command>] commands
|
59
|
+
# @param [Array<Pry::Command>]] commands
|
60
60
|
# @return [String] The generated help string.
|
61
61
|
def help_text_for_commands(name, commands)
|
62
|
-
"#{text.bold(name
|
63
|
-
" #{command.options[:listing].to_s.ljust(18)} #{command.description
|
62
|
+
"#{text.bold(name)}\n" + commands.map do |command|
|
63
|
+
" #{command.options[:listing].to_s.ljust(18)} #{command.description}"
|
64
64
|
end.join("\n")
|
65
65
|
end
|
66
66
|
|
@@ -121,7 +121,7 @@ class Pry
|
|
121
121
|
#
|
122
122
|
# @param [Pry::Command] command
|
123
123
|
def display_command(command)
|
124
|
-
|
124
|
+
stagger_output command.new.help
|
125
125
|
end
|
126
126
|
|
127
127
|
# Find a subset of a hash that matches the user's search term.
|
@@ -130,8 +130,8 @@ class Pry
|
|
130
130
|
# otherwise a sub-Hash with every key that matches the search will
|
131
131
|
# be returned.
|
132
132
|
#
|
133
|
-
# @param [String]
|
134
|
-
# @param [Hash]
|
133
|
+
# @param [String] the search term
|
134
|
+
# @param [Hash] the hash to search
|
135
135
|
def search_hash(search, hash)
|
136
136
|
matching = {}
|
137
137
|
|
@@ -149,8 +149,8 @@ class Pry
|
|
149
149
|
|
150
150
|
# Clean search terms to make it easier to search group names
|
151
151
|
#
|
152
|
-
# @param
|
153
|
-
# @return
|
152
|
+
# @param String
|
153
|
+
# @return String
|
154
154
|
def normalize(key)
|
155
155
|
key.downcase.gsub(/pry\W+/, '')
|
156
156
|
end
|
data/lib/pry/commands/hist.rb
CHANGED
@@ -6,7 +6,6 @@ class Pry
|
|
6
6
|
|
7
7
|
banner <<-'BANNER'
|
8
8
|
Usage: hist [--head|--tail]
|
9
|
-
hist --all
|
10
9
|
hist --head N
|
11
10
|
hist --tail N
|
12
11
|
hist --show START..END
|
@@ -20,7 +19,6 @@ class Pry
|
|
20
19
|
BANNER
|
21
20
|
|
22
21
|
def options(opt)
|
23
|
-
opt.on :a, :all, "Display all history"
|
24
22
|
opt.on :H, :head, "Display the first N items", :optional_argument => true, :as => Integer
|
25
23
|
opt.on :T, :tail, "Display the last N items", :optional_argument => true, :as => Integer
|
26
24
|
opt.on :s, :show, "Show the given range of lines", :optional_argument => true, :as => Range
|
@@ -30,10 +28,12 @@ class Pry
|
|
30
28
|
opt.on :save, "Save history to a file", :argument => true, :as => Range
|
31
29
|
opt.on :e, :'exclude-pry', "Exclude Pry commands from the history"
|
32
30
|
opt.on :n, :'no-numbers', "Omit line numbers"
|
31
|
+
opt.on :f, :flood, "Do not use a pager to view text longer than one screen"
|
33
32
|
end
|
34
33
|
|
35
34
|
def process
|
36
|
-
|
35
|
+
# The last value in history will be the 'hist' command itself
|
36
|
+
@history = Pry::Code(Pry.history.to_a[0..-2])
|
37
37
|
|
38
38
|
if opts.present?(:show)
|
39
39
|
@history = @history.between(opts[:show])
|
@@ -55,9 +55,7 @@ class Pry
|
|
55
55
|
end
|
56
56
|
|
57
57
|
if opts.present?(:'exclude-pry')
|
58
|
-
@history = @history.select
|
59
|
-
!command_set.valid_command?(loc.line)
|
60
|
-
end
|
58
|
+
@history = @history.select { |l, ln| !command_set.valid_command?(l) }
|
61
59
|
end
|
62
60
|
|
63
61
|
if opts.present?(:save)
|
@@ -78,9 +76,7 @@ class Pry
|
|
78
76
|
@history = @history.with_line_numbers
|
79
77
|
end
|
80
78
|
|
81
|
-
|
82
|
-
@history.print_to_output(pager, true)
|
83
|
-
end
|
79
|
+
render_output(@history, opts)
|
84
80
|
end
|
85
81
|
|
86
82
|
def process_save
|
@@ -158,21 +154,6 @@ class Pry
|
|
158
154
|
false
|
159
155
|
end
|
160
156
|
end
|
161
|
-
|
162
|
-
# Finds history depending on the given switch.
|
163
|
-
#
|
164
|
-
# @return [Pry::Code] if it finds `--all` (or `-a`) switch, returns all
|
165
|
-
# entries in history. Without the switch returns only the entries from the
|
166
|
-
# current Pry session.
|
167
|
-
def find_history
|
168
|
-
h = if opts.present?(:all)
|
169
|
-
Pry.history.to_a
|
170
|
-
else
|
171
|
-
Pry.history.to_a.last(Pry.history.session_line_count)
|
172
|
-
end
|
173
|
-
# The last value in history will be the 'hist' command itself.
|
174
|
-
Pry::Code(h[0..-2])
|
175
|
-
end
|
176
157
|
end
|
177
158
|
|
178
159
|
Pry::Commands.add_command(Pry::Command::Hist)
|
data/lib/pry/commands/ls.rb
CHANGED
@@ -1,28 +1,5 @@
|
|
1
|
-
require 'pry/commands/ls/ls_entity'
|
2
1
|
class Pry
|
3
2
|
class Command::Ls < Pry::ClassCommand
|
4
|
-
DEFAULT_OPTIONS = {
|
5
|
-
:heading_color => :bright_blue,
|
6
|
-
:public_method_color => :default,
|
7
|
-
:private_method_color => :blue,
|
8
|
-
:protected_method_color => :blue,
|
9
|
-
:method_missing_color => :bright_red,
|
10
|
-
:local_var_color => :yellow,
|
11
|
-
:pry_var_color => :default, # e.g. _, _pry_, _file_
|
12
|
-
:instance_var_color => :blue, # e.g. @foo
|
13
|
-
:class_var_color => :bright_blue, # e.g. @@foo
|
14
|
-
:global_var_color => :default, # e.g. $CODERAY_DEBUG, $eventmachine_library
|
15
|
-
:builtin_global_color => :cyan, # e.g. $stdin, $-w, $PID
|
16
|
-
:pseudo_global_color => :cyan, # e.g. $~, $1..$9, $LAST_MATCH_INFO
|
17
|
-
:constant_color => :default, # e.g. VERSION, ARGF
|
18
|
-
:class_constant_color => :blue, # e.g. Object, Kernel
|
19
|
-
:exception_constant_color => :magenta, # e.g. Exception, RuntimeError
|
20
|
-
:unloaded_constant_color => :yellow, # Any constant that is still in .autoload? state
|
21
|
-
:separator => " ",
|
22
|
-
:ceiling => [Object, Module, Class]
|
23
|
-
}
|
24
|
-
|
25
|
-
|
26
3
|
match 'ls'
|
27
4
|
group 'Context'
|
28
5
|
description 'Show the list of vars and methods in the current scope.'
|
@@ -44,21 +21,19 @@ class Pry
|
|
44
21
|
methods defined on all Objects are omitted. The -v flag can be used to ignore
|
45
22
|
this setting and show all methods, while the -q can be used to set the ceiling
|
46
23
|
much lower and show only methods defined on the object or its direct class.
|
47
|
-
|
48
|
-
Also check out `find-method` command (run `help find-method`).
|
49
24
|
BANNER
|
50
25
|
|
51
26
|
|
52
27
|
def options(opt)
|
53
|
-
opt.on :m, :methods, "Show public methods defined on the Object"
|
54
|
-
opt.on :M, "instance-methods", "Show
|
28
|
+
opt.on :m, :methods, "Show public methods defined on the Object (default)"
|
29
|
+
opt.on :M, "instance-methods", "Show methods defined in a Module or Class"
|
55
30
|
opt.on :p, :ppp, "Show public, protected (in yellow) and private (in green) methods"
|
56
31
|
opt.on :q, :quiet, "Show only methods defined on object.singleton_class and object.class"
|
57
32
|
opt.on :v, :verbose, "Show methods and constants on all super-classes (ignores Pry.config.ls.ceiling)"
|
58
33
|
opt.on :g, :globals, "Show global variables, including those builtin to Ruby (in cyan)"
|
59
34
|
opt.on :l, :locals, "Show hash of local vars, sorted by descending size"
|
60
|
-
opt.on :c, :constants, "Show constants, highlighting classes (in blue), and exceptions (in purple).\n"
|
61
|
-
" " * 32
|
35
|
+
opt.on :c, :constants, "Show constants, highlighting classes (in blue), and exceptions (in purple).\n" +
|
36
|
+
" " * 32 + "Constants that are pending autoload? are also shown (in yellow)"
|
62
37
|
opt.on :i, :ivars, "Show instance variables (in blue) and class variables (in bright blue)"
|
63
38
|
opt.on :G, :grep, "Filter output by regular expression", :argument => true
|
64
39
|
|
@@ -67,47 +42,303 @@ class Pry
|
|
67
42
|
end
|
68
43
|
end
|
69
44
|
|
70
|
-
|
71
|
-
# don't specify what the user wants to see.
|
72
|
-
def no_user_opts?
|
73
|
-
!(opts[:methods] || opts['instance-methods'] || opts[:ppp] ||
|
74
|
-
opts[:globals] || opts[:locals] || opts[:constants] || opts[:ivars])
|
75
|
-
end
|
45
|
+
attr_reader :object_to_interrogate, :has_user_specified_any_options, :grep, :grep_regex
|
76
46
|
|
77
47
|
def process
|
78
|
-
@
|
48
|
+
@object_to_interrogate = args.empty? ? target_self : target.eval(args.join(" "))
|
49
|
+
|
50
|
+
# exclude -q, -v and --grep because they don't specify what the user wants to see.
|
51
|
+
@has_user_specified_any_options = (opts.present?(:methods) || opts.present?(:'instance-methods') || opts.present?(:ppp) ||
|
52
|
+
opts.present?(:globals) || opts.present?(:locals) || opts.present?(:constants) ||
|
53
|
+
opts.present?(:ivars))
|
54
|
+
|
55
|
+
@grep_regex, @grep = [Regexp.new(opts[:G] || "."), lambda{ |x| x.grep(@grep_regex) }]
|
56
|
+
|
79
57
|
raise_errors_if_arguments_are_weird
|
80
|
-
ls_entity = LsEntity.new({
|
81
|
-
:interrogatee => @interrogatee,
|
82
|
-
:no_user_opts => no_user_opts?,
|
83
|
-
:opts => opts,
|
84
|
-
:args => args,
|
85
|
-
:_pry_ => _pry_
|
86
|
-
})
|
87
58
|
|
88
|
-
|
59
|
+
all_output = [
|
60
|
+
write_out_globals,
|
61
|
+
write_out_constants,
|
62
|
+
write_out_methods,
|
63
|
+
write_out_self_methods,
|
64
|
+
write_out_ivars,
|
65
|
+
write_out_local_names,
|
66
|
+
write_out_locals,
|
67
|
+
].compact.join("")
|
68
|
+
|
69
|
+
stagger_output(all_output)
|
89
70
|
end
|
90
71
|
|
91
72
|
private
|
92
73
|
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
|
97
|
-
|
98
|
-
|
99
|
-
|
100
|
-
|
101
|
-
|
102
|
-
|
74
|
+
# http://ruby.runpaint.org/globals, and running "puts global_variables.inspect".
|
75
|
+
BUILTIN_GLOBALS = %w($" $$ $* $, $-0 $-F $-I $-K $-W $-a $-d $-i $-l $-p $-v $-w $. $/ $\\
|
76
|
+
$: $; $< $= $> $0 $ARGV $CONSOLE $DEBUG $DEFAULT_INPUT $DEFAULT_OUTPUT
|
77
|
+
$FIELD_SEPARATOR $FILENAME $FS $IGNORECASE $INPUT_LINE_NUMBER
|
78
|
+
$INPUT_RECORD_SEPARATOR $KCODE $LOADED_FEATURES $LOAD_PATH $NR $OFS
|
79
|
+
$ORS $OUTPUT_FIELD_SEPARATOR $OUTPUT_RECORD_SEPARATOR $PID $PROCESS_ID
|
80
|
+
$PROGRAM_NAME $RS $VERBOSE $deferr $defout $stderr $stdin $stdout)
|
81
|
+
|
82
|
+
# $SAFE and $? are thread-local, the exception stuff only works in a rescue clause,
|
83
|
+
# everything else is basically a local variable with a $ in its name.
|
84
|
+
PSEUDO_GLOBALS = %w($! $' $& $` $@ $? $+ $_ $~ $1 $2 $3 $4 $5 $6 $7 $8 $9
|
85
|
+
$CHILD_STATUS $SAFE $ERROR_INFO $ERROR_POSITION $LAST_MATCH_INFO
|
86
|
+
$LAST_PAREN_MATCH $LAST_READ_LINE $MATCH $POSTMATCH $PREMATCH)
|
87
|
+
|
88
|
+
# Get all the methods that we'll want to output
|
89
|
+
def all_methods(obj, instance_methods=false)
|
90
|
+
methods = if instance_methods || opts.present?(:'instance-methods')
|
91
|
+
Pry::Method.all_from_class(obj)
|
92
|
+
else
|
93
|
+
Pry::Method.all_from_obj(obj)
|
94
|
+
end
|
95
|
+
|
96
|
+
if jruby? && !opts.present?(:J)
|
97
|
+
methods = trim_jruby_aliases(methods)
|
98
|
+
end
|
99
|
+
|
100
|
+
methods.select{ |method| opts.present?(:ppp) || method.visibility == :public }
|
101
|
+
end
|
102
|
+
|
103
|
+
# JRuby creates lots of aliases for methods imported from java in an attempt to
|
104
|
+
# make life easier for ruby programmers.
|
105
|
+
# (e.g. getFooBar becomes get_foo_bar and foo_bar, and maybe foo_bar? if it
|
106
|
+
# returns a Boolean).
|
107
|
+
# The full transformations are in the assignAliases method of:
|
108
|
+
# https://github.com/jruby/jruby/blob/master/src/org/jruby/javasupport/JavaClass.java
|
109
|
+
#
|
110
|
+
# This has the unfortunate side-effect of making the output of ls even more
|
111
|
+
# incredibly verbose than it normally would be for these objects; and so we filter
|
112
|
+
# out all but the nicest of these aliases here.
|
113
|
+
#
|
114
|
+
# TODO: This is a little bit vague, better heuristics could be used.
|
115
|
+
# JRuby also has a lot of scala-specific logic, which we don't copy.
|
116
|
+
#
|
117
|
+
def trim_jruby_aliases(methods)
|
118
|
+
grouped = methods.group_by do |m|
|
119
|
+
m.name.sub(/\A(is|get|set)(?=[A-Z_])/, '').gsub(/[_?=]/, '').downcase
|
120
|
+
end
|
121
|
+
|
122
|
+
grouped.map do |key, values|
|
123
|
+
values = values.sort_by do |m|
|
124
|
+
rubbishness(m.name)
|
125
|
+
end
|
126
|
+
|
127
|
+
found = []
|
128
|
+
values.select do |x|
|
129
|
+
(!found.any?{ |y| x == y }) && found << x
|
130
|
+
end
|
131
|
+
end.flatten(1)
|
132
|
+
end
|
133
|
+
|
134
|
+
# When removing jruby aliases, we want to keep the alias that is "least rubbish"
|
135
|
+
# according to this metric.
|
136
|
+
def rubbishness(name)
|
137
|
+
name.each_char.map{ |x|
|
138
|
+
case x
|
139
|
+
when /[A-Z]/
|
140
|
+
1
|
141
|
+
when '?', '=', '!'
|
142
|
+
-2
|
143
|
+
else
|
144
|
+
0
|
145
|
+
end
|
146
|
+
}.inject(&:+) + (name.size / 100.0)
|
147
|
+
end
|
148
|
+
|
149
|
+
def resolution_order(obj)
|
150
|
+
opts.present?(:'instance-methods') ? Pry::Method.instance_resolution_order(obj) : Pry::Method.resolution_order(obj)
|
151
|
+
end
|
152
|
+
|
153
|
+
# Get a lambda that can be used with .take_while to prevent over-eager
|
154
|
+
# traversal of the Object's ancestry graph.
|
155
|
+
def below_ceiling(obj)
|
156
|
+
ceiling = if opts.present?(:quiet)
|
157
|
+
[
|
158
|
+
if opts.present?(:'instance-methods')
|
159
|
+
Pry::Method.safe_send(obj, :ancestors)[1]
|
160
|
+
else
|
161
|
+
Pry::Method.safe_send(obj.class, :ancestors)[1]
|
162
|
+
end
|
163
|
+
] + Pry.config.ls.ceiling
|
164
|
+
elsif opts.present?(:verbose)
|
165
|
+
[]
|
166
|
+
else
|
167
|
+
Pry.config.ls.ceiling.dup
|
168
|
+
end
|
169
|
+
|
170
|
+
lambda { |klass| !ceiling.include?(klass) }
|
103
171
|
end
|
104
172
|
|
105
173
|
def raise_errors_if_arguments_are_weird
|
106
|
-
|
107
|
-
|
174
|
+
[
|
175
|
+
["-l does not make sense with a specified Object", :locals, !args.empty?],
|
176
|
+
["-g does not make sense with a specified Object", :globals, !args.empty?],
|
177
|
+
["-q does not make sense with -v", :quiet, opts.present?(:verbose)],
|
178
|
+
["-M only makes sense with a Module or a Class", :'instance-methods', !interrogating_a_module?],
|
179
|
+
["-c only makes sense with a Module or a Class", :constants, !args.empty? && !interrogating_a_module?],
|
180
|
+
].each do |message, option, expression|
|
181
|
+
raise Pry::CommandError, message if opts.present?(option) && expression
|
182
|
+
end
|
183
|
+
end
|
184
|
+
|
185
|
+
def interrogating_a_module?
|
186
|
+
(Module === object_to_interrogate)
|
187
|
+
end
|
188
|
+
|
189
|
+
def write_out_globals
|
190
|
+
return unless opts.present?(:globals)
|
191
|
+
|
192
|
+
output_section("global variables", grep[format_globals(target.eval("global_variables"))])
|
193
|
+
end
|
194
|
+
|
195
|
+
def write_out_constants
|
196
|
+
return unless opts.present?(:constants) || (!has_user_specified_any_options && interrogating_a_module?)
|
197
|
+
|
198
|
+
mod = interrogating_a_module? ? object_to_interrogate : Object
|
199
|
+
constants = WrappedModule.new(mod).constants(opts.present?(:verbose))
|
200
|
+
output_section("constants", grep[format_constants(mod, constants)])
|
201
|
+
end
|
202
|
+
|
203
|
+
def write_out_methods
|
204
|
+
return unless opts.present?(:methods) || opts.present?(:'instance-methods') || opts.present?(:ppp) || !has_user_specified_any_options
|
205
|
+
|
206
|
+
# methods is a hash {Module/Class => [Pry::Methods]}
|
207
|
+
methods = all_methods(object_to_interrogate).group_by(&:owner)
|
208
|
+
|
209
|
+
output = ""
|
210
|
+
# reverse the resolution order so that the most useful information appears right by the prompt
|
211
|
+
resolution_order(object_to_interrogate).take_while(&below_ceiling(object_to_interrogate)).reverse.each do |klass|
|
212
|
+
methods_here = format_methods((methods[klass] || []).select{ |m| m.name =~ grep_regex })
|
213
|
+
output << output_section("#{Pry::WrappedModule.new(klass).method_prefix}methods", methods_here)
|
214
|
+
end
|
215
|
+
output
|
216
|
+
end
|
217
|
+
|
218
|
+
def write_out_self_methods
|
219
|
+
return unless (!has_user_specified_any_options && interrogating_a_module?)
|
220
|
+
|
221
|
+
methods = all_methods(object_to_interrogate, true).select{ |m| m.owner == object_to_interrogate && m.name =~ grep_regex }
|
222
|
+
output_section("#{Pry::WrappedModule.new(object_to_interrogate).method_prefix}methods", format_methods(methods))
|
223
|
+
end
|
224
|
+
|
225
|
+
def write_out_ivars
|
226
|
+
return unless opts.present?(:ivars) || !has_user_specified_any_options
|
227
|
+
|
228
|
+
klass = (interrogating_a_module? ? object_to_interrogate : object_to_interrogate.class)
|
229
|
+
ivars = Pry::Method.safe_send(object_to_interrogate, :instance_variables)
|
230
|
+
kvars = Pry::Method.safe_send(klass, :class_variables)
|
231
|
+
output_section("instance variables", format_variables(:instance_var, ivars)) +
|
232
|
+
output_section("class variables", format_variables(:class_var, kvars))
|
233
|
+
end
|
234
|
+
|
235
|
+
def write_out_local_names
|
236
|
+
return unless !has_user_specified_any_options && args.empty?
|
237
|
+
|
238
|
+
output_section("locals", format_local_names(grep[target.eval("local_variables")]))
|
239
|
+
end
|
240
|
+
|
241
|
+
def write_out_locals
|
242
|
+
return unless opts.present?(:locals)
|
243
|
+
|
244
|
+
loc_names = target.eval('local_variables').reject do |e|
|
245
|
+
_pry_.sticky_locals.keys.include? e.to_sym
|
246
|
+
end
|
247
|
+
name_value_pairs = loc_names.map do |name|
|
248
|
+
[name, (target.eval name.to_s)]
|
108
249
|
end
|
250
|
+
format_locals(name_value_pairs).join("")
|
251
|
+
end
|
252
|
+
|
253
|
+
# Format and colourise a list of methods.
|
254
|
+
def format_methods(methods)
|
255
|
+
methods.sort_by(&:name).map do |method|
|
256
|
+
if method.name == 'method_missing'
|
257
|
+
color(:method_missing, 'method_missing')
|
258
|
+
elsif method.visibility == :private
|
259
|
+
color(:private_method, method.name)
|
260
|
+
elsif method.visibility == :protected
|
261
|
+
color(:protected_method, method.name)
|
262
|
+
else
|
263
|
+
color(:public_method, method.name)
|
264
|
+
end
|
265
|
+
end
|
266
|
+
end
|
267
|
+
|
268
|
+
def format_variables(type, vars)
|
269
|
+
vars.sort_by(&:downcase).map{ |var| color(type, var) }
|
109
270
|
end
|
110
271
|
|
272
|
+
def format_constants(mod, constants)
|
273
|
+
constants.sort_by(&:downcase).map do |name|
|
274
|
+
if const = (!mod.autoload?(name) && (mod.const_get(name) || true) rescue nil)
|
275
|
+
if (const < Exception rescue false)
|
276
|
+
color(:exception_constant, name)
|
277
|
+
elsif (Module === mod.const_get(name) rescue false)
|
278
|
+
color(:class_constant, name)
|
279
|
+
else
|
280
|
+
color(:constant, name)
|
281
|
+
end
|
282
|
+
else
|
283
|
+
color(:unloaded_constant, name)
|
284
|
+
end
|
285
|
+
end
|
286
|
+
end
|
287
|
+
|
288
|
+
def format_globals(globals)
|
289
|
+
globals.sort_by(&:downcase).map do |name|
|
290
|
+
if PSEUDO_GLOBALS.include?(name)
|
291
|
+
color(:pseudo_global, name)
|
292
|
+
elsif BUILTIN_GLOBALS.include?(name)
|
293
|
+
color(:builtin_global, name)
|
294
|
+
else
|
295
|
+
color(:global_var, name)
|
296
|
+
end
|
297
|
+
end
|
298
|
+
end
|
299
|
+
|
300
|
+
def format_local_names(locals)
|
301
|
+
locals.sort_by(&:downcase).map do |name|
|
302
|
+
if _pry_.sticky_locals.include?(name.to_sym)
|
303
|
+
color(:pry_var, name)
|
304
|
+
else
|
305
|
+
color(:local_var, name)
|
306
|
+
end
|
307
|
+
end
|
308
|
+
end
|
309
|
+
|
310
|
+
def format_locals(name_value_pairs)
|
311
|
+
name_value_pairs.sort_by do |name, value|
|
312
|
+
value.to_s.size
|
313
|
+
end.reverse.map do |name, value|
|
314
|
+
colorized_assignment_style(name, format_value(value))
|
315
|
+
end
|
316
|
+
end
|
317
|
+
|
318
|
+
def colorized_assignment_style(lhs, rhs, desired_width = 7)
|
319
|
+
colorized_lhs = color(:local_var, lhs)
|
320
|
+
color_escape_padding = colorized_lhs.size - lhs.size
|
321
|
+
pad = desired_width + color_escape_padding
|
322
|
+
"%-#{pad}s = %s" % [color(:local_var, colorized_lhs), rhs]
|
323
|
+
end
|
324
|
+
|
325
|
+
def format_value(value)
|
326
|
+
accumulator = StringIO.new
|
327
|
+
Pry.output_with_default_format(accumulator, value, :hashrocket => false)
|
328
|
+
accumulator.string
|
329
|
+
end
|
330
|
+
|
331
|
+
# Add a new section to the output. Outputs nothing if the section would be empty.
|
332
|
+
def output_section(heading, body)
|
333
|
+
return "" if body.compact.empty?
|
334
|
+
fancy_heading = text.bold(color(:heading, heading))
|
335
|
+
Pry::Helpers.tablify_or_one_line(fancy_heading, body)
|
336
|
+
end
|
337
|
+
|
338
|
+
# Color output based on config.ls.*_color
|
339
|
+
def color(type, str)
|
340
|
+
text.send(Pry.config.ls.send(:"#{type}_color"), str)
|
341
|
+
end
|
111
342
|
end
|
112
343
|
|
113
344
|
Pry::Commands.add_command(Pry::Command::Ls)
|