Methods
- add_spec
- each
- find_name
- load_specification
- new
- refresh!
- remove_spec
- search
- silence_spec_warnings
- silence_spec_warnings=
- size
- version_for_dir
Included Modules
Attributes
| [R] | installed_source_index | |
| [R] | vendor_source_index |
Public Class methods
[ show source ]
# File railties/lib/rails/vendor_gem_source_index.rb, line 26
26: def initialize(installed_index, vendor_dir=Rails::GemDependency.unpacked_path)
27: @installed_source_index = installed_index
28: @vendor_dir = vendor_dir
29: refresh!
30: end
[ show source ]
# File railties/lib/rails/vendor_gem_source_index.rb, line 18
18: def self.silence_spec_warnings
19: @@silence_spec_warnings
20: end
[ show source ]
# File railties/lib/rails/vendor_gem_source_index.rb, line 22
22: def self.silence_spec_warnings=(v)
23: @@silence_spec_warnings = v
24: end
Public Instance methods
[ show source ]
# File railties/lib/rails/vendor_gem_source_index.rb, line 127
127: def add_spec(spec)
128: @vendor_source_index.add_spec spec
129: end
[ show source ]
# File railties/lib/rails/vendor_gem_source_index.rb, line 122
122: def each(&block)
123: @vendor_source_index.each(&block)
124: @installed_source_index.each(&block)
125: end
[ show source ]
# File railties/lib/rails/vendor_gem_source_index.rb, line 113
113: def find_name(*args)
114: @installed_source_index.find_name(*args) + @vendor_source_index.find_name(*args)
115: end
[ show source ]
# File railties/lib/rails/vendor_gem_source_index.rb, line 108
108: def load_specification(gem_dir)
109: spec_file = File.join(gem_dir, '.specification')
110: YAML.load_file(spec_file) if File.exist?(spec_file)
111: end
[ show source ]
# File railties/lib/rails/vendor_gem_source_index.rb, line 32
32: def refresh!
33: # reload the installed gems
34: @installed_source_index.refresh!
35: vendor_gems = {}
36:
37: # handle vendor Rails gems - they are identified by having loaded_from set to ""
38: # we add them manually to the list, so that other gems can find them via dependencies
39: Gem.loaded_specs.each do |n, s|
40: next unless s.loaded_from.to_s.empty?
41: vendor_gems[s.full_name] = s
42: end
43:
44: # load specifications from vendor/gems
45: Dir[File.join(Rails::GemDependency.unpacked_path, '*')].each do |d|
46: dir_name = File.basename(d)
47: dir_version = version_for_dir(dir_name)
48: spec = load_specification(d)
49: if spec
50: if spec.full_name != dir_name
51: # mismatched directory name and gem spec - produced by 2.1.0-era unpack code
52: if dir_version
53: # fix the spec version - this is not optimal (spec.files may be wrong)
54: # but it's better than breaking apps. Complain to remind users to get correct specs.
55: # use ActiveSupport::Deprecation.warn, as the logger is not set yet
56: $stderr.puts("config.gem: Unpacked gem #{dir_name} in vendor/gems has a mismatched specification file."+
57: " Run 'rake gems:refresh_specs' to fix this.") unless @@silence_spec_warnings
58: spec.version = dir_version
59: else
60: $stderr.puts("config.gem: Unpacked gem #{dir_name} in vendor/gems is not in a versioned directory"+
61: "(should be #{spec.full_name}).") unless @@silence_spec_warnings
62: # continue, assume everything is OK
63: end
64: end
65: else
66: # no spec - produced by early-2008 unpack code
67: # emulate old behavior, and complain.
68: $stderr.puts("config.gem: Unpacked gem #{dir_name} in vendor/gems has no specification file."+
69: " Run 'rake gems:refresh_specs' to fix this.") unless @@silence_spec_warnings
70: if dir_version
71: spec = Gem::Specification.new
72: spec.version = dir_version
73: spec.require_paths = ['lib']
74: ext_path = File.join(d, 'ext')
75: spec.require_paths << 'ext' if File.exist?(ext_path)
76: spec.name = /^(.*)-[^-]+$/.match(dir_name)[1]
77: files = ['lib']
78: # set files to everything in lib/
79: files += Dir[File.join(d, 'lib', '*')].map { |v| v.gsub(/^#{d}\//, '') }
80: files += Dir[File.join(d, 'ext', '*')].map { |v| v.gsub(/^#{d}\//, '') } if ext_path
81: spec.files = files
82: else
83: $stderr.puts("config.gem: Unpacked gem #{dir_name} in vendor/gems not in a versioned directory."+
84: " Giving up.") unless @@silence_spec_warnings
85: next
86: end
87: end
88: spec.loaded_from = File.join(d, '.specification')
89: # finally, swap out full_gem_path
90: # it would be better to use a Gem::Specification subclass, but the YAML loads an explicit class
91: class << spec
92: def full_gem_path
93: path = File.join installation_path, full_name
94: return path if File.directory? path
95: File.join installation_path, original_name
96: end
97: end
98: vendor_gems[File.basename(d)] = spec
99: end
100: @vendor_source_index = Gem::SourceIndex.new(vendor_gems)
101: end
[ show source ]
# File railties/lib/rails/vendor_gem_source_index.rb, line 131
131: def remove_spec(spec)
132: @vendor_source_index.remove_spec spec
133: end
[ show source ]
# File railties/lib/rails/vendor_gem_source_index.rb, line 117
117: def search(*args)
118: # look for vendor gems, and then installed gems - later elements take priority
119: @installed_source_index.search(*args) + @vendor_source_index.search(*args)
120: end
[ show source ]
# File railties/lib/rails/vendor_gem_source_index.rb, line 135
135: def size
136: @vendor_source_index.size + @installed_source_index.size
137: end
[ show source ]
# File railties/lib/rails/vendor_gem_source_index.rb, line 103
103: def version_for_dir(d)
104: matches = /-([^-]+)$/.match(d)
105: Gem::Version.new(matches[1]) if matches
106: end