gemirro 1.5.0 → 2.0.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 (47) hide show
  1. checksums.yaml +4 -4
  2. data/.github/workflows/ruby.yml +29 -0
  3. data/.gitignore +1 -0
  4. data/.rubocop.yml +6 -3
  5. data/Gemfile.lock +126 -0
  6. data/MANIFEST +3 -10
  7. data/README.md +1 -1
  8. data/bin/gemirro +7 -1
  9. data/gemirro.gemspec +7 -2
  10. data/lib/gemirro/cli/index.rb +14 -4
  11. data/lib/gemirro/cli/init.rb +1 -1
  12. data/lib/gemirro/cli/update.rb +6 -0
  13. data/lib/gemirro/cli.rb +3 -1
  14. data/lib/gemirro/configuration.rb +4 -12
  15. data/lib/gemirro/gems_fetcher.rb +7 -10
  16. data/lib/gemirro/indexer.rb +286 -178
  17. data/lib/gemirro/mirror_file.rb +1 -0
  18. data/lib/gemirro/server.rb +56 -181
  19. data/lib/gemirro/source.rb +2 -15
  20. data/lib/gemirro/utils.rb +130 -65
  21. data/lib/gemirro/version.rb +1 -1
  22. data/lib/gemirro/versions_fetcher.rb +9 -10
  23. data/lib/gemirro/versions_file.rb +26 -24
  24. data/lib/gemirro.rb +0 -1
  25. data/spec/gemirro/configuration_spec.rb +9 -2
  26. data/spec/gemirro/gems_fetcher_spec.rb +1 -1
  27. data/spec/gemirro/indexer_spec.rb +5 -5
  28. data/spec/gemirro/server_spec.rb +79 -73
  29. data/spec/gemirro/source_spec.rb +1 -10
  30. data/spec/gemirro/versions_fetcher_spec.rb +3 -4
  31. data/spec/gemirro/versions_file_spec.rb +8 -32
  32. data/template/config.rb +7 -1
  33. data/template/public/dist/css/gemirro.css +25 -1
  34. data/views/gem.erb +46 -37
  35. data/views/index.erb +41 -33
  36. data/views/layout.erb +4 -17
  37. data/views/not_found.erb +4 -4
  38. metadata +79 -16
  39. data/lib/gemirro/cache.rb +0 -115
  40. data/spec/gemirro/cache_spec.rb +0 -32
  41. data/template/public/dist/css/bootstrap.min.css +0 -7
  42. data/template/public/dist/fonts/glyphicons-halflings-regular.eot +0 -0
  43. data/template/public/dist/fonts/glyphicons-halflings-regular.svg +0 -288
  44. data/template/public/dist/fonts/glyphicons-halflings-regular.ttf +0 -0
  45. data/template/public/dist/fonts/glyphicons-halflings-regular.woff +0 -0
  46. data/template/public/dist/fonts/glyphicons-halflings-regular.woff2 +0 -0
  47. 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: e54b02e5575feb8b7a4fcbb40f5fd91764fb0f589368e4a9207f6a5074fe2f05
4
+ data.tar.gz: 14449b2b15d5477216adaecea6e36aff26dae8b30104e3db627bdcdbdf7c6b7d
5
5
  SHA512:
6
- metadata.gz: 9550ed8196a872207d6db5809e97223f190aba44704c2886b469066f57ff7c5f4ab9ab50c11d8a43f010eef88a718fc7a5f736c3aebbf6fc2fd2a702d9c9b5f3
7
- data.tar.gz: '0951b6fd87d27b0c830e25c1774e13fe88e322bcd8277facf4950726da931c4b1de2ee6ad0b8ba71742c9567615a57c742bbffcfb2c69a0a0ef81b67cc7bb8d6'
6
+ metadata.gz: ba26ee7c502dd1bbfc02fd55e1263097dedad78670281d8f775bd9c5940be1c46032130cd76be02fbdee3b8a4c2f24504f39b38c7e5901497c7eff28d13a0307
7
+ data.tar.gz: ce425c173bcfc46ea6298cc0911ddec8a838f321749f9ec782da8323afdaf3268f6071d629be5fa6b129fbe29d2198e930b6202225d23f17ac582fac71fc1533
@@ -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/.gitignore CHANGED
@@ -4,3 +4,4 @@
4
4
  /.ruby-version
