railties 7.1.3.4 → 8.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (193) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +128 -775
  3. data/lib/minitest/rails_plugin.rb +6 -3
  4. data/lib/rails/all.rb +1 -3
  5. data/lib/rails/api/task.rb +6 -4
  6. data/lib/rails/application/bootstrap.rb +5 -7
  7. data/lib/rails/application/configuration.rb +81 -43
  8. data/lib/rails/application/default_middleware_stack.rb +4 -0
  9. data/lib/rails/application/dummy_config.rb +2 -2
  10. data/lib/rails/application/finisher.rb +9 -3
  11. data/lib/rails/application/routes_reloader.rb +16 -2
  12. data/lib/rails/application.rb +27 -86
  13. data/lib/rails/backtrace_cleaner.rb +19 -4
  14. data/lib/rails/cli.rb +0 -1
  15. data/lib/rails/code_statistics.rb +128 -86
  16. data/lib/rails/code_statistics_calculator.rb +78 -76
  17. data/lib/rails/command/helpers/editor.rb +1 -1
  18. data/lib/rails/command.rb +0 -6
  19. data/lib/rails/commands/app/update_command.rb +94 -0
  20. data/lib/rails/commands/boot/boot_command.rb +14 -0
  21. data/lib/rails/commands/console/console_command.rb +2 -21
  22. data/lib/rails/commands/console/irb_console.rb +128 -0
  23. data/lib/rails/commands/credentials/USAGE +4 -4
  24. data/lib/rails/commands/credentials/credentials_command.rb +7 -3
  25. data/lib/rails/commands/dbconsole/dbconsole_command.rb +21 -30
  26. data/lib/rails/commands/dev/dev_command.rb +1 -1
  27. data/lib/rails/commands/devcontainer/devcontainer_command.rb +40 -0
  28. data/lib/rails/commands/rake/rake_command.rb +1 -1
  29. data/lib/rails/commands/runner/runner_command.rb +14 -3
  30. data/lib/rails/commands/server/server_command.rb +5 -3
  31. data/lib/rails/commands/stats/stats_command.rb +19 -0
  32. data/lib/rails/commands/test/test_command.rb +2 -0
  33. data/lib/rails/configuration.rb +10 -1
  34. data/lib/rails/console/methods.rb +7 -0
  35. data/lib/rails/dev_caching.rb +2 -2
  36. data/lib/rails/engine/configuration.rb +3 -1
  37. data/lib/rails/engine/lazy_route_set.rb +114 -0
  38. data/lib/rails/engine.rb +16 -12
  39. data/lib/rails/gem_version.rb +4 -4
  40. data/lib/rails/generators/actions.rb +3 -3
  41. data/lib/rails/generators/app_base.rb +115 -68
  42. data/lib/rails/generators/base.rb +1 -1
  43. data/lib/rails/generators/database.rb +263 -71
  44. data/lib/rails/generators/erb/authentication/authentication_generator.rb +15 -0
  45. data/lib/rails/generators/erb/authentication/templates/app/views/passwords/edit.html.erb +9 -0
  46. data/lib/rails/generators/erb/authentication/templates/app/views/passwords/new.html.erb +8 -0
  47. data/lib/rails/generators/erb/authentication/templates/app/views/sessions/new.html.erb +11 -0
  48. data/lib/rails/generators/erb/scaffold/templates/edit.html.erb.tt +2 -0
  49. data/lib/rails/generators/erb/scaffold/templates/index.html.erb.tt +2 -0
  50. data/lib/rails/generators/erb/scaffold/templates/new.html.erb.tt +2 -0
  51. data/lib/rails/generators/generated_attribute.rb +42 -12
  52. data/lib/rails/generators/migration.rb +3 -3
  53. data/lib/rails/generators/rails/app/app_generator.rb +75 -54
  54. data/lib/rails/generators/rails/app/templates/Dockerfile.tt +33 -17
  55. data/lib/rails/generators/rails/app/templates/Gemfile.tt +38 -23
  56. data/lib/rails/generators/rails/app/templates/app/assets/stylesheets/application.css.tt +6 -11
  57. data/lib/rails/generators/rails/app/templates/app/controllers/application_controller.rb.tt +4 -0
  58. data/lib/rails/generators/rails/app/templates/app/views/layouts/application.html.erb.tt +17 -3
  59. data/lib/rails/generators/rails/app/templates/app/views/pwa/manifest.json.erb.tt +22 -0
  60. data/lib/rails/generators/rails/app/templates/app/views/pwa/service-worker.js +26 -0
  61. data/lib/rails/generators/rails/app/templates/bin/brakeman.tt +6 -0
  62. data/lib/rails/generators/rails/app/templates/bin/dev.tt +1 -0
  63. data/lib/rails/generators/rails/app/templates/bin/rubocop.tt +7 -0
  64. data/lib/rails/generators/rails/app/templates/bin/setup.tt +6 -5
  65. data/lib/rails/generators/rails/app/templates/bin/thrust.tt +4 -0
  66. data/lib/rails/generators/rails/app/templates/config/application.rb.tt +1 -1
  67. data/lib/rails/generators/rails/app/templates/config/databases/mysql.yml.tt +26 -3
  68. data/lib/rails/generators/rails/app/templates/config/databases/postgresql.yml.tt +30 -0
  69. data/lib/rails/generators/rails/app/templates/config/databases/sqlite3.yml.tt +47 -0
  70. data/lib/rails/generators/rails/app/templates/config/databases/trilogy.yml.tt +26 -3
  71. data/lib/rails/generators/rails/app/templates/config/deploy.yml.tt +128 -0
  72. data/lib/rails/generators/rails/app/templates/config/environments/development.rb.tt +22 -26
  73. data/lib/rails/generators/rails/app/templates/config/environments/production.rb.tt +36 -48
  74. data/lib/rails/generators/rails/app/templates/config/environments/test.rb.tt +7 -18
  75. data/lib/rails/generators/rails/app/templates/config/initializers/assets.rb.tt +0 -7
  76. data/lib/rails/generators/rails/app/templates/config/initializers/filter_parameter_logging.rb.tt +1 -1
  77. data/lib/rails/generators/rails/app/templates/config/initializers/new_framework_defaults_8_0.rb.tt +30 -0
  78. data/lib/rails/generators/rails/app/templates/config/puma.rb.tt +35 -27
  79. data/lib/rails/generators/rails/app/templates/config/routes.rb.tt +6 -0
  80. data/lib/rails/generators/rails/app/templates/docker-entrypoint.tt +7 -1
  81. data/lib/rails/generators/rails/app/templates/dockerignore.tt +20 -2
  82. data/lib/rails/generators/rails/app/templates/github/ci.yml.tt +144 -0
  83. data/lib/rails/generators/rails/app/templates/github/dependabot.yml +12 -0
  84. data/lib/rails/generators/rails/app/templates/gitignore.tt +4 -5
  85. data/lib/rails/generators/rails/app/templates/kamal-secrets.tt +17 -0
  86. data/lib/rails/generators/rails/app/templates/public/400.html +114 -0
  87. data/lib/rails/generators/rails/app/templates/public/404.html +113 -66
  88. data/lib/rails/generators/rails/app/templates/public/406-unsupported-browser.html +114 -0
  89. data/lib/rails/generators/rails/app/templates/public/422.html +113 -66
  90. data/lib/rails/generators/rails/app/templates/public/500.html +113 -65
  91. data/lib/rails/generators/rails/app/templates/public/icon.png +0 -0
  92. data/lib/rails/generators/rails/app/templates/public/icon.svg +3 -0
  93. data/lib/rails/generators/rails/app/templates/rubocop.yml.tt +8 -0
  94. data/lib/rails/generators/rails/app/templates/test/application_system_test_case.rb.tt +1 -1
  95. data/lib/rails/generators/rails/authentication/USAGE +6 -0
  96. data/lib/rails/generators/rails/authentication/authentication_generator.rb +58 -0
  97. data/lib/rails/generators/rails/authentication/templates/app/channels/application_cable/connection.rb.tt +16 -0
  98. data/lib/rails/generators/rails/authentication/templates/app/controllers/concerns/authentication.rb.tt +52 -0
  99. data/lib/rails/generators/rails/authentication/templates/app/controllers/passwords_controller.rb.tt +33 -0
  100. data/lib/rails/generators/rails/authentication/templates/app/controllers/sessions_controller.rb.tt +21 -0
  101. data/lib/rails/generators/rails/authentication/templates/app/mailers/passwords_mailer.rb.tt +6 -0
  102. data/lib/rails/generators/rails/authentication/templates/app/models/current.rb.tt +4 -0
  103. data/lib/rails/generators/rails/authentication/templates/app/models/session.rb.tt +3 -0
  104. data/lib/rails/generators/rails/authentication/templates/app/models/user.rb.tt +6 -0
  105. data/lib/rails/generators/rails/authentication/templates/app/views/passwords_mailer/reset.html.erb.tt +4 -0
  106. data/lib/rails/generators/rails/authentication/templates/app/views/passwords_mailer/reset.text.erb.tt +2 -0
  107. data/lib/rails/generators/rails/authentication/templates/test/mailers/previews/passwords_mailer_preview.rb.tt +7 -0
  108. data/lib/rails/generators/rails/controller/controller_generator.rb +1 -1
  109. data/lib/rails/generators/rails/credentials/templates/credentials.yml.tt +4 -0
  110. data/lib/rails/generators/rails/db/system/change/change_generator.rb +132 -21
  111. data/lib/rails/generators/rails/devcontainer/devcontainer_generator.rb +176 -0
  112. data/lib/rails/generators/rails/devcontainer/templates/devcontainer/Dockerfile.tt +3 -0
  113. data/lib/rails/generators/rails/devcontainer/templates/devcontainer/compose.yaml.tt +47 -0
  114. data/lib/rails/generators/rails/devcontainer/templates/devcontainer/devcontainer.json.tt +37 -0
  115. data/lib/rails/generators/rails/migration/migration_generator.rb +4 -0
  116. data/lib/rails/generators/rails/plugin/plugin_generator.rb +47 -16
  117. data/lib/rails/generators/rails/plugin/templates/%name%.gemspec.tt +2 -2
  118. data/lib/rails/generators/rails/plugin/templates/Gemfile.tt +6 -2
  119. data/lib/rails/generators/rails/plugin/templates/app/views/layouts/%namespaced_name%/application.html.erb.tt +2 -0
  120. data/lib/rails/generators/rails/plugin/templates/bin/rubocop.tt +7 -0
  121. data/lib/rails/generators/rails/plugin/templates/github/ci.yml.tt +103 -0
  122. data/lib/rails/generators/rails/plugin/templates/github/dependabot.yml +12 -0
  123. data/lib/rails/generators/rails/plugin/templates/rubocop.yml.tt +8 -0
  124. data/lib/rails/generators/rails/plugin/templates/test/application_system_test_case.rb.tt +1 -1
  125. data/lib/rails/generators/rails/plugin/templates/test/test_helper.rb.tt +2 -2
  126. data/lib/rails/generators/rails/scaffold_controller/templates/api_controller.rb.tt +2 -2
  127. data/lib/rails/generators/rails/scaffold_controller/templates/controller.rb.tt +3 -3
  128. data/lib/rails/generators/rails/script/USAGE +18 -0
  129. data/lib/rails/generators/rails/script/script_generator.rb +18 -0
  130. data/lib/rails/generators/rails/script/templates/script.rb.tt +3 -0
  131. data/lib/rails/generators/test_unit/authentication/authentication_generator.rb +14 -0
  132. data/lib/rails/generators/test_unit/authentication/templates/test/fixtures/users.yml.tt +9 -0
  133. data/lib/rails/generators/test_unit/authentication/templates/test/models/user_test.rb.tt +7 -0
  134. data/lib/rails/generators/test_unit/mailer/templates/functional_test.rb.tt +6 -4
  135. data/lib/rails/generators/test_unit/mailer/templates/preview.rb.tt +3 -2
  136. data/lib/rails/generators/test_unit/scaffold/scaffold_generator.rb +15 -1
  137. data/lib/rails/generators/test_unit/scaffold/templates/api_functional_test.rb.tt +2 -2
  138. data/lib/rails/generators/test_unit/scaffold/templates/functional_test.rb.tt +2 -2
  139. data/lib/rails/generators/test_unit/scaffold/templates/system_test.rb.tt +2 -0
  140. data/lib/rails/generators/test_unit/system/templates/application_system_test_case.rb.tt +1 -1
  141. data/lib/rails/generators/testing/assertions.rb +20 -0
  142. data/lib/rails/generators/testing/behavior.rb +7 -6
  143. data/lib/rails/generators.rb +7 -2
  144. data/lib/rails/health_controller.rb +1 -1
  145. data/lib/rails/info.rb +2 -2
  146. data/lib/rails/info_controller.rb +10 -2
  147. data/lib/rails/mailers_controller.rb +14 -1
  148. data/lib/rails/paths.rb +2 -2
  149. data/lib/rails/pwa_controller.rb +15 -0
  150. data/lib/rails/rack/logger.rb +15 -7
  151. data/lib/rails/rack/silence_request.rb +33 -0
  152. data/lib/rails/rack.rb +1 -0
  153. data/lib/rails/railtie/configurable.rb +2 -2
  154. data/lib/rails/railtie.rb +15 -16
  155. data/lib/rails/source_annotation_extractor.rb +31 -14
  156. data/lib/rails/tasks/framework.rake +0 -26
  157. data/lib/rails/tasks/statistics.rake +13 -28
  158. data/lib/rails/tasks/tmp.rake +1 -1
  159. data/lib/rails/templates/layouts/application.html.erb +1 -1
  160. data/lib/rails/templates/rails/info/notes.html.erb +65 -0
  161. data/lib/rails/templates/rails/mailers/email.html.erb +12 -8
  162. data/lib/rails/templates/rails/welcome/index.html.erb +4 -2
  163. data/lib/rails/test_help.rb +2 -4
  164. data/lib/rails/test_unit/reporter.rb +8 -2
  165. data/lib/rails/test_unit/runner.rb +27 -2
  166. data/lib/rails/test_unit/test_parser.rb +48 -0
  167. data/lib/rails.rb +7 -4
  168. metadata +77 -45
  169. data/lib/rails/app_updater.rb +0 -40
  170. data/lib/rails/commands/secrets/USAGE +0 -61
  171. data/lib/rails/commands/secrets/secrets_command.rb +0 -47
  172. data/lib/rails/console/app.rb +0 -35
  173. data/lib/rails/console/helpers.rb +0 -19
  174. data/lib/rails/generators/rails/app/templates/app/assets/config/manifest.js.tt +0 -2
  175. data/lib/rails/generators/rails/app/templates/app/channels/application_cable/channel.rb.tt +0 -4
  176. data/lib/rails/generators/rails/app/templates/app/channels/application_cable/connection.rb.tt +0 -4
  177. data/lib/rails/generators/rails/app/templates/config/databases/jdbc.yml.tt +0 -68
  178. data/lib/rails/generators/rails/app/templates/config/databases/jdbcmysql.yml.tt +0 -54
  179. data/lib/rails/generators/rails/app/templates/config/databases/jdbcpostgresql.yml.tt +0 -70
  180. data/lib/rails/generators/rails/app/templates/config/databases/jdbcsqlite3.yml.tt +0 -24
  181. data/lib/rails/generators/rails/app/templates/config/databases/oracle.yml.tt +0 -62
  182. data/lib/rails/generators/rails/app/templates/config/databases/sqlserver.yml.tt +0 -53
  183. data/lib/rails/generators/rails/app/templates/config/initializers/new_framework_defaults_7_1.rb.tt +0 -284
  184. data/lib/rails/generators/rails/app/templates/config/initializers/permissions_policy.rb.tt +0 -13
  185. data/lib/rails/generators/rails/app/templates/public/apple-touch-icon-precomposed.png +0 -0
  186. data/lib/rails/generators/rails/app/templates/public/apple-touch-icon.png +0 -0
  187. data/lib/rails/generators/rails/app/templates/public/favicon.ico +0 -0
  188. data/lib/rails/generators/rails/app/templates/test/channels/application_cable/connection_test.rb.tt +0 -13
  189. data/lib/rails/generators/rails/plugin/templates/rails/dummy_manifest.js.tt +0 -10
  190. data/lib/rails/generators/rails/plugin/templates/rails/engine_manifest.js.tt +0 -6
  191. data/lib/rails/generators/rails/plugin/templates/rails/javascripts.js.tt +0 -17
  192. data/lib/rails/ruby_version_check.rb +0 -17
  193. data/lib/rails/secrets.rb +0 -110
