pry 0.8.3-java → 0.8.4pre1-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.
@@ -0,0 +1,2 @@
1
+ require "pry/helpers/base_helpers"
2
+ require "pry/helpers/command_helpers"
@@ -1,10 +1,29 @@
1
1
  class Pry
2
- class CommandBase
3
- module CommandBaseHelpers
2
+ module Helpers
3
+
4
+ module BaseHelpers
5
+ module_function
6
+
7
+ def silence_warnings
8
+ old_verbose = $VERBOSE
9
+ $VERBOSE = nil
10
+ begin
11
+ yield
12
+ ensure
13
+ $VERBOSE = old_verbose
14
+ end
15
+ end
4
16
 
5
- private
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
24
+ end
6
25
 
7
- def gem_installed?(gem_name)
26
+ def gem_installed?(gem_name)
8
27
  require 'rubygems'
9
28
  !!Gem.source_index.find_name(gem_name).first
10
29
  end
@@ -16,6 +35,14 @@ class Pry
16
35
  end
17
36
  end
18
37
 
38
+ def set_file_and_dir_locals(file_name)
39
+ return if !target
40
+ $_file_temp = File.expand_path(file_name)
41
+ $_dir_temp = File.dirname($_file_temp)
42
+ target.eval("_file_ = $_file_temp")
43
+ target.eval("_dir_ = $_dir_temp")
44
+ end
45
+
19
46
  def stub_proc(name, options)
20
47
  gems_needed = Array(options[:requires_gem])
21
48
  gems_not_installed = gems_needed.select { |g| !gem_installed?(g) }
@@ -49,15 +76,15 @@ class Pry
49
76
  #
50
77
 
51
78
  COLORS = {
52
- "black" => 0,
53
- "red" => 1,
54
- "green" => 2,
55
- "yellow" => 3,
56
- "blue" => 4,
57
- "purple" => 5,
58
- "magenta" => 5,
59
- "cyan" => 6,
60
- "white" => 7
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
61
88
  }
62
89
 
63
90
  COLORS.each do |color, i|
@@ -75,10 +102,10 @@ class Pry
75
102
 
76
103
  require 'set'
77
104
  VALID_COLORS = Set.new(
78
- COLORS.keys +
79
- COLORS.keys.map{|k| "bright_#{k}" } +
80
- ["grey", "gray"]
81
- )
105
+ COLORS.keys +
106
+ COLORS.keys.map{|k| "bright_#{k}" } +
107
+ ["grey", "gray"]
108
+ )
82
109
 
83
110
  def bold(text)
84
111
  Pry.color ? "\e[1m#{text}\e[0m" : text
@@ -106,7 +133,7 @@ class Pry
106
133
  if /<([\w\d_]+)>/ =~ token and VALID_COLORS.include?($1) #valid_tag?($1)
107
134
  stack.push $1
108
135
 
109
- # token is a closing tag!
136
+ # token is a closing tag!
110
137
 
111
138
  elsif /<\/([\w\d_]+)>/ =~ token and VALID_COLORS.include?($1) # valid_tag?($1)
112
139
 
@@ -118,7 +145,7 @@ class Pry
118
145
  raise "Error: tried to close an unopened color tag -- #{token}"
119
146
  end
120
147
 
121
- # token is a literal string!
148
+ # token is a literal string!
122
149
 
123
150
  else
124
151
 
@@ -237,5 +264,3 @@ class Pry
237
264
  end
238
265
  end
239
266
  end
240
-
241
-
@@ -1,8 +1,9 @@
1
1
  class Pry
2
- class Commands < CommandBase
2
+ module Helpers
3
+
3
4
  module CommandHelpers
4
5
 
5
- private
6
+ module_function
6
7
 
7
8
  def try_to_load_pry_doc
8
9
 
@@ -22,14 +23,6 @@ class Pry
22
23
  end
23
24
  end
24
25
 
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_ = $_dir_temp")
31
- end
32
-
33
26
  def add_line_numbers(lines, start_line)
34
27
  line_array = lines.each_line.to_a
35
28
  line_array.each_with_index.map do |line, idx|
@@ -56,21 +49,6 @@ class Pry
56
49
  end
57
50
  end
58
51
 
