class Automatiek::Gem
def clean
def clean files = Dir.glob("#{vendor_lib}/*", File::FNM_DOTMATCH).reject {|f| %(. .. lib).include? f.split("/").last } FileUtils.rm_r files end
def dependency(name, &block)
def dependency(name, &block) dep = self.class.new(name, &block) @dependencies << dep end
def download=(opts = {}, &block)
def download=(opts = {}, &block) if block @download = block elsif github = opts.delete(:github) @download = lambda do |version| Dir.chdir File.dirname(vendor_lib) do `curl -L #{github}/archive/#{version}.tar.gz | tar -xz` unless $?.success? raise "Downloading & untarring #{gem_name} (#{version}) failed" end FileUtils.mv "#{github.split("/").last}-#{version.sub(/^v/, "")}", gem_name end end end end
def initialize(gem_name, &block)
def initialize(gem_name, &block) @gem_name = gem_name @dependencies = [] block.call(self) if block end
def namespace_files(folder)
def namespace_files(folder) files = Dir.glob("#{folder}/**/*.rb") require_target = vendor_lib.sub(%r{^(.+?/)?lib/}, "") << "/lib" process(files, namespace, "#{prefix}::#{namespace}") process(files, /require (["'])#{Regexp.escape require_entrypoint}/, "require \\1#{require_target}/#{require_entrypoint}") process(files, /(autoload\s+[:\w]+,\s+["'])(#{Regexp.escape require_entrypoint}[\w\/]+["'])/, "\\1#{require_target}/\\2") end
def process(files, regex, replacement = "")
def process(files, regex, replacement = "") files.each do |file| contents = File.read(file) contents.gsub!(regex, replacement) File.open(file, "w") {|f| f << contents } end end
def require_entrypoint
def require_entrypoint @require_entrypoint ||= gem_name.tr("-", "/") end
def update(version)
def update(version) FileUtils.rm_rf vendor_lib @download.call(version) end
def vendor!(version = nil)
def vendor!(version = nil) update(version || self.version) @dependencies.each do |dependency| dependency.vendor! dependency.namespace_files(vendor_lib) end namespace_files(vendor_lib) clean end