jeffrafter-gemstalker 0.2.0 → 0.2.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
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: