railties 7.2.1 → 8.0.0.beta1
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.
- checksums.yaml +4 -4
 - data/CHANGELOG.md +111 -287
 - data/lib/minitest/rails_plugin.rb +1 -1
 - data/lib/rails/application/configuration.rb +15 -2
 - data/lib/rails/application/default_middleware_stack.rb +4 -0
 - data/lib/rails/application/finisher.rb +2 -2
 - data/lib/rails/application/routes_reloader.rb +11 -1
 - data/lib/rails/application.rb +5 -0
 - data/lib/rails/code_statistics.rb +128 -86
 - data/lib/rails/code_statistics_calculator.rb +78 -76
 - data/lib/rails/command/helpers/editor.rb +1 -1
 - data/lib/rails/commands/app/update_command.rb +1 -9
 - data/lib/rails/commands/credentials/USAGE +4 -4
 - data/lib/rails/commands/credentials/credentials_command.rb +5 -1
 - data/lib/rails/commands/dev/dev_command.rb +1 -1
 - data/lib/rails/commands/devcontainer/devcontainer_command.rb +1 -1
 - data/lib/rails/commands/stats/stats_command.rb +19 -0
 - data/lib/rails/dev_caching.rb +2 -2
 - data/lib/rails/engine/configuration.rb +3 -1
 - data/lib/rails/engine/lazy_route_set.rb +109 -0
 - data/lib/rails/engine.rb +10 -5
 - data/lib/rails/gem_version.rb +4 -4
 - data/lib/rails/generators/app_base.rb +46 -24
 - data/lib/rails/generators/database.rb +101 -67
 - data/lib/rails/generators/erb/authentication/authentication_generator.rb +15 -0
 - data/lib/rails/generators/erb/authentication/templates/views/passwords/edit.html.erb +9 -0
 - data/lib/rails/generators/erb/authentication/templates/views/passwords/new.html.erb +8 -0
 - data/lib/rails/generators/erb/authentication/templates/views/sessions/new.html.erb +11 -0
 - data/lib/rails/generators/generated_attribute.rb +16 -11
 - data/lib/rails/generators/rails/app/app_generator.rb +19 -32
 - data/lib/rails/generators/rails/app/templates/Dockerfile.tt +12 -3
 - data/lib/rails/generators/rails/app/templates/Gemfile.tt +23 -8
 - data/lib/rails/generators/rails/app/templates/app/assets/stylesheets/application.css.tt +6 -11
 - data/lib/rails/generators/rails/app/templates/app/views/layouts/application.html.erb.tt +10 -3
 - data/lib/rails/generators/rails/app/templates/bin/dev.tt +1 -0
 - data/lib/rails/generators/rails/app/templates/bin/setup.tt +5 -7
 - data/lib/rails/generators/rails/app/templates/bin/thrust.tt +4 -0
 - data/lib/rails/generators/rails/app/templates/config/databases/mysql.yml.tt +23 -0
 - data/lib/rails/generators/rails/app/templates/config/databases/postgresql.yml.tt +23 -0
 - data/lib/rails/generators/rails/app/templates/config/databases/sqlite3.yml.tt +40 -0
 - data/lib/rails/generators/rails/app/templates/config/databases/trilogy.yml.tt +23 -0
 - data/lib/rails/generators/rails/app/templates/config/deploy.yml.tt +124 -0
 - data/lib/rails/generators/rails/app/templates/config/environments/development.rb.tt +12 -23
 - data/lib/rails/generators/rails/app/templates/config/environments/production.rb.tt +34 -51
 - data/lib/rails/generators/rails/app/templates/config/environments/test.rb.tt +5 -19
 - data/lib/rails/generators/rails/app/templates/config/initializers/assets.rb.tt +0 -7
 - data/lib/rails/generators/rails/app/templates/config/initializers/filter_parameter_logging.rb.tt +1 -1
 - data/lib/rails/generators/rails/app/templates/config/initializers/new_framework_defaults_8_0.rb.tt +25 -0
 - data/lib/rails/generators/rails/app/templates/config/puma.rb.tt +11 -2
 - data/lib/rails/generators/rails/app/templates/config/routes.rb.tt +3 -3
 - data/lib/rails/generators/rails/app/templates/docker-entrypoint.tt +4 -3
 - data/lib/rails/generators/rails/app/templates/dockerignore.tt +1 -2
 - data/lib/rails/generators/rails/app/templates/github/ci.yml.tt +1 -1
 - data/lib/rails/generators/rails/app/templates/gitignore.tt +1 -2
 - data/lib/rails/generators/rails/app/templates/kamal-secrets.tt +17 -0
 - data/lib/rails/generators/rails/app/templates/public/400.html +114 -0
 - data/lib/rails/generators/rails/app/templates/public/404.html +113 -66
 - data/lib/rails/generators/rails/app/templates/public/406-unsupported-browser.html +113 -65
 - data/lib/rails/generators/rails/app/templates/public/422.html +113 -66
 - data/lib/rails/generators/rails/app/templates/public/500.html +113 -65
 - data/lib/rails/generators/rails/app/templates/public/icon.png +0 -0
 - data/lib/rails/generators/rails/app/templates/public/icon.svg +2 -2
 - data/lib/rails/generators/rails/authentication/USAGE +6 -0
 - data/lib/rails/generators/rails/authentication/authentication_generator.rb +54 -0
 - data/lib/rails/generators/rails/authentication/templates/controllers/concerns/authentication.rb +55 -0
 - data/lib/rails/generators/rails/authentication/templates/controllers/passwords_controller.rb +33 -0
 - data/lib/rails/generators/rails/authentication/templates/controllers/sessions_controller.rb +21 -0
 - data/lib/rails/generators/rails/authentication/templates/mailers/passwords_mailer.rb +6 -0
 - data/lib/rails/generators/rails/authentication/templates/models/current.rb +4 -0
 - data/lib/rails/generators/rails/authentication/templates/models/session.rb +3 -0
 - data/lib/rails/generators/rails/authentication/templates/models/user.rb +6 -0
 - data/lib/rails/generators/rails/authentication/templates/test/mailers/previews/passwords_mailer_preview.rb +7 -0
 - data/lib/rails/generators/rails/authentication/templates/views/passwords_mailer/reset.html.erb +4 -0
 - data/lib/rails/generators/rails/authentication/templates/views/passwords_mailer/reset.text.erb +2 -0
 - data/lib/rails/generators/rails/credentials/templates/credentials.yml.tt +4 -0
 - data/lib/rails/generators/rails/db/system/change/change_generator.rb +1 -1
 - data/lib/rails/generators/rails/devcontainer/devcontainer_generator.rb +5 -3
 - data/lib/rails/generators/rails/devcontainer/templates/devcontainer/devcontainer.json.tt +1 -1
 - data/lib/rails/generators/rails/plugin/plugin_generator.rb +11 -11
 - data/lib/rails/generators/rails/plugin/templates/github/ci.yml.tt +1 -1
 - data/lib/rails/generators/rails/plugin/templates/test/test_helper.rb.tt +2 -2
 - data/lib/rails/generators/rails/scaffold_controller/templates/api_controller.rb.tt +2 -2
 - data/lib/rails/generators/rails/scaffold_controller/templates/controller.rb.tt +3 -3
 - data/lib/rails/generators/rails/script/USAGE +18 -0
 - data/lib/rails/generators/rails/script/script_generator.rb +18 -0
 - data/lib/rails/generators/rails/script/templates/script.rb.tt +3 -0
 - data/lib/rails/generators.rb +7 -2
 - data/lib/rails/info_controller.rb +10 -2
 - data/lib/rails/rack/silence_request.rb +33 -0
 - data/lib/rails/rack.rb +1 -0
 - data/lib/rails/railtie.rb +13 -13
 - data/lib/rails/source_annotation_extractor.rb +31 -14
 - data/lib/rails/tasks/statistics.rake +13 -28
 - data/lib/rails/templates/rails/info/notes.html.erb +65 -0
 - metadata +45 -25
 - data/lib/rails/generators/rails/app/templates/app/assets/config/manifest.js.tt +0 -2
 - data/lib/rails/generators/rails/app/templates/app/channels/application_cable/channel.rb.tt +0 -4
 - data/lib/rails/generators/rails/app/templates/app/channels/application_cable/connection.rb.tt +0 -4
 - data/lib/rails/generators/rails/app/templates/config/initializers/new_framework_defaults_7_2.rb.tt +0 -70
 - data/lib/rails/generators/rails/app/templates/config/initializers/permissions_policy.rb.tt +0 -13
 - data/lib/rails/generators/rails/app/templates/test/channels/application_cable/connection_test.rb.tt +0 -13
 - data/lib/rails/generators/rails/plugin/templates/rails/dummy_manifest.js.tt +0 -10
 - data/lib/rails/generators/rails/plugin/templates/rails/engine_manifest.js.tt +0 -6
 - data/lib/rails/generators/rails/plugin/templates/rails/javascripts.js.tt +0 -17
 
