jeffrafter-gemstalker 0.2.0 → 0.2.1

Sign up to get free protection for your applications and to get access to all the features.
data/Rakefile CHANGED
@@ -11,9 +11,8 @@ begin
11
11
  s.homepage = "http://github.com/technicalpickles/gemstalker"
12
12
  s.description = "A library for determining if GitHub has built a gem yet"
13
13
  s.authors = ["Josh Nichols"]
14
- s.files = FileList["[A-Z]*", "{bin, lib, test}/**/*"]
14
+ s.files = FileList["[A-Z]*", "{bin,lib,test}/**/*"]
15
15
  s.executables = "stalk"
16
- s.bindir = "bin"
17
16
  end
18
17
  rescue LoadError
19
18
  puts "Jeweler not available. Install it with: sudo gem install technicalpickles-jeweler -s http://gems.github.com"
data/VERSION.yml CHANGED
@@ -1,4 +1,4 @@
1
1
  ---
2
2
  :major: 0
3
3
  :minor: 2
4
- :patch: 0
4
+ :patch: 1
data/lib/gemstalker.rb ADDED
@@ -0,0 +1,70 @@
1
+ require 'net/http'
2
+
3
+ class GemStalker
4
+ attr_accessor :username, :name, :repository, :version
5
+
6
+ def initialize(options = {})
7
+ @username = options[:username]
8
+ @repository = options[:repository]
9
+ @version = options[:version] || determine_version
10
+
11
+ end
12
+
13
+ def built?
14
+ Net::HTTP.start('gems.github.com') {|http|
15
+ response = http.head(gem_path)
16
+ response.code == "200"
17
+ }
18
+ end
19
+
20
+ def gem?
21
+ Net::HTTP.start('github.com') {|http|
22
+ res = http.get(master_path)
23
+ return res.body =~ /alt\=.Rubygem./ if res.code == "200"
24
+ }
25
+ false
26
+ end
27
+
28
+ def in_specfile?
29
+ fetcher = Gem::SpecFetcher.new
30
+ specs = fetcher.load_specs(URI.parse('http://gems.github.com/'), 'specs')
31
+ specs.any? do |(name, spec)|
32
+ name == gem_name && spec.version.to_s == @version
33
+ end
34
+ end
35
+
36
+ protected
37
+
38
+ def gem_path
39
+ "/gems/#{gem_name}-#{@version}.gem"
40
+ end
41
+
42
+ def gem_name
43
+ "#{@username}-#{@repository}"
44
+ end
45
+
46
+ def gemspec_path
47
+ # TODO this seems very unfuture proof, and also specific to master branch...
48
+ "/#{@username}/#{@repository}/blob/master/#{@repository}.gemspec?raw=true"
49
+ end
50
+
51
+ def master_path
52
+ "/#{@username}/#{@repository}/tree/master"
53
+ end
54
+
55
+ def determine_version
56
+ res = nil
57
+ Net::HTTP.start('github.com') {|http|
58
+ res = http.get(gemspec_path)
59
+ }
60
+
61
+ if res.code == "200"
62
+ gemspec_file = res.body
63
+ gemspec = nil
64
+ # TODO this assumes Ruby format, but GitHub is cool with YAML
65
+ Thread.new { gemspec = eval("$SAFE = 3\n#{gemspec_file}") }.join
66
+ gemspec.version.to_s
67
+ end
68
+ end
69
+
70
+ end
@@ -0,0 +1,64 @@
1
+ require File.dirname(__FILE__) + '/test_helper'
2
+
3
+ class GemstalkerTest < Test::Unit::TestCase
4
+
5
+ context "a stalker for a specific version of a gem that has not been built" do
6
+ setup do
7
+ @stalker = GemStalker.new(:username => 'technicalpickles', :repository => 'jeweler', :version => '0.9.3')
8
+ end
9
+
10
+ should "not be built yet" do
11
+ assert ! @stalker.built?
12
+ end
13
+
14
+ should "not be in specfile yet" do
15
+ assert ! @stalker.in_specfile?
16
+ end
17
+ end
18
+
19
+ context "a stalker for a specific version of a gem that has been built and is available" do
20
+ setup do
21
+ @stalker = GemStalker.new(:username => 'technicalpickles', :repository => 'jeweler', :version => '0.8.1')
22
+ end
23
+
24
+ should "be built" do
25
+ assert @stalker.built?
26
+ end
27
+
28
+ should "be in specfile" do
29
+ assert @stalker.in_specfile?
30
+ end
31
+ end
32
+
33
+ context "a stalker without a specific version of a gem that has been built" do
34
+ setup do
35
+ @stalker = GemStalker.new(:username => 'technicalpickles', :repository => 'jeweler')
36
+ end
37
+
38
+ should "determine version" do
39
+ assert_equal '0.8.1', @stalker.version
40
+ end
41
+
42
+ should "be built" do
43
+ assert @stalker.built?
44
+ end
45
+
46
+ should "be in specfile" do
47
+ assert @stalker.in_specfile?
48
+ end
49
+
50
+ should "be a gem" do
51
+ assert @stalker.gem?
52
+ end
53
+ end
54
+
55
+ context "a stalker for something not marked as a gem" do
56
+ setup do
57
+ @stalker = GemStalker.new(:username => 'technicalpickles', :repository => 'bostonrb')
58
+ end
59
+
60
+ should "not be a gem" do
61
+ assert ! @stalker.gem?
62
+ end
63
+ end
64
+ end
@@ -0,0 +1,10 @@
1
+ require 'rubygems'
2
+ require 'test/unit'
3
+ require 'shoulda'
4
+ require 'ruby-debug'
5
+
6
+ $LOAD_PATH.unshift(File.dirname(__FILE__))
7
+ require File.join(File.dirname(__FILE__), '..', 'lib', 'gemstalker')
8
+
9
+ class Test::Unit::TestCase
10
+ end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: jeffrafter-gemstalker
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.0
4
+ version: 0.2.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Josh Nichols
@@ -27,6 +27,9 @@ files:
27
27
  - README
28
28
  - VERSION.yml
29
29
  - bin/stalk
30
+ - lib/gemstalker.rb
31
+ - test/gemstalker_test.rb
32
+ - test/test_helper.rb
30
33
  has_rdoc: false
31
34
  homepage: http://github.com/technicalpickles/gemstalker
32
35
  post_install_message: