pry 0.8.4pre1-java → 0.9.0pre1-java

Sign up to get free protection for your applications and to get access to all the features.
Files changed (55) hide show
  1. data/.gitignore +1 -0
  2. data/README.markdown +1 -1
  3. data/Rakefile +11 -5
  4. data/TODO +28 -2
  5. data/bin/pry +5 -9
  6. data/examples/example_basic.rb +2 -4
  7. data/examples/example_command_override.rb +2 -5
  8. data/examples/example_commands.rb +1 -4
  9. data/examples/example_hooks.rb +2 -5
  10. data/examples/example_image_edit.rb +4 -8
  11. data/examples/example_input.rb +1 -4
  12. data/examples/example_input2.rb +1 -4
  13. data/examples/example_output.rb +1 -4
  14. data/examples/example_print.rb +2 -5
  15. data/examples/example_prompt.rb +2 -5
  16. data/examples/helper.rb +6 -0
  17. data/lib/pry.rb +61 -4
  18. data/lib/pry/command_context.rb +10 -9
  19. data/lib/pry/command_processor.rb +29 -68
  20. data/lib/pry/command_set.rb +79 -28
  21. data/lib/pry/commands.rb +10 -121
  22. data/lib/pry/completion.rb +30 -29
  23. data/lib/pry/config.rb +93 -0
  24. data/lib/pry/default_commands/basic.rb +37 -0
  25. data/lib/pry/default_commands/context.rb +15 -15
  26. data/lib/pry/default_commands/documentation.rb +49 -48
  27. data/lib/pry/default_commands/easter_eggs.rb +1 -20
  28. data/lib/pry/default_commands/gems.rb +32 -41
  29. data/lib/pry/default_commands/input.rb +95 -19
  30. data/lib/pry/default_commands/introspection.rb +54 -60
  31. data/lib/pry/default_commands/ls.rb +2 -2
  32. data/lib/pry/default_commands/shell.rb +29 -39
  33. data/lib/pry/extended_commands/experimental.rb +48 -0
  34. data/lib/pry/extended_commands/user_command_api.rb +22 -0
  35. data/lib/pry/helpers.rb +1 -0
  36. data/lib/pry/helpers/base_helpers.rb +9 -106
  37. data/lib/pry/helpers/command_helpers.rb +96 -59
  38. data/lib/pry/helpers/text.rb +83 -0
  39. data/lib/pry/plugins.rb +79 -0
  40. data/lib/pry/pry_class.rb +96 -111
  41. data/lib/pry/pry_instance.rb +87 -55
  42. data/lib/pry/version.rb +1 -1
  43. data/test/helper.rb +56 -7
  44. data/test/test_command_processor.rb +99 -0
  45. data/test/{test_commandset.rb → test_command_set.rb} +18 -12
  46. data/test/test_default_commands.rb +59 -0
  47. data/test/test_default_commands/test_context.rb +64 -0
  48. data/test/test_default_commands/test_documentation.rb +31 -0
  49. data/test/test_default_commands/test_input.rb +157 -0
  50. data/test/test_default_commands/test_introspection.rb +146 -0
  51. data/test/test_pry.rb +430 -313
  52. metadata +25 -9
  53. data/lib/pry/hooks.rb +0 -17
  54. data/lib/pry/print.rb +0 -16
  55. data/lib/pry/prompts.rb +0 -31
@@ -1,26 +1,25 @@
1
1
  class Pry
2
2
  module DefaultCommands
3
3
 
4
- Introspection = Pry::CommandSet.new :introspection do
4
+ Introspection = Pry::CommandSet.new do
5
5
 
6
6
  command "show-method", "Show the source for METH. Type `show-method --help` for more info. Aliases: $, show-source" do |*args|
7
7
  target = target()
8
8
 
9
- opts = Slop.parse!(args) do |opts|
10
- opts.banner %{Usage: show-method [OPTIONS] [METH]
11
- Show the source for method METH. Tries instance methods first and then methods by default.
12
- e.g: show-method hello_method
13
- --
14
- }
15
- opts.on :l, "line-numbers", "Show line numbers."
16
- opts.on :M, "instance-methods", "Operate on instance methods."
17
- opts.on :m, :methods, "Operate on methods."
18
- opts.on :f, :flood, "Do not use a pager to view text longer than one screen."
19
- opts.on :c, :context, "Select object context to run under.", true do |context|
9
+ opts = Slop.parse!(args) do |opt|
10
+ opt.banner "Usage: show-method [OPTIONS] [METH]\n" \
11
+ "Show the source for method METH. Tries instance methods first and then methods by default.\n" \
12
+ "e.g: show-method hello_method"
13
+
14
+ opt.on :l, "line-numbers", "Show line numbers."
15
+ opt.on :M, "instance-methods", "Operate on instance methods."
16
+ opt.on :m, :methods, "Operate on methods."
17
+ opt.on :f, :flood, "Do not use a pager to view text longer than one screen."
18
+ opt.on :c, :context, "Select object context to run under.", true do |context|
20
19
  target = Pry.binding_for(target.eval(context))
