mirror of
https://github.com/ruby/ruby.git
synced 2022-11-09 12:17:21 -05:00
Prepare to release bundler-2.1.0
This commit is contained in:
parent
e2b192f7d5
commit
38002a8adb
Notes:
git
2019-12-15 16:41:38 +09:00
146 changed files with 4685 additions and 459 deletions
|
|
@ -50,7 +50,6 @@ module Bundler
|
||||||
autoload :FeatureFlag, File.expand_path("bundler/feature_flag", __dir__)
|
autoload :FeatureFlag, File.expand_path("bundler/feature_flag", __dir__)
|
||||||
autoload :GemHelper, File.expand_path("bundler/gem_helper", __dir__)
|
autoload :GemHelper, File.expand_path("bundler/gem_helper", __dir__)
|
||||||
autoload :GemHelpers, File.expand_path("bundler/gem_helpers", __dir__)
|
autoload :GemHelpers, File.expand_path("bundler/gem_helpers", __dir__)
|
||||||
autoload :GemRemoteFetcher, File.expand_path("bundler/gem_remote_fetcher", __dir__)
|
|
||||||
autoload :GemVersionPromoter, File.expand_path("bundler/gem_version_promoter", __dir__)
|
autoload :GemVersionPromoter, File.expand_path("bundler/gem_version_promoter", __dir__)
|
||||||
autoload :Graph, File.expand_path("bundler/graph", __dir__)
|
autoload :Graph, File.expand_path("bundler/graph", __dir__)
|
||||||
autoload :Index, File.expand_path("bundler/index", __dir__)
|
autoload :Index, File.expand_path("bundler/index", __dir__)
|
||||||
|
|
|
||||||
|
|
@ -783,7 +783,7 @@ module Bundler
|
||||||
return unless SharedHelpers.md5_available?
|
return unless SharedHelpers.md5_available?
|
||||||
|
|
||||||
latest = Fetcher::CompactIndex.
|
latest = Fetcher::CompactIndex.
|
||||||
new(nil, Source::Rubygems::Remote.new(URI("https://rubygems.org")), nil).
|
new(nil, Source::Rubygems::Remote.new(Bundler::URI("https://rubygems.org")), nil).
|
||||||
send(:compact_index_client).
|
send(:compact_index_client).
|
||||||
instance_variable_get(:@cache).
|
instance_variable_get(:@cache).
|
||||||
dependencies("bundler").
|
dependencies("bundler").
|
||||||
|
|
|
||||||
|
|
@ -25,7 +25,7 @@ module Bundler
|
||||||
["config", "get", ARGV[1]]
|
["config", "get", ARGV[1]]
|
||||||
end
|
end
|
||||||
|
|
||||||
SharedHelpers.major_deprecation 2,
|
SharedHelpers.major_deprecation 3,
|
||||||
"Using the `config` command without a subcommand [list, get, set, unset] is deprecated and will be removed in the future. Use `bundle #{new_args.join(" ")}` instead."
|
"Using the `config` command without a subcommand [list, get, set, unset] is deprecated and will be removed in the future. Use `bundle #{new_args.join(" ")}` instead."
|
||||||
|
|
||||||
Base.new(options, name, value, self).run
|
Base.new(options, name, value, self).run
|
||||||
|
|
|
||||||
|
|
@ -25,12 +25,12 @@ module Bundler
|
||||||
SharedHelpers.set_bundle_environment
|
SharedHelpers.set_bundle_environment
|
||||||
if bin_path = Bundler.which(cmd)
|
if bin_path = Bundler.which(cmd)
|
||||||
if !Bundler.settings[:disable_exec_load] && ruby_shebang?(bin_path)
|
if !Bundler.settings[:disable_exec_load] && ruby_shebang?(bin_path)
|
||||||
return kernel_load(bin_path, *args)
|
return with_verbose_rubygems { kernel_load(bin_path, *args) }
|
||||||
end
|
end
|
||||||
kernel_exec(bin_path, *args)
|
with_verbose_rubygems { kernel_exec(bin_path, *args) }
|
||||||
else
|
else
|
||||||
# exec using the given command
|
# exec using the given command
|
||||||
kernel_exec(cmd, *args)
|
with_verbose_rubygems { kernel_exec(cmd, *args) }
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
@ -89,5 +89,14 @@ module Bundler
|
||||||
first_line = File.open(file, "rb") {|f| f.read(possibilities.map(&:size).max) }
|
first_line = File.open(file, "rb") {|f| f.read(possibilities.map(&:size).max) }
|
||||||
possibilities.any? {|shebang| first_line.start_with?(shebang) }
|
possibilities.any? {|shebang| first_line.start_with?(shebang) }
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def with_verbose_rubygems
|
||||||
|
old_ui = Gem::DefaultUserInteraction.ui
|
||||||
|
Gem::DefaultUserInteraction.ui = nil
|
||||||
|
|
||||||
|
yield
|
||||||
|
ensure
|
||||||
|
Gem::DefaultUserInteraction.ui = old_ui
|
||||||
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
|
||||||
|
|
@ -22,7 +22,7 @@ module Bundler
|
||||||
if Bundler.feature_flag.update_requires_all_flag?
|
if Bundler.feature_flag.update_requires_all_flag?
|
||||||
raise InvalidOption, "To update everything, pass the `--all` flag."
|
raise InvalidOption, "To update everything, pass the `--all` flag."
|
||||||
end
|
end
|
||||||
SharedHelpers.major_deprecation 2, "Pass --all to `bundle update` to update everything"
|
SharedHelpers.major_deprecation 3, "Pass --all to `bundle update` to update everything"
|
||||||
elsif !full_update && options[:all]
|
elsif !full_update && options[:all]
|
||||||
raise InvalidOption, "Cannot specify --all along with specific options."
|
raise InvalidOption, "Cannot specify --all along with specific options."
|
||||||
end
|
end
|
||||||
|
|
|
||||||
|
|
@ -46,7 +46,7 @@ module Bundler
|
||||||
settings_flag(:specific_platform) { bundler_3_mode? }
|
settings_flag(:specific_platform) { bundler_3_mode? }
|
||||||
settings_flag(:suppress_install_using_messages) { bundler_3_mode? }
|
settings_flag(:suppress_install_using_messages) { bundler_3_mode? }
|
||||||
settings_flag(:unlock_source_unlocks_spec) { !bundler_3_mode? }
|
settings_flag(:unlock_source_unlocks_spec) { !bundler_3_mode? }
|
||||||
settings_flag(:update_requires_all_flag) { bundler_3_mode? }
|
settings_flag(:update_requires_all_flag) { bundler_4_mode? }
|
||||||
settings_flag(:use_gem_version_promoter_for_major_updates) { bundler_3_mode? }
|
settings_flag(:use_gem_version_promoter_for_major_updates) { bundler_3_mode? }
|
||||||
|
|
||||||
settings_option(:default_cli_command) { bundler_3_mode? ? :cli_help : :install }
|
settings_option(:default_cli_command) { bundler_3_mode? ? :cli_help : :install }
|
||||||
|
|
|
||||||
|
|
@ -97,7 +97,7 @@ module Bundler
|
||||||
spec -= [nil, "ruby", ""]
|
spec -= [nil, "ruby", ""]
|
||||||
spec_file_name = "#{spec.join "-"}.gemspec"
|
spec_file_name = "#{spec.join "-"}.gemspec"
|
||||||
|
|
||||||
uri = URI.parse("#{remote_uri}#{Gem::MARSHAL_SPEC_DIR}#{spec_file_name}.rz")
|
uri = Bundler::URI.parse("#{remote_uri}#{Gem::MARSHAL_SPEC_DIR}#{spec_file_name}.rz")
|
||||||
if uri.scheme == "file"
|
if uri.scheme == "file"
|
||||||
path = Bundler.rubygems.correct_for_windows_path(uri.path)
|
path = Bundler.rubygems.correct_for_windows_path(uri.path)
|
||||||
Bundler.load_marshal Bundler.rubygems.inflate(Gem.read_binary(path))
|
Bundler.load_marshal Bundler.rubygems.inflate(Gem.read_binary(path))
|
||||||
|
|
@ -244,7 +244,7 @@ module Bundler
|
||||||
|
|
||||||
con = PersistentHTTP.new :name => "bundler", :proxy => :ENV
|
con = PersistentHTTP.new :name => "bundler", :proxy => :ENV
|
||||||
if gem_proxy = Bundler.rubygems.configuration[:http_proxy]
|
if gem_proxy = Bundler.rubygems.configuration[:http_proxy]
|
||||||
con.proxy = URI.parse(gem_proxy) if gem_proxy != :no_proxy
|
con.proxy = Bundler::URI.parse(gem_proxy) if gem_proxy != :no_proxy
|
||||||
end
|
end
|
||||||
|
|
||||||
if remote_uri.scheme == "https"
|
if remote_uri.scheme == "https"
|
||||||
|
|
|
||||||
|
|
@ -21,7 +21,7 @@ module Bundler
|
||||||
when Net::HTTPSuccess, Net::HTTPNotModified
|
when Net::HTTPSuccess, Net::HTTPNotModified
|
||||||
response
|
response
|
||||||
when Net::HTTPRedirection
|
when Net::HTTPRedirection
|
||||||
new_uri = URI.parse(response["location"])
|
new_uri = Bundler::URI.parse(response["location"])
|
||||||
if new_uri.host == uri.host
|
if new_uri.host == uri.host
|
||||||
new_uri.user = uri.user
|
new_uri.user = uri.user
|
||||||
new_uri.password = uri.password
|
new_uri.password = uri.password
|
||||||
|
|
|
||||||
|
|
@ -28,7 +28,7 @@ module Bundler
|
||||||
spec -= [nil, "ruby", ""]
|
spec -= [nil, "ruby", ""]
|
||||||
spec_file_name = "#{spec.join "-"}.gemspec"
|
spec_file_name = "#{spec.join "-"}.gemspec"
|
||||||
|
|
||||||
uri = URI.parse("#{remote_uri}#{Gem::MARSHAL_SPEC_DIR}#{spec_file_name}.rz")
|
uri = Bundler::URI.parse("#{remote_uri}#{Gem::MARSHAL_SPEC_DIR}#{spec_file_name}.rz")
|
||||||
if uri.scheme == "file"
|
if uri.scheme == "file"
|
||||||
path = Bundler.rubygems.correct_for_windows_path(uri.path)
|
path = Bundler.rubygems.correct_for_windows_path(uri.path)
|
||||||
Bundler.load_marshal Bundler.rubygems.inflate(Gem.read_binary(path))
|
Bundler.load_marshal Bundler.rubygems.inflate(Gem.read_binary(path))
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,5 @@
|
||||||
# frozen_string_literal: true
|
# frozen_string_literal: true
|
||||||
|
|
||||||
require "cgi"
|
|
||||||
require_relative "vendored_thor"
|
require_relative "vendored_thor"
|
||||||
|
|
||||||
module Bundler
|
module Bundler
|
||||||
|
|
@ -114,6 +113,7 @@ module Bundler
|
||||||
def issues_url(exception)
|
def issues_url(exception)
|
||||||
message = exception.message.lines.first.tr(":", " ").chomp
|
message = exception.message.lines.first.tr(":", " ").chomp
|
||||||
message = message.split("-").first if exception.is_a?(Errno)
|
message = message.split("-").first if exception.is_a?(Errno)
|
||||||
|
require "cgi"
|
||||||
"https://github.com/bundler/bundler/search?q=" \
|
"https://github.com/bundler/bundler/search?q=" \
|
||||||
"#{CGI.escape(message)}&type=Issues"
|
"#{CGI.escape(message)}&type=Issues"
|
||||||
end
|
end
|
||||||
|
|
|
||||||
|
|
@ -73,8 +73,7 @@ module Bundler
|
||||||
|
|
||||||
def build_gem
|
def build_gem
|
||||||
file_name = nil
|
file_name = nil
|
||||||
gem = ENV["GEM_COMMAND"] ? ENV["GEM_COMMAND"] : "gem"
|
sh("#{gem_command} build -V #{spec_path}".shellsplit) do
|
||||||
sh("#{gem} build -V #{spec_path}".shellsplit) do
|
|
||||||
file_name = File.basename(built_gem_path)
|
file_name = File.basename(built_gem_path)
|
||||||
SharedHelpers.filesystem_access(File.join(base, "pkg")) {|p| FileUtils.mkdir_p(p) }
|
SharedHelpers.filesystem_access(File.join(base, "pkg")) {|p| FileUtils.mkdir_p(p) }
|
||||||
FileUtils.mv(built_gem_path, "pkg")
|
FileUtils.mv(built_gem_path, "pkg")
|
||||||
|
|
@ -85,11 +84,10 @@ module Bundler
|
||||||
|
|
||||||
def install_gem(built_gem_path = nil, local = false)
|
def install_gem(built_gem_path = nil, local = false)
|
||||||
built_gem_path ||= build_gem
|
built_gem_path ||= build_gem
|
||||||
gem = ENV["GEM_COMMAND"] ? ENV["GEM_COMMAND"] : "gem"
|
cmd = "#{gem_command} install #{built_gem_path}"
|
||||||
cmd = "#{gem} install #{built_gem_path}"
|
|
||||||
cmd += " --local" if local
|
cmd += " --local" if local
|
||||||
out, status = sh_with_status(cmd.shellsplit)
|
_, status = sh_with_status(cmd.shellsplit)
|
||||||
unless status.success? && out[/Successfully installed/]
|
unless status.success?
|
||||||
raise "Couldn't install gem, run `gem install #{built_gem_path}' for more detailed output"
|
raise "Couldn't install gem, run `gem install #{built_gem_path}' for more detailed output"
|
||||||
end
|
end
|
||||||
Bundler.ui.confirm "#{name} (#{version}) installed."
|
Bundler.ui.confirm "#{name} (#{version}) installed."
|
||||||
|
|
@ -98,13 +96,13 @@ module Bundler
|
||||||
protected
|
protected
|
||||||
|
|
||||||
def rubygem_push(path)
|
def rubygem_push(path)
|
||||||
gem_command = %W[gem push #{path}]
|
cmd = %W[#{gem_command} push #{path}]
|
||||||
gem_command << "--key" << gem_key if gem_key
|
cmd << "--key" << gem_key if gem_key
|
||||||
gem_command << "--host" << allowed_push_host if allowed_push_host
|
cmd << "--host" << allowed_push_host if allowed_push_host
|
||||||
unless allowed_push_host || Bundler.user_home.join(".gem/credentials").file?
|
unless allowed_push_host || Bundler.user_home.join(".gem/credentials").file?
|
||||||
raise "Your rubygems.org credentials aren't set. Run `gem push` to set them."
|
raise "Your rubygems.org credentials aren't set. Run `gem push` to set them."
|
||||||
end
|
end
|
||||||
sh_with_input(gem_command)
|
sh_with_input(cmd)
|
||||||
Bundler.ui.confirm "Pushed #{name} #{version} to #{gem_push_host}"
|
Bundler.ui.confirm "Pushed #{name} #{version} to #{gem_push_host}"
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
@ -211,5 +209,9 @@ module Bundler
|
||||||
def gem_push?
|
def gem_push?
|
||||||
!%w[n no nil false off 0].include?(ENV["gem_push"].to_s.downcase)
|
!%w[n no nil false off 0].include?(ENV["gem_push"].to_s.downcase)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def gem_command
|
||||||
|
ENV["GEM_COMMAND"] ? ENV["GEM_COMMAND"] : "gem"
|
||||||
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
|
||||||
|
|
@ -37,43 +37,48 @@ def gemfile(install = false, options = {}, &gemfile)
|
||||||
ui.level = "silent" if opts.delete(:quiet)
|
ui.level = "silent" if opts.delete(:quiet)
|
||||||
raise ArgumentError, "Unknown options: #{opts.keys.join(", ")}" unless opts.empty?
|
raise ArgumentError, "Unknown options: #{opts.keys.join(", ")}" unless opts.empty?
|
||||||
|
|
||||||
old_root = Bundler.method(:root)
|
begin
|
||||||
bundler_module = class << Bundler; self; end
|
old_root = Bundler.method(:root)
|
||||||
bundler_module.send(:remove_method, :root)
|
bundler_module = class << Bundler; self; end
|
||||||
def Bundler.root
|
bundler_module.send(:remove_method, :root)
|
||||||
Bundler::SharedHelpers.pwd.expand_path
|
def Bundler.root
|
||||||
end
|
Bundler::SharedHelpers.pwd.expand_path
|
||||||
Bundler::SharedHelpers.set_env "BUNDLE_GEMFILE", "Gemfile"
|
|
||||||
|
|
||||||
Bundler::Plugin.gemfile_install(&gemfile) if Bundler.feature_flag.plugins?
|
|
||||||
builder = Bundler::Dsl.new
|
|
||||||
builder.instance_eval(&gemfile)
|
|
||||||
|
|
||||||
Bundler.settings.temporary(:frozen => false) do
|
|
||||||
definition = builder.to_definition(nil, true)
|
|
||||||
def definition.lock(*); end
|
|
||||||
definition.validate_runtime!
|
|
||||||
|
|
||||||
missing_specs = proc do
|
|
||||||
definition.missing_specs?
|
|
||||||
end
|
end
|
||||||
|
old_gemfile = ENV["BUNDLE_GEMFILE"]
|
||||||
|
Bundler::SharedHelpers.set_env "BUNDLE_GEMFILE", "Gemfile"
|
||||||
|
|
||||||
Bundler.ui = install ? ui : Bundler::UI::Silent.new
|
Bundler::Plugin.gemfile_install(&gemfile) if Bundler.feature_flag.plugins?
|
||||||
if install || missing_specs.call
|
builder = Bundler::Dsl.new
|
||||||
Bundler.settings.temporary(:inline => true, :disable_platform_warnings => true) do
|
builder.instance_eval(&gemfile)
|
||||||
installer = Bundler::Installer.install(Bundler.root, definition, :system => true)
|
|
||||||
installer.post_install_messages.each do |name, message|
|
Bundler.settings.temporary(:frozen => false) do
|
||||||
Bundler.ui.info "Post-install message from #{name}:\n#{message}"
|
definition = builder.to_definition(nil, true)
|
||||||
|
def definition.lock(*); end
|
||||||
|
definition.validate_runtime!
|
||||||
|
|
||||||
|
Bundler.ui = install ? ui : Bundler::UI::Silent.new
|
||||||
|
if install || definition.missing_specs?
|
||||||
|
Bundler.settings.temporary(:inline => true, :disable_platform_warnings => true) do
|
||||||
|
installer = Bundler::Installer.install(Bundler.root, definition, :system => true)
|
||||||
|
installer.post_install_messages.each do |name, message|
|
||||||
|
Bundler.ui.info "Post-install message from #{name}:\n#{message}"
|
||||||
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
runtime = Bundler::Runtime.new(nil, definition)
|
||||||
|
runtime.setup.require
|
||||||
|
end
|
||||||
|
ensure
|
||||||
|
if bundler_module
|
||||||
|
bundler_module.send(:remove_method, :root)
|
||||||
|
bundler_module.send(:define_method, :root, old_root)
|
||||||
end
|
end
|
||||||
|
|
||||||
runtime = Bundler::Runtime.new(nil, definition)
|
if old_gemfile
|
||||||
runtime.setup.require
|
ENV["BUNDLE_GEMFILE"] = old_gemfile
|
||||||
end
|
else
|
||||||
ensure
|
ENV.delete("BUNDLE_GEMFILE")
|
||||||
if bundler_module
|
end
|
||||||
bundler_module.send(:remove_method, :root)
|
|
||||||
bundler_module.send(:define_method, :root, old_root)
|
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,5 @@
|
||||||
# frozen_string_literal: true
|
# frozen_string_literal: true
|
||||||
|
|
||||||
require "uri"
|
|
||||||
require_relative "match_platform"
|
require_relative "match_platform"
|
||||||
|
|
||||||
module Bundler
|
module Bundler
|
||||||
|
|
|
||||||
|
|
@ -47,7 +47,7 @@ module Bundler
|
||||||
|
|
||||||
def fetch_valid_mirror_for(uri)
|
def fetch_valid_mirror_for(uri)
|
||||||
downcased = uri.to_s.downcase
|
downcased = uri.to_s.downcase
|
||||||
mirror = @mirrors[downcased] || @mirrors[URI(downcased).host] || Mirror.new(uri)
|
mirror = @mirrors[downcased] || @mirrors[Bundler::URI(downcased).host] || Mirror.new(uri)
|
||||||
mirror.validate!(@prober)
|
mirror.validate!(@prober)
|
||||||
mirror = Mirror.new(uri) unless mirror.valid?
|
mirror = Mirror.new(uri) unless mirror.valid?
|
||||||
mirror
|
mirror
|
||||||
|
|
@ -74,7 +74,7 @@ module Bundler
|
||||||
@uri = if uri.nil?
|
@uri = if uri.nil?
|
||||||
nil
|
nil
|
||||||
else
|
else
|
||||||
URI(uri.to_s)
|
Bundler::URI(uri.to_s)
|
||||||
end
|
end
|
||||||
@valid = nil
|
@valid = nil
|
||||||
end
|
end
|
||||||
|
|
@ -126,7 +126,7 @@ module Bundler
|
||||||
if uri == "all"
|
if uri == "all"
|
||||||
@all = true
|
@all = true
|
||||||
else
|
else
|
||||||
@uri = URI(uri).absolute? ? Settings.normalize_uri(uri) : uri
|
@uri = Bundler::URI(uri).absolute? ? Settings.normalize_uri(uri) : uri
|
||||||
end
|
end
|
||||||
@value = value
|
@value = value
|
||||||
end
|
end
|
||||||
|
|
|
||||||
|
|
@ -1,7 +1,5 @@
|
||||||
# frozen_string_literal: true
|
# frozen_string_literal: true
|
||||||
|
|
||||||
require "uri"
|
|
||||||
|
|
||||||
module Bundler
|
module Bundler
|
||||||
module Plugin
|
module Plugin
|
||||||
class API
|
class API
|
||||||
|
|
@ -108,7 +106,7 @@ module Bundler
|
||||||
def install_path
|
def install_path
|
||||||
@install_path ||=
|
@install_path ||=
|
||||||
begin
|
begin
|
||||||
base_name = File.basename(URI.parse(uri).normalize.path)
|
base_name = File.basename(Bundler::URI.parse(uri).normalize.path)
|
||||||
|
|
||||||
gem_install_dir.join("#{base_name}-#{uri_hash[0..11]}")
|
gem_install_dir.join("#{base_name}-#{uri_hash[0..11]}")
|
||||||
end
|
end
|
||||||
|
|
@ -170,7 +168,7 @@ module Bundler
|
||||||
#
|
#
|
||||||
# This is used by `app_cache_path`
|
# This is used by `app_cache_path`
|
||||||
def app_cache_dirname
|
def app_cache_dirname
|
||||||
base_name = File.basename(URI.parse(uri).normalize.path)
|
base_name = File.basename(Bundler::URI.parse(uri).normalize.path)
|
||||||
"#{base_name}-#{uri_hash}"
|
"#{base_name}-#{uri_hash}"
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1,7 +1,5 @@
|
||||||
# frozen_string_literal: true
|
# frozen_string_literal: true
|
||||||
|
|
||||||
require "uri"
|
|
||||||
|
|
||||||
module Bundler
|
module Bundler
|
||||||
# Represents a lazily loaded gem specification, where the full specification
|
# Represents a lazily loaded gem specification, where the full specification
|
||||||
# is on the source server in rubygems' "quick" index. The proxy object is to
|
# is on the source server in rubygems' "quick" index. The proxy object is to
|
||||||
|
|
|
||||||
|
|
@ -247,12 +247,6 @@ module Bundler
|
||||||
EXT_LOCK
|
EXT_LOCK
|
||||||
end
|
end
|
||||||
|
|
||||||
def fetch_prerelease_specs
|
|
||||||
fetch_specs(false, true)
|
|
||||||
rescue Gem::RemoteFetcher::FetchError
|
|
||||||
{} # if we can't download them, there aren't any
|
|
||||||
end
|
|
||||||
|
|
||||||
def with_build_args(args)
|
def with_build_args(args)
|
||||||
ext_lock.synchronize do
|
ext_lock.synchronize do
|
||||||
old_args = build_args
|
old_args = build_args
|
||||||
|
|
@ -531,8 +525,8 @@ module Bundler
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
def fetch_specs(source, remote, name)
|
def fetch_specs(remote, name)
|
||||||
path = source + "#{name}.#{Gem.marshal_version}.gz"
|
path = remote.uri.to_s + "#{name}.#{Gem.marshal_version}.gz"
|
||||||
fetcher = gem_remote_fetcher
|
fetcher = gem_remote_fetcher
|
||||||
fetcher.headers = { "X-Gemfile-Source" => remote.original_uri.to_s } if remote.original_uri
|
fetcher.headers = { "X-Gemfile-Source" => remote.original_uri.to_s } if remote.original_uri
|
||||||
string = fetcher.fetch_path(path)
|
string = fetcher.fetch_path(path)
|
||||||
|
|
@ -543,10 +537,8 @@ module Bundler
|
||||||
end
|
end
|
||||||
|
|
||||||
def fetch_all_remote_specs(remote)
|
def fetch_all_remote_specs(remote)
|
||||||
source = remote.uri.is_a?(URI) ? remote.uri : URI.parse(source.to_s)
|
specs = fetch_specs(remote, "specs")
|
||||||
|
pres = fetch_specs(remote, "prerelease_specs") || []
|
||||||
specs = fetch_specs(source, remote, "specs")
|
|
||||||
pres = fetch_specs(source, remote, "prerelease_specs") || []
|
|
||||||
|
|
||||||
specs.concat(pres)
|
specs.concat(pres)
|
||||||
end
|
end
|
||||||
|
|
@ -564,7 +556,7 @@ module Bundler
|
||||||
require "resolv"
|
require "resolv"
|
||||||
proxy = configuration[:http_proxy]
|
proxy = configuration[:http_proxy]
|
||||||
dns = Resolv::DNS.new
|
dns = Resolv::DNS.new
|
||||||
Bundler::GemRemoteFetcher.new(proxy, dns)
|
Gem::RemoteFetcher.new(proxy, dns)
|
||||||
end
|
end
|
||||||
|
|
||||||
def gem_from_path(path, policy = nil)
|
def gem_from_path(path, policy = nil)
|
||||||
|
|
|
||||||
|
|
@ -1,7 +1,5 @@
|
||||||
# frozen_string_literal: true
|
# frozen_string_literal: true
|
||||||
|
|
||||||
require "uri"
|
|
||||||
|
|
||||||
module Bundler
|
module Bundler
|
||||||
class Settings
|
class Settings
|
||||||
autoload :Mirror, File.expand_path("mirror", __dir__)
|
autoload :Mirror, File.expand_path("mirror", __dir__)
|
||||||
|
|
@ -152,7 +150,11 @@ module Bundler
|
||||||
end
|
end
|
||||||
|
|
||||||
def mirror_for(uri)
|
def mirror_for(uri)
|
||||||
uri = URI(uri.to_s) unless uri.is_a?(URI)
|
if uri.is_a?(String)
|
||||||
|
require_relative "vendored_uri"
|
||||||
|
uri = Bundler::URI(uri)
|
||||||
|
end
|
||||||
|
|
||||||
gem_mirrors.for(uri.to_s).uri
|
gem_mirrors.for(uri.to_s).uri
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
@ -421,7 +423,8 @@ module Bundler
|
||||||
suffix = $3
|
suffix = $3
|
||||||
end
|
end
|
||||||
uri = "#{uri}/" unless uri.end_with?("/")
|
uri = "#{uri}/" unless uri.end_with?("/")
|
||||||
uri = URI(uri)
|
require_relative "vendored_uri"
|
||||||
|
uri = Bundler::URI(uri)
|
||||||
unless uri.absolute?
|
unless uri.absolute?
|
||||||
raise ArgumentError, format("Gem sources must be absolute. You provided '%s'.", uri)
|
raise ArgumentError, format("Gem sources must be absolute. You provided '%s'.", uri)
|
||||||
end
|
end
|
||||||
|
|
|
||||||
|
|
@ -1,14 +1,13 @@
|
||||||
# frozen_string_literal: true
|
# frozen_string_literal: true
|
||||||
|
|
||||||
require_relative "../vendored_fileutils"
|
require_relative "../vendored_fileutils"
|
||||||
require "uri"
|
|
||||||
|
|
||||||
module Bundler
|
module Bundler
|
||||||
class Source
|
class Source
|
||||||
class Git < Path
|
class Git < Path
|
||||||
autoload :GitProxy, File.expand_path("git/git_proxy", __dir__)
|
autoload :GitProxy, File.expand_path("git/git_proxy", __dir__)
|
||||||
|
|
||||||
attr_reader :uri, :ref, :branch, :options, :submodules
|
attr_reader :uri, :ref, :branch, :options, :glob, :submodules
|
||||||
|
|
||||||
def initialize(options)
|
def initialize(options)
|
||||||
@options = options
|
@options = options
|
||||||
|
|
@ -48,13 +47,14 @@ module Bundler
|
||||||
end
|
end
|
||||||
|
|
||||||
def hash
|
def hash
|
||||||
[self.class, uri, ref, branch, name, version, submodules].hash
|
[self.class, uri, ref, branch, name, version, glob, submodules].hash
|
||||||
end
|
end
|
||||||
|
|
||||||
def eql?(other)
|
def eql?(other)
|
||||||
other.is_a?(Git) && uri == other.uri && ref == other.ref &&
|
other.is_a?(Git) && uri == other.uri && ref == other.ref &&
|
||||||
branch == other.branch && name == other.name &&
|
branch == other.branch && name == other.name &&
|
||||||
version == other.version && submodules == other.submodules
|
version == other.version && glob == other.glob &&
|
||||||
|
submodules == other.submodules
|
||||||
end
|
end
|
||||||
|
|
||||||
alias_method :==, :eql?
|
alias_method :==, :eql?
|
||||||
|
|
@ -284,7 +284,7 @@ module Bundler
|
||||||
if uri =~ %r{^\w+://(\w+@)?}
|
if uri =~ %r{^\w+://(\w+@)?}
|
||||||
# Downcase the domain component of the URI
|
# Downcase the domain component of the URI
|
||||||
# and strip off a trailing slash, if one is present
|
# and strip off a trailing slash, if one is present
|
||||||
input = URI.parse(uri).normalize.to_s.sub(%r{/$}, "")
|
input = Bundler::URI.parse(uri).normalize.to_s.sub(%r{/$}, "")
|
||||||
else
|
else
|
||||||
# If there is no URI scheme, assume it is an ssh/git URI
|
# If there is no URI scheme, assume it is an ssh/git URI
|
||||||
input = uri
|
input = uri
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,5 @@
|
||||||
# frozen_string_literal: true
|
# frozen_string_literal: true
|
||||||
|
|
||||||
require "open3"
|
|
||||||
require "shellwords"
|
require "shellwords"
|
||||||
|
|
||||||
module Bundler
|
module Bundler
|
||||||
|
|
@ -218,7 +217,7 @@ module Bundler
|
||||||
# Adds credentials to the URI as Fetcher#configured_uri_for does
|
# Adds credentials to the URI as Fetcher#configured_uri_for does
|
||||||
def configured_uri_for(uri)
|
def configured_uri_for(uri)
|
||||||
if /https?:/ =~ uri
|
if /https?:/ =~ uri
|
||||||
remote = URI(uri)
|
remote = Bundler::URI(uri)
|
||||||
config_auth = Bundler.settings[remote.to_s] || Bundler.settings[remote.host]
|
config_auth = Bundler.settings[remote.to_s] || Bundler.settings[remote.host]
|
||||||
remote.userinfo ||= config_auth
|
remote.userinfo ||= config_auth
|
||||||
remote.to_s
|
remote.to_s
|
||||||
|
|
@ -243,12 +242,14 @@ module Bundler
|
||||||
end
|
end
|
||||||
|
|
||||||
def capture_and_filter_stderr(uri, cmd)
|
def capture_and_filter_stderr(uri, cmd)
|
||||||
|
require "open3"
|
||||||
return_value, captured_err, status = Open3.capture3(cmd)
|
return_value, captured_err, status = Open3.capture3(cmd)
|
||||||
Bundler.ui.warn URICredentialsFilter.credential_filtered_string(captured_err, uri) if uri && !captured_err.empty?
|
Bundler.ui.warn URICredentialsFilter.credential_filtered_string(captured_err, uri) if uri && !captured_err.empty?
|
||||||
[return_value, status]
|
[return_value, status]
|
||||||
end
|
end
|
||||||
|
|
||||||
def capture_and_ignore_stderr(cmd)
|
def capture_and_ignore_stderr(cmd)
|
||||||
|
require "open3"
|
||||||
return_value, _, status = Open3.capture3(cmd)
|
return_value, _, status = Open3.capture3(cmd)
|
||||||
[return_value, status]
|
[return_value, status]
|
||||||
end
|
end
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,5 @@
|
||||||
# frozen_string_literal: true
|
# frozen_string_literal: true
|
||||||
|
|
||||||
require "uri"
|
|
||||||
require "rubygems/user_interaction"
|
require "rubygems/user_interaction"
|
||||||
|
|
||||||
module Bundler
|
module Bundler
|
||||||
|
|
@ -328,9 +327,10 @@ module Bundler
|
||||||
def normalize_uri(uri)
|
def normalize_uri(uri)
|
||||||
uri = uri.to_s
|
uri = uri.to_s
|
||||||
uri = "#{uri}/" unless uri =~ %r{/$}
|
uri = "#{uri}/" unless uri =~ %r{/$}
|
||||||
uri = URI(uri)
|
require_relative "../vendored_uri"
|
||||||
|
uri = Bundler::URI(uri)
|
||||||
raise ArgumentError, "The source must be an absolute URI. For example:\n" \
|
raise ArgumentError, "The source must be an absolute URI. For example:\n" \
|
||||||
"source 'https://rubygems.org'" if !uri.absolute? || (uri.is_a?(URI::HTTP) && uri.host.nil?)
|
"source 'https://rubygems.org'" if !uri.absolute? || (uri.is_a?(Bundler::URI::HTTP) && uri.host.nil?)
|
||||||
uri
|
uri
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -48,7 +48,7 @@ module Bundler
|
||||||
end
|
end
|
||||||
|
|
||||||
uri
|
uri
|
||||||
rescue URI::InvalidComponentError
|
rescue Bundler::URI::InvalidComponentError
|
||||||
error_message = "Please CGI escape your usernames and passwords before " \
|
error_message = "Please CGI escape your usernames and passwords before " \
|
||||||
"setting them for authentication."
|
"setting them for authentication."
|
||||||
raise HTTPError.new(error_message)
|
raise HTTPError.new(error_message)
|
||||||
|
|
|
||||||
|
|
@ -7,7 +7,11 @@ module Bundler
|
||||||
def credential_filtered_uri(uri_to_anonymize)
|
def credential_filtered_uri(uri_to_anonymize)
|
||||||
return uri_to_anonymize if uri_to_anonymize.nil?
|
return uri_to_anonymize if uri_to_anonymize.nil?
|
||||||
uri = uri_to_anonymize.dup
|
uri = uri_to_anonymize.dup
|
||||||
uri = URI(uri.to_s) unless uri.is_a?(URI)
|
if uri.is_a?(String)
|
||||||
|
require_relative "vendored_uri"
|
||||||
|
uri = Bundler::URI(uri)
|
||||||
|
end
|
||||||
|
|
||||||
if uri.userinfo
|
if uri.userinfo
|
||||||
# oauth authentication
|
# oauth authentication
|
||||||
if uri.password == "x-oauth-basic" || uri.password == "x"
|
if uri.password == "x-oauth-basic" || uri.password == "x"
|
||||||
|
|
@ -17,9 +21,9 @@ module Bundler
|
||||||
end
|
end
|
||||||
uri.password = nil
|
uri.password = nil
|
||||||
end
|
end
|
||||||
return uri if uri_to_anonymize.is_a?(URI)
|
|
||||||
return uri.to_s if uri_to_anonymize.is_a?(String)
|
return uri.to_s if uri_to_anonymize.is_a?(String)
|
||||||
rescue URI::InvalidURIError # uri is not canonical uri scheme
|
uri
|
||||||
|
rescue Bundler::URI::InvalidURIError # uri is not canonical uri scheme
|
||||||
uri
|
uri
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -6,8 +6,6 @@ rescue LoadError
|
||||||
# for make mjit-headers
|
# for make mjit-headers
|
||||||
end
|
end
|
||||||
|
|
||||||
require_relative "fileutils/version"
|
|
||||||
|
|
||||||
#
|
#
|
||||||
# = fileutils.rb
|
# = fileutils.rb
|
||||||
#
|
#
|
||||||
|
|
@ -104,6 +102,7 @@ require_relative "fileutils/version"
|
||||||
# <tt>:verbose</tt> flags to methods in Bundler::FileUtils.
|
# <tt>:verbose</tt> flags to methods in Bundler::FileUtils.
|
||||||
#
|
#
|
||||||
module Bundler::FileUtils
|
module Bundler::FileUtils
|
||||||
|
VERSION = "1.4.1"
|
||||||
|
|
||||||
def self.private_module_function(name) #:nodoc:
|
def self.private_module_function(name) #:nodoc:
|
||||||
module_function name
|
module_function name
|
||||||
|
|
@ -1300,7 +1299,8 @@ module Bundler::FileUtils
|
||||||
.reject {|n| n == '.' or n == '..' }
|
.reject {|n| n == '.' or n == '..' }
|
||||||
end
|
end
|
||||||
|
|
||||||
files.map {|n| Entry_.new(prefix(), join(rel(), n.tap{|x| x.untaint if RUBY_VERSION < "2.7" })) }
|
untaint = RUBY_VERSION < '2.7'
|
||||||
|
files.map {|n| Entry_.new(prefix(), join(rel(), untaint ? n.untaint : n)) }
|
||||||
end
|
end
|
||||||
|
|
||||||
def stat
|
def stat
|
||||||
|
|
|
||||||
|
|
@ -1,5 +1,5 @@
|
||||||
require 'net/http'
|
require 'net/http'
|
||||||
require 'uri'
|
require_relative '../../../../uri/lib/uri'
|
||||||
require 'cgi' # for escaping
|
require 'cgi' # for escaping
|
||||||
require_relative '../../../../connection_pool/lib/connection_pool'
|
require_relative '../../../../connection_pool/lib/connection_pool'
|
||||||
|
|
||||||
|
|
@ -31,7 +31,7 @@ autoload :OpenSSL, 'openssl'
|
||||||
#
|
#
|
||||||
# require 'bundler/vendor/net-http-persistent/lib/net/http/persistent'
|
# require 'bundler/vendor/net-http-persistent/lib/net/http/persistent'
|
||||||
#
|
#
|
||||||
# uri = URI 'http://example.com/awesome/web/service'
|
# uri = Bundler::URI 'http://example.com/awesome/web/service'
|
||||||
#
|
#
|
||||||
# http = Bundler::Persistent::Net::HTTP::Persistent.new name: 'my_app_name'
|
# http = Bundler::Persistent::Net::HTTP::Persistent.new name: 'my_app_name'
|
||||||
#
|
#
|
||||||
|
|
@ -48,17 +48,17 @@ autoload :OpenSSL, 'openssl'
|
||||||
# post = Net::HTTP::Post.new post_uri.path
|
# post = Net::HTTP::Post.new post_uri.path
|
||||||
# post.set_form_data 'some' => 'cool data'
|
# post.set_form_data 'some' => 'cool data'
|
||||||
#
|
#
|
||||||
# # perform the POST, the URI is always required
|
# # perform the POST, the Bundler::URI is always required
|
||||||
# response http.request post_uri, post
|
# response http.request post_uri, post
|
||||||
#
|
#
|
||||||
# Note that for GET, HEAD and other requests that do not have a body you want
|
# Note that for GET, HEAD and other requests that do not have a body you want
|
||||||
# to use URI#request_uri not URI#path. The request_uri contains the query
|
# to use Bundler::URI#request_uri not Bundler::URI#path. The request_uri contains the query
|
||||||
# params which are sent in the body for other requests.
|
# params which are sent in the body for other requests.
|
||||||
#
|
#
|
||||||
# == SSL
|
# == SSL
|
||||||
#
|
#
|
||||||
# SSL connections are automatically created depending upon the scheme of the
|
# SSL connections are automatically created depending upon the scheme of the
|
||||||
# URI. SSL connections are automatically verified against the default
|
# Bundler::URI. SSL connections are automatically verified against the default
|
||||||
# certificate store for your computer. You can override this by changing
|
# certificate store for your computer. You can override this by changing
|
||||||
# verify_mode or by specifying an alternate cert_store.
|
# verify_mode or by specifying an alternate cert_store.
|
||||||
#
|
#
|
||||||
|
|
@ -81,7 +81,7 @@ autoload :OpenSSL, 'openssl'
|
||||||
# == Proxies
|
# == Proxies
|
||||||
#
|
#
|
||||||
# A proxy can be set through #proxy= or at initialization time by providing a
|
# A proxy can be set through #proxy= or at initialization time by providing a
|
||||||
# second argument to ::new. The proxy may be the URI of the proxy server or
|
# second argument to ::new. The proxy may be the Bundler::URI of the proxy server or
|
||||||
# <code>:ENV</code> which will consult environment variables.
|
# <code>:ENV</code> which will consult environment variables.
|
||||||
#
|
#
|
||||||
# See #proxy= and #proxy_from_env for details.
|
# See #proxy= and #proxy_from_env for details.
|
||||||
|
|
@ -150,7 +150,7 @@ autoload :OpenSSL, 'openssl'
|
||||||
#
|
#
|
||||||
# require 'bundler/vendor/net-http-persistent/lib/net/http/persistent'
|
# require 'bundler/vendor/net-http-persistent/lib/net/http/persistent'
|
||||||
#
|
#
|
||||||
# uri = URI 'http://example.com/awesome/web/service'
|
# uri = Bundler::URI 'http://example.com/awesome/web/service'
|
||||||
# post_uri = uri + 'create'
|
# post_uri = uri + 'create'
|
||||||
#
|
#
|
||||||
# http = Bundler::Persistent::Net::HTTP::Persistent.new name: 'my_app_name'
|
# http = Bundler::Persistent::Net::HTTP::Persistent.new name: 'my_app_name'
|
||||||
|
|
@ -249,7 +249,7 @@ class Bundler::Persistent::Net::HTTP::Persistent
|
||||||
# NOTE: This may not work on ruby > 1.9.
|
# NOTE: This may not work on ruby > 1.9.
|
||||||
|
|
||||||
def self.detect_idle_timeout uri, max = 10
|
def self.detect_idle_timeout uri, max = 10
|
||||||
uri = URI uri unless URI::Generic === uri
|
uri = Bundler::URI uri unless Bundler::URI::Generic === uri
|
||||||
uri += '/'
|
uri += '/'
|
||||||
|
|
||||||
req = Net::HTTP::Head.new uri.request_uri
|
req = Net::HTTP::Head.new uri.request_uri
|
||||||
|
|
@ -513,13 +513,13 @@ class Bundler::Persistent::Net::HTTP::Persistent
|
||||||
# required currently, but highly recommended. Your library name should be
|
# required currently, but highly recommended. Your library name should be
|
||||||
# good enough. This parameter will be required in a future version.
|
# good enough. This parameter will be required in a future version.
|
||||||
#
|
#
|
||||||
# +proxy+ may be set to a URI::HTTP or :ENV to pick up proxy options from
|
# +proxy+ may be set to a Bundler::URI::HTTP or :ENV to pick up proxy options from
|
||||||
# the environment. See proxy_from_env for details.
|
# the environment. See proxy_from_env for details.
|
||||||
#
|
#
|
||||||
# In order to use a URI for the proxy you may need to do some extra work
|
# In order to use a Bundler::URI for the proxy you may need to do some extra work
|
||||||
# beyond URI parsing if the proxy requires a password:
|
# beyond Bundler::URI parsing if the proxy requires a password:
|
||||||
#
|
#
|
||||||
# proxy = URI 'http://proxy.example'
|
# proxy = Bundler::URI 'http://proxy.example'
|
||||||
# proxy.user = 'AzureDiamond'
|
# proxy.user = 'AzureDiamond'
|
||||||
# proxy.password = 'hunter2'
|
# proxy.password = 'hunter2'
|
||||||
#
|
#
|
||||||
|
|
@ -566,7 +566,7 @@ class Bundler::Persistent::Net::HTTP::Persistent
|
||||||
@verify_mode = nil
|
@verify_mode = nil
|
||||||
@cert_store = nil
|
@cert_store = nil
|
||||||
|
|
||||||
@generation = 0 # incremented when proxy URI changes
|
@generation = 0 # incremented when proxy Bundler::URI changes
|
||||||
|
|
||||||
if HAVE_OPENSSL then
|
if HAVE_OPENSSL then
|
||||||
@verify_mode = OpenSSL::SSL::VERIFY_PEER
|
@verify_mode = OpenSSL::SSL::VERIFY_PEER
|
||||||
|
|
@ -688,14 +688,14 @@ class Bundler::Persistent::Net::HTTP::Persistent
|
||||||
end
|
end
|
||||||
|
|
||||||
##
|
##
|
||||||
# URI::escape wrapper
|
# Bundler::URI::escape wrapper
|
||||||
|
|
||||||
def escape str
|
def escape str
|
||||||
CGI.escape str if str
|
CGI.escape str if str
|
||||||
end
|
end
|
||||||
|
|
||||||
##
|
##
|
||||||
# URI::unescape wrapper
|
# Bundler::URI::unescape wrapper
|
||||||
|
|
||||||
def unescape str
|
def unescape str
|
||||||
CGI.unescape str if str
|
CGI.unescape str if str
|
||||||
|
|
@ -803,12 +803,12 @@ class Bundler::Persistent::Net::HTTP::Persistent
|
||||||
alias key= private_key=
|
alias key= private_key=
|
||||||
|
|
||||||
##
|
##
|
||||||
# Sets the proxy server. The +proxy+ may be the URI of the proxy server,
|
# Sets the proxy server. The +proxy+ may be the Bundler::URI of the proxy server,
|
||||||
# the symbol +:ENV+ which will read the proxy from the environment or nil to
|
# the symbol +:ENV+ which will read the proxy from the environment or nil to
|
||||||
# disable use of a proxy. See #proxy_from_env for details on setting the
|
# disable use of a proxy. See #proxy_from_env for details on setting the
|
||||||
# proxy from the environment.
|
# proxy from the environment.
|
||||||
#
|
#
|
||||||
# If the proxy URI is set after requests have been made, the next request
|
# If the proxy Bundler::URI is set after requests have been made, the next request
|
||||||
# will shut-down and re-open all connections.
|
# will shut-down and re-open all connections.
|
||||||
#
|
#
|
||||||
# The +no_proxy+ query parameter can be used to specify hosts which shouldn't
|
# The +no_proxy+ query parameter can be used to specify hosts which shouldn't
|
||||||
|
|
@ -819,9 +819,9 @@ class Bundler::Persistent::Net::HTTP::Persistent
|
||||||
def proxy= proxy
|
def proxy= proxy
|
||||||
@proxy_uri = case proxy
|
@proxy_uri = case proxy
|
||||||
when :ENV then proxy_from_env
|
when :ENV then proxy_from_env
|
||||||
when URI::HTTP then proxy
|
when Bundler::URI::HTTP then proxy
|
||||||
when nil then # ignore
|
when nil then # ignore
|
||||||
else raise ArgumentError, 'proxy must be :ENV or a URI::HTTP'
|
else raise ArgumentError, 'proxy must be :ENV or a Bundler::URI::HTTP'
|
||||||
end
|
end
|
||||||
|
|
||||||
@no_proxy.clear
|
@no_proxy.clear
|
||||||
|
|
@ -846,13 +846,13 @@ class Bundler::Persistent::Net::HTTP::Persistent
|
||||||
end
|
end
|
||||||
|
|
||||||
##
|
##
|
||||||
# Creates a URI for an HTTP proxy server from ENV variables.
|
# Creates a Bundler::URI for an HTTP proxy server from ENV variables.
|
||||||
#
|
#
|
||||||
# If +HTTP_PROXY+ is set a proxy will be returned.
|
# If +HTTP_PROXY+ is set a proxy will be returned.
|
||||||
#
|
#
|
||||||
# If +HTTP_PROXY_USER+ or +HTTP_PROXY_PASS+ are set the URI is given the
|
# If +HTTP_PROXY_USER+ or +HTTP_PROXY_PASS+ are set the Bundler::URI is given the
|
||||||
# indicated user and password unless HTTP_PROXY contains either of these in
|
# indicated user and password unless HTTP_PROXY contains either of these in
|
||||||
# the URI.
|
# the Bundler::URI.
|
||||||
#
|
#
|
||||||
# The +NO_PROXY+ ENV variable can be used to specify hosts which shouldn't
|
# The +NO_PROXY+ ENV variable can be used to specify hosts which shouldn't
|
||||||
# be reached via proxy; if set it should be a comma separated list of
|
# be reached via proxy; if set it should be a comma separated list of
|
||||||
|
|
@ -868,7 +868,7 @@ class Bundler::Persistent::Net::HTTP::Persistent
|
||||||
|
|
||||||
return nil if env_proxy.nil? or env_proxy.empty?
|
return nil if env_proxy.nil? or env_proxy.empty?
|
||||||
|
|
||||||
uri = URI normalize_uri env_proxy
|
uri = Bundler::URI normalize_uri env_proxy
|
||||||
|
|
||||||
env_no_proxy = ENV['no_proxy'] || ENV['NO_PROXY']
|
env_no_proxy = ENV['no_proxy'] || ENV['NO_PROXY']
|
||||||
|
|
||||||
|
|
@ -951,7 +951,7 @@ class Bundler::Persistent::Net::HTTP::Persistent
|
||||||
retried = false
|
retried = false
|
||||||
bad_response = false
|
bad_response = false
|
||||||
|
|
||||||
uri = URI uri
|
uri = Bundler::URI uri
|
||||||
req = request_setup req || uri
|
req = request_setup req || uri
|
||||||
response = nil
|
response = nil
|
||||||
|
|
||||||
|
|
@ -1024,13 +1024,13 @@ class Bundler::Persistent::Net::HTTP::Persistent
|
||||||
end
|
end
|
||||||
|
|
||||||
##
|
##
|
||||||
# Creates a GET request if +req_or_uri+ is a URI and adds headers to the
|
# Creates a GET request if +req_or_uri+ is a Bundler::URI and adds headers to the
|
||||||
# request.
|
# request.
|
||||||
#
|
#
|
||||||
# Returns the request.
|
# Returns the request.
|
||||||
|
|
||||||
def request_setup req_or_uri # :nodoc:
|
def request_setup req_or_uri # :nodoc:
|
||||||
req = if URI === req_or_uri then
|
req = if Bundler::URI === req_or_uri then
|
||||||
Net::HTTP::Get.new req_or_uri.request_uri
|
Net::HTTP::Get.new req_or_uri.request_uri
|
||||||
else
|
else
|
||||||
req_or_uri
|
req_or_uri
|
||||||
|
|
|
||||||
7
lib/bundler/vendor/thor/lib/thor.rb
vendored
7
lib/bundler/vendor/thor/lib/thor.rb
vendored
|
|
@ -344,6 +344,13 @@ class Bundler::Thor
|
||||||
command && disable_required_check.include?(command.name.to_sym)
|
command && disable_required_check.include?(command.name.to_sym)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def deprecation_warning(message) #:nodoc:
|
||||||
|
unless ENV['THOR_SILENCE_DEPRECATION']
|
||||||
|
warn "Deprecation warning: #{message}\n" +
|
||||||
|
'You can silence deprecations warning by setting the environment variable THOR_SILENCE_DEPRECATION.'
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
protected
|
protected
|
||||||
|
|
||||||
def stop_on_unknown_option #:nodoc:
|
def stop_on_unknown_option #:nodoc:
|
||||||
|
|
|
||||||
16
lib/bundler/vendor/thor/lib/thor/actions.rb
vendored
16
lib/bundler/vendor/thor/lib/thor/actions.rb
vendored
|
|
@ -1,5 +1,3 @@
|
||||||
require "uri"
|
|
||||||
require_relative "core_ext/io_binary_read"
|
|
||||||
require_relative "actions/create_file"
|
require_relative "actions/create_file"
|
||||||
require_relative "actions/create_link"
|
require_relative "actions/create_link"
|
||||||
require_relative "actions/directory"
|
require_relative "actions/directory"
|
||||||
|
|
@ -258,13 +256,19 @@ class Bundler::Thor
|
||||||
|
|
||||||
return if options[:pretend]
|
return if options[:pretend]
|
||||||
|
|
||||||
result = config[:capture] ? `#{command}` : system(command.to_s)
|
env_splat = [config[:env]] if config[:env]
|
||||||
|
|
||||||
if config[:abort_on_failure]
|
if config[:capture]
|
||||||
success = config[:capture] ? $?.success? : result
|
require "open3"
|
||||||
abort unless success
|
result, status = Open3.capture2e(*env_splat, command.to_s)
|
||||||
|
success = status.success?
|
||||||
|
else
|
||||||
|
result = system(*env_splat, command.to_s)
|
||||||
|
success = result
|
||||||
end
|
end
|
||||||
|
|
||||||
|
abort if !success && config.fetch(:abort_on_failure, self.class.exit_on_failure?)
|
||||||
|
|
||||||
result
|
result
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
|
||||||
26
lib/bundler/vendor/thor/lib/thor/base.rb
vendored
26
lib/bundler/vendor/thor/lib/thor/base.rb
vendored
|
|
@ -153,17 +153,20 @@ class Bundler::Thor
|
||||||
|
|
||||||
# If you want to raise an error when the default value of an option does not match
|
# If you want to raise an error when the default value of an option does not match
|
||||||
# the type call check_default_type!
|
# the type call check_default_type!
|
||||||
# This is disabled by default for compatibility.
|
# This will be the default; for compatibility a deprecation warning is issued if necessary.
|
||||||
def check_default_type!
|
def check_default_type!
|
||||||
@check_default_type = true
|
@check_default_type = true
|
||||||
end
|
end
|
||||||
|
|
||||||
def check_default_type #:nodoc:
|
# If you want to use defaults that don't match the type of an option,
|
||||||
@check_default_type ||= from_superclass(:check_default_type, false)
|
# either specify `check_default_type: false` or call `allow_incompatible_default_type!`
|
||||||
|
def allow_incompatible_default_type!
|
||||||
|
@check_default_type = false
|
||||||
end
|
end
|
||||||
|
|
||||||
def check_default_type? #:nodoc:
|
def check_default_type #:nodoc:
|
||||||
!!check_default_type
|
@check_default_type = from_superclass(:check_default_type, nil) unless defined?(@check_default_type)
|
||||||
|
@check_default_type
|
||||||
end
|
end
|
||||||
|
|
||||||
# If true, option parsing is suspended as soon as an unknown option or a
|
# If true, option parsing is suspended as soon as an unknown option or a
|
||||||
|
|
@ -506,6 +509,12 @@ class Bundler::Thor
|
||||||
raise InvocationError, msg
|
raise InvocationError, msg
|
||||||
end
|
end
|
||||||
|
|
||||||
|
# A flag that makes the process exit with status 1 if any error happens.
|
||||||
|
def exit_on_failure?
|
||||||
|
Bundler::Thor.deprecation_warning "Bundler::Thor exit with status 0 on errors. To keep this behavior, you must define `exit_on_failure?` in `#{self.name}`"
|
||||||
|
false
|
||||||
|
end
|
||||||
|
|
||||||
protected
|
protected
|
||||||
|
|
||||||
# Prints the class options per group. If an option does not belong to
|
# Prints the class options per group. If an option does not belong to
|
||||||
|
|
@ -563,7 +572,7 @@ class Bundler::Thor
|
||||||
# options<Hash>:: Described in both class_option and method_option.
|
# options<Hash>:: Described in both class_option and method_option.
|
||||||
# scope<Hash>:: Options hash that is being built up
|
# scope<Hash>:: Options hash that is being built up
|
||||||
def build_option(name, options, scope) #:nodoc:
|
def build_option(name, options, scope) #:nodoc:
|
||||||
scope[name] = Bundler::Thor::Option.new(name, options.merge(:check_default_type => check_default_type?))
|
scope[name] = Bundler::Thor::Option.new(name, {:check_default_type => check_default_type}.merge!(options))
|
||||||
end
|
end
|
||||||
|
|
||||||
# Receives a hash of options, parse them and add to the scope. This is a
|
# Receives a hash of options, parse them and add to the scope. This is a
|
||||||
|
|
@ -643,11 +652,6 @@ class Bundler::Thor
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
# A flag that makes the process exit with status 1 if any error happens.
|
|
||||||
def exit_on_failure?
|
|
||||||
false
|
|
||||||
end
|
|
||||||
|
|
||||||
#
|
#
|
||||||
# The basename of the program invoking the thor class.
|
# The basename of the program invoking the thor class.
|
||||||
#
|
#
|
||||||
|
|
|
||||||
|
|
@ -82,7 +82,7 @@ class Bundler::Thor
|
||||||
end
|
end
|
||||||
|
|
||||||
def current_is_value?
|
def current_is_value?
|
||||||
peek && peek.to_s !~ /^-/
|
peek && peek.to_s !~ /^-{1,2}\S+/
|
||||||
end
|
end
|
||||||
|
|
||||||
# Runs through the argument array getting strings that contains ":" and
|
# Runs through the argument array getting strings that contains ":" and
|
||||||
|
|
|
||||||
|
|
@ -112,7 +112,7 @@ class Bundler::Thor
|
||||||
|
|
||||||
def validate!
|
def validate!
|
||||||
raise ArgumentError, "An option cannot be boolean and required." if boolean? && required?
|
raise ArgumentError, "An option cannot be boolean and required." if boolean? && required?
|
||||||
validate_default_type! if @check_default_type
|
validate_default_type!
|
||||||
end
|
end
|
||||||
|
|
||||||
def validate_default_type!
|
def validate_default_type!
|
||||||
|
|
@ -130,7 +130,18 @@ class Bundler::Thor
|
||||||
end
|
end
|
||||||
|
|
||||||
expected_type = (@repeatable && @type != :hash) ? :array : @type
|
expected_type = (@repeatable && @type != :hash) ? :array : @type
|
||||||
raise ArgumentError, "Expected #{expected_type} default value for '#{switch_name}'; got #{@default.inspect} (#{default_type})" unless default_type == expected_type
|
|
||||||
|
if default_type != expected_type
|
||||||
|
err = "Expected #{expected_type} default value for '#{switch_name}'; got #{@default.inspect} (#{default_type})"
|
||||||
|
|
||||||
|
if @check_default_type
|
||||||
|
raise ArgumentError, err
|
||||||
|
elsif @check_default_type == nil
|
||||||
|
Bundler::Thor.deprecation_warning "#{err}.\n" +
|
||||||
|
'This will be rejected in the future unless you explicitly pass the options `check_default_type: false`' +
|
||||||
|
' or call `allow_incompatible_default_type!` in your code'
|
||||||
|
end
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
def dasherized?
|
def dasherized?
|
||||||
|
|
|
||||||
17
lib/bundler/vendor/thor/lib/thor/runner.rb
vendored
17
lib/bundler/vendor/thor/lib/thor/runner.rb
vendored
|
|
@ -1,6 +1,5 @@
|
||||||
require_relative "../thor"
|
require_relative "../thor"
|
||||||
require_relative "group"
|
require_relative "group"
|
||||||
require_relative "core_ext/io_binary_read"
|
|
||||||
|
|
||||||
require "yaml"
|
require "yaml"
|
||||||
require "digest/md5"
|
require "digest/md5"
|
||||||
|
|
@ -67,7 +66,7 @@ class Bundler::Thor::Runner < Bundler::Thor #:nodoc: # rubocop:disable ClassLeng
|
||||||
raise Error, "Error opening file '#{name}'"
|
raise Error, "Error opening file '#{name}'"
|
||||||
end
|
end
|
||||||
|
|
||||||
say "Your Bundler::Thorfile contains:"
|
say "Your Thorfile contains:"
|
||||||
say contents
|
say contents
|
||||||
|
|
||||||
unless options["force"]
|
unless options["force"]
|
||||||
|
|
@ -206,7 +205,7 @@ private
|
||||||
File.open(yaml_file, "w") { |f| f.puts yaml.to_yaml }
|
File.open(yaml_file, "w") { |f| f.puts yaml.to_yaml }
|
||||||
end
|
end
|
||||||
|
|
||||||
# Load the Bundler::Thorfiles. If relevant_to is supplied, looks for specific files
|
# Load the Thorfiles. If relevant_to is supplied, looks for specific files
|
||||||
# in the thor_root instead of loading them all.
|
# in the thor_root instead of loading them all.
|
||||||
#
|
#
|
||||||
# By default, it also traverses the current path until find Bundler::Thor files, as
|
# By default, it also traverses the current path until find Bundler::Thor files, as
|
||||||
|
|
@ -219,11 +218,11 @@ private
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
# Finds Bundler::Thorfiles by traversing from your current directory down to the root
|
# Finds Thorfiles by traversing from your current directory down to the root
|
||||||
# directory of your system. If at any time we find a Bundler::Thor file, we stop.
|
# directory of your system. If at any time we find a Bundler::Thor file, we stop.
|
||||||
#
|
#
|
||||||
# We also ensure that system-wide Bundler::Thorfiles are loaded first, so local
|
# We also ensure that system-wide Thorfiles are loaded first, so local
|
||||||
# Bundler::Thorfiles can override them.
|
# Thorfiles can override them.
|
||||||
#
|
#
|
||||||
# ==== Example
|
# ==== Example
|
||||||
#
|
#
|
||||||
|
|
@ -231,7 +230,7 @@ private
|
||||||
#
|
#
|
||||||
# 1. /Users/wycats/dev/thor
|
# 1. /Users/wycats/dev/thor
|
||||||
# 2. /Users/wycats/dev
|
# 2. /Users/wycats/dev
|
||||||
# 3. /Users/wycats <-- we find a Bundler::Thorfile here, so we stop
|
# 3. /Users/wycats <-- we find a Thorfile here, so we stop
|
||||||
#
|
#
|
||||||
# Suppose we start at c:\Documents and Settings\james\dev\thor ...
|
# Suppose we start at c:\Documents and Settings\james\dev\thor ...
|
||||||
#
|
#
|
||||||
|
|
@ -239,7 +238,7 @@ private
|
||||||
# 2. c:\Documents and Settings\james\dev
|
# 2. c:\Documents and Settings\james\dev
|
||||||
# 3. c:\Documents and Settings\james
|
# 3. c:\Documents and Settings\james
|
||||||
# 4. c:\Documents and Settings
|
# 4. c:\Documents and Settings
|
||||||
# 5. c:\ <-- no Bundler::Thorfiles found!
|
# 5. c:\ <-- no Thorfiles found!
|
||||||
#
|
#
|
||||||
def thorfiles(relevant_to = nil, skip_lookup = false)
|
def thorfiles(relevant_to = nil, skip_lookup = false)
|
||||||
thorfiles = []
|
thorfiles = []
|
||||||
|
|
@ -260,7 +259,7 @@ private
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
# Load Bundler::Thorfiles relevant to the given method. If you provide "foo:bar" it
|
# Load Thorfiles relevant to the given method. If you provide "foo:bar" it
|
||||||
# will load all thor files in the thor.yaml that has "foo" e "foo:bar"
|
# will load all thor files in the thor.yaml that has "foo" e "foo:bar"
|
||||||
# namespaces registered.
|
# namespaces registered.
|
||||||
#
|
#
|
||||||
|
|
|
||||||
11
lib/bundler/vendor/thor/lib/thor/shell/basic.rb
vendored
11
lib/bundler/vendor/thor/lib/thor/shell/basic.rb
vendored
|
|
@ -451,16 +451,25 @@ class Bundler::Thor
|
||||||
|
|
||||||
def ask_filtered(statement, color, options)
|
def ask_filtered(statement, color, options)
|
||||||
answer_set = options[:limited_to]
|
answer_set = options[:limited_to]
|
||||||
|
case_insensitive = options.fetch(:case_insensitive, false)
|
||||||
correct_answer = nil
|
correct_answer = nil
|
||||||
until correct_answer
|
until correct_answer
|
||||||
answers = answer_set.join(", ")
|
answers = answer_set.join(", ")
|
||||||
answer = ask_simply("#{statement} [#{answers}]", color, options)
|
answer = ask_simply("#{statement} [#{answers}]", color, options)
|
||||||
correct_answer = answer_set.include?(answer) ? answer : nil
|
correct_answer = answer_match(answer_set, answer, case_insensitive)
|
||||||
say("Your response must be one of: [#{answers}]. Please try again.") unless correct_answer
|
say("Your response must be one of: [#{answers}]. Please try again.") unless correct_answer
|
||||||
end
|
end
|
||||||
correct_answer
|
correct_answer
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def answer_match(possibilities, answer, case_insensitive)
|
||||||
|
if case_insensitive
|
||||||
|
possibilities.detect{ |possibility| possibility.downcase == answer.downcase }
|
||||||
|
else
|
||||||
|
possibilities.detect{ |possibility| possibility == answer }
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
def merge(destination, content) #:nodoc:
|
def merge(destination, content) #:nodoc:
|
||||||
require "tempfile"
|
require "tempfile"
|
||||||
Tempfile.open([File.basename(destination), File.extname(destination)], File.dirname(destination)) do |temp|
|
Tempfile.open([File.basename(destination), File.extname(destination)], File.dirname(destination)) do |temp|
|
||||||
|
|
|
||||||
|
|
@ -51,13 +51,13 @@ class Bundler::Thor
|
||||||
def set_color(string, *colors)
|
def set_color(string, *colors)
|
||||||
if colors.all? { |color| color.is_a?(Symbol) || color.is_a?(String) }
|
if colors.all? { |color| color.is_a?(Symbol) || color.is_a?(String) }
|
||||||
html_colors = colors.map { |color| lookup_color(color) }
|
html_colors = colors.map { |color| lookup_color(color) }
|
||||||
"<span style=\"#{html_colors.join('; ')};\">#{string}</span>"
|
"<span style=\"#{html_colors.join('; ')};\">#{Bundler::Thor::Util.escape_html(string)}</span>"
|
||||||
else
|
else
|
||||||
color, bold = colors
|
color, bold = colors
|
||||||
html_color = self.class.const_get(color.to_s.upcase) if color.is_a?(Symbol)
|
html_color = self.class.const_get(color.to_s.upcase) if color.is_a?(Symbol)
|
||||||
styles = [html_color]
|
styles = [html_color]
|
||||||
styles << BOLD if bold
|
styles << BOLD if bold
|
||||||
"<span style=\"#{styles.join('; ')};\">#{string}</span>"
|
"<span style=\"#{styles.join('; ')};\">#{Bundler::Thor::Util.escape_html(string)}</span>"
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
|
||||||
18
lib/bundler/vendor/thor/lib/thor/util.rb
vendored
18
lib/bundler/vendor/thor/lib/thor/util.rb
vendored
|
|
@ -211,7 +211,7 @@ class Bundler::Thor
|
||||||
#
|
#
|
||||||
def globs_for(path)
|
def globs_for(path)
|
||||||
path = escape_globs(path)
|
path = escape_globs(path)
|
||||||
["#{path}/Bundler::Thorfile", "#{path}/*.thor", "#{path}/tasks/*.thor", "#{path}/lib/tasks/*.thor"]
|
["#{path}/Thorfile", "#{path}/*.thor", "#{path}/tasks/*.thor", "#{path}/lib/tasks/*.thor"]
|
||||||
end
|
end
|
||||||
|
|
||||||
# Return the path to the ruby interpreter taking into account multiple
|
# Return the path to the ruby interpreter taking into account multiple
|
||||||
|
|
@ -263,6 +263,22 @@ class Bundler::Thor
|
||||||
def escape_globs(path)
|
def escape_globs(path)
|
||||||
path.to_s.gsub(/[*?{}\[\]]/, '\\\\\\&')
|
path.to_s.gsub(/[*?{}\[\]]/, '\\\\\\&')
|
||||||
end
|
end
|
||||||
|
|
||||||
|
# Returns a string that has had any HTML characters escaped.
|
||||||
|
#
|
||||||
|
# ==== Examples
|
||||||
|
#
|
||||||
|
# Bundler::Thor::Util.escape_html('<div>') # => "<div>"
|
||||||
|
#
|
||||||
|
# ==== Parameters
|
||||||
|
# String
|
||||||
|
#
|
||||||
|
# ==== Returns
|
||||||
|
# String
|
||||||
|
#
|
||||||
|
def escape_html(string)
|
||||||
|
CGI.escapeHTML(string)
|
||||||
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
|
||||||
104
lib/bundler/vendor/uri/lib/uri.rb
vendored
Normal file
104
lib/bundler/vendor/uri/lib/uri.rb
vendored
Normal file
|
|
@ -0,0 +1,104 @@
|
||||||
|
# frozen_string_literal: false
|
||||||
|
# Bundler::URI is a module providing classes to handle Uniform Resource Identifiers
|
||||||
|
# (RFC2396[http://tools.ietf.org/html/rfc2396]).
|
||||||
|
#
|
||||||
|
# == Features
|
||||||
|
#
|
||||||
|
# * Uniform way of handling URIs.
|
||||||
|
# * Flexibility to introduce custom Bundler::URI schemes.
|
||||||
|
# * Flexibility to have an alternate Bundler::URI::Parser (or just different patterns
|
||||||
|
# and regexp's).
|
||||||
|
#
|
||||||
|
# == Basic example
|
||||||
|
#
|
||||||
|
# require 'bundler/vendor/uri/lib/uri'
|
||||||
|
#
|
||||||
|
# uri = Bundler::URI("http://foo.com/posts?id=30&limit=5#time=1305298413")
|
||||||
|
# #=> #<Bundler::URI::HTTP http://foo.com/posts?id=30&limit=5#time=1305298413>
|
||||||
|
#
|
||||||
|
# uri.scheme #=> "http"
|
||||||
|
# uri.host #=> "foo.com"
|
||||||
|
# uri.path #=> "/posts"
|
||||||
|
# uri.query #=> "id=30&limit=5"
|
||||||
|
# uri.fragment #=> "time=1305298413"
|
||||||
|
#
|
||||||
|
# uri.to_s #=> "http://foo.com/posts?id=30&limit=5#time=1305298413"
|
||||||
|
#
|
||||||
|
# == Adding custom URIs
|
||||||
|
#
|
||||||
|
# module Bundler::URI
|
||||||
|
# class RSYNC < Generic
|
||||||
|
# DEFAULT_PORT = 873
|
||||||
|
# end
|
||||||
|
# @@schemes['RSYNC'] = RSYNC
|
||||||
|
# end
|
||||||
|
# #=> Bundler::URI::RSYNC
|
||||||
|
#
|
||||||
|
# Bundler::URI.scheme_list
|
||||||
|
# #=> {"FILE"=>Bundler::URI::File, "FTP"=>Bundler::URI::FTP, "HTTP"=>Bundler::URI::HTTP,
|
||||||
|
# # "HTTPS"=>Bundler::URI::HTTPS, "LDAP"=>Bundler::URI::LDAP, "LDAPS"=>Bundler::URI::LDAPS,
|
||||||
|
# # "MAILTO"=>Bundler::URI::MailTo, "RSYNC"=>Bundler::URI::RSYNC}
|
||||||
|
#
|
||||||
|
# uri = Bundler::URI("rsync://rsync.foo.com")
|
||||||
|
# #=> #<Bundler::URI::RSYNC rsync://rsync.foo.com>
|
||||||
|
#
|
||||||
|
# == RFC References
|
||||||
|
#
|
||||||
|
# A good place to view an RFC spec is http://www.ietf.org/rfc.html.
|
||||||
|
#
|
||||||
|
# Here is a list of all related RFC's:
|
||||||
|
# - RFC822[http://tools.ietf.org/html/rfc822]
|
||||||
|
# - RFC1738[http://tools.ietf.org/html/rfc1738]
|
||||||
|
# - RFC2255[http://tools.ietf.org/html/rfc2255]
|
||||||
|
# - RFC2368[http://tools.ietf.org/html/rfc2368]
|
||||||
|
# - RFC2373[http://tools.ietf.org/html/rfc2373]
|
||||||
|
# - RFC2396[http://tools.ietf.org/html/rfc2396]
|
||||||
|
# - RFC2732[http://tools.ietf.org/html/rfc2732]
|
||||||
|
# - RFC3986[http://tools.ietf.org/html/rfc3986]
|
||||||
|
#
|
||||||
|
# == Class tree
|
||||||
|
#
|
||||||
|
# - Bundler::URI::Generic (in uri/generic.rb)
|
||||||
|
# - Bundler::URI::File - (in uri/file.rb)
|
||||||
|
# - Bundler::URI::FTP - (in uri/ftp.rb)
|
||||||
|
# - Bundler::URI::HTTP - (in uri/http.rb)
|
||||||
|
# - Bundler::URI::HTTPS - (in uri/https.rb)
|
||||||
|
# - Bundler::URI::LDAP - (in uri/ldap.rb)
|
||||||
|
# - Bundler::URI::LDAPS - (in uri/ldaps.rb)
|
||||||
|
# - Bundler::URI::MailTo - (in uri/mailto.rb)
|
||||||
|
# - Bundler::URI::Parser - (in uri/common.rb)
|
||||||
|
# - Bundler::URI::REGEXP - (in uri/common.rb)
|
||||||
|
# - Bundler::URI::REGEXP::PATTERN - (in uri/common.rb)
|
||||||
|
# - Bundler::URI::Util - (in uri/common.rb)
|
||||||
|
# - Bundler::URI::Escape - (in uri/common.rb)
|
||||||
|
# - Bundler::URI::Error - (in uri/common.rb)
|
||||||
|
# - Bundler::URI::InvalidURIError - (in uri/common.rb)
|
||||||
|
# - Bundler::URI::InvalidComponentError - (in uri/common.rb)
|
||||||
|
# - Bundler::URI::BadURIError - (in uri/common.rb)
|
||||||
|
#
|
||||||
|
# == Copyright Info
|
||||||
|
#
|
||||||
|
# Author:: Akira Yamada <akira@ruby-lang.org>
|
||||||
|
# Documentation::
|
||||||
|
# Akira Yamada <akira@ruby-lang.org>
|
||||||
|
# Dmitry V. Sabanin <sdmitry@lrn.ru>
|
||||||
|
# Vincent Batts <vbatts@hashbangbash.com>
|
||||||
|
# License::
|
||||||
|
# Copyright (c) 2001 akira yamada <akira@ruby-lang.org>
|
||||||
|
# You can redistribute it and/or modify it under the same term as Ruby.
|
||||||
|
# Revision:: $Id$
|
||||||
|
#
|
||||||
|
|
||||||
|
module Bundler::URI
|
||||||
|
end
|
||||||
|
|
||||||
|
require_relative 'uri/version'
|
||||||
|
require_relative 'uri/common'
|
||||||
|
require_relative 'uri/generic'
|
||||||
|
require_relative 'uri/file'
|
||||||
|
require_relative 'uri/ftp'
|
||||||
|
require_relative 'uri/http'
|
||||||
|
require_relative 'uri/https'
|
||||||
|
require_relative 'uri/ldap'
|
||||||
|
require_relative 'uri/ldaps'
|
||||||
|
require_relative 'uri/mailto'
|
||||||
744
lib/bundler/vendor/uri/lib/uri/common.rb
vendored
Normal file
744
lib/bundler/vendor/uri/lib/uri/common.rb
vendored
Normal file
|
|
@ -0,0 +1,744 @@
|
||||||
|
# frozen_string_literal: true
|
||||||
|
#--
|
||||||
|
# = uri/common.rb
|
||||||
|
#
|
||||||
|
# Author:: Akira Yamada <akira@ruby-lang.org>
|
||||||
|
# Revision:: $Id$
|
||||||
|
# License::
|
||||||
|
# You can redistribute it and/or modify it under the same term as Ruby.
|
||||||
|
#
|
||||||
|
# See Bundler::URI for general documentation
|
||||||
|
#
|
||||||
|
|
||||||
|
require_relative "rfc2396_parser"
|
||||||
|
require_relative "rfc3986_parser"
|
||||||
|
|
||||||
|
module Bundler::URI
|
||||||
|
REGEXP = RFC2396_REGEXP
|
||||||
|
Parser = RFC2396_Parser
|
||||||
|
RFC3986_PARSER = RFC3986_Parser.new
|
||||||
|
|
||||||
|
# Bundler::URI::Parser.new
|
||||||
|
DEFAULT_PARSER = Parser.new
|
||||||
|
DEFAULT_PARSER.pattern.each_pair do |sym, str|
|
||||||
|
unless REGEXP::PATTERN.const_defined?(sym)
|
||||||
|
REGEXP::PATTERN.const_set(sym, str)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
DEFAULT_PARSER.regexp.each_pair do |sym, str|
|
||||||
|
const_set(sym, str)
|
||||||
|
end
|
||||||
|
|
||||||
|
module Util # :nodoc:
|
||||||
|
def make_components_hash(klass, array_hash)
|
||||||
|
tmp = {}
|
||||||
|
if array_hash.kind_of?(Array) &&
|
||||||
|
array_hash.size == klass.component.size - 1
|
||||||
|
klass.component[1..-1].each_index do |i|
|
||||||
|
begin
|
||||||
|
tmp[klass.component[i + 1]] = array_hash[i].clone
|
||||||
|
rescue TypeError
|
||||||
|
tmp[klass.component[i + 1]] = array_hash[i]
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
elsif array_hash.kind_of?(Hash)
|
||||||
|
array_hash.each do |key, value|
|
||||||
|
begin
|
||||||
|
tmp[key] = value.clone
|
||||||
|
rescue TypeError
|
||||||
|
tmp[key] = value
|
||||||
|
end
|
||||||
|
end
|
||||||
|
else
|
||||||
|
raise ArgumentError,
|
||||||
|
"expected Array of or Hash of components of #{klass} (#{klass.component[1..-1].join(', ')})"
|
||||||
|
end
|
||||||
|
tmp[:scheme] = klass.to_s.sub(/\A.*::/, '').downcase
|
||||||
|
|
||||||
|
return tmp
|
||||||
|
end
|
||||||
|
module_function :make_components_hash
|
||||||
|
end
|
||||||
|
|
||||||
|
# Module for escaping unsafe characters with codes.
|
||||||
|
module Escape
|
||||||
|
#
|
||||||
|
# == Synopsis
|
||||||
|
#
|
||||||
|
# Bundler::URI.escape(str [, unsafe])
|
||||||
|
#
|
||||||
|
# == Args
|
||||||
|
#
|
||||||
|
# +str+::
|
||||||
|
# String to replaces in.
|
||||||
|
# +unsafe+::
|
||||||
|
# Regexp that matches all symbols that must be replaced with codes.
|
||||||
|
# By default uses <tt>UNSAFE</tt>.
|
||||||
|
# When this argument is a String, it represents a character set.
|
||||||
|
#
|
||||||
|
# == Description
|
||||||
|
#
|
||||||
|
# Escapes the string, replacing all unsafe characters with codes.
|
||||||
|
#
|
||||||
|
# This method is obsolete and should not be used. Instead, use
|
||||||
|
# CGI.escape, Bundler::URI.encode_www_form or Bundler::URI.encode_www_form_component
|
||||||
|
# depending on your specific use case.
|
||||||
|
#
|
||||||
|
# == Usage
|
||||||
|
#
|
||||||
|
# require 'bundler/vendor/uri/lib/uri'
|
||||||
|
#
|
||||||
|
# enc_uri = Bundler::URI.escape("http://example.com/?a=\11\15")
|
||||||
|
# # => "http://example.com/?a=%09%0D"
|
||||||
|
#
|
||||||
|
# Bundler::URI.unescape(enc_uri)
|
||||||
|
# # => "http://example.com/?a=\t\r"
|
||||||
|
#
|
||||||
|
# Bundler::URI.escape("@?@!", "!?")
|
||||||
|
# # => "@%3F@%21"
|
||||||
|
#
|
||||||
|
def escape(*arg)
|
||||||
|
warn "Bundler::URI.escape is obsolete", uplevel: 1
|
||||||
|
DEFAULT_PARSER.escape(*arg)
|
||||||
|
end
|
||||||
|
alias encode escape
|
||||||
|
#
|
||||||
|
# == Synopsis
|
||||||
|
#
|
||||||
|
# Bundler::URI.unescape(str)
|
||||||
|
#
|
||||||
|
# == Args
|
||||||
|
#
|
||||||
|
# +str+::
|
||||||
|
# String to unescape.
|
||||||
|
#
|
||||||
|
# == Description
|
||||||
|
#
|
||||||
|
# This method is obsolete and should not be used. Instead, use
|
||||||
|
# CGI.unescape, Bundler::URI.decode_www_form or Bundler::URI.decode_www_form_component
|
||||||
|
# depending on your specific use case.
|
||||||
|
#
|
||||||
|
# == Usage
|
||||||
|
#
|
||||||
|
# require 'bundler/vendor/uri/lib/uri'
|
||||||
|
#
|
||||||
|
# enc_uri = Bundler::URI.escape("http://example.com/?a=\11\15")
|
||||||
|
# # => "http://example.com/?a=%09%0D"
|
||||||
|
#
|
||||||
|
# Bundler::URI.unescape(enc_uri)
|
||||||
|
# # => "http://example.com/?a=\t\r"
|
||||||
|
#
|
||||||
|
def unescape(*arg)
|
||||||
|
warn "Bundler::URI.unescape is obsolete", uplevel: 1
|
||||||
|
DEFAULT_PARSER.unescape(*arg)
|
||||||
|
end
|
||||||
|
alias decode unescape
|
||||||
|
end # module Escape
|
||||||
|
|
||||||
|
extend Escape
|
||||||
|
include REGEXP
|
||||||
|
|
||||||
|
@@schemes = {}
|
||||||
|
# Returns a Hash of the defined schemes.
|
||||||
|
def self.scheme_list
|
||||||
|
@@schemes
|
||||||
|
end
|
||||||
|
|
||||||
|
#
|
||||||
|
# Base class for all Bundler::URI exceptions.
|
||||||
|
#
|
||||||
|
class Error < StandardError; end
|
||||||
|
#
|
||||||
|
# Not a Bundler::URI.
|
||||||
|
#
|
||||||
|
class InvalidURIError < Error; end
|
||||||
|
#
|
||||||
|
# Not a Bundler::URI component.
|
||||||
|
#
|
||||||
|
class InvalidComponentError < Error; end
|
||||||
|
#
|
||||||
|
# Bundler::URI is valid, bad usage is not.
|
||||||
|
#
|
||||||
|
class BadURIError < Error; end
|
||||||
|
|
||||||
|
#
|
||||||
|
# == Synopsis
|
||||||
|
#
|
||||||
|
# Bundler::URI::split(uri)
|
||||||
|
#
|
||||||
|
# == Args
|
||||||
|
#
|
||||||
|
# +uri+::
|
||||||
|
# String with Bundler::URI.
|
||||||
|
#
|
||||||
|
# == Description
|
||||||
|
#
|
||||||
|
# Splits the string on following parts and returns array with result:
|
||||||
|
#
|
||||||
|
# * Scheme
|
||||||
|
# * Userinfo
|
||||||
|
# * Host
|
||||||
|
# * Port
|
||||||
|
# * Registry
|
||||||
|
# * Path
|
||||||
|
# * Opaque
|
||||||
|
# * Query
|
||||||
|
# * Fragment
|
||||||
|
#
|
||||||
|
# == Usage
|
||||||
|
#
|
||||||
|
# require 'bundler/vendor/uri/lib/uri'
|
||||||
|
#
|
||||||
|
# Bundler::URI.split("http://www.ruby-lang.org/")
|
||||||
|
# # => ["http", nil, "www.ruby-lang.org", nil, nil, "/", nil, nil, nil]
|
||||||
|
#
|
||||||
|
def self.split(uri)
|
||||||
|
RFC3986_PARSER.split(uri)
|
||||||
|
end
|
||||||
|
|
||||||
|
#
|
||||||
|
# == Synopsis
|
||||||
|
#
|
||||||
|
# Bundler::URI::parse(uri_str)
|
||||||
|
#
|
||||||
|
# == Args
|
||||||
|
#
|
||||||
|
# +uri_str+::
|
||||||
|
# String with Bundler::URI.
|
||||||
|
#
|
||||||
|
# == Description
|
||||||
|
#
|
||||||
|
# Creates one of the Bundler::URI's subclasses instance from the string.
|
||||||
|
#
|
||||||
|
# == Raises
|
||||||
|
#
|
||||||
|
# Bundler::URI::InvalidURIError::
|
||||||
|
# Raised if Bundler::URI given is not a correct one.
|
||||||
|
#
|
||||||
|
# == Usage
|
||||||
|
#
|
||||||
|
# require 'bundler/vendor/uri/lib/uri'
|
||||||
|
#
|
||||||
|
# uri = Bundler::URI.parse("http://www.ruby-lang.org/")
|
||||||
|
# # => #<Bundler::URI::HTTP http://www.ruby-lang.org/>
|
||||||
|
# uri.scheme
|
||||||
|
# # => "http"
|
||||||
|
# uri.host
|
||||||
|
# # => "www.ruby-lang.org"
|
||||||
|
#
|
||||||
|
# It's recommended to first ::escape the provided +uri_str+ if there are any
|
||||||
|
# invalid Bundler::URI characters.
|
||||||
|
#
|
||||||
|
def self.parse(uri)
|
||||||
|
RFC3986_PARSER.parse(uri)
|
||||||
|
end
|
||||||
|
|
||||||
|
#
|
||||||
|
# == Synopsis
|
||||||
|
#
|
||||||
|
# Bundler::URI::join(str[, str, ...])
|
||||||
|
#
|
||||||
|
# == Args
|
||||||
|
#
|
||||||
|
# +str+::
|
||||||
|
# String(s) to work with, will be converted to RFC3986 URIs before merging.
|
||||||
|
#
|
||||||
|
# == Description
|
||||||
|
#
|
||||||
|
# Joins URIs.
|
||||||
|
#
|
||||||
|
# == Usage
|
||||||
|
#
|
||||||
|
# require 'bundler/vendor/uri/lib/uri'
|
||||||
|
#
|
||||||
|
# Bundler::URI.join("http://example.com/","main.rbx")
|
||||||
|
# # => #<Bundler::URI::HTTP http://example.com/main.rbx>
|
||||||
|
#
|
||||||
|
# Bundler::URI.join('http://example.com', 'foo')
|
||||||
|
# # => #<Bundler::URI::HTTP http://example.com/foo>
|
||||||
|
#
|
||||||
|
# Bundler::URI.join('http://example.com', '/foo', '/bar')
|
||||||
|
# # => #<Bundler::URI::HTTP http://example.com/bar>
|
||||||
|
#
|
||||||
|
# Bundler::URI.join('http://example.com', '/foo', 'bar')
|
||||||
|
# # => #<Bundler::URI::HTTP http://example.com/bar>
|
||||||
|
#
|
||||||
|
# Bundler::URI.join('http://example.com', '/foo/', 'bar')
|
||||||
|
# # => #<Bundler::URI::HTTP http://example.com/foo/bar>
|
||||||
|
#
|
||||||
|
def self.join(*str)
|
||||||
|
RFC3986_PARSER.join(*str)
|
||||||
|
end
|
||||||
|
|
||||||
|
#
|
||||||
|
# == Synopsis
|
||||||
|
#
|
||||||
|
# Bundler::URI::extract(str[, schemes][,&blk])
|
||||||
|
#
|
||||||
|
# == Args
|
||||||
|
#
|
||||||
|
# +str+::
|
||||||
|
# String to extract URIs from.
|
||||||
|
# +schemes+::
|
||||||
|
# Limit Bundler::URI matching to specific schemes.
|
||||||
|
#
|
||||||
|
# == Description
|
||||||
|
#
|
||||||
|
# Extracts URIs from a string. If block given, iterates through all matched URIs.
|
||||||
|
# Returns nil if block given or array with matches.
|
||||||
|
#
|
||||||
|
# == Usage
|
||||||
|
#
|
||||||
|
# require "bundler/vendor/uri/lib/uri"
|
||||||
|
#
|
||||||
|
# Bundler::URI.extract("text here http://foo.example.org/bla and here mailto:test@example.com and here also.")
|
||||||
|
# # => ["http://foo.example.com/bla", "mailto:test@example.com"]
|
||||||
|
#
|
||||||
|
def self.extract(str, schemes = nil, &block)
|
||||||
|
warn "Bundler::URI.extract is obsolete", uplevel: 1 if $VERBOSE
|
||||||
|
DEFAULT_PARSER.extract(str, schemes, &block)
|
||||||
|
end
|
||||||
|
|
||||||
|
#
|
||||||
|
# == Synopsis
|
||||||
|
#
|
||||||
|
# Bundler::URI::regexp([match_schemes])
|
||||||
|
#
|
||||||
|
# == Args
|
||||||
|
#
|
||||||
|
# +match_schemes+::
|
||||||
|
# Array of schemes. If given, resulting regexp matches to URIs
|
||||||
|
# whose scheme is one of the match_schemes.
|
||||||
|
#
|
||||||
|
# == Description
|
||||||
|
#
|
||||||
|
# Returns a Regexp object which matches to Bundler::URI-like strings.
|
||||||
|
# The Regexp object returned by this method includes arbitrary
|
||||||
|
# number of capture group (parentheses). Never rely on it's number.
|
||||||
|
#
|
||||||
|
# == Usage
|
||||||
|
#
|
||||||
|
# require 'bundler/vendor/uri/lib/uri'
|
||||||
|
#
|
||||||
|
# # extract first Bundler::URI from html_string
|
||||||
|
# html_string.slice(Bundler::URI.regexp)
|
||||||
|
#
|
||||||
|
# # remove ftp URIs
|
||||||
|
# html_string.sub(Bundler::URI.regexp(['ftp']), '')
|
||||||
|
#
|
||||||
|
# # You should not rely on the number of parentheses
|
||||||
|
# html_string.scan(Bundler::URI.regexp) do |*matches|
|
||||||
|
# p $&
|
||||||
|
# end
|
||||||
|
#
|
||||||
|
def self.regexp(schemes = nil)
|
||||||
|
warn "Bundler::URI.regexp is obsolete", uplevel: 1 if $VERBOSE
|
||||||
|
DEFAULT_PARSER.make_regexp(schemes)
|
||||||
|
end
|
||||||
|
|
||||||
|
TBLENCWWWCOMP_ = {} # :nodoc:
|
||||||
|
256.times do |i|
|
||||||
|
TBLENCWWWCOMP_[-i.chr] = -('%%%02X' % i)
|
||||||
|
end
|
||||||
|
TBLENCWWWCOMP_[' '] = '+'
|
||||||
|
TBLENCWWWCOMP_.freeze
|
||||||
|
TBLDECWWWCOMP_ = {} # :nodoc:
|
||||||
|
256.times do |i|
|
||||||
|
h, l = i>>4, i&15
|
||||||
|
TBLDECWWWCOMP_[-('%%%X%X' % [h, l])] = -i.chr
|
||||||
|
TBLDECWWWCOMP_[-('%%%x%X' % [h, l])] = -i.chr
|
||||||
|
TBLDECWWWCOMP_[-('%%%X%x' % [h, l])] = -i.chr
|
||||||
|
TBLDECWWWCOMP_[-('%%%x%x' % [h, l])] = -i.chr
|
||||||
|
end
|
||||||
|
TBLDECWWWCOMP_['+'] = ' '
|
||||||
|
TBLDECWWWCOMP_.freeze
|
||||||
|
|
||||||
|
# Encodes given +str+ to URL-encoded form data.
|
||||||
|
#
|
||||||
|
# This method doesn't convert *, -, ., 0-9, A-Z, _, a-z, but does convert SP
|
||||||
|
# (ASCII space) to + and converts others to %XX.
|
||||||
|
#
|
||||||
|
# If +enc+ is given, convert +str+ to the encoding before percent encoding.
|
||||||
|
#
|
||||||
|
# This is an implementation of
|
||||||
|
# http://www.w3.org/TR/2013/CR-html5-20130806/forms.html#url-encoded-form-data.
|
||||||
|
#
|
||||||
|
# See Bundler::URI.decode_www_form_component, Bundler::URI.encode_www_form.
|
||||||
|
def self.encode_www_form_component(str, enc=nil)
|
||||||
|
str = str.to_s.dup
|
||||||
|
if str.encoding != Encoding::ASCII_8BIT
|
||||||
|
if enc && enc != Encoding::ASCII_8BIT
|
||||||
|
str.encode!(Encoding::UTF_8, invalid: :replace, undef: :replace)
|
||||||
|
str.encode!(enc, fallback: ->(x){"&##{x.ord};"})
|
||||||
|
end
|
||||||
|
str.force_encoding(Encoding::ASCII_8BIT)
|
||||||
|
end
|
||||||
|
str.gsub!(/[^*\-.0-9A-Z_a-z]/, TBLENCWWWCOMP_)
|
||||||
|
str.force_encoding(Encoding::US_ASCII)
|
||||||
|
end
|
||||||
|
|
||||||
|
# Decodes given +str+ of URL-encoded form data.
|
||||||
|
#
|
||||||
|
# This decodes + to SP.
|
||||||
|
#
|
||||||
|
# See Bundler::URI.encode_www_form_component, Bundler::URI.decode_www_form.
|
||||||
|
def self.decode_www_form_component(str, enc=Encoding::UTF_8)
|
||||||
|
raise ArgumentError, "invalid %-encoding (#{str})" if /%(?!\h\h)/ =~ str
|
||||||
|
str.b.gsub(/\+|%\h\h/, TBLDECWWWCOMP_).force_encoding(enc)
|
||||||
|
end
|
||||||
|
|
||||||
|
# Generates URL-encoded form data from given +enum+.
|
||||||
|
#
|
||||||
|
# This generates application/x-www-form-urlencoded data defined in HTML5
|
||||||
|
# from given an Enumerable object.
|
||||||
|
#
|
||||||
|
# This internally uses Bundler::URI.encode_www_form_component(str).
|
||||||
|
#
|
||||||
|
# This method doesn't convert the encoding of given items, so convert them
|
||||||
|
# before calling this method if you want to send data as other than original
|
||||||
|
# encoding or mixed encoding data. (Strings which are encoded in an HTML5
|
||||||
|
# ASCII incompatible encoding are converted to UTF-8.)
|
||||||
|
#
|
||||||
|
# This method doesn't handle files. When you send a file, use
|
||||||
|
# multipart/form-data.
|
||||||
|
#
|
||||||
|
# This refers http://url.spec.whatwg.org/#concept-urlencoded-serializer
|
||||||
|
#
|
||||||
|
# Bundler::URI.encode_www_form([["q", "ruby"], ["lang", "en"]])
|
||||||
|
# #=> "q=ruby&lang=en"
|
||||||
|
# Bundler::URI.encode_www_form("q" => "ruby", "lang" => "en")
|
||||||
|
# #=> "q=ruby&lang=en"
|
||||||
|
# Bundler::URI.encode_www_form("q" => ["ruby", "perl"], "lang" => "en")
|
||||||
|
# #=> "q=ruby&q=perl&lang=en"
|
||||||
|
# Bundler::URI.encode_www_form([["q", "ruby"], ["q", "perl"], ["lang", "en"]])
|
||||||
|
# #=> "q=ruby&q=perl&lang=en"
|
||||||
|
#
|
||||||
|
# See Bundler::URI.encode_www_form_component, Bundler::URI.decode_www_form.
|
||||||
|
def self.encode_www_form(enum, enc=nil)
|
||||||
|
enum.map do |k,v|
|
||||||
|
if v.nil?
|
||||||
|
encode_www_form_component(k, enc)
|
||||||
|
elsif v.respond_to?(:to_ary)
|
||||||
|
v.to_ary.map do |w|
|
||||||
|
str = encode_www_form_component(k, enc)
|
||||||
|
unless w.nil?
|
||||||
|
str << '='
|
||||||
|
str << encode_www_form_component(w, enc)
|
||||||
|
end
|
||||||
|
end.join('&')
|
||||||
|
else
|
||||||
|
str = encode_www_form_component(k, enc)
|
||||||
|
str << '='
|
||||||
|
str << encode_www_form_component(v, enc)
|
||||||
|
end
|
||||||
|
end.join('&')
|
||||||
|
end
|
||||||
|
|
||||||
|
# Decodes URL-encoded form data from given +str+.
|
||||||
|
#
|
||||||
|
# This decodes application/x-www-form-urlencoded data
|
||||||
|
# and returns an array of key-value arrays.
|
||||||
|
#
|
||||||
|
# This refers http://url.spec.whatwg.org/#concept-urlencoded-parser,
|
||||||
|
# so this supports only &-separator, and doesn't support ;-separator.
|
||||||
|
#
|
||||||
|
# ary = Bundler::URI.decode_www_form("a=1&a=2&b=3")
|
||||||
|
# ary #=> [['a', '1'], ['a', '2'], ['b', '3']]
|
||||||
|
# ary.assoc('a').last #=> '1'
|
||||||
|
# ary.assoc('b').last #=> '3'
|
||||||
|
# ary.rassoc('a').last #=> '2'
|
||||||
|
# Hash[ary] #=> {"a"=>"2", "b"=>"3"}
|
||||||
|
#
|
||||||
|
# See Bundler::URI.decode_www_form_component, Bundler::URI.encode_www_form.
|
||||||
|
def self.decode_www_form(str, enc=Encoding::UTF_8, separator: '&', use__charset_: false, isindex: false)
|
||||||
|
raise ArgumentError, "the input of #{self.name}.#{__method__} must be ASCII only string" unless str.ascii_only?
|
||||||
|
ary = []
|
||||||
|
return ary if str.empty?
|
||||||
|
enc = Encoding.find(enc)
|
||||||
|
str.b.each_line(separator) do |string|
|
||||||
|
string.chomp!(separator)
|
||||||
|
key, sep, val = string.partition('=')
|
||||||
|
if isindex
|
||||||
|
if sep.empty?
|
||||||
|
val = key
|
||||||
|
key = +''
|
||||||
|
end
|
||||||
|
isindex = false
|
||||||
|
end
|
||||||
|
|
||||||
|
if use__charset_ and key == '_charset_' and e = get_encoding(val)
|
||||||
|
enc = e
|
||||||
|
use__charset_ = false
|
||||||
|
end
|
||||||
|
|
||||||
|
key.gsub!(/\+|%\h\h/, TBLDECWWWCOMP_)
|
||||||
|
if val
|
||||||
|
val.gsub!(/\+|%\h\h/, TBLDECWWWCOMP_)
|
||||||
|
else
|
||||||
|
val = +''
|
||||||
|
end
|
||||||
|
|
||||||
|
ary << [key, val]
|
||||||
|
end
|
||||||
|
ary.each do |k, v|
|
||||||
|
k.force_encoding(enc)
|
||||||
|
k.scrub!
|
||||||
|
v.force_encoding(enc)
|
||||||
|
v.scrub!
|
||||||
|
end
|
||||||
|
ary
|
||||||
|
end
|
||||||
|
|
||||||
|
private
|
||||||
|
=begin command for WEB_ENCODINGS_
|
||||||
|
curl https://encoding.spec.whatwg.org/encodings.json|
|
||||||
|
ruby -rjson -e 'H={}
|
||||||
|
h={
|
||||||
|
"shift_jis"=>"Windows-31J",
|
||||||
|
"euc-jp"=>"cp51932",
|
||||||
|
"iso-2022-jp"=>"cp50221",
|
||||||
|
"x-mac-cyrillic"=>"macCyrillic",
|
||||||
|
}
|
||||||
|
JSON($<.read).map{|x|x["encodings"]}.flatten.each{|x|
|
||||||
|
Encoding.find(n=h.fetch(n=x["name"].downcase,n))rescue next
|
||||||
|
x["labels"].each{|y|H[y]=n}
|
||||||
|
}
|
||||||
|
puts "{"
|
||||||
|
H.each{|k,v|puts %[ #{k.dump}=>#{v.dump},]}
|
||||||
|
puts "}"
|
||||||
|
'
|
||||||
|
=end
|
||||||
|
WEB_ENCODINGS_ = {
|
||||||
|
"unicode-1-1-utf-8"=>"utf-8",
|
||||||
|
"utf-8"=>"utf-8",
|
||||||
|
"utf8"=>"utf-8",
|
||||||
|
"866"=>"ibm866",
|
||||||
|
"cp866"=>"ibm866",
|
||||||
|
"csibm866"=>"ibm866",
|
||||||
|
"ibm866"=>"ibm866",
|
||||||
|
"csisolatin2"=>"iso-8859-2",
|
||||||
|
"iso-8859-2"=>"iso-8859-2",
|
||||||
|
"iso-ir-101"=>"iso-8859-2",
|
||||||
|
"iso8859-2"=>"iso-8859-2",
|
||||||
|
"iso88592"=>"iso-8859-2",
|
||||||
|
"iso_8859-2"=>"iso-8859-2",
|
||||||
|
"iso_8859-2:1987"=>"iso-8859-2",
|
||||||
|
"l2"=>"iso-8859-2",
|
||||||
|
"latin2"=>"iso-8859-2",
|
||||||
|
"csisolatin3"=>"iso-8859-3",
|
||||||
|
"iso-8859-3"=>"iso-8859-3",
|
||||||
|
"iso-ir-109"=>"iso-8859-3",
|
||||||
|
"iso8859-3"=>"iso-8859-3",
|
||||||
|
"iso88593"=>"iso-8859-3",
|
||||||
|
"iso_8859-3"=>"iso-8859-3",
|
||||||
|
"iso_8859-3:1988"=>"iso-8859-3",
|
||||||
|
"l3"=>"iso-8859-3",
|
||||||
|
"latin3"=>"iso-8859-3",
|
||||||
|
"csisolatin4"=>"iso-8859-4",
|
||||||
|
"iso-8859-4"=>"iso-8859-4",
|
||||||
|
"iso-ir-110"=>"iso-8859-4",
|
||||||
|
"iso8859-4"=>"iso-8859-4",
|
||||||
|
"iso88594"=>"iso-8859-4",
|
||||||
|
"iso_8859-4"=>"iso-8859-4",
|
||||||
|
"iso_8859-4:1988"=>"iso-8859-4",
|
||||||
|
"l4"=>"iso-8859-4",
|
||||||
|
"latin4"=>"iso-8859-4",
|
||||||
|
"csisolatincyrillic"=>"iso-8859-5",
|
||||||
|
"cyrillic"=>"iso-8859-5",
|
||||||
|
"iso-8859-5"=>"iso-8859-5",
|
||||||
|
"iso-ir-144"=>"iso-8859-5",
|
||||||
|
"iso8859-5"=>"iso-8859-5",
|
||||||
|
"iso88595"=>"iso-8859-5",
|
||||||
|
"iso_8859-5"=>"iso-8859-5",
|
||||||
|
"iso_8859-5:1988"=>"iso-8859-5",
|
||||||
|
"arabic"=>"iso-8859-6",
|
||||||
|
"asmo-708"=>"iso-8859-6",
|
||||||
|
"csiso88596e"=>"iso-8859-6",
|
||||||
|
"csiso88596i"=>"iso-8859-6",
|
||||||
|
"csisolatinarabic"=>"iso-8859-6",
|
||||||
|
"ecma-114"=>"iso-8859-6",
|
||||||
|
"iso-8859-6"=>"iso-8859-6",
|
||||||
|
"iso-8859-6-e"=>"iso-8859-6",
|
||||||
|
"iso-8859-6-i"=>"iso-8859-6",
|
||||||
|
"iso-ir-127"=>"iso-8859-6",
|
||||||
|
"iso8859-6"=>"iso-8859-6",
|
||||||
|
"iso88596"=>"iso-8859-6",
|
||||||
|
"iso_8859-6"=>"iso-8859-6",
|
||||||
|
"iso_8859-6:1987"=>"iso-8859-6",
|
||||||
|
"csisolatingreek"=>"iso-8859-7",
|
||||||
|
"ecma-118"=>"iso-8859-7",
|
||||||
|
"elot_928"=>"iso-8859-7",
|
||||||
|
"greek"=>"iso-8859-7",
|
||||||
|
"greek8"=>"iso-8859-7",
|
||||||
|
"iso-8859-7"=>"iso-8859-7",
|
||||||
|
"iso-ir-126"=>"iso-8859-7",
|
||||||
|
"iso8859-7"=>"iso-8859-7",
|
||||||
|
"iso88597"=>"iso-8859-7",
|
||||||
|
"iso_8859-7"=>"iso-8859-7",
|
||||||
|
"iso_8859-7:1987"=>"iso-8859-7",
|
||||||
|
"sun_eu_greek"=>"iso-8859-7",
|
||||||
|
"csiso88598e"=>"iso-8859-8",
|
||||||
|
"csisolatinhebrew"=>"iso-8859-8",
|
||||||
|
"hebrew"=>"iso-8859-8",
|
||||||
|
"iso-8859-8"=>"iso-8859-8",
|
||||||
|
"iso-8859-8-e"=>"iso-8859-8",
|
||||||
|
"iso-ir-138"=>"iso-8859-8",
|
||||||
|
"iso8859-8"=>"iso-8859-8",
|
||||||
|
"iso88598"=>"iso-8859-8",
|
||||||
|
"iso_8859-8"=>"iso-8859-8",
|
||||||
|
"iso_8859-8:1988"=>"iso-8859-8",
|
||||||
|
"visual"=>"iso-8859-8",
|
||||||
|
"csisolatin6"=>"iso-8859-10",
|
||||||
|
"iso-8859-10"=>"iso-8859-10",
|
||||||
|
"iso-ir-157"=>"iso-8859-10",
|
||||||
|
"iso8859-10"=>"iso-8859-10",
|
||||||
|
"iso885910"=>"iso-8859-10",
|
||||||
|
"l6"=>"iso-8859-10",
|
||||||
|
"latin6"=>"iso-8859-10",
|
||||||
|
"iso-8859-13"=>"iso-8859-13",
|
||||||
|
"iso8859-13"=>"iso-8859-13",
|
||||||
|
"iso885913"=>"iso-8859-13",
|
||||||
|
"iso-8859-14"=>"iso-8859-14",
|
||||||
|
"iso8859-14"=>"iso-8859-14",
|
||||||
|
"iso885914"=>"iso-8859-14",
|
||||||
|
"csisolatin9"=>"iso-8859-15",
|
||||||
|
"iso-8859-15"=>"iso-8859-15",
|
||||||
|
"iso8859-15"=>"iso-8859-15",
|
||||||
|
"iso885915"=>"iso-8859-15",
|
||||||
|
"iso_8859-15"=>"iso-8859-15",
|
||||||
|
"l9"=>"iso-8859-15",
|
||||||
|
"iso-8859-16"=>"iso-8859-16",
|
||||||
|
"cskoi8r"=>"koi8-r",
|
||||||
|
"koi"=>"koi8-r",
|
||||||
|
"koi8"=>"koi8-r",
|
||||||
|
"koi8-r"=>"koi8-r",
|
||||||
|
"koi8_r"=>"koi8-r",
|
||||||
|
"koi8-ru"=>"koi8-u",
|
||||||
|
"koi8-u"=>"koi8-u",
|
||||||
|
"dos-874"=>"windows-874",
|
||||||
|
"iso-8859-11"=>"windows-874",
|
||||||
|
"iso8859-11"=>"windows-874",
|
||||||
|
"iso885911"=>"windows-874",
|
||||||
|
"tis-620"=>"windows-874",
|
||||||
|
"windows-874"=>"windows-874",
|
||||||
|
"cp1250"=>"windows-1250",
|
||||||
|
"windows-1250"=>"windows-1250",
|
||||||
|
"x-cp1250"=>"windows-1250",
|
||||||
|
"cp1251"=>"windows-1251",
|
||||||
|
"windows-1251"=>"windows-1251",
|
||||||
|
"x-cp1251"=>"windows-1251",
|
||||||
|
"ansi_x3.4-1968"=>"windows-1252",
|
||||||
|
"ascii"=>"windows-1252",
|
||||||
|
"cp1252"=>"windows-1252",
|
||||||
|
"cp819"=>"windows-1252",
|
||||||
|
"csisolatin1"=>"windows-1252",
|
||||||
|
"ibm819"=>"windows-1252",
|
||||||
|
"iso-8859-1"=>"windows-1252",
|
||||||
|
"iso-ir-100"=>"windows-1252",
|
||||||
|
"iso8859-1"=>"windows-1252",
|
||||||
|
"iso88591"=>"windows-1252",
|
||||||
|
"iso_8859-1"=>"windows-1252",
|
||||||
|
"iso_8859-1:1987"=>"windows-1252",
|
||||||
|
"l1"=>"windows-1252",
|
||||||
|
"latin1"=>"windows-1252",
|
||||||
|
"us-ascii"=>"windows-1252",
|
||||||
|
"windows-1252"=>"windows-1252",
|
||||||
|
"x-cp1252"=>"windows-1252",
|
||||||
|
"cp1253"=>"windows-1253",
|
||||||
|
"windows-1253"=>"windows-1253",
|
||||||
|
"x-cp1253"=>"windows-1253",
|
||||||
|
"cp1254"=>"windows-1254",
|
||||||
|
"csisolatin5"=>"windows-1254",
|
||||||
|
"iso-8859-9"=>"windows-1254",
|
||||||
|
"iso-ir-148"=>"windows-1254",
|
||||||
|
"iso8859-9"=>"windows-1254",
|
||||||
|
"iso88599"=>"windows-1254",
|
||||||
|
"iso_8859-9"=>"windows-1254",
|
||||||
|
"iso_8859-9:1989"=>"windows-1254",
|
||||||
|
"l5"=>"windows-1254",
|
||||||
|
"latin5"=>"windows-1254",
|
||||||
|
"windows-1254"=>"windows-1254",
|
||||||
|
"x-cp1254"=>"windows-1254",
|
||||||
|
"cp1255"=>"windows-1255",
|
||||||
|
"windows-1255"=>"windows-1255",
|
||||||
|
"x-cp1255"=>"windows-1255",
|
||||||
|
"cp1256"=>"windows-1256",
|
||||||
|
"windows-1256"=>"windows-1256",
|
||||||
|
"x-cp1256"=>"windows-1256",
|
||||||
|
"cp1257"=>"windows-1257",
|
||||||
|
"windows-1257"=>"windows-1257",
|
||||||
|
"x-cp1257"=>"windows-1257",
|
||||||
|
"cp1258"=>"windows-1258",
|
||||||
|
"windows-1258"=>"windows-1258",
|
||||||
|
"x-cp1258"=>"windows-1258",
|
||||||
|
"x-mac-cyrillic"=>"macCyrillic",
|
||||||
|
"x-mac-ukrainian"=>"macCyrillic",
|
||||||
|
"chinese"=>"gbk",
|
||||||
|
"csgb2312"=>"gbk",
|
||||||
|
"csiso58gb231280"=>"gbk",
|
||||||
|
"gb2312"=>"gbk",
|
||||||
|
"gb_2312"=>"gbk",
|
||||||
|
"gb_2312-80"=>"gbk",
|
||||||
|
"gbk"=>"gbk",
|
||||||
|
"iso-ir-58"=>"gbk",
|
||||||
|
"x-gbk"=>"gbk",
|
||||||
|
"gb18030"=>"gb18030",
|
||||||
|
"big5"=>"big5",
|
||||||
|
"big5-hkscs"=>"big5",
|
||||||
|
"cn-big5"=>"big5",
|
||||||
|
"csbig5"=>"big5",
|
||||||
|
"x-x-big5"=>"big5",
|
||||||
|
"cseucpkdfmtjapanese"=>"cp51932",
|
||||||
|
"euc-jp"=>"cp51932",
|
||||||
|
"x-euc-jp"=>"cp51932",
|
||||||
|
"csiso2022jp"=>"cp50221",
|
||||||
|
"iso-2022-jp"=>"cp50221",
|
||||||
|
"csshiftjis"=>"Windows-31J",
|
||||||
|
"ms932"=>"Windows-31J",
|
||||||
|
"ms_kanji"=>"Windows-31J",
|
||||||
|
"shift-jis"=>"Windows-31J",
|
||||||
|
"shift_jis"=>"Windows-31J",
|
||||||
|
"sjis"=>"Windows-31J",
|
||||||
|
"windows-31j"=>"Windows-31J",
|
||||||
|
"x-sjis"=>"Windows-31J",
|
||||||
|
"cseuckr"=>"euc-kr",
|
||||||
|
"csksc56011987"=>"euc-kr",
|
||||||
|
"euc-kr"=>"euc-kr",
|
||||||
|
"iso-ir-149"=>"euc-kr",
|
||||||
|
"korean"=>"euc-kr",
|
||||||
|
"ks_c_5601-1987"=>"euc-kr",
|
||||||
|
"ks_c_5601-1989"=>"euc-kr",
|
||||||
|
"ksc5601"=>"euc-kr",
|
||||||
|
"ksc_5601"=>"euc-kr",
|
||||||
|
"windows-949"=>"euc-kr",
|
||||||
|
"utf-16be"=>"utf-16be",
|
||||||
|
"utf-16"=>"utf-16le",
|
||||||
|
"utf-16le"=>"utf-16le",
|
||||||
|
} # :nodoc:
|
||||||
|
|
||||||
|
# :nodoc:
|
||||||
|
# return encoding or nil
|
||||||
|
# http://encoding.spec.whatwg.org/#concept-encoding-get
|
||||||
|
def self.get_encoding(label)
|
||||||
|
Encoding.find(WEB_ENCODINGS_[label.to_str.strip.downcase]) rescue nil
|
||||||
|
end
|
||||||
|
end # module Bundler::URI
|
||||||
|
|
||||||
|
module Bundler
|
||||||
|
|
||||||
|
#
|
||||||
|
# Returns +uri+ converted to an Bundler::URI object.
|
||||||
|
#
|
||||||
|
def URI(uri)
|
||||||
|
if uri.is_a?(Bundler::URI::Generic)
|
||||||
|
uri
|
||||||
|
elsif uri = String.try_convert(uri)
|
||||||
|
Bundler::URI.parse(uri)
|
||||||
|
else
|
||||||
|
raise ArgumentError,
|
||||||
|
"bad argument (expected Bundler::URI object or Bundler::URI string)"
|
||||||
|
end
|
||||||
|
end
|
||||||
|
module_function :URI
|
||||||
|
end
|
||||||
94
lib/bundler/vendor/uri/lib/uri/file.rb
vendored
Normal file
94
lib/bundler/vendor/uri/lib/uri/file.rb
vendored
Normal file
|
|
@ -0,0 +1,94 @@
|
||||||
|
# frozen_string_literal: true
|
||||||
|
|
||||||
|
require_relative 'generic'
|
||||||
|
|
||||||
|
module Bundler::URI
|
||||||
|
|
||||||
|
#
|
||||||
|
# The "file" Bundler::URI is defined by RFC8089.
|
||||||
|
#
|
||||||
|
class File < Generic
|
||||||
|
# A Default port of nil for Bundler::URI::File.
|
||||||
|
DEFAULT_PORT = nil
|
||||||
|
|
||||||
|
#
|
||||||
|
# An Array of the available components for Bundler::URI::File.
|
||||||
|
#
|
||||||
|
COMPONENT = [
|
||||||
|
:scheme,
|
||||||
|
:host,
|
||||||
|
:path
|
||||||
|
].freeze
|
||||||
|
|
||||||
|
#
|
||||||
|
# == Description
|
||||||
|
#
|
||||||
|
# Creates a new Bundler::URI::File object from components, with syntax checking.
|
||||||
|
#
|
||||||
|
# The components accepted are +host+ and +path+.
|
||||||
|
#
|
||||||
|
# The components should be provided either as an Array, or as a Hash
|
||||||
|
# with keys formed by preceding the component names with a colon.
|
||||||
|
#
|
||||||
|
# If an Array is used, the components must be passed in the
|
||||||
|
# order <code>[host, path]</code>.
|
||||||
|
#
|
||||||
|
# Examples:
|
||||||
|
#
|
||||||
|
# require 'bundler/vendor/uri/lib/uri'
|
||||||
|
#
|
||||||
|
# uri1 = Bundler::URI::File.build(['host.example.com', '/path/file.zip'])
|
||||||
|
# uri1.to_s # => "file://host.example.com/path/file.zip"
|
||||||
|
#
|
||||||
|
# uri2 = Bundler::URI::File.build({:host => 'host.example.com',
|
||||||
|
# :path => '/ruby/src'})
|
||||||
|
# uri2.to_s # => "file://host.example.com/ruby/src"
|
||||||
|
#
|
||||||
|
def self.build(args)
|
||||||
|
tmp = Util::make_components_hash(self, args)
|
||||||
|
super(tmp)
|
||||||
|
end
|
||||||
|
|
||||||
|
# Protected setter for the host component +v+.
|
||||||
|
#
|
||||||
|
# See also Bundler::URI::Generic.host=.
|
||||||
|
#
|
||||||
|
def set_host(v)
|
||||||
|
v = "" if v.nil? || v == "localhost"
|
||||||
|
@host = v
|
||||||
|
end
|
||||||
|
|
||||||
|
# do nothing
|
||||||
|
def set_port(v)
|
||||||
|
end
|
||||||
|
|
||||||
|
# raise InvalidURIError
|
||||||
|
def check_userinfo(user)
|
||||||
|
raise Bundler::URI::InvalidURIError, "can not set userinfo for file Bundler::URI"
|
||||||
|
end
|
||||||
|
|
||||||
|
# raise InvalidURIError
|
||||||
|
def check_user(user)
|
||||||
|
raise Bundler::URI::InvalidURIError, "can not set user for file Bundler::URI"
|
||||||
|
end
|
||||||
|
|
||||||
|
# raise InvalidURIError
|
||||||
|
def check_password(user)
|
||||||
|
raise Bundler::URI::InvalidURIError, "can not set password for file Bundler::URI"
|
||||||
|
end
|
||||||
|
|
||||||
|
# do nothing
|
||||||
|
def set_userinfo(v)
|
||||||
|
end
|
||||||
|
|
||||||
|
# do nothing
|
||||||
|
def set_user(v)
|
||||||
|
end
|
||||||
|
|
||||||
|
# do nothing
|
||||||
|
def set_password(v)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
@@schemes['FILE'] = File
|
||||||
|
end
|
||||||
267
lib/bundler/vendor/uri/lib/uri/ftp.rb
vendored
Normal file
267
lib/bundler/vendor/uri/lib/uri/ftp.rb
vendored
Normal file
|
|
@ -0,0 +1,267 @@
|
||||||
|
# frozen_string_literal: false
|
||||||
|
# = uri/ftp.rb
|
||||||
|
#
|
||||||
|
# Author:: Akira Yamada <akira@ruby-lang.org>
|
||||||
|
# License:: You can redistribute it and/or modify it under the same term as Ruby.
|
||||||
|
# Revision:: $Id$
|
||||||
|
#
|
||||||
|
# See Bundler::URI for general documentation
|
||||||
|
#
|
||||||
|
|
||||||
|
require_relative 'generic'
|
||||||
|
|
||||||
|
module Bundler::URI
|
||||||
|
|
||||||
|
#
|
||||||
|
# FTP Bundler::URI syntax is defined by RFC1738 section 3.2.
|
||||||
|
#
|
||||||
|
# This class will be redesigned because of difference of implementations;
|
||||||
|
# the structure of its path. draft-hoffman-ftp-uri-04 is a draft but it
|
||||||
|
# is a good summary about the de facto spec.
|
||||||
|
# http://tools.ietf.org/html/draft-hoffman-ftp-uri-04
|
||||||
|
#
|
||||||
|
class FTP < Generic
|
||||||
|
# A Default port of 21 for Bundler::URI::FTP.
|
||||||
|
DEFAULT_PORT = 21
|
||||||
|
|
||||||
|
#
|
||||||
|
# An Array of the available components for Bundler::URI::FTP.
|
||||||
|
#
|
||||||
|
COMPONENT = [
|
||||||
|
:scheme,
|
||||||
|
:userinfo, :host, :port,
|
||||||
|
:path, :typecode
|
||||||
|
].freeze
|
||||||
|
|
||||||
|
#
|
||||||
|
# Typecode is "a", "i", or "d".
|
||||||
|
#
|
||||||
|
# * "a" indicates a text file (the FTP command was ASCII)
|
||||||
|
# * "i" indicates a binary file (FTP command IMAGE)
|
||||||
|
# * "d" indicates the contents of a directory should be displayed
|
||||||
|
#
|
||||||
|
TYPECODE = ['a', 'i', 'd'].freeze
|
||||||
|
|
||||||
|
# Typecode prefix ";type=".
|
||||||
|
TYPECODE_PREFIX = ';type='.freeze
|
||||||
|
|
||||||
|
def self.new2(user, password, host, port, path,
|
||||||
|
typecode = nil, arg_check = true) # :nodoc:
|
||||||
|
# Do not use this method! Not tested. [Bug #7301]
|
||||||
|
# This methods remains just for compatibility,
|
||||||
|
# Keep it undocumented until the active maintainer is assigned.
|
||||||
|
typecode = nil if typecode.size == 0
|
||||||
|
if typecode && !TYPECODE.include?(typecode)
|
||||||
|
raise ArgumentError,
|
||||||
|
"bad typecode is specified: #{typecode}"
|
||||||
|
end
|
||||||
|
|
||||||
|
# do escape
|
||||||
|
|
||||||
|
self.new('ftp',
|
||||||
|
[user, password],
|
||||||
|
host, port, nil,
|
||||||
|
typecode ? path + TYPECODE_PREFIX + typecode : path,
|
||||||
|
nil, nil, nil, arg_check)
|
||||||
|
end
|
||||||
|
|
||||||
|
#
|
||||||
|
# == Description
|
||||||
|
#
|
||||||
|
# Creates a new Bundler::URI::FTP object from components, with syntax checking.
|
||||||
|
#
|
||||||
|
# The components accepted are +userinfo+, +host+, +port+, +path+, and
|
||||||
|
# +typecode+.
|
||||||
|
#
|
||||||
|
# The components should be provided either as an Array, or as a Hash
|
||||||
|
# with keys formed by preceding the component names with a colon.
|
||||||
|
#
|
||||||
|
# If an Array is used, the components must be passed in the
|
||||||
|
# order <code>[userinfo, host, port, path, typecode]</code>.
|
||||||
|
#
|
||||||
|
# If the path supplied is absolute, it will be escaped in order to
|
||||||
|
# make it absolute in the Bundler::URI.
|
||||||
|
#
|
||||||
|
# Examples:
|
||||||
|
#
|
||||||
|
# require 'bundler/vendor/uri/lib/uri'
|
||||||
|
#
|
||||||
|
# uri1 = Bundler::URI::FTP.build(['user:password', 'ftp.example.com', nil,
|
||||||
|
# '/path/file.zip', 'i'])
|
||||||
|
# uri1.to_s # => "ftp://user:password@ftp.example.com/%2Fpath/file.zip;type=i"
|
||||||
|
#
|
||||||
|
# uri2 = Bundler::URI::FTP.build({:host => 'ftp.example.com',
|
||||||
|
# :path => 'ruby/src'})
|
||||||
|
# uri2.to_s # => "ftp://ftp.example.com/ruby/src"
|
||||||
|
#
|
||||||
|
def self.build(args)
|
||||||
|
|
||||||
|
# Fix the incoming path to be generic URL syntax
|
||||||
|
# FTP path -> URL path
|
||||||
|
# foo/bar /foo/bar
|
||||||
|
# /foo/bar /%2Ffoo/bar
|
||||||
|
#
|
||||||
|
if args.kind_of?(Array)
|
||||||
|
args[3] = '/' + args[3].sub(/^\//, '%2F')
|
||||||
|
else
|
||||||
|
args[:path] = '/' + args[:path].sub(/^\//, '%2F')
|
||||||
|
end
|
||||||
|
|
||||||
|
tmp = Util::make_components_hash(self, args)
|
||||||
|
|
||||||
|
if tmp[:typecode]
|
||||||
|
if tmp[:typecode].size == 1
|
||||||
|
tmp[:typecode] = TYPECODE_PREFIX + tmp[:typecode]
|
||||||
|
end
|
||||||
|
tmp[:path] << tmp[:typecode]
|
||||||
|
end
|
||||||
|
|
||||||
|
return super(tmp)
|
||||||
|
end
|
||||||
|
|
||||||
|
#
|
||||||
|
# == Description
|
||||||
|
#
|
||||||
|
# Creates a new Bundler::URI::FTP object from generic URL components with no
|
||||||
|
# syntax checking.
|
||||||
|
#
|
||||||
|
# Unlike build(), this method does not escape the path component as
|
||||||
|
# required by RFC1738; instead it is treated as per RFC2396.
|
||||||
|
#
|
||||||
|
# Arguments are +scheme+, +userinfo+, +host+, +port+, +registry+, +path+,
|
||||||
|
# +opaque+, +query+, and +fragment+, in that order.
|
||||||
|
#
|
||||||
|
def initialize(scheme,
|
||||||
|
userinfo, host, port, registry,
|
||||||
|
path, opaque,
|
||||||
|
query,
|
||||||
|
fragment,
|
||||||
|
parser = nil,
|
||||||
|
arg_check = false)
|
||||||
|
raise InvalidURIError unless path
|
||||||
|
path = path.sub(/^\//,'')
|
||||||
|
path.sub!(/^%2F/,'/')
|
||||||
|
super(scheme, userinfo, host, port, registry, path, opaque,
|
||||||
|
query, fragment, parser, arg_check)
|
||||||
|
@typecode = nil
|
||||||
|
if tmp = @path.index(TYPECODE_PREFIX)
|
||||||
|
typecode = @path[tmp + TYPECODE_PREFIX.size..-1]
|
||||||
|
@path = @path[0..tmp - 1]
|
||||||
|
|
||||||
|
if arg_check
|
||||||
|
self.typecode = typecode
|
||||||
|
else
|
||||||
|
self.set_typecode(typecode)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
# typecode accessor.
|
||||||
|
#
|
||||||
|
# See Bundler::URI::FTP::COMPONENT.
|
||||||
|
attr_reader :typecode
|
||||||
|
|
||||||
|
# Validates typecode +v+,
|
||||||
|
# returns +true+ or +false+.
|
||||||
|
#
|
||||||
|
def check_typecode(v)
|
||||||
|
if TYPECODE.include?(v)
|
||||||
|
return true
|
||||||
|
else
|
||||||
|
raise InvalidComponentError,
|
||||||
|
"bad typecode(expected #{TYPECODE.join(', ')}): #{v}"
|
||||||
|
end
|
||||||
|
end
|
||||||
|
private :check_typecode
|
||||||
|
|
||||||
|
# Private setter for the typecode +v+.
|
||||||
|
#
|
||||||
|
# See also Bundler::URI::FTP.typecode=.
|
||||||
|
#
|
||||||
|
def set_typecode(v)
|
||||||
|
@typecode = v
|
||||||
|
end
|
||||||
|
protected :set_typecode
|
||||||
|
|
||||||
|
#
|
||||||
|
# == Args
|
||||||
|
#
|
||||||
|
# +v+::
|
||||||
|
# String
|
||||||
|
#
|
||||||
|
# == Description
|
||||||
|
#
|
||||||
|
# Public setter for the typecode +v+
|
||||||
|
# (with validation).
|
||||||
|
#
|
||||||
|
# See also Bundler::URI::FTP.check_typecode.
|
||||||
|
#
|
||||||
|
# == Usage
|
||||||
|
#
|
||||||
|
# require 'bundler/vendor/uri/lib/uri'
|
||||||
|
#
|
||||||
|
# uri = Bundler::URI.parse("ftp://john@ftp.example.com/my_file.img")
|
||||||
|
# #=> #<Bundler::URI::FTP ftp://john@ftp.example.com/my_file.img>
|
||||||
|
# uri.typecode = "i"
|
||||||
|
# uri
|
||||||
|
# #=> #<Bundler::URI::FTP ftp://john@ftp.example.com/my_file.img;type=i>
|
||||||
|
#
|
||||||
|
def typecode=(typecode)
|
||||||
|
check_typecode(typecode)
|
||||||
|
set_typecode(typecode)
|
||||||
|
typecode
|
||||||
|
end
|
||||||
|
|
||||||
|
def merge(oth) # :nodoc:
|
||||||
|
tmp = super(oth)
|
||||||
|
if self != tmp
|
||||||
|
tmp.set_typecode(oth.typecode)
|
||||||
|
end
|
||||||
|
|
||||||
|
return tmp
|
||||||
|
end
|
||||||
|
|
||||||
|
# Returns the path from an FTP Bundler::URI.
|
||||||
|
#
|
||||||
|
# RFC 1738 specifically states that the path for an FTP Bundler::URI does not
|
||||||
|
# include the / which separates the Bundler::URI path from the Bundler::URI host. Example:
|
||||||
|
#
|
||||||
|
# <code>ftp://ftp.example.com/pub/ruby</code>
|
||||||
|
#
|
||||||
|
# The above Bundler::URI indicates that the client should connect to
|
||||||
|
# ftp.example.com then cd to pub/ruby from the initial login directory.
|
||||||
|
#
|
||||||
|
# If you want to cd to an absolute directory, you must include an
|
||||||
|
# escaped / (%2F) in the path. Example:
|
||||||
|
#
|
||||||
|
# <code>ftp://ftp.example.com/%2Fpub/ruby</code>
|
||||||
|
#
|
||||||
|
# This method will then return "/pub/ruby".
|
||||||
|
#
|
||||||
|
def path
|
||||||
|
return @path.sub(/^\//,'').sub(/^%2F/,'/')
|
||||||
|
end
|
||||||
|
|
||||||
|
# Private setter for the path of the Bundler::URI::FTP.
|
||||||
|
def set_path(v)
|
||||||
|
super("/" + v.sub(/^\//, "%2F"))
|
||||||
|
end
|
||||||
|
protected :set_path
|
||||||
|
|
||||||
|
# Returns a String representation of the Bundler::URI::FTP.
|
||||||
|
def to_s
|
||||||
|
save_path = nil
|
||||||
|
if @typecode
|
||||||
|
save_path = @path
|
||||||
|
@path = @path + TYPECODE_PREFIX + @typecode
|
||||||
|
end
|
||||||
|
str = super
|
||||||
|
if @typecode
|
||||||
|
@path = save_path
|
||||||
|
end
|
||||||
|
|
||||||
|
return str
|
||||||
|
end
|
||||||
|
end
|
||||||
|
@@schemes['FTP'] = FTP
|
||||||
|
end
|
||||||
1568
lib/bundler/vendor/uri/lib/uri/generic.rb
vendored
Normal file
1568
lib/bundler/vendor/uri/lib/uri/generic.rb
vendored
Normal file
File diff suppressed because it is too large
Load diff
88
lib/bundler/vendor/uri/lib/uri/http.rb
vendored
Normal file
88
lib/bundler/vendor/uri/lib/uri/http.rb
vendored
Normal file
|
|
@ -0,0 +1,88 @@
|
||||||
|
# frozen_string_literal: false
|
||||||
|
# = uri/http.rb
|
||||||
|
#
|
||||||
|
# Author:: Akira Yamada <akira@ruby-lang.org>
|
||||||
|
# License:: You can redistribute it and/or modify it under the same term as Ruby.
|
||||||
|
# Revision:: $Id$
|
||||||
|
#
|
||||||
|
# See Bundler::URI for general documentation
|
||||||
|
#
|
||||||
|
|
||||||
|
require_relative 'generic'
|
||||||
|
|
||||||
|
module Bundler::URI
|
||||||
|
|
||||||
|
#
|
||||||
|
# The syntax of HTTP URIs is defined in RFC1738 section 3.3.
|
||||||
|
#
|
||||||
|
# Note that the Ruby Bundler::URI library allows HTTP URLs containing usernames and
|
||||||
|
# passwords. This is not legal as per the RFC, but used to be
|
||||||
|
# supported in Internet Explorer 5 and 6, before the MS04-004 security
|
||||||
|
# update. See <URL:http://support.microsoft.com/kb/834489>.
|
||||||
|
#
|
||||||
|
class HTTP < Generic
|
||||||
|
# A Default port of 80 for Bundler::URI::HTTP.
|
||||||
|
DEFAULT_PORT = 80
|
||||||
|
|
||||||
|
# An Array of the available components for Bundler::URI::HTTP.
|
||||||
|
COMPONENT = %i[
|
||||||
|
scheme
|
||||||
|
userinfo host port
|
||||||
|
path
|
||||||
|
query
|
||||||
|
fragment
|
||||||
|
].freeze
|
||||||
|
|
||||||
|
#
|
||||||
|
# == Description
|
||||||
|
#
|
||||||
|
# Creates a new Bundler::URI::HTTP object from components, with syntax checking.
|
||||||
|
#
|
||||||
|
# The components accepted are userinfo, host, port, path, query, and
|
||||||
|
# fragment.
|
||||||
|
#
|
||||||
|
# The components should be provided either as an Array, or as a Hash
|
||||||
|
# with keys formed by preceding the component names with a colon.
|
||||||
|
#
|
||||||
|
# If an Array is used, the components must be passed in the
|
||||||
|
# order <code>[userinfo, host, port, path, query, fragment]</code>.
|
||||||
|
#
|
||||||
|
# Example:
|
||||||
|
#
|
||||||
|
# uri = Bundler::URI::HTTP.build(host: 'www.example.com', path: '/foo/bar')
|
||||||
|
#
|
||||||
|
# uri = Bundler::URI::HTTP.build([nil, "www.example.com", nil, "/path",
|
||||||
|
# "query", 'fragment'])
|
||||||
|
#
|
||||||
|
# Currently, if passed userinfo components this method generates
|
||||||
|
# invalid HTTP URIs as per RFC 1738.
|
||||||
|
#
|
||||||
|
def self.build(args)
|
||||||
|
tmp = Util.make_components_hash(self, args)
|
||||||
|
super(tmp)
|
||||||
|
end
|
||||||
|
|
||||||
|
#
|
||||||
|
# == Description
|
||||||
|
#
|
||||||
|
# Returns the full path for an HTTP request, as required by Net::HTTP::Get.
|
||||||
|
#
|
||||||
|
# If the Bundler::URI contains a query, the full path is Bundler::URI#path + '?' + Bundler::URI#query.
|
||||||
|
# Otherwise, the path is simply Bundler::URI#path.
|
||||||
|
#
|
||||||
|
# Example:
|
||||||
|
#
|
||||||
|
# uri = Bundler::URI::HTTP.build(path: '/foo/bar', query: 'test=true')
|
||||||
|
# uri.request_uri # => "/foo/bar?test=true"
|
||||||
|
#
|
||||||
|
def request_uri
|
||||||
|
return unless @path
|
||||||
|
|
||||||
|
url = @query ? "#@path?#@query" : @path.dup
|
||||||
|
url.start_with?(?/.freeze) ? url : ?/ + url
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
@@schemes['HTTP'] = HTTP
|
||||||
|
|
||||||
|
end
|
||||||
23
lib/bundler/vendor/uri/lib/uri/https.rb
vendored
Normal file
23
lib/bundler/vendor/uri/lib/uri/https.rb
vendored
Normal file
|
|
@ -0,0 +1,23 @@
|
||||||
|
# frozen_string_literal: false
|
||||||
|
# = uri/https.rb
|
||||||
|
#
|
||||||
|
# Author:: Akira Yamada <akira@ruby-lang.org>
|
||||||
|
# License:: You can redistribute it and/or modify it under the same term as Ruby.
|
||||||
|
# Revision:: $Id$
|
||||||
|
#
|
||||||
|
# See Bundler::URI for general documentation
|
||||||
|
#
|
||||||
|
|
||||||
|
require_relative 'http'
|
||||||
|
|
||||||
|
module Bundler::URI
|
||||||
|
|
||||||
|
# The default port for HTTPS URIs is 443, and the scheme is 'https:' rather
|
||||||
|
# than 'http:'. Other than that, HTTPS URIs are identical to HTTP URIs;
|
||||||
|
# see Bundler::URI::HTTP.
|
||||||
|
class HTTPS < HTTP
|
||||||
|
# A Default port of 443 for Bundler::URI::HTTPS
|
||||||
|
DEFAULT_PORT = 443
|
||||||
|
end
|
||||||
|
@@schemes['HTTPS'] = HTTPS
|
||||||
|
end
|
||||||
261
lib/bundler/vendor/uri/lib/uri/ldap.rb
vendored
Normal file
261
lib/bundler/vendor/uri/lib/uri/ldap.rb
vendored
Normal file
|
|
@ -0,0 +1,261 @@
|
||||||
|
# frozen_string_literal: false
|
||||||
|
# = uri/ldap.rb
|
||||||
|
#
|
||||||
|
# Author::
|
||||||
|
# Takaaki Tateishi <ttate@jaist.ac.jp>
|
||||||
|
# Akira Yamada <akira@ruby-lang.org>
|
||||||
|
# License::
|
||||||
|
# Bundler::URI::LDAP is copyrighted free software by Takaaki Tateishi and Akira Yamada.
|
||||||
|
# You can redistribute it and/or modify it under the same term as Ruby.
|
||||||
|
# Revision:: $Id$
|
||||||
|
#
|
||||||
|
# See Bundler::URI for general documentation
|
||||||
|
#
|
||||||
|
|
||||||
|
require_relative 'generic'
|
||||||
|
|
||||||
|
module Bundler::URI
|
||||||
|
|
||||||
|
#
|
||||||
|
# LDAP Bundler::URI SCHEMA (described in RFC2255).
|
||||||
|
#--
|
||||||
|
# ldap://<host>/<dn>[?<attrs>[?<scope>[?<filter>[?<extensions>]]]]
|
||||||
|
#++
|
||||||
|
class LDAP < Generic
|
||||||
|
|
||||||
|
# A Default port of 389 for Bundler::URI::LDAP.
|
||||||
|
DEFAULT_PORT = 389
|
||||||
|
|
||||||
|
# An Array of the available components for Bundler::URI::LDAP.
|
||||||
|
COMPONENT = [
|
||||||
|
:scheme,
|
||||||
|
:host, :port,
|
||||||
|
:dn,
|
||||||
|
:attributes,
|
||||||
|
:scope,
|
||||||
|
:filter,
|
||||||
|
:extensions,
|
||||||
|
].freeze
|
||||||
|
|
||||||
|
# Scopes available for the starting point.
|
||||||
|
#
|
||||||
|
# * SCOPE_BASE - the Base DN
|
||||||
|
# * SCOPE_ONE - one level under the Base DN, not including the base DN and
|
||||||
|
# not including any entries under this
|
||||||
|
# * SCOPE_SUB - subtrees, all entries at all levels
|
||||||
|
#
|
||||||
|
SCOPE = [
|
||||||
|
SCOPE_ONE = 'one',
|
||||||
|
SCOPE_SUB = 'sub',
|
||||||
|
SCOPE_BASE = 'base',
|
||||||
|
].freeze
|
||||||
|
|
||||||
|
#
|
||||||
|
# == Description
|
||||||
|
#
|
||||||
|
# Creates a new Bundler::URI::LDAP object from components, with syntax checking.
|
||||||
|
#
|
||||||
|
# The components accepted are host, port, dn, attributes,
|
||||||
|
# scope, filter, and extensions.
|
||||||
|
#
|
||||||
|
# The components should be provided either as an Array, or as a Hash
|
||||||
|
# with keys formed by preceding the component names with a colon.
|
||||||
|
#
|
||||||
|
# If an Array is used, the components must be passed in the
|
||||||
|
# order <code>[host, port, dn, attributes, scope, filter, extensions]</code>.
|
||||||
|
#
|
||||||
|
# Example:
|
||||||
|
#
|
||||||
|
# uri = Bundler::URI::LDAP.build({:host => 'ldap.example.com',
|
||||||
|
# :dn => '/dc=example'})
|
||||||
|
#
|
||||||
|
# uri = Bundler::URI::LDAP.build(["ldap.example.com", nil,
|
||||||
|
# "/dc=example;dc=com", "query", nil, nil, nil])
|
||||||
|
#
|
||||||
|
def self.build(args)
|
||||||
|
tmp = Util::make_components_hash(self, args)
|
||||||
|
|
||||||
|
if tmp[:dn]
|
||||||
|
tmp[:path] = tmp[:dn]
|
||||||
|
end
|
||||||
|
|
||||||
|
query = []
|
||||||
|
[:extensions, :filter, :scope, :attributes].collect do |x|
|
||||||
|
next if !tmp[x] && query.size == 0
|
||||||
|
query.unshift(tmp[x])
|
||||||
|
end
|
||||||
|
|
||||||
|
tmp[:query] = query.join('?')
|
||||||
|
|
||||||
|
return super(tmp)
|
||||||
|
end
|
||||||
|
|
||||||
|
#
|
||||||
|
# == Description
|
||||||
|
#
|
||||||
|
# Creates a new Bundler::URI::LDAP object from generic Bundler::URI components as per
|
||||||
|
# RFC 2396. No LDAP-specific syntax checking is performed.
|
||||||
|
#
|
||||||
|
# Arguments are +scheme+, +userinfo+, +host+, +port+, +registry+, +path+,
|
||||||
|
# +opaque+, +query+, and +fragment+, in that order.
|
||||||
|
#
|
||||||
|
# Example:
|
||||||
|
#
|
||||||
|
# uri = Bundler::URI::LDAP.new("ldap", nil, "ldap.example.com", nil, nil,
|
||||||
|
# "/dc=example;dc=com", nil, "query", nil)
|
||||||
|
#
|
||||||
|
# See also Bundler::URI::Generic.new.
|
||||||
|
#
|
||||||
|
def initialize(*arg)
|
||||||
|
super(*arg)
|
||||||
|
|
||||||
|
if @fragment
|
||||||
|
raise InvalidURIError, 'bad LDAP URL'
|
||||||
|
end
|
||||||
|
|
||||||
|
parse_dn
|
||||||
|
parse_query
|
||||||
|
end
|
||||||
|
|
||||||
|
# Private method to cleanup +dn+ from using the +path+ component attribute.
|
||||||
|
def parse_dn
|
||||||
|
@dn = @path[1..-1]
|
||||||
|
end
|
||||||
|
private :parse_dn
|
||||||
|
|
||||||
|
# Private method to cleanup +attributes+, +scope+, +filter+, and +extensions+
|
||||||
|
# from using the +query+ component attribute.
|
||||||
|
def parse_query
|
||||||
|
@attributes = nil
|
||||||
|
@scope = nil
|
||||||
|
@filter = nil
|
||||||
|
@extensions = nil
|
||||||
|
|
||||||
|
if @query
|
||||||
|
attrs, scope, filter, extensions = @query.split('?')
|
||||||
|
|
||||||
|
@attributes = attrs if attrs && attrs.size > 0
|
||||||
|
@scope = scope if scope && scope.size > 0
|
||||||
|
@filter = filter if filter && filter.size > 0
|
||||||
|
@extensions = extensions if extensions && extensions.size > 0
|
||||||
|
end
|
||||||
|
end
|
||||||
|
private :parse_query
|
||||||
|
|
||||||
|
# Private method to assemble +query+ from +attributes+, +scope+, +filter+, and +extensions+.
|
||||||
|
def build_path_query
|
||||||
|
@path = '/' + @dn
|
||||||
|
|
||||||
|
query = []
|
||||||
|
[@extensions, @filter, @scope, @attributes].each do |x|
|
||||||
|
next if !x && query.size == 0
|
||||||
|
query.unshift(x)
|
||||||
|
end
|
||||||
|
@query = query.join('?')
|
||||||
|
end
|
||||||
|
private :build_path_query
|
||||||
|
|
||||||
|
# Returns dn.
|
||||||
|
def dn
|
||||||
|
@dn
|
||||||
|
end
|
||||||
|
|
||||||
|
# Private setter for dn +val+.
|
||||||
|
def set_dn(val)
|
||||||
|
@dn = val
|
||||||
|
build_path_query
|
||||||
|
@dn
|
||||||
|
end
|
||||||
|
protected :set_dn
|
||||||
|
|
||||||
|
# Setter for dn +val+.
|
||||||
|
def dn=(val)
|
||||||
|
set_dn(val)
|
||||||
|
val
|
||||||
|
end
|
||||||
|
|
||||||
|
# Returns attributes.
|
||||||
|
def attributes
|
||||||
|
@attributes
|
||||||
|
end
|
||||||
|
|
||||||
|
# Private setter for attributes +val+.
|
||||||
|
def set_attributes(val)
|
||||||
|
@attributes = val
|
||||||
|
build_path_query
|
||||||
|
@attributes
|
||||||
|
end
|
||||||
|
protected :set_attributes
|
||||||
|
|
||||||
|
# Setter for attributes +val+.
|
||||||
|
def attributes=(val)
|
||||||
|
set_attributes(val)
|
||||||
|
val
|
||||||
|
end
|
||||||
|
|
||||||
|
# Returns scope.
|
||||||
|
def scope
|
||||||
|
@scope
|
||||||
|
end
|
||||||
|
|
||||||
|
# Private setter for scope +val+.
|
||||||
|
def set_scope(val)
|
||||||
|
@scope = val
|
||||||
|
build_path_query
|
||||||
|
@scope
|
||||||
|
end
|
||||||
|
protected :set_scope
|
||||||
|
|
||||||
|
# Setter for scope +val+.
|
||||||
|
def scope=(val)
|
||||||
|
set_scope(val)
|
||||||
|
val
|
||||||
|
end
|
||||||
|
|
||||||
|
# Returns filter.
|
||||||
|
def filter
|
||||||
|
@filter
|
||||||
|
end
|
||||||
|
|
||||||
|
# Private setter for filter +val+.
|
||||||
|
def set_filter(val)
|
||||||
|
@filter = val
|
||||||
|
build_path_query
|
||||||
|
@filter
|
||||||
|
end
|
||||||
|
protected :set_filter
|
||||||
|
|
||||||
|
# Setter for filter +val+.
|
||||||
|
def filter=(val)
|
||||||
|
set_filter(val)
|
||||||
|
val
|
||||||
|
end
|
||||||
|
|
||||||
|
# Returns extensions.
|
||||||
|
def extensions
|
||||||
|
@extensions
|
||||||
|
end
|
||||||
|
|
||||||
|
# Private setter for extensions +val+.
|
||||||
|
def set_extensions(val)
|
||||||
|
@extensions = val
|
||||||
|
build_path_query
|
||||||
|
@extensions
|
||||||
|
end
|
||||||
|
protected :set_extensions
|
||||||
|
|
||||||
|
# Setter for extensions +val+.
|
||||||
|
def extensions=(val)
|
||||||
|
set_extensions(val)
|
||||||
|
val
|
||||||
|
end
|
||||||
|
|
||||||
|
# Checks if Bundler::URI has a path.
|
||||||
|
# For Bundler::URI::LDAP this will return +false+.
|
||||||
|
def hierarchical?
|
||||||
|
false
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
@@schemes['LDAP'] = LDAP
|
||||||
|
end
|
||||||
21
lib/bundler/vendor/uri/lib/uri/ldaps.rb
vendored
Normal file
21
lib/bundler/vendor/uri/lib/uri/ldaps.rb
vendored
Normal file
|
|
@ -0,0 +1,21 @@
|
||||||
|
# frozen_string_literal: false
|
||||||
|
# = uri/ldap.rb
|
||||||
|
#
|
||||||
|
# License:: You can redistribute it and/or modify it under the same term as Ruby.
|
||||||
|
#
|
||||||
|
# See Bundler::URI for general documentation
|
||||||
|
#
|
||||||
|
|
||||||
|
require_relative 'ldap'
|
||||||
|
|
||||||
|
module Bundler::URI
|
||||||
|
|
||||||
|
# The default port for LDAPS URIs is 636, and the scheme is 'ldaps:' rather
|
||||||
|
# than 'ldap:'. Other than that, LDAPS URIs are identical to LDAP URIs;
|
||||||
|
# see Bundler::URI::LDAP.
|
||||||
|
class LDAPS < LDAP
|
||||||
|
# A Default port of 636 for Bundler::URI::LDAPS
|
||||||
|
DEFAULT_PORT = 636
|
||||||
|
end
|
||||||
|
@@schemes['LDAPS'] = LDAPS
|
||||||
|
end
|
||||||
294
lib/bundler/vendor/uri/lib/uri/mailto.rb
vendored
Normal file
294
lib/bundler/vendor/uri/lib/uri/mailto.rb
vendored
Normal file
|
|
@ -0,0 +1,294 @@
|
||||||
|
# frozen_string_literal: false
|
||||||
|
# = uri/mailto.rb
|
||||||
|
#
|
||||||
|
# Author:: Akira Yamada <akira@ruby-lang.org>
|
||||||
|
# License:: You can redistribute it and/or modify it under the same term as Ruby.
|
||||||
|
# Revision:: $Id$
|
||||||
|
#
|
||||||
|
# See Bundler::URI for general documentation
|
||||||
|
#
|
||||||
|
|
||||||
|
require_relative 'generic'
|
||||||
|
|
||||||
|
module Bundler::URI
|
||||||
|
|
||||||
|
#
|
||||||
|
# RFC6068, the mailto URL scheme.
|
||||||
|
#
|
||||||
|
class MailTo < Generic
|
||||||
|
include REGEXP
|
||||||
|
|
||||||
|
# A Default port of nil for Bundler::URI::MailTo.
|
||||||
|
DEFAULT_PORT = nil
|
||||||
|
|
||||||
|
# An Array of the available components for Bundler::URI::MailTo.
|
||||||
|
COMPONENT = [ :scheme, :to, :headers ].freeze
|
||||||
|
|
||||||
|
# :stopdoc:
|
||||||
|
# "hname" and "hvalue" are encodings of an RFC 822 header name and
|
||||||
|
# value, respectively. As with "to", all URL reserved characters must
|
||||||
|
# be encoded.
|
||||||
|
#
|
||||||
|
# "#mailbox" is as specified in RFC 822 [RFC822]. This means that it
|
||||||
|
# consists of zero or more comma-separated mail addresses, possibly
|
||||||
|
# including "phrase" and "comment" components. Note that all URL
|
||||||
|
# reserved characters in "to" must be encoded: in particular,
|
||||||
|
# parentheses, commas, and the percent sign ("%"), which commonly occur
|
||||||
|
# in the "mailbox" syntax.
|
||||||
|
#
|
||||||
|
# Within mailto URLs, the characters "?", "=", "&" are reserved.
|
||||||
|
|
||||||
|
# ; RFC 6068
|
||||||
|
# hfields = "?" hfield *( "&" hfield )
|
||||||
|
# hfield = hfname "=" hfvalue
|
||||||
|
# hfname = *qchar
|
||||||
|
# hfvalue = *qchar
|
||||||
|
# qchar = unreserved / pct-encoded / some-delims
|
||||||
|
# some-delims = "!" / "$" / "'" / "(" / ")" / "*"
|
||||||
|
# / "+" / "," / ";" / ":" / "@"
|
||||||
|
#
|
||||||
|
# ; RFC3986
|
||||||
|
# unreserved = ALPHA / DIGIT / "-" / "." / "_" / "~"
|
||||||
|
# pct-encoded = "%" HEXDIG HEXDIG
|
||||||
|
HEADER_REGEXP = /\A(?<hfield>(?:%\h\h|[!$'-.0-;@-Z_a-z~])*=(?:%\h\h|[!$'-.0-;@-Z_a-z~])*)(?:&\g<hfield>)*\z/
|
||||||
|
# practical regexp for email address
|
||||||
|
# https://html.spec.whatwg.org/multipage/input.html#valid-e-mail-address
|
||||||
|
EMAIL_REGEXP = /\A[a-zA-Z0-9.!\#$%&'*+\/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*\z/
|
||||||
|
# :startdoc:
|
||||||
|
|
||||||
|
#
|
||||||
|
# == Description
|
||||||
|
#
|
||||||
|
# Creates a new Bundler::URI::MailTo object from components, with syntax checking.
|
||||||
|
#
|
||||||
|
# Components can be provided as an Array or Hash. If an Array is used,
|
||||||
|
# the components must be supplied as <code>[to, headers]</code>.
|
||||||
|
#
|
||||||
|
# If a Hash is used, the keys are the component names preceded by colons.
|
||||||
|
#
|
||||||
|
# The headers can be supplied as a pre-encoded string, such as
|
||||||
|
# <code>"subject=subscribe&cc=address"</code>, or as an Array of Arrays
|
||||||
|
# like <code>[['subject', 'subscribe'], ['cc', 'address']]</code>.
|
||||||
|
#
|
||||||
|
# Examples:
|
||||||
|
#
|
||||||
|
# require 'bundler/vendor/uri/lib/uri'
|
||||||
|
#
|
||||||
|
# m1 = Bundler::URI::MailTo.build(['joe@example.com', 'subject=Ruby'])
|
||||||
|
# m1.to_s # => "mailto:joe@example.com?subject=Ruby"
|
||||||
|
#
|
||||||
|
# m2 = Bundler::URI::MailTo.build(['john@example.com', [['Subject', 'Ruby'], ['Cc', 'jack@example.com']]])
|
||||||
|
# m2.to_s # => "mailto:john@example.com?Subject=Ruby&Cc=jack@example.com"
|
||||||
|
#
|
||||||
|
# m3 = Bundler::URI::MailTo.build({:to => 'listman@example.com', :headers => [['subject', 'subscribe']]})
|
||||||
|
# m3.to_s # => "mailto:listman@example.com?subject=subscribe"
|
||||||
|
#
|
||||||
|
def self.build(args)
|
||||||
|
tmp = Util.make_components_hash(self, args)
|
||||||
|
|
||||||
|
case tmp[:to]
|
||||||
|
when Array
|
||||||
|
tmp[:opaque] = tmp[:to].join(',')
|
||||||
|
when String
|
||||||
|
tmp[:opaque] = tmp[:to].dup
|
||||||
|
else
|
||||||
|
tmp[:opaque] = ''
|
||||||
|
end
|
||||||
|
|
||||||
|
if tmp[:headers]
|
||||||
|
query =
|
||||||
|
case tmp[:headers]
|
||||||
|
when Array
|
||||||
|
tmp[:headers].collect { |x|
|
||||||
|
if x.kind_of?(Array)
|
||||||
|
x[0] + '=' + x[1..-1].join
|
||||||
|
else
|
||||||
|
x.to_s
|
||||||
|
end
|
||||||
|
}.join('&')
|
||||||
|
when Hash
|
||||||
|
tmp[:headers].collect { |h,v|
|
||||||
|
h + '=' + v
|
||||||
|
}.join('&')
|
||||||
|
else
|
||||||
|
tmp[:headers].to_s
|
||||||
|
end
|
||||||
|
unless query.empty?
|
||||||
|
tmp[:opaque] << '?' << query
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
super(tmp)
|
||||||
|
end
|
||||||
|
|
||||||
|
#
|
||||||
|
# == Description
|
||||||
|
#
|
||||||
|
# Creates a new Bundler::URI::MailTo object from generic URL components with
|
||||||
|
# no syntax checking.
|
||||||
|
#
|
||||||
|
# This method is usually called from Bundler::URI::parse, which checks
|
||||||
|
# the validity of each component.
|
||||||
|
#
|
||||||
|
def initialize(*arg)
|
||||||
|
super(*arg)
|
||||||
|
|
||||||
|
@to = nil
|
||||||
|
@headers = []
|
||||||
|
|
||||||
|
# The RFC3986 parser does not normally populate opaque
|
||||||
|
@opaque = "?#{@query}" if @query && !@opaque
|
||||||
|
|
||||||
|
unless @opaque
|
||||||
|
raise InvalidComponentError,
|
||||||
|
"missing opaque part for mailto URL"
|
||||||
|
end
|
||||||
|
to, header = @opaque.split('?', 2)
|
||||||
|
# allow semicolon as a addr-spec separator
|
||||||
|
# http://support.microsoft.com/kb/820868
|
||||||
|
unless /\A(?:[^@,;]+@[^@,;]+(?:\z|[,;]))*\z/ =~ to
|
||||||
|
raise InvalidComponentError,
|
||||||
|
"unrecognised opaque part for mailtoURL: #{@opaque}"
|
||||||
|
end
|
||||||
|
|
||||||
|
if arg[10] # arg_check
|
||||||
|
self.to = to
|
||||||
|
self.headers = header
|
||||||
|
else
|
||||||
|
set_to(to)
|
||||||
|
set_headers(header)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
# The primary e-mail address of the URL, as a String.
|
||||||
|
attr_reader :to
|
||||||
|
|
||||||
|
# E-mail headers set by the URL, as an Array of Arrays.
|
||||||
|
attr_reader :headers
|
||||||
|
|
||||||
|
# Checks the to +v+ component.
|
||||||
|
def check_to(v)
|
||||||
|
return true unless v
|
||||||
|
return true if v.size == 0
|
||||||
|
|
||||||
|
v.split(/[,;]/).each do |addr|
|
||||||
|
# check url safety as path-rootless
|
||||||
|
if /\A(?:%\h\h|[!$&-.0-;=@-Z_a-z~])*\z/ !~ addr
|
||||||
|
raise InvalidComponentError,
|
||||||
|
"an address in 'to' is invalid as Bundler::URI #{addr.dump}"
|
||||||
|
end
|
||||||
|
|
||||||
|
# check addr-spec
|
||||||
|
# don't s/\+/ /g
|
||||||
|
addr.gsub!(/%\h\h/, Bundler::URI::TBLDECWWWCOMP_)
|
||||||
|
if EMAIL_REGEXP !~ addr
|
||||||
|
raise InvalidComponentError,
|
||||||
|
"an address in 'to' is invalid as uri-escaped addr-spec #{addr.dump}"
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
true
|
||||||
|
end
|
||||||
|
private :check_to
|
||||||
|
|
||||||
|
# Private setter for to +v+.
|
||||||
|
def set_to(v)
|
||||||
|
@to = v
|
||||||
|
end
|
||||||
|
protected :set_to
|
||||||
|
|
||||||
|
# Setter for to +v+.
|
||||||
|
def to=(v)
|
||||||
|
check_to(v)
|
||||||
|
set_to(v)
|
||||||
|
v
|
||||||
|
end
|
||||||
|
|
||||||
|
# Checks the headers +v+ component against either
|
||||||
|
# * HEADER_REGEXP
|
||||||
|
def check_headers(v)
|
||||||
|
return true unless v
|
||||||
|
return true if v.size == 0
|
||||||
|
if HEADER_REGEXP !~ v
|
||||||
|
raise InvalidComponentError,
|
||||||
|
"bad component(expected opaque component): #{v}"
|
||||||
|
end
|
||||||
|
|
||||||
|
true
|
||||||
|
end
|
||||||
|
private :check_headers
|
||||||
|
|
||||||
|
# Private setter for headers +v+.
|
||||||
|
def set_headers(v)
|
||||||
|
@headers = []
|
||||||
|
if v
|
||||||
|
v.split('&').each do |x|
|
||||||
|
@headers << x.split(/=/, 2)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
protected :set_headers
|
||||||
|
|
||||||
|
# Setter for headers +v+.
|
||||||
|
def headers=(v)
|
||||||
|
check_headers(v)
|
||||||
|
set_headers(v)
|
||||||
|
v
|
||||||
|
end
|
||||||
|
|
||||||
|
# Constructs String from Bundler::URI.
|
||||||
|
def to_s
|
||||||
|
@scheme + ':' +
|
||||||
|
if @to
|
||||||
|
@to
|
||||||
|
else
|
||||||
|
''
|
||||||
|
end +
|
||||||
|
if @headers.size > 0
|
||||||
|
'?' + @headers.collect{|x| x.join('=')}.join('&')
|
||||||
|
else
|
||||||
|
''
|
||||||
|
end +
|
||||||
|
if @fragment
|
||||||
|
'#' + @fragment
|
||||||
|
else
|
||||||
|
''
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
# Returns the RFC822 e-mail text equivalent of the URL, as a String.
|
||||||
|
#
|
||||||
|
# Example:
|
||||||
|
#
|
||||||
|
# require 'bundler/vendor/uri/lib/uri'
|
||||||
|
#
|
||||||
|
# uri = Bundler::URI.parse("mailto:ruby-list@ruby-lang.org?Subject=subscribe&cc=myaddr")
|
||||||
|
# uri.to_mailtext
|
||||||
|
# # => "To: ruby-list@ruby-lang.org\nSubject: subscribe\nCc: myaddr\n\n\n"
|
||||||
|
#
|
||||||
|
def to_mailtext
|
||||||
|
to = Bundler::URI.decode_www_form_component(@to)
|
||||||
|
head = ''
|
||||||
|
body = ''
|
||||||
|
@headers.each do |x|
|
||||||
|
case x[0]
|
||||||
|
when 'body'
|
||||||
|
body = Bundler::URI.decode_www_form_component(x[1])
|
||||||
|
when 'to'
|
||||||
|
to << ', ' + Bundler::URI.decode_www_form_component(x[1])
|
||||||
|
else
|
||||||
|
head << Bundler::URI.decode_www_form_component(x[0]).capitalize + ': ' +
|
||||||
|
Bundler::URI.decode_www_form_component(x[1]) + "\n"
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
"To: #{to}
|
||||||
|
#{head}
|
||||||
|
#{body}
|
||||||
|
"
|
||||||
|
end
|
||||||
|
alias to_rfc822text to_mailtext
|
||||||
|
end
|
||||||
|
|
||||||
|
@@schemes['MAILTO'] = MailTo
|
||||||
|
end
|
||||||
546
lib/bundler/vendor/uri/lib/uri/rfc2396_parser.rb
vendored
Normal file
546
lib/bundler/vendor/uri/lib/uri/rfc2396_parser.rb
vendored
Normal file
|
|
@ -0,0 +1,546 @@
|
||||||
|
# frozen_string_literal: false
|
||||||
|
#--
|
||||||
|
# = uri/common.rb
|
||||||
|
#
|
||||||
|
# Author:: Akira Yamada <akira@ruby-lang.org>
|
||||||
|
# Revision:: $Id$
|
||||||
|
# License::
|
||||||
|
# You can redistribute it and/or modify it under the same term as Ruby.
|
||||||
|
#
|
||||||
|
# See Bundler::URI for general documentation
|
||||||
|
#
|
||||||
|
|
||||||
|
module Bundler::URI
|
||||||
|
#
|
||||||
|
# Includes Bundler::URI::REGEXP::PATTERN
|
||||||
|
#
|
||||||
|
module RFC2396_REGEXP
|
||||||
|
#
|
||||||
|
# Patterns used to parse Bundler::URI's
|
||||||
|
#
|
||||||
|
module PATTERN
|
||||||
|
# :stopdoc:
|
||||||
|
|
||||||
|
# RFC 2396 (Bundler::URI Generic Syntax)
|
||||||
|
# RFC 2732 (IPv6 Literal Addresses in URL's)
|
||||||
|
# RFC 2373 (IPv6 Addressing Architecture)
|
||||||
|
|
||||||
|
# alpha = lowalpha | upalpha
|
||||||
|
ALPHA = "a-zA-Z"
|
||||||
|
# alphanum = alpha | digit
|
||||||
|
ALNUM = "#{ALPHA}\\d"
|
||||||
|
|
||||||
|
# hex = digit | "A" | "B" | "C" | "D" | "E" | "F" |
|
||||||
|
# "a" | "b" | "c" | "d" | "e" | "f"
|
||||||
|
HEX = "a-fA-F\\d"
|
||||||
|
# escaped = "%" hex hex
|
||||||
|
ESCAPED = "%[#{HEX}]{2}"
|
||||||
|
# mark = "-" | "_" | "." | "!" | "~" | "*" | "'" |
|
||||||
|
# "(" | ")"
|
||||||
|
# unreserved = alphanum | mark
|
||||||
|
UNRESERVED = "\\-_.!~*'()#{ALNUM}"
|
||||||
|
# reserved = ";" | "/" | "?" | ":" | "@" | "&" | "=" | "+" |
|
||||||
|
# "$" | ","
|
||||||
|
# reserved = ";" | "/" | "?" | ":" | "@" | "&" | "=" | "+" |
|
||||||
|
# "$" | "," | "[" | "]" (RFC 2732)
|
||||||
|
RESERVED = ";/?:@&=+$,\\[\\]"
|
||||||
|
|
||||||
|
# domainlabel = alphanum | alphanum *( alphanum | "-" ) alphanum
|
||||||
|
DOMLABEL = "(?:[#{ALNUM}](?:[-#{ALNUM}]*[#{ALNUM}])?)"
|
||||||
|
# toplabel = alpha | alpha *( alphanum | "-" ) alphanum
|
||||||
|
TOPLABEL = "(?:[#{ALPHA}](?:[-#{ALNUM}]*[#{ALNUM}])?)"
|
||||||
|
# hostname = *( domainlabel "." ) toplabel [ "." ]
|
||||||
|
HOSTNAME = "(?:#{DOMLABEL}\\.)*#{TOPLABEL}\\.?"
|
||||||
|
|
||||||
|
# :startdoc:
|
||||||
|
end # PATTERN
|
||||||
|
|
||||||
|
# :startdoc:
|
||||||
|
end # REGEXP
|
||||||
|
|
||||||
|
# Class that parses String's into Bundler::URI's.
|
||||||
|
#
|
||||||
|
# It contains a Hash set of patterns and Regexp's that match and validate.
|
||||||
|
#
|
||||||
|
class RFC2396_Parser
|
||||||
|
include RFC2396_REGEXP
|
||||||
|
|
||||||
|
#
|
||||||
|
# == Synopsis
|
||||||
|
#
|
||||||
|
# Bundler::URI::Parser.new([opts])
|
||||||
|
#
|
||||||
|
# == Args
|
||||||
|
#
|
||||||
|
# The constructor accepts a hash as options for parser.
|
||||||
|
# Keys of options are pattern names of Bundler::URI components
|
||||||
|
# and values of options are pattern strings.
|
||||||
|
# The constructor generates set of regexps for parsing URIs.
|
||||||
|
#
|
||||||
|
# You can use the following keys:
|
||||||
|
#
|
||||||
|
# * :ESCAPED (Bundler::URI::PATTERN::ESCAPED in default)
|
||||||
|
# * :UNRESERVED (Bundler::URI::PATTERN::UNRESERVED in default)
|
||||||
|
# * :DOMLABEL (Bundler::URI::PATTERN::DOMLABEL in default)
|
||||||
|
# * :TOPLABEL (Bundler::URI::PATTERN::TOPLABEL in default)
|
||||||
|
# * :HOSTNAME (Bundler::URI::PATTERN::HOSTNAME in default)
|
||||||
|
#
|
||||||
|
# == Examples
|
||||||
|
#
|
||||||
|
# p = Bundler::URI::Parser.new(:ESCAPED => "(?:%[a-fA-F0-9]{2}|%u[a-fA-F0-9]{4})")
|
||||||
|
# u = p.parse("http://example.jp/%uABCD") #=> #<Bundler::URI::HTTP http://example.jp/%uABCD>
|
||||||
|
# Bundler::URI.parse(u.to_s) #=> raises Bundler::URI::InvalidURIError
|
||||||
|
#
|
||||||
|
# s = "http://example.com/ABCD"
|
||||||
|
# u1 = p.parse(s) #=> #<Bundler::URI::HTTP http://example.com/ABCD>
|
||||||
|
# u2 = Bundler::URI.parse(s) #=> #<Bundler::URI::HTTP http://example.com/ABCD>
|
||||||
|
# u1 == u2 #=> true
|
||||||
|
# u1.eql?(u2) #=> false
|
||||||
|
#
|
||||||
|
def initialize(opts = {})
|
||||||
|
@pattern = initialize_pattern(opts)
|
||||||
|
@pattern.each_value(&:freeze)
|
||||||
|
@pattern.freeze
|
||||||
|
|
||||||
|
@regexp = initialize_regexp(@pattern)
|
||||||
|
@regexp.each_value(&:freeze)
|
||||||
|
@regexp.freeze
|
||||||
|
end
|
||||||
|
|
||||||
|
# The Hash of patterns.
|
||||||
|
#
|
||||||
|
# See also Bundler::URI::Parser.initialize_pattern.
|
||||||
|
attr_reader :pattern
|
||||||
|
|
||||||
|
# The Hash of Regexp.
|
||||||
|
#
|
||||||
|
# See also Bundler::URI::Parser.initialize_regexp.
|
||||||
|
attr_reader :regexp
|
||||||
|
|
||||||
|
# Returns a split Bundler::URI against regexp[:ABS_URI].
|
||||||
|
def split(uri)
|
||||||
|
case uri
|
||||||
|
when ''
|
||||||
|
# null uri
|
||||||
|
|
||||||
|
when @regexp[:ABS_URI]
|
||||||
|
scheme, opaque, userinfo, host, port,
|
||||||
|
registry, path, query, fragment = $~[1..-1]
|
||||||
|
|
||||||
|
# Bundler::URI-reference = [ absoluteURI | relativeURI ] [ "#" fragment ]
|
||||||
|
|
||||||
|
# absoluteURI = scheme ":" ( hier_part | opaque_part )
|
||||||
|
# hier_part = ( net_path | abs_path ) [ "?" query ]
|
||||||
|
# opaque_part = uric_no_slash *uric
|
||||||
|
|
||||||
|
# abs_path = "/" path_segments
|
||||||
|
# net_path = "//" authority [ abs_path ]
|
||||||
|
|
||||||
|
# authority = server | reg_name
|
||||||
|
# server = [ [ userinfo "@" ] hostport ]
|
||||||
|
|
||||||
|
if !scheme
|
||||||
|
raise InvalidURIError,
|
||||||
|
"bad Bundler::URI(absolute but no scheme): #{uri}"
|
||||||
|
end
|
||||||
|
if !opaque && (!path && (!host && !registry))
|
||||||
|
raise InvalidURIError,
|
||||||
|
"bad Bundler::URI(absolute but no path): #{uri}"
|
||||||
|
end
|
||||||
|
|
||||||
|
when @regexp[:REL_URI]
|
||||||
|
scheme = nil
|
||||||
|
opaque = nil
|
||||||
|
|
||||||
|
userinfo, host, port, registry,
|
||||||
|
rel_segment, abs_path, query, fragment = $~[1..-1]
|
||||||
|
if rel_segment && abs_path
|
||||||
|
path = rel_segment + abs_path
|
||||||
|
elsif rel_segment
|
||||||
|
path = rel_segment
|
||||||
|
elsif abs_path
|
||||||
|
path = abs_path
|
||||||
|
end
|
||||||
|
|
||||||
|
# Bundler::URI-reference = [ absoluteURI | relativeURI ] [ "#" fragment ]
|
||||||
|
|
||||||
|
# relativeURI = ( net_path | abs_path | rel_path ) [ "?" query ]
|
||||||
|
|
||||||
|
# net_path = "//" authority [ abs_path ]
|
||||||
|
# abs_path = "/" path_segments
|
||||||
|
# rel_path = rel_segment [ abs_path ]
|
||||||
|
|
||||||
|
# authority = server | reg_name
|
||||||
|
# server = [ [ userinfo "@" ] hostport ]
|
||||||
|
|
||||||
|
else
|
||||||
|
raise InvalidURIError, "bad Bundler::URI(is not Bundler::URI?): #{uri}"
|
||||||
|
end
|
||||||
|
|
||||||
|
path = '' if !path && !opaque # (see RFC2396 Section 5.2)
|
||||||
|
ret = [
|
||||||
|
scheme,
|
||||||
|
userinfo, host, port, # X
|
||||||
|
registry, # X
|
||||||
|
path, # Y
|
||||||
|
opaque, # Y
|
||||||
|
query,
|
||||||
|
fragment
|
||||||
|
]
|
||||||
|
return ret
|
||||||
|
end
|
||||||
|
|
||||||
|
#
|
||||||
|
# == Args
|
||||||
|
#
|
||||||
|
# +uri+::
|
||||||
|
# String
|
||||||
|
#
|
||||||
|
# == Description
|
||||||
|
#
|
||||||
|
# Parses +uri+ and constructs either matching Bundler::URI scheme object
|
||||||
|
# (File, FTP, HTTP, HTTPS, LDAP, LDAPS, or MailTo) or Bundler::URI::Generic.
|
||||||
|
#
|
||||||
|
# == Usage
|
||||||
|
#
|
||||||
|
# p = Bundler::URI::Parser.new
|
||||||
|
# p.parse("ldap://ldap.example.com/dc=example?user=john")
|
||||||
|
# #=> #<Bundler::URI::LDAP ldap://ldap.example.com/dc=example?user=john>
|
||||||
|
#
|
||||||
|
def parse(uri)
|
||||||
|
scheme, userinfo, host, port,
|
||||||
|
registry, path, opaque, query, fragment = self.split(uri)
|
||||||
|
|
||||||
|
if scheme && Bundler::URI.scheme_list.include?(scheme.upcase)
|
||||||
|
Bundler::URI.scheme_list[scheme.upcase].new(scheme, userinfo, host, port,
|
||||||
|
registry, path, opaque, query,
|
||||||
|
fragment, self)
|
||||||
|
else
|
||||||
|
Generic.new(scheme, userinfo, host, port,
|
||||||
|
registry, path, opaque, query,
|
||||||
|
fragment, self)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
|
||||||
|
#
|
||||||
|
# == Args
|
||||||
|
#
|
||||||
|
# +uris+::
|
||||||
|
# an Array of Strings
|
||||||
|
#
|
||||||
|
# == Description
|
||||||
|
#
|
||||||
|
# Attempts to parse and merge a set of URIs.
|
||||||
|
#
|
||||||
|
def join(*uris)
|
||||||
|
uris[0] = convert_to_uri(uris[0])
|
||||||
|
uris.inject :merge
|
||||||
|
end
|
||||||
|
|
||||||
|
#
|
||||||
|
# :call-seq:
|
||||||
|
# extract( str )
|
||||||
|
# extract( str, schemes )
|
||||||
|
# extract( str, schemes ) {|item| block }
|
||||||
|
#
|
||||||
|
# == Args
|
||||||
|
#
|
||||||
|
# +str+::
|
||||||
|
# String to search
|
||||||
|
# +schemes+::
|
||||||
|
# Patterns to apply to +str+
|
||||||
|
#
|
||||||
|
# == Description
|
||||||
|
#
|
||||||
|
# Attempts to parse and merge a set of URIs.
|
||||||
|
# If no +block+ given, then returns the result,
|
||||||
|
# else it calls +block+ for each element in result.
|
||||||
|
#
|
||||||
|
# See also Bundler::URI::Parser.make_regexp.
|
||||||
|
#
|
||||||
|
def extract(str, schemes = nil)
|
||||||
|
if block_given?
|
||||||
|
str.scan(make_regexp(schemes)) { yield $& }
|
||||||
|
nil
|
||||||
|
else
|
||||||
|
result = []
|
||||||
|
str.scan(make_regexp(schemes)) { result.push $& }
|
||||||
|
result
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
# Returns Regexp that is default self.regexp[:ABS_URI_REF],
|
||||||
|
# unless +schemes+ is provided. Then it is a Regexp.union with self.pattern[:X_ABS_URI].
|
||||||
|
def make_regexp(schemes = nil)
|
||||||
|
unless schemes
|
||||||
|
@regexp[:ABS_URI_REF]
|
||||||
|
else
|
||||||
|
/(?=#{Regexp.union(*schemes)}:)#{@pattern[:X_ABS_URI]}/x
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
#
|
||||||
|
# :call-seq:
|
||||||
|
# escape( str )
|
||||||
|
# escape( str, unsafe )
|
||||||
|
#
|
||||||
|
# == Args
|
||||||
|
#
|
||||||
|
# +str+::
|
||||||
|
# String to make safe
|
||||||
|
# +unsafe+::
|
||||||
|
# Regexp to apply. Defaults to self.regexp[:UNSAFE]
|
||||||
|
#
|
||||||
|
# == Description
|
||||||
|
#
|
||||||
|
# Constructs a safe String from +str+, removing unsafe characters,
|
||||||
|
# replacing them with codes.
|
||||||
|
#
|
||||||
|
def escape(str, unsafe = @regexp[:UNSAFE])
|
||||||
|
unless unsafe.kind_of?(Regexp)
|
||||||
|
# perhaps unsafe is String object
|
||||||
|
unsafe = Regexp.new("[#{Regexp.quote(unsafe)}]", false)
|
||||||
|
end
|
||||||
|
str.gsub(unsafe) do
|
||||||
|
us = $&
|
||||||
|
tmp = ''
|
||||||
|
us.each_byte do |uc|
|
||||||
|
tmp << sprintf('%%%02X', uc)
|
||||||
|
end
|
||||||
|
tmp
|
||||||
|
end.force_encoding(Encoding::US_ASCII)
|
||||||
|
end
|
||||||
|
|
||||||
|
#
|
||||||
|
# :call-seq:
|
||||||
|
# unescape( str )
|
||||||
|
# unescape( str, escaped )
|
||||||
|
#
|
||||||
|
# == Args
|
||||||
|
#
|
||||||
|
# +str+::
|
||||||
|
# String to remove escapes from
|
||||||
|
# +escaped+::
|
||||||
|
# Regexp to apply. Defaults to self.regexp[:ESCAPED]
|
||||||
|
#
|
||||||
|
# == Description
|
||||||
|
#
|
||||||
|
# Removes escapes from +str+.
|
||||||
|
#
|
||||||
|
def unescape(str, escaped = @regexp[:ESCAPED])
|
||||||
|
enc = str.encoding
|
||||||
|
enc = Encoding::UTF_8 if enc == Encoding::US_ASCII
|
||||||
|
str.gsub(escaped) { [$&[1, 2]].pack('H2').force_encoding(enc) }
|
||||||
|
end
|
||||||
|
|
||||||
|
@@to_s = Kernel.instance_method(:to_s)
|
||||||
|
def inspect
|
||||||
|
@@to_s.bind_call(self)
|
||||||
|
end
|
||||||
|
|
||||||
|
private
|
||||||
|
|
||||||
|
# Constructs the default Hash of patterns.
|
||||||
|
def initialize_pattern(opts = {})
|
||||||
|
ret = {}
|
||||||
|
ret[:ESCAPED] = escaped = (opts.delete(:ESCAPED) || PATTERN::ESCAPED)
|
||||||
|
ret[:UNRESERVED] = unreserved = opts.delete(:UNRESERVED) || PATTERN::UNRESERVED
|
||||||
|
ret[:RESERVED] = reserved = opts.delete(:RESERVED) || PATTERN::RESERVED
|
||||||
|
ret[:DOMLABEL] = opts.delete(:DOMLABEL) || PATTERN::DOMLABEL
|
||||||
|
ret[:TOPLABEL] = opts.delete(:TOPLABEL) || PATTERN::TOPLABEL
|
||||||
|
ret[:HOSTNAME] = hostname = opts.delete(:HOSTNAME)
|
||||||
|
|
||||||
|
# RFC 2396 (Bundler::URI Generic Syntax)
|
||||||
|
# RFC 2732 (IPv6 Literal Addresses in URL's)
|
||||||
|
# RFC 2373 (IPv6 Addressing Architecture)
|
||||||
|
|
||||||
|
# uric = reserved | unreserved | escaped
|
||||||
|
ret[:URIC] = uric = "(?:[#{unreserved}#{reserved}]|#{escaped})"
|
||||||
|
# uric_no_slash = unreserved | escaped | ";" | "?" | ":" | "@" |
|
||||||
|
# "&" | "=" | "+" | "$" | ","
|
||||||
|
ret[:URIC_NO_SLASH] = uric_no_slash = "(?:[#{unreserved};?:@&=+$,]|#{escaped})"
|
||||||
|
# query = *uric
|
||||||
|
ret[:QUERY] = query = "#{uric}*"
|
||||||
|
# fragment = *uric
|
||||||
|
ret[:FRAGMENT] = fragment = "#{uric}*"
|
||||||
|
|
||||||
|
# hostname = *( domainlabel "." ) toplabel [ "." ]
|
||||||
|
# reg-name = *( unreserved / pct-encoded / sub-delims ) # RFC3986
|
||||||
|
unless hostname
|
||||||
|
ret[:HOSTNAME] = hostname = "(?:[a-zA-Z0-9\\-.]|%\\h\\h)+"
|
||||||
|
end
|
||||||
|
|
||||||
|
# RFC 2373, APPENDIX B:
|
||||||
|
# IPv6address = hexpart [ ":" IPv4address ]
|
||||||
|
# IPv4address = 1*3DIGIT "." 1*3DIGIT "." 1*3DIGIT "." 1*3DIGIT
|
||||||
|
# hexpart = hexseq | hexseq "::" [ hexseq ] | "::" [ hexseq ]
|
||||||
|
# hexseq = hex4 *( ":" hex4)
|
||||||
|
# hex4 = 1*4HEXDIG
|
||||||
|
#
|
||||||
|
# XXX: This definition has a flaw. "::" + IPv4address must be
|
||||||
|
# allowed too. Here is a replacement.
|
||||||
|
#
|
||||||
|
# IPv4address = 1*3DIGIT "." 1*3DIGIT "." 1*3DIGIT "." 1*3DIGIT
|
||||||
|
ret[:IPV4ADDR] = ipv4addr = "\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}"
|
||||||
|
# hex4 = 1*4HEXDIG
|
||||||
|
hex4 = "[#{PATTERN::HEX}]{1,4}"
|
||||||
|
# lastpart = hex4 | IPv4address
|
||||||
|
lastpart = "(?:#{hex4}|#{ipv4addr})"
|
||||||
|
# hexseq1 = *( hex4 ":" ) hex4
|
||||||
|
hexseq1 = "(?:#{hex4}:)*#{hex4}"
|
||||||
|
# hexseq2 = *( hex4 ":" ) lastpart
|
||||||
|
hexseq2 = "(?:#{hex4}:)*#{lastpart}"
|
||||||
|
# IPv6address = hexseq2 | [ hexseq1 ] "::" [ hexseq2 ]
|
||||||
|
ret[:IPV6ADDR] = ipv6addr = "(?:#{hexseq2}|(?:#{hexseq1})?::(?:#{hexseq2})?)"
|
||||||
|
|
||||||
|
# IPv6prefix = ( hexseq1 | [ hexseq1 ] "::" [ hexseq1 ] ) "/" 1*2DIGIT
|
||||||
|
# unused
|
||||||
|
|
||||||
|
# ipv6reference = "[" IPv6address "]" (RFC 2732)
|
||||||
|
ret[:IPV6REF] = ipv6ref = "\\[#{ipv6addr}\\]"
|
||||||
|
|
||||||
|
# host = hostname | IPv4address
|
||||||
|
# host = hostname | IPv4address | IPv6reference (RFC 2732)
|
||||||
|
ret[:HOST] = host = "(?:#{hostname}|#{ipv4addr}|#{ipv6ref})"
|
||||||
|
# port = *digit
|
||||||
|
ret[:PORT] = port = '\d*'
|
||||||
|
# hostport = host [ ":" port ]
|
||||||
|
ret[:HOSTPORT] = hostport = "#{host}(?::#{port})?"
|
||||||
|
|
||||||
|
# userinfo = *( unreserved | escaped |
|
||||||
|
# ";" | ":" | "&" | "=" | "+" | "$" | "," )
|
||||||
|
ret[:USERINFO] = userinfo = "(?:[#{unreserved};:&=+$,]|#{escaped})*"
|
||||||
|
|
||||||
|
# pchar = unreserved | escaped |
|
||||||
|
# ":" | "@" | "&" | "=" | "+" | "$" | ","
|
||||||
|
pchar = "(?:[#{unreserved}:@&=+$,]|#{escaped})"
|
||||||
|
# param = *pchar
|
||||||
|
param = "#{pchar}*"
|
||||||
|
# segment = *pchar *( ";" param )
|
||||||
|
segment = "#{pchar}*(?:;#{param})*"
|
||||||
|
# path_segments = segment *( "/" segment )
|
||||||
|
ret[:PATH_SEGMENTS] = path_segments = "#{segment}(?:/#{segment})*"
|
||||||
|
|
||||||
|
# server = [ [ userinfo "@" ] hostport ]
|
||||||
|
server = "(?:#{userinfo}@)?#{hostport}"
|
||||||
|
# reg_name = 1*( unreserved | escaped | "$" | "," |
|
||||||
|
# ";" | ":" | "@" | "&" | "=" | "+" )
|
||||||
|
ret[:REG_NAME] = reg_name = "(?:[#{unreserved}$,;:@&=+]|#{escaped})+"
|
||||||
|
# authority = server | reg_name
|
||||||
|
authority = "(?:#{server}|#{reg_name})"
|
||||||
|
|
||||||
|
# rel_segment = 1*( unreserved | escaped |
|
||||||
|
# ";" | "@" | "&" | "=" | "+" | "$" | "," )
|
||||||
|
ret[:REL_SEGMENT] = rel_segment = "(?:[#{unreserved};@&=+$,]|#{escaped})+"
|
||||||
|
|
||||||
|
# scheme = alpha *( alpha | digit | "+" | "-" | "." )
|
||||||
|
ret[:SCHEME] = scheme = "[#{PATTERN::ALPHA}][\\-+.#{PATTERN::ALPHA}\\d]*"
|
||||||
|
|
||||||
|
# abs_path = "/" path_segments
|
||||||
|
ret[:ABS_PATH] = abs_path = "/#{path_segments}"
|
||||||
|
# rel_path = rel_segment [ abs_path ]
|
||||||
|
ret[:REL_PATH] = rel_path = "#{rel_segment}(?:#{abs_path})?"
|
||||||
|
# net_path = "//" authority [ abs_path ]
|
||||||
|
ret[:NET_PATH] = net_path = "//#{authority}(?:#{abs_path})?"
|
||||||
|
|
||||||
|
# hier_part = ( net_path | abs_path ) [ "?" query ]
|
||||||
|
ret[:HIER_PART] = hier_part = "(?:#{net_path}|#{abs_path})(?:\\?(?:#{query}))?"
|
||||||
|
# opaque_part = uric_no_slash *uric
|
||||||
|
ret[:OPAQUE_PART] = opaque_part = "#{uric_no_slash}#{uric}*"
|
||||||
|
|
||||||
|
# absoluteURI = scheme ":" ( hier_part | opaque_part )
|
||||||
|
ret[:ABS_URI] = abs_uri = "#{scheme}:(?:#{hier_part}|#{opaque_part})"
|
||||||
|
# relativeURI = ( net_path | abs_path | rel_path ) [ "?" query ]
|
||||||
|
ret[:REL_URI] = rel_uri = "(?:#{net_path}|#{abs_path}|#{rel_path})(?:\\?#{query})?"
|
||||||
|
|
||||||
|
# Bundler::URI-reference = [ absoluteURI | relativeURI ] [ "#" fragment ]
|
||||||
|
ret[:URI_REF] = "(?:#{abs_uri}|#{rel_uri})?(?:##{fragment})?"
|
||||||
|
|
||||||
|
ret[:X_ABS_URI] = "
|
||||||
|
(#{scheme}): (?# 1: scheme)
|
||||||
|
(?:
|
||||||
|
(#{opaque_part}) (?# 2: opaque)
|
||||||
|
|
|
||||||
|
(?:(?:
|
||||||
|
//(?:
|
||||||
|
(?:(?:(#{userinfo})@)? (?# 3: userinfo)
|
||||||
|
(?:(#{host})(?::(\\d*))?))? (?# 4: host, 5: port)
|
||||||
|
|
|
||||||
|
(#{reg_name}) (?# 6: registry)
|
||||||
|
)
|
||||||
|
|
|
||||||
|
(?!//)) (?# XXX: '//' is the mark for hostport)
|
||||||
|
(#{abs_path})? (?# 7: path)
|
||||||
|
)(?:\\?(#{query}))? (?# 8: query)
|
||||||
|
)
|
||||||
|
(?:\\#(#{fragment}))? (?# 9: fragment)
|
||||||
|
"
|
||||||
|
|
||||||
|
ret[:X_REL_URI] = "
|
||||||
|
(?:
|
||||||
|
(?:
|
||||||
|
//
|
||||||
|
(?:
|
||||||
|
(?:(#{userinfo})@)? (?# 1: userinfo)
|
||||||
|
(#{host})?(?::(\\d*))? (?# 2: host, 3: port)
|
||||||
|
|
|
||||||
|
(#{reg_name}) (?# 4: registry)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
|
|
||||||
|
(#{rel_segment}) (?# 5: rel_segment)
|
||||||
|
)?
|
||||||
|
(#{abs_path})? (?# 6: abs_path)
|
||||||
|
(?:\\?(#{query}))? (?# 7: query)
|
||||||
|
(?:\\#(#{fragment}))? (?# 8: fragment)
|
||||||
|
"
|
||||||
|
|
||||||
|
ret
|
||||||
|
end
|
||||||
|
|
||||||
|
# Constructs the default Hash of Regexp's.
|
||||||
|
def initialize_regexp(pattern)
|
||||||
|
ret = {}
|
||||||
|
|
||||||
|
# for Bundler::URI::split
|
||||||
|
ret[:ABS_URI] = Regexp.new('\A\s*' + pattern[:X_ABS_URI] + '\s*\z', Regexp::EXTENDED)
|
||||||
|
ret[:REL_URI] = Regexp.new('\A\s*' + pattern[:X_REL_URI] + '\s*\z', Regexp::EXTENDED)
|
||||||
|
|
||||||
|
# for Bundler::URI::extract
|
||||||
|
ret[:URI_REF] = Regexp.new(pattern[:URI_REF])
|
||||||
|
ret[:ABS_URI_REF] = Regexp.new(pattern[:X_ABS_URI], Regexp::EXTENDED)
|
||||||
|
ret[:REL_URI_REF] = Regexp.new(pattern[:X_REL_URI], Regexp::EXTENDED)
|
||||||
|
|
||||||
|
# for Bundler::URI::escape/unescape
|
||||||
|
ret[:ESCAPED] = Regexp.new(pattern[:ESCAPED])
|
||||||
|
ret[:UNSAFE] = Regexp.new("[^#{pattern[:UNRESERVED]}#{pattern[:RESERVED]}]")
|
||||||
|
|
||||||
|
# for Generic#initialize
|
||||||
|
ret[:SCHEME] = Regexp.new("\\A#{pattern[:SCHEME]}\\z")
|
||||||
|
ret[:USERINFO] = Regexp.new("\\A#{pattern[:USERINFO]}\\z")
|
||||||
|
ret[:HOST] = Regexp.new("\\A#{pattern[:HOST]}\\z")
|
||||||
|
ret[:PORT] = Regexp.new("\\A#{pattern[:PORT]}\\z")
|
||||||
|
ret[:OPAQUE] = Regexp.new("\\A#{pattern[:OPAQUE_PART]}\\z")
|
||||||
|
ret[:REGISTRY] = Regexp.new("\\A#{pattern[:REG_NAME]}\\z")
|
||||||
|
ret[:ABS_PATH] = Regexp.new("\\A#{pattern[:ABS_PATH]}\\z")
|
||||||
|
ret[:REL_PATH] = Regexp.new("\\A#{pattern[:REL_PATH]}\\z")
|
||||||
|
ret[:QUERY] = Regexp.new("\\A#{pattern[:QUERY]}\\z")
|
||||||
|
ret[:FRAGMENT] = Regexp.new("\\A#{pattern[:FRAGMENT]}\\z")
|
||||||
|
|
||||||
|
ret
|
||||||
|
end
|
||||||
|
|
||||||
|
def convert_to_uri(uri)
|
||||||
|
if uri.is_a?(Bundler::URI::Generic)
|
||||||
|
uri
|
||||||
|
elsif uri = String.try_convert(uri)
|
||||||
|
parse(uri)
|
||||||
|
else
|
||||||
|
raise ArgumentError,
|
||||||
|
"bad argument (expected Bundler::URI object or Bundler::URI string)"
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
end # class Parser
|
||||||
|
end # module Bundler::URI
|
||||||
125
lib/bundler/vendor/uri/lib/uri/rfc3986_parser.rb
vendored
Normal file
125
lib/bundler/vendor/uri/lib/uri/rfc3986_parser.rb
vendored
Normal file
|
|
@ -0,0 +1,125 @@
|
||||||
|
# frozen_string_literal: false
|
||||||
|
module Bundler::URI
|
||||||
|
class RFC3986_Parser # :nodoc:
|
||||||
|
# Bundler::URI defined in RFC3986
|
||||||
|
# this regexp is modified not to host is not empty string
|
||||||
|
RFC3986_URI = /\A(?<Bundler::URI>(?<scheme>[A-Za-z][+\-.0-9A-Za-z]*):(?<hier-part>\/\/(?<authority>(?:(?<userinfo>(?:%\h\h|[!$&-.0-;=A-Z_a-z~])*)@)?(?<host>(?<IP-literal>\[(?:(?<IPv6address>(?:\h{1,4}:){6}(?<ls32>\h{1,4}:\h{1,4}|(?<IPv4address>(?<dec-octet>[1-9]\d|1\d{2}|2[0-4]\d|25[0-5]|\d)\.\g<dec-octet>\.\g<dec-octet>\.\g<dec-octet>))|::(?:\h{1,4}:){5}\g<ls32>|\h{1,4}?::(?:\h{1,4}:){4}\g<ls32>|(?:(?:\h{1,4}:)?\h{1,4})?::(?:\h{1,4}:){3}\g<ls32>|(?:(?:\h{1,4}:){,2}\h{1,4})?::(?:\h{1,4}:){2}\g<ls32>|(?:(?:\h{1,4}:){,3}\h{1,4})?::\h{1,4}:\g<ls32>|(?:(?:\h{1,4}:){,4}\h{1,4})?::\g<ls32>|(?:(?:\h{1,4}:){,5}\h{1,4})?::\h{1,4}|(?:(?:\h{1,4}:){,6}\h{1,4})?::)|(?<IPvFuture>v\h+\.[!$&-.0-;=A-Z_a-z~]+))\])|\g<IPv4address>|(?<reg-name>(?:%\h\h|[!$&-.0-9;=A-Z_a-z~])+))?(?::(?<port>\d*))?)(?<path-abempty>(?:\/(?<segment>(?:%\h\h|[!$&-.0-;=@-Z_a-z~])*))*)|(?<path-absolute>\/(?:(?<segment-nz>(?:%\h\h|[!$&-.0-;=@-Z_a-z~])+)(?:\/\g<segment>)*)?)|(?<path-rootless>\g<segment-nz>(?:\/\g<segment>)*)|(?<path-empty>))(?:\?(?<query>[^#]*))?(?:\#(?<fragment>(?:%\h\h|[!$&-.0-;=@-Z_a-z~\/?])*))?)\z/
|
||||||
|
RFC3986_relative_ref = /\A(?<relative-ref>(?<relative-part>\/\/(?<authority>(?:(?<userinfo>(?:%\h\h|[!$&-.0-;=A-Z_a-z~])*)@)?(?<host>(?<IP-literal>\[(?<IPv6address>(?:\h{1,4}:){6}(?<ls32>\h{1,4}:\h{1,4}|(?<IPv4address>(?<dec-octet>[1-9]\d|1\d{2}|2[0-4]\d|25[0-5]|\d)\.\g<dec-octet>\.\g<dec-octet>\.\g<dec-octet>))|::(?:\h{1,4}:){5}\g<ls32>|\h{1,4}?::(?:\h{1,4}:){4}\g<ls32>|(?:(?:\h{1,4}:){,1}\h{1,4})?::(?:\h{1,4}:){3}\g<ls32>|(?:(?:\h{1,4}:){,2}\h{1,4})?::(?:\h{1,4}:){2}\g<ls32>|(?:(?:\h{1,4}:){,3}\h{1,4})?::\h{1,4}:\g<ls32>|(?:(?:\h{1,4}:){,4}\h{1,4})?::\g<ls32>|(?:(?:\h{1,4}:){,5}\h{1,4})?::\h{1,4}|(?:(?:\h{1,4}:){,6}\h{1,4})?::)|(?<IPvFuture>v\h+\.[!$&-.0-;=A-Z_a-z~]+)\])|\g<IPv4address>|(?<reg-name>(?:%\h\h|[!$&-.0-9;=A-Z_a-z~])+))?(?::(?<port>\d*))?)(?<path-abempty>(?:\/(?<segment>(?:%\h\h|[!$&-.0-;=@-Z_a-z~])*))*)|(?<path-absolute>\/(?:(?<segment-nz>(?:%\h\h|[!$&-.0-;=@-Z_a-z~])+)(?:\/\g<segment>)*)?)|(?<path-noscheme>(?<segment-nz-nc>(?:%\h\h|[!$&-.0-9;=@-Z_a-z~])+)(?:\/\g<segment>)*)|(?<path-empty>))(?:\?(?<query>[^#]*))?(?:\#(?<fragment>(?:%\h\h|[!$&-.0-;=@-Z_a-z~\/?])*))?)\z/
|
||||||
|
attr_reader :regexp
|
||||||
|
|
||||||
|
def initialize
|
||||||
|
@regexp = default_regexp.each_value(&:freeze).freeze
|
||||||
|
end
|
||||||
|
|
||||||
|
def split(uri) #:nodoc:
|
||||||
|
begin
|
||||||
|
uri = uri.to_str
|
||||||
|
rescue NoMethodError
|
||||||
|
raise InvalidURIError, "bad Bundler::URI(is not Bundler::URI?): #{uri.inspect}"
|
||||||
|
end
|
||||||
|
uri.ascii_only? or
|
||||||
|
raise InvalidURIError, "Bundler::URI must be ascii only #{uri.dump}"
|
||||||
|
if m = RFC3986_URI.match(uri)
|
||||||
|
query = m["query".freeze]
|
||||||
|
scheme = m["scheme".freeze]
|
||||||
|
opaque = m["path-rootless".freeze]
|
||||||
|
if opaque
|
||||||
|
opaque << "?#{query}" if query
|
||||||
|
[ scheme,
|
||||||
|
nil, # userinfo
|
||||||
|
nil, # host
|
||||||
|
nil, # port
|
||||||
|
nil, # registry
|
||||||
|
nil, # path
|
||||||
|
opaque,
|
||||||
|
nil, # query
|
||||||
|
m["fragment".freeze]
|
||||||
|
]
|
||||||
|
else # normal
|
||||||
|
[ scheme,
|
||||||
|
m["userinfo".freeze],
|
||||||
|
m["host".freeze],
|
||||||
|
m["port".freeze],
|
||||||
|
nil, # registry
|
||||||
|
(m["path-abempty".freeze] ||
|
||||||
|
m["path-absolute".freeze] ||
|
||||||
|
m["path-empty".freeze]),
|
||||||
|
nil, # opaque
|
||||||
|
query,
|
||||||
|
m["fragment".freeze]
|
||||||
|
]
|
||||||
|
end
|
||||||
|
elsif m = RFC3986_relative_ref.match(uri)
|
||||||
|
[ nil, # scheme
|
||||||
|
m["userinfo".freeze],
|
||||||
|
m["host".freeze],
|
||||||
|
m["port".freeze],
|
||||||
|
nil, # registry,
|
||||||
|
(m["path-abempty".freeze] ||
|
||||||
|
m["path-absolute".freeze] ||
|
||||||
|
m["path-noscheme".freeze] ||
|
||||||
|
m["path-empty".freeze]),
|
||||||
|
nil, # opaque
|
||||||
|
m["query".freeze],
|
||||||
|
m["fragment".freeze]
|
||||||
|
]
|
||||||
|
else
|
||||||
|
raise InvalidURIError, "bad Bundler::URI(is not Bundler::URI?): #{uri.inspect}"
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
def parse(uri) # :nodoc:
|
||||||
|
scheme, userinfo, host, port,
|
||||||
|
registry, path, opaque, query, fragment = self.split(uri)
|
||||||
|
scheme_list = Bundler::URI.scheme_list
|
||||||
|
if scheme && scheme_list.include?(uc = scheme.upcase)
|
||||||
|
scheme_list[uc].new(scheme, userinfo, host, port,
|
||||||
|
registry, path, opaque, query,
|
||||||
|
fragment, self)
|
||||||
|
else
|
||||||
|
Generic.new(scheme, userinfo, host, port,
|
||||||
|
registry, path, opaque, query,
|
||||||
|
fragment, self)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
|
||||||
|
def join(*uris) # :nodoc:
|
||||||
|
uris[0] = convert_to_uri(uris[0])
|
||||||
|
uris.inject :merge
|
||||||
|
end
|
||||||
|
|
||||||
|
@@to_s = Kernel.instance_method(:to_s)
|
||||||
|
def inspect
|
||||||
|
@@to_s.bind_call(self)
|
||||||
|
end
|
||||||
|
|
||||||
|
private
|
||||||
|
|
||||||
|
def default_regexp # :nodoc:
|
||||||
|
{
|
||||||
|
SCHEME: /\A[A-Za-z][A-Za-z0-9+\-.]*\z/,
|
||||||
|
USERINFO: /\A(?:%\h\h|[!$&-.0-;=A-Z_a-z~])*\z/,
|
||||||
|
HOST: /\A(?:(?<IP-literal>\[(?:(?<IPv6address>(?:\h{1,4}:){6}(?<ls32>\h{1,4}:\h{1,4}|(?<IPv4address>(?<dec-octet>[1-9]\d|1\d{2}|2[0-4]\d|25[0-5]|\d)\.\g<dec-octet>\.\g<dec-octet>\.\g<dec-octet>))|::(?:\h{1,4}:){5}\g<ls32>|\h{,4}::(?:\h{1,4}:){4}\g<ls32>|(?:(?:\h{1,4}:)?\h{1,4})?::(?:\h{1,4}:){3}\g<ls32>|(?:(?:\h{1,4}:){,2}\h{1,4})?::(?:\h{1,4}:){2}\g<ls32>|(?:(?:\h{1,4}:){,3}\h{1,4})?::\h{1,4}:\g<ls32>|(?:(?:\h{1,4}:){,4}\h{1,4})?::\g<ls32>|(?:(?:\h{1,4}:){,5}\h{1,4})?::\h{1,4}|(?:(?:\h{1,4}:){,6}\h{1,4})?::)|(?<IPvFuture>v\h+\.[!$&-.0-;=A-Z_a-z~]+))\])|\g<IPv4address>|(?<reg-name>(?:%\h\h|[!$&-.0-9;=A-Z_a-z~])*))\z/,
|
||||||
|
ABS_PATH: /\A\/(?:%\h\h|[!$&-.0-;=@-Z_a-z~])*(?:\/(?:%\h\h|[!$&-.0-;=@-Z_a-z~])*)*\z/,
|
||||||
|
REL_PATH: /\A(?:%\h\h|[!$&-.0-;=@-Z_a-z~])+(?:\/(?:%\h\h|[!$&-.0-;=@-Z_a-z~])*)*\z/,
|
||||||
|
QUERY: /\A(?:%\h\h|[!$&-.0-;=@-Z_a-z~\/?])*\z/,
|
||||||
|
FRAGMENT: /\A(?:%\h\h|[!$&-.0-;=@-Z_a-z~\/?])*\z/,
|
||||||
|
OPAQUE: /\A(?:[^\/].*)?\z/,
|
||||||
|
PORT: /\A[\x09\x0a\x0c\x0d ]*\d*[\x09\x0a\x0c\x0d ]*\z/,
|
||||||
|
}
|
||||||
|
end
|
||||||
|
|
||||||
|
def convert_to_uri(uri)
|
||||||
|
if uri.is_a?(Bundler::URI::Generic)
|
||||||
|
uri
|
||||||
|
elsif uri = String.try_convert(uri)
|
||||||
|
parse(uri)
|
||||||
|
else
|
||||||
|
raise ArgumentError,
|
||||||
|
"bad argument (expected Bundler::URI object or Bundler::URI string)"
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
end # class Parser
|
||||||
|
end # module Bundler::URI
|
||||||
6
lib/bundler/vendor/uri/lib/uri/version.rb
vendored
Normal file
6
lib/bundler/vendor/uri/lib/uri/version.rb
vendored
Normal file
|
|
@ -0,0 +1,6 @@
|
||||||
|
module Bundler::URI
|
||||||
|
# :stopdoc:
|
||||||
|
VERSION_CODE = '001000'.freeze
|
||||||
|
VERSION = VERSION_CODE.scan(/../).collect{|n| n.to_i}.join('.').freeze
|
||||||
|
# :startdoc:
|
||||||
|
end
|
||||||
4
lib/bundler/vendored_uri.rb
Normal file
4
lib/bundler/vendored_uri.rb
Normal file
|
|
@ -0,0 +1,4 @@
|
||||||
|
# frozen_string_literal: true
|
||||||
|
|
||||||
|
module Bundler; end
|
||||||
|
require_relative "vendor/uri/lib/uri"
|
||||||
|
|
@ -1,7 +1,7 @@
|
||||||
# frozen_string_literal: false
|
# frozen_string_literal: false
|
||||||
|
|
||||||
module Bundler
|
module Bundler
|
||||||
VERSION = "2.1.0.pre.3".freeze
|
VERSION = "2.1.0".freeze
|
||||||
|
|
||||||
def self.bundler_major_version
|
def self.bundler_major_version
|
||||||
@bundler_major_version ||= VERSION.split(".").first.to_i
|
@bundler_major_version ||= VERSION.split(".").first.to_i
|
||||||
|
|
|
||||||
|
|
@ -1,7 +1,7 @@
|
||||||
.\" generated with Ronn/v0.7.3
|
.\" generated with Ronn/v0.7.3
|
||||||
.\" http://github.com/rtomayko/ronn/tree/0.7.3
|
.\" http://github.com/rtomayko/ronn/tree/0.7.3
|
||||||
.
|
.
|
||||||
.TH "BUNDLE\-ADD" "1" "November 2019" "" ""
|
.TH "BUNDLE\-ADD" "1" "December 2019" "" ""
|
||||||
.
|
.
|
||||||
.SH "NAME"
|
.SH "NAME"
|
||||||
\fBbundle\-add\fR \- Add gem to the Gemfile and run bundle install
|
\fBbundle\-add\fR \- Add gem to the Gemfile and run bundle install
|
||||||
|
|
|
||||||
|
|
@ -55,4 +55,4 @@ OPTIONS
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
November 2019 BUNDLE-ADD(1)
|
December 2019 BUNDLE-ADD(1)
|
||||||
|
|
|
||||||
|
|
@ -1,7 +1,7 @@
|
||||||
.\" generated with Ronn/v0.7.3
|
.\" generated with Ronn/v0.7.3
|
||||||
.\" http://github.com/rtomayko/ronn/tree/0.7.3
|
.\" http://github.com/rtomayko/ronn/tree/0.7.3
|
||||||
.
|
.
|
||||||
.TH "BUNDLE\-BINSTUBS" "1" "November 2019" "" ""
|
.TH "BUNDLE\-BINSTUBS" "1" "December 2019" "" ""
|
||||||
.
|
.
|
||||||
.SH "NAME"
|
.SH "NAME"
|
||||||
\fBbundle\-binstubs\fR \- Install the binstubs of the listed gems
|
\fBbundle\-binstubs\fR \- Install the binstubs of the listed gems
|
||||||
|
|
|
||||||
|
|
@ -45,4 +45,4 @@ BUNDLE INSTALL --BINSTUBS
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
November 2019 BUNDLE-BINSTUBS(1)
|
December 2019 BUNDLE-BINSTUBS(1)
|
||||||
|
|
|
||||||
|
|
@ -1,7 +1,7 @@
|
||||||
.\" generated with Ronn/v0.7.3
|
.\" generated with Ronn/v0.7.3
|
||||||
.\" http://github.com/rtomayko/ronn/tree/0.7.3
|
.\" http://github.com/rtomayko/ronn/tree/0.7.3
|
||||||
.
|
.
|
||||||
.TH "BUNDLE\-CACHE" "1" "November 2019" "" ""
|
.TH "BUNDLE\-CACHE" "1" "December 2019" "" ""
|
||||||
.
|
.
|
||||||
.SH "NAME"
|
.SH "NAME"
|
||||||
\fBbundle\-cache\fR \- Package your needed \fB\.gem\fR files into your application
|
\fBbundle\-cache\fR \- Package your needed \fB\.gem\fR files into your application
|
||||||
|
|
|
||||||
|
|
@ -75,4 +75,4 @@ REMOTE FETCHING
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
November 2019 BUNDLE-CACHE(1)
|
December 2019 BUNDLE-CACHE(1)
|
||||||
|
|
|
||||||
|
|
@ -1,7 +1,7 @@
|
||||||
.\" generated with Ronn/v0.7.3
|
.\" generated with Ronn/v0.7.3
|
||||||
.\" http://github.com/rtomayko/ronn/tree/0.7.3
|
.\" http://github.com/rtomayko/ronn/tree/0.7.3
|
||||||
.
|
.
|
||||||
.TH "BUNDLE\-CHECK" "1" "November 2019" "" ""
|
.TH "BUNDLE\-CHECK" "1" "December 2019" "" ""
|
||||||
.
|
.
|
||||||
.SH "NAME"
|
.SH "NAME"
|
||||||
\fBbundle\-check\fR \- Verifies if dependencies are satisfied by installed gems
|
\fBbundle\-check\fR \- Verifies if dependencies are satisfied by installed gems
|
||||||
|
|
|
||||||
|
|
@ -30,4 +30,4 @@ OPTIONS
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
November 2019 BUNDLE-CHECK(1)
|
December 2019 BUNDLE-CHECK(1)
|
||||||
|
|
|
||||||
|
|
@ -1,7 +1,7 @@
|
||||||
.\" generated with Ronn/v0.7.3
|
.\" generated with Ronn/v0.7.3
|
||||||
.\" http://github.com/rtomayko/ronn/tree/0.7.3
|
.\" http://github.com/rtomayko/ronn/tree/0.7.3
|
||||||
.
|
.
|
||||||
.TH "BUNDLE\-CLEAN" "1" "November 2019" "" ""
|
.TH "BUNDLE\-CLEAN" "1" "December 2019" "" ""
|
||||||
.
|
.
|
||||||
.SH "NAME"
|
.SH "NAME"
|
||||||
\fBbundle\-clean\fR \- Cleans up unused gems in your bundler directory
|
\fBbundle\-clean\fR \- Cleans up unused gems in your bundler directory
|
||||||
|
|
|
||||||
|
|
@ -23,4 +23,4 @@ OPTIONS
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
November 2019 BUNDLE-CLEAN(1)
|
December 2019 BUNDLE-CLEAN(1)
|
||||||
|
|
|
||||||
|
|
@ -1,7 +1,7 @@
|
||||||
.\" generated with Ronn/v0.7.3
|
.\" generated with Ronn/v0.7.3
|
||||||
.\" http://github.com/rtomayko/ronn/tree/0.7.3
|
.\" http://github.com/rtomayko/ronn/tree/0.7.3
|
||||||
.
|
.
|
||||||
.TH "BUNDLE\-CONFIG" "1" "November 2019" "" ""
|
.TH "BUNDLE\-CONFIG" "1" "December 2019" "" ""
|
||||||
.
|
.
|
||||||
.SH "NAME"
|
.SH "NAME"
|
||||||
\fBbundle\-config\fR \- Set bundler configuration options
|
\fBbundle\-config\fR \- Set bundler configuration options
|
||||||
|
|
|
||||||
|
|
@ -525,4 +525,4 @@ CONFIGURE BUNDLER DIRECTORIES
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
November 2019 BUNDLE-CONFIG(1)
|
December 2019 BUNDLE-CONFIG(1)
|
||||||
|
|
|
||||||
|
|
@ -1,7 +1,7 @@
|
||||||
.\" generated with Ronn/v0.7.3
|
.\" generated with Ronn/v0.7.3
|
||||||
.\" http://github.com/rtomayko/ronn/tree/0.7.3
|
.\" http://github.com/rtomayko/ronn/tree/0.7.3
|
||||||
.
|
.
|
||||||
.TH "BUNDLE\-DOCTOR" "1" "November 2019" "" ""
|
.TH "BUNDLE\-DOCTOR" "1" "December 2019" "" ""
|
||||||
.
|
.
|
||||||
.SH "NAME"
|
.SH "NAME"
|
||||||
\fBbundle\-doctor\fR \- Checks the bundle for common problems
|
\fBbundle\-doctor\fR \- Checks the bundle for common problems
|
||||||
|
|
|
||||||
|
|
@ -41,4 +41,4 @@ OPTIONS
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
November 2019 BUNDLE-DOCTOR(1)
|
December 2019 BUNDLE-DOCTOR(1)
|
||||||
|
|
|
||||||
|
|
@ -1,7 +1,7 @@
|
||||||
.\" generated with Ronn/v0.7.3
|
.\" generated with Ronn/v0.7.3
|
||||||
.\" http://github.com/rtomayko/ronn/tree/0.7.3
|
.\" http://github.com/rtomayko/ronn/tree/0.7.3
|
||||||
.
|
.
|
||||||
.TH "BUNDLE\-EXEC" "1" "November 2019" "" ""
|
.TH "BUNDLE\-EXEC" "1" "December 2019" "" ""
|
||||||
.
|
.
|
||||||
.SH "NAME"
|
.SH "NAME"
|
||||||
\fBbundle\-exec\fR \- Execute a command in the context of the bundle
|
\fBbundle\-exec\fR \- Execute a command in the context of the bundle
|
||||||
|
|
|
||||||
|
|
@ -175,4 +175,4 @@ RUBYGEMS PLUGINS
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
November 2019 BUNDLE-EXEC(1)
|
December 2019 BUNDLE-EXEC(1)
|
||||||
|
|
|
||||||
|
|
@ -1,7 +1,7 @@
|
||||||
.\" generated with Ronn/v0.7.3
|
.\" generated with Ronn/v0.7.3
|
||||||
.\" http://github.com/rtomayko/ronn/tree/0.7.3
|
.\" http://github.com/rtomayko/ronn/tree/0.7.3
|
||||||
.
|
.
|
||||||
.TH "BUNDLE\-GEM" "1" "November 2019" "" ""
|
.TH "BUNDLE\-GEM" "1" "December 2019" "" ""
|
||||||
.
|
.
|
||||||
.SH "NAME"
|
.SH "NAME"
|
||||||
\fBbundle\-gem\fR \- Generate a project skeleton for creating a rubygem
|
\fBbundle\-gem\fR \- Generate a project skeleton for creating a rubygem
|
||||||
|
|
|
||||||
|
|
@ -88,4 +88,4 @@ SEE ALSO
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
November 2019 BUNDLE-GEM(1)
|
December 2019 BUNDLE-GEM(1)
|
||||||
|
|
|
||||||
|
|
@ -1,7 +1,7 @@
|
||||||
.\" generated with Ronn/v0.7.3
|
.\" generated with Ronn/v0.7.3
|
||||||
.\" http://github.com/rtomayko/ronn/tree/0.7.3
|
.\" http://github.com/rtomayko/ronn/tree/0.7.3
|
||||||
.
|
.
|
||||||
.TH "BUNDLE\-INFO" "1" "November 2019" "" ""
|
.TH "BUNDLE\-INFO" "1" "December 2019" "" ""
|
||||||
.
|
.
|
||||||
.SH "NAME"
|
.SH "NAME"
|
||||||
\fBbundle\-info\fR \- Show information for the given gem in your bundle
|
\fBbundle\-info\fR \- Show information for the given gem in your bundle
|
||||||
|
|
|
||||||
|
|
@ -18,4 +18,4 @@ OPTIONS
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
November 2019 BUNDLE-INFO(1)
|
December 2019 BUNDLE-INFO(1)
|
||||||
|
|
|
||||||
|
|
@ -1,7 +1,7 @@
|
||||||
.\" generated with Ronn/v0.7.3
|
.\" generated with Ronn/v0.7.3
|
||||||
.\" http://github.com/rtomayko/ronn/tree/0.7.3
|
.\" http://github.com/rtomayko/ronn/tree/0.7.3
|
||||||
.
|
.
|
||||||
.TH "BUNDLE\-INIT" "1" "November 2019" "" ""
|
.TH "BUNDLE\-INIT" "1" "December 2019" "" ""
|
||||||
.
|
.
|
||||||
.SH "NAME"
|
.SH "NAME"
|
||||||
\fBbundle\-init\fR \- Generates a Gemfile into the current working directory
|
\fBbundle\-init\fR \- Generates a Gemfile into the current working directory
|
||||||
|
|
|
||||||
|
|
@ -31,4 +31,4 @@ SEE ALSO
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
November 2019 BUNDLE-INIT(1)
|
December 2019 BUNDLE-INIT(1)
|
||||||
|
|
|
||||||
|
|
@ -1,7 +1,7 @@
|
||||||
.\" generated with Ronn/v0.7.3
|
.\" generated with Ronn/v0.7.3
|
||||||
.\" http://github.com/rtomayko/ronn/tree/0.7.3
|
.\" http://github.com/rtomayko/ronn/tree/0.7.3
|
||||||
.
|
.
|
||||||
.TH "BUNDLE\-INJECT" "1" "November 2019" "" ""
|
.TH "BUNDLE\-INJECT" "1" "December 2019" "" ""
|
||||||
.
|
.
|
||||||
.SH "NAME"
|
.SH "NAME"
|
||||||
\fBbundle\-inject\fR \- Add named gem(s) with version requirements to Gemfile
|
\fBbundle\-inject\fR \- Add named gem(s) with version requirements to Gemfile
|
||||||
|
|
|
||||||
|
|
@ -29,4 +29,4 @@ DESCRIPTION
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
November 2019 BUNDLE-INJECT(1)
|
December 2019 BUNDLE-INJECT(1)
|
||||||
|
|
|
||||||
|
|
@ -1,7 +1,7 @@
|
||||||
.\" generated with Ronn/v0.7.3
|
.\" generated with Ronn/v0.7.3
|
||||||
.\" http://github.com/rtomayko/ronn/tree/0.7.3
|
.\" http://github.com/rtomayko/ronn/tree/0.7.3
|
||||||
.
|
.
|
||||||
.TH "BUNDLE\-INSTALL" "1" "November 2019" "" ""
|
.TH "BUNDLE\-INSTALL" "1" "December 2019" "" ""
|
||||||
.
|
.
|
||||||
.SH "NAME"
|
.SH "NAME"
|
||||||
\fBbundle\-install\fR \- Install the dependencies specified in your Gemfile
|
\fBbundle\-install\fR \- Install the dependencies specified in your Gemfile
|
||||||
|
|
|
||||||
|
|
@ -398,4 +398,4 @@ SEE ALSO
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
November 2019 BUNDLE-INSTALL(1)
|
December 2019 BUNDLE-INSTALL(1)
|
||||||
|
|
|
||||||
|
|
@ -1,7 +1,7 @@
|
||||||
.\" generated with Ronn/v0.7.3
|
.\" generated with Ronn/v0.7.3
|
||||||
.\" http://github.com/rtomayko/ronn/tree/0.7.3
|
.\" http://github.com/rtomayko/ronn/tree/0.7.3
|
||||||
.
|
.
|
||||||
.TH "BUNDLE\-LIST" "1" "November 2019" "" ""
|
.TH "BUNDLE\-LIST" "1" "December 2019" "" ""
|
||||||
.
|
.
|
||||||
.SH "NAME"
|
.SH "NAME"
|
||||||
\fBbundle\-list\fR \- List all the gems in the bundle
|
\fBbundle\-list\fR \- List all the gems in the bundle
|
||||||
|
|
|
||||||
|
|
@ -40,4 +40,4 @@ OPTIONS
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
November 2019 BUNDLE-LIST(1)
|
December 2019 BUNDLE-LIST(1)
|
||||||
|
|
|
||||||
|
|
@ -1,7 +1,7 @@
|
||||||
.\" generated with Ronn/v0.7.3
|
.\" generated with Ronn/v0.7.3
|
||||||
.\" http://github.com/rtomayko/ronn/tree/0.7.3
|
.\" http://github.com/rtomayko/ronn/tree/0.7.3
|
||||||
.
|
.
|
||||||
.TH "BUNDLE\-LOCK" "1" "November 2019" "" ""
|
.TH "BUNDLE\-LOCK" "1" "December 2019" "" ""
|
||||||
.
|
.
|
||||||
.SH "NAME"
|
.SH "NAME"
|
||||||
\fBbundle\-lock\fR \- Creates / Updates a lockfile without installing
|
\fBbundle\-lock\fR \- Creates / Updates a lockfile without installing
|
||||||
|
|
|
||||||
|
|
@ -90,4 +90,4 @@ PATCH LEVEL OPTIONS
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
November 2019 BUNDLE-LOCK(1)
|
December 2019 BUNDLE-LOCK(1)
|
||||||
|
|
|
||||||
|
|
@ -1,7 +1,7 @@
|
||||||
.\" generated with Ronn/v0.7.3
|
.\" generated with Ronn/v0.7.3
|
||||||
.\" http://github.com/rtomayko/ronn/tree/0.7.3
|
.\" http://github.com/rtomayko/ronn/tree/0.7.3
|
||||||
.
|
.
|
||||||
.TH "BUNDLE\-OPEN" "1" "November 2019" "" ""
|
.TH "BUNDLE\-OPEN" "1" "December 2019" "" ""
|
||||||
.
|
.
|
||||||
.SH "NAME"
|
.SH "NAME"
|
||||||
\fBbundle\-open\fR \- Opens the source directory for a gem in your bundle
|
\fBbundle\-open\fR \- Opens the source directory for a gem in your bundle
|
||||||
|
|
|
||||||
|
|
@ -26,4 +26,4 @@ DESCRIPTION
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
November 2019 BUNDLE-OPEN(1)
|
December 2019 BUNDLE-OPEN(1)
|
||||||
|
|
|
||||||
|
|
@ -1,7 +1,7 @@
|
||||||
.\" generated with Ronn/v0.7.3
|
.\" generated with Ronn/v0.7.3
|
||||||
.\" http://github.com/rtomayko/ronn/tree/0.7.3
|
.\" http://github.com/rtomayko/ronn/tree/0.7.3
|
||||||
.
|
.
|
||||||
.TH "BUNDLE\-OUTDATED" "1" "November 2019" "" ""
|
.TH "BUNDLE\-OUTDATED" "1" "December 2019" "" ""
|
||||||
.
|
.
|
||||||
.SH "NAME"
|
.SH "NAME"
|
||||||
\fBbundle\-outdated\fR \- List installed gems with newer versions available
|
\fBbundle\-outdated\fR \- List installed gems with newer versions available
|
||||||
|
|
|
||||||
|
|
@ -128,4 +128,4 @@ FILTERING OUTPUT
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
November 2019 BUNDLE-OUTDATED(1)
|
December 2019 BUNDLE-OUTDATED(1)
|
||||||
|
|
|
||||||
|
|
@ -1,7 +1,7 @@
|
||||||
.\" generated with Ronn/v0.7.3
|
.\" generated with Ronn/v0.7.3
|
||||||
.\" http://github.com/rtomayko/ronn/tree/0.7.3
|
.\" http://github.com/rtomayko/ronn/tree/0.7.3
|
||||||
.
|
.
|
||||||
.TH "BUNDLE\-PLATFORM" "1" "November 2019" "" ""
|
.TH "BUNDLE\-PLATFORM" "1" "December 2019" "" ""
|
||||||
.
|
.
|
||||||
.SH "NAME"
|
.SH "NAME"
|
||||||
\fBbundle\-platform\fR \- Displays platform compatibility information
|
\fBbundle\-platform\fR \- Displays platform compatibility information
|
||||||
|
|
|
||||||
|
|
@ -54,4 +54,4 @@ OPTIONS
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
November 2019 BUNDLE-PLATFORM(1)
|
December 2019 BUNDLE-PLATFORM(1)
|
||||||
|
|
|
||||||
|
|
@ -1,7 +1,7 @@
|
||||||
.\" generated with Ronn/v0.7.3
|
.\" generated with Ronn/v0.7.3
|
||||||
.\" http://github.com/rtomayko/ronn/tree/0.7.3
|
.\" http://github.com/rtomayko/ronn/tree/0.7.3
|
||||||
.
|
.
|
||||||
.TH "BUNDLE\-PRISTINE" "1" "November 2019" "" ""
|
.TH "BUNDLE\-PRISTINE" "1" "December 2019" "" ""
|
||||||
.
|
.
|
||||||
.SH "NAME"
|
.SH "NAME"
|
||||||
\fBbundle\-pristine\fR \- Restores installed gems to their pristine condition
|
\fBbundle\-pristine\fR \- Restores installed gems to their pristine condition
|
||||||
|
|
|
||||||
|
|
@ -41,4 +41,4 @@ DESCRIPTION
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
November 2019 BUNDLE-PRISTINE(1)
|
December 2019 BUNDLE-PRISTINE(1)
|
||||||
|
|
|
||||||
|
|
@ -1,7 +1,7 @@
|
||||||
.\" generated with Ronn/v0.7.3
|
.\" generated with Ronn/v0.7.3
|
||||||
.\" http://github.com/rtomayko/ronn/tree/0.7.3
|
.\" http://github.com/rtomayko/ronn/tree/0.7.3
|
||||||
.
|
.
|
||||||
.TH "BUNDLE\-REMOVE" "1" "November 2019" "" ""
|
.TH "BUNDLE\-REMOVE" "1" "December 2019" "" ""
|
||||||
.
|
.
|
||||||
.SH "NAME"
|
.SH "NAME"
|
||||||
\fBbundle\-remove\fR \- Removes gems from the Gemfile
|
\fBbundle\-remove\fR \- Removes gems from the Gemfile
|
||||||
|
|
|
||||||
|
|
@ -31,4 +31,4 @@ OPTIONS
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
November 2019 BUNDLE-REMOVE(1)
|
December 2019 BUNDLE-REMOVE(1)
|
||||||
|
|
|
||||||
|
|
@ -1,7 +1,7 @@
|
||||||
.\" generated with Ronn/v0.7.3
|
.\" generated with Ronn/v0.7.3
|
||||||
.\" http://github.com/rtomayko/ronn/tree/0.7.3
|
.\" http://github.com/rtomayko/ronn/tree/0.7.3
|
||||||
.
|
.
|
||||||
.TH "BUNDLE\-SHOW" "1" "November 2019" "" ""
|
.TH "BUNDLE\-SHOW" "1" "December 2019" "" ""
|
||||||
.
|
.
|
||||||
.SH "NAME"
|
.SH "NAME"
|
||||||
\fBbundle\-show\fR \- Shows all the gems in your bundle, or the path to a gem
|
\fBbundle\-show\fR \- Shows all the gems in your bundle, or the path to a gem
|
||||||
|
|
|
||||||
|
|
@ -24,4 +24,4 @@ OPTIONS
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
November 2019 BUNDLE-SHOW(1)
|
December 2019 BUNDLE-SHOW(1)
|
||||||
|
|
|
||||||
|
|
@ -1,7 +1,7 @@
|
||||||
.\" generated with Ronn/v0.7.3
|
.\" generated with Ronn/v0.7.3
|
||||||
.\" http://github.com/rtomayko/ronn/tree/0.7.3
|
.\" http://github.com/rtomayko/ronn/tree/0.7.3
|
||||||
.
|
.
|
||||||
.TH "BUNDLE\-UPDATE" "1" "November 2019" "" ""
|
.TH "BUNDLE\-UPDATE" "1" "December 2019" "" ""
|
||||||
.
|
.
|
||||||
.SH "NAME"
|
.SH "NAME"
|
||||||
\fBbundle\-update\fR \- Update your gems to the latest available versions
|
\fBbundle\-update\fR \- Update your gems to the latest available versions
|
||||||
|
|
|
||||||
|
|
@ -387,4 +387,4 @@ RECOMMENDED WORKFLOW
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
November 2019 BUNDLE-UPDATE(1)
|
December 2019 BUNDLE-UPDATE(1)
|
||||||
|
|
|
||||||
|
|
@ -1,7 +1,7 @@
|
||||||
.\" generated with Ronn/v0.7.3
|
.\" generated with Ronn/v0.7.3
|
||||||
.\" http://github.com/rtomayko/ronn/tree/0.7.3
|
.\" http://github.com/rtomayko/ronn/tree/0.7.3
|
||||||
.
|
.
|
||||||
.TH "BUNDLE\-VIZ" "1" "November 2019" "" ""
|
.TH "BUNDLE\-VIZ" "1" "December 2019" "" ""
|
||||||
.
|
.
|
||||||
.SH "NAME"
|
.SH "NAME"
|
||||||
\fBbundle\-viz\fR \- Generates a visual dependency graph for your Gemfile
|
\fBbundle\-viz\fR \- Generates a visual dependency graph for your Gemfile
|
||||||
|
|
|
||||||
|
|
@ -36,4 +36,4 @@ OPTIONS
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
November 2019 BUNDLE-VIZ(1)
|
December 2019 BUNDLE-VIZ(1)
|
||||||
|
|
|
||||||
|
|
@ -1,7 +1,7 @@
|
||||||
.\" generated with Ronn/v0.7.3
|
.\" generated with Ronn/v0.7.3
|
||||||
.\" http://github.com/rtomayko/ronn/tree/0.7.3
|
.\" http://github.com/rtomayko/ronn/tree/0.7.3
|
||||||
.
|
.
|
||||||
.TH "BUNDLE" "1" "November 2019" "" ""
|
.TH "BUNDLE" "1" "December 2019" "" ""
|
||||||
.
|
.
|
||||||
.SH "NAME"
|
.SH "NAME"
|
||||||
\fBbundle\fR \- Ruby Dependency Management
|
\fBbundle\fR \- Ruby Dependency Management
|
||||||
|
|
|
||||||
|
|
@ -113,4 +113,4 @@ OBSOLETE
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
November 2019 BUNDLE(1)
|
December 2019 BUNDLE(1)
|
||||||
|
|
|
||||||
|
|
@ -1,7 +1,7 @@
|
||||||
.\" generated with Ronn/v0.7.3
|
.\" generated with Ronn/v0.7.3
|
||||||
.\" http://github.com/rtomayko/ronn/tree/0.7.3
|
.\" http://github.com/rtomayko/ronn/tree/0.7.3
|
||||||
.
|
.
|
||||||
.TH "GEMFILE" "5" "November 2019" "" ""
|
.TH "GEMFILE" "5" "December 2019" "" ""
|
||||||
.
|
.
|
||||||
.SH "NAME"
|
.SH "NAME"
|
||||||
\fBGemfile\fR \- A format for describing gem dependencies for Ruby programs
|
\fBGemfile\fR \- A format for describing gem dependencies for Ruby programs
|
||||||
|
|
|
||||||
|
|
@ -646,4 +646,4 @@ SOURCE PRIORITY
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
November 2019 GEMFILE(5)
|
December 2019 GEMFILE(5)
|
||||||
|
|
|
||||||
|
|
@ -46,7 +46,7 @@ RSpec.describe Bundler::Definition do
|
||||||
s.add_dependency "rack", "1.0"
|
s.add_dependency "rack", "1.0"
|
||||||
end
|
end
|
||||||
|
|
||||||
bundle :install, :env => { "DEBUG" => 1 }
|
bundle :install, :env => { "DEBUG" => "1" }
|
||||||
|
|
||||||
expect(out).to match(/re-resolving dependencies/)
|
expect(out).to match(/re-resolving dependencies/)
|
||||||
lockfile_should_be <<-G
|
lockfile_should_be <<-G
|
||||||
|
|
@ -84,7 +84,7 @@ RSpec.describe Bundler::Definition do
|
||||||
s.add_dependency "rack", "1.0"
|
s.add_dependency "rack", "1.0"
|
||||||
end
|
end
|
||||||
|
|
||||||
bundle :install, :env => { "DEBUG" => 1 }
|
bundle :install, :env => { "DEBUG" => "1" }
|
||||||
|
|
||||||
expect(out).to match(/re-resolving dependencies/)
|
expect(out).to match(/re-resolving dependencies/)
|
||||||
lockfile_should_be <<-G
|
lockfile_should_be <<-G
|
||||||
|
|
@ -121,7 +121,7 @@ RSpec.describe Bundler::Definition do
|
||||||
gem "foo", :path => "#{lib_path("foo")}"
|
gem "foo", :path => "#{lib_path("foo")}"
|
||||||
G
|
G
|
||||||
|
|
||||||
bundle :check, :env => { "DEBUG" => 1 }
|
bundle :check, :env => { "DEBUG" => "1" }
|
||||||
|
|
||||||
expect(out).to match(/using resolution from the lockfile/)
|
expect(out).to match(/using resolution from the lockfile/)
|
||||||
lockfile_should_be <<-G
|
lockfile_should_be <<-G
|
||||||
|
|
@ -154,7 +154,7 @@ RSpec.describe Bundler::Definition do
|
||||||
G
|
G
|
||||||
|
|
||||||
bundle "lock --add-platform java"
|
bundle "lock --add-platform java"
|
||||||
bundle :check, :env => { "DEBUG" => 1 }
|
bundle :check, :env => { "DEBUG" => "1" }
|
||||||
|
|
||||||
expect(out).to match(/using resolution from the lockfile/)
|
expect(out).to match(/using resolution from the lockfile/)
|
||||||
lockfile_should_be <<-G
|
lockfile_should_be <<-G
|
||||||
|
|
@ -181,7 +181,7 @@ RSpec.describe Bundler::Definition do
|
||||||
gem "foo"
|
gem "foo"
|
||||||
G
|
G
|
||||||
|
|
||||||
bundle :check, :env => { "DEBUG" => 1 }
|
bundle :check, :env => { "DEBUG" => "1" }
|
||||||
|
|
||||||
expect(out).to match(/using resolution from the lockfile/)
|
expect(out).to match(/using resolution from the lockfile/)
|
||||||
lockfile_should_be <<-G
|
lockfile_should_be <<-G
|
||||||
|
|
|
||||||
Some files were not shown because too many files have changed in this diff Show more
Loading…
Add table
Add a link
Reference in a new issue