pry 0.10.3 → 0.14.2

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 (159) hide show
  1. checksums.yaml +5 -5
  2. data/CHANGELOG.md +439 -16
  3. data/LICENSE +1 -1
  4. data/README.md +362 -302
  5. data/bin/pry +4 -7
  6. data/lib/pry/basic_object.rb +10 -0
  7. data/lib/pry/block_command.rb +22 -0
  8. data/lib/pry/class_command.rb +194 -0
  9. data/lib/pry/cli.rb +84 -97
  10. data/lib/pry/code/code_file.rb +37 -26
  11. data/lib/pry/code/code_range.rb +7 -5
  12. data/lib/pry/code/loc.rb +26 -13
  13. data/lib/pry/code.rb +42 -31
  14. data/lib/pry/code_object.rb +53 -28
  15. data/lib/pry/color_printer.rb +46 -35
  16. data/lib/pry/command.rb +197 -369
  17. data/lib/pry/command_set.rb +89 -114
  18. data/lib/pry/command_state.rb +31 -0
  19. data/lib/pry/commands/amend_line.rb +86 -82
  20. data/lib/pry/commands/bang.rb +18 -14
  21. data/lib/pry/commands/bang_pry.rb +15 -11
  22. data/lib/pry/commands/cat/abstract_formatter.rb +23 -18
  23. data/lib/pry/commands/cat/exception_formatter.rb +85 -72
  24. data/lib/pry/commands/cat/file_formatter.rb +56 -46
  25. data/lib/pry/commands/cat/input_expression_formatter.rb +35 -30
  26. data/lib/pry/commands/cat.rb +62 -54
  27. data/lib/pry/commands/cd.rb +40 -35
  28. data/lib/pry/commands/change_inspector.rb +29 -22
  29. data/lib/pry/commands/change_prompt.rb +48 -23
  30. data/lib/pry/commands/clear_screen.rb +20 -0
  31. data/lib/pry/commands/code_collector.rb +148 -131
  32. data/lib/pry/commands/disable_pry.rb +23 -19
  33. data/lib/pry/commands/easter_eggs.rb +23 -34
  34. data/lib/pry/commands/edit/exception_patcher.rb +21 -17
  35. data/lib/pry/commands/edit/file_and_line_locator.rb +34 -23
  36. data/lib/pry/commands/edit.rb +185 -157
  37. data/lib/pry/commands/exit.rb +40 -35
  38. data/lib/pry/commands/exit_all.rb +24 -20
  39. data/lib/pry/commands/exit_program.rb +20 -16
  40. data/lib/pry/commands/find_method.rb +168 -162
  41. data/lib/pry/commands/fix_indent.rb +16 -12
  42. data/lib/pry/commands/help.rb +140 -133
  43. data/lib/pry/commands/hist.rb +151 -149
  44. data/lib/pry/commands/import_set.rb +20 -15
  45. data/lib/pry/commands/jump_to.rb +25 -21
  46. data/lib/pry/commands/list_inspectors.rb +35 -28
  47. data/lib/pry/commands/ls/constants.rb +59 -31
  48. data/lib/pry/commands/ls/formatter.rb +42 -36
  49. data/lib/pry/commands/ls/globals.rb +38 -36
  50. data/lib/pry/commands/ls/grep.rb +17 -15
  51. data/lib/pry/commands/ls/instance_vars.rb +29 -28
  52. data/lib/pry/commands/ls/interrogatable.rb +18 -12
  53. data/lib/pry/commands/ls/jruby_hacks.rb +47 -41
  54. data/lib/pry/commands/ls/local_names.rb +26 -24
  55. data/lib/pry/commands/ls/local_vars.rb +38 -30
  56. data/lib/pry/commands/ls/ls_entity.rb +47 -52
  57. data/lib/pry/commands/ls/methods.rb +49 -51
  58. data/lib/pry/commands/ls/methods_helper.rb +46 -42
  59. data/lib/pry/commands/ls/self_methods.rb +23 -21
  60. data/lib/pry/commands/ls.rb +124 -103
  61. data/lib/pry/commands/nesting.rb +21 -17
  62. data/lib/pry/commands/play.rb +92 -82
  63. data/lib/pry/commands/pry_backtrace.rb +22 -17
  64. data/lib/pry/commands/pry_version.rb +15 -11
  65. data/lib/pry/commands/raise_up.rb +33 -27
  66. data/lib/pry/commands/reload_code.rb +60 -48
  67. data/lib/pry/commands/reset.rb +16 -12
  68. data/lib/pry/commands/ri.rb +57 -42
  69. data/lib/pry/commands/save_file.rb +45 -43
  70. data/lib/pry/commands/shell_command.rb +56 -29
  71. data/lib/pry/commands/shell_mode.rb +22 -18
  72. data/lib/pry/commands/show_doc.rb +80 -70
  73. data/lib/pry/commands/show_info.rb +194 -155
  74. data/lib/pry/commands/show_input.rb +16 -11
  75. data/lib/pry/commands/show_source.rb +110 -42
  76. data/lib/pry/commands/stat.rb +35 -31
  77. data/lib/pry/commands/switch_to.rb +21 -15
  78. data/lib/pry/commands/toggle_color.rb +20 -16
  79. data/lib/pry/commands/watch_expression/expression.rb +32 -27
  80. data/lib/pry/commands/watch_expression.rb +89 -84
  81. data/lib/pry/commands/whereami.rb +156 -141
  82. data/lib/pry/commands/wtf.rb +78 -40
  83. data/lib/pry/config/attributable.rb +22 -0
  84. data/lib/pry/config/lazy_value.rb +29 -0
  85. data/lib/pry/config/memoized_value.rb +34 -0
  86. data/lib/pry/config/value.rb +24 -0
  87. data/lib/pry/config.rb +310 -20
  88. data/lib/pry/control_d_handler.rb +28 -0
  89. data/lib/pry/core_extensions.rb +22 -9
  90. data/lib/pry/editor.rb +56 -34
  91. data/lib/pry/env.rb +18 -0
  92. data/lib/pry/exception_handler.rb +43 -0
  93. data/lib/pry/exceptions.rb +13 -18
  94. data/lib/pry/forwardable.rb +27 -0
  95. data/lib/pry/helpers/base_helpers.rb +20 -62
  96. data/lib/pry/helpers/command_helpers.rb +52 -62
  97. data/lib/pry/helpers/documentation_helpers.rb +21 -12
  98. data/lib/pry/helpers/options_helpers.rb +15 -8
  99. data/lib/pry/helpers/platform.rb +55 -0
  100. data/lib/pry/helpers/table.rb +44 -32
  101. data/lib/pry/helpers/text.rb +96 -85
  102. data/lib/pry/helpers.rb +3 -0
  103. data/lib/pry/history.rb +81 -55
  104. data/lib/pry/hooks.rb +60 -110
  105. data/lib/pry/indent.rb +74 -68
  106. data/lib/pry/input_completer.rb +199 -158
  107. data/lib/pry/input_lock.rb +7 -10
  108. data/lib/pry/inspector.rb +36 -24
  109. data/lib/pry/last_exception.rb +45 -45
  110. data/lib/pry/method/disowned.rb +19 -5
  111. data/lib/pry/method/patcher.rb +14 -8
  112. data/lib/pry/method/weird_method_locator.rb +79 -45
  113. data/lib/pry/method.rb +178 -124
  114. data/lib/pry/object_path.rb +37 -28
  115. data/lib/pry/output.rb +102 -16
  116. data/lib/pry/pager.rb +187 -174
  117. data/lib/pry/prompt.rb +213 -25
  118. data/lib/pry/pry_class.rb +119 -98
  119. data/lib/pry/pry_instance.rb +261 -224
  120. data/lib/pry/repl.rb +83 -29
  121. data/lib/pry/repl_file_loader.rb +27 -22
  122. data/lib/pry/ring.rb +89 -0
  123. data/lib/pry/slop/LICENSE +20 -0
  124. data/lib/pry/slop/commands.rb +190 -0
  125. data/lib/pry/slop/option.rb +210 -0
  126. data/lib/pry/slop.rb +672 -0
  127. data/lib/pry/syntax_highlighter.rb +26 -0
  128. data/lib/pry/system_command_handler.rb +17 -0
  129. data/lib/pry/testable/evalable.rb +24 -0
  130. data/lib/pry/testable/mockable.rb +22 -0
  131. data/lib/pry/testable/pry_tester.rb +88 -0
  132. data/lib/pry/testable/utility.rb +34 -0
  133. data/lib/pry/testable/variables.rb +52 -0
  134. data/lib/pry/testable.rb +68 -0
  135. data/lib/pry/version.rb +3 -1
  136. data/lib/pry/warning.rb +20 -0
  137. data/lib/pry/{module_candidate.rb → wrapped_module/candidate.rb} +35 -32
  138. data/lib/pry/wrapped_module.rb +68 -63
  139. data/lib/pry.rb +133 -149
  140. metadata +58 -69
  141. data/lib/pry/commands/disabled_commands.rb +0 -2
  142. data/lib/pry/commands/gem_cd.rb +0 -26
  143. data/lib/pry/commands/gem_install.rb +0 -32
  144. data/lib/pry/commands/gem_list.rb +0 -33
  145. data/lib/pry/commands/gem_open.rb +0 -29
  146. data/lib/pry/commands/gist.rb +0 -101
  147. data/lib/pry/commands/install_command.rb +0 -53
  148. data/lib/pry/commands/list_prompts.rb +0 -35
  149. data/lib/pry/commands/simple_prompt.rb +0 -22
  150. data/lib/pry/commands.rb +0 -6
  151. data/lib/pry/config/behavior.rb +0 -139
  152. data/lib/pry/config/convenience.rb +0 -25
  153. data/lib/pry/config/default.rb +0 -161
  154. data/lib/pry/history_array.rb +0 -121
  155. data/lib/pry/plugins.rb +0 -103
  156. data/lib/pry/rbx_path.rb +0 -22
  157. data/lib/pry/rubygem.rb +0 -82
  158. data/lib/pry/terminal.rb +0 -79
  159. data/lib/pry/test/helper.rb +0 -170
data/bin/pry CHANGED
@@ -1,16 +1,13 @@
1
1
  #!/usr/bin/env ruby
2
+ # frozen_string_literal: true
2
3
 
3
4
  # (C) John Mair (banisterfiend)
4
5
  # MIT license
5
6
 
6
7
  $0 = 'pry'
7
8
 
8
- begin
9
- require 'pry'
10
- rescue LoadError
11
- require 'rubygems'
12
- require 'pry'
13
- end
9
+ require 'pry'
14
10
 
15
11
  # Process command line options and run Pry
16
- Pry::CLI.parse_options
12
+ opts = Pry::CLI.parse_options
13
+ Pry::CLI.start(opts)
@@ -0,0 +1,10 @@
1
+ # frozen_string_literal: true
2
+
3
+ class Pry
4
+ class BasicObject < BasicObject
5
+ %i[Kernel File Dir LoadError ENV Pry].each do |constant|
6
+ const_set constant, ::Object.const_get(constant)
7
+ end
8
+ include Kernel
9
+ end
10
+ end
@@ -0,0 +1,22 @@
1
+ # frozen_string_literal: true
2
+
3
+ class Pry
4
+ # A super-class for Commands that are created with a single block.
5
+ #
6
+ # This class ensures that the block is called with the correct number of
7
+ # arguments and the right context.
8
+ #
9
+ # Create subclasses using {Pry::CommandSet#command}.
10
+ class BlockCommand < Command
11
+ # Call the block that was registered with this command.
12
+ # @param [Array<String>] args The arguments passed
13
+ # @return [Object] The return value of the block
14
+ def call(*args)
15
+ instance_exec(*normalize_method_args(block, args), &block)
16
+ end
17
+
18
+ def help
19
+ "#{command_options[:listing].to_s.ljust(18)} #{description}"
20
+ end
21
+ end
22
+ end
@@ -0,0 +1,194 @@
1
+ # frozen_string_literal: true
2
+
3
+ class Pry
4
+ # A super-class of Commands with structure.
5
+ #
6
+ # This class implements the bare-minimum functionality that a command should
7
+ # have, namely a --help switch, and then delegates actual processing to its
8
+ # subclasses.
9
+ #
10
+ # Create subclasses using {Pry::CommandSet#create_command}, and override the
11
+ # `options(opt)` method to set up an instance of Pry::Slop, and the `process`
12
+ # method to actually run the command. If necessary, you can also override
13
+ # `setup` which will be called before `options`, for example to require any
14
+ # gems your command needs to run, or to set up state.
15
+ class ClassCommand < Command
16
+ class << self
17
+ # Ensure that subclasses inherit the options, description and
18
+ # match from a ClassCommand super class.
19
+ def inherited(klass)
20
+ klass.match match
21
+ klass.description description
22
+ klass.command_options options
23
+ end
24
+
25
+ def source
26
+ source_object.source
27
+ end
28
+
29
+ def doc
30
+ new.help
31
+ end
32
+
33
+ def source_location
34
+ source_object.source_location
35
+ end
36
+
37
+ def source_file
38
+ source_object.source_file
39
+ end
40
+ alias file source_file
41
+
42
+ def source_line
43
+ source_object.source_line
44
+ end
45
+ alias line source_line
46
+
47
+ private
48
+
49
+ # The object used to extract the source for the command.
50
+ #
51
+ # This should be a `Pry::Method(block)` for a command made with `create_command`
52
+ # and a `Pry::WrappedModule(self)` for a command that's a standard class.
53
+ # @return [Pry::WrappedModule, Pry::Method]
54
+ def source_object
55
+ @source_object ||= if name =~ /^[A-Z]/
56
+ Pry::WrappedModule(self)
57
+ else
58
+ Pry::Method(block)
59
+ end
60
+ end
61
+ end
62
+
63
+ attr_accessor :opts
64
+ attr_accessor :args
65
+
66
+ # Set up `opts` and `args`, and then call `process`.
67
+ #
68
+ # This method will display help if necessary.
69
+ #
70
+ # @param [Array<String>] args The arguments passed
71
+ # @return [Object] The return value of `process` or VOID_VALUE
72
+ def call(*args)
73
+ setup
74
+
75
+ self.opts = slop
76
+ self.args = opts.parse!(args)
77
+
78
+ if opts.present?(:help)
79
+ output.puts slop.help
80
+ void
81
+ else
82
+ process(*normalize_method_args(method(:process), args))
83
+ end
84
+ end
85
+
86
+ # Return the help generated by Pry::Slop for this command.
87
+ def help
88
+ slop.help
89
+ end
90
+
91
+ # Return an instance of Pry::Slop that can parse either subcommands or the
92
+ # options that this command accepts.
93
+ def slop
94
+ Pry::Slop.new do |opt|
95
+ opt.banner(unindent(self.class.banner))
96
+ subcommands(opt)
97
+ options(opt)
98
+ opt.on :h, :help, 'Show this message.'
99
+ end
100
+ end
101
+
102
+ # Generate shell completions
103
+ # @param [String] search The line typed so far
104
+ # @return [Array<String>] the words to complete
105
+ def complete(search)
106
+ slop.flat_map do |opt|
107
+ [opt.long && "--#{opt.long} " || opt.short && "-#{opt.short}"]
108
+ end.compact + super
109
+ end
110
+
111
+ # A method called just before `options(opt)` as part of `call`.
112
+ #
113
+ # This method can be used to set up any context your command needs to run,
114
+ # for example requiring gems, or setting default values for options.
115
+ #
116
+ # @example
117
+ # def setup
118
+ # require 'gist'
119
+ # @action = :method
120
+ # end
121
+ def setup; end
122
+
123
+ # A method to setup Pry::Slop commands so it can parse the subcommands your
124
+ # command expects. If you need to set up default values, use `setup`
125
+ # instead.
126
+ #
127
+ # @example A minimal example
128
+ # def subcommands(cmd)
129
+ # cmd.command :download do |opt|
130
+ # description 'Downloads a content from a server'
131
+ #
132
+ # opt.on :verbose, 'Use verbose output'
133
+ #
134
+ # run do |options, arguments|
135
+ # ContentDownloader.download(options, arguments)
136
+ # end
137
+ # end
138
+ # end
139
+ #
140
+ # @example Define the invokation block anywhere you want
141
+ # def subcommands(cmd)
142
+ # cmd.command :download do |opt|
143
+ # description 'Downloads a content from a server'
144
+ #
145
+ # opt.on :verbose, 'Use verbose output'
146
+ # end
147
+ # end
148
+ #
149
+ # def process
150
+ # # Perform calculations...
151
+ # opts.fetch_command(:download).run do |options, arguments|
152
+ # ContentDownloader.download(options, arguments)
153
+ # end
154
+ # # More calculations...
155
+ # end
156
+ def subcommands(cmd); end
157
+
158
+ # A method to setup Pry::Slop so it can parse the options your command expects.
159
+ #
160
+ # @note Please don't do anything side-effecty in the main part of this
161
+ # method, as it may be called by Pry at any time for introspection reasons.
162
+ # If you need to set up default values, use `setup` instead.
163
+ #
164
+ # @example
165
+ # def options(opt)
166
+ # opt.banner "Gists methods or classes"
167
+ # opt.on(:c, :class, "gist a class") do
168
+ # @action = :class
169
+ # end
170
+ # end
171
+ def options(opt); end
172
+
173
+ # The actual body of your command should go here.
174
+ #
175
+ # The `opts` mehod can be called to get the options that Pry::Slop has passed,
176
+ # and `args` gives the remaining, unparsed arguments.
177
+ #
178
+ # The return value of this method is discarded unless the command was
179
+ # created with `:keep_retval => true`, in which case it is returned to the
180
+ # repl.
181
+ #
182
+ # @example
183
+ # def process
184
+ # if opts.present?(:class)
185
+ # gist_class
186
+ # else
187
+ # gist_method
188
+ # end
189
+ # end
190
+ def process
191
+ raise CommandError, "command '#{command_name}' not implemented"
192
+ end
193
+ end
194
+ end
data/lib/pry/cli.rb CHANGED
@@ -1,12 +1,13 @@
1
- class Pry
1
+ # frozen_string_literal: true
2
+
3
+ require 'stringio'
2
4
 
5
+ class Pry
3
6
  # Manage the processing of command line options
4
7
  class CLI
5
-
6
8
  NoOptionsError = Class.new(StandardError)
7
9
 
8
10
  class << self
9
-
10
11
  # @return [Proc] The Proc defining the valid command line options.
11
12
  attr_accessor :options
12
13
 
@@ -19,7 +20,7 @@ class Pry
19
20
  # as CLI options.
20
21
  attr_accessor :input_args
21
22
 
22
- # Add another set of CLI options (a Slop block)
23
+ # Add another set of CLI options (a Pry::Slop block)
23
24
  def add_options(&block)
24
25
  if options
25
26
  old_options = options
@@ -34,15 +35,6 @@ class Pry
34
35
  self
35
36
  end
36
37
 
37
- # Bring in options defined in plugins
38
- def add_plugin_options
39
- Pry.plugins.values.each do |plugin|
40
- plugin.load_cli_options
41
- end
42
-
43
- self
44
- end
45
-
46
38
  # Add a block responsible for processing parsed options.
47
39
  def add_option_processor(&block)
48
40
  self.option_processors ||= []
@@ -57,66 +49,88 @@ class Pry
57
49
  self.option_processors = nil
58
50
  end
59
51
 
60
- def parse_options(args=ARGV)
52
+ def parse_options(args = ARGV)
61
53
  unless options
