gemirro 1.4.0 → 1.6.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.
Files changed (46) hide show
  1. checksums.yaml +4 -4
  2. data/.github/workflows/ruby.yml +29 -0
  3. data/.rubocop.yml +6 -3
  4. data/Gemfile +9 -0
  5. data/Gemfile.lock +126 -0
  6. data/MANIFEST +6 -10
  7. data/README.md +1 -1
  8. data/bin/gemirro +7 -1
  9. data/gemirro.gemspec +9 -9
  10. data/lib/gemirro/cli/index.rb +12 -3
  11. data/lib/gemirro/cli/init.rb +6 -1
  12. data/lib/gemirro/cli/server.rb +2 -4
  13. data/lib/gemirro/cli/update.rb +6 -0
  14. data/lib/gemirro/configuration.rb +1 -1
  15. data/lib/gemirro/gems_fetcher.rb +5 -10
  16. data/lib/gemirro/http.rb +6 -6
  17. data/lib/gemirro/indexer.rb +397 -90
  18. data/lib/gemirro/mirror_file.rb +1 -0
  19. data/lib/gemirro/server.rb +73 -160
  20. data/lib/gemirro/source.rb +2 -2
  21. data/lib/gemirro/utils.rb +123 -68
  22. data/lib/gemirro/version.rb +1 -1
  23. data/lib/gemirro/versions_fetcher.rb +6 -2
  24. data/lib/gemirro.rb +1 -1
  25. data/spec/gemirro/http_spec.rb +83 -24
  26. data/spec/gemirro/indexer_spec.rb +3 -0
  27. data/spec/gemirro/server_spec.rb +76 -47
  28. data/template/config.rb +6 -0
  29. data/template/public/dist/css/gemirro.css +25 -1
  30. data/template/public/latest_specs.4.8 +0 -0
  31. data/template/public/prerelease_specs.4.8 +0 -0
  32. data/template/public/specs.4.8 +0 -0
  33. data/views/gem.erb +46 -37
  34. data/views/index.erb +41 -33
  35. data/views/layout.erb +5 -25
  36. data/views/not_found.erb +4 -4
  37. metadata +72 -89
  38. data/lib/gemirro/cache.rb +0 -115
  39. data/spec/gemirro/cache_spec.rb +0 -32
  40. data/template/public/dist/css/bootstrap.min.css +0 -7
  41. data/template/public/dist/fonts/glyphicons-halflings-regular.eot +0 -0
  42. data/template/public/dist/fonts/glyphicons-halflings-regular.svg +0 -288
  43. data/template/public/dist/fonts/glyphicons-halflings-regular.ttf +0 -0
  44. data/template/public/dist/fonts/glyphicons-halflings-regular.woff +0 -0
  45. data/template/public/dist/fonts/glyphicons-halflings-regular.woff2 +0 -0
  46. data/template/public/dist/js/bootstrap.min.js +0 -7
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 56fa41eef2a76a964a6d885f5c78ea8e6193c2442ae9dc7b3db6cae10c934ea9
4
- data.tar.gz: '08152e167296fd41283619abf268f08279b950ff3d683f500f3cdce5fe49ae5e'
3
+ metadata.gz: 23b3ba616d8007252b6be8b5a3edd675246bb89839e8ae13fd2b01dcf9dff4d4
4
+ data.tar.gz: a82c036b510ce0da4f1c6475a7b6baac5afbcc065ce911bec8a6e789b84ad9ee
5
5
  SHA512:
