railties 6.1.6 → 7.1.2
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +626 -259
- data/MIT-LICENSE +1 -1
- data/RDOC_MAIN.md +99 -0
- data/README.rdoc +5 -6
- data/lib/minitest/rails_plugin.rb +64 -1
- data/lib/rails/all.rb +0 -1
- data/lib/rails/api/task.rb +35 -4
- data/lib/rails/app_updater.rb +9 -6
- data/lib/rails/application/bootstrap.rb +41 -7
- data/lib/rails/application/configuration.rb +262 -88
- data/lib/rails/application/default_middleware_stack.rb +29 -4
- data/lib/rails/application/dummy_config.rb +19 -0
- data/lib/rails/application/finisher.rb +89 -124
- data/lib/rails/application/routes_reloader.rb +8 -0
- data/lib/rails/application.rb +200 -125
- data/lib/rails/application_controller.rb +3 -3
- data/lib/rails/autoloaders/inflector.rb +21 -0
- data/lib/rails/autoloaders.rb +42 -42
- data/lib/rails/backtrace_cleaner.rb +1 -1
- data/lib/rails/cli.rb +5 -2
- data/lib/rails/code_statistics.rb +2 -2
- data/lib/rails/code_statistics_calculator.rb +10 -1
- data/lib/rails/command/actions.rb +10 -12
- data/lib/rails/command/base.rb +61 -45
- data/lib/rails/command/behavior.rb +1 -1
- data/lib/rails/command/environment_argument.rb +33 -17
- data/lib/rails/command/helpers/editor.rb +17 -12
- data/lib/rails/command.rb +90 -36
- data/lib/rails/commands/about/about_command.rb +14 -0
- data/lib/rails/commands/application/application_command.rb +2 -0
- data/lib/rails/commands/console/console_command.rb +17 -13
- data/lib/rails/commands/credentials/USAGE +53 -53
- data/lib/rails/commands/credentials/credentials_command/diffing.rb +31 -19
- data/lib/rails/commands/credentials/credentials_command.rb +67 -69
- data/lib/rails/commands/db/system/change/change_command.rb +2 -1
- data/lib/rails/commands/dbconsole/dbconsole_command.rb +26 -117
- data/lib/rails/commands/destroy/destroy_command.rb +3 -2
- data/lib/rails/commands/dev/dev_command.rb +1 -6
- data/lib/rails/commands/encrypted/USAGE +15 -20
- data/lib/rails/commands/encrypted/encrypted_command.rb +46 -35
- data/lib/rails/commands/gem_help/USAGE +16 -0
- data/lib/rails/commands/gem_help/gem_help_command.rb +13 -0
- data/lib/rails/commands/generate/generate_command.rb +2 -2
- data/lib/rails/commands/help/USAGE +15 -14
- data/lib/rails/commands/help/help_command.rb +21 -2
- data/lib/rails/commands/initializers/initializers_command.rb +1 -4
- data/lib/rails/commands/middleware/middleware_command.rb +17 -0
- data/lib/rails/commands/new/new_command.rb +2 -0
- data/lib/rails/commands/notes/notes_command.rb +2 -1
- data/lib/rails/commands/plugin/plugin_command.rb +2 -0
- data/lib/rails/commands/rake/rake_command.rb +25 -22
- data/lib/rails/commands/restart/restart_command.rb +14 -0
- data/lib/rails/commands/routes/routes_command.rb +13 -1
- data/lib/rails/commands/runner/USAGE +14 -12
- data/lib/rails/commands/runner/runner_command.rb +34 -21
- data/lib/rails/commands/secret/secret_command.rb +13 -0
- data/lib/rails/commands/secrets/USAGE +44 -49
- data/lib/rails/commands/secrets/secrets_command.rb +20 -38
- data/lib/rails/commands/server/server_command.rb +33 -30
- data/lib/rails/commands/test/USAGE +14 -0
- data/lib/rails/commands/test/test_command.rb +56 -14
- data/lib/rails/commands/unused_routes/unused_routes_command.rb +75 -0
- data/lib/rails/commands/version/version_command.rb +1 -0
- data/lib/rails/configuration.rb +23 -28
- data/lib/rails/console/app.rb +1 -4
- data/lib/rails/console/helpers.rb +2 -2
- data/lib/rails/deprecator.rb +7 -0
- data/lib/rails/engine/configuration.rb +53 -9
- data/lib/rails/engine.rb +63 -48
- data/lib/rails/gem_version.rb +3 -3
- data/lib/rails/generators/actions/create_migration.rb +2 -4
- data/lib/rails/generators/actions.rb +231 -73
- data/lib/rails/generators/active_model.rb +28 -14
- data/lib/rails/generators/app_base.rb +476 -176
- data/lib/rails/generators/app_name.rb +3 -14
- data/lib/rails/generators/base.rb +24 -20
- data/lib/rails/generators/database.rb +39 -1
- data/lib/rails/generators/erb/mailer/templates/layout.html.erb.tt +1 -1
- data/lib/rails/generators/erb/scaffold/scaffold_generator.rb +2 -0
- data/lib/rails/generators/erb/scaffold/templates/_form.html.erb.tt +8 -8
- data/lib/rails/generators/erb/scaffold/templates/edit.html.erb.tt +8 -4
- data/lib/rails/generators/erb/scaffold/templates/index.html.erb.tt +11 -28
- data/lib/rails/generators/erb/scaffold/templates/new.html.erb.tt +7 -3
- data/lib/rails/generators/erb/scaffold/templates/partial.html.erb.tt +17 -0
- data/lib/rails/generators/erb/scaffold/templates/show.html.erb.tt +8 -17
- data/lib/rails/generators/erb.rb +1 -1
- data/lib/rails/generators/generated_attribute.rb +57 -9
- data/lib/rails/generators/migration.rb +2 -7
- data/lib/rails/generators/model_helpers.rb +3 -2
- data/lib/rails/generators/named_base.rb +13 -13
- data/lib/rails/generators/rails/app/USAGE +22 -6
- data/lib/rails/generators/rails/app/app_generator.rb +113 -114
- data/lib/rails/generators/rails/app/templates/Dockerfile.tt +103 -0
- data/lib/rails/generators/rails/app/templates/Gemfile.tt +43 -53
- 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 -9
- data/lib/rails/generators/rails/app/templates/app/views/layouts/mailer.html.erb.tt +1 -1
- 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 +16 -12
- data/lib/rails/generators/rails/app/templates/config/application.rb.tt +6 -18
- 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 +7 -7
- data/lib/rails/generators/rails/app/templates/config/databases/jdbcsqlite3.yml.tt +5 -5
- 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 +7 -9
- data/lib/rails/generators/rails/app/templates/config/databases/sqlite3.yml.tt +4 -4
- data/lib/rails/generators/rails/app/templates/config/databases/sqlserver.yml.tt +5 -5
- data/lib/rails/generators/rails/app/templates/config/databases/trilogy.yml.tt +59 -0
- data/lib/rails/generators/rails/app/templates/config/environments/development.rb.tt +16 -12
- data/lib/rails/generators/rails/app/templates/config/environments/production.rb.tt +38 -61
- data/lib/rails/generators/rails/app/templates/config/environments/test.rb.tt +14 -15
- data/lib/rails/generators/rails/app/templates/config/initializers/assets.rb.tt +3 -5
- data/lib/rails/generators/rails/app/templates/config/initializers/content_security_policy.rb.tt +21 -28
- data/lib/rails/generators/rails/app/templates/config/initializers/cors.rb.tt +3 -3
- data/lib/rails/generators/rails/app/templates/config/initializers/filter_parameter_logging.rb.tt +3 -1
- 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_1.rb.tt +283 -0
- data/lib/rails/generators/rails/app/templates/config/initializers/permissions_policy.rb.tt +11 -9
- data/lib/rails/generators/rails/app/templates/config/locales/en.yml +13 -15
- data/lib/rails/generators/rails/app/templates/config/puma.rb.tt +12 -20
- data/lib/rails/generators/rails/app/templates/config/routes.rb.tt +8 -1
- data/lib/rails/generators/rails/app/templates/config/storage.yml.tt +5 -5
- data/lib/rails/generators/rails/app/templates/db/seeds.rb.tt +6 -4
- data/lib/rails/generators/rails/app/templates/docker-entrypoint.tt +10 -0
- data/lib/rails/generators/rails/app/templates/dockerignore.tt +43 -0
- data/lib/rails/generators/rails/app/templates/gitattributes.tt +0 -5
- data/lib/rails/generators/rails/app/templates/gitignore.tt +7 -9
- data/lib/rails/generators/rails/app/templates/node-version.tt +1 -0
- data/lib/rails/generators/rails/app/templates/test/channels/application_cable/connection_test.rb.tt +10 -8
- data/lib/rails/generators/rails/app/templates/test/test_helper.rb.tt +10 -8
- data/lib/rails/generators/rails/application_record/application_record_generator.rb +4 -0
- data/lib/rails/generators/rails/benchmark/benchmark_generator.rb +2 -1
- data/lib/rails/generators/rails/controller/USAGE +12 -4
- data/lib/rails/generators/rails/controller/controller_generator.rb +6 -2
- data/lib/rails/generators/rails/controller/templates/controller.rb.tt +1 -5
- data/lib/rails/generators/rails/credentials/credentials_generator.rb +29 -24
- data/lib/rails/generators/rails/credentials/templates/credentials.yml.tt +8 -0
- data/lib/rails/generators/rails/db/system/change/change_generator.rb +31 -1
- data/lib/rails/generators/rails/encryption_key_file/encryption_key_file_generator.rb +1 -2
- data/lib/rails/generators/rails/generator/templates/%file_name%_generator.rb.tt +1 -1
- data/lib/rails/generators/rails/migration/USAGE +21 -11
- data/lib/rails/generators/rails/model/model_generator.rb +4 -0
- data/lib/rails/generators/rails/plugin/USAGE +17 -6
- data/lib/rails/generators/rails/plugin/plugin_generator.rb +69 -30
- data/lib/rails/generators/rails/plugin/templates/%name%.gemspec.tt +7 -3
- data/lib/rails/generators/rails/plugin/templates/Gemfile.tt +9 -31
- data/lib/rails/generators/rails/plugin/templates/MIT-LICENSE.tt +1 -1
- 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/views/layouts/%namespaced_name%/application.html.erb.tt +0 -3
- data/lib/rails/generators/rails/plugin/templates/bin/rails.tt +5 -20
- data/lib/rails/generators/rails/plugin/templates/gitignore.tt +0 -7
- 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 +6 -11
- data/lib/rails/generators/rails/resource/resource_generator.rb +6 -0
- data/lib/rails/generators/rails/scaffold/scaffold_generator.rb +2 -20
- data/lib/rails/generators/rails/scaffold_controller/scaffold_controller_generator.rb +1 -1
- 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_case.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 +4 -4
- 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 +7 -7
- data/lib/rails/generators/test_unit/scaffold/templates/system_test.rb.tt +9 -11
- data/lib/rails/generators/testing/{behaviour.rb → behavior.rb} +7 -5
- data/lib/rails/generators.rb +14 -29
- data/lib/rails/health_controller.rb +55 -0
- data/lib/rails/info.rb +2 -2
- data/lib/rails/info_controller.rb +31 -13
- data/lib/rails/initializable.rb +1 -1
- data/lib/rails/mailers_controller.rb +17 -9
- data/lib/rails/paths.rb +14 -11
- data/lib/rails/rack/logger.rb +16 -15
- data/lib/rails/rackup/server.rb +15 -0
- data/lib/rails/railtie/configuration.rb +15 -3
- data/lib/rails/railtie.rb +54 -31
- data/lib/rails/ruby_version_check.rb +5 -3
- data/lib/rails/secrets.rb +10 -8
- data/lib/rails/source_annotation_extractor.rb +68 -19
- data/lib/rails/tasks/engine.rake +8 -8
- data/lib/rails/tasks/framework.rake +4 -12
- data/lib/rails/tasks/log.rake +1 -1
- data/lib/rails/tasks/misc.rake +3 -14
- data/lib/rails/tasks/statistics.rake +8 -5
- data/lib/rails/tasks/tmp.rake +13 -6
- data/lib/rails/tasks/yarn.rake +8 -9
- data/lib/rails/tasks/zeitwerk.rake +14 -42
- data/lib/rails/tasks.rb +0 -2
- data/lib/rails/templates/layouts/application.html.erb +15 -0
- data/lib/rails/templates/rails/mailers/email.html.erb +45 -11
- data/lib/rails/templates/rails/mailers/index.html.erb +14 -7
- data/lib/rails/templates/rails/mailers/mailer.html.erb +11 -5
- data/lib/rails/templates/rails/welcome/index.html.erb +65 -48
- data/lib/rails/test_help.rb +13 -14
- data/lib/rails/test_unit/line_filtering.rb +1 -1
- data/lib/rails/test_unit/railtie.rb +0 -4
- data/lib/rails/test_unit/reporter.rb +6 -2
- data/lib/rails/test_unit/runner.rb +45 -20
- data/lib/rails/test_unit/test_parser.rb +88 -0
- data/lib/rails/test_unit/testing.rake +18 -43
- data/lib/rails/testing/maintain_test_schema.rb +16 -0
- data/lib/rails/version.rb +1 -1
- data/lib/rails/welcome_controller.rb +1 -0
- data/lib/rails/zeitwerk_checker.rb +15 -0
- data/lib/rails.rb +26 -15
- metadata +74 -42
- data/RDOC_MAIN.rdoc +0 -97
- data/lib/rails/.DS_Store +0 -0
- data/lib/rails/application/dummy_erb_compiler.rb +0 -18
- 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/backtrace_silencers.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/mime_types.rb.tt +0 -4
- 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/initializers/wrap_parameters.rb.tt +0 -16
- 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/model/USAGE +0 -113
- data/lib/rails/generators/rails/scaffold/templates/scaffold.css +0 -80
- data/lib/rails/tasks/middleware.rake +0 -9
- data/lib/rails/tasks/restart.rake +0 -9
@@ -7,26 +7,15 @@ module Rails
|
|
7
7
|
|
8
8
|
private
|
9
9
|
def app_name
|
10
|
-
@app_name ||= original_app_name.
|
10
|
+
@app_name ||= original_app_name.parameterize(preserve_case: true).underscore
|
11
11
|
end
|
12
12
|
|
13
13
|
def original_app_name
|
14
|
-
@original_app_name ||=
|
14
|
+
@original_app_name ||= (options[:name] || File.basename(destination_root))
|
15
15
|
end
|
16
16
|
|
17
|
-
def defined_app_name
|
18
|
-
defined_app_const_base.underscore
|
19
|
-
end
|
20
|
-
|
21
|
-
def defined_app_const_base
|
22
|
-
Rails.respond_to?(:application) && defined?(Rails::Application) &&
|
23
|
-
Rails.application.is_a?(Rails::Application) && Rails.application.class.name.chomp("::Application")
|
24
|
-
end
|
25
|
-
|
26
|
-
alias :defined_app_const_base? :defined_app_const_base
|
27
|
-
|
28
17
|
def app_const_base
|
29
|
-
@app_const_base ||=
|
18
|
+
@app_const_base ||= app_name.gsub(/\W/, "_").squeeze("_").camelize
|
30
19
|
end
|
31
20
|
alias :camelized :app_const_base
|
32
21
|
|
@@ -86,15 +86,15 @@ module Rails
|
|
86
86
|
# "rails:test_unit", "test_unit:controller", "test_unit"
|
87
87
|
#
|
88
88
|
# Notice that "rails:generators:test_unit" could be loaded as well, what
|
89
|
-
# Rails looks for is the first and last parts of the namespace. This is what
|
90
|
-
# allows any test framework to hook into Rails as long as it provides any
|
89
|
+
# \Rails looks for is the first and last parts of the namespace. This is what
|
90
|
+
# allows any test framework to hook into \Rails as long as it provides any
|
91
91
|
# of the hooks above.
|
92
92
|
#
|
93
93
|
# ==== Options
|
94
94
|
#
|
95
95
|
# The first and last part used to find the generator to be invoked are
|
96
96
|
# guessed based on class invokes hook_for, as noticed in the example above.
|
97
|
-
# This can be customized with two options:
|
97
|
+
# This can be customized with two options: +:in+ and +:as+.
|
98
98
|
#
|
99
99
|
# Let's suppose you are creating a generator that needs to invoke the
|
100
100
|
# controller generator from test unit. Your first attempt is:
|
@@ -108,7 +108,7 @@ module Rails
|
|
108
108
|
# "test_unit:awesome", "test_unit"
|
109
109
|
#
|
110
110
|
# Which is not the desired lookup. You can change it by providing the
|
111
|
-
#
|
111
|
+
# +:as+ option:
|
112
112
|
#
|
113
113
|
# class AwesomeGenerator < Rails::Generators::Base
|
114
114
|
# hook_for :test_framework, as: :controller
|
@@ -119,7 +119,7 @@ module Rails
|
|
119
119
|
# "test_unit:controller", "test_unit"
|
120
120
|
#
|
121
121
|
# Similarly, if you want it to also look up in the rails namespace, you
|
122
|
-
# just need to provide the
|
122
|
+
# just need to provide the +:in+ value:
|
123
123
|
#
|
124
124
|
# class AwesomeGenerator < Rails::Generators::Base
|
125
125
|
# hook_for :test_framework, in: :rails, as: :controller
|
@@ -189,6 +189,13 @@ module Rails
|
|
189
189
|
class_option(name, defaults.merge!(options))
|
190
190
|
end
|
191
191
|
|
192
|
+
klass = self
|
193
|
+
|
194
|
+
singleton_class.define_method("#{name}_generator") do
|
195
|
+
value = class_options[name].default
|
196
|
+
Rails::Generators.find_by_namespace(klass.generator_name, value)
|
197
|
+
end
|
198
|
+
|
192
199
|
hooks[name] = [ in_base, as_hook ]
|
193
200
|
invoke_from_option(name, options, &block)
|
194
201
|
end
|
@@ -201,12 +208,13 @@ module Rails
|
|
201
208
|
remove_invocation(*names)
|
202
209
|
|
203
210
|
names.each do |name|
|
211
|
+
singleton_class.undef_method("#{name}_generator")
|
204
212
|
hooks.delete(name)
|
205
213
|
end
|
206
214
|
end
|
207
215
|
|
208
216
|
# Make class option aware of Rails::Generators.options and Rails::Generators.aliases.
|
209
|
-
def self.class_option(name, options = {})
|
217
|
+
def self.class_option(name, options = {}) # :nodoc:
|
210
218
|
options[:desc] = "Indicates when to generate #{name.to_s.humanize.downcase}" unless options.key?(:desc)
|
211
219
|
options[:aliases] = default_aliases_for_option(name, options)
|
212
220
|
options[:default] = default_value_for_option(name, options)
|
@@ -231,7 +239,7 @@ module Rails
|
|
231
239
|
|
232
240
|
# Cache source root and add lib/generators/base/generator/templates to
|
233
241
|
# source paths.
|
234
|
-
def self.inherited(base)
|
242
|
+
def self.inherited(base) # :nodoc:
|
235
243
|
super
|
236
244
|
|
237
245
|
# Invoke source_root so the default_source_root is set.
|
@@ -317,28 +325,24 @@ module Rails
|
|
317
325
|
@namespaced_path ||= namespace_dirs.join("/")
|
318
326
|
end
|
319
327
|
|
320
|
-
# Use Rails default banner.
|
328
|
+
# Use \Rails default banner.
|
321
329
|
def self.banner # :doc:
|
322
|
-
"rails generate #{namespace.delete_prefix("rails:")} #{arguments.map(&:usage).join(' ')} [options]".gsub(/\s+/, " ")
|
330
|
+
"bin/rails generate #{namespace.delete_prefix("rails:")} #{arguments.map(&:usage).join(' ')} [options]".gsub(/\s+/, " ")
|
323
331
|
end
|
324
332
|
|
325
333
|
# Sets the base_name taking into account the current class namespace.
|
326
334
|
def self.base_name # :doc:
|
327
|
-
@base_name ||=
|
328
|
-
|
329
|
-
base.underscore
|
330
|
-
end
|
335
|
+
@base_name ||= if base = name.to_s.split("::").first
|
336
|
+
base.underscore
|
331
337
|
end
|
332
338
|
end
|
333
339
|
|
334
340
|
# Removes the namespaces and get the generator name. For example,
|
335
341
|
# Rails::Generators::ModelGenerator will return "model" as generator name.
|
336
342
|
def self.generator_name # :doc:
|
337
|
-
@generator_name ||=
|
338
|
-
|
339
|
-
|
340
|
-
generator.underscore
|
341
|
-
end
|
343
|
+
@generator_name ||= if generator = name.to_s.split("::").last
|
344
|
+
generator.delete_suffix!("Generator")
|
345
|
+
generator.underscore
|
342
346
|
end
|
343
347
|
end
|
344
348
|
|
@@ -368,13 +372,13 @@ module Rails
|
|
368
372
|
end
|
369
373
|
|
370
374
|
# Keep hooks configuration that are used on prepare_for_invocation.
|
371
|
-
def self.hooks
|
375
|
+
def self.hooks # :nodoc:
|
372
376
|
@hooks ||= from_superclass(:hooks, {})
|
373
377
|
end
|
374
378
|
|
375
379
|
# Prepare class invocation to search on Rails namespace if a previous
|
376
380
|
# added hook is being used.
|
377
|
-
def self.prepare_for_invocation(name, value)
|
381
|
+
def self.prepare_for_invocation(name, value) # :nodoc:
|
378
382
|
return super unless value.is_a?(String) || value.is_a?(Symbol)
|
379
383
|
|
380
384
|
if value && constants = hooks[name]
|
@@ -4,7 +4,7 @@ module Rails
|
|
4
4
|
module Generators
|
5
5
|
module Database # :nodoc:
|
6
6
|
JDBC_DATABASES = %w( jdbcmysql jdbcsqlite3 jdbcpostgresql jdbc )
|
7
|
-
DATABASES = %w( mysql postgresql sqlite3 oracle sqlserver ) + JDBC_DATABASES
|
7
|
+
DATABASES = %w( mysql trilogy postgresql sqlite3 oracle sqlserver ) + JDBC_DATABASES
|
8
8
|
|
9
9
|
def initialize(*)
|
10
10
|
super
|
@@ -14,6 +14,7 @@ module Rails
|
|
14
14
|
def gem_for_database(database = options[:database])
|
15
15
|
case database
|
16
16
|
when "mysql" then ["mysql2", ["~> 0.5"]]
|
17
|
+
when "trilogy" then ["trilogy", ["~> 2.4"]]
|
17
18
|
when "postgresql" then ["pg", ["~> 1.1"]]
|
18
19
|
when "sqlite3" then ["sqlite3", ["~> 1.4"]]
|
19
20
|
when "oracle" then ["activerecord-oracle_enhanced-adapter", nil]
|
@@ -26,6 +27,26 @@ module Rails
|
|
26
27
|
end
|
27
28
|
end
|
28
29
|
|
30
|
+
def docker_for_database_build(database = options[:database])
|
31
|
+
case database
|
32
|
+
when "mysql" then "build-essential default-libmysqlclient-dev git"
|
33
|
+
when "trilogy" then "build-essential default-libmysqlclient-dev git"
|
34
|
+
when "postgresql" then "build-essential git libpq-dev"
|
35
|
+
when "sqlite3" then "build-essential git"
|
36
|
+
else nil
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
def docker_for_database_deploy(database = options[:database])
|
41
|
+
case database
|
42
|
+
when "mysql" then "curl default-mysql-client libvips"
|
43
|
+
when "trilogy" then "curl default-mysql-client libvips"
|
44
|
+
when "postgresql" then "curl libvips postgresql-client"
|
45
|
+
when "sqlite3" then "curl libsqlite3-0 libvips"
|
46
|
+
else nil
|
47
|
+
end
|
48
|
+
end
|
49
|
+
|
29
50
|
def convert_database_option_for_jruby
|
30
51
|
if defined?(JRUBY_VERSION)
|
31
52
|
opt = options.dup
|
@@ -38,6 +59,23 @@ module Rails
|
|
38
59
|
end
|
39
60
|
end
|
40
61
|
|
62
|
+
def build_package_for_database(database = options[:database])
|
63
|
+
case database
|
64
|
+
when "mysql" then "default-libmysqlclient-dev"
|
65
|
+
when "postgresql" then "libpq-dev"
|
66
|
+
else nil
|
67
|
+
end
|
68
|
+
end
|
69
|
+
|
70
|
+
def deploy_package_for_database(database = options[:database])
|
71
|
+
case database
|
72
|
+
when "mysql" then "default-mysql-client"
|
73
|
+
when "postgresql" then "postgresql-client"
|
74
|
+
when "sqlite3" then "libsqlite3-0"
|
75
|
+
else nil
|
76
|
+
end
|
77
|
+
end
|
78
|
+
|
41
79
|
private
|
42
80
|
def mysql_socket
|
43
81
|
@mysql_socket ||= [
|
@@ -1,6 +1,6 @@
|
|
1
1
|
<%%= form_with(model: <%= model_resource_name %>) do |form| %>
|
2
2
|
<%% if <%= singular_table_name %>.errors.any? %>
|
3
|
-
<div
|
3
|
+
<div style="color: red">
|
4
4
|
<h2><%%= pluralize(<%= singular_table_name %>.errors.count, "error") %> prohibited this <%= singular_table_name %> from being saved:</h2>
|
5
5
|
|
6
6
|
<ul>
|
@@ -12,26 +12,26 @@
|
|
12
12
|
<%% end %>
|
13
13
|
|
14
14
|
<% attributes.each do |attribute| -%>
|
15
|
-
<div
|
15
|
+
<div>
|
16
16
|
<% if attribute.password_digest? -%>
|
17
|
-
<%%= form.label :password %>
|
17
|
+
<%%= form.label :password, style: "display: block" %>
|
18
18
|
<%%= form.password_field :password %>
|
19
19
|
</div>
|
20
20
|
|
21
|
-
<div
|
22
|
-
<%%= form.label :password_confirmation %>
|
21
|
+
<div>
|
22
|
+
<%%= form.label :password_confirmation, style: "display: block" %>
|
23
23
|
<%%= form.password_field :password_confirmation %>
|
24
24
|
<% elsif attribute.attachments? -%>
|
25
|
-
<%%= form.label :<%= attribute.column_name
|
25
|
+
<%%= form.label :<%= attribute.column_name %>, style: "display: block" %>
|
26
26
|
<%%= form.<%= attribute.field_type %> :<%= attribute.column_name %>, multiple: true %>
|
27
27
|
<% else -%>
|
28
|
-
<%%= form.label :<%= attribute.column_name
|
28
|
+
<%%= form.label :<%= attribute.column_name %>, style: "display: block" %>
|
29
29
|
<%%= form.<%= attribute.field_type %> :<%= attribute.column_name %> %>
|
30
30
|
<% end -%>
|
31
31
|
</div>
|
32
32
|
|
33
33
|
<% end -%>
|
34
|
-
<div
|
34
|
+
<div>
|
35
35
|
<%%= form.submit %>
|
36
36
|
</div>
|
37
37
|
<%% end %>
|
@@ -1,6 +1,10 @@
|
|
1
|
-
<h1>Editing <%=
|
1
|
+
<h1>Editing <%= human_name.downcase %></h1>
|
2
2
|
|
3
|
-
<%%= render
|
3
|
+
<%%= render "form", <%= singular_table_name %>: @<%= singular_table_name %> %>
|
4
4
|
|
5
|
-
|
6
|
-
|
5
|
+
<br>
|
6
|
+
|
7
|
+
<div>
|
8
|
+
<%%= link_to "Show this <%= human_name.downcase %>", <%= model_resource_name(prefix: "@") %> %> |
|
9
|
+
<%%= link_to "Back to <%= human_name.pluralize.downcase %>", <%= index_helper(type: :path) %> %>
|
10
|
+
</div>
|
@@ -1,31 +1,14 @@
|
|
1
|
-
<p
|
1
|
+
<p style="color: green"><%%= notice %></p>
|
2
2
|
|
3
|
-
<h1><%=
|
3
|
+
<h1><%= human_name.pluralize %></h1>
|
4
4
|
|
5
|
-
<
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
</thead>
|
5
|
+
<div id="<%= plural_table_name %>">
|
6
|
+
<%% @<%= plural_table_name %>.each do |<%= singular_table_name %>| %>
|
7
|
+
<%%= render <%= singular_table_name %> %>
|
8
|
+
<p>
|
9
|
+
<%%= link_to "Show this <%= human_name.downcase %>", <%= model_resource_name(singular_table_name) %> %>
|
10
|
+
</p>
|
11
|
+
<%% end %>
|
12
|
+
</div>
|
14
13
|
|
15
|
-
|
16
|
-
<%% @<%= plural_table_name %>.each do |<%= singular_table_name %>| %>
|
17
|
-
<tr>
|
18
|
-
<% attributes.reject(&:password_digest?).each do |attribute| -%>
|
19
|
-
<td><%%= <%= singular_table_name %>.<%= attribute.column_name %> %></td>
|
20
|
-
<% end -%>
|
21
|
-
<td><%%= link_to 'Show', <%= model_resource_name %> %></td>
|
22
|
-
<td><%%= link_to 'Edit', edit_<%= singular_route_name %>_path(<%= singular_table_name %>) %></td>
|
23
|
-
<td><%%= link_to 'Destroy', <%= model_resource_name %>, method: :delete, data: { confirm: 'Are you sure?' } %></td>
|
24
|
-
</tr>
|
25
|
-
<%% end %>
|
26
|
-
</tbody>
|
27
|
-
</table>
|
28
|
-
|
29
|
-
<br>
|
30
|
-
|
31
|
-
<%%= link_to 'New <%= singular_table_name.titleize %>', new_<%= singular_route_name %>_path %>
|
14
|
+
<%%= link_to "New <%= human_name.downcase %>", <%= new_helper(type: :path) %> %>
|
@@ -1,5 +1,9 @@
|
|
1
|
-
<h1>New <%=
|
1
|
+
<h1>New <%= human_name.downcase %></h1>
|
2
2
|
|
3
|
-
<%%= render
|
3
|
+
<%%= render "form", <%= singular_table_name %>: @<%= singular_table_name %> %>
|
4
4
|
|
5
|
-
|
5
|
+
<br>
|
6
|
+
|
7
|
+
<div>
|
8
|
+
<%%= link_to "Back to <%= human_name.pluralize.downcase %>", <%= index_helper(type: :path) %> %>
|
9
|
+
</div>
|
@@ -0,0 +1,17 @@
|
|
1
|
+
<div id="<%%= dom_id <%= singular_name %> %>">
|
2
|
+
<% attributes.reject(&:password_digest?).each do |attribute| -%>
|
3
|
+
<p>
|
4
|
+
<strong><%= attribute.human_name %>:</strong>
|
5
|
+
<% if attribute.attachment? -%>
|
6
|
+
<%%= link_to <%= singular_name %>.<%= attribute.column_name %>.filename, <%= singular_name %>.<%= attribute.column_name %> if <%= singular_name %>.<%= attribute.column_name %>.attached? %>
|
7
|
+
<% elsif attribute.attachments? -%>
|
8
|
+
<%% <%= singular_name %>.<%= attribute.column_name %>.each do |<%= attribute.singular_name %>| %>
|
9
|
+
<div><%%= link_to <%= attribute.singular_name %>.filename, <%= attribute.singular_name %> %></div>
|
10
|
+
<%% end %>
|
11
|
+
<% else -%>
|
12
|
+
<%%= <%= singular_name %>.<%= attribute.column_name %> %>
|
13
|
+
<% end -%>
|
14
|
+
</p>
|
15
|
+
|
16
|
+
<% end -%>
|
17
|
+
</div>
|
@@ -1,19 +1,10 @@
|
|
1
|
-
<p
|
1
|
+
<p style="color: green"><%%= notice %></p>
|
2
2
|
|
3
|
-
|
4
|
-
<p>
|
5
|
-
<strong><%= attribute.human_name %>:</strong>
|
6
|
-
<% if attribute.attachment? -%>
|
7
|
-
<%%= link_to @<%= singular_table_name %>.<%= attribute.column_name %>.filename, @<%= singular_table_name %>.<%= attribute.column_name %> if @<%= singular_table_name %>.<%= attribute.column_name %>.attached? %>
|
8
|
-
<% elsif attribute.attachments? -%>
|
9
|
-
<%% @<%= singular_table_name %>.<%= attribute.column_name %>.each do |<%= attribute.singular_name %>| %>
|
10
|
-
<div><%%= link_to <%= attribute.singular_name %>.filename, <%= attribute.singular_name %> %></div>
|
11
|
-
<%% end %>
|
12
|
-
<% else -%>
|
13
|
-
<%%= @<%= singular_table_name %>.<%= attribute.column_name %> %>
|
14
|
-
<% end -%>
|
15
|
-
</p>
|
3
|
+
<%%= render @<%= singular_table_name %> %>
|
16
4
|
|
17
|
-
|
18
|
-
<%%= link_to
|
19
|
-
<%%= link_to
|
5
|
+
<div>
|
6
|
+
<%%= link_to "Edit this <%= human_name.downcase %>", <%= edit_helper(type: :path) %> %> |
|
7
|
+
<%%= link_to "Back to <%= human_name.pluralize.downcase %>", <%= index_helper(type: :path) %> %>
|
8
|
+
|
9
|
+
<%%= button_to "Destroy this <%= human_name.downcase %>", <%= model_resource_name(prefix: "@") %>, method: :delete %>
|
10
|
+
</div>
|
data/lib/rails/generators/erb.rb
CHANGED
@@ -7,6 +7,25 @@ module Rails
|
|
7
7
|
class GeneratedAttribute # :nodoc:
|
8
8
|
INDEX_OPTIONS = %w(index uniq)
|
9
9
|
UNIQ_INDEX_OPTIONS = %w(uniq)
|
10
|
+
DEFAULT_TYPES = %w(
|
11
|
+
attachment
|
12
|
+
attachments
|
13
|
+
belongs_to
|
14
|
+
boolean
|
15
|
+
date
|
16
|
+
datetime
|
17
|
+
decimal
|
18
|
+
digest
|
19
|
+
float
|
20
|
+
integer
|
21
|
+
references
|
22
|
+
rich_text
|
23
|
+
string
|
24
|
+
text
|
25
|
+
time
|
26
|
+
timestamp
|
27
|
+
token
|
28
|
+
)
|
10
29
|
|
11
30
|
attr_accessor :name, :type
|
12
31
|
attr_reader :attr_options
|
@@ -14,23 +33,50 @@ module Rails
|
|
14
33
|
|
15
34
|
class << self
|
16
35
|
def parse(column_definition)
|
17
|
-
name, type,
|
36
|
+
name, type, index_type = column_definition.split(":")
|
18
37
|
|
19
38
|
# if user provided "name:index" instead of "name:string:index"
|
20
39
|
# type should be set blank so GeneratedAttribute's constructor
|
21
40
|
# could set it to :string
|
22
|
-
|
41
|
+
index_type, type = type, nil if valid_index_type?(type)
|
23
42
|
|
24
43
|
type, attr_options = *parse_type_and_options(type)
|
25
44
|
type = type.to_sym if type
|
26
45
|
|
46
|
+
if dangerous_name?(name)
|
47
|
+
raise Error, "Could not generate field '#{name}', as it is already defined by Active Record."
|
48
|
+
end
|
49
|
+
|
50
|
+
if type && !valid_type?(type)
|
51
|
+
raise Error, "Could not generate field '#{name}' with unknown type '#{type}'."
|
52
|
+
end
|
53
|
+
|
54
|
+
if index_type && !valid_index_type?(index_type)
|
55
|
+
raise Error, "Could not generate field '#{name}' with unknown index '#{index_type}'."
|
56
|
+
end
|
57
|
+
|
27
58
|
if type && reference?(type)
|
28
|
-
if UNIQ_INDEX_OPTIONS.include?(
|
59
|
+
if UNIQ_INDEX_OPTIONS.include?(index_type)
|
29
60
|
attr_options[:index] = { unique: true }
|
30
61
|
end
|
31
62
|
end
|
32
63
|
|
33
|
-
new(name, type,
|
64
|
+
new(name, type, index_type, attr_options)
|
65
|
+
end
|
66
|
+
|
67
|
+
def dangerous_name?(name)
|
68
|
+
defined?(ActiveRecord::Base) &&
|
69
|
+
ActiveRecord::Base.dangerous_attribute_method?(name)
|
70
|
+
end
|
71
|
+
|
72
|
+
def valid_type?(type)
|
73
|
+
DEFAULT_TYPES.include?(type.to_s) ||
|
74
|
+
!defined?(ActiveRecord::Base) ||
|
75
|
+
ActiveRecord::Base.connection.valid_type?(type)
|
76
|
+
end
|
77
|
+
|
78
|
+
def valid_index_type?(index_type)
|
79
|
+
INDEX_OPTIONS.include?(index_type.to_s)
|
34
80
|
end
|
35
81
|
|
36
82
|
def reference?(type)
|
@@ -42,6 +88,8 @@ module Rails
|
|
42
88
|
# when declaring options curly brackets should be used
|
43
89
|
def parse_type_and_options(type)
|
44
90
|
case type
|
91
|
+
when /(text|binary)\{([a-z]+)\}/
|
92
|
+
return $1, size: $2.to_sym
|
45
93
|
when /(string|text|binary|integer)\{(\d+)\}/
|
46
94
|
return $1, limit: $2.to_i
|
47
95
|
when /decimal\{(\d+)[,.-](\d+)\}/
|
@@ -70,9 +118,9 @@ module Rails
|
|
70
118
|
@field_type ||= case type
|
71
119
|
when :integer then :number_field
|
72
120
|
when :float, :decimal then :text_field
|
73
|
-
when :time then :
|
74
|
-
when :datetime, :timestamp then :
|
75
|
-
when :date then :
|
121
|
+
when :time then :time_field
|
122
|
+
when :datetime, :timestamp then :datetime_field
|
123
|
+
when :date then :date_field
|
76
124
|
when :text then :text_area
|
77
125
|
when :rich_text then :rich_text_area
|
78
126
|
when :boolean then :check_box
|
@@ -87,8 +135,8 @@ module Rails
|
|
87
135
|
when :integer then 1
|
88
136
|
when :float then 1.5
|
89
137
|
when :decimal then "9.99"
|
90
|
-
when :datetime, :timestamp, :time then Time.now.
|
91
|
-
when :date then Date.today.
|
138
|
+
when :datetime, :timestamp, :time then Time.now.to_fs(:db)
|
139
|
+
when :date then Date.today.to_fs(:db)
|
92
140
|
when :string then name == "type" ? "" : "MyString"
|
93
141
|
when :text then "MyText"
|
94
142
|
when :boolean then false
|
@@ -12,7 +12,7 @@ module Rails
|
|
12
12
|
extend ActiveSupport::Concern
|
13
13
|
attr_reader :migration_number, :migration_file_name, :migration_class_name
|
14
14
|
|
15
|
-
module ClassMethods
|
15
|
+
module ClassMethods # :nodoc:
|
16
16
|
def migration_lookup_at(dirname)
|
17
17
|
Dir.glob("#{dirname}/[0-9]*_*.rb")
|
18
18
|
end
|
@@ -57,17 +57,12 @@ module Rails
|
|
57
57
|
source = File.expand_path(find_in_source_paths(source.to_s))
|
58
58
|
|
59
59
|
set_migration_assigns!(destination)
|
60
|
-
context = instance_eval("binding")
|
61
60
|
|
62
61
|
dir, base = File.split(destination)
|
63
62
|
numbered_destination = File.join(dir, ["%migration_number%", base].join("_"))
|
64
63
|
|
65
64
|
file = create_migration numbered_destination, nil, config do
|
66
|
-
|
67
|
-
ERB.new(::File.binread(source), trim_mode: "-", eoutvar: "@output_buffer").result(context)
|
68
|
-
else
|
69
|
-
ERB.new(::File.binread(source), nil, "-", "@output_buffer").result(context)
|
70
|
-
end
|
65
|
+
ERB.new(::File.binread(source), trim_mode: "-", eoutvar: "@output_buffer").result(binding)
|
71
66
|
end
|
72
67
|
Rails::Generators.add_generated_file(file)
|
73
68
|
end
|
@@ -18,8 +18,9 @@ module Rails
|
|
18
18
|
ERROR
|
19
19
|
mattr_accessor :skip_warn
|
20
20
|
|
21
|
-
def self.included(base)
|
22
|
-
base.class_option :force_plural, type: :boolean, default: false,
|
21
|
+
def self.included(base) # :nodoc:
|
22
|
+
base.class_option :force_plural, type: :boolean, default: false,
|
23
|
+
desc: "Do not singularize the model name, even if it appears plural"
|
23
24
|
end
|
24
25
|
|
25
26
|
def initialize(args, *_options)
|
@@ -8,7 +8,7 @@ module Rails
|
|
8
8
|
class NamedBase < Base
|
9
9
|
argument :name, type: :string
|
10
10
|
|
11
|
-
def initialize(args, *options)
|
11
|
+
def initialize(args, *options) # :nodoc:
|
12
12
|
@inside_template = nil
|
13
13
|
# Unfreeze name in case it's given as a frozen string
|
14
14
|
args[0] = args[0].dup if args[0].is_a?(String) && args[0].frozen?
|
@@ -94,20 +94,20 @@ module Rails
|
|
94
94
|
singular_name == plural_name
|
95
95
|
end
|
96
96
|
|
97
|
-
def index_helper # :doc:
|
98
|
-
uncountable?
|
97
|
+
def index_helper(type: nil) # :doc:
|
98
|
+
[plural_route_name, ("index" if uncountable?), type].compact.join("_")
|
99
99
|
end
|
100
100
|
|
101
|
-
def show_helper # :doc:
|
102
|
-
"#{singular_route_name}
|
101
|
+
def show_helper(arg = "@#{singular_table_name}", type: :url) # :doc:
|
102
|
+
"#{singular_route_name}_#{type}(#{arg})"
|
103
103
|
end
|
104
104
|
|
105
|
-
def edit_helper # :doc:
|
106
|
-
"edit_#{show_helper}"
|
105
|
+
def edit_helper(...) # :doc:
|
106
|
+
"edit_#{show_helper(...)}"
|
107
107
|
end
|
108
108
|
|
109
|
-
def new_helper # :doc:
|
110
|
-
"new_#{singular_route_name}
|
109
|
+
def new_helper(type: :url) # :doc:
|
110
|
+
"new_#{singular_route_name}_#{type}"
|
111
111
|
end
|
112
112
|
|
113
113
|
def singular_table_name # :doc:
|
@@ -127,7 +127,7 @@ module Rails
|
|
127
127
|
end
|
128
128
|
|
129
129
|
def route_url # :doc:
|
130
|
-
@route_url ||=
|
130
|
+
@route_url ||= controller_class_path.collect { |dname| "/" + dname }.join + "/" + plural_file_name
|
131
131
|
end
|
132
132
|
|
133
133
|
def url_helper_prefix # :doc:
|
@@ -147,8 +147,8 @@ module Rails
|
|
147
147
|
model_resource_name(prefix: "@")
|
148
148
|
end
|
149
149
|
|
150
|
-
def model_resource_name(prefix: "") # :doc:
|
151
|
-
resource_name = "#{prefix}#{
|
150
|
+
def model_resource_name(base_name = singular_table_name, prefix: "") # :doc:
|
151
|
+
resource_name = "#{prefix}#{base_name}"
|
152
152
|
if options[:model_name]
|
153
153
|
"[#{controller_class_path.map { |name| ":" + name }.join(", ")}, #{resource_name}]"
|
154
154
|
else
|
@@ -202,7 +202,7 @@ module Rails
|
|
202
202
|
end
|
203
203
|
|
204
204
|
# Add a class collisions name to be checked on class initialization. You
|
205
|
-
# can supply a hash with a
|
205
|
+
# can supply a hash with a +:prefix+ or +:suffix+ to be tested.
|
206
206
|
#
|
207
207
|
# ==== Examples
|
208
208
|
#
|