class Bundler::DirectorySource
def ==(other)
def ==(other) # TMP HAX other.is_a?(DirectorySource) end
def add_spec(path, name, version, require_paths = %w(lib))
def add_spec(path, name, version, require_paths = %w(lib)) raise DirectorySourceError, "already have a gem defined for '#{path}'" if @specs[path.to_s] @specs[path.to_s] = Gem::Specification.new do |s| s.name = name s.version = Gem::Version.new(version) end end
def can_be_local?
def can_be_local? true end
def download(spec)
def download(spec) # Nothing needed here end
def gems
def gems @gems ||= begin # Locate all gemspecs from the directory specs = locate_gemspecs specs = merge_defined_specs(specs) required_specs.each do |required| unless specs.any? {|k,v| v.name == required } raise DirectorySourceError, "No gemspec for '#{required}' was found in" \ " '#{location}'. Please explicitly specify a version." end end process_source_gems(specs) end end
def initialize(options)
def initialize(options) if options[:location] @location = Pathname.new(options[:location]).expand_path end @glob = options[:glob] || "**/*.gemspec" @specs = {} @required_specs = [] end
def locate_gemspecs
def locate_gemspecs Dir["#{location}/#{@glob}"].inject({}) do |specs, file| file = Pathname.new(file) if spec = eval(File.read(file)) and validate_gemspec(file.dirname, spec) spec.location = file.dirname.expand_path specs[spec.full_name] = spec end specs end end
def merge_defined_specs(specs)
def merge_defined_specs(specs) @specs.each do |path, spec| # Set the spec location spec.location = "#{location}/#{path}" if existing = specs.values.find { |s| s.name == spec.name } if existing.version != spec.version raise DirectorySourceError, "The version you specified for #{spec.name}" \ " is #{spec.version}. The gemspec is #{existing.version}." # Not sure if this is needed # ==== # elsif File.expand_path(existing.location) != File.expand_path(spec.location) # raise DirectorySourceError, "The location you specified for #{spec.name}" \ # " is '#{spec.location}'. The gemspec was found at '#{existing.location}'." end elsif !validate_gemspec(spec.location, spec) raise "Your gem definition is not valid: #{spec}" else specs[spec.full_name] = spec end end specs end
def to_s
def to_s "#{@name} (#{@version}) Located at: '#{location}'" end
def validate_gemspec(path, spec)
def validate_gemspec(path, spec) path = Pathname.new(path) msg = "Gemspec for #{spec.name} (#{spec.version}) is invalid:" # Check the require_paths (spec.require_paths || []).each do |require_path| unless path.join(require_path).directory? Bundler.logger.warn "#{msg} Missing require path: '#{require_path}'" return false end end # Check the executables (spec.executables || []).each do |exec| unless path.join(spec.bindir, exec).file? Bundler.logger.warn "#{msg} Missing executable: '#{File.join(spec.bindir, exec)}'" return false end end true end