6
- metadata.gz: 0ab54b560eb64207ce1074ac87c02a71569ecf626069a59ae4aa3bfb8dbc5e504c57712e57e216a9c0d27347fca1c54db3037846fefe90ad1ad70de35423b257
7
- data.tar.gz: da5e332d738e42ca80ed7946a2bb598b213ce50d54df704f672d3717d010b07bfa5dc3e07d7b3290cc95557f657635a7de46ab9372c6a981b3b19f233c3f2acf
6
+ metadata.gz: 6f31d4f862a961c03b097b9eff5bff4a5d8b9e02816346a9dcf581c393213b4f8754be127115374895dd3613179a550b4e1e63bb26fdaa13e50ebe1646693998
7
+ data.tar.gz: fc8957ef3a2231aca1c9c386cc27316b252e46267b360948b8cfe6fd0f1300b6a788edf6fbe3553d2a6889536216bf9921f06ec121f3cebb68a50a7111a636ed
@@ -0,0 +1,29 @@
1
+ name: "Gemirro tests"
2
+
3
+ on: [push, pull_request]
4
+
5
+ jobs:
6
+ rspec:
7
+ runs-on: ubuntu-latest
8
+ strategy:
9
+ matrix:
10
+ ruby: ['3.0', '3.1', '3.2']
11
+ name: Rspec on Ruby ${{ matrix.ruby }}
12
+ steps:
13
+ - uses: actions/checkout@v4
14
+ - uses: ruby/setup-ruby@v1
15
+ with:
16
+ ruby-version: ${{ matrix.ruby }}
17
+ bundler-cache: true
18
+ - run: bundle exec rspec
19
+
20
+ rubocop:
21
+ runs-on: ubuntu-latest
22
+ name: Run rubocop
23
+ steps:
24
+ - uses: actions/checkout@v4
25
+ - uses: ruby/setup-ruby@v1
26
+ with:
27
+ ruby-version: '3.2'
28
+ bundler-cache: true
29
+ - run: bundle exec rubocop
data/.rubocop.yml CHANGED
@@ -1,6 +1,7 @@
1
1
  AllCops:
2
+ SuggestExtensions: false
2
3
  NewCops: enable
3
- TargetRubyVersion: 2.5
4
+ TargetRubyVersion: 3.0
4
5
  Include:
5
6
  - '**/Gemfile'
6
7
  - lib/**/*.rb
@@ -15,9 +16,9 @@ AllCops:
15
16
  Naming/FileName:
16
17
  Exclude:
17
18
  - Rakefile
18
- Layout/MethodLength:
19
+ Metrics/MethodLength:
19
20
  Enabled: false
20
- Layout/ClassLength:
21
+ Metrics/ClassLength:
21
22
  Enabled: false
22
23
  Metrics/CyclomaticComplexity:
23
24
  Enabled: false
@@ -35,3 +36,5 @@ Style/OptionalBooleanParameter:
35
36
  Enabled: false
36
37
  Lint/MissingSuper:
37
38
  Enabled: false
39
+ Style/TrailingUnderscoreVariable:
40
+ Enabled: false
data/Gemfile CHANGED
@@ -3,3 +3,12 @@
3
3
  source 'https://rubygems.org/'
4
4
 
5
5
  gemspec
