pry 0.10.3 → 0.14.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.
Files changed (159) hide show
  1. checksums.yaml +5 -5
  2. data/CHANGELOG.md +439 -16
  3. data/LICENSE +1 -1
  4. data/README.md +362 -302
  5. data/bin/pry +4 -7
  6. data/lib/pry/basic_object.rb +10 -0
  7. data/lib/pry/block_command.rb +22 -0
  8. data/lib/pry/class_command.rb +194 -0
  9. data/lib/pry/cli.rb +84 -97
  10. data/lib/pry/code/code_file.rb +37 -26
  11. data/lib/pry/code/code_range.rb +7 -5
  12. data/lib/pry/code/loc.rb +26 -13
  13. data/lib/pry/code.rb +42 -31
  14. data/lib/pry/code_object.rb +53 -28
  15. data/lib/pry/color_printer.rb +46 -35
  16. data/lib/pry/command.rb +197 -369
  17. data/lib/pry/command_set.rb +89 -114
  18. data/lib/pry/command_state.rb +31 -0
  19. data/lib/pry/commands/amend_line.rb +86 -82
  20. data/lib/pry/commands/bang.rb +18 -14
  21. data/lib/pry/commands/bang_pry.rb +15 -11
  22. data/lib/pry/commands/cat/abstract_formatter.rb +23 -18
  23. data/lib/pry/commands/cat/exception_formatter.rb +85 -72
  24. data/lib/pry/commands/cat/file_formatter.rb +56 -46
  25. data/lib/pry/commands/cat/input_expression_formatter.rb +35 -30
  26. data/lib/pry/commands/cat.rb +62 -54
  27. data/lib/pry/commands/cd.rb +40 -35
  28. data/lib/pry/commands/change_inspector.rb +29 -22
  29. data/lib/pry/commands/change_prompt.rb +48 -23
  30. data/lib/pry/commands/clear_screen.rb +20 -0
  31. data/lib/pry/commands/code_collector.rb +148 -131
  32. data/lib/pry/commands/disable_pry.rb +23 -19
  33. data/lib/pry/commands/easter_eggs.rb +23 -34
  34. data/lib/pry/commands/edit/exception_patcher.rb +21 -17
  35. data/lib/pry/commands/edit/file_and_line_locator.rb +34 -23
  36. data/lib/pry/commands/edit.rb +185 -157
  37. data/lib/pry/commands/exit.rb +40 -35
  38. data/lib/pry/commands/exit_all.rb +24 -20
  39. data/lib/pry/commands/exit_program.rb +20 -16
  40. data/lib/pry/commands/find_method.rb +168 -162
  41. data/lib/pry/commands/fix_indent.rb +16 -12
  42. data/lib/pry/commands/help.rb +140 -133
  43. data/lib/pry/commands/hist.rb +151 -149
  44. data/lib/pry/commands/import_set.rb +20 -15
  45. data/lib/pry/commands/jump_to.rb +25 -21
  46. data/lib/pry/commands/list_inspectors.rb +35 -28
  47. data/lib/pry/commands/ls/constants.rb +59 -31
  48. data/lib/pry/commands/ls/formatter.rb +42 -36
  49. data/lib/pry/commands/ls/globals.rb +38 -36
  50. data/lib/pry/commands/ls/grep.rb +17 -15
  51. data/lib/pry/commands/ls/instance_vars.rb +29 -28
  52. data/lib/pry/commands/ls/interrogatable.rb +18 -12
  53. data/lib/pry/commands/ls/jruby_hacks.rb +47 -41
  54. data/lib/pry/commands/ls/local_names.rb +26 -24
  55. data/lib/pry/commands/ls/local_vars.rb +38 -30
  56. data/lib/pry/commands/ls/ls_entity.rb +47 -52
  57. data/lib/pry/commands/ls/methods.rb +49 -51
  58. data/lib/pry/commands/ls/methods_helper.rb +46 -42
  59. data/lib/pry/commands/ls/self_methods.rb +23 -21
  60. data/lib/pry/commands/ls.rb +124 -103
  61. data/lib/pry/commands/nesting.rb +21 -17
  62. data/lib/pry/commands/play.rb +92 -82
  63. data/lib/pry/commands/pry_backtrace.rb +22 -17
  64. data/lib/pry/commands/pry_version.rb +15 -11
  65. data/lib/pry/commands/raise_up.rb +33 -27
  66. data/lib/pry/commands/reload_code.rb +60 -48
  67. data/lib/pry/commands/reset.rb +16 -12
  68. data/lib/pry/commands/ri.rb +57 -42
  69. data/lib/pry/commands/save_file.rb +45 -43
  70. data/lib/pry/commands/shell_command.rb +56 -29
  71. data/lib/pry/commands/shell_mode.rb +22 -18
  72. data/lib/pry/commands/show_doc.rb +80 -70
  73. data/lib/pry/commands/show_info.rb +194 -155
  74. data/lib/pry/commands/show_input.rb +16 -11
  75. data/lib/pry/commands/show_source.rb +110 -42
  76. data/lib/pry/commands/stat.rb +35 -31
  77. data/lib/pry/commands/switch_to.rb +21 -15
  78. data/lib/pry/commands/toggle_color.rb +20 -16
  79. data/lib/pry/commands/watch_expression/expression.rb +32 -27
  80. data/lib/pry/commands/watch_expression.rb +89 -84
  81. data/lib/pry/commands/whereami.rb +156 -141
  82. data/lib/pry/commands/wtf.rb +78 -40
  83. data/lib/pry/config/attributable.rb +22 -0
  84. data/lib/pry/config/lazy_value.rb +29 -0
  85. data/lib/pry/config/memoized_value.rb +34 -0
  86. data/lib/pry/config/value.rb +24 -0
  87. data/lib/pry/config.rb +310 -20
  88. data/lib/pry/control_d_handler.rb +28 -0
  89. data/lib/pry/core_extensions.rb +22 -9
  90. data/lib/pry/editor.rb +56 -34
  91. data/lib/pry/env.rb +18 -0
  92. data/lib/pry/exception_handler.rb +43 -0
  93. data/lib/pry/exceptions.rb +13 -18
  94. data/lib/pry/forwardable.rb +27 -0
  95. data/lib/pry/helpers/base_helpers.rb +20 -62
  96. data/lib/pry/helpers/command_helpers.rb +52 -62
  97. data/lib/pry/helpers/documentation_helpers.rb +21 -12
  98. data/lib/pry/helpers/options_helpers.rb +15 -8
  99. data/lib/pry/helpers/platform.rb +55 -0
  100. data/lib/pry/helpers/table.rb +44 -32
  101. data/lib/pry/helpers/text.rb +96 -85
  102. data/lib/pry/helpers.rb +3 -0
  103. data/lib/pry/history.rb +81 -55
  104. data/lib/pry/hooks.rb +60 -110
  105. data/lib/pry/indent.rb +74 -68
  106. data/lib/pry/input_completer.rb +199 -158
  107. data/lib/pry/input_lock.rb +7 -10
  108. data/lib/pry/inspector.rb +36 -24
  109. data/lib/pry/last_exception.rb +45 -45
  110. data/lib/pry/method/disowned.rb +19 -5
  111. data/lib/pry/method/patcher.rb +14 -8
  112. data/lib/pry/method/weird_method_locator.rb +79 -45
  113. data/lib/pry/method.rb +178 -124
  114. data/lib/pry/object_path.rb +37 -28
  115. data/lib/pry/output.rb +102 -16
  116. data/lib/pry/pager.rb +187 -174
  117. data/lib/pry/prompt.rb +213 -25
  118. data/lib/pry/pry_class.rb +119 -98
  119. data/lib/pry/pry_instance.rb +261 -224
  120. data/lib/pry/repl.rb +83 -29
  121. data/lib/pry/repl_file_loader.rb +27 -22
  122. data/lib/pry/ring.rb +89 -0
  123. data/lib/pry/slop/LICENSE +20 -0
  124. data/lib/pry/slop/commands.rb +190 -0
  125. data/lib/pry/slop/option.rb +210 -0
  126. data/lib/pry/slop.rb +672 -0
  127. data/lib/pry/syntax_highlighter.rb +26 -0
  128. data/lib/pry/system_command_handler.rb +17 -0
  129. data/lib/pry/testable/evalable.rb +24 -0
  130. data/lib/pry/testable/mockable.rb +22 -0
  131. data/lib/pry/testable/pry_tester.rb +88 -0
  132. data/lib/pry/testable/utility.rb +34 -0
  133. data/lib/pry/testable/variables.rb +52 -0
  134. data/lib/pry/testable.rb +68 -0
  135. data/lib/pry/version.rb +3 -1
  136. data/lib/pry/warning.rb +20 -0
  137. data/lib/pry/{module_candidate.rb → wrapped_module/candidate.rb} +35 -32
  138. data/lib/pry/wrapped_module.rb +68 -63
  139. data/lib/pry.rb +133 -149
  140. metadata +58 -69
  141. data/lib/pry/commands/disabled_commands.rb +0 -2
  142. data/lib/pry/commands/gem_cd.rb +0 -26
  143. data/lib/pry/commands/gem_install.rb +0 -32
  144. data/lib/pry/commands/gem_list.rb +0 -33
  145. data/lib/pry/commands/gem_open.rb +0 -29
  146. data/lib/pry/commands/gist.rb +0 -101
  147. data/lib/pry/commands/install_command.rb +0 -53
  148. data/lib/pry/commands/list_prompts.rb +0 -35
  149. data/lib/pry/commands/simple_prompt.rb +0 -22
  150. data/lib/pry/commands.rb +0 -6
  151. data/lib/pry/config/behavior.rb +0 -139
  152. data/lib/pry/config/convenience.rb +0 -25
  153. data/lib/pry/config/default.rb +0 -161
  154. data/lib/pry/history_array.rb +0 -121
  155. data/lib/pry/plugins.rb +0 -103
  156. data/lib/pry/rbx_path.rb +0 -22
  157. data/lib/pry/rubygem.rb +0 -82
  158. data/lib/pry/terminal.rb +0 -79
  159. data/lib/pry/test/helper.rb +0 -170