62
- raise NoOptionsError, "No command line options defined! Use Pry::CLI.add_options to add command line options."
54
+ raise NoOptionsError,
55
+ "No command line options defined! Use Pry::CLI.add_options to " \
56
+ "add command line options."
63
57
  end
64
58
 
65
- self.input_args = args
59
+ @pass_argv = args.index { |cli_arg| %w[- --].include?(cli_arg) }
60
+ if @pass_argv
61
+ slop_args = args[0...@pass_argv]
62
+ self.input_args = args.replace(args[@pass_argv + 1..-1])
63
+ else
64
+ self.input_args = slop_args = args
65
+ end
66
66
 
67
67
  begin
68
- opts = Slop.parse!(
69
- args,
70
- :help => true,
71
- :multiple_switches => false,
72
- :strict => true,
68
+ opts = Pry::Slop.parse!(
69
+ slop_args,
70
+ help: true,
71
+ multiple_switches: false,
72
+ strict: true,
73
73
  &options
74
74
  )
75
- rescue Slop::InvalidOptionError
75
+ rescue Pry::Slop::InvalidOptionError
76
76
  # Display help message on unknown switches and exit.
77
- puts Slop.new(&options)
78
- exit
77
+ puts Pry::Slop.new(&options)
78
+ Kernel.exit
79
79
  end
80
80
 
81
+ Pry.initial_session_setup
82
+ Pry.final_session_setup
83
+
81
84
  # Option processors are optional.
82
- if option_processors
83
- option_processors.each { |processor| processor.call(opts) }
84
- end
85
+ option_processors.each { |processor| processor.call(opts) } if option_processors
85
86
 
86
- self
87
+ opts
87
88
  end
88
89
 
89
- end
90
+ def start(opts)
91
+ Kernel.exit if opts.help?
90
92
 
91
- reset
92
- end
93
- end
93
+ # invoked via cli
94
+ Pry.cli = true
94
95
 
96
+ # create the actual context
97
+ if opts[:context]
98
+ Pry.initial_session_setup
99
+ context = Pry.binding_for(eval(opts[:context])) # rubocop:disable Security/Eval
100
+ Pry.final_session_setup
101
+ else
102
+ context = Pry.toplevel_binding
103
+ end
95
104
 
96
- # String that is built to be executed on start (created by -e and -exec switches)
97
- exec_string = ""
105
+ if !@pass_argv && Pry::CLI.input_args.any? && Pry::CLI.input_args != ["pry"]
106
+ full_name = File.expand_path(Pry::CLI.input_args.first)
107
+ Pry.load_file_through_repl(full_name)
108
+ Kernel.exit
109
+ end
98
110
 
99
- # Bring in options defined by plugins
100
- Slop.new do
101
- on "no-plugins" do
102
- Pry.config.should_load_plugins = false
103
- end
104
- end.parse(ARGV.dup)
111
+ # Start the session (running any code passed with -e, if there is any)
112
+ Pry.start(context, input: StringIO.new(Pry.config.exec_string))
113
+ end
114
+ end
105
115
 
106
- if Pry.config.should_load_plugins
107
- Pry::CLI.add_plugin_options
116
+ reset
117
+ end
108
118
  end
109
119
 
110
120
  # The default Pry command line options (before plugin options are included)
111
121
  Pry::CLI.add_options do
112
- banner %{Usage: pry [OPTIONS]
113
- Start a Pry session.
114
- See http://pryrepl.org/ for more information.
115
- Copyright (c) 2013 John Mair (banisterfiend)
116
- --
117
- }
118
- on :e, :exec=, "A line of code to execute in context before the session starts" do |input|
119
- exec_string << input << "\n"
122
+ banner(
123
+ "Usage: pry [OPTIONS]\n" \
124
+ "Start a Pry session.\n" \
125
+ "See http://pry.github.io/ for more information.\n" \
126
+ "Copyright (c) 2016 John Mair (banisterfiend)" \
127
+ )
128
+
129
+ on(
130
+ :e, :exec=, "A line of code to execute in context before the session starts"
131
+ ) do |input|
132
+ Pry.config.exec_string += "\n" unless Pry.config.exec_string.empty?
133
+ Pry.config.exec_string += input
120
134
  end
121
135
 
122
136
  on "no-pager", "Disable pager for long output" do
@@ -124,61 +138,57 @@ Copyright (c) 2013 John Mair (banisterfiend)
124
138
  end
125
139
 
126
140
  on "no-history", "Disable history loading" do
127
- Pry.config.history.should_load = false
141
+ Pry.config.history_load = false
128
142
  end
129
143
 
130
144
  on "no-color", "Disable syntax highlighting for session" do
131
145
  Pry.config.color = false
132
146
  end
133
147
 
134
- on :f, "Suppress loading of ~/.pryrc and ./.pryrc" do
148
+ on :f, "Suppress loading of pryrc" do
135
149
  Pry.config.should_load_rc = false
136
150
  Pry.config.should_load_local_rc = false
137
151
  end
138
152
 
139
- on :s, "select-plugin=", "Only load specified plugin (and no others)." do |plugin_name|
140
- Pry.config.should_load_plugins = false
141
- Pry.plugins[plugin_name].activate!
153
+ on :s, "select-plugin=", "Only load specified plugin (and no others)." do |_plugin_name|
154
+ warn "The --select-plugin option is deprecated and has no effect"
142
155
  end
143
156
 
144
- on :d, "disable-plugin=", "Disable a specific plugin." do |plugin_name|
145
- Pry.plugins[plugin_name].disable!
157
+ on :d, "disable-plugin=", "Disable a specific plugin." do |_plugin_name|
158
+ warn "The --disable-plugin option is deprecated and has no effect"
146
159
  end
147
160
 
148
161
  on "no-plugins", "Suppress loading of plugins." do
149
- Pry.config.should_load_plugins = false
162
+ warn "The --no-plugins option is deprecated and has no effect"
150
163
  end
151
164
 
152
165
  on "plugins", "List installed plugins." do
153
- puts "Installed Plugins:"
154
- puts "--"
155
- Pry.locate_plugins.each do |plugin|
156
- puts "#{plugin.name}".ljust(18) << plugin.spec.summary
157
- end
158
- exit
166
+ warn "The --plugins option is deprecated and has no effect"
167
+ warn "Try using `gem list pry-`"
168
+ Kernel.exit
159
169
  end
160
170
 
161
171
  on "simple-prompt", "Enable simple prompt mode" do
162
- Pry.config.prompt = Pry::SIMPLE_PROMPT
172
+ Pry.config.prompt = Pry::Prompt[:simple]
163
173
  end
164
174
 
165
175
  on "noprompt", "No prompt mode" do
166
- Pry.config.prompt = Pry::NO_PROMPT
176
+ Pry.config.prompt = Pry::Prompt[:none]
167
177
  end
168
178
 
169
179
  on :r, :require=, "`require` a Ruby script at startup" do |file|
170
180
  Pry.config.requires << file
171
181
  end
172
182
 
173
- on :I=, "Add a path to the $LOAD_PATH", :as => Array, :delimiter => ":" do |load_path|
183
+ on(:I=, "Add a path to the $LOAD_PATH", as: Array, delimiter: ":") do |load_path|
174
184
  load_path.map! do |path|
175
- /\A\.\// =~ path ? path : File.expand_path(path)
185
+ %r{\A\./} =~ path ? path : File.expand_path(path)
176
186
  end
177
187
 
178
188
  $LOAD_PATH.unshift(*load_path)
179
189
  end
180
190
 
181
- on "gem", "Shorthand for -I./lib -rgemname" do |load_path|
191
+ on "gem", "Shorthand for -I./lib -rgemname" do |_load_path|
182
192
  $LOAD_PATH.unshift("./lib")
183
193
  Dir["./lib/*.rb"].each do |file|
184
194
  Pry.config.requires << file
@@ -187,34 +197,11 @@ Copyright (c) 2013 John Mair (banisterfiend)
187
197
 
188
198
  on :v, :version, "Display the Pry version" do
189
199
  puts "Pry version #{Pry::VERSION} on Ruby #{RUBY_VERSION}"
190
- exit
191
- end
192
-
193
- on(:c, :context=,
194
- "Start the session in the specified context. Equivalent to `context.pry` in a session.",
195
- :default => "Pry.toplevel_binding"
196
- )
197
- end.add_option_processor do |opts|
198
-
199
- exit if opts.help?
200
-
201
- # invoked via cli
202
- Pry.cli = true
203
-
204
- # create the actual context
205
- if opts[:context]
206
- Pry.initial_session_setup
207
- context = Pry.binding_for(eval(opts[:context]))
208
- else
209
- context = Pry.toplevel_binding
210
- end
211
-
212
- if Pry::CLI.input_args.any? && Pry::CLI.input_args != ["pry"]
213
- full_name = File.expand_path(Pry::CLI.input_args.first)
214
- Pry.load_file_through_repl(full_name)
215
- exit
200
+ Kernel.exit
216
201
  end
217
202
 
218
- # Start the session (running any code passed with -e, if there is any)
219
- Pry.start(context, :input => StringIO.new(exec_string))
203
+ on :c, :context=,
204
+ "Start the session in the specified context. Equivalent to " \
205
+ "`context.pry` in a session.",
206
+ default: "Pry.toplevel_binding"
220
207
  end
@@ -1,25 +1,37 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'method_source'
4
+
1
5
  class Pry
2
6
  class CodeFile
3
- DEFAULT_EXT = '.rb'
7
+ DEFAULT_EXT = '.rb'.freeze
4
8
 
5
9
  # List of all supported languages.
6
10
  # @return [Hash]
7
11
  EXTENSIONS = {
8
- %w(.py) => :python,
9
- %w(.js) => :javascript,
10
- %w(.css) => :css,
11
- %w(.xml) => :xml,
12
- %w(.php) => :php,
13
- %w(.html) => :html,
14
- %w(.diff) => :diff,
15
- %w(.java) => :java,
16
- %w(.json) => :json,
17
- %w(.c .h) => :c,
18
- %w(.rhtml) => :rhtml,
19
- %w(.yaml .yml) => :yaml,
20
- %w(.cpp .hpp .cc .h cxx) => :cpp,
21
- %w(.rb .ru .irbrc .gemspec .pryrc) => :ruby,
22
- }
12
+ %w[.py] => :python,
13
+ %w[.js] => :javascript,
14
+ %w[.css] => :css,
15
+ %w[.xml] => :xml,
16
+ %w[.php] => :php,
17
+ %w[.html] => :html,
18
+ %w[.diff] => :diff,
19
+ %w[.java] => :java,
20
+ %w[.json] => :json,
21
+ %w[.c .h] => :c,
22
+ %w[.rhtml] => :rhtml,
23
+ %w[.yaml .yml] => :yaml,
24
+ %w[.cpp .hpp .cc .h .cxx] => :cpp,
25
+ %w[.rb .ru .irbrc .gemspec .pryrc .rake] => :ruby
26
+ }.freeze
27
+
28
+ FILES = {
29
+ %w[Gemfile Rakefile Guardfile Capfile] => :ruby
30
+ }.freeze
31
+
32
+ # Store the current working directory. This allows show-source etc. to work if
33
+ # your process has changed directory since boot. [Issue #675]
34
+ INITIAL_PWD = Dir.pwd
23
35
 
