diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 8aa77e0..cdf1be4 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -10,6 +10,8 @@ jobs: backend: runs-on: ubuntu-latest + name: "Ruby ${{ matrix.ruby }} - Rails ${{ matrix.rails }}" + services: redis: image: redis @@ -18,7 +20,11 @@ jobs: strategy: matrix: - ruby: ['2.6', '2.7', '3.0', '3.1'] + ruby: ['3.0', '3.1', '3.2', '3.3'] + rails: ['6.1', '7.0', '7.1'] + + env: + BUNDLE_GEMFILE: ${{ github.workspace }}/gemfiles/rails_${{ matrix.rails }}.gemfile steps: - uses: actions/checkout@v3 @@ -42,9 +48,12 @@ jobs: - name: Build JS app run: bash build_client_app.sh - - name: Tests + - name: Tests (no Rails) run: bundle exec rake test + - name: Tests (Railtie) + run: bundle exec rake test TEST=test/logster/test_railtie.rb + frontend: runs-on: ubuntu-latest diff --git a/CHANGELOG.md b/CHANGELOG.md index 0840f55..3ea9579 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,10 @@ # CHANGELOG -- 2024002-19: 2.18.1 +- 2024-02-28: 2.19.0 + + - FIX: Add compatibility with Rails 7.1+ + +- 2024-02-19: 2.18.1 - UX: backlink in dark mode has a dark background diff --git a/Gemfile b/Gemfile index 8248e0c..177c53b 100644 --- a/Gemfile +++ b/Gemfile @@ -4,3 +4,7 @@ source "https://rubygems.org" # Specify your gem's dependencies in rack-log-viewer.gemspec gemspec + +group :development, :test do + gem "rails", ">= 6.1" +end diff --git a/Rakefile b/Rakefile index 408d2f4..ed5b072 100644 --- a/Rakefile +++ b/Rakefile @@ -4,7 +4,7 @@ require "bundler/gem_tasks" require "rake/testtask" Rake::TestTask.new do |t| - t.pattern = "test/**/test_*.rb" + t.test_files = FileList["test/**/test_*"].exclude(%r{test/logster/test_railtie\.rb}) end task(default: :test) @@ -12,7 +12,10 @@ task(default: :test) desc "Starts Sinatra and Ember servers" task :client_dev do begin - pid = spawn("cd website && LOGSTER_ENV=development BUNDLE_GEMFILE=Gemfile bundle exec rackup --host 0.0.0.0") + pid = + spawn( + "cd website && LOGSTER_ENV=development BUNDLE_GEMFILE=Gemfile bundle exec rackup --host 0.0.0.0", + ) pid2 = spawn("cd client-app && npx ember s --proxy http://localhost:9292") Process.wait pid Process.wait pid2 diff --git a/gemfiles/rails_6.1.gemfile b/gemfiles/rails_6.1.gemfile new file mode 100644 index 0000000..03d742b --- /dev/null +++ b/gemfiles/rails_6.1.gemfile @@ -0,0 +1,9 @@ +# frozen_string_literal: true + +source "https://rubygems.org" + +group :test do + gem "rails", "~> 6.1.0" +end + +gemspec path: "../" diff --git a/gemfiles/rails_7.0.gemfile b/gemfiles/rails_7.0.gemfile new file mode 100644 index 0000000..93a3078 --- /dev/null +++ b/gemfiles/rails_7.0.gemfile @@ -0,0 +1,9 @@ +# frozen_string_literal: true + +source "https://rubygems.org" + +group :test do + gem "rails", "~> 7.0.0" +end + +gemspec path: "../" diff --git a/gemfiles/rails_7.1.gemfile b/gemfiles/rails_7.1.gemfile new file mode 100644 index 0000000..4e066ed --- /dev/null +++ b/gemfiles/rails_7.1.gemfile @@ -0,0 +1,9 @@ +# frozen_string_literal: true + +source "https://rubygems.org" + +group :test do + gem "rails", "~> 7.1.0" +end + +gemspec path: "../" diff --git a/lib/logster.rb b/lib/logster.rb index acc0e7d..fd24936 100644 --- a/lib/logster.rb +++ b/lib/logster.rb @@ -57,4 +57,4 @@ def self.set_environments(envs) # check logster/configuration.rb for config options # Logster.config.environments << :staging -require "logster/rails/railtie" if defined?(::Rails) && ::Rails::VERSION::MAJOR.to_i >= 3 +require "logster/rails/railtie" if defined?(::Rails::VERSION) && ::Rails::VERSION::MAJOR.to_i >= 3 diff --git a/lib/logster/configuration.rb b/lib/logster/configuration.rb index 83eb8db..32b3251 100644 --- a/lib/logster/configuration.rb +++ b/lib/logster/configuration.rb @@ -46,9 +46,7 @@ def initialize @allow_grouping = false - if defined?(::Rails) && defined?(::Rails.env) && ::Rails.env.production? - @allow_grouping = true - end + @allow_grouping = true if defined?(::Rails.env) && ::Rails.env.production? end def subdirectory diff --git a/lib/logster/rails/railtie.rb b/lib/logster/rails/railtie.rb index 3b88c41..7de2a99 100644 --- a/lib/logster/rails/railtie.rb +++ b/lib/logster/rails/railtie.rb @@ -5,32 +5,39 @@ module Logster::Rails class Engine < Rails::Engine end - def self.set_logger(config) - return unless Logster.config.environments.include?(Rails.env.to_sym) + class << self + def set_logger(config) + return unless Logster.config.environments.include?(Rails.env.to_sym) - require "logster/middleware/debug_exceptions" - require "logster/middleware/reporter" + require "logster/middleware/debug_exceptions" + require "logster/middleware/reporter" - store = Logster.store ||= Logster::RedisStore.new - store.level = Logger::Severity::WARN if Rails.env.production? + store = Logster.store ||= Logster::RedisStore.new + store.level = Logger::Severity::WARN if Rails.env.production? - if Rails.env.development? - require "logster/defer_logger" - logger = Logster::DeferLogger.new(store) - else - logger = Logster::Logger.new(store) - end + if Rails.env.development? + require "logster/defer_logger" + logger = Logster::DeferLogger.new(store) + else + logger = Logster::Logger.new(store) + end - logger.chain(::Rails.logger) - logger.level = ::Rails.logger.level + logger.level = ::Rails.logger.level - Logster.logger = ::Rails.logger = config.logger = logger - end + Logster.logger = config.logger = logger - def self.initialize!(app) - return unless Logster.config.environments.include?(Rails.env.to_sym) + if rails_71? + ::Rails.logger.broadcast_to(logger) + else + logger.chain(::Rails.logger) + ::Rails.logger = logger + end + end + + def initialize!(app) + return unless Logster.config.environments.include?(Rails.env.to_sym) + return unless logster_enabled? - if Logster::Logger === Rails.logger if Logster.config.enable_js_error_reporting app.middleware.insert_before ActionDispatch::ShowExceptions, Logster::Middleware::Reporter end @@ -52,6 +59,17 @@ def self.initialize!(app) Logster.config.application_version = git_version.strip if git_version.present? end end + + private + + def logster_enabled? + return ::Rails.logger == Logster.logger unless rails_71? + ::Rails.logger.broadcasts.include?(Logster.logger) + end + + def rails_71? + ::Rails.version >= "7.1" + end end class Railtie < ::Rails::Railtie diff --git a/lib/logster/version.rb b/lib/logster/version.rb index 8a20b98..b31fa8b 100644 --- a/lib/logster/version.rb +++ b/lib/logster/version.rb @@ -1,5 +1,5 @@ # frozen_string_literal: true module Logster - VERSION = "2.18.1" + VERSION = "2.19.0" end diff --git a/logster.gemspec b/logster.gemspec index e380f6d..a0e81a4 100644 --- a/logster.gemspec +++ b/logster.gemspec @@ -39,4 +39,5 @@ Gem::Specification.new do |spec| spec.add_development_dependency "byebug", "~> 11.1.0" spec.add_development_dependency "rubocop-discourse", "~> 2.4.1" spec.add_development_dependency "syntax_tree" + spec.add_development_dependency "sqlite3" end diff --git a/test/dummy/config/application.rb b/test/dummy/config/application.rb new file mode 100644 index 0000000..108bfb5 --- /dev/null +++ b/test/dummy/config/application.rb @@ -0,0 +1,31 @@ +# frozen_string_literal: true +require_relative "boot" + +require "active_record/railtie" +require "action_controller/railtie" + +# Require the gems listed in Gemfile, including any gems +# you've limited to :test, :development, or :production. +Bundler.require(*Rails.groups) + +require "logster" + +module Dummy + class Application < Rails::Application + config.load_defaults Rails::VERSION::STRING.to_f + + # For compatibility with applications that use this config + config.action_controller.include_all_helpers = false + + config.eager_load = false + + # Configuration for the application, engines, and railties goes here. + # + # These settings can be overridden in specific environments using the files + # in config/environments, which are processed later. + # + # config.time_zone = "Central Time (US & Canada)" + # config.eager_load_paths << Rails.root.join("extras") + Logster.set_environments([Rails.env.to_sym]) + end +end diff --git a/test/dummy/config/boot.rb b/test/dummy/config/boot.rb new file mode 100644 index 0000000..7df8dcb --- /dev/null +++ b/test/dummy/config/boot.rb @@ -0,0 +1,6 @@ +# frozen_string_literal: true +# Set up gems listed in the Gemfile. +ENV["BUNDLE_GEMFILE"] ||= File.expand_path("../../../Gemfile", __dir__) + +require "bundler/setup" if File.exist?(ENV["BUNDLE_GEMFILE"]) +$LOAD_PATH.unshift File.expand_path("../../../lib", __dir__) diff --git a/test/dummy/config/environment.rb b/test/dummy/config/environment.rb new file mode 100644 index 0000000..a21c0c5 --- /dev/null +++ b/test/dummy/config/environment.rb @@ -0,0 +1,6 @@ +# frozen_string_literal: true +# Load the Rails application. +require_relative "application" + +# Initialize the Rails application. +Rails.application.initialize! diff --git a/test/logster/test_railtie.rb b/test/logster/test_railtie.rb new file mode 100644 index 0000000..352143c --- /dev/null +++ b/test/logster/test_railtie.rb @@ -0,0 +1,21 @@ +# frozen_string_literal: true + +ENV["RAILS_ENV"] = "test" + +require "redis" +require_relative "../dummy/config/environment" +ActiveRecord::Migrator.migrations_paths = [File.expand_path("dummy/db/migrate", __dir__)] + +require_relative "../test_helper" + +class TestRailtie < Minitest::Test + def test_sets_logger + refute_nil Logster.logger + + if Rails.version >= "7.1" + assert_includes Rails.logger.broadcasts, Logster.logger + else + assert_equal Rails.logger, Logster.logger + end + end +end