omg-railties 8.0.0.alpha3

Sign up to get free protection for your applications and to get access to all the features.
Files changed (351) hide show
  1. checksums.yaml +7 -0
  2. data/CHANGELOG.md +171 -0
  3. data/MIT-LICENSE +20 -0
  4. data/RDOC_MAIN.md +99 -0
  5. data/README.rdoc +39 -0
  6. data/exe/rails +10 -0
  7. data/lib/minitest/rails_plugin.rb +140 -0
  8. data/lib/rails/all.rb +21 -0
  9. data/lib/rails/api/generator.rb +38 -0
  10. data/lib/rails/api/task.rb +235 -0
  11. data/lib/rails/app_loader.rb +77 -0
  12. data/lib/rails/application/bootstrap.rb +118 -0
  13. data/lib/rails/application/configuration.rb +659 -0
  14. data/lib/rails/application/default_middleware_stack.rb +140 -0
  15. data/lib/rails/application/dummy_config.rb +19 -0
  16. data/lib/rails/application/finisher.rb +238 -0
  17. data/lib/rails/application/routes_reloader.rb +79 -0
  18. data/lib/rails/application.rb +658 -0
  19. data/lib/rails/application_controller.rb +28 -0
  20. data/lib/rails/autoloaders/inflector.rb +21 -0
  21. data/lib/rails/autoloaders.rb +48 -0
  22. data/lib/rails/backtrace_cleaner.rb +42 -0
  23. data/lib/rails/cli.rb +21 -0
  24. data/lib/rails/code_statistics.rb +159 -0
  25. data/lib/rails/code_statistics_calculator.rb +99 -0
  26. data/lib/rails/command/actions.rb +52 -0
  27. data/lib/rails/command/base.rb +185 -0
  28. data/lib/rails/command/behavior.rb +84 -0
  29. data/lib/rails/command/environment_argument.rb +56 -0
  30. data/lib/rails/command/helpers/editor.rb +40 -0
  31. data/lib/rails/command.rb +172 -0
  32. data/lib/rails/commands/about/about_command.rb +14 -0
  33. data/lib/rails/commands/app/update_command.rb +94 -0
  34. data/lib/rails/commands/application/application_command.rb +33 -0
  35. data/lib/rails/commands/boot/boot_command.rb +14 -0
  36. data/lib/rails/commands/console/console_command.rb +91 -0
  37. data/lib/rails/commands/console/irb_console.rb +136 -0
  38. data/lib/rails/commands/credentials/USAGE +73 -0
  39. data/lib/rails/commands/credentials/credentials_command/diffing.rb +53 -0
  40. data/lib/rails/commands/credentials/credentials_command.rb +139 -0
  41. data/lib/rails/commands/db/system/change/change_command.rb +26 -0
  42. data/lib/rails/commands/dbconsole/dbconsole_command.rb +88 -0
  43. data/lib/rails/commands/destroy/destroy_command.rb +29 -0
  44. data/lib/rails/commands/dev/dev_command.rb +14 -0
  45. data/lib/rails/commands/devcontainer/devcontainer_command.rb +39 -0
  46. data/lib/rails/commands/encrypted/USAGE +23 -0
  47. data/lib/rails/commands/encrypted/encrypted_command.rb +98 -0
  48. data/lib/rails/commands/gem_help/USAGE +16 -0
  49. data/lib/rails/commands/gem_help/gem_help_command.rb +13 -0
  50. data/lib/rails/commands/generate/generate_command.rb +30 -0
  51. data/lib/rails/commands/help/USAGE +17 -0
  52. data/lib/rails/commands/help/help_command.rb +34 -0
  53. data/lib/rails/commands/initializers/initializers_command.rb +20 -0
  54. data/lib/rails/commands/middleware/middleware_command.rb +17 -0
  55. data/lib/rails/commands/new/new_command.rb +21 -0
  56. data/lib/rails/commands/notes/notes_command.rb +30 -0
  57. data/lib/rails/commands/plugin/plugin_command.rb +47 -0
  58. data/lib/rails/commands/rake/rake_command.rb +55 -0
  59. data/lib/rails/commands/restart/restart_command.rb +14 -0
  60. data/lib/rails/commands/routes/routes_command.rb +49 -0
  61. data/lib/rails/commands/runner/USAGE +22 -0
  62. data/lib/rails/commands/runner/runner_command.rb +81 -0
  63. data/lib/rails/commands/secret/secret_command.rb +13 -0
  64. data/lib/rails/commands/server/server_command.rb +290 -0
  65. data/lib/rails/commands/stats/stats_command.rb +19 -0
  66. data/lib/rails/commands/test/USAGE +14 -0
  67. data/lib/rails/commands/test/test_command.rb +81 -0
  68. data/lib/rails/commands/unused_routes/unused_routes_command.rb +75 -0
  69. data/lib/rails/commands/version/version_command.rb +12 -0
  70. data/lib/rails/commands.rb +18 -0
  71. data/lib/rails/configuration.rb +170 -0
  72. data/lib/rails/console/app.rb +8 -0
  73. data/lib/rails/console/helpers.rb +8 -0
  74. data/lib/rails/console/methods.rb +23 -0
  75. data/lib/rails/deprecator.rb +7 -0
  76. data/lib/rails/dev_caching.rb +44 -0
  77. data/lib/rails/engine/commands.rb +9 -0
  78. data/lib/rails/engine/configuration.rb +138 -0
  79. data/lib/rails/engine/lazy_route_set.rb +109 -0
  80. data/lib/rails/engine/railties.rb +23 -0
  81. data/lib/rails/engine/updater.rb +21 -0
  82. data/lib/rails/engine.rb +760 -0
  83. data/lib/rails/gem_version.rb +17 -0
  84. data/lib/rails/generators/actions/create_migration.rb +75 -0
  85. data/lib/rails/generators/actions.rb +528 -0
  86. data/lib/rails/generators/active_model.rb +94 -0
  87. data/lib/rails/generators/app_base.rb +806 -0
  88. data/lib/rails/generators/app_name.rb +39 -0
  89. data/lib/rails/generators/base.rb +432 -0
  90. data/lib/rails/generators/database.rb +287 -0
  91. data/lib/rails/generators/erb/authentication/authentication_generator.rb +15 -0
  92. data/lib/rails/generators/erb/authentication/templates/views/passwords/edit.html.erb +9 -0
  93. data/lib/rails/generators/erb/authentication/templates/views/passwords/new.html.erb +8 -0
  94. data/lib/rails/generators/erb/authentication/templates/views/sessions/new.html.erb +11 -0
  95. data/lib/rails/generators/erb/controller/controller_generator.rb +24 -0
  96. data/lib/rails/generators/erb/controller/templates/view.html.erb.tt +2 -0
  97. data/lib/rails/generators/erb/mailer/mailer_generator.rb +41 -0
  98. data/lib/rails/generators/erb/mailer/templates/layout.html.erb.tt +13 -0
  99. data/lib/rails/generators/erb/mailer/templates/layout.text.erb.tt +1 -0
  100. data/lib/rails/generators/erb/mailer/templates/view.html.erb.tt +5 -0
  101. data/lib/rails/generators/erb/mailer/templates/view.text.erb.tt +3 -0
  102. data/lib/rails/generators/erb/scaffold/scaffold_generator.rb +34 -0
  103. data/lib/rails/generators/erb/scaffold/templates/_form.html.erb.tt +37 -0
  104. data/lib/rails/generators/erb/scaffold/templates/edit.html.erb.tt +12 -0
  105. data/lib/rails/generators/erb/scaffold/templates/index.html.erb.tt +16 -0
  106. data/lib/rails/generators/erb/scaffold/templates/new.html.erb.tt +11 -0
  107. data/lib/rails/generators/erb/scaffold/templates/partial.html.erb.tt +17 -0
  108. data/lib/rails/generators/erb/scaffold/templates/show.html.erb.tt +10 -0
  109. data/lib/rails/generators/erb.rb +26 -0
  110. data/lib/rails/generators/generated_attribute.rb +274 -0
  111. data/lib/rails/generators/migration.rb +71 -0
  112. data/lib/rails/generators/model_helpers.rb +62 -0
  113. data/lib/rails/generators/named_base.rb +227 -0
  114. data/lib/rails/generators/rails/app/USAGE +31 -0
  115. data/lib/rails/generators/rails/app/app_generator.rb +678 -0
  116. data/lib/rails/generators/rails/app/templates/Dockerfile.tt +119 -0
  117. data/lib/rails/generators/rails/app/templates/Gemfile.tt +83 -0
  118. data/lib/rails/generators/rails/app/templates/README.md.tt +24 -0
  119. data/lib/rails/generators/rails/app/templates/Rakefile.tt +6 -0
  120. data/lib/rails/generators/rails/app/templates/app/assets/stylesheets/application.css.tt +15 -0
  121. data/lib/rails/generators/rails/app/templates/app/controllers/application_controller.rb.tt +6 -0
  122. data/lib/rails/generators/rails/app/templates/app/helpers/application_helper.rb.tt +2 -0
  123. data/lib/rails/generators/rails/app/templates/app/jobs/application_job.rb.tt +7 -0
  124. data/lib/rails/generators/rails/app/templates/app/mailers/application_mailer.rb.tt +4 -0
  125. data/lib/rails/generators/rails/app/templates/app/models/application_record.rb.tt +3 -0
  126. data/lib/rails/generators/rails/app/templates/app/views/layouts/application.html.erb.tt +33 -0
  127. data/lib/rails/generators/rails/app/templates/app/views/layouts/mailer.html.erb.tt +13 -0
  128. data/lib/rails/generators/rails/app/templates/app/views/layouts/mailer.text.erb.tt +1 -0
  129. data/lib/rails/generators/rails/app/templates/app/views/pwa/manifest.json.erb.tt +22 -0
  130. data/lib/rails/generators/rails/app/templates/app/views/pwa/service-worker.js +26 -0
  131. data/lib/rails/generators/rails/app/templates/bin/brakeman.tt +6 -0
  132. data/lib/rails/generators/rails/app/templates/bin/dev.tt +1 -0
  133. data/lib/rails/generators/rails/app/templates/bin/rails.tt +3 -0
  134. data/lib/rails/generators/rails/app/templates/bin/rake.tt +3 -0
  135. data/lib/rails/generators/rails/app/templates/bin/rubocop.tt +7 -0
  136. data/lib/rails/generators/rails/app/templates/bin/setup.tt +45 -0
  137. data/lib/rails/generators/rails/app/templates/bin/thrust.tt +4 -0
  138. data/lib/rails/generators/rails/app/templates/config/application.rb.tt +42 -0
  139. data/lib/rails/generators/rails/app/templates/config/boot.rb.tt +6 -0
  140. data/lib/rails/generators/rails/app/templates/config/cable.yml.tt +10 -0
  141. data/lib/rails/generators/rails/app/templates/config/databases/mysql.yml.tt +82 -0
  142. data/lib/rails/generators/rails/app/templates/config/databases/postgresql.yml.tt +114 -0
  143. data/lib/rails/generators/rails/app/templates/config/databases/sqlite3.yml.tt +72 -0
  144. data/lib/rails/generators/rails/app/templates/config/databases/trilogy.yml.tt +82 -0
  145. data/lib/rails/generators/rails/app/templates/config/deploy.yml.tt +107 -0
  146. data/lib/rails/generators/rails/app/templates/config/environment.rb.tt +5 -0
  147. data/lib/rails/generators/rails/app/templates/config/environments/development.rb.tt +89 -0
  148. data/lib/rails/generators/rails/app/templates/config/environments/production.rb.tt +125 -0
  149. data/lib/rails/generators/rails/app/templates/config/environments/test.rb.tt +62 -0
  150. data/lib/rails/generators/rails/app/templates/config/initializers/assets.rb.tt +7 -0
  151. data/lib/rails/generators/rails/app/templates/config/initializers/content_security_policy.rb.tt +25 -0
  152. data/lib/rails/generators/rails/app/templates/config/initializers/cors.rb.tt +16 -0
  153. data/lib/rails/generators/rails/app/templates/config/initializers/filter_parameter_logging.rb.tt +8 -0
  154. data/lib/rails/generators/rails/app/templates/config/initializers/inflections.rb.tt +16 -0
  155. data/lib/rails/generators/rails/app/templates/config/initializers/new_framework_defaults_8_0.rb.tt +25 -0
  156. data/lib/rails/generators/rails/app/templates/config/locales/en.yml +31 -0
  157. data/lib/rails/generators/rails/app/templates/config/puma.rb.tt +43 -0
  158. data/lib/rails/generators/rails/app/templates/config/routes.rb.tt +16 -0
  159. data/lib/rails/generators/rails/app/templates/config/storage.yml.tt +34 -0
  160. data/lib/rails/generators/rails/app/templates/config.ru.tt +6 -0
  161. data/lib/rails/generators/rails/app/templates/db/seeds.rb.tt +9 -0
  162. data/lib/rails/generators/rails/app/templates/docker-entrypoint.tt +16 -0
  163. data/lib/rails/generators/rails/app/templates/dockerignore.tt +56 -0
  164. data/lib/rails/generators/rails/app/templates/env.erb.tt +5 -0
  165. data/lib/rails/generators/rails/app/templates/gitattributes.tt +9 -0
  166. data/lib/rails/generators/rails/app/templates/github/ci.yml.tt +138 -0
  167. data/lib/rails/generators/rails/app/templates/github/dependabot.yml +12 -0
  168. data/lib/rails/generators/rails/app/templates/gitignore.tt +38 -0
  169. data/lib/rails/generators/rails/app/templates/node-version.tt +1 -0
  170. data/lib/rails/generators/rails/app/templates/public/400.html +67 -0
  171. data/lib/rails/generators/rails/app/templates/public/404.html +67 -0
  172. data/lib/rails/generators/rails/app/templates/public/406-unsupported-browser.html +66 -0
  173. data/lib/rails/generators/rails/app/templates/public/422.html +67 -0
  174. data/lib/rails/generators/rails/app/templates/public/500.html +66 -0
  175. data/lib/rails/generators/rails/app/templates/public/icon.png +0 -0
  176. data/lib/rails/generators/rails/app/templates/public/icon.svg +3 -0
  177. data/lib/rails/generators/rails/app/templates/public/robots.txt +1 -0
  178. data/lib/rails/generators/rails/app/templates/rubocop.yml.tt +8 -0
  179. data/lib/rails/generators/rails/app/templates/ruby-version.tt +1 -0
  180. data/lib/rails/generators/rails/app/templates/test/application_system_test_case.rb.tt +5 -0
  181. data/lib/rails/generators/rails/app/templates/test/test_helper.rb.tt +21 -0
  182. data/lib/rails/generators/rails/application_record/application_record_generator.rb +13 -0
  183. data/lib/rails/generators/rails/authentication/USAGE +6 -0
  184. data/lib/rails/generators/rails/authentication/authentication_generator.rb +54 -0
  185. data/lib/rails/generators/rails/authentication/templates/controllers/concerns/authentication.rb +55 -0
  186. data/lib/rails/generators/rails/authentication/templates/controllers/passwords_controller.rb +33 -0
  187. data/lib/rails/generators/rails/authentication/templates/controllers/sessions_controller.rb +21 -0
  188. data/lib/rails/generators/rails/authentication/templates/mailers/passwords_mailer.rb +6 -0
  189. data/lib/rails/generators/rails/authentication/templates/models/current.rb +4 -0
  190. data/lib/rails/generators/rails/authentication/templates/models/session.rb +3 -0
  191. data/lib/rails/generators/rails/authentication/templates/models/user.rb +6 -0
  192. data/lib/rails/generators/rails/authentication/templates/test/mailers/previews/passwords_mailer_preview.rb +7 -0
  193. data/lib/rails/generators/rails/authentication/templates/views/passwords_mailer/reset.html.erb +4 -0
  194. data/lib/rails/generators/rails/authentication/templates/views/passwords_mailer/reset.text.erb +2 -0
  195. data/lib/rails/generators/rails/benchmark/USAGE +19 -0
  196. data/lib/rails/generators/rails/benchmark/benchmark_generator.rb +30 -0
  197. data/lib/rails/generators/rails/benchmark/templates/benchmark.rb.tt +15 -0
  198. data/lib/rails/generators/rails/controller/USAGE +26 -0
  199. data/lib/rails/generators/rails/controller/controller_generator.rb +42 -0
  200. data/lib/rails/generators/rails/controller/templates/controller.rb.tt +9 -0
  201. data/lib/rails/generators/rails/credentials/credentials_generator.rb +61 -0
  202. data/lib/rails/generators/rails/credentials/templates/credentials.yml.tt +12 -0
  203. data/lib/rails/generators/rails/db/system/change/change_generator.rb +206 -0
  204. data/lib/rails/generators/rails/devcontainer/devcontainer_generator.rb +168 -0
  205. data/lib/rails/generators/rails/devcontainer/templates/devcontainer/Dockerfile.tt +3 -0
  206. data/lib/rails/generators/rails/devcontainer/templates/devcontainer/compose.yaml.tt +47 -0
  207. data/lib/rails/generators/rails/devcontainer/templates/devcontainer/devcontainer.json.tt +37 -0
  208. data/lib/rails/generators/rails/encrypted_file/encrypted_file_generator.rb +31 -0
  209. data/lib/rails/generators/rails/encryption_key_file/encryption_key_file_generator.rb +57 -0
  210. data/lib/rails/generators/rails/generator/USAGE +13 -0
  211. data/lib/rails/generators/rails/generator/generator_generator.rb +27 -0
  212. data/lib/rails/generators/rails/generator/templates/%file_name%_generator.rb.tt +3 -0
  213. data/lib/rails/generators/rails/generator/templates/USAGE.tt +8 -0
  214. data/lib/rails/generators/rails/generator/templates/templates/.empty_directory +0 -0
  215. data/lib/rails/generators/rails/helper/USAGE +12 -0
  216. data/lib/rails/generators/rails/helper/helper_generator.rb +20 -0
  217. data/lib/rails/generators/rails/helper/templates/helper.rb.tt +4 -0
  218. data/lib/rails/generators/rails/integration_test/USAGE +10 -0
  219. data/lib/rails/generators/rails/integration_test/integration_test_generator.rb +9 -0
  220. data/lib/rails/generators/rails/master_key/master_key_generator.rb +53 -0
  221. data/lib/rails/generators/rails/migration/USAGE +45 -0
  222. data/lib/rails/generators/rails/migration/migration_generator.rb +14 -0
  223. data/lib/rails/generators/rails/model/model_generator.rb +18 -0
  224. data/lib/rails/generators/rails/plugin/USAGE +21 -0
  225. data/lib/rails/generators/rails/plugin/plugin_generator.rb +499 -0
  226. data/lib/rails/generators/rails/plugin/templates/%name%.gemspec.tt +28 -0
  227. data/lib/rails/generators/rails/plugin/templates/Gemfile.tt +23 -0
  228. data/lib/rails/generators/rails/plugin/templates/MIT-LICENSE.tt +20 -0
  229. data/lib/rails/generators/rails/plugin/templates/README.md.tt +28 -0
  230. data/lib/rails/generators/rails/plugin/templates/Rakefile.tt +14 -0
  231. data/lib/rails/generators/rails/plugin/templates/app/controllers/%namespaced_name%/application_controller.rb.tt +5 -0
  232. data/lib/rails/generators/rails/plugin/templates/app/helpers/%namespaced_name%/application_helper.rb.tt +5 -0
  233. data/lib/rails/generators/rails/plugin/templates/app/jobs/%namespaced_name%/application_job.rb.tt +5 -0
  234. data/lib/rails/generators/rails/plugin/templates/app/mailers/%namespaced_name%/application_mailer.rb.tt +7 -0
  235. data/lib/rails/generators/rails/plugin/templates/app/models/%namespaced_name%/application_record.rb.tt +6 -0
  236. data/lib/rails/generators/rails/plugin/templates/app/views/layouts/%namespaced_name%/application.html.erb.tt +17 -0
  237. data/lib/rails/generators/rails/plugin/templates/bin/rails.tt +15 -0
  238. data/lib/rails/generators/rails/plugin/templates/bin/rubocop.tt +7 -0
  239. data/lib/rails/generators/rails/plugin/templates/bin/test.tt +4 -0
  240. data/lib/rails/generators/rails/plugin/templates/config/routes.rb.tt +6 -0
  241. data/lib/rails/generators/rails/plugin/templates/github/ci.yml.tt +103 -0
  242. data/lib/rails/generators/rails/plugin/templates/github/dependabot.yml +12 -0
  243. data/lib/rails/generators/rails/plugin/templates/gitignore.tt +14 -0
  244. data/lib/rails/generators/rails/plugin/templates/lib/%namespaced_name%/engine.rb.tt +7 -0
  245. data/lib/rails/generators/rails/plugin/templates/lib/%namespaced_name%/railtie.rb.tt +5 -0
  246. data/lib/rails/generators/rails/plugin/templates/lib/%namespaced_name%/version.rb.tt +1 -0
  247. data/lib/rails/generators/rails/plugin/templates/lib/%namespaced_name%.rb.tt +8 -0
  248. data/lib/rails/generators/rails/plugin/templates/lib/tasks/%namespaced_name%_tasks.rake.tt +4 -0
  249. data/lib/rails/generators/rails/plugin/templates/rails/boot.rb.tt +5 -0
  250. data/lib/rails/generators/rails/plugin/templates/rails/routes.rb.tt +3 -0
  251. data/lib/rails/generators/rails/plugin/templates/rails/stylesheets.css +15 -0
  252. data/lib/rails/generators/rails/plugin/templates/rubocop.yml.tt +8 -0
  253. data/lib/rails/generators/rails/plugin/templates/test/%namespaced_name%_test.rb.tt +7 -0
  254. data/lib/rails/generators/rails/plugin/templates/test/application_system_test_case.rb.tt +5 -0
  255. data/lib/rails/generators/rails/plugin/templates/test/integration/navigation_test.rb.tt +7 -0
  256. data/lib/rails/generators/rails/plugin/templates/test/test_helper.rb.tt +21 -0
  257. data/lib/rails/generators/rails/resource/USAGE +23 -0
  258. data/lib/rails/generators/rails/resource/resource_generator.rb +27 -0
  259. data/lib/rails/generators/rails/resource_route/resource_route_generator.rb +23 -0
  260. data/lib/rails/generators/rails/scaffold/USAGE +41 -0
  261. data/lib/rails/generators/rails/scaffold/scaffold_generator.rb +18 -0
  262. data/lib/rails/generators/rails/scaffold_controller/USAGE +19 -0
  263. data/lib/rails/generators/rails/scaffold_controller/scaffold_controller_generator.rb +56 -0
  264. data/lib/rails/generators/rails/scaffold_controller/templates/api_controller.rb.tt +57 -0
  265. data/lib/rails/generators/rails/scaffold_controller/templates/controller.rb.tt +64 -0
  266. data/lib/rails/generators/rails/script/USAGE +18 -0
  267. data/lib/rails/generators/rails/script/script_generator.rb +18 -0
  268. data/lib/rails/generators/rails/script/templates/script.rb.tt +3 -0
  269. data/lib/rails/generators/rails/system_test/USAGE +10 -0
  270. data/lib/rails/generators/rails/system_test/system_test_generator.rb +9 -0
  271. data/lib/rails/generators/rails/task/USAGE +9 -0
  272. data/lib/rails/generators/rails/task/task_generator.rb +13 -0
  273. data/lib/rails/generators/rails/task/templates/task.rb.tt +8 -0
  274. data/lib/rails/generators/resource_helpers.rb +82 -0
  275. data/lib/rails/generators/test_case.rb +37 -0
  276. data/lib/rails/generators/test_unit/controller/controller_generator.rb +19 -0
  277. data/lib/rails/generators/test_unit/controller/templates/functional_test.rb.tt +23 -0
  278. data/lib/rails/generators/test_unit/generator/generator_generator.rb +27 -0
  279. data/lib/rails/generators/test_unit/generator/templates/generator_test.rb.tt +16 -0
  280. data/lib/rails/generators/test_unit/helper/helper_generator.rb +11 -0
  281. data/lib/rails/generators/test_unit/integration/integration_generator.rb +20 -0
  282. data/lib/rails/generators/test_unit/integration/templates/integration_test.rb.tt +9 -0
  283. data/lib/rails/generators/test_unit/job/job_generator.rb +20 -0
  284. data/lib/rails/generators/test_unit/job/templates/unit_test.rb.tt +9 -0
  285. data/lib/rails/generators/test_unit/mailer/mailer_generator.rb +28 -0
  286. data/lib/rails/generators/test_unit/mailer/templates/functional_test.rb.tt +23 -0
  287. data/lib/rails/generators/test_unit/mailer/templates/preview.rb.tt +14 -0
  288. data/lib/rails/generators/test_unit/model/model_generator.rb +37 -0
  289. data/lib/rails/generators/test_unit/model/templates/fixtures.yml.tt +29 -0
  290. data/lib/rails/generators/test_unit/model/templates/unit_test.rb.tt +9 -0
  291. data/lib/rails/generators/test_unit/plugin/plugin_generator.rb +15 -0
  292. data/lib/rails/generators/test_unit/plugin/templates/%file_name%_test.rb.tt +7 -0
  293. data/lib/rails/generators/test_unit/plugin/templates/test_helper.rb +2 -0
  294. data/lib/rails/generators/test_unit/scaffold/scaffold_generator.rb +82 -0
  295. data/lib/rails/generators/test_unit/scaffold/templates/api_functional_test.rb.tt +44 -0
  296. data/lib/rails/generators/test_unit/scaffold/templates/functional_test.rb.tt +54 -0
  297. data/lib/rails/generators/test_unit/scaffold/templates/system_test.rb.tt +57 -0
  298. data/lib/rails/generators/test_unit/system/system_generator.rb +24 -0
  299. data/lib/rails/generators/test_unit/system/templates/application_system_test_case.rb.tt +5 -0
  300. data/lib/rails/generators/test_unit/system/templates/system_test.rb.tt +9 -0
  301. data/lib/rails/generators/test_unit.rb +10 -0
  302. data/lib/rails/generators/testing/assertions.rb +147 -0
  303. data/lib/rails/generators/testing/behavior.rb +116 -0
  304. data/lib/rails/generators/testing/setup_and_teardown.rb +20 -0
  305. data/lib/rails/generators.rb +327 -0
  306. data/lib/rails/health_controller.rb +55 -0
  307. data/lib/rails/info.rb +105 -0
  308. data/lib/rails/info_controller.rb +71 -0
  309. data/lib/rails/initializable.rb +95 -0
  310. data/lib/rails/mailers_controller.rb +122 -0
  311. data/lib/rails/paths.rb +246 -0
  312. data/lib/rails/plugin/test.rb +9 -0
  313. data/lib/rails/pwa_controller.rb +15 -0
  314. data/lib/rails/rack/logger.rb +88 -0
  315. data/lib/rails/rack/silence_request.rb +33 -0
  316. data/lib/rails/rack.rb +8 -0
  317. data/lib/rails/rackup/server.rb +15 -0
  318. data/lib/rails/railtie/configurable.rb +36 -0
  319. data/lib/rails/railtie/configuration.rb +114 -0
  320. data/lib/rails/railtie.rb +302 -0
  321. data/lib/rails/source_annotation_extractor.rb +214 -0
  322. data/lib/rails/tasks/engine.rake +85 -0
  323. data/lib/rails/tasks/framework.rake +34 -0
  324. data/lib/rails/tasks/log.rake +41 -0
  325. data/lib/rails/tasks/misc.rake +68 -0
  326. data/lib/rails/tasks/statistics.rake +23 -0
  327. data/lib/rails/tasks/tmp.rake +51 -0
  328. data/lib/rails/tasks/yarn.rake +29 -0
  329. data/lib/rails/tasks/zeitwerk.rake +41 -0
  330. data/lib/rails/tasks.rb +17 -0
  331. data/lib/rails/templates/layouts/application.html.erb +51 -0
  332. data/lib/rails/templates/rails/info/notes.html.erb +65 -0
  333. data/lib/rails/templates/rails/info/properties.html.erb +1 -0
  334. data/lib/rails/templates/rails/info/routes.html.erb +9 -0
  335. data/lib/rails/templates/rails/mailers/email.html.erb +201 -0
  336. data/lib/rails/templates/rails/mailers/index.html.erb +15 -0
  337. data/lib/rails/templates/rails/mailers/mailer.html.erb +12 -0
  338. data/lib/rails/templates/rails/welcome/index.html.erb +93 -0
  339. data/lib/rails/test_help.rb +47 -0
  340. data/lib/rails/test_unit/line_filtering.rb +13 -0
  341. data/lib/rails/test_unit/railtie.rb +25 -0
  342. data/lib/rails/test_unit/reporter.rb +121 -0
  343. data/lib/rails/test_unit/runner.rb +209 -0
  344. data/lib/rails/test_unit/test_parser.rb +133 -0
  345. data/lib/rails/test_unit/testing.rake +39 -0
  346. data/lib/rails/testing/maintain_test_schema.rb +16 -0
  347. data/lib/rails/version.rb +10 -0
  348. data/lib/rails/welcome_controller.rb +11 -0
  349. data/lib/rails/zeitwerk_checker.rb +15 -0
  350. data/lib/rails.rb +130 -0
  351. metadata +518 -0