6
+
7
+ group :development, :test do
8
+ gem 'fakefs', '~> 2'
9
+ gem 'rack-test', '~> 1.1'
10
+ gem 'rake', '~> 13'
11
+ gem 'rspec', '~> 3.10'
12
+ gem 'rubocop', '~> 1'
13
+ gem 'simplecov', '~> 0.21'
14
+ end
data/Gemfile.lock ADDED
@@ -0,0 +1,126 @@
1
+ PATH
2
+ remote: .
3
+ specs:
4
+ gemirro (1.6.0)
5
+ addressable (~> 2.8)
6
+ builder (~> 3.2)
7
+ compact_index (~> 0.15)
8
+ confstruct (~> 1.1)
9
+ erubis (~> 2.7)
10
+ httpclient (~> 2.8)
11
+ logger (> 0)
12
+ mutex_m (> 0)
13
+ ostruct (> 0)
14
+ parallel (~> 1.21)
15
+ rubygems-generate_index (> 0)
16
+ sinatra (>= 3.1, < 4.0)
17
+ slop (~> 3.6)
18
+ stringio (> 0)
19
+ thin (~> 1.8)
20
+
21
+ GEM
22
+ remote: https://rubygems.org/
23
+ specs:
24
+ addressable (2.8.7)
25
+ public_suffix (>= 2.0.2, < 7.0)
26
+ ast (2.4.2)
27
+ base64 (0.2.0)
28
+ builder (3.3.0)
29
+ compact_index (0.15.0)
30
+ confstruct (1.1.0)
31
+ hashie (>= 3.3, < 5)
32
+ daemons (1.4.1)
33
+ diff-lcs (1.5.1)
34
+ docile (1.4.1)
35
+ erubis (2.7.0)
36
+ eventmachine (1.2.7)
37
+ fakefs (2.8.0)
38
+ hashie (4.1.0)
39
+ httpclient (2.8.3)
40
+ json (2.9.1)
41
+ language_server-protocol (3.17.0.3)
42
+ logger (1.6.5)
43
+ mustermann (3.0.3)
44
+ ruby2_keywords (~> 0.0.1)
45
+ mutex_m (0.3.0)
46
+ ostruct (0.6.1)
47
+ parallel (1.26.3)
48
+ parser (3.3.7.0)
49
+ ast (~> 2.4.1)
50
+ racc
51
+ public_suffix (6.0.1)
52
+ racc (1.8.1)
53
+ rack (2.2.10)
54
+ rack-protection (3.2.0)
55
+ base64 (>= 0.1.0)
56
+ rack (~> 2.2, >= 2.2.4)
57
+ rack-test (1.1.0)
58
+ rack (>= 1.0, < 3)
59
+ rainbow (3.1.1)
60
+ rake (13.2.1)
61
+ regexp_parser (2.10.0)
62
+ rspec (3.13.0)
63
+ rspec-core (~> 3.13.0)
64
+ rspec-expectations (~> 3.13.0)
65
+ rspec-mocks (~> 3.13.0)
66
+ rspec-core (3.13.2)
67
+ rspec-support (~> 3.13.0)
68
+ rspec-expectations (3.13.3)
69
+ diff-lcs (>= 1.2.0, < 2.0)
70
+ rspec-support (~> 3.13.0)
71
+ rspec-mocks (3.13.2)
72
+ diff-lcs (>= 1.2.0, < 2.0)
73
+ rspec-support (~> 3.13.0)
74
+ rspec-support (3.13.2)
75
+ rubocop (1.70.0)
76
+ json (~> 2.3)
77
+ language_server-protocol (>= 3.17.0)
78
+ parallel (~> 1.10)
79
+ parser (>= 3.3.0.2)
80
+ rainbow (>= 2.2.2, < 4.0)
81
+ regexp_parser (>= 2.9.3, < 3.0)
82
+ rubocop-ast (>= 1.36.2, < 2.0)
83
+ ruby-progressbar (~> 1.7)
84
+ unicode-display_width (>= 2.4.0, < 4.0)
85
+ rubocop-ast (1.37.0)
86
+ parser (>= 3.3.1.0)
87
+ ruby-progressbar (1.13.0)
88
+ ruby2_keywords (0.0.5)
89
+ rubygems-generate_index (1.1.3)
90
+ compact_index (~> 0.15.0)
91
+ simplecov (0.22.0)
92
+ docile (~> 1.1)
93
+ simplecov-html (~> 0.11)
94
+ simplecov_json_formatter (~> 0.1)
95
+ simplecov-html (0.13.1)
96
+ simplecov_json_formatter (0.1.4)
97
+ sinatra (3.2.0)
98
+ mustermann (~> 3.0)
99
+ rack (~> 2.2, >= 2.2.4)
100
+ rack-protection (= 3.2.0)
101
+ tilt (~> 2.0)
102
+ slop (3.6.0)
103
+ stringio (3.1.2)
104
+ thin (1.8.2)
105
+ daemons (~> 1.0, >= 1.0.9)
106
+ eventmachine (~> 1.0, >= 1.0.4)
107
+ rack (>= 1, < 3)
108
+ tilt (2.6.0)
109
+ unicode-display_width (3.1.4)
110
+ unicode-emoji (~> 4.0, >= 4.0.4)
111
+ unicode-emoji (4.0.4)
112
+
113
+ PLATFORMS
114
+ ruby
115
+
116
+ DEPENDENCIES
117
+ fakefs (~> 2)
118
+ gemirro!
119
+ rack-test (~> 1.1)
120
+ rake (~> 13)
121
+ rspec (~> 3.10)
122
+ rubocop (~> 1)
123
+ simplecov (~> 0.21)
124
+
125
+ BUNDLED WITH
126
+ 2.5.16
data/MANIFEST CHANGED
@@ -1,6 +1,8 @@
1
+ .github/workflows/ruby.yml
1
2
  .gitignore
