Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Enable zeitwerk autoloader #2674

Merged
merged 2 commits into from Mar 21, 2021
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
2 changes: 2 additions & 0 deletions config/application.rb
Expand Up @@ -25,6 +25,8 @@ class Application < Rails::Application
# Initialize configuration defaults for originally generated Rails version.
config.load_defaults 5.2

config.autoloader = :zeitwerk

# Settings in config/environments/* take precedence over those specified here.
# Application configuration can go into files in config/initializers
# -- all .rb files in that directory are automatically loaded after loading
Expand Down
4 changes: 2 additions & 2 deletions config/environments/development.rb
@@ -1,4 +1,4 @@
require_relative "../../lib/middleware/hostess"
require_relative "../../lib/gemcutter/middleware/hostess"
require "active_support/core_ext/integer/time"

Rails.application.configure do
Expand Down Expand Up @@ -66,7 +66,7 @@
# Raises error for missing translations.
# config.i18n.raise_on_missing_translations = true

config.middleware.use Hostess
config.middleware.use Gemcutter::Middleware::Hostess
# Annotate rendered view with file names.
# config.action_view.annotate_rendered_view_with_filenames = true

Expand Down
4 changes: 2 additions & 2 deletions config/environments/production.rb
@@ -1,5 +1,5 @@
require Rails.root.join("config", "secret") if Rails.root.join("config", "secret.rb").file?
require_relative "../../lib/middleware/redirector"
require_relative "../../lib/gemcutter/middleware/redirector"
require "active_support/core_ext/integer/time"

Rails.application.configure do
Expand Down Expand Up @@ -120,7 +120,7 @@
compression_min_size: 524_288
}

config.middleware.use Redirector
config.middleware.use Gemcutter::Middleware::Redirector

# Inserts middleware to perform automatic connection switching.
# The `database_selector` hash is used to pass options to the DatabaseSelector
Expand Down
4 changes: 2 additions & 2 deletions config/environments/staging.rb
@@ -1,5 +1,5 @@
require Rails.root.join("config", "secret") if Rails.root.join("config", "secret.rb").file?
require_relative "../../lib/middleware/redirector"
require_relative "../../lib/gemcutter/middleware/redirector"

Rails.application.configure do
# Settings specified here will take precedence over those in config/application.rb.
Expand Down Expand Up @@ -117,5 +117,5 @@
compression_min_size: 524_288
}

config.middleware.use Redirector
config.middleware.use Gemcutter::Middleware::Redirector
end
2 changes: 1 addition & 1 deletion config/environments/test.rb
@@ -1,4 +1,4 @@
require_relative "../../lib/middleware/redirector"
require_relative "../../lib/gemcutter/middleware/redirector"
require "active_support/core_ext/integer/time"

# The test environment is used exclusively to run your application's
Expand Down
6 changes: 6 additions & 0 deletions config/initializers/zeitwerk.rb
@@ -0,0 +1,6 @@
# ignore rake tasks because don't need to autoload them
Rails.autoloaders.main.ignore(Rails.root.join("lib/tasks"))

# does not require autoload. ignore SqsWorker to supress following:
# expected file lib/shoryuken/sqs_worker.rb to define constant Shoryuken::SqsWorker
Rails.autoloaders.main.ignore(Rails.root.join("lib/shoryuken"))
51 changes: 51 additions & 0 deletions lib/gemcutter/middleware/hostess.rb
@@ -0,0 +1,51 @@
module Gemcutter::Middleware
class Hostess < Rack::Static
def initialize(app, options = {})
options[:root] = RubygemFs.instance.base_dir

options[:urls] = %w[
/specs.4.8.gz
/latest_specs.4.8.gz
/prerelease_specs.4.8.gz
/quick/rubygems-update-1.3.6.gemspec.rz
/yaml.Z
/yaml.z
/Marshal.4.8.Z
/quick/index.rz
/quick/latest_index.rz
/yaml
/Marshal.4.8
/specs.4.8
/latest_specs.4.8
/prerelease_specs.4.8
/quick/index
/quick/latest_index
]

super(app, options)
end

def can_serve(path)
super(path) || gem_download_path(path) || path =~ %r{/quick/Marshal\.4\.8/.*\.gemspec.rz}
end

def gem_download_path(path)
Regexp.last_match(1) if path =~ %r{/gems/(.*)\.gem}
end

def call(env)
path = env["PATH_INFO"]

return [302, { "Location" => "/gems/#{Regexp.last_match(1)}.gem" }, []] if path =~ %r{/downloads/(.*)\.gem}

download_path = gem_download_path(path)
name = Version.rubygem_name_for(download_path) if download_path
if name
GemDownload.transaction do
GemDownload.bulk_update([[download_path, 1]])
end
end
super
end
end
end
28 changes: 28 additions & 0 deletions lib/gemcutter/middleware/redirector.rb
@@ -0,0 +1,28 @@
module Gemcutter::Middleware
class Redirector
def initialize(app)
@app = app
end

def call(env)
request = Rack::Request.new(env)

allowed_hosts = [Gemcutter::HOST, "index.rubygems.org", "fastly.rubygems.org", "bundler.rubygems.org"]

if !allowed_hosts.include?(request.host) && request.path !~ %r{^/api|^/internal} && request.host !~ /docs/
fake_request = Rack::Request.new(env.merge("HTTP_HOST" => Gemcutter::HOST))
redirect_to(fake_request.url)
elsif request.path =~ %r{^/(book|chapter|export|read|shelf|syndicate)} && request.host !~ /docs/
redirect_to("https://docs.rubygems.org#{request.path}")
else
@app.call(env)
end
end

private

def redirect_to(url)
[301, { "Location" => url }, []]
end
end
end
49 changes: 0 additions & 49 deletions lib/middleware/hostess.rb

This file was deleted.

26 changes: 0 additions & 26 deletions lib/middleware/redirector.rb

This file was deleted.

4 changes: 2 additions & 2 deletions test/unit/hostess_test.rb
@@ -1,5 +1,5 @@
require "test_helper"
require_relative "../../lib/middleware/hostess"
require_relative "../../lib/gemcutter/middleware/hostess"

class HostessTest < ActiveSupport::TestCase
include Rack::Test::Methods
Expand All @@ -9,7 +9,7 @@ class HostessTest < ActiveSupport::TestCase
end

def app
Hostess.new(-> { [200, {}, ""] })
Gemcutter::Middleware::Hostess.new(-> { [200, {}, ""] })
end

def touch(path)
Expand Down
2 changes: 1 addition & 1 deletion test/unit/redirector_test.rb
Expand Up @@ -5,7 +5,7 @@ class RedirectorTest < ActiveSupport::TestCase

def app
Rack::Builder.new do
use Redirector
use Gemcutter::Middleware::Redirector
run ->(_) { [200, { "Content-Type" => "text/html" }, []] }
end
end
Expand Down