24
36
  # @return [Symbol] The type of code stored in this wrapper.
25
37
  attr_reader :code_type
@@ -37,8 +49,6 @@ class Pry
37
49
  Pry.line_buffer.drop(1)
38
50
  elsif Pry::Method::Patcher.code_for(@filename)
39
51
  Pry::Method::Patcher.code_for(@filename)
40
- elsif RbxPath.is_core_path?(@filename)
41
- File.read(RbxPath.convert_path_to_full(@filename))
42
52
  else
43
53
  path = abs_path
44
54
  @code_type = type_from_filename(path)
@@ -52,16 +62,16 @@ class Pry
52
62
  # readable for some reason.
53
63
  # @return [String] absolute path for the given `filename`.
54
64
  def abs_path
55
- code_path.detect { |path| readable?(path) } or
56
- raise MethodSource::SourceNotFoundError,
57
- "Cannot open #{ @filename.inspect } for reading."
65
+ code_path.detect { |path| readable?(path) } ||
66
+ raise(MethodSource::SourceNotFoundError,
67
+ "Cannot open #{@filename.inspect} for reading.")
58
68
  end
59
69
 
60
70
  # @param [String] path
61
71
  # @return [Boolean] if the path, with or without the default ext,
62
72
  # is a readable file then `true`, otherwise `false`.
63
73
  def readable?(path)
64
- File.readable?(path) && !File.directory?(path) or
74
+ File.readable?(path) && !File.directory?(path) ||
65
75
  File.readable?(path << DEFAULT_EXT)
66
76
  end
67
77
 
@@ -74,11 +84,13 @@ class Pry
74
84
  # @param [String] filename
75
85
  # @param [Symbol] default (:unknown) the file type to assume if none could be
76
86
  # detected.
77
- # @return [Symbol, nil] The CodeRay type of a file from its extension, or
78
- # `nil` if `:unknown`.
87
+ # @return [Symbol, nil] The SyntaxHighlighter type of a file from its
88
+ # extension, or `nil` if `:unknown`.
79
89
  def type_from_filename(filename, default = :unknown)
80
90
  _, @code_type = EXTENSIONS.find do |k, _|
81
91
  k.any? { |ext| ext == File.extname(filename) }
92
+ end || FILES.find do |k, _|
93
+ k.any? { |file_name| file_name == File.basename(filename) }
82
94
  end
83
95
 
84
96
  code_type || default
@@ -91,13 +103,12 @@ class Pry
91
103
 
92
104
  # @return [String]
93
105
  def from_pry_init_pwd
94
- File.expand_path(@filename, Pry::INITIAL_PWD)
106
+ File.expand_path(@filename, INITIAL_PWD)
95
107
  end
96
108
 
97
109
  # @return [String]
98
110
  def from_load_path
99
111
  $LOAD_PATH.map { |path| File.expand_path(@filename, path) }
100
112
  end
101
-
102
113
  end
103
114
  end
@@ -1,11 +1,11 @@
1
+ # frozen_string_literal: true
2
+
1
3
  class Pry
2
4
  class Code
3
-
4
5
  # Represents a range of lines in a code listing.
5
6
  #
6
7
  # @api private
7
8
  class CodeRange
8
-
9
9
  # @param [Integer] start_line
10
10
  # @param [Integer?] end_line
11
11
  def initialize(start_line, end_line = nil)
@@ -22,8 +22,9 @@ class Pry
22
22
 
23
23
  private
24
24
 
25
- def start_line; @start_line; end
26
- def end_line; @end_line; end
25
+ attr_reader :start_line
26
+
27
+ attr_reader :end_line
27
28
 
28
29
  # If `end_line` is equal to `nil`, then calculate it from the first
29
30
  # parameter, `start_line`. Otherwise, leave it as it is.
@@ -48,12 +49,14 @@ class Pry
48
49
  # @return [Integer]
49
50
  def find_start_index(lines)
50
51
  return start_line if start_line < 0
52
+
51
53
  lines.index { |loc| loc.lineno >= start_line } || lines.length
52
54
  end
53
55
 
54
56
  # @return [Integer]
55
57
  def find_end_index(lines)
56
58
  return end_line if end_line < 0
59
+
57
60
  (lines.index { |loc| loc.lineno > end_line } || 0) - 1
58
61
  end
59
62
 
@@ -66,6 +69,5 @@ class Pry
66
69
  @start_line = start_line.first
67
70
  end
68
71
  end
69
-
70
72
  end
71
73
  end