pry 0.9.7.4 → 0.9.8pre2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (49) hide show
  1. data/.gitignore +1 -3
  2. data/README.markdown +3 -1
  3. data/Rakefile +48 -31
  4. data/bin/pry +2 -80
  5. data/lib/pry.rb +17 -20
  6. data/lib/pry/cli.rb +152 -0
  7. data/lib/pry/command_processor.rb +13 -0
  8. data/lib/pry/command_set.rb +102 -9
  9. data/lib/pry/config.rb +28 -6
  10. data/lib/pry/default_commands/context.rb +9 -8
  11. data/lib/pry/default_commands/documentation.rb +55 -13
  12. data/lib/pry/default_commands/easter_eggs.rb +1 -1
  13. data/lib/pry/default_commands/input.rb +25 -25
  14. data/lib/pry/default_commands/introspection.rb +19 -18
  15. data/lib/pry/default_commands/ls.rb +23 -38
  16. data/lib/pry/default_commands/shell.rb +47 -15
  17. data/lib/pry/helpers/command_helpers.rb +28 -6
  18. data/lib/pry/helpers/options_helpers.rb +7 -4
  19. data/lib/pry/helpers/text.rb +23 -3
  20. data/lib/pry/history.rb +55 -17
  21. data/lib/pry/history_array.rb +2 -0
  22. data/lib/pry/hooks.rb +108 -0
  23. data/lib/pry/indent.rb +9 -5
  24. data/lib/pry/method.rb +99 -50
  25. data/lib/pry/plugins.rb +10 -2
  26. data/lib/pry/pry_class.rb +48 -20
  27. data/lib/pry/pry_instance.rb +106 -91
  28. data/lib/pry/version.rb +1 -1
  29. data/lib/pry/wrapped_module.rb +73 -0
  30. data/man/pry.1 +195 -0
  31. data/man/pry.1.html +204 -0
  32. data/man/pry.1.ronn +141 -0
  33. data/pry.gemspec +21 -24
  34. data/test/helper.rb +12 -3
  35. data/test/test_cli.rb +78 -0
  36. data/test/test_command_set.rb +193 -1
  37. data/test/test_default_commands/test_context.rb +19 -4
  38. data/test/test_default_commands/test_input.rb +2 -2
  39. data/test/test_default_commands/test_introspection.rb +63 -6
  40. data/test/test_default_commands/test_ls.rb +8 -35
  41. data/test/test_default_commands/test_shell.rb +36 -1
  42. data/test/test_hooks.rb +175 -0
  43. data/test/test_indent.rb +2 -0
  44. data/test/test_method.rb +10 -0
  45. data/test/test_pry.rb +35 -34
  46. data/test/test_pry_history.rb +24 -24
  47. data/test/test_syntax_checking.rb +47 -0
  48. data/test/test_wrapped_module.rb +71 -0
  49. metadata +40 -34
data/.gitignore CHANGED
@@ -9,8 +9,6 @@ coverage/
9
9
  .yardoc/
10
10
  /tags
11
11
  *.gem
12
-
13
- # Not sure if Pry devs use RVM or want the Gemfile.lock in the repo, thus I'm
14
- # ignoring them for now.
12
+ .rbx/
15
13
  .rvmrc
16
14
  Gemfile.lock
data/README.markdown CHANGED
@@ -9,7 +9,9 @@
9
9
 
10
10
  **Sponsors**
11
11
 
