diff --git a/lib/tailwindcss/compressor.rb b/lib/tailwindcss/compressor.rb index f8c3889f..e8bb50b1 100644 --- a/lib/tailwindcss/compressor.rb +++ b/lib/tailwindcss/compressor.rb @@ -25,9 +25,8 @@ def call(input) end private + def files_with_class_names - Rails.root.glob("app/views/**/*.*") + - Rails.root.glob("app/helpers/**/*.rb") + - Rails.root.glob("app/javascript/**/*.js") + Rails.application.config.tailwind.files_with_class_names end end diff --git a/lib/tailwindcss/engine.rb b/lib/tailwindcss/engine.rb index 9329dbbd..a89ba032 100644 --- a/lib/tailwindcss/engine.rb +++ b/lib/tailwindcss/engine.rb @@ -2,6 +2,13 @@ module Tailwindcss class Engine < ::Rails::Engine + config.tailwind = ActiveSupport::OrderedOptions.new + config.tailwind.files_with_class_names = [] + + initializer "set files with class names" do + config.tailwind.files_with_class_names += Rails.root.glob("app/views/**/*.*") + Rails.root.glob("app/helpers/**/*.rb") + Rails.root.glob("app/javascript/**/*.js") + end + initializer "tailwindcss.compressor" do Sprockets.register_compressor "text/css", :purger, Tailwindcss::Compressor end diff --git a/lib/tasks/tailwindcss_tasks.rake b/lib/tasks/tailwindcss_tasks.rake index f568e76f..0194f171 100644 --- a/lib/tasks/tailwindcss_tasks.rake +++ b/lib/tasks/tailwindcss_tasks.rake @@ -5,7 +5,7 @@ namespace :tailwindcss do end desc "Show the list of class names being kept in Tailwind CSS" - task :keeping_class_names do + task keeping_class_names: :environment do puts Tailwindcss::Purger.extract_class_names_from(default_files_with_class_names) end @@ -16,7 +16,7 @@ namespace :tailwindcss do end def default_files_with_class_names - Rails.root.glob("app/views/**/*.*") + Rails.root.glob("app/helpers/**/*.rb") + Rails.application.config.tailwind.files_with_class_names end def tailwind_css diff --git a/test/compressor_test.rb b/test/compressor_test.rb new file mode 100644 index 00000000..3037315d --- /dev/null +++ b/test/compressor_test.rb @@ -0,0 +1,16 @@ +require "test_helper" + +class Tailwindcss::CompressorTest < ActiveSupport::TestCase + test "files_with_class_names on default configuration" do + default_files_with_class_names = Rails.root.glob("app/views/**/*.*") + Rails.root.glob("app/helpers/**/*.rb") + Rails.root.glob("app/javascript/**/*.js") + + assert_equal default_files_with_class_names, Tailwindcss::Compressor.new.instance_variable_get(:@options)[:files_with_class_names] + end + + test "files_with_class_names on custom configuration" do + files_with_class_names = Rails.application.config.tailwind.files_with_class_names + Rails.root.glob("app/custom_views/**/*.*") + with_files_with_class_names_configuration(files_with_class_names) do + assert_equal files_with_class_names, Tailwindcss::Compressor.new.instance_variable_get(:@options)[:files_with_class_names] + end + end +end diff --git a/test/dummy/Rakefile b/test/dummy/Rakefile new file mode 100644 index 00000000..d1baef06 --- /dev/null +++ b/test/dummy/Rakefile @@ -0,0 +1,3 @@ +require_relative "config/application" + +Rails.application.load_tasks diff --git a/test/dummy/app/assets/config/manifest.js b/test/dummy/app/assets/config/manifest.js new file mode 100644 index 00000000..59181933 --- /dev/null +++ b/test/dummy/app/assets/config/manifest.js @@ -0,0 +1,2 @@ +//= link_tree ../images +//= link_directory ../stylesheets .css diff --git a/test/dummy/app/assets/images/.keep b/test/dummy/app/assets/images/.keep new file mode 100644 index 00000000..e69de29b diff --git a/test/dummy/app/assets/stylesheets/application.css b/test/dummy/app/assets/stylesheets/application.css new file mode 100644 index 00000000..38fa2fb8 --- /dev/null +++ b/test/dummy/app/assets/stylesheets/application.css @@ -0,0 +1,4 @@ +/* + *= require_tree . + *= require_self + */ diff --git a/test/dummy/app/controllers/application_controller.rb b/test/dummy/app/controllers/application_controller.rb new file mode 100644 index 00000000..09705d12 --- /dev/null +++ b/test/dummy/app/controllers/application_controller.rb @@ -0,0 +1,2 @@ +class ApplicationController < ActionController::Base +end diff --git a/test/dummy/app/controllers/concerns/.keep b/test/dummy/app/controllers/concerns/.keep new file mode 100644 index 00000000..e69de29b diff --git a/test/dummy/app/controllers/posts_controller.rb b/test/dummy/app/controllers/posts_controller.rb new file mode 100644 index 00000000..f8917e7b --- /dev/null +++ b/test/dummy/app/controllers/posts_controller.rb @@ -0,0 +1,3 @@ +class PostsController < ApplicationController + def index; end +end diff --git a/test/dummy/app/custom_views/posts/index.html.erb b/test/dummy/app/custom_views/posts/index.html.erb new file mode 100644 index 00000000..b91d3cef --- /dev/null +++ b/test/dummy/app/custom_views/posts/index.html.erb @@ -0,0 +1 @@ +

Posts

diff --git a/test/dummy/app/helpers/application_helper.rb b/test/dummy/app/helpers/application_helper.rb new file mode 100644 index 00000000..de6be794 --- /dev/null +++ b/test/dummy/app/helpers/application_helper.rb @@ -0,0 +1,2 @@ +module ApplicationHelper +end diff --git a/test/dummy/app/javascript/packs/application.js b/test/dummy/app/javascript/packs/application.js new file mode 100644 index 00000000..9ae9f331 --- /dev/null +++ b/test/dummy/app/javascript/packs/application.js @@ -0,0 +1,3 @@ +//= require rails-ujs +//= require activestorage +//= require_tree . diff --git a/test/dummy/app/models/application_record.rb b/test/dummy/app/models/application_record.rb new file mode 100644 index 00000000..10a4cba8 --- /dev/null +++ b/test/dummy/app/models/application_record.rb @@ -0,0 +1,3 @@ +class ApplicationRecord < ActiveRecord::Base + self.abstract_class = true +end diff --git a/test/dummy/app/models/concerns/.keep b/test/dummy/app/models/concerns/.keep new file mode 100644 index 00000000..e69de29b diff --git a/test/dummy/app/views/layouts/application.html.erb b/test/dummy/app/views/layouts/application.html.erb new file mode 100644 index 00000000..991d86e1 --- /dev/null +++ b/test/dummy/app/views/layouts/application.html.erb @@ -0,0 +1,17 @@ + + + + Dummy + + <%= csrf_meta_tags %> + <%= csp_meta_tag %> + <%= stylesheet_link_tag "inter-font", "data-turbo-track": "reload" %> + <%= stylesheet_link_tag "tailwind", "data-turbo-track": "reload" %> + + <%= stylesheet_link_tag 'application', media: 'all' %> + + + + <%= yield %> + + diff --git a/test/dummy/bin/rails b/test/dummy/bin/rails new file mode 100755 index 00000000..6fb4e405 --- /dev/null +++ b/test/dummy/bin/rails @@ -0,0 +1,4 @@ +#!/usr/bin/env ruby +APP_PATH = File.expand_path('../config/application', __dir__) +require_relative "../config/boot" +require "rails/commands" diff --git a/test/dummy/bin/rake b/test/dummy/bin/rake new file mode 100755 index 00000000..4fbf10b9 --- /dev/null +++ b/test/dummy/bin/rake @@ -0,0 +1,4 @@ +#!/usr/bin/env ruby +require_relative "../config/boot" +require "rake" +Rake.application.run diff --git a/test/dummy/bin/setup b/test/dummy/bin/setup new file mode 100755 index 00000000..51a63ccb --- /dev/null +++ b/test/dummy/bin/setup @@ -0,0 +1,23 @@ +#!/usr/bin/env ruby +require "fileutils" + +APP_ROOT = File.expand_path('..', __dir__) + +def system!(*args) + system(*args) || abort("\n== Command #{args} failed ==") +end + +FileUtils.chdir APP_ROOT do + puts '== Installing dependencies ==' + system! 'gem install bundler --conservative' + system('bundle check') || system!('bundle install') + + puts "\n== Preparing database ==" + system! 'bin/rails db:prepare' + + puts "\n== Removing old logs and tempfiles ==" + system! 'bin/rails log:clear tmp:clear' + + puts "\n== Restarting application server ==" + system! 'bin/rails restart' +end diff --git a/test/dummy/config.ru b/test/dummy/config.ru new file mode 100644 index 00000000..5c59c6f5 --- /dev/null +++ b/test/dummy/config.ru @@ -0,0 +1,4 @@ +require_relative "config/environment" + +run Rails.application +Rails.application.load_server diff --git a/test/dummy/config/application.rb b/test/dummy/config/application.rb new file mode 100644 index 00000000..ba4088d7 --- /dev/null +++ b/test/dummy/config/application.rb @@ -0,0 +1,20 @@ +require_relative "boot" + +require "rails" +require "active_model/railtie" +require "active_job/railtie" +require "active_record/railtie" +require "action_controller/railtie" +require "action_view/railtie" +require "sprockets/railtie" + +Bundler.require(*Rails.groups) +require "tailwindcss-rails" + +module Dummy + class Application < Rails::Application + config.load_defaults Rails::VERSION::STRING.to_f + + config.paths["app/views"].unshift("#{Rails.root}/app/custom_views") + end +end diff --git a/test/dummy/config/boot.rb b/test/dummy/config/boot.rb new file mode 100644 index 00000000..7d731bac --- /dev/null +++ b/test/dummy/config/boot.rb @@ -0,0 +1,4 @@ +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/database.yml b/test/dummy/config/database.yml new file mode 100644 index 00000000..c52c94d7 --- /dev/null +++ b/test/dummy/config/database.yml @@ -0,0 +1,16 @@ +default: &default + adapter: sqlite3 + pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %> + timeout: 5000 + +development: + <<: *default + database: db/development.sqlite3 + +test: + <<: *default + database: db/test.sqlite3 + +production: + <<: *default + database: db/production.sqlite3 diff --git a/test/dummy/config/environment.rb b/test/dummy/config/environment.rb new file mode 100644 index 00000000..73a3979b --- /dev/null +++ b/test/dummy/config/environment.rb @@ -0,0 +1,3 @@ +require_relative "application" + +Rails.application.initialize! diff --git a/test/dummy/config/environments/development.rb b/test/dummy/config/environments/development.rb new file mode 100644 index 00000000..32c900e6 --- /dev/null +++ b/test/dummy/config/environments/development.rb @@ -0,0 +1,37 @@ +require "active_support/core_ext/integer/time" + +Rails.application.configure do + config.cache_classes = false + + config.eager_load = false + + config.consider_all_requests_local = true + + if Rails.root.join('tmp', 'caching-dev.txt').exist? + config.action_controller.perform_caching = true + config.action_controller.enable_fragment_cache_logging = true + + config.cache_store = :memory_store + config.public_file_server.headers = { + 'Cache-Control' => "public, max-age=#{2.days.to_i}" + } + else + config.action_controller.perform_caching = false + + config.cache_store = :null_store + end + + config.active_support.deprecation = :log + + config.active_support.disallowed_deprecation = :raise + + config.active_support.disallowed_deprecation_warnings = [] + + config.active_record.migration_error = :page_load + + config.active_record.verbose_query_logs = true + + config.assets.debug = true + + config.assets.quiet = true +end diff --git a/test/dummy/config/environments/production.rb b/test/dummy/config/environments/production.rb new file mode 100644 index 00000000..9e71eae6 --- /dev/null +++ b/test/dummy/config/environments/production.rb @@ -0,0 +1,38 @@ +require "active_support/core_ext/integer/time" + +Rails.application.configure do + config.cache_classes = true + + config.eager_load = true + + config.consider_all_requests_local = false + config.action_controller.perform_caching = true + + config.public_file_server.enabled = ENV['RAILS_SERVE_STATIC_FILES'].present? + + config.assets.css_compressor = :purger + + config.assets.compile = false + + config.log_level = :info + + config.log_tags = [ :request_id ] + + config.i18n.fallbacks = true + + config.active_support.deprecation = :notify + + config.active_support.disallowed_deprecation = :log + + config.active_support.disallowed_deprecation_warnings = [] + + config.log_formatter = ::Logger::Formatter.new + + if ENV["RAILS_LOG_TO_STDOUT"].present? + logger = ActiveSupport::Logger.new(STDOUT) + logger.formatter = config.log_formatter + config.logger = ActiveSupport::TaggedLogging.new(logger) + end + + config.active_record.dump_schema_after_migration = false +end diff --git a/test/dummy/config/environments/test.rb b/test/dummy/config/environments/test.rb new file mode 100644 index 00000000..1429ba89 --- /dev/null +++ b/test/dummy/config/environments/test.rb @@ -0,0 +1,26 @@ +require "active_support/core_ext/integer/time" + +Rails.application.configure do + config.cache_classes = true + + config.eager_load = false + + config.public_file_server.enabled = true + config.public_file_server.headers = { + 'Cache-Control' => "public, max-age=#{1.hour.to_i}" + } + + config.consider_all_requests_local = true + config.action_controller.perform_caching = false + config.cache_store = :null_store + + config.action_dispatch.show_exceptions = false + + config.action_controller.allow_forgery_protection = false + + config.active_support.deprecation = :stderr + + config.active_support.disallowed_deprecation = :raise + + config.active_support.disallowed_deprecation_warnings = [] +end diff --git a/test/dummy/config/initializers/assets.rb b/test/dummy/config/initializers/assets.rb new file mode 100644 index 00000000..0d6dbb27 --- /dev/null +++ b/test/dummy/config/initializers/assets.rb @@ -0,0 +1 @@ +Rails.application.config.assets.version = '1.0' diff --git a/test/dummy/config/initializers/backtrace_silencers.rb b/test/dummy/config/initializers/backtrace_silencers.rb new file mode 100644 index 00000000..ec1faa68 --- /dev/null +++ b/test/dummy/config/initializers/backtrace_silencers.rb @@ -0,0 +1 @@ +Rails.backtrace_cleaner.remove_silencers! if ENV["BACKTRACE"] diff --git a/test/dummy/config/initializers/cookies_serializer.rb b/test/dummy/config/initializers/cookies_serializer.rb new file mode 100644 index 00000000..c0d0a025 --- /dev/null +++ b/test/dummy/config/initializers/cookies_serializer.rb @@ -0,0 +1 @@ +Rails.application.config.action_dispatch.cookies_serializer = :json diff --git a/test/dummy/config/initializers/filter_parameter_logging.rb b/test/dummy/config/initializers/filter_parameter_logging.rb new file mode 100644 index 00000000..61387142 --- /dev/null +++ b/test/dummy/config/initializers/filter_parameter_logging.rb @@ -0,0 +1,3 @@ +Rails.application.config.filter_parameters += [ + :passw, :secret, :token, :_key, :crypt, :salt, :certificate, :otp, :ssn +] diff --git a/test/dummy/config/initializers/wrap_parameters.rb b/test/dummy/config/initializers/wrap_parameters.rb new file mode 100644 index 00000000..8b64a784 --- /dev/null +++ b/test/dummy/config/initializers/wrap_parameters.rb @@ -0,0 +1,3 @@ +ActiveSupport.on_load(:action_controller) do + wrap_parameters format: [:json] +end diff --git a/test/dummy/config/puma.rb b/test/dummy/config/puma.rb new file mode 100644 index 00000000..359cb881 --- /dev/null +++ b/test/dummy/config/puma.rb @@ -0,0 +1,13 @@ +max_threads_count = ENV.fetch("RAILS_MAX_THREADS") { 5 } +min_threads_count = ENV.fetch("RAILS_MIN_THREADS") { max_threads_count } +threads min_threads_count, max_threads_count + +worker_timeout 3600 if ENV.fetch("RAILS_ENV", "development") == "development" + +port ENV.fetch("PORT") { 3000 } + +environment ENV.fetch("RAILS_ENV") { "development" } + +pidfile ENV.fetch("PIDFILE") { "tmp/pids/server.pid" } + +plugin :tmp_restart diff --git a/test/dummy/config/routes.rb b/test/dummy/config/routes.rb new file mode 100644 index 00000000..940340f8 --- /dev/null +++ b/test/dummy/config/routes.rb @@ -0,0 +1,3 @@ +Rails.application.routes.draw do + get 'posts', to: 'posts#index' +end diff --git a/test/dummy/config/storage.yml b/test/dummy/config/storage.yml new file mode 100644 index 00000000..695f17bd --- /dev/null +++ b/test/dummy/config/storage.yml @@ -0,0 +1,7 @@ +test: + service: Disk + root: <%= Rails.root.join("tmp/storage") %> + +local: + service: Disk + root: <%= Rails.root.join("storage") %> diff --git a/test/dummy/lib/assets/.keep b/test/dummy/lib/assets/.keep new file mode 100644 index 00000000..e69de29b diff --git a/test/dummy/log/.keep b/test/dummy/log/.keep new file mode 100644 index 00000000..e69de29b diff --git a/test/dummy/public/404.html b/test/dummy/public/404.html new file mode 100644 index 00000000..ea1fe98b --- /dev/null +++ b/test/dummy/public/404.html @@ -0,0 +1,8 @@ + + + + 404 + + + + diff --git a/test/dummy/public/422.html b/test/dummy/public/422.html new file mode 100644 index 00000000..c7a94c85 --- /dev/null +++ b/test/dummy/public/422.html @@ -0,0 +1,8 @@ + + + + 422 + + + + diff --git a/test/dummy/public/500.html b/test/dummy/public/500.html new file mode 100644 index 00000000..f605e6e4 --- /dev/null +++ b/test/dummy/public/500.html @@ -0,0 +1,8 @@ + + + + 500 + + + + diff --git a/test/test_helper.rb b/test/test_helper.rb index 787ccb8f..8b189a90 100644 --- a/test/test_helper.rb +++ b/test/test_helper.rb @@ -1,6 +1,8 @@ -# Configure Rails Environment ENV["RAILS_ENV"] = "test" +require_relative "dummy/config/environment" +ActiveRecord::Migrator.migrations_paths = [File.expand_path("../test/dummy/db/migrate", __dir__)] + require "rails" require "rails/test_help" require "debug" @@ -12,3 +14,10 @@ class ActiveSupport::TestCase self.file_fixture_path = File.expand_path("fixtures/files", __dir__) end + +def with_files_with_class_names_configuration(new_value) + old_value = Rails.application.config.tailwind.files_with_class_names + Rails.application.config.tailwind.files_with_class_names = new_value + yield + Rails.application.config.tailwind.files_with_class_names = old_value +end