@@ -1,34 +1,45 @@
1
+ # frozen_string_literal: true
2
+
1
3
  class Pry
2
- class Command::Edit
3
- module FileAndLineLocator
4
- class << self
5
- def from_binding(target)
6
- [target.eval("__FILE__"), target.eval("__LINE__")]
7
- end
4
+ class Command
5
+ class Edit
6
+ module FileAndLineLocator
7
+ class << self
8
+ def from_binding(target)
9
+ if target.respond_to?(:source_location)
10
+ target.source_location
11
+ else
12
+ target.eval("[__FILE__, __LINE__]")
13
+ end
14
+ end
15
+
16
+ def from_code_object(code_object, filename_argument)
17
+ unless File.exist?(code_object.source_file.to_s)
18
+ raise CommandError, "Cannot find a file for #{filename_argument}!"
19
+ end
8
20
 
9
- def from_code_object(code_object, filename_argument)
10
- if File.exists?(code_object.source_file.to_s)
11
21
  [code_object.source_file, code_object.source_line]
12
- else
13
- raise CommandError, "Cannot find a file for #{filename_argument}!"
14
22
  end
15
- end
16
23
 
17
- def from_exception(exception, backtrace_level)
18
- raise CommandError, "No exception found." if exception.nil?
24
+ def from_exception(exception, backtrace_level)
25
+ raise CommandError, "No exception found." if exception.nil?
19
26
 