2
3
  .rubocop.yml
3
4
  Gemfile
5
+ Gemfile.lock
4
6
  LICENSE
5
7
  MANIFEST
6
8
  README.md
@@ -8,7 +10,6 @@ Rakefile
8
10
  bin/gemirro
9
11
  gemirro.gemspec
10
12
  lib/gemirro.rb
11
- lib/gemirro/cache.rb
12
13
  lib/gemirro/cli.rb
13
14
  lib/gemirro/cli/index.rb
14
15
  lib/gemirro/cli/init.rb
@@ -32,7 +33,6 @@ lib/gemirro/versions_fetcher.rb
32
33
  lib/gemirro/versions_file.rb
33
34
  spec/fixtures/gems/gemirro-0.0.1.gem
34
35
  spec/fixtures/quick/gemirro-0.0.1.gemspec.rz
35
- spec/gemirro/cache_spec.rb
36
36
  spec/gemirro/cli_spec.rb
37
37
  spec/gemirro/configuration_spec.rb
38
38
  spec/gemirro/gem_spec.rb
@@ -53,16 +53,12 @@ task/rspec.rake
53
53
  task/rubocop.rake
54
54
  template/config.rb
55
55
  template/logs/.gitkeep
56
- template/public/dist/css/bootstrap.min.css
57
56
  template/public/dist/css/gemirro.css
58
- template/public/dist/fonts/glyphicons-halflings-regular.eot
59
- template/public/dist/fonts/glyphicons-halflings-regular.svg
60
- template/public/dist/fonts/glyphicons-halflings-regular.ttf
61
- template/public/dist/fonts/glyphicons-halflings-regular.woff
62
- template/public/dist/fonts/glyphicons-halflings-regular.woff2
63
- template/public/dist/js/bootstrap.min.js
64
57
  template/public/gems/.gitkeep
58
+ template/public/latest_specs.4.8
59
+ template/public/prerelease_specs.4.8
60
+ template/public/specs.4.8
65
61
  views/gem.erb
66
62
  views/index.erb
67
63
  views/layout.erb
68
- views/not_found.erb
64
+ views/not_found.erb
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.2 or newer
9
+ * Ruby 3.0 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
@@ -4,4 +4,10 @@
4
4
  require File.expand_path('../../lib/gemirro', __FILE__)
5
5
 
6
6
  options = Gemirro::CLI.options
7
- puts options if options.parse.empty?
7
+
8
+ begin
9
+ puts options if options.parse.empty?
10
+ rescue Slop::InvalidOptionError => e
11
+ puts e.message
12
+ puts options
13
+ end
data/gemirro.gemspec CHANGED
@@ -16,23 +16,23 @@ Gem::Specification.new do |s|
16
16
 
17
17
  s.files = File.read(File.expand_path('../MANIFEST', __FILE__)).split("\n")
18
18
 
19
- s.required_ruby_version = '>= 2.5'
19
+ s.required_ruby_version = '>= 3.0'
20
20
 
21
21
  s.add_dependency 'addressable', '~>2.8'
22
22
  s.add_dependency 'builder', '~>3.2'