| 
         @@ -0,0 +1,109 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            # frozen_string_literal: true
         
     | 
| 
      
 2 
     | 
    
         
            +
             
     | 
| 
      
 3 
     | 
    
         
            +
            # :markup: markdown
         
     | 
| 
      
 4 
     | 
    
         
            +
             
     | 
| 
      
 5 
     | 
    
         
            +
            require "action_dispatch/routing/route_set"
         
     | 
| 
      
 6 
     | 
    
         
            +
             
     | 
| 
      
 7 
     | 
    
         
            +
            module Rails
         
     | 
| 
      
 8 
     | 
    
         
            +
              class Engine
         
     | 
| 
      
 9 
     | 
    
         
            +
                class LazyRouteSet < ActionDispatch::Routing::RouteSet # :nodoc:
         
     | 
| 
      
 10 
     | 
    
         
            +
                  class NamedRouteCollection < ActionDispatch::Routing::RouteSet::NamedRouteCollection
         
     | 
| 
      
 11 
     | 
    
         
            +
                    def route_defined?(name)
         
     | 
| 
      
 12 
     | 
    
         
            +
                      Rails.application&.reload_routes_unless_loaded
         
     | 
| 
      
 13 
     | 
    
         
            +
                      super
         
     | 
| 
      
 14 
     | 
    
         
            +
                    end
         
     | 
| 
      
 15 
     | 
    
         
            +
                  end
         
     | 
| 
      
 16 
     | 
    
         
            +
             
     | 
| 
      
 17 
     | 
    
         
            +
                  module ProxyUrlHelpers
         
     | 
| 
      
 18 
     | 
    
         
            +
                    def url_for(options)
         
     | 
| 
      
 19 
     | 
    
         
            +
                      Rails.application&.reload_routes_unless_loaded
         
     | 
| 
      
 20 
     | 
    
         
            +
                      super
         
     | 
| 
      
 21 
     | 
    
         
            +
                    end
         
     | 
| 
      
 22 
     | 
    
         
            +
             
     | 
| 
      
 23 
     | 
    
         
            +
                    def full_url_for(options)
         
     | 
| 
      
 24 
     | 
    
         
            +
                      Rails.application&.reload_routes_unless_loaded
         
     | 
| 
      
 25 
     | 
    
         
            +
                      super
         
     | 
| 
      
 26 
     | 
    
         
            +
                    end
         
     | 
| 
      
 27 
     | 
    
         
            +
             
     | 
| 
      
 28 
     | 
    
         
            +
                    def route_for(name, *args)
         
     | 
| 
      
 29 
     | 
    
         
            +
                      Rails.application&.reload_routes_unless_loaded
         
     | 
| 
      
 30 
     | 
    
         
            +
                      super
         
     | 
| 
      
 31 
     | 
    
         
            +
                    end
         
     | 
| 
      
 32 
     | 
    
         
            +
             
     | 
| 
      
 33 
     | 
    
         
            +
                    def optimize_routes_generation?
         
     | 
| 
      
 34 
     | 
    
         
            +
                      Rails.application&.reload_routes_unless_loaded
         
     | 
| 
      
 35 
     | 
    
         
            +
                      super
         
     | 
| 
      
 36 
     | 
    
         
            +
                    end
         
     | 
| 
      
 37 
     | 
    
         
            +
             
     | 
| 
      
 38 
     | 
    
         
            +
                    def polymorphic_url(record_or_hash_or_array, options = {})
         
     | 
| 
      
 39 
     | 
    
         
            +
                      Rails.application&.reload_routes_unless_loaded
         
     | 
| 
      
 40 
     | 
    
         
            +
                      super
         
     | 
| 
      
 41 
     | 
    
         
            +
                    end
         
     | 
| 
      
 42 
     | 
    
         
            +
             
     | 
| 
      
 43 
     | 
    
         
            +
                    def polymorphic_path(record_or_hash_or_array, options = {})
         
     | 
| 
      
 44 
     | 
    
         
            +
                      Rails.application&.reload_routes_unless_loaded
         
     | 
| 
      
 45 
     | 
    
         
            +
                      super
         
     | 
| 
      
 46 
     | 
    
         
            +
                    end
         
     | 
| 
      
 47 
     | 
    
         
            +
                  end
         
     | 
| 
      
 48 
     | 
    
         
            +
             
     | 
| 
      
 49 
     | 
    
         
            +
                  def initialize(config = DEFAULT_CONFIG)
         
     | 
| 
      
 50 
     | 
    
         
            +
                    super
         
     | 
| 
      
 51 
     | 
    
         
            +
                    self.named_routes = NamedRouteCollection.new
         
     | 
| 
      
 52 
     | 
    
         
            +
                    named_routes.url_helpers_module.prepend(method_missing_module)
         
     | 
| 
      
 53 
     | 
    
         
            +
                    named_routes.path_helpers_module.prepend(method_missing_module)
         
     | 
| 
      
 54 
     | 
    
         
            +
                  end
         
     | 
| 
      
 55 
     | 
    
         
            +
             
     | 
| 
      
 56 
     | 
    
         
            +
                  def generate_extras(options, recall = {})
         
     | 
| 
      
 57 
     | 
    
         
            +
                    Rails.application&.reload_routes_unless_loaded
         
     | 
| 
      
 58 
     | 
    
         
            +
             
     | 
| 
      
 59 
     | 
    
         
            +
                    super(options, recall)
         
     | 
| 
      
 60 
     | 
    
         
            +
                  end
         
     | 
| 
      
 61 
     | 
    
         
            +
             
     | 
| 
      
 62 
     | 
    
         
            +
                  def generate_url_helpers(supports_path)
         
     | 
| 
      
 63 
     | 
    
         
            +
                    super.tap { |mod| mod.singleton_class.prepend(ProxyUrlHelpers) }
         
     | 
