gemirro 0.16.0 → 1.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
- SHA1:
3
- metadata.gz: 53a589bb6c9b40c33e0a84892f1234ac29325925
4
- data.tar.gz: d5e693ae10f39df546d7775a3b75165f62f9717f
2
+ SHA256:
3
+ metadata.gz: f5ce407f251612fd3198509818414c754d97508355e1fc1a723a08448bfb369f
4
+ data.tar.gz: 669d4d88aa1db6241b7e8861934d12893accde19fad6454d829a9e143569622b
5
5
  SHA512:
6
- metadata.gz: aba9f0f69f137771f76210819f3116da4911c8012b8f1415c21f9598a59b3586e122d00b5e7b5337bc35940a13055db0a5596c09170f7f7d71a226f15e4d391c
7
- data.tar.gz: d3606123b938190a0dcdbd094ebb39c76f65921c20f522ea53db3409117b32698ba4225cd7f7d568736a6ca6638138715a0a8cfb3c01b2306480cbfd6e3653b0
6
+ metadata.gz: 3c49aa30264c21ca2fb840f5c4b2b6dd6058c5b587e94ff5ae4e94488a00d86f25e0a56de742c9ab8078a6350bb5f15d38119b69decfdd5088e0c8b0ff4dafa6
7
+ data.tar.gz: 96e25a3b96ca072f6823b8583626b9dd502048e444423af8d50ffcc9040a139daa5aa36314ce914edef2123c335015a6f8f1f758b18a62339fcfe60d3c006afa
data/.rubocop.yml CHANGED
@@ -1,4 +1,6 @@
1
1
  AllCops:
2
+ NewCops: enable
3
+ TargetRubyVersion: 2.5
2
4
  Include:
3
5
  - '**/Gemfile'
4
6
  - lib/**/*.rb
@@ -7,16 +9,15 @@ AllCops:
7
9
  Exclude:
8
10
  - files/**/*
9
11
  - templates/**/*
12
+ - spec/**/*
13
+ - vendor/**/*
14
+
10
15
  Naming/FileName:
11
16
  Exclude:
12
17
  - Rakefile
13
- ModuleLength:
18
+ Layout/MethodLength:
14
19
  Enabled: false
15
- MethodLength:
16
- Enabled: false
17
- ClassLength:
18
- Enabled: false
19
- ParameterLists:
20
+ Layout/ClassLength:
20
21
  Enabled: false
21
22
  Metrics/CyclomaticComplexity:
22
23
  Enabled: false
@@ -28,3 +29,9 @@ Metrics/BlockLength:
28
29
  Enabled: false
29
30
  Security/MarshalLoad:
30
31
  Enabled: false
32
+ Style/ExpandPathArguments:
33
+ Enabled: false
34
+ Style/OptionalBooleanParameter:
35
+ Enabled: false
36
+ Lint/MissingSuper:
37
+ Enabled: false
data/.travis.yml CHANGED
@@ -1,8 +1,6 @@
1
1
  language: ruby
2
2
  rvm:
3
- - 2.2
4
- - 2.3
5
- - 2.4
3
+ - 2.6
6
4
 
7
5
  install: bundle install --jobs=3 --retry=3
8
6
  script: bundle exec rake
data/Gemfile CHANGED
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  source 'https://rubygems.org/'
2
4
 
3
5
  gemspec
data/README.md CHANGED
@@ -6,7 +6,7 @@ More, to mirroring a source, you only need to start the server, and gems will au
6
6
 
7
7
  ## Requirements
8
8
 
9
- * Ruby 2.0.0 or newer
9
+ * Ruby 2.2 or newer
10
10
  * Enough space to store Gems
11
11
  * A recent version of Rubygems (`gem update --system`)
12
12
 
data/bin/gemirro CHANGED
@@ -1,4 +1,5 @@
1
1
  #!/usr/bin/env ruby
2
+ # frozen_string_literal: true
2
3
 
3
4
  require File.expand_path('../../lib/gemirro', __FILE__)
4
5
 
data/gemirro.gemspec CHANGED
@@ -1,10 +1,11 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'date'
2
4
  require File.expand_path('../lib/gemirro/version', __FILE__)
3
5
 
4
6
  Gem::Specification.new do |s|
5
7
  s.name = 'gemirro'
6
8
  s.version = Gemirro::VERSION
7
- s.date = Date.today.to_s
8
9
  s.authors = ['Pierre Rambaud']
9
10
  s.email = 'pierre.rambaud86@gmail.com'
10
11
  s.license = 'GPL-3.0'
@@ -15,21 +16,22 @@ Gem::Specification.new do |s|
15
16
 
16
17
  s.files = File.read(File.expand_path('../MANIFEST', __FILE__)).split("\n")
17
18
 
18
- s.required_ruby_version = '>= 1.9.2'
19
+ s.required_ruby_version = '>= 2.5'
19
20
 
21
+ s.add_dependency 'addressable', '~>2.5'
20
22
  s.add_dependency 'builder', '~>3.2'
21
23
  s.add_dependency 'confstruct', '~>1.0'
22
24
  s.add_dependency 'erubis', '~>2.7'
23
25
  s.add_dependency 'httpclient', '~>2.8'
