pry 0.8.4pre1-i386-mswin32 → 0.9.0-i386-mswin32

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (60) hide show
  1. data/.gitignore +1 -0
  2. data/CHANGELOG +25 -6
  3. data/README.markdown +11 -4
  4. data/Rakefile +15 -19
  5. data/TODO +28 -2
  6. data/bin/pry +28 -11
  7. data/examples/example_basic.rb +2 -4
  8. data/examples/example_command_override.rb +2 -5
  9. data/examples/example_commands.rb +1 -4
  10. data/examples/example_hooks.rb +2 -5
  11. data/examples/example_image_edit.rb +4 -8
  12. data/examples/example_input.rb +1 -4
  13. data/examples/example_input2.rb +1 -4
  14. data/examples/example_output.rb +1 -4
  15. data/examples/example_print.rb +2 -5
  16. data/examples/example_prompt.rb +2 -5
  17. data/examples/helper.rb +6 -0
  18. data/lib/pry.rb +59 -3
  19. data/lib/pry/command_context.rb +10 -9
  20. data/lib/pry/command_processor.rb +51 -73
  21. data/lib/pry/command_set.rb +79 -28
  22. data/lib/pry/commands.rb +9 -123
  23. data/lib/pry/completion.rb +30 -29
  24. data/lib/pry/config.rb +100 -0
  25. data/lib/pry/default_commands/basic.rb +37 -0
  26. data/lib/pry/default_commands/context.rb +16 -15
  27. data/lib/pry/default_commands/documentation.rb +73 -54
  28. data/lib/pry/default_commands/easter_eggs.rb +1 -20
  29. data/lib/pry/default_commands/gems.rb +31 -40
  30. data/lib/pry/default_commands/input.rb +223 -15
  31. data/lib/pry/default_commands/introspection.rb +108 -73
  32. data/lib/pry/default_commands/ls.rb +25 -11
  33. data/lib/pry/default_commands/shell.rb +29 -39
  34. data/lib/pry/extended_commands/experimental.rb +17 -0
  35. data/lib/pry/extended_commands/user_command_api.rb +22 -0
  36. data/lib/pry/helpers.rb +1 -0
  37. data/lib/pry/helpers/base_helpers.rb +15 -104
  38. data/lib/pry/helpers/command_helpers.rb +96 -59
  39. data/lib/pry/helpers/text.rb +83 -0
  40. data/lib/pry/history_array.rb +105 -0
  41. data/lib/pry/plugins.rb +79 -0
  42. data/lib/pry/pry_class.rb +102 -114
  43. data/lib/pry/pry_instance.rb +123 -55
  44. data/lib/pry/version.rb +1 -1
  45. data/pry.gemspec +45 -0
  46. data/test/helper.rb +57 -7
  47. data/test/test_command_processor.rb +205 -0
  48. data/test/{test_commandset.rb → test_command_set.rb} +18 -12
  49. data/test/test_default_commands.rb +59 -0
  50. data/test/test_default_commands/test_context.rb +64 -0
  51. data/test/test_default_commands/test_documentation.rb +31 -0
  52. data/test/test_default_commands/test_gems.rb +14 -0
  53. data/test/test_default_commands/test_input.rb +327 -0
  54. data/test/test_default_commands/test_introspection.rb +155 -0
  55. data/test/test_history_array.rb +65 -0
  56. data/test/test_pry.rb +548 -313
  57. metadata +48 -15
  58. data/lib/pry/hooks.rb +0 -17
  59. data/lib/pry/print.rb +0 -16
  60. data/lib/pry/prompts.rb +0 -31
@@ -1,7 +1,17 @@
1
1
  class Pry
2
2
  module DefaultCommands
3
3
 
4
- Ls = Pry::CommandSet.new :ls do
4
+ Ls = Pry::CommandSet.new do
5
+
6
+ helpers do
7
+ def trim_methods(options, visibility)
8
+ if options[:e]
9
+ []
10
+ else
11
+ Object.send("#{visibility}_methods")
12
+ end
13
+ end
14
+ end
5
15
 
