зеркало из https://github.com/github/ruby.git
Prepare to release bundler-2.1.0
This commit is contained in:
Родитель
e2b192f7d5
Коммит
38002a8adb
|
@ -50,7 +50,6 @@ module Bundler
|
|||
autoload :FeatureFlag, File.expand_path("bundler/feature_flag", __dir__)
|
||||
autoload :GemHelper, File.expand_path("bundler/gem_helper", __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 :Graph, File.expand_path("bundler/graph", __dir__)
|
||||
autoload :Index, File.expand_path("bundler/index", __dir__)
|
||||
|
|
|
@ -783,7 +783,7 @@ module Bundler
|
|||
return unless SharedHelpers.md5_available?
|
||||
|
||||
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).
|
||||
instance_variable_get(:@cache).
|
||||
dependencies("bundler").
|
||||
|
|
|
@ -25,7 +25,7 @@ module Bundler
|
|||
["config", "get", ARGV[1]]
|
||||
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."
|
||||
|
||||
Base.new(options, name, value, self).run
|
||||
|
|
|
@ -25,12 +25,12 @@ module Bundler
|
|||
SharedHelpers.set_bundle_environment
|
||||
if bin_path = Bundler.which(cmd)
|
||||
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
|
||||
kernel_exec(bin_path, *args)
|
||||
with_verbose_rubygems { kernel_exec(bin_path, *args) }
|
||||
else
|
||||
# exec using the given command
|
||||
kernel_exec(cmd, *args)
|
||||
with_verbose_rubygems { kernel_exec(cmd, *args) }
|
||||
end
|
||||
end
|
||||
|
||||
|
@ -89,5 +89,14 @@ module Bundler
|
|||
first_line = File.open(file, "rb") {|f| f.read(possibilities.map(&:size).max) }
|
||||
possibilities.any? {|shebang| first_line.start_with?(shebang) }
|
||||
end
|
||||
|
||||
def with_verbose_rubygems
|
||||
old_ui = Gem::DefaultUserInteraction.ui
|
||||
Gem::DefaultUserInteraction.ui = nil
|
||||
|
||||
yield
|
||||
ensure
|
||||
Gem::DefaultUserInteraction.ui = old_ui
|
||||
end
|
||||
end
|
||||
end
|
||||
|
|
|
@ -22,7 +22,7 @@ module Bundler
|
|||
if Bundler.feature_flag.update_requires_all_flag?
|
||||
raise InvalidOption, "To update everything, pass the `--all` flag."
|
||||
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]
|
||||
raise InvalidOption, "Cannot specify --all along with specific options."
|
||||
end
|
||||
|
|
|
@ -46,7 +46,7 @@ module Bundler
|
|||
settings_flag(:specific_platform) { bundler_3_mode? }
|
||||
settings_flag(:suppress_install_using_messages) { 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_option(:default_cli_command) { bundler_3_mode? ? :cli_help : :install }
|
||||
|
|
|
@ -97,7 +97,7 @@ module Bundler
|
|||
spec -= [nil, "ruby", ""]
|
||||
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"
|
||||
path = Bundler.rubygems.correct_for_windows_path(uri.path)
|
||||
Bundler.load_marshal Bundler.rubygems.inflate(Gem.read_binary(path))
|
||||
|
@ -244,7 +244,7 @@ module Bundler
|
|||
|
||||
con = PersistentHTTP.new :name => "bundler", :proxy => :ENV
|
||||
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
|
||||
|
||||
if remote_uri.scheme == "https"
|
||||
|
|
|
@ -21,7 +21,7 @@ module Bundler
|
|||
when Net::HTTPSuccess, Net::HTTPNotModified
|
||||
response
|
||||
when Net::HTTPRedirection
|
||||
new_uri = URI.parse(response["location"])
|
||||
new_uri = Bundler::URI.parse(response["location"])
|
||||
if new_uri.host == uri.host
|
||||
new_uri.user = uri.user
|
||||
new_uri.password = uri.password
|
||||
|
|
|
@ -28,7 +28,7 @@ module Bundler
|
|||
spec -= [nil, "ruby", ""]
|
||||
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"
|
||||
path = Bundler.rubygems.correct_for_windows_path(uri.path)
|
||||
Bundler.load_marshal Bundler.rubygems.inflate(Gem.read_binary(path))
|
||||
|
|
|
@ -1,6 +1,5 @@
|
|||
# frozen_string_literal: true
|
||||
|
||||
require "cgi"
|
||||
require_relative "vendored_thor"
|
||||
|
||||
module Bundler
|
||||
|
@ -114,6 +113,7 @@ module Bundler
|
|||
def issues_url(exception)
|
||||
message = exception.message.lines.first.tr(":", " ").chomp
|
||||
message = message.split("-").first if exception.is_a?(Errno)
|
||||
require "cgi"
|
||||
"https://github.com/bundler/bundler/search?q=" \
|
||||
"#{CGI.escape(message)}&type=Issues"
|
||||
end
|
||||
|
|
|
@ -73,8 +73,7 @@ module Bundler
|
|||
|
||||
def build_gem
|
||||
file_name = nil
|
||||
gem = ENV["GEM_COMMAND"] ? ENV["GEM_COMMAND"] : "gem"
|
||||
sh("#{gem} build -V #{spec_path}".shellsplit) do
|
||||
sh("#{gem_command} build -V #{spec_path}".shellsplit) do
|
||||
file_name = File.basename(built_gem_path)
|
||||
SharedHelpers.filesystem_access(File.join(base, "pkg")) {|p| FileUtils.mkdir_p(p) }
|
||||
FileUtils.mv(built_gem_path, "pkg")
|
||||
|
@ -85,11 +84,10 @@ module Bundler
|
|||
|
||||
def install_gem(built_gem_path = nil, local = false)
|
||||
built_gem_path ||= build_gem
|
||||
gem = ENV["GEM_COMMAND"] ? ENV["GEM_COMMAND"] : "gem"
|
||||
cmd = "#{gem} install #{built_gem_path}"
|
||||
cmd = "#{gem_command} install #{built_gem_path}"
|
||||
cmd += " --local" if local
|
||||
out, status = sh_with_status(cmd.shellsplit)
|
||||
unless status.success? && out[/Successfully installed/]
|
||||
_, status = sh_with_status(cmd.shellsplit)
|
||||
unless status.success?
|
||||
raise "Couldn't install gem, run `gem install #{built_gem_path}' for more detailed output"
|
||||
end
|
||||
Bundler.ui.confirm "#{name} (#{version}) installed."
|
||||
|
@ -98,13 +96,13 @@ module Bundler
|
|||
protected
|
||||
|
||||
def rubygem_push(path)
|
||||
gem_command = %W[gem push #{path}]
|
||||
gem_command << "--key" << gem_key if gem_key
|
||||
gem_command << "--host" << allowed_push_host if allowed_push_host
|
||||
cmd = %W[#{gem_command} push #{path}]
|
||||
cmd << "--key" << gem_key if gem_key
|
||||
cmd << "--host" << allowed_push_host if allowed_push_host
|
||||
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."
|
||||
end
|
||||
sh_with_input(gem_command)
|
||||
sh_with_input(cmd)
|
||||
Bundler.ui.confirm "Pushed #{name} #{version} to #{gem_push_host}"
|
||||
end
|
||||
|
||||
|
@ -211,5 +209,9 @@ module Bundler
|
|||
def gem_push?
|
||||
!%w[n no nil false off 0].include?(ENV["gem_push"].to_s.downcase)
|
||||
end
|
||||
|
||||
def gem_command
|
||||
ENV["GEM_COMMAND"] ? ENV["GEM_COMMAND"] : "gem"
|
||||
end
|
||||
end
|
||||
end
|
||||
|
|
|
@ -37,43 +37,48 @@ def gemfile(install = false, options = {}, &gemfile)
|
|||
ui.level = "silent" if opts.delete(:quiet)
|
||||
raise ArgumentError, "Unknown options: #{opts.keys.join(", ")}" unless opts.empty?
|
||||
|
||||
old_root = Bundler.method(:root)
|
||||
bundler_module = class << Bundler; self; end
|
||||
bundler_module.send(:remove_method, :root)
|
||||
def Bundler.root
|
||||
Bundler::SharedHelpers.pwd.expand_path
|
||||
end
|
||||
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?
|
||||
begin
|
||||
old_root = Bundler.method(:root)
|
||||
bundler_module = class << Bundler; self; end
|
||||
bundler_module.send(:remove_method, :root)
|
||||
def Bundler.root
|
||||
Bundler::SharedHelpers.pwd.expand_path
|
||||
end
|
||||
old_gemfile = ENV["BUNDLE_GEMFILE"]
|
||||
Bundler::SharedHelpers.set_env "BUNDLE_GEMFILE", "Gemfile"
|
||||
|
||||
Bundler.ui = install ? ui : Bundler::UI::Silent.new
|
||||
if install || missing_specs.call
|
||||
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}"
|
||||
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!
|
||||
|
||||
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
|
||||
|
||||
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
|
||||
|
||||
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)
|
||||
if old_gemfile
|
||||
ENV["BUNDLE_GEMFILE"] = old_gemfile
|
||||
else
|
||||
ENV.delete("BUNDLE_GEMFILE")
|
||||
end
|
||||
end
|
||||
end
|
||||
|
|
|
@ -1,6 +1,5 @@
|
|||
# frozen_string_literal: true
|
||||
|
||||
require "uri"
|
||||
require_relative "match_platform"
|
||||
|
||||
module Bundler
|
||||
|
|
|
@ -47,7 +47,7 @@ module Bundler
|
|||
|
||||
def fetch_valid_mirror_for(uri)
|
||||
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 = Mirror.new(uri) unless mirror.valid?
|
||||
mirror
|
||||
|
@ -74,7 +74,7 @@ module Bundler
|
|||
@uri = if uri.nil?
|
||||
nil
|
||||
else
|
||||
URI(uri.to_s)
|
||||
Bundler::URI(uri.to_s)
|
||||
end
|
||||
@valid = nil
|
||||
end
|
||||
|
@ -126,7 +126,7 @@ module Bundler
|
|||
if uri == "all"
|
||||
@all = true
|
||||
else
|
||||
@uri = URI(uri).absolute? ? Settings.normalize_uri(uri) : uri
|
||||
@uri = Bundler::URI(uri).absolute? ? Settings.normalize_uri(uri) : uri
|
||||
end
|
||||
@value = value
|
||||
end
|
||||
|
|
|
@ -1,7 +1,5 @@
|
|||
# frozen_string_literal: true
|
||||
|
||||
require "uri"
|
||||
|
||||
module Bundler
|
||||
module Plugin
|
||||
class API
|
||||
|
@ -108,7 +106,7 @@ module Bundler
|
|||
def install_path
|
||||
@install_path ||=
|
||||
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]}")
|
||||
end
|
||||
|
@ -170,7 +168,7 @@ module Bundler
|
|||
#
|
||||
# This is used by `app_cache_path`
|
||||
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}"
|
||||
end
|
||||
|
||||
|
|
|
@ -1,7 +1,5 @@
|
|||
# frozen_string_literal: true
|
||||
|
||||
require "uri"
|
||||
|
||||
module Bundler
|
||||
# Represents a lazily loaded gem specification, where the full specification
|
||||
# is on the source server in rubygems' "quick" index. The proxy object is to
|
||||
|
|
|
@ -247,12 +247,6 @@ module Bundler
|
|||
EXT_LOCK
|
||||
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)
|
||||
ext_lock.synchronize do
|
||||
old_args = build_args
|
||||
|
@ -531,8 +525,8 @@ module Bundler
|
|||
end
|
||||
end
|
||||
|
||||
def fetch_specs(source, remote, name)
|
||||
path = source + "#{name}.#{Gem.marshal_version}.gz"
|
||||
def fetch_specs(remote, name)
|
||||
path = remote.uri.to_s + "#{name}.#{Gem.marshal_version}.gz"
|
||||
fetcher = gem_remote_fetcher
|
||||
fetcher.headers = { "X-Gemfile-Source" => remote.original_uri.to_s } if remote.original_uri
|
||||
string = fetcher.fetch_path(path)
|
||||
|
@ -543,10 +537,8 @@ module Bundler
|
|||
end
|
||||
|
||||
def fetch_all_remote_specs(remote)
|
||||
source = remote.uri.is_a?(URI) ? remote.uri : URI.parse(source.to_s)
|
||||
|
||||
specs = fetch_specs(source, remote, "specs")
|
||||
pres = fetch_specs(source, remote, "prerelease_specs") || []
|
||||
specs = fetch_specs(remote, "specs")
|
||||
pres = fetch_specs(remote, "prerelease_specs") || []
|
||||
|
||||
specs.concat(pres)
|
||||
end
|
||||
|
@ -564,7 +556,7 @@ module Bundler
|
|||
require "resolv"
|
||||
proxy = configuration[:http_proxy]
|
||||
dns = Resolv::DNS.new
|
||||
Bundler::GemRemoteFetcher.new(proxy, dns)
|
||||
Gem::RemoteFetcher.new(proxy, dns)
|
||||
end
|
||||
|
||||
def gem_from_path(path, policy = nil)
|
||||
|
|
|
@ -1,7 +1,5 @@
|
|||
# frozen_string_literal: true
|
||||
|
||||
require "uri"
|
||||
|
||||
module Bundler
|
||||
class Settings
|
||||
autoload :Mirror, File.expand_path("mirror", __dir__)
|
||||
|
@ -152,7 +150,11 @@ module Bundler
|
|||
end
|
||||
|
||||
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
|
||||
end
|
||||
|
||||
|
@ -421,7 +423,8 @@ module Bundler
|
|||
suffix = $3
|
||||
end
|
||||
uri = "#{uri}/" unless uri.end_with?("/")
|
||||
uri = URI(uri)
|
||||
require_relative "vendored_uri"
|
||||
uri = Bundler::URI(uri)
|
||||
unless uri.absolute?
|
||||
raise ArgumentError, format("Gem sources must be absolute. You provided '%s'.", uri)
|
||||
end
|
||||
|
|
|
@ -1,14 +1,13 @@
|
|||
# frozen_string_literal: true
|
||||
|
||||
require_relative "../vendored_fileutils"
|
||||
require "uri"
|
||||
|
||||
module Bundler
|
||||
class Source
|
||||
class Git < Path
|
||||
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)
|
||||
@options = options
|
||||
|
@ -48,13 +47,14 @@ module Bundler
|
|||
end
|
||||
|
||||
def hash
|
||||
[self.class, uri, ref, branch, name, version, submodules].hash
|
||||
[self.class, uri, ref, branch, name, version, glob, submodules].hash
|
||||
end
|
||||
|
||||
def eql?(other)
|
||||
other.is_a?(Git) && uri == other.uri && ref == other.ref &&
|
||||
branch == other.branch && name == other.name &&
|
||||
version == other.version && submodules == other.submodules
|
||||
version == other.version && glob == other.glob &&
|
||||
submodules == other.submodules
|
||||
end
|
||||
|
||||
alias_method :==, :eql?
|
||||
|
@ -284,7 +284,7 @@ module Bundler
|
|||
if uri =~ %r{^\w+://(\w+@)?}
|
||||
# Downcase the domain component of the URI
|
||||
# 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
|
||||
# If there is no URI scheme, assume it is an ssh/git URI
|
||||
input = uri
|
||||
|
|
|
@ -1,6 +1,5 @@
|
|||
# frozen_string_literal: true
|
||||
|
||||
require "open3"
|
||||
require "shellwords"
|
||||
|
||||
module Bundler
|
||||
|
@ -218,7 +217,7 @@ module Bundler
|
|||
# Adds credentials to the URI as Fetcher#configured_uri_for does
|
||||
def configured_uri_for(uri)
|
||||
if /https?:/ =~ uri
|
||||
remote = URI(uri)
|
||||
remote = Bundler::URI(uri)
|
||||
config_auth = Bundler.settings[remote.to_s] || Bundler.settings[remote.host]
|
||||
remote.userinfo ||= config_auth
|
||||
remote.to_s
|
||||
|
@ -243,12 +242,14 @@ module Bundler
|
|||
end
|
||||
|
||||
def capture_and_filter_stderr(uri, cmd)
|
||||
require "open3"
|
||||
return_value, captured_err, status = Open3.capture3(cmd)
|
||||
Bundler.ui.warn URICredentialsFilter.credential_filtered_string(captured_err, uri) if uri && !captured_err.empty?
|
||||
[return_value, status]
|
||||
end
|
||||
|
||||
def capture_and_ignore_stderr(cmd)
|
||||
require "open3"
|
||||
return_value, _, status = Open3.capture3(cmd)
|
||||
[return_value, status]
|
||||
end
|
||||
|
|
|
@ -1,6 +1,5 @@
|
|||
# frozen_string_literal: true
|
||||
|
||||
require "uri"
|
||||
require "rubygems/user_interaction"
|
||||
|
||||
module Bundler
|
||||
|
@ -328,9 +327,10 @@ module Bundler
|
|||
def normalize_uri(uri)
|
||||
uri = uri.to_s
|
||||
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" \
|
||||
"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
|
||||
end
|
||||
|
||||
|
|
|
@ -48,7 +48,7 @@ module Bundler
|
|||
end
|
||||
|
||||
uri
|
||||
rescue URI::InvalidComponentError
|
||||
rescue Bundler::URI::InvalidComponentError
|
||||
error_message = "Please CGI escape your usernames and passwords before " \
|
||||
"setting them for authentication."
|
||||
raise HTTPError.new(error_message)
|
||||
|
|
|
@ -7,7 +7,11 @@ module Bundler
|
|||
def credential_filtered_uri(uri_to_anonymize)
|
||||
return uri_to_anonymize if uri_to_anonymize.nil?
|
||||
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
|
||||
# oauth authentication
|
||||
if uri.password == "x-oauth-basic" || uri.password == "x"
|
||||
|
@ -17,9 +21,9 @@ module Bundler
|
|||
end
|
||||
uri.password = nil
|
||||
end
|
||||
return uri if uri_to_anonymize.is_a?(URI)
|
||||
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
|
||||
end
|
||||
|
||||
|
|
|
@ -6,8 +6,6 @@ rescue LoadError
|
|||
# for make mjit-headers
|
||||
end
|
||||
|
||||
require_relative "fileutils/version"
|
||||
|
||||
#
|
||||
# = fileutils.rb
|
||||
#
|
||||
|
@ -104,6 +102,7 @@ require_relative "fileutils/version"
|
|||
# <tt>:verbose</tt> flags to methods in Bundler::FileUtils.
|
||||
#
|
||||
module Bundler::FileUtils
|
||||
VERSION = "1.4.1"
|
||||
|
||||
def self.private_module_function(name) #:nodoc:
|
||||
module_function name
|
||||
|
@ -1300,7 +1299,8 @@ module Bundler::FileUtils
|
|||
.reject {|n| n == '.' or n == '..' }
|
||||
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
|
||||
|
||||
def stat
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
require 'net/http'
|
||||
require 'uri'
|
||||
require_relative '../../../../uri/lib/uri'
|
||||
require 'cgi' # for escaping
|
||||
require_relative '../../../../connection_pool/lib/connection_pool'
|
||||
|
||||
|
@ -31,7 +31,7 @@ autoload :OpenSSL, 'openssl'
|
|||
#
|
||||
# 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'
|
||||
#
|
||||
|
@ -48,17 +48,17 @@ autoload :OpenSSL, 'openssl'
|
|||
# post = Net::HTTP::Post.new post_uri.path
|
||||
# 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
|
||||
#
|
||||
# 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.
|
||||
#
|
||||
# == SSL
|
||||
#
|
||||
# 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
|
||||
# verify_mode or by specifying an alternate cert_store.
|
||||
#
|
||||
|
@ -81,7 +81,7 @@ autoload :OpenSSL, 'openssl'
|
|||
# == Proxies
|
||||
#
|
||||
# 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.
|
||||
#
|
||||
# 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'
|
||||
#
|
||||
# uri = URI 'http://example.com/awesome/web/service'
|
||||
# uri = Bundler::URI 'http://example.com/awesome/web/service'
|
||||
# post_uri = uri + 'create'
|
||||
#
|
||||
# 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.
|
||||
|
||||
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 += '/'
|
||||
|
||||
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
|
||||
# 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.
|
||||
#
|
||||
# In order to use a URI for the proxy you may need to do some extra work
|
||||
# beyond URI parsing if the proxy requires a password:
|
||||
# In order to use a Bundler::URI for the proxy you may need to do some extra work
|
||||
# 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.password = 'hunter2'
|
||||
#
|
||||
|
@ -566,7 +566,7 @@ class Bundler::Persistent::Net::HTTP::Persistent
|
|||
@verify_mode = nil
|
||||
@cert_store = nil
|
||||
|
||||
@generation = 0 # incremented when proxy URI changes
|
||||
@generation = 0 # incremented when proxy Bundler::URI changes
|
||||
|
||||
if HAVE_OPENSSL then
|
||||
@verify_mode = OpenSSL::SSL::VERIFY_PEER
|
||||
|
@ -688,14 +688,14 @@ class Bundler::Persistent::Net::HTTP::Persistent
|
|||
end
|
||||
|
||||
##
|
||||
# URI::escape wrapper
|
||||
# Bundler::URI::escape wrapper
|
||||
|
||||
def escape str
|
||||
CGI.escape str if str
|
||||
end
|
||||
|
||||
##
|
||||
# URI::unescape wrapper
|
||||
# Bundler::URI::unescape wrapper
|
||||
|
||||
def unescape str
|
||||
CGI.unescape str if str
|
||||
|
@ -803,12 +803,12 @@ class Bundler::Persistent::Net::HTTP::Persistent
|
|||
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
|
||||
# disable use of a proxy. See #proxy_from_env for details on setting the
|
||||
# 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.
|
||||
#
|
||||
# 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
|
||||
@proxy_uri = case proxy
|
||||
when :ENV then proxy_from_env
|
||||
when URI::HTTP then proxy
|
||||
when Bundler::URI::HTTP then proxy
|
||||
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
|
||||
|
||||
@no_proxy.clear
|
||||
|
@ -846,13 +846,13 @@ class Bundler::Persistent::Net::HTTP::Persistent
|
|||
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_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
|
||||
# the URI.
|
||||
# the Bundler::URI.
|
||||
#
|
||||
# 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
|
||||
|
@ -868,7 +868,7 @@ class Bundler::Persistent::Net::HTTP::Persistent
|
|||
|
||||
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']
|
||||
|
||||
|
@ -951,7 +951,7 @@ class Bundler::Persistent::Net::HTTP::Persistent
|
|||
retried = false
|
||||
bad_response = false
|
||||
|
||||
uri = URI uri
|
||||
uri = Bundler::URI uri
|
||||
req = request_setup req || uri
|
||||
response = nil
|
||||
|
||||
|
@ -1024,13 +1024,13 @@ class Bundler::Persistent::Net::HTTP::Persistent
|
|||
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.
|
||||
#
|
||||
# Returns the request.
|
||||
|
||||
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
|
||||
else
|
||||
req_or_uri
|
||||
|
|
|
@ -344,6 +344,13 @@ class Bundler::Thor
|
|||
command && disable_required_check.include?(command.name.to_sym)
|
||||
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
|
||||
|
||||
def stop_on_unknown_option #:nodoc:
|
||||
|
|
|
@ -1,5 +1,3 @@
|
|||
require "uri"
|
||||
require_relative "core_ext/io_binary_read"
|
||||
require_relative "actions/create_file"
|
||||
require_relative "actions/create_link"
|
||||
require_relative "actions/directory"
|
||||
|
@ -258,13 +256,19 @@ class Bundler::Thor
|
|||
|
||||
return if options[:pretend]
|
||||
|
||||
result = config[:capture] ? `#{command}` : system(command.to_s)
|
||||
env_splat = [config[:env]] if config[:env]
|
||||
|
||||
if config[:abort_on_failure]
|
||||
success = config[:capture] ? $?.success? : result
|
||||
abort unless success
|
||||
if config[:capture]
|
||||
require "open3"
|
||||
result, status = Open3.capture2e(*env_splat, command.to_s)
|
||||
success = status.success?
|
||||
else
|
||||
result = system(*env_splat, command.to_s)
|
||||
success = result
|
||||
end
|
||||
|
||||
abort if !success && config.fetch(:abort_on_failure, self.class.exit_on_failure?)
|
||||
|
||||
result
|
||||
end
|
||||
|
||||
|
|
|
@ -153,17 +153,20 @@ class Bundler::Thor
|
|||
|
||||
# If you want to raise an error when the default value of an option does not match
|
||||
# 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!
|
||||
@check_default_type = true
|
||||
end
|
||||
|
||||
def check_default_type #:nodoc:
|
||||
@check_default_type ||= from_superclass(:check_default_type, false)
|
||||
# If you want to use defaults that don't match the type of an option,
|
||||
# either specify `check_default_type: false` or call `allow_incompatible_default_type!`
|
||||
def allow_incompatible_default_type!
|
||||
@check_default_type = false
|
||||
end
|
||||
|
||||
def check_default_type? #:nodoc:
|
||||
!!check_default_type
|
||||
def check_default_type #:nodoc:
|
||||
@check_default_type = from_superclass(:check_default_type, nil) unless defined?(@check_default_type)
|
||||
@check_default_type
|
||||
end
|
||||
|
||||
# If true, option parsing is suspended as soon as an unknown option or a
|
||||
|
@ -506,6 +509,12 @@ class Bundler::Thor
|
|||
raise InvocationError, msg
|
||||
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
|
||||
|
||||
# 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.
|
||||
# scope<Hash>:: Options hash that is being built up
|
||||
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
|
||||
|
||||
# Receives a hash of options, parse them and add to the scope. This is a
|
||||
|
@ -643,11 +652,6 @@ class Bundler::Thor
|
|||
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.
|
||||
#
|
||||
|
|
|
@ -82,7 +82,7 @@ class Bundler::Thor
|
|||
end
|
||||
|
||||
def current_is_value?
|
||||
peek && peek.to_s !~ /^-/
|
||||
peek && peek.to_s !~ /^-{1,2}\S+/
|
||||
end
|
||||
|
||||
# Runs through the argument array getting strings that contains ":" and
|
||||
|
|
|
@ -112,7 +112,7 @@ class Bundler::Thor
|
|||
|
||||
def validate!
|
||||
raise ArgumentError, "An option cannot be boolean and required." if boolean? && required?
|
||||
validate_default_type! if @check_default_type
|
||||
validate_default_type!
|
||||
end
|
||||
|
||||
def validate_default_type!
|
||||
|
@ -130,7 +130,18 @@ class Bundler::Thor
|
|||
end
|
||||
|
||||
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
|
||||
|
||||
def dasherized?
|
||||
|
|
|
@ -1,6 +1,5 @@
|
|||
require_relative "../thor"
|
||||
require_relative "group"
|
||||
require_relative "core_ext/io_binary_read"
|
||||
|
||||
require "yaml"
|
||||
require "digest/md5"
|
||||
|
@ -67,7 +66,7 @@ class Bundler::Thor::Runner < Bundler::Thor #:nodoc: # rubocop:disable ClassLeng
|
|||
raise Error, "Error opening file '#{name}'"
|
||||
end
|
||||
|
||||
say "Your Bundler::Thorfile contains:"
|
||||
say "Your Thorfile contains:"
|
||||
say contents
|
||||
|
||||
unless options["force"]
|
||||
|
@ -206,7 +205,7 @@ private
|
|||
File.open(yaml_file, "w") { |f| f.puts yaml.to_yaml }
|
||||
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.
|
||||
#
|
||||
# By default, it also traverses the current path until find Bundler::Thor files, as
|
||||
|
@ -219,11 +218,11 @@ private
|
|||
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.
|
||||
#
|
||||
# We also ensure that system-wide Bundler::Thorfiles are loaded first, so local
|
||||
# Bundler::Thorfiles can override them.
|
||||
# We also ensure that system-wide Thorfiles are loaded first, so local
|
||||
# Thorfiles can override them.
|
||||
#
|
||||
# ==== Example
|
||||
#
|
||||
|
@ -231,7 +230,7 @@ private
|
|||
#
|
||||
# 1. /Users/wycats/dev/thor
|
||||
# 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 ...
|
||||
#
|
||||
|
@ -239,7 +238,7 @@ private
|
|||
# 2. c:\Documents and Settings\james\dev
|
||||
# 3. c:\Documents and Settings\james
|
||||
# 4. c:\Documents and Settings
|
||||
# 5. c:\ <-- no Bundler::Thorfiles found!
|
||||
# 5. c:\ <-- no Thorfiles found!
|
||||
#
|
||||
def thorfiles(relevant_to = nil, skip_lookup = false)
|
||||
thorfiles = []
|
||||
|
@ -260,7 +259,7 @@ private
|
|||
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"
|
||||
# namespaces registered.
|
||||
#
|
||||
|
|
|
@ -451,16 +451,25 @@ class Bundler::Thor
|
|||
|
||||
def ask_filtered(statement, color, options)
|
||||
answer_set = options[:limited_to]
|
||||
case_insensitive = options.fetch(:case_insensitive, false)
|
||||
correct_answer = nil
|
||||
until correct_answer
|
||||
answers = answer_set.join(", ")
|
||||
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
|
||||
end
|
||||
correct_answer
|
||||
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:
|
||||
require "tempfile"
|
||||
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)
|
||||
if colors.all? { |color| color.is_a?(Symbol) || color.is_a?(String) }
|
||||
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
|
||||
color, bold = colors
|
||||
html_color = self.class.const_get(color.to_s.upcase) if color.is_a?(Symbol)
|
||||
styles = [html_color]
|
||||
styles << BOLD if bold
|
||||
"<span style=\"#{styles.join('; ')};\">#{string}</span>"
|
||||
"<span style=\"#{styles.join('; ')};\">#{Bundler::Thor::Util.escape_html(string)}</span>"
|
||||
end
|
||||
end
|
||||
|
||||
|
|
|
@ -211,7 +211,7 @@ class Bundler::Thor
|
|||
#
|
||||
def globs_for(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
|
||||
|
||||
# Return the path to the ruby interpreter taking into account multiple
|
||||
|
@ -263,6 +263,22 @@ class Bundler::Thor
|
|||
def escape_globs(path)
|
||||
path.to_s.gsub(/[*?{}\[\]]/, '\\\\\\&')
|
||||
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
|
||||
|
|
|
@ -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'
|
|
@ -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
|
|
@ -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
|
|
@ -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
|
Разница между файлами не показана из-за своего большого размера
Загрузить разницу
|
@ -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
|
|
@ -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
|
|
@ -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
|
|
@ -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
|
|
@ -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
|
|
@ -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
|
|
@ -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
|
|
@ -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
|
|
@ -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
|
||||
|
||||
module Bundler
|
||||
VERSION = "2.1.0.pre.3".freeze
|
||||
VERSION = "2.1.0".freeze
|
||||
|
||||
def self.bundler_major_version
|
||||
@bundler_major_version ||= VERSION.split(".").first.to_i
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
.\" generated with Ronn/v0.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"
|
||||
\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
|
||||
.\" http://github.com/rtomayko/ronn/tree/0.7.3
|
||||
.
|
||||
.TH "BUNDLE\-BINSTUBS" "1" "November 2019" "" ""
|
||||
.TH "BUNDLE\-BINSTUBS" "1" "December 2019" "" ""
|
||||
.
|
||||
.SH "NAME"
|
||||
\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
|
||||
.\" http://github.com/rtomayko/ronn/tree/0.7.3
|
||||
.
|
||||
.TH "BUNDLE\-CACHE" "1" "November 2019" "" ""
|
||||
.TH "BUNDLE\-CACHE" "1" "December 2019" "" ""
|
||||
.
|
||||
.SH "NAME"
|
||||
\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
|
||||
.\" http://github.com/rtomayko/ronn/tree/0.7.3
|
||||
.
|
||||
.TH "BUNDLE\-CHECK" "1" "November 2019" "" ""
|
||||
.TH "BUNDLE\-CHECK" "1" "December 2019" "" ""
|
||||
.
|
||||
.SH "NAME"
|
||||
\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
|
||||
.\" http://github.com/rtomayko/ronn/tree/0.7.3
|
||||
.
|
||||
.TH "BUNDLE\-CLEAN" "1" "November 2019" "" ""
|
||||
.TH "BUNDLE\-CLEAN" "1" "December 2019" "" ""
|
||||
.
|
||||
.SH "NAME"
|
||||
\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
|
||||
.\" http://github.com/rtomayko/ronn/tree/0.7.3
|
||||
.
|
||||
.TH "BUNDLE\-CONFIG" "1" "November 2019" "" ""
|
||||
.TH "BUNDLE\-CONFIG" "1" "December 2019" "" ""
|
||||
.
|
||||
.SH "NAME"
|
||||
\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
|
||||
.\" http://github.com/rtomayko/ronn/tree/0.7.3
|
||||
.
|
||||
.TH "BUNDLE\-DOCTOR" "1" "November 2019" "" ""
|
||||
.TH "BUNDLE\-DOCTOR" "1" "December 2019" "" ""
|
||||
.
|
||||
.SH "NAME"
|
||||
\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
|
||||
.\" http://github.com/rtomayko/ronn/tree/0.7.3
|
||||
.
|
||||
.TH "BUNDLE\-EXEC" "1" "November 2019" "" ""
|
||||
.TH "BUNDLE\-EXEC" "1" "December 2019" "" ""
|
||||
.
|
||||
.SH "NAME"
|
||||
\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
|
||||
.\" http://github.com/rtomayko/ronn/tree/0.7.3
|
||||
.
|
||||
.TH "BUNDLE\-GEM" "1" "November 2019" "" ""
|
||||
.TH "BUNDLE\-GEM" "1" "December 2019" "" ""
|
||||
.
|
||||
.SH "NAME"
|
||||
\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
|
||||
.\" http://github.com/rtomayko/ronn/tree/0.7.3
|
||||
.
|
||||
.TH "BUNDLE\-INFO" "1" "November 2019" "" ""
|
||||
.TH "BUNDLE\-INFO" "1" "December 2019" "" ""
|
||||
.
|
||||
.SH "NAME"
|
||||
\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
|
||||
.\" http://github.com/rtomayko/ronn/tree/0.7.3
|
||||
.
|
||||
.TH "BUNDLE\-INIT" "1" "November 2019" "" ""
|
||||
.TH "BUNDLE\-INIT" "1" "December 2019" "" ""
|
||||
.
|
||||
.SH "NAME"
|
||||
\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
|
||||
.\" http://github.com/rtomayko/ronn/tree/0.7.3
|
||||
.
|
||||
.TH "BUNDLE\-INJECT" "1" "November 2019" "" ""
|
||||
.TH "BUNDLE\-INJECT" "1" "December 2019" "" ""
|
||||
.
|
||||
.SH "NAME"
|
||||
\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
|
||||
.\" http://github.com/rtomayko/ronn/tree/0.7.3
|
||||
.
|
||||
.TH "BUNDLE\-INSTALL" "1" "November 2019" "" ""
|
||||
.TH "BUNDLE\-INSTALL" "1" "December 2019" "" ""
|
||||
.
|
||||
.SH "NAME"
|
||||
\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
|
||||
.\" http://github.com/rtomayko/ronn/tree/0.7.3
|
||||
.
|
||||
.TH "BUNDLE\-LIST" "1" "November 2019" "" ""
|
||||
.TH "BUNDLE\-LIST" "1" "December 2019" "" ""
|
||||
.
|
||||
.SH "NAME"
|
||||
\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
|
||||
.\" http://github.com/rtomayko/ronn/tree/0.7.3
|
||||
.
|
||||
.TH "BUNDLE\-LOCK" "1" "November 2019" "" ""
|
||||
.TH "BUNDLE\-LOCK" "1" "December 2019" "" ""
|
||||
.
|
||||
.SH "NAME"
|
||||
\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
|
||||
.\" http://github.com/rtomayko/ronn/tree/0.7.3
|
||||
.
|
||||
.TH "BUNDLE\-OPEN" "1" "November 2019" "" ""
|
||||
.TH "BUNDLE\-OPEN" "1" "December 2019" "" ""
|
||||
.
|
||||
.SH "NAME"
|
||||
\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
|
||||
.\" http://github.com/rtomayko/ronn/tree/0.7.3
|
||||
.
|
||||
.TH "BUNDLE\-OUTDATED" "1" "November 2019" "" ""
|
||||
.TH "BUNDLE\-OUTDATED" "1" "December 2019" "" ""
|
||||
.
|
||||
.SH "NAME"
|
||||
\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
|
||||
.\" http://github.com/rtomayko/ronn/tree/0.7.3
|
||||
.
|
||||
.TH "BUNDLE\-PLATFORM" "1" "November 2019" "" ""
|
||||
.TH "BUNDLE\-PLATFORM" "1" "December 2019" "" ""
|
||||
.
|
||||
.SH "NAME"
|
||||
\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
|
||||
.\" http://github.com/rtomayko/ronn/tree/0.7.3
|
||||
.
|
||||
.TH "BUNDLE\-PRISTINE" "1" "November 2019" "" ""
|
||||
.TH "BUNDLE\-PRISTINE" "1" "December 2019" "" ""
|
||||
.
|
||||
.SH "NAME"
|
||||
\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
|
||||
.\" http://github.com/rtomayko/ronn/tree/0.7.3
|
||||
.
|
||||
.TH "BUNDLE\-REMOVE" "1" "November 2019" "" ""
|
||||
.TH "BUNDLE\-REMOVE" "1" "December 2019" "" ""
|
||||
.
|
||||
.SH "NAME"
|
||||
\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
|
||||
.\" http://github.com/rtomayko/ronn/tree/0.7.3
|
||||
.
|
||||
.TH "BUNDLE\-SHOW" "1" "November 2019" "" ""
|
||||
.TH "BUNDLE\-SHOW" "1" "December 2019" "" ""
|
||||
.
|
||||
.SH "NAME"
|
||||
\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
|
||||
.\" http://github.com/rtomayko/ronn/tree/0.7.3
|
||||
.
|
||||
.TH "BUNDLE\-UPDATE" "1" "November 2019" "" ""
|
||||
.TH "BUNDLE\-UPDATE" "1" "December 2019" "" ""
|
||||
.
|
||||
.SH "NAME"
|
||||
\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
|
||||
.\" http://github.com/rtomayko/ronn/tree/0.7.3
|
||||
.
|
||||
.TH "BUNDLE\-VIZ" "1" "November 2019" "" ""
|
||||
.TH "BUNDLE\-VIZ" "1" "December 2019" "" ""
|
||||
.
|
||||
.SH "NAME"
|
||||
\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
|
||||
.\" http://github.com/rtomayko/ronn/tree/0.7.3
|
||||
.
|
||||
.TH "BUNDLE" "1" "November 2019" "" ""
|
||||
.TH "BUNDLE" "1" "December 2019" "" ""
|
||||
.
|
||||
.SH "NAME"
|
||||
\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
|
||||
.\" http://github.com/rtomayko/ronn/tree/0.7.3
|
||||
.
|
||||
.TH "GEMFILE" "5" "November 2019" "" ""
|
||||
.TH "GEMFILE" "5" "December 2019" "" ""
|
||||
.
|
||||
.SH "NAME"
|
||||
\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"
|
||||
end
|
||||
|
||||
bundle :install, :env => { "DEBUG" => 1 }
|
||||
bundle :install, :env => { "DEBUG" => "1" }
|
||||
|
||||
expect(out).to match(/re-resolving dependencies/)
|
||||
lockfile_should_be <<-G
|
||||
|
@ -84,7 +84,7 @@ RSpec.describe Bundler::Definition do
|
|||
s.add_dependency "rack", "1.0"
|
||||
end
|
||||
|
||||
bundle :install, :env => { "DEBUG" => 1 }
|
||||
bundle :install, :env => { "DEBUG" => "1" }
|
||||
|
||||
expect(out).to match(/re-resolving dependencies/)
|
||||
lockfile_should_be <<-G
|
||||
|
@ -121,7 +121,7 @@ RSpec.describe Bundler::Definition do
|
|||
gem "foo", :path => "#{lib_path("foo")}"
|
||||
G
|
||||
|
||||
bundle :check, :env => { "DEBUG" => 1 }
|
||||
bundle :check, :env => { "DEBUG" => "1" }
|
||||
|
||||
expect(out).to match(/using resolution from the lockfile/)
|
||||
lockfile_should_be <<-G
|
||||
|
@ -154,7 +154,7 @@ RSpec.describe Bundler::Definition do
|
|||
G
|
||||
|
||||
bundle "lock --add-platform java"
|
||||
bundle :check, :env => { "DEBUG" => 1 }
|
||||
bundle :check, :env => { "DEBUG" => "1" }
|
||||
|
||||
expect(out).to match(/using resolution from the lockfile/)
|
||||
lockfile_should_be <<-G
|
||||
|
@ -181,7 +181,7 @@ RSpec.describe Bundler::Definition do
|
|||
gem "foo"
|
||||
G
|
||||
|
||||
bundle :check, :env => { "DEBUG" => 1 }
|
||||
bundle :check, :env => { "DEBUG" => "1" }
|
||||
|
||||
expect(out).to match(/using resolution from the lockfile/)
|
||||
lockfile_should_be <<-G
|
||||
|
|
Некоторые файлы не были показаны из-за слишком большого количества измененных файлов Показать больше
Загрузка…
Ссылка в новой задаче