24
- s.add_dependency 'parallel', '~>1.12'
25
- s.add_dependency 'sinatra', '~>2.0'
26
+ s.add_dependency 'parallel', '~>1.20'
27
+ s.add_dependency 'sinatra', '~>2.0.1'
26
28
  s.add_dependency 'slop', '~>3.6'
27
29
  s.add_dependency 'thin', '~>1.7'
28
30
 
29
- s.add_development_dependency 'fakefs', '~>0.11'
30
- s.add_development_dependency 'rack-test', '~>0.7'
31
- s.add_development_dependency 'rake', '~>12.1'
32
- s.add_development_dependency 'rspec', '~>3.7'
33
- s.add_development_dependency 'rubocop', '~>0.51'
34
- s.add_development_dependency 'simplecov', '~>0.15'
31
+ s.add_development_dependency 'fakefs', '~>1'
32
+ s.add_development_dependency 'rack-test', '~>1.1'
33
+ s.add_development_dependency 'rake', '~>13'
34
+ s.add_development_dependency 'rspec', '~>3.10'
35
+ s.add_development_dependency 'rubocop', '~>1'
36
+ s.add_development_dependency 'simplecov', '~>0.21'
35
37
  end
data/lib/gemirro.rb CHANGED
@@ -1,21 +1,21 @@
1
- require 'rubygems'
2
- require 'rubygems/user_interaction'
3
- require 'rubygems/indexer'
4
- require 'slop'
5
- require 'fileutils'
6
- require 'digest/sha2'
1
+ # frozen_string_literal: true
2
+
7
3
  require 'confstruct'
8
- require 'zlib'
4
+ require 'digest/sha2'
5
+ require 'fileutils'
9
6
  require 'httpclient'
10
- require 'logger'
11
- require 'stringio'
12
7
  require 'json'
8
+ require 'logger'
13
9
  require 'parallel'
10
+ require 'rubygems'
11
+ require 'rubygems/indexer'
12
+ require 'rubygems/user_interaction'
13
+ require 'slop'
14
+ require 'stringio'
14
15
  require 'tempfile'
16
+ require 'zlib'
15
17
 
16
- unless $LOAD_PATH.include?(File.expand_path('../', __FILE__))
17
- $LOAD_PATH.unshift(File.expand_path('../', __FILE__))
18
- end
18
+ $LOAD_PATH.unshift(File.expand_path('../', __FILE__)) unless $LOAD_PATH.include?(File.expand_path('../', __FILE__))
19
19
 
20
20
  require 'gemirro/version'
21
21
  require 'gemirro/configuration'
data/lib/gemirro/cache.rb CHANGED
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Gemirro
2
4
  ##
3
5
  # The Cache class contains all method to store marshal informations
@@ -102,6 +104,7 @@ module Gemirro
102
104
  #
103
105
  def write(key_hash, value)
104
106
  return value if value.nil? || value.empty?
107
+
105
108
  File.open(key_path(key_hash), 'wb') do |f|
106
109
  Marshal.dump(value, f)
107
110
  end
data/lib/gemirro/cli.rb CHANGED
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Gemirro
2
4
  # CLI mode
3
5
  module CLI
@@ -32,9 +34,7 @@ module Gemirro
32
34
  config_file += '/config.rb' unless config_file.end_with?('.rb') ||
33
35
  !File.directory?(config_file)
34
36
 
35
- unless File.file?(config_file)
36
- abort "The configuration file #{config_file} does not exist"
37
- end
37
+ abort "The configuration file #{config_file} does not exist" unless File.file?(config_file)
38
38
 
39
39
  require(config_file)
40
40
  end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  Gemirro::CLI.options.command 'index' do
2
4
  banner 'Usage: gemirro index [OPTIONS]'
3
5
  description 'Retrieve specs list from source.'
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  Gemirro::CLI.options.command 'init' do
2
4
  banner 'Usage: gemirro init [DIRECTORY] [OPTIONS]'
3
5
  description 'Sets up a new mirror'
@@ -16,8 +18,10 @@ Gemirro::CLI.options.command 'init' do
16
18
  else
17
19
  Dir.glob("#{template}/**/*", File::FNM_DOTMATCH).each do |file|
18
20
  next if ['.', '..'].include?(File.basename(file))