6
16
  command "ls", "Show the list of vars and methods in the current scope. Type `ls --help` for more info." do |*args|
7
17
  options = {}
@@ -59,10 +69,14 @@ Shows local and instance variables by default.
59
69
  options[:j] = true
60
70
  end
61
71
 
62
- opts.on("-s", "--super", "Include superclass entries (relevant to constant and methods options).") do
72
+ opts.on("-s", "--super", "Include superclass entries excluding Object (relevant to constant and methods options).") do
63
73
  options[:s] = true
64
74
  end
65
75
 
76
+ opts.on("-e", "--everything", "Include superclass entries including Object (relevant to constant and methods options).") do
77
+ options[:e] = true
78
+ end
79
+
66
80
  opts.on("-a", "--all", "Display all types of entries.") do
67
81
  options[:a] = true
68
82
  end
@@ -126,19 +140,19 @@ Shows local and instance variables by default.
126
140
 
127
141
  info["global variables"] = [Array(target.eval("global_variables")).sort, i += 1] if options[:g] || options[:a]
128
142
 
129
- info["public methods"] = [Array(target.eval("public_methods(#{options[:s]})")).uniq.sort, i += 1] if (options[:m] && options[:P]) || options[:a]
143
+ info["public methods"] = [Array(target.eval("public_methods(#{options[:s]})")).uniq.sort - trim_methods(options, :public), i += 1] if (options[:m] && options[:P]) || options[:a]
130
144
 
131
- info["protected methods"] = [Array(target.eval("protected_methods(#{options[:s]})")).sort, i += 1] if (options[:m] && options[:r]) || options[:a]
145
+ info["protected methods"] = [Array(target.eval("protected_methods(#{options[:s]})")).sort - trim_methods(options, :protected), i += 1] if (options[:m] && options[:r]) || options[:a]
132
146
 
133
- info["private methods"] = [Array(target.eval("private_methods(#{options[:s]})")).sort, i += 1] if (options[:m] && options[:p]) || options[:a]
147
+ info["private methods"] = [Array(target.eval("private_methods(#{options[:s]})")).sort - trim_methods(options, :private), i += 1] if (options[:m] && options[:p]) || options[:a]
134
148
 
135
149
  info["just singleton methods"] = [Array(target.eval("methods(#{options[:s]})")).sort, i += 1] if (options[:m] && options[:j]) || options[:a]
136
150
 
137
- info["public instance methods"] = [Array(target.eval("public_instance_methods(#{options[:s]})")).uniq.sort, i += 1] if target_self.is_a?(Module) && ((options[:M] && options[:P]) || options[:a])
151
+ info["public instance methods"] = [Array(target.eval("public_instance_methods(#{options[:s]})")).uniq.sort - trim_methods(options, :public), i += 1] if target_self.is_a?(Module) && ((options[:M] && options[:P]) || options[:a])
138
152
 
139
- info["protected instance methods"] = [Array(target.eval("protected_instance_methods(#{options[:s]})")).uniq.sort, i += 1] if target_self.is_a?(Module) && ((options[:M] && options[:r]) || options[:a])
153
+ info["protected instance methods"] = [Array(target.eval("protected_instance_methods(#{options[:s]})")).uniq.sort - trim_methods(options, :protected), i += 1] if target_self.is_a?(Module) && ((options[:M] && options[:r]) || options[:a])
140
154
 
141
- info["private instance methods"] = [Array(target.eval("private_instance_methods(#{options[:s]})")).uniq.sort, i += 1] if target_self.is_a?(Module) && ((options[:M] && options[:p]) || options[:a])
155
+ info["private instance methods"] = [Array(target.eval("private_instance_methods(#{options[:s]})")).uniq.sort - trim_methods(options, :private), i += 1] if target_self.is_a?(Module) && ((options[:M] && options[:p]) || options[:a])
142
156
 