59
- def editor_with_start_line(line_number)
60
- case Pry.editor
61
- when /^[gm]?vi/, /^emacs/, /^nano/, /^pico/, /^gedit/, /^kate/
62
- "#{Pry.editor} +#{line_number}"
63
- when /^mate/
64
- "#{Pry.editor} -l#{line_number}"
65
- else
66
- if RUBY_PLATFORM =~ /mswin|mingw/
67
- Pry.editor
68
- else
69
- "#{Pry.editor} +#{line_number}"
70
- end
71
- end
72
- end
73
-
74
52
  def is_a_dynamically_defined_method?(meth)
75
53
  file, _ = meth.source_location
76
54
  !!(file =~ /(\(.*\))|<.*>/)
@@ -82,6 +60,13 @@ class Pry
82
60
  end
83
61
  end
84
62
 
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."
67
+ end
68
+ end
69
+
85
70
  def remove_first_word(text)
86
71
  text.split.drop(1).join(' ')
87
72
  end
@@ -91,8 +76,8 @@ class Pry
91
76
  old_color_state = Pry.color
92
77
  Pry.color = false
93
78
  yield
94
- ensure
95
- Pry.color = old_color_state
79
+ ensure
80
+ Pry.color = old_color_state
96
81
  end
97
82
 
98
83
  def code_and_code_type_for(meth)
@@ -126,23 +111,35 @@ class Pry
126
111
  end
127
112
 
128
113
  def get_method_object(meth_name, target, options)
114
+ if meth_name
115
+ if meth_name =~ /(\S+)\#(\S+)\Z/
116
+ context, meth_name = $1, $2
117
+ target = Pry.binding_for(target.eval(context))
118
+ options["instance-methods"] = true
119
+ options[:methods] = false
120
+ elsif meth_name =~ /(\S+)\.(\S+)\Z/
121
+ context, meth_name = $1, $2
122
+ target = Pry.binding_for(target.eval(context))
123
+ options["instance-methods"] = false
124
+ options[:methods] = true
125
+ end
126
+ else
127
+ meth_name = meth_name_from_binding(target)
128
+ end
129
+
129
130
  if !meth_name
130
131
  return nil
131
132
  end
132
133
 
133
- if options[:M]
134
- target.eval("instance_method(:#{meth_name})")
135
- elsif options[:m]
136
- target.eval("method(:#{meth_name})")
134
+ if options["instance-methods"]
135
+ target.eval("instance_method(:#{meth_name})") rescue nil
136
+ elsif options[:methods]
137
+ target.eval("method(:#{meth_name})") rescue nil
137
138
  else
138
139
  begin
139
140
  target.eval("instance_method(:#{meth_name})")
140
141
  rescue
141
- begin
142
- target.eval("method(:#{meth_name})")
143
- rescue
144
- return nil
145
- end
142
+ target.eval("method(:#{meth_name})") rescue nil
146
143
  end
147
144
  end
148
145
  end
@@ -318,5 +315,6 @@ class Pry
318
315
  end
319
316
 
320
317
  end
318
+
321
319
  end
322
320
  end
@@ -101,7 +101,16 @@ class Pry
101
101
 
102
102
  # The default editor to use. Defaults to $EDITOR or nano if
103
103
  # $EDITOR is not defined.
104
- # @return [String]
104
+ # If `editor` is a String then that string is used as the shell
105
+ # command to invoke the editor. If `editor` is callable (e.g a
106
+ # Proc) then `file` and `line` are passed in as parameters and the
107
+ # return value of that callable invocation is used as the exact
108
+ # shell command to invoke the editor.
109
+ # @example String
110
+ # Pry.editor = "emacsclient"
111
+ # @example Callable
112
+ # Pry.editor = proc { |file, line| "emacsclient #{file} +#{line}" }
113
+ # @return [String, #call]
105
114
  attr_accessor :editor
106
115
  end
107
116
 
@@ -190,20 +199,17 @@ class Pry
190
199
  :commands => Pry.commands
191
200
  }.merge!(options)
192
201
 
193
- null_output = Object.new.tap { |v| v.instance_eval { def puts(*) end } }
202
+ null_output = StringIO.new
194
203
 
204
+ context = CommandContext.new
195
205
  commands = options[:commands]
196
206
 
197
- commands.output = options[:show_output] ? options[:output] : null_output
198
- commands.target = Pry.binding_for(options[:context])
207
+ context.opts = {}
208
+ context.output = options[:show_output] ? options[:output] : null_output
209
+ context.target = Pry.binding_for(options[:context])
210
+ context.command_set = commands
199
211
 