21
20
  end
22
- opts.on :h, :help, "This message." do
23
- output.puts opts
21
+ opt.on :h, :help, "This message." do
22
+ output.puts opt
24
23
  end
25
24
  end
26
25
 
@@ -53,54 +52,46 @@ e.g: show-method hello_method
53
52
  alias_command "$", "show-method", ""
54
53
 
55
54
  command "show-command", "Show the source for CMD. Type `show-command --help` for more info." do |*args|
56
- options = {}
57
55
  target = target()
58
- command_name = nil
59
-
60
- OptionParser.new do |opts|
61
- opts.banner = %{Usage: show-command [OPTIONS] [CMD]
62
- Show the source for command CMD.
63
- e.g: show-command show-method
64
- --
65
- }
66
- opts.on("-l", "--line-numbers", "Show line numbers.") do |line|
67
- options[:l] = true
68
- end
69
56
 
70
- opts.on("-f", "--flood", "Do not use a pager to view text longer than one screen.") do
71
- options[:f] = true
72
- end
57
+ opts = Slop.parse!(args) do |opt|
58
+ opt.banner = "Usage: show-command [OPTIONS] [CMD]\n" \
59
+ "Show the source for command CMD.\n" \
60
+ "e.g: show-command show-method"
73
61
 
74
- opts.on_tail("-h", "--help", "This message.") do
75
- output.puts opts
76
- options[:h] = true
62
+ opt.on :l, "line-numbers", "Show line numbers."
63
+ opt.on :f, :flood, "Do not use a pager to view text longer than one screen."
64
+ opt.on :h, :help, "This message." do
65
+ output.puts opt
77
66
  end
78
- end.order(args) do |v|
79
- command_name = v
80
67
  end
81
68
 
82
- next if options[:h]
69
+ next if opts.help?
83
70
 
71
+ command_name = args.shift
84
72
  if !command_name
85
73
  output.puts "You must provide a command name."
86
74
  next
87
75
  end
88
76
 
89
- if commands[command_name]
90
- meth = commands[command_name].block
77
+ if find_command(command_name)
78
+ block = find_command(command_name).block
91
79
 
92
- code = strip_leading_whitespace(meth.source)
93
- file, line = meth.source_location
94
- set_file_and_dir_locals(file)
95
- check_for_dynamically_defined_method(meth)
80
+ code, _ = code_and_code_type_for(block)
81
+ next if !code
96
82
 
97
- output.puts make_header(meth, :ruby, code)
83
+ output.puts make_header(block, :ruby, code)
98
84
 
99
85
  if Pry.color
100
86
  code = CodeRay.scan(code, :ruby).term
101
87
  end
102
88
 
103
- render_output(options[:f], options[:l] ? meth.source_location.last : false, code)
89
+ start_line = false
90
+ if opts.l?
91
+ start_line = block.source_location ? block.source_location.last : 1
92
+ end
93
+
94
+ render_output(opts.flood?, opts.l? ? block.source_location.last : false, code)
104
95
  code
105
96
  else
106
97
  output.puts "No such command: #{command_name}."
@@ -110,22 +101,21 @@ e.g: show-command show-method
110
101
  command "edit-method", "Edit a method. Type `edit-method --help` for more info." do |*args|
111
102
  target = target()
112
103
 
113
- opts = Slop.parse!(args) do |opts|
114
- opts.banner %{Usage: edit-method [OPTIONS] [METH]
115
- Edit the method METH in an editor.
116
- Ensure #{bold("Pry.editor")} is set to your editor of choice.
117
- e.g: edit-method hello_method
118
- --
119
- }
120
- opts.on :M, "instance-methods", "Operate on instance methods."
121
- opts.on :m, :methods, "Operate on methods."
122
- opts.on "no-reload", "Do not automatically reload the method's file after editting."
123
- opts.on :n, "no-jump", "Do not fast forward editor to first line of method."
124
- opts.on :c, :context, "Select object context to run under.", true do |context|
104
+ opts = Slop.parse!(args) do |opt|
105
+ opt.banner "Usage: edit-method [OPTIONS] [METH]\n" \
106
+ "Edit the method METH in an editor.\n" \
107
+ "Ensure #{text.bold("Pry.editor")} is set to your editor of choice.\n" \
108
+ "e.g: edit-method hello_method"
109
+
110
+ opt.on :M, "instance-methods", "Operate on instance methods."
111
+ opt.on :m, :methods, "Operate on methods."
112
+ opt.on "no-reload", "Do not automatically reload the method's file after editting."
113
+ opt.on :n, "no-jump", "Do not fast forward editor to first line of method."
114
+ opt.on :c, :context, "Select object context to run under.", true do |context|
125
115
  target = Pry.binding_for(target.eval(context))