5
5
  /*.gem
6
6
  /.bundle
7
+ .DS_Store
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 (2.0.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.14)
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,9 @@ 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
65
58
  views/gem.erb
66
59
  views/index.erb
67
60
  views/layout.erb
68
- views/not_found.erb
61
+ 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'
@@ -19,11 +19,21 @@ Gemirro::CLI.options.command 'index' do
19
19
  abort
20
20
  end
21
21
 
22
- indexer = Gemirro::Indexer.new(config.destination)
22
+ indexer = Gemirro::Indexer.new
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.versions_file))
26
+ indexer.download_source_versions
27
+ if opts[:u]
28
+ config.logger.info('Generating index updates')
29
+ indexer.update_index
30
+ else
31
+ config.logger.info('Generating indexes')
32
+ indexer.generate_index
33
+ end
34
+ else
35
+ config.logger.error("#{File.basename(config.versions_file)} file is missing.")
36
+ config.logger.error('Run "gemirro update" before running index.')
37
+ end
28
38
  end
29
39
  end
@@ -20,7 +20,7 @@ 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
@@ -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
data/lib/gemirro/cli.rb CHANGED
@@ -1,5 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+ require File.expand_path('../version', __FILE__)
4
+
3
5
  module Gemirro
4
6
  # CLI mode
5
7
  module CLI
@@ -58,7 +60,7 @@ module Gemirro
58
60
  # @return [String]
59
61
  #
60
62
  def self.version_information
61
- "gemirro v#{VERSION} on #{RUBY_DESCRIPTION}"
63
+ "gemirro v#{Gemirro::VERSION} on #{RUBY_DESCRIPTION}"
62
64
  end
63
65
  end
64
66
  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
  }
@@ -99,18 +99,10 @@ module Gemirro
99
99
  #
100
100
  # @return [String]
101
101
  #
102
- def self.versions_file
103
- "specs.#{marshal_version}.gz"
104
- end
102
+ def versions_file
103
+ return unless @source
105
104
 
106
- ##
107
- # Returns the name of the file that contains an index
108
- # of all the prerelease versions.
109
- #
110
- # @return [String]
111
- #
112
- def self.prerelease_versions_file
113
- "prerelease_specs.#{marshal_version}.gz"
105
+ File.expand_path("#{URI.parse(@source.host).host.gsub('.', '_')}_versions", destination.to_s)
114
106
  end
115
107
 
116
108
  ##
@@ -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)
@@ -55,6 +55,8 @@ module Gemirro
55
55
  # @return [Array]
56
56
  #
57
57
  def versions_for(gem)
58
+ return [] unless @versions_file
59
+
58
60
  available = @versions_file.versions_for(gem.name)
59
61
  return [available.last] if gem.only_latest?
60
62
 
@@ -100,15 +102,10 @@ module Gemirro
100
102
  #
101
103
  def fetch_gem(gem, version)
102
104
  filename = gem.filename(version)
103
- satisfied = if gem.only_latest?
104
- true
105
- else
106
- gem.requirement.satisfied_by?(version)
107
- end
105
+ satisfied = gem.only_latest? || gem.requirement.satisfied_by?(version)
108
106
  name = gem.name
109
107
 
110
- if gem_exists?(filename) || ignore_gem?(name, version, gem.platform) ||
111
- !satisfied
108
+ if gem_exists?(filename) || ignore_gem?(name, version, gem.platform) || !satisfied
112
109
  Utils.logger.debug("Skipping #{filename}")
113
110
  return
114
111
  end