200
- cmd = commands.commands[name]
201
- if cmd
202
- action = cmd[:action]
203
- commands.instance_exec(*Shellwords.shellwords(arg_string), &action)
204
- else
205
- raise "No such Pry command: #{name}"
206
- end
212
+ commands.run_command(context, name, *Shellwords.shellwords(arg_string))
207
213
  end
208
214
 
209
215
  def self.default_editor_for_platform
@@ -30,7 +30,7 @@ class Pry
30
30
  default_options.merge!(options)
31
31
 
32
32
  CONFIG_OPTIONS.each do |key|
33
- instance_variable_set("@#{key}", default_options[key])
33
+ send "#{key}=", default_options[key]
34
34
  end
35
35
 
36
36
  @command_processor = CommandProcessor.new(self)
@@ -54,7 +54,7 @@ class Pry
54
54
  # @return [Pry] The parent of the current Pry session.
55
55
  def parent
56
56
  idx = Pry.sessions.index(self)
57
- Pry.sessions[idx - 1] if idx > 0
57
+ Pry.sessions[idx - 1] if idx && idx > 0
58
58
  end
59
59
 
60
60
  # Execute the hook `hook_name`, if it is defined.
@@ -320,6 +320,63 @@ class Pry
320
320
  end
321
321
  end
322
322
 
323
+ # the array that the prompt stack is stored in
324
+ def prompt_stack
325
+ @prompt_stack ||= Array.new
326
+ end
327
+ private :prompt_stack
328
+
329
+ # The current prompt, this is the prompt at the top of the prompt stack.
330
+ # @return [Array<Proc>] Current prompt.
331
+ # @example
332
+ # push_prompt(Pry::SIMPLE_PROMPT)
333
+ # prompt # => Pry::SIMPLE_PROMPT
334
+ def prompt
335
+ prompt_stack.last
336
+ end
337
+
338
+ # Replaces the current prompt with the new prompt.
339
+ # Does not change the rest of the prompt stack.
340
+ # @param [Array<Proc>] new_prompt
341
+ # @return [Array<Proc>] new_prompt
342
+ # @example
343
+ # pry.prompt = Pry::SIMPLE_PROMPT # => Pry::SIMPLE_PROMPT
344
+ # pry.prompt # => Pry::SIMPLE_PROMPT
345
+ def prompt=(new_prompt)
346
+ if prompt_stack.empty?
347
+ push_prompt new_prompt
348
+ else
349
+ prompt_stack[-1] = new_prompt
350
+ end
351
+ end
352
+
353
+ # Pushes the current prompt onto a stack that it can be restored from later.
354
+ # Use this if you wish to temporarily change the prompt.
355
+ # @param [Array<Proc>] new_prompt
356
+ # @return [Array<Proc>] new_prompt
357
+ # @example
358
+ # new_prompt = [ proc { '>' }, proc { '>>' } ]
359
+ # push_prompt(new_prompt) # => new_prompt
360
+ def push_prompt(new_prompt)
361
+ prompt_stack.push new_prompt
362
+ end
363
+
364
+ # Pops the current prompt off of the prompt stack.
365
+ # If the prompt you are popping is the last prompt, it will not be popped.
366
+ # Use this to restore the previous prompt.
367
+ # @return [Array<Proc>] Prompt being popped.
368
+ # @example
369
+ # prompt1 = [ proc { '>' }, proc { '>>' } ]
370
+ # prompt2 = [ proc { '$' }, proc { '>' } ]
371
+ # pry = Pry.new :prompt => prompt1
372
+ # pry.push_prompt(prompt2)
373
+ # pry.pop_prompt # => prompt2
374
+ # pry.pop_prompt # => prompt1
375
+ # pry.pop_prompt # => prompt1
376
+ def pop_prompt
377
+ if prompt_stack.size > 1 then prompt_stack.pop else prompt end
378
+ end
379
+
323
380
  if RUBY_VERSION =~ /1.9/ && RUBY_ENGINE == "ruby"
324
381
  require 'ripper'
325
382
 
@@ -1,3 +1,3 @@
1
1
  class Pry
2
- VERSION = "0.8.3"
2
+ VERSION = "0.8.4pre1"
3
3
  end
