In Files

Hoe::Deps

Deps plugin for hoe.

Tasks Provided:

check_extra_deps

Install missing dependencies.

deps:email

Print a contact list for gems dependent on this gem

deps:fetch

Fetch all the dependent gems of this gem into tarballs

deps:list

List all the dependent gems of this gem

Constants

GEMURL

The main rubygems repository.

Public Instance Methods

define_deps_tasks() click to toggle source

Define tasks for plugin.

     # File lib/hoe/deps.rb, line 22
 22:   def define_deps_tasks
 23:     namespace :deps do
 24:       desc "List all the dependent gems of this gem"
 25:       task :list do
 26:         gems = self.get_gems_by_name
 27:         gem  = gems[self.name]
 28: 
 29:         abort "Couldn't find gem: #{self.name}" unless gem
 30: 
 31:         deps = self.dependent_upon self.name
 32:         max  = deps.map { |s| s.full_name.size }.max
 33: 
 34:         puts "  dependents:"
 35:         unless deps.empty? then
 36:           deps.sort_by { |spec| spec.full_name }.each do |spec|
 37:             vers = spec.dependencies.find {|s| s.name == name}.requirements_list
 38:             puts "    %-*s - %s" % [max, spec.full_name, vers.join(", ")]
 39:           end
 40:         else
 41:           puts "    none"
 42:         end
 43:       end
 44: 
 45:       desc "Print a contact list for gems dependent on this gem"
 46:       task :email do
 47:         gems = self.get_gems_by_name
 48:         gem  = gems[self.name]
 49: 
 50:         abort "Couldn't find gem: #{self.name}" unless gem
 51: 
 52:         deps = self.dependent_upon self.name
 53:         email = deps.map { |s| s.email }.compact.flatten.sort.uniq
 54:         email = email.map { |s| s.split(/,\s*/) }.flatten.sort.uniq
 55: 
 56:         email.map! { |s| # don't you people realize how easy this is?
 57:           s.gsub(/ at | _at_ |\s*(atmark|@nospam@|-at?-|@at?@|<at?>|\[at?\]|\(at?\))\s*/, '@').gsub(/\s*(dot|\[d(ot)?\]|\.dot\.)\s*/, '.').gsub(/\s+com$/, '.com')
 58:         }
 59: 
 60:         bad, good = email.partition { |e| e !~ /^[\w.+-]+\@[\w.+-]+$/ }
 61: 
 62:         warn "Rejecting #{bad.size} email. I couldn't unmunge them." unless
 63:           bad.empty?
 64: 
 65:         puts good.join(", ")
 66: 
 67:         warn "Warning: couldn't extract any email addresses" if good.empty?
 68:       end
 69: 
 70:       desc "Fetch all the dependent gems of this gem into tarballs"
 71:       task :fetch do
 72:         gems = self.get_gems_by_name
 73:         gem  = gems[self.name]
 74:         deps = self.dependent_upon self.name
 75: 
 76:         mkdir "deps" unless File.directory? "deps"
 77:         Dir.chdir "deps" do
 78:           begin
 79:             deps.sort_by { |spec| spec.full_name }.each do |spec|
 80:               full_name = spec.full_name
 81:               tgz_name  = "#{full_name}.tgz"
 82:               gem_name  = "#{full_name}.gem"
 83: 
 84:               next if File.exist? tgz_name
 85:               FileUtils.rm_rf [full_name, gem_name]
 86: 
 87:               begin
 88:                 warn "downloading #{full_name}"
 89:                 Gem::RemoteFetcher.fetcher.download(spec, GEMURL, Dir.pwd)
 90:                 FileUtils.mv "cache/#{gem_name}", '.'
 91:               rescue Gem::RemoteFetcher::FetchError
 92:                 warn "  failed"
 93:                 next
 94:               end
 95: 
 96:               warn "converting #{gem_name} to tarball"
 97: 
 98:               system "gem unpack #{gem_name} 2> /dev/null"
 99:               system "gem spec -l #{gem_name} > #{full_name}/gemspec.rb"
100:               system "tar zmcf #{tgz_name} #{full_name}"
101:               FileUtils.rm_rf [full_name, gem_name, "cache"]
102:             end
103:           ensure
104:             FileUtils.rm_rf "cache"
105:           end
106:         end
107:       end
108:     end
109: 
110:     desc 'Install missing dependencies.'
111:     task :check_extra_deps do
112:       # extra_deps = [["rubyforge", ">= 1.0.0"], ["rake", ">= 0.8.1"]]
113:       (extra_deps + extra_dev_deps).each do |dep|
114:         begin
115:           gem(*dep)
116:         rescue Gem::LoadError
117:           install_gem(*dep)
118:         end
119:       end
120:     end
121:   end
dependent_upon(name) click to toggle source

Return all the dependencies on the named rubygem.

     # File lib/hoe/deps.rb, line 175
175:   def dependent_upon name
176:     get_latest_gems.find_all { |gem|
177:       gem.dependencies.any? { |dep| dep.name == name }
178:     }
179:   end
get_gems_by_name() click to toggle source

Return a hash of the latest rubygems keyed by name.

     # File lib/hoe/deps.rb, line 166
166:   def get_gems_by_name
167:     @@by_name ||= Hash[*get_latest_gems.map { |gem|
168:                          [gem.name, gem, gem.full_name, gem]
169:                        }.flatten]
170:   end
get_latest_gems() click to toggle source

Return the latest rubygems.

     # File lib/hoe/deps.rb, line 159
159:   def get_latest_gems
160:     @@cache ||= Hash[*get_source_index.flatten].values
161:   end
get_source_index() click to toggle source

Return the rubygems source index.

     # File lib/hoe/deps.rb, line 126
126:   def get_source_index
127:     @@index ||= nil
128: 
129:     return @@index if @@index
130: 
131:     dump = unless File.exist? '.source_index' then
132:              warn "Fetching full index and caching. This can take a while."
133:              url = GEMURL + "Marshal.#{Gem.marshal_version}.Z"
134:              dump = Gem::RemoteFetcher.fetcher.fetch_path url
135:              dump = Gem.inflate dump
136: 
137:              warn "stripping index to latest gems"
138:              ary = Marshal.load dump
139: 
140:              h = {}
141:              Hash[ary].values.sort.each { |spec| h[spec.name] = spec }
142:              ary = h.map { |k,v| [v.full_name, v] }
143: 
144:              dump = Marshal.dump ary
145: 
146:              open '.source_index', 'wb' do |io| io.write dump end
147: 
148:              dump
149:            else
150:              open '.source_index', 'rb' do |io| io.read end
151:            end
152: 
153:     @@index = Marshal.load dump
154:   end

Disabled; run with --debug to generate this.

[Validate]

Generated with the Darkfish Rdoc Generator 1.1.6.