stickler 2.1.4 → 2.2.2
Sign up to get free protection for your applications and to get access to all the features.
- data/HISTORY.asciidoc +6 -0
- data/Rakefile +8 -8
- data/examples/auth_repo.ru +15 -0
- data/lib/stickler/middleware/index.rb +3 -3
- data/lib/stickler/repository/basic_authenticator.rb +22 -0
- data/lib/stickler/repository/local.rb +1 -1
- data/lib/stickler/repository/mirror.rb +2 -2
- data/lib/stickler/repository/remote.rb +18 -5
- data/lib/stickler/repository/rubygems_authenticator.rb +9 -4
- data/lib/stickler/version.rb +2 -2
- data/spec/index_spec_helpers.rb +0 -1
- data/spec/repository/remote_spec.rb +64 -24
- metadata +31 -37
data/HISTORY.asciidoc
CHANGED
@@ -2,6 +2,12 @@ Stickler Changelog
|
|
2
2
|
==================
|
3
3
|
Jeremy Hinegardner <jeremy@hinegardner.org>
|
4
4
|
|
5
|
+
|
6
|
+
Version 2.2.2 - 2012-02-13
|
7
|
+
--------------------------
|
8
|
+
* Updated dependencies to latest versions
|
9
|
+
* Added supoort for HTTP Basic Auth in the client
|
10
|
+
|
5
11
|
Version 2.1.4 - 2011-09-09
|
6
12
|
--------------------------
|
7
13
|
* Update dependencies to newest version
|
data/Rakefile
CHANGED
@@ -1,5 +1,5 @@
|
|
1
1
|
begin
|
2
|
-
USING_BONES_VERSION = '3.7.
|
2
|
+
USING_BONES_VERSION = '3.7.3'
|
3
3
|
require 'bones'
|
4
4
|
rescue LoadError
|
5
5
|
load 'tasks/contribute.rake'
|
@@ -19,7 +19,7 @@ Bones {
|
|
19
19
|
url 'http://www.copiousfreetime.org/projects/stickler'
|
20
20
|
version Stickler::VERSION
|
21
21
|
|
22
|
-
ruby_opts %w[-
|
22
|
+
ruby_opts %w[-w -rubygems]
|
23
23
|
readme_file 'README.asciidoc'
|
24
24
|
ignore_file '.bnsignore'
|
25
25
|
history_file 'HISTORY.asciidoc'
|
@@ -41,18 +41,18 @@ _
|
|
41
41
|
# I'm explicitly controlling the version of bones.
|
42
42
|
|
43
43
|
|
44
|
-
depend_on 'sinatra' , '~> 1.2
|
45
|
-
depend_on 'addressable', '~> 2.2.
|
46
|
-
depend_on 'excon' , '~> 0.
|
44
|
+
depend_on 'sinatra' , '~> 1.3.2'
|
45
|
+
depend_on 'addressable', '~> 2.2.6'
|
46
|
+
depend_on 'excon' , '~> 0.9.5'
|
47
47
|
depend_on 'trollop' , '~> 1.16.2'
|
48
|
-
depend_on 'logging' , '~> 1.6.
|
48
|
+
depend_on 'logging' , '~> 1.6.2'
|
49
49
|
|
50
|
-
depend_on 'rake' , '~> 0.9.2'
|
50
|
+
depend_on 'rake' , '~> 0.9.2.2', :development => true
|
51
51
|
depend_on 'bones' , "~> #{USING_BONES_VERSION}", :development => true
|
52
52
|
depend_on 'rack-test' , '~> 0.6.1', :development => true
|
53
53
|
depend_on 'bones-extras', '~> 1.3.0', :development => true
|
54
54
|
depend_on 'builder' , '~> 3.0.0', :development => true
|
55
|
-
depend_on 'rspec' , '~> 2.
|
55
|
+
depend_on 'rspec' , '~> 2.8.0', :development => true
|
56
56
|
}
|
57
57
|
|
58
58
|
# Sorry Tim, I need to manage my own bones version
|
@@ -0,0 +1,15 @@
|
|
1
|
+
#-----------------------------------------------------------------------
|
2
|
+
# Example rackup file for an entire stickler stack with authorization
|
3
|
+
#
|
4
|
+
# -*- vim: set ft=ruby: -*-
|
5
|
+
#-----------------------------------------------------------------------
|
6
|
+
$:.unshift File.expand_path( File.join( File.dirname(__FILE__), "..", "lib" ) )
|
7
|
+
|
8
|
+
require 'stickler'
|
9
|
+
|
10
|
+
tmp = File.expand_path( File.join( File.dirname( __FILE__ ), "..", "spec", "data" ) )
|
11
|
+
|
12
|
+
use Rack::Auth::Basic, 'Secure Stickler' do |u,p|
|
13
|
+
(u == "stickler") and (p == "secret")
|
14
|
+
end
|
15
|
+
run Stickler::Server.new( tmp ).app
|
@@ -63,9 +63,9 @@ module Stickler::Middleware
|
|
63
63
|
|
64
64
|
server_path = Stickler::Paths.lib_path( "stickler", "server" )
|
65
65
|
|
66
|
-
set :views,
|
67
|
-
set :
|
68
|
-
set :static,
|
66
|
+
set :views, File.join( server_path, "views" )
|
67
|
+
set :public_folder, File.join( server_path, "public" )
|
68
|
+
set :static, true
|
69
69
|
|
70
70
|
def initialize( app, opts = {} )
|
71
71
|
@app = app
|
@@ -0,0 +1,22 @@
|
|
1
|
+
require 'addressable/uri'
|
2
|
+
|
3
|
+
module Stickler::Repository
|
4
|
+
#
|
5
|
+
# Generate the authentication for basic auth request
|
6
|
+
#
|
7
|
+
class BasicAuthenticator
|
8
|
+
def self.handles?( uri )
|
9
|
+
%w[ http https ].include?( uri.scheme ) and uri.user and uri.password
|
10
|
+
end
|
11
|
+
|
12
|
+
def initialize( uri )
|
13
|
+
@user = uri.user
|
14
|
+
@password = uri.password
|
15
|
+
@cred = ["#{@user}:#{@password}"].pack('m').tr("\n", '')
|
16
|
+
end
|
17
|
+
|
18
|
+
def credentials
|
19
|
+
"Basic #{@cred}"
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
@@ -22,8 +22,8 @@ module Stickler::Repository
|
|
22
22
|
@local_repo = ::Stickler::Repository::Local.new( root_dir )
|
23
23
|
@remote_repos = {}
|
24
24
|
end
|
25
|
-
def_delegators :@local_repo, :uri, :gems_uri, :uri_for_gem, :search_for,
|
26
|
-
:push, :delete, :get, :open,
|
25
|
+
def_delegators :@local_repo, :uri, :gems_uri, :uri_for_gem, :search_for,
|
26
|
+
:push, :delete, :get, :open,
|
27
27
|
:specs, :latest_specs, :root_dir,
|
28
28
|
:last_modified_time, :full_path_to_gem,
|
29
29
|
:full_path_to_specification
|
@@ -3,6 +3,7 @@ require 'stickler/repository'
|
|
3
3
|
require 'stickler/version'
|
4
4
|
require 'stickler/repository/api'
|
5
5
|
require 'stickler/repository/rubygems_authenticator'
|
6
|
+
require 'stickler/repository/basic_authenticator'
|
6
7
|
require 'stringio'
|
7
8
|
|
8
9
|
module ::Stickler::Repository
|
@@ -16,8 +17,8 @@ module ::Stickler::Repository
|
|
16
17
|
attr_reader :authenticator
|
17
18
|
|
18
19
|
def initialize( repo_uri, options = {} )
|
19
|
-
@authenticator = options[:authenticator] || Stickler::Repository::RubygemsAuthenticator.new
|
20
20
|
@uri = Addressable::URI.parse( ensure_http( ensure_trailing_slash( repo_uri ) ) )
|
21
|
+
@authenticator = load_authenticator( @uri )
|
21
22
|
@specs_list = nil
|
22
23
|
end
|
23
24
|
|
@@ -139,6 +140,17 @@ module ::Stickler::Repository
|
|
139
140
|
return uri
|
140
141
|
end
|
141
142
|
|
143
|
+
def authenticator_class( uri )
|
144
|
+
[ RubygemsAuthenticator, BasicAuthenticator ].find { |a| a.handles?( uri ) }
|
145
|
+
end
|
146
|
+
|
147
|
+
def load_authenticator( uri )
|
148
|
+
if klass = authenticator_class( uri ) then
|
149
|
+
return klass.new( uri )
|
150
|
+
end
|
151
|
+
return nil
|
152
|
+
end
|
153
|
+
|
142
154
|
def full_uri_to_gem( spec )
|
143
155
|
gems_uri.join( spec.file_name )
|
144
156
|
end
|
@@ -200,7 +212,7 @@ module ::Stickler::Repository
|
|
200
212
|
def download_resource( resource )
|
201
213
|
resource_request( resource, :method => :get, :expects => [200] ).body
|
202
214
|
rescue Excon::Errors::Error => e
|
203
|
-
puts e.inspect
|
215
|
+
$stderr.puts e.inspect
|
204
216
|
return false
|
205
217
|
end
|
206
218
|
|
@@ -234,19 +246,20 @@ module ::Stickler::Repository
|
|
234
246
|
begin
|
235
247
|
resource.connection[:headers]['User-Agent'] = "Stickler Client v#{Stickler::VERSION}"
|
236
248
|
resource.connection[:headers].delete('Authorization')
|
237
|
-
if authenticator
|
249
|
+
if authenticator then
|
238
250
|
resource.connection[:headers]['Authorization'] = authenticator.credentials
|
239
251
|
end
|
240
252
|
trys += 1
|
241
|
-
#puts "Making request #{resource.connection.inspect} with extra params #{params.inspect}"
|
242
253
|
resource.request( params )
|
254
|
+
rescue Excon::Errors::Unauthorized => unauth
|
255
|
+
uri = "#{unauth.request[:scheme]}://#{unauth.request[:host]}:#{unauth.request[:port]}#{unauth.request[:path]}"
|
256
|
+
raise Stickler::Repository::Error, "Not authorized to access #{uri}. Authorization needed for: #{unauth.response.headers['WWW-Authenticate']}"
|
243
257
|
rescue Excon::Errors::MovedPermanently, Excon::Errors::Found,
|
244
258
|
Excon::Errors::SeeOther, Excon::Errors::TemporaryRedirect => redirect
|
245
259
|
# follow a redirect, it is only allowable to follow redirects from a GET or
|
246
260
|
# HEAD request. Only follow a few times though.
|
247
261
|
raise redirect unless [ :get, :head ].include?( redirect.request[:method] )
|
248
262
|
raise redirect if trys > 5
|
249
|
-
#puts "Redirecting to #{redirect.response.headers['Location']}"
|
250
263
|
resource = Excon::Connection.new( redirect.response.headers['Location'],
|
251
264
|
{ :headers => resource.connection[:headers],
|
252
265
|
:query => resource.connection[:headers],
|
@@ -11,6 +11,15 @@ module Stickler::Repository
|
|
11
11
|
@rubygems_uri ||= Addressable::URI.parse( "https://rubygems.org" )
|
12
12
|
end
|
13
13
|
|
14
|
+
def self.handles?( uri )
|
15
|
+
return ( uri.scheme == rubygems_uri.scheme ) &&
|
16
|
+
( uri.host == rubygems_uri.host )
|
17
|
+
end
|
18
|
+
|
19
|
+
def initialize( uri )
|
20
|
+
# do nothing
|
21
|
+
end
|
22
|
+
|
14
23
|
def credentials
|
15
24
|
Gem.configuration.rubygems_api_key
|
16
25
|
end
|
@@ -19,9 +28,5 @@ module Stickler::Repository
|
|
19
28
|
self.class.rubygems_uri
|
20
29
|
end
|
21
30
|
|
22
|
-
def handles?( scheme, host )
|
23
|
-
return ( scheme == rubygems_uri.scheme ) &&
|
24
|
-
( host == rubygems_uri.host )
|
25
|
-
end
|
26
31
|
end
|
27
32
|
end
|
data/lib/stickler/version.rb
CHANGED
data/spec/index_spec_helpers.rb
CHANGED
@@ -3,6 +3,41 @@ require File.expand_path( File.join( File.dirname(__FILE__), "api_behavior.rb" )
|
|
3
3
|
|
4
4
|
require 'stickler/repository/remote'
|
5
5
|
|
6
|
+
class SticklerTestServer
|
7
|
+
def initialize( spec_dir, ru_file )
|
8
|
+
@spec_dir = spec_dir
|
9
|
+
@repo_uri = "http://localhost:6789/"
|
10
|
+
@tmp_dir = File.join( @spec_dir, "tmp" )
|
11
|
+
FileUtils.mkdir_p( @tmp_dir )
|
12
|
+
|
13
|
+
@pid_file = File.join( @tmp_dir , "rack.pid" )
|
14
|
+
@ru_file = File.expand_path( File.join( @spec_dir, "..", "examples", ru_file ) )
|
15
|
+
@cmd = "rackup --port 6789 --pid #{@pid_file} --daemonize #{@ru_file}"
|
16
|
+
end
|
17
|
+
|
18
|
+
def start
|
19
|
+
system @cmd
|
20
|
+
tries = 0
|
21
|
+
loop do
|
22
|
+
begin
|
23
|
+
Excon.get( @repo_uri + "specs.#{Gem.marshal_version}.gz" )
|
24
|
+
#puts "rackup started with pid #{IO.read( @pid_file )}"
|
25
|
+
break
|
26
|
+
rescue => e
|
27
|
+
tries += 1
|
28
|
+
sleep tries * 0.1
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
def stop
|
34
|
+
pid = IO.read( @pid_file ).to_i
|
35
|
+
Process.kill( 'KILL', pid )
|
36
|
+
#FileUtils.rm_rf( @tmp_dir, :verbose => true )
|
37
|
+
FileUtils.rm_rf( @tmp_dir )
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
6
41
|
describe Stickler::Repository::Remote do
|
7
42
|
before do
|
8
43
|
@repo_uri = "http://localhost:6789/"
|
@@ -13,36 +48,41 @@ describe Stickler::Repository::Remote do
|
|
13
48
|
|
14
49
|
describe "Using a live server" do
|
15
50
|
before do
|
16
|
-
@
|
17
|
-
|
18
|
-
|
19
|
-
@pid_file = File.join( @tmp_dir , "rack.pid" )
|
20
|
-
@ru_file = File.expand_path( File.join( @spec_dir, "..", "examples", "gemcutter_repo.ru" ) )
|
21
|
-
cmd = "rackup --port 6789 --pid #{@pid_file} --daemonize #{@ru_file}"
|
22
|
-
#puts cmd
|
23
|
-
system cmd
|
24
|
-
|
25
|
-
tries = 0
|
26
|
-
loop do
|
27
|
-
begin
|
28
|
-
Excon.get( @repo_uri + "specs.#{Gem.marshal_version}.gz" )
|
29
|
-
#puts "rackup started with pid #{IO.read( @pid_file )}"
|
30
|
-
break
|
31
|
-
rescue => e
|
32
|
-
tries += 1
|
33
|
-
sleep tries * 0.1
|
34
|
-
end
|
35
|
-
end
|
51
|
+
@server = SticklerTestServer.new( @spec_dir, "gemcutter_repo.ru" )
|
52
|
+
@server.start
|
36
53
|
end
|
37
54
|
|
38
55
|
after do
|
39
|
-
|
40
|
-
Process.kill( 'KILL', pid )
|
41
|
-
#FileUtils.rm_rf( @tmp_dir, :verbose => true )
|
42
|
-
FileUtils.rm_rf( @tmp_dir )
|
56
|
+
@server.stop
|
43
57
|
end
|
44
58
|
|
45
59
|
it_should_behave_like 'implements Repository::Api'
|
46
60
|
end
|
61
|
+
|
62
|
+
describe "Using a live authenticated server" do
|
63
|
+
before do
|
64
|
+
@server = SticklerTestServer.new( @spec_dir, "auth_repo.ru" )
|
65
|
+
@server.start
|
66
|
+
@foo_gem_local_path = File.join( @gems_dir, "foo-1.0.0.gem" )
|
67
|
+
@foo_spec = Stickler::SpecLite.new( 'foo', '1.0.0' )
|
68
|
+
@foo_digest = Digest::SHA1.hexdigest( IO.read( @foo_gem_local_path ) )
|
69
|
+
end
|
70
|
+
|
71
|
+
after do
|
72
|
+
@server.stop
|
73
|
+
end
|
74
|
+
|
75
|
+
it "should raise an an authentication denied error" do
|
76
|
+
repo = ::Stickler::Repository::Remote.new( "http://localhost:6789/")
|
77
|
+
lambda { repo.get( @foo_spec ) }.should raise_error( ::Stickler::Repository::Error, /Not authorized/ )
|
78
|
+
end
|
79
|
+
|
80
|
+
it "should connect with proper authentication" do
|
81
|
+
repo = ::Stickler::Repository::Remote.new( "http://stickler:secret@localhost:6789/")
|
82
|
+
data = repo.get( @foo_spec )
|
83
|
+
sha1 = Digest::SHA1.hexdigest( data )
|
84
|
+
sha1.should == @foo_digest
|
85
|
+
end
|
86
|
+
end
|
47
87
|
end
|
48
88
|
|
metadata
CHANGED
@@ -5,9 +5,9 @@ version: !ruby/object:Gem::Version
|
|
5
5
|
prerelease:
|
6
6
|
segments:
|
7
7
|
- 2
|
8
|
-
-
|
9
|
-
-
|
10
|
-
version: 2.
|
8
|
+
- 2
|
9
|
+
- 2
|
10
|
+
version: 2.2.2
|
11
11
|
platform: ruby
|
12
12
|
authors:
|
13
13
|
- Jeremy Hinegardner
|
@@ -15,7 +15,7 @@ autorequire:
|
|
15
15
|
bindir: bin
|
16
16
|
cert_chain: []
|
17
17
|
|
18
|
-
date:
|
18
|
+
date: 2012-02-13 00:00:00 Z
|
19
19
|
dependencies:
|
20
20
|
- !ruby/object:Gem::Dependency
|
21
21
|
name: sinatra
|
@@ -25,12 +25,12 @@ dependencies:
|
|
25
25
|
requirements:
|
26
26
|
- - ~>
|
27
27
|
- !ruby/object:Gem::Version
|
28
|
-
hash:
|
28
|
+
hash: 31
|
29
29
|
segments:
|
30
30
|
- 1
|
31
|
+
- 3
|
31
32
|
- 2
|
32
|
-
|
33
|
-
version: 1.2.6
|
33
|
+
version: 1.3.2
|
34
34
|
type: :runtime
|
35
35
|
version_requirements: *id001
|
36
36
|
- !ruby/object:Gem::Dependency
|
@@ -41,12 +41,12 @@ dependencies:
|
|
41
41
|
requirements:
|
42
42
|
- - ~>
|
43
43
|
- !ruby/object:Gem::Version
|
44
|
-
hash:
|
44
|
+
hash: 11
|
45
45
|
segments:
|
46
46
|
- 2
|
47
47
|
- 2
|
48
|
-
-
|
49
|
-
version: 2.2.
|
48
|
+
- 6
|
49
|
+
version: 2.2.6
|
50
50
|
type: :runtime
|
51
51
|
version_requirements: *id002
|
52
52
|
- !ruby/object:Gem::Dependency
|
@@ -57,12 +57,12 @@ dependencies:
|
|
57
57
|
requirements:
|
58
58
|
- - ~>
|
59
59
|
- !ruby/object:Gem::Version
|
60
|
-
hash:
|
60
|
+
hash: 49
|
61
61
|
segments:
|
62
62
|
- 0
|
63
|
-
-
|
64
|
-
-
|
65
|
-
version: 0.
|
63
|
+
- 9
|
64
|
+
- 5
|
65
|
+
version: 0.9.5
|
66
66
|
type: :runtime
|
67
67
|
version_requirements: *id003
|
68
68
|
- !ruby/object:Gem::Dependency
|
@@ -89,12 +89,12 @@ dependencies:
|
|
89
89
|
requirements:
|
90
90
|
- - ~>
|
91
91
|
- !ruby/object:Gem::Version
|
92
|
-
hash:
|
92
|
+
hash: 11
|
93
93
|
segments:
|
94
94
|
- 1
|
95
95
|
- 6
|
96
|
-
-
|
97
|
-
version: 1.6.
|
96
|
+
- 2
|
97
|
+
version: 1.6.2
|
98
98
|
type: :runtime
|
99
99
|
version_requirements: *id005
|
100
100
|
- !ruby/object:Gem::Dependency
|
@@ -105,13 +105,14 @@ dependencies:
|
|
105
105
|
requirements:
|
106
106
|
- - ~>
|
107
107
|
- !ruby/object:Gem::Version
|
108
|
-
hash:
|
108
|
+
hash: 11
|
109
109
|
segments:
|
110
110
|
- 0
|
111
111
|
- 9
|
112
112
|
- 2
|
113
|
-
|
114
|
-
|
113
|
+
- 2
|
114
|
+
version: 0.9.2.2
|
115
|
+
type: :development
|
115
116
|
version_requirements: *id006
|
116
117
|
- !ruby/object:Gem::Dependency
|
117
118
|
name: bones
|
@@ -121,12 +122,12 @@ dependencies:
|
|
121
122
|
requirements:
|
122
123
|
- - ~>
|
123
124
|
- !ruby/object:Gem::Version
|
124
|
-
hash:
|
125
|
+
hash: 29
|
125
126
|
segments:
|
126
127
|
- 3
|
127
128
|
- 7
|
128
|
-
-
|
129
|
-
version: 3.7.
|
129
|
+
- 3
|
130
|
+
version: 3.7.3
|
130
131
|
type: :development
|
131
132
|
version_requirements: *id007
|
132
133
|
- !ruby/object:Gem::Dependency
|
@@ -185,12 +186,12 @@ dependencies:
|
|
185
186
|
requirements:
|
186
187
|
- - ~>
|
187
188
|
- !ruby/object:Gem::Version
|
188
|
-
hash:
|
189
|
+
hash: 47
|
189
190
|
segments:
|
190
191
|
- 2
|
191
|
-
-
|
192
|
+
- 8
|
192
193
|
- 0
|
193
|
-
version: 2.
|
194
|
+
version: 2.8.0
|
194
195
|
type: :development
|
195
196
|
version_requirements: *id011
|
196
197
|
description: |
|
@@ -225,16 +226,16 @@ extra_rdoc_files:
|
|
225
226
|
- lib/stickler/server/views/layout.erb
|
226
227
|
files:
|
227
228
|
- .gitignore
|
229
|
+
- .rvmrc
|
228
230
|
- HISTORY.asciidoc
|
229
231
|
- LICENSE
|
230
232
|
- README.asciidoc
|
231
233
|
- Rakefile
|
232
234
|
- TODO.asciidoc
|
233
|
-
- asciidoc-output/docbook-xsl.css
|
234
|
-
- asciidoc-output/man/docbook-xsl.css
|
235
235
|
- bin/stickler
|
236
236
|
- bin/stickler-passenger-config
|
237
237
|
- bin/stickler-server
|
238
|
+
- examples/auth_repo.ru
|
238
239
|
- examples/config.ru
|
239
240
|
- examples/fetch-a-gem
|
240
241
|
- examples/gemcutter_repo.ru
|
@@ -263,6 +264,7 @@ files:
|
|
263
264
|
- lib/stickler/paths.rb
|
264
265
|
- lib/stickler/repository.rb
|
265
266
|
- lib/stickler/repository/api.rb
|
267
|
+
- lib/stickler/repository/basic_authenticator.rb
|
266
268
|
- lib/stickler/repository/index.rb
|
267
269
|
- lib/stickler/repository/local.rb
|
268
270
|
- lib/stickler/repository/mirror.rb
|
@@ -282,12 +284,8 @@ files:
|
|
282
284
|
- lib/stickler/spec_lite.rb
|
283
285
|
- lib/stickler/version.rb
|
284
286
|
- man/asciidoc.conf
|
285
|
-
- man/docbook-xsl.css
|
286
|
-
- man/stickler-passenger-config.1
|
287
287
|
- man/stickler-passenger-config.asciidoc
|
288
|
-
- man/stickler-server.1
|
289
288
|
- man/stickler-server.asciidoc
|
290
|
-
- man/stickler.1
|
291
289
|
- man/stickler.asciidoc
|
292
290
|
- spec/data/gemcutter/gems/foo-1.0.0.gem
|
293
291
|
- spec/data/gemcutter/specifications/foo-1.0.0.gemspec
|
@@ -316,10 +314,6 @@ files:
|
|
316
314
|
- tasks/bundler.rake
|
317
315
|
- tasks/contribute.rake
|
318
316
|
- tasks/man.rake
|
319
|
-
- work/mirror/gems/hitimes-1.1.1.gem
|
320
|
-
- work/mirror/gems/rails-3.0.3.gem
|
321
|
-
- work/mirror/specifications/hitimes-1.1.1.gemspec
|
322
|
-
- work/mirror/specifications/rails-3.0.3.gemspec
|
323
317
|
homepage: http://www.copiousfreetime.org/projects/stickler
|
324
318
|
licenses: []
|
325
319
|
|
@@ -350,7 +344,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
350
344
|
requirements: []
|
351
345
|
|
352
346
|
rubyforge_project: stickler
|
353
|
-
rubygems_version: 1.8.
|
347
|
+
rubygems_version: 1.8.15
|
354
348
|
signing_key:
|
355
349
|
specification_version: 3
|
356
350
|
summary: Stickler is a tool to organize and maintain an internal gem repository.
|