126
116
  end
127
- opts.on :h, :help, "This message." do
128
- output.puts opts
117
+ opt.on :h, :help, "This message." do
118
+ output.puts opt
129
119
  end
130
120
  end
131
121
 
@@ -137,7 +127,7 @@ e.g: edit-method hello_method
137
127
  next
138
128
  end
139
129
 
140
- next output.puts "Error: No editor set!\nEnsure that #{bold("Pry.editor")} is set to your editor of choice." if !Pry.editor
130
+ next output.puts "Error: No editor set!\nEnsure that #{text.bold("Pry.editor")} is set to your editor of choice." if !Pry.editor
141
131
 
142
132
  if is_a_c_method?(meth)
143
133
  output.puts "Error: Can't edit a C method."
@@ -146,7 +136,12 @@ e.g: edit-method hello_method
146
136
 
147
137
  # editor is invoked here
148
138
  else
149
- file, line = meth.source_location
139
+ if rbx_core?(meth)
140
+ file, line = rbx_core_path_line_for(meth)
141
+ else
142
+ file, line = meth.source_location
143
+ end
144
+
150
145
  set_file_and_dir_locals(file)
151
146
 
152
147
  if Pry.editor.respond_to?(:call)
@@ -164,7 +159,6 @@ e.g: edit-method hello_method
164
159
  end
165
160
  end
166
161
 
167
-
168
162
  helpers do
169
163
 
170
164
  def start_line_for_editor(line_number)
@@ -1,7 +1,7 @@
1
1
  class Pry
2
2
  module DefaultCommands
3
3
 
4
- Ls = Pry::CommandSet.new :ls do
4
+ Ls = Pry::CommandSet.new do
5
5
 
6
6
  command "ls", "Show the list of vars and methods in the current scope. Type `ls --help` for more info." do |*args|
7
7
  options = {}
@@ -194,6 +194,6 @@ Shows local and instance variables by default.
194
194
  end
195
195
 
196
196
 
197
- end
198
197
  end
199
198
  end
199
+ 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,48 @@
1
+ class Pry
2
+ module ExtendedCommands
3
+
4
+ Experimental = Pry::CommandSet.new do
5
+
6
+
7
+ command "reload-method", "Reload the source specifically for a method", :requires_gem => "method_reload" do |meth_name|
8
+ if (meth = get_method_object(meth_name, target, {})).nil?
9
+ output.puts "Invalid method name: #{meth_name}."
10
+ next
11
+ end
12
+
13
+ meth.reload
14
+ end
15
+
16
+ command "play", "Play a string as input" do |*args|
17
+ Slop.parse!(args) do |opt|
18
+ opt.banner "Usage: play-method [--replay START..END] [--clear] [--grep PATTERN] [--help]\n"
19
+
20
+ opt.on :l, :lines, 'The line (or range of lines) to replay.', true, :as => Range
21
+ opt.on :m, :method, 'Play a method.', true do |meth_name|
22
+ if (meth = get_method_object(meth_name, target, {})).nil?
23
+ output.puts "Invalid method name: #{meth_name}."
24
+ next
25
+ end
26
+ code, code_type = code_and_code_type_for(meth)
27
+ next if !code
28
+
29
+ range = opt.l? ? opt[:l] : (0..-1)
30
+
31
+ Pry.active_instance.input = StringIO.new(code[range])
32
+ end
33
+
34
+ opt.on :f, "file", 'The line (or range of lines) to replay.', true do |file_name|
35
+ text = File.read File.expand_path(file_name)
36
+ range = opt.l? ? opt[:l] : (0..-1)
37
+
38
+ Pry.active_instance.input = StringIO.new(text[range])
39
+ end
40
+
41
+ opt.on :h, :help, "This message." do
42
+ output.puts opt
43
+ end
44
+ end
45
+ end
46
+ end
47
+ end
48
+ end
@@ -0,0 +1,22 @@
1
+ class Pry
2
+ module ExtendedCommands
3
+
4
+ UserCommandAPI = Pry::CommandSet.new do
5
+
6
+ command "define-command", "To honor Mon-Ouie" 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,103 +63,6 @@ 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
-
158
- end
159
-
160
- result
161
- end
162
-
163
66
  def highlight(string, regexp, highlight_color=:bright_yellow)
164
67
  highlighted = string.gsub(regexp) { |match| "<#{highlight_color}>#{match}</#{highlight_color}>" }
165
68
  end