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 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.gems.select {|gem| query_gems.include?(gem.name) }.map do |gem|
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
- def size
7
- @gems.size
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
- initial_gems.each { |gemdef| self << gemdef }
15
- end
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 |(other)
37
- self.class.new(self.gems | other.gems)
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
- def by_name
45
- grouped = @gems.inject(hash_of_collections) do |grouped, gem|
46
- grouped[gem.name] << gem
47
- grouped
48
- end.sort_by{|name, gems| name.downcase }
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(&Proc.new)
49
+ @grouped.each(&block)
52
50
  else
53
- grouped
51
+ @grouped
54
52
  end
55
53
  end
56
54
 
57
- private
58
- def hash_of_collections
59
- Hash.new { |h,k| h[k] = self.class.new }
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
@@ -1 +1 @@
1
- GeminaboxVersion = '0.7.0' unless defined? GeminaboxVersion
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.7.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-08-22 00:00:00.000000000 Z
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: &70182476864760 !ruby/object:Gem::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: *70182476864760
24
+ version_requirements: *70361993784940
25
25
  - !ruby/object:Gem::Dependency
26
26
  name: builder
27
- requirement: &70182476863120 !ruby/object:Gem::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: *70182476863120
35
+ version_requirements: *70361993784400
36
36
  - !ruby/object:Gem::Dependency
37
37
  name: httpclient
38
- requirement: &70182476861740 !ruby/object:Gem::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: *70182476861740
46
+ version_requirements: *70361993783860
47
47
  - !ruby/object:Gem::Dependency
48
48
  name: rake
49
- requirement: &70182476861160 !ruby/object:Gem::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: *70182476861160
57
+ version_requirements: *70361993783320
58
58
  - !ruby/object:Gem::Dependency
59
59
  name: rack-test
60
- requirement: &70182476859960 !ruby/object:Gem::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: *70182476859960
68
+ version_requirements: *70361993782680
69
69
  - !ruby/object:Gem::Dependency
70
70
  name: minitest
71
- requirement: &70182476858640 !ruby/object:Gem::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: *70182476858640
79
+ version_requirements: *70361993781820
80
80
  - !ruby/object:Gem::Dependency
81
81
  name: capybara
82
- requirement: &70182480431960 !ruby/object:Gem::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: *70182480431960
90
+ version_requirements: *70361993797280
91
91
  - !ruby/object:Gem::Dependency
92
92
  name: capybara-mechanize
93
- requirement: &70182480428020 !ruby/object:Gem::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: *70182480428020
101
+ version_requirements: *70361993796080
102
102
  - !ruby/object:Gem::Dependency
103
103
  name: pry
104
- requirement: &70182480424560 !ruby/object:Gem::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: *70182480424560
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: 4127424449105456213
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: 4127424449105456213
164
+ hash: -1477264842366552590
165
165
  requirements: []
166
166
  rubyforge_project:
167
167
  rubygems_version: 1.8.15