@@ -2,83 +2,33 @@
2
2
 
3
3
  module Rails
4
4
  module Generators
5
- module Database # :nodoc:
6
- JDBC_DATABASES = %w( jdbcmysql jdbcsqlite3 jdbcpostgresql jdbc )
7
- DATABASES = %w( mysql trilogy postgresql sqlite3 oracle sqlserver ) + JDBC_DATABASES
8
-
9
- def initialize(*)
10
- super
11
- convert_database_option_for_jruby
12
- end
13
-
14
- def gem_for_database(database = options[:database])
15
- case database
16
- when "mysql" then ["mysql2", ["~> 0.5"]]
17
- when "trilogy" then ["trilogy", ["~> 2.4"]]
18
- when "postgresql" then ["pg", ["~> 1.1"]]
19
- when "sqlite3" then ["sqlite3", ["~> 1.4"]]
20
- when "oracle" then ["activerecord-oracle_enhanced-adapter", nil]
21
- when "sqlserver" then ["activerecord-sqlserver-adapter", nil]
22
- when "jdbcmysql" then ["activerecord-jdbcmysql-adapter", nil]
23
- when "jdbcsqlite3" then ["activerecord-jdbcsqlite3-adapter", nil]
24
- when "jdbcpostgresql" then ["activerecord-jdbcpostgresql-adapter", nil]
25
- when "jdbc" then ["activerecord-jdbc-adapter", nil]
26
- else [database, nil]
27
- end
28
- end
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
-
50
- def convert_database_option_for_jruby
51
- if defined?(JRUBY_VERSION)
52
- opt = options.dup
53
- case opt[:database]
54
- when "postgresql" then opt[:database] = "jdbcpostgresql"
55
- when "mysql" then opt[:database] = "jdbcmysql"
56
- when "sqlite3" then opt[:database] = "jdbcsqlite3"
57
- end
58
- self.options = opt.freeze
5
+ class Database
6
+ DATABASES = %w( mysql trilogy postgresql sqlite3 mariadb-mysql mariadb-trilogy )
7
+
8
+ module MySQL
9
+ def name
10
+ "mysql"
59
11
  end