@@ -1,3 +1,10 @@
1
+ unless Object.const_defined? 'Pry'
2
+ $:.unshift File.expand_path '../../lib', __FILE__
3
+ require 'pry'
4
+ end
5
+
6
+ require 'bacon'
7
+
1
8
  # Ensure we do not execute any rc files
2
9
  Pry::RC_FILES.clear
3
10
  Pry.color = false
@@ -40,8 +47,7 @@ class Pry
40
47
  end
41
48
 
42
49
 
43
- class CommandTester < Pry::CommandBase
44
-
50
+ CommandTester = Pry::CommandSet.new :test do
45
51
  command "command1", "command 1 test" do
46
52
  output.puts "command1"
47
53
  end
@@ -0,0 +1,77 @@
1
+ require 'helper'
2
+
3
+ describe Pry::Helpers::CommandHelpers do
4
+ before do
5
+ @helper = Pry::Helpers::CommandHelpers
6
+ end
7
+
8
+ describe "get_method_object" do
9
+ it 'should look up instance methods if no methods available and no options provided' do
10
+ klass = Class.new { def hello; end }
11
+ meth = @helper.get_method_object(:hello, Pry.binding_for(klass), {})
12
+ meth.should == klass.instance_method(:hello)
13
+ end
14
+
15
+ it 'should look up methods if no instance methods available and no options provided' do
16
+ klass = Class.new { def self.hello; end }
17
+ meth = @helper.get_method_object(:hello, Pry.binding_for(klass), {})
18
+ meth.should == klass.method(:hello)
19
+ end
20
+
21
+ it 'should look up instance methods first even if methods available and no options provided' do
22
+ klass = Class.new { def hello; end; def self.hello; end }
23
+ meth = @helper.get_method_object(:hello, Pry.binding_for(klass), {})
24
+ meth.should == klass.instance_method(:hello)
25
+ end
26
+
27
+ it 'should look up instance methods if "instance-methods" option provided' do
28
+ klass = Class.new { def hello; end; def self.hello; end }
29
+ meth = @helper.get_method_object(:hello, Pry.binding_for(klass), {"instance-methods" => true})
30
+ meth.should == klass.instance_method(:hello)
31
+ end
32
+
33
+ it 'should look up methods if :methods option provided' do
34
+ klass = Class.new { def hello; end; def self.hello; end }
35
+ meth = @helper.get_method_object(:hello, Pry.binding_for(klass), {:methods => true})
36
+ meth.should == klass.method(:hello)
37
+ end
38
+
39
+ it 'should look up instance methods using the Class#method syntax' do
40
+ klass = Class.new { def hello; end; def self.hello; end }
41
+ meth = @helper.get_method_object("klass#hello", Pry.binding_for(binding), {})
42
+ meth.should == klass.instance_method(:hello)
43
+ end
44
+
45
+ it 'should look up methods using the object.method syntax' do
46
+ klass = Class.new { def hello; end; def self.hello; end }
47
+ meth = @helper.get_method_object("klass.hello", Pry.binding_for(binding), {})
48
+ meth.should == klass.method(:hello)
49
+ end
50
+
51
+ it 'should NOT look up instance methods using the Class#method syntax if no instance methods defined' do
52
+ klass = Class.new { def self.hello; end }
53
+ meth = @helper.get_method_object("klass#hello", Pry.binding_for(binding), {})
54
+ meth.should == nil
55
+ end
56
+
57
+ it 'should NOT look up methods using the object.method syntax if no methods defined' do
58
+ klass = Class.new { def hello; end }
59
+ meth = @helper.get_method_object("klass.hello", Pry.binding_for(binding), {})
60
+ meth.should == nil
61
+ end
62
+
63
+ it 'should look up methods using klass.new.method syntax' do
64
+ klass = Class.new { def hello; :hello; end }
65
+ meth = @helper.get_method_object("klass.new.hello", Pry.binding_for(binding), {})
66
+ meth.name.to_sym.should == :hello
67
+ end
68
+
69
+ it 'should look up instance methods using klass.meth#method syntax' do
70
+ klass = Class.new { def self.meth; Class.new; end }
71
+ meth = @helper.get_method_object("klass.meth#initialize", Pry.binding_for(binding), {})
72
+ meth.name.to_sym.should == :initialize
73
+ end
74
+ end
75
+ end
76
+
77
+