Sha256: 36988aa1be5b5d56bff4431db4305917285626ef100ca9fca757104a2655c911

Contents?: true

Size: 1.67 KB

Versions: 1

Compression:

Stored size: 1.67 KB

Contents

require 'net/http'
require 'rubygems/spec_fetcher'

class GemStalker
  attr_accessor :username, :name, :repository, :version

  def initialize(options = {})
    @username   = options[:username]
    @repository = options[:repository]
    @version    = options[:version] || determine_version

  end

  def built?
    Net::HTTP.start('gems.github.com') {|http|
      response = http.head(gem_path)
      response.code == "200"
    }
  end
  
  def gem?
    Net::HTTP.start('github.com') {|http|
      res = http.get(master_path)
      return res.body =~ /alt\=.Rubygem./ if res.code == "200"
    }
    false
  end

  def in_specfile?
    fetcher = Gem::SpecFetcher.new
    specs = fetcher.load_specs(URI.parse('http://gems.github.com/'), 'specs')
    specs.any? do |(name, spec)|
      name == gem_name && spec.version.to_s == @version
    end
  end

  def edit_repo_url
    "http://github.com/#{@username}/#{@repository}/edit"
  end

  protected

  def gem_path
    "/gems/#{gem_name}-#{@version}.gem"
  end
  
  def gem_name
    "#{@username}-#{@repository}"
  end

  def gemspec_path
    # TODO this seems very unfuture proof, and also specific to master branch...
    "/#{@username}/#{@repository}/blob/master/#{@repository}.gemspec?raw=true"
  end

  def master_path
    "/#{@username}/#{@repository}/tree/master"
  end



  def determine_version
    res = nil
    Net::HTTP.start('github.com') {|http|
      res = http.get(gemspec_path)
    }

    if res.code == "200"
      gemspec_file = res.body
      gemspec = nil
      # TODO this assumes Ruby format, but GitHub is cool with YAML
      Thread.new { gemspec = eval("$SAFE = 3\n#{gemspec_file}") }.join
      gemspec.version.to_s
    end
  end
  
end

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
technicalpickles-gemstalker-0.3.0 lib/gem_stalker.rb