From b708de32f3667a65bd2a549983cd05671e9e690a Mon Sep 17 00:00:00 2001 From: Samuel Williams Date: Tue, 25 Jul 2023 15:16:43 +1200 Subject: [PATCH] Support Rack 3. (#586) --- .github/workflows/build.yml | 1 + Appraisals | 4 ++++ gemfiles/rack_2.gemfile | 1 + gemfiles/rack_3.gemfile | 7 +++++++ lib/rack/attack/cache.rb | 10 ++++++++-- lib/rack/attack/railtie.rb | 6 ++++++ rack-attack.gemspec | 4 ++-- spec/acceptance/rails_middleware_spec.rb | 2 +- spec/rack_attack_instrumentation_spec.rb | 1 + spec/rack_attack_spec.rb | 4 ++++ spec/spec_helper.rb | 7 ++++--- 11 files changed, 39 insertions(+), 8 deletions(-) create mode 100644 gemfiles/rack_3.gemfile diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index b4a41ae4..18e768ae 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -23,6 +23,7 @@ jobs: - 2.6.10 - 2.5.8 gemfile: + - rack_3 - rack_2 - rack_1 - rails_7_0 diff --git a/Appraisals b/Appraisals index 14727233..2d270527 100644 --- a/Appraisals +++ b/Appraisals @@ -1,5 +1,9 @@ # frozen_string_literal: true +appraise "rack_3" do + gem "rack", "~> 3.0" +end + appraise "rack_2" do gem "rack", "~> 2.0" end diff --git a/gemfiles/rack_2.gemfile b/gemfiles/rack_2.gemfile index 964e087d..41b64ab4 100644 --- a/gemfiles/rack_2.gemfile +++ b/gemfiles/rack_2.gemfile @@ -3,5 +3,6 @@ source "https://rubygems.org" gem "rack", "~> 2.0" +gem "railties" gemspec path: "../" diff --git a/gemfiles/rack_3.gemfile b/gemfiles/rack_3.gemfile new file mode 100644 index 00000000..24e3a766 --- /dev/null +++ b/gemfiles/rack_3.gemfile @@ -0,0 +1,7 @@ +# This file was generated by Appraisal + +source "https://rubygems.org" + +gem "rack", "~> 3.0" + +gemspec path: "../" diff --git a/lib/rack/attack/cache.rb b/lib/rack/attack/cache.rb index e3fb6386..ecbd3368 100644 --- a/lib/rack/attack/cache.rb +++ b/lib/rack/attack/cache.rb @@ -6,8 +6,14 @@ class Cache attr_accessor :prefix attr_reader :last_epoch_time - def initialize - self.store = ::Rails.cache if defined?(::Rails.cache) + def self.default_store + if Object.const_defined?(:Rails) && Rails.respond_to?(:cache) + ::Rails.cache + end + end + + def initialize(store: self.class.default_store) + self.store = store @prefix = 'rack::attack' end diff --git a/lib/rack/attack/railtie.rb b/lib/rack/attack/railtie.rb index 234e1267..9521493b 100644 --- a/lib/rack/attack/railtie.rb +++ b/lib/rack/attack/railtie.rb @@ -1,5 +1,11 @@ # frozen_string_literal: true +begin + require 'rails/railtie' +rescue LoadError + return +end + module Rack class Attack class Railtie < ::Rails::Railtie diff --git a/rack-attack.gemspec b/rack-attack.gemspec index 4cbcd51c..25849538 100644 --- a/rack-attack.gemspec +++ b/rack-attack.gemspec @@ -29,7 +29,7 @@ Gem::Specification.new do |s| s.required_ruby_version = '>= 2.4' - s.add_runtime_dependency 'rack', ">= 1.0", "< 3" + s.add_runtime_dependency 'rack', ">= 1.0", "< 4" s.add_development_dependency 'appraisal', '~> 2.2' s.add_development_dependency "bundler", ">= 1.17", "< 3.0" @@ -46,5 +46,5 @@ Gem::Specification.new do |s| s.add_development_dependency 'byebug', '~> 11.0' end - s.add_development_dependency 'railties', '>= 4.2', '< 7.1' + s.add_development_dependency "activesupport" end diff --git a/spec/acceptance/rails_middleware_spec.rb b/spec/acceptance/rails_middleware_spec.rb index 0e14e895..31dc6209 100644 --- a/spec/acceptance/rails_middleware_spec.rb +++ b/spec/acceptance/rails_middleware_spec.rb @@ -2,7 +2,7 @@ require_relative "../spec_helper" -if defined?(Rails) +if defined?(Rails::Application) describe "Middleware for Rails" do before do @app = Class.new(Rails::Application) do diff --git a/spec/rack_attack_instrumentation_spec.rb b/spec/rack_attack_instrumentation_spec.rb index a8b4527f..111ad148 100644 --- a/spec/rack_attack_instrumentation_spec.rb +++ b/spec/rack_attack_instrumentation_spec.rb @@ -1,6 +1,7 @@ # frozen_string_literal: true require_relative "spec_helper" +require 'active_support' # ActiveSupport::Subscribers added in ~> 4.0.2.0 if ActiveSupport::VERSION::MAJOR > 3 diff --git a/spec/rack_attack_spec.rb b/spec/rack_attack_spec.rb index c8358352..40936017 100644 --- a/spec/rack_attack_spec.rb +++ b/spec/rack_attack_spec.rb @@ -11,6 +11,10 @@ end it 'blocks requests with trailing slash' do + if Rack::Attack::PathNormalizer == Rack::Attack::FallbackPathNormalizer + skip "Normalization is only present on Rails" + end + get '/foo/' _(last_response.status).must_equal 403 end diff --git a/spec/spec_helper.rb b/spec/spec_helper.rb index 10f856bf..ef715339 100644 --- a/spec/spec_helper.rb +++ b/spec/spec_helper.rb @@ -5,8 +5,7 @@ require "minitest/autorun" require "minitest/pride" require "rack/test" -require "rails" - +require "active_support" require "rack/attack" if RUBY_ENGINE == "ruby" @@ -29,7 +28,9 @@ class MiniTest::Spec include Rack::Test::Methods before do - Rails.cache = nil + if Object.const_defined?(:Rails) && Rails.respond_to?(:cache) + Rails.cache.clear + end end after do