20
- file_name, line = exception.bt_source_location_for(backtrace_level)
21
- raise CommandError, "Exception has no associated file." if file_name.nil?
22
- raise CommandError, "Cannot edit exceptions raised in REPL." if Pry.eval_path == file_name
27
+ file_name, line = exception.bt_source_location_for(backtrace_level)
28
+ raise CommandError, "Exception has no associated file." if file_name.nil?
23
29
 
24
- [file_name, line]
25
- end
30
+ if Pry.eval_path == file_name
31
+ raise CommandError, "Cannot edit exceptions raised in REPL."
32
+ end
33
+
34
+ [file_name, line]
35
+ end
26
36
 
27
- # when file and line are passed as a single arg, e.g my_file.rb:30
28
- def from_filename_argument(filename_argument)
29
- f = File.expand_path(filename_argument)
30
- l = f.sub!(/:(\d+)$/, "") ? $1.to_i : 1
31
- [f, l]
37
+ # when file and line are passed as a single arg, e.g my_file.rb:30
38
+ def from_filename_argument(filename_argument)
39
+ f = File.expand_path(filename_argument)
40
+ l = f.sub!(/:(\d+)$/, "") ? Regexp.last_match(1).to_i : 1
41
+ [f, l]
42
+ end
32
43
  end
33
44
  end
34
45
  end
