railties 6.1.7.8 → 7.0.0.alpha1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +89 -463
- data/MIT-LICENSE +1 -1
- data/RDOC_MAIN.rdoc +16 -16
- data/README.rdoc +0 -1
- data/lib/rails/app_updater.rb +2 -4
- data/lib/rails/application/bootstrap.rb +17 -5
- data/lib/rails/application/configuration.rb +52 -31
- data/lib/rails/application/default_middleware_stack.rb +6 -3
- data/lib/rails/application/finisher.rb +43 -85
- data/lib/rails/application/routes_reloader.rb +8 -0
- data/lib/rails/application.rb +24 -50
- data/lib/rails/application_controller.rb +2 -2
- data/lib/rails/autoloaders/inflector.rb +21 -0
- data/lib/rails/autoloaders.rb +12 -16
- data/lib/rails/code_statistics.rb +2 -2
- data/lib/rails/code_statistics_calculator.rb +10 -1
- data/lib/rails/command/base.rb +26 -12
- data/lib/rails/command/behavior.rb +1 -1
- data/lib/rails/command/environment_argument.rb +1 -1
- data/lib/rails/command.rb +8 -5
- data/lib/rails/commands/credentials/USAGE +4 -2
- data/lib/rails/commands/credentials/credentials_command/diffing.rb +26 -16
- data/lib/rails/commands/credentials/credentials_command.rb +6 -2
- data/lib/rails/commands/dbconsole/dbconsole_command.rb +16 -15
- data/lib/rails/commands/help/USAGE +3 -2
- data/lib/rails/commands/runner/runner_command.rb +3 -2
- data/lib/rails/commands/server/server_command.rb +2 -5
- data/lib/rails/configuration.rb +18 -23
- data/lib/rails/engine/configuration.rb +2 -2
- data/lib/rails/engine.rb +23 -27
- data/lib/rails/gem_version.rb +4 -4
- data/lib/rails/generators/actions/create_migration.rb +2 -4
- data/lib/rails/generators/actions.rb +35 -13
- data/lib/rails/generators/app_base.rb +66 -102
- data/lib/rails/generators/app_name.rb +1 -1
- data/lib/rails/generators/base.rb +9 -13
- data/lib/rails/generators/erb/scaffold/scaffold_generator.rb +2 -0
- data/lib/rails/generators/erb/scaffold/templates/edit.html.erb.tt +8 -4
- data/lib/rails/generators/erb/scaffold/templates/index.html.erb.tt +5 -27
- data/lib/rails/generators/erb/scaffold/templates/new.html.erb.tt +7 -3
- data/lib/rails/generators/erb/scaffold/templates/partial.html.erb.tt +20 -0
- data/lib/rails/generators/erb/scaffold/templates/show.html.erb.tt +7 -16
- data/lib/rails/generators/erb.rb +1 -1
- data/lib/rails/generators/generated_attribute.rb +40 -4
- data/lib/rails/generators/migration.rb +2 -6
- data/lib/rails/generators/model_helpers.rb +1 -1
- data/lib/rails/generators/named_base.rb +1 -1
- data/lib/rails/generators/rails/app/app_generator.rb +44 -88
- data/lib/rails/generators/rails/app/templates/Gemfile.tt +41 -52
- data/lib/rails/generators/rails/app/templates/app/assets/stylesheets/application.css.tt +2 -2
- data/lib/rails/generators/rails/app/templates/app/mailers/application_mailer.rb.tt +2 -2
- data/lib/rails/generators/rails/app/templates/app/models/application_record.rb.tt +1 -1
- data/lib/rails/generators/rails/app/templates/app/views/layouts/application.html.erb.tt +3 -10
- data/lib/rails/generators/rails/app/templates/bin/rails.tt +1 -4
- data/lib/rails/generators/rails/app/templates/bin/rake.tt +0 -3
- data/lib/rails/generators/rails/app/templates/bin/setup.tt +9 -14
- data/lib/rails/generators/rails/app/templates/config/boot.rb.tt +1 -1
- data/lib/rails/generators/rails/app/templates/config/databases/jdbc.yml.tt +2 -2
- data/lib/rails/generators/rails/app/templates/config/databases/jdbcmysql.yml.tt +3 -3
- data/lib/rails/generators/rails/app/templates/config/databases/jdbcpostgresql.yml.tt +3 -3
- data/lib/rails/generators/rails/app/templates/config/databases/jdbcsqlite3.yml.tt +2 -2
- data/lib/rails/generators/rails/app/templates/config/databases/mysql.yml.tt +3 -3
- data/lib/rails/generators/rails/app/templates/config/databases/oracle.yml.tt +2 -2
- data/lib/rails/generators/rails/app/templates/config/databases/postgresql.yml.tt +3 -3
- data/lib/rails/generators/rails/app/templates/config/databases/sqlite3.yml.tt +1 -1
- data/lib/rails/generators/rails/app/templates/config/databases/sqlserver.yml.tt +5 -5
- data/lib/rails/generators/rails/app/templates/config/environments/development.rb.tt +2 -11
- data/lib/rails/generators/rails/app/templates/config/environments/production.rb.tt +9 -15
- data/lib/rails/generators/rails/app/templates/config/environments/test.rb.tt +2 -7
- data/lib/rails/generators/rails/app/templates/config/initializers/assets.rb.tt +1 -5
- data/lib/rails/generators/rails/app/templates/config/initializers/content_security_policy.rb.tt +0 -5
- data/lib/rails/generators/rails/app/templates/config/initializers/cors.rb.tt +2 -2
- data/lib/rails/generators/rails/app/templates/config/initializers/inflections.rb.tt +4 -4
- data/lib/rails/generators/rails/app/templates/config/initializers/new_framework_defaults_7_0.rb.tt +85 -0
- data/lib/rails/generators/rails/app/templates/config/locales/en.yml +3 -3
- data/lib/rails/generators/rails/app/templates/config/puma.rb.tt +1 -1
- data/lib/rails/generators/rails/app/templates/config/routes.rb.tt +3 -0
- data/lib/rails/generators/rails/app/templates/config/storage.yml.tt +5 -5
- data/lib/rails/generators/rails/app/templates/db/seeds.rb.tt +2 -2
- data/lib/rails/generators/rails/app/templates/gitattributes.tt +0 -5
- data/lib/rails/generators/rails/app/templates/gitignore.tt +0 -1
- data/lib/rails/generators/rails/app/templates/test/test_helper.rb.tt +1 -1
- data/lib/rails/generators/rails/controller/controller_generator.rb +1 -2
- data/lib/rails/generators/rails/controller/templates/controller.rb.tt +0 -4
- data/lib/rails/generators/rails/db/system/change/change_generator.rb +1 -1
- data/lib/rails/generators/rails/generator/templates/%file_name%_generator.rb.tt +1 -1
- data/lib/rails/generators/rails/plugin/plugin_generator.rb +40 -15
- data/lib/rails/generators/rails/plugin/templates/%name%.gemspec.tt +4 -2
- data/lib/rails/generators/rails/plugin/templates/Gemfile.tt +9 -9
- data/lib/rails/generators/rails/plugin/templates/README.md.tt +1 -1
- data/lib/rails/generators/rails/plugin/templates/app/mailers/%namespaced_name%/application_mailer.rb.tt +2 -2
- data/lib/rails/generators/rails/plugin/templates/app/models/%namespaced_name%/application_record.rb.tt +1 -1
- data/lib/rails/generators/rails/plugin/templates/app/views/layouts/%namespaced_name%/application.html.erb.tt +0 -3
- data/lib/rails/generators/rails/plugin/templates/bin/rails.tt +4 -4
- data/lib/rails/generators/rails/plugin/templates/gitignore.tt +0 -5
- data/lib/rails/generators/rails/plugin/templates/lib/%namespaced_name%/engine.rb.tt +2 -2
- data/lib/rails/generators/rails/plugin/templates/lib/%namespaced_name%/version.rb.tt +1 -1
- data/lib/rails/generators/rails/plugin/templates/rails/boot.rb.tt +2 -2
- data/lib/rails/generators/rails/plugin/templates/test/test_helper.rb.tt +3 -3
- data/lib/rails/generators/rails/scaffold/scaffold_generator.rb +0 -19
- data/lib/rails/generators/rails/scaffold_controller/templates/api_controller.rb.tt +1 -5
- data/lib/rails/generators/rails/scaffold_controller/templates/controller.rb.tt +6 -10
- data/lib/rails/generators/resource_helpers.rb +2 -2
- data/lib/rails/generators/test_unit/generator/templates/generator_test.rb.tt +1 -1
- data/lib/rails/generators/test_unit/model/templates/fixtures.yml.tt +2 -2
- data/lib/rails/generators/test_unit/scaffold/scaffold_generator.rb +3 -3
- data/lib/rails/generators/test_unit/scaffold/templates/api_functional_test.rb.tt +5 -5
- 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 +3 -3
- data/lib/rails/generators/testing/behaviour.rb +1 -2
- data/lib/rails/generators.rb +9 -22
- data/lib/rails/info.rb +1 -1
- data/lib/rails/info_controller.rb +1 -3
- data/lib/rails/initializable.rb +1 -1
- data/lib/rails/mailers_controller.rb +2 -4
- data/lib/rails/rack/logger.rb +0 -1
- data/lib/rails/railtie/configuration.rb +1 -2
- data/lib/rails/railtie.rb +9 -9
- data/lib/rails/ruby_version_check.rb +3 -3
- data/lib/rails/secrets.rb +8 -10
- data/lib/rails/tasks/framework.rake +2 -8
- data/lib/rails/tasks/statistics.rake +3 -1
- data/lib/rails/tasks/tmp.rake +8 -1
- data/lib/rails/tasks/yarn.rake +5 -1
- data/lib/rails/tasks/zeitwerk.rake +2 -10
- data/lib/rails/templates/layouts/application.html.erb +15 -0
- data/lib/rails/templates/rails/mailers/email.html.erb +12 -10
- data/lib/rails/templates/rails/welcome/index.html.erb +3 -0
- data/lib/rails/test_unit/railtie.rb +0 -4
- data/lib/rails/test_unit/runner.rb +7 -5
- data/lib/rails/test_unit/testing.rake +4 -9
- data/lib/rails.rb +1 -0
- metadata +37 -39
- data/lib/rails/command/spellchecker.rb +0 -57
- data/lib/rails/generators/css/assets/assets_generator.rb +0 -15
- data/lib/rails/generators/css/assets/templates/stylesheet.css +0 -4
- data/lib/rails/generators/css/scaffold/scaffold_generator.rb +0 -18
- data/lib/rails/generators/rails/app/templates/app/javascript/channels/consumer.js +0 -6
- data/lib/rails/generators/rails/app/templates/app/javascript/channels/index.js +0 -5
- data/lib/rails/generators/rails/app/templates/app/javascript/packs/application.js.tt +0 -23
- data/lib/rails/generators/rails/app/templates/bin/spring.tt +0 -13
- data/lib/rails/generators/rails/app/templates/bin/yarn.tt +0 -16
- data/lib/rails/generators/rails/app/templates/config/initializers/application_controller_renderer.rb.tt +0 -8
- data/lib/rails/generators/rails/app/templates/config/initializers/cookies_serializer.rb.tt +0 -5
- data/lib/rails/generators/rails/app/templates/config/initializers/new_framework_defaults_6_1.rb.tt +0 -67
- data/lib/rails/generators/rails/app/templates/config/spring.rb.tt +0 -6
- data/lib/rails/generators/rails/app/templates/package.json.tt +0 -11
- data/lib/rails/generators/rails/assets/USAGE +0 -16
- data/lib/rails/generators/rails/assets/assets_generator.rb +0 -26
- data/lib/rails/generators/rails/assets/templates/stylesheet.css +0 -4
- data/lib/rails/generators/rails/scaffold/templates/scaffold.css +0 -80
data/lib/rails/application.rb
CHANGED
@@ -57,29 +57,6 @@ module Rails
|
|
57
57
|
# 9) Build the middleware stack and run to_prepare callbacks
|
58
58
|
# 10) Run config.before_eager_load and eager_load! if eager_load is true
|
59
59
|
# 11) Run config.after_initialize callbacks
|
60
|
-
#
|
61
|
-
# == Multiple Applications
|
62
|
-
#
|
63
|
-
# If you decide to define multiple applications, then the first application
|
64
|
-
# that is initialized will be set to +Rails.application+, unless you override
|
65
|
-
# it with a different application.
|
66
|
-
#
|
67
|
-
# To create a new application, you can instantiate a new instance of a class
|
68
|
-
# that has already been created:
|
69
|
-
#
|
70
|
-
# class Application < Rails::Application
|
71
|
-
# end
|
72
|
-
#
|
73
|
-
# first_application = Application.new
|
74
|
-
# second_application = Application.new(config: first_application.config)
|
75
|
-
#
|
76
|
-
# In the above example, the configuration from the first application was used
|
77
|
-
# to initialize the second application. You can also use the +initialize_copy+
|
78
|
-
# on one of the applications to create a copy of the application which shares
|
79
|
-
# the configuration.
|
80
|
-
#
|
81
|
-
# If you decide to define Rake tasks, runners, or initializers in an
|
82
|
-
# application other than +Rails.application+, then you must run them manually.
|
83
60
|
class Application < Engine
|
84
61
|
autoload :Bootstrap, "rails/application/bootstrap"
|
85
62
|
autoload :Configuration, "rails/application/configuration"
|
@@ -247,9 +224,11 @@ module Rails
|
|
247
224
|
config, shared = all_configs[env.to_sym], all_configs[:shared]
|
248
225
|
|
249
226
|
if shared
|
250
|
-
config = {} if config.nil?
|
251
|
-
if config.is_a?(Hash)
|
227
|
+
config = {} if config.nil? && shared.is_a?(Hash)
|
228
|
+
if config.is_a?(Hash) && shared.is_a?(Hash)
|
252
229
|
config = shared.deep_merge(config)
|
230
|
+
elsif config.nil?
|
231
|
+
config = shared
|
253
232
|
end
|
254
233
|
end
|
255
234
|
|
@@ -266,13 +245,13 @@ module Rails
|
|
266
245
|
# Stores some of the Rails initial environment parameters which
|
267
246
|
# will be used by middlewares and engines to configure themselves.
|
268
247
|
def env_config
|
269
|
-
@app_env_config ||=
|
270
|
-
super.merge(
|
248
|
+
@app_env_config ||= super.merge(
|
271
249
|
"action_dispatch.parameter_filter" => config.filter_parameters,
|
272
250
|
"action_dispatch.redirect_filter" => config.filter_redirect,
|
273
251
|
"action_dispatch.secret_key_base" => secret_key_base,
|
274
252
|
"action_dispatch.show_exceptions" => config.action_dispatch.show_exceptions,
|
275
253
|
"action_dispatch.show_detailed_exceptions" => config.consider_all_requests_local,
|
254
|
+
"action_dispatch.log_rescued_responses" => config.action_dispatch.log_rescued_responses,
|
276
255
|
"action_dispatch.logger" => Rails.logger,
|
277
256
|
"action_dispatch.backtrace_cleaner" => Rails.backtrace_cleaner,
|
278
257
|
"action_dispatch.key_generator" => key_generator,
|
@@ -295,7 +274,6 @@ module Rails
|
|
295
274
|
"action_dispatch.content_security_policy_nonce_directives" => config.content_security_policy_nonce_directives,
|
296
275
|
"action_dispatch.permissions_policy" => config.permissions_policy,
|
297
276
|
)
|
298
|
-
end
|
299
277
|
end
|
300
278
|
|
301
279
|
# If you try to define a set of Rake tasks on the instance, these will get
|
@@ -355,26 +333,26 @@ module Rails
|
|
355
333
|
# are changing config.root inside your application definition or having a custom
|
356
334
|
# Rails application, you will need to add lib to $LOAD_PATH on your own in case
|
357
335
|
# you need to load files in lib/ during the application configuration as well.
|
358
|
-
def self.add_lib_to_load_path!(root)
|
336
|
+
def self.add_lib_to_load_path!(root) # :nodoc:
|
359
337
|
path = File.join root, "lib"
|
360
338
|
if File.exist?(path) && !$LOAD_PATH.include?(path)
|
361
339
|
$LOAD_PATH.unshift(path)
|
362
340
|
end
|
363
341
|
end
|
364
342
|
|
365
|
-
def require_environment!
|
343
|
+
def require_environment! # :nodoc:
|
366
344
|
environment = paths["config/environment"].existent.first
|
367
345
|
require environment if environment
|
368
346
|
end
|
369
347
|
|
370
|
-
def routes_reloader
|
348
|
+
def routes_reloader # :nodoc:
|
371
349
|
@routes_reloader ||= RoutesReloader.new
|
372
350
|
end
|
373
351
|
|
374
352
|
# Returns an array of file paths appended with a hash of
|
375
353
|
# directories-extensions suitable for ActiveSupport::FileUpdateChecker
|
376
354
|
# API.
|
377
|
-
def watchable_args
|
355
|
+
def watchable_args # :nodoc:
|
378
356
|
files, dirs = config.watchable_files.dup, config.watchable_dirs.dup
|
379
357
|
|
380
358
|
ActiveSupport::Dependencies.autoload_paths.each do |path|
|
@@ -386,20 +364,20 @@ module Rails
|
|
386
364
|
|
387
365
|
# Initialize the application passing the given group. By default, the
|
388
366
|
# group is :default
|
389
|
-
def initialize!(group = :default)
|
367
|
+
def initialize!(group = :default) # :nodoc:
|
390
368
|
raise "Application has been already initialized." if @initialized
|
391
369
|
run_initializers(group, self)
|
392
370
|
@initialized = true
|
393
371
|
self
|
394
372
|
end
|
395
373
|
|
396
|
-
def initializers
|
374
|
+
def initializers # :nodoc:
|
397
375
|
Bootstrap.initializers_for(self) +
|
398
376
|
railties_initializers(super) +
|
399
377
|
Finisher.initializers_for(self)
|
400
378
|
end
|
401
379
|
|
402
|
-
def config
|
380
|
+
def config # :nodoc:
|
403
381
|
@config ||= Application::Configuration.new(self.class.find_root(self.class.called_from))
|
404
382
|
end
|
405
383
|
|
@@ -487,11 +465,11 @@ module Rails
|
|
487
465
|
)
|
488
466
|
end
|
489
467
|
|
490
|
-
def to_app
|
468
|
+
def to_app # :nodoc:
|
491
469
|
self
|
492
470
|
end
|
493
471
|
|
494
|
-
def helpers_paths
|
472
|
+
def helpers_paths # :nodoc:
|
495
473
|
config.helpers_paths
|
496
474
|
end
|
497
475
|
|
@@ -513,17 +491,13 @@ module Rails
|
|
513
491
|
|
514
492
|
# Eager loads the application code.
|
515
493
|
def eager_load!
|
516
|
-
|
517
|
-
Rails.autoloaders.each(&:eager_load)
|
518
|
-
else
|
519
|
-
super
|
520
|
-
end
|
494
|
+
Rails.autoloaders.each(&:eager_load)
|
521
495
|
end
|
522
496
|
|
523
497
|
protected
|
524
498
|
alias :build_middleware_stack :app
|
525
499
|
|
526
|
-
def run_tasks_blocks(app)
|
500
|
+
def run_tasks_blocks(app) # :nodoc:
|
527
501
|
railties.each { |r| r.run_tasks_blocks(app) }
|
528
502
|
super
|
529
503
|
load "rails/tasks.rb"
|
@@ -534,28 +508,28 @@ module Rails
|
|
534
508
|
end
|
535
509
|
end
|
536
510
|
|
537
|
-
def run_generators_blocks(app)
|
511
|
+
def run_generators_blocks(app) # :nodoc:
|
538
512
|
railties.each { |r| r.run_generators_blocks(app) }
|
539
513
|
super
|
540
514
|
end
|
541
515
|
|
542
|
-
def run_runner_blocks(app)
|
516
|
+
def run_runner_blocks(app) # :nodoc:
|
543
517
|
railties.each { |r| r.run_runner_blocks(app) }
|
544
518
|
super
|
545
519
|
end
|
546
520
|
|
547
|
-
def run_console_blocks(app)
|
521
|
+
def run_console_blocks(app) # :nodoc:
|
548
522
|
railties.each { |r| r.run_console_blocks(app) }
|
549
523
|
super
|
550
524
|
end
|
551
525
|
|
552
|
-
def run_server_blocks(app)
|
526
|
+
def run_server_blocks(app) # :nodoc:
|
553
527
|
railties.each { |r| r.run_server_blocks(app) }
|
554
528
|
super
|
555
529
|
end
|
556
530
|
|
557
531
|
# Returns the ordered railties for this application considering railties_order.
|
558
|
-
def ordered_railties
|
532
|
+
def ordered_railties # :nodoc:
|
559
533
|
@ordered_railties ||= begin
|
560
534
|
order = config.railties_order.map do |railtie|
|
561
535
|
if railtie == :main_app
|
@@ -577,7 +551,7 @@ module Rails
|
|
577
551
|
end
|
578
552
|
end
|
579
553
|
|
580
|
-
def railties_initializers(current)
|
554
|
+
def railties_initializers(current) # :nodoc:
|
581
555
|
initializers = []
|
582
556
|
ordered_railties.reverse.flatten.each do |r|
|
583
557
|
if r == self
|
@@ -589,7 +563,7 @@ module Rails
|
|
589
563
|
initializers
|
590
564
|
end
|
591
565
|
|
592
|
-
def default_middleware_stack
|
566
|
+
def default_middleware_stack # :nodoc:
|
593
567
|
default_stack = DefaultMiddlewareStack.new(self, config, paths)
|
594
568
|
default_stack.build_stack
|
595
569
|
end
|
@@ -7,8 +7,8 @@ class Rails::ApplicationController < ActionController::Base # :nodoc:
|
|
7
7
|
before_action :disable_content_security_policy_nonce!
|
8
8
|
|
9
9
|
content_security_policy do |policy|
|
10
|
-
policy.script_src :unsafe_inline
|
11
|
-
policy.style_src :unsafe_inline
|
10
|
+
policy.script_src :self, :unsafe_inline
|
11
|
+
policy.style_src :self, :unsafe_inline
|
12
12
|
end
|
13
13
|
|
14
14
|
private
|
@@ -0,0 +1,21 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require "active_support/inflector"
|
4
|
+
|
5
|
+
module Rails
|
6
|
+
module Autoloaders
|
7
|
+
module Inflector # :nodoc:
|
8
|
+
# Concurrent::Map is not needed. This is a private class, and overrides
|
9
|
+
# must be defined while the application boots.
|
10
|
+
@overrides = {}
|
11
|
+
|
12
|
+
def self.camelize(basename, _abspath)
|
13
|
+
@overrides[basename] || basename.camelize
|
14
|
+
end
|
15
|
+
|
16
|
+
def self.inflect(overrides)
|
17
|
+
@overrides.merge!(overrides)
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
data/lib/rails/autoloaders.rb
CHANGED
@@ -1,35 +1,31 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
require "
|
3
|
+
require "zeitwerk"
|
4
4
|
|
5
5
|
module Rails
|
6
6
|
module Autoloaders # :nodoc:
|
7
|
+
require_relative "autoloaders/inflector"
|
8
|
+
|
7
9
|
class << self
|
8
10
|
include Enumerable
|
9
11
|
|
10
12
|
def main
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
loader.inflector = ActiveSupport::Dependencies::ZeitwerkIntegration::Inflector
|
15
|
-
end
|
13
|
+
@main ||= Zeitwerk::Loader.new.tap do |loader|
|
14
|
+
loader.tag = "rails.main"
|
15
|
+
loader.inflector = Inflector
|
16
16
|
end
|
17
17
|
end
|
18
18
|
|
19
19
|
def once
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
loader.inflector = ActiveSupport::Dependencies::ZeitwerkIntegration::Inflector
|
24
|
-
end
|
20
|
+
@once ||= Zeitwerk::Loader.new.tap do |loader|
|
21
|
+
loader.tag = "rails.once"
|
22
|
+
loader.inflector = Inflector
|
25
23
|
end
|
26
24
|
end
|
27
25
|
|
28
26
|
def each
|
29
|
-
|
30
|
-
|
31
|
-
yield once
|
32
|
-
end
|
27
|
+
yield main
|
28
|
+
yield once
|
33
29
|
end
|
34
30
|
|
35
31
|
def logger=(logger)
|
@@ -41,7 +37,7 @@ module Rails
|
|
41
37
|
end
|
42
38
|
|
43
39
|
def zeitwerk_enabled?
|
44
|
-
|
40
|
+
true
|
45
41
|
end
|
46
42
|
end
|
47
43
|
end
|
@@ -3,7 +3,7 @@
|
|
3
3
|
require "rails/code_statistics_calculator"
|
4
4
|
require "active_support/core_ext/enumerable"
|
5
5
|
|
6
|
-
class CodeStatistics
|
6
|
+
class CodeStatistics # :nodoc:
|
7
7
|
TEST_TYPES = ["Controller tests",
|
8
8
|
"Helper tests",
|
9
9
|
"Model tests",
|
@@ -40,7 +40,7 @@ class CodeStatistics #:nodoc:
|
|
40
40
|
Hash[@pairs.map { |pair| [pair.first, calculate_directory_statistics(pair.last)] }]
|
41
41
|
end
|
42
42
|
|
43
|
-
def calculate_directory_statistics(directory, pattern = /^(?!\.).*?\.(rb|js|ts|coffee|rake)$/)
|
43
|
+
def calculate_directory_statistics(directory, pattern = /^(?!\.).*?\.(rb|js|ts|css|scss|coffee|rake|erb)$/)
|
44
44
|
stats = CodeStatisticsCalculator.new
|
45
45
|
|
46
46
|
Dir.foreach(directory) do |file_name|
|
@@ -1,6 +1,6 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
class CodeStatisticsCalculator
|
3
|
+
class CodeStatisticsCalculator # :nodoc:
|
4
4
|
attr_reader :lines, :code_lines, :classes, :methods
|
5
5
|
|
6
6
|
PATTERNS = {
|
@@ -11,6 +11,15 @@ class CodeStatisticsCalculator #:nodoc:
|
|
11
11
|
class: /^\s*class\s+[_A-Z]/,
|
12
12
|
method: /^\s*def\s+[_a-z]/,
|
13
13
|
},
|
14
|
+
erb: {
|
15
|
+
line_comment: %r{((^\s*<%#.*%>)|(<!--.*-->))},
|
16
|
+
},
|
17
|
+
css: {
|
18
|
+
line_comment: %r{^\s*/\*.*\*/},
|
19
|
+
},
|
20
|
+
scss: {
|
21
|
+
line_comment: %r{((^\s*/\*.*\*/)|(^\s*//))},
|
22
|
+
},
|
14
23
|
js: {
|
15
24
|
line_comment: %r{^\s*//},
|
16
25
|
begin_block_comment: %r{^\s*/\*},
|
data/lib/rails/command/base.rb
CHANGED
@@ -14,6 +14,24 @@ module Rails
|
|
14
14
|
class Error < Thor::Error # :nodoc:
|
15
15
|
end
|
16
16
|
|
17
|
+
class CorrectableError < Error # :nodoc:
|
18
|
+
attr_reader :key, :options
|
19
|
+
|
20
|
+
def initialize(message, key, options)
|
21
|
+
@key = key
|
22
|
+
@options = options
|
23
|
+
super(message)
|
24
|
+
end
|
25
|
+
|
26
|
+
if defined?(DidYouMean::SpellChecker) && defined?(DidYouMean::Correctable)
|
27
|
+
include DidYouMean::Correctable
|
28
|
+
|
29
|
+
def corrections
|
30
|
+
@corrections ||= DidYouMean::SpellChecker.new(dictionary: options).correct(key)
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
17
35
|
include Actions
|
18
36
|
|
19
37
|
class << self
|
@@ -32,7 +50,7 @@ module Rails
|
|
32
50
|
if usage
|
33
51
|
super
|
34
52
|
else
|
35
|
-
@desc ||= ERB.new(File.read(usage_path)).result(binding) if usage_path
|
53
|
+
@desc ||= ERB.new(File.read(usage_path), trim_mode: "-").result(binding) if usage_path
|
36
54
|
end
|
37
55
|
end
|
38
56
|
|
@@ -53,7 +71,7 @@ module Rails
|
|
53
71
|
Rails::Command.hidden_commands << self
|
54
72
|
end
|
55
73
|
|
56
|
-
def inherited(base)
|
74
|
+
def inherited(base) # :nodoc:
|
57
75
|
super
|
58
76
|
|
59
77
|
if base.name && !base.name.end_with?("Base")
|
@@ -86,10 +104,8 @@ module Rails
|
|
86
104
|
#
|
87
105
|
# Rails::Command::TestCommand.base_name # => 'rails'
|
88
106
|
def base_name
|
89
|
-
@base_name ||=
|
90
|
-
|
91
|
-
base.underscore
|
92
|
-
end
|
107
|
+
@base_name ||= if base = name.to_s.split("::").first
|
108
|
+
base.underscore
|
93
109
|
end
|
94
110
|
end
|
95
111
|
|
@@ -97,11 +113,9 @@ module Rails
|
|
97
113
|
#
|
98
114
|
# Rails::Command::TestCommand.command_name # => 'test'
|
99
115
|
def command_name
|
100
|
-
@command_name ||=
|
101
|
-
|
102
|
-
|
103
|
-
command.underscore
|
104
|
-
end
|
116
|
+
@command_name ||= if command = name.to_s.split("::").last
|
117
|
+
command.chomp!("Command")
|
118
|
+
command.underscore
|
105
119
|
end
|
106
120
|
end
|
107
121
|
|
@@ -148,7 +162,7 @@ module Rails
|
|
148
162
|
|
149
163
|
def namespaced_commands
|
150
164
|
commands.keys.map do |key|
|
151
|
-
if command_root_namespace.match?(/(\A
|
165
|
+
if command_root_namespace.match?(/(\A|:)#{key}\z/)
|
152
166
|
command_root_namespace
|
153
167
|
else
|
154
168
|
"#{command_root_namespace}:#{key}"
|
data/lib/rails/command.rb
CHANGED
@@ -10,7 +10,6 @@ module Rails
|
|
10
10
|
module Command
|
11
11
|
extend ActiveSupport::Autoload
|
12
12
|
|
13
|
-
autoload :Spellchecker
|
14
13
|
autoload :Behavior
|
15
14
|
autoload :Base
|
16
15
|
|
@@ -38,6 +37,7 @@ module Rails
|
|
38
37
|
end
|
39
38
|
|
40
39
|
command_name, namespace = "help", "help" if command_name.blank? || HELP_MAPPINGS.include?(command_name)
|
40
|
+
command_name, namespace, args = "application", "application", ["--help"] if rails_new_with_no_path?(args)
|
41
41
|
command_name, namespace = "version", "version" if %w( -v --version ).include?(command_name)
|
42
42
|
|
43
43
|
original_argv = ARGV.dup
|
@@ -47,6 +47,7 @@ module Rails
|
|
47
47
|
if command && command.all_commands[command_name]
|
48
48
|
command.perform(command_name, args, config)
|
49
49
|
else
|
50
|
+
args = ["--describe", full_namespace] if HELP_MAPPINGS.include?(args[0])
|
50
51
|
find_by_namespace("rake").perform(full_namespace, args, config)
|
51
52
|
end
|
52
53
|
ensure
|
@@ -58,14 +59,12 @@ module Rails
|
|
58
59
|
# Command names must end with "_command.rb". This is required because Rails
|
59
60
|
# looks in load paths and loads the command just before it's going to be used.
|
60
61
|
#
|
61
|
-
# find_by_namespace :webrat, :
|
62
|
+
# find_by_namespace :webrat, :integration
|
62
63
|
#
|
63
64
|
# Will search for the following commands:
|
64
65
|
#
|
65
|
-
# "
|
66
|
+
# "webrat", "webrat:integration", "rails:webrat", "rails:webrat:integration"
|
66
67
|
#
|
67
|
-
# Notice that "rails:commands:webrat" could be loaded as well, what
|
68
|
-
# Rails looks for is the first and last parts of the namespace.
|
69
68
|
def find_by_namespace(namespace, command_name = nil) # :nodoc:
|
70
69
|
lookups = [ namespace ]
|
71
70
|
lookups << "#{namespace}:#{command_name}" if command_name
|
@@ -94,6 +93,10 @@ module Rails
|
|
94
93
|
COMMANDS_IN_USAGE = %w(generate console server test test:system dbconsole new)
|
95
94
|
private_constant :COMMANDS_IN_USAGE
|
96
95
|
|
96
|
+
def rails_new_with_no_path?(args)
|
97
|
+
args == ["new"]
|
98
|
+
end
|
99
|
+
|
97
100
|
def commands
|
98
101
|
lookup!
|
99
102
|
|
@@ -32,8 +32,8 @@ You could prepend that to your server's start command like this:
|
|
32
32
|
|
33
33
|
=== Set up Git to Diff Credentials
|
34
34
|
|
35
|
-
Rails provides `rails credentials:diff --enroll` to instruct Git to call
|
36
|
-
when `git diff` is run on a credentials file.
|
35
|
+
Rails provides `bin/rails credentials:diff --enroll` to instruct Git to call
|
36
|
+
`bin/rails credentials:diff` when `git diff` is run on a credentials file.
|
37
37
|
|
38
38
|
Running the command enrolls the project such that all credentials files use the
|
39
39
|
"rails_credentials" diff driver in .gitattributes.
|
@@ -45,6 +45,8 @@ that isn't tracked Rails automatically ensures it's configured when running
|
|
45
45
|
Otherwise each co-worker would have to run enable manually, including on each new
|
46
46
|
repo clone.
|
47
47
|
|
48
|
+
To disenroll from this feature, run `bin/rails credentials:diff --disenroll`.
|
49
|
+
|
48
50
|
=== Editing Credentials
|
49
51
|
|
50
52
|
This will open a temporary file in `$EDITOR` with the decrypted contents to edit
|
@@ -1,37 +1,47 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
3
|
module Rails::Command::CredentialsCommand::Diffing # :nodoc:
|
4
|
+
GITATTRIBUTES_ENTRY = <<~END
|
5
|
+
config/credentials/*.yml.enc diff=rails_credentials
|
6
|
+
config/credentials.yml.enc diff=rails_credentials
|
7
|
+
END
|
8
|
+
|
4
9
|
def enroll_project_in_credentials_diffing
|
5
|
-
if
|
6
|
-
|
10
|
+
if enrolled_in_credentials_diffing?
|
11
|
+
say "Project is already enrolled in credentials file diffing."
|
7
12
|
else
|
8
|
-
gitattributes.write(
|
9
|
-
config/credentials/*.yml.enc diff=rails_credentials
|
10
|
-
config/credentials.yml.enc diff=rails_credentials
|
11
|
-
end_of_template
|
13
|
+
gitattributes.write(GITATTRIBUTES_ENTRY, mode: "a")
|
12
14
|
|
13
|
-
say "
|
15
|
+
say "Enrolled project in credentials file diffing!"
|
14
16
|
say "Rails ensures the rails_credentials diff driver is set when running `credentials:edit`. See `credentials:help` for more."
|
15
17
|
end
|
16
18
|
end
|
17
19
|
|
18
|
-
def
|
19
|
-
|
20
|
+
def disenroll_project_from_credentials_diffing
|
21
|
+
if enrolled_in_credentials_diffing?
|
22
|
+
gitattributes.write(gitattributes.read.gsub(GITATTRIBUTES_ENTRY, ""))
|
23
|
+
gitattributes.delete if gitattributes.empty?
|
24
|
+
|
25
|
+
say "Disenrolled project from credentials file diffing!"
|
26
|
+
else
|
27
|
+
say "Project is not enrolled in credentials file diffing."
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
def ensure_diffing_driver_is_configured
|
32
|
+
configure_diffing_driver if enrolled_in_credentials_diffing? && !diffing_driver_configured?
|
20
33
|
end
|
21
34
|
|
22
35
|
private
|
23
|
-
def
|
24
|
-
gitattributes.read.
|
25
|
-
rescue Errno::ENOENT
|
26
|
-
false
|
36
|
+
def enrolled_in_credentials_diffing?
|
37
|
+
gitattributes.file? && gitattributes.read.include?(GITATTRIBUTES_ENTRY)
|
27
38
|
end
|
28
39
|
|
29
|
-
def
|
40
|
+
def diffing_driver_configured?
|
30
41
|
system "git config --get diff.rails_credentials.textconv", out: File::NULL
|
31
42
|
end
|
32
43
|
|
33
|
-
def
|
34
|
-
puts "running"
|
44
|
+
def configure_diffing_driver
|
35
45
|
system "git config diff.rails_credentials.textconv 'bin/rails credentials:diff'"
|
36
46
|
end
|
37
47
|
|
@@ -33,7 +33,7 @@ module Rails
|
|
33
33
|
|
34
34
|
ensure_encryption_key_has_been_added if credentials.key.nil?
|
35
35
|
ensure_credentials_have_been_added
|
36
|
-
|
36
|
+
ensure_diffing_driver_is_configured
|
37
37
|
|
38
38
|
catch_editing_exceptions do
|
39
39
|
change_credentials_in_system_editor
|
@@ -52,7 +52,10 @@ module Rails
|
|
52
52
|
end
|
53
53
|
|
54
54
|
option :enroll, type: :boolean, default: false,
|
55
|
-
desc: "Enrolls project in
|
55
|
+
desc: "Enrolls project in credentials file diffing with `git diff`"
|
56
|
+
|
57
|
+
option :disenroll, type: :boolean, default: false,
|
58
|
+
desc: "Disenrolls project from credentials file diffing"
|
56
59
|
|
57
60
|
def diff(content_path = nil)
|
58
61
|
if @content_path = content_path
|
@@ -62,6 +65,7 @@ module Rails
|
|
62
65
|
say credentials.read.presence || credentials.content_path.read
|
63
66
|
else
|
64
67
|
require_application!
|
68
|
+
disenroll_project_from_credentials_diffing if options[:disenroll]
|
65
69
|
enroll_project_in_credentials_diffing if options[:enroll]
|
66
70
|
end
|
67
71
|
rescue ActiveSupport::MessageEncryptor::InvalidMessage
|
@@ -31,7 +31,7 @@ module Rails
|
|
31
31
|
sslcapath: "--ssl-capath",
|
32
32
|
sslcipher: "--ssl-cipher",
|
33
33
|
sslkey: "--ssl-key"
|
34
|
-
}.
|
34
|
+
}.filter_map { |opt, arg| "#{arg}=#{config[opt]}" if config[opt] }
|
35
35
|
|
36
36
|
if config[:password] && @options[:include_password]
|
37
37
|
args << "--password=#{config[:password]}"
|
@@ -44,10 +44,14 @@ module Rails
|
|
44
44
|
find_cmd_and_exec(["mysql", "mysql5"], *args)
|
45
45
|
|
46
46
|
when /^postgres|^postgis/
|
47
|
-
ENV["PGUSER"]
|
48
|
-
ENV["PGHOST"]
|
49
|
-
ENV["PGPORT"]
|
50
|
-
ENV["PGPASSWORD"]
|
47
|
+
ENV["PGUSER"] = config[:username] if config[:username]
|
48
|
+
ENV["PGHOST"] = config[:host] if config[:host]
|
49
|
+
ENV["PGPORT"] = config[:port].to_s if config[:port]
|
50
|
+
ENV["PGPASSWORD"] = config[:password].to_s if config[:password] && @options[:include_password]
|
51
|
+
ENV["PGSSLMODE"] = config[:sslmode].to_s if config[:sslmode]
|
52
|
+
ENV["PGSSLCERT"] = config[:sslcert].to_s if config[:sslcert]
|
53
|
+
ENV["PGSSLKEY"] = config[:sslkey].to_s if config[:sslkey]
|
54
|
+
ENV["PGSSLROOTCERT"] = config[:sslrootcert].to_s if config[:sslrootcert]
|
51
55
|
find_cmd_and_exec("psql", db_config.database)
|
52
56
|
|
53
57
|
when "sqlite3"
|
@@ -98,18 +102,15 @@ module Rails
|
|
98
102
|
def db_config
|
99
103
|
return @db_config if defined?(@db_config)
|
100
104
|
|
101
|
-
#
|
102
|
-
#
|
103
|
-
|
104
|
-
|
105
|
-
|
106
|
-
@db_config = configurations.find_db_config(environment)
|
107
|
-
end
|
105
|
+
# We need to check whether the user passed the database the
|
106
|
+
# first time around to show a consistent error message to people
|
107
|
+
# relying on 2-level database configuration.
|
108
|
+
|
109
|
+
@db_config = configurations.configs_for(env_name: environment, name: database, include_hidden: true)
|
108
110
|
|
109
111
|
unless @db_config
|
110
|
-
missing_db = database ? "'#{database}' database is not" : "No databases are"
|
111
112
|
raise ActiveRecord::AdapterNotSpecified,
|
112
|
-
"#{
|
113
|
+
"'#{database}' database is not configured for '#{environment}'. Available configuration: #{configurations.inspect}"
|
113
114
|
end
|
114
115
|
|
115
116
|
@db_config
|
@@ -120,7 +121,7 @@ module Rails
|
|
120
121
|
end
|
121
122
|
|
122
123
|
def database
|
123
|
-
@options
|
124
|
+
@options.fetch(:database, "primary")
|
124
125
|
end
|
125
126
|
|
126
127
|
private
|