| 
      
 64 
     | 
    
         
            +
                  end
         
     | 
| 
      
 65 
     | 
    
         
            +
             
     | 
| 
      
 66 
     | 
    
         
            +
                  def call(req)
         
     | 
| 
      
 67 
     | 
    
         
            +
                    Rails.application&.reload_routes_unless_loaded
         
     | 
| 
      
 68 
     | 
    
         
            +
                    super
         
     | 
| 
      
 69 
     | 
    
         
            +
                  end
         
     | 
| 
      
 70 
     | 
    
         
            +
             
     | 
| 
      
 71 
     | 
    
         
            +
                  def draw(&block)
         
     | 
| 
      
 72 
     | 
    
         
            +
                    Rails.application&.reload_routes_unless_loaded
         
     | 
| 
      
 73 
     | 
    
         
            +
                    super
         
     | 
| 
      
 74 
     | 
    
         
            +
                  end
         
     | 
| 
      
 75 
     | 
    
         
            +
             
     | 
| 
      
 76 
     | 
    
         
            +
                  def recognize_path(path, environment = {})
         
     | 
| 
      
 77 
     | 
    
         
            +
                    Rails.application&.reload_routes_unless_loaded
         
     | 
| 
      
 78 
     | 
    
         
            +
                    super
         
     | 
| 
      
 79 
     | 
    
         
            +
                  end
         
     | 
| 
      
 80 
     | 
    
         
            +
             
     | 
| 
      
 81 
     | 
    
         
            +
                  def routes
         
     | 
| 
      
 82 
     | 
    
         
            +
                    Rails.application&.reload_routes_unless_loaded
         
     | 
| 
      
 83 
     | 
    
         
            +
                    super
         
     | 
| 
      
 84 
     | 
    
         
            +
                  end
         
     | 
| 
      
 85 
     | 
    
         
            +
             
     | 
| 
      
 86 
     | 
    
         
            +
                  private
         
     | 
| 
      
 87 
     | 
    
         
            +
                    def method_missing_module
         
     | 
| 
      
 88 
     | 
    
         
            +
                      @method_missing_module ||= Module.new do
         
     | 
| 
      
 89 
     | 
    
         
            +
                        private
         
     | 
| 
      
 90 
     | 
    
         
            +
                          def method_missing(method_name, *args, &block)
         
     | 
| 
      
 91 
     | 
    
         
            +
                            if Rails.application&.reload_routes_unless_loaded
         
     | 
| 
      
 92 
     | 
    
         
            +
                              public_send(method_name, *args, &block)
         
     | 
| 
      
 93 
     | 
    
         
            +
                            else
         
     | 
| 
      
 94 
     | 
    
         
            +
                              super(method_name, *args, &block)
         
     | 
| 
      
 95 
     | 
    
         
            +
                            end
         
     | 
| 
      
 96 
     | 
    
         
            +
                          end
         
     | 
| 
      
 97 
     | 
    
         
            +
             
     | 
| 
      
 98 
     | 
    
         
            +
                          def respond_to_missing?(method_name, *args)
         
     | 
| 
      
 99 
     | 
    
         
            +
                            if Rails.application&.reload_routes_unless_loaded
         
     | 
| 
      
 100 
     | 
    
         
            +
                              respond_to?(method_name, *args)
         
     | 
| 
      
 101 
     | 
    
         
            +
                            else
         
     | 
| 
      
 102 
     | 
    
         
            +
                              super(method_name, *args)
         
     | 
| 
      
 103 
     | 
    
         
            +
                            end
         
     | 
| 
      
 104 
     | 
    
         
            +
                          end
         
     | 
| 
      
 105 
     | 
    
         
            +
                      end
         
     | 
| 
      
 106 
     | 
    
         
            +
                    end
         
     | 
| 
      
 107 
     | 
    
         
            +
                end
         
     | 
| 
      
 108 
     | 
    
         
            +
              end
         
     | 
| 
      
 109 
     | 
    
         
            +
            end
         
     | 
    
        data/lib/rails/engine.rb
    CHANGED
    
    | 
         @@ -6,7 +6,6 @@ require "active_support/callbacks" 
     | 
|
| 
       6 
6 
     | 
    
         
             
            require "active_support/core_ext/module/delegation"
         
     | 
| 
       7 
7 
     | 
    
         
             
            require "active_support/core_ext/object/try"
         
     | 
| 
       8 
8 
     | 
    
         
             
            require "pathname"
         
     | 
| 
       9 
     | 
    
         
            -
            require "thread"
         
     | 
| 
       10 
9 
     | 
    
         | 
| 
       11 
10 
     | 
    
         
             
            module Rails
         
     | 
| 
       12 
11 
     | 
    
         
             
              # +Rails::Engine+ allows you to wrap a specific \Rails application or subset of
         
     | 
| 
         @@ -349,6 +348,7 @@ module Rails 
     | 
|
| 
       349 
348 
     | 
    
         
             
              #   config.railties_order = [Blog::Engine, :main_app, :all]
         
     | 
| 
       350 
349 
     | 
    
         
             
              class Engine < Railtie
         
     | 
| 
       351 
350 
     | 
    
         
             
                autoload :Configuration, "rails/engine/configuration"
         
     | 
| 
      
 351 
     | 
    
         
            +
                autoload :LazyRouteSet,  "rails/engine/lazy_route_set"
         
     | 
| 
       352 
352 
     | 
    
         | 
| 
       353 
353 
     | 
    
         
             
                class << self
         
     | 
| 
       354 
354 
     | 
    
         
             
                  attr_accessor :called_from, :isolated
         
     | 
| 
         @@ -385,7 +385,8 @@ module Rails 
     | 
|
| 
       385 
385 
     | 
    
         
             
                  def isolate_namespace(mod)
         
     | 
| 
       386 
386 
     | 
    
         
             
                    engine_name(generate_railtie_name(mod.name))
         
     | 
| 
       387 
387 
     | 
    
         | 
| 
       388 
     | 
    
         
            -
                     
     | 
| 
      
 388 
     | 
    
         
            +
                    config.default_scope = { module: ActiveSupport::Inflector.underscore(mod.name) }
         
     | 
| 
      
 389 
     | 
    
         
            +
             
     | 
| 
       389 
390 
     | 
    
         
             
                    self.isolated = true
         
     | 
| 
       390 
391 
     | 
    
         | 
| 
       391 
392 
     | 
    
         
             
                    unless mod.respond_to?(:railtie_namespace)
         
     | 
| 
         @@ -543,7 +544,7 @@ module Rails 
     | 
|
| 
       543 
544 
     | 
    
         
             
                # Defines the routes for this engine. If a block is given to
         
     | 
| 
       544 
545 
     | 
    
         
             
                # routes, it is appended to the engine.
         
     | 
| 
       545 
546 
     | 
    
         
             
                def routes(&block)
         
     | 
| 
       546 
     | 
    
         
            -
                  @routes ||=  
     | 
| 
      
 547 
     | 
    
         
            +
                  @routes ||= config.route_set_class.new_with_config(config)
         
     | 
| 
       547 
548 
     | 
    
         
             
                  @routes.append(&block) if block_given?
         
     | 
| 
       548 
549 
     | 
    
         
             
                  @routes
         
     | 
| 
       549 
550 
     | 
    
         
             
                end
         
     | 
| 
         @@ -588,6 +589,10 @@ module Rails 
     | 
|
| 
       588 
589 
     | 
    
         
             
                  config.eager_load_paths.freeze
         
     | 
| 
       589 
590 
     | 
    
         
             
                end
         
     | 
| 
       590 
591 
     | 
    
         | 
| 
      
 592 
     | 
    
         
            +
                initializer :make_routes_lazy, before: :bootstrap_hook do |app|
         
     | 
| 
      
 593 
     | 
    
         
            +
                  config.route_set_class = LazyRouteSet if Rails.env.local?
         
     | 
| 
      
 594 
     | 
    
         
            +
                end
         
     | 
| 
      
 595 
     | 
    
         
            +
             
     | 
| 
       591 
596 
     | 
    
         
             
                initializer :add_routing_paths do |app|
         
     | 
| 
       592 
597 
     | 
    
         
             
                  routing_paths = paths["config/routes.rb"].existent
         
     | 
| 
       593 
598 
     | 
    
         
             
                  external_paths = self.paths["config/routes"].paths
         
     | 
| 
         @@ -643,9 +648,9 @@ module Rails 
     | 
|
| 
       643 
648 
     | 
    
         
             
                  end
         
     | 
| 
       644 
649 
     | 
    
         
             
                end
         
     | 
| 
       645 
650 
     | 
    
         | 
| 
       646 
     | 
    
         
            -
                initializer : 
     | 
| 
      
 651 
     | 
    
         
            +
                initializer :wrap_reloader_around_load_seed do |app|
         
     | 
| 
       647 
652 
     | 
    
         
             
                  self.class.set_callback(:load_seed, :around) do |engine, seeds_block|
         
     | 
| 
       648 
     | 
    
         
            -
                    app. 
     | 
| 
      
 653 
     | 
    
         
            +
                    app.reloader.wrap(&seeds_block)
         
     | 
| 
       649 
654 
     | 
    
         
             
                  end
         
     | 
| 
       650 
655 
     | 
    
         
             
                end
         
     | 
| 
       651 
656 
     | 
    
         | 
    
        data/lib/rails/gem_version.rb
    CHANGED
    
    
| 
         @@ -19,7 +19,6 @@ module Rails 
     | 
|
| 
       19 
19 
     | 
    
         | 
| 
       20 
20 
     | 
    
         
             
                  JAVASCRIPT_OPTIONS = %w( importmap bun webpack esbuild rollup )
         
     | 
| 
       21 
21 
     | 
    
         
             
                  CSS_OPTIONS = %w( tailwind bootstrap bulma postcss sass )
         
     | 
| 
       22 
     | 
    
         
            -
                  ASSET_PIPELINE_OPTIONS = %w( none sprockets propshaft )
         
     | 
| 
       23 
22 
     | 
    
         | 
| 
       24 
23 
     | 
    
         
             
                  attr_accessor :rails_template
         
     | 
| 
       25 
24 
     | 
    
         
             
                  add_shebang_option!
         
     | 
| 
         @@ -74,10 +73,6 @@ module Rails 
     | 
|
| 
       74 
73 
     | 
    
         | 
| 
       75 
74 
     | 
    
         
             
                    class_option :skip_asset_pipeline, type: :boolean, aliases: "-A", default: nil
         
     | 
| 
       76 
75 
     | 
    
         | 
| 
       77 
     | 
    
         
            -
                    class_option :asset_pipeline,      type: :string, aliases: "-a", default: "sprockets",
         
     | 
| 
       78 
     | 
    
         
            -
                                                       enum: ASSET_PIPELINE_OPTIONS,
         
     | 
| 
       79 
     | 
    
         
            -
                                                       desc: "Choose your asset pipeline"
         
     | 
| 
       80 
     | 
    
         
            -
             
     | 
| 
       81 
76 
     | 
    
         
             
                    class_option :skip_javascript,     type: :boolean, aliases: ["-J", "--skip-js"], default: (true if name == "plugin"),
         
     | 
| 
       82 
77 
     | 
    
         
             
                                                       desc: "Skip JavaScript files"
         
     | 
| 
       83 
78 
     | 
    
         | 
| 
         @@ -99,6 +94,9 @@ module Rails 
     | 
|
| 
       99 
94 
     | 
    
         
             
                    class_option :skip_dev_gems,       type: :boolean, default: nil,
         
     | 
| 
       100 
95 
     | 
    
         
             
                                                       desc: "Skip development gems (e.g., web-console)"
         
     | 
| 
       101 
96 
     | 
    
         | 
| 
      
 97 
     | 
    
         
            +
                    class_option :skip_thruster,       type: :boolean, default: nil,
         
     | 
| 
      
 98 
     | 
    
         
            +
                                                       desc: "Skip Thruster setup"
         
     | 
| 
      
 99 
     | 
    
         
            +
             
     | 
| 
       102 
100 
     | 
    
         
             
                    class_option :skip_rubocop,        type: :boolean, default: nil,
         
     | 
| 
       103 
101 
     | 
    
         
             
                                                       desc: "Skip RuboCop setup"
         
     | 
| 
       104 
102 
     | 
    
         | 
| 
         @@ -108,10 +106,16 @@ module Rails 
     | 
|
| 
       108 
106 
     | 
    
         
             
                    class_option :skip_ci,             type: :boolean, default: nil,
         
     | 
| 
       109 
107 
     | 
    
         
             
                                                       desc: "Skip GitHub CI files"
         
     | 
| 
       110 
108 
     | 
    
         | 
| 
      
 109 
     | 
    
         
            +
                    class_option :skip_kamal,          type: :boolean, default: nil,
         
     | 
| 
      
 110 
     | 
    
         
            +
                                                       desc: "Skip Kamal setup"
         
     | 
| 
      
 111 
     | 
    
         
            +
             
     | 
| 
      
 112 
     | 
    
         
            +
                    class_option :skip_solid,          type: :boolean, default: nil,
         
     | 
| 
      
 113 
     | 
    
         
            +
                                                       desc: "Skip Solid Cache & Queue setup"
         
     | 
| 
      
 114 
     | 
    
         
            +
             
     | 
| 
       111 
115 
     | 
    
         
             
                    class_option :dev,                 type: :boolean, default: nil,
         
     | 
| 
       112 
116 
     | 
    
         
             
                                                       desc: "Set up the #{name} with Gemfile pointing to your Rails checkout"
         
     | 
| 
       113 
117 
     | 
    
         | 
| 
       114 
     | 
    
         
            -
                    class_option :devcontainer,        type: :boolean, default:  
     | 
| 
      
 118 
     | 
    
         
            +
                    class_option :devcontainer,        type: :boolean, default: nil,
         
     | 
| 
       115 
119 
     | 
    
         
             
                                                       desc: "Generate devcontainer files"
         
     | 
| 
       116 
120 
     | 
    
         | 
| 
       117 
121 
     | 
    
         
             
                    class_option :edge,                type: :boolean, default: nil,
         
     | 
| 
         @@ -197,7 +201,7 @@ module Rails 
     | 
|
| 
       197 
201 
     | 
    
         | 
| 
       198 