@@ -1,195 +1,223 @@
1
- class Pry
2
- class Command::Edit < Pry::ClassCommand
3
- require 'pry/commands/edit/exception_patcher'
4
- require 'pry/commands/edit/file_and_line_locator'
5
-
6
- match 'edit'
7
- group 'Editing'
8
- description 'Invoke the default editor on a file.'
9
-
10
- banner <<-'BANNER'
11
- Usage: edit [--no-reload|--reload|--patch] [--line LINE] [--temp|--ex|FILE[:LINE]|OBJECT|--in N]
12
-
13
- Open a text editor. When no FILE is given, edits the pry input buffer.
14
- When a method/module/command is given, the code is opened in an editor.
15
- Ensure `Pry.config.editor` or `_pry_.config.editor` is set to your editor of choice.
16
-
17
- edit sample.rb edit -p MyClass#my_method
18
- edit sample.rb --line 105 edit MyClass
19
- edit MyClass#my_method edit --ex
20
- edit --method edit --ex -p
21
-
22
- https://github.com/pry/pry/wiki/Editor-integration#wiki-Edit_command
23
- BANNER
24
-
25
- def options(opt)
26
- opt.on :e, :ex, "Open the file that raised the most recent exception (_ex_.file)",
27
- :optional_argument => true, :as => Integer
28
- opt.on :i, :in, "Open a temporary file containing the Nth input expression. N may be a range",
29
- :optional_argument => true, :as => Range, :default => -1..-1
30
- opt.on :t, :temp, "Open an empty temporary file"
31
- opt.on :l, :line, "Jump to this line in the opened file",
32
- :argument => true, :as => Integer
33
- opt.on :n, :"no-reload", "Don't automatically reload the edited file"
34
- opt.on :c, :current, "Open the current __FILE__ and at __LINE__ (as returned by `whereami`)"
35
- opt.on :r, :reload, "Reload the edited code immediately (default for ruby files)"
36
- opt.on :p, :patch, "Instead of editing the object's file, try to edit in a tempfile and apply as a monkey patch"
37
- opt.on :m, :method, "Explicitly edit the _current_ method (when inside a method context)."
38
- end
1
+ # frozen_string_literal: true
39
2
 
40
- def process
41
- if bad_option_combination?
42
- raise CommandError, "Only one of --ex, --temp, --in, --method and FILE may be specified."
3
+ class Pry
4
+ class Command
5
+ class Edit < Pry::ClassCommand
6
+ match 'edit'
7
+ group 'Editing'
8
+ description 'Invoke the default editor on a file.'
9
+
10
+ banner <<-'BANNER'
11
+ Usage: edit [--no-reload|--reload|--patch] [--line LINE] [--temp|--ex|FILE[:LINE]|OBJECT|--in N]
12
+
13
+ Open a text editor. When no FILE is given, edits the pry input buffer.
14
+ When a method/module/command is given, the code is opened in an editor.
15
+ Ensure `Pry.config.editor` or `pry_instance.config.editor` is set to your editor of choice.
16
+
17
+ edit sample.rb edit -p MyClass#my_method
18
+ edit sample.rb --line 105 edit MyClass
19
+ edit MyClass#my_method edit --ex
20
+ edit --method edit --ex -p
21
+
22
+ https://github.com/pry/pry/wiki/Editor-integration#wiki-Edit_command
23
+ BANNER
24
+
25
+ def options(opt)
26
+ opt.on :e, :ex, "Open the file that raised the most recent exception " \
27
+ "(_ex_.file)",
28
+ optional_argument: true, as: Integer
29
+ opt.on :i, :in, "Open a temporary file containing the Nth input " \
30
+ "expression. N may be a range",
31
+ optional_argument: true, as: Range, default: -1..-1
32
+ opt.on :t, :temp, "Open an empty temporary file"
33
+ opt.on :l, :line, "Jump to this line in the opened file",
34
+ argument: true, as: Integer
35
+ opt.on :n, :"no-reload", "Don't automatically reload the edited file"
36
+ opt.on :c, :current, "Open the current __FILE__ and at __LINE__ (as " \
37
+ "returned by `whereami`)"
38
+ opt.on :r, :reload, "Reload the edited code immediately (default for " \
39
+ "ruby files)"
40
+ opt.on :p, :patch, "Instead of editing the object's file, try to edit " \
41
+ "in a tempfile and apply as a monkey patch"
42
+ opt.on :m, :method, "Explicitly edit the _current_ method (when " \
43
+ "inside a method context)."
43
44
  end
