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 +1 -2
- data/VERSION.yml +1 -1
- data/lib/gemstalker.rb +70 -0
- data/test/gemstalker_test.rb +64 -0
- data/test/test_helper.rb +10 -0
- metadata +4 -1
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,
|
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
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
|
data/test/test_helper.rb
ADDED
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.
|
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:
|