143
157
  # dealing with 1.8/1.9 compatibility issues :/
144
158
  csuper = options[:s]
@@ -180,9 +194,9 @@ Shows local and instance variables by default.
180
194
  list = list.grep(options[:grep]) if list
181
195
  list.uniq! if list
182
196
  if Pry.color
183
- text << CodeRay.scan(Pry.view(list), :ruby).term + "\n"
197
+ text << CodeRay.scan(list.inspect, :ruby).term + "\n"
184
198
  else
185
- text << Pry.view(list) + "\n"
199
+ text << list.inspect + "\n"
186
200
  end
187
201
  if !options[:f]
188
202
  stagger_output(text)
@@ -194,6 +208,6 @@ Shows local and instance variables by default.
194
208
  end
195
209
 
196
210
 
197
- end
198
211
  end
199
212
  end
213
+ end
@@ -1,10 +1,22 @@
1
1
  class Pry
2
2
  module DefaultCommands
3
3
 
4
- Shell = Pry::CommandSet.new :shell do
4
+ Shell = Pry::CommandSet.new do
5
+
6
+ command(/\.(.*)/, "All text following a '.' is forwarded to the shell.", :listing => ".<shell command>") do |cmd|
7
+ if cmd =~ /^cd\s+(.+)/i
8
+ dest = $1
9
+ begin
10
+ Dir.chdir File.expand_path(dest)
11
+ rescue Errno::ENOENT
12
+ output.puts "No such directory: #{dest}"
13
+ end
5
14
 
6
- # this cannot be accessed, it's just for help purposes.
7
- command ".<shell command>", "All text following a '.' is forwarded to the shell." do
15
+ else
16
+ if !system(cmd)
17
+ output.puts "Error: there was a problem executing system command: #{cmd}"
18
+ end
19
+ end
8
20
  end
9
21
 
10
22
  command "shell-mode", "Toggle shell mode. Bring in pwd prompt and file completion." do
@@ -22,50 +34,30 @@ class Pry
22
34
 
23
35
  alias_command "file-mode", "shell-mode", ""
24
36
 
25
-
26
37
  command "cat", "Show output of file FILE. Type `cat --help` for more information." do |*args|
27
- options= {}
28
- file_name = nil
29
38
  start_line = 0
30
39
  end_line = -1
31
- file_type = nil
32
-
33
- OptionParser.new do |opts|
34
- opts.banner = %{Usage: cat [OPTIONS] FILE
35
- Cat a file. Defaults to displaying whole file. Syntax highlights file if type is recognized.
36
- e.g: cat hello.rb
37
- --
38
- }
39
- opts.on("-l", "--line-numbers", "Show line numbers.") do |line|
40
- options[:l] = true
41
- end
42
40
 
43
- opts.on("-s", "--start LINE", "Start line (defaults to start of file). Line 1 is the first line.") do |line|
44
- start_line = line.to_i - 1
41
+ opts = Slop.parse!(args) do |opt|
42
+ opt.on :s, :start, "Start line (defaults to start of file)Line 1 is the first line.", true, :as => Integer do |line|
43
+ start_line = line - 1
45
44
  end
46
45
 
47
- opts.on("-e", "--end LINE", "End line (defaults to end of file). Line -1 is the last line.") do |line|
48
- end_line = line.to_i - 1
46
+ opt.on :e, :end, "End line (defaults to end of file). Line -1 is the last line", true, :as => Integer do |line|
47
+ end_line = line - 1
49
48
  end
50
49
 
51
- opts.on("-t", "--type TYPE", "The specific file type for syntax higlighting (e.g ruby, python, cpp, java)") do |type|
52
- file_type = type.to_sym
50
+ opt.on :l, "line-numbers", "Show line numbers."
51
+ opt.on :t, :type, "The specific file type for syntax higlighting (e.g ruby, python)", true, :as => Symbol
52
+ opt.on :f, :flood, "Do not use a pager to view text longer than one screen."
53
+ opt.on :h, :help, "This message." do
54
+ output.puts opt
53
55
  end
54
-
55
- opts.on("-f", "--flood", "Do not use a pager to view text longer than one screen.") do
56
- options[:f] = true
57
- end
58
-
59
- opts.on_tail("-h", "--help", "This message.") do
60
- output.puts opts
61
- options[:h] = true
62
- end
63
- end.order(args) do |v|
64
- file_name = v
65
56
  end
66
57
 
67
- next if options[:h]
58
+ next if opts.help?
68
59
 
60
+ file_name = args.shift
69
61
  if !file_name
70
62
  output.puts "Must provide a file name."
71
63
  next
@@ -74,15 +66,13 @@ e.g: cat hello.rb
74
66
  contents, normalized_start_line, _ = read_between_the_lines(file_name, start_line, end_line)
75
67
 
76
68
  if Pry.color
77
- contents = syntax_highlight_by_file_type_or_specified(contents, file_name, file_type)
69
+ contents = syntax_highlight_by_file_type_or_specified(contents, file_name, opts[:type])
78
70
  end
79
71
 
80
72
  set_file_and_dir_locals(file_name)
81
- render_output(options[:f], options[:l] ? normalized_start_line + 1 : false, contents)
73
+ render_output(opts.flood?, opts.l? ? normalized_start_line + 1 : false, contents)
82
74
  contents
83
75
  end
84
-
85
-
86
76
  end
87
77
 
88
78
  end
@@ -0,0 +1,17 @@
1
+ class Pry
2
+ module ExtendedCommands
3
+
4
+ Experimental = Pry::CommandSet.new do
5
+
6
+ command "reload-method", "Reload the source specifically for a method", :requires_gem => "method_reload" do |meth_name|
7
+ if (meth = get_method_object(meth_name, target, {})).nil?
8
+ output.puts "Invalid method name: #{meth_name}."
9
+ next
10
+ end
11
+
12
+ meth.reload
13
+ end
14
+
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,22 @@
1
+ class Pry
2
+ module ExtendedCommands
3
+
4
+ UserCommandAPI = Pry::CommandSet.new do
5
+
6
+ command "define-command", "Define a command in the session, use same syntax as `command` method for command API" do |arg|
7
+ next output.puts("Provide an arg!") if arg.nil?
8
+
9
+ prime_string = "command #{arg_string}\n"
10
+ command_string = Pry.active_instance.r(target, prime_string)
11
+
12
+ eval_string.replace <<-HERE
13
+ _pry_.commands.instance_eval do
14
+ #{command_string}
15
+ end
16
+ HERE
17
+
18
+ end
19
+
20
+ end
21
+ end
22
+ end
@@ -1,2 +1,3 @@
1
1
  require "pry/helpers/base_helpers"
2
2
  require "pry/helpers/command_helpers"
3
+ require "pry/helpers/text"
@@ -14,18 +14,16 @@ class Pry
14
14
  end
15
15
  end
16
16
 
17
- # turn off color for duration of block
18
- def no_color(&block)
19
- old_color_state = Pry.color
20
- Pry.color = false
21
- yield
22
- ensure
23
- Pry.color = old_color_state
17
+ def find_command(name)
18
+ command_match = commands.find { |_, command| command.options[:listing] == name }
19
+
20
+ return command_match.last if command_match
21
+ nil
24
22
  end
25
23
 
26
24
  def gem_installed?(gem_name)
27
25
  require 'rubygems'
28
- !!Gem.source_index.find_name(gem_name).first
26
+ Gem::Specification.respond_to?(:find_all_by_name) ? !Gem::Specification.find_all_by_name(gem_name).empty? : Gem.source_index.find_name(gem_name).first
29
27
  end
30
28
 