44
45
 
45
- if repl_edit?
46
- # code defined in pry, eval'd within pry.
47
- repl_edit
48
- elsif runtime_patch?
49
- # patch code without persisting changes
50
- apply_runtime_patch
51
- else
52
- # code stored in actual files, eval'd at top-level
53
- file_edit
46
+ def process
47
+ if bad_option_combination?
48
+ raise CommandError, "Only one of --ex, --temp, --in, --method and " \
49
+ "FILE may be specified."
50
+ end
51
+
52
+ if repl_edit?
53
+ # code defined in pry, eval'd within pry.
54
+ repl_edit
55
+ elsif runtime_patch?
56
+ # patch code without persisting changes, implies future changes are patches
57
+ apply_runtime_patch
58
+ else
59
+ # code stored in actual files, eval'd at top-level
60
+ file_edit
61
+ end
54
62
  end
55
- end
56
63
 
57
- def repl_edit?
58
- !opts.present?(:ex) && !opts.present?(:current) && !opts.present?(:method) &&
59
- filename_argument.empty?
60
- end
64
+ def repl_edit?
65
+ !opts.present?(:ex) && !opts.present?(:current) && !opts.present?(:method) &&
66
+ filename_argument.empty?
67
+ end
61
68
 
62
- def repl_edit
63
- content = Pry::Editor.new(_pry_).edit_tempfile_with_content(initial_temp_file_content,
64
- initial_temp_file_content.lines.count)
65
- silence_warnings do
66
- eval_string.replace content
69
+ def repl_edit
70
+ content = Pry::Editor.new(pry_instance).edit_tempfile_with_content(
71
+ initial_temp_file_content,
72
+ initial_temp_file_content.lines.count
73
+ )
74
+ pry_instance.eval_string = content
75
+ Pry.history.push(content)
67
76
  end
68
- end
69
77
 
70
- def file_based_exception?
71
- opts.present?(:ex) && !opts.present?(:patch)
72
- end
78
+ def file_based_exception?
79
+ opts.present?(:ex) && !opts.present?(:patch)
80
+ end
73
81
 
74
- def runtime_patch?
75
- !file_based_exception? && (opts.present?(:patch) || pry_method?(code_object))
76
- end
82
+ def runtime_patch?
83
+ !file_based_exception? &&
84
+ (opts.present?(:patch) ||
85
+ previously_patched?(code_object) ||
86
+ pry_method?(code_object))
87
+ end
77
88
 
78
- def apply_runtime_patch
79
- if patch_exception?
80
- ExceptionPatcher.new(_pry_, state, file_and_line_for_current_exception).perform_patch
81
- else
82
- if code_object.is_a?(Pry::Method)
83
- code_object.redefine Pry::Editor.new(_pry_).edit_tempfile_with_content(code_object.source)
89
+ def apply_runtime_patch
90
+ if patch_exception?
91
+ ExceptionPatcher.new(
92
+ pry_instance, state, file_and_line_for_current_exception
93
+ ).perform_patch
94
+ elsif code_object.is_a?(Pry::Method)
95
+ code_object.redefine(
96
+ Pry::Editor.new(pry_instance).edit_tempfile_with_content(
97
+ code_object.source
98
+ )
99
+ )
84
100
  else
85
101
  raise NotImplementedError, "Cannot yet patch #{code_object} objects!"
86
102
  end
87
103
  end
88
- end
89
104
 
90
- def ensure_file_name_is_valid(file_name)
91
- raise CommandError, "Cannot find a valid file for #{filename_argument}" if !file_name
92
- raise CommandError, "#{file_name} is not a valid file name, cannot edit!" if not_a_real_file?(file_name)
93
- end
105
+ def ensure_file_name_is_valid(file_name)
106
+ unless file_name
107
+ raise CommandError, "Cannot find a valid file for #{filename_argument}"
108
+ end
94
109
 
95
- def file_and_line_for_current_exception
96
- FileAndLineLocator.from_exception(_pry_.last_exception, opts[:ex].to_i)
97
- end
110
+ return unless not_a_real_file?(file_name)
98
111
 