21
+
19
22
  dest = File.join(directory, file.gsub(/^#{template}/, ''))
20
23
  next if File.exist?(dest)
24
+
21
25
  FileUtils.cp_r(file, dest)
22
26
  end
23
27
  end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  Gemirro::CLI.options.command 'list' do
2
4
  banner 'Usage: gemirro list [OPTIONS]'
3
5
  description 'List available gems.'
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  Gemirro::CLI.options.command 'server' do
2
4
  banner 'Usage: gemirro server [OPTIONS]'
3
5
  description 'Manage web server'
@@ -36,7 +38,7 @@ Gemirro::CLI.options.command 'server' do
36
38
  end
37
39
 
38
40
  # Copy stdout because we'll need to reopen it later on
39
- @orig_stdout = STDOUT.clone
41
+ @orig_stdout = $stdout.clone
40
42
  $PROGRAM_NAME = 'gemirro'
41
43
 
42
44
  def create_pid
@@ -44,7 +46,7 @@ Gemirro::CLI.options.command 'server' do
44
46
  f.write(Process.pid.to_s)
45
47
  end
46
48
  rescue Errno::EACCES
47
- STDOUT.reopen @orig_stdout
49
+ $stdout.reopen @orig_stdout
48
50
  puts "Error: Can't write to #{@pid_file} - Permission denied"
49
51
  exit!
50
52
  end
@@ -63,20 +65,18 @@ Gemirro::CLI.options.command 'server' do
63
65
 
64
66
  def start
65
67
  puts 'Starting...'
66
- if File.exist?(@pid_file)
67
- if running?(pid)
68
- puts "Error: #{$PROGRAM_NAME} already running"
69
- abort
70
- end
68
+ if File.exist?(@pid_file) && running?(pid)
69
+ puts "Error: #{$PROGRAM_NAME} already running"
70
+ abort
71
71
  end
72
72
 
73
- Process.daemon
73
+ Process.daemon if Gemirro::Utils.configuration.server.daemonize
74
74
  create_pid
75
- STDOUT.reopen @orig_stdout
75
+ $stdout.reopen @orig_stdout
76
76
  puts "done! (PID is #{pid})\n"
77
77
  Gemirro::Server.run!
78
78
  destroy_pid
79
- STDOUT.reopen '/dev/null', 'a'
79
+ $stdout.reopen '/dev/null', 'a'
80
80
  end
81
81
 
82
82
  def stop
@@ -113,6 +113,7 @@ Gemirro::CLI.options.command 'server' do
113
113
 
114
114
  def running?(process_id)
115
115
  return false if process_id.nil?
116
+
116
117
  Process.getpgid(process_id.to_i) != -1
117
118
  rescue Errno::ESRCH
118
119
  false
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  Gemirro::CLI.options.command 'update' do
2
4
  banner 'Usage: gemirro update [OPTIONS]'
3
5
  description 'Updates the list of Gems'
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  # Configuration
2
4
  module Gemirro
3
5
  ##
@@ -7,7 +9,8 @@ module Gemirro
7
9
  default_config = {
8
10
  server: {
9
11
  access_log: '/tmp/gemirro.access.log',
10
- error_log: '/tmp/gemirro.access.log'
12
+ error_log: '/tmp/gemirro.access.log',
13
+ daemonize: true
11
14
  },
12
15
 
13
16
  update_on_fetch: true,
@@ -39,7 +42,7 @@ module Gemirro
39
42
  # @return [Logger]
40
43
  #
41
44
  def logger
42
- @logger ||= Logger.new(STDOUT)
45
+ @logger ||= Logger.new($stdout)
43
46
  end
44
47
 
45
48
  ##
@@ -161,7 +164,7 @@ module Gemirro
161
164
  # @return [Hash]
162
165
  #
163
166
  def ignored_gems
164
- @ignored_gems ||= Hash.new { |hash, key| hash[key] = [] }
167
+ @ignored_gems ||= Hash.new { |hash, key| hash[key] = {} }
165
168
  end
166
169
 
167
170
  ##
@@ -170,9 +173,10 @@ module Gemirro
170
173
  # @param [String] name
171
174
  # @param [String] version
172
175
  #
173
- def ignore_gem(name, version)
174
- ignored_gems[name] ||= []
175
- ignored_gems[name] << version
176
+ def ignore_gem(name, version, platform)
177
+ ignored_gems[platform] ||= {}
178
+ ignored_gems[platform][name] ||= []
179
+ ignored_gems[platform][name] << version
176
180
  end
177
181
 
178
182
  ##
@@ -182,8 +186,12 @@ module Gemirro
182
186
  # @param [String] version
183
187
  # @return [TrueClass|FalseClass]
184
188
  #
185
- def ignore_gem?(name, version)
186
- ignored_gems[name].include?(version)
189
+ def ignore_gem?(name, version, platform)
190
+ if ignored_gems[platform][name]
191
+ ignored_gems[platform][name].include?(version)
192
+ else
193
+ false
194
+ end
187
195
  end
188
196
 
189
197
  ##
data/lib/gemirro/gem.rb CHANGED
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Gemirro
2
4
  ##
3
5
  # The Gem class contains data about a Gem such as the name, requirement as
@@ -12,8 +14,9 @@ module Gemirro
12
14
  # @return [Gem::Version]
13
15
  #
14
16
  class Gem
15
- attr_reader :name, :requirement, :platform
16
- attr_accessor :gemspec
17
+ attr_reader :name, :requirement
18
+ attr_accessor :gemspec, :platform
19
+
17
20
  ONLY_LATEST = %i[latest newest].freeze
18
21
 
19
22
  ##
@@ -23,7 +26,7 @@ module Gemirro
23
26
  # @return [Gem::Version]
24
27
  #
25
28
  def self.version_for(requirement)
26
- ::Gem::Version.new(requirement.requirements.sort.last.last.version)
29
+ ::Gem::Version.new(requirement.requirements.max.last.version)
27
30
  end
28
31
 
29
32
  ##
@@ -33,9 +36,7 @@ module Gemirro
33
36
  def initialize(name, requirement = nil, platform = 'ruby')
34
37
  requirement ||= ::Gem::Requirement.default
35
38
 
36
- if requirement.is_a?(String)
37
- requirement = ::Gem::Requirement.new(requirement)
38
- end
39
+ requirement = ::Gem::Requirement.new(requirement) if requirement.is_a?(String)
39
40
 
40
41
  @name = name
41
42
  @requirement = requirement
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Gemirro
2
4
  ##
3
5
  # The Gem class contains data about a Gem such as the name, requirement as
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Gemirro
2
4
  ##
3
5
  # The VersionCollection class contains a collection of ::Gem::Version
@@ -10,8 +12,7 @@ module Gemirro
10
12
  class GemVersionCollection
11
13
  include Enumerable
12
14
 
13
- attr_reader :gems
14
- attr_reader :grouped
15
+ attr_reader :gems, :grouped
15
16
 
16
17
  ##
17
18
  # @param [Array] gems
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Gemirro
2
4
  ##
3
5
  # The GemsFetcher class is responsible for downloading Gems from an external
@@ -25,7 +27,9 @@ module Gemirro
25
27
  #
26
28
  def fetch
27
29
  @source.gems.each do |gem|
28
- versions_for(gem).each do |version|
30
+ versions_for(gem).each do |versions|
31
+ gem.platform = versions[1] if versions
32
+ version = versions[0] if versions
29
33
  if gem.gemspec?
30
34
  gemfile = fetch_gemspec(gem, version)
31
35
  if gemfile
@@ -55,7 +59,7 @@ module Gemirro
55
59
  return [available.last] if gem.only_latest?
56
60
 
57
61
  versions = available.select do |v|
58
- gem.requirement.satisfied_by?(v)
62
+ gem.requirement.satisfied_by?(v[0])
59
63
  end
60
64
 
61
65
  versions = [available.last] if versions.empty?
@@ -103,12 +107,13 @@ module Gemirro
103
107
  end
104
108
  name = gem.name
105
109
 
106
- if gem_exists?(filename) || ignore_gem?(name, version) || !satisfied
110
+ if gem_exists?(filename) || ignore_gem?(name, version, gem.platform) ||
111
+ !satisfied
107
112
  Utils.logger.debug("Skipping #{filename}")
108
113
  return
109
114
  end
110
115
 
111
- Utils.configuration.ignore_gem(gem.name, version)
116
+ Utils.configuration.ignore_gem(gem.name, version, gem.platform)
112
117
  Utils.logger.info("Fetching #{filename}")
113
118
 
114
119
  fetch_from_source(filename, gem, version)
@@ -131,7 +136,7 @@ module Gemirro
131
136
  Utils.logger.error("Failed to retrieve #{filename}: #{e.message}")
132
137
  Utils.logger.debug("Adding #{filename} to the list of ignored Gems")
133
138
 
134
- Utils.configuration.ignore_gem(gem.name, version)
139
+ Utils.configuration.ignore_gem(gem.name, version, gem.platform)
135
140
  end
136
141
 
137
142
  data
data/lib/gemirro/http.rb CHANGED
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Gemirro
2
4
  ##
3
5
  # The Http class is responsible for executing GET request
@@ -18,9 +20,7 @@ module Gemirro
18
20
  def self.get(url)
19
21
  response = client.get(url, follow_redirect: true)
20
22
 
21
- unless HTTP::Status.successful?(response.status)
22
- raise HTTPClient::BadResponseError, response.reason
23
- end
23
+ raise HTTPClient::BadResponseError, response.reason unless HTTP::Status.successful?(response.status)
24
24
 
25
25
  response
26
26
  end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Gemirro
2
4
  ##
3
5
  # The Indexer class is responsible for downloading useful file directly
@@ -118,6 +120,7 @@ module Gemirro
118
120
  else
119
121
  source_content = download_from_source(file)
120
122
  next if source_content.nil?
123
+
121
124
  MirrorFile.new(dst_name).write(source_content)
122
125
  end
123
126
 
@@ -136,6 +139,7 @@ module Gemirro
136
139
  Utils.logger.info("Download from source: #{file}")
137
140
  resp = Http.get("#{source_host}/#{File.basename(file)}")
138
141
  return unless resp.code == 200
142
+
139
143
  resp.body
140
144
  end
141
145
 
@@ -155,7 +159,7 @@ module Gemirro
155
159
  #
156
160
  def build_indicies
157
161
  specs = *map_gems_to_specs(gem_file_list)
158
- specs.select! { |s| s.class == ::Gem::Specification }
162
+ specs.select! { |s| s.instance_of?(::Gem::Specification) }
159
163
  ::Gem::Specification.dirs = []
160
164
  ::Gem::Specification.all = specs
161
165
 
@@ -178,22 +182,23 @@ module Gemirro
178
182
  #
179
183
  def map_gems_to_specs(gems)
180
184
  gems.map.with_index do |gemfile, index|
181
- # rubocop:disable Metrics/LineLength
182
185
  Utils.logger.info("[#{index + 1}/#{gems.size}]: Processing #{gemfile.split('/')[-1]}")
183
- # rubocop:enable Metrics/LineLength
184
-
185
186
  if File.size(gemfile).zero?
186
187
  Utils.logger.warn("Skipping zero-length gem: #{gemfile}")
187
188
  next
188
189
  end
189
190
 
190
191
  begin
191
- spec = if ::Gem::Package.respond_to? :open
192
- ::Gem::Package
193
- .open(File.open(gemfile, 'rb'), 'r', &:metadata)
194
- else
195
- ::Gem::Package.new(gemfile).spec
196
- end
192
+ begin
193
+ spec = if ::Gem::Package.respond_to? :open
194
+ ::Gem::Package
195
+ .open(File.open(gemfile, 'rb'), 'r', &:metadata)
196
+ else
197
+ ::Gem::Package.new(gemfile).spec
198
+ end
199
+ rescue NotImplementedError
200
+ next
201
+ end
197
202
 
198
203
  spec.loaded_from = gemfile
199
204
 
@@ -325,6 +330,7 @@ module Gemirro
325
330
  end
326
331
 
327
332
  return false if source_content.nil?
333
+
328
334
  new_content = source_content.concat(content).uniq
329
335
  create_zlib_file(dst_name, new_content)
330
336
  end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Gemirro
2
4
  ##
3
5
  # The MirrorDirectory is used for dealing with files and directories that are
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Gemirro
2
4
  ##
3
5
  # Similar to {Gemirro::MirrorDirectory} the MirrorFile class is used to
@@ -1,22 +1,25 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'sinatra/base'
2
4
  require 'thin'
3
5
  require 'uri'
6
+ require 'addressable/uri'
4
7
 
5
8
  module Gemirro
6
9
  ##
7
10
  # Launch Sinatra server to easily download gems.
8
11
  #
9
12
  class Server < Sinatra::Base
10
- # rubocop:disable Metrics/LineLength
11
- URI_REGEXP = /^(.*)-(\d+(?:\.\d+){1,4}.*?)(?:-(x86-(?:(?:mswin|mingw)(?:32|64)).*?|java))?\.(gem(?:spec\.rz)?)$/
12
- GEMSPEC_TYPE = 'gemspec.rz'.freeze
13
- GEM_TYPE = 'gem'.freeze
13
+ # rubocop:disable Layout/LineLength
14
+ URI_REGEXP = /^(.*)-(\d+(?:\.\d+){1,4}.*?)(?:-(x86-(?:(?:mswin|mingw)(?:32|64)).*?|java))?\.(gem(?:spec\.rz)?)$/.freeze
15
+ # rubocop:enable Layout/LineLength
16
+ GEMSPEC_TYPE = 'gemspec.rz'
17
+ GEM_TYPE = 'gem'
14
18
 
15
19
  access_logger = Logger.new(Utils.configuration.server.access_log).tap do |logger|
16
- ::Logger.class_eval { alias_method :write, :'<<' }
20
+ ::Logger.class_eval { alias_method :write, :<< }
17
21
  logger.level = ::Logger::INFO
18
22
  end
19
- # rubocop:enable Metrics/LineLength
20
23
 
21
24
  error_logger = File.new(Utils.configuration.server.error_log, 'a+')
22
25
  error_logger.sync = true
@@ -127,6 +130,7 @@ module Gemirro
127
130
  #
128
131
  def fetch_gem(resource)
129
132
  return unless Utils.configuration.fetch_gem
133
+
130
134
  name = File.basename(resource)
131
135
  result = name.match(URI_REGEXP)
132
136
  return unless result
@@ -138,10 +142,8 @@ module Gemirro
138
142
  gem = Utils.stored_gem(gem_name, gem_version, gem_platform)
139
143
  gem.gemspec = true if gem_type == GEMSPEC_TYPE
140
144
 
141
- # rubocop:disable Metrics/LineLength
142
145
  return if Utils.gems_fetcher.gem_exists?(gem.filename(gem_version)) && gem_type == GEM_TYPE
143
146
  return if Utils.gems_fetcher.gemspec_exists?(gem.gemspec_filename(gem_version)) && gem_type == GEMSPEC_TYPE
144
- # rubocop:enable Metrics/LineLength
145
147
 
146
148
  Utils.logger
147
149
  .info("Try to download #{gem_name} with version #{gem_version}")
@@ -167,7 +169,7 @@ module Gemirro
167
169
 
168
170
  Utils.logger.info('Generating indexes')
169
171
  indexer.update_index
170
- indexer.updated_gems.peach do |gem|
172
+ indexer.updated_gems.each do |gem|
171
173
  Utils.cache.flush_key(File.basename(gem))
172
174
  end
173
175
  rescue SystemExit => e
@@ -215,9 +217,7 @@ module Gemirro
215
217
  gem_collection = Parallel.map(gem_collection, in_threads: 4) do |gem|
216
218
  [gem, spec_for(gem.name, gem.number, gem.platform)]
217
219
  end
218
- gem_collection.reject! do |_, spec|
219
- spec.nil?
220
- end
220
+ gem_collection.compact!
221
221
 
222
222
  Parallel.map(gem_collection, in_threads: 4) do |gem, spec|
223
223
  dependencies = spec.dependencies.select do |d|
@@ -280,7 +280,7 @@ module Gemirro
280
280
  # @return [String]
281
281
  #
282
282
  def homepage(spec)
283
- URI.parse(URI.escape(spec.homepage))
283
+ URI.parse(Addressable::URI.escape(spec.homepage))
284
284
  end
285
285
  end
286
286
  end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Gemirro
2
4
  ##
3
5
  # The Source class is used for storing information about an external source
@@ -34,7 +36,7 @@ module Gemirro
34
36
  "Fetching #{Configuration.versions_file} on #{@name} (#{@host})"
35
37
  )
36
38
 
37
- Http.get(host + '/' + Configuration.versions_file).body
39
+ Http.get("#{host}/#{Configuration.versions_file}").body
38
40
  end
39
41
 
40
42
  ##
@@ -47,7 +49,7 @@ module Gemirro
47
49
  "Fetching #{Configuration.prerelease_versions_file}" \
48
50
  " on #{@name} (#{@host})"
49
51
  )
50
- Http.get(host + '/' + Configuration.prerelease_versions_file).body
52
+ Http.get("#{host}/#{Configuration.prerelease_versions_file}").body
51
53
  end
52
54
 
53
55
  ##
data/lib/gemirro/utils.rb CHANGED
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Gemirro
2
4
  ##
3
5
  # The Utils class is responsible for executing specific traitments
@@ -16,6 +18,7 @@ module Gemirro
16
18
  :gems_fetcher,
17
19
  :gems_collection,
18
20
  :stored_gems)