60
- end
61
12
 
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
13
+ def port
14
+ 3306
67
15
  end
68
- end
69
16
 
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
17
+ def service
18
+ {
19
+ "image" => "mysql/mysql-server:8.0",
20
+ "restart" => "unless-stopped",
21
+ "environment" => {
22
+ "MYSQL_ALLOW_EMPTY_PASSWORD" => "true",
23
+ "MYSQL_ROOT_HOST" => "%"
24
+ },
25
+ "volumes" => ["mysql-data:/var/lib/mysql"],
26
+ "networks" => ["default"],
27
+ }
76
28
  end
77
- end
78
29
 
79
- private
80
- def mysql_socket
81
- @mysql_socket ||= [
30
+ def socket
31
+ @socket ||= [
82
32
  "/tmp/mysql.sock", # default
83
33
  "/var/run/mysqld/mysqld.sock", # debian/gentoo
84
34
  "/var/tmp/mysql.sock", # freebsd
@@ -90,6 +40,248 @@ module Rails
90
40
  "/opt/lampp/var/mysql/mysql.sock" # xampp for linux
91
41
  ].find { |f| File.exist?(f) } unless Gem.win_platform?
92
42
  end
43
+
44
+ def host
45
+ "127.0.0.1"
46
+ end
47
+ end
48
+
49
+ module MariaDB
50
+ def name
51
+ "mariadb"
52
+ end
53
+
54
+ def port
55
+ 3306
56
+ end
57
+
58
+ def service
59
+ {
60
+ "image" => "mariadb:10.5",
61
+ "restart" => "unless-stopped",
62
+ "networks" => ["default"],
63
+ "volumes" => ["mariadb-data:/var/lib/mysql"],
64
+ "environment" => {
65
+ "MARIADB_ALLOW_EMPTY_ROOT_PASSWORD" => "true",
66
+ },
67
+ }
68
+ end
69
+ end
70
+
71
+ class << self
72
+ def build(database_name)
73
+ case database_name
74
+ when "mysql" then MySQL2.new
75
+ when "postgresql" then PostgreSQL.new
76
+ when "trilogy" then Trilogy.new
77
+ when "sqlite3" then SQLite3.new
78
+ when "mariadb-mysql" then MariaDBMySQL2.new
79
+ when "mariadb-trilogy" then MariaDBTrilogy.new
80
+ else Null.new
81
+ end
82
+ end
83
+
84
+ def all
85
+ @all ||= [
86
+ MySQL2.new,
87
+ PostgreSQL.new,
88
+ SQLite3.new,
89
+ MariaDBMySQL2.new,
90
+ MariaDBTrilogy.new
91
+ ]
92
+ end
93
+ end
94
+
95
+ def name
96
+ raise NotImplementedError
97
+ end
98
+
99
+ def template
100
+ raise NotImplementedError
101
+ end
102
+
103
+ def service
104
+ raise NotImplementedError
105
+ end
106
+
107
+ def port
108
+ raise NotImplementedError
109
+ end
110
+
111
+ def feature_name
112
+ raise NotImplementedError
113
+ end
114
+
115
+ def gem
116
+ raise NotImplementedError
117
+ end
118
+
119
+ def base_package
120
+ raise NotImplementedError
121
+ end
122
+
123
+ def build_package
124
+ raise NotImplementedError
125
+ end
126
+
127
+ def socket; end
128
+ def host; end
129
+
130
+ def feature
131
+ return unless feature_name
132
+
133
+ { feature_name => {} }
134
+ end
135
+
136
+ def volume
137
+ return unless service
138
+
139
+ "#{name}-data"
140
+ end
141
+
142
+ class MySQL2 < Database
143
+ include MySQL
144
+
145
+ def template
146
+ "config/databases/mysql.yml"
147
+ end
148
+
149
+ def gem
150
+ ["mysql2", ["~> 0.5"]]
151
+ end
152
+
153
+ def base_package
154
+ "default-mysql-client"
155
+ end
156
+
157
+ def build_package
158
+ "default-libmysqlclient-dev"
159
+ end
160
+
161
+ def feature_name
162
+ "ghcr.io/rails/devcontainer/features/mysql-client"
163
+ end
164
+ end
165
+
166
+ class PostgreSQL < Database
167
+ def name
168
+ "postgres"
169
+ end
170
+
171
+ def template
172
+ "config/databases/postgresql.yml"
173
+ end
174
+
175
+ def service
176
+ {
177
+ "image" => "postgres:16.1",
178
+ "restart" => "unless-stopped",
179
+ "networks" => ["default"],
180
+ "volumes" => ["postgres-data:/var/lib/postgresql/data"],
181
+ "environment" => {
182
+ "POSTGRES_USER" => "postgres",
183
+ "POSTGRES_PASSWORD" => "postgres"
184
+ }
185
+ }
186
+ end
187
+
188
+ def port
189
+ 5432
190
+ end
191
+
192
+ def gem
193
+ ["pg", ["~> 1.1"]]
194
+ end
195
+
196
+ def base_package
197
+ "postgresql-client"
198
+ end
199
+
200
+ def build_package
201
+ "libpq-dev"
202
+ end
203
+
204
+ def feature_name
205
+ "ghcr.io/rails/devcontainer/features/postgres-client"
206
+ end
207
+ end
208
+
209
+ class Trilogy < Database
210
+ include MySQL
211
+
212
+ def template
213
+ "config/databases/trilogy.yml"
214
+ end
215
+
216
+ def gem
217
+ ["trilogy", ["~> 2.7"]]
218
+ end
219
+
220
+ def base_package
221
+ nil
222
+ end
223
+
224
+ def build_package
225
+ nil
226
+ end
227
+
228
+ def feature_name
229
+ nil
230
+ end
231
+ end
232
+
233
+ class SQLite3 < Database
234
+ def name
235
+ "sqlite3"
236
+ end
237
+
238
+ def template
239
+ "config/databases/sqlite3.yml"
240
+ end
241
+
242
+ def service
243
+ nil
244
+ end
245
+
246
+ def port
247
+ nil
248
+ end
249
+
250
+ def gem
251
+ ["sqlite3", [">= 2.1"]]
252
+ end
253
+
254
+ def base_package
255
+ "sqlite3"
256
+ end
257
+
258
+ def build_package
259
+ nil
260
+ end
261
+
262
+ def feature_name
263
+ "ghcr.io/rails/devcontainer/features/sqlite3"
264
+ end
265
+ end
266
+
267
+ class MariaDBMySQL2 < MySQL2
268
+ include MariaDB
269
+ end
270
+
271
+ class MariaDBTrilogy < Trilogy
272
+ include MariaDB
273
+ end
274
+
275
+ class Null < Database
276
+ def name; end
277
+ def template; end
278
+ def service; end
279
+ def port; end
280
+ def volume; end
281
+ def base_package; end
282
+ def build_package; end
283
+ def feature_name; end
284
+ end
93
285
  end
94
286
  end
95
287
  end
@@ -0,0 +1,15 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "rails/generators/erb"
4
+
5
+ module Erb # :nodoc:
6
+ module Generators # :nodoc:
7
+ class AuthenticationGenerator < Rails::Generators::Base # :nodoc:
8
+ def create_files
9
+ template "app/views/passwords/new.html.erb"
10
+ template "app/views/passwords/edit.html.erb"
11
+ template "app/views/sessions/new.html.erb"
12
+ end
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,9 @@
1
+ <h1>Update your password</h1>
2
+
3
+ <%%= tag.div(flash[:alert], style: "color:red") if flash[:alert] %>
4
+
5
+ <%%= form_with url: password_path(params[:token]), method: :put do |form| %>
6
+ <%%= form.password_field :password, required: true, autocomplete: "new-password", placeholder: "Enter new password", maxlength: 72 %><br>
7
+ <%%= form.password_field :password_confirmation, required: true, autocomplete: "new-password", placeholder: "Repeat new password", maxlength: 72 %><br>
8
+ <%%= form.submit "Save" %>
9
+ <%% end %>
@@ -0,0 +1,8 @@
1
+ <h1>Forgot your password?</h1>
2
+
3
+ <%%= tag.div(flash[:alert], style: "color:red") if flash[:alert] %>
4
+
5
+ <%%= form_with url: passwords_path do |form| %>
6
+ <%%= form.email_field :email_address, required: true, autofocus: true, autocomplete: "username", placeholder: "Enter your email address", value: params[:email_address] %><br>
7
+ <%%= form.submit "Email reset instructions" %>
8
+ <%% end %>
@@ -0,0 +1,11 @@
1
+ <%%= tag.div(flash[:alert], style: "color:red") if flash[:alert] %>
2
+ <%%= tag.div(flash[:notice], style: "color:green") if flash[:notice] %>
3
+
4
+ <%%= form_with url: session_path do |form| %>
5
+ <%%= form.email_field :email_address, required: true, autofocus: true, autocomplete: "username", placeholder: "Enter your email address", value: params[:email_address] %><br>
6
+ <%%= form.password_field :password, required: true, autocomplete: "current-password", placeholder: "Enter your password", maxlength: 72 %><br>
7
+ <%%= form.submit "Sign in" %>
8
+ <%% end %>
9
+ <br>
10
+
11
+ <%%= link_to "Forgot password?", new_password_path %>
@@ -1,3 +1,5 @@
1
+ <%% content_for :title, "Editing <%= human_name.downcase %>" %>
2
+
1
3
  <h1>Editing <%= human_name.downcase %></h1>
2
4
 
3
5
  <%%= render "form", <%= singular_table_name %>: @<%= singular_table_name %> %>
@@ -1,5 +1,7 @@
1
1
  <p style="color: green"><%%= notice %></p>
2
2
 
3
+ <%% content_for :title, "<%= human_name.pluralize %>" %>
4
+
3
5
  <h1><%= human_name.pluralize %></h1>
4
6
 
5
7
  <div id="<%= plural_table_name %>">
@@ -1,3 +1,5 @@
1
+ <%% content_for :title, "New <%= human_name.downcase %>" %>
2
+
1
3
  <h1>New <%= human_name.downcase %></h1>
2
4
 
3
5
  <%%= render "form", <%= singular_table_name %>: @<%= singular_table_name %> %>
@@ -1,6 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  require "active_support/time"
4
+ require "active_support/core_ext/string/starts_ends_with"
4
5
 
5
6
  module Rails
6
7
  module Generators
@@ -72,7 +73,7 @@ module Rails
72
73
  def valid_type?(type)
73
74
  DEFAULT_TYPES.include?(type.to_s) ||
74
75
  !defined?(ActiveRecord::Base) ||
75
- ActiveRecord::Base.connection.valid_type?(type)
76
+ ActiveRecord::Base.lease_connection.valid_type?(type)
76
77
  end
77
78
 
78
79
  def valid_index_type?(index_type)
@@ -89,20 +90,24 @@ module Rails
89
90
  def parse_type_and_options(type)
90
91
  case type
91
92
  when /(text|binary)\{([a-z]+)\}/
92
- return $1, size: $2.to_sym
93
+ parsed_type, parsed_options = $1, { size: $2.to_sym }
93
94
  when /(string|text|binary|integer)\{(\d+)\}/
94
- return $1, limit: $2.to_i
95
+ parsed_type, parsed_options = $1, { limit: $2.to_i }
95
96
  when /decimal\{(\d+)[,.-](\d+)\}/
96
- return :decimal, precision: $1.to_i, scale: $2.to_i
97
+ parsed_type, parsed_options = :decimal, { precision: $1.to_i, scale: $2.to_i }
97
98
  when /(references|belongs_to)\{(.+)\}/
98
- type = $1
99
+ parsed_type = $1
99
100
  provided_options = $2.split(/[,.-]/)
100
- options = Hash[provided_options.map { |opt| [opt.to_sym, true] }]
101
-
102
- return type, options
101
+ parsed_options = Hash[provided_options.map { |opt| [opt.to_sym, true] }]
103
102
  else
104
- return type, {}
103
+ parsed_type, parsed_options = type&.remove("!"), {}
104
+ end
105
+
106
+ if type&.ends_with?("!")
107
+ parsed_options[:null] = false
105
108
  end
109
+
110
+ return parsed_type, parsed_options
106
111
  end
107
112
  end
108
113
 
@@ -121,9 +126,9 @@ module Rails
121
126
  when :time then :time_field
122
127
  when :datetime, :timestamp then :datetime_field
123
128
  when :date then :date_field
124
- when :text then :text_area
125
- when :rich_text then :rich_text_area
126
- when :boolean then :check_box
129
+ when :text then :textarea
130
+ when :rich_text then :rich_textarea
131
+ when :boolean then :checkbox
127
132
  when :attachment, :attachments then :file_field
128
133
  else
129
134
  :text_field
@@ -239,6 +244,31 @@ module Rails
239
244
  end
240
245
  end
241
246
  end
247
+
248
+ def to_s
249
+ if has_uniq_index?
250
+ "#{name}:#{type}#{print_attribute_options}:uniq"
251
+ elsif has_index?
252
+ "#{name}:#{type}#{print_attribute_options}:index"
253
+ else
254
+ "#{name}:#{type}#{print_attribute_options}"
255
+ end
256
+ end
257
+
258
+ private
259
+ def print_attribute_options
260
+ if attr_options.empty?
261
+ ""
262
+ elsif attr_options[:size]
263
+ "{#{attr_options[:size]}}"
264
+ elsif attr_options[:limit]
265
+ "{#{attr_options[:limit]}}"
266
+ elsif attr_options[:precision] && attr_options[:scale]
267
+ "{#{attr_options[:precision]},#{attr_options[:scale]}}"
268
+ else
269
+ "{#{attr_options.keys.join(",")}}"
270
+ end
271
+ end
242
272
  end
243
273
  end
244
274
  end
@@ -7,7 +7,7 @@ module Rails
7
7
  module Generators
8
8
  # Holds common methods for migrations. It assumes that migrations have the
9
9
  # [0-9]*_name format and can be used by other frameworks (like Sequel)
10
- # just by implementing the next migration version method.
10
+ # just by implementing the +next_migration_number+ method.
11
11
  module Migration
12
12
  extend ActiveSupport::Concern
13
13
  attr_reader :migration_number, :migration_file_name, :migration_class_name
@@ -46,10 +46,10 @@ module Rails
46
46
  end
47
47
 
48
48
  # Creates a migration template at the given destination. The difference
49
- # to the default template method is that the migration version is appended
49
+ # to the default template method is that the migration number is prepended
50
50
  # to the destination file name.
51
51
  #
52
- # The migration version, migration file name, migration class name are
52
+ # The migration number, migration file name, migration class name are
53
53
  # available as instance variables in the template to be rendered.
54
54
  #
55
55
  # migration_template "migration.rb", "db/migrate/add_foo_to_bar.rb"