gemirro 0.3.0 → 0.4.0

Sign up to get free protection for your applications and to get access to all the features.

Potentially problematic release.


This version of gemirro might be problematic. Click here for more details.

checksums.yaml CHANGED
@@ -1,15 +1,7 @@
1
1
  ---
2
- !binary "U0hBMQ==":
3
- metadata.gz: !binary |-
4
- OTE2OTU0OTYxMmU0Y2JkZjBlZTQxMWRiZDQ4MWZkNzVlZDAyZWRlZQ==
5
- data.tar.gz: !binary |-
6
- NDk1ZDFlYWYxYmE1NjY1MmNiNzUxYzRjZjA0N2Q2MzI1YjNlZDEyZg==
2
+ SHA1:
3
+ metadata.gz: 9237dacb278367d0711772c1aa07972bdb0298a3
4
+ data.tar.gz: c707b4dd8ade6d496703e5901dc228e64248345f
7
5
  SHA512:
8
- metadata.gz: !binary |-
9
- MTQ0MWI1ODQ4NWVhODA0ZTlmMzMzZDU3N2ViNDM4MmY0ODViN2EyZmEzNjBl
10
- ZDNhNDQ4NjIwYTU5OWJlMTM4MzY4OWZmODg0MmY2NDUxOThmZTY4NGZhMzZm
11
- MmZiYzBlNzI5NzcxMzIxMTdkOGIwNzA2ZmJjYmFlZWM5NjAzMzU=
12
- data.tar.gz: !binary |-
13
- MDhkOTcyMTk5NDIyMzI5MzA0YTM1ODAxNmIzMDliZWMzMWY2ZWY4YjdmZTQw
14
- YjJhZWM4NjU2YmU3MGJhOWZlMTk4NDE2YzYwM2UyMTg1YWRmMDU5NjZjN2Iw
15
- ZTQ0MWEwNjA4OTI4NjEwN2YwNTY1ZDU3OTFkMjk0ODQ1ZmMyZjY=
6
+ metadata.gz: 25934f8f35928f90b98a48a9ef650243694e48db0a59a6fcb8f64d3d1a5dcdec902d04bea6d658d825ff2e2bd8a61e2733fddbcc45da1f2d1cbb76dcf7219070
7
+ data.tar.gz: d00781c9a26a8e564368b5a80f88b7d1e8ccbc0407a0cd95831d08e3dffe8d9bf739d95861b921d6f6951a5193f36b93dac0427c544e9c4666aaf63514fa751a
data/README.md CHANGED
@@ -1,8 +1,8 @@
1
1
  # Gemirro | [![Build Status](https://travis-ci.org/PierreRambaud/gemirro.svg)](https://travis-ci.org/PierreRambaud/gemirro)
2
2
 
3
3
  Gemirro is a Ruby application that makes it easy way to create your own RubyGems mirror without having to push or write all gem you wanted in a configuration file.
4
- It does mirroring only, it has no authentication and you can't upload Gems to it.
5
- More you only need to launch the server and gems will automaticly be downloaded when requests come.
4
+ It does mirroring without any authentication and you can add your private gems in the `gems` directory.
5
+ More, to mirroring a source, you only need to start the server, and gems will automaticly be downloaded when needed.
6
6
 
7
7
  ## Requirements
8
8
 
@@ -5,7 +5,12 @@ module Gemirro
5
5
  # @return [Gemirro::Configuration]
6
6
  #
7
7
  def self.configuration
8
- @configuration ||= Configuration.new
8
+ @configuration ||= Configuration.new do
9
+ server do
10
+ access_log '/tmp/gemirro.access.log'
11
+ error_log '/tmp/gemirro.error.log'
12
+ end
13
+ end
9
14
  end
10
15
 
11
16
  ##
@@ -13,8 +18,8 @@ module Gemirro
13
18
  # destination directory, source, ignored Gems, etc.
14
19
  #
15
20
  class Configuration < Confstruct::Configuration
16
- attr_reader :logger, :mirror_directory
17
- attr_accessor :source, :ignored_gems
21
+ attr_reader :mirror_directory
22
+ attr_accessor :source, :ignored_gems, :logger
18
23
 
19
24
  ##
20
25
  # Returns the logger
@@ -38,18 +38,60 @@ module Gemirro
38
38
  verbose: verbose, force: true)
39
39
  end
40
40
 
41
- files = files.map do |path|
42
- path.sub(/^#{Regexp.escape @directory}\/?/, '')
43
- end
44
-
45
- files.each do |file|
41
+ files.each do |path|
42
+ file = path.sub(/^#{Regexp.escape @directory}\/?/, '')
46
43
  dst_name = File.join @dest_directory, file
47
- next if File.exist?(dst_name) &&
48
- (File.mtime(dst_name) >= Time.now - 360)
44
+ # next if File.exist?(dst_name) &&
45
+ # (File.mtime(dst_name) >= Time.now - 360)
49
46
 
50
47
  resp = Http.get("#{Gemirro.configuration.source.host}/#{file}")
51
48
  next unless resp.code == 200
52
- MirrorFile.new(dst_name).write(resp.body)
49
+ source_content = resp.body
50
+
51
+ if ["#{@specs_index}.gz",
52
+ "#{@latest_specs_index}.gz",
53
+ "#{@prerelease_specs_index}.gz"].include?(path)
54
+ source_content = Marshal.load(
55
+ Zlib::GzipReader.new(StringIO.new(source_content)).read)
56
+ content = Marshal.load(Zlib::GzipReader.open(path).read)
57
+ new_content = source_content.concat(content).uniq
58
+
59
+ Zlib::GzipWriter.open(dst_name) do |io|
60
+ io.write(Marshal.dump(new_content))
61
+ end
62
+ else
63
+ MirrorFile.new(dst_name).write(source_content)
64
+ end
65
+
66
+ FileUtils.rm_rf(path)
67
+ end
68
+ end
69
+
70
+ def update_gemspecs
71
+ make_temp_directories
72
+
73
+ specs_mtime = File.stat(@dest_specs_index).mtime
74
+ newest_mtime = Time.at 0
75
+
76
+ updated_gems = gem_file_list.select do |gem|
77
+ gem_mtime = File.stat(gem).mtime
78
+ newest_mtime = gem_mtime if gem_mtime > newest_mtime
79
+ gem_mtime >= specs_mtime
80
+ end
81
+
82
+ terminate_interaction(0) if updated_gems.empty?
83
+
84
+ specs = map_gems_to_specs updated_gems
85
+ ::Gem::Specification.dirs = []
86
+ ::Gem::Specification.add_specs(*specs)
87
+ files = build_marshal_gemspecs
88
+
89
+ files.each do |path|
90
+ file = path.sub(/^#{Regexp.escape @directory}\/?/, '')
91
+ src_name = File.join @directory, file
92
+ dst_name = File.join @dest_directory, file
93
+ FileUtils.mv(src_name, dst_name)
94
+ File.utime newest_mtime, newest_mtime, dst_name
53
95
  end
54
96
  end
55
97
  end
@@ -14,16 +14,34 @@ module Gemirro
14
14
  class Server < Sinatra::Base
15
15
  attr_accessor :versions_fetcher, :gems_fetcher
16
16
 
17
+ access_logger = Logger.new(Gemirro.configuration.server.access_log)
18
+ .tap do |logger|
19
+ ::Logger.class_eval { alias_method :write, :'<<' }
20
+ logger.level = ::Logger::INFO
21
+ end
22
+
23
+ error_logger = ::File.new(Gemirro.configuration.server.error_log, 'a+')
24
+ error_logger.sync = true
25
+
26
+ before do
27
+ Gemirro.configuration.logger = access_logger
28
+ env['rack.errors'] = error_logger
29
+ end
30
+
17
31
  ##
18
32
  # Configure server
19
33
  #
20
34
  configure do
21
35
  config = Gemirro.configuration
22
- config.server_host = 'localhost' if config.server_host.nil?
23
- config.server_port = '2000' if config.server_port.nil?
24
- set :port, config.server_port
25
- set :bind, config.server_host
36
+ config.server.host = 'localhost' if config.server.host.nil?
37
+ config.server.port = '2000' if config.server.port.nil?
38
+ set :port, config.server.port
39
+ set :bind, config.server.host
26
40
  set :destination, config.destination.gsub(/\/$/, '')
41
+ set :environment, config.environment
42
+
43
+ enable :logging
44
+ use Rack::CommonLogger, access_logger
27
45
  end
28
46
 
29
47
  ##
@@ -73,20 +91,21 @@ module Gemirro
73
91
  logger.error(e.message)
74
92
  end
75
93
 
76
- generate_index
94
+ update_gemspecs
77
95
  end
78
96
 
79
97
  ##
80
- # Generate index and install indicies.
98
+ # Update gemspecs files
81
99
  #
82
100
  # @return [Indexer]
83
101
  #
84
- def generate_index
102
+ def update_gemspecs
85
103
  indexer = Indexer.new(settings.destination)
86
104
  indexer.ui = ::Gem::SilentUI.new
87
105
 
88
- logger.info('Generating indexes')
89
- indexer.generate_index
106
+ logger.info('Updating gemspecs files...')
107
+ indexer.update_gemspecs
108
+ logger.info('Done')
90
109
  end
91
110
 
92
111
  ##
@@ -108,14 +127,6 @@ module Gemirro
108
127
  end.compact
109
128
  end
110
129
 
111
- ##
112
- # @see Gemirro::Configuration#logger
113
- # @return [Logger]
114
- #
115
- def logger
116
- configuration.logger
117
- end
118
-
119
130
  ##
120
131
  # @see Gemirro.configuration
121
132
  #
@@ -127,7 +138,8 @@ module Gemirro
127
138
  # @see Gemirro::VersionsFetcher.fetch
128
139
  #
129
140
  def versions_fetcher
130
- @versions_fetcher ||= Gemirro::VersionsFetcher.new(configuration.source).fetch
141
+ @versions_fetcher ||= Gemirro::VersionsFetcher
142
+ .new(configuration.source).fetch
131
143
  end
132
144
 
133
145
  ##
@@ -1,5 +1,5 @@
1
1
  # -*- coding: utf-8 -*-
2
2
  # Gemirro Version
3
3
  module Gemirro
4
- VERSION = '0.3.0'
4
+ VERSION = '0.4.0'
5
5
  end
@@ -20,18 +20,20 @@ module Gemirro
20
20
  dir.add_directory('gem_generate_index/quick/Marshal.4.8')
21
21
  ::Gem.configuration.should_receive(:really_verbose).once.and_return(true)
22
22
 
23
- @indexer = Indexer.new('./')
24
- @indexer.should_receive(:say)
23
+ indexer = Indexer.new('./')
24
+ indexer.should_receive(:say)
25
25
  .once.with('Downloading index into production dir ./')
26
- @indexer.quick_marshal_dir = 'gem_generate_index/quick/Marshal.4.8'
27
- @indexer.dest_directory = './'
28
- @indexer.directory = 'gem_generate_index'
29
- @indexer.files = [
26
+ indexer.quick_marshal_dir = 'gem_generate_index/quick/Marshal.4.8'
27
+ indexer.dest_directory = './'
28
+ indexer.directory = 'gem_generate_index'
29
+ indexer.files = [
30
30
  'gem_generate_index/quick/Marshal.4.8',
31
31
  'gem_generate_index/specs.4.8.gz'
32
32
  ]
33
33
 
34
34
  FileUtils.should_receive(:mkdir_p).once.with('./quick', verbose: true)
35
+ FileUtils.should_receive(:rm_rf)
36
+ .once.with('gem_generate_index/specs.4.8.gz')
35
37
  FileUtils.should_receive(:rm_rf)
36
38
  .once.with('./quick/Marshal.4.8', verbose: true)
37
39
  FileUtils.should_receive(:mv)
@@ -45,11 +47,47 @@ module Gemirro
45
47
  Http.should_receive(:get)
46
48
  .with('https://rubygems.org/specs.4.8.gz').and_return(http_get)
47
49
 
48
- files = @indexer.install_indicies
49
- expect(files).to eq(['specs.4.8.gz'])
50
- files.each do |f|
51
- expect(MirrorFile.new(f).read).to eq('content')
52
- end
50
+ files = indexer.install_indicies
51
+ expect(files).to eq(['gem_generate_index/specs.4.8.gz'])
52
+ expect(MirrorFile.new('specs.4.8.gz').read).to eq('content')
53
+ end
54
+
55
+ it 'should exit if there is no new gems' do
56
+ dir = MirrorDirectory.new('./')
57
+ dir.add_directory('gem_generate_index/gems')
58
+ MirrorFile.new('./specs.4.8').write('')
59
+
60
+ indexer = Indexer.new('./')
61
+ indexer.should_receive(:make_temp_directories).and_return(true)
62
+
63
+ expect { indexer.update_gemspecs }.to raise_error SystemExit
64
+ end
65
+
66
+ it 'should generate gemspecs files' do
67
+ dir = MirrorDirectory.new('/')
68
+ dir.add_directory('gems')
69
+ dir.add_directory('quick')
70
+ dir.add_directory('tmp')
71
+
72
+ indexer = Indexer.new('/')
73
+
74
+ dir.add_directory("#{indexer.directory.gsub(/^\//, '')}/gems")
75
+ dir.add_directory("#{indexer.directory.gsub(/^\//, '')}/quick")
76
+ MirrorFile.new('/specs.4.8').write('')
77
+ MirrorFile.new("#{indexer.directory}/gems/gemirro-0.1.0.gem").write('')
78
+ MirrorFile.new('gems/gemirro-0.1.0.gem').write('')
79
+ MirrorFile.new("#{indexer.directory}/quick/gemirro-0.1.0.gemspec.rz")
80
+ .write('test')
81
+
82
+ indexer.should_receive(:gem_file_list)
83
+ .and_return(['gems/gemirro-0.1.0.gem'])
84
+ indexer.should_receive(:make_temp_directories).once.and_return(true)
85
+ indexer.should_receive(:build_marshal_gemspecs).once.and_return([
86
+ "#{indexer.directory}/quick/gemirro-0.1.0.gemspec.rz"])
87
+
88
+ indexer.update_gemspecs
89
+ expect(File.read('/quick/gemirro-0.1.0.gemspec.rz'))
90
+ .to eq('test')
53
91
  end
54
92
  end
55
93
  end
data/template/config.rb CHANGED
@@ -3,6 +3,9 @@
3
3
  # change settings such as the location to store Gem files in and what source
4
4
  # and Gems you'd like to mirror at start.
5
5
  Gemirro.configuration.configure do
6
+ # Define sinatra environment
7
+ environment :production
8
+
6
9
  # The directory to store indexing information as well as the Gem files in.
7
10
  destination File.expand_path('../public', __FILE__)
8
11
 
@@ -11,10 +14,12 @@ Gemirro.configuration.configure do
11
14
  logger.level = Logger::INFO
12
15
 
13
16
  # If you want to run your server on a specific host and port, you must
14
- # change the following parameter (server_host and server_port).
17
+ # change the following parameters (server_host and server_port).
15
18
  #
16
- # server_host = 'localhost'
17
- # server_port = '2000'
19
+ # server.host 'localhost'
20
+ # server.port '2000'
21
+ server.access_log File.expand_path('../logs/access.log', __FILE__)
22
+ server.error_log File.expand_path('../logs/error.log', __FILE__)
18
23
 
19
24
  # You must define a source wich where gems will be downloaded.
20
25
  # All gem in the block will be downloaded with the update command.
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: gemirro
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.0
4
+ version: 0.4.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Pierre Rambaud
@@ -14,168 +14,168 @@ dependencies:
14
14
  name: slop
15
15
  requirement: !ruby/object:Gem::Requirement
16
16
  requirements:
17
- - - ~>
17
+ - - "~>"
18
18
  - !ruby/object:Gem::Version
19
19
  version: '3.6'
20
20
  type: :runtime
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
- - - ~>
24
+ - - "~>"
25
25
  - !ruby/object:Gem::Version
26
26
  version: '3.6'
27
27
  - !ruby/object:Gem::Dependency
28
28
  name: httpclient
29
29
  requirement: !ruby/object:Gem::Requirement
30
30
  requirements:
31
- - - ~>
31
+ - - "~>"
32
32
  - !ruby/object:Gem::Version
33
33
  version: '2.4'
34
34
  type: :runtime
35
35
  prerelease: false
36
36
  version_requirements: !ruby/object:Gem::Requirement
37
37
  requirements:
38
- - - ~>
38
+ - - "~>"
39
39
  - !ruby/object:Gem::Version
40
40
  version: '2.4'
41
41
  - !ruby/object:Gem::Dependency
42
42
  name: confstruct
43
43
  requirement: !ruby/object:Gem::Requirement
44
44
  requirements:
45
- - - ~>
45
+ - - "~>"
46
46
  - !ruby/object:Gem::Version
47
47
  version: '0.2'
48
48
  type: :runtime
49
49
  prerelease: false
50
50
  version_requirements: !ruby/object:Gem::Requirement
51
51
  requirements:
52
- - - ~>
52
+ - - "~>"
53
53
  - !ruby/object:Gem::Version
54
54
  version: '0.2'
55
55
  - !ruby/object:Gem::Dependency
56
56
  name: builder
57
57
  requirement: !ruby/object:Gem::Requirement
58
58
  requirements:
59
- - - ~>
59
+ - - "~>"
60
60
  - !ruby/object:Gem::Version
61
61
  version: '3.2'
62
62
  type: :runtime
63
63
  prerelease: false
64
64
  version_requirements: !ruby/object:Gem::Requirement
65
65
  requirements:
66
- - - ~>
66
+ - - "~>"
67
67
  - !ruby/object:Gem::Version
68
68
  version: '3.2'
69
69
  - !ruby/object:Gem::Dependency
70
70
  name: sinatra
71
71
  requirement: !ruby/object:Gem::Requirement
72
72
  requirements:
73
- - - ~>
73
+ - - "~>"
74
74
  - !ruby/object:Gem::Version
75
75
  version: '1.4'
76
76
  type: :runtime
77
77
  prerelease: false
78
78
  version_requirements: !ruby/object:Gem::Requirement
79
79
  requirements:
80
- - - ~>
80
+ - - "~>"
81
81
  - !ruby/object:Gem::Version
82
82
  version: '1.4'
83
83
  - !ruby/object:Gem::Dependency
84
84
  name: thin
85
85
  requirement: !ruby/object:Gem::Requirement
86
86
  requirements:
87
- - - ~>
87
+ - - "~>"
88
88
  - !ruby/object:Gem::Version
89
89
  version: '1.6'
90
90
  type: :runtime
91
91
  prerelease: false
92
92
  version_requirements: !ruby/object:Gem::Requirement
93
93
  requirements:
94
- - - ~>
94
+ - - "~>"
95
95
  - !ruby/object:Gem::Version
96
96
  version: '1.6'
97
97
  - !ruby/object:Gem::Dependency
98
98
  name: rake
99
99
  requirement: !ruby/object:Gem::Requirement
100
100
  requirements:
101
- - - ~>
101
+ - - "~>"
102
102
  - !ruby/object:Gem::Version
103
103
  version: '10.0'
104
104
  type: :development
105
105
  prerelease: false
106
106
  version_requirements: !ruby/object:Gem::Requirement
107
107
  requirements:
108
- - - ~>
108
+ - - "~>"
109
109
  - !ruby/object:Gem::Version
110
110
  version: '10.0'
111
111
  - !ruby/object:Gem::Dependency
112
112
  name: rack-test
113
113
  requirement: !ruby/object:Gem::Requirement
114
114
  requirements:
115
- - - ~>
115
+ - - "~>"
116
116
  - !ruby/object:Gem::Version
117
117
  version: '0.6'
118
118
  type: :development
119
119
  prerelease: false
120
120
  version_requirements: !ruby/object:Gem::Requirement
121
121
  requirements:
122
- - - ~>
122
+ - - "~>"
123
123
  - !ruby/object:Gem::Version
124
124
  version: '0.6'
125
125
  - !ruby/object:Gem::Dependency
126
126
  name: rspec
127
127
  requirement: !ruby/object:Gem::Requirement
128
128
  requirements:
129
- - - ~>
129
+ - - "~>"
130
130
  - !ruby/object:Gem::Version
131
131
  version: '3.0'
132
132
  type: :development
133
133
  prerelease: false
134
134
  version_requirements: !ruby/object:Gem::Requirement
135
135
  requirements:
136
- - - ~>
136
+ - - "~>"
137
137
  - !ruby/object:Gem::Version
138
138
  version: '3.0'
139
139
  - !ruby/object:Gem::Dependency
140
140
  name: simplecov
141
141
  requirement: !ruby/object:Gem::Requirement
142
142
  requirements:
143
- - - ~>
143
+ - - "~>"
144
144
  - !ruby/object:Gem::Version
145
145
  version: '0.9'
146
146
  type: :development
147
147
  prerelease: false
148
148
  version_requirements: !ruby/object:Gem::Requirement
149
149
  requirements:
150
- - - ~>
150
+ - - "~>"
151
151
  - !ruby/object:Gem::Version
152
152
  version: '0.9'
153
153
  - !ruby/object:Gem::Dependency
154
154
  name: rubocop
155
155
  requirement: !ruby/object:Gem::Requirement
156
156
  requirements:
157
- - - ~>
157
+ - - "~>"
158
158
  - !ruby/object:Gem::Version
159
159
  version: '0.25'
160
160
  type: :development
161
161
  prerelease: false
162
162
  version_requirements: !ruby/object:Gem::Requirement
163
163
  requirements:
164
- - - ~>
164
+ - - "~>"
165
165
  - !ruby/object:Gem::Version
166
166
  version: '0.25'
167
167
  - !ruby/object:Gem::Dependency
168
168
  name: fakefs
169
169
  requirement: !ruby/object:Gem::Requirement
170
170
  requirements:
171
- - - ~>
171
+ - - "~>"
172
172
  - !ruby/object:Gem::Version
173
173
  version: '0.5'
174
174
  type: :development
175
175
  prerelease: false
176
176
  version_requirements: !ruby/object:Gem::Requirement
177
177
  requirements:
178
- - - ~>
178
+ - - "~>"
179
179
  - !ruby/object:Gem::Version
180
180
  version: '0.5'
181
181
  description: Create your own gem mirror with a simple TCPServer.
@@ -185,9 +185,9 @@ executables:
185
185
  extensions: []
186
186
  extra_rdoc_files: []
187
187
  files:
188
- - .gitignore
189
- - .rubocop.yml
190
- - .travis.yml
188
+ - ".gitignore"
189
+ - ".rubocop.yml"
190
+ - ".travis.yml"
191
191
  - Gemfile
192
192
  - LICENSE
193
193
  - MANIFEST
@@ -240,17 +240,17 @@ require_paths:
240
240
  - lib
241
241
  required_ruby_version: !ruby/object:Gem::Requirement
242
242
  requirements:
243
- - - ~>
243
+ - - "~>"
244
244
  - !ruby/object:Gem::Version
245
245
  version: 1.9.2
246
246
  required_rubygems_version: !ruby/object:Gem::Requirement
247
247
  requirements:
248
- - - ! '>='
248
+ - - ">="
249
249
  - !ruby/object:Gem::Version
250
250
  version: '0'
251
251
  requirements: []
252
252
  rubyforge_project:
253
- rubygems_version: 2.4.1
253
+ rubygems_version: 2.2.0.rc.1
254
254
  signing_key:
255
255
  specification_version: 4
256
256
  summary: Gem for easily creating your own RubyGems mirror.