21
+
19
22
  ##
20
23
  # Cache class to store marshal and data into files
21
24
  #
@@ -44,6 +47,7 @@ module Gemirro
44
47
  Parallel.map(file_paths, in_threads: 4) do |file_path|
45
48
  next if data[:files].key?(file_path) &&
46
49
  data[:files][file_path] == File.mtime(file_path)
50
+
47
51
  has_file_changed = true
48
52
  end
49
53
 
@@ -53,6 +57,7 @@ module Gemirro
53
57
  gems = []
54
58
  Parallel.map(file_paths, in_threads: 4) do |file_path|
55
59
  next unless File.exist?(file_path)
60
+
56
61
  gems.concat(Marshal.load(Zlib::GzipReader.open(file_path).read))
57
62
  data[:files][file_path] = File.mtime(file_path)
58
63
  end
@@ -75,7 +80,7 @@ module Gemirro
75
80
  File.join(configuration.destination,
76
81
  [specs_file_type,
77
82
  marshal_version,
78
- 'gz' + (orig ? '.orig' : '')].join('.'))
83
+ "gz#{orig ? '.orig' : ''}"].join('.'))
79
84
  end
80
85
  end
81
86
 
@@ -1,4 +1,6 @@
1
+ # frozen_string_literal: true
2
+
1
3
  # Gemirro Version
