pry 0.8.0pre5-java → 0.8.0pre7-java

Sign up to get free protection for your applications and to get access to all the features.
data/Rakefile CHANGED
@@ -35,7 +35,7 @@ end
35
35
 
36
36
  desc "run pry"
37
37
  task :pry do
38
- require "#{direc}/lib/pry.rb"
38
+ require "#{direc}/lib/pry"
39
39
  binding.pry
40
40
  end
41
41
 
data/bin/pry CHANGED
@@ -68,6 +68,13 @@ end.parse!
68
68
  # invoked via cli
69
69
  Pry.cli = true
70
70
 
71
+ class Pry::Commands
72
+ command "reset", "Reset the REPL to a clean state." do
73
+ output.puts "Pry reset."
74
+ exec("pry")
75
+ end
76
+ end
77
+
71
78
  # load ~/.pryrc, if not suppressed with -f option
72
79
  Pry.should_load_rc = false if !options[:loadrc]
73
80
 
@@ -131,19 +131,17 @@ class Pry
131
131
 
132
132
  command "help", "This menu." do |cmd|
133
133
  command_info = opts[:commands]
134
- param = cmd
135
134
 
136
- if !param
137
- output.puts "Command list:"
138
- output.puts "--"
135
+ if !cmd
136
+ output.puts "Command list:\n--"
139
137
  command_info.each do |k, data|
140
138
  output.puts "#{k}".ljust(18) + data[:description] if !data[:description].empty?
141
139
  end
142
140
  else
143
- if command_info[param]
144
- output.puts command_info[param][:description]
141
+ if command_info[cmd]
142
+ output.puts command_info[cmd][:description]
145
143
  else
146
- output.puts "No info for command: #{param}"
144
+ output.puts "No info for command: #{cmd}"
147
145
  end
148
146
  end
149
147
  end