99
- def file_and_line
100
- file_name, line = if opts.present?(:current)
101
- FileAndLineLocator.from_binding(target)
102
- elsif opts.present?(:ex)
103
- file_and_line_for_current_exception
104
- elsif code_object
105
- FileAndLineLocator.from_code_object(code_object, filename_argument)
106
- else
107
- # when file and line are passed as a single arg, e.g my_file.rb:30
108
- FileAndLineLocator.from_filename_argument(filename_argument)
109
- end
110
-
111
- [file_name, opts.present?(:line) ? opts[:l].to_i : line]
112
- end
112
+ raise CommandError, "#{file_name} is not a valid file name, cannot edit!"
113
+ end
113
114
 
114
- def file_edit
115
- file_name, line = file_and_line
115
+ def file_and_line_for_current_exception
116
+ FileAndLineLocator.from_exception(pry_instance.last_exception, opts[:ex].to_i)
117
+ end
118
+
119
+ def file_and_line
120
+ file_name, line =
121
+ if opts.present?(:current)
122
+ FileAndLineLocator.from_binding(target)
123
+ elsif opts.present?(:ex)
124
+ file_and_line_for_current_exception
125
+ elsif code_object
126
+ FileAndLineLocator.from_code_object(code_object, filename_argument)
127
+ else
128
+ # when file and line are passed as a single arg, e.g my_file.rb:30
129
+ FileAndLineLocator.from_filename_argument(filename_argument)
130
+ end
131
+
132
+ [file_name, opts.present?(:line) ? opts[:l].to_i : line]
133
+ end
116
134
 
117
- ensure_file_name_is_valid(file_name)
135
+ def file_edit
136
+ file_name, line = file_and_line
118
137
 
119
- Pry::Editor.new(_pry_).invoke_editor(file_name, line, reload?(file_name))
120
- set_file_and_dir_locals(file_name)
138
+ ensure_file_name_is_valid(file_name)
121
139
 
122
- if reload?(file_name)
123
- silence_warnings do
124
- load file_name
125
- end
140
+ Pry::Editor.new(pry_instance).invoke_editor(file_name, line, reload?(file_name))
141
+ set_file_and_dir_locals(file_name)
142
+
143
+ return unless reload?(file_name)
144
+
145
+ silence_warnings { load(file_name) }
126
146
  end
127
- end
128
147
 
129
- def filename_argument
130
- args.join(' ')
131
- end
148
+ def filename_argument
149
+ args.join(' ')
150
+ end
132
151
 
133
- def code_object
134
- @code_object ||= !probably_a_file?(filename_argument) &&
135
- Pry::CodeObject.lookup(filename_argument, _pry_)
136
- end
152
+ def code_object
153
+ @code_object ||=
154
+ !probably_a_file?(filename_argument) &&
155
+ Pry::CodeObject.lookup(filename_argument, pry_instance)
156
+ end
137
157
 
138
- def pry_method?(code_object)
139
- code_object.is_a?(Pry::Method) &&
140
- code_object.pry_method?
141
- end
158
+ def pry_method?(code_object)
159
+ code_object.is_a?(Pry::Method) &&
160
+ code_object.pry_method?
161
+ end
142
162
 
143
- def patch_exception?
144
- opts.present?(:ex) && opts.present?(:patch)
145
- end
163
+ def previously_patched?(code_object)
164
+ code_object.is_a?(Pry::Method) &&
165
+ Pry::Method::Patcher.code_for(code_object.source_location.first)
166
+ end
146
167
 
147
- def bad_option_combination?
148
- [opts.present?(:ex), opts.present?(:temp),
149
- opts.present?(:in), opts.present?(:method), !filename_argument.empty?].count(true) > 1
150
- end
168
+ def patch_exception?
169
+ opts.present?(:ex) && opts.present?(:patch)
170
+ end
151
171
 
152
- def input_expression
153
- case opts[:i]
154
- when Range
155
- (_pry_.input_array[opts[:i]] || []).join
156
- when Fixnum
157
- _pry_.input_array[opts[:i]] || ""
158
- else
159
- raise Pry::CommandError, "Not a valid range: #{opts[:i]}"
172
+ def bad_option_combination?
173
+ [
174
+ opts.present?(:ex), opts.present?(:temp),
175
+ opts.present?(:in), opts.present?(:method),
176
+ !filename_argument.empty?
177
+ ].count(true) > 1
160
178
  end
161
- end
162
179
 