2
4
  module Gemirro
3
- VERSION = '0.16.0'.freeze
5
+ VERSION = '1.3.0'
4
6
  end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Gemirro
2
4
  ##
3
5
  # The VersionsFetcher class is used for retrieving the file that contains all
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Gemirro
2
4
  ##
3
5
  # The VersionsFile class acts as a small Ruby wrapper around the RubyGems
@@ -65,7 +67,7 @@ module Gemirro
65
67
  # @return [Array]
66
68
  #
67
69
  def versions_for(gem)
68
- versions_hash[gem].map { |version| version[1] }
70
+ versions_hash[gem].map { |version| [version[1], version[2]] }
69
71
  end
70
72
  end
71
73
  end
@@ -68,10 +68,11 @@ module Gemirro
68
68
 
69
69
  it 'should return ignored gems' do
70
70
  expect(@config.ignored_gems).to eq({})
71
- expect(@config.ignore_gem?('rake', '1.0.0')).to be_falsy
72
- expect(@config.ignore_gem('rake', '1.0.0')).to eq(['1.0.0'])
73
- expect(@config.ignored_gems).to eq('rake' => ['1.0.0'])
74
- expect(@config.ignore_gem?('rake', '1.0.0')).to be_truthy
71
+ expect(@config.ignore_gem?('rake', '1.0.0', 'ruby')).to be_falsy
72
+ expect(@config.ignore_gem('rake', '1.0.0', 'ruby')).to eq(['1.0.0'])
73
+ expect(@config.ignored_gems).to eq('ruby' => {'rake' => ['1.0.0']})
74
+ expect(@config.ignore_gem?('rake', '1.0.0', 'ruby')).to be_truthy
75
+ expect(@config.ignore_gem?('rake', '1.0.0', 'java')).to be_falsy
75
76
  end