@@ -0,0 +1,291 @@
1
+ class Pry
2
+ class Commands < CommandBase
3
+ module CommandHelpers
4
+
5
+ private
6
+
7
+ def try_to_load_pry_doc
8
+
9
+ # YARD crashes on rbx, so do not require it
10
+ if !Object.const_defined?(:RUBY_ENGINE) || RUBY_ENGINE !~ /rbx/
11
+ require "pry-doc"
12
+ end
13
+ rescue LoadError
14
+ end
15
+
16
+ def meth_name_from_binding(b)
17
+ meth_name = b.eval('__method__')
18
+ if [:__script__, nil, :__binding__, :__binding_impl__].include?(meth_name)
19
+ nil
20
+ else
21
+ meth_name
22
+ end
23
+ end
24
+
25
+ def set_file_and_dir_locals(file_name)
26
+ return if !target
27
+ $_file_temp = File.expand_path(file_name)
28
+ $_dir_temp = File.dirname($_file_temp)
29
+ target.eval("_file_ = $_file_temp")
30
+ target.eval("_dir_ = $_file_temp")
31
+ end
32
+
33
+ # a simple pager for systems without `less`. A la windows.
34
+ def simple_pager(text)
35
+ page_size = 22
36
+ text_array = text.lines.to_a
37
+ text_array.each_slice(page_size) do |chunk|
38
+ output.puts chunk.join
39
+ break if chunk.size < page_size
40
+ if text_array.size > page_size
41
+ output.puts "\n<page break> --- Press enter to continue ( q<enter> to break ) --- <page break>"
42
+ break if $stdin.gets.chomp == "q"
43
+ end
44
+ end
45
+ end
46
+
47
+ # Try to use `less` for paging, if it fails then use simple_pager
48
+ def stagger_output(text)
49
+ lesspipe { |less| less.puts text }
50
+ rescue Exception
51
+ simple_pager(text)
52
+ end
53
+
54
+ def add_line_numbers(lines, start_line)
55
+ line_array = lines.each_line.to_a
56
+ line_array.each_with_index.map do |line, idx|
57
+ adjusted_index = idx + start_line
58
+ if Pry.color
59
+ cindex = CodeRay.scan("#{adjusted_index}", :ruby).term
60
+ "#{cindex}: #{line}"
61
+ else
62
+ "#{idx}: #{line}"
63
+ end
64
+ end.join
65
+ end
66
+
67
+ # only add line numbers if start_line is not false
68
+ # if start_line is not false then add line numbers starting with start_line
69
+ def render_output(should_flood, start_line, doc)
70
+ if start_line
71
+ doc = add_line_numbers(doc, start_line)
72
+ end
73
+
74
+ if should_flood
75
+ output.puts doc
76
+ else
77
+ stagger_output(doc)
78
+ end
79
+ end
80
+
81
+ def check_for_dynamically_defined_method(meth)
82
+ file, _ = meth.source_location
83
+ if file =~ /(\(.*\))|<.*>/
84
+ raise "Cannot retrieve source for dynamically defined method."
85
+ end
86
+ end
87
+
88
+ def remove_first_word(text)
89
+ text.split.drop(1).join(' ')
90
+ end
91
+
92
+ def get_method_object(meth_name, target, options)
93
+ if !meth_name
94
+ return nil
95
+ end
96
+
97
+ if options[:M]
98
+ target.eval("instance_method(:#{meth_name})")
99
+ elsif options[:m]
100
+ target.eval("method(:#{meth_name})")
101
+ else
102
+ begin
103
+ target.eval("instance_method(:#{meth_name})")
104
+ rescue
105
+ begin
106
+ target.eval("method(:#{meth_name})")
107
+ rescue
108
+ return nil
109
+ end
110
+ end
111
+ end
112
+ end
113
+
114
+ def make_header(meth, code_type, content)
115
+ file, line = meth.source_location
116
+ num_lines = "Number of lines: #{content.each_line.count}"
117
+ case code_type
118
+ when :ruby
119
+ "\nFrom #{file} @ line #{line}:\n#{num_lines}\n\n"
120
+ else
121
+ "\nFrom Ruby Core (C Method):\n#{num_lines}\n\n"
122
+ end
123
+ end
124
+
125
+ def is_a_c_method?(meth)
126
+ meth.source_location.nil?
127
+ end
128
+
129
+ def should_use_pry_doc?(meth)
130
+ Pry.has_pry_doc && is_a_c_method?(meth)
131
+ end
132
+
133
+ def code_type_for(meth)
134
+ # only C methods
135
+ if should_use_pry_doc?(meth)
136
+ info = Pry::MethodInfo.info_for(meth)
137
+ if info && info.source
138
+ code_type = :c
139
+ else
140
+ output.puts "Cannot find C method: #{meth.name}"
141
+ code_type = nil
142
+ end
143
+ else
144
+ if is_a_c_method?(meth)
145
+ output.puts "Cannot locate this method: #{meth.name}. Try `gem install pry-doc` to get access to Ruby Core documentation."
146
+ code_type = nil
147
+ else
148
+ check_for_dynamically_defined_method(meth)
149
+ code_type = :ruby
150
+ end
151
+ end
152
+ code_type
153
+ end
154
+
155
+ def file_map
156
+ {
157
+ [".c", ".h"] => :c,
158
+ [".cpp", ".hpp", ".cc", ".h", "cxx"] => :cpp,
159
+ [".rb", "Rakefile"] => :ruby,
160
+ ".py" => :python,
161
+ ".diff" => :diff,
162
+ ".css" => :css,
163
+ ".html" => :html,
164
+ [".yaml", ".yml"] => :yaml,
165
+ ".xml" => :xml,
166
+ ".php" => :php,
167
+ ".js" => :javascript,
168
+ ".java" => :java,
169
+ ".rhtml" => :rhtml,
170
+ ".json" => :json
171
+ }
172
+ end
173
+
174
+ def syntax_highlight_by_file_type_or_specified(contents, file_name, file_type)
175
+ _, language_detected = file_map.find do |k, v|
176
+ Array(k).any? do |matcher|
177
+ matcher == File.extname(file_name) || matcher == File.basename(file_name)
178
+ end
179
+ end
180
+
181
+ language_detected = file_type if file_type
182
+ CodeRay.scan(contents, language_detected).term
183
+ end
184
+
185
+ # convert negative line numbers to positive by wrapping around
186
+ # last line (as per array indexing with negative numbers)
187
+ def normalized_line_number(line_number, total_lines)
188
+ line_number < 0 ? line_number + total_lines : line_number
189
+ end
190
+
191
+ # returns the file content between the lines and the normalized
192
+ # start and end line numbers.
193
+ def read_between_the_lines(file_name, start_line, end_line)
194
+ content = File.read(File.expand_path(file_name))
195
+ lines_array = content.each_line.to_a
196
+
197
+ [lines_array[start_line..end_line].join, normalized_line_number(start_line, lines_array.size),
198
+ normalized_line_number(end_line, lines_array.size)]
199
+ end
200
+
201
+ # documentation related helpers
202
+ def strip_color_codes(str)
203
+ str.gsub(/\e\[.*?(\d)+m/, '')
204
+ end
205
+
206
+ def process_rdoc(comment, code_type)
207
+ comment = comment.dup
208
+ comment.gsub(/<code>(?:\s*\n)?(.*?)\s*<\/code>/m) { Pry.color ? CodeRay.scan($1, code_type).term : $1 }.
209
+ gsub(/<em>(?:\s*\n)?(.*?)\s*<\/em>/m) { Pry.color ? "\e[32m#{$1}\e[0m": $1 }.
210
+ gsub(/<i>(?:\s*\n)?(.*?)\s*<\/i>/m) { Pry.color ? "\e[34m#{$1}\e[0m" : $1 }.
211
+ gsub(/\B\+(\w*?)\+\B/) { Pry.color ? "\e[32m#{$1}\e[0m": $1 }.
212
+ gsub(/((?:^[ \t]+.+(?:\n+|\Z))+)/) { Pry.color ? CodeRay.scan($1, code_type).term : $1 }.
213
+ gsub(/`(?:\s*\n)?(.*?)\s*`/) { Pry.color ? CodeRay.scan($1, code_type).term : $1 }
214
+ end
215
+
216
+ def process_yardoc_tag(comment, tag)
217
+ in_tag_block = nil
218
+ output = comment.lines.map do |v|
219
+ if in_tag_block && v !~ /^\S/
220
+ strip_color_codes(strip_color_codes(v))
221
+ elsif in_tag_block
222
+ in_tag_block = false
223
+ v
224
+ else
225
+ in_tag_block = true if v =~ /^@#{tag}/
226
+ v
227
+ end
228
+ end.join
229
+ end
230
+
231
+ def process_yardoc(comment)
232
+ yard_tags = ["param", "return", "option", "yield", "attr", "attr_reader", "attr_writer",
233
+ "deprecate", "example"]
234
+ (yard_tags - ["example"]).inject(comment) { |a, v| process_yardoc_tag(a, v) }.
235
+ gsub(/^@(#{yard_tags.join("|")})/) { Pry.color ? "\e[33m#{$1}\e[0m": $1 }
236
+ end
237
+
238
+ def process_comment_markup(comment, code_type)
239
+ process_yardoc process_rdoc(comment, code_type)
240
+ end
241
+
242
+ # strip leading whitespace but preserve indentation
243
+ def strip_leading_whitespace(text)
244
+ return text if text.empty?
245
+ leading_spaces = text.lines.first[/^(\s+)/, 1]
246
+ text.gsub(/^#{leading_spaces}/, '')
247
+ end
248
+
249
+ def strip_leading_hash_and_whitespace_from_ruby_comments(comment)
250
+ comment = comment.dup
251
+ comment.gsub!(/\A\#+?$/, '')
252
+ comment.gsub!(/^\s*#/, '')
253
+ strip_leading_whitespace(comment)
254
+ end
255
+
256
+ def strip_comments_from_c_code(code)
257
+ code.sub /\A\s*\/\*.*?\*\/\s*/m, ''
258
+ end
259
+
260
+ # thanks to epitron for this method
261
+ def lesspipe(*args)
262
+ if args.any? and args.last.is_a?(Hash)
263
+ options = args.pop
264
+ else
265
+ options = {}
266
+ end
267
+
268
+ output = args.first if args.any?
269
+
270
+ params = []
271
+ params << "-R" unless options[:color] == false
272
+ params << "-S" unless options[:wrap] == true
273
+ params << "-F" unless options[:always] == true
274
+ if options[:tail] == true
275
+ params << "+\\>"
276
+ $stderr.puts "Seeking to end of stream..."
277
+ end
278
+ params << "-X"
279
+
280
+ IO.popen("less #{params * ' '}", "w") do |less|
281
+ if output
282
+ less.puts output
283
+ else
284
+ yield less
285
+ end
286
+ end
287
+ end
288
+
289
+ end
290
+ end
291
+ end
@@ -4,115 +4,15 @@ require "optparse"
4
4
  require "method_source"
5
5
  require "#{direc}/command_base"
6
6
  require "#{direc}/pry_instance"
7
-
8
- begin
9
-
10
- # YARD crashes on rbx, so do not require it
11
- if !Object.const_defined?(:RUBY_ENGINE) || RUBY_ENGINE !~ /rbx/
12
- require "pry-doc"
13
- end
14
- rescue LoadError
15
- end
7
+ require "#{direc}/command_helpers"
16
8
 
17
9
  class Pry
18
10
 
19
11
  # Default commands used by Pry.
20
12
  class Commands < CommandBase
13
+ extend CommandHelpers
21
14
 
22
- # We make this a lambda to avoid documenting it
23
- meth_name_from_binding = lambda do |b|
24
- meth_name = b.eval('__method__')
25
-
26
- # :__script__ for rubinius
27
- if [:__script__, nil, :__binding__, :__binding_impl__].include?(meth_name)
28
- nil
29
- else
30
- meth_name
31
- end
32
- end
33
-
34
- set_file_and_dir_locals = lambda do |file_name|
35
- return if !target
36
- FILE_TEMP = File.expand_path(file_name)
37
- DIR_TEMP = File.dirname(FILE_TEMP)
38
- target.eval("_file_ = Pry::Commands::FILE_TEMP")
39
- target.eval("_dir_ = Pry::Commands::DIR_TEMP")
40
- remove_const(:FILE_TEMP)
41
- remove_const(:DIR_TEMP)
42
- end
43
-
44
- check_for_dynamically_defined_method = lambda do |meth|
45
- file, _ = meth.source_location
46
- if file =~ /(\(.*\))|<.*>/
47
- raise "Cannot retrieve source for dynamically defined method."
48
- end
49
- end
50
-
51
- remove_first_word = lambda do |text|
52
- text.split.drop(1).join(' ')
53
- end
54
-
55
- get_method_object = lambda do |meth_name, target, options|
56
- if !meth_name
57
- return nil
58
- end
59
-
60
- if options[:M]
61
- target.eval("instance_method(:#{meth_name})")
62
- elsif options[:m]
63
- target.eval("method(:#{meth_name})")
64
- else
65
- begin
66
- target.eval("instance_method(:#{meth_name})")
67
- rescue
68
- begin
69
- target.eval("method(:#{meth_name})")
70
- rescue
71
- return nil
72
- end
73
- end
74
- end
75
- end
76
-
77
- make_header = lambda do |meth, code_type|
78
- file, line = meth.source_location
79
- header = case code_type
80
- when :ruby
81
- "--\nFrom #{file} @ line #{line}:\n--"
82
- else
83
- "--\nFrom Ruby Core (C Method):\n--"
84
- end
85
- end
86
-
87
- is_a_c_method = lambda do |meth|
88
- meth.source_location.nil?
89
- end
90
-
91
- should_use_pry_doc = lambda do |meth|
92
- Pry.has_pry_doc && is_a_c_method.call(meth)
93
- end
94
-
95
- code_type_for = lambda do |meth|
96
- # only C methods
97
- if should_use_pry_doc.call(meth)
98
- info = Pry::MethodInfo.info_for(meth)
99
- if info && info.source
100
- code_type = :c
101
- else
102
- output.puts "Cannot find C method: #{meth.name}"
103
- code_type = nil
104
- end
105
- else
106
- if is_a_c_method.call(meth)
107
- output.puts "Cannot locate this method: #{meth.name}. Try `gem install pry-doc` to get access to Ruby Core documentation."
108
- code_type = nil
109
- else
110
- check_for_dynamically_defined_method.call(meth)
111
- code_type = :ruby
112
- end
113
- end
114
- code_type
115
- end
15
+ try_to_load_pry_doc
116
16
 
117
17
  command "!", "Clear the input buffer. Useful if the parsing process goes wrong and you get stuck in the read loop." do
118
18
  output.puts "Input buffer cleared!"
@@ -151,7 +51,7 @@ class Pry
151
51
  end
152
52
  end
153
53
 
154
- command "file-mode", "Toggle file mode." do
54
+ command "shell-mode", "Toggle shell mode. Bring in pwd prompt and file completion." do
155
55
  case Pry.active_instance.prompt
156
56
  when Pry::FILE_PROMPT
157
57
  Pry.active_instance.prompt = Pry::DEFAULT_PROMPT
@@ -164,6 +64,8 @@ class Pry
164
64
  end
165
65
  end
166
66
 
67
+ alias_command "file-mode", "shell-mode", ""
68
+
167
69
  command "nesting", "Show nesting information." do
168
70
  nesting = opts[:nesting]
169
71
 
@@ -188,7 +90,7 @@ class Pry
188
90
  output.puts "Pry version: #{Pry::VERSION}"
189
91
  output.puts "Ruby version: #{RUBY_VERSION}"
190
92
 
191
- mn = meth_name_from_binding.call(target)
93
+ mn = meth_name_from_binding(target)
192
94
  output.puts "Current method: #{mn ? mn : "N/A"}"
193
95
  output.puts "Pry instance: #{Pry.active_instance}"
194
96
  output.puts "Last result: #{Pry.view(Pry.last_result)}"
@@ -204,8 +106,8 @@ class Pry
204
106
  else
205
107
  i_num = 5
206
108
  end
207
-
208
- meth_name = meth_name_from_binding.call(target)
109
+
110
+ meth_name = meth_name_from_binding(target)
209
111
  meth_name = "N/A" if !meth_name
210
112
 
211
113
  if file =~ /(\(.*\))|<.*>/ || file == ""
@@ -213,9 +115,8 @@ class Pry
213
115
  next
214
116
  end
215
117
 
216
- set_file_and_dir_locals.call(file)
217
- puts "blah blah #{target}"
218
- output.puts "--\nFrom #{file} @ line #{line_num} in #{klass}##{meth_name}:\n--"
118
+ set_file_and_dir_locals(file)
119
+ output.puts "\nFrom #{file} @ line #{line_num} in #{klass}##{meth_name}:\n\n"
219
120
 
220
121
  # This method inspired by http://rubygems.org/gems/ir_b
221
122
  File.open(file).each_with_index do |line, index|
@@ -245,13 +146,13 @@ class Pry
245
146
  end
246
147
 
247
148
  command "exit-all", "End all nested Pry sessions. Accepts optional return value. Aliases: !@" do
248
- str = remove_first_word.call(opts[:val])
149
+ str = remove_first_word(opts[:val])
249
150
  throw(:breakout, [0, target.eval(str)])
250
151
  end
251
152
 
252
153
  alias_command "!@", "exit-all", ""
253
154
 
254
- command "ls", "Show the list of vars in the current scope. Type `ls --help` for more info." do |*args|
155
+ command "ls", "Show the list of vars and methods in the current scope. Type `ls --help` for more info." do |*args|
255
156
  options = {}
256
157
 
257
158
  # Set target local to the default -- note that we can set a different target for
@@ -416,48 +317,7 @@ Shows local and instance variables by default.
416
317
  end
417
318
  end
418
319
 
419
- file_map = {
420
- [".c", ".h"] => :c,
421
- [".cpp", ".hpp", ".cc", ".h", "cxx"] => :cpp,
422
- ".rb" => :ruby,
423
- ".py" => :python,
424
- ".diff" => :diff,
425
- ".css" => :css,
426
- ".html" => :html,
427
- [".yaml", ".yml"] => :yaml,
428
- ".xml" => :xml,
429
- ".php" => :php,
430
- ".js" => :javascript,
431
- ".java" => :java,
432
- ".rhtml" => :rhtml,
433
- ".json" => :json
434
- }
435
-
436
- syntax_highlight_by_file_type_or_specified = lambda do |contents, file_name, file_type|
437
- _, language_detected = file_map.find { |k, v| Array(k).include?(File.extname(file_name)) }
438
-
439
- language_detected = file_type if file_type
440
- CodeRay.scan(contents, language_detected).term
441
- end
442
-
443
- read_between_the_lines = lambda do |file_name, start_line, end_line|
444
- content = File.read(File.expand_path(file_name))
445
- content.each_line.to_a[start_line..end_line].join
446
- end
447
-
448
- add_line_numbers = lambda do |lines, start_line|
449
- lines.each_line.each_with_index.map do |line, idx|
450
- adjusted_index = idx + start_line
451
- if Pry.color
452
- cindex = CodeRay.scan("#{adjusted_index}", :ruby).term
453
- "#{cindex}: #{line}"
454
- else
455
- "#{idx}: #{line}"
456
- end
457
- end
458
- end
459
-
460
- command "cat-file", "Show output of file FILE. Type `cat --help` for more information." do |*args|
320
+ command "cat-file", "Show output of file FILE. Type `cat-file --help` for more information." do |*args|
461
321
  options= {}
462
322
  file_name = nil
463
323
  start_line = 0
@@ -484,7 +344,11 @@ e.g: cat-file hello.rb
484
344
 
485
345
  opts.on("-t", "--type TYPE", "The specific file type for syntax higlighting (e.g ruby, python, cpp, java)") do |type|
486
346
  file_type = type.to_sym
487
- end
347
+ end
348
+
349
+ opts.on("-f", "--flood", "Do not use a pager to view text longer than one screen.") do
350
+ options[:f] = true
351
+ end
488
352
 
489
353
  opts.on_tail("-h", "--help", "This message.") do
490
354
  output.puts opts
@@ -501,18 +365,14 @@ e.g: cat-file hello.rb
501
365
  next
502
366
  end
503
367
 
504
- contents = read_between_the_lines.call(file_name, start_line, end_line)
368
+ contents, normalized_start_line, _ = read_between_the_lines(file_name, start_line, end_line)
505
369
 
506
370
  if Pry.color
507
- contents = syntax_highlight_by_file_type_or_specified.call(contents, file_name, file_type)
371
+ contents = syntax_highlight_by_file_type_or_specified(contents, file_name, file_type)
508
372
  end
509
373
 
510
- if options[:l]
511
- contents = add_line_numbers.call(contents, start_line + 1)
512
- end
513
-
514
- set_file_and_dir_locals.call(file_name)
515
- output.puts contents
374
+ set_file_and_dir_locals(file_name)
375
+ render_output(options[:f], options[:l] ? normalized_start_line + 1 : false, contents)
516
376
  contents
517
377
  end
518
378
 
@@ -556,7 +416,7 @@ e.g: eval-file -c self "hello.rb"
556
416
  TOPLEVEL_BINDING.eval(File.read(File.expand_path(file_name)))
557
417
  output.puts "--\nEval'd '#{file_name}' at top-level."
558
418
  end
559
- set_file_and_dir_locals.call(file_name)
419
+ set_file_and_dir_locals(file_name)
560
420
 
561
421
  new_constants = Object.constants - old_constants
562
422
  output.puts "Brought in the following top-level constants: #{new_constants.inspect}" if !new_constants.empty?
@@ -589,61 +449,6 @@ e.g: eval-file -c self "hello.rb"
589
449
  Pry.start target.eval("#{obj}")
590
450
  end
591
451
 
592
- strip_color_codes = lambda do |str|
593
- str.gsub(/\e\[.*?(\d)+m/, '')
594
- end
595
-
596
- process_rdoc = lambda do |comment, code_type|
597
- comment = comment.dup
598
- comment.gsub(/<code>(?:\s*\n)?(.*?)\s*<\/code>/m) { Pry.color ? CodeRay.scan($1, code_type).term : $1 }.
599
- gsub(/<em>(?:\s*\n)?(.*?)\s*<\/em>/m) { Pry.color ? "\e[32m#{$1}\e[0m": $1 }.
600
- gsub(/<i>(?:\s*\n)?(.*?)\s*<\/i>/m) { Pry.color ? "\e[34m#{$1}\e[0m" : $1 }.
601
- gsub(/\B\+(\w*?)\+\B/) { Pry.color ? "\e[32m#{$1}\e[0m": $1 }.
602
- gsub(/((?:^[ \t]+.+(?:\n+|\Z))+)/) { Pry.color ? CodeRay.scan($1, code_type).term : $1 }.
603
- gsub(/`(?:\s*\n)?(.*?)\s*`/) { Pry.color ? CodeRay.scan($1, code_type).term : $1 }
604
- end
605
-
606
- process_yardoc_tag = lambda do |comment, tag|
607
- in_tag_block = nil
608
- output = comment.lines.map do |v|
609
- if in_tag_block && v !~ /^\S/
610
- strip_color_codes.call(strip_color_codes.call(v))
611
- elsif in_tag_block
612
- in_tag_block = false
613
- v
614
- else
615
- in_tag_block = true if v =~ /^@#{tag}/
616
- v
617
- end
618
- end.join
619
- end
620
-
621
- # FIXME - invert it -- should only ALLOW color if @example
622
- process_yardoc = lambda do |comment|
623
- yard_tags = ["param", "return", "option", "yield", "attr", "attr_reader", "attr_writer",
624
- "deprecate", "example"]
625
- (yard_tags - ["example"]).inject(comment) { |a, v| process_yardoc_tag.call(a, v) }.
626
- gsub(/^@(#{yard_tags.join("|")})/) { Pry.color ? "\e[33m#{$1}\e[0m": $1 }
627
- end
628
-
629
- process_comment_markup = lambda do |comment, code_type|
630
- process_yardoc.call process_rdoc.call(comment, code_type)
631
- end
632
-
633
- # strip leading whitespace but preserve indentation
634
- strip_leading_whitespace = lambda do |text|
635
- return text if text.empty?
636
- leading_spaces = text.lines.first[/^(\s+)/, 1]
637
- text.gsub(/^#{leading_spaces}/, '')
638
- end
639
-
640
- strip_leading_hash_and_whitespace_from_ruby_comments = lambda do |comment|
641
- comment = comment.dup
642
- comment.gsub!(/\A\#+?$/, '')
643
- comment.gsub!(/^\s*#/, '')
644
- strip_leading_whitespace.call(comment)
645
- end
646
-
647
452
  command "show-doc", "Show the comments above METH. Type `show-doc --help` for more info. Aliases: \?" do |*args|
648
453
  options = {}
649
454
  target = target()
@@ -667,6 +472,10 @@ e.g show-doc hello_method
667
472
  target = Pry.binding_for(target.eval(context))
668
473
  end
669
474
 
475
+ opts.on("-f", "--flood", "Do not use a pager to view text longer than one screen.") do
476
+ options[:f] = true
477
+ end
478
+
670
479
  opts.on_tail("-h", "--help", "This message.") do
671
480
  output.puts opts
672
481
  options[:h] = true
@@ -677,37 +486,34 @@ e.g show-doc hello_method
677
486
 
678
487
  next if options[:h]
679
488
 
680
- if (meth = get_method_object.call(meth_name, target, options)).nil?
489
+ if (meth = get_method_object(meth_name, target, options)).nil?
681
490
  output.puts "Invalid method name: #{meth_name}. Type `show-doc --help` for help"
682
491
  next
683
492
  end
684
493
 
685
- case code_type = code_type_for.call(meth)
494
+ case code_type = code_type_for(meth)
686
495
  when nil
687
496
  next
688
497
  when :c
689
498
  doc = Pry::MethodInfo.info_for(meth).docstring
690
499
  when :ruby
691
500
  doc = meth.comment
692
- doc = strip_leading_hash_and_whitespace_from_ruby_comments.call(doc)
693
- set_file_and_dir_locals.call(meth.source_location.first)
501
+ doc = strip_leading_hash_and_whitespace_from_ruby_comments(doc)
502
+ set_file_and_dir_locals(meth.source_location.first)
694
503
  end
695
504
 
696
505
  next output.puts("No documentation found.") if doc.empty?
697
506
 
698
- doc = process_comment_markup.call(doc, code_type)
507
+ doc = process_comment_markup(doc, code_type)
699
508
 
700
- output.puts make_header.call(meth, code_type)
701
- output.puts doc
509
+ output.puts make_header(meth, code_type, doc)
510
+
511
+ render_output(options[:f], false, doc)
702
512
  doc
703
513
  end
704
514
 
705
515
  alias_command "?", "show-doc", ""
706
516
 
707
- strip_comments_from_c_code = lambda do |code|
708
- code.sub /\A\s*\/\*.*?\*\/\s*/m, ''
709
- end
710
-
711
517
  command "show-method", "Show the source for METH. Type `show-method --help` for more info. Aliases: show-source" do |*args|
712
518
  options = {}
713
519
  target = target()
@@ -731,6 +537,10 @@ e.g: show-method hello_method
731
537
  options[:m] = true
732
538
  end
733
539
 
540
+ opts.on("-f", "--flood", "Do not use a pager to view text longer than one screen.") do
541
+ options[:f] = true
542
+ end
543
+
734
544
  opts.on("-c", "--context CONTEXT", "Select object context to run under.") do |context|
735
545
  target = Pry.binding_for(target.eval(context))
736
546
  end
@@ -745,41 +555,69 @@ e.g: show-method hello_method
745
555
 
746
556
  next if options[:h]
747
557
 
748
- meth_name = meth_name_from_binding.call(target) if !meth_name
558
+ meth_name = meth_name_from_binding(target) if !meth_name
749
559
 
750
- if (meth = get_method_object.call(meth_name, target, options)).nil?
560
+ if (meth = get_method_object(meth_name, target, options)).nil?
751
561
  output.puts "Invalid method name: #{meth_name}. Type `show-method --help` for help"
752
562
  next
753
563
  end
754
564
 
755
- case code_type = code_type_for.call(meth)
565
+ case code_type = code_type_for(meth)
756
566
  when nil
757
567
  next
758
568
  when :c
759
569
  code = Pry::MethodInfo.info_for(meth).source
760
- code = strip_comments_from_c_code.call(code)
570
+ code = strip_comments_from_c_code(code)
761
571
  when :ruby
762
- code = strip_leading_whitespace.call(meth.source)
763
- set_file_and_dir_locals.call(meth.source_location.first)
572
+ code = strip_leading_whitespace(meth.source)
573
+ set_file_and_dir_locals(meth.source_location.first)
764
574
  end
765
575
 
766
- output.puts make_header.call(meth, code_type)
576
+ output.puts make_header(meth, code_type, code)
767
577
  if Pry.color
768
578
  code = CodeRay.scan(code, code_type).term
769
579
  end
770
580
 
581
+ start_line = false
771
582
  if options[:l]
772
583
  start_line = meth.source_location ? meth.source_location.last : 1
773
- code = add_line_numbers.call(code, start_line)
774
584
  end
775
585
 
776
- output.puts code
586
+ render_output(options[:f], start_line, code)
777
587
  code
778
588
  end
779
589
 
780
590
  alias_command "show-source", "show-method", ""
781
-
782
- command "show-command", "Show sourcecode for a Pry command, e.g: show-command cd" do |command_name|
591
+
592
+ command "show-command", "Show the source for CMD. Type `show-command --help` for more info." do |*args|
593
+ options = {}
594
+ target = target()
595
+ command_name = nil
596
+
597
+ OptionParser.new do |opts|
598
+ opts.banner = %{Usage: show-command [OPTIONS] [CMD]
599
+ Show the source for command CMD.
600
+ e.g: show-command show-method
601
+ --
602
+ }
603
+ opts.on("-l", "--line-numbers", "Show line numbers.") do |line|
604
+ options[:l] = true
605
+ end
606
+
607
+ opts.on("-f", "--flood", "Do not use a pager to view text longer than one screen.") do
608
+ options[:f] = true
609
+ end
610
+
611
+ opts.on_tail("-h", "--help", "This message.") do
612
+ output.puts opts
613
+ options[:h] = true
614
+ end
615
+ end.order(args) do |v|
616
+ command_name = v
617
+ end
618
+
619
+ next if options[:h]
620
+
783
621
  if !command_name
784
622
  output.puts "You must provide a command name."
785
623
  next
@@ -788,18 +626,18 @@ e.g: show-method hello_method
788
626
  if commands[command_name]
789
627
  meth = commands[command_name][:action]
790
628
 
791
- code = strip_leading_whitespace.call(meth.source)
629
+ code = strip_leading_whitespace(meth.source)
792
630
  file, line = meth.source_location
793
- set_file_and_dir_locals.call(file)
794
- check_for_dynamically_defined_method.call(meth)
631
+ set_file_and_dir_locals(file)
632
+ check_for_dynamically_defined_method(meth)
795
633
 
796
- output.puts "--\nFrom #{file} @ line #{line}:\n--"
634
+ output.puts make_header(meth, :ruby, code)
797
635
 
798
636
  if Pry.color
799
637
  code = CodeRay.scan(code, :ruby).term
800
638
  end
801
639
 
802
- output.puts code
640
+ render_output(options[:f], options[:l] ? meth.source_location.last : false, code)
803
641
  code
804
642
  else
805
643
  output.puts "No such command: #{command_name}."
@@ -822,7 +660,7 @@ e.g: show-method hello_method
822
660
  end
823
661
 
824
662
  command "exit", "End the current Pry session. Accepts optional return value. Aliases: quit, back" do
825
- str = remove_first_word.call(opts[:val])
663
+ str = remove_first_word(opts[:val])
826
664
  throw(:breakout, [opts[:nesting].level, target.eval(str)])
827
665
  end
828
666
 
@@ -862,7 +700,7 @@ Is absorbed, not refracted, by grey stone.
862
700
  The dahlias sleep in the empty silence.
863
701
  Wait for the early owl.
864
702
  -- T.S Eliot
865
- }
703
+ }
866
704
  output.puts text
867
705
  text
868
706
  end
@@ -12,7 +12,7 @@ class Pry
12
12
 
13
13
  # /unknown/ for rbx
14
14
  if file !~ /(\(.*\))|<.*>/ && file !~ /__unknown__/ && file != ""
15
- Pry.run_command "whereami", :output => out, :show_output => true, :context => target, :commands => Pry::Commands
15
+ Pry.run_command "whereami 5", :output => out, :show_output => true, :context => target, :commands => Pry::Commands
16
16
  end
17
17
  end,
18
18
 
@@ -179,7 +179,13 @@ class Pry
179
179
 
180
180
  null_output = Object.new.tap { |v| v.instance_eval { def puts(*) end } }
181
181
 
182
- commands = options[:commands].clone
182
+ # FIXME! ugly hack to get around broken methods in both YARD and RBX
183
+ if RUBY_VERSION =~ /1.9/
184
+ commands = options[:commands].dup
185
+ else
186
+ commands = options[:commands].clone
187
+ end
188
+
183
189
  commands.output = options[:show_output] ? options[:output] : null_output
184
190
  commands.target = Pry.binding_for(options[:context])
185
191
 
@@ -143,7 +143,7 @@ class Pry
143
143
  target = Pry.binding_for(target)
144
144
  result = re(target)
145
145
 
146
- print.call output, result if !@suppress_output
146
+ print.call output, result if should_print?(result)
147
147
  end
148
148
 
149
149
  # Perform a read-eval
@@ -202,7 +202,7 @@ class Pry
202
202
  @suppress_output = true if eval_string =~ /;\Z/
203
203
 
204
204
  eval_string
205
- end
205
+ end
206
206
 
207
207
  # Returns true if input is "" and a command is not returning a
208
208
  # value.
@@ -284,6 +284,15 @@ class Pry
284
284
  end
285
285
  end
286
286
 
287
+ # Whether the print proc should be invoked.
288
+ # Currently only invoked if the output is not suppressed OR the output
289
+ # is an exception regardless of suppression.
290
+ # @param [Object] result The result of evaluation stage of the REPL
291
+ # @return [Boolean] Whether the print proc should be invoked.
292
+ def should_print?(result)
293
+ !@suppress_output || result.is_a?(Exception)
294
+ end
295
+
287
296
  # Returns the appropriate prompt to use.
288
297
  # This method should not need to be invoked directly.
289
298
  # @param [Boolean] first_line Whether this is the first line of input
@@ -1,3 +1,3 @@
1
1
  class Pry
2
- VERSION = "0.8.0pre5"
2
+ VERSION = "0.8.0pre7"
3
3
  end
metadata CHANGED
@@ -1,12 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: pry
3
3
  version: !ruby/object:Gem::Version
4
+ hash: -766259880
4
5
  prerelease: true
5
6
  segments:
6
7
  - 0
7
8
  - 8
8
- - 0pre5
9
- version: 0.8.0pre5
9
+ - 0pre7
10
+ version: 0.8.0pre7
10
11
  platform: java
11
12
  authors:
12
13
  - John Mair (banisterfiend)
@@ -14,7 +15,7 @@ autorequire:
14
15
  bindir: bin
15
16
  cert_chain: []
16
17
 
17
- date: 2011-04-08 00:00:00 +12:00
18
+ date: 2011-04-12 00:00:00 +12:00
18
19
  default_executable:
19
20
  dependencies:
20
21
  - !ruby/object:Gem::Dependency
@@ -25,6 +26,7 @@ dependencies:
25
26
  requirements:
26
27
  - - ">="
27
28
  - !ruby/object:Gem::Version
29
+ hash: 5
28
30
  segments:
29
31
  - 2
30
32
  - 0
@@ -40,6 +42,7 @@ dependencies:
40
42
  requirements:
41
43
  - - ">="
42
44
  - !ruby/object:Gem::Version
45
+ hash: 53
43
46
  segments:
44
47
  - 0
45
48
  - 9
@@ -55,6 +58,7 @@ dependencies:
55
58
  requirements:
56
59
  - - ">="
57
60
  - !ruby/object:Gem::Version
61
+ hash: 19
58
62
  segments:
59
63
  - 1
60
64
  - 1
@@ -70,6 +74,7 @@ dependencies:
70
74
  requirements:
71
75
  - - "="
72
76
  - !ruby/object:Gem::Version
77
+ hash: 23
73
78
  segments:
74
79
  - 0
75
80
  - 2
@@ -94,6 +99,7 @@ files:
94
99
  - lib/pry/hooks.rb
95
100
  - lib/pry/custom_completions.rb
96
101
  - lib/pry/core_extensions.rb
102
+ - lib/pry/command_helpers.rb
97
103
  - lib/pry/command_processor.rb
98
104
  - lib/pry/completion.rb
99
105
  - lib/pry/print.rb
@@ -133,6 +139,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
133
139
  requirements:
134
140
  - - ">="
135
141
  - !ruby/object:Gem::Version
142
+ hash: 3
136
143
  segments:
137
144
  - 0
138
145
  version: "0"
@@ -141,6 +148,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
141
148
  requirements:
142
149
  - - ">"
143
150
  - !ruby/object:Gem::Version
151
+ hash: 25
144
152
  segments:
145
153
  - 1
146
154
  - 3