12
- [Atomic Object](http://www.atomicobject.com/)
12
+ [Atomic Object](http://www.atomicobject.com/)<br/>
13
+ [Bendyworks](http://bendyworks.com/)<br/>
14
+ [Intridea](http://intridea.com/)<br/>
13
15
 
14
16
  **Other Resources**
15
17
 
data/Rakefile CHANGED
@@ -1,32 +1,41 @@
1
1
  require 'rake/clean'
2
- require 'rake/gempackagetask'
2
+ require 'rubygems/package_task'
3
3
 
4
4
  $:.unshift 'lib'
5
5
  require 'pry/version'
6
6
 
7
- CLOBBER.include("**/*~", "**/*#*", "**/*.log")
8
- CLEAN.include("**/*#*", "**/*#*.*", "**/*_flymake*.*", "**/*_flymake",
9
- "**/*.rbc", "**/.#*.*")
7
+ CLOBBER.include('**/*~', '**/*#*', '**/*.log')
8
+ CLEAN.include('**/*#*', '**/*#*.*', '**/*_flymake*.*', '**/*_flymake', '**/*.rbc', '**/.#*.*')
10
9
 
11
10
  def apply_spec_defaults(s)
12
- s.name = "pry"
11
+ s.name = 'pry'
13
12
  s.summary = "An IRB alternative and runtime developer console"
14
13
  s.version = Pry::VERSION
15
14
  s.date = Time.now.strftime '%Y-%m-%d'
16
15
  s.author = "John Mair (banisterfiend)"
17
16
  s.email = 'jrmair@gmail.com'
18
17
  s.description = s.summary
19
- s.homepage = "http://pry.github.com"
20
- s.executables = ["pry"]
18
+ s.homepage = 'http://pry.github.com'
19
+ s.executables = ['pry']
21
20
  s.files = `git ls-files`.split("\n")
22
21
  s.test_files = `git ls-files -- test/*`.split("\n")
23
- s.add_dependency("ruby_parser",">= 2.3.1")
24
- s.add_dependency("coderay","~>0.9.8")
25
- s.add_dependency("slop","~>2.1.0")
26
- s.add_dependency("method_source","~>0.6.7")
27
- s.add_development_dependency("bacon","~>1.1.0")
28
- s.add_development_dependency("open4", "~>1.0.1")
29
- s.add_development_dependency("rake", "~>0.9")
22
+ s.add_dependency('coderay', '~> 0.9')
23
+ s.add_dependency('slop', ['>= 2.4.1', '< 3'])
24
+ s.add_dependency('method_source','~> 0.6')
25
+ s.add_development_dependency('bacon', '~> 1.1')
26
+ s.add_development_dependency('open4', '~> 1.3')
27
+ s.add_development_dependency('rake', '~> 0.9')
28
+ end
29
+
30
+ def check_dependencies
31
+ require 'bundler'
32
+
33
+ ENV["BUNDLE_GEMFILE"] = File.expand_path("../Gemfile", __FILE__)
34
+ Bundler.definition.missing_specs
35
+ rescue LoadError
36
+ # if Bundler isn't installed, we'll just assume your setup is ok.
37
+ rescue Bundler::GemNotFound
38
+ raise RuntimeError, "You're missing one or more required gems. Run `bundle install` first."
30
39
  end
31
40
 
32
41
  desc "Set up and run tests"
@@ -34,33 +43,35 @@ task :default => [:test]
34
43
 
35
44
  desc "Run tests"
36
45
  task :test do
46
+ check_dependencies unless ENV['SKIP_DEP_CHECK']
37
47
  sh "bacon -Itest -rubygems -a -q"
38
48
  end
39
49
 
40
- desc "profile pry's startup time"
41
- task :profile do
42
- require 'profile'
43
- require 'pry'
44
- Pry.start(TOPLEVEL_BINDING, :input => StringIO.new('exit'))
45
- end
46
-
47
- desc "run pry"
50
+ desc "Run pry"
48
51
  task :pry do
52
+ check_dependencies unless ENV['SKIP_DEP_CHECK']
49
53
  load 'bin/pry'
50
54
  end
51
55
 
52
- desc "show pry version"
56
+ desc "Show pry version"
53
57
  task :version do
54
58
  puts "Pry version: #{Pry::VERSION}"
55
59
  end
56
60
 
61
+ desc "Profile pry's startup time"
62
+ task :profile do
63
+ require 'profile'
64
+ require 'pry'
65
+ Pry.start(TOPLEVEL_BINDING, :input => StringIO.new('exit'))
66
+ end
67
+
57
68
  namespace :ruby do
58
69
  spec = Gem::Specification.new do |s|
59
70
  apply_spec_defaults(s)
60
71
  s.platform = Gem::Platform::RUBY
61
72
  end
62
73
 
63
- Rake::GemPackageTask.new(spec) do |pkg|
74
+ Gem::PackageTask.new(spec) do |pkg|
64
75
  pkg.need_zip = false
65
76
  pkg.need_tar = false
66
77
  end
@@ -76,11 +87,11 @@ end
76
87
  namespace :jruby do
77
88
  spec = Gem::Specification.new do |s|
78
89
  apply_spec_defaults(s)
79
- s.add_dependency("spoon", "~>0.0.1")
80
- s.platform = "java"
90
+ s.add_dependency('spoon', '~> 0.0')
91
+ s.platform = 'java'
81
92
  end
82
93
 
83
- Rake::GemPackageTask.new(spec) do |pkg|
94
+ Gem::PackageTask.new(spec) do |pkg|
84
95
  pkg.need_zip = false
85
96
  pkg.need_tar = false
86
97
  end
@@ -91,11 +102,11 @@ end
91
102
  namespace v do
92
103
  spec = Gem::Specification.new do |s|
93
104
  apply_spec_defaults(s)
94
- s.add_dependency("win32console", "~>1.3.0")
105
+ s.add_dependency('win32console', '~> 1.3')
95
106
  s.platform = "i386-#{v}"
96
107
  end
97
108
 
98
- Rake::GemPackageTask.new(spec) do |pkg|
109
+ Gem::PackageTask.new(spec) do |pkg|
99
110
  pkg.need_zip = false
100
111
  pkg.need_tar = false
101
112
  end
@@ -103,10 +114,16 @@ end
103
114
  end
104
115
 
105
116
  desc "build all platform gems at once"
106
- task :gems => [:clean, :rmgems, "ruby:gem", "mswin32:gem", "mingw32:gem", "jruby:gem"]
117
+ task :gems => [:clean, :rmgems, 'ruby:gem', 'mswin32:gem', 'mingw32:gem', 'jruby:gem']
107
118
 
108
119
  desc "remove all platform gems"
109
- task :rmgems => ["ruby:clobber_package"]
120
+ task :rmgems => ['ruby:clobber_package']
121
+
122
+ desc "reinstall gem"
123
+ task :reinstall => :gems do
124
+ sh "gem uninstall pry" rescue nil
125
+ sh "gem install #{File.dirname(__FILE__)}/pkg/pry-#{Pry::VERSION}.gem"
126
+ end
110
127
 
111
128
  desc "build and push latest gems"
112
129
  task :pushgems => :gems do
data/bin/pry CHANGED
@@ -12,83 +12,5 @@ rescue LoadError
12
12
  require 'pry'
13
13
  end
14
14
 
15
- opts = Slop.parse(:help => true, :multiple_switches => false) do
16
- banner %{Usage: pry [OPTIONS]
17
- Start a Pry session.
18
- See: `https://github.com/pry` for more information.
19
- Copyright (c) 2011 John Mair (banisterfiend)
20
- --
21
- }
22
-
23
- on :e, :exec, "A line of code to execute in context before the session starts", true
24
-
25
- on "no-pager", "Disable pager for long output" do
26
- Pry.config.pager = false
27
- end
28
-
29
- on "no-history", "Disable history loading" do
30
- Pry.config.history.should_load = false
31
- end
32
-
33
- on "no-color", "Disable syntax highlighting for session" do
34
- Pry.color = false
35
- end
36
-
37
- on :f, "Suppress loading of ~/.pryrc" do
38
- # load ~/.pryrc, if not suppressed with -f option
39
- Pry.config.should_load_rc = false
40
- end
41
-
42
- on "no-plugins", "Suppress loading of plugins." do
43
- # suppress plugins if given --no-plugins optino
44
- Pry.config.plugins.enabled = false
45
- end
46
-
47
- on "installed-plugins", "List installed plugins." do
48
- puts "Installed Plugins:"
49
- puts "--"
50
- Pry.locate_plugins.each do |plugin|
51
- puts "#{plugin.name}".ljust(18) + plugin.spec.summary
52
- end
53
- exit
54
- end
55
-
56
- on "simple-prompt", "Enable simple prompt mode" do
57
- Pry.prompt = Pry::SIMPLE_PROMPT
58
- end
59
-
60
- on :r, :require, "`require` a Ruby script at startup", true do |file|
61
- Pry.config.requires << file
62
- end
63
-
64
- on :I, "Add a path to the $LOAD_PATH", true do |path|
65
- $LOAD_PATH << path
66
- end
67
-
68
- on :v, :version, "Display the Pry version" do
69
- puts "Pry version #{Pry::VERSION} on Ruby #{RUBY_VERSION}"
70
- exit
71
- end
72
-
73
- on(:c, :context,
74
- "Start the session in the specified context. Equivalent to `context.pry` in a session.",
75
- true,
76
- :default => "TOPLEVEL_BINDING"
77
- )
78
- end
79
-
80
- # invoked via cli
81
- Pry.cli = true
82
-
83
- # create the actual context
84
- context = Pry.binding_for(eval(opts[:context]))
85
-
86
- if opts[:exec]
87
- exec_string = opts[:exec] + "\n"
88
- else
89
- exec_string = ""
90
- end
91
-
92
- # Start the session (running any code passed with -e, if there is any)
93
- Pry.start(context, :input => StringIO.new(exec_string))
94
-
15
+ # Process command line options and run Pry
16
+ Pry::CLI.parse_options
data/lib/pry.rb CHANGED
@@ -4,19 +4,19 @@
4
4
 
5
5
  require 'pp'
6
6
  require 'pry/helpers/base_helpers'
7
+ require 'pry/hooks'
8
+
7
9
  class Pry
8
10
  # The default hooks - display messages when beginning and ending Pry sessions.
9
- DEFAULT_HOOKS = {
10
- :before_session => proc do |out, target, _pry_|
11
- # ensure we're actually in a method
12
- file = target.eval('__FILE__')
13
-
14
- # /unknown/ for rbx
15
- if file == Pry.eval_path || (file !~ /(\(.*\))|<.*>/ && file !~ /__unknown__/ && file != "" && file != "-e")
16
- _pry_.process_line("whereami 5", "", target)
17
- end
11
+ DEFAULT_HOOKS = Pry::Hooks.new.add_hook(:before_session, :default) do |out, target, _pry_|
12
+ # ensure we're actually in a method
13
+ file = target.eval('__FILE__')
14
+
15
+ # /unknown/ for rbx
16
+ if file !~ /(\(.*\))|<.*>/ && file !~ /__unknown__/ && file != "" && file != "-e"
17
+ _pry_.run_command("whereami 5", "", target)
18
18
  end
19
- }
19
+ end
20
20
 
21
21
  # The default print
22
22
  DEFAULT_PRINT = proc do |output, value|
@@ -36,6 +36,9 @@ class Pry
36
36
 
37
37
  colorized = Helpers::BaseHelpers.colorize_code(stringified.gsub(/#</, "%<#{nonce}"))
38
38
 
39
+ # avoid colour-leak from CodeRay and any of the users' previous output
40
+ colorized = colorized.sub(/(\n*)$/, "\e[0m\\1") if Pry.color
41
+
39
42
  Helpers::BaseHelpers.stagger_output("=> #{colorized.gsub(/%<(.*?)#{nonce}/, '#<\1')}", output)
40
43
  end
41
44
 
@@ -66,19 +69,11 @@ class Pry
66
69
  # The default prompt; includes the target and nesting level
67
70
  DEFAULT_PROMPT = [
68
71
  proc { |target_self, nest_level, pry|
69
- if nest_level == 0
70
- "[#{pry.input_array.size}] pry(#{Pry.view_clip(target_self)})> "
71
- else
72
- "[#{pry.input_array.size}] pry(#{Pry.view_clip(target_self)}):#{nest_level}> "
73
- end
72
+ "[#{pry.input_array.size}] pry(#{Pry.view_clip(target_self)})#{":#{nest_level}" unless nest_level.zero?}> "
74
73
  },
75
74
 
76
75
  proc { |target_self, nest_level, pry|
77
- if nest_level == 0
78
- "[#{pry.input_array.size}] pry(#{Pry.view_clip(target_self)})* "
79
- else
80
- "[#{pry.input_array.size}] pry(#{Pry.view_clip(target_self)}):#{nest_level}* "
81
- end
76
+ "[#{pry.input_array.size}] pry(#{Pry.view_clip(target_self)})#{":#{nest_level}" unless nest_level.zero?}* "
82
77
  }
83
78
  ]
84
79
 
@@ -184,6 +179,7 @@ require "pry/version"
184
179
  require "pry/rbx_method"
185
180
  require "pry/rbx_path"
186
181
  require "pry/method"
182
+ require "pry/wrapped_module"
187
183
  require "pry/history_array"
188
184
  require "pry/helpers"
189
185
  require "pry/history"
@@ -196,3 +192,4 @@ require "pry/plugins"
196
192
  require "pry/core_extensions"
197
193
  require "pry/pry_class"
198
194
  require "pry/pry_instance"
195
+ require "pry/cli"
data/lib/pry/cli.rb ADDED
@@ -0,0 +1,152 @@
1
+
2
+ class Pry
3
+
4
+ # Manage the processing of command line options
5
+ class CLI
6
+
7
+ NoOptionsError = Class.new(StandardError)
8
+
9
+ class << self
10
+
11
+ # @return [Proc] The Proc defining the valid command line options.
12
+ attr_accessor :options
13
+
14
+ # @return [Array] The Procs that process the parsed options.
15
+ attr_accessor :option_processors
16
+
17
+ # Add another set of CLI options
18
+ def add_options(&block)
19
+ if options
20
+ old_options = options
21
+ self.options = proc do
22
+ instance_exec(&old_options)
23
+ instance_exec(&block)
24
+ end
25
+ else
26
+ self.options = block
27
+ end
28
+
29
+ self
30
+ end
31
+
32
+ # Bring in options defined in plugins
33
+ def add_plugin_options
34
+ Pry.plugins.values.each do |plugin|
35
+ plugin.load_cli_options
36
+ end
37
+
38
+ self
39
+ end
40
+
41
+ # Add a block responsible for processing parsed options.
42
+ def process_options(&block)
43
+ self.option_processors ||= []
44
+ option_processors << block
45
+
46
+ self
47
+ end
48
+
49
+ # Clear `options` and `option_processors`
50
+ def reset
51
+ self.options = nil
52
+ self.option_processors = nil
53
+ end
54
+
55
+ def parse_options(args=ARGV)
56
+ raise NoOptionsError, "No command line options defined! Use Pry::CLI.add_options to add command line options." if !options
57
+
58
+ opts = Slop.parse(args, :help => true, :multiple_switches => false, &options)
59
+ option_processors.each { |processor| processor.call(opts) } if option_processors # option processors are optional
60
+
61
+ self
62
+ end
63
+
64
+ end
65
+
66
+ reset
67
+ end
68
+ end
69
+
70
+ # Bring in options defined by plugins
71
+ Pry::CLI.add_plugin_options
72
+
73
+ # The default Pry command line options (before plugin options are included)
74
+ Pry::CLI.add_options do
75
+ banner %{Usage: pry [OPTIONS]
76
+ Start a Pry session.
77
+ See: `https://github.com/pry` for more information.
78
+ Copyright (c) 2011 John Mair (banisterfiend)
79
+ --
80
+ }
81
+ on :e, :exec, "A line of code to execute in context before the session starts", true
82
+
83
+ on "no-pager", "Disable pager for long output" do
84
+ Pry.config.pager = false
85
+ end
86
+
87
+ on "no-history", "Disable history loading" do
88
+ Pry.config.history.should_load = false
89
+ end
90
+
91
+ on "no-color", "Disable syntax highlighting for session" do
92
+ Pry.color = false
93
+ end
94
+
95
+ on :f, "Suppress loading of ~/.pryrc" do
96
+ # load ~/.pryrc, if not suppressed with -f option
97
+ Pry.config.should_load_rc = false
98
+ end
99
+
100
+ on "no-plugins", "Suppress loading of plugins." do
101
+ # suppress plugins if given --no-plugins optino
102
+ Pry.config.plugins.enabled = false
103
+ end
104
+
105
+ on "installed-plugins", "List installed plugins." do
106
+ puts "Installed Plugins:"
107
+ puts "--"
108
+ Pry.locate_plugins.each do |plugin|
109
+ puts "#{plugin.name}".ljust(18) + plugin.spec.summary
110
+ end
111
+ exit
112
+ end
113
+
114
+ on "simple-prompt", "Enable simple prompt mode" do
115
+ Pry.config.prompt = Pry::SIMPLE_PROMPT
116
+ end
117
+
118
+ on :r, :require, "`require` a Ruby script at startup", true do |file|
119
+ Pry.config.requires << file
120
+ end
121
+
122
+ on :I, "Add a path to the $LOAD_PATH", true do |path|
123
+ $LOAD_PATH << path
124
+ end
125
+
126
+ on :v, :version, "Display the Pry version" do
127
+ puts "Pry version #{Pry::VERSION} on Ruby #{RUBY_VERSION}"
128
+ exit
129
+ end
130
+
131
+ on(:c, :context,
132
+ "Start the session in the specified context. Equivalent to `context.pry` in a session.",
133
+ true,
134
+ :default => "TOPLEVEL_BINDING"
135
+ )
136
+ end.process_options do |opts|
137
+ # invoked via cli
138
+ Pry.cli = true
139
+
140
+ # create the actual context
141
+ context = Pry.binding_for(eval(opts[:context]))
142
+
143
+ if opts[:exec]
144
+ exec_string = opts[:exec] + "\n"
145
+ else
146
+ exec_string = ""
147
+ end
148
+
149
+ # Start the session (running any code passed with -e, if there is any)
150
+ Pry.start(context, :input => StringIO.new(exec_string))
151
+ end
152
+