23
+ s.add_dependency 'compact_index', '~> 0.15'
23
24
  s.add_dependency 'confstruct', '~>1.1'
24
25
  s.add_dependency 'erubis', '~>2.7'
25
26
  s.add_dependency 'httpclient', '~>2.8'
27
+ s.add_dependency 'logger', '> 0' # stdlib
28
+ s.add_dependency 'mutex_m', '> 0' # stdlib
29
+ s.add_dependency 'ostruct', '> 0' # stdlib
26
30
  s.add_dependency 'parallel', '~>1.21'
27
- s.add_dependency 'sinatra', '>=2.1', '<4.0'
28
- s.add_dependency 'sinatra-static-assets', '~>1.0'
31
+ s.add_dependency 'rubygems-generate_index', '> 0' # stdlib
32
+ s.add_dependency 'sinatra', '>=3.1', '<4.0'
29
33
  s.add_dependency 'slop', '~>3.6'
34
+ s.add_dependency 'stringio', '> 0' # stdlib
30
35
  s.add_dependency 'thin', '~>1.8'
31
36
 
32
- s.add_development_dependency 'fakefs', '~>1'
33
- s.add_development_dependency 'rack-test', '~>1.1'
34
- s.add_development_dependency 'rake', '~>13'
35
- s.add_development_dependency 'rspec', '~>3.10'
36
- s.add_development_dependency 'rubocop', '~>1'
37
- s.add_development_dependency 'simplecov', '~>0.21'
37
+ s.metadata['rubygems_mfa_required'] = 'true'
38
38
  end
@@ -22,8 +22,17 @@ Gemirro::CLI.options.command 'index' do
22
22
  indexer = Gemirro::Indexer.new(config.destination)
23
23
  indexer.ui = Gem::SilentUI.new
24
24
 
25
- config.logger.info('Generating indexes')
26
- indexer.generate_index if opts[:u].nil?
27
- indexer.update_index unless opts[:u].nil?
25
+ if File.exist?(File.join(config.destination, "specs.#{Gem.marshal_version}.gz"))
26
+ if opts[:u]
27
+ config.logger.info('Generating index updates')
28
+ indexer.update_index
29
+ else
30
+ config.logger.info('Generating indexes')
31
+ indexer.generate_index
32
+ end
33
+ else
34
+ config.logger.error("/public/specs.#{Gem.marshal_version}.gz file is missing.")
35
+ config.logger.error('Run "gemirro update" before running index.')
36
+ end
28
37
  end
29
38
  end
@@ -20,12 +20,17 @@ Gemirro::CLI.options.command 'init' do
20
20
  next if ['.', '..'].include?(File.basename(file))
21
21
 
22
22
  dest = File.join(directory, file.gsub(/^#{template}/, ''))
23
- next if File.exist?(dest)
23
+ next if File.exist?(dest) && dest !~ /gemirro.css/
24
24
 
25
25
  FileUtils.cp_r(file, dest)
26
26
  end
27
27
  end
28
28
 
29
+ # make sure index updates blank local specs
30
+ ['specs.4.8', 'latest_specs.4.8', 'prerelease_specs.4.8'].each do |s|
31
+ File.utime(Time.at(0), Time.at(0), File.join(directory, 'public', s))
32
+ end
33
+
29
34
  puts "Initialized empty mirror in #{directory}"
30
35
  end
31
36
  end
@@ -42,9 +42,7 @@ Gemirro::CLI.options.command 'server' do
42
42
  $PROGRAM_NAME = 'gemirro'
43
43
 
44
44
  def create_pid
45
- File.open(@pid_file, 'w') do |f|
46
- f.write(Process.pid.to_s)
47
- end
45
+ File.write(@pid_file, Process.pid.to_s)
48
46
  rescue Errno::EACCES
49
47
  $stdout.reopen @orig_stdout
50
48
  puts "Error: Can't write to #{@pid_file} - Permission denied"
@@ -76,7 +74,7 @@ Gemirro::CLI.options.command 'server' do
76
74
  puts "done! (PID is #{pid})\n"
77
75
  Gemirro::Server.run!
78
76
  destroy_pid
79
- $stdout.reopen '/dev/null', 'a'
77
+ $stdout.reopen File::NULL, 'a'
80
78
  end
81
79
 
82
80
  def stop
@@ -17,5 +17,11 @@ Gemirro::CLI.options.command 'update' do
17
17
  gems = Gemirro::GemsFetcher.new(source, versions)
18
18
 
19
19
  gems.fetch
20
+
21
+ source.gems.each do |gem|
22
+ gem.gemspec = true
23
+ end
24
+
25
+ gems.fetch
20
26
  end
21
27
  end
@@ -12,7 +12,7 @@ module Gemirro
12
12
  error_log: '/tmp/gemirro.access.log',
13
13
  daemonize: true
14
14
  },
15
-
15
+ update_thread_count: begin; Etc.nprocessors - 1; rescue StandardError; 4; end,
16
16
  update_on_fetch: true,
17
17
  fetch_gem: true
18
18
  }