202 
     | 
    
         
             
                  OPTION_IMPLICATIONS = { # :nodoc:
         
     | 
| 
       199 
203 
     | 
    
         
             
                    skip_active_job:     [:skip_action_mailer, :skip_active_storage],
         
     | 
| 
       200 
     | 
    
         
            -
                    skip_active_record:  [:skip_active_storage],
         
     | 
| 
      
 204 
     | 
    
         
            +
                    skip_active_record:  [:skip_active_storage, :skip_solid],
         
     | 
| 
       201 
205 
     | 
    
         
             
                    skip_active_storage: [:skip_action_mailbox, :skip_action_text],
         
     | 
| 
       202 
206 
     | 
    
         
             
                    skip_javascript:     [:skip_hotwire],
         
     | 
| 
       203 
207 
     | 
    
         
             
                  }
         
     | 
| 
         @@ -287,12 +291,7 @@ module Rails 
     | 
|
| 
       287 
291 
     | 
    
         
             
                  end
         
     | 
| 
       288 
292 
     | 
    
         | 
| 
       289 
293 
     | 
    
         
             
                  def asset_pipeline_gemfile_entry
         
     | 
| 
       290 
     | 
    
         
            -
                     
     | 
| 
       291 
     | 
    
         
            -
             
     | 
| 
       292 
     | 
    
         
            -
                    if options[:asset_pipeline] == "sprockets"
         
     | 
| 
       293 
     | 
    
         
            -
                      GemfileEntry.floats "sprockets-rails",
         
     | 
| 
       294 
     | 
    
         
            -
                        "The original asset pipeline for Rails [https://github.com/rails/sprockets-rails]"
         
     | 
| 
       295 
     | 
    
         
            -
                    elsif options[:asset_pipeline] == "propshaft"
         
     | 
| 
      
 294 
     | 
    
         
            +
                    unless skip_asset_pipeline?
         
     | 
| 
       296 
295 
     | 
    
         
             
                      GemfileEntry.floats "propshaft", "The modern asset pipeline for Rails [https://github.com/rails/propshaft]"
         
     | 
| 
       297 
296 
     | 
    
         
             
                    end
         
     | 
| 
       298 
297 
     | 
    
         
             
                  end
         
     | 
| 
         @@ -386,12 +385,8 @@ module Rails 
     | 
|
| 
       386 
385 
     | 
    
         
             
                    options[:skip_asset_pipeline]
         
     | 
| 
       387 
386 
     | 
    
         
             
                  end
         
     | 
| 
       388 
387 
     | 
    
         | 
| 
       389 
     | 
    
         
            -
                  def  
     | 
| 
       390 
     | 
    
         
            -
                     
     | 
| 
       391 
     | 
    
         
            -
                  end
         
     | 
| 
       392 
     | 
    
         
            -
             
     | 
| 
       393 
     | 
    
         
            -
                  def skip_propshaft?
         
     | 
| 
       394 
     | 
    
         
            -
                    skip_asset_pipeline? || options[:asset_pipeline] != "propshaft"
         
     | 
| 
      
 388 
     | 
    
         
            +
                  def skip_thruster?
         
     | 
| 
      
 389 
     | 
    
         
            +
                    options[:skip_thruster]
         
     | 
| 
       395 
390 
     | 
    
         
             
                  end
         
     | 
| 
       396 
391 
     | 
    
         | 
| 
       397 
392 
     | 
    
         
             
                  def skip_rubocop?
         
     | 
| 
         @@ -414,6 +409,14 @@ module Rails 
     | 
|
| 
       414 
409 
     | 
    
         
             
                    options[:devcontainer]
         
     | 
| 
       415 
410 
     | 
    
         
             
                  end
         
     | 
| 
       416 
411 
     | 
    
         | 
| 
      
 412 
     | 
    
         
            +
                  def skip_kamal?
         
     | 
| 
      
 413 
     | 
    
         
            +
                    options[:skip_kamal]
         
     | 
| 
      
 414 
     | 
    
         
            +
                  end
         
     | 
| 
      
 415 
     | 
    
         
            +
             
     | 
| 
      
 416 
     | 
    
         
            +
                  def skip_solid?
         
     | 
| 
      
 417 
     | 
    
         
            +
                    options[:skip_solid]
         
     | 
| 
      
 418 
     | 
    
         
            +
                  end
         
     | 
| 
      
 419 
     | 
    
         
            +
             
     | 
| 
       417 
420 
     | 
    
         
             
                  class GemfileEntry < Struct.new(:name, :version, :comment, :options, :commented_out)
         
     | 
| 
       418 
421 
     | 
    
         
             
                    def initialize(name, version, comment, options = {}, commented_out = false)
         
     | 
| 
       419 
422 
     | 
    
         
             
                      super
         
     | 
| 
         @@ -572,7 +575,7 @@ module Rails 
     | 
|
| 
       572 
575 
     | 
    
         
             
                  end
         
     | 
| 
       573 
576 
     | 
    
         | 
| 
       574 
577 
     | 
    
         
             
                  def dockerfile_base_packages
         
     | 
| 
       575 
     | 
    
         
            -
                    # Add curl to work with the default  
     | 
| 
      
 578 
     | 
    
         
            +
                    # Add curl to work with the default health check strategy in Kamal
         
     | 
| 
       576 
579 
     | 
    
         
             
                    packages = ["curl"]
         
     | 
| 
       577 
580 
     | 
    
         | 
| 
       578 
581 
     | 
    
         
             
                    # ActiveRecord databases
         
     | 
| 
         @@ -620,10 +623,10 @@ module Rails 
     | 
|
| 
       620 
623 
     | 
    
         
             
                  end
         
     | 
| 
       621 
624 
     | 
    
         | 
| 
       622 
625 
     | 
    
         
             
                  def cable_gemfile_entry
         
     | 
| 
       623 
     | 
    
         
            -
                     
     | 
| 
       624 
     | 
    
         
            -
             
     | 
| 
       625 
     | 
    
         
            -
             
     | 
| 
       626 
     | 
    
         
            -
                     
     | 
| 
      
 626 
     | 
    
         
            +
                    if !options[:skip_action_cable] && options[:skip_solid]
         
     | 
| 
      
 627 
     | 
    
         
            +
                      comment = "Use Redis adapter to run Action Cable in production"
         
     | 
| 
      
 628 
     | 
    
         
            +
                      GemfileEntry.new("redis", ">= 4.0.1", comment, {}, true)
         
     | 
| 
      
 629 
     | 
    
         
            +
                    end
         
     | 
| 
       627 
630 
     | 
    
         
             
                  end
         
     | 
| 
       628 
631 
     | 
    
         | 
| 
       629 
632 
     | 
    
         
             
                  def bundle_command(command, env = {})
         
     | 
| 
         @@ -721,6 +724,25 @@ module Rails 
     | 
|
| 
       721 
724 
     | 
    
         
             
                    end
         
     | 
| 
       722 
725 
     | 
    
         
             
                  end
         
     | 
| 
       723 
726 
     | 
    
         | 
| 
      
 727 
     | 
    
         
            +
                  def run_kamal
         
     | 
| 
      
 728 
     | 
    
         
            +
                    return if options[:skip_kamal] || !bundle_install?
         
     | 
| 
      
 729 
     | 
    
         
            +
             
     | 
| 
      
 730 
     | 
    
         
            +
                    bundle_command "binstubs kamal"
         
     | 
| 
      
 731 
     | 
    
         
            +
                    bundle_command "exec kamal init"
         
     | 
| 
      
 732 
     | 
    
         
            +
             
     | 
