diff --git a/Gemfile.lock b/Gemfile.lock
index 246246db..0e8ec73d 100644
--- a/Gemfile.lock
+++ b/Gemfile.lock
@@ -21,6 +21,7 @@ PATH
captive-authentication (= 0.2.8)
captive-theme (= 0.2.8)
captive-theme (0.2.8)
+ formtastic (~> 3.1, >= 3.1.4)
GEM
remote: https://rubygems.org/
@@ -132,6 +133,8 @@ GEM
factory_bot_rails (6.2.0)
factory_bot (~> 6.2.0)
railties (>= 5.0.0)
+ formtastic (3.1.5)
+ actionpack (>= 3.2.13)
globalid (1.2.1)
activesupport (>= 6.1)
hashdiff (1.0.1)
diff --git a/captive-crash-reporter/app/controllers/concerns/sentry_context_concern.rb b/captive-crash-reporter/app/controllers/concerns/sentry_context_concern.rb
index 40e2279a..b4fa2d50 100644
--- a/captive-crash-reporter/app/controllers/concerns/sentry_context_concern.rb
+++ b/captive-crash-reporter/app/controllers/concerns/sentry_context_concern.rb
@@ -27,7 +27,7 @@ def set_params_on_sentry_context
return if params.blank?
# utilisation de `#to_unsafe_hash` car il faut transformer l'objet unpermitted params en hash
- Sentry.set_context('params', params.to_unsafe_hash)
+ Sentry.set_context("params", params.to_unsafe_hash)
end
end
end
diff --git a/captive-crash-reporter/config/initializers/sentry.rb b/captive-crash-reporter/config/initializers/sentry.rb
index 923b2d92..96a92ac1 100644
--- a/captive-crash-reporter/config/initializers/sentry.rb
+++ b/captive-crash-reporter/config/initializers/sentry.rb
@@ -1,4 +1,4 @@
-sentry_dsn = ENV.fetch("SENTRY_DSN", nil)
+sentry_dsn = ENV.fetch("SENTRY_DSN", nil)
if sentry_dsn
Sentry.init do |config|
diff --git a/captive-theme/.rspec b/captive-theme/.rspec
new file mode 100644
index 00000000..c99d2e73
--- /dev/null
+++ b/captive-theme/.rspec
@@ -0,0 +1 @@
+--require spec_helper
diff --git a/captive-theme/Rakefile b/captive-theme/Rakefile
index 9a7fd8d7..624ead39 100644
--- a/captive-theme/Rakefile
+++ b/captive-theme/Rakefile
@@ -1,7 +1,7 @@
# frozen_string_literal: true
-require "bundler/gem_tasks"
-require "rspec/core/rake_task"
+APP_RAKEFILE = File.expand_path("spec/dummy/Rakefile", __dir__)
+load "rails/tasks/engine.rake"
RSpec::Core::RakeTask.new(:spec)
diff --git a/captive-theme/app/assets/stylesheets/captive-theme/_variables.scss b/captive-theme/app/assets/stylesheets/captive-theme/_variables.scss
index d0765871..aad62437 100644
--- a/captive-theme/app/assets/stylesheets/captive-theme/_variables.scss
+++ b/captive-theme/app/assets/stylesheets/captive-theme/_variables.scss
@@ -122,18 +122,18 @@ $h2: 24px;
// Shadows
$shadow-xs:
- 0 1px 3px rgba(0, 0, 0, 0.12),
- 0 1px 2px rgba(0, 0, 0, 0.24);
+ 0 1px 3px rgb(0 0 0 / 0.12),
+ 0 1px 2px rgb(0 0 0 / 0.24);
$shadow-s:
- 0 3px 6px rgba(0, 0, 0, 0.15),
- 0 2px 4px rgba(0, 0, 0, 0.12);
+ 0 3px 6px rgb(0 0 0 / 0.15),
+ 0 2px 4px rgb(0 0 0 / 0.12);
$shadow-m:
- 0 10px 20px rgba(0, 0, 0, 0.15),
- 0 3px 6px rgba(0, 0, 0, 0.1);
+ 0 10px 20px rgb(0 0 0 / 0.15),
+ 0 3px 6px rgb(0 0 0 / 0.1);
$shadow-l:
- 0 15px 25px rgba(0, 0, 0, 0.15),
- 0 5px 10px rgba(0, 0, 0, 0.5);
-$shadow-xl: 0 20px 40px rgba(0, 0, 0, 0.2);
+ 0 15px 25px rgb(0 0 0 / 0.15),
+ 0 5px 10px rgb(0 0 0 / 0.5);
+$shadow-xl: 0 20px 40px rgb(0 0 0 / 0.2);
// radius
$border-radius-xs: 8px !default;
diff --git a/captive-theme/app/assets/stylesheets/captive-theme/forms/_icon_file.scss b/captive-theme/app/assets/stylesheets/captive-theme/forms/_icon_file.scss
new file mode 100644
index 00000000..b36f528b
--- /dev/null
+++ b/captive-theme/app/assets/stylesheets/captive-theme/forms/_icon_file.scss
@@ -0,0 +1,16 @@
+@mixin icon() {
+ object-fit: cover;
+ border-radius: 3px;
+}
+
+.icon-preview {
+ @include icon;
+ width: 78px;
+ height: 78px;
+
+ &__small {
+ @include icon;
+ width: 36px;
+ height: 36px;
+ }
+}
diff --git a/captive-theme/app/inputs/icon_file_input.rb b/captive-theme/app/inputs/icon_file_input.rb
new file mode 100644
index 00000000..369a9bb8
--- /dev/null
+++ b/captive-theme/app/inputs/icon_file_input.rb
@@ -0,0 +1,8 @@
+class IconFileInput < ImageFileInput
+ def image_preview_html_options
+ options = super
+ options[:class] ||= ""
+ options[:class] += " icon-preview"
+ options
+ end
+end
diff --git a/captive-theme/app/inputs/image_file_input.rb b/captive-theme/app/inputs/image_file_input.rb
new file mode 100644
index 00000000..92ea9cc1
--- /dev/null
+++ b/captive-theme/app/inputs/image_file_input.rb
@@ -0,0 +1,27 @@
+class ImageFileInput < Formtastic::Inputs::FileInput
+ def to_html
+ input_wrapping do
+ label_html <<
+ builder.file_field(method, input_html_options) <<
+ image_preview_html
+ end
+ end
+
+ def image_preview_html
+ if object.send(method)&.attached?
+ builder.template.image_tag(object.send(method), image_preview_html_options)
+ else
+ ""
+ end
+ end
+
+ def input_html_options
+ {
+ accept: "image/*",
+ }.merge(super)
+ end
+
+ def image_preview_html_options
+ options[:image_preview_html] ||= { style: "max-width: 100%;" }
+ end
+end
diff --git a/captive-theme/bin/rails b/captive-theme/bin/rails
new file mode 100755
index 00000000..7e02b810
--- /dev/null
+++ b/captive-theme/bin/rails
@@ -0,0 +1,26 @@
+#!/usr/bin/env ruby
+# This command will automatically be run when you run "rails" with Rails gems
+# installed from the root of your application.
+
+ENGINE_ROOT = File.expand_path("..", __dir__)
+ENGINE_PATH = File.expand_path("../lib/captive/theme/engine", __dir__)
+APP_PATH = File.expand_path("../spec/dummy/config/application", __dir__)
+
+# Set up gems listed in the Gemfile.
+ENV["BUNDLE_GEMFILE"] ||= File.expand_path("../Gemfile", __dir__)
+require "bundler/setup" if File.exist?(ENV["BUNDLE_GEMFILE"])
+
+require "rails"
+# Pick the frameworks you want:
+require "active_model/railtie"
+require "active_job/railtie"
+require "active_record/railtie"
+require "active_storage/engine"
+require "action_controller/railtie"
+require "action_mailer/railtie"
+require "action_mailbox/engine"
+require "action_text/engine"
+require "action_view/railtie"
+require "action_cable/engine"
+# require "rails/test_unit/railtie"
+require "rails/engine/commands"
diff --git a/captive-theme/bin/test b/captive-theme/bin/test
deleted file mode 100755
index 5516a12b..00000000
--- a/captive-theme/bin/test
+++ /dev/null
@@ -1,5 +0,0 @@
-#!/usr/bin/env ruby
-$: << File.expand_path("../test", __dir__)
-
-require "bundler/setup"
-require "rails/plugin/test"
diff --git a/captive-theme/captive-theme.gemspec b/captive-theme/captive-theme.gemspec
index d77d535e..ab4dbf95 100644
--- a/captive-theme/captive-theme.gemspec
+++ b/captive-theme/captive-theme.gemspec
@@ -21,5 +21,9 @@ Gem::Specification.new do |spec|
Dir["{app,config,db,lib}/**/*", "MIT-LICENSE", "Rakefile", "README.md"]
end
- # spec.add_dependency "rails", ">= 7.1.0.alpha"
+ spec.add_dependency "formtastic", "~> 3.1", ">= 3.1.4"
+
+ spec.add_development_dependency "rspec-rails"
+ spec.add_development_dependency "rspec-mocks"
+ spec.add_development_dependency "rails-dummy"
end
diff --git a/captive-theme/lib/captive/theme/engine.rb b/captive-theme/lib/captive/theme/engine.rb
new file mode 100644
index 00000000..9ae5dd97
--- /dev/null
+++ b/captive-theme/lib/captive/theme/engine.rb
@@ -0,0 +1,14 @@
+require "rails"
+
+module Captive
+ module Theme
+ class Engine < ::Rails::Engine
+ # require "formtastic"
+ # require "app/inputs/icon_file_input.rb"
+
+ config.generators do |g|
+ g.test_framework :rspec
+ end
+ end
+ end
+end
diff --git a/captive-theme/lib/templates/erb/scaffold/_form.html.erb b/captive-theme/lib/templates/erb/scaffold/_form.html.erb
new file mode 100644
index 00000000..d2b8b1e2
--- /dev/null
+++ b/captive-theme/lib/templates/erb/scaffold/_form.html.erb
@@ -0,0 +1,11 @@
+<%%= semantic_form_for @<%= singular_name %> do |f| %>
+ <%%= f.inputs do %>
+ <%- attributes.each do |attribute| -%>
+ <%%= f.input :<%= attribute.name %> %>
+ <%- end -%>
+ <%% end %>
+
+ <%%= f.actions do %>
+ <%%= f.action :submit, :as => :input %>
+ <%% end %>
+<%% end %>
diff --git a/captive-theme/spec/dummy/Rakefile b/captive-theme/spec/dummy/Rakefile
new file mode 100644
index 00000000..9a5ea738
--- /dev/null
+++ b/captive-theme/spec/dummy/Rakefile
@@ -0,0 +1,6 @@
+# Add your own tasks in files placed in lib/tasks ending in .rake,
+# for example lib/tasks/capistrano.rake, and they will automatically be available to Rake.
+
+require_relative "config/application"
+
+Rails.application.load_tasks
diff --git a/captive-theme/spec/dummy/app/assets/config/manifest.js b/captive-theme/spec/dummy/app/assets/config/manifest.js
new file mode 100644
index 00000000..080c071f
--- /dev/null
+++ b/captive-theme/spec/dummy/app/assets/config/manifest.js
@@ -0,0 +1,3 @@
+//= link_tree ../images
+//= link_directory ../stylesheets .css
+//= link captive_theme_manifest.js
diff --git a/captive-theme/spec/dummy/app/assets/images/.keep b/captive-theme/spec/dummy/app/assets/images/.keep
new file mode 100644
index 00000000..e69de29b
diff --git a/captive-theme/spec/dummy/app/assets/stylesheets/application.css b/captive-theme/spec/dummy/app/assets/stylesheets/application.css
new file mode 100644
index 00000000..0ebd7fe8
--- /dev/null
+++ b/captive-theme/spec/dummy/app/assets/stylesheets/application.css
@@ -0,0 +1,15 @@
+/*
+ * This is a manifest file that'll be compiled into application.css, which will include all the files
+ * listed below.
+ *
+ * Any CSS and SCSS file within this directory, lib/assets/stylesheets, vendor/assets/stylesheets,
+ * or any plugin's vendor/assets/stylesheets directory can be referenced here using a relative path.
+ *
+ * You're free to add application-wide styles to this file and they'll appear at the bottom of the
+ * compiled file so the styles you add here take precedence over styles defined in any other CSS/SCSS
+ * files in this directory. Styles in this file should be added after the last require_* statement.
+ * It is generally better to create a new file per style scope.
+ *
+ *= require_tree .
+ *= require_self
+ */
diff --git a/captive-theme/spec/dummy/app/channels/application_cable/channel.rb b/captive-theme/spec/dummy/app/channels/application_cable/channel.rb
new file mode 100644
index 00000000..d6726972
--- /dev/null
+++ b/captive-theme/spec/dummy/app/channels/application_cable/channel.rb
@@ -0,0 +1,4 @@
+module ApplicationCable
+ class Channel < ActionCable::Channel::Base
+ end
+end
diff --git a/captive-theme/spec/dummy/app/channels/application_cable/connection.rb b/captive-theme/spec/dummy/app/channels/application_cable/connection.rb
new file mode 100644
index 00000000..0ff5442f
--- /dev/null
+++ b/captive-theme/spec/dummy/app/channels/application_cable/connection.rb
@@ -0,0 +1,4 @@
+module ApplicationCable
+ class Connection < ActionCable::Connection::Base
+ end
+end
diff --git a/captive-theme/spec/dummy/app/controllers/application_controller.rb b/captive-theme/spec/dummy/app/controllers/application_controller.rb
new file mode 100644
index 00000000..09705d12
--- /dev/null
+++ b/captive-theme/spec/dummy/app/controllers/application_controller.rb
@@ -0,0 +1,2 @@
+class ApplicationController < ActionController::Base
+end
diff --git a/captive-theme/spec/dummy/app/controllers/concerns/.keep b/captive-theme/spec/dummy/app/controllers/concerns/.keep
new file mode 100644
index 00000000..e69de29b
diff --git a/captive-theme/spec/dummy/app/helpers/application_helper.rb b/captive-theme/spec/dummy/app/helpers/application_helper.rb
new file mode 100644
index 00000000..de6be794
--- /dev/null
+++ b/captive-theme/spec/dummy/app/helpers/application_helper.rb
@@ -0,0 +1,2 @@
+module ApplicationHelper
+end
diff --git a/captive-theme/spec/dummy/app/jobs/application_job.rb b/captive-theme/spec/dummy/app/jobs/application_job.rb
new file mode 100644
index 00000000..d394c3d1
--- /dev/null
+++ b/captive-theme/spec/dummy/app/jobs/application_job.rb
@@ -0,0 +1,7 @@
+class ApplicationJob < ActiveJob::Base
+ # Automatically retry jobs that encountered a deadlock
+ # retry_on ActiveRecord::Deadlocked
+
+ # Most jobs are safe to ignore if the underlying records are no longer available
+ # discard_on ActiveJob::DeserializationError
+end
diff --git a/captive-theme/spec/dummy/app/mailers/application_mailer.rb b/captive-theme/spec/dummy/app/mailers/application_mailer.rb
new file mode 100644
index 00000000..3c34c814
--- /dev/null
+++ b/captive-theme/spec/dummy/app/mailers/application_mailer.rb
@@ -0,0 +1,4 @@
+class ApplicationMailer < ActionMailer::Base
+ default from: "from@example.com"
+ layout "mailer"
+end
diff --git a/captive-theme/spec/dummy/app/models/application_record.rb b/captive-theme/spec/dummy/app/models/application_record.rb
new file mode 100644
index 00000000..b63caeb8
--- /dev/null
+++ b/captive-theme/spec/dummy/app/models/application_record.rb
@@ -0,0 +1,3 @@
+class ApplicationRecord < ActiveRecord::Base
+ primary_abstract_class
+end
diff --git a/captive-theme/spec/dummy/app/models/concerns/.keep b/captive-theme/spec/dummy/app/models/concerns/.keep
new file mode 100644
index 00000000..e69de29b
diff --git a/captive-theme/spec/dummy/app/views/layouts/application.html.erb b/captive-theme/spec/dummy/app/views/layouts/application.html.erb
new file mode 100644
index 00000000..f72b4ef0
--- /dev/null
+++ b/captive-theme/spec/dummy/app/views/layouts/application.html.erb
@@ -0,0 +1,15 @@
+
+
+
+ Dummy
+
+ <%= csrf_meta_tags %>
+ <%= csp_meta_tag %>
+
+ <%= stylesheet_link_tag "application" %>
+
+
+
+ <%= yield %>
+
+
diff --git a/captive-theme/spec/dummy/app/views/layouts/mailer.html.erb b/captive-theme/spec/dummy/app/views/layouts/mailer.html.erb
new file mode 100644
index 00000000..cbd34d2e
--- /dev/null
+++ b/captive-theme/spec/dummy/app/views/layouts/mailer.html.erb
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+ <%= yield %>
+
+
diff --git a/captive-theme/spec/dummy/app/views/layouts/mailer.text.erb b/captive-theme/spec/dummy/app/views/layouts/mailer.text.erb
new file mode 100644
index 00000000..37f0bddb
--- /dev/null
+++ b/captive-theme/spec/dummy/app/views/layouts/mailer.text.erb
@@ -0,0 +1 @@
+<%= yield %>
diff --git a/captive-theme/spec/dummy/bin/rails b/captive-theme/spec/dummy/bin/rails
new file mode 100755
index 00000000..efc03774
--- /dev/null
+++ b/captive-theme/spec/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/captive-theme/spec/dummy/bin/rake b/captive-theme/spec/dummy/bin/rake
new file mode 100755
index 00000000..4fbf10b9
--- /dev/null
+++ b/captive-theme/spec/dummy/bin/rake
@@ -0,0 +1,4 @@
+#!/usr/bin/env ruby
+require_relative "../config/boot"
+require "rake"
+Rake.application.run
diff --git a/captive-theme/spec/dummy/bin/setup b/captive-theme/spec/dummy/bin/setup
new file mode 100755
index 00000000..ec47b79b
--- /dev/null
+++ b/captive-theme/spec/dummy/bin/setup
@@ -0,0 +1,33 @@
+#!/usr/bin/env ruby
+require "fileutils"
+
+# path to your application root.
+APP_ROOT = File.expand_path("..", __dir__)
+
+def system!(*args)
+ system(*args) || abort("\n== Command #{args} failed ==")
+end
+
+FileUtils.chdir APP_ROOT do
+ # This script is a way to set up or update your development environment automatically.
+ # This script is idempotent, so that you can run it at any time and get an expectable outcome.
+ # Add necessary setup steps to this file.
+
+ puts "== Installing dependencies =="
+ system! "gem install bundler --conservative"
+ system("bundle check") || system!("bundle install")
+
+ # puts "\n== Copying sample files =="
+ # unless File.exist?("config/database.yml")
+ # FileUtils.cp "config/database.yml.sample", "config/database.yml"
+ # end
+
+ 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/captive-theme/spec/dummy/config.ru b/captive-theme/spec/dummy/config.ru
new file mode 100644
index 00000000..4a3c09a6
--- /dev/null
+++ b/captive-theme/spec/dummy/config.ru
@@ -0,0 +1,6 @@
+# This file is used by Rack-based servers to start the application.
+
+require_relative "config/environment"
+
+run Rails.application
+Rails.application.load_server
diff --git a/captive-theme/spec/dummy/config/application.rb b/captive-theme/spec/dummy/config/application.rb
new file mode 100644
index 00000000..ed1ab748
--- /dev/null
+++ b/captive-theme/spec/dummy/config/application.rb
@@ -0,0 +1,42 @@
+require_relative "boot"
+
+require "rails"
+# Pick the frameworks you want:
+require "active_model/railtie"
+require "active_job/railtie"
+require "active_record/railtie"
+require "active_storage/engine"
+require "action_controller/railtie"
+require "action_mailer/railtie"
+require "action_mailbox/engine"
+require "action_text/engine"
+require "action_view/railtie"
+require "action_cable/engine"
+# require "rails/test_unit/railtie"
+
+require "formtastic"
+
+# Require the gems listed in Gemfile, including any gems
+# you've limited to :test, :development, or :production.
+Bundler.require(*Rails.groups)
+require "captive/theme"
+
+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
+
+ # 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")
+
+ # Don't generate system test files.
+ config.generators.system_tests = nil
+ end
+end
diff --git a/captive-theme/spec/dummy/config/boot.rb b/captive-theme/spec/dummy/config/boot.rb
new file mode 100644
index 00000000..116591a4
--- /dev/null
+++ b/captive-theme/spec/dummy/config/boot.rb
@@ -0,0 +1,5 @@
+# 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/captive-theme/spec/dummy/config/cable.yml b/captive-theme/spec/dummy/config/cable.yml
new file mode 100644
index 00000000..98367f89
--- /dev/null
+++ b/captive-theme/spec/dummy/config/cable.yml
@@ -0,0 +1,10 @@
+development:
+ adapter: async
+
+test:
+ adapter: test
+
+production:
+ adapter: redis
+ url: <%= ENV.fetch("REDIS_URL") { "redis://localhost:6379/1" } %>
+ channel_prefix: dummy_production
diff --git a/captive-theme/spec/dummy/config/database.yml b/captive-theme/spec/dummy/config/database.yml
new file mode 100644
index 00000000..fcba57f1
--- /dev/null
+++ b/captive-theme/spec/dummy/config/database.yml
@@ -0,0 +1,25 @@
+# SQLite. Versions 3.8.0 and up are supported.
+# gem install sqlite3
+#
+# Ensure the SQLite 3 gem is defined in your Gemfile
+# gem "sqlite3"
+#
+default: &default
+ adapter: sqlite3
+ pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %>
+ timeout: 5000
+
+development:
+ <<: *default
+ database: db/development.sqlite3
+
+# Warning: The database defined as "test" will be erased and
+# re-generated from your development database when you run "rake".
+# Do not set this db to the same as development or production.
+test:
+ <<: *default
+ database: db/test.sqlite3
+
+production:
+ <<: *default
+ database: db/production.sqlite3
diff --git a/captive-theme/spec/dummy/config/environment.rb b/captive-theme/spec/dummy/config/environment.rb
new file mode 100644
index 00000000..cac53157
--- /dev/null
+++ b/captive-theme/spec/dummy/config/environment.rb
@@ -0,0 +1,5 @@
+# Load the Rails application.
+require_relative "application"
+
+# Initialize the Rails application.
+Rails.application.initialize!
diff --git a/captive-theme/spec/dummy/config/environments/development.rb b/captive-theme/spec/dummy/config/environments/development.rb
new file mode 100644
index 00000000..e87643e0
--- /dev/null
+++ b/captive-theme/spec/dummy/config/environments/development.rb
@@ -0,0 +1,70 @@
+require "active_support/core_ext/integer/time"
+
+Rails.application.configure do
+ # Settings specified here will take precedence over those in config/application.rb.
+
+ # In the development environment your application's code is reloaded any time
+ # it changes. This slows down response time but is perfect for development
+ # since you don't have to restart the web server when you make code changes.
+ config.cache_classes = false
+
+ # Do not eager load code on boot.
+ config.eager_load = false
+
+ # Show full error reports.
+ config.consider_all_requests_local = true
+
+ # Enable server timing
+ config.server_timing = true
+
+ # Enable/disable caching. By default caching is disabled.
+ # Run rails dev:cache to toggle caching.
+ 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
+
+ # Store uploaded files on the local file system (see config/storage.yml for options).
+ config.active_storage.service = :local
+
+ # Don't care if the mailer can't send.
+ config.action_mailer.raise_delivery_errors = false
+
+ config.action_mailer.perform_caching = false
+
+ # Print deprecation notices to the Rails logger.
+ config.active_support.deprecation = :log
+
+ # Raise exceptions for disallowed deprecations.
+ config.active_support.disallowed_deprecation = :raise
+
+ # Tell Active Support which deprecation messages to disallow.
+ config.active_support.disallowed_deprecation_warnings = []
+
+ # Raise an error on page load if there are pending migrations.
+ config.active_record.migration_error = :page_load
+
+ # Highlight code that triggered database queries in logs.
+ config.active_record.verbose_query_logs = true
+
+ # Suppress logger output for asset requests.
+ config.assets.quiet = true
+
+ # Raises error for missing translations.
+ # config.i18n.raise_on_missing_translations = true
+
+ # Annotate rendered view with file names.
+ # config.action_view.annotate_rendered_view_with_filenames = true
+
+ # Uncomment if you wish to allow Action Cable access from any origin.
+ # config.action_cable.disable_request_forgery_protection = true
+end
diff --git a/captive-theme/spec/dummy/config/environments/production.rb b/captive-theme/spec/dummy/config/environments/production.rb
new file mode 100644
index 00000000..b86a8b0d
--- /dev/null
+++ b/captive-theme/spec/dummy/config/environments/production.rb
@@ -0,0 +1,93 @@
+require "active_support/core_ext/integer/time"
+
+Rails.application.configure do
+ # Settings specified here will take precedence over those in config/application.rb.
+
+ # Code is not reloaded between requests.
+ config.cache_classes = true
+
+ # Eager load code on boot. This eager loads most of Rails and
+ # your application in memory, allowing both threaded web servers
+ # and those relying on copy on write to perform better.
+ # Rake tasks automatically ignore this option for performance.
+ config.eager_load = true
+
+ # Full error reports are disabled and caching is turned on.
+ config.consider_all_requests_local = false
+ config.action_controller.perform_caching = true
+
+ # Ensures that a master key has been made available in either ENV["RAILS_MASTER_KEY"]
+ # or in config/master.key. This key is used to decrypt credentials (and other encrypted files).
+ # config.require_master_key = true
+
+ # Disable serving static files from the `/public` folder by default since
+ # Apache or NGINX already handles this.
+ config.public_file_server.enabled = ENV["RAILS_SERVE_STATIC_FILES"].present?
+
+ # Compress CSS using a preprocessor.
+ # config.assets.css_compressor = :sass
+
+ # Do not fallback to assets pipeline if a precompiled asset is missed.
+ config.assets.compile = false
+
+ # Enable serving of images, stylesheets, and JavaScripts from an asset server.
+ # config.asset_host = "http://assets.example.com"
+
+ # Specifies the header that your server uses for sending files.
+ # config.action_dispatch.x_sendfile_header = "X-Sendfile" # for Apache
+ # config.action_dispatch.x_sendfile_header = "X-Accel-Redirect" # for NGINX
+
+ # Store uploaded files on the local file system (see config/storage.yml for options).
+ config.active_storage.service = :local
+
+ # Mount Action Cable outside main process or domain.
+ # config.action_cable.mount_path = nil
+ # config.action_cable.url = "wss://example.com/cable"
+ # config.action_cable.allowed_request_origins = [ "http://example.com", /http:\/\/example.*/ ]
+
+ # Force all access to the app over SSL, use Strict-Transport-Security, and use secure cookies.
+ # config.force_ssl = true
+
+ # Include generic and useful information about system operation, but avoid logging too much
+ # information to avoid inadvertent exposure of personally identifiable information (PII).
+ config.log_level = :info
+
+ # Prepend all log lines with the following tags.
+ config.log_tags = [:request_id]
+
+ # Use a different cache store in production.
+ # config.cache_store = :mem_cache_store
+
+ # Use a real queuing backend for Active Job (and separate queues per environment).
+ # config.active_job.queue_adapter = :resque
+ # config.active_job.queue_name_prefix = "dummy_production"
+
+ config.action_mailer.perform_caching = false
+
+ # Ignore bad email addresses and do not raise email delivery errors.
+ # Set this to true and configure the email server for immediate delivery to raise delivery errors.
+ # config.action_mailer.raise_delivery_errors = false
+
+ # Enable locale fallbacks for I18n (makes lookups for any locale fall back to
+ # the I18n.default_locale when a translation cannot be found).
+ config.i18n.fallbacks = true
+
+ # Don't log any deprecations.
+ config.active_support.report_deprecations = false
+
+ # Use default logging formatter so that PID and timestamp are not suppressed.
+ config.log_formatter = ::Logger::Formatter.new
+
+ # Use a different logger for distributed setups.
+ # require "syslog/logger"
+ # config.logger = ActiveSupport::TaggedLogging.new(Syslog::Logger.new "app-name")
+
+ if ENV["RAILS_LOG_TO_STDOUT"].present?
+ logger = ActiveSupport::Logger.new(STDOUT)
+ logger.formatter = config.log_formatter
+ config.logger = ActiveSupport::TaggedLogging.new(logger)
+ end
+
+ # Do not dump schema after migrations.
+ config.active_record.dump_schema_after_migration = false
+end
diff --git a/captive-theme/spec/dummy/config/environments/test.rb b/captive-theme/spec/dummy/config/environments/test.rb
new file mode 100644
index 00000000..22f9fc0c
--- /dev/null
+++ b/captive-theme/spec/dummy/config/environments/test.rb
@@ -0,0 +1,60 @@
+require "active_support/core_ext/integer/time"
+
+# The test environment is used exclusively to run your application's
+# test suite. You never need to work with it otherwise. Remember that
+# your test database is "scratch space" for the test suite and is wiped
+# and recreated between test runs. Don't rely on the data there!
+
+Rails.application.configure do
+ # Settings specified here will take precedence over those in config/application.rb.
+
+ # Turn false under Spring and add config.action_view.cache_template_loading = true.
+ config.cache_classes = true
+
+ # Eager loading loads your whole application. When running a single test locally,
+ # this probably isn't necessary. It's a good idea to do in a continuous integration
+ # system, or in some way before deploying your code.
+ config.eager_load = ENV["CI"].present?
+
+ # Configure public file server for tests with Cache-Control for performance.
+ config.public_file_server.enabled = true
+ config.public_file_server.headers = {
+ "Cache-Control" => "public, max-age=#{1.hour.to_i}",
+ }
+
+ # Show full error reports and disable caching.
+ config.consider_all_requests_local = true
+ config.action_controller.perform_caching = false
+ config.cache_store = :null_store
+
+ # Raise exceptions instead of rendering exception templates.
+ config.action_dispatch.show_exceptions = false
+
+ # Disable request forgery protection in test environment.
+ config.action_controller.allow_forgery_protection = false
+
+ # Store uploaded files on the local file system in a temporary directory.
+ config.active_storage.service = :test
+
+ config.action_mailer.perform_caching = false
+
+ # Tell Action Mailer not to deliver emails to the real world.
+ # The :test delivery method accumulates sent emails in the
+ # ActionMailer::Base.deliveries array.
+ config.action_mailer.delivery_method = :test
+
+ # Print deprecation notices to the stderr.
+ config.active_support.deprecation = :stderr
+
+ # Raise exceptions for disallowed deprecations.
+ config.active_support.disallowed_deprecation = :raise
+
+ # Tell Active Support which deprecation messages to disallow.
+ config.active_support.disallowed_deprecation_warnings = []
+
+ # Raises error for missing translations.
+ # config.i18n.raise_on_missing_translations = true
+
+ # Annotate rendered view with file names.
+ # config.action_view.annotate_rendered_view_with_filenames = true
+end
diff --git a/captive-theme/spec/dummy/config/initializers/assets.rb b/captive-theme/spec/dummy/config/initializers/assets.rb
new file mode 100644
index 00000000..d6156df0
--- /dev/null
+++ b/captive-theme/spec/dummy/config/initializers/assets.rb
@@ -0,0 +1,12 @@
+# Be sure to restart your server when you modify this file.
+
+# Version of your assets, change this if you want to expire all your assets.
+# Rails.application.config.assets.version = "1.0"
+
+# Add additional assets to the asset load path.
+# Rails.application.config.assets.paths << Emoji.images_path
+
+# Precompile additional assets.
+# application.js, application.css, and all non-JS/CSS in the app/assets
+# folder are already added.
+# Rails.application.config.assets.precompile += %w( admin.js admin.css )
diff --git a/captive-theme/spec/dummy/config/initializers/content_security_policy.rb b/captive-theme/spec/dummy/config/initializers/content_security_policy.rb
new file mode 100644
index 00000000..54f47cf1
--- /dev/null
+++ b/captive-theme/spec/dummy/config/initializers/content_security_policy.rb
@@ -0,0 +1,25 @@
+# Be sure to restart your server when you modify this file.
+
+# Define an application-wide content security policy.
+# See the Securing Rails Applications Guide for more information:
+# https://guides.rubyonrails.org/security.html#content-security-policy-header
+
+# Rails.application.configure do
+# config.content_security_policy do |policy|
+# policy.default_src :self, :https
+# policy.font_src :self, :https, :data
+# policy.img_src :self, :https, :data
+# policy.object_src :none
+# policy.script_src :self, :https
+# policy.style_src :self, :https
+# # Specify URI for violation reports
+# # policy.report_uri "/csp-violation-report-endpoint"
+# end
+#
+# # Generate session nonces for permitted importmap and inline scripts
+# config.content_security_policy_nonce_generator = ->(request) { request.session.id.to_s }
+# config.content_security_policy_nonce_directives = %w(script-src)
+#
+# # Report violations without enforcing the policy.
+# # config.content_security_policy_report_only = true
+# end
diff --git a/captive-theme/spec/dummy/config/initializers/filter_parameter_logging.rb b/captive-theme/spec/dummy/config/initializers/filter_parameter_logging.rb
new file mode 100644
index 00000000..ec958072
--- /dev/null
+++ b/captive-theme/spec/dummy/config/initializers/filter_parameter_logging.rb
@@ -0,0 +1,8 @@
+# Be sure to restart your server when you modify this file.
+
+# Configure parameters to be filtered from the log file. Use this to limit dissemination of
+# sensitive information. See the ActiveSupport::ParameterFilter documentation for supported
+# notations and behaviors.
+Rails.application.config.filter_parameters += [
+ :passw, :secret, :token, :_key, :crypt, :salt, :certificate, :otp, :ssn,
+]
diff --git a/captive-theme/spec/dummy/config/initializers/formtastic.rb b/captive-theme/spec/dummy/config/initializers/formtastic.rb
new file mode 100644
index 00000000..a50ea310
--- /dev/null
+++ b/captive-theme/spec/dummy/config/initializers/formtastic.rb
@@ -0,0 +1,111 @@
+# encoding: utf-8
+
+# Set the default text field size when input is a string. Default is nil.
+# Formtastic::FormBuilder.default_text_field_size = 50
+
+# Set the default text area height when input is a text. Default is 20.
+# Formtastic::FormBuilder.default_text_area_height = 5
+
+# Set the default text area width when input is a text. Default is nil.
+# Formtastic::FormBuilder.default_text_area_width = 50
+
+# Should all fields be considered "required" by default?
+# Defaults to true.
+# Formtastic::FormBuilder.all_fields_required_by_default = true
+
+# Should select fields have a blank option/prompt by default?
+# Defaults to true.
+# Formtastic::FormBuilder.include_blank_for_select_by_default = true
+
+# Set the string that will be appended to the labels/fieldsets which are required.
+# It accepts string or procs and the default is a localized version of
+# '*'. In other words, if you configure formtastic.required
+# in your locale, it will replace the abbr title properly. But if you don't want to use
+# abbr tag, you can simply give a string as below.
+# Formtastic::FormBuilder.required_string = "(required)"
+
+# Set the string that will be appended to the labels/fieldsets which are optional.
+# Defaults to an empty string ("") and also accepts procs (see required_string above).
+# Formtastic::FormBuilder.optional_string = "(optional)"
+
+# Set the way inline errors will be displayed.
+# Defaults to :sentence, valid options are :sentence, :list, :first and :none
+# Formtastic::FormBuilder.inline_errors = :sentence
+# Formtastic uses the following classes as default for hints, inline_errors and error list
+
+# If you override the class here, please ensure to override it in your stylesheets as well.
+# Formtastic::FormBuilder.default_hint_class = "inline-hints"
+# Formtastic::FormBuilder.default_inline_error_class = "inline-errors"
+# Formtastic::FormBuilder.default_error_list_class = "errors"
+
+# Set the method to call on label text to transform or format it for human-friendly
+# reading when formtastic is used without object. Defaults to :humanize.
+# Formtastic::FormBuilder.label_str_method = :humanize
+
+# Set the array of methods to try calling on parent objects in :select and :radio inputs
+# for the text inside each @