pry 0.11.3 → 0.12.2
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.
- checksums.yaml +4 -4
- data/CHANGELOG.md +157 -1
- data/LICENSE +1 -1
- data/README.md +13 -30
- data/bin/pry +0 -4
- data/lib/pry/cli.rb +17 -24
- data/lib/pry/code/code_file.rb +5 -4
- data/lib/pry/code/code_range.rb +3 -3
- data/lib/pry/code/loc.rb +14 -8
- data/lib/pry/code.rb +6 -6
- data/lib/pry/code_object.rb +4 -4
- data/lib/pry/color_printer.rb +1 -0
- data/lib/pry/command.rb +36 -29
- data/lib/pry/command_set.rb +17 -52
- data/lib/pry/commands/amend_line.rb +3 -4
- data/lib/pry/commands/bang.rb +1 -1
- data/lib/pry/commands/cat/exception_formatter.rb +9 -8
- data/lib/pry/commands/cat/input_expression_formatter.rb +1 -1
- data/lib/pry/commands/cat.rb +7 -6
- data/lib/pry/commands/change_prompt.rb +29 -9
- data/lib/pry/commands/clear_screen.rb +14 -0
- data/lib/pry/commands/code_collector.rb +9 -9
- data/lib/pry/commands/easter_eggs.rb +3 -3
- data/lib/pry/commands/edit.rb +8 -7
- data/lib/pry/commands/exit.rb +2 -1
- data/lib/pry/commands/find_method.rb +11 -13
- data/lib/pry/commands/gem_cd.rb +1 -1
- data/lib/pry/commands/gem_install.rb +2 -2
- data/lib/pry/commands/gem_list.rb +2 -2
- data/lib/pry/commands/gem_open.rb +1 -1
- data/lib/pry/commands/gem_search.rb +2 -2
- data/lib/pry/commands/gem_stats.rb +83 -0
- data/lib/pry/commands/gist.rb +7 -6
- data/lib/pry/commands/help.rb +3 -3
- data/lib/pry/commands/hist.rb +9 -8
- data/lib/pry/commands/import_set.rb +2 -1
- data/lib/pry/commands/install_command.rb +7 -6
- data/lib/pry/commands/list_inspectors.rb +2 -2
- data/lib/pry/commands/ls/constants.rb +4 -4
- data/lib/pry/commands/ls/formatter.rb +3 -2
- data/lib/pry/commands/ls/globals.rb +0 -2
- data/lib/pry/commands/ls/grep.rb +0 -2
- data/lib/pry/commands/ls/instance_vars.rb +0 -1
- data/lib/pry/commands/ls/local_names.rb +0 -2
- data/lib/pry/commands/ls/local_vars.rb +0 -2
- data/lib/pry/commands/ls/ls_entity.rb +0 -1
- data/lib/pry/commands/ls/methods.rb +0 -3
- data/lib/pry/commands/ls/methods_helper.rb +1 -1
- data/lib/pry/commands/ls/self_methods.rb +0 -1
- data/lib/pry/commands/ls.rb +27 -30
- data/lib/pry/commands/play.rb +1 -2
- data/lib/pry/commands/pry_backtrace.rb +1 -1
- data/lib/pry/commands/raise_up.rb +2 -1
- data/lib/pry/commands/ri.rb +5 -4
- data/lib/pry/commands/shell_command.rb +3 -2
- data/lib/pry/commands/shell_mode.rb +6 -6
- data/lib/pry/commands/show_doc.rb +5 -7
- data/lib/pry/commands/show_info.rb +25 -18
- data/lib/pry/commands/show_source.rb +5 -2
- data/lib/pry/commands/stat.rb +1 -1
- data/lib/pry/commands/watch_expression.rb +9 -7
- data/lib/pry/commands/whereami.rb +4 -4
- data/lib/pry/commands/wtf.rb +15 -2
- data/lib/pry/config/behavior.rb +229 -205
- data/lib/pry/config/convenience.rb +24 -21
- data/lib/pry/config/default.rb +153 -143
- data/lib/pry/config/memoization.rb +41 -37
- data/lib/pry/config.rb +33 -9
- data/lib/pry/core_extensions.rb +4 -3
- data/lib/pry/editor.rb +5 -12
- data/lib/pry/exceptions.rb +0 -2
- data/lib/pry/helpers/base_helpers.rb +133 -4
- data/lib/pry/helpers/command_helpers.rb +5 -4
- data/lib/pry/helpers/documentation_helpers.rb +2 -2
- data/lib/pry/helpers/options_helpers.rb +5 -5
- data/lib/pry/helpers/platform.rb +58 -0
- data/lib/pry/helpers/table.rb +20 -15
- data/lib/pry/helpers/text.rb +3 -4
- data/lib/pry/helpers.rb +1 -0
- data/lib/pry/history.rb +21 -8
- data/lib/pry/hooks.rb +3 -3
- data/lib/pry/indent.rb +15 -17
- data/lib/pry/input_completer.rb +12 -7
- data/lib/pry/input_lock.rb +0 -2
- data/lib/pry/last_exception.rb +1 -1
- data/lib/pry/method/disowned.rb +2 -1
- data/lib/pry/method/patcher.rb +2 -2
- data/lib/pry/method/weird_method_locator.rb +7 -8
- data/lib/pry/method.rb +37 -31
- data/lib/pry/object_path.rb +5 -4
- data/lib/pry/output.rb +3 -2
- data/lib/pry/pager.rb +194 -186
- data/lib/pry/platform.rb +79 -81
- data/lib/pry/plugins.rb +7 -3
- data/lib/pry/prompt.rb +144 -25
- data/lib/pry/pry_class.rb +53 -29
- data/lib/pry/pry_instance.rb +88 -55
- data/lib/pry/repl.rb +33 -4
- data/lib/pry/repl_file_loader.rb +1 -2
- data/lib/pry/ring.rb +84 -0
- data/lib/pry/rubygem.rb +6 -6
- data/lib/pry/slop/commands.rb +3 -4
- data/lib/pry/slop/option.rb +19 -21
- data/lib/pry/slop.rb +17 -17
- data/lib/pry/terminal.rb +2 -1
- data/lib/pry/testable/mockable.rb +2 -2
- data/lib/pry/testable/pry_tester.rb +1 -1
- data/lib/pry/testable/utility.rb +2 -2
- data/lib/pry/testable/variables.rb +1 -1
- data/lib/pry/version.rb +1 -1
- data/lib/pry/wrapped_module/candidate.rb +2 -2
- data/lib/pry/wrapped_module.rb +15 -15
- data/lib/pry.rb +17 -47
- metadata +8 -20
- data/lib/pry/commands/list_prompts.rb +0 -35
- data/lib/pry/commands/simple_prompt.rb +0 -22
- data/lib/pry/history_array.rb +0 -121
- data/lib/pry/rbx_path.rb +0 -22
data/lib/pry/repl.rb
CHANGED
@@ -49,7 +49,7 @@ class Pry
|
|
49
49
|
|
50
50
|
# Clear the line before starting Pry. This fixes issue #566.
|
51
51
|
if pry.config.correct_indent
|
52
|
-
Kernel.print
|
52
|
+
Kernel.print(Helpers::Platform.windows_ansi? ? "\e[0F" : "\e[0G")
|
53
53
|
end
|
54
54
|
end
|
55
55
|
|
@@ -106,8 +106,9 @@ class Pry
|
|
106
106
|
|
107
107
|
if output.tty? && pry.config.correct_indent && Pry::Helpers::BaseHelpers.use_ansi_codes?
|
108
108
|
output.print @indent.correct_indentation(
|
109
|
-
current_prompt,
|
110
|
-
|
109
|
+
current_prompt,
|
110
|
+
indented_val,
|
111
|
+
calculate_overhang(current_prompt, original_val, indented_val)
|
111
112
|
)
|
112
113
|
output.flush
|
113
114
|
end
|
@@ -218,15 +219,43 @@ class Pry
|
|
218
219
|
# % pry | tee log
|
219
220
|
def piping?
|
220
221
|
return false unless $stdout.respond_to?(:tty?)
|
221
|
-
|
222
|
+
|
223
|
+
!$stdout.tty? && $stdin.tty? && !Helpers::Platform.windows?
|
222
224
|
end
|
223
225
|
|
224
226
|
# @return [void]
|
225
227
|
def set_readline_output
|
226
228
|
return if @readline_output
|
229
|
+
|
227
230
|
if piping?
|
228
231
|
@readline_output = (Readline.output = Pry.config.output)
|
229
232
|
end
|
230
233
|
end
|
234
|
+
|
235
|
+
# Calculates correct overhang for current line. Supports vi Readline
|
236
|
+
# mode and its indicators such as "(ins)" or "(cmd)".
|
237
|
+
#
|
238
|
+
# @return [Integer]
|
239
|
+
# @note This doesn't calculate overhang for Readline's emacs mode with an
|
240
|
+
# indicator because emacs is the default mode and it doesn't use
|
241
|
+
# indicators in 99% of cases.
|
242
|
+
def calculate_overhang(current_prompt, original_val, indented_val)
|
243
|
+
overhang = original_val.length - indented_val.length
|
244
|
+
|
245
|
+
if readline_available? && Readline.respond_to?(:vi_editing_mode?)
|
246
|
+
begin
|
247
|
+
# rb-readline doesn't support this method:
|
248
|
+
# https://github.com/ConnorAtherton/rb-readline/issues/152
|
249
|
+
if Readline.vi_editing_mode?
|
250
|
+
overhang += current_prompt.length - indented_val.length
|
251
|
+
end
|
252
|
+
rescue NotImplementedError
|
253
|
+
# VI editing mode is unsupported on JRuby.
|
254
|
+
# https://github.com/pry/pry/issues/1840
|
255
|
+
nil
|
256
|
+
end
|
257
|
+
end
|
258
|
+
[0, overhang].max
|
259
|
+
end
|
231
260
|
end
|
232
261
|
end
|
data/lib/pry/repl_file_loader.rb
CHANGED
@@ -1,5 +1,4 @@
|
|
1
1
|
class Pry
|
2
|
-
|
3
2
|
# A class to manage the loading of files through the REPL loop.
|
4
3
|
# This is an interesting trick as it processes your file as if it
|
5
4
|
# was user input in an interactive session. As a result, all Pry
|
@@ -42,7 +41,7 @@ class Pry
|
|
42
41
|
end
|
43
42
|
|
44
43
|
content.lines.each do |line|
|
45
|
-
break unless _pry_.eval line, :
|
44
|
+
break unless _pry_.eval line, generated: true
|
46
45
|
end
|
47
46
|
|
48
47
|
unless _pry_.eval_string.empty?
|
data/lib/pry/ring.rb
ADDED
@@ -0,0 +1,84 @@
|
|
1
|
+
class Pry
|
2
|
+
# A ring is a thread-safe fixed-capacity array to which you can only add
|
3
|
+
# elements. Older entries are overwritten as you add new elements, so that the
|
4
|
+
# ring can never contain more than `max_size` elemens.
|
5
|
+
#
|
6
|
+
# @example
|
7
|
+
# ring = Pry::Ring.new(3)
|
8
|
+
# ring << 1 << 2 << 3
|
9
|
+
# ring.to_a #=> [1, 2, 3]
|
10
|
+
# ring << 4
|
11
|
+
# ring.to_a #=> [2, 3, 4]
|
12
|
+
#
|
13
|
+
# ring[0] #=> 2
|
14
|
+
# ring[-1] #=> 4
|
15
|
+
# ring.clear
|
16
|
+
# ring[0] #=> nil
|
17
|
+
#
|
18
|
+
# @api public
|
19
|
+
# @since v0.12.0
|
20
|
+
class Ring
|
21
|
+
# @return [Integer] maximum buffer size
|
22
|
+
attr_reader :max_size
|
23
|
+
|
24
|
+
# @return [Integer] how many objects were added during the lifetime of the
|
25
|
+
# ring
|
26
|
+
attr_reader :count
|
27
|
+
alias size count
|
28
|
+
|
29
|
+
# @param [Integer] max_size Maximum buffer size. The buffer will start
|
30
|
+
# overwriting elements once its reaches its maximum capacity
|
31
|
+
def initialize(max_size)
|
32
|
+
@max_size = max_size
|
33
|
+
@mutex = Mutex.new
|
34
|
+
clear
|
35
|
+
end
|
36
|
+
|
37
|
+
# Push `value` to the current index.
|
38
|
+
#
|
39
|
+
# @param [Object] value
|
40
|
+
# @return [self]
|
41
|
+
def <<(value)
|
42
|
+
@mutex.synchronize do
|
43
|
+
@buffer[count % max_size] = value
|
44
|
+
@count += 1
|
45
|
+
self
|
46
|
+
end
|
47
|
+
end
|
48
|
+
|
49
|
+
# Read the value stored at `index`.
|
50
|
+
#
|
51
|
+
# @param [Integer, Range] index The element (if Integer) or elements
|
52
|
+
# (if Range) associated with `index`
|
53
|
+
# @return [Object, Array<Object>, nil] element(s) at `index`, `nil` if none
|
54
|
+
# exist
|
55
|
+
def [](index)
|
56
|
+
@mutex.synchronize do
|
57
|
+
return @buffer[(count + index) % max_size] if index.is_a?(Integer)
|
58
|
+
return @buffer[index] if count <= max_size
|
59
|
+
|
60
|
+
# Swap parts of array when the array turns page and starts overwriting
|
61
|
+
# from the beginning, then apply the range.
|
62
|
+
last_part = @buffer.slice([index.end, max_size - 1].min, count % max_size)
|
63
|
+
(last_part + (@buffer - last_part))[index]
|
64
|
+
end
|
65
|
+
end
|
66
|
+
|
67
|
+
# @return [Array<Object>] the buffer as unwinded array
|
68
|
+
def to_a
|
69
|
+
return @buffer.dup if count <= max_size
|
70
|
+
|
71
|
+
last_part = @buffer.slice(count % max_size, @buffer.size)
|
72
|
+
last_part + (@buffer - last_part)
|
73
|
+
end
|
74
|
+
|
75
|
+
# Clear the buffer and reset count.
|
76
|
+
# @return [void]
|
77
|
+
def clear
|
78
|
+
@mutex.synchronize do
|
79
|
+
@buffer = []
|
80
|
+
@count = 0
|
81
|
+
end
|
82
|
+
end
|
83
|
+
end
|
84
|
+
end
|
data/lib/pry/rubygem.rb
CHANGED
@@ -23,7 +23,7 @@ class Pry
|
|
23
23
|
Gem.source_index.find_name(name)
|
24
24
|
end
|
25
25
|
|
26
|
-
first_spec = specs.sort_by{ |spec| Gem::Version.new(spec.version) }.last
|
26
|
+
first_spec = specs.sort_by { |spec| Gem::Version.new(spec.version) }.last
|
27
27
|
|
28
28
|
first_spec or raise CommandError, "Gem `#{name}` not found"
|
29
29
|
end
|
@@ -34,9 +34,9 @@ class Pry
|
|
34
34
|
# @return [Array<Gem::Specification>]
|
35
35
|
def list(pattern = /.*/)
|
36
36
|
if Gem::Specification.respond_to?(:each)
|
37
|
-
Gem::Specification.select{|spec| spec.name =~ pattern }
|
37
|
+
Gem::Specification.select { |spec| spec.name =~ pattern }
|
38
38
|
else
|
39
|
-
Gem.source_index.gems.values.select{|spec| spec.name =~ pattern }
|
39
|
+
Gem.source_index.gems.values.select { |spec| spec.name =~ pattern }
|
40
40
|
end
|
41
41
|
end
|
42
42
|
|
@@ -67,14 +67,14 @@ class Pry
|
|
67
67
|
else
|
68
68
|
Gem.user_dir
|
69
69
|
end
|
70
|
-
installer = Gem::DependencyInstaller.new(:
|
70
|
+
installer = Gem::DependencyInstaller.new(install_dir: destination)
|
71
71
|
installer.install(name)
|
72
72
|
rescue Errno::EACCES
|
73
73
|
raise CommandError,
|
74
|
-
"Insufficient permissions to install #{
|
74
|
+
"Insufficient permissions to install #{green(name)}."
|
75
75
|
rescue Gem::GemNotFoundException
|
76
76
|
raise CommandError,
|
77
|
-
"Gem #{
|
77
|
+
"Gem #{green(name)} not found. Aborting installation."
|
78
78
|
else
|
79
79
|
Gem.refresh
|
80
80
|
end
|
data/lib/pry/slop/commands.rb
CHANGED
@@ -133,13 +133,13 @@ class Pry::Slop
|
|
133
133
|
#
|
134
134
|
# Returns the original Array of items with options removed.
|
135
135
|
def parse!(items = ARGV)
|
136
|
-
if opts = commands[items[0].to_s]
|
136
|
+
if (opts = commands[items[0].to_s])
|
137
137
|
@triggered_command = items.shift
|
138
138
|
execute_arguments! items
|
139
139
|
opts.parse! items
|
140
140
|
execute_global_opts! items
|
141
141
|
else
|
142
|
-
if opts = commands['default']
|
142
|
+
if (opts = commands['default'])
|
143
143
|
opts.parse! items
|
144
144
|
else
|
145
145
|
if config[:strict] && items[0]
|
@@ -187,10 +187,9 @@ class Pry::Slop
|
|
187
187
|
|
188
188
|
# Returns nothing.
|
189
189
|
def execute_global_opts!(items)
|
190
|
-
if global_opts = commands['global']
|
190
|
+
if (global_opts = commands['global'])
|
191
191
|
global_opts.parse! items
|
192
192
|
end
|
193
193
|
end
|
194
|
-
|
195
194
|
end
|
196
195
|
end
|
data/lib/pry/slop/option.rb
CHANGED
@@ -1,20 +1,19 @@
|
|
1
1
|
class Pry::Slop
|
2
2
|
class Option
|
3
|
-
|
4
3
|
# The default Hash of configuration options this class uses.
|
5
4
|
DEFAULT_OPTIONS = {
|
6
|
-
:
|
7
|
-
:
|
8
|
-
:
|
9
|
-
:
|
10
|
-
:
|
11
|
-
:
|
12
|
-
:
|
13
|
-
:
|
14
|
-
:
|
15
|
-
:
|
16
|
-
:
|
17
|
-
:
|
5
|
+
argument: false,
|
6
|
+
optional_argument: false,
|
7
|
+
tail: false,
|
8
|
+
default: nil,
|
9
|
+
callback: nil,
|
10
|
+
delimiter: ',',
|
11
|
+
limit: 0,
|
12
|
+
match: nil,
|
13
|
+
optional: true,
|
14
|
+
required: false,
|
15
|
+
as: String,
|
16
|
+
autocreated: false
|
18
17
|
}
|
19
18
|
|
20
19
|
attr_reader :short, :long, :description, :config, :types
|
@@ -41,12 +40,12 @@ class Pry::Slop
|
|
41
40
|
@value = nil
|
42
41
|
|
43
42
|
@types = {
|
44
|
-
:
|
45
|
-
:
|
46
|
-
:
|
47
|
-
:
|
48
|
-
:
|
49
|
-
:
|
43
|
+
string: proc { |v| v.to_s },
|
44
|
+
symbol: proc { |v| v.to_sym },
|
45
|
+
integer: proc { |v| value_to_integer(v) },
|
46
|
+
float: proc { |v| value_to_float(v) },
|
47
|
+
range: proc { |v| value_to_range(v) },
|
48
|
+
count: proc { |v| @count }
|
50
49
|
}
|
51
50
|
|
52
51
|
if long && long.size > @slop.config[:longest_flag]
|
@@ -114,7 +113,7 @@ class Pry::Slop
|
|
114
113
|
if type.respond_to?(:call)
|
115
114
|
type.call(value)
|
116
115
|
else
|
117
|
-
if callable = types[type.to_s.downcase.to_sym]
|
116
|
+
if (callable = types[type.to_s.downcase.to_sym])
|
118
117
|
callable.call(value)
|
119
118
|
else
|
120
119
|
value
|
@@ -203,6 +202,5 @@ class Pry::Slop
|
|
203
202
|
end
|
204
203
|
end
|
205
204
|
end
|
206
|
-
|
207
205
|
end
|
208
206
|
end
|
data/lib/pry/slop.rb
CHANGED
@@ -24,19 +24,18 @@ class Pry::Slop
|
|
24
24
|
|
25
25
|
# Returns a default Hash of configuration options this Slop instance uses.
|
26
26
|
DEFAULT_OPTIONS = {
|
27
|
-
:
|
28
|
-
:
|
29
|
-
:
|
30
|
-
:
|
31
|
-
:
|
32
|
-
:
|
33
|
-
:
|
34
|
-
:
|
35
|
-
:
|
27
|
+
strict: false,
|
28
|
+
help: false,
|
29
|
+
banner: nil,
|
30
|
+
ignore_case: false,
|
31
|
+
autocreate: false,
|
32
|
+
arguments: false,
|
33
|
+
optional_arguments: false,
|
34
|
+
multiple_switches: true,
|
35
|
+
longest_flag: 0
|
36
36
|
}
|
37
37
|
|
38
38
|
class << self
|
39
|
-
|
40
39
|
# items - The Array of items to extract options from (default: ARGV).
|
41
40
|
# config - The Hash of configuration options to send to Slop.new().
|
42
41
|
# block - An optional block used to add options.
|
@@ -106,7 +105,6 @@ class Pry::Slop
|
|
106
105
|
|
107
106
|
opts
|
108
107
|
end
|
109
|
-
|
110
108
|
end
|
111
109
|
|
112
110
|
# The Hash of configuration options for this Slop instance.
|
@@ -135,7 +133,7 @@ class Pry::Slop
|
|
135
133
|
end
|
136
134
|
|
137
135
|
if config[:help]
|
138
|
-
on('-h', '--help', 'Display this help message.', :
|
136
|
+
on('-h', '--help', 'Display this help message.', tail: true) do
|
139
137
|
$stderr.puts help
|
140
138
|
end
|
141
139
|
end
|
@@ -217,7 +215,7 @@ class Pry::Slop
|
|
217
215
|
return items
|
218
216
|
end
|
219
217
|
|
220
|
-
if cmd = @commands[items[0]]
|
218
|
+
if (cmd = @commands[items[0]])
|
221
219
|
return cmd.parse! items[1..-1]
|
222
220
|
end
|
223
221
|
|
@@ -332,7 +330,7 @@ class Pry::Slop
|
|
332
330
|
# Override this method so we can check if an option? method exists.
|
333
331
|
#
|
334
332
|
# Returns true if this option key exists in our list of options.
|
335
|
-
def respond_to_missing?(method_name, include_all=false)
|
333
|
+
def respond_to_missing?(method_name, include_all = false)
|
336
334
|
options.any? { |o| o.key == method_name.to_s.chop } || super
|
337
335
|
end
|
338
336
|
|
@@ -464,7 +462,8 @@ class Pry::Slop
|
|
464
462
|
#
|
465
463
|
# Returns nothing.
|
466
464
|
def process_item(items, index, &block)
|
467
|
-
return unless item = items[index]
|
465
|
+
return unless (item = items[index])
|
466
|
+
|
468
467
|
option, argument = extract_option(item) if item.start_with?('-')
|
469
468
|
|
470
469
|
if option
|
@@ -514,6 +513,7 @@ class Pry::Slop
|
|
514
513
|
if config[:multiple_switches] && strict?
|
515
514
|
raise InvalidOptionError, "Unknown option -#{item}"
|
516
515
|
end
|
516
|
+
|
517
517
|
return
|
518
518
|
end
|
519
519
|
|
@@ -544,7 +544,8 @@ class Pry::Slop
|
|
544
544
|
def execute_multiple_switches(option, argument, index)
|
545
545
|
execute_option(option, nil, index)
|
546
546
|
argument.split('').each do |key|
|
547
|
-
next unless opt = fetch_option(key)
|
547
|
+
next unless (opt = fetch_option(key))
|
548
|
+
|
548
549
|
opt.count += 1
|
549
550
|
execute_option(opt, nil, index, key)
|
550
551
|
end
|
@@ -657,5 +658,4 @@ class Pry::Slop
|
|
657
658
|
" #{cmd}#{' ' * (padding - cmd.size)} #{opts.description}"
|
658
659
|
end.join("\n")
|
659
660
|
end
|
660
|
-
|
661
661
|
end
|
data/lib/pry/terminal.rb
CHANGED
@@ -41,7 +41,7 @@ class Pry::Terminal
|
|
41
41
|
end
|
42
42
|
|
43
43
|
def screen_size_according_to_io_console
|
44
|
-
return if Pry::Helpers::
|
44
|
+
return if Pry::Helpers::Platform.jruby?
|
45
45
|
|
46
46
|
begin
|
47
47
|
require 'io/console'
|
@@ -77,6 +77,7 @@ class Pry::Terminal
|
|
77
77
|
|
78
78
|
def screen_size_according_to_ansicon_env
|
79
79
|
return unless ENV['ANSICON'] =~ /\((.*)x(.*)\)/
|
80
|
+
|
80
81
|
size = [$2, $1]
|
81
82
|
size if nonzero_column?(size)
|
82
83
|
end
|
@@ -1,8 +1,8 @@
|
|
1
1
|
module Pry::Testable::Mockable
|
2
|
-
def mock_command(cmd, args=[], opts={})
|
2
|
+
def mock_command(cmd, args = [], opts = {})
|
3
3
|
output = StringIO.new
|
4
4
|
pry = Pry.new(output: output)
|
5
|
-
ret = cmd.new(opts.merge(pry_instance: pry, :
|
5
|
+
ret = cmd.new(opts.merge(pry_instance: pry, output: output)).call_safely(*args)
|
6
6
|
Struct.new(:output, :return).new(output.string, ret)
|
7
7
|
end
|
8
8
|
|
@@ -4,7 +4,7 @@ class Pry::Testable::PryTester
|
|
4
4
|
def_delegators :@pry, :eval_string, :eval_string=
|
5
5
|
|
6
6
|
def initialize(target = TOPLEVEL_BINDING, options = {})
|
7
|
-
@pry = Pry.new(options.merge(:
|
7
|
+
@pry = Pry.new(options.merge(target: target))
|
8
8
|
@history = options[:history]
|
9
9
|
@pry.inject_sticky_locals!
|
10
10
|
reset_output
|
data/lib/pry/testable/utility.rb
CHANGED
@@ -7,7 +7,7 @@ module Pry::Testable::Utility
|
|
7
7
|
#
|
8
8
|
# @return [void]
|
9
9
|
#
|
10
|
-
def temp_file(ext='.rb')
|
10
|
+
def temp_file(ext = '.rb')
|
11
11
|
file = Tempfile.open(['pry', ext])
|
12
12
|
yield file
|
13
13
|
ensure
|
@@ -20,7 +20,7 @@ module Pry::Testable::Utility
|
|
20
20
|
|
21
21
|
def inner_scope
|
22
22
|
catch(:inner_scope) do
|
23
|
-
yield ->{ throw(:inner_scope, self) }
|
23
|
+
yield -> { throw(:inner_scope, self) }
|
24
24
|
end
|
25
25
|
end
|
26
26
|
end
|
data/lib/pry/version.rb
CHANGED
@@ -2,7 +2,6 @@ require 'pry/helpers/documentation_helpers'
|
|
2
2
|
|
3
3
|
class Pry
|
4
4
|
class WrappedModule
|
5
|
-
|
6
5
|
# This class represents a single candidate for a module/class definition.
|
7
6
|
# It provides access to the source, documentation, line and file
|
8
7
|
# for a monkeypatch (reopening) of a class/module.
|
@@ -64,6 +63,7 @@ class Pry
|
|
64
63
|
# @return [String] The documentation for the candidate.
|
65
64
|
def doc
|
66
65
|
return nil if file.nil?
|
66
|
+
|
67
67
|
@doc ||= get_comment_content(Pry::Code.from_file(file).comment_describing(line))
|
68
68
|
end
|
69
69
|
|
@@ -76,7 +76,7 @@ class Pry
|
|
76
76
|
file, line = first_method_source_location
|
77
77
|
return nil if !file.is_a?(String)
|
78
78
|
|
79
|
-
@source_location = [file,
|
79
|
+
@source_location = [file, first_line_of_module_definition(file, line)]
|
80
80
|
rescue Pry::RescuableException
|
81
81
|
nil
|
82
82
|
end
|
data/lib/pry/wrapped_module.rb
CHANGED
@@ -26,7 +26,7 @@ class Pry
|
|
26
26
|
# @return [Module, nil] The module or `nil` (if conversion failed).
|
27
27
|
# @example
|
28
28
|
# Pry::WrappedModule.from_str("Pry::Code")
|
29
|
-
def self.from_str(mod_name, target=TOPLEVEL_BINDING)
|
29
|
+
def self.from_str(mod_name, target = TOPLEVEL_BINDING)
|
30
30
|
if safe_to_evaluate?(mod_name, target)
|
31
31
|
Pry::WrappedModule.new(target.eval(mod_name))
|
32
32
|
else
|
@@ -49,6 +49,7 @@ class Pry
|
|
49
49
|
def safe_to_evaluate?(str, target)
|
50
50
|
return true if str.strip == "self"
|
51
51
|
return false if str =~ /%/
|
52
|
+
|
52
53
|
kind = target.eval("defined?(#{str})")
|
53
54
|
kind =~ /variable|constant/
|
54
55
|
end
|
@@ -58,6 +59,7 @@ class Pry
|
|
58
59
|
# @param [Module] mod
|
59
60
|
def initialize(mod)
|
60
61
|
raise ArgumentError, "Tried to initialize a WrappedModule with a non-module #{mod.inspect}" unless ::Module === mod
|
62
|
+
|
61
63
|
@wrapped = mod
|
62
64
|
@memoized_candidates = []
|
63
65
|
@host_file_lines = nil
|
@@ -109,10 +111,6 @@ class Pry
|
|
109
111
|
def singleton_class?
|
110
112
|
if Pry::Method.safe_send(wrapped, :respond_to?, :singleton_class?)
|
111
113
|
Pry::Method.safe_send(wrapped, :singleton_class?)
|
112
|
-
elsif defined?(Rubinius)
|
113
|
-
# https://github.com/rubinius/rubinius/commit/2e71722dba53d1a92c54d5e3968d64d1042486fe singleton_class? added 30 Jul 2014
|
114
|
-
# https://github.com/rubinius/rubinius/commit/4310f6b2ef3c8fc88135affe697db4e29e4621c4 has been around since 2011
|
115
|
-
!!Rubinius::Type.singleton_class_object(wrapped)
|
116
114
|
else
|
117
115
|
wrapped != Pry::Method.safe_send(wrapped, :ancestors).first
|
118
116
|
end
|
@@ -138,10 +136,10 @@ class Pry
|
|
138
136
|
def singleton_instance
|
139
137
|
raise ArgumentError, "tried to get instance of non singleton class" unless singleton_class?
|
140
138
|
|
141
|
-
if Helpers::
|
139
|
+
if Helpers::Platform.jruby?
|
142
140
|
wrapped.to_java.attached
|
143
141
|
else
|
144
|
-
@singleton_instance ||= ObjectSpace.each_object(wrapped).detect{ |x| (class << x; self; end) == wrapped }
|
142
|
+
@singleton_instance ||= ObjectSpace.each_object(wrapped).detect { |x| (class << x; self; end) == wrapped }
|
145
143
|
end
|
146
144
|
end
|
147
145
|
|
@@ -150,7 +148,7 @@ class Pry
|
|
150
148
|
wrapped.send(method_name, *args, &block)
|
151
149
|
end
|
152
150
|
|
153
|
-
def respond_to?(method_name, include_all=false)
|
151
|
+
def respond_to?(method_name, include_all = false)
|
154
152
|
super || wrapped.respond_to?(method_name, include_all)
|
155
153
|
end
|
156
154
|
|
@@ -253,7 +251,7 @@ class Pry
|
|
253
251
|
y.yield candidate(num)
|
254
252
|
end
|
255
253
|
end
|
256
|
-
|
254
|
+
Helpers::Platform.jruby_19? ? enum.to_a : enum
|
257
255
|
end
|
258
256
|
|
259
257
|
# @return [Boolean] Whether YARD docs are available for this module.
|
@@ -267,7 +265,7 @@ class Pry
|
|
267
265
|
# When `self` is a `Module` then return the
|
268
266
|
# nth ancestor, otherwise (in the case of classes) return the
|
269
267
|
# nth ancestor that is a class.
|
270
|
-
def super(times=1)
|
268
|
+
def super(times = 1)
|
271
269
|
return self if times.zero?
|
272
270
|
|
273
271
|
if wrapped.is_a?(Class)
|
@@ -302,7 +300,7 @@ class Pry
|
|
302
300
|
# speed up source code extraction.
|
303
301
|
def method_candidates
|
304
302
|
@method_candidates ||= all_source_locations_by_popularity.map do |group|
|
305
|
-
methods_sorted_by_source_line
|
303
|
+
methods_sorted_by_source_line = group.last.sort_by(&:source_line)
|
306
304
|
[methods_sorted_by_source_line.first, methods_sorted_by_source_line.last]
|
307
305
|
end
|
308
306
|
end
|
@@ -315,7 +313,7 @@ class Pry
|
|
315
313
|
@all_source_locations_by_popularity = ims.group_by { |v| Array(v.source_location).first }.
|
316
314
|
sort_by do |path, methods|
|
317
315
|
expanded = File.expand_path(path)
|
318
|
-
load_order = $LOADED_FEATURES.index{ |file| expanded.end_with?(file) }
|
316
|
+
load_order = $LOADED_FEATURES.index { |file| expanded.end_with?(file) }
|
319
317
|
|
320
318
|
[-methods.size, load_order || (1.0 / 0.0)]
|
321
319
|
end
|
@@ -323,16 +321,16 @@ class Pry
|
|
323
321
|
|
324
322
|
# We only want methods that have a non-nil `source_location`. We also
|
325
323
|
# skip some spooky internal methods.
|
326
|
-
#
|
324
|
+
#
|
327
325
|
# @return [Array<Pry::Method>]
|
328
326
|
def all_relevant_methods_for(mod)
|
329
327
|
methods = all_methods_for(mod).select(&:source_location).
|
330
|
-
reject{ |x|
|
328
|
+
reject { |x| method_defined_by_forwardable_module?(x) }
|
331
329
|
|
332
330
|
return methods unless methods.empty?
|
333
331
|
|
334
332
|
safe_send(mod, :constants).flat_map do |const_name|
|
335
|
-
if const = nested_module?(mod, const_name)
|
333
|
+
if (const = nested_module?(mod, const_name))
|
336
334
|
all_relevant_methods_for(const)
|
337
335
|
else
|
338
336
|
[]
|
@@ -349,9 +347,11 @@ class Pry
|
|
349
347
|
|
350
348
|
def nested_module?(parent, name)
|
351
349
|
return if safe_send(parent, :autoload?, name)
|
350
|
+
|
352
351
|
child = safe_send(parent, :const_get, name)
|
353
352
|
return unless Module === child
|
354
353
|
return unless safe_send(child, :name) == "#{safe_send(parent, :name)}::#{name}"
|
354
|
+
|
355
355
|
child
|
356
356
|
end
|
357
357
|
|