| 
      
 733 
     | 
    
         
            +
                    template "kamal-secrets.tt", ".kamal/secrets", force: true
         
     | 
| 
      
 734 
     | 
    
         
            +
                    template "config/deploy.yml", force: true
         
     | 
| 
      
 735 
     | 
    
         
            +
                  end
         
     | 
| 
      
 736 
     | 
    
         
            +
             
     | 
| 
      
 737 
     | 
    
         
            +
                  def run_solid
         
     | 
| 
      
 738 
     | 
    
         
            +
                    return if skip_solid? || !bundle_install?
         
     | 
| 
      
 739 
     | 
    
         
            +
             
     | 
| 
      
 740 
     | 
    
         
            +
                    commands = "solid_cache:install solid_queue:install"
         
     | 
| 
      
 741 
     | 
    
         
            +
                    commands += " solid_cable:install" unless skip_action_cable?
         
     | 
| 
      
 742 
     | 
    
         
            +
             
     | 
| 
      
 743 
     | 
    
         
            +
                    rails_command commands
         
     | 
| 
      
 744 
     | 
    
         
            +
                  end
         
     | 
| 
      
 745 
     | 
    
         
            +
             
     | 
| 
       724 
746 
     | 
    
         
             
                  def add_bundler_platforms
         
     | 
| 
       725 
747 
     | 
    
         
             
                    if bundle_install?
         
     | 
| 
       726 
748 
     | 
    
         
             
                      # The vast majority of Rails apps will be deployed on `x86_64-linux`.
         
     | 
| 
         @@ -3,25 +3,91 @@ 
     | 
|
| 
       3 
3 
     | 
    
         
             
            module Rails
         
     | 
| 
       4 
4 
     | 
    
         
             
              module Generators
         
     | 
| 
       5 
5 
     | 
    
         
             
                class Database
         
     | 
| 
       6 
     | 
    
         
            -
                  DATABASES = %w( mysql trilogy postgresql sqlite3 )
         
     | 
| 
      
 6 
     | 
    
         
            +
                  DATABASES = %w( mysql trilogy postgresql sqlite3 mariadb-mysql mariadb-trilogy )
         
     | 
| 
      
 7 
     | 
    
         
            +
             
     | 
| 
      
 8 
     | 
    
         
            +
                  module MySQL
         
     | 
| 
      
 9 
     | 
    
         
            +
                    def name
         
     | 
| 
      
 10 
     | 
    
         
            +
                      "mysql"
         
     | 
| 
      
 11 
     | 
    
         
            +
                    end
         
     | 
| 
      
 12 
     | 
    
         
            +
             
     | 
| 
      
 13 
     | 
    
         
            +
                    def port
         
     | 
| 
      
 14 
     | 
    
         
            +
                      3306
         
     | 
| 
      
 15 
     | 
    
         
            +
                    end
         
     | 
| 
      
 16 
     | 
    
         
            +
             
     | 
| 
      
 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 
     | 
    
         
            +
                      }
         
     | 
| 
      
 28 
     | 
    
         
            +
                    end
         
     | 
| 
      
 29 
     | 
    
         
            +
             
     | 
| 
      
 30 
     | 
    
         
            +
                    def socket
         
     | 
| 
      
 31 
     | 
    
         
            +
                      @socket ||= [
         
     | 
| 
      
 32 
     | 
    
         
            +
                        "/tmp/mysql.sock",                        # default
         
     | 
| 
      
 33 
     | 
    
         
            +
                        "/var/run/mysqld/mysqld.sock",            # debian/gentoo
         
     | 
| 
      
 34 
     | 
    
         
            +
                        "/var/tmp/mysql.sock",                    # freebsd
         
     | 
| 
      
 35 
     | 
    
         
            +
                        "/var/lib/mysql/mysql.sock",              # fedora
         
     | 
| 
      
 36 
     | 
    
         
            +
                        "/opt/local/lib/mysql/mysql.sock",        # fedora
         
     | 
| 
      
 37 
     | 
    
         
            +
                        "/opt/local/var/run/mysqld/mysqld.sock",  # mac + darwinports + mysql
         
     | 
| 
      
 38 
     | 
    
         
            +
                        "/opt/local/var/run/mysql4/mysqld.sock",  # mac + darwinports + mysql4
         
     | 
| 
      
 39 
     | 
    
         
            +
                        "/opt/local/var/run/mysql5/mysqld.sock",  # mac + darwinports + mysql5
         
     | 
| 
      
 40 
     | 
    
         
            +
                        "/opt/lampp/var/mysql/mysql.sock"         # xampp for linux
         
     | 
| 
      
 41 
     | 
    
         
            +
                      ].find { |f| File.exist?(f) } unless Gem.win_platform?
         
     | 
| 
      
 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
         
     | 
| 
       7 
70 
     | 
    
         | 
| 
       8 
71 
     | 
    
         
             
                  class << self
         
     | 
| 
       9 
72 
     | 
    
         
             
                    def build(database_name)
         
     | 
| 
       10 
73 
     | 
    
         
             
                      case database_name
         
     | 
| 
       11 
     | 
    
         
            -
                      when "mysql" then  
     | 
| 
      
 74 
     | 
    
         
            +
                      when "mysql" then MySQL2.new
         
     | 
| 
       12 
75 
     | 
    
         
             
                      when "postgresql" then PostgreSQL.new
         
     | 
| 
       13 
     | 
    
         
            -
                      when "trilogy" then  
     | 
| 
      
 76 
     | 
    
         
            +
                      when "trilogy" then Trilogy.new
         
     | 
| 
       14 
77 
     | 
    
         
             
                      when "sqlite3" then SQLite3.new
         
     | 
| 
      
 78 
     | 
    
         
            +
                      when "mariadb-mysql" then MariaDBMySQL2.new
         
     | 
| 
      
 79 
     | 
    
         
            +
                      when "mariadb-trilogy" then MariaDBTrilogy.new
         
     | 
| 
       15 
80 
     | 
    
         
             
                      else Null.new
         
     | 
| 
       16 
81 
     | 
    
         
             
                      end
         
     | 
| 
       17 
82 
     | 
    
         
             
                    end
         
     | 
| 
       18 
83 
     | 
    
         | 
| 
       19 
84 
     | 
    
         
             
                    def all
         
     | 
| 
       20 
85 
     | 
    
         
             
                      @all ||= [
         
     | 
| 
       21 
     | 
    
         
            -
                         
     | 
| 
      
 86 
     | 
    
         
            +
                        MySQL2.new,
         
     | 
| 
       22 
87 
     | 
    
         
             
                        PostgreSQL.new,
         
     | 
| 
       23 
     | 
    
         
            -
                        MariaDB.new,
         
     | 
| 
       24 
88 
     | 
    
         
             
                        SQLite3.new,
         
     | 
| 
      
 89 
     | 
    
         
            +
                        MariaDBMySQL2.new,
         
     | 
| 
      
 90 
     | 
    
         
            +
                        MariaDBTrilogy.new
         
     | 
| 
       25 
91 
     | 
    
         
             
                      ]
         
     | 
| 
       26 
92 
     | 
    
         
             
                    end
         
     | 
| 
       27 
93 
     | 
    
         
             
                  end
         
     | 
| 
         @@ -30,6 +96,10 @@ module Rails 
     | 
|
| 
       30 
96 
     | 
    
         
             
                    raise NotImplementedError
         
     | 
