Class: Bundler::Source::Path
Relationships & Source Files | |
Namespace Children | |
Classes:
| |
Extension / Inclusion / Inheritance Descendants | |
Subclasses:
|
|
Super Chains via Extension / Inclusion / Inheritance | |
Class Chain:
self,
::Bundler::Source
|
|
Instance Chain:
self,
::Bundler::Source
|
|
Inherits: |
Bundler::Source
|
Defined in: | lib/bundler/source/path.rb, lib/bundler/source/path/installer.rb |
Constant Summary
-
DEFAULT_GLOB =
# File 'lib/bundler/source/path.rb', line 14"{,*,*/*}.gemspec".freeze
Class Method Summary
- .from_lock(options)
- .new(options) ⇒ Path constructor
Instance Attribute Summary
- #name rw
- #name=(value) rw
- #options readonly
- #path readonly
- #root_path readonly
- #version rw
- #original_path readonly protected
- #has_app_cache? ⇒ Boolean readonly private
::Bundler::Source
- Inherited
Instance Method Summary
-
#==(other)
Alias for #eql?.
- #app_cache_dirname
- #cache(spec, custom_path = nil)
- #cached!
- #eql?(other) ⇒ Boolean (also: #==)
- #expanded_original_path
- #hash
- #install(spec, options = {})
- #local_specs
- #remote!
- #root
- #specs
- #to_lock
- #to_s
- #app_cache_path(custom_path = nil) private
- #expand(somepath) private
- #expanded_path private
- #generate_bin(spec, options = {}) private
- #load_gemspec(file) private
- #load_spec_files private
- #lockfile_path private
- #relative_path(path = self.path) private
- #validate_spec(spec) private
::Bundler::Source
- Inherited
#add_dependency_names, #cached!, #can_lock?, #dependency_names_to_double_check, | |
#double_check_for | it’s possible that gems from one source depend on gems from some other source, so now we download gemspecs and iterate over those dependencies, looking for gems we don’t have info on yet. |
#extension_cache_path, #identifier, #include?, #inspect, #local!, #local_only!, #remote!, #spec_names, #unmet_deps, #version_message, #earlier_version?, #extension_cache_slug, #print_using_message, #version_color |
Constructor Details
.new(options) ⇒ Path
# File 'lib/bundler/source/path.rb', line 16
def initialize( ) @options = .dup @glob = ["glob"] || DEFAULT_GLOB @allow_cached = false @allow_remote = false @root_path = ["root_path"] || root if ["path"] @path = Pathname.new( ["path"]) = (@path) @path = if @path.relative? .relative_path_from(root_path. ) else end end @name = ["name"] @version = ["version"] # Stores the original path. If at any point we move to the # cached directory, we still have the original path to copy from. @original_path = @path end
Class Method Details
.from_lock(options)
[ GitHub ]# File 'lib/bundler/source/path.rb', line 53
def self.from_lock( ) new( .merge("path" => .delete("remote"))) end
Instance Attribute Details
#has_app_cache? ⇒ Boolean
(readonly, private)
[ GitHub ]
# File 'lib/bundler/source/path.rb', line 157
def has_app_cache? SharedHelpers.in_bundle? && app_cache_path.exist? end
#name (rw)
[ GitHub ]# File 'lib/bundler/source/path.rb', line 80
def name File.basename( .to_s) end
#name=(value) (rw)
[ GitHub ]# File 'lib/bundler/source/path.rb', line 9
attr_writer :name
#options (readonly)
[ GitHub ]# File 'lib/bundler/source/path.rb', line 8
attr_reader :path, :, :root_path, :original_path
#original_path (readonly, protected)
[ GitHub ]#path (readonly)
[ GitHub ]# File 'lib/bundler/source/path.rb', line 8
attr_reader :path, :, :root_path, :original_path
#root_path (readonly)
[ GitHub ]# File 'lib/bundler/source/path.rb', line 8
attr_reader :path, :, :root_path, :original_path
#version (rw)
[ GitHub ]# File 'lib/bundler/source/path.rb', line 10
attr_accessor :version
Instance Method Details
#==(other)
Alias for #eql?.
# File 'lib/bundler/source/path.rb', line 78
alias_method :==, :eql?
#app_cache_dirname
[ GitHub ]# File 'lib/bundler/source/path.rb', line 118
def app_cache_dirname name end
#app_cache_path(custom_path = nil) (private)
[ GitHub ]# File 'lib/bundler/source/path.rb', line 153
def app_cache_path(custom_path = nil) @app_cache_path ||= Bundler.app_cache(custom_path).join(app_cache_dirname) end
#cache(spec, custom_path = nil)
[ GitHub ]# File 'lib/bundler/source/path.rb', line 92
def cache(spec, custom_path = nil) app_cache_path = app_cache_path(custom_path) return unless Bundler.feature_flag.cache_all? return if (@original_path).to_s.index(root_path.to_s + "/") == 0 unless @original_path.exist? raise GemNotFound, "Can't cache gem #{ (spec)} because #{self} is missing!" end FileUtils.rm_rf(app_cache_path) FileUtils.cp_r("#{@original_path}/.", app_cache_path) FileUtils.touch(app_cache_path.join(".bundlecache")) end
#cached!
[ GitHub ]# File 'lib/bundler/source/path.rb', line 48
def cached! @local_specs = nil @allow_cached = true end
#eql?(other) ⇒ Boolean
Also known as: #==
#expand(somepath) (private)
[ GitHub ]# File 'lib/bundler/source/path.rb', line 136
def (somepath) if Bundler.current_ruby.jruby? # TODO: Unify when https://github.com/rubygems/bundler/issues/7598 fixed upstream and all supported jrubies include the fix somepath. (root_path). else somepath. (root_path) end rescue ArgumentError => e Bundler.ui.debug(e) raise PathError, "There was an error while trying to use the path " \ "`#{somepath}`.\nThe error message was: #{e.}." end
#expanded_original_path
[ GitHub ]# File 'lib/bundler/source/path.rb', line 126
def @expanded_original_path ||= (original_path) end
#expanded_path (private)
[ GitHub ]# File 'lib/bundler/source/path.rb', line 132
def @expanded_path ||= (path) end
#generate_bin(spec, options = {}) (private)
[ GitHub ]# File 'lib/bundler/source/path.rb', line 222
def generate_bin(spec, = {}) gem_dir = Pathname.new(spec.full_gem_path) # Some gem authors put absolute paths in their gemspec # and we have to save them from themselves spec.files = spec.files.map do |p| next p unless p =~ /\A#{Pathname::SEPARATOR_PAT}/ next if File.directory?(p) begin Pathname.new(p).relative_path_from(gem_dir).to_s rescue ArgumentError p end end.compact installer = Path::Installer.new( spec, :env_shebang => false, :disable_extensions => [:disable_extensions], :build_args => [:build_args], :bundler_extension_cache_path => extension_cache_path(spec) ) installer.post_install rescue Gem::InvalidSpecificationException => e Bundler.ui.warn "\n#{spec.name} at #{spec.full_gem_path} did not have a valid gemspec.\n" \ "This prevents bundler from installing bins or native extensions, but " \ "that may not affect its functionality." if !spec.extensions.empty? && !spec.email.empty? Bundler.ui.warn "If you need to use this package without installing it from a gem " \ "repository, please contact #{spec.email} and ask them " \ "to modify their .gemspec so it can work with `gem build`." end Bundler.ui.warn "The validation message from RubyGems was:\n #{e.}" end
#hash
[ GitHub ]# File 'lib/bundler/source/path.rb', line 68
def hash [self.class, , version].hash end
#install(spec, options = {})
[ GitHub ]# File 'lib/bundler/source/path.rb', line 84
def install(spec, = {}) = "Using #{ (spec, [:previous_spec])} from #{self}" += " and installing its executables" unless spec.executables.empty? generate_bin(spec, :disable_extensions => true) nil # no post-install message end
#load_gemspec(file) (private)
[ GitHub ]# File 'lib/bundler/source/path.rb', line 161
def load_gemspec(file) return unless spec = Bundler.load_gemspec(file) Bundler.rubygems.set_installed_by_version(spec) spec end
#load_spec_files (private)
[ GitHub ]# File 'lib/bundler/source/path.rb', line 171
def load_spec_files index = Index.new if File.directory?( ) # We sort depth-first since `<<` will override the earlier-found specs Gem::Util.glob_files_in_dir(@glob, ).sort_by {|p| -p.split(File::SEPARATOR).size }.each do |file| next unless spec = load_gemspec(file) spec.source = self # Validation causes extension_dir to be calculated, which depends # on #source, so we validate here instead of load_gemspec validate_spec(spec) index << spec end if index.empty? && @name && @version index << Gem::Specification.new do |s| s.name = @name s.source = self s.version = Gem::Version.new(@version) s.platform = Gem::Platform::RUBY s.summary = "Fake gemspec for #{@name}" s.relative_loaded_from = "#{@name}.gemspec" s. = ["no one"] if .join("bin").exist? executables = .join("bin").children executables.reject! {|p| File.directory?(p) } s.executables = executables.map {|c| c.basename.to_s } end end end else = String.new("The path `#{}` ") << if File.exist?( ) "is not a directory." else "does not exist." end raise PathError, end index end
#local_specs
[ GitHub ]# File 'lib/bundler/source/path.rb', line 106
def local_specs(*) @local_specs ||= load_spec_files end
#lockfile_path (private)
[ GitHub ]# File 'lib/bundler/source/path.rb', line 148
def lockfile_path return relative_path(original_path) if original_path.absolute? (original_path).relative_path_from(root) end
#relative_path(path = self.path) (private)
[ GitHub ]#remote!
[ GitHub ]# File 'lib/bundler/source/path.rb', line 43
def remote! @local_specs = nil @allow_remote = true end
#root
[ GitHub ]#specs
[ GitHub ]# File 'lib/bundler/source/path.rb', line 110
def specs if has_app_cache? @path = app_cache_path @expanded_path = nil # Invalidate end local_specs end
#to_lock
[ GitHub ]# File 'lib/bundler/source/path.rb', line 57
def to_lock out = String.new("PATH\n") out << " remote: #{lockfile_path}\n" out << " glob: #{@glob}\n" unless @glob == DEFAULT_GLOB out << " specs:\n" end
#to_s
[ GitHub ]# File 'lib/bundler/source/path.rb', line 64
def to_s "source at `#{@path}`" end