31
29
  def command_dependencies_met?(options)
@@ -47,8 +45,10 @@ class Pry
47
45
  gems_needed = Array(options[:requires_gem])
48
46
  gems_not_installed = gems_needed.select { |g| !gem_installed?(g) }
49
47
  proc do
50
- output.puts "\n#{name} requires the following gems to be installed: #{(gems_needed.join(", "))}"
48
+ output.puts "\nThe command '#{name}' requires the following gems to be installed: #{(gems_needed.join(", "))}"
49
+ output.puts "-"
51
50
  output.puts "Command not available due to dependency on gems: `#{gems_not_installed.join(", ")}` not being met."
51
+ output.puts "-"
52
52
  output.puts "Type `install #{name}` to install the required gems and activate this command."
53
53
  end
54
54
  end
@@ -63,101 +63,12 @@ class Pry
63
63
  end
64
64
  end
65
65
 
66
- #
67
- # Color helpers:
68
- # gray, red, green, yellow, blue, purple, cyan, white,
69
- # and bright_red, bright_green, etc...
70
- #
71
- # ANSI color codes:
72
- # \033 => escape
73
- # 30 => color base
74
- # 1 => bright
75
- # 0 => normal
76
- #
77
-
78
- COLORS = {
79
- "black" => 0,
80
- "red" => 1,
81
- "green" => 2,
82
- "yellow" => 3,
83
- "blue" => 4,
84
- "purple" => 5,
85
- "magenta" => 5,
86
- "cyan" => 6,
87
- "white" => 7
88
- }
89
-
90
- COLORS.each do |color, i|
91
- define_method color do |str|
92
- Pry.color ? "\033[0;#{30+i}m#{str}\033[0m" : str
93
- end
94
-
95
- define_method "bright_#{color}" do |str|
96
- Pry.color ? "\033[1;#{30+i}m#{str}\033[0m" : str
97
- end
98
- end
99
-
100
- alias_method :grey, :bright_black
101
- alias_method :gray, :bright_black
102
-
103
- require 'set'
104
- VALID_COLORS = Set.new(
105
- COLORS.keys +
106
- COLORS.keys.map{|k| "bright_#{k}" } +
107
- ["grey", "gray"]
108
- )
109
-
110
- def bold(text)
111
- Pry.color ? "\e[1m#{text}\e[0m" : text
112
- end
113
-
114
- #
115
- # Colorize a string that has "color tags".
116
- #
117
- # Examples:
118
- # puts colorize("<light_green><magenta>*</magenta> Hey mom! I am <light_blue>SO</light_blue> colored right now.</light_green>")
119
- #
120
- def colorize(string)
121
- stack = []
122
-
123
- # split the string into tags and literal strings
124
- tokens = string.split(/(<\/?[\w\d_]+>)/)
125
- tokens.delete_if { |token| token.size == 0 }
126
-
127
- result = ""
128
-
129
- tokens.each do |token|
130
-
131
- # token is an opening tag!
132
-
133
- if /<([\w\d_]+)>/ =~ token and VALID_COLORS.include?($1) #valid_tag?($1)
134
- stack.push $1
135
-
136
- # token is a closing tag!
137
-
138
- elsif /<\/([\w\d_]+)>/ =~ token and VALID_COLORS.include?($1) # valid_tag?($1)
139
-
140
- # if this color is on the stack somwehere...
141
- if pos = stack.rindex($1)
142
- # close the tag by removing it from the stack
143
- stack.delete_at pos
144
- else
145
- raise "Error: tried to close an unopened color tag -- #{token}"
146
- end
147
-
148
- # token is a literal string!
149
-
150
- else
151
-
152
- color = (stack.last || "white")
153
- #color = BBS_COLOR_TABLE[color.to_i] if color =~ /^\d+$/
154
- result << send(color, token) # colorize the result
155
-
156
- end
157
-
66
+ def colorize_code(code)
67
+ if Pry.color
68
+ CodeRay.scan(code, :ruby).term
69
+ else
70
+ code
158
71
  end
