pry 0.9.7.4 → 0.9.8pre2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (49) hide show
  1. data/.gitignore +1 -3
  2. data/README.markdown +3 -1
  3. data/Rakefile +48 -31
  4. data/bin/pry +2 -80
  5. data/lib/pry.rb +17 -20
  6. data/lib/pry/cli.rb +152 -0
  7. data/lib/pry/command_processor.rb +13 -0
  8. data/lib/pry/command_set.rb +102 -9
  9. data/lib/pry/config.rb +28 -6
  10. data/lib/pry/default_commands/context.rb +9 -8
  11. data/lib/pry/default_commands/documentation.rb +55 -13
  12. data/lib/pry/default_commands/easter_eggs.rb +1 -1
  13. data/lib/pry/default_commands/input.rb +25 -25
  14. data/lib/pry/default_commands/introspection.rb +19 -18
  15. data/lib/pry/default_commands/ls.rb +23 -38
  16. data/lib/pry/default_commands/shell.rb +47 -15
  17. data/lib/pry/helpers/command_helpers.rb +28 -6
  18. data/lib/pry/helpers/options_helpers.rb +7 -4
  19. data/lib/pry/helpers/text.rb +23 -3
  20. data/lib/pry/history.rb +55 -17
  21. data/lib/pry/history_array.rb +2 -0
  22. data/lib/pry/hooks.rb +108 -0
  23. data/lib/pry/indent.rb +9 -5
  24. data/lib/pry/method.rb +99 -50
  25. data/lib/pry/plugins.rb +10 -2
  26. data/lib/pry/pry_class.rb +48 -20
  27. data/lib/pry/pry_instance.rb +106 -91
  28. data/lib/pry/version.rb +1 -1
  29. data/lib/pry/wrapped_module.rb +73 -0
  30. data/man/pry.1 +195 -0
  31. data/man/pry.1.html +204 -0
  32. data/man/pry.1.ronn +141 -0
  33. data/pry.gemspec +21 -24
  34. data/test/helper.rb +12 -3
  35. data/test/test_cli.rb +78 -0
  36. data/test/test_command_set.rb +193 -1
  37. data/test/test_default_commands/test_context.rb +19 -4
  38. data/test/test_default_commands/test_input.rb +2 -2
  39. data/test/test_default_commands/test_introspection.rb +63 -6
  40. data/test/test_default_commands/test_ls.rb +8 -35
  41. data/test/test_default_commands/test_shell.rb +36 -1
  42. data/test/test_hooks.rb +175 -0
  43. data/test/test_indent.rb +2 -0
  44. data/test/test_method.rb +10 -0
  45. data/test/test_pry.rb +35 -34
  46. data/test/test_pry_history.rb +24 -24
  47. data/test/test_syntax_checking.rb +47 -0
  48. data/test/test_wrapped_module.rb +71 -0
  49. metadata +40 -34
@@ -101,6 +101,17 @@ class Pry
101
101
  [cmd_data, (Regexp.last_match ? Regexp.last_match.captures : nil), (Regexp.last_match ? Regexp.last_match.end(0) : nil)]
102
102
  end
103
103
 
104
+ # Display a warning if a command collides with a local/method in
105
+ # the current scope.
106
+ # @param [String] command_name_match The name of the colliding command.
107
+ # @param [Binding] target The current binding context.
108
+ def check_for_command_name_collision(command_name_match, target)
109
+ if collision_type = target.eval("defined?(#{command_name_match})")
110
+ pry_instance.output.puts "#{Pry::Helpers::Text.bold('WARNING:')} Command name collision with a #{collision_type}: '#{command_name_match}'\n\n"
111
+ end
112
+ rescue Pry::RescuableException
113
+ end
114
+
104
115
  # Process Pry commands. Pry commands are not Ruby methods and are evaluated
105
116
  # prior to Ruby expressions.
106
117
  # Commands can be modified/configured by the user: see `Pry::Commands`
@@ -123,6 +134,8 @@ class Pry
123
134
 
124
135
  arg_string = val[pos..-1]
125
136
 
137
+ check_for_command_name_collision(val[0..pos].rstrip, target) if Pry.config.collision_warning
138
+
126
139
  # remove the one leading space if it exists
127
140
  arg_string.slice!(0) if arg_string.start_with?(" ")
128
141
 
