pry 0.9.3 → 0.9.4pre1

Sign up to get free protection for your applications and to get access to all the features.
data/CHANGELOG CHANGED
@@ -1,3 +1,14 @@
1
+ */8/2011 version 0.9.4
2
+ * tempfile should end in .rb (for edit -t)
3
+ * ls output should not be in array format
4
+ * fix history saving (should not save all of Readline::HISTORY, but only what changed)
5
+ * prevent blank lines going to Readline::HISTORY (thanks cirwin!)
6
+ * ensure that cat --ex emulates the `whereami` format - includes line numbers and formatted the same, etc
7
+ * fixed bug #200 ( https://github.com/pry/pry/issues/200 )- string interpolation bug (thanks to ryanf)
8
+ * show-doc and stat now display method visibility (update WIKI)
9
+ * got rid of warnings caused by stricter ruby 1.9.3 rules
10
+ * remove interpolation of command names and fix interpolation error messag (update WIKI) (thanks ryanf!)
11
+
1
12
  */7/2011 version 0.9.3
2
13
  * cat --ex (cats 5 lines above and below line in file where exception was raised)
3
14
  * edit --ex (edits line in file where exception was raised)
@@ -0,0 +1,11 @@
1
+ 547 John Mair <jrmair@gmail.com>
2
+ 76 Rob Gleeson <rob@flowof.info>
3
+ 46 Lee Jarvis <lee@jarvis.co>
4
+ 46 Mon ouïe <mon.ouie@gmail.com>
5
+ 18 David Palm <dpalm@elctech.com>
6
+ 13 epitron <chris@ill-logic.com>
7
+ 8 Conrad Irwin <conrad.irwin@gmail.com>
8
+ 6 Ryan Fitzgerald <rwfitzge@gmail.com>
9
+ 2 Eric Christopherson <echristopherson@gmail.com>
10
+ 2 Xavier Shay <xavier@rhnh.net>
11
+ 1 Josh Cheek <josh.cheek@gmail.com>
@@ -1,4 +1,4 @@
1
- ![Alt text](http://dl.dropbox.com/u/15761219/pry_horizontal_red.png)
1
+ ![Alt text](http://dl.dropbox.com/u/26521875/pry_logo_350.png)
2
2
 
3
3
  (C) John Mair (banisterfiend) 2011
4
4
 
@@ -7,7 +7,7 @@ _Get to the code_
7
7
  **Note that JRuby is not yet supported in this release, but will be
8
8
  soon.**
9
9
 
10
- [Skip to the website](http://pry.github.com) <br />
10
+ [Skip to the website (recommended)](http://pry.github.com) <br />
11
11
  [Skip to the wiki](https://github.com/pry/pry/wiki)
12
12
 
13
13
  Pry is a powerful alternative to the standard IRB shell for Ruby. It is
data/TODO CHANGED
@@ -1,3 +1,18 @@
1
+ 0.9.4
2
+ * include method visiblity in show-doc and stat output
3
+ * tempfile should end in .rb (for edit -t)
4
+ * ls output should not be in array format
5
+ * exceptions should allow access to previous items in the backtrace
6
+ * input should allow multiple objects which are switched to automatically when EOF is reached on the preceding one
7
+ * pry -r should happen in pry
8
+ * more plugin-related commands in pry - see installed ones, see activated ones, see available on rubygems
9
+ * should also allow plugins be explicitly activated as a command line option
10
+ * should not raise if plugin activation fails (should show warning instead)
11
+ * more documentation on CommandContext, etc and also command helpers
12
+ * fix history saving (should not save all of Readline::HISTORY, but only what changed)
13
+ * prevent blank lines going to Readline::HISTORY
14
+ * ensure that cat --ex emulates the `whereami` format - includes line numbers and formatted the same, etc
15
+
1
16
  0.9.3
2
17
  * hist command now excludes last line of input (the command invocation itself)
3
18
  * hist now has `history` alias
data/lib/pry.rb CHANGED
@@ -8,7 +8,6 @@ class Pry
8
8
  DEFAULT_HOOKS = {
9
9
  :before_session => proc do |out, target|
10
10
  # ensure we're actually in a method
11
- meth_name = target.eval('__method__')
12
11
  file = target.eval('__FILE__')
13
12
 
14
13
  # /unknown/ for rbx
@@ -10,6 +10,7 @@ class Pry
10
10
  attr_accessor :opts
11
11
  attr_accessor :command_set
12
12
  attr_accessor :command_processor
13
+ attr_accessor :_pry_
13
14
 
14
15
  # Run a command from another command.
15
16
  # @param [String] command_string The string that invokes the command
@@ -54,24 +54,17 @@ class Pry
54
54
  # @return [Array] The command data and arg string pair
55
55
  def command_matched(val, target)
56
56
  _, cmd_data = commands.commands.find do |name, data|
57
-
58
- prefix = Regexp.escape(Pry.config.command_prefix)
57
+ prefix = convert_to_regex(Pry.config.command_prefix)
59
58
  prefix = "(?:#{prefix})?" unless data.options[:use_prefix]
60
59
 
61
60
  command_regex = /^#{prefix}#{convert_to_regex(name)}(?!\S)/
62
61
 
63
- if data.options[:interpolate]
64
- # If interpolation fails then the command cannot be matched,
65
- # so early exit.
66
- begin
67
- interp_val = interpolate_string(val, target)
68
- rescue Exception
69
- next
62
+ if command_regex =~ val
63
+ if data.options[:interpolate]
64
+ val.replace(interpolate_string(val, target))
65
+ command_regex =~ val # re-match with the interpolated string
70
66
  end
71
-
72
- val.replace interp_val if command_regex =~ interp_val
73
- else
74
- command_regex =~ val
67
+ true
75
68
  end
76
69
  end
77
70
 
@@ -128,6 +121,7 @@ class Pry
128
121
  context.eval_string = options[:eval_string]
129
122
  context.arg_string = options[:arg_string]
130
123
  context.command_set = commands
124
+ context._pry_ = @pry_instance
131
125
 
132
126
  context.command_processor = self
133
127
 
@@ -227,11 +227,11 @@ class Pry
227
227
  output.puts
228
228
  help_text = heading("Command List: ") + "\n"
229
229
 
230
- commands.each do |key, command|
230
+ help_text << commands.map do |key, command|
231
231
  if command.description && !command.description.empty?
232
- help_text << "#{command.options[:listing]}".ljust(18) + command.description + "\n"
232
+ "#{command.options[:listing]}".ljust(18) + command.description
233
233
  end
234
- end
234
+ end.compact.sort.join("\n")
235
235
 
236
236
  stagger_output(help_text)
237
237
  else
@@ -157,7 +157,7 @@ class Pry
157
157
  candidates = []
158
158
  ObjectSpace.each_object(Module){|m|
159
159
  begin
160
- name = m.name
160
+ name = m.name.to_s
161
161
  rescue Exception
162
162
  name = ""
163
163
  end
@@ -8,11 +8,11 @@ class Pry
8
8
  end
9
9
 
10
10
  command "simple-prompt", "Toggle the simple prompt." do
11
- case Pry.active_instance.prompt
11
+ case _pry_.prompt
12
12
  when Pry::SIMPLE_PROMPT
13
- Pry.active_instance.pop_prompt
13
+ _pry_.pop_prompt
14
14
  else
15
- Pry.active_instance.push_prompt Pry::SIMPLE_PROMPT
15
+ _pry_.push_prompt Pry::SIMPLE_PROMPT
16
16
  end
17
17
  end
18
18
 
@@ -24,7 +24,7 @@ class Pry
24
24
  next output.puts "Provide a command set name" if command_set.nil?
25
25
 
26
26
  set = target.eval(arg_string)
27
- Pry.active_instance.commands.import set
27
+ _pry_.commands.import set
28
28
  end
29
29
 
30
30
  command "reload-method", "Reload the source file that contains the specified method" do |meth_name|
@@ -44,6 +44,10 @@ class Pry
44
44
  end
45
45
  end
46
46
 
47
+ command "req", "Require file(s) and expand their paths." do |*args|
48
+ args.each { |file_name| load File.expand_path(file_name) }
49
+ end
50
+
47
51
  command "reset", "Reset the REPL to a clean state." do
48
52
  output.puts "Pry reset."
49
53
  exec "pry"
@@ -67,7 +67,7 @@ class Pry
67
67
  alias_command "!!@", "exit-all", ""
68
68
 
69
69
  command "exit-program", "End the current program. Aliases: quit-program, !!!" do
70
- Pry.active_instance.save_history if Pry.config.history.should_save
70
+ Pry.save_history if Pry.config.history.should_save
71
71
  exit
72
72
  end
73
73
 
@@ -40,8 +40,9 @@ class Pry
40
40
  next output.puts("No documentation found.") if doc.empty?
41
41
  doc = process_comment_markup(doc, code_type)
42
42
  output.puts make_header(meth, code_type, doc)
43
+ output.puts "#{text.bold("visibility: ")} #{method_visibility(meth).to_s}"
43
44
  if meth.respond_to?(:parameters)
44
- output.puts "#{text.bold("signature")}: #{signature_for(meth)}"
45
+ output.puts "#{text.bold("signature: ")} #{signature_for(meth)}"
45
46
  output.puts
46
47
  end
47
48
  render_output(opts.flood?, false, doc)
@@ -84,6 +85,7 @@ class Pry
84
85
  output.puts "--"
85
86
  output.puts "Name: " + meth_name
86
87
  output.puts "Owner: " + (meth.owner.to_s ? meth.owner.to_s : "Unknown")
88
+ output.puts "Visibility: " + method_visibility(meth).to_s
87
89
  output.puts "Type: " + (meth.is_a?(Method) ? "Bound" : "Unbound")
88
90
  output.puts "Arity: " + meth.arity.to_s
89
91
 
@@ -156,6 +158,18 @@ class Pry
156
158
  end
157
159
  "#{meth.name}(#{param_strings.join(", ")})"
158
160
  end
161
+
162
+ def method_visibility(meth)
163
+ if meth.owner.public_instance_methods.include? meth.name
164
+ :public
165
+ elsif meth.owner.protected_instance_methods.include? meth.name
166
+ :protected
167
+ elsif meth.owner.private_instance_methods.include? meth.name
168
+ :private
169
+ else
170
+ :none
171
+ end
172
+ end
159
173
  end
160
174
 
161
175
  end
@@ -66,7 +66,7 @@ e.g amend-line puts 'hello again' # no line number modifies immediately preced
66
66
  output.puts opt
67
67
  end
68
68
 
69
- opt.on_noopts { Pry.active_instance.input = StringIO.new(arg_string) }
69
+ opt.on_noopts { _pry_.input = StringIO.new(arg_string) }
70
70
  end
71
71
 
72
72
  if opts.m?
@@ -75,13 +75,13 @@ e.g amend-line puts 'hello again' # no line number modifies immediately preced
75
75
  output.puts "Invalid method name: #{meth_name}."
76
76
  next
77
77
  end
78
- code, code_type = code_and_code_type_for(meth)
78
+ code, _ = code_and_code_type_for(meth)
79
79
  next if !code
80
80
 
81
81
  range = opts.l? ? one_index_range_or_number(opts[:l]) : (0..-1)
82
82
  range = (0..-2) if opts.o?
83
83
 
84
- Pry.active_instance.input = StringIO.new(Array(code.each_line.to_a[range]).join)
84
+ _pry_.input = StringIO.new(Array(code.each_line.to_a[range]).join)
85
85
  end
86
86
 
87
87
  if opts.f?
@@ -91,7 +91,7 @@ e.g amend-line puts 'hello again' # no line number modifies immediately preced
91
91
  range = opts.l? ? one_index_range_or_number(opts[:l]) : (0..-1)
92
92
  range = (0..-2) if opts.o?
93
93
 
94
- Pry.active_instance.input = StringIO.new(Array(text_array[range]).join)
94
+ _pry_.input = StringIO.new(Array(text_array[range]).join)
95
95
  end
96
96
  end
97
97
 
@@ -164,7 +164,7 @@ e.g amend-line puts 'hello again' # no line number modifies immediately preced
164
164
  :as => Range,
165
165
  :unless => :grep do |range|
166
166
  actions = Array(history[range]).join("\n") + "\n"
167
- Pry.active_instance.input = StringIO.new(actions)
167
+ _pry_.input = StringIO.new(actions)
168
168
  end
169
169
 
170
170
  opt.on "save", "Save history to a file. --save [start..end] output.txt. Pry commands are excluded from saved history.", true, :as => Range
@@ -135,7 +135,7 @@ class Pry
135
135
  next output.puts "Exception has no associated file." if file_name.nil?
136
136
  next output.puts "Cannot edit exceptions raised in REPL." if Pry.eval_path == file_name
137
137
  elsif opts.t?
138
- file_name = Tempfile.new("tmp").tap(&:close).path
138
+ file_name = Tempfile.new(["tmp", ".rb"]).tap(&:close).path
139
139
  line = 0
140
140
  should_reload = true
141
141
  context = target
@@ -150,11 +150,11 @@ class Pry
150
150
 
151
151
  if opts[:p]
152
152
  silence_warnings do
153
- Pry.active_instance.input = StringIO.new(File.readlines(file_name).join)
153
+ _pry_.input = StringIO.new(File.readlines(file_name).join)
154
154
  end
155
155
  elsif should_reload
156
156
  silence_warnings do
157
- context.eval(File.read(file_name))
157
+ context.eval(File.read(file_name), file_name)
158
158
  end
159
159
  end
160
160
  end
@@ -207,41 +207,6 @@ class Pry
207
207
  end
208
208
  end
209
209
 
210
- helpers do
211
-
212
- def invoke_editor(file, line)
213
- if Pry.editor.respond_to?(:call)
214
- editor_invocation = Pry.editor.call(file, line)
215
- else
216
- editor_invocation = "#{Pry.editor} #{start_line_syntax_for_editor(file, line)}"
217
- end
218
-
219
- run ".#{editor_invocation}"
220
- end
221
-
222
- def start_line_syntax_for_editor(file_name, line_number)
223
- file_name = file_name.gsub(/\//, '\\') if RUBY_PLATFORM =~ /mswin|mingw/
224
-
225
- case Pry.editor
226
- when /^[gm]?vi/, /^emacs/, /^nano/, /^pico/, /^gedit/, /^kate/
227
- "+#{line_number} #{file_name}"
228
- when /^mate/, /^geany/
229
- "-l #{line_number} #{file_name}"
230
- when /^uedit32/
231
- "#{file_name}/#{line_number}"
232
- when /^jedit/
233
- "#{file_name} +line:#{line_number}"
234
- else
235
- if RUBY_PLATFORM =~ /mswin|mingw/
236
- "#{file_name}"
237
- else
238
- "+#{line_number} #{file_name}"
239
- end
240
- end
241
- end
242
-
243
- end
244
-
245
210
  end
246
211
  end
247
212
  end
@@ -19,6 +19,23 @@ class Pry
19
19
  Object.send("#{visibility}_instance_methods")
20
20
  end
21
21
  end
22
+
23
+ def ls_color_map
24
+ {
25
+ "local variables" => :bright_red,
26
+ "instance variables" => :bright_blue,
27
+ "class variables" => :blue,
28
+ "global variables" => :bright_magenta,
29
+ "just singleton methods" => :green,
30
+ "public methods" => :green,
31
+ "private methods" => :green,
32
+ "protected methods" => :green,
33
+ "public instance methods" => :bright_green,
34
+ "private instance methods" => :bright_green,
35
+ "protected instance methods" => :bright_green,
36
+ "constants" => :red
37
+ }
38
+ end
22
39
  end
23
40
 
24
41
  command "ls", "Show the list of vars and methods in the current scope. Type `ls --help` for more info." do |*args|
@@ -154,7 +171,7 @@ Shows local and instance variables by default.
154
171
 
155
172
  info["private methods"] = [Array(target.eval("private_methods(#{options[:s]})")).sort - trim_methods(target, options, :private), i += 1] if (options[:m] && options[:p]) || options[:a]
156
173
 
157
- info["just singleton methods"] = [Array(target.eval("methods(#{options[:s]})")).sort, i += 1] if (options[:m] && options[:j]) || options[:a]
174
+ info["just singleton methods"] = [Array(target.eval("methods(#{options[:s]})")).sort, i += 1] if (options[:m] && options[:j]) && !options[:a]
158
175
 
159
176
  info["public instance methods"] = [Array(target.eval("public_instance_methods(#{options[:s]})")).uniq.sort - trim_methods(target, options, :public), i += 1] if target_self.is_a?(Module) && ((options[:M] && options[:P]) || options[:a])
160
177
 
@@ -181,11 +198,7 @@ Shows local and instance variables by default.
181
198
  if !v.first.empty?
182
199
  text << "#{k}:\n--\n"
183
200
  filtered_list = v.first.grep options[:grep]
184
- if Pry.color
185
- text << CodeRay.scan(Pry.view(filtered_list), :ruby).term + "\n"
186
- else
187
- text << Pry.view(filtered_list) + "\n"
188
- end
201
+ text << text().bright_green(filtered_list.join(" "))
189
202
  text << "\n\n"
190
203
  end
191
204
  end
@@ -198,14 +211,9 @@ Shows local and instance variables by default.
198
211
 
199
212
  # plain
200
213
  else
201
- list = info.values.sort_by(&:last).map(&:first).inject(&:+)
202
- list = list.grep(options[:grep]) if list
203
- list.uniq! if list
204
- if Pry.color
205
- text << CodeRay.scan(list.inspect, :ruby).term + "\n"
206
- else
207
- text << list.inspect + "\n"
208
- end
214
+ list = info.sort_by { |k, v| v.last }.map { |k, v| [k, [v.first.grep(options[:grep])], v.last] }
215
+ list = list.each { |k, v| text << text().send(ls_color_map[k], v.first.join(" ")); text << " " }
216
+
209
217
  if !options[:f]
210
218
  stagger_output(text)
211
219
  else
@@ -20,15 +20,15 @@ class Pry
20
20
  end
21
21
 
22
22
  command "shell-mode", "Toggle shell mode. Bring in pwd prompt and file completion." do
23
- case Pry.active_instance.prompt
23
+ case _pry_.prompt
24
24
  when Pry::SHELL_PROMPT
25
- Pry.active_instance.pop_prompt
26
- Pry.active_instance.custom_completions = Pry::DEFAULT_CUSTOM_COMPLETIONS
25
+ _pry_.pop_prompt
26
+ _pry_.custom_completions = Pry::DEFAULT_CUSTOM_COMPLETIONS
27
27
  else
28
- Pry.active_instance.push_prompt Pry::SHELL_PROMPT
29
- Pry.active_instance.custom_completions = Pry::FILE_COMPLETIONS
28
+ _pry_.push_prompt Pry::SHELL_PROMPT
29
+ _pry_.custom_completions = Pry::FILE_COMPLETIONS
30
30
  Readline.completion_proc = Pry::InputCompleter.build_completion_proc target,
31
- Pry.active_instance.instance_eval(&Pry::FILE_COMPLETIONS)
31
+ _pry_.instance_eval(&Pry::FILE_COMPLETIONS)
32
32
  end
33
33
  end
34
34
 
@@ -48,7 +48,7 @@ class Pry
48
48
  end_line = line - 1
49
49
  end
50
50
 
51
- opt.on :ex, "Show a window of N lines around last exception (defaults to 5).", :optional => true, :as => Integer do |window_size|
51
+ opt.on :ex, "Show a window of N lines either side of the last exception (defaults to 5).", :optional => true, :as => Integer do |window_size|
52
52
  window_size ||= 5
53
53
  ex = Pry.last_exception
54
54
  next if !ex
@@ -80,27 +80,38 @@ class Pry
80
80
  next
81
81
  end
82
82
 
83
- contents, normalized_start_line, _ = read_between_the_lines(file_name, start_line, end_line)
83
+ contents, _, _ = read_between_the_lines(file_name, start_line, end_line)
84
+ contents = syntax_highlight_by_file_type_or_specified(contents, file_name, opts[:type])
85
+
86
+ if opts.l?
87
+ contents = text.with_line_numbers contents, start_line + 1
88
+ end
84
89
 
85
90
  # add the arrow pointing to line that caused the exception
86
91
  if opts.ex?
92
+ contents = text.with_line_numbers contents, start_line + 1, :bright_red
93
+
87
94
  contents = contents.lines.each_with_index.map do |line, idx|
88
95
  l = idx + start_line
89
96
  if l == (Pry.last_exception.line - 1)
90
- "=> #{line}"
97
+ " =>#{line}"
91
98
  else
92
99
  " #{line}"
93
100
  end
94
101
  end.join
95
- end
96
102
 
97
- if Pry.color
98
- contents = syntax_highlight_by_file_type_or_specified(contents, file_name, opts[:type])
103
+ # header for exceptions
104
+ output.puts "\n#{Pry::Helpers::Text.bold('Exception:')}: #{Pry.last_exception.class}: #{Pry.last_exception.message}"
105
+ output.puts "#{Pry::Helpers::Text.bold('From:')} #{file_name} @ line #{Pry.last_exception.line}\n\n"
99
106
  end
100
107
 
101
108
  set_file_and_dir_locals(file_name)
102
- render_output(opts.flood?, opts.l? ? normalized_start_line + 1 : false, contents)
103
- contents
109
+
110
+ if opts.f?
111
+ output.puts contents
112
+ else
113
+ stagger_output(contents)
114
+ end
104
115
  end
105
116
  end
106
117
 
@@ -7,7 +7,7 @@ class Pry
7
7
  next output.puts("Provide an arg!") if arg.nil?
8
8
 
9
9
  prime_string = "command #{arg_string}\n"
10
- command_string = Pry.active_instance.r(target, prime_string)
10
+ command_string = _pry_.r(target, prime_string)
11
11
 
12
12
  eval_string.replace <<-HERE
13
13
  _pry_.commands.instance_eval do
@@ -17,6 +17,37 @@ class Pry
17
17
 
18
18
  end
19
19
 
20
+ command "reload-command", "Reload a command. reload-command CMD_NAME CMD_SET" do |command_name, set_name|
21
+ next output.puts "Must provide command name" if command_name.nil?
22
+ next output.puts "Must provide command set name" if set_name.nil?
23
+
24
+ cmd = Pry.config.commands.commands[command_name]
25
+ file_name = cmd.block.source_location.first
26
+
27
+ silence_warnings do
28
+ load file_name
29
+ end
30
+ Pry.config.commands.import target.eval(set_name)
31
+ _pry_.commands.import target.eval(set_name)
32
+ set_file_and_dir_locals(file_name)
33
+ end
34
+
35
+ command "edit-command", "Edit a command. edit-command CMD_NAME CMD_SET" do |command_name, set_name|
36
+ next output.puts "Must provide command name" if command_name.nil?
37
+ next output.puts "Must provide a command set name" if set_name.nil?
38
+
39
+ cmd = Pry.config.commands.commands[command_name]
40
+ file_name = cmd.block.source_location.first
41
+
42
+ invoke_editor(*cmd.block.source_location)
43
+ silence_warnings do
44
+ load file_name
45
+ end
46
+ Pry.config.commands.import target.eval(set_name)
47
+ _pry_.commands.import target.eval(set_name)
48
+ set_file_and_dir_locals(file_name)
49
+ end
50
+
20
51
  end
21
52
  end
22
53
  end
@@ -2,6 +2,7 @@ class Pry
2
2
  module Helpers
3
3
 
4
4
  module BaseHelpers
5
+
5
6
  module_function
6
7
 
7
8
  def silence_warnings
@@ -72,7 +73,7 @@ class Pry
72
73
  end
73
74
 
74
75
  def highlight(string, regexp, highlight_color=:bright_yellow)
75
- highlighted = string.gsub(regexp) { |match| "<#{highlight_color}>#{match}</#{highlight_color}>" }
76
+ string.gsub(regexp) { |match| "<#{highlight_color}>#{match}</#{highlight_color}>" }
76
77
  end
77
78
 
78
79
  # formatting
@@ -86,7 +87,7 @@ class Pry
86
87
  end
87
88
 
88
89
  # a simple pager for systems without `less`. A la windows.
89
- def simple_pager(text)
90
+ def simple_pager(text, output=output())
90
91
  text_array = text.lines.to_a
91
92
  text_array.each_slice(page_size) do |chunk|
92
93
  output.puts chunk.join
@@ -109,12 +110,12 @@ class Pry
109
110
 
110
111
  # FIXME! Another JRuby hack
111
112
  if Object.const_defined?(:RUBY_ENGINE) && RUBY_ENGINE =~ /jruby/
112
- simple_pager(text)
113
+ simple_pager(text, output)
113
114
  else
114
115
  lesspipe { |less| less.puts text }
115
116
  end
116
117
  rescue Errno::ENOENT
117
- simple_pager(text)
118
+ simple_pager(text, output)
118
119
  rescue Errno::EPIPE
119
120
  end
120
121
 
@@ -15,9 +15,9 @@ class Pry
15
15
  end
16
16
 
17
17
  # if start_line is not false then add line numbers starting with start_line
18
- def render_output(should_flood, start_line, text)
18
+ def render_output(should_flood, start_line, text, color=:blue)
19
19
  if start_line
20
- text = Pry::Helpers::Text.with_line_numbers text, start_line
20
+ text = Pry::Helpers::Text.with_line_numbers text, start_line, color
21
21
  end
22
22
 
23
23
  if should_flood
@@ -255,7 +255,11 @@ class Pry
255
255
  end
256
256
 
257
257
  language_detected = file_type if file_type
258
- CodeRay.scan(contents, language_detected).term
258
+ if Pry.color
259
+ CodeRay.scan(contents, language_detected).term
260
+ else
261
+ contents
262
+ end
259
263
  end
260
264
 
261
265
  # convert negative line numbers to positive by wrapping around
@@ -286,7 +290,7 @@ class Pry
286
290
 
287
291
  def process_yardoc_tag(comment, tag)
288
292
  in_tag_block = nil
289
- output = comment.lines.map do |v|
293
+ comment.lines.map do |v|
290
294
  if in_tag_block && v !~ /^\S/
291
295
  Pry::Helpers::Text.strip_color Pry::Helpers::Text.strip_color(v)
292
296
  elsif in_tag_block
@@ -328,6 +332,37 @@ class Pry
328
332
  code.sub(/\A\s*\/\*.*?\*\/\s*/m, '')
329
333
  end
330
334
 
335
+ def invoke_editor(file, line)
336
+ if Pry.editor.respond_to?(:call)
337
+ editor_invocation = Pry.editor.call(file, line)
338
+ else
339
+ editor_invocation = "#{Pry.editor} #{start_line_syntax_for_editor(file, line)}"
340
+ end
341
+
342
+ run ".#{editor_invocation}"
343
+ end
344
+
345
+ def start_line_syntax_for_editor(file_name, line_number)
346
+ file_name = file_name.gsub(/\//, '\\') if RUBY_PLATFORM =~ /mswin|mingw/
347
+
348
+ case Pry.editor
349
+ when /^[gm]?vi/, /^emacs/, /^nano/, /^pico/, /^gedit/, /^kate/
350
+ "+#{line_number} #{file_name}"
351
+ when /^mate/, /^geany/
352
+ "-l #{line_number} #{file_name}"
353
+ when /^uedit32/
354
+ "#{file_name}/#{line_number}"
355
+ when /^jedit/
356
+ "#{file_name} +line:#{line_number}"
357
+ else
358
+ if RUBY_PLATFORM =~ /mswin|mingw/
359
+ "#{file_name}"
360
+ else
361
+ "+#{line_number} #{file_name}"
362
+ end
363
+ end
364
+ end
365
+
331
366
  def prompt(message, options="Yn")
332
367
  opts = options.scan(/./)
333
368
  optstring = opts.join("/") # case maintained
@@ -1,10 +1,10 @@
1
1
  class Pry
2
2
  module Helpers
3
3
 
4
- # The methods defined on {Text} are available to custom commands via {Pry::CommandContext#text}.
4
+ # The methods defined on {Text} are available to custom commands via {Pry::CommandContext#text}.
5
5
  module Text
6
-
7
- COLORS =
6
+
7
+ COLORS =
8
8
  {
9
9
  "black" => 0,
10
10
  "red" => 1,
@@ -18,7 +18,7 @@ class Pry
18
18
  }
19
19
 
20
20
  class << self
21
-
21
+
22
22
  COLORS.each_pair do |color, value|
23
23
  define_method color do |text|
24
24
  Pry.color ? "\033[0;#{30+value}m#{text}\033[0m" : text.to_s
@@ -31,7 +31,7 @@ class Pry
31
31
 
32
32
  alias_method :grey, :bright_black
33
33
  alias_method :gray, :bright_black
34
-
34
+
35
35
 
36
36
  # Remove any color codes from _text_.
37
37
  #
@@ -41,11 +41,11 @@ class Pry
41
41
  text.to_s.gsub(/\e\[.*?(\d)+m/ , '')
42
42
  end
43
43
 
44
- # Returns _text_ as bold text for use on a terminal.
44
+ # Returns _text_ as bold text for use on a terminal.
45
45
  # _Pry.color_ must be true for this method to perform any transformations.
46
46
  #
47
47
  # @param [String, #to_s] text
48
- # @return [String] _text_
48
+ # @return [String] _text_
49
49
  def bold text
50
50
  Pry.color ? "\e[1m#{text}\e[0m" : text.to_s
51
51
  end
@@ -63,15 +63,15 @@ class Pry
63
63
  end
64
64
 
65
65
  # Returns _text_ in a numbered list, beginning at _offset_.
66
- #
66
+ #
67
67
  # @param [#each_line] text
68
68
  # @param [Fixnum] offset
69
69
  # @return [String]
70
- def with_line_numbers text, offset
70
+ def with_line_numbers(text, offset, color=:blue)
71
71
  lines = text.each_line.to_a
72
72
  lines.each_with_index.map do |line, index|
73
73
  adjusted_index = index + offset
74
- "#{self.blue adjusted_index}: #{line}"
74
+ "#{self.send(color, adjusted_index)}: #{line}"
75
75
  end.join
76
76
  end
77
77
  end
@@ -139,8 +139,33 @@ class Pry
139
139
 
140
140
  # Load Readline history if required.
141
141
  def self.load_history
142
- history_file = File.expand_path(Pry.config.history.file)
143
142
  Readline::HISTORY.push(*File.readlines(history_file).map(&:chomp)) if File.exists?(history_file)
143
+ @loaded_history = Readline::HISTORY.to_a
144
+ end
145
+
146
+ # Save new lines of Readline history if required.
147
+ def self.save_history
148
+ history_to_save = Readline::HISTORY.to_a
149
+
150
+ # Omit any history we read from the file.This check is needed because
151
+ # `hist --clear` would otherwise cause us to not save history in this
152
+ # session.
153
+ if history_to_save[0...@loaded_history.size] == @loaded_history
154
+ history_to_save = history_to_save[@loaded_history.size..-1]
155
+ end
156
+
157
+ File.open(history_file, 'a') do |f|
158
+ f.puts history_to_save.join("\n") if history_to_save.size > 0
159
+ end
160
+
161
+ # Update @loaded_history so that future calls to save_history
162
+ # will do the right thing.
163
+ @loaded_history = Readline::HISTORY.to_a
164
+ end
165
+
166
+ # Get the full path of the history_path for pry.
167
+ def self.history_file
168
+ File.expand_path(Pry.config.history.file)
144
169
  end
145
170
 
146
171
  # @return [Boolean] Whether this is the first time a Pry session has
@@ -180,9 +205,9 @@ class Pry
180
205
 
181
206
  def self.default_editor_for_platform
182
207
  if RUBY_PLATFORM =~ /mswin|mingw/
183
- ENV['EDITOR'] ? ENV['EDITOR'] : "notepad"
208
+ ENV['EDITOR'] || "notepad"
184
209
  else
185
- ENV['EDITOR'] ? ENV['EDITOR'] : "nano"
210
+ ENV['EDITOR'] || "nano"
186
211
  end
187
212
  end
188
213
 
@@ -214,7 +239,6 @@ class Pry
214
239
  config.history.file = File.expand_path("~/.pry_history")
215
240
 
216
241
  config.memory_size = 100
217
- config.results_pager = true
218
242
  end
219
243
 
220
244
  # Set all the configurable options back to their default values
@@ -149,7 +149,7 @@ class Pry
149
149
  throw :breakout, break_data
150
150
  end
151
151
 
152
- save_history if Pry.config.history.should_save && finished_top_level_session?
152
+ Pry.save_history if Pry.config.history.should_save && finished_top_level_session?
153
153
 
154
154
  return_value
155
155
  end
@@ -217,23 +217,18 @@ class Pry
217
217
  target.eval("inp = ::Pry.active_instance.instance_eval { @input_array }")
218
218
  target.eval("out = ::Pry.active_instance.instance_eval { @output_array }")
219
219
 
220
- @last_result_is_exception = false
221
220
  set_active_instance(target)
222
221
 
223
222
  code = r(target)
224
223
 
225
- Pry.line_buffer.push(*code.each_line)
226
224
  res = set_last_result(target.eval(code, Pry.eval_path, Pry.current_line), target)
227
225
  res
228
226
  rescue SystemExit => e
229
227
  exit
230
228
  rescue Exception => e
231
- @last_result_is_exception = true
232
- @output_array << e
233
229
  set_last_exception(e, target)
234
230
  ensure
235
- @input_array << code
236
- Pry.current_line += code.each_line.count if code
231
+ update_input_history(code)
237
232
  end
238
233
 
239
234
  # Perform a read.
@@ -319,8 +314,10 @@ class Pry
319
314
  # @param [Object] result The result.
320
315
  # @param [Binding] target The binding to set `_` on.
321
316
  def set_last_result(result, target)
322
- Pry.last_result = result
317
+ @last_result_is_exception = false
323
318
  @output_array << result
319
+
320
+ Pry.last_result = result
324
321
  target.eval("_ = ::Pry.last_result")
325
322
  end
326
323
 
@@ -336,10 +333,39 @@ class Pry
336
333
  ex.backtrace.first =~ /(.*):(\d+)/
337
334
  ex.file, ex.line = $1, $2.to_i
338
335
 
336
+ @last_result_is_exception = true
337
+ @output_array << ex
338
+
339
339
  Pry.last_exception = ex
340
340
  target.eval("_ex_ = ::Pry.last_exception")
341
341
  end
342
342
 
343
+ # Update Pry's internal state after evalling code.
344
+ # This method should not need to be invoked directly.
345
+ # @param [String] code The code we just eval'd
346
+ def update_input_history(code)
347
+ # Always push to the @input_array as the @output_array is always pushed to.
348
+ @input_array << code
349
+ if code
350
+ Pry.line_buffer.push(*code.each_line)
351
+ Pry.current_line += code.each_line.count
352
+ end
353
+ if Readline::HISTORY.size > 0
354
+
355
+ # all this fluff is to get around annoying bug in libedit on
356
+ # ruby 1.8.7
357
+ final_index = -1
358
+ begin
359
+ Readline::HISTORY[-1]
360
+ rescue IndexError
361
+ final_index = -2
362
+ end
363
+ last = Readline::HISTORY[final_index].strip
364
+ prev = Readline::HISTORY.size > 1 ? Readline::HISTORY[final_index - 1].strip : ''
365
+ Readline::HISTORY.pop if last && (last.empty? || last == prev)
366
+ end
367
+ end
368
+
343
369
  # Set the active instance for a session.
344
370
  # This method should not need to be invoked directly.
345
371
  # @param [Binding] target The binding to set `_ex_` on.
@@ -389,14 +415,6 @@ class Pry
389
415
  !@suppress_output || last_result_is_exception?
390
416
  end
391
417
 
392
- # Save readline history to a file.
393
- def save_history
394
- history_file = File.expand_path(Pry.config.history.file)
395
- File.open(history_file, 'w') do |f|
396
- f.write Readline::HISTORY.to_a.join("\n")
397
- end
398
- end
399
-
400
418
  # Returns the appropriate prompt to use.
401
419
  # This method should not need to be invoked directly.
402
420
  # @param [Boolean] first_line Whether this is the first line of input
@@ -1,3 +1,3 @@
1
1
  class Pry
2
- VERSION = "0.9.3"
2
+ VERSION = "0.9.4pre1"
3
3
  end
@@ -18,18 +18,6 @@ describe "Pry::CommandProcessor" do
18
18
 
19
19
  valid = @command_processor.valid_command? "blah"
20
20
  valid.should == false
21
-
22
-
23
- a = "test-command"
24
-
25
- # not passing in a binding so 'a' shouldn't exist and no command
26
- # will be matched
27
- valid = @command_processor.valid_command?('#{a}')
28
- valid.should == false
29
-
30
- # passing in the optional binding (against which interpolation is performed)
31
- valid = @command_processor.valid_command? '#{a}', binding
32
- valid.should == true
33
21
  end
34
22
 
35
23
  it 'should correctly match a simple string command' do
@@ -168,88 +156,21 @@ describe "Pry::CommandProcessor" do
168
156
  pos.should == sample_text.size
169
157
  end
170
158
 
171
- it 'should correctly match a command whose name is interpolated' do
172
- @pry.commands.command("blah") {}
173
- a = "bl"
174
- b = "ah"
175
- command, captures, pos = @command_processor.command_matched '#{a}#{b}', binding
176
-
177
- command.name.should == "blah"
178
- captures.should == []
179
- pos.should == command.name.length
180
- end
181
-
182
- it 'should correctly match a regex command and interpolation should not break the regex' do
183
- regex_command_name = /blah(\d)/
184
- @pry.commands.command(regex_command_name) {}
185
-
186
- sample_text = "blah5"
187
- a = "5"
188
- command, captures, pos = @command_processor.command_matched 'blah#{a}', binding
189
-
190
- command.name.should == regex_command_name
191
- captures.should == ["5"]
192
- pos.should == sample_text.size
193
- end
194
-
195
- it 'should NOT match a regex command that is interpolated when :interpolate => false' do
196
- regex_command_name = /blah(\d)/
197
- @pry.commands.command(regex_command_name, "", :interpolate => false) {}
198
-
199
- sample_text = "blah5"
200
- a = "5"
201
- command, captures, pos = @command_processor.command_matched 'blah#{a}', binding
202
-
203
- command.should == nil
204
- end
205
-
206
- it 'should correctly match a regex command and interpolation should not break the regex where entire regex command is interpolated' do
207
- regex_command_name = /blah(\d)/
208
- @pry.commands.command(regex_command_name) {}
209
-
210
- sample_text = "blah5"
211
- a = "bl"
212
- b = "ah"
213
- c = "5"
214
-
215
- command, captures, pos = @command_processor.command_matched '#{a}#{b}#{c}', binding
216
-
217
- command.name.should == regex_command_name
218
- captures.should == ["5"]
219
- pos.should == sample_text.size
220
- end
221
-
222
- it 'should NOT match a regex command where entire regex command is interpolated and :interpolate => false' do
223
- regex_command_name = /blah(\d)/
224
- @pry.commands.command(regex_command_name, "", :interpolate => false) {}
225
-
226
- sample_text = "blah5"
227
- a = "bl"
228
- b = "ah"
229
- c = "5"
230
-
231
- command, captures, pos = @command_processor.command_matched '#{a}#{b}#{c}', binding
232
- command.should == nil
233
- end
234
-
235
- it 'should NOT match a command whose name is interpolated when :interpolate => false' do
159
+ it 'should not interpolate commands that have :interpolate => false (interpolate_string should *not* be called)' do
236
160
  @pry.commands.command("boast", "", :interpolate => false) {}
237
- a = "boa"
238
- b = "st"
239
161
 
240
162
  # remember to use '' instead of "" when testing interpolation or
241
163
  # you'll cause yourself incredible confusion
242
- command, captures, pos = @command_processor.command_matched '#{a}#{b}', binding
243
-
244
- command.should == nil
164
+ lambda { @command_processor.command_matched('boast #{c}', binding) }.should.not.raise NameError
245
165
  end
246
166
 
167
+ it 'should only execute the contents of an interpolation once' do
168
+ $obj = 'a'
247
169
 
248
- it 'commands that have :interpolate => false should not be interpolated (interpolate_string should *not* be called)' do
249
- @pry.commands.command("boast", "", :interpolate => false) {}
170
+ redirect_pry_io(InputTester.new('cat #{$obj.succ!}'), StringIO.new) do
171
+ Pry.new.rep
172
+ end
250
173
 
251
- # remember to use '' instead of "" when testing interpolation or
252
- # you'll cause yourself incredible confusion
253
- lambda { @command_processor.command_matched('boast #{c}', binding) }.should.not.raise NameError
174
+ $obj.should == 'b'
254
175
  end
255
176
  end
@@ -187,4 +187,37 @@ describe Pry::CommandSet do
187
187
  @set.command 'foo', "", :listing => 'bar' do;end
188
188
  @set.commands['foo'].options[:listing].should == 'bar'
189
189
  end
190
+
191
+ it "should provide a 'help' command" do
192
+ context = Pry::CommandContext.new
193
+ context.command_set = @set
194
+ context.output = StringIO.new
195
+
196
+ lambda {
197
+ @set.run_command(context, 'help')
198
+ }.should.not.raise
199
+ end
200
+
201
+ it "should sort the output of the 'help' command" do
202
+ @set.command 'foo', "Fooerizes" do; end
203
+ @set.command 'goo', "Gooerizes" do; end
204
+ @set.command 'moo', "Mooerizes" do; end
205
+ @set.command 'boo', "Booerizes" do; end
206
+
207
+ context = Pry::CommandContext.new
208
+ context.command_set = @set
209
+ context.output = StringIO.new
210
+
211
+ @set.run_command(context, 'help')
212
+
213
+ doc = context.output.string
214
+
215
+ order = [doc.index("boo"),
216
+ doc.index("foo"),
217
+ doc.index("goo"),
218
+ doc.index("help"),
219
+ doc.index("moo")]
220
+
221
+ order.should == order.sort
222
+ end
190
223
  end
@@ -0,0 +1,23 @@
1
+ require 'helper'
2
+
3
+ describe Pry::InputCompleter do
4
+
5
+ before do
6
+ # The AMQP gem has some classes like this:
7
+ # pry(main)> AMQP::Protocol::Test::ContentOk.name
8
+ # => :content_ok
9
+ module SymbolyName
10
+ def self.name; :symboly_name; end
11
+ end
12
+ end
13
+
14
+ after do
15
+ Object.remove_const :SymbolyName
16
+ end
17
+
18
+ it "should not crash if there's a Module that has a symbolic name." do
19
+ completer = Pry::InputCompleter.build_completion_proc(Pry.binding_for(Object.new))
20
+ lambda{ completer.call "a.to_s." }.should.not.raise Exception
21
+ end
22
+ end
23
+
@@ -321,6 +321,27 @@ describe "Pry::DefaultCommands::Input" do
321
321
  str_output.string.each_line.count.should == 4
322
322
  str_output.string.should =~ /b\n\d+:.*c\n\d+:.*d/
323
323
  end
324
+
325
+ it "should not contain duplicated lines" do
326
+ str_output = StringIO.new
327
+ redirect_pry_io(InputTester.new("3", "_ += 1", "_ += 1", "hist", "exit-all", :history => @hist), str_output) do
328
+ pry
329
+ end
330
+
331
+ str_output.string.each_line.grep(/_ \+= 1/).count.should == 1
332
+ end
333
+
334
+ it "should not contain duplicated lines" do
335
+ str_output = StringIO.new
336
+ redirect_pry_io(InputTester.new(":place_holder", "2 + 2", "", "", "3 + 3", "hist", "exit-all", :history => @hist), str_output) do
337
+ pry
338
+ end
339
+
340
+ a = str_output.string.each_line.to_a.index{|line| line.include?("2 + 2") }
341
+ b = str_output.string.each_line.to_a.index{|line| line.include?("3 + 3") }
342
+
343
+ (a + 1).should == b
344
+ end
324
345
  end
325
346
 
326
347
 
@@ -94,7 +94,7 @@ describe "Pry::DefaultCommands::Introspection" do
94
94
 
95
95
  it 'should output an instance method\'s source for a method defined inside pry using define_method' do
96
96
  str_output = StringIO.new
97
- redirect_pry_io(InputTester.new("class A", "define_method(:yup) {}", "end", "end", "show-method A#yup"), str_output) do
97
+ redirect_pry_io(InputTester.new("class A", "define_method(:yup) {}", "end", "show-method A#yup"), str_output) do
98
98
  TOPLEVEL_BINDING.pry
99
99
  end
100
100
 
@@ -517,7 +517,7 @@ describe Pry do
517
517
  $test_interpolation = nil
518
518
  end
519
519
 
520
- # bug fix for https://github.com/banister/pry/issues/170
520
+ # bug fix for https://github.com/pry/pry/issues/170
521
521
  it 'should not choke on complex string interpolation when checking if ruby code is a command' do
522
522
  redirect_pry_io(InputTester.new('/#{Regexp.escape(File.expand_path("."))}/'), str_output = StringIO.new) do
523
523
  pry
@@ -0,0 +1,82 @@
1
+ require 'helper'
2
+ require 'tempfile'
3
+
4
+ describe Pry do
5
+
6
+ before do
7
+ Readline::HISTORY.shift while Readline::HISTORY.length > 0
8
+ @hist = Tempfile.new(["tmp", ".pry_history"]).tap(&:close).path
9
+ File.open(@hist, 'w') {|f| f << "1\n2\n3\n" }
10
+ @old_hist = Pry.config.history.file
11
+ Pry.config.history.file = @hist
12
+ Pry.load_history
13
+ end
14
+
15
+ after do
16
+ File.unlink @hist
17
+ Pry.config.history.file = @old_hist
18
+ end
19
+
20
+ describe ".load_history" do
21
+ it "should read the contents of the file" do
22
+ Readline::HISTORY.to_a[-2..-1].should === ["2", "3"]
23
+ end
24
+ end
25
+
26
+ describe ".save_history" do
27
+ it "should include a trailing newline" do
28
+ Readline::HISTORY << "4"
29
+ Pry.save_history
30
+ File.read(@hist).should =~ /4\n\z/
31
+ end
32
+
33
+ it "should not change anything if history is not changed" do
34
+ File.open(@hist, 'w') {|f| f << "4\n5\n6\n" }
35
+ Pry.save_history
36
+ File.read(@hist).should == "4\n5\n6\n"
37
+ end
38
+
39
+ it "should append new lines to the file" do
40
+ Readline::HISTORY << "4"
41
+ Pry.save_history
42
+ File.read(@hist).should == "1\n2\n3\n4\n"
43
+ end
44
+
45
+ it "should not clobber lines written by other Pry's in the meantime" do
46
+ Readline::HISTORY << "5"
47
+ File.open(@hist, 'a') {|f| f << "4\n" }
48
+ Pry.save_history
49
+
50
+ Readline::HISTORY.to_a[-3..-1].should == ["2", "3", "5"]
51
+ File.read(@hist).should == "1\n2\n3\n4\n5\n"
52
+ end
53
+
54
+ it "should not delete lines from the file if this session's history was cleared" do
55
+ Readline::HISTORY.pop while Readline::HISTORY.size > 0
56
+ Pry.save_history
57
+ File.read(@hist).should == "1\n2\n3\n"
58
+ end
59
+
60
+ it "should save new lines that are added after the history was cleared" do
61
+ Readline::HISTORY.pop while Readline::HISTORY.size > 0
62
+ Readline::HISTORY << "4"
63
+
64
+ # doing this twice as libedit on 1.8.7 has bugs and sometimes ignores the
65
+ # first line in history
66
+ Readline::HISTORY << "4"
67
+ Pry.save_history
68
+ File.read(@hist).should =~ /1\n2\n3\n4\n/
69
+ end
70
+
71
+ it "should only append new lines the second time it is saved" do
72
+ Readline::HISTORY << "4"
73
+ Pry.save_history
74
+ File.open(@hist, 'a') {|f| f << "5\n" }
75
+ Readline::HISTORY << "6"
76
+ Pry.save_history
77
+
78
+ Readline::HISTORY.to_a[-4..-1].should == ["2", "3", "4", "6"]
79
+ File.read(@hist).should == "1\n2\n3\n4\n5\n6\n"
80
+ end
81
+ end
82
+ end
metadata CHANGED
@@ -1,8 +1,8 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: pry
3
3
  version: !ruby/object:Gem::Version
4
- prerelease:
5
- version: 0.9.3
4
+ prerelease: 5
5
+ version: 0.9.4pre1
6
6
  platform: ruby
7
7
  authors:
8
8
  - John Mair (banisterfiend)
@@ -10,7 +10,7 @@ autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
12
 
13
- date: 2011-07-28 00:00:00 Z
13
+ date: 2011-08-19 00:00:00 Z
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
16
16
  name: ruby_parser
@@ -92,6 +92,7 @@ files:
92
92
  - .gitignore
93
93
  - .yardopts
94
94
  - CHANGELOG
95
+ - CONTRIBUTORS
95
96
  - LICENSE
96
97
  - README.markdown
97
98
  - Rakefile
@@ -142,6 +143,7 @@ files:
142
143
  - test/test_command_helpers.rb
143
144
  - test/test_command_processor.rb
144
145
  - test/test_command_set.rb
146
+ - test/test_completion.rb
145
147
  - test/test_default_commands.rb
146
148
  - test/test_default_commands/test_context.rb
147
149
  - test/test_default_commands/test_documentation.rb
@@ -150,6 +152,7 @@ files:
150
152
  - test/test_default_commands/test_introspection.rb
151
153
  - test/test_history_array.rb
152
154
  - test/test_pry.rb
155
+ - test/test_pry_history.rb
153
156
  - test/testrc
154
157
  - wiki/Customizing-pry.md
155
158
  - wiki/Home.md
@@ -170,9 +173,9 @@ required_ruby_version: !ruby/object:Gem::Requirement
170
173
  required_rubygems_version: !ruby/object:Gem::Requirement
171
174
  none: false
172
175
  requirements:
173
- - - ">="
176
+ - - ">"
174
177
  - !ruby/object:Gem::Version
175
- version: "0"
178
+ version: 1.3.1
176
179
  requirements: []
177
180
 
178
181
  rubyforge_project:
@@ -185,6 +188,7 @@ test_files:
185
188
  - test/test_command_helpers.rb
186
189
  - test/test_command_processor.rb
187
190
  - test/test_command_set.rb
191
+ - test/test_completion.rb
188
192
  - test/test_default_commands.rb
189
193
  - test/test_default_commands/test_context.rb
190
194
  - test/test_default_commands/test_documentation.rb
@@ -193,4 +197,5 @@ test_files:
193
197
  - test/test_default_commands/test_introspection.rb
194
198
  - test/test_history_array.rb
195
199
  - test/test_pry.rb
200
+ - test/test_pry_history.rb
196
201
  - test/testrc