pry 0.8.4pre1-java → 0.9.0pre1-java

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 (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