@@ -142,6 +142,46 @@ class Pry
142
142
  commands[name] = Command.new(name, description, options, block)
143
143
  end
144
144
 
145
+ # Execute a block of code before a command is invoked. The block also
146
+ # gets access to parameters that will be passed to the command and
147
+ # is evaluated in the same context.
148
+ # @param [String, Regexp] name The name of the command.
149
+ # @yield The block to be run before the command.
150
+ # @example Display parameter before invoking command
151
+ # Pry.commands.before_command("whereami") do |n|
152
+ # output.puts "parameter passed was #{n}"
153
+ # end
154
+ def before_command(name, &block)
155
+ cmd = find_command_by_name_or_listing(name)
156
+ prev_block = cmd.block
157
+
158
+ wrapper_block = proc do |*args|
159
+ instance_exec(*args, &block)
160
+ instance_exec(*args, &prev_block)
161
+ end
162
+ cmd.block = wrapper_block
163
+ end
164
+
165
+ # Execute a block of code after a command is invoked. The block also
166
+ # gets access to parameters that will be passed to the command and
167
+ # is evaluated in the same context.
168
+ # @param [String, Regexp] name The name of the command.
169
+ # @yield The block to be run after the command.
170
+ # @example Display text 'command complete' after invoking command
171
+ # Pry.commands.after_command("whereami") do |n|
172
+ # output.puts "command complete!"
173
+ # end
174
+ def after_command(name, &block)
175
+ cmd = find_command_by_name_or_listing(name)
176
+ prev_block = cmd.block
177
+
178
+ wrapper_block = proc do |*args|
179
+ instance_exec(*args, &prev_block)
180
+ instance_exec(*args, &block)
181
+ end
182
+ cmd.block = wrapper_block
183
+ end
184
+
145
185
  def each &block
146
186
  @commands.each(&block)
147
187
  end
@@ -149,7 +189,10 @@ class Pry
149
189
  # Removes some commands from the set
150
190
  # @param [Array<String>] names name of the commands to remove
151
191
  def delete(*names)
152
- names.each { |name| commands.delete name }
192
+ names.each do |name|
193
+ cmd = find_command_by_name_or_listing(name)
194
+ commands.delete cmd.name
195
+ end
153
196
  end
154
197
 
155
198
  # Imports all the commands from one or more sets.
@@ -167,19 +210,63 @@ class Pry
167
210
  # @param [Array<String>] names Commands to import
168
211
  def import_from(set, *names)
169
212
  helper_module.send :include, set.helper_module
170
- names.each { |name| commands[name] = set.commands[name] }
213
+ names.each do |name|
214
+ cmd = set.find_command_by_name_or_listing(name)
215
+ commands[cmd.name] = cmd
216
+ end
217
+ end
218
+
219
+ # @param [String, Regexp] name_or_listing The name or listing name
220
+ # of the command to retrieve.
221
+ # @return [Command] The command object matched.
222
+ def find_command_by_name_or_listing(name_or_listing)
223
+ if commands[name_or_listing]
224
+ cmd = commands[name_or_listing]
225
+ else
226
+ _, cmd = commands.find { |name, command| command.options[:listing] == name_or_listing }
227
+ end
228
+
229
+ raise ArgumentError, "Cannot find a command with name: '#{name_or_listing}'!" if !cmd
230
+ cmd
171
231
  end
232
+ protected :find_command_by_name_or_listing
172
233
 
173
234
  # Aliases a command
174
235
  # @param [String] new_name New name of the command.
175
236
  # @param [String] old_name Old name of the command.
176
237
  # @param [String, nil] desc New description of the command.
177
238
  def alias_command(new_name, old_name, desc="")
178
- commands[new_name] = commands[old_name].dup
239
+ orig_command = find_command_by_name_or_listing(old_name)
240
+ commands[new_name] = orig_command.dup
179
241
  commands[new_name].name = new_name
180
242
  commands[new_name].description = desc
181
243
  end
182
244
 