@@ -0,0 +1,760 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "rails/railtie"
4
+ require "rails/engine/railties"
5
+ require "active_support/callbacks"
6
+ require "active_support/core_ext/module/delegation"
7
+ require "active_support/core_ext/object/try"
8
+ require "pathname"
9
+
10
+ module Rails
11
+ # +Rails::Engine+ allows you to wrap a specific \Rails application or subset of
12
+ # functionality and share it with other applications or within a larger packaged application.
13
+ # Every Rails::Application is just an engine, which allows for simple
14
+ # feature and application sharing.
15
+ #
16
+ # Any +Rails::Engine+ is also a Rails::Railtie, so the same
17
+ # methods (like {rake_tasks}[rdoc-ref:Rails::Railtie::rake_tasks] and
18
+ # {generators}[rdoc-ref:Rails::Railtie::generators]) and configuration
19
+ # options that are available in railties can also be used in engines.
20
+ #
21
+ # == Creating an Engine
22
+ #
23
+ # If you want a gem to behave as an engine, you have to specify an +Engine+
24
+ # for it somewhere inside your plugin's +lib+ folder (similar to how we
25
+ # specify a +Railtie+):
26
+ #
27
+ # # lib/my_engine.rb
28
+ # module MyEngine
29
+ # class Engine < Rails::Engine
30
+ # end
31
+ # end
32
+ #
33
+ # Then ensure that this file is loaded at the top of your <tt>config/application.rb</tt>
34
+ # (or in your +Gemfile+), and it will automatically load models, controllers, and helpers
35
+ # inside +app+, load routes at <tt>config/routes.rb</tt>, load locales at
36
+ # <tt>config/locales/**/*</tt>, and load tasks at <tt>lib/tasks/**/*</tt>.
37
+ #
38
+ # == Configuration
39
+ #
40
+ # Like railties, engines can access a config object which contains configuration shared by
41
+ # all railties and the application.
42
+ # Additionally, each engine can access <tt>autoload_paths</tt>, <tt>eager_load_paths</tt> and
43
+ # <tt>autoload_once_paths</tt> settings which are scoped to that engine.
44
+ #
45
+ # class MyEngine < Rails::Engine
46
+ # # Add a load path for this specific Engine
47
+ # config.autoload_paths << File.expand_path("lib/some/path", __dir__)
48
+ #
49
+ # initializer "my_engine.add_middleware" do |app|
50
+ # app.middleware.use MyEngine::Middleware
51
+ # end
52
+ # end
53
+ #
54
+ # == Generators
55
+ #
56
+ # You can set up generators for engines with <tt>config.generators</tt> method:
57
+ #
58
+ # class MyEngine < Rails::Engine
59
+ # config.generators do |g|
60
+ # g.orm :active_record
61
+ # g.template_engine :erb
62
+ # g.test_framework :test_unit
63
+ # end
64
+ # end
65
+ #
66
+ # You can also set generators for an application by using <tt>config.app_generators</tt>:
67
+ #
68
+ # class MyEngine < Rails::Engine
69
+ # # note that you can also pass block to app_generators in the same way you
70
+ # # can pass it to generators method
71
+ # config.app_generators.orm :datamapper
72
+ # end
73
+ #
74
+ # == Paths
75
+ #
76
+ # Applications and engines have flexible path configuration, meaning that you
77
+ # are not required to place your controllers at <tt>app/controllers</tt>, but
78
+ # in any place which you find convenient.
79
+ #
80
+ # For example, let's suppose you want to place your controllers in <tt>lib/controllers</tt>.
81
+ # You can set that as an option:
82
+ #
83
+ # class MyEngine < Rails::Engine
84
+ # paths["app/controllers"] = "lib/controllers"
85
+ # end
86
+ #
87
+ # You can also have your controllers loaded from both <tt>app/controllers</tt> and
88
+ # <tt>lib/controllers</tt>:
89
+ #
90
+ # class MyEngine < Rails::Engine
91
+ # paths["app/controllers"] << "lib/controllers"
92
+ # end
93
+ #
94
+ # The available paths in an engine are:
95
+ #
96
+ # class MyEngine < Rails::Engine
97
+ # paths["app"] # => ["app"]
98
+ # paths["app/controllers"] # => ["app/controllers"]
99
+ # paths["app/helpers"] # => ["app/helpers"]
100
+ # paths["app/models"] # => ["app/models"]
101
+ # paths["app/views"] # => ["app/views"]
102
+ # paths["lib"] # => ["lib"]
103
+ # paths["lib/tasks"] # => ["lib/tasks"]
104
+ # paths["config"] # => ["config"]
105
+ # paths["config/initializers"] # => ["config/initializers"]
106
+ # paths["config/locales"] # => ["config/locales"]
107
+ # paths["config/routes.rb"] # => ["config/routes.rb"]
108
+ # end
109
+ #
110
+ # The <tt>Application</tt> class adds a couple more paths to this set. And as in your
111
+ # <tt>Application</tt>, all folders under +app+ are automatically added to the load path.
112
+ # If you have an <tt>app/services</tt> folder for example, it will be added by default.
113
+ #
114
+ # == Endpoint
115
+ #
116
+ # An engine can also be a Rack application. It can be useful if you have a Rack application that
117
+ # you would like to provide with some of the +Engine+'s features.
118
+ #
119
+ # To do that, use the ::endpoint method:
120
+ #
121
+ # module MyEngine
122
+ # class Engine < Rails::Engine
123
+ # endpoint MyRackApplication
124
+ # end
125
+ # end
126
+ #
127
+ # Now you can mount your engine in application's routes:
128
+ #
129
+ # Rails.application.routes.draw do
130
+ # mount MyEngine::Engine => "/engine"
131
+ # end
132
+ #
133
+ # == Middleware stack
134
+ #
135
+ # As an engine can now be a Rack endpoint, it can also have a middleware
136
+ # stack. The usage is exactly the same as in <tt>Application</tt>:
137
+ #
138
+ # module MyEngine
139
+ # class Engine < Rails::Engine
140
+ # middleware.use SomeMiddleware
141
+ # end
142
+ # end
143
+ #
144
+ # == Routes
145
+ #
146
+ # If you don't specify an endpoint, routes will be used as the default
147
+ # endpoint. You can use them just like you use an application's routes:
148
+ #
149
+ # # ENGINE/config/routes.rb
150
+ # MyEngine::Engine.routes.draw do
151
+ # get "/" => "posts#index"
152
+ # end
153
+ #
154
+ # == Mount priority
155
+ #
156
+ # Note that now there can be more than one router in your application, and it's better to avoid
157
+ # passing requests through many routers. Consider this situation:
158
+ #
159
+ # Rails.application.routes.draw do
160
+ # mount MyEngine::Engine => "/blog"
161
+ # get "/blog/omg" => "main#omg"
162
+ # end
163
+ #
164
+ # +MyEngine+ is mounted at <tt>/blog</tt>, and <tt>/blog/omg</tt> points to application's
165
+ # controller. In such a situation, requests to <tt>/blog/omg</tt> will go through +MyEngine+,
166
+ # and if there is no such route in +Engine+'s routes, it will be dispatched to <tt>main#omg</tt>.
167
+ # It's much better to swap that:
168
+ #
169
+ # Rails.application.routes.draw do
170
+ # get "/blog/omg" => "main#omg"
171
+ # mount MyEngine::Engine => "/blog"
172
+ # end
173
+ #
174
+ # Now, +Engine+ will get only requests that were not handled by +Application+.
175
+ #
176
+ # == Engine name
177
+ #
178
+ # There are some places where an Engine's name is used:
179
+ #
180
+ # * routes: when you mount an Engine with <tt>mount(MyEngine::Engine => '/my_engine')</tt>,
181
+ # it's used as default <tt>:as</tt> option
182
+ # * rake task for installing migrations <tt>my_engine:install:migrations</tt>
183
+ #
184
+ # Engine name is set by default based on class name. For +MyEngine::Engine+ it will be
185
+ # <tt>my_engine_engine</tt>. You can change it manually using the <tt>engine_name</tt> method:
186
+ #
187
+ # module MyEngine
188
+ # class Engine < Rails::Engine
189
+ # engine_name "my_engine"
190
+ # end
191
+ # end
192
+ #
193
+ # == Isolated Engine
194
+ #
195
+ # Normally when you create controllers, helpers, and models inside an engine, they are treated
196
+ # as if they were created inside the application itself. This means that all helpers and
197
+ # named routes from the application will be available to your engine's controllers as well.
198
+ #
199
+ # However, sometimes you want to isolate your engine from the application, especially if your engine
200
+ # has its own router. To do that, you simply need to call ::isolate_namespace. This method requires
201
+ # you to pass a module where all your controllers, helpers, and models should be nested to:
202
+ #
203
+ # module MyEngine
204
+ # class Engine < Rails::Engine
205
+ # isolate_namespace MyEngine
206
+ # end
207
+ # end
208
+ #
209
+ # With such an engine, everything that is inside the +MyEngine+ module will be isolated from
210
+ # the application.
211
+ #
212
+ # Consider this controller:
213
+ #
214
+ # module MyEngine
215
+ # class FooController < ActionController::Base
216
+ # end
217
+ # end
218
+ #
219
+ # If the +MyEngine+ engine is marked as isolated, +FooController+ only has
220
+ # access to helpers from +MyEngine+, and <tt>url_helpers</tt> from
221
+ # <tt>MyEngine::Engine.routes</tt>.
222
+ #
223
+ # The next thing that changes in isolated engines is the behavior of routes.
224
+ # Normally, when you namespace your controllers, you also need to namespace
225
+ # the related routes. With an isolated engine, the engine's namespace is
226
+ # automatically applied, so you don't need to specify it explicitly in your
227
+ # routes:
228
+ #
229
+ # MyEngine::Engine.routes.draw do
230
+ # resources :articles
231
+ # end
232
+ #
233
+ # If +MyEngine+ is isolated, the routes above will point to
234
+ # +MyEngine::ArticlesController+. You also don't need to use longer
235
+ # URL helpers like +my_engine_articles_path+. Instead, you should simply use
236
+ # +articles_path+, like you would do with your main application.
237
+ #
238
+ # To make this behavior consistent with other parts of the framework,
239
+ # isolated engines also have an effect on ActiveModel::Naming. In a
240
+ # normal \Rails app, when you use a namespaced model such as
241
+ # +Namespace::Article+, ActiveModel::Naming will generate
242
+ # names with the prefix "namespace". In an isolated engine, the prefix will
243
+ # be omitted in URL helpers and form fields, for convenience.
244
+ #
245
+ # polymorphic_url(MyEngine::Article.new)
246
+ # # => "articles_path" # not "my_engine_articles_path"
247
+ #
248
+ # form_for(MyEngine::Article.new) do
249
+ # text_field :title # => <input type="text" name="article[title]" id="article_title" />
250
+ # end
251
+ #
252
+ # Additionally, an isolated engine will set its own name according to its
253
+ # namespace, so <tt>MyEngine::Engine.engine_name</tt> will return
254
+ # "my_engine". It will also set +MyEngine.table_name_prefix+ to "my_engine_",
255
+ # meaning for example that +MyEngine::Article+ will use the
256
+ # +my_engine_articles+ database table by default.
257
+ #
258
+ # == Using Engine's routes outside Engine
259
+ #
260
+ # Since you can now mount an engine inside application's routes, you do not have direct access to +Engine+'s
261
+ # <tt>url_helpers</tt> inside +Application+. When you mount an engine in an application's routes, a special helper is
262
+ # created to allow you to do that. Consider such a scenario:
263
+ #
264
+ # # config/routes.rb
265
+ # Rails.application.routes.draw do
266
+ # mount MyEngine::Engine => "/my_engine", as: "my_engine"
267
+ # get "/foo" => "foo#index"
268
+ # end
269
+ #
270
+ # Now, you can use the <tt>my_engine</tt> helper inside your application:
271
+ #
272
+ # class FooController < ApplicationController
273
+ # def index
274
+ # my_engine.root_url # => /my_engine/
275
+ # end
276
+ # end
277
+ #
278
+ # There is also a <tt>main_app</tt> helper that gives you access to application's routes inside Engine:
279
+ #
280
+ # module MyEngine
281
+ # class BarController
282
+ # def index
283
+ # main_app.foo_path # => /foo
284
+ # end
285
+ # end
286
+ # end
287
+ #
288
+ # Note that the <tt>:as</tt> option given to mount takes the <tt>engine_name</tt> as default, so most of the time
289
+ # you can simply omit it.
290
+ #
291
+ # Finally, if you want to generate a URL to an engine's route using
292
+ # <tt>polymorphic_url</tt>, you also need to pass the engine helper. Let's
293
+ # say that you want to create a form pointing to one of the engine's routes.
294
+ # All you need to do is pass the helper as the first element in array with
295
+ # attributes for URL:
296
+ #
297
+ # form_for([my_engine, @user])
298
+ #
299
+ # This code will use <tt>my_engine.user_path(@user)</tt> to generate the proper route.
300
+ #
301
+ # == Isolated engine's helpers
302
+ #
303
+ # Sometimes you may want to isolate an engine, but use helpers that are defined for it.
304
+ # If you want to share just a few specific helpers you can add them to application's
305
+ # helpers in ApplicationController:
306
+ #
307
+ # class ApplicationController < ActionController::Base
308
+ # helper MyEngine::SharedEngineHelper
309
+ # end
310
+ #
311
+ # If you want to include all of the engine's helpers, you can use the #helper method on an engine's
312
+ # instance:
313
+ #
314
+ # class ApplicationController < ActionController::Base
315
+ # helper MyEngine::Engine.helpers
316
+ # end
317
+ #
318
+ # It will include all of the helpers from engine's directory. Take into account this does
319
+ # not include helpers defined in controllers with helper_method or other similar solutions,
320
+ # only helpers defined in the helpers directory will be included.
321
+ #
322
+ # == Migrations & seed data
323
+ #
324
+ # Engines can have their own migrations. The default path for migrations is exactly the same
325
+ # as in application: <tt>db/migrate</tt>
326
+ #
327
+ # To use engine's migrations in application you can use the rake task below, which copies them to
328
+ # application's dir:
329
+ #
330
+ # $ rake ENGINE_NAME:install:migrations
331
+ #
332
+ # Note that some of the migrations may be skipped if a migration with the same name already exists
333
+ # in application. In such a situation you must decide whether to leave that migration or rename the
334
+ # migration in the application and rerun copying migrations.
335
+ #
336
+ # If your engine has migrations, you may also want to prepare data for the database in
337
+ # the <tt>db/seeds.rb</tt> file. You can load that data using the <tt>load_seed</tt> method, e.g.
338
+ #
339
+ # MyEngine::Engine.load_seed
340
+ #
341
+ # == Loading priority
342
+ #
343
+ # In order to change engine's priority you can use +config.railties_order+ in the main application.
344
+ # It will affect the priority of loading views, helpers, assets, and all the other files
345
+ # related to engine or application.
346
+ #
347
+ # # load Blog::Engine with highest priority, followed by application and other railties
348
+ # config.railties_order = [Blog::Engine, :main_app, :all]
349
+ class Engine < Railtie
350
+ autoload :Configuration, "rails/engine/configuration"
351
+ autoload :LazyRouteSet, "rails/engine/lazy_route_set"
352
+
353
+ class << self
354
+ attr_accessor :called_from, :isolated
355
+
356
+ alias :isolated? :isolated
357
+ alias :engine_name :railtie_name
358
+
359
+ delegate :eager_load!, to: :instance
360
+
361
+ def inherited(base)
362
+ unless base.abstract_railtie?
363
+ Rails::Railtie::Configuration.eager_load_namespaces << base
364
+
365
+ base.called_from = begin
366
+ call_stack = caller_locations.map { |l| l.absolute_path || l.path }
367
+
368
+ File.dirname(call_stack.detect { |p| !p.match?(%r[railties[\w.-]*/lib/rails|rack[\w.-]*/lib/rack]) })
369
+ end
370
+ end
371
+
372
+ super
373
+ end
374
+
375
+ def find_root(from)
376
+ find_root_with_flag "lib", from
377
+ end
378
+
379
+ def endpoint(endpoint = nil)
380
+ @endpoint ||= nil
381
+ @endpoint = endpoint if endpoint
382
+ @endpoint
383
+ end
384
+
385
+ def isolate_namespace(mod)
386
+ engine_name(generate_railtie_name(mod.name))
387
+
388
+ config.default_scope = { module: ActiveSupport::Inflector.underscore(mod.name) }
389
+
390
+ self.isolated = true
391
+
392
+ unless mod.respond_to?(:railtie_namespace)
393
+ name, railtie = engine_name, self
394
+
395
+ mod.singleton_class.instance_eval do
396
+ define_method(:railtie_namespace) { railtie }
397
+
398
+ unless mod.respond_to?(:table_name_prefix)
399
+ define_method(:table_name_prefix) { "#{name}_" }
400
+
401
+ ActiveSupport.on_load(:active_record) do
402
+ mod.singleton_class.redefine_method(:table_name_prefix) do
403
+ "#{ActiveRecord::Base.table_name_prefix}#{name}_"
404
+ end
405
+ end
406
+ end
407
+
408
+ unless mod.respond_to?(:use_relative_model_naming?)
409
+ class_eval "def use_relative_model_naming?; true; end", __FILE__, __LINE__
410
+ end
411
+
412
+ unless mod.respond_to?(:railtie_helpers_paths)
413
+ define_method(:railtie_helpers_paths) { railtie.helpers_paths }
414
+ end
415
+
416
+ unless mod.respond_to?(:railtie_routes_url_helpers)
417
+ define_method(:railtie_routes_url_helpers) { |include_path_helpers = true| railtie.routes.url_helpers(include_path_helpers) }
418
+ end
419
+ end
420
+ end
421
+ end
422
+
423
+ # Finds engine with given path.
424
+ def find(path)
425
+ expanded_path = File.expand_path path
426
+ Rails::Engine.subclasses.each do |klass|
427
+ engine = klass.instance
428
+ return engine if File.expand_path(engine.root) == expanded_path
429
+ end
430
+ nil
431
+ end
432
+ end
433
+
434
+ include ActiveSupport::Callbacks
435
+ define_callbacks :load_seed
436
+
437
+ delegate :middleware, :root, :paths, to: :config
438
+ delegate :engine_name, :isolated?, to: :class
439
+
440
+ def initialize
441
+ @_all_autoload_paths = nil
442
+ @_all_load_paths = nil
443
+ @app = nil
444
+ @config = nil
445
+ @env_config = nil
446
+ @helpers = nil
447
+ @routes = nil
448
+ @app_build_lock = Mutex.new
449
+ super
450
+ end
451
+
452
+ # Load console and invoke the registered hooks.
453
+ # Check Rails::Railtie.console for more info.
454
+ def load_console(app = self)
455
+ require "rails/console/methods"
456
+ run_console_blocks(app)
457
+ self
458
+ end
459
+
460
+ # Load \Rails runner and invoke the registered hooks.
461
+ # Check Rails::Railtie.runner for more info.
462
+ def load_runner(app = self)
463
+ run_runner_blocks(app)
464
+ self
465
+ end
466
+
467
+ # Load Rake and railties tasks, and invoke the registered hooks.
468
+ # Check Rails::Railtie.rake_tasks for more info.
469
+ def load_tasks(app = self)
470
+ require "rake"
471
+ run_tasks_blocks(app)
472
+ self
473
+ end
474
+
475
+ # Load \Rails generators and invoke the registered hooks.
476
+ # Check Rails::Railtie.generators for more info.
477
+ def load_generators(app = self)
478
+ require "rails/generators"
479
+ run_generators_blocks(app)
480
+ Rails::Generators.configure!(app.config.generators)
481
+ self
482
+ end
483
+
484
+ # Invoke the server registered hooks.
485
+ # Check Rails::Railtie.server for more info.
486
+ def load_server(app = self)
487
+ run_server_blocks(app)
488
+ self
489
+ end
490
+
491
+ def eager_load!
492
+ # Already done by Zeitwerk::Loader.eager_load_all. By now, we leave the
493
+ # method as a no-op for backwards compatibility.
494
+ end
495
+
496
+ def railties
497
+ @railties ||= Railties.new
498
+ end
499
+
500
+ # Returns a module with all the helpers defined for the engine.
501
+ def helpers
502
+ @helpers ||= begin
503
+ helpers = Module.new
504
+ AbstractController::Helpers.helper_modules_from_paths(helpers_paths).each do |mod|
505
+ helpers.include(mod)
506
+ end
507
+ helpers
508
+ end
509
+ end
510
+
511
+ # Returns all registered helpers paths.
512
+ def helpers_paths
513
+ paths["app/helpers"].existent
514
+ end
515
+
516
+ # Returns the underlying Rack application for this engine.
517
+ def app
518
+ @app || @app_build_lock.synchronize {
519
+ @app ||= begin
520
+ stack = default_middleware_stack
521
+ config.middleware = build_middleware.merge_into(stack)
522
+ config.middleware.build(endpoint)
523
+ end
524
+ }
525
+ end
526
+
527
+ # Returns the endpoint for this engine. If none is registered,
528
+ # defaults to an ActionDispatch::Routing::RouteSet.
529
+ def endpoint
530
+ self.class.endpoint || routes
531
+ end
532
+
533
+ # Define the Rack API for this engine.
534
+ def call(env)
535
+ req = build_request env
536
+ app.call req.env
537
+ end
538
+
539
+ # Defines additional Rack env configuration that is added on each call.
540
+ def env_config
541
+ @env_config ||= {}
542
+ end
543
+
544
+ # Defines the routes for this engine. If a block is given to
545
+ # routes, it is appended to the engine.
546
+ def routes(&block)
547
+ @routes ||= config.route_set_class.new_with_config(config)
548
+ @routes.append(&block) if block_given?
549
+ @routes
550
+ end
551
+
552
+ # Define the configuration object for the engine.
553
+ def config
554
+ @config ||= Engine::Configuration.new(self.class.find_root(self.class.called_from))
555
+ end
556
+
557
+ # Load data from db/seeds.rb file. It can be used in to load engines'
558
+ # seeds, e.g.:
559
+ #
560
+ # Blog::Engine.load_seed
561
+ def load_seed
562
+ seed_file = paths["db/seeds.rb"].existent.first
563
+ run_callbacks(:load_seed) { load(seed_file) } if seed_file
564
+ end
565
+
566
+ initializer :load_environment_config, before: :load_environment_hook, group: :all do
567
+ paths["config/environments"].existent.each do |environment|
568
+ require environment
569
+ end
570
+ end
571
+
572
+ initializer :set_load_path, before: :bootstrap_hook do |app|
573
+ _all_load_paths(app.config.add_autoload_paths_to_load_path).reverse_each do |path|
574
+ $LOAD_PATH.unshift(path) if File.directory?(path)
575
+ end
576
+ $LOAD_PATH.uniq!
577
+ end
578
+
579
+ initializer :set_autoload_paths, before: :bootstrap_hook do
580
+ ActiveSupport::Dependencies.autoload_paths.unshift(*_all_autoload_paths)
581
+ ActiveSupport::Dependencies.autoload_once_paths.unshift(*_all_autoload_once_paths)
582
+
583
+ config.autoload_paths.freeze
584
+ config.autoload_once_paths.freeze
585
+ end
586
+
587
+ initializer :set_eager_load_paths, before: :bootstrap_hook do
588
+ ActiveSupport::Dependencies._eager_load_paths.merge(config.all_eager_load_paths)
589
+ config.eager_load_paths.freeze
590
+ end
591
+
592
+ initializer :make_routes_lazy, before: :bootstrap_hook do |app|
593
+ config.route_set_class = LazyRouteSet if Rails.env.local?
594
+ end
595
+
596
+ initializer :add_routing_paths do |app|
597
+ routing_paths = paths["config/routes.rb"].existent
598
+ external_paths = self.paths["config/routes"].paths
599
+ routes.draw_paths.concat(external_paths)
600
+ app.routes.draw_paths.concat(external_paths)
601
+
602
+ if routes? || routing_paths.any?
603
+ app.routes_reloader.paths.unshift(*routing_paths)
604
+ app.routes_reloader.route_sets << routes
605
+ app.routes_reloader.external_routes.unshift(*external_paths)
606
+ end
607
+ end
608
+
609
+ # I18n load paths are a special case since the ones added
610
+ # later have higher priority.
611
+ initializer :add_locales do
612
+ config.i18n.railties_load_path << paths["config/locales"]
613
+ end
614
+
615
+ initializer :add_view_paths do
616
+ views = paths["app/views"].existent
617
+ unless views.empty?
618
+ ActiveSupport.on_load(:action_controller) { prepend_view_path(views) if respond_to?(:prepend_view_path) }
619
+ ActiveSupport.on_load(:action_mailer) { prepend_view_path(views) }
620
+ end
621
+ end
622
+
623
+ initializer :add_mailer_preview_paths do
624
+ previews = paths["test/mailers/previews"].existent
625
+ unless previews.empty?
626
+ ActiveSupport.on_load(:action_mailer) { self.preview_paths |= previews }
627
+ end
628
+ end
629
+
630
+ initializer :add_fixture_paths do
631
+ next if is_a?(Rails::Application)
632
+
633
+ fixtures = config.root.join("test", "fixtures")
634
+ if fixtures_in_root_and_not_in_vendor_or_dot_dir?(fixtures)
635
+ ActiveSupport.on_load(:active_record_fixtures) { self.fixture_paths |= ["#{fixtures}/"] }
636
+ end
637
+ end
638
+
639
+ initializer :prepend_helpers_path do |app|
640
+ if !isolated? || (app == self)
641
+ app.config.helpers_paths.unshift(*paths["app/helpers"].existent)
642
+ end
643
+ end
644
+
645
+ initializer :load_config_initializers do
646
+ config.paths["config/initializers"].existent.sort.each do |initializer|
647
+ load_config_initializer(initializer)
648
+ end
649
+ end
650
+
651
+ initializer :wrap_reloader_around_load_seed do |app|
652
+ self.class.set_callback(:load_seed, :around) do |engine, seeds_block|
653
+ app.reloader.wrap(&seeds_block)
654
+ end
655
+ end
656
+
657
+ initializer :engines_blank_point do
658
+ # We need this initializer so all extra initializers added in engines are
659
+ # consistently executed after all the initializers above across all engines.
660
+ end
661
+
662
+ rake_tasks do
663
+ next if is_a?(Rails::Application)
664
+ next unless has_migrations?
665
+
666
+ namespace railtie_name do
667
+ namespace :install do
668
+ desc "Copy migrations from #{railtie_name} to application"
669
+ task :migrations do
670
+ ENV["FROM"] = railtie_name
671
+ if Rake::Task.task_defined?("railties:install:migrations")
672
+ Rake::Task["railties:install:migrations"].invoke
673
+ else
674
+ Rake::Task["app:railties:install:migrations"].invoke
675
+ end
676
+ end
677
+ end
678
+ end
679
+ end
680
+
681
+ def routes? # :nodoc:
682
+ @routes
683
+ end
684
+
685
+ protected
686
+ def run_tasks_blocks(*) # :nodoc:
687
+ super
688
+ paths["lib/tasks"].existent.sort.each { |ext| load(ext) }
689
+ end
690
+
691
+ private
692
+ def load_config_initializer(initializer) # :doc:
693
+ ActiveSupport::Notifications.instrument("load_config_initializer.railties", initializer: initializer) do
694
+ load(initializer)
695
+ end
696
+ end
697
+
698
+ def has_migrations?
699
+ paths["db/migrate"].existent.any?
700
+ end
701
+
702
+ def self.find_root_with_flag(flag, root_path, default = nil) # :nodoc:
703
+ while root_path && File.directory?(root_path) && !File.exist?("#{root_path}/#{flag}")
704
+ parent = File.dirname(root_path)
705
+ root_path = parent != root_path && parent
706
+ end
707
+
708
+ root = File.exist?("#{root_path}/#{flag}") ? root_path : default
709
+ raise "Could not find root path for #{self}" unless root
710
+
711
+ Pathname.new File.realpath root
712
+ end
713
+
714
+ def default_middleware_stack
715
+ ActionDispatch::MiddlewareStack.new
716
+ end
717
+
718
+ def _all_autoload_once_paths
719
+ config.all_autoload_once_paths.uniq
720
+ end
721
+
722
+ def _all_autoload_paths
723
+ @_all_autoload_paths ||= begin
724
+ autoload_paths = config.all_autoload_paths
725
+ autoload_paths += config.all_eager_load_paths
726
+ autoload_paths -= config.all_autoload_once_paths
727
+ autoload_paths.uniq
728
+ end
729
+ end
730
+
731
+ def _all_load_paths(add_autoload_paths_to_load_path)
732
+ @_all_load_paths ||= begin
733
+ load_paths = config.paths.load_paths
734
+ if add_autoload_paths_to_load_path
735
+ load_paths += _all_autoload_paths
736
+ load_paths += _all_autoload_once_paths
737
+ end
738
+ load_paths.uniq
739
+ end
740
+ end
741
+
742
+ def fixtures_in_root_and_not_in_vendor_or_dot_dir?(fixtures)
743
+ fixtures.exist? && fixtures.to_s.start_with?(Rails.root.to_s) &&
744
+ !fixtures.to_s.start_with?(Rails.root.join("vendor").to_s) &&
745
+ !fixtures.to_s.start_with?("#{Rails.root}/.".to_s)
746
+ end
747
+
748
+ def build_request(env)
749
+ env.merge!(env_config)
750
+ req = ActionDispatch::Request.new env
751
+ req.routes = routes
752
+ req.engine_script_name = req.script_name
753
+ req
754
+ end
755
+
756
+ def build_middleware
757
+ config.middleware
758
+ end
759
+ end
760
+ end