railties 6.0.0.beta3 → 6.0.0.rc1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +86 -7
- data/RDOC_MAIN.rdoc +3 -3
- data/README.rdoc +1 -1
- data/lib/rails/application.rb +3 -1
- data/lib/rails/application/configuration.rb +27 -1
- data/lib/rails/application/default_middleware_stack.rb +1 -0
- data/lib/rails/application/dummy_erb_compiler.rb +19 -0
- data/lib/rails/application/finisher.rb +38 -1
- data/lib/rails/autoloaders.rb +10 -2
- data/lib/rails/command/environment_argument.rb +7 -4
- data/lib/rails/commands/console/console_command.rb +6 -0
- data/lib/rails/commands/credentials/USAGE +1 -1
- data/lib/rails/commands/credentials/credentials_command.rb +17 -3
- data/lib/rails/commands/dbconsole/dbconsole_command.rb +19 -7
- data/lib/rails/commands/dev/dev_command.rb +4 -2
- data/lib/rails/commands/encrypted/USAGE +28 -0
- data/lib/rails/commands/encrypted/encrypted_command.rb +1 -0
- data/lib/rails/commands/initializers/initializers_command.rb +7 -0
- data/lib/rails/commands/notes/notes_command.rb +1 -1
- data/lib/rails/commands/runner/runner_command.rb +7 -3
- data/lib/rails/commands/server/server_command.rb +8 -6
- data/lib/rails/engine.rb +27 -31
- data/lib/rails/gem_version.rb +1 -1
- data/lib/rails/generators.rb +2 -0
- data/lib/rails/generators/app_base.rb +2 -2
- data/lib/rails/generators/app_name.rb +2 -2
- data/lib/rails/generators/database.rb +1 -1
- data/lib/rails/generators/erb/scaffold/templates/_form.html.erb.tt +6 -3
- data/lib/rails/generators/erb/scaffold/templates/show.html.erb.tt +8 -0
- data/lib/rails/generators/generated_attribute.rb +36 -10
- data/lib/rails/generators/named_base.rb +1 -0
- data/lib/rails/generators/rails/app/templates/Gemfile.tt +3 -3
- data/lib/rails/generators/rails/app/templates/app/javascript/packs/application.js.tt +8 -0
- data/lib/rails/generators/rails/app/templates/bin/setup.tt +3 -2
- data/lib/rails/generators/rails/app/templates/config/environments/development.rb.tt +2 -0
- data/lib/rails/generators/rails/app/templates/config/environments/production.rb.tt +2 -0
- data/lib/rails/generators/rails/app/templates/config/environments/test.rb.tt +10 -5
- data/lib/rails/generators/rails/app/templates/ruby-version.tt +1 -1
- data/lib/rails/generators/rails/assets/assets_generator.rb +7 -0
- data/lib/rails/generators/rails/db/system/change/change_generator.rb +12 -2
- data/lib/rails/generators/rails/plugin/plugin_generator.rb +0 -15
- data/lib/rails/generators/rails/scaffold_controller/scaffold_controller_generator.rb +8 -0
- data/lib/rails/generators/rails/scaffold_controller/templates/api_controller.rb.tt +1 -1
- data/lib/rails/generators/rails/scaffold_controller/templates/controller.rb.tt +1 -1
- data/lib/rails/generators/test_unit/model/templates/fixtures.yml.tt +2 -2
- data/lib/rails/mailers_controller.rb +6 -3
- data/lib/rails/source_annotation_extractor.rb +14 -1
- data/lib/rails/tasks.rb +1 -0
- data/lib/rails/tasks/zeitwerk.rake +78 -0
- metadata +14 -12
- data/lib/rails/generators/rails/app/templates/bin/update.tt +0 -33
@@ -1,6 +1,7 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
3
|
require "active_support/time"
|
4
|
+
require "active_support/deprecation"
|
4
5
|
|
5
6
|
module Rails
|
6
7
|
module Generators
|
@@ -51,6 +52,12 @@ module Rails
|
|
51
52
|
type = $1
|
52
53
|
provided_options = $2.split(/[,.-]/)
|
53
54
|
options = Hash[provided_options.map { |opt| [opt.to_sym, true] }]
|
55
|
+
|
56
|
+
if options[:required]
|
57
|
+
ActiveSupport::Deprecation.warn("Passing {required} option has no effect on the model generator. It will be removed in Rails 6.1.\n")
|
58
|
+
options.delete(:required)
|
59
|
+
end
|
60
|
+
|
54
61
|
return type, options
|
55
62
|
else
|
56
63
|
return type, {}
|
@@ -68,13 +75,15 @@ module Rails
|
|
68
75
|
|
69
76
|
def field_type
|
70
77
|
@field_type ||= case type
|
71
|
-
when :integer
|
72
|
-
when :float, :decimal
|
73
|
-
when :time
|
74
|
-
when :datetime, :timestamp
|
75
|
-
when :date
|
76
|
-
when :text
|
77
|
-
when :
|
78
|
+
when :integer then :number_field
|
79
|
+
when :float, :decimal then :text_field
|
80
|
+
when :time then :time_select
|
81
|
+
when :datetime, :timestamp then :datetime_select
|
82
|
+
when :date then :date_select
|
83
|
+
when :text then :text_area
|
84
|
+
when :rich_text then :rich_text_area
|
85
|
+
when :boolean then :check_box
|
86
|
+
when :attachment, :attachments then :file_field
|
78
87
|
else
|
79
88
|
:text_field
|
80
89
|
end
|
@@ -90,7 +99,9 @@ module Rails
|
|
90
99
|
when :string then name == "type" ? "" : "MyString"
|
91
100
|
when :text then "MyText"
|
92
101
|
when :boolean then false
|
93
|
-
when :references, :belongs_to
|
102
|
+
when :references, :belongs_to,
|
103
|
+
:attachment, :attachments,
|
104
|
+
:rich_text then nil
|
94
105
|
else
|
95
106
|
""
|
96
107
|
end
|
@@ -133,7 +144,7 @@ module Rails
|
|
133
144
|
end
|
134
145
|
|
135
146
|
def required?
|
136
|
-
|
147
|
+
reference? && Rails.application.config.active_record.belongs_to_required_by_default
|
137
148
|
end
|
138
149
|
|
139
150
|
def has_index?
|
@@ -152,6 +163,22 @@ module Rails
|
|
152
163
|
type == :token
|
153
164
|
end
|
154
165
|
|
166
|
+
def rich_text?
|
167
|
+
type == :rich_text
|
168
|
+
end
|
169
|
+
|
170
|
+
def attachment?
|
171
|
+
type == :attachment
|
172
|
+
end
|
173
|
+
|
174
|
+
def attachments?
|
175
|
+
type == :attachments
|
176
|
+
end
|
177
|
+
|
178
|
+
def virtual?
|
179
|
+
rich_text? || attachment? || attachments?
|
180
|
+
end
|
181
|
+
|
155
182
|
def inject_options
|
156
183
|
(+"").tap { |s| options_for_migration.each { |k, v| s << ", #{k}: #{v.inspect}" } }
|
157
184
|
end
|
@@ -163,7 +190,6 @@ module Rails
|
|
163
190
|
def options_for_migration
|
164
191
|
@attr_options.dup.tap do |options|
|
165
192
|
if required?
|
166
|
-
options.delete(:required)
|
167
193
|
options[:null] = false
|
168
194
|
end
|
169
195
|
|
@@ -187,6 +187,7 @@ module Rails
|
|
187
187
|
|
188
188
|
def attributes_names # :doc:
|
189
189
|
@attributes_names ||= attributes.each_with_object([]) do |a, names|
|
190
|
+
next if a.attachments?
|
190
191
|
names << a.column_name
|
191
192
|
names << "password_confirmation" if a.password_digest?
|
192
193
|
names << "#{a.name}_type" if a.polymorphic?
|
@@ -28,7 +28,7 @@ ruby <%= "'#{RUBY_VERSION}'" -%>
|
|
28
28
|
|
29
29
|
<% if depend_on_bootsnap? -%>
|
30
30
|
# Reduces boot times through caching; required in config/boot.rb
|
31
|
-
gem 'bootsnap', '>= 1.4.
|
31
|
+
gem 'bootsnap', '>= 1.4.2', require: false
|
32
32
|
|
33
33
|
<%- end -%>
|
34
34
|
<%- if options.api? -%>
|
@@ -69,8 +69,8 @@ group :test do
|
|
69
69
|
# Adds support for Capybara system testing and selenium driver
|
70
70
|
gem 'capybara', '>= 2.15'
|
71
71
|
gem 'selenium-webdriver'
|
72
|
-
# Easy installation and use of
|
73
|
-
gem '
|
72
|
+
# Easy installation and use of web drivers to run system tests with browsers
|
73
|
+
gem 'webdrivers'
|
74
74
|
end
|
75
75
|
<%- end -%>
|
76
76
|
|
@@ -13,3 +13,11 @@ require("@rails/activestorage").start()
|
|
13
13
|
<%- unless options[:skip_action_cable] -%>
|
14
14
|
require("channels")
|
15
15
|
<%- end -%>
|
16
|
+
|
17
|
+
|
18
|
+
// Uncomment to copy all static images under ../images to the output folder and reference
|
19
|
+
// them with the image_pack_tag helper in views (e.g <%%= image_pack_tag 'rails.png' %>)
|
20
|
+
// or the `imagePath` JavaScript helper below.
|
21
|
+
//
|
22
|
+
// const images = require.context('../images', true)
|
23
|
+
// const imagePath = (name) => images(name, true)
|
@@ -8,7 +8,8 @@ def system!(*args)
|
|
8
8
|
end
|
9
9
|
|
10
10
|
FileUtils.chdir APP_ROOT do
|
11
|
-
# This script is a
|
11
|
+
# This script is a way to setup or update your development environment automatically.
|
12
|
+
# This script is idempotent, so that you can run it at anytime and get an expectable outcome.
|
12
13
|
# Add necessary setup steps to this file.
|
13
14
|
|
14
15
|
puts '== Installing dependencies =='
|
@@ -27,7 +28,7 @@ FileUtils.chdir APP_ROOT do
|
|
27
28
|
# end
|
28
29
|
|
29
30
|
puts "\n== Preparing database =="
|
30
|
-
system! 'bin/rails db:
|
31
|
+
system! 'bin/rails db:prepare'
|
31
32
|
<% end -%>
|
32
33
|
|
33
34
|
puts "\n== Removing old logs and tempfiles =="
|
@@ -15,9 +15,11 @@ Rails.application.configure do
|
|
15
15
|
# Enable/disable caching. By default caching is disabled.
|
16
16
|
# Run rails dev:cache to toggle caching.
|
17
17
|
if Rails.root.join('tmp', 'caching-dev.txt').exist?
|
18
|
+
<%- unless options.api? -%>
|
18
19
|
config.action_controller.perform_caching = true
|
19
20
|
config.action_controller.enable_fragment_cache_logging = true
|
20
21
|
|
22
|
+
<%- end -%>
|
21
23
|
config.cache_store = :memory_store
|
22
24
|
config.public_file_server.headers = {
|
23
25
|
'Cache-Control' => "public, max-age=#{2.days.to_i}"
|
@@ -12,7 +12,9 @@ Rails.application.configure do
|
|
12
12
|
|
13
13
|
# Full error reports are disabled and caching is turned on.
|
14
14
|
config.consider_all_requests_local = false
|
15
|
+
<%- unless options.api? -%>
|
15
16
|
config.action_controller.perform_caching = true
|
17
|
+
<%- end -%>
|
16
18
|
|
17
19
|
# Ensures that a master key has been made available in either ENV["RAILS_MASTER_KEY"]
|
18
20
|
# or in config/master.key. This key is used to decrypt credentials (and other encrypted files).
|
@@ -1,11 +1,16 @@
|
|
1
|
+
# The test environment is used exclusively to run your application's
|
2
|
+
# test suite. You never need to work with it otherwise. Remember that
|
3
|
+
# your test database is "scratch space" for the test suite and is wiped
|
4
|
+
# and recreated between test runs. Don't rely on the data there!
|
5
|
+
|
1
6
|
Rails.application.configure do
|
2
7
|
# Settings specified here will take precedence over those in config/application.rb.
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
# and recreated between test runs. Don't rely on the data there!
|
8
|
+
<%# Spring executes the reloaders when files change. %>
|
9
|
+
<%- if spring_install? -%>
|
10
|
+
config.cache_classes = false
|
11
|
+
<%- else -%>
|
8
12
|
config.cache_classes = true
|
13
|
+
<%- end -%>
|
9
14
|
|
10
15
|
# Do not eager load code on boot. This avoids loading your whole application
|
11
16
|
# just for the purpose of running a single test. If you are using a tool that
|
@@ -1 +1 @@
|
|
1
|
-
<%= ENV["RBENV_VERSION"] || ENV["rvm_ruby_string"] || "#{RUBY_ENGINE}-#{RUBY_ENGINE_VERSION}"
|
1
|
+
<%= ENV["RBENV_VERSION"] || ENV["rvm_ruby_string"] || "#{RUBY_ENGINE}-#{RUBY_ENGINE_VERSION}" %>
|
@@ -3,7 +3,10 @@
|
|
3
3
|
module Rails
|
4
4
|
module Generators
|
5
5
|
class AssetsGenerator < NamedBase # :nodoc:
|
6
|
+
class_option :javascripts, type: :boolean, desc: "Generate JavaScripts"
|
6
7
|
class_option :stylesheets, type: :boolean, desc: "Generate Stylesheets"
|
8
|
+
|
9
|
+
class_option :javascript_engine, desc: "Engine for JavaScripts"
|
7
10
|
class_option :stylesheet_engine, desc: "Engine for Stylesheets"
|
8
11
|
|
9
12
|
private
|
@@ -11,6 +14,10 @@ module Rails
|
|
11
14
|
file_name
|
12
15
|
end
|
13
16
|
|
17
|
+
hook_for :javascript_engine do |javascript_engine|
|
18
|
+
invoke javascript_engine, [name] if options[:javascripts]
|
19
|
+
end
|
20
|
+
|
14
21
|
hook_for :stylesheet_engine do |stylesheet_engine|
|
15
22
|
invoke stylesheet_engine, [name] if options[:stylesheets]
|
16
23
|
end
|
@@ -35,8 +35,9 @@ module Rails
|
|
35
35
|
end
|
36
36
|
|
37
37
|
def edit_gemfile
|
38
|
-
|
39
|
-
gsub_file("Gemfile", all_database_gems_regex,
|
38
|
+
name, version = gem_for_database
|
39
|
+
gsub_file("Gemfile", all_database_gems_regex, name)
|
40
|
+
gsub_file("Gemfile", gem_entry_regex_for(name), gem_entry_for(name, *version))
|
40
41
|
end
|
41
42
|
|
42
43
|
private
|
@@ -48,6 +49,15 @@ module Rails
|
|
48
49
|
all_database_gem_names = all_database_gems.map(&:first)
|
49
50
|
/(\b#{all_database_gem_names.join('\b|\b')}\b)/
|
50
51
|
end
|
52
|
+
|
53
|
+
def gem_entry_regex_for(gem_name)
|
54
|
+
/^gem.*\b#{gem_name}\b.*/
|
55
|
+
end
|
56
|
+
|
57
|
+
def gem_entry_for(*gem_name_and_version)
|
58
|
+
gem_name_and_version.map! { |segment| "'#{segment}'" }
|
59
|
+
"gem #{gem_name_and_version.join(", ")}"
|
60
|
+
end
|
51
61
|
end
|
52
62
|
end
|
53
63
|
end
|
@@ -144,17 +144,6 @@ task default: :test
|
|
144
144
|
end
|
145
145
|
end
|
146
146
|
|
147
|
-
def javascripts
|
148
|
-
return if options.skip_javascript?
|
149
|
-
|
150
|
-
if mountable?
|
151
|
-
template "rails/javascripts.js",
|
152
|
-
"app/assets/javascripts/#{namespaced_name}/application.js"
|
153
|
-
elsif full?
|
154
|
-
empty_directory_with_keep_file "app/assets/javascripts/#{namespaced_name}"
|
155
|
-
end
|
156
|
-
end
|
157
|
-
|
158
147
|
def bin(force = false)
|
159
148
|
bin_file = engine? ? "bin/rails.tt" : "bin/test.tt"
|
160
149
|
template bin_file, force: force do |content|
|
@@ -236,10 +225,6 @@ task default: :test
|
|
236
225
|
build(:stylesheets) unless api?
|
237
226
|
end
|
238
227
|
|
239
|
-
def create_javascript_files
|
240
|
-
build(:javascripts) unless api?
|
241
|
-
end
|
242
|
-
|
243
228
|
def create_bin_files
|
244
229
|
build(:bin)
|
245
230
|
end
|
@@ -32,6 +32,14 @@ module Rails
|
|
32
32
|
hook_for :helper, as: :scaffold do |invoked|
|
33
33
|
invoke invoked, [ controller_name ]
|
34
34
|
end
|
35
|
+
|
36
|
+
private
|
37
|
+
|
38
|
+
def permitted_params
|
39
|
+
params = attributes_names.map { |name| ":#{name}" }.join(", ")
|
40
|
+
params += attributes.select(&:attachments?).map { |a| ", #{a.name}: []" }.join
|
41
|
+
params
|
42
|
+
end
|
35
43
|
end
|
36
44
|
end
|
37
45
|
end
|
@@ -54,7 +54,7 @@ class <%= controller_class_name %>Controller < ApplicationController
|
|
54
54
|
<%- if attributes_names.empty? -%>
|
55
55
|
params.fetch(:<%= singular_table_name %>, {})
|
56
56
|
<%- else -%>
|
57
|
-
params.require(:<%= singular_table_name %>).permit(<%=
|
57
|
+
params.require(:<%= singular_table_name %>).permit(<%= permitted_params %>)
|
58
58
|
<%- end -%>
|
59
59
|
end
|
60
60
|
end
|
@@ -61,7 +61,7 @@ class <%= controller_class_name %>Controller < ApplicationController
|
|
61
61
|
<%- if attributes_names.empty? -%>
|
62
62
|
params.fetch(:<%= singular_table_name %>, {})
|
63
63
|
<%- else -%>
|
64
|
-
params.require(:<%= singular_table_name %>).permit(<%=
|
64
|
+
params.require(:<%= singular_table_name %>).permit(<%= permitted_params %>)
|
65
65
|
<%- end -%>
|
66
66
|
end
|
67
67
|
end
|
@@ -1,4 +1,4 @@
|
|
1
|
-
# Read about fixtures at
|
1
|
+
# Read about fixtures at https://api.rubyonrails.org/classes/ActiveRecord/FixtureSet.html
|
2
2
|
<% unless attributes.empty? -%>
|
3
3
|
<% %w(one two).each do |name| %>
|
4
4
|
<%= name %>:
|
@@ -7,7 +7,7 @@
|
|
7
7
|
password_digest: <%%= BCrypt::Password.create('secret') %>
|
8
8
|
<%- elsif attribute.reference? -%>
|
9
9
|
<%= yaml_key_value(attribute.column_name.sub(/_id$/, ''), attribute.default || name) %>
|
10
|
-
<%-
|
10
|
+
<%- elsif !attribute.virtual? -%>
|
11
11
|
<%= yaml_key_value(attribute.column_name, attribute.default) %>
|
12
12
|
<%- end -%>
|
13
13
|
<%- if attribute.polymorphic? -%>
|
@@ -5,8 +5,9 @@ require "rails/application_controller"
|
|
5
5
|
class Rails::MailersController < Rails::ApplicationController # :nodoc:
|
6
6
|
prepend_view_path ActionDispatch::DebugView::RESCUES_TEMPLATE_PATH
|
7
7
|
|
8
|
+
around_action :set_locale, only: :preview
|
9
|
+
before_action :find_preview, only: :preview
|
8
10
|
before_action :require_local!, unless: :show_previews?
|
9
|
-
before_action :find_preview, :set_locale, only: :preview
|
10
11
|
|
11
12
|
helper_method :part_query, :locale_query
|
12
13
|
|
@@ -38,7 +39,7 @@ class Rails::MailersController < Rails::ApplicationController # :nodoc:
|
|
38
39
|
end
|
39
40
|
else
|
40
41
|
@part = find_preferred_part(request.format, Mime[:html], Mime[:text])
|
41
|
-
render action: "email", layout: false, formats:
|
42
|
+
render action: "email", layout: false, formats: [:html]
|
42
43
|
end
|
43
44
|
else
|
44
45
|
raise AbstractController::ActionNotFound, "Email '#{@email_action}' not found in #{@preview.name}"
|
@@ -92,6 +93,8 @@ class Rails::MailersController < Rails::ApplicationController # :nodoc:
|
|
92
93
|
end
|
93
94
|
|
94
95
|
def set_locale
|
95
|
-
I18n.
|
96
|
+
I18n.with_locale(params[:locale] || I18n.default_locale) do
|
97
|
+
yield
|
98
|
+
end
|
96
99
|
end
|
97
100
|
end
|
@@ -29,6 +29,16 @@ module Rails
|
|
29
29
|
directories.push(*dirs)
|
30
30
|
end
|
31
31
|
|
32
|
+
def self.tags
|
33
|
+
@@tags ||= %w(OPTIMIZE FIXME TODO)
|
34
|
+
end
|
35
|
+
|
36
|
+
# Registers additional tags
|
37
|
+
# Rails::SourceAnnotationExtractor::Annotation.register_tags("TESTME", "DEPRECATEME")
|
38
|
+
def self.register_tags(*additional_tags)
|
39
|
+
tags.push(*additional_tags)
|
40
|
+
end
|
41
|
+
|
32
42
|
def self.extensions
|
33
43
|
@@extensions ||= {}
|
34
44
|
end
|
@@ -66,6 +76,8 @@ module Rails
|
|
66
76
|
# Prints all annotations with tag +tag+ under the root directories +app+,
|
67
77
|
# +config+, +db+, +lib+, and +test+ (recursively).
|
68
78
|
#
|
79
|
+
# If +tag+ is <tt>nil</tt>, annotations with either default or registered tags are printed.
|
80
|
+
#
|
69
81
|
# Specific directories can be explicitly set using the <tt>:dirs</tt> key in +options+.
|
70
82
|
#
|
71
83
|
# Rails::SourceAnnotationExtractor.enumerate 'TODO|FIXME', dirs: %w(app lib), tag: true
|
@@ -75,7 +87,8 @@ module Rails
|
|
75
87
|
# See <tt>#find_in</tt> for a list of file extensions that will be taken into account.
|
76
88
|
#
|
77
89
|
# This class method is the single entry point for the `rails notes` command.
|
78
|
-
def self.enumerate(tag, options = {})
|
90
|
+
def self.enumerate(tag = nil, options = {})
|
91
|
+
tag ||= Annotation.tags.join("|")
|
79
92
|
extractor = new(tag)
|
80
93
|
dirs = options.delete(:dirs) || Annotation.directories
|
81
94
|
extractor.display(extractor.find(dirs), options)
|
data/lib/rails/tasks.rb
CHANGED
@@ -0,0 +1,78 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
ensure_classic_mode = ->() do
|
4
|
+
if Rails.autoloaders.zeitwerk_enabled?
|
5
|
+
abort <<~EOS
|
6
|
+
Please, enable temporarily :classic mode:
|
7
|
+
|
8
|
+
# config/application.rb
|
9
|
+
config.autoloader = :classic
|
10
|
+
|
11
|
+
and try again. When all is good, you can delete that line.
|
12
|
+
EOS
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
eager_load = ->() do
|
17
|
+
Rails.configuration.eager_load_namespaces.each(&:eager_load!)
|
18
|
+
end
|
19
|
+
|
20
|
+
mismatches = []
|
21
|
+
check_directory = ->(directory, parent) do
|
22
|
+
# test/mailers/previews might not exist.
|
23
|
+
return unless File.exists?(directory)
|
24
|
+
|
25
|
+
Dir.foreach(directory) do |entry|
|
26
|
+
next if entry.start_with?(".")
|
27
|
+
next if parent == Object && entry == "concerns"
|
28
|
+
|
29
|
+
abspath = File.join(directory, entry)
|
30
|
+
|
31
|
+
if File.directory?(abspath) || abspath.end_with?(".rb")
|
32
|
+
print "."
|
33
|
+
cname = File.basename(abspath, ".rb").camelize.to_sym
|
34
|
+
if parent.const_defined?(cname, false)
|
35
|
+
if File.directory?(abspath)
|
36
|
+
check_directory[abspath, parent.const_get(cname)]
|
37
|
+
end
|
38
|
+
else
|
39
|
+
mismatches << [abspath, parent, cname]
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
45
|
+
report = ->() do
|
46
|
+
puts
|
47
|
+
if mismatches.empty?
|
48
|
+
puts "All is good!"
|
49
|
+
puts "Please, remember to delete `config.autoloader = :classic` from config/application.rb."
|
50
|
+
else
|
51
|
+
mismatches.each do |abspath, parent, cname|
|
52
|
+
relpath = abspath.sub(%r{\A#{Regexp.escape(Rails.root.to_path)}/}, "")
|
53
|
+
cpath = parent == Object ? cname : "#{parent.name}::#{cname}"
|
54
|
+
puts "expected #{relpath} to define #{cpath}"
|
55
|
+
end
|
56
|
+
puts
|
57
|
+
puts <<~EOS
|
58
|
+
Please revise the reported mismatches. You can normally fix them by adding
|
59
|
+
acronyms to config/initializers/inflections.rb or renaming the constants.
|
60
|
+
EOS
|
61
|
+
end
|
62
|
+
end
|
63
|
+
|
64
|
+
namespace :zeitwerk do
|
65
|
+
desc "Checks project structure for Zeitwerk compatibility"
|
66
|
+
task check: :environment do
|
67
|
+
ensure_classic_mode[]
|
68
|
+
eager_load[]
|
69
|
+
|
70
|
+
$stdout.sync = true
|
71
|
+
ActiveSupport::Dependencies.autoload_paths.each do |autoload_path|
|
72
|
+
check_directory[autoload_path, Object]
|
73
|
+
end
|
74
|
+
puts
|
75
|
+
|
76
|
+
report[]
|
77
|
+
end
|
78
|
+
end
|