245
+ # Rename a command. Accepts either actual name or listing name for
246
+ # the `old_name`.
247
+ # `new_name` must be the actual name of the new command.
248
+ # @param [String, Regexp] new_name The new name for the command.
249
+ # @param [String, Regexp] old_name The command's current name.
250
+ # @param [Hash] options The optional configuration parameters,
251
+ # accepts the same as the `command` method, but also allows the
252
+ # command description to be passed this way too.
253
+ # @example Renaming the `ls` command and changing its description.
254
+ # Pry.config.commands.rename "dir", "ls", :description => "DOS friendly ls"
255
+ def rename_command(new_name, old_name, options={})
256
+ cmd = find_command_by_name_or_listing(old_name)
257
+
258
+ options = {
259
+ :listing => new_name,
260
+ :description => cmd.description
261
+ }.merge!(options)
262
+
263
+ commands[new_name] = cmd.dup
264
+ commands[new_name].name = new_name
265
+ commands[new_name].description = options.delete(:description)
266
+ commands[new_name].options.merge!(options)
267
+ commands.delete(cmd.name)
268
+ end
269
+
183
270
  # Runs a command.
184
271
  # @param [Object] context Object which will be used as self during the
185
272
  # command.
@@ -201,16 +288,22 @@ class Pry
201
288
  end
202
289
  end
203
290
 
204
- # Sets the description for a command (replacing the old
205
- # description.)
206
- # @param [String] name The command name.
291
+ # Sets or gets the description for a command (replacing the old
292
+ # description). Returns current description if no description
293
+ # parameter provided.
294
+ # @param [String, Regexp] name The command name.
207
295
  # @param [String] description The command description.
208
- # @example
296
+ # @example Setting
209
297
  # MyCommands = Pry::CommandSet.new do
210
298
  # desc "help", "help description"
211
299
  # end
212
- def desc(name, description)
213
- commands[name].description = description
300
+ # @example Getting
301
+ # Pry.config.commands.desc "amend-line"
302
+ def desc(name, description=nil)
303
+ cmd = find_command_by_name_or_listing(name)
304
+ return cmd.description if !description
305
+
306
+ cmd.description = description
214
307
  end
215
308
 
216
309
  # Defines helpers methods for this command sets.
data/lib/pry/config.rb CHANGED
@@ -98,14 +98,20 @@ class Pry
98
98
  # @return [Boolean]
99
99
  attr_accessor :disable_auto_reload
100
100
 
101
+ # Determines whether Pry should trap SIGINT and cause it to raise an
102
+ # Interrupt exception. This is only useful on jruby, MRI does this
103
+ # for us.
104
+ # @return [Boolean]
105
+ attr_accessor :should_trap_interrupts
106
+
101
107
  # Config option for history.
102
- # sub-options include hist.file, hist.load, and hist.save
103
- # hist.file is the file to save/load history too, e.g
108
+ # sub-options include history.file, history.load, and history.save
109
+ # history.file is the file to save/load history to, e.g
104
110
  # Pry.config.history.file = "~/.pry_history".
105
- # hist.should_load is a boolean that determines whether history will be
106
- # loaded from hist.file at session start.
107
- # hist.should_save is a boolean that determines whether history will be
108
- # saved to hist.file at session end.
111
+ # history.should_load is a boolean that determines whether history will be
112
+ # loaded from history.file at session start.
113
+ # history.should_save is a boolean that determines whether history will be
114
+ # saved to history.file at session end.
109
115
  # @return [OpenStruct]
110
116
  attr_accessor :history
111
117
 
@@ -138,6 +144,22 @@ class Pry
138
144
  # @return [Boolean] Whether or not indentation should be corrected
139
145
  # after hitting enter. This feature is not supported by all terminals.
140
146
  attr_accessor :correct_indent
147
+
148
+ # @return [Boolean] Whether or not a warning will be displayed when
149
+ # a command name collides with a method/local in the current context.
150
+ attr_accessor :collision_warning
151
+
152
+
153
+ # Config option for gist.
154
+ # sub-options include `gist.inspecter`,
155
+ # `gist.inspecter` is a callable that defines how the expression output
156
+ # will be displayed when using the `gist -i` command.
157
+ # @example Pretty inspect output
158
+ # Pry.config.gist.inspecter = proc { |v| v.pretty_inspect }
159
+ # @example Regular inspect
160
+ # Pry.config.gist.inspecter = proc &:inspect
161
+ # @return [OpenStruct]
162
+ attr_accessor :gist
141
163
  end
142
164
  end
143
165
 
@@ -127,10 +127,14 @@ class Pry
127
127
  target.pry
128
128
  end
129
129
 