163
- def reloadable?
164
- opts.present?(:reload) || opts.present?(:ex)
165
- end
180
+ def input_expression
181
+ case opts[:i]
182
+ when Range
183
+ (pry_instance.input_ring[opts[:i]] || []).join
184
+ when Integer
185
+ pry_instance.input_ring[opts[:i]] || ""
186
+ else
187
+ raise Pry::CommandError, "Not a valid range: #{opts[:i]}"
188
+ end
189
+ end
166
190
 
167
- def never_reload?
168
- opts.present?(:'no-reload') || _pry_.config.disable_auto_reload
169
- end
191
+ def reloadable?
192
+ opts.present?(:reload) || opts.present?(:ex)
193
+ end
170
194
 
171
- def reload?(file_name="")
172
- (reloadable? || file_name.end_with?(".rb")) && !never_reload?
173
- end
195
+ def never_reload?
196
+ opts.present?(:'no-reload') || pry_instance.config.disable_auto_reload
197
+ end
174
198
 
175
- def initial_temp_file_content
176
- case
177
- when opts.present?(:temp)
178
- ""
179
- when opts.present?(:in)
180
- input_expression
181
- when eval_string.strip != ""
182
- eval_string
183
- else
184
- _pry_.input_array.reverse_each.find { |x| x && x.strip != "" } || ""
199
+ def reload?(file_name = "")
200
+ (reloadable? || file_name.end_with?(".rb")) && !never_reload?
185
201
  end
186
- end
187
202
 
188
- def probably_a_file?(str)
189
- [".rb", ".c", ".py", ".yml", ".gemspec"].include?(File.extname(str)) ||
190
- str =~ /\/|\\/
203
+ def initial_temp_file_content
204
+ if opts.present?(:temp)
205
+ ""
206
+ elsif opts.present?(:in)
207
+ input_expression
208
+ elsif eval_string.strip != ""
209
+ eval_string
210
+ else
211
+ pry_instance.input_ring.to_a.reverse_each.find { |x| x && x.strip != "" } || ""
212
+ end
213
+ end
214
+
215
+ def probably_a_file?(str)
216
+ [".rb", ".c", ".py", ".yml", ".gemspec"].include?(File.extname(str)) ||
217
+ str =~ %r{/|\\}
218
+ end
191
219
  end
192
- end
193
220
 
194
- Pry::Commands.add_command(Pry::Command::Edit)
221
+ Pry::Commands.add_command(Pry::Command::Edit)
222
+ end
195
223
  end
@@ -1,42 +1,47 @@
1
+ # frozen_string_literal: true
2
+
1
3
  class Pry
2
- class Command::Exit < Pry::ClassCommand
3
- match 'exit'
4
- group 'Navigating Pry'
5
- description 'Pop the previous binding.'
6
- command_options :keep_retval => true
7
-
8
- banner <<-'BANNER'
9
- Usage: exit [OPTIONS] [--help]
10
- Aliases: quit
11
-
12
- Pop the previous binding (does NOT exit program). It can be useful to exit a
13
- context with a user-provided value. For instance an exit value can be used to
14
- determine program flow.
15
-
16
- exit "pry this"
17
- exit
18
-
19
- https://github.com/pry/pry/wiki/State-navigation#wiki-Exit_with_value
20
- BANNER
21
-
22
- def process
23
- if _pry_.binding_stack.one?
24
- _pry_.run_command "exit-all #{arg_string}"
25
- else
26
- # otherwise just pop a binding and return user supplied value
27
- process_pop_and_return
4
+ class Command
5
+ class Exit < Pry::ClassCommand
6
+ match 'exit'
7
+ group 'Navigating Pry'
8
+ description 'Pop the previous binding.'
9
+ command_options keep_retval: true
10
+
11
+ banner <<-'BANNER'
12
+ Usage: exit [OPTIONS] [--help]
13
+ Aliases: quit
14
+
15
+ Pop the previous binding (does NOT exit program). It can be useful to exit a
16
+ context with a user-provided value. For instance an exit value can be used to
17
+ determine program flow.
18
+
19
+ exit "pry this"
20
+ exit
21
+
22
+ https://github.com/pry/pry/wiki/State-navigation#wiki-Exit_with_value
23
+ BANNER
24
+
25
+ def process
26
+ if pry_instance.binding_stack.one?
27
+ pry_instance.run_command "exit-all #{arg_string}"
28
+ else
29
+ # otherwise just pop a binding and return user supplied value
30
+ process_pop_and_return
31
+ end
28
32
  end
29
- end
30
33
 
31
- def process_pop_and_return
32
- popped_object = _pry_.binding_stack.pop.eval('self')
34
+ def process_pop_and_return
35
+ popped_object = pry_instance.binding_stack.pop.eval('self')
36
+
37
+ # return a user-specified value if given otherwise return the object
38
+ return target.eval(arg_string) unless arg_string.empty?
33
39
 
34
- # return a user-specified value if given otherwise return the object
35
- return target.eval(arg_string) unless arg_string.empty?
36
- popped_object
40
+ popped_object
41
+ end
37
42
  end
38
- end
39
43
 
40
- Pry::Commands.add_command(Pry::Command::Exit)
41
- Pry::Commands.alias_command 'quit', 'exit'
44
+ Pry::Commands.add_command(Pry::Command::Exit)
45
+ Pry::Commands.alias_command 'quit', 'exit'
46
+ end
42
47
  end
@@ -1,29 +1,33 @@
1
+ # frozen_string_literal: true
2
+
1
3
  class Pry
2
- class Command::ExitAll < Pry::ClassCommand
3
- match 'exit-all'
4
- group 'Navigating Pry'
5
- description 'End the current Pry session.'
4
+ class Command
5
+ class ExitAll < Pry::ClassCommand
6
+ match 'exit-all'
7
+ group 'Navigating Pry'
8
+ description 'End the current Pry session.'
6
9
 
7
- banner <<-'BANNER'
8
- Usage: exit-all [--help]
9
- Aliases: !!@
10
+ banner <<-'BANNER'
11
+ Usage: exit-all [--help]
12
+ Aliases: !!@
10
13
 
11
- End the current Pry session (popping all bindings and returning to caller).
12
- Accepts optional return value.
13
- BANNER
14
+ End the current Pry session (popping all bindings and returning to caller).
15
+ Accepts optional return value.
16
+ BANNER
14
17
 
15
- def process
16
- # calculate user-given value
17
- exit_value = target.eval(arg_string)
18
+ def process
19
+ # calculate user-given value
20
+ exit_value = target.eval(arg_string)
18
21
 
19
- # clear the binding stack
20
- _pry_.binding_stack.clear
22
+ # clear the binding stack
23
+ pry_instance.binding_stack.clear
21
24
 
22
- # break out of the repl loop
23
- throw(:breakout, exit_value)
25
+ # break out of the repl loop
26
+ throw(:breakout, exit_value)
27
+ end
24
28
  end
25
- end
26
29
 
27
- Pry::Commands.add_command(Pry::Command::ExitAll)
28
- Pry::Commands.alias_command '!!@', 'exit-all'
30
+ Pry::Commands.add_command(Pry::Command::ExitAll)
31
+ Pry::Commands.alias_command '!!@', 'exit-all'
32
+ end
29
33
  end
@@ -1,23 +1,27 @@
1
+ # frozen_string_literal: true
2
+
1
3
  class Pry
2
- class Command::ExitProgram < Pry::ClassCommand
3
- match 'exit-program'
4
- group 'Navigating Pry'
5
- description 'End the current program.'
4
+ class Command
5
+ class ExitProgram < Pry::ClassCommand
6
+ match 'exit-program'
7
+ group 'Navigating Pry'
8
+ description 'End the current program.'
6
9
 
7
- banner <<-'BANNER'
8
- Usage: exit-program [--help]
9
- Aliases: quit-program
10
- !!!
10
+ banner <<-'BANNER'
11
+ Usage: exit-program [--help]
12
+ Aliases: quit-program
13
+ !!!
11
14
 
12
- End the current program.
13
- BANNER
15
+ End the current program.
16
+ BANNER
14
17
 
15
- def process
16
- Kernel.exit target.eval(arg_string).to_i
18
+ def process
19
+ Kernel.exit target.eval(arg_string).to_i
20
+ end
17
21
  end
18
- end
19
22
 
20
- Pry::Commands.add_command(Pry::Command::ExitProgram)
21
- Pry::Commands.alias_command 'quit-program', 'exit-program'
22
- Pry::Commands.alias_command '!!!', 'exit-program'
23
+ Pry::Commands.add_command(Pry::Command::ExitProgram)
24
+ Pry::Commands.alias_command 'quit-program', 'exit-program'
25
+ Pry::Commands.alias_command '!!!', 'exit-program'
26
+ end
23
27
  end