76
77
 
77
78
  it 'should add and return source' do
@@ -34,9 +34,10 @@ module Gemirro
34
34
  it 'should ignore gem' do
35
35
  allow(Utils.logger).to receive(:info)
36
36
  .once.with('Fetching gemirro-0.0.1.gem')
37
- expect(@fetcher.ignore_gem?('gemirro', '0.0.1')).to be_falsy
38
- Utils.configuration.ignore_gem('gemirro', '0.0.1')
39
- expect(@fetcher.ignore_gem?('gemirro', '0.0.1')).to be_truthy
37
+ expect(@fetcher.ignore_gem?('gemirro', '0.0.1', 'ruby')).to be_falsy
38
+ Utils.configuration.ignore_gem('gemirro', '0.0.1', 'ruby')
39
+ expect(@fetcher.ignore_gem?('gemirro', '0.0.1', 'ruby')).to be_truthy
40
+ expect(@fetcher.ignore_gem?('gemirro', '0.0.1', 'java')).to be_falsy
40
41
  end
41
42
 
42
43
  it 'should log error when fetch gem failed' do
@@ -44,7 +45,7 @@ module Gemirro
44
45
  .once.with('Fetching gemirro-0.0.1.gem')
45
46
  gem = Gem.new('gemirro')
46
47
  version = ::Gem::Version.new('0.0.1')