| 
       31 
97 
     | 
    
         
             
                  end
         
     | 
| 
       32 
98 
     | 
    
         | 
| 
      
 99 
     | 
    
         
            +
                  def template
         
     | 
| 
      
 100 
     | 
    
         
            +
                    raise NotImplementedError
         
     | 
| 
      
 101 
     | 
    
         
            +
                  end
         
     | 
| 
      
 102 
     | 
    
         
            +
             
     | 
| 
       33 
103 
     | 
    
         
             
                  def service
         
     | 
| 
       34 
104 
     | 
    
         
             
                    raise NotImplementedError
         
     | 
| 
       35 
105 
     | 
    
         
             
                  end
         
     | 
| 
         @@ -69,48 +139,11 @@ module Rails 
     | 
|
| 
       69 
139 
     | 
    
         
             
                    "#{name}-data"
         
     | 
| 
       70 
140 
     | 
    
         
             
                  end
         
     | 
| 
       71 
141 
     | 
    
         | 
| 
       72 
     | 
    
         
            -
                   
     | 
| 
       73 
     | 
    
         
            -
                     
     | 
| 
       74 
     | 
    
         
            -
                      @socket ||= [
         
     | 
| 
       75 
     | 
    
         
            -
                        "/tmp/mysql.sock",                        # default
         
     | 
| 
       76 
     | 
    
         
            -
                        "/var/run/mysqld/mysqld.sock",            # debian/gentoo
         
     | 
| 
       77 
     | 
    
         
            -
                        "/var/tmp/mysql.sock",                    # freebsd
         
     | 
| 
       78 
     | 
    
         
            -
                        "/var/lib/mysql/mysql.sock",              # fedora
         
     | 
| 
       79 
     | 
    
         
            -
                        "/opt/local/lib/mysql/mysql.sock",        # fedora
         
     | 
| 
       80 
     | 
    
         
            -
                        "/opt/local/var/run/mysqld/mysqld.sock",  # mac + darwinports + mysql
         
     | 
| 
       81 
     | 
    
         
            -
                        "/opt/local/var/run/mysql4/mysqld.sock",  # mac + darwinports + mysql4
         
     | 
| 
       82 
     | 
    
         
            -
                        "/opt/local/var/run/mysql5/mysqld.sock",  # mac + darwinports + mysql5
         
     | 
| 
       83 
     | 
    
         
            -
                        "/opt/lampp/var/mysql/mysql.sock"         # xampp for linux
         
     | 
| 
       84 
     | 
    
         
            -
                      ].find { |f| File.exist?(f) } unless Gem.win_platform?
         
     | 
| 
       85 
     | 
    
         
            -
                    end
         
     | 
| 
       86 
     | 
    
         
            -
             
     | 
| 
       87 
     | 
    
         
            -
                    def host
         
     | 
| 
       88 
     | 
    
         
            -
                      "localhost"
         
     | 
| 
       89 
     | 
    
         
            -
                    end
         
     | 
| 
       90 
     | 
    
         
            -
                  end
         
     | 
| 
       91 
     | 
    
         
            -
             
     | 
| 
       92 
     | 
    
         
            -
                  class MySQL < Database
         
     | 
| 
       93 
     | 
    
         
            -
                    include MySqlSocket
         
     | 
| 
      
 142 
     | 
    
         
            +
                  class MySQL2 < Database
         
     | 
| 
      
 143 
     | 
    
         
            +
                    include MySQL
         
     | 
| 
       94 
144 
     | 
    
         | 
| 
       95 
     | 
    
         
            -
                    def  
     | 
| 
       96 
     | 
    
         
            -
                      "mysql"
         
     | 
| 
       97 
     | 
    
         
            -
                    end
         
     | 
| 
       98 
     | 
    
         
            -
             
     | 
| 
       99 
     | 
    
         
            -
                    def service
         
     | 
| 
       100 
     | 
    
         
            -
                      {
         
     | 
| 
       101 
     | 
    
         
            -
                        "image" => "mysql/mysql-server:8.0",
         
     | 
| 
       102 
     | 
    
         
            -
                        "restart" => "unless-stopped",
         
     | 
| 
       103 
     | 
    
         
            -
                        "environment" => {
         
     | 
| 
       104 
     | 
    
         
            -
                          "MYSQL_ALLOW_EMPTY_PASSWORD" => "true",
         
     | 
| 
       105 
     | 
    
         
            -
                          "MYSQL_ROOT_HOST" => "%"
         
     | 
| 
       106 
     | 
    
         
            -
                        },
         
     | 
| 
       107 
     | 
    
         
            -
                        "volumes" => ["mysql-data:/var/lib/mysql"],
         
     | 
| 
       108 
     | 
    
         
            -
                        "networks" => ["default"],
         
     | 
| 
       109 
     | 
    
         
            -
                      }
         
     | 
| 
       110 
     | 
    
         
            -
                    end
         
     | 
| 
       111 
     | 
    
         
            -
             
     | 
| 
       112 
     | 
    
         
            -
                    def port
         
     | 
| 
       113 
     | 
    
         
            -
                      3306
         
     | 
| 
      
 145 
     | 
    
         
            +
                    def template
         
     | 
| 
      
 146 
     | 
    
         
            +
                      "config/databases/mysql.yml"
         
     | 
| 
       114 
147 
     | 
    
         
             
                    end
         
     | 
| 
       115 
148 
     | 
    
         | 
| 
       116 
149 
     | 
    
         
             
                    def gem
         
     | 
| 
         @@ -135,6 +168,10 @@ module Rails 
     | 
|
| 
       135 
168 
     | 
    
         
             
                      "postgres"
         
     | 
| 
       136 
169 
     | 
    
         
             
                    end
         
     | 
| 
       137 
170 
     | 
    
         | 
| 
      
 171 
     | 
    
         
            +
                    def template
         
     | 
| 
      
 172 
     | 
    
         
            +
                      "config/databases/postgresql.yml"
         
     | 
| 
      
 173 
     | 
    
         
            +
                    end
         
     | 
| 
      
 174 
     | 
    
         
            +
             
     | 
| 
       138 
175 
     | 
    
         
             
                    def service
         
     | 
| 
       139 