159
-
160
- result
161
72
  end
162
73
 
163
74
  def highlight(string, regexp, highlight_color=:bright_yellow)
@@ -190,7 +101,7 @@ class Pry
190
101
  # Try to use `less` for paging, if it fails then use
191
102
  # simple_pager. Also do not page if Pry.pager is falsey
192
103
  # FIXME! Another JRuby hack
193
- def stagger_output(text)
104
+ def stagger_output(text, output=output())
194
105
  if text.lines.count < page_size || !Pry.pager
195
106
  output.puts text
196
107
  return
@@ -5,15 +5,6 @@ class Pry
5
5
 
6
6
  module_function
7
7
 
8
- def try_to_load_pry_doc
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
16
-
17
8
  def meth_name_from_binding(b)
18
9
  meth_name = b.eval('__method__')
19
10
  if [:__script__, nil, :__binding__, :__binding_impl__].include?(meth_name)
@@ -23,29 +14,16 @@ class Pry
23
14
  end
24
15
  end
25
16
 
26
- def add_line_numbers(lines, start_line)
27
- line_array = lines.each_line.to_a
28
- line_array.each_with_index.map do |line, idx|
29
- adjusted_index = idx + start_line
30
- if Pry.color
31
- cindex = CodeRay.scan("#{adjusted_index}", :ruby).term
32
- "#{cindex}: #{line}"
33
- else
34
- "#{idx}: #{line}"
35
- end
36
- end.join
37
- end
38
-
39
17
  # if start_line is not false then add line numbers starting with start_line
40
- def render_output(should_flood, start_line, doc)
18
+ def render_output(should_flood, start_line, text)
41
19
  if start_line
42
- doc = add_line_numbers(doc, start_line)
20
+ text = Pry::Helpers::Text.with_line_numbers text, start_line
43
21
  end
44
22
 
45
23
  if should_flood
46
- output.puts doc
24
+ output.puts text
47
25
  else
48
- stagger_output(doc)
26
+ stagger_output(text)
49
27
  end
50
28
  end
51
29
 
@@ -55,31 +33,74 @@ class Pry
55
33
  end
56
34
 
57
35
  def check_for_dynamically_defined_method(meth)
58
- if is_a_dynamically_defined_method?(meth)
36
+ file, _ = meth.source_location
37
+ if file =~ /(\(.*\))|<.*>/ && file != Pry.eval_path
59
38
  raise "Cannot retrieve source for dynamically defined method."
60
39
  end
61
40
  end
62
41
 
63
- def check_for_dynamically_defined_method(meth)
64
- file, _ = meth.source_location
65
- if file =~ /(\(.*\))|<.*>/
66
- raise "Cannot retrieve source for dynamically defined method."
42
+ ########### RBX HELPERS #############
43
+ def rbx_core?(meth)
44
+ defined?(RUBY_ENGINE) &&
45
+ RUBY_ENGINE =~ /rbx/ &&
46
+ meth.source_location &&
47
+ meth.source_location.first.start_with?("kernel")
48
+ end
49
+
50
+ def rvm_ruby?(path)
51
+ !!(path =~ /\.rvm/)
52
+ end
53
+
54
+ def rbx_core_code_for(meth)
55
+ rbx_core_code_or_doc_for(meth, :code)
56
+ end
57
+
58
+ def rbx_core_doc_for(meth)
59
+ rbx_core_code_or_doc_for(meth, :doc)
60
+ end
61
+
62
+ def rbx_core_code_or_doc_for(meth, code_or_doc)
63
+ path_line = rbx_core_path_line_for(meth)
64
+
65
+ case code_or_doc
66
+ when :code
67
+ MethodSource.source_helper(path_line)
68
+ when :doc
69
+ MethodSource.comment_helper(path_line)
67
70
  end
