gemirro 1.5.0 → 1.6.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (40) hide show
  1. checksums.yaml +4 -4
  2. data/.github/workflows/ruby.yml +29 -0
  3. data/.rubocop.yml +6 -3
  4. data/Gemfile.lock +126 -0
  5. data/MANIFEST +6 -10
  6. data/README.md +1 -1
  7. data/bin/gemirro +7 -1
  8. data/gemirro.gemspec +7 -2
  9. data/lib/gemirro/cli/index.rb +12 -3
  10. data/lib/gemirro/cli/init.rb +6 -1
  11. data/lib/gemirro/cli/update.rb +6 -0
  12. data/lib/gemirro/configuration.rb +1 -1
  13. data/lib/gemirro/gems_fetcher.rb +5 -10
  14. data/lib/gemirro/indexer.rb +396 -89
  15. data/lib/gemirro/mirror_file.rb +1 -0
  16. data/lib/gemirro/server.rb +73 -166
  17. data/lib/gemirro/utils.rb +123 -68
  18. data/lib/gemirro/version.rb +1 -1
  19. data/lib/gemirro/versions_fetcher.rb +6 -2
  20. data/lib/gemirro.rb +0 -1
  21. data/spec/gemirro/server_spec.rb +76 -47
  22. data/template/config.rb +6 -0
  23. data/template/public/dist/css/gemirro.css +25 -1
  24. data/template/public/latest_specs.4.8 +0 -0
  25. data/template/public/prerelease_specs.4.8 +0 -0
  26. data/template/public/specs.4.8 +0 -0
  27. data/views/gem.erb +46 -37
  28. data/views/index.erb +41 -33
  29. data/views/layout.erb +4 -17
  30. data/views/not_found.erb +4 -4
  31. metadata +82 -16
  32. data/lib/gemirro/cache.rb +0 -115
  33. data/spec/gemirro/cache_spec.rb +0 -32
  34. data/template/public/dist/css/bootstrap.min.css +0 -7
  35. data/template/public/dist/fonts/glyphicons-halflings-regular.eot +0 -0
  36. data/template/public/dist/fonts/glyphicons-halflings-regular.svg +0 -288
  37. data/template/public/dist/fonts/glyphicons-halflings-regular.ttf +0 -0
  38. data/template/public/dist/fonts/glyphicons-halflings-regular.woff +0 -0
  39. data/template/public/dist/fonts/glyphicons-halflings-regular.woff2 +0 -0
  40. 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: 1129e2117ef615eddf786284610e84808bd3e2ddd2ab21e8fafc972d9b5923e5
4
- data.tar.gz: 2c6325d376cf3be31e8f447549697dfb9df6811da7e6aab17654059bf2a1cae6
3
+ metadata.gz: 23b3ba616d8007252b6be8b5a3edd675246bb89839e8ae13fd2b01dcf9dff4d4
4
+ data.tar.gz: a82c036b510ce0da4f1c6475a7b6baac5afbcc065ce911bec8a6e789b84ad9ee
5
5
  SHA512:
6
- metadata.gz: 9550ed8196a872207d6db5809e97223f190aba44704c2886b469066f57ff7c5f4ab9ab50c11d8a43f010eef88a718fc7a5f736c3aebbf6fc2fd2a702d9c9b5f3
7
- data.tar.gz: '0951b6fd87d27b0c830e25c1774e13fe88e322bcd8277facf4950726da931c4b1de2ee6ad0b8ba71742c9567615a57c742bbffcfb2c69a0a0ef81b67cc7bb8d6'
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.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,17 +16,22 @@ 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'
31
+ s.add_dependency 'rubygems-generate_index', '> 0' # stdlib
27
32
  s.add_dependency 'sinatra', '>=3.1', '<4.0'
28
33
  s.add_dependency 'slop', '~>3.6'
29
- s.add_dependency 'stringio', '~> 3.1'
34
+ s.add_dependency 'stringio', '> 0' # stdlib
30
35
  s.add_dependency 'thin', '~>1.8'
31
36
 
32
37
  s.metadata['rubygems_mfa_required'] = 'true'
@@ -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
@@ -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