summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--.circleci/config.yml13
-rw-r--r--CHANGELOG.md20
-rw-r--r--README.md2
-rw-r--r--lib/pry.rb1
-rw-r--r--lib/pry/cli.rb27
-rw-r--r--lib/pry/commands/show_doc.rb1
-rw-r--r--lib/pry/commands/show_source.rb1
-rw-r--r--lib/pry/config.rb4
-rw-r--r--lib/pry/helpers/text.rb10
-rw-r--r--lib/pry/plugins.rb139
-rw-r--r--lib/pry/pry_class.rb5
-rw-r--r--lib/pry/version.rb2
-rw-r--r--spec/cli_spec.rb15
-rw-r--r--spec/commands/wtf_spec.rb38
-rw-r--r--spec/config_spec.rb1
-rw-r--r--spec/integration/bundler_spec.rb3
-rw-r--r--spec/syntax_checking_spec.rb2
17 files changed, 68 insertions, 216 deletions
diff --git a/.circleci/config.yml b/.circleci/config.yml
index 7a7a0876..3f55e1d2 100644
--- a/.circleci/config.yml
+++ b/.circleci/config.yml
@@ -138,6 +138,15 @@ jobs:
- <<: *bundle_install
- <<: *install_ubuntu_nano
- <<: *unit
+ "ruby-3.0":
+ docker:
+ - image: circleci/ruby:3.0
+ working_directory: ~/pry
+ steps:
+ - <<: *repo_restore_cache
+ - <<: *bundle_install
+ - <<: *install_ubuntu_nano
+ - <<: *unit
"jruby-9.1-jdk":
docker:
- image: circleci/jruby:9.1-jdk
@@ -199,6 +208,10 @@ workflows:
requires:
- rubocop_lint
- yard_lint
+ - "ruby-3.0":
+ requires:
+ - rubocop_lint
+ - yard_lint
- "jruby-9.1-jdk":
requires:
- rubocop_lint
diff --git a/CHANGELOG.md b/CHANGELOG.md
index b072fbf4..f3d6e4c5 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,5 +1,24 @@
### master
+### [v0.14.0][v0.14.0] (February 8, 2021)
+
+#### Features
+
+* Made `?` an alias to `show-source -d`
+ ([#2133](https://github.com/pry/pry/pull/2133))
+* Added support for Ruby 3.0
+
+#### Breaking changes
+
+* Deleted support for plugin autoloading
+ ([#2119](https://github.com/pry/pry/pull/2119)). In order to load a Pry plugin
+ you must `require` it from your `pryrc` or add it to your Gemfile.
+
+ ```rb
+ # ~/.pryrc
+ require 'pryrc'
+ ```
+
### [v0.13.1][v0.13.1] (April 12, 2020)
#### Bug fixes
@@ -1074,3 +1093,4 @@ complete CHANGELOG:
[v0.12.2]: https://github.com/pry/pry/releases/tag/v0.12.2
[v0.13.0]: https://github.com/pry/pry/releases/tag/v0.13.0
[v0.13.1]: https://github.com/pry/pry/releases/tag/v0.13.1
+[v0.14.0]: https://github.com/pry/pry/releases/tag/v0.14.0
diff --git a/README.md b/README.md
index 4d9203ea..e33f2381 100644
--- a/README.md
+++ b/README.md
@@ -21,7 +21,7 @@ Pry
**Links:**
-* https://pryrepl.org/
+* https://pry.github.com/
* [YARD API documentation](https://www.rubydoc.info/gems/pry)
* [Wiki](https://github.com/pry/pry/wiki)
diff --git a/lib/pry.rb b/lib/pry.rb
index 2fddd003..7ead087b 100644
--- a/lib/pry.rb
+++ b/lib/pry.rb
@@ -13,7 +13,6 @@ require 'pry/helpers'
require 'pry/basic_object'
require 'pry/prompt'
-require 'pry/plugins'
require 'pry/code_object'
require 'pry/exceptions'
require 'pry/hooks'
diff --git a/lib/pry/cli.rb b/lib/pry/cli.rb
index 17c0d030..8d56794d 100644
--- a/lib/pry/cli.rb
+++ b/lib/pry/cli.rb
@@ -35,13 +35,6 @@ class Pry
self
end
- # Bring in options defined in plugins
- def add_plugin_options
- Pry.plugins.values.each(&:load_cli_options)
-
- self
- end
-
# Add a block responsible for processing parsed options.
def add_option_processor(&block)
self.option_processors ||= []
@@ -124,15 +117,6 @@ class Pry
end
end
-# Bring in options defined by plugins
-Pry::Slop.new do
- on "no-plugins" do
- Pry.config.should_load_plugins = false
- end
-end.parse(ARGV.dup)
-
-Pry::CLI.add_plugin_options if Pry.config.should_load_plugins
-
# The default Pry command line options (before plugin options are included)
Pry::CLI.add_options do
banner(
@@ -166,17 +150,16 @@ Pry::CLI.add_options do
Pry.config.should_load_local_rc = false
end
- on :s, "select-plugin=", "Only load specified plugin (and no others)." do |plugin_name|
- Pry.config.should_load_plugins = false
- Pry.plugins[plugin_name].activate!
+ on :s, "select-plugin=", "Only load specified plugin (and no others)." do |_plugin_name|
+ warn "The --select-plugin option is deprecated and has no effect"
end
- on :d, "disable-plugin=", "Disable a specific plugin." do |plugin_name|
- Pry.plugins[plugin_name].disable!
+ on :d, "disable-plugin=", "Disable a specific plugin." do |_plugin_name|
+ warn "The --disable-plugin option is deprecated and has no effect"
end
on "no-plugins", "Suppress loading of plugins." do
- Pry.config.should_load_plugins = false
+ warn "The --no-plugins option is deprecated and has no effect"
end
on "plugins", "List installed plugins." do
diff --git a/lib/pry/commands/show_doc.rb b/lib/pry/commands/show_doc.rb
index c0f183b2..3742348a 100644
--- a/lib/pry/commands/show_doc.rb
+++ b/lib/pry/commands/show_doc.rb
@@ -89,6 +89,5 @@ class Pry
end
Pry::Commands.add_command(Pry::Command::ShowDoc)
- Pry::Commands.alias_command '?', 'show-doc'
end
end
diff --git a/lib/pry/commands/show_source.rb b/lib/pry/commands/show_source.rb
index 7df865c6..1a020349 100644
--- a/lib/pry/commands/show_source.rb
+++ b/lib/pry/commands/show_source.rb
@@ -113,5 +113,6 @@ class Pry
Pry::Commands.add_command(Pry::Command::ShowSource)
Pry::Commands.alias_command 'show-method', 'show-source'
Pry::Commands.alias_command '$', 'show-source'
+ Pry::Commands.alias_command '?', 'show-source -d'
end
end
diff --git a/lib/pry/config.rb b/lib/pry/config.rb
index 0e54bf69..48c4089d 100644
--- a/lib/pry/config.rb
+++ b/lib/pry/config.rb
@@ -73,9 +73,6 @@ class Pry
# @return [Boolean] whether the local ./.pryrc should be loaded
attribute :should_load_local_rc
- # @return [Boolean]
- attribute :should_load_plugins
-
# @return [Boolean] whether to load files specified with the -r flag
attribute :should_load_requires
@@ -196,7 +193,6 @@ class Pry
output_prefix: '=> ',
requires: [],
should_load_requires: true,
- should_load_plugins: true,
windows_console_warning: true,
control_d_handler: Pry::ControlDHandler.method(:default),
memory_size: 100,
diff --git a/lib/pry/helpers/text.rb b/lib/pry/helpers/text.rb
index 4ccedf83..e004c961 100644
--- a/lib/pry/helpers/text.rb
+++ b/lib/pry/helpers/text.rb
@@ -21,20 +21,20 @@ class Pry
COLORS.each_pair do |color, value|
define_method color do |text|
- "\033[0;#{30 + value}m#{text}\033[0m"
+ "\001\033[0;#{30 + value}m\002#{text}\001\033[0m\002"
end
define_method "bright_#{color}" do |text|
- "\033[1;#{30 + value}m#{text}\033[0m"
+ "\001\033[1;#{30 + value}m\002#{text}\001\033[0m\002"
end
COLORS.each_pair do |bg_color, bg_value|
define_method "#{color}_on_#{bg_color}" do |text|
- "\033[0;#{30 + value};#{40 + bg_value}m#{text}\033[0m"
+ "\001\033[0;#{30 + value};#{40 + bg_value}m\002#{text}\001\033[0m\002"
end
define_method "bright_#{color}_on_#{bg_color}" do |text|
- "\033[1;#{30 + value};#{40 + bg_value}m#{text}\033[0m"
+ "\001\033[1;#{30 + value};#{40 + bg_value}m\002#{text}\001\033[0m\002"
end
end
end
@@ -52,7 +52,7 @@ class Pry
# @param [String, #to_s] text
# @return [String] _text_
def bold(text)
- "\e[1m#{text}\e[0m"
+ "\001\e[1m\002#{text}\001\e[0m\002"
end
# Returns `text` in the default foreground colour.
diff --git a/lib/pry/plugins.rb b/lib/pry/plugins.rb
deleted file mode 100644
index c29894d4..00000000
--- a/lib/pry/plugins.rb
+++ /dev/null
@@ -1,139 +0,0 @@
-# frozen_string_literal: true
-
-require 'ostruct'
-
-class Pry
- class PluginManager
- PRY_PLUGIN_PREFIX = /^pry-/.freeze
-
- # Placeholder when no associated gem found, displays warning
- class NoPlugin
- def initialize(name)
- @name = name
- end
-
- def method_missing(*)
- warn "Warning: The plugin '#{@name}' was not found! (no gem found)"
- super
- end
-
- def respond_to_missing?(*)
- false
- end
- end
-
- class Plugin
- attr_accessor :name, :gem_name, :enabled, :spec, :active
-
- def initialize(name, gem_name, spec, enabled)
- @name = name
- @gem_name = gem_name
- @enabled = enabled
- @spec = spec
- end
-
- # Disable a plugin. (prevents plugin from being loaded, cannot
- # disable an already activated plugin)
- def disable!
- self.enabled = false
- end
-
- # Enable a plugin. (does not load it immediately but puts on
- # 'white list' to be loaded)
- def enable!
- self.enabled = true
- end
-
- # Load the Command line options defined by this plugin (if they exist)
- def load_cli_options
- cli_options_file = File.join(spec.full_gem_path, "lib/#{spec.name}/cli.rb")
- return unless File.exist?(cli_options_file)
-
- if Gem::Version.new(RUBY_VERSION) >= Gem::Version.new("2.4.4")
- cli_options_file = File.realpath(cli_options_file)
- end
- require cli_options_file
- end
-
- # Activate the plugin (require the gem - enables/loads the
- # plugin immediately at point of call, even if plugin is
- # disabled)
- # Does not reload plugin if it's already active.
- def activate!
- # Create the configuration object for the plugin.
- Pry.config.send("#{gem_name.tr('-', '_')}=", OpenStruct.new)
-
- begin
- require gem_name unless active?
- rescue LoadError => e
- warn "Found plugin #{gem_name}, but could not require '#{gem_name}'"
- warn e
- rescue StandardError => e
- warn "require '#{gem_name}' # Failed, saying: #{e}"
- end
-
- self.active = true
- self.enabled = true
- end
-
- alias active? active
- alias enabled? enabled
-
- def supported?
- pry_version = Gem::Version.new(VERSION)
- spec.dependencies.each do |dependency|
- if dependency.name == "pry"
- return dependency.requirement.satisfied_by?(pry_version)
- end
- end
- true
- end
- end
-
- def initialize
- @plugins = []
- end
-
- # Find all installed Pry plugins and store them in an internal array.
- def locate_plugins
- gem_list.each do |gem|
- next if gem.name !~ PRY_PLUGIN_PREFIX
-
- plugin_name = gem.name.split('-', 2).last
- plugin = Plugin.new(plugin_name, gem.name, gem, false)
- @plugins << plugin.tap(&:enable!) if plugin.supported? && !plugin_located?(plugin)
- end
- @plugins
- end
-
- # @return [Hash] A hash with all plugin names (minus the 'pry-') as
- # keys and Plugin objects as values.
- def plugins
- h = Hash.new { |_, key| NoPlugin.new(key) }
- @plugins.each do |plugin|
- h[plugin.name] = plugin
- end
- h
- end
-
- # Require all enabled plugins, disabled plugins are skipped.
- def load_plugins
- @plugins.each do |plugin|
- plugin.activate! if plugin.enabled?
- end
- end
-
- private
-
- def plugin_located?(plugin)
- @plugins.any? { |existing| existing.gem_name == plugin.gem_name }
- end
-
- def gem_list
- Gem.refresh
- return Gem::Specification if Gem::Specification.respond_to?(:each)
-
- Gem.source_index.find_name('')
- end
- end
-end
diff --git a/lib/pry/pry_class.rb b/lib/pry/pry_class.rb
index 80dda807..118102dd 100644
--- a/lib/pry/pry_class.rb
+++ b/lib/pry/pry_class.rb
@@ -24,8 +24,6 @@ class Pry
attr_accessor :last_internal_error
attr_accessor :config
- def_delegators :@plugin_manager, :plugins, :load_plugins, :locate_plugins
-
def_delegators(
:@config, :input, :input=, :output, :output=, :commands,
:commands=, :print, :print=, :exception_handler, :exception_handler=,
@@ -142,7 +140,6 @@ you can add "Pry.config.windows_console_warning = false" to your pryrc.
return if @session_finalized
@session_finalized = true
- load_plugins if Pry.config.should_load_plugins
load_requires if Pry.config.should_load_requires
load_history if Pry.config.history_load
load_traps if Pry.config.should_trap_interrupts
@@ -333,9 +330,7 @@ Readline version #{Readline::VERSION} detected - will not auto_resize! correctly
# Basic initialization.
def self.init
- @plugin_manager ||= PluginManager.new
reset_defaults
- locate_plugins
end
# Return a `Binding` object for `target` or return `target` if it is
diff --git a/lib/pry/version.rb b/lib/pry/version.rb
index 2ecd02cf..69c4452f 100644
--- a/lib/pry/version.rb
+++ b/lib/pry/version.rb
@@ -1,5 +1,5 @@
# frozen_string_literal: true
class Pry
- VERSION = '0.13.1'.freeze
+ VERSION = '0.14.0'.freeze
end
diff --git a/spec/cli_spec.rb b/spec/cli_spec.rb
index 93625f79..39d6c7a2 100644
--- a/spec/cli_spec.rb
+++ b/spec/cli_spec.rb
@@ -41,21 +41,6 @@ RSpec.describe Pry::CLI do
end
end
- describe ".add_plugin_options" do
- it "returns self" do
- expect(described_class.add_plugin_options).to eq(described_class)
- end
-
- it "loads cli options of plugins" do
- plugin_mock = double
- expect(plugin_mock).to receive(:load_cli_options)
- plugins = { 'pry-testplugin' => plugin_mock }
- expect(Pry).to receive(:plugins).and_return(plugins)
-
- described_class.add_plugin_options
- end
- end
-
describe ".add_option_processor" do
it "returns self" do
expect(described_class.add_option_processor {}).to eq(described_class)
diff --git a/spec/commands/wtf_spec.rb b/spec/commands/wtf_spec.rb
index 52ad0251..c4af0cc5 100644
--- a/spec/commands/wtf_spec.rb
+++ b/spec/commands/wtf_spec.rb
@@ -38,7 +38,7 @@ RSpec.describe Pry::Command::Wtf do
it "prints only a part of the exception backtrace" do
subject.process
expect(subject.output.string).to eq(
- "\e[1mException:\e[0m RuntimeError: oops\n" \
+ "\001\e[1m\002Exception:\001\e[0m\002 RuntimeError: oops\n" \
"--\n" \
"0: /bin/pry:23:in `<main>'\n" \
"1: /bin/pry:23:in `<main>'\n" \
@@ -55,7 +55,7 @@ RSpec.describe Pry::Command::Wtf do
it "prints full exception backtrace" do
subject.process
expect(subject.output.string).to eq(
- "\e[1mException:\e[0m RuntimeError: oops\n" \
+ "\001\e[1m\002Exception:\001\e[0m\002 RuntimeError: oops\n" \
"--\n" \
"0: /bin/pry:23:in `<main>'\n" \
"1: /bin/pry:23:in `<main>'\n" \
@@ -73,7 +73,7 @@ RSpec.describe Pry::Command::Wtf do
it "prints more of backtrace" do
subject.process
expect(subject.output.string).to eq(
- "\e[1mException:\e[0m RuntimeError: oops\n" \
+ "\001\e[1m\002Exception:\001\e[0m\002 RuntimeError: oops\n" \
"--\n" \
"0: /bin/pry:23:in `<main>'\n" \
"1: /bin/pry:23:in `<main>'\n" \
@@ -116,14 +116,14 @@ RSpec.describe Pry::Command::Wtf do
it "prints parts of both original and nested exception backtrace" do
subject.process
expect(subject.output.string).to eq(
- "\e[1mException:\e[0m RuntimeError: outer\n" \
+ "\001\e[1m\002Exception:\001\e[0m\002 RuntimeError: outer\n" \
"--\n" \
"0: /bin/pry:23:in `<main>'\n" \
"1: /bin/pry:23:in `<main>'\n" \
"2: /bin/pry:23:in `<main>'\n" \
"3: /bin/pry:23:in `<main>'\n" \
"4: /bin/pry:23:in `<main>'\n" \
- "\e[1mCaused by:\e[0m RuntimeError: inner\n" \
+ "\001\e[1m\002Caused by:\001\e[0m\002 RuntimeError: inner\n" \
"--\n" \
"0: /bin/pry:23:in `<main>'\n" \
"1: /bin/pry:23:in `<main>'\n" \
@@ -140,7 +140,7 @@ RSpec.describe Pry::Command::Wtf do
it "prints both original and nested exception backtrace" do
subject.process
expect(subject.output.string).to eq(
- "\e[1mException:\e[0m RuntimeError: outer\n" \
+ "\001\e[1m\002Exception:\001\e[0m\002 RuntimeError: outer\n" \
"--\n" \
"0: /bin/pry:23:in `<main>'\n" \
"1: /bin/pry:23:in `<main>'\n" \
@@ -148,7 +148,7 @@ RSpec.describe Pry::Command::Wtf do
"3: /bin/pry:23:in `<main>'\n" \
"4: /bin/pry:23:in `<main>'\n" \
"5: /bin/pry:23:in `<main>'\n" \
- "\e[1mCaused by:\e[0m RuntimeError: inner\n" \
+ "\001\e[1m\002Caused by:\001\e[0m\002 RuntimeError: inner\n" \
"--\n" \
"0: /bin/pry:23:in `<main>'\n" \
"1: /bin/pry:23:in `<main>'\n" \
@@ -177,17 +177,17 @@ RSpec.describe Pry::Command::Wtf do
it "prints lines of code that exception frame references" do
subject.process
expect(subject.output.string).to eq(
- "\e[1mException:\e[0m RuntimeError: oops\n" \
+ "\001\e[1m\002Exception:\001\e[0m\002 RuntimeError: oops\n" \
"--\n" \
- "0: \e[1m#{__FILE__}:168:in `<main>'\e[0m\n" \
+ "0: \001\e[1m\002#{__FILE__}:168:in `<main>'\001\e[0m\002\n" \
" Array.new(6) { \"\#{__FILE__}:\#{__LINE__}:in `<main>'\" }\n" \
- "1: \e[1m#{__FILE__}:168:in `<main>'\e[0m\n" \
+ "1: \001\e[1m\002#{__FILE__}:168:in `<main>'\001\e[0m\002\n" \
" Array.new(6) { \"\#{__FILE__}:\#{__LINE__}:in `<main>'\" }\n" \
- "2: \e[1m#{__FILE__}:168:in `<main>'\e[0m\n" \
+ "2: \001\e[1m\002#{__FILE__}:168:in `<main>'\001\e[0m\002\n" \
" Array.new(6) { \"\#{__FILE__}:\#{__LINE__}:in `<main>'\" }\n" \
- "3: \e[1m#{__FILE__}:168:in `<main>'\e[0m\n" \
+ "3: \001\e[1m\002#{__FILE__}:168:in `<main>'\001\e[0m\002\n" \
" Array.new(6) { \"\#{__FILE__}:\#{__LINE__}:in `<main>'\" }\n" \
- "4: \e[1m#{__FILE__}:168:in `<main>'\e[0m\n" \
+ "4: \001\e[1m\002#{__FILE__}:168:in `<main>'\001\e[0m\002\n" \
" Array.new(6) { \"\#{__FILE__}:\#{__LINE__}:in `<main>'\" }\n"
)
end
@@ -200,13 +200,13 @@ RSpec.describe Pry::Command::Wtf do
it "skips code and prints only the backtrace frame" do
subject.process
expect(subject.output.string).to eq(
- "\e[1mException:\e[0m RuntimeError: oops\n" \
+ "\001\e[1m\002Exception:\001\e[0m\002 RuntimeError: oops\n" \
"--\n" \
- "0: \e[1m#{__FILE__}:168:in `<main>'\e[0m\n" \
- "1: \e[1m#{__FILE__}:168:in `<main>'\e[0m\n" \
- "2: \e[1m#{__FILE__}:168:in `<main>'\e[0m\n" \
- "3: \e[1m#{__FILE__}:168:in `<main>'\e[0m\n" \
- "4: \e[1m#{__FILE__}:168:in `<main>'\e[0m\n"
+ "0: \001\e[1m\002#{__FILE__}:168:in `<main>'\001\e[0m\002\n" \
+ "1: \001\e[1m\002#{__FILE__}:168:in `<main>'\001\e[0m\002\n" \
+ "2: \001\e[1m\002#{__FILE__}:168:in `<main>'\001\e[0m\002\n" \
+ "3: \001\e[1m\002#{__FILE__}:168:in `<main>'\001\e[0m\002\n" \
+ "4: \001\e[1m\002#{__FILE__}:168:in `<main>'\001\e[0m\002\n"
)
end
end
diff --git a/spec/config_spec.rb b/spec/config_spec.rb
index f1cf5ea6..4018a1db 100644
--- a/spec/config_spec.rb
+++ b/spec/config_spec.rb
@@ -28,7 +28,6 @@ RSpec.describe Pry::Config do
specify { expect(subject.output_prefix).to be_a(String) }
specify { expect(subject.requires).to be_an(Array) }
specify { expect(subject.should_load_requires).to be(true).or be(false) }
- specify { expect(subject.should_load_plugins).to be(true).or be(false) }
specify { expect(subject.windows_console_warning).to be(true).or be(false) }
specify { expect(subject.control_d_handler).to respond_to(:call) }
specify { expect(subject.memory_size).to be_a(Numeric) }
diff --git a/spec/integration/bundler_spec.rb b/spec/integration/bundler_spec.rb
index 2c4f2b27..224616c2 100644
--- a/spec/integration/bundler_spec.rb
+++ b/spec/integration/bundler_spec.rb
@@ -9,8 +9,9 @@ RSpec.describe 'Bundler' do
context "when Pry requires Gemfile, which doesn't specify Pry as a dependency" do
it "loads auto-completion correctly" do
code = <<-RUBY
- require "pry"
+ require "bundler"
require "bundler/inline"
+ require "pry"
# Silence the "The Gemfile specifies no dependencies" warning
class Bundler::UI::Shell
diff --git a/spec/syntax_checking_spec.rb b/spec/syntax_checking_spec.rb
index ca75ba9f..beba497f 100644
--- a/spec/syntax_checking_spec.rb
+++ b/spec/syntax_checking_spec.rb
@@ -36,7 +36,7 @@ describe Pry do
["o = Object.new.tap{ def o.render;", "'MEH'", "}"],
# multiple syntax errors reported in one SyntaxException
- ["puts {'key'=>'val'}.to_json"]
+ ["puts {key: 'val'}.to_json"]
].compact.each do |foo|
it "should raise an error on invalid syntax like #{foo.inspect}" do
redirect_pry_io(InputTester.new(*foo), @str_output) do