130
+ command "pry-backtrace", "Show the backtrace for the Pry session" do
131
+ output.puts "\n#{text.bold('Backtrace:')}\n--\n"
132
+ output.puts _pry_.backtrace
133
+ end
134
+
130
135
  command "whereami", "Show the code context for the session. (whereami <n> shows <n> extra lines of code around the invocation line. Default: 5)" do |num|
131
136
  file = target.eval('__FILE__')
132
137
  line_num = target.eval('__LINE__')
133
- klass = target.eval('self.class')
134
138
 
135
139
  if num
136
140
  i_num = num.to_i
@@ -138,18 +142,15 @@ class Pry
138
142
  i_num = 5
139
143
  end
140
144
 
141
- if (meth = Pry::Method.from_binding(target))
142
- meth_name = meth.name
143
- else
144
- meth_name = "N/A"
145
- end
146
-
147
145
  if file != Pry.eval_path && (file =~ /(\(.*\))|<.*>/ || file == "" || file == "-e")
148
146
  raise CommandError, "Cannot find local context. Did you use `binding.pry`?"
149
147
  end
150
148
 
151
149
  set_file_and_dir_locals(file)
152
- output.puts "\n#{text.bold('From:')} #{file} @ line #{line_num} in #{klass}##{meth_name}:\n\n"
150
+
151
+ method = Pry::Method.from_binding(target)
152
+ method_description = method ? " in #{method.name_with_owner}" : ""
153
+ output.puts "\n#{text.bold('From:')} #{file} @ line #{line_num}#{method_description}:\n\n"
153
154
 
154
155
  if file == Pry.eval_path
155
156
  f = Pry.line_buffer[1..-1]
@@ -26,7 +26,7 @@ class Pry
26
26
  output.puts "#{text.bold("Visibility:")} #{meth.visibility}"
27
27
  output.puts "#{text.bold("Signature:")} #{meth.signature}"
28
28
  output.puts
29
- render_output(opts.flood?, false, doc)
29
+ render_output(opts.present?(:flood), false, doc)
30
30
  end
31
31
 
32
32
  alias_command "?", "show-doc"
@@ -55,29 +55,43 @@ class Pry
55
55
  EOS
56
56
  end
57
57
 
58
- command "gist-method", "Gist a method to github. Type `gist-method --help` for more info.", :requires_gem => "gist", :shellwords => false do |*args|
58
+ command "gist", "Gist a method or expression history to github. Type `gist --help` for more info.", :requires_gem => "gist", :shellwords => false do |*args|
59
59
  require 'gist'
60
60
 
61
61
  target = target()
62
62
 
63
- opts, meth = parse_options!(args, :method_object) do |opt|
63
+ opts = parse_options!(args) do |opt|
64
64
  opt.banner unindent <<-USAGE
65
- Usage: gist-method [OPTIONS] [METH]
66
- Gist the method (doc or source) to github.
65
+ Usage: gist [OPTIONS] [METH]
66
+ Gist method (doc or source) or input expression to github.
67
67
  Ensure the `gist` gem is properly working before use. http://github.com/defunkt/gist for instructions.
68
68
  e.g: gist -m my_method
69
69
  e.g: gist -d my_method
70
+ e.g: gist -i 1..10
70
71
  USAGE
71
72
 
72
- opt.on :d, :doc, "Gist a method's documentation."
73
- opt.on :p, :private, "Create a private gist (default: true)", :default => true
73
+ opt.on :d, :doc, "Gist a method's documentation.", true
74
+ opt.on :m, :method, "Gist a method's source.", true
75
+ opt.on :p, :public, "Create a public gist (default: false)", :default => false
76
+ opt.on :i, :in, "Gist entries from Pry's input expression history. Takes an index or range.", :optional => true, :as => Range, :default => -5..-1
74
77
  end
75
78
 
76
79
  type_map = { :ruby => "rb", :c => "c", :plain => "plain" }
77
- if !opts.doc?
78
- content = meth.source
79
- code_type = meth.source_type
80
- else
80
+ if opts.present?(:in)
81
+ code_type = :ruby
82
+ content = ""
83
+ normalized_range = absolute_index_range(opts[:i], _pry_.input_array.length)
84
+ input_items = _pry_.input_array[normalized_range] || []
85
+
86
+ input_items.each_with_index.map do |code, index|
87
+ corrected_index = index + normalized_range.first
88
+ if code && code != ""
89
+ content << code
90
+ content << "#{comment_expression_result_for_gist(Pry.config.gist.inspecter.call(_pry_.output_array[corrected_index]))}" if code !~ /;\Z/
91
+ end
92
+ end
93
+ elsif opts.present?(:doc)
94
+ meth = get_method_or_raise(opts[:d], target, {})
81
95
  content = meth.doc
