source_index.rb
来自「Amarok是一款在LINUX或其他类UNIX操作系统中运行的音频播放器软件。 」· RB 代码 · 共 208 行
RB
208 行
#--# Copyright 2006 by Chad Fowler, Rich Kilmer, Jim Weirich and others.# All rights reserved.# See LICENSE.txt for permissions.#++require 'rubygems/user_interaction'require 'forwardable'require 'digest/sha2'require 'time'module Gem # The SourceIndex object indexes all the gems available from a # particular source (e.g. a list of gem directories, or a remote # source). A SourceIndex maps a gem full name to a gem # specification. # # NOTE:: The class used to be named Cache, but that became # confusing when cached source fetchers where introduced. The # constant Gem::Cache is an alias for this class to allow old # YAMLized source index objects to load properly. # class SourceIndex extend Forwardable include Enumerable # Class Methods. ------------------------------------------------- class << self include Gem::UserInteraction # Factory method to construct a source index instance for a given # path. # # deprecated:: # If supplied, from_installed_gems will act just like # +from_gems_in+. This argument is deprecated and is provided # just for backwards compatibility, and should not generally # be used. # # return:: # SourceIndex instance # def from_installed_gems(*deprecated) if deprecated.empty? from_gems_in(*installed_spec_directories) else from_gems_in(*deprecated) end end # Return a list of directories in the current gem path that # contain specifications. # # return:: # List of directory paths (all ending in "../specifications"). # def installed_spec_directories Gem.path.collect { |dir| File.join(dir, "specifications") } end # Factory method to construct a source index instance for a # given path. # # spec_dirs:: # List of directories to search for specifications. Each # directory should have a "specifications" subdirectory # containing the gem specifications. # # return:: # SourceIndex instance # def from_gems_in(*spec_dirs) self.new.load_gems_in(*spec_dirs) end # Load a specification from a file (eval'd Ruby code) # # file_name:: [String] The .gemspec file # return:: Specification instance or nil if an error occurs # def load_specification(file_name) begin spec_code = File.read(file_name).untaint gemspec = eval(spec_code) if gemspec.is_a?(Gem::Specification) gemspec.loaded_from = file_name return gemspec end alert_warning "File '#{file_name}' does not evaluate to a gem specification" rescue SyntaxError => e alert_warning e alert_warning spec_code rescue Exception => e alert_warning(e.inspect.to_s + "\n" + spec_code) alert_warning "Invalid .gemspec format in '#{file_name}'" end return nil end end # Instance Methods ----------------------------------------------- # Constructs a source index instance from the provided # specifications # # specifications:: # [Hash] hash of [Gem name, Gem::Specification] pairs # def initialize(specifications={}) @gems = specifications end # Reconstruct the source index from the list of source # directories. def load_gems_in(*spec_dirs) @gems.clear Dir.glob("{#{spec_dirs.join(',')}}/*.gemspec").each do |file_name| gemspec = self.class.load_specification(file_name.untaint) add_spec(gemspec) if gemspec end self end # Add a gem specification to the source index. def add_spec(gem_spec) @gems[gem_spec.full_name] = gem_spec end # Remove a gem specification named +full_name+. def remove_spec(full_name) @gems.delete(full_name) end # Iterate over the specifications in the source index. # # &block:: [yields gem.full_name, Gem::Specification] # def each(&block) @gems.each(&block) end # The gem specification given a full gem spec name. def specification(full_name) @gems[full_name] end # The signature for the source index. Changes in the signature # indicate a change in the index. def index_signature Digest::SHA256.new(@gems.keys.sort.join(',')).to_s end # The signature for the given gem specification. def gem_signature(gem_full_name) Digest::SHA256.new(@gems[gem_full_name].to_yaml).to_s end def_delegators :@gems, :size, :length # Find a gem by an exact match on the short name. def find_name(gem_name, version_requirement=Version::Requirement.new(">= 0")) search(/^#{gem_name}$/, version_requirement) end # Search for a gem by short name pattern and optional version # # gem_name:: # [String] a partial for the (short) name of the gem, or # [Regex] a pattern to match against the short name # version_requirement:: # [String | default=Version::Requirement.new(">= 0")] version to # find # return:: # [Array] list of Gem::Specification objects in sorted (version) # order. Empty if not found. # def search(gem_pattern, version_requirement=Version::Requirement.new(">= 0")) #FIXME - remove duplication between this and RemoteInstaller.search gem_pattern = /#{ gem_pattern }/i if String === gem_pattern version_requirement = Gem::Version::Requirement.create(version_requirement) result = [] @gems.each do |full_spec_name, spec| next unless spec.name =~ gem_pattern result << spec if version_requirement.satisfied_by?(spec.version) end result = result.sort result end # Refresh the source index from the local file system. # # return:: Returns a pointer to itself. # def refresh! load_gems_in(self.class.installed_spec_directories) end end # Cache is an alias for SourceIndex to allow older YAMLized source # index objects to load properly. Cache = SourceIndexend
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?