@@ -31,10 +31,10 @@ module Gemirro
31
31
  gem.platform = versions[1] if versions
32
32
  version = versions[0] if versions
33
33
  if gem.gemspec?
34
- gemfile = fetch_gemspec(gem, version)
35
- if gemfile
34
+ gemspec = fetch_gemspec(gem, version)
35
+ if gemspec
36
36
  Utils.configuration.mirror_gemspecs_directory
37
- .add_file(gem.gemspec_filename(version), gemfile)
37
+ .add_file(gem.gemspec_filename(version), gemspec)
38
38
  end
39
39
  else
40
40
  gemfile = fetch_gem(gem, version)
@@ -100,15 +100,10 @@ module Gemirro
100
100
  #
101
101
  def fetch_gem(gem, version)
102
102
  filename = gem.filename(version)
103
- satisfied = if gem.only_latest?
104
- true
105
- else
106
- gem.requirement.satisfied_by?(version)
107
- end
103
+ satisfied = gem.only_latest? || gem.requirement.satisfied_by?(version)
108
104
  name = gem.name
109
105
 
110
- if gem_exists?(filename) || ignore_gem?(name, version, gem.platform) ||
111
- !satisfied
106
+ if gem_exists?(filename) || ignore_gem?(name, version, gem.platform) || !satisfied
112
107
  Utils.logger.debug("Skipping #{filename}")
113
108
  return
114
109
  end
data/lib/gemirro/http.rb CHANGED
@@ -40,21 +40,21 @@ module Gemirro
40
40
 
41
41
  if defined?(config.proxy)
42
42
  proxy = config.proxy
43
- client.proxy=(proxy)
43
+ client.proxy = (proxy)
44
44
  end
45
45
 
46
46
  # Use my own ca file for self signed cert
47
47
  if defined?(config.rootca)
48
- abort "The configuration file #{config.rootca} does not exist" unless File.file?(config.rootca)
49
- client.ssl_config.verify_mode = OpenSSL::SSL::VERIFY_PEER
50
- client.ssl_config.set_trust_ca(config.rootca)
48
+ abort "The configuration file #{config.rootca} does not exist" unless File.file?(config.rootca)
49
+ client.ssl_config.verify_mode = OpenSSL::SSL::VERIFY_PEER
50
+ client.ssl_config.set_trust_ca(config.rootca)
51
51
  elsif defined?(config.verify_mode)
52
52
  client.ssl_config.verify_mode = OpenSSL::SSL::VERIFY_NONE unless config.verify_mode
53
53
  end
54
54
 
55
55
  # Enforce base auth
56
- if defined?(config.basic_auth)
57
- client.force_basic_auth=(true) if config.basic_auth
56
+ if defined?(config.basic_auth) && config.basic_auth
57
+ client.www_auth.basic_auth.force_auth = (true)
58
58
  end
59
59
  @client = client
60
60
  end