176 
     | 
    
         
             
                      {
         
     | 
| 
       140 
177 
     | 
    
         
             
                        "image" => "postgres:16.1",
         
     | 
| 
         @@ -169,27 +206,11 @@ module Rails 
     | 
|
| 
       169 
206 
     | 
    
         
             
                    end
         
     | 
| 
       170 
207 
     | 
    
         
             
                  end
         
     | 
| 
       171 
208 
     | 
    
         | 
| 
       172 
     | 
    
         
            -
                  class  
     | 
| 
       173 
     | 
    
         
            -
                    include  
     | 
| 
      
 209 
     | 
    
         
            +
                  class Trilogy < Database
         
     | 
| 
      
 210 
     | 
    
         
            +
                    include MySQL
         
     | 
| 
       174 
211 
     | 
    
         | 
| 
       175 
     | 
    
         
            -
                    def  
     | 
| 
       176 
     | 
    
         
            -
                      " 
     | 
| 
       177 
     | 
    
         
            -
                    end
         
     | 
| 
       178 
     | 
    
         
            -
             
     | 
| 
       179 
     | 
    
         
            -
                    def service
         
     | 
| 
       180 
     | 
    
         
            -
                      {
         
     | 
| 
       181 
     | 
    
         
            -
                        "image" => "mariadb:10.5",
         
     | 
| 
       182 
     | 
    
         
            -
                        "restart" => "unless-stopped",
         
     | 
| 
       183 
     | 
    
         
            -
                        "networks" => ["default"],
         
     | 
| 
       184 
     | 
    
         
            -
                        "volumes" => ["mariadb-data:/var/lib/mysql"],
         
     | 
| 
       185 
     | 
    
         
            -
                        "environment" => {
         
     | 
| 
       186 
     | 
    
         
            -
                          "MARIADB_ALLOW_EMPTY_ROOT_PASSWORD" => "true",
         
     | 
| 
       187 
     | 
    
         
            -
                        },
         
     | 
| 
       188 
     | 
    
         
            -
                      }
         
     | 
| 
       189 
     | 
    
         
            -
                    end
         
     | 
| 
       190 
     | 
    
         
            -
             
     | 
| 
       191 
     | 
    
         
            -
                    def port
         
     | 
| 
       192 
     | 
    
         
            -
                      3306
         
     | 
| 
      
 212 
     | 
    
         
            +
                    def template
         
     | 
| 
      
 213 
     | 
    
         
            +
                      "config/databases/trilogy.yml"
         
     | 
| 
       193 
214 
     | 
    
         
             
                    end
         
     | 
| 
       194 
215 
     | 
    
         | 
| 
       195 
216 
     | 
    
         
             
                    def gem
         
     | 
| 
         @@ -214,6 +235,10 @@ module Rails 
     | 
|
| 
       214 
235 
     | 
    
         
             
                      "sqlite3"
         
     | 
| 
       215 
236 
     | 
    
         
             
                    end
         
     | 
| 
       216 
237 
     | 
    
         | 
| 
      
 238 
     | 
    
         
            +
                    def template
         
     | 
| 
      
 239 
     | 
    
         
            +
                      "config/databases/sqlite3.yml"
         
     | 
| 
      
 240 
     | 
    
         
            +
                    end
         
     | 
| 
      
 241 
     | 
    
         
            +
             
     | 
| 
       217 
242 
     | 
    
         
             
                    def service
         
     | 
| 
       218 
243 
     | 
    
         
             
                      nil
         
     | 
| 
       219 
244 
     | 
    
         
             
                    end
         
     | 
| 
         @@ -223,7 +248,7 @@ module Rails 
     | 
|
| 
       223 
248 
     | 
    
         
             
                    end
         
     | 
| 
       224 
249 
     | 
    
         | 
| 
       225 
250 
     | 
    
         
             
                    def gem
         
     | 
| 
       226 
     | 
    
         
            -
                      ["sqlite3", [">= 1 
     | 
| 
      
 251 
     | 
    
         
            +
                      ["sqlite3", [">= 2.1"]]
         
     | 
| 
       227 
252 
     | 
    
         
             
                    end
         
     | 
| 
       228 
253 
     | 
    
         | 
| 
       229 
254 
     | 
    
         
             
                    def base_package
         
     | 
| 
         @@ -239,8 +264,17 @@ module Rails 
     | 
|
| 
       239 
264 
     | 
    
         
             
                    end
         
     | 
| 
       240 
265 
     | 
    
         
             
                  end
         
     | 
| 
       241 
266 
     | 
    
         | 
| 
      
 267 
     | 
    
         
            +
                  class MariaDBMySQL2 < MySQL2
         
     | 
| 
      
 268 
     | 
    
         
            +
                    include MariaDB
         
     | 
| 
      
 269 
     | 
    
         
            +
                  end
         
     | 
| 
      
 270 
     | 
    
         
            +
             
     | 
| 
      
 271 
     | 
    
         
            +
                  class MariaDBTrilogy < Trilogy
         
     | 
| 
      
 272 
     | 
    
         
            +
                    include MariaDB
         
     | 
| 
      
 273 
     | 
    
         
            +
                  end
         
     | 
| 
      
 274 
     | 
    
         
            +
             
     | 
| 
       242 
275 
     | 
    
         
             
                  class Null < Database
         
     | 
| 
       243 
276 
     | 
    
         
             
                    def name; end
         
     | 
| 
      
 277 
     | 
    
         
            +
                    def template; end
         
     | 
| 
       244 
278 
     | 
    
         
             
                    def service; end
         
     | 
| 
       245 
279 
     | 
    
         
             
                    def port; end
         
     | 
| 
       246 
280 
     | 
    
         
             
                    def volume; 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 "views/passwords/new.html.erb", File.join("app/views/passwords/new.html.erb")
         
     | 
| 
      
 10 
     | 
    
         
            +
                    template "views/passwords/edit.html.erb", File.join("app/views/passwords/edit.html.erb")
         
     | 
| 
      
 11 
     | 
    
         
            +
                    template "views/sessions/new.html.erb", File.join("app/views/sessions/new.html.erb")
         
     | 
| 
      
 12 
     | 
    
         
            +
                  end
         
     | 
| 
      
 13 
     | 
    
         
            +
                end
         
     | 
| 
      
 14 
     | 
    
         
            +
              end
         
     | 
| 
      
 15 
     | 
    
         
            +
            end
         
     | 
| 
         @@ -0,0 +1,9 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            <h1>Update your password</h2>
         
     | 
| 
      
 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,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
         
     | 
| 
         @@ -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 
     | 
    
         
            -
                           
     | 
| 
      
 93 
     | 
    
         
            +
                          parsed_type, parsed_options = $1, { size: $2.to_sym }
         
     | 
| 
       93 
94 
     | 
    
         
             
                        when /(string|text|binary|integer)\{(\d+)\}/
         
     | 
| 
       94 
     | 
    
         
            -
                           
     | 
| 
      
 95 
     | 
    
         
            +
                          parsed_type, parsed_options = $1, { limit: $2.to_i }
         
     | 
| 
       95 
96 
     | 
    
         
             
                        when /decimal\{(\d+)[,.-](\d+)\}/
         
     | 
| 
       96 
     | 
    
         
            -
                           
     | 
| 
      
 97 
     | 
    
         
            +
                          parsed_type, parsed_options = :decimal, { precision: $1.to_i, scale: $2.to_i }
         
     | 
| 
       97 
98 
     | 
    
         
             
                        when /(references|belongs_to)\{(.+)\}/
         
     | 
| 
       98 
     | 
    
         
            -
                           
     | 
| 
      
 99 
     | 
    
         
            +
                          parsed_type = $1
         
     | 
| 
       99 
100 
     | 
    
         
             
                          provided_options = $2.split(/[,.-]/)
         
     | 
| 
       100 
     | 
    
         
            -
                           
     | 
| 
       101 
     | 
    
         
            -
             
     | 
| 
       102 
     | 
    
         
            -
                          return type, options
         
     | 
| 
      
 101 
     | 
    
         
            +
                          parsed_options = Hash[provided_options.map { |opt| [opt.to_sym, true] }]
         
     | 
| 
       103 
102 
     | 
    
         
             
                        else
         
     | 
| 
       104 
     | 
    
         
            -
                           
     | 
| 
      
 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 : 
     | 
| 
       125 
     | 
    
         
            -
                                    when :rich_text                then : 
     | 
| 
       126 
     | 
    
         
            -
                                    when :boolean                  then : 
     | 
| 
      
 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
         
     |