stickler 2.3.0 → 2.4.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +15 -0
- data/CONTRIBUTING.md +5 -4
- data/HISTORY.md +16 -9
- data/LICENSE +1 -1
- data/Manifest.txt +34 -20
- data/README.md +128 -0
- data/Rakefile +10 -9
- data/bin/stickler +9 -6
- data/bin/stickler-passenger-config +8 -8
- data/bin/stickler-server +12 -12
- data/examples/as_middleware.ru +14 -0
- data/examples/auth_repo.ru +1 -1
- data/examples/gemcutter_repo.ru +1 -1
- data/examples/local_repo.ru +1 -1
- data/lib/stickler.rb +3 -1
- data/lib/stickler/client.rb +2 -1
- data/lib/stickler/client/delete.rb +1 -1
- data/lib/stickler/client/latest-version.rb +40 -0
- data/lib/stickler/client/mirror.rb +47 -15
- data/lib/stickler/client/push.rb +1 -1
- data/lib/stickler/client/unyank.rb +1 -1
- data/lib/stickler/client/yank.rb +1 -1
- data/lib/stickler/gem_container.rb +40 -0
- data/lib/stickler/gemfile_lock_parser.rb +47 -0
- data/lib/stickler/middleware.rb +1 -0
- data/lib/stickler/middleware/server.rb +37 -0
- data/lib/stickler/repository/api.rb +16 -0
- data/lib/stickler/repository/index.rb +0 -3
- data/lib/stickler/repository/local.rb +6 -8
- data/lib/stickler/repository/remote.rb +29 -7
- data/lib/stickler/server.rb +2 -6
- data/man/stickler-passenger-config.1 +2 -22
- data/man/stickler-server.1 +9 -99
- data/man/stickler.1 +15 -173
- data/man/stickler.1.ronn +6 -0
- data/tasks/default.rake +16 -18
- data/tasks/man.rake +7 -0
- data/tasks/this.rb +5 -5
- data/test/data/Gemfile.lock.example +56 -0
- data/{spec → test}/data/gemcutter/gems/foo-1.0.0.gem +0 -0
- data/{spec → test}/data/gems/bar-1.0.0.gem +0 -0
- data/{spec → test}/data/gems/baz-3.1.4-java.gem +0 -0
- data/{spec → test}/data/gems/baz-3.1.4.gem +0 -0
- data/{spec → test}/data/gems/foo-1.0.0.gem +0 -0
- data/{spec → test}/data/gems/foo-2.0.0a.gem +0 -0
- data/test/data/specifications/bar-1.0.0.gemspec +31 -0
- data/test/data/specifications/baz-3.1.4-java.gemspec +32 -0
- data/test/data/specifications/baz-3.1.4.gemspec +31 -0
- data/test/data/specifications/foo-1.0.0.gemspec +31 -0
- data/test/data/specifications/foo-2.0.0a.gemspec +32 -0
- data/test/index_test_helpers.rb +75 -0
- data/test/middleware/test_local.rb +75 -0
- data/test/middleware/test_not_found.rb +26 -0
- data/test/repository/test_api.rb +49 -0
- data/test/repository/test_api_behavior.rb +208 -0
- data/test/repository/test_index.rb +48 -0
- data/test/repository/test_local.rb +59 -0
- data/test/repository/test_null.rb +15 -0
- data/test/repository/test_remote.rb +26 -0
- data/test/repository/test_remote_authenticated.rb +39 -0
- data/test/stickler_test_server.rb +35 -0
- data/test/test_gemfile_lock_parser.rb +28 -0
- data/test/test_paths.rb +22 -0
- data/test/test_spec_lite.rb +90 -0
- data/test/test_stickler.rb +49 -0
- metadata +58 -85
- data/README.rdoc +0 -156
- data/spec/index_spec_helpers.rb +0 -73
- data/spec/middleware/local_spec.rb +0 -72
- data/spec/middleware/not_found_spec.rb +0 -25
- data/spec/paths_spec.rb +0 -11
- data/spec/repository/api_behavior.rb +0 -192
- data/spec/repository/api_spec.rb +0 -37
- data/spec/repository/index_spec.rb +0 -46
- data/spec/repository/local_spec.rb +0 -49
- data/spec/repository/null_spec.rb +0 -14
- data/spec/repository/remote_spec.rb +0 -86
- data/spec/spec.opts +0 -2
- data/spec/spec_helper.rb +0 -24
- data/spec/spec_lite_spec.rb +0 -96
data/README.rdoc
DELETED
@@ -1,156 +0,0 @@
|
|
1
|
-
= Stickler
|
2
|
-
|
3
|
-
* Jeremy Hinegardner <jeremy@hinegardner.org>
|
4
|
-
* http://github.com/copiousfreetime/qup
|
5
|
-
|
6
|
-
== DESCRIPTION
|
7
|
-
|
8
|
-
Stickler is a tool to organize and maintain an internal gem repository.
|
9
|
-
Primarily, you would want to use Stickler if:
|
10
|
-
|
11
|
-
1. You have proprietary gems that you want to have available via a gem server so
|
12
|
-
you may +gem install+ them.
|
13
|
-
2. You would like to have a local mirror of third party gems from either
|
14
|
-
http://rubygems.org or some other gem server.
|
15
|
-
3. You want both (1) and (2) in the same server.
|
16
|
-
|
17
|
-
|
18
|
-
== INSTALLATION
|
19
|
-
|
20
|
-
Installing stickler may be done via the standard gem installation
|
21
|
-
|
22
|
-
gem install stickler
|
23
|
-
|
24
|
-
Or downloaded from http://github.com/copiousfreetime/stickler/downloads
|
25
|
-
|
26
|
-
|
27
|
-
== USAGE
|
28
|
-
|
29
|
-
Stickler is broken up into a few commandline programs.
|
30
|
-
|
31
|
-
.Command line programs
|
32
|
-
******************************************************************
|
33
|
-
[horizontal]
|
34
|
-
link:man/stickler.html[stickler]::
|
35
|
-
Used to add gems to and remove gems from the
|
36
|
-
link:man/stickler-server.html[stickler-server]
|
37
|
-
|
38
|
-
link:man/stickler-server.html[stickler-server]::
|
39
|
-
The server process that holds the gems.
|
40
|
-
|
41
|
-
link:man/stickler-passenger-config.html[stickler-passenger-config]::
|
42
|
-
A helper process to generate Passenger configurations for
|
43
|
-
link:man/stickler-server.html[stickler-server]
|
44
|
-
******************************************************************
|
45
|
-
|
46
|
-
The easiest way to get up and running with stickler is to run the
|
47
|
-
standalone server link:man/stickler-server.html[stickler-server] and
|
48
|
-
then use link:man/stickler.html[stickler] to interact with it.
|
49
|
-
|
50
|
-
.Start up a standalone stickler server
|
51
|
-
------------------------------------------------------------------
|
52
|
-
% mkdir -p /tmp/stickler-test
|
53
|
-
% stickler-server start --daemonize /tmp/stickler-test
|
54
|
-
------------------------------------------------------------------
|
55
|
-
|
56
|
-
.Set some sane defaults
|
57
|
-
------------------------------------------------------------------
|
58
|
-
% stickler config --add --server http://localhost:6789 --upstream https://rubygems.org
|
59
|
-
server : http://localhost:6789
|
60
|
-
upstream : https://rubygems.org
|
61
|
-
|
62
|
-
% cat ~/.gem/stickler
|
63
|
-
---
|
64
|
-
:server: http://localhost:6789
|
65
|
-
:upstream: https://rubygems.org
|
66
|
-
------------------------------------------------------------------
|
67
|
-
|
68
|
-
.Take a few gems and push them to the server
|
69
|
-
------------------------------------------------------------------
|
70
|
-
% ls -1
|
71
|
-
heel-2.0.0.gem
|
72
|
-
hitimes-1.1.1.gem
|
73
|
-
launchy-0.3.5.gem
|
74
|
-
stickler-2.0.0.gem
|
75
|
-
|
76
|
-
% stickler push *.gem
|
77
|
-
Pushing gem(s) to http://localhost:6789/ ...
|
78
|
-
/Users/jeremy/tmp/gems/heel-2.0.0.gem -> OK http://localhost:6789/gems/heel-2.0.0.gem
|
79
|
-
/Users/jeremy/tmp/gems/hitimes-1.1.1.gem -> OK http://localhost:6789/gems/hitimes-1.1.1.gem
|
80
|
-
/Users/jeremy/tmp/gems/launchy-0.3.5.gem -> OK http://localhost:6789/gems/launchy-0.3.5.gem
|
81
|
-
/Users/jeremy/tmp/gems/stickler-2.0.0.gem -> OK http://localhost:6789/gems/stickler-2.0.0.gem
|
82
|
-
------------------------------------------------------------------
|
83
|
-
|
84
|
-
.Mirror a gem from upstream
|
85
|
-
------------------------------------------------------------------
|
86
|
-
% stickler mirror --gem-version 1.4.3 logging
|
87
|
-
Asking http://localhost:6789/ to mirror logging-1.4.3 from rubygems.org : OK -> http://localhost:6789/gems/logging-1.4.3.gem
|
88
|
-
% stickler mirror --gem-version 1.16.2 trollop
|
89
|
-
Asking http://localhost:6789/ to mirror trollop-1.16.2 from rubygems.org : OK -> http://localhost:6789/gems/trollop-1.16.2.gem
|
90
|
-
------------------------------------------------------------------
|
91
|
-
|
92
|
-
.Look at all the gems installed in your stickler server
|
93
|
-
Open your browser to http://localhost:6789
|
94
|
-
-------------------------------
|
95
|
-
% launchy http://localhost:6789
|
96
|
-
-------------------------------
|
97
|
-
|
98
|
-
.Install a gem from your new stickler gem server
|
99
|
-
------------------------------------------------------
|
100
|
-
% gem install hitimes --source http://localhost:6789/
|
101
|
-
------------------------------------------------------
|
102
|
-
|
103
|
-
.Configure your servers to globally use your internal stickler gem server
|
104
|
-
-----------------------------
|
105
|
-
% cat /etc/gemrc
|
106
|
-
---
|
107
|
-
:benchmark: false
|
108
|
-
:verbose: false
|
109
|
-
:update_sources: true
|
110
|
-
:bulk_threshold: 1000
|
111
|
-
:backtrace: false
|
112
|
-
:sources:
|
113
|
-
- http://stickler.example.com
|
114
|
-
gem: --no-rdoc --no-ri
|
115
|
-
-----------------------------
|
116
|
-
|
117
|
-
|
118
|
-
See Also
|
119
|
-
--------
|
120
|
-
The man pages that ship with the gem. They may be viewed if you also install
|
121
|
-
the link:http://defunkt.github.com/gem-man/[gem-man] gem.
|
122
|
-
|
123
|
-
---------------------------------
|
124
|
-
% gem install gem-man
|
125
|
-
% gem man stickler
|
126
|
-
View which manual?
|
127
|
-
1. stickler-passenger-config(1)
|
128
|
-
2. stickler-server(1)
|
129
|
-
3. stickler(1)
|
130
|
-
>
|
131
|
-
---------------------------------
|
132
|
-
|
133
|
-
== DEVELOPMENT
|
134
|
-
|
135
|
-
If you want to do development on stickler, I suggest using
|
136
|
-
https://rvm.beginrescueend.com/[RVM] and creating a gemset for stickler.
|
137
|
-
|
138
|
-
Then run 'rake how_to_contribute'
|
139
|
-
|
140
|
-
|
141
|
-
== CREDITS
|
142
|
-
|
143
|
-
* http://rubyforge.org/projects/rubygems/[The Rubygems Team]
|
144
|
-
|
145
|
-
|
146
|
-
== LICENSE
|
147
|
-
|
148
|
-
Copyright (C) 2008-2010 Jeremy Hinegardner
|
149
|
-
ISC License, See LICENSE for details
|
150
|
-
|
151
|
-
|
152
|
-
== APPENDIX
|
153
|
-
|
154
|
-
* http://github.com/copiousfreetime/stickler[Github Project]
|
155
|
-
* link:HISTORY.html[History]
|
156
|
-
* http://www.copiousfreetime.org/projects/stickler/
|
data/spec/index_spec_helpers.rb
DELETED
@@ -1,73 +0,0 @@
|
|
1
|
-
require 'rack/test'
|
2
|
-
require 'rubygems/user_interaction'
|
3
|
-
require 'rubygems/indexer'
|
4
|
-
|
5
|
-
module IndexSpecHelpers
|
6
|
-
include Rack::Test::Methods
|
7
|
-
|
8
|
-
def define_directories
|
9
|
-
# pristine spec data location
|
10
|
-
@idx_spec_dir = File.expand_path( File.dirname( __FILE__ ) )
|
11
|
-
@idx_spec_datadir = File.join( @idx_spec_dir, "data" )
|
12
|
-
|
13
|
-
# scratch location
|
14
|
-
@scratch_dir = File.join( @idx_spec_dir, "scratch" )
|
15
|
-
@scratch_datadir = File.join( @scratch_dir, 'data' )
|
16
|
-
@scratch_specdir = File.join( @scratch_datadir, "specifications" )
|
17
|
-
@scratch_gemsdir = File.join( @scratch_datadir, "gems" )
|
18
|
-
end
|
19
|
-
|
20
|
-
# put in the before clause for setup
|
21
|
-
def mirror_spec_gemdir
|
22
|
-
define_directories
|
23
|
-
FileUtils.mkdir_p( @scratch_dir )
|
24
|
-
FileUtils.cp_r( @idx_spec_datadir, @scratch_dir )
|
25
|
-
end
|
26
|
-
|
27
|
-
# Do a legacy index of the scratch location
|
28
|
-
def make_legacy_index
|
29
|
-
indexer = Gem::Indexer.new( @scratch_datadir, :build_legacy => true, :build_modern => false )
|
30
|
-
with_quieter_rubygems { indexer.generate_index }
|
31
|
-
end
|
32
|
-
|
33
|
-
# Do a modern index of the scratch location
|
34
|
-
def make_modern_index
|
35
|
-
indexer = Gem::Indexer.new( @scratch_datadir, :build_legacy => false, :build_modern => true )
|
36
|
-
with_quieter_rubygems { indexer.generate_index }
|
37
|
-
end
|
38
|
-
|
39
|
-
# put in the after clause for cleanup
|
40
|
-
def destroy_scratch_dir
|
41
|
-
FileUtils.rm_rf( @scratch_dir )
|
42
|
-
end
|
43
|
-
|
44
|
-
def with_quieter_rubygems( &block )
|
45
|
-
previous = Gem.configuration.verbose
|
46
|
-
Gem.configuration.verbose = nil
|
47
|
-
yield
|
48
|
-
Gem.configuration.verbose = previous
|
49
|
-
end
|
50
|
-
|
51
|
-
def validate_contents( got, expected, content_type)
|
52
|
-
case content_type
|
53
|
-
when 'application/x-gzip'
|
54
|
-
response_un = Gem.gunzip( got )
|
55
|
-
expected_un = Gem.gunzip( expected )
|
56
|
-
when 'application/x-deflate'
|
57
|
-
response_un = Gem.inflate( got )
|
58
|
-
expected_un = Gem.inflate( expected )
|
59
|
-
when 'application/octet-stream'
|
60
|
-
response_un = got
|
61
|
-
expected_un = expected
|
62
|
-
else
|
63
|
-
fail "Unkonwn content type #{content_type} with data #{got}"
|
64
|
-
end
|
65
|
-
|
66
|
-
got = Marshal.load( response_un )
|
67
|
-
got.sort! if got.kind_of?( Array )
|
68
|
-
|
69
|
-
need = Marshal.load( expected_un )
|
70
|
-
need.sort! if need.kind_of?( Array )
|
71
|
-
got.should == need
|
72
|
-
end
|
73
|
-
end
|
@@ -1,72 +0,0 @@
|
|
1
|
-
require 'spec_helper'
|
2
|
-
|
3
|
-
describe Stickler::Middleware::Local do
|
4
|
-
|
5
|
-
include IndexSpecHelpers
|
6
|
-
include Rack::Test::Methods
|
7
|
-
|
8
|
-
def app
|
9
|
-
repo_root = @idx_spec_datadir
|
10
|
-
::Rack::Builder.new do
|
11
|
-
use ::Stickler::Middleware::Compression
|
12
|
-
use ::Stickler::Middleware::Local, :repo_root => repo_root
|
13
|
-
run ::Sinatra::Base
|
14
|
-
end
|
15
|
-
end
|
16
|
-
|
17
|
-
describe "When serving a modern index" do
|
18
|
-
before( :all ) do
|
19
|
-
mirror_spec_gemdir
|
20
|
-
make_modern_index
|
21
|
-
end
|
22
|
-
|
23
|
-
after( :all ) do
|
24
|
-
destroy_scratch_dir
|
25
|
-
end
|
26
|
-
|
27
|
-
[
|
28
|
-
"/specs.#{Gem.marshal_version}",
|
29
|
-
"/specs.#{Gem.marshal_version}.gz",
|
30
|
-
"/latest_specs.#{Gem.marshal_version}",
|
31
|
-
"/latest_specs.#{Gem.marshal_version}.gz",
|
32
|
-
"/prerelease_specs.#{Gem.marshal_version}",
|
33
|
-
"/prerelease_specs.#{Gem.marshal_version}.gz",
|
34
|
-
"/quick/Marshal.#{Gem.marshal_version}/foo-1.0.0.gemspec.rz",
|
35
|
-
"/quick/Marshal.#{Gem.marshal_version}/bar-1.0.0.gemspec.rz",
|
36
|
-
"/quick/Marshal.#{Gem.marshal_version}/foo-2.0.0a.gemspec.rz",
|
37
|
-
"/quick/Marshal.#{Gem.marshal_version}/baz-3.1.4-java.gemspec.rz",
|
38
|
-
"/quick/Marshal.#{Gem.marshal_version}/baz-3.1.4.gemspec.rz",
|
39
|
-
].each do |path|
|
40
|
-
it "should return the same bytes as Gem::Indexer for '#{path}'" do
|
41
|
-
response = get( path )
|
42
|
-
validate_contents( response.body,
|
43
|
-
IO.read( File.join(@scratch_datadir, path) ),
|
44
|
-
response.content_type )
|
45
|
-
end
|
46
|
-
end
|
47
|
-
end
|
48
|
-
|
49
|
-
describe "When serving a legacy index" do
|
50
|
-
before( :all ) do
|
51
|
-
mirror_spec_gemdir
|
52
|
-
make_legacy_index
|
53
|
-
end
|
54
|
-
|
55
|
-
after( :all ) do
|
56
|
-
destroy_scratch_dir
|
57
|
-
end
|
58
|
-
|
59
|
-
[
|
60
|
-
"/Marshal.#{Gem.marshal_version}",
|
61
|
-
"/Marshal.#{Gem.marshal_version}.Z",
|
62
|
-
].each do |path|
|
63
|
-
it "should return the same bytes as Gem::Indexer for '#{path}'" do
|
64
|
-
pending
|
65
|
-
response = get( path )
|
66
|
-
validate_contents( response.body,
|
67
|
-
IO.read( File.join(@scratch_datadir, path) ),
|
68
|
-
response.content_type )
|
69
|
-
end
|
70
|
-
end
|
71
|
-
end
|
72
|
-
end
|
@@ -1,25 +0,0 @@
|
|
1
|
-
require 'spec_helper'
|
2
|
-
|
3
|
-
describe ::Stickler::Middleware::NotFound do
|
4
|
-
include Rack::Test::Methods
|
5
|
-
def app
|
6
|
-
::Stickler::Middleware::NotFound.new
|
7
|
-
end
|
8
|
-
|
9
|
-
before do
|
10
|
-
get "/"
|
11
|
-
end
|
12
|
-
|
13
|
-
it "should respond to a 404 on everything" do
|
14
|
-
get '/'
|
15
|
-
last_response.status.should == 404
|
16
|
-
end
|
17
|
-
|
18
|
-
it "should return a 'text/html' page" do
|
19
|
-
last_response.content_type.should == 'text/html'
|
20
|
-
end
|
21
|
-
|
22
|
-
it "should say to go look somewhere else" do
|
23
|
-
last_response.body.should =~ /Not Found/m
|
24
|
-
end
|
25
|
-
end
|
data/spec/paths_spec.rb
DELETED
@@ -1,11 +0,0 @@
|
|
1
|
-
require 'spec_helper'
|
2
|
-
|
3
|
-
describe Stickler::Paths do
|
4
|
-
it "can access the root dir of the project" do
|
5
|
-
Stickler::Paths.root_dir.should == File.expand_path( File.join( File.dirname( __FILE__ ), ".." ) ) + ::File::SEPARATOR
|
6
|
-
end
|
7
|
-
|
8
|
-
it "can access the lib path of the project" do
|
9
|
-
Stickler::Paths.lib_path.should == File.expand_path( File.join( File.dirname( __FILE__ ), "..", "lib" ) ) + ::File::SEPARATOR
|
10
|
-
end
|
11
|
-
end
|
@@ -1,192 +0,0 @@
|
|
1
|
-
shared_examples_for "includes Repository::Api" do
|
2
|
-
describe "responds to all the api methods" do
|
3
|
-
Stickler::Repository::Api.api_methods.each do |method|
|
4
|
-
it "responds to ##{method}" do
|
5
|
-
@repo.respond_to?( method ).should == true
|
6
|
-
end
|
7
|
-
end
|
8
|
-
end
|
9
|
-
end
|
10
|
-
|
11
|
-
require 'digest/sha1'
|
12
|
-
shared_examples_for "implements Repository::Api" do
|
13
|
-
before( :each ) do
|
14
|
-
@foo_gem_local_path = File.join( @gems_dir, "foo-1.0.0.gem" )
|
15
|
-
@foo_spec = Stickler::SpecLite.new( 'foo', '1.0.0' )
|
16
|
-
@foo_digest = Digest::SHA1.hexdigest( IO.read( @foo_gem_local_path ) )
|
17
|
-
@missing_spec = Stickler::SpecLite.new( "does_not_exist", "0.1.0" )
|
18
|
-
end
|
19
|
-
|
20
|
-
# removed specifications_uri
|
21
|
-
%w[ uri gems_uri ].each do |method|
|
22
|
-
it "returns a URI like object from #{method}" do
|
23
|
-
result = @repo.send( method )
|
24
|
-
[ ::URI, ::Addressable::URI ].include?( result.class ).should == true
|
25
|
-
end
|
26
|
-
end
|
27
|
-
|
28
|
-
# removed specification
|
29
|
-
%w[ gem ].each do |thing|
|
30
|
-
describe "#uri_for_#{thing}" do
|
31
|
-
before( :each ) do
|
32
|
-
@repo.push( @foo_gem_local_path )
|
33
|
-
@method = "uri_for_#{thing}"
|
34
|
-
end
|
35
|
-
|
36
|
-
it "returns URI for a #{thing} that exists" do
|
37
|
-
uri = @repo.send( @method, @foo_spec )
|
38
|
-
[ ::URI, ::Addressable::URI ].include?( uri.class ).should == true
|
39
|
-
end
|
40
|
-
|
41
|
-
it "returns nil for a #{thing} that does not exist" do
|
42
|
-
@repo.send( @method, @missing_spec ).should be_nil
|
43
|
-
end
|
44
|
-
end
|
45
|
-
end
|
46
|
-
|
47
|
-
describe "#push" do
|
48
|
-
it "pushes a gem from a .gem file" do
|
49
|
-
@repo.push( @foo_gem_local_path )
|
50
|
-
@repo.search_for( Stickler::SpecLite.new( "foo", "1.0.0" ) )
|
51
|
-
end
|
52
|
-
|
53
|
-
it "raises an error when pushing a gem if the gem already exists" do
|
54
|
-
@repo.push( @foo_gem_local_path )
|
55
|
-
lambda { @repo.push( @foo_gem_local_path ) }.should raise_error( Stickler::Repository::Error, /gem foo-1.0.0 already exists/ )
|
56
|
-
end
|
57
|
-
end
|
58
|
-
|
59
|
-
describe "#delete" do
|
60
|
-
it "deletes a gem from the repo" do
|
61
|
-
@repo.search_for( @foo_spec ).should be_empty
|
62
|
-
@repo.push( @foo_gem_local_path )
|
63
|
-
@repo.search_for( @foo_spec ).size.should eq 1
|
64
|
-
@repo.delete( @foo_spec ).should eq true
|
65
|
-
@repo.search_for( @foo_spec ).should be_empty
|
66
|
-
end
|
67
|
-
|
68
|
-
it "returns false if it is unable to delete a gem from the repo" do
|
69
|
-
@repo.search_for( @foo_spec ).should be_empty
|
70
|
-
@repo.delete( @foo_spec ).should == false
|
71
|
-
end
|
72
|
-
end
|
73
|
-
|
74
|
-
describe "#yank" do
|
75
|
-
before( :each ) do
|
76
|
-
@repo.search_for( @foo_spec ).should be_empty
|
77
|
-
@repo.push( @foo_gem_local_path )
|
78
|
-
@response_uri = @repo.yank( @foo_spec )
|
79
|
-
end
|
80
|
-
|
81
|
-
it "returns the uri in which to get the gem" do
|
82
|
-
[ ::URI, ::Addressable::URI ].include?( @response_uri.class ).should == true
|
83
|
-
end
|
84
|
-
|
85
|
-
it "returns nil if the gem to yank does not exist or is already yanked" do
|
86
|
-
@repo.yank( @missing_spec ).should == nil
|
87
|
-
end
|
88
|
-
|
89
|
-
it "does not find the gem in a search" do
|
90
|
-
@repo.search_for( @foo_spec ).should be_empty
|
91
|
-
end
|
92
|
-
|
93
|
-
it "does have the #uri_for_gem" do
|
94
|
-
@repo.uri_for_gem( @foo_spec ).should == @response_uri
|
95
|
-
end
|
96
|
-
|
97
|
-
it "can still return the gem" do
|
98
|
-
data = @repo.get( @foo_spec )
|
99
|
-
sha1 = Digest::SHA1.hexdigest( data )
|
100
|
-
sha1.should == @foo_digest
|
101
|
-
end
|
102
|
-
|
103
|
-
end
|
104
|
-
|
105
|
-
describe "#unyank" do
|
106
|
-
before( :each ) do
|
107
|
-
@repo.search_for( @foo_spec ).should be_empty
|
108
|
-
@repo.push( @foo_gem_local_path )
|
109
|
-
end
|
110
|
-
|
111
|
-
it "returns nil if the gem to unyank does not exist" do
|
112
|
-
non_existing_gem = @missing_spec
|
113
|
-
@repo.unyank( non_existing_gem ).should be_nil
|
114
|
-
end
|
115
|
-
|
116
|
-
#Do we even care about this?
|
117
|
-
xit "returns nil if the gem to unyank has not been yanked" do
|
118
|
-
@repo.unyank( @foo_spec ).should be_nil
|
119
|
-
end
|
120
|
-
|
121
|
-
context " when file has been yanked" do
|
122
|
-
before :each do
|
123
|
-
@repo.yank( @foo_spec )
|
124
|
-
end
|
125
|
-
|
126
|
-
it "return true if the gem is successfully unyanked" do
|
127
|
-
@repo.unyank( @foo_spec ).should be_true
|
128
|
-
end
|
129
|
-
|
130
|
-
it "finds the gem in a search" do
|
131
|
-
@repo.unyank( @foo_spec )
|
132
|
-
@repo.search_for( @foo_spec ).should_not be_empty
|
133
|
-
end
|
134
|
-
end
|
135
|
-
end
|
136
|
-
|
137
|
-
describe "#search_for" do
|
138
|
-
it "returns specs for items that are found" do
|
139
|
-
@repo.push( @foo_gem_local_path )
|
140
|
-
@repo.search_for( @foo_spec ).should_not be_empty
|
141
|
-
end
|
142
|
-
|
143
|
-
it "returns an empty array when nothing is found" do
|
144
|
-
@repo.search_for( @missing_spec ).should be_empty
|
145
|
-
end
|
146
|
-
end
|
147
|
-
|
148
|
-
describe "#get" do
|
149
|
-
it "returns the bytes of the gem for a gem that exists" do
|
150
|
-
@repo.push( @foo_gem_local_path )
|
151
|
-
data = @repo.get( @foo_spec )
|
152
|
-
sha1 = Digest::SHA1.hexdigest( data )
|
153
|
-
sha1.should == @foo_digest
|
154
|
-
end
|
155
|
-
|
156
|
-
it "returns nil if the gem does not exist" do
|
157
|
-
@repo.get( @missing_spec ).should be_nil
|
158
|
-
end
|
159
|
-
end
|
160
|
-
|
161
|
-
describe "#open" do
|
162
|
-
before( :each ) do
|
163
|
-
@repo.push( @foo_gem_local_path )
|
164
|
-
end
|
165
|
-
it "reads a gem via a returned output stream" do
|
166
|
-
io = @repo.open( @foo_spec )
|
167
|
-
sha1 = Digest::SHA1.hexdigest( io.read )
|
168
|
-
sha1.should == @foo_digest
|
169
|
-
end
|
170
|
-
|
171
|
-
it "can be called with a block" do
|
172
|
-
sha1 = Digest::SHA1.new
|
173
|
-
@repo.open( @foo_spec ) do |io|
|
174
|
-
sha1 << io.read
|
175
|
-
end
|
176
|
-
sha1.hexdigest.should == @foo_digest
|
177
|
-
end
|
178
|
-
|
179
|
-
it "returns nil if the gem does not exist" do
|
180
|
-
@repo.open( @missing_spec ).should == nil
|
181
|
-
end
|
182
|
-
|
183
|
-
it "does not call the block if the gem does not exist" do
|
184
|
-
called = false
|
185
|
-
@repo.open( @missing_spec ) do |io|
|
186
|
-
called = true
|
187
|
-
end
|
188
|
-
called.should == false
|
189
|
-
end
|
190
|
-
end
|
191
|
-
|
192
|
-
end
|