Remove plugin system in favor of regular requires

This commit is contained in:
Matijs van Zuijlen 2020-03-22 12:58:42 +01:00
parent ef8602bf98
commit 20d63ca783
5 changed files with 2 additions and 168 deletions

View File

@ -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'

View File

@ -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 ||= []
@ -158,11 +151,11 @@ Pry::CLI.add_options do
end
on :s, "select-plugin=", "Only load specified plugin (and no others)." do |plugin_name|
Pry.plugins[plugin_name].activate!
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!
warn "The --disable-plugin option is deprecated and has no effect"
end
on "no-plugins", "Suppress loading of plugins." do

View File

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

View File

@ -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=,
@ -332,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

View File

@ -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)