68
71
  end
69
72
 
70
- def remove_first_word(text)
71
- text.split.drop(1).join(' ')
73
+ def rbx_core_path_line_for(meth)
74
+ if rvm_ruby?(Rubinius::BIN_PATH)
75
+ rvm_rbx_core_path_line_for(meth)
76
+ else
77
+ std_rbx_core_path_line_for(meth)
78
+ end
72
79
  end
73
80
 
74
- # turn off color for duration of block
75
- def no_color(&block)
76
- old_color_state = Pry.color
77
- Pry.color = false
78
- yield
79
- ensure
80
- Pry.color = old_color_state
81
+ def std_rbx_core_path_line_for(meth)
82
+ file_name = File.join(Rubinius::BIN_PATH, "..", meth.source_location.first)
83
+ raise "Cannot find rbx core source" if !File.exists?(file_name)
84
+
85
+ start_line = meth.source_location.last
86
+
87
+ [file_name, start_line]
81
88
  end
82
89
 
90
+ def rvm_rbx_core_path_line_for(meth)
91
+ ruby_name = File.dirname(Rubinius::BIN_PATH).split("/").last
92
+ source_path = File.join(File.dirname(File.dirname(File.dirname(Rubinius::BIN_PATH))), "src", ruby_name)
93
+
94
+ file_name = File.join(source_path, meth.source_location.first)
95
+ raise "Cannot find rbx core source" if !File.exists?(file_name)
96
+
97
+ start_line = meth.source_location.last
98
+
99
+ [file_name, start_line]
100
+ end
101
+
102
+ ######### END RBX HELPERS ###############
103
+
83
104
  def code_and_code_type_for(meth)
84
105
  case code_type = code_type_for(meth)
85
106
  when nil
@@ -88,8 +109,18 @@ class Pry
88
109
  code = Pry::MethodInfo.info_for(meth).source
89
110
  code = strip_comments_from_c_code(code)
90
111
  when :ruby
91
- code = strip_leading_whitespace(meth.source)
92
- set_file_and_dir_locals(meth.source_location.first)
112
+ if meth.source_location.first == Pry.eval_path
113
+ start_line = meth.source_location.last
114
+ p = Pry.new(:input => StringIO.new(Pry.line_buffer[start_line..-1].join)).r(target)
115
+ code = strip_leading_whitespace(p)
116
+ else
117
+ if rbx_core?(meth)
118
+ code = strip_leading_whitespace(rbx_core_code_for(meth))
119
+ else
120
+ code = strip_leading_whitespace(meth.source)
121
+ end
122
+ end
123
+ set_file_and_dir_locals(path_line_for(meth).first)
93
124
  end
94
125
 
95
126
  [code, code_type]
@@ -102,9 +133,12 @@ class Pry
102
133
  when :c
103
134
  doc = Pry::MethodInfo.info_for(meth).docstring
104
135
  when :ruby
105
- doc = meth.comment
106
- doc = strip_leading_hash_and_whitespace_from_ruby_comments(doc)
107
- set_file_and_dir_locals(meth.source_location.first)
136
+ if rbx_core?(meth)
137
+ doc = strip_leading_hash_and_whitespace_from_ruby_comments(rbx_core_doc_for(meth))
138
+ else
139
+ doc = strip_leading_hash_and_whitespace_from_ruby_comments(meth.comment)
140
+ end
141
+ set_file_and_dir_locals(path_line_for(meth).first)
108
142
  end
109
143
 
110
144
  [doc, code_type]
@@ -144,15 +178,23 @@ class Pry
144
178
  end
145
179
  end
146
180
 
181
+ def path_line_for(meth)
182
+ if rbx_core?(meth)
183
+ rbx_core_path_line_for(meth)
184
+ else
185
+ meth.source_location
186
+ end
187
+ end
188
+
147
189
  def make_header(meth, code_type, content)
