geminabox 0.7.0 → 0.8.0
Sign up to get free protection for your applications and to get access to all the features.
Potentially problematic release.
This version of geminabox might be problematic. Click here for more details.
- data/README.markdown +8 -0
- data/lib/geminabox.rb +19 -12
- data/lib/geminabox/gem_version.rb +5 -0
- data/lib/geminabox/gem_version_collection.rb +33 -31
- data/lib/geminabox/version.rb +1 -1
- metadata +22 -22
data/README.markdown
CHANGED
@@ -41,6 +41,14 @@ RubyGems supports generating indexes for the so called legacy versions (< 1.2),
|
|
41
41
|
|
42
42
|
gem inabox pkg/my-awesome-gem-1.0.gem
|
43
43
|
|
44
|
+
Configure Gem in a box (interactive prompt to specify where to upload to):
|
45
|
+
|
46
|
+
geminabox -c
|
47
|
+
|
48
|
+
Change the host to upload to:
|
49
|
+
|
50
|
+
geminabox -g HOST
|
51
|
+
|
44
52
|
Simples!
|
45
53
|
|
46
54
|
## Licence
|
data/lib/geminabox.rb
CHANGED
@@ -18,6 +18,7 @@ class Geminabox < Sinatra::Base
|
|
18
18
|
set :incremental_updates, false
|
19
19
|
set :views, File.join(File.dirname(__FILE__), *%w[.. views])
|
20
20
|
set :allow_replace, false
|
21
|
+
set :gem_permissions, 0644
|
21
22
|
use Hostess
|
22
23
|
|
23
24
|
class << self
|
@@ -33,6 +34,7 @@ class Geminabox < Sinatra::Base
|
|
33
34
|
end
|
34
35
|
|
35
36
|
autoload :GemVersionCollection, "geminabox/gem_version_collection"
|
37
|
+
autoload :GemVersion, "geminabox/gem_version"
|
36
38
|
autoload :DiskCache, "geminabox/disk_cache"
|
37
39
|
|
38
40
|
before do
|
@@ -54,7 +56,7 @@ class Geminabox < Sinatra::Base
|
|
54
56
|
query_gems = params[:gems].split(',').sort
|
55
57
|
cache_key = query_gems.join(',')
|
56
58
|
disk_cache.cache(cache_key) do
|
57
|
-
deps = load_gems.
|
59
|
+
deps = load_gems.select {|gem| query_gems.include?(gem.name) }.map do |gem|
|
58
60
|
spec = spec_for(gem.name, gem.number)
|
59
61
|
{
|
60
62
|
:name => gem.name,
|
@@ -123,14 +125,14 @@ class Geminabox < Sinatra::Base
|
|
123
125
|
error_response(200, "Ignoring upload, you uploaded the same thing previously.")
|
124
126
|
end
|
125
127
|
end
|
126
|
-
|
128
|
+
|
127
129
|
atomic_write(dest_filename) do |f|
|
128
130
|
while blk = tmpfile.read(65536)
|
129
131
|
f << blk
|
130
132
|
end
|
131
133
|
end
|
132
134
|
reindex
|
133
|
-
|
135
|
+
|
134
136
|
if api_request?
|
135
137
|
"Gem #{gem_name} received and indexed."
|
136
138
|
else
|
@@ -187,15 +189,19 @@ HTML
|
|
187
189
|
@disk_cache = Geminabox::DiskCache.new(File.join(settings.data, "_cache"))
|
188
190
|
end
|
189
191
|
|
192
|
+
def all_gems
|
193
|
+
%w(specs prerelease_specs).map{ |specs_file_type|
|
194
|
+
specs_file_path = File.join(settings.data, "#{specs_file_type}.#{Gem.marshal_version}.gz")
|
195
|
+
if File.exists?(specs_file_path)
|
196
|
+
Marshal.load(Gem.gunzip(Gem.read_binary(specs_file_path)))
|
197
|
+
else
|
198
|
+
[]
|
199
|
+
end
|
200
|
+
}.inject(:|)
|
201
|
+
end
|
202
|
+
|
190
203
|
def load_gems
|
191
|
-
@loaded_gems ||=
|
192
|
-
%w(specs prerelease_specs).inject(GemVersionCollection.new){|gems, specs_file_type|
|
193
|
-
specs_file_path = File.join(settings.data, "#{specs_file_type}.#{Gem.marshal_version}.gz")
|
194
|
-
if File.exists?(specs_file_path)
|
195
|
-
gems |= Geminabox::GemVersionCollection.new(Marshal.load(Gem.gunzip(Gem.read_binary(specs_file_path))))
|
196
|
-
end
|
197
|
-
gems
|
198
|
-
}
|
204
|
+
@loaded_gems ||= Geminabox::GemVersionCollection.new(all_gems)
|
199
205
|
end
|
200
206
|
|
201
207
|
def index_gems(gems)
|
@@ -210,8 +216,9 @@ HTML
|
|
210
216
|
yield temp_file
|
211
217
|
temp_file.close
|
212
218
|
File.rename(temp_file.path, file_name)
|
219
|
+
File.chmod(settings.gem_permissions, file_name)
|
213
220
|
end
|
214
|
-
|
221
|
+
|
215
222
|
helpers do
|
216
223
|
def spec_for(gem_name, version)
|
217
224
|
spec_file = File.join(settings.data, "quick", "Marshal.#{Gem.marshal_version}", "#{gem_name}-#{version}.gemspec.rz")
|
@@ -24,6 +24,11 @@ class Geminabox::GemVersion
|
|
24
24
|
sort
|
25
25
|
end
|
26
26
|
|
27
|
+
def ==(other)
|
28
|
+
return false unless other.class == self.class
|
29
|
+
[name, number, platform] == [other.name, other.number, other.platform]
|
30
|
+
end
|
31
|
+
|
27
32
|
def gemfile_name
|
28
33
|
included_platform = ruby? ? nil : platform
|
29
34
|
[name, number, included_platform].compact.join('-')
|
@@ -1,61 +1,63 @@
|
|
1
1
|
require 'geminabox/gem_version'
|
2
2
|
|
3
|
+
# This class represents a sorted collection of Geminabox::GemVersion objects.
|
4
|
+
# It it used widely throughout the system for displaying and filtering gems.
|
3
5
|
class Geminabox::GemVersionCollection
|
4
6
|
include Enumerable
|
5
7
|
|
6
|
-
|
7
|
-
|
8
|
-
end
|
9
|
-
|
10
|
-
attr_reader :gems
|
11
|
-
|
8
|
+
# Array of Geminabox::GemVersion objects, or an array of [name, version,
|
9
|
+
# platform] triples.
|
12
10
|
def initialize(initial_gems=[])
|
13
|
-
@gems =
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
def <<(version_or_def)
|
18
|
-
version = if version_or_def.is_a?(Geminabox::GemVersion)
|
19
|
-
version_or_def
|
20
|
-
else
|
21
|
-
Geminabox::GemVersion.new(*version_or_def)
|
22
|
-
end
|
23
|
-
|
24
|
-
@gems << version
|
25
|
-
@gems.sort!
|
11
|
+
@gems = initial_gems.map{|object|
|
12
|
+
coerce_to_gem_version(object)
|
13
|
+
}.sort
|
26
14
|
end
|
27
15
|
|
16
|
+
# FIXME: Terminology makes no sense when the version are not all of the same
|
17
|
+
# name
|
28
18
|
def oldest
|
29
19
|
@gems.first
|
30
20
|
end
|
31
21
|
|
22
|
+
# FIXME: Terminology makes no sense when the version are not all of the same
|
23
|
+
# name
|
32
24
|
def newest
|
33
25
|
@gems.last
|
34
26
|
end
|
35
27
|
|
36
|
-
def
|
37
|
-
|
28
|
+
def size
|
29
|
+
@gems.size
|
38
30
|
end
|
39
31
|
|
40
32
|
def each(&block)
|
41
33
|
@gems.each(&block)
|
42
34
|
end
|
43
35
|
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
36
|
+
# The collection can contain gems of different names, this method groups them
|
37
|
+
# by name, and then sorts the different version of each name by version and
|
38
|
+
# platform.
|
39
|
+
#
|
40
|
+
# yields 'foo_gem', version_collection
|
41
|
+
def by_name(&block)
|
42
|
+
@grouped ||= @gems.group_by(&:name).map{|name, collection|
|
43
|
+
[name, Geminabox::GemVersionCollection.new(collection)]
|
44
|
+
}.sort_by{|name, collection|
|
45
|
+
name.downcase
|
46
|
+
}
|
49
47
|
|
50
48
|
if block_given?
|
51
|
-
grouped.each(&
|
49
|
+
@grouped.each(&block)
|
52
50
|
else
|
53
|
-
grouped
|
51
|
+
@grouped
|
54
52
|
end
|
55
53
|
end
|
56
54
|
|
57
|
-
|
58
|
-
def
|
59
|
-
|
55
|
+
private
|
56
|
+
def coerce_to_gem_version(object)
|
57
|
+
if object.is_a?(Geminabox::GemVersion)
|
58
|
+
object
|
59
|
+
else
|
60
|
+
Geminabox::GemVersion.new(*object)
|
61
|
+
end
|
60
62
|
end
|
61
63
|
end
|
data/lib/geminabox/version.rb
CHANGED
@@ -1 +1 @@
|
|
1
|
-
GeminaboxVersion = '0.
|
1
|
+
GeminaboxVersion = '0.8.0' unless defined? GeminaboxVersion
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: geminabox
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.8.0
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,11 +9,11 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2012-
|
12
|
+
date: 2012-10-26 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: sinatra
|
16
|
-
requirement: &
|
16
|
+
requirement: &70361993784940 !ruby/object:Gem::Requirement
|
17
17
|
none: false
|
18
18
|
requirements:
|
19
19
|
- - ! '>='
|
@@ -21,10 +21,10 @@ dependencies:
|
|
21
21
|
version: '0'
|
22
22
|
type: :runtime
|
23
23
|
prerelease: false
|
24
|
-
version_requirements: *
|
24
|
+
version_requirements: *70361993784940
|
25
25
|
- !ruby/object:Gem::Dependency
|
26
26
|
name: builder
|
27
|
-
requirement: &
|
27
|
+
requirement: &70361993784400 !ruby/object:Gem::Requirement
|
28
28
|
none: false
|
29
29
|
requirements:
|
30
30
|
- - ! '>='
|
@@ -32,10 +32,10 @@ dependencies:
|
|
32
32
|
version: '0'
|
33
33
|
type: :runtime
|
34
34
|
prerelease: false
|
35
|
-
version_requirements: *
|
35
|
+
version_requirements: *70361993784400
|
36
36
|
- !ruby/object:Gem::Dependency
|
37
37
|
name: httpclient
|
38
|
-
requirement: &
|
38
|
+
requirement: &70361993783860 !ruby/object:Gem::Requirement
|
39
39
|
none: false
|
40
40
|
requirements:
|
41
41
|
- - ! '>='
|
@@ -43,10 +43,10 @@ dependencies:
|
|
43
43
|
version: '0'
|
44
44
|
type: :runtime
|
45
45
|
prerelease: false
|
46
|
-
version_requirements: *
|
46
|
+
version_requirements: *70361993783860
|
47
47
|
- !ruby/object:Gem::Dependency
|
48
48
|
name: rake
|
49
|
-
requirement: &
|
49
|
+
requirement: &70361993783320 !ruby/object:Gem::Requirement
|
50
50
|
none: false
|
51
51
|
requirements:
|
52
52
|
- - ! '>='
|
@@ -54,10 +54,10 @@ dependencies:
|
|
54
54
|
version: '0'
|
55
55
|
type: :development
|
56
56
|
prerelease: false
|
57
|
-
version_requirements: *
|
57
|
+
version_requirements: *70361993783320
|
58
58
|
- !ruby/object:Gem::Dependency
|
59
59
|
name: rack-test
|
60
|
-
requirement: &
|
60
|
+
requirement: &70361993782680 !ruby/object:Gem::Requirement
|
61
61
|
none: false
|
62
62
|
requirements:
|
63
63
|
- - ! '>='
|
@@ -65,10 +65,10 @@ dependencies:
|
|
65
65
|
version: '0'
|
66
66
|
type: :development
|
67
67
|
prerelease: false
|
68
|
-
version_requirements: *
|
68
|
+
version_requirements: *70361993782680
|
69
69
|
- !ruby/object:Gem::Dependency
|
70
70
|
name: minitest
|
71
|
-
requirement: &
|
71
|
+
requirement: &70361993781820 !ruby/object:Gem::Requirement
|
72
72
|
none: false
|
73
73
|
requirements:
|
74
74
|
- - ! '>='
|
@@ -76,10 +76,10 @@ dependencies:
|
|
76
76
|
version: '0'
|
77
77
|
type: :development
|
78
78
|
prerelease: false
|
79
|
-
version_requirements: *
|
79
|
+
version_requirements: *70361993781820
|
80
80
|
- !ruby/object:Gem::Dependency
|
81
81
|
name: capybara
|
82
|
-
requirement: &
|
82
|
+
requirement: &70361993797280 !ruby/object:Gem::Requirement
|
83
83
|
none: false
|
84
84
|
requirements:
|
85
85
|
- - ! '>='
|
@@ -87,10 +87,10 @@ dependencies:
|
|
87
87
|
version: '0'
|
88
88
|
type: :development
|
89
89
|
prerelease: false
|
90
|
-
version_requirements: *
|
90
|
+
version_requirements: *70361993797280
|
91
91
|
- !ruby/object:Gem::Dependency
|
92
92
|
name: capybara-mechanize
|
93
|
-
requirement: &
|
93
|
+
requirement: &70361993796080 !ruby/object:Gem::Requirement
|
94
94
|
none: false
|
95
95
|
requirements:
|
96
96
|
- - ! '>='
|
@@ -98,10 +98,10 @@ dependencies:
|
|
98
98
|
version: '0'
|
99
99
|
type: :development
|
100
100
|
prerelease: false
|
101
|
-
version_requirements: *
|
101
|
+
version_requirements: *70361993796080
|
102
102
|
- !ruby/object:Gem::Dependency
|
103
103
|
name: pry
|
104
|
-
requirement: &
|
104
|
+
requirement: &70361993795380 !ruby/object:Gem::Requirement
|
105
105
|
none: false
|
106
106
|
requirements:
|
107
107
|
- - ! '>='
|
@@ -109,7 +109,7 @@ dependencies:
|
|
109
109
|
version: '0'
|
110
110
|
type: :development
|
111
111
|
prerelease: false
|
112
|
-
version_requirements: *
|
112
|
+
version_requirements: *70361993795380
|
113
113
|
description: A sinatra based gem hosting app, with client side gem push style functionality.
|
114
114
|
email: contrib@tomlea.co.uk
|
115
115
|
executables: []
|
@@ -152,7 +152,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
152
152
|
version: '0'
|
153
153
|
segments:
|
154
154
|
- 0
|
155
|
-
hash:
|
155
|
+
hash: -1477264842366552590
|
156
156
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
157
157
|
none: false
|
158
158
|
requirements:
|
@@ -161,7 +161,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
161
161
|
version: '0'
|
162
162
|
segments:
|
163
163
|
- 0
|
164
|
-
hash:
|
164
|
+
hash: -1477264842366552590
|
165
165
|
requirements: []
|
166
166
|
rubyforge_project:
|
167
167
|
rubygems_version: 1.8.15
|