82
96
  code_type = meth.source_type
83
97
 
@@ -85,14 +99,42 @@ class Pry
85
99
  content = process_comment_markup(content, code_type)
86
100
  end
87
101
  code_type = :plain
102
+ elsif opts.present?(:method)
103
+ meth = get_method_or_raise(opts[:m], target, {})
104
+ content = meth.source
105
+ code_type = meth.source_type
88
106
  end
89
107
 
108
+ # prevent Gist from exiting the session on error
109
+ begin
90
110
  link = Gist.write([:extension => ".#{type_map[code_type]}",
91
111
  :input => content],
92
- opts.p?)
112
+ !opts[:p])
113
+ rescue SystemExit
114
+ end
93
115
 
94
- output.puts "Gist created at #{link}"
116
+ if link
117
+ Gist.copy(link)
118
+ output.puts "Gist created at #{link} and added to clipboard."
119
+ end
95
120
  end
121
+
122
+
123
+ helpers do
124
+ def comment_expression_result_for_gist(result)
125
+ content = ""
126
+ result.lines.each_with_index do |line, index|
127
+ if index == 0
128
+ content << "# => #{line}"
129
+ else
130
+ content << "# #{line}"
131
+ end
132
+ end
133
+ content
134
+ end
135
+ end
136
+
137
+
96
138
  end
97
139
  end
98
140
  end
@@ -8,7 +8,7 @@ class Pry
8
8
  run "show-input"
9
9
  end
10
10
 
11
- command "get-naked" "" do
11
+ command "get-naked", "" do
12
12
  text = %{
13
13
  --
14
14
  We dont have to take our clothes off to have a good time.
@@ -32,7 +32,7 @@ class Pry
32
32
  end
33
33
  end
34
34
 
35
- next if opts.h?
35
+ next if opts.present?(:help)
36
36
 
37
37
  if eval_string.empty?
38
38
  raise CommandError, "No input to amend."
@@ -57,7 +57,7 @@ class Pry
57
57
  run "show-input"
58
58
  end
59
59
 
60
- alias_command(/%.?(-?\d+)?(?:\.\.(-?\d+))?/, /amend-line(?: (-?\d+)(?:\.\.(-?\d+))?)?/)
60
+ alias_command(/%.?(-?\d+)?(?:\.\.(-?\d+))?/, "amend-line")
61
61
 
62
62
  command "play", "Play back a string variable or a method or a file as input. Type `play --help` for more information." do |*args|
63
63
  opts = Slop.parse!(args) do |opt|
@@ -78,16 +78,16 @@ class Pry
78
78
  end
79
79
  end
80
80
 
81
- if opts.m?
81
+ if opts.present?(:method)
82
82
  meth_name = opts[:m]
83
83
  meth = get_method_or_raise(meth_name, target, {}, :omit_help)
84
84
  next unless meth.source
85
85
 
86
- range = opts.l? ? one_index_range_or_number(opts[:l]) : (0..-1)
87
- range = (0..-2) if opts.o?
86
+ range = opts.present?(:lines) ? one_index_range_or_number(opts[:l]) : (0..-1)
87
+ range = (0..-2) if opts.present?(:open)
88
88
 
89
89
  eval_string << Array(meth.source.each_line.to_a[range]).join
90
- elsif opts.f?
90
+ elsif opts.present?(:file)
91
91
  file_name = File.expand_path(opts[:f])
92
92
 
93
93
  if !File.exists?(file_name)
@@ -95,8 +95,8 @@ class Pry
95
95
  end
96
96
 
97
97
  text_array = File.readlines(file_name)
98
- range = opts.l? ? one_index_range_or_number(opts[:l]) : (0..-1)
99
- range = (0..-2) if opts.o?
98
+ range = opts.present?(:lines) ? one_index_range_or_number(opts[:l]) : (0..-1)
99
+ range = (0..-2) if opts.present?(:open)
100
100
 
101
101
  _pry_.input_stack << _pry_.input
102
102
  _pry_.input = StringIO.new(Array(text_array[range]).join)
@@ -107,13 +107,13 @@ class Pry
107
107
 
108
108
  code = target.eval(args.first)
109
109
 
110
- range = opts.l? ? one_index_range_or_number(opts[:l]) : (0..-1)
111
- range = (0..-2) if opts.o?
110
+ range = opts.present?(:lines) ? one_index_range_or_number(opts[:l]) : (0..-1)
111
+ range = (0..-2) if opts.present?(:open)
112
112
 
113
113
  eval_string << Array(code.each_line.to_a[range]).join
114
114
  end
115
115
 
116
- run "show-input" if !_pry_.valid_expression?(eval_string)
116
+ run "show-input" if !_pry_.complete_expression?(eval_string)
117
117
  end
118
118
 
119
119
  command "hist", "Show and replay Readline history. Type `hist --help` for more info. Aliases: history" do |*args|
@@ -153,15 +153,15 @@ class Pry
153
153
  output.puts opt.help
154
154
  end
155
155
  end
156
- next if opts.help?
156
+ next if opts.present?(:help)
157
157
 
158
- if opts.grep?
158
+ if opts.present?(:grep)
159
159
  pattern = Regexp.new(arg_string.strip.split(/ /, 2).last.strip)
160
160
  history.pop
161
161
 
162
162
  history.map!.with_index do |element, index|
163
163
  if element =~ pattern
164
- if opts.n?
164
+ if opts.present?(:"no-numbers")
165
165
  element
166
166
  else
167
167
  "#{text.blue index}: #{element}"
@@ -173,11 +173,11 @@ class Pry
173
173
  next
174
174
  end
175
175
 
176
- if opts.head?
176
+ if opts.present?(:head)
177
177
  limit = opts['head'] || 10
178
178
  list = history.first limit
179
179
  lines = list.join("\n")
180
- if opts.n?
180
+ if opts.present?(:"no-numbers")
181
181
  stagger_output lines
182
182
  else
183
183
  stagger_output text.with_line_numbers(lines, 0)
@@ -185,14 +185,14 @@ class Pry
185
185
  next
186
186
  end
187
187
 
188
- if opts.tail?
188
+ if opts.present?(:tail)
189
189
  limit = opts['tail'] || 10
190
190
  offset = history.size - limit
191
191
  offset = offset < 0 ? 0 : offset
192
192
 
193
193
  list = history.last limit
194
194
  lines = list.join("\n")
195
- if opts.n?
195
+ if opts.present?(:'no-numbers')
196
196
  stagger_output lines
197
197
  else
198
198
  stagger_output text.with_line_numbers(lines, offset)
@@ -200,11 +200,11 @@ class Pry
200
200
  next
201
201
  end
202
202
 
203
- if opts.show?
203
+ if opts.present?(:show)
204
204
  range = opts['show']
205
205
  start_line = range.is_a?(Range) ? range.first : range
206
206
  lines = Array(history[range]).join("\n")
207
- if opts.n?
207
+ if opts.present?(:'no-numbers')
208
208
  stagger_output lines
209
209
  else
210
210
  stagger_output text.with_line_numbers(lines, start_line)
@@ -212,10 +212,10 @@ class Pry
212
212
  next
213
213
  end
214
214
 
215
- if opts.exclude?
215
+ if opts.present?(:exclude)
216
216
  history.map!.with_index do |element, index|
217
217
  unless command_processor.valid_command? element
218
- if opts.n?
218
+ if opts.present?(:'no-numbers')
219
219
  element
220
220
  else
221
221
  "#{text.blue index}: #{element}"
@@ -226,7 +226,7 @@ class Pry
226
226
  next
227
227
  end
228
228
 
229
- if opts.replay?
229
+ if opts.present?(:replay)
230
230
  range = opts['replay']
231
231
  actions = Array(history[range]).join("\n") + "\n"
232
232
  _pry_.input_stack << _pry_.input
@@ -234,7 +234,7 @@ class Pry
234
234
  next
235
235
  end
236
236
 
237
- if opts.clear?
237
+ if opts.present?(:clear)
238
238
  Pry.history.clear
239
239
  output.puts 'History cleared.'
240
240
  next
@@ -274,7 +274,7 @@ class Pry
274
274
  end
275
275
 
276
276
  lines = history.join("\n")
277
- if opts.n?
277
+ if opts.present?(:'no-numbers')
278
278
  stagger_output lines
279
279
  else
280
280
  stagger_output text.with_line_numbers(lines, 0)