railties 7.1.3.4 → 7.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/CHANGELOG.md +177 -742
- data/lib/minitest/rails_plugin.rb +5 -2
- data/lib/rails/all.rb +1 -3
- data/lib/rails/api/task.rb +6 -4
- data/lib/rails/application/bootstrap.rb +5 -6
- data/lib/rails/application/configuration.rb +73 -38
- data/lib/rails/application/dummy_config.rb +2 -2
- data/lib/rails/application/finisher.rb +7 -0
- data/lib/rails/application.rb +15 -86
- data/lib/rails/backtrace_cleaner.rb +18 -3
- data/lib/rails/cli.rb +0 -1
- data/lib/rails/command.rb +1 -1
- data/lib/rails/commands/app/update_command.rb +93 -0
- data/lib/rails/commands/boot/boot_command.rb +14 -0
- data/lib/rails/commands/console/console_command.rb +2 -21
- data/lib/rails/commands/console/irb_console.rb +137 -0
- data/lib/rails/commands/credentials/credentials_command.rb +2 -2
- data/lib/rails/commands/dbconsole/dbconsole_command.rb +21 -30
- data/lib/rails/commands/devcontainer/devcontainer_command.rb +39 -0
- data/lib/rails/commands/rake/rake_command.rb +1 -1
- data/lib/rails/commands/runner/runner_command.rb +14 -3
- data/lib/rails/commands/server/server_command.rb +5 -3
- data/lib/rails/commands/test/test_command.rb +2 -0
- data/lib/rails/configuration.rb +10 -1
- data/lib/rails/console/app.rb +5 -32
- data/lib/rails/console/helpers.rb +5 -16
- data/lib/rails/console/methods.rb +23 -0
- data/lib/rails/engine.rb +5 -5
- data/lib/rails/gem_version.rb +3 -3
- data/lib/rails/generators/app_base.rb +70 -49
- data/lib/rails/generators/base.rb +5 -1
- data/lib/rails/generators/database.rb +227 -69
- data/lib/rails/generators/erb/scaffold/templates/edit.html.erb.tt +2 -0
- data/lib/rails/generators/erb/scaffold/templates/index.html.erb.tt +2 -0
- data/lib/rails/generators/erb/scaffold/templates/new.html.erb.tt +2 -0
- data/lib/rails/generators/generated_attribute.rb +26 -1
- data/lib/rails/generators/migration.rb +3 -3
- data/lib/rails/generators/rails/app/app_generator.rb +53 -24
- data/lib/rails/generators/rails/app/templates/Dockerfile.tt +22 -15
- data/lib/rails/generators/rails/app/templates/Gemfile.tt +16 -16
- data/lib/rails/generators/rails/app/templates/app/controllers/application_controller.rb.tt +4 -0
- data/lib/rails/generators/rails/app/templates/app/views/layouts/application.html.erb.tt +8 -1
- data/lib/rails/generators/rails/app/templates/app/views/pwa/manifest.json.erb.tt +22 -0
- data/lib/rails/generators/rails/app/templates/app/views/pwa/service-worker.js +26 -0
- data/lib/rails/generators/rails/app/templates/bin/brakeman.tt +6 -0
- data/lib/rails/generators/rails/app/templates/bin/rubocop.tt +7 -0
- data/lib/rails/generators/rails/app/templates/bin/setup.tt +6 -2
- data/lib/rails/generators/rails/app/templates/config/application.rb.tt +1 -1
- data/lib/rails/generators/rails/app/templates/config/databases/mysql.yml.tt +3 -3
- data/lib/rails/generators/rails/app/templates/config/databases/postgresql.yml.tt +7 -0
- data/lib/rails/generators/rails/app/templates/config/databases/sqlite3.yml.tt +8 -1
- data/lib/rails/generators/rails/app/templates/config/databases/trilogy.yml.tt +3 -3
- data/lib/rails/generators/rails/app/templates/config/environments/development.rb.tt +14 -7
- data/lib/rails/generators/rails/app/templates/config/environments/production.rb.tt +5 -0
- data/lib/rails/generators/rails/app/templates/config/environments/test.rb.tt +8 -5
- data/lib/rails/generators/rails/app/templates/config/initializers/filter_parameter_logging.rb.tt +1 -1
- data/lib/rails/generators/rails/app/templates/config/initializers/new_framework_defaults_7_2.rb.tt +70 -0
- data/lib/rails/generators/rails/app/templates/config/puma.rb.tt +24 -26
- data/lib/rails/generators/rails/app/templates/config/routes.rb.tt +4 -0
- data/lib/rails/generators/rails/app/templates/docker-entrypoint.tt +5 -0
- data/lib/rails/generators/rails/app/templates/dockerignore.tt +13 -0
- data/lib/rails/generators/rails/app/templates/github/ci.yml.tt +138 -0
- data/lib/rails/generators/rails/app/templates/github/dependabot.yml +12 -0
- data/lib/rails/generators/rails/app/templates/gitignore.tt +3 -3
- data/lib/rails/generators/rails/app/templates/public/406-unsupported-browser.html +66 -0
- data/lib/rails/generators/rails/app/templates/public/icon.png +0 -0
- data/lib/rails/generators/rails/app/templates/public/icon.svg +3 -0
- data/lib/rails/generators/rails/app/templates/rubocop.yml.tt +8 -0
- data/lib/rails/generators/rails/app/templates/test/application_system_test_case.rb.tt +1 -1
- data/lib/rails/generators/rails/controller/controller_generator.rb +1 -1
- data/lib/rails/generators/rails/db/system/change/change_generator.rb +131 -20
- data/lib/rails/generators/rails/devcontainer/devcontainer_generator.rb +166 -0
- data/lib/rails/generators/rails/devcontainer/templates/devcontainer/Dockerfile.tt +3 -0
- data/lib/rails/generators/rails/devcontainer/templates/devcontainer/compose.yaml.tt +47 -0
- data/lib/rails/generators/rails/devcontainer/templates/devcontainer/devcontainer.json.tt +37 -0
- data/lib/rails/generators/rails/migration/migration_generator.rb +4 -0
- data/lib/rails/generators/rails/plugin/plugin_generator.rb +38 -7
- data/lib/rails/generators/rails/plugin/templates/%name%.gemspec.tt +2 -2
- data/lib/rails/generators/rails/plugin/templates/Gemfile.tt +5 -1
- data/lib/rails/generators/rails/plugin/templates/app/views/layouts/%namespaced_name%/application.html.erb.tt +2 -0
- data/lib/rails/generators/rails/plugin/templates/bin/rubocop.tt +7 -0
- data/lib/rails/generators/rails/plugin/templates/github/ci.yml.tt +103 -0
- data/lib/rails/generators/rails/plugin/templates/github/dependabot.yml +12 -0
- data/lib/rails/generators/rails/plugin/templates/rubocop.yml.tt +8 -0
- data/lib/rails/generators/rails/plugin/templates/test/application_system_test_case.rb.tt +1 -1
- data/lib/rails/generators/test_unit/mailer/templates/functional_test.rb.tt +6 -4
- data/lib/rails/generators/test_unit/mailer/templates/preview.rb.tt +3 -2
- data/lib/rails/generators/test_unit/scaffold/scaffold_generator.rb +15 -1
- data/lib/rails/generators/test_unit/scaffold/templates/api_functional_test.rb.tt +2 -2
- data/lib/rails/generators/test_unit/scaffold/templates/functional_test.rb.tt +2 -2
- data/lib/rails/generators/test_unit/scaffold/templates/system_test.rb.tt +2 -0
- data/lib/rails/generators/test_unit/system/templates/application_system_test_case.rb.tt +1 -1
- data/lib/rails/generators/testing/assertions.rb +20 -0
- data/lib/rails/generators/testing/behavior.rb +7 -6
- data/lib/rails/generators.rb +1 -1
- data/lib/rails/health_controller.rb +1 -1
- data/lib/rails/info.rb +2 -2
- data/lib/rails/mailers_controller.rb +14 -1
- data/lib/rails/paths.rb +2 -2
- data/lib/rails/pwa_controller.rb +15 -0
- data/lib/rails/rack/logger.rb +15 -7
- data/lib/rails/railtie/configurable.rb +2 -2
- data/lib/rails/railtie.rb +2 -3
- data/lib/rails/tasks/framework.rake +0 -26
- data/lib/rails/tasks/tmp.rake +1 -1
- data/lib/rails/templates/layouts/application.html.erb +1 -1
- data/lib/rails/templates/rails/mailers/email.html.erb +12 -8
- data/lib/rails/templates/rails/welcome/index.html.erb +4 -2
- data/lib/rails/test_help.rb +2 -4
- data/lib/rails/test_unit/reporter.rb +8 -2
- data/lib/rails/test_unit/runner.rb +26 -2
- data/lib/rails/test_unit/test_parser.rb +45 -0
- data/lib/rails.rb +7 -4
- metadata +42 -32
- data/lib/rails/app_updater.rb +0 -40
- data/lib/rails/commands/secrets/USAGE +0 -61
- data/lib/rails/commands/secrets/secrets_command.rb +0 -47
- data/lib/rails/generators/rails/app/templates/config/databases/jdbc.yml.tt +0 -68
- data/lib/rails/generators/rails/app/templates/config/databases/jdbcmysql.yml.tt +0 -54
- data/lib/rails/generators/rails/app/templates/config/databases/jdbcpostgresql.yml.tt +0 -70
- data/lib/rails/generators/rails/app/templates/config/databases/jdbcsqlite3.yml.tt +0 -24
- data/lib/rails/generators/rails/app/templates/config/databases/oracle.yml.tt +0 -62
- data/lib/rails/generators/rails/app/templates/config/databases/sqlserver.yml.tt +0 -53
- data/lib/rails/generators/rails/app/templates/config/initializers/new_framework_defaults_7_1.rb.tt +0 -284
- data/lib/rails/generators/rails/app/templates/public/apple-touch-icon-precomposed.png +0 -0
- data/lib/rails/generators/rails/app/templates/public/apple-touch-icon.png +0 -0
- data/lib/rails/generators/rails/app/templates/public/favicon.ico +0 -0
- data/lib/rails/ruby_version_check.rb +0 -17
- data/lib/rails/secrets.rb +0 -110
@@ -1,6 +1,7 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
3
|
require "rails/generators/app_base"
|
4
|
+
require "rails/generators/rails/devcontainer/devcontainer_generator"
|
4
5
|
|
5
6
|
module Rails
|
6
7
|
module ActionMethods # :nodoc:
|
@@ -15,8 +16,8 @@ module Rails
|
|
15
16
|
%w(template copy_file directory empty_directory inside
|
16
17
|
empty_directory_with_keep_file create_file chmod shebang).each do |method|
|
17
18
|
class_eval <<-RUBY, __FILE__, __LINE__ + 1
|
18
|
-
def #{method}(
|
19
|
-
@generator.send(:#{method},
|
19
|
+
def #{method}(...)
|
20
|
+
@generator.send(:#{method}, ...)
|
20
21
|
end
|
21
22
|
RUBY
|
22
23
|
end
|
@@ -82,6 +83,16 @@ module Rails
|
|
82
83
|
chmod "bin/docker-entrypoint", 0755 & ~File.umask, verbose: false
|
83
84
|
end
|
84
85
|
|
86
|
+
def cifiles
|
87
|
+
empty_directory ".github/workflows"
|
88
|
+
template "github/ci.yml", ".github/workflows/ci.yml"
|
89
|
+
template "github/dependabot.yml", ".github/dependabot.yml"
|
90
|
+
end
|
91
|
+
|
92
|
+
def rubocop
|
93
|
+
template "rubocop.yml", ".rubocop.yml"
|
94
|
+
end
|
95
|
+
|
85
96
|
def version_control
|
86
97
|
if !options[:skip_git] && !options[:pretend]
|
87
98
|
run git_init_command, capture: options[:quiet], abort_on_failure: false
|
@@ -98,7 +109,8 @@ module Rails
|
|
98
109
|
end
|
99
110
|
|
100
111
|
def bin
|
101
|
-
|
112
|
+
exclude_pattern = Regexp.union([(/rubocop/ if skip_rubocop?), (/brakeman/ if skip_brakeman?)].compact)
|
113
|
+
directory "bin", { exclude_pattern: exclude_pattern } do |content|
|
102
114
|
"#{shebang}\n" + content
|
103
115
|
end
|
104
116
|
chmod "bin", 0755 & ~File.umask, verbose: false
|
@@ -116,7 +128,7 @@ module Rails
|
|
116
128
|
template "application.rb"
|
117
129
|
template "environment.rb"
|
118
130
|
template "cable.yml" unless options[:update] || options[:skip_action_cable]
|
119
|
-
template "puma.rb"
|
131
|
+
template "puma.rb"
|
120
132
|
template "storage.yml" unless options[:update] || skip_active_storage?
|
121
133
|
|
122
134
|
directory "environments"
|
@@ -246,8 +258,6 @@ module Rails
|
|
246
258
|
def tmp
|
247
259
|
empty_directory_with_keep_file "tmp"
|
248
260
|
empty_directory_with_keep_file "tmp/pids"
|
249
|
-
empty_directory "tmp/cache"
|
250
|
-
empty_directory "tmp/cache/assets"
|
251
261
|
end
|
252
262
|
|
253
263
|
def vendor
|
@@ -255,7 +265,21 @@ module Rails
|
|
255
265
|
end
|
256
266
|
|
257
267
|
def config_target_version
|
258
|
-
|
268
|
+
@config_target_version || Rails::VERSION::STRING.to_f
|
269
|
+
end
|
270
|
+
|
271
|
+
def devcontainer
|
272
|
+
devcontainer_options = {
|
273
|
+
database: options[:database],
|
274
|
+
redis: !(options[:skip_action_cable] && options[:skip_active_job]),
|
275
|
+
system_test: depends_on_system_test?,
|
276
|
+
active_storage: !options[:skip_active_storage],
|
277
|
+
dev: options[:dev],
|
278
|
+
node: using_node?,
|
279
|
+
app_name: app_name
|
280
|
+
}
|
281
|
+
|
282
|
+
Rails::Generators::DevcontainerGenerator.new([], devcontainer_options).invoke_all
|
259
283
|
end
|
260
284
|
end
|
261
285
|
|
@@ -273,8 +297,8 @@ module Rails
|
|
273
297
|
class_option :version, type: :boolean, aliases: "-v", group: :rails, desc: "Show Rails version number and quit"
|
274
298
|
class_option :api, type: :boolean, desc: "Preconfigure smaller stack for API only apps"
|
275
299
|
class_option :minimal, type: :boolean, desc: "Preconfigure a minimal rails app"
|
276
|
-
class_option :javascript, type: :string, aliases: ["-j", "--js"], default: "importmap", desc: "Choose JavaScript approach
|
277
|
-
class_option :css, type: :string, aliases: "-c", desc: "Choose CSS processor
|
300
|
+
class_option :javascript, type: :string, aliases: ["-j", "--js"], default: "importmap", enum: JAVASCRIPT_OPTIONS, desc: "Choose JavaScript approach"
|
301
|
+
class_option :css, type: :string, aliases: "-c", enum: CSS_OPTIONS, desc: "Choose CSS processor. Check https://github.com/rails/cssbundling-rails for more options"
|
278
302
|
class_option :skip_bundle, type: :boolean, aliases: "-B", default: nil, desc: "Don't run bundle install"
|
279
303
|
class_option :skip_decrypted_diffs, type: :boolean, default: nil, desc: "Don't configure git to show decrypted diffs of encrypted credentials"
|
280
304
|
|
@@ -318,10 +342,6 @@ module Rails
|
|
318
342
|
|
319
343
|
imply_options(OPTION_IMPLICATIONS, meta_options: META_OPTIONS)
|
320
344
|
|
321
|
-
if !options[:skip_active_record] && !DATABASES.include?(options[:database])
|
322
|
-
raise Error, "Invalid value for --database option. Supported preconfigurations are: #{DATABASES.join(", ")}."
|
323
|
-
end
|
324
|
-
|
325
345
|
@after_bundle_callbacks = []
|
326
346
|
end
|
327
347
|
|
@@ -371,6 +391,16 @@ module Rails
|
|
371
391
|
build(:dockerfiles)
|
372
392
|
end
|
373
393
|
|
394
|
+
def create_rubocop_file
|
395
|
+
return if skip_rubocop?
|
396
|
+
build(:rubocop)
|
397
|
+
end
|
398
|
+
|
399
|
+
def create_cifiles
|
400
|
+
return if skip_ci?
|
401
|
+
build(:cifiles)
|
402
|
+
end
|
403
|
+
|
374
404
|
def create_config_files
|
375
405
|
build(:config)
|
376
406
|
end
|
@@ -389,11 +419,6 @@ module Rails
|
|
389
419
|
build(:credentials_diff_enroll)
|
390
420
|
end
|
391
421
|
|
392
|
-
def display_upgrade_guide_info
|
393
|
-
say "\nAfter this, check Rails upgrade guide at https://guides.rubyonrails.org/upgrading_ruby_on_rails.html for more details about upgrading your app."
|
394
|
-
end
|
395
|
-
remove_task :display_upgrade_guide_info
|
396
|
-
|
397
422
|
def create_boot_file
|
398
423
|
template "config/boot.rb"
|
399
424
|
end
|
@@ -437,14 +462,18 @@ module Rails
|
|
437
462
|
end
|
438
463
|
|
439
464
|
def create_storage_files
|
440
|
-
build(:storage)
|
465
|
+
build(:storage) unless skip_storage?
|
466
|
+
end
|
467
|
+
|
468
|
+
def create_devcontainer_files
|
469
|
+
return if skip_devcontainer? || options[:dummy_app]
|
470
|
+
build(:devcontainer)
|
441
471
|
end
|
442
472
|
|
443
473
|
def delete_app_assets_if_api_option
|
444
474
|
if options[:api]
|
445
475
|
remove_dir "app/assets"
|
446
476
|
remove_dir "lib/assets"
|
447
|
-
remove_dir "tmp/cache/assets"
|
448
477
|
end
|
449
478
|
end
|
450
479
|
|
@@ -468,11 +497,11 @@ module Rails
|
|
468
497
|
def delete_public_files_if_api_option
|
469
498
|
if options[:api]
|
470
499
|
remove_file "public/404.html"
|
500
|
+
remove_file "public/406-unsupported-browser.html"
|
471
501
|
remove_file "public/422.html"
|
472
502
|
remove_file "public/500.html"
|
473
|
-
remove_file "public/
|
474
|
-
remove_file "public/
|
475
|
-
remove_file "public/favicon.ico"
|
503
|
+
remove_file "public/icon.png"
|
504
|
+
remove_file "public/icon.svg"
|
476
505
|
end
|
477
506
|
end
|
478
507
|
|
@@ -644,7 +673,7 @@ module Rails
|
|
644
673
|
end
|
645
674
|
|
646
675
|
def read_rc_file(railsrc)
|
647
|
-
extra_args = File.readlines(railsrc).flat_map(
|
676
|
+
extra_args = File.readlines(railsrc).flat_map.each { |line| line.split("#", 2).first.split }
|
648
677
|
puts "Using #{extra_args.join(" ")} from #{railsrc}"
|
649
678
|
extra_args
|
650
679
|
end
|
@@ -1,25 +1,34 @@
|
|
1
1
|
# syntax = docker/dockerfile:1
|
2
2
|
|
3
|
-
#
|
3
|
+
# This Dockerfile is designed for production, not development. Use with Kamal or build'n'run by hand:
|
4
|
+
# docker build -t my-app .
|
5
|
+
# docker run -d -p 80:80 -p 443:443 --name my-app -e RAILS_MASTER_KEY=<value from config/master.key> my-app
|
6
|
+
|
7
|
+
# Make sure RUBY_VERSION matches the Ruby version in .ruby-version
|
4
8
|
ARG RUBY_VERSION=<%= gem_ruby_version %>
|
5
|
-
FROM
|
9
|
+
FROM docker.io/library/ruby:$RUBY_VERSION-slim AS base
|
6
10
|
|
7
11
|
# Rails app lives here
|
8
12
|
WORKDIR /rails
|
9
13
|
|
14
|
+
# Install base packages
|
15
|
+
RUN apt-get update -qq && \
|
16
|
+
apt-get install --no-install-recommends -y <%= dockerfile_base_packages.join(" ") %> && \
|
17
|
+
rm -rf /var/lib/apt/lists /var/cache/apt/archives
|
18
|
+
|
10
19
|
# Set production environment
|
11
20
|
ENV RAILS_ENV="production" \
|
12
21
|
BUNDLE_DEPLOYMENT="1" \
|
13
22
|
BUNDLE_PATH="/usr/local/bundle" \
|
14
23
|
BUNDLE_WITHOUT="development"
|
15
24
|
|
16
|
-
|
17
25
|
# Throw-away build stage to reduce size of final image
|
18
|
-
FROM base
|
26
|
+
FROM base AS build
|
19
27
|
|
20
28
|
# Install packages needed to build gems<%= using_node? ? " and node modules" : "" %>
|
21
29
|
RUN apt-get update -qq && \
|
22
|
-
apt-get install --no-install-recommends -y <%= dockerfile_build_packages.join(" ") %>
|
30
|
+
apt-get install --no-install-recommends -y <%= dockerfile_build_packages.join(" ") %> && \
|
31
|
+
rm -rf /var/lib/apt/lists /var/cache/apt/archives
|
23
32
|
|
24
33
|
<% if using_node? -%>
|
25
34
|
# Install JavaScript dependencies
|
@@ -76,24 +85,22 @@ RUN SECRET_KEY_BASE_DUMMY=1 ./bin/rails assets:precompile
|
|
76
85
|
|
77
86
|
<% end -%>
|
78
87
|
|
88
|
+
<% if using_node? -%>
|
89
|
+
RUN rm -rf node_modules
|
90
|
+
<% end %>
|
91
|
+
|
79
92
|
# Final stage for app image
|
80
93
|
FROM base
|
81
94
|
|
82
|
-
<% unless dockerfile_deploy_packages.empty? -%>
|
83
|
-
# Install packages needed for deployment
|
84
|
-
RUN apt-get update -qq && \
|
85
|
-
apt-get install --no-install-recommends -y <%= dockerfile_deploy_packages.join(" ") %> && \
|
86
|
-
rm -rf /var/lib/apt/lists /var/cache/apt/archives
|
87
|
-
|
88
|
-
<% end -%>
|
89
95
|
# Copy built artifacts: gems, application
|
90
|
-
COPY --from=build
|
96
|
+
COPY --from=build "${BUNDLE_PATH}" "${BUNDLE_PATH}"
|
91
97
|
COPY --from=build /rails /rails
|
92
98
|
|
93
99
|
# Run and own only the runtime files as a non-root user for security
|
94
|
-
RUN
|
100
|
+
RUN groupadd --system --gid 1000 rails && \
|
101
|
+
useradd rails --uid 1000 --gid 1000 --create-home --shell /bin/bash && \
|
95
102
|
chown -R rails:rails <%= dockerfile_chown_directories.join(" ") %>
|
96
|
-
USER
|
103
|
+
USER 1000:1000
|
97
104
|
|
98
105
|
# Entrypoint prepares the database.
|
99
106
|
ENTRYPOINT ["/rails/bin/docker-entrypoint"]
|
@@ -1,8 +1,6 @@
|
|
1
1
|
source "https://rubygems.org"
|
2
2
|
|
3
|
-
|
4
|
-
|
5
|
-
<% gemfile_entries.each do |gemfile_entry| %>
|
3
|
+
<% gemfile_entries.each do |gemfile_entry| -%>
|
6
4
|
<%= gemfile_entry %>
|
7
5
|
<% end -%>
|
8
6
|
<% unless options.minimal? -%>
|
@@ -35,34 +33,36 @@ gem "bootsnap", require: false
|
|
35
33
|
|
36
34
|
group :development, :test do
|
37
35
|
# See https://guides.rubyonrails.org/debugging_rails_applications.html#debugging-with-the-debug-gem
|
38
|
-
gem "debug", platforms: %i[ mri <%= bundler_windows_platforms %> ]
|
36
|
+
gem "debug", platforms: %i[ mri <%= bundler_windows_platforms %> ], require: "debug/prelude"
|
37
|
+
<%- unless options.skip_brakeman? -%>
|
38
|
+
|
39
|
+
# Static analysis for security vulnerabilities [https://brakemanscanner.org/]
|
40
|
+
gem "brakeman", require: false
|
41
|
+
<%- end -%>
|
42
|
+
<%- unless options.skip_rubocop? -%>
|
43
|
+
|
44
|
+
# Omakase Ruby styling [https://github.com/rails/rubocop-rails-omakase/]
|
45
|
+
gem "rubocop-rails-omakase", require: false
|
46
|
+
<%- end -%>
|
39
47
|
end
|
40
48
|
<% end -%>
|
41
49
|
|
42
|
-
group :development do
|
43
50
|
<%- unless options.api? || options.skip_dev_gems? -%>
|
51
|
+
group :development do
|
44
52
|
# Use console on exceptions pages [https://github.com/rails/web-console]
|
45
53
|
gem "web-console"
|
54
|
+
<%- if RUBY_VERSION < "3.2" -%>
|
46
55
|
|
47
|
-
#
|
48
|
-
# gem "rack-mini-profiler"
|
49
|
-
|
50
|
-
<%- end -%>
|
51
|
-
# Speed up commands on slow machines / big apps [https://github.com/rails/spring]
|
52
|
-
# gem "spring"
|
53
|
-
<%- if RUBY_VERSION >= "3.1" && RUBY_VERSION < "3.2" -%>
|
54
|
-
|
56
|
+
# Highlight the fine-grained location where an error occurred [https://github.com/ruby/error_highlight]
|
55
57
|
gem "error_highlight", ">= 0.4.0", platforms: [:ruby]
|
56
58
|
<%- end -%>
|
57
59
|
end
|
60
|
+
<%- end -%>
|
58
61
|
|
59
62
|
<%- if depends_on_system_test? -%>
|
60
63
|
group :test do
|
61
64
|
# Use system testing [https://guides.rubyonrails.org/testing.html#system-testing]
|
62
65
|
gem "capybara"
|
63
66
|
gem "selenium-webdriver"
|
64
|
-
<%- if RUBY_VERSION < "3.0" -%>
|
65
|
-
gem "webdrivers"
|
66
|
-
<%- end -%>
|
67
67
|
end
|
68
68
|
<%- end -%>
|
@@ -1,2 +1,6 @@
|
|
1
1
|
class ApplicationController < ActionController::<%= options.api? ? "API" : "Base" %>
|
2
|
+
<%- unless options.api? -%>
|
3
|
+
# Only allow modern browsers supporting webp images, web push, badges, import maps, CSS nesting, and CSS :has.
|
4
|
+
allow_browser versions: :modern
|
5
|
+
<% end -%>
|
2
6
|
end
|
@@ -1,11 +1,18 @@
|
|
1
1
|
<!DOCTYPE html>
|
2
2
|
<html>
|
3
3
|
<head>
|
4
|
-
<title
|
4
|
+
<title><%%= content_for(:title) || "<%= app_name.titleize %>" %></title>
|
5
5
|
<meta name="viewport" content="width=device-width,initial-scale=1">
|
6
|
+
<meta name="apple-mobile-web-app-capable" content="yes">
|
6
7
|
<%%= csrf_meta_tags %>
|
7
8
|
<%%= csp_meta_tag %>
|
8
9
|
|
10
|
+
<%%= yield :head %>
|
11
|
+
|
12
|
+
<link rel="manifest" href="/manifest.json">
|
13
|
+
<link rel="icon" href="/icon.png" type="image/png">
|
14
|
+
<link rel="icon" href="/icon.svg" type="image/svg+xml">
|
15
|
+
<link rel="apple-touch-icon" href="/icon.png">
|
9
16
|
<%- if options[:skip_hotwire] || options[:skip_javascript] -%>
|
10
17
|
<%%= stylesheet_link_tag "application" %>
|
11
18
|
<%- else -%>
|
@@ -0,0 +1,22 @@
|
|
1
|
+
{
|
2
|
+
"name": "<%= camelized %>",
|
3
|
+
"icons": [
|
4
|
+
{
|
5
|
+
"src": "/icon.png",
|
6
|
+
"type": "image/png",
|
7
|
+
"sizes": "512x512"
|
8
|
+
},
|
9
|
+
{
|
10
|
+
"src": "/icon.png",
|
11
|
+
"type": "image/png",
|
12
|
+
"sizes": "512x512",
|
13
|
+
"purpose": "maskable"
|
14
|
+
}
|
15
|
+
],
|
16
|
+
"start_url": "/",
|
17
|
+
"display": "standalone",
|
18
|
+
"scope": "/",
|
19
|
+
"description": "<%= camelized %>.",
|
20
|
+
"theme_color": "red",
|
21
|
+
"background_color": "red"
|
22
|
+
}
|
@@ -0,0 +1,26 @@
|
|
1
|
+
// Add a service worker for processing Web Push notifications:
|
2
|
+
//
|
3
|
+
// self.addEventListener("push", async (event) => {
|
4
|
+
// const { title, options } = await event.data.json()
|
5
|
+
// event.waitUntil(self.registration.showNotification(title, options))
|
6
|
+
// })
|
7
|
+
//
|
8
|
+
// self.addEventListener("notificationclick", function(event) {
|
9
|
+
// event.notification.close()
|
10
|
+
// event.waitUntil(
|
11
|
+
// clients.matchAll({ type: "window" }).then((clientList) => {
|
12
|
+
// for (let i = 0; i < clientList.length; i++) {
|
13
|
+
// let client = clientList[i]
|
14
|
+
// let clientPath = (new URL(client.url)).pathname
|
15
|
+
//
|
16
|
+
// if (clientPath == event.notification.data.path && "focus" in client) {
|
17
|
+
// return client.focus()
|
18
|
+
// }
|
19
|
+
// }
|
20
|
+
//
|
21
|
+
// if (clients.openWindow) {
|
22
|
+
// return clients.openWindow(event.notification.data.path)
|
23
|
+
// }
|
24
|
+
// })
|
25
|
+
// )
|
26
|
+
// })
|
@@ -1,7 +1,7 @@
|
|
1
1
|
require "fileutils"
|
2
2
|
|
3
|
-
# path to your application root.
|
4
3
|
APP_ROOT = File.expand_path("..", __dir__)
|
4
|
+
APP_NAME = "<%= app_name.dasherize %>"
|
5
5
|
|
6
6
|
def system!(*args)
|
7
7
|
system(*args, exception: true)
|
@@ -18,7 +18,7 @@ FileUtils.chdir APP_ROOT do
|
|
18
18
|
<% if using_node? -%>
|
19
19
|
|
20
20
|
# Install JavaScript dependencies
|
21
|
-
system("yarn
|
21
|
+
system("yarn install --check-files")
|
22
22
|
<% elsif using_bun? -%>
|
23
23
|
|
24
24
|
# Install JavaScript dependencies
|
@@ -40,4 +40,8 @@ FileUtils.chdir APP_ROOT do
|
|
40
40
|
|
41
41
|
puts "\n== Restarting application server =="
|
42
42
|
system! "bin/rails restart"
|
43
|
+
|
44
|
+
# puts "\n== Configuring puma-dev =="
|
45
|
+
# system "ln -nfs #{APP_ROOT} ~/.puma-dev/#{APP_NAME}"
|
46
|
+
# system "curl -Is https://#{APP_NAME}.test/up | head -n 1"
|
43
47
|
end
|
@@ -18,7 +18,7 @@ module <%= app_const_base %>
|
|
18
18
|
# Please, add to the `ignore` list any other `lib` subdirectories that do
|
19
19
|
# not contain `.rb` files, or that should not be reloaded or eager loaded.
|
20
20
|
# Common ones are `templates`, `generators`, or `middleware`, for example.
|
21
|
-
config.autoload_lib(ignore: %w
|
21
|
+
config.autoload_lib(ignore: %w[assets tasks])
|
22
22
|
|
23
23
|
# Configuration for the application, engines, and railties goes here.
|
24
24
|
#
|
@@ -15,10 +15,10 @@ default: &default
|
|
15
15
|
pool: <%%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %>
|
16
16
|
username: root
|
17
17
|
password:
|
18
|
-
<% if
|
19
|
-
socket: <%=
|
18
|
+
<% if database.socket -%>
|
19
|
+
socket: <%= database.socket %>
|
20
20
|
<% else -%>
|
21
|
-
host:
|
21
|
+
host: <%%= ENV.fetch("DB_HOST") { "<%= database.host %>" } %>
|
22
22
|
<% end -%>
|
23
23
|
|
24
24
|
development:
|
@@ -18,6 +18,13 @@ default: &default
|
|
18
18
|
# For details on connection pooling, see Rails configuration guide
|
19
19
|
# https://guides.rubyonrails.org/configuring.html#database-pooling
|
20
20
|
pool: <%%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %>
|
21
|
+
<% if devcontainer? -%>
|
22
|
+
<%% if ENV["DB_HOST"] %>
|
23
|
+
host: <%%= ENV["DB_HOST"] %>
|
24
|
+
username: postgres
|
25
|
+
password: postgres
|
26
|
+
<%% end %>
|
27
|
+
<% end %>
|
21
28
|
|
22
29
|
development:
|
23
30
|
<<: *default
|
@@ -20,6 +20,13 @@ test:
|
|
20
20
|
<<: *default
|
21
21
|
database: storage/test.sqlite3
|
22
22
|
|
23
|
+
|
24
|
+
# SQLite3 write its data on the local filesystem, as such it requires
|
25
|
+
# persistent disks. If you are deploying to a managed service, you should
|
26
|
+
# make sure it provides disk persistence, as many don't.
|
27
|
+
#
|
28
|
+
# Similarly, if you deploy your application as a Docker container, you must
|
29
|
+
# ensure the database is located in a persisted volume.
|
23
30
|
production:
|
24
31
|
<<: *default
|
25
|
-
database: storage/production.sqlite3
|
32
|
+
# database: path/to/persistent/storage/production.sqlite3
|
@@ -15,10 +15,10 @@ default: &default
|
|
15
15
|
pool: <%%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %>
|
16
16
|
username: root
|
17
17
|
password:
|
18
|
-
<% if
|
19
|
-
socket: <%=
|
18
|
+
<% if database.socket -%>
|
19
|
+
socket: <%= database.socket %>
|
20
20
|
<% else -%>
|
21
|
-
host:
|
21
|
+
host: <%%= ENV.fetch("DB_HOST") { "<%= database.host %>" } %>
|
22
22
|
<% end -%>
|
23
23
|
|
24
24
|
development:
|
@@ -14,7 +14,7 @@ Rails.application.configure do
|
|
14
14
|
# Show full error reports.
|
15
15
|
config.consider_all_requests_local = true
|
16
16
|
|
17
|
-
# Enable server timing
|
17
|
+
# Enable server timing.
|
18
18
|
config.server_timing = true
|
19
19
|
|
20
20
|
# Enable/disable caching. By default caching is disabled.
|
@@ -26,9 +26,7 @@ Rails.application.configure do
|
|
26
26
|
|
27
27
|
<%- end -%>
|
28
28
|
config.cache_store = :memory_store
|
29
|
-
config.public_file_server.headers = {
|
30
|
-
"Cache-Control" => "public, max-age=#{2.days.to_i}"
|
31
|
-
}
|
29
|
+
config.public_file_server.headers = { "Cache-Control" => "public, max-age=#{2.days.to_i}" }
|
32
30
|
else
|
33
31
|
config.action_controller.perform_caching = false
|
34
32
|
|
@@ -44,7 +42,11 @@ Rails.application.configure do
|
|
44
42
|
# Don't care if the mailer can't send.
|
45
43
|
config.action_mailer.raise_delivery_errors = false
|
46
44
|
|
45
|
+
# Disable caching for Action Mailer templates even if Action Controller
|
46
|
+
# caching is enabled.
|
47
47
|
config.action_mailer.perform_caching = false
|
48
|
+
|
49
|
+
config.action_mailer.default_url_options = { host: "localhost", port: 3000 }
|
48
50
|
<%- end -%>
|
49
51
|
|
50
52
|
# Print deprecation notices to the Rails logger.
|
@@ -72,19 +74,24 @@ Rails.application.configure do
|
|
72
74
|
<%- unless skip_sprockets? -%>
|
73
75
|
# Suppress logger output for asset requests.
|
74
76
|
config.assets.quiet = true
|
75
|
-
<%- end -%>
|
76
77
|
|
78
|
+
<%- end -%>
|
77
79
|
# Raises error for missing translations.
|
78
80
|
# config.i18n.raise_on_missing_translations = true
|
79
81
|
|
80
82
|
# Annotate rendered view with file names.
|
81
|
-
|
83
|
+
config.action_view.annotate_rendered_view_with_filenames = true
|
82
84
|
|
83
85
|
<%- unless skip_action_cable? -%>
|
84
86
|
# Uncomment if you wish to allow Action Cable access from any origin.
|
85
87
|
# config.action_cable.disable_request_forgery_protection = true
|
86
88
|
|
87
89
|
<%- end -%>
|
88
|
-
# Raise error when a before_action's only/except options reference missing actions
|
90
|
+
# Raise error when a before_action's only/except options reference missing actions.
|
89
91
|
config.action_controller.raise_on_missing_callback_actions = true
|
92
|
+
<%- unless skip_rubocop? -%>
|
93
|
+
|
94
|
+
# Apply autocorrection by RuboCop to files generated by `bin/rails generate`.
|
95
|
+
# config.generators.apply_rubocop_autocorrect_after_generate!
|
96
|
+
<%- end -%>
|
90
97
|
end
|
@@ -59,6 +59,9 @@ Rails.application.configure do
|
|
59
59
|
# Force all access to the app over SSL, use Strict-Transport-Security, and use secure cookies.
|
60
60
|
config.force_ssl = true
|
61
61
|
|
62
|
+
# Skip http-to-https redirect for the default health check endpoint.
|
63
|
+
# config.ssl_options = { redirect: { exclude: ->(request) { request.path == "/up" } } }
|
64
|
+
|
62
65
|
# Log to STDOUT by default
|
63
66
|
config.logger = ActiveSupport::Logger.new(STDOUT)
|
64
67
|
.tap { |logger| logger.formatter = ::Logger::Formatter.new }
|
@@ -82,6 +85,8 @@ Rails.application.configure do
|
|
82
85
|
|
83
86
|
<%- end -%>
|
84
87
|
<%- unless options.skip_action_mailer? -%>
|
88
|
+
# Disable caching for Action Mailer templates even if Action Controller
|
89
|
+
# caching is enabled.
|
85
90
|
config.action_mailer.perform_caching = false
|
86
91
|
|
87
92
|
# Ignore bad email addresses and do not raise email delivery errors.
|
@@ -18,10 +18,7 @@ Rails.application.configure do
|
|
18
18
|
config.eager_load = ENV["CI"].present?
|
19
19
|
|
20
20
|
# Configure public file server for tests with Cache-Control for performance.
|
21
|
-
config.public_file_server.
|
22
|
-
config.public_file_server.headers = {
|
23
|
-
"Cache-Control" => "public, max-age=#{1.hour.to_i}"
|
24
|
-
}
|
21
|
+
config.public_file_server.headers = { "Cache-Control" => "public, max-age=#{1.hour.to_i}" }
|
25
22
|
|
26
23
|
# Show full error reports and disable caching.
|
27
24
|
config.consider_all_requests_local = true
|
@@ -40,6 +37,8 @@ Rails.application.configure do
|
|
40
37
|
|
41
38
|
<%- end -%>
|
42
39
|
<%- unless options.skip_action_mailer? -%>
|
40
|
+
# Disable caching for Action Mailer templates even if Action Controller
|
41
|
+
# caching is enabled.
|
43
42
|
config.action_mailer.perform_caching = false
|
44
43
|
|
45
44
|
# Tell Action Mailer not to deliver emails to the real world.
|
@@ -47,6 +46,10 @@ Rails.application.configure do
|
|
47
46
|
# ActionMailer::Base.deliveries array.
|
48
47
|
config.action_mailer.delivery_method = :test
|
49
48
|
|
49
|
+
# Unlike controllers, the mailer instance doesn't have any context about the
|
50
|
+
# incoming request so you'll need to provide the :host parameter yourself.
|
51
|
+
config.action_mailer.default_url_options = { host: "www.example.com" }
|
52
|
+
|
50
53
|
<%- end -%>
|
51
54
|
# Print deprecation notices to the stderr.
|
52
55
|
config.active_support.deprecation = :stderr
|
@@ -63,6 +66,6 @@ Rails.application.configure do
|
|
63
66
|
# Annotate rendered view with file names.
|
64
67
|
# config.action_view.annotate_rendered_view_with_filenames = true
|
65
68
|
|
66
|
-
# Raise error when a before_action's only/except options reference missing actions
|
69
|
+
# Raise error when a before_action's only/except options reference missing actions.
|
67
70
|
config.action_controller.raise_on_missing_callback_actions = true
|
68
71
|
end
|
data/lib/rails/generators/rails/app/templates/config/initializers/filter_parameter_logging.rb.tt
CHANGED
@@ -4,5 +4,5 @@
|
|
4
4
|
# Use this to limit dissemination of sensitive information.
|
5
5
|
# See the ActiveSupport::ParameterFilter documentation for supported notations and behaviors.
|
6
6
|
Rails.application.config.filter_parameters += [
|
7
|
-
:passw, :secret, :token, :_key, :crypt, :salt, :certificate, :otp, :ssn
|
7
|
+
:passw, :email, :secret, :token, :_key, :crypt, :salt, :certificate, :otp, :ssn
|
8
8
|
]
|