148
- num_lines = "Number of lines: #{bold(content.each_line.count.to_s)}"
190
+ num_lines = "Number of lines: #{Pry::Helpers::Text.bold(content.each_line.count.to_s)}"
149
191
  case code_type
150
192
  when :ruby
151
- file, line = meth.source_location
152
- "\n#{bold('From:')} #{file} @ line #{line}:\n#{num_lines}\n\n"
193
+ file, line = path_line_for(meth)
194
+ "\n#{Pry::Helpers::Text.bold('From:')} #{file} @ line #{line}:\n#{num_lines}\n\n"
153
195
  else
154
196
  file = Pry::MethodInfo.info_for(meth).file
155
- "\n#{bold('From:')} #{file} in Ruby Core (C Method):\n#{num_lines}\n\n"
197
+ "\n#{Pry::Helpers::Text.bold('From:')} #{file} in Ruby Core (C Method):\n#{num_lines}\n\n"
156
198
  end
157
199
  end
158
200
 
@@ -161,7 +203,7 @@ class Pry
161
203
  end
162
204
 
163
205
  def should_use_pry_doc?(meth)
164
- Pry.has_pry_doc && is_a_c_method?(meth)
206
+ Pry.config.has_pry_doc && is_a_c_method?(meth)
165
207
  end
166
208
 
167
209
  def code_type_for(meth)
@@ -232,16 +274,11 @@ class Pry
232
274
  normalized_line_number(end_line, lines_array.size)]
233
275
  end
234
276
 
235
- # documentation related helpers
236
- def strip_color_codes(str)
237
- str.gsub(/\e\[.*?(\d)+m/, '')
238
- end
239
-
240
277
  def process_rdoc(comment, code_type)
241
278
  comment = comment.dup
242
279
  comment.gsub(/<code>(?:\s*\n)?(.*?)\s*<\/code>/m) { Pry.color ? CodeRay.scan($1, code_type).term : $1 }.
243
- gsub(/<em>(?:\s*\n)?(.*?)\s*<\/em>/m) { Pry.color ? "\e[32m#{$1}\e[0m": $1 }.
244
- gsub(/<i>(?:\s*\n)?(.*?)\s*<\/i>/m) { Pry.color ? "\e[34m#{$1}\e[0m" : $1 }.
280
+ gsub(/<em>(?:\s*\n)?(.*?)\s*<\/em>/m) { Pry.color ? "\e[1m#{$1}\e[0m": $1 }.
281
+ gsub(/<i>(?:\s*\n)?(.*?)\s*<\/i>/m) { Pry.color ? "\e[1m#{$1}\e[0m" : $1 }.
245
282
  gsub(/\B\+(\w*?)\+\B/) { Pry.color ? "\e[32m#{$1}\e[0m": $1 }.
246
283
  gsub(/((?:^[ \t]+.+(?:\n+|\Z))+)/) { Pry.color ? CodeRay.scan($1, code_type).term : $1 }.
247
284
  gsub(/`(?:\s*\n)?(.*?)\s*`/) { Pry.color ? CodeRay.scan($1, code_type).term : $1 }
@@ -251,7 +288,7 @@ class Pry
251
288
  in_tag_block = nil
252
289
  output = comment.lines.map do |v|
253
290
  if in_tag_block && v !~ /^\S/
254
- strip_color_codes(strip_color_codes(v))
291
+ Pry::Helpers::Text.strip_color Pry::Helpers::Text.strip_color(v)
255
292
  elsif in_tag_block
256
293
  in_tag_block = false
257
294
  v
@@ -288,7 +325,7 @@ class Pry
288
325
  end
289
326
 
290
327
  def strip_comments_from_c_code(code)
291
- code.sub /\A\s*\/\*.*?\*\/\s*/m, ''
328
+ code.sub(/\A\s*\/\*.*?\*\/\s*/m, '')
292
329
  end
293
330
 
294
331
  def prompt(message, options="Yn")