47
- Utils.configuration.ignore_gem('gemirro', '0.0.1')
48
+ Utils.configuration.ignore_gem('gemirro', '0.0.1', 'ruby')
48
49
  allow(@source).to receive(:fetch_gem)
49
50
  .once.with('gemirro', version).and_raise(ArgumentError)
50
51
  allow(Utils.logger).to receive(:error)
@@ -53,7 +54,7 @@ module Gemirro
53
54
  .once.with(/Adding (.*) to the list of ignored Gems/)
54
55
 
55
56
  expect(@fetcher.fetch_gem(gem, version)).to be_nil
56
- expect(@fetcher.ignore_gem?('gemirro', '0.0.1')).to be_truthy
57
+ expect(@fetcher.ignore_gem?('gemirro', '0.0.1', 'ruby')).to be_truthy
57
58
  end
58
59
 
59
60
  it 'should fetch gem' do
@@ -125,9 +126,10 @@ module Gemirro
125
126
  it 'should retrieve versions for specific gem' do
126
127
  gem = Gem.new('gemirro', '0.0.2')
127
128
  allow(@versions_file).to receive(:versions_for)
128
- .once.with('gemirro').and_return([::Gem::Version.new('0.0.1'),
129
- ::Gem::Version.new('0.0.2')])
130
- expect(@fetcher.versions_for(gem)).to eq([::Gem::Version.new('0.0.2')])
129
+ .once.with('gemirro')
130
+ .and_return([[::Gem::Version.new('0.0.1'), 'ruby'],
131
+ [::Gem::Version.new('0.0.2'), 'ruby']])
132
+ expect(@fetcher.versions_for(gem)).to eq([[::Gem::Version.new('0.0.2'), 'ruby']])
131
133
  end
132
134
 
133
135
  it 'should fetch all gems and log debug if gem is not satisfied' do
@@ -125,7 +125,7 @@ module Gemirro
125
125
  end
126
126
 
127
127
  it 'should try to download gems.' do
128
- source = Gemirro::Source.new('test', 'http://rubygems.org')
128
+ source = Gemirro::Source.new('test', 'https://rubygems.org')
129
129
 
130
130
  versions_fetcher = Gemirro::VersionsFetcher.new(source)
131
131
  allow(versions_fetcher).to receive(:fetch).once.and_return(true)
@@ -166,7 +166,7 @@ module Gemirro
166
166
  end
167
167
 
168
168
  it 'should catch exceptions' do
169
- source = Gemirro::Source.new('test', 'http://rubygems.org')
169
+ source = Gemirro::Source.new('test', 'https://rubygems.org')
170
170
 
171
171
  versions_fetcher = Gemirro::VersionsFetcher.new(source)
172
172
  allow(versions_fetcher).to receive(:fetch).once.and_return(true)
data/template/config.rb CHANGED
@@ -17,6 +17,9 @@ Gemirro.configuration.configure do
17
17
  #
18
18
  # server.host 'localhost'
19
19
  # server.port '2000'
20
+
21
+ # If you don't want the server to run daemonized, uncomment the following
22
+ # server.daemonize false
20
23
  server.access_log File.expand_path('../logs/access.log', __FILE__)
21
24
  server.error_log File.expand_path('../logs/error.log', __FILE__)
22
25
 
@@ -32,7 +35,7 @@ Gemirro.configuration.configure do
32
35
  # You must define a source which where gems will be downloaded.
33
36
  # All gem in the block will be downloaded with the update command.
34
37
  # Other gems will be downloaded with the server.
35
- define_source 'rubygems', 'http://rubygems.org' do
38
+ define_source 'rubygems', 'https://rubygems.org' do
36
39
  gem 'rack', '>= 1.0.0'
37
40
  end
38
41
  end
metadata CHANGED
@@ -1,15 +1,29 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: gemirro
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.16.0
4
+ version: 1.3.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Pierre Rambaud
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2017-11-14 00:00:00.000000000 Z
11
+ date: 2021-03-22 00:00:00.000000000 Z
12
12
  dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: addressable
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: '2.5'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: '2.5'
13
27
  - !ruby/object:Gem::Dependency
14
28
  name: builder
15
29
  requirement: !ruby/object:Gem::Requirement
@@ -72,28 +86,28 @@ dependencies:
72
86
  requirements:
73
87
  - - "~>"
74
88
  - !ruby/object:Gem::Version
75
- version: '1.12'
89
+ version: '1.20'
76
90
  type: :runtime
77
91
  prerelease: false
78
92
  version_requirements: !ruby/object:Gem::Requirement
79
93
  requirements:
80
94
  - - "~>"
81
95
  - !ruby/object:Gem::Version
82
- version: '1.12'
96
+ version: '1.20'
83
97
  - !ruby/object:Gem::Dependency
84
98
  name: sinatra
85
99
  requirement: !ruby/object:Gem::Requirement
86
100
  requirements:
87
101
  - - "~>"
88
102
  - !ruby/object:Gem::Version
89
- version: '2.0'
103
+ version: 2.0.1
90
104
  type: :runtime
91
105
  prerelease: false
92
106
  version_requirements: !ruby/object:Gem::Requirement
93
107
  requirements:
94
108
  - - "~>"
95
109
  - !ruby/object:Gem::Version
96
- version: '2.0'
110
+ version: 2.0.1
97
111
  - !ruby/object:Gem::Dependency
98
112
  name: slop
99
113
  requirement: !ruby/object:Gem::Requirement
@@ -128,84 +142,84 @@ dependencies:
128
142
  requirements:
129
143
  - - "~>"
130
144
  - !ruby/object:Gem::Version
131
- version: '0.11'
145
+ version: '1'
132
146
  type: :development
133
147
  prerelease: false
134
148
  version_requirements: !ruby/object:Gem::Requirement
135
149
  requirements:
136
150
  - - "~>"
137
151
  - !ruby/object:Gem::Version
138
- version: '0.11'
152
+ version: '1'
139
153
  - !ruby/object:Gem::Dependency
140
154
  name: rack-test
141
155
  requirement: !ruby/object:Gem::Requirement
142
156
  requirements:
143
157
  - - "~>"
144
158
  - !ruby/object:Gem::Version
145
- version: '0.7'
159
+ version: '1.1'
146
160
  type: :development
147
161
  prerelease: false
148
162
  version_requirements: !ruby/object:Gem::Requirement
149
163
  requirements:
150
164
  - - "~>"
151
165
  - !ruby/object:Gem::Version
152
- version: '0.7'
166
+ version: '1.1'
153
167
  - !ruby/object:Gem::Dependency
154
168
  name: rake
155
169
  requirement: !ruby/object:Gem::Requirement
156
170
  requirements:
157
171
  - - "~>"
158
172
  - !ruby/object:Gem::Version
159
- version: '12.1'
173
+ version: '13'
160
174
  type: :development
161
175
  prerelease: false
162
176
  version_requirements: !ruby/object:Gem::Requirement
163
177
  requirements:
164
178
  - - "~>"
165
179
  - !ruby/object:Gem::Version
166
- version: '12.1'
180
+ version: '13'
167
181
  - !ruby/object:Gem::Dependency
168
182
  name: rspec
169
183
  requirement: !ruby/object:Gem::Requirement
170
184
  requirements:
171
185
  - - "~>"
172
186
  - !ruby/object:Gem::Version
173
- version: '3.7'
187
+ version: '3.10'
174
188
  type: :development
175
189
  prerelease: false
176
190
  version_requirements: !ruby/object:Gem::Requirement
177
191
  requirements:
178
192
  - - "~>"
179
193
  - !ruby/object:Gem::Version
180
- version: '3.7'
194
+ version: '3.10'
181
195
  - !ruby/object:Gem::Dependency
182
196
  name: rubocop
183
197
  requirement: !ruby/object:Gem::Requirement
184
198
  requirements:
185
199
  - - "~>"
186
200
  - !ruby/object:Gem::Version
187
- version: '0.51'
201
+ version: '1'
188
202
  type: :development
189
203
  prerelease: false
190
204
  version_requirements: !ruby/object:Gem::Requirement
191
205
  requirements:
192
206
  - - "~>"
193
207
  - !ruby/object:Gem::Version
194
- version: '0.51'
208
+ version: '1'
195
209
  - !ruby/object:Gem::Dependency
196
210
  name: simplecov
197
211
  requirement: !ruby/object:Gem::Requirement
198
212
  requirements:
199
213
  - - "~>"
200
214
  - !ruby/object:Gem::Version
201
- version: '0.15'
215
+ version: '0.21'
202
216
  type: :development
203
217
  prerelease: false
204
218
  version_requirements: !ruby/object:Gem::Requirement
205
219
  requirements:
206
220
  - - "~>"
207
221
  - !ruby/object:Gem::Version
208
- version: '0.15'
222
+ version: '0.21'
209
223
  description: Create your own gems mirror.
210
224
  email: pierre.rambaud86@gmail.com
211
225
  executables:
@@ -295,15 +309,14 @@ required_ruby_version: !ruby/object:Gem::Requirement
295
309
  requirements:
296
310
  - - ">="
297
311
  - !ruby/object:Gem::Version
298
- version: 1.9.2
312
+ version: '2.5'
299
313
  required_rubygems_version: !ruby/object:Gem::Requirement
300
314
  requirements:
301
315
  - - ">="
302
316
  - !ruby/object:Gem::Version
303
317
  version: '0'
304
318
  requirements: []
305
- rubyforge_project:
306
- rubygems_version: 2.6.11
319
+ rubygems_version: 3.1.2
307
320
  signing_key:
308
321
  specification_version: 4
309
322
  summary: Gem for easily creating your own gems mirror.