diff options
Diffstat (limited to 'railties/lib')
108 files changed, 518 insertions, 591 deletions
diff --git a/railties/lib/rails.rb b/railties/lib/rails.rb index e7172e491f..b1f7c29b5a 100644 --- a/railties/lib/rails.rb +++ b/railties/lib/rails.rb @@ -14,7 +14,7 @@ require 'rails/version'  require 'active_support/railtie'  require 'action_dispatch/railtie' -# For Ruby 1.9, UTF-8 is the default internal and external encoding. +# UTF-8 is the default internal and external encoding.  silence_warnings do    Encoding.default_external = Encoding::UTF_8    Encoding.default_internal = Encoding::UTF_8 @@ -56,10 +56,18 @@ module Rails        application && application.config.root      end +    # Returns the current Rails environment. +    # +    #   Rails.env # => "development" +    #   Rails.env.development? # => true +    #   Rails.env.production? # => false      def env        @_env ||= ActiveSupport::StringInquirer.new(ENV["RAILS_ENV"] || ENV["RACK_ENV"] || "development")      end +    # Sets the Rails environment. +    # +    #   Rails.env = "staging" # => "staging"      def env=(environment)        @_env = ActiveSupport::StringInquirer.new(environment)      end diff --git a/railties/lib/rails/api/task.rb b/railties/lib/rails/api/task.rb index 4d49244807..a082932632 100644 --- a/railties/lib/rails/api/task.rb +++ b/railties/lib/rails/api/task.rb @@ -152,19 +152,5 @@ module Rails          File.read('RAILS_VERSION').strip        end      end - -    class AppTask < Task -      def component_root_dir(gem_name) -        $:.grep(%r{#{gem_name}[\w.-]*/lib\z}).first[0..-5] -      end - -      def api_dir -        'doc/api' -      end - -      def rails_version -        Rails::VERSION::STRING -      end -    end    end  end diff --git a/railties/lib/rails/application.rb b/railties/lib/rails/application.rb index bc966e87c6..b11815e013 100644 --- a/railties/lib/rails/application.rb +++ b/railties/lib/rails/application.rb @@ -88,6 +88,7 @@ module Rails        def inherited(base)          super          Rails.app_class = base +        add_lib_to_load_path!(find_root(base.called_from))        end        def instance @@ -98,6 +99,10 @@ module Rails          new(initial_variable_values, &block).run_load_hooks!        end +      def find_root(from) +        find_root_with_flag "config.ru", from, Dir.pwd +      end +        # Makes the +new+ method public.        #        # Note that Rails::Application inherits from Rails::Engine, which @@ -129,8 +134,6 @@ module Rails        # are these actually used?        @initial_variable_values = initial_variable_values        @block = block - -      add_lib_to_load_path!      end      # Returns true if the application is initialized. @@ -175,7 +178,7 @@ module Rails            key_generator = ActiveSupport::KeyGenerator.new(secrets.secret_key_base, iterations: 1000)            ActiveSupport::CachingKeyGenerator.new(key_generator)          else -          ActiveSupport::LegacyKeyGenerator.new(config.secret_token) +          ActiveSupport::LegacyKeyGenerator.new(secrets.secret_token)          end      end @@ -245,7 +248,7 @@ module Rails          super.merge({            "action_dispatch.parameter_filter" => config.filter_parameters,            "action_dispatch.redirect_filter" => config.filter_redirect, -          "action_dispatch.secret_token" => config.secret_token, +          "action_dispatch.secret_token" => secrets.secret_token,            "action_dispatch.secret_key_base" => secrets.secret_key_base,            "action_dispatch.show_exceptions" => config.action_dispatch.show_exceptions,            "action_dispatch.show_detailed_exceptions" => config.consider_all_requests_local, @@ -313,8 +316,8 @@ module Rails      # are changing config.root inside your application definition or having a custom      # Rails application, you will need to add lib to $LOAD_PATH on your own in case      # you need to load files in lib/ during the application configuration as well. -    def add_lib_to_load_path! #:nodoc: -      path = File.join config.root, 'lib' +    def self.add_lib_to_load_path!(root) #:nodoc: +      path = File.join root, 'lib'        if File.exist?(path) && !$LOAD_PATH.include?(path)          $LOAD_PATH.unshift(path)        end @@ -358,14 +361,28 @@ module Rails      end      def config #:nodoc: -      @config ||= Application::Configuration.new(find_root_with_flag("config.ru", Dir.pwd)) +      @config ||= Application::Configuration.new(self.class.find_root(self.class.called_from))      end      def config=(configuration) #:nodoc:        @config = configuration      end -    def secrets #:nodoc: +    # Returns secrets added to config/secrets.yml. +    # +    # Example: +    # +    #     development: +    #       secret_key_base: 836fa3665997a860728bcb9e9a1e704d427cfc920e79d847d79c8a9a907b9e965defa4154b2b86bdec6930adbe33f21364523a6f6ce363865724549fdfc08553 +    #     test: +    #       secret_key_base: 5a37811464e7d378488b0f073e2193b093682e4e21f5d6f3ae0a4e1781e61a351fdc878a843424e81c73fb484a40d23f92c8dafac4870e74ede6e5e174423010 +    #     production: +    #       secret_key_base: <%= ENV["SECRET_KEY_BASE"] %> +    #       namespace: my_app_production +    # +    # +Rails.application.secrets.namespace+ returns +my_app_production+ in the +    # production environment. +    def secrets        @secrets ||= begin          secrets = ActiveSupport::OrderedOptions.new          yaml = config.paths["config/secrets"].first @@ -378,6 +395,8 @@ module Rails          # Fallback to config.secret_key_base if secrets.secret_key_base isn't set          secrets.secret_key_base ||= config.secret_key_base +        # Fallback to config.secret_token if secrets.secret_token isn't set +        secrets.secret_token ||= config.secret_token          secrets        end @@ -401,16 +420,7 @@ module Rails      console do        unless ::Kernel.private_method_defined?(:y) -        if RUBY_VERSION >= '2.0' -          require "psych/y" -        else -          module ::Kernel -            def y(*objects) -              puts ::Psych.dump_stream(*objects) -            end -            private :y -          end -        end +        require "psych/y"        end      end @@ -418,8 +428,8 @@ module Rails      # and the order specified by the +railties_order+ config.      #      # While when running initializers we need engines in reverse -    # order here when copying migrations from railties we need then in the same -    # order as given by +railties_order+ +    # order here when copying migrations from railties we need them in the same +    # order as given by +railties_order+.      def migration_railties # :nodoc:        ordered_railties.flatten - [self]      end @@ -507,8 +517,13 @@ module Rails      end      def validate_secret_key_config! #:nodoc: -      if secrets.secret_key_base.blank? && config.secret_token.blank? -        raise "Missing `secret_key_base` for '#{Rails.env}' environment, set this value in `config/secrets.yml`" +      if secrets.secret_key_base.blank? +        ActiveSupport::Deprecation.warn "You didn't set `secret_key_base`. " + +          "Read the upgrade documentation to learn more about this new config option." + +        if secrets.secret_token.blank? +          raise "Missing `secret_token` and `secret_key_base` for '#{Rails.env}' environment, set these values in `config/secrets.yml`" +        end        end      end    end diff --git a/railties/lib/rails/application/configuration.rb b/railties/lib/rails/application/configuration.rb index 786dcee007..dc3ec4274b 100644 --- a/railties/lib/rails/application/configuration.rb +++ b/railties/lib/rails/application/configuration.rb @@ -6,12 +6,12 @@ require 'rails/source_annotation_extractor'  module Rails    class Application      class Configuration < ::Rails::Engine::Configuration -      attr_accessor :allow_concurrency, :asset_host, :assets, :autoflush_log, +      attr_accessor :allow_concurrency, :asset_host, :autoflush_log,                      :cache_classes, :cache_store, :consider_all_requests_local, :console,                      :eager_load, :exceptions_app, :file_watcher, :filter_parameters,                      :force_ssl, :helpers_paths, :logger, :log_formatter, :log_tags,                      :railties_order, :relative_url_root, :secret_key_base, :secret_token, -                    :serve_static_assets, :ssl_options, :static_cache_control, :session_options, +                    :serve_static_files, :ssl_options, :static_cache_control, :session_options,                      :time_zone, :reload_classes_only_on_change,                      :beginning_of_week, :filter_redirect, :x @@ -26,7 +26,7 @@ module Rails          @filter_parameters             = []          @filter_redirect               = []          @helpers_paths                 = [] -        @serve_static_assets           = true +        @serve_static_files            = true          @static_cache_control          = nil          @force_ssl                     = false          @ssl_options                   = {} @@ -49,21 +49,6 @@ module Rails          @secret_token                  = nil          @secret_key_base               = nil          @x                             = Custom.new - -        @assets = ActiveSupport::OrderedOptions.new -        @assets.enabled                  = true -        @assets.paths                    = [] -        @assets.precompile               = [ Proc.new { |path, fn| fn =~ /app\/assets/ && !%w(.js .css).include?(File.extname(path)) }, -                                             /(?:\/|\\|\A)application\.(css|js)$/ ] -        @assets.prefix                   = "/assets" -        @assets.version                  = '1.0' -        @assets.debug                    = false -        @assets.compile                  = true -        @assets.digest                   = false -        @assets.cache_store              = [ :file_store, "#{root}/tmp/cache/assets/#{Rails.env}/" ] -        @assets.js_compressor            = nil -        @assets.css_compressor           = nil -        @assets.logger                   = nil        end        def encoding=(value) @@ -118,7 +103,7 @@ module Rails        end        def log_level -        @log_level ||= :debug +        @log_level ||= (Rails.env.production? ? :info : :debug)        end        def colorize_logging diff --git a/railties/lib/rails/application/default_middleware_stack.rb b/railties/lib/rails/application/default_middleware_stack.rb index d1789192ef..02eea82b0c 100644 --- a/railties/lib/rails/application/default_middleware_stack.rb +++ b/railties/lib/rails/application/default_middleware_stack.rb @@ -17,7 +17,7 @@ module Rails            middleware.use ::Rack::Sendfile, config.action_dispatch.x_sendfile_header -          if config.serve_static_assets +          if config.serve_static_files              middleware.use ::ActionDispatch::Static, paths["public"].first, config.static_cache_control            end diff --git a/railties/lib/rails/application/finisher.rb b/railties/lib/rails/application/finisher.rb index 7a1bb1e25c..0599e988d9 100644 --- a/railties/lib/rails/application/finisher.rb +++ b/railties/lib/rails/application/finisher.rb @@ -108,6 +108,13 @@ module Rails            ActionDispatch::Reloader.to_cleanup(&callback)          end        end + +      # Disable dependency loading during request cycle +      initializer :disable_dependency_loading do +        if config.eager_load && config.cache_classes +          ActiveSupport::Dependencies.unhook! +        end +      end      end    end  end diff --git a/railties/lib/rails/application/routes_reloader.rb b/railties/lib/rails/application/routes_reloader.rb index 737977adf9..cf0a4e128f 100644 --- a/railties/lib/rails/application/routes_reloader.rb +++ b/railties/lib/rails/application/routes_reloader.rb @@ -41,9 +41,7 @@ module Rails        end        def finalize! -        route_sets.each do |routes| -          routes.finalize! -        end +        route_sets.each(&:finalize!)        end        def revert diff --git a/railties/lib/rails/code_statistics.rb b/railties/lib/rails/code_statistics.rb index 0ae6d2a455..0bdf63943f 100644 --- a/railties/lib/rails/code_statistics.rb +++ b/railties/lib/rails/code_statistics.rb @@ -6,9 +6,8 @@ class CodeStatistics #:nodoc:                  'Helper tests',                  'Model tests',                  'Mailer tests', -                'Integration tests', -                'Functional tests (old)', -                'Unit tests (old)'] +                'Job tests', +                'Integration tests']    def initialize(*pairs)      @pairs      = pairs diff --git a/railties/lib/rails/code_statistics_calculator.rb b/railties/lib/rails/code_statistics_calculator.rb index 60e4aef9b7..a142236dbe 100644 --- a/railties/lib/rails/code_statistics_calculator.rb +++ b/railties/lib/rails/code_statistics_calculator.rb @@ -24,6 +24,8 @@ class CodeStatisticsCalculator #:nodoc:      }    } +  PATTERNS[:minitest] = PATTERNS[:rb].merge method: /^\s*(def|test)\s+['"_a-z]/ +    def initialize(lines = 0, code_lines = 0, classes = 0, methods = 0)      @lines = lines      @code_lines = code_lines @@ -74,6 +76,10 @@ class CodeStatisticsCalculator #:nodoc:    private      def file_type(file_path) -      File.extname(file_path).sub(/\A\./, '').downcase.to_sym +      if file_path.end_with? '_test.rb' +        :minitest +      else +        File.extname(file_path).sub(/\A\./, '').downcase.to_sym +      end      end  end diff --git a/railties/lib/rails/commands/console.rb b/railties/lib/rails/commands/console.rb index 96ced3c2f9..5d37a2b699 100644 --- a/railties/lib/rails/commands/console.rb +++ b/railties/lib/rails/commands/console.rb @@ -18,14 +18,6 @@ module Rails            opt.on("-e", "--environment=name", String,                    "Specifies the environment to run this console under (test/development/production).",                    "Default: development") { |v| options[:environment] = v.strip } -          opt.on("--debugger", 'Enables the debugger.') do |v| -            if RUBY_VERSION < '2.0.0' -              options[:debugger] = v -            else -              puts "=> Notice: debugger option is ignored since Ruby 2.0 and " \ -                   "it will be removed in future versions." -            end -          end            opt.parse!(arguments)          end @@ -76,25 +68,7 @@ module Rails        Rails.env = environment      end -    if RUBY_VERSION < '2.0.0' -      def debugger? -        options[:debugger] -      end - -      def require_debugger -        require 'debugger' -        puts "=> Debugger enabled" -      rescue LoadError -        puts "You're missing the 'debugger' gem. Add it to your Gemfile, bundle it and try again." -        exit(1) -      end -    end -      def start -      if RUBY_VERSION < '2.0.0' -        require_debugger if debugger? -      end -        set_environment! if environment?        if sandbox? @@ -105,7 +79,7 @@ module Rails        end        if defined?(console::ExtendCommandBundle) -        console::ExtendCommandBundle.send :include, Rails::ConsoleMethods +        console::ExtendCommandBundle.include(Rails::ConsoleMethods)        end        console.start      end diff --git a/railties/lib/rails/commands/dbconsole.rb b/railties/lib/rails/commands/dbconsole.rb index 1a2613a8d0..5175e31f14 100644 --- a/railties/lib/rails/commands/dbconsole.rb +++ b/railties/lib/rails/commands/dbconsole.rb @@ -1,7 +1,6 @@  require 'erb'  require 'yaml'  require 'optparse' -require 'rbconfig'  module Rails    class DBConsole @@ -44,7 +43,7 @@ module Rails          find_cmd_and_exec(['mysql', 'mysql5'], *args) -      when "postgresql", "postgres", "postgis" +      when /^postgres|^postgis/          ENV['PGUSER']     = config["username"] if config["username"]          ENV['PGHOST']     = config["host"] if config["host"]          ENV['PGPORT']     = config["port"].to_s if config["port"] @@ -74,6 +73,21 @@ module Rails          find_cmd_and_exec('sqlplus', logon) +      when "sqlserver" +        args = [] + +        args += ["-D", "#{config['database']}"] if config['database'] +        args += ["-U", "#{config['username']}"] if config['username'] +        args += ["-P", "#{config['password']}"] if config['password'] + +        if config['host'] +          host_arg = "#{config['host']}" +          host_arg << ":#{config['port']}" if config['port'] +          args += ["-S", host_arg] +        end + +        find_cmd_and_exec("sqsh", *args) +        else          abort "Unknown command-line client for #{config['database']}. Submit a Rails patch to add support!"        end @@ -157,13 +171,15 @@ module Rails        commands = Array(commands)        dirs_on_path = ENV['PATH'].to_s.split(File::PATH_SEPARATOR) -      commands += commands.map{|cmd| "#{cmd}.exe"} if RbConfig::CONFIG['host_os'] =~ /mswin|mingw/ +      unless (ext = RbConfig::CONFIG['EXEEXT']).empty? +        commands = commands.map{|cmd| "#{cmd}#{ext}"} +      end        full_path_command = nil        found = commands.detect do |cmd|          dirs_on_path.detect do |path|            full_path_command = File.join(path, cmd) -          File.executable? full_path_command +          File.file?(full_path_command) && File.executable?(full_path_command)          end        end diff --git a/railties/lib/rails/commands/destroy.rb b/railties/lib/rails/commands/destroy.rb index 5479da86a0..ce26cc3fde 100644 --- a/railties/lib/rails/commands/destroy.rb +++ b/railties/lib/rails/commands/destroy.rb @@ -1,5 +1,7 @@  require 'rails/generators' +#if no argument/-h/--help is passed to rails destroy command, then +#it generates the help associated.  if [nil, "-h", "--help"].include?(ARGV.first)    Rails::Generators.help 'destroy'    exit diff --git a/railties/lib/rails/commands/generate.rb b/railties/lib/rails/commands/generate.rb index 351c59c645..926c36b967 100644 --- a/railties/lib/rails/commands/generate.rb +++ b/railties/lib/rails/commands/generate.rb @@ -1,5 +1,7 @@  require 'rails/generators' +#if no argument/-h/--help is passed to rails generate command, then +#it generates the help associated.  if [nil, "-h", "--help"].include?(ARGV.first)    Rails::Generators.help 'generate'    exit diff --git a/railties/lib/rails/commands/plugin.rb b/railties/lib/rails/commands/plugin.rb index 95bbdd4cdf..52d8966ead 100644 --- a/railties/lib/rails/commands/plugin.rb +++ b/railties/lib/rails/commands/plugin.rb @@ -11,7 +11,7 @@ else                end      if File.exist?(railsrc)        extra_args_string = File.read(railsrc) -      extra_args = extra_args_string.split(/\n+/).flat_map {|l| l.split} +      extra_args = extra_args_string.split(/\n+/).flat_map(&:split)        puts "Using #{extra_args.join(" ")} from #{railsrc}"        ARGV.insert(1, *extra_args)      end diff --git a/railties/lib/rails/commands/runner.rb b/railties/lib/rails/commands/runner.rb index 3a71f8d3f8..86bce9b2fe 100644 --- a/railties/lib/rails/commands/runner.rb +++ b/railties/lib/rails/commands/runner.rb @@ -1,5 +1,4 @@  require 'optparse' -require 'rbconfig'  options = { environment: (ENV['RAILS_ENV'] || ENV['RACK_ENV'] || "development").dup }  code_or_file = nil diff --git a/railties/lib/rails/commands/server.rb b/railties/lib/rails/commands/server.rb index e39f0920af..546d3725d8 100644 --- a/railties/lib/rails/commands/server.rb +++ b/railties/lib/rails/commands/server.rb @@ -28,14 +28,6 @@ module Rails            opts.on("-c", "--config=file", String,                    "Uses a custom rackup configuration.") { |v| options[:config] = v }            opts.on("-d", "--daemon", "Runs server as a Daemon.") { options[:daemonize] = true } -          opts.on("-u", "--debugger", "Enables the debugger.") do -            if RUBY_VERSION < '2.0.0' -              options[:debugger] = true -            else -              puts "=> Notice: debugger option is ignored since Ruby 2.0 and " \ -                   "it will be removed in future versions." -            end -          end            opts.on("-e", "--environment=name", String,                    "Specifies the environment to run this server under (test/development/production).",                    "Default: development") { |v| options[:environment] = v } @@ -86,9 +78,6 @@ module Rails      def middleware        middlewares = [] -      if RUBY_VERSION < '2.0.0' -        middlewares << [Rails::Rack::Debugger] if options[:debugger] -      end        middlewares << [::Rack::ContentLength]        # FIXME: add Rack::Lock in the case people are using webrick. @@ -102,17 +91,12 @@ module Rails        Hash.new(middlewares)      end -    def log_path -      "log/#{options[:environment]}.log" -    end -      def default_options        super.merge({          Port:               3000,          DoNotReverseLookup: true,          environment:        (ENV['RAILS_ENV'] || ENV['RACK_ENV'] || "development").dup,          daemonize:          false, -        debugger:           false,          pid:                File.expand_path("tmp/pids/server.pid"),          config:             File.expand_path("config.ru")        }) @@ -130,7 +114,7 @@ module Rails        end        def create_tmp_directories -        %w(cache pids sessions sockets).each do |dir_to_make| +        %w(cache pids sockets).each do |dir_to_make|            FileUtils.mkdir_p(File.join(Rails.root, 'tmp', dir_to_make))          end        end diff --git a/railties/lib/rails/configuration.rb b/railties/lib/rails/configuration.rb index f5d7dede66..76364cea8f 100644 --- a/railties/lib/rails/configuration.rb +++ b/railties/lib/rails/configuration.rb @@ -18,11 +18,11 @@ module Rails      # This will put the <tt>Magical::Unicorns</tt> middleware on the end of the stack.      # You can use +insert_before+ if you wish to add a middleware before another:      # -    #     config.middleware.insert_before ActionDispatch::Head, Magical::Unicorns +    #     config.middleware.insert_before Rack::Head, Magical::Unicorns      #      # There's also +insert_after+ which will insert a middleware after another:      # -    #     config.middleware.insert_after ActionDispatch::Head, Magical::Unicorns +    #     config.middleware.insert_after Rack::Head, Magical::Unicorns      #      # Middlewares can also be completely swapped out and replaced with others:      # @@ -35,6 +35,7 @@ module Rails      class MiddlewareStackProxy        def initialize          @operations = [] +        @delete_operations = []        end        def insert_before(*args, &block) @@ -56,7 +57,7 @@ module Rails        end        def delete(*args, &block) -        @operations << [__method__, args, block] +        @delete_operations << [__method__, args, block]        end        def unshift(*args, &block) @@ -64,9 +65,10 @@ module Rails        end        def merge_into(other) #:nodoc: -        @operations.each do |operation, args, block| +        (@operations + @delete_operations).each do |operation, args, block|            other.send(operation, *args, &block)          end +          other        end      end diff --git a/railties/lib/rails/deprecation.rb b/railties/lib/rails/deprecation.rb deleted file mode 100644 index 89f54069e9..0000000000 --- a/railties/lib/rails/deprecation.rb +++ /dev/null @@ -1,19 +0,0 @@ -require 'active_support/deprecation/proxy_wrappers' - -module Rails -  class DeprecatedConstant < ActiveSupport::Deprecation::DeprecatedConstantProxy -    def self.deprecate(old, current) -      # double assignment is used to avoid "assigned but unused variable" warning -      constant = constant = new(old, current) -      eval "::#{old} = constant" -    end - -    private - -    def target -      ::Kernel.eval @new_const.to_s -    end -  end - -  DeprecatedConstant.deprecate('RAILS_CACHE', '::Rails.cache') -end diff --git a/railties/lib/rails/engine.rb b/railties/lib/rails/engine.rb index dc3da1eb41..e1d5caf790 100644 --- a/railties/lib/rails/engine.rb +++ b/railties/lib/rails/engine.rb @@ -110,8 +110,8 @@ module Rails    #    # == Endpoint    # -  # An engine can be also a rack application. It can be useful if you have a rack application that -  # you would like to wrap with +Engine+ and provide some of the +Engine+'s features. +  # An engine can also be a rack application. It can be useful if you have a rack application that +  # you would like to wrap with +Engine+ and provide with some of the +Engine+'s features.    #    # To do that, use the +endpoint+ method:    # @@ -217,7 +217,7 @@ module Rails    # <tt>url_helpers</tt> from <tt>MyEngine::Engine.routes</tt>.    #    # The next thing that changes in isolated engines is the behavior of routes. Normally, when you namespace -  # your controllers, you also need to do namespace all your routes. With an isolated engine, +  # your controllers, you also need to namespace all your routes. With an isolated engine,    # the namespace is applied by default, so you can ignore it in routes:    #    #   MyEngine::Engine.routes.draw do @@ -296,7 +296,7 @@ module Rails    #     helper MyEngine::SharedEngineHelper    #   end    # -  # If you want to include all of the engine's helpers, you can use #helper method on an engine's +  # If you want to include all of the engine's helpers, you can use the #helper method on an engine's    # instance:    #    #   class ApplicationController < ActionController::Base @@ -312,7 +312,7 @@ module Rails    # Engines can have their own migrations. The default path for migrations is exactly the same    # as in application: <tt>db/migrate</tt>    # -  # To use engine's migrations in application you can use rake task, which copies them to +  # To use engine's migrations in application you can use the rake task below, which copies them to    # application's dir:    #    #   rake ENGINE_NAME:install:migrations @@ -328,7 +328,7 @@ module Rails    #    # == Loading priority    # -  # In order to change engine's priority you can use +config.railties_order+ in main application. +  # In order to change engine's priority you can use +config.railties_order+ in the main application.    # It will affect the priority of loading views, helpers, assets and all the other files    # related to engine or application.    # @@ -351,7 +351,7 @@ module Rails            base.called_from = begin              call_stack = if Kernel.respond_to?(:caller_locations) -              caller_locations.map(&:path) +              caller_locations.map { |l| l.absolute_path || l.path }              else                # Remove the line number from backtraces making sure we don't leave anything behind                caller.map { |p| p.sub(/:\d+.*/, '') } @@ -364,6 +364,10 @@ module Rails          super        end +      def find_root(from) +        find_root_with_flag "lib", from +      end +        def endpoint(endpoint = nil)          @endpoint ||= nil          @endpoint = endpoint if endpoint @@ -480,7 +484,7 @@ module Rails          helpers = Module.new          all = ActionController::Base.all_helpers_from_path(helpers_paths)          ActionController::Base.modules_for_helpers(all).each do |mod| -          helpers.send(:include, mod) +          helpers.include(mod)          end          helpers        end @@ -531,7 +535,7 @@ module Rails      # Define the configuration object for the engine.      def config -      @config ||= Engine::Configuration.new(find_root_with_flag("lib")) +      @config ||= Engine::Configuration.new(self.class.find_root(self.class.called_from))      end      # Load data from db/seeds.rb file. It can be used in to load engines' @@ -567,10 +571,10 @@ module Rails      end      initializer :add_routing_paths do |app| -      paths = self.paths["config/routes.rb"].existent +      routing_paths = self.paths["config/routes.rb"].existent -      if routes? || paths.any? -        app.routes_reloader.paths.unshift(*paths) +      if routes? || routing_paths.any? +        app.routes_reloader.paths.unshift(*routing_paths)          app.routes_reloader.route_sets << routes        end      end @@ -595,12 +599,6 @@ module Rails        end      end -    initializer :append_assets_path, group: :all do |app| -      app.config.assets.paths.unshift(*paths["vendor/assets"].existent_directories) -      app.config.assets.paths.unshift(*paths["lib/assets"].existent_directories) -      app.config.assets.paths.unshift(*paths["app/assets"].existent_directories) -    end -      initializer :prepend_helpers_path do |app|        if !isolated? || (app == self)          app.config.helpers_paths.unshift(*paths["app/helpers"].existent) @@ -658,8 +656,7 @@ module Rails        paths["db/migrate"].existent.any?      end -    def find_root_with_flag(flag, default=nil) #:nodoc: -      root_path = self.class.called_from +    def self.find_root_with_flag(flag, root_path, default=nil) #:nodoc:        while root_path && File.directory?(root_path) && !File.exist?("#{root_path}/#{flag}")          parent = File.dirname(root_path) diff --git a/railties/lib/rails/engine/configuration.rb b/railties/lib/rails/engine/configuration.rb index 10d1821709..62a4139d07 100644 --- a/railties/lib/rails/engine/configuration.rb +++ b/railties/lib/rails/engine/configuration.rb @@ -39,7 +39,7 @@ module Rails          @paths ||= begin            paths = Rails::Paths::Root.new(@root) -          paths.add "app",                 eager_load: true, glob: "*" +          paths.add "app",                 eager_load: true, glob: "{*,*/concerns}"            paths.add "app/assets",          glob: "*"            paths.add "app/controllers",     eager_load: true            paths.add "app/helpers",         eager_load: true @@ -47,9 +47,6 @@ module Rails            paths.add "app/mailers",         eager_load: true            paths.add "app/views" -          paths.add "app/controllers/concerns", eager_load: true -          paths.add "app/models/concerns",      eager_load: true -            paths.add "lib",                 load_path: true            paths.add "lib/assets",          glob: "*"            paths.add "lib/tasks",           glob: "**/*.rake" diff --git a/railties/lib/rails/gem_version.rb b/railties/lib/rails/gem_version.rb index 4411ec33ef..7d74b1bfe5 100644 --- a/railties/lib/rails/gem_version.rb +++ b/railties/lib/rails/gem_version.rb @@ -5,10 +5,10 @@ module Rails    end    module VERSION -    MAJOR = 4 -    MINOR = 2 +    MAJOR = 5 +    MINOR = 0      TINY  = 0 -    PRE   = "beta2" +    PRE   = "alpha"      STRING = [MAJOR, MINOR, TINY, PRE].compact.join(".")    end diff --git a/railties/lib/rails/generators.rb b/railties/lib/rails/generators.rb index bf2390cb7e..341291f08b 100644 --- a/railties/lib/rails/generators.rb +++ b/railties/lib/rails/generators.rb @@ -153,13 +153,13 @@ module Rails      def self.invoke(namespace, args=ARGV, config={})        names = namespace.to_s.split(':')        if klass = find_by_namespace(names.pop, names.any? && names.join(':')) -        args << "--help" if args.empty? && klass.arguments.any? { |a| a.required? } +        args << "--help" if args.empty? && klass.arguments.any?(&:required?)          klass.start(args, config)        else -        options     = sorted_groups.map(&:last).flatten +        options     = sorted_groups.flat_map(&:last)          suggestions = options.sort_by {|suggested| levenshtein_distance(namespace.to_s, suggested) }.first(3)          msg =  "Could not find generator '#{namespace}'. " -        msg << "Maybe you meant #{ suggestions.map {|s| "'#{s}'"}.join(" or ") }\n" +        msg << "Maybe you meant #{ suggestions.map {|s| "'#{s}'"}.to_sentence(last_word_connector: " or ") }\n"          msg << "Run `rails generate --help` for more options."          puts msg        end @@ -226,7 +226,7 @@ module Rails      def self.public_namespaces        lookup! -      subclasses.map { |k| k.namespace } +      subclasses.map(&:namespace)      end      def self.print_generators @@ -260,11 +260,9 @@ module Rails          t = str2          n = s.length          m = t.length -        max = n/2          return m if (0 == n)          return n if (0 == m) -        return n if (n - m).abs > max          d = (0..m).to_a          x = nil @@ -286,7 +284,7 @@ module Rails            d[m] = x          end -        return x +        x        end        # Prints a list of generators. diff --git a/railties/lib/rails/generators/actions.rb b/railties/lib/rails/generators/actions.rb index ffdb314612..c1bc646c65 100644 --- a/railties/lib/rails/generators/actions.rb +++ b/railties/lib/rails/generators/actions.rb @@ -1,5 +1,4 @@  require 'open-uri' -require 'rbconfig'  module Rails    module Generators @@ -189,7 +188,7 @@ module Rails        #   generate(:authenticated, "user session")        def generate(what, *args)          log :generate, what -        argument = args.flat_map {|arg| arg.to_s }.join(" ") +        argument = args.flat_map(&:to_s).join(" ")          in_root { run_ruby_script("bin/rails generate #{what} #{argument}", verbose: false) }        end @@ -219,10 +218,10 @@ module Rails        #   route "root 'welcome#index'"        def route(routing_code)          log :route, routing_code -        sentinel = /\.routes\.draw do\s*$/ +        sentinel = /\.routes\.draw do\s*\n/m          in_root do -          inject_into_file 'config/routes.rb', "\n  #{routing_code}", { after: sentinel, verbose: false } +          inject_into_file 'config/routes.rb', "  #{routing_code}", { after: sentinel, verbose: false, force: true }          end        end diff --git a/railties/lib/rails/generators/app_base.rb b/railties/lib/rails/generators/app_base.rb index 92ed9136a0..253272c7dd 100644 --- a/railties/lib/rails/generators/app_base.rb +++ b/railties/lib/rails/generators/app_base.rb @@ -38,6 +38,10 @@ module Rails          class_option :skip_keeps,         type: :boolean, default: false,                                            desc: 'Skip source control .keep files' +        class_option :skip_action_mailer, type: :boolean, aliases: "-M", +                                          default: false, +                                          desc: "Skip Action Mailer files" +          class_option :skip_active_record, type: :boolean, aliases: '-O', default: false,                                            desc: 'Skip Active Record files' @@ -65,8 +69,8 @@ module Rails          class_option :skip_turbolinks,    type: :boolean, default: false,                                            desc: 'Skip turbolinks gem' -        class_option :skip_test_unit,     type: :boolean, aliases: '-T', default: false, -                                          desc: 'Skip Test::Unit files' +        class_option :skip_test,          type: :boolean, aliases: '-T', default: false, +                                          desc: 'Skip test files'          class_option :rc,                 type: :string, default: false,                                            desc: "Path to file containing extra configuration options for rails command" @@ -109,7 +113,6 @@ module Rails           assets_gemfile_entry,           javascript_gemfile_entry,           jbuilder_gemfile_entry, -         sdoc_gemfile_entry,           psych_gemfile_entry,           @extra_entries].flatten.find_all(&@gem_filter)        end @@ -123,7 +126,7 @@ module Rails        def builder          @builder ||= begin            builder_class = get_builder_class -          builder_class.send(:include, ActionMethods) +          builder_class.include(ActionMethods)            builder_class.new(self)          end        end @@ -164,7 +167,7 @@ module Rails        end        def include_all_railties? -        !options[:skip_active_record] && !options[:skip_test_unit] && !options[:skip_sprockets] +        options.values_at(:skip_active_record, :skip_action_mailer, :skip_test, :skip_sprockets).none?        end        def comment_if(value) @@ -180,8 +183,12 @@ module Rails            super          end -        def self.github(name, github, comment = nil) -          new(name, nil, comment, github: github) +        def self.github(name, github, branch = nil, comment = nil) +          if branch +            new(name, nil, comment, github: github, branch: branch) +          else +            new(name, nil, comment, github: github) +          end          end          def self.version(name, version, comment = nil) @@ -195,9 +202,15 @@ module Rails        def rails_gemfile_entry          if options.dev? -          [GemfileEntry.path('rails', Rails::Generators::RAILS_DEV_PATH)] +          [ +            GemfileEntry.path('rails', Rails::Generators::RAILS_DEV_PATH), +            GemfileEntry.github('arel', 'rails/arel') +          ]          elsif options.edge? -          [GemfileEntry.github('rails', 'rails/rails')] +          [ +            GemfileEntry.github('rails', 'rails/rails'), +            GemfileEntry.github('arel', 'rails/arel') +          ]          else            [GemfileEntry.version('rails',                              Rails::VERSION::STRING, @@ -236,16 +249,8 @@ module Rails          return [] if options[:skip_sprockets]          gems = [] -        if options.dev? || options.edge? -          gems << GemfileEntry.github('sprockets-rails', 'rails/sprockets-rails', -                                    'Use edge version of sprockets-rails') -          gems << GemfileEntry.github('sass-rails', 'rails/sass-rails', -                                    'Use SCSS for stylesheets') -        else -          gems << GemfileEntry.version('sass-rails', -                                     '~> 5.0.0.beta1', +        gems << GemfileEntry.version('sass-rails', '~> 5.0',                                       'Use SCSS for stylesheets') -        end          gems << GemfileEntry.version('uglifier',                                     '>= 1.3.0', @@ -259,15 +264,10 @@ module Rails          GemfileEntry.version('jbuilder', '~> 2.0', comment)        end -      def sdoc_gemfile_entry -        comment = 'bundle exec rake doc:rails generates the API under doc/api.' -        GemfileEntry.new('sdoc', '~> 0.4.0', comment, group: :doc) -      end -        def coffee_gemfile_entry          comment = 'Use CoffeeScript for .coffee assets and views'          if options.dev? || options.edge? -          GemfileEntry.github 'coffee-rails', 'rails/coffee-rails', comment +          GemfileEntry.github 'coffee-rails', 'rails/coffee-rails', nil, comment          else            GemfileEntry.version 'coffee-rails', '~> 4.1.0', comment          end @@ -278,14 +278,8 @@ module Rails            []          else            gems = [coffee_gemfile_entry, javascript_runtime_gemfile_entry] - -          if options[:javascript] == 'jquery' -            gems << GemfileEntry.version('jquery-rails', '~> 4.0.0.beta2', -                                         'Use jQuery as the JavaScript library') -          else -            gems << GemfileEntry.version("#{options[:javascript]}-rails", nil, -                                         "Use #{options[:javascript]} as the JavaScript library") -          end +          gems << GemfileEntry.version("#{options[:javascript]}-rails", nil, +                                       "Use #{options[:javascript]} as the JavaScript library")            unless options[:skip_turbolinks]              gems << GemfileEntry.version("turbolinks", nil, @@ -342,7 +336,7 @@ module Rails        end        def spring_install? -        !options[:skip_spring] && Process.respond_to?(:fork) +        !options[:skip_spring] && Process.respond_to?(:fork) && !RUBY_PLATFORM.include?("cygwin")        end        def run_bundle diff --git a/railties/lib/rails/generators/base.rb b/railties/lib/rails/generators/base.rb index 9af6435f23..813b8b629e 100644 --- a/railties/lib/rails/generators/base.rb +++ b/railties/lib/rails/generators/base.rb @@ -273,7 +273,7 @@ module Rails          # Use Rails default banner.          def self.banner -          "rails generate #{namespace.sub(/^rails:/,'')} #{self.arguments.map{ |a| a.usage }.join(' ')} [options]".gsub(/\s+/, ' ') +          "rails generate #{namespace.sub(/^rails:/,'')} #{self.arguments.map(&:usage).join(' ')} [options]".gsub(/\s+/, ' ')          end          # Sets the base_name taking into account the current class namespace. diff --git a/railties/lib/rails/generators/erb/mailer/mailer_generator.rb b/railties/lib/rails/generators/erb/mailer/mailer_generator.rb index 66b17bd10e..65563aa6db 100644 --- a/railties/lib/rails/generators/erb/mailer/mailer_generator.rb +++ b/railties/lib/rails/generators/erb/mailer/mailer_generator.rb @@ -1,13 +1,40 @@ -require 'rails/generators/erb/controller/controller_generator' +require 'rails/generators/erb'  module Erb # :nodoc:    module Generators # :nodoc: -    class MailerGenerator < ControllerGenerator # :nodoc: +    class MailerGenerator < Base # :nodoc: +      argument :actions, type: :array, default: [], banner: "method method" + +      def copy_view_files +        view_base_path = File.join("app/views", class_path, file_name + '_mailer') +        empty_directory view_base_path + +        if self.behavior == :invoke +          formats.each do |format| +            layout_path = File.join("app/views/layouts", filename_with_extensions("mailer", format)) +            template filename_with_extensions(:layout, format), layout_path +          end +        end + +        actions.each do |action| +          @action = action + +          formats.each do |format| +            @path = File.join(view_base_path, filename_with_extensions(action, format)) +            template filename_with_extensions(:view, format), @path +          end +        end +      end +        protected        def formats          [:text, :html]        end + +      def file_name +        @_file_name ||= super.gsub(/\_mailer/i, '') +      end      end    end  end diff --git a/railties/lib/rails/generators/erb/mailer/templates/layout.html.erb b/railties/lib/rails/generators/erb/mailer/templates/layout.html.erb new file mode 100644 index 0000000000..93110e74ad --- /dev/null +++ b/railties/lib/rails/generators/erb/mailer/templates/layout.html.erb @@ -0,0 +1,5 @@ +<html> +  <body> +    <%%= yield %> +  </body> +</html> diff --git a/railties/lib/rails/generators/erb/mailer/templates/layout.text.erb b/railties/lib/rails/generators/erb/mailer/templates/layout.text.erb new file mode 100644 index 0000000000..6363733e6e --- /dev/null +++ b/railties/lib/rails/generators/erb/mailer/templates/layout.text.erb @@ -0,0 +1 @@ +<%%= yield %> diff --git a/railties/lib/rails/generators/erb/scaffold/templates/_form.html.erb b/railties/lib/rails/generators/erb/scaffold/templates/_form.html.erb index bba9141fb8..d9713b0238 100644 --- a/railties/lib/rails/generators/erb/scaffold/templates/_form.html.erb +++ b/railties/lib/rails/generators/erb/scaffold/templates/_form.html.erb @@ -1,10 +1,10 @@ -<%%= form_for(@<%= singular_table_name %>) do |f| %> -  <%% if @<%= singular_table_name %>.errors.any? %> +<%%= form_for(<%= singular_table_name %>) do |f| %> +  <%% if <%= singular_table_name %>.errors.any? %>      <div id="error_explanation"> -      <h2><%%= pluralize(@<%= singular_table_name %>.errors.count, "error") %> prohibited this <%= singular_table_name %> from being saved:</h2> +      <h2><%%= pluralize(<%= singular_table_name %>.errors.count, "error") %> prohibited this <%= singular_table_name %> from being saved:</h2>        <ul> -      <%% @<%= singular_table_name %>.errors.full_messages.each do |message| %> +      <%% <%= singular_table_name %>.errors.full_messages.each do |message| %>          <li><%%= message %></li>        <%% end %>        </ul> diff --git a/railties/lib/rails/generators/erb/scaffold/templates/edit.html.erb b/railties/lib/rails/generators/erb/scaffold/templates/edit.html.erb index 5620fcc850..81329473d9 100644 --- a/railties/lib/rails/generators/erb/scaffold/templates/edit.html.erb +++ b/railties/lib/rails/generators/erb/scaffold/templates/edit.html.erb @@ -1,6 +1,6 @@  <h1>Editing <%= singular_table_name.titleize %></h1> -<%%= render 'form' %> +<%%= render 'form', <%= singular_table_name %>: @<%= singular_table_name %> %>  <%%= link_to 'Show', @<%= singular_table_name %> %> |  <%%= link_to 'Back', <%= index_helper %>_path %> diff --git a/railties/lib/rails/generators/erb/scaffold/templates/index.html.erb b/railties/lib/rails/generators/erb/scaffold/templates/index.html.erb index 5e194783ff..c3b8ef1181 100644 --- a/railties/lib/rails/generators/erb/scaffold/templates/index.html.erb +++ b/railties/lib/rails/generators/erb/scaffold/templates/index.html.erb @@ -1,6 +1,6 @@  <p id="notice"><%%= notice %></p> -<h1>Listing <%= plural_table_name.titleize %></h1> +<h1><%= plural_table_name.titleize %></h1>  <table>    <thead> diff --git a/railties/lib/rails/generators/erb/scaffold/templates/new.html.erb b/railties/lib/rails/generators/erb/scaffold/templates/new.html.erb index db13a5d870..9b2b2f4875 100644 --- a/railties/lib/rails/generators/erb/scaffold/templates/new.html.erb +++ b/railties/lib/rails/generators/erb/scaffold/templates/new.html.erb @@ -1,5 +1,5 @@  <h1>New <%= singular_table_name.titleize %></h1> -<%%= render 'form' %> +<%%= render 'form', <%= singular_table_name %>: @<%= singular_table_name %> %>  <%%= link_to 'Back', <%= index_helper %>_path %> diff --git a/railties/lib/rails/generators/generated_attribute.rb b/railties/lib/rails/generators/generated_attribute.rb index f16bd8e082..8145a26e22 100644 --- a/railties/lib/rails/generators/generated_attribute.rb +++ b/railties/lib/rails/generators/generated_attribute.rb @@ -142,7 +142,11 @@ module Rails        end        def password_digest? -        name == 'password' && type == :digest  +        name == 'password' && type == :digest +      end + +      def token? +        type == :token        end        def inject_options @@ -159,6 +163,10 @@ module Rails              options.delete(:required)              options[:null] = false            end + +          if reference? && !polymorphic? +            options[:foreign_key] = true +          end          end        end      end diff --git a/railties/lib/rails/generators/migration.rb b/railties/lib/rails/generators/migration.rb index cd388e590a..51e6d68bf0 100644 --- a/railties/lib/rails/generators/migration.rb +++ b/railties/lib/rails/generators/migration.rb @@ -3,8 +3,8 @@ require 'rails/generators/actions/create_migration'  module Rails    module Generators -    # Holds common methods for migrations. It assumes that migrations has the -    # [0-9]*_name format and can be used by another frameworks (like Sequel) +    # Holds common methods for migrations. It assumes that migrations have the +    # [0-9]*_name format and can be used by other frameworks (like Sequel)      # just by implementing the next migration version method.      module Migration        extend ActiveSupport::Concern diff --git a/railties/lib/rails/generators/named_base.rb b/railties/lib/rails/generators/named_base.rb index b7da44ca2d..36456e64f5 100644 --- a/railties/lib/rails/generators/named_base.rb +++ b/railties/lib/rails/generators/named_base.rb @@ -99,7 +99,7 @@ module Rails          end          def class_name -          (class_path + [file_name]).map!{ |m| m.camelize }.join('::') +          (class_path + [file_name]).map!(&:camelize).join('::')          end          def human_name @@ -145,7 +145,7 @@ module Rails            @route_url ||= class_path.collect {|dname| "/" + dname }.join + "/" + plural_file_name          end -        # Tries to retrieve the application name or simple return application. +        # Tries to retrieve the application name or simply return application.          def application_name            if defined?(Rails) && Rails.application              Rails.application.class.name.split('::').first.underscore @@ -156,7 +156,7 @@ module Rails          def assign_names!(name) #:nodoc:            @class_path = name.include?('/') ? name.split('/') : name.split('::') -          @class_path.map! { |m| m.underscore } +          @class_path.map!(&:underscore)            @file_name = @class_path.pop          end diff --git a/railties/lib/rails/generators/rails/app/app_generator.rb b/railties/lib/rails/generators/rails/app/app_generator.rb index 9110c129d1..899b33e529 100644 --- a/railties/lib/rails/generators/rails/app/app_generator.rb +++ b/railties/lib/rails/generators/rails/app/app_generator.rb @@ -38,7 +38,7 @@ module Rails      end      def readme -      copy_file "README.rdoc", "README.rdoc" +      copy_file "README.md", "README.md"      end      def gemfile @@ -88,12 +88,22 @@ module Rails      def config_when_updating        cookie_serializer_config_exist = File.exist?('config/initializers/cookies_serializer.rb') +      callback_terminator_config_exist = File.exist?('config/initializers/callback_terminator.rb') +      active_record_belongs_to_required_by_default_config_exist = File.exist?('config/initializers/active_record_belongs_to_required_by_default.rb')        config +      unless callback_terminator_config_exist +        remove_file 'config/initializers/callback_terminator.rb' +      end +        unless cookie_serializer_config_exist          gsub_file 'config/initializers/cookies_serializer.rb', /json/, 'marshal'        end + +      unless active_record_belongs_to_required_by_default_config_exist +        remove_file 'config/initializers/active_record_belongs_to_required_by_default.rb' +      end      end      def database_yml @@ -120,6 +130,7 @@ module Rails      def test        empty_directory_with_keep_file 'test/fixtures' +      empty_directory_with_keep_file 'test/fixtures/files'        empty_directory_with_keep_file 'test/controllers'        empty_directory_with_keep_file 'test/mailers'        empty_directory_with_keep_file 'test/models' @@ -229,7 +240,7 @@ module Rails        end        def create_test_files -        build(:test) unless options[:skip_test_unit] +        build(:test) unless options[:skip_test]        end        def create_tmp_files @@ -252,6 +263,12 @@ module Rails          end        end +      def delete_active_record_initializers_skipping_active_record +        if options[:skip_active_record] +          remove_file 'config/initializers/active_record_belongs_to_required_by_default.rb' +        end +      end +        def finish_template          build(:leftovers)        end @@ -260,9 +277,7 @@ module Rails        public_task :generate_spring_binstubs        def run_after_bundle_callbacks -        @after_bundle_callbacks.each do |callback| -          callback.call -        end +        @after_bundle_callbacks.each(&:call)        end      protected @@ -340,7 +355,7 @@ module Rails      #      # This class should be called before the AppGenerator is required and started      # since it configures and mutates ARGV correctly. -    class ARGVScrubber # :nodoc +    class ARGVScrubber # :nodoc:        def initialize(argv = ARGV)          @argv = argv        end diff --git a/railties/lib/rails/generators/rails/app/templates/Gemfile b/railties/lib/rails/generators/rails/app/templates/Gemfile index 5961f7515c..82a0315379 100644 --- a/railties/lib/rails/generators/rails/app/templates/Gemfile +++ b/railties/lib/rails/generators/rails/app/templates/Gemfile @@ -22,25 +22,28 @@ source 'https://rubygems.org'  # gem 'capistrano-rails', group: :development  group :development, :test do -<% unless defined?(JRUBY_VERSION) -%> -  <%- if RUBY_VERSION < '2.0.0' -%> -  # Call 'debugger' anywhere in the code to stop execution and get a debugger console -  gem 'debugger' -  <%- else -%> +<% if RUBY_ENGINE == 'ruby' -%>    # Call 'byebug' anywhere in the code to stop execution and get a debugger console    gem 'byebug' -  <%- end -%>    # Access an IRB console on exception pages or by using <%%= console %> in views -  gem 'web-console', '~> 2.0.0.beta4' +  <%- if options.dev? || options.edge? -%> +  gem 'web-console', github: "rails/web-console" +  <%- else -%> +  gem 'web-console', '~> 2.0' +  <%- end -%>  <%- if spring_install? %>    # Spring speeds up development by keeping your application running in the background. Read more: https://github.com/rails/spring    gem 'spring'  <% end -%> + +  # Adds `Method#source` and `Method#comment` to get the source code of a +  # method from the console +  gem 'method_source'  <% end -%>  end -  <% if RUBY_PLATFORM.match(/bccwin|cygwin|emx|mingw|mswin|wince|java/) -%> +  # Windows does not include zoneinfo files, so bundle the tzinfo-data gem  gem 'tzinfo-data', platforms: [:mingw, :mswin, :x64_mingw, :jruby]  <% end -%> diff --git a/railties/lib/rails/generators/rails/app/templates/README.rdoc b/railties/lib/rails/generators/rails/app/templates/README.md index dd4e97e22e..55e144da18 100644 --- a/railties/lib/rails/generators/rails/app/templates/README.rdoc +++ b/railties/lib/rails/generators/rails/app/templates/README.md @@ -1,4 +1,4 @@ -== README +## README  This README would normally document whatever steps are necessary to get the  application up and running. @@ -22,7 +22,3 @@ Things you may want to cover:  * Deployment instructions  * ... - - -Please feel free to use a different markup language if you do not plan to run -<tt>rake doc:app</tt>. diff --git a/railties/lib/rails/generators/rails/app/templates/app/assets/javascripts/application.js.tt b/railties/lib/rails/generators/rails/app/templates/app/assets/javascripts/application.js.tt index 07ea09cdbd..c1a77944e8 100644 --- a/railties/lib/rails/generators/rails/app/templates/app/assets/javascripts/application.js.tt +++ b/railties/lib/rails/generators/rails/app/templates/app/assets/javascripts/application.js.tt @@ -2,7 +2,7 @@  // listed below.  //  // Any JavaScript/Coffee file within this directory, lib/assets/javascripts, vendor/assets/javascripts, -// or vendor/assets/javascripts of plugins, if any, can be referenced here using a relative path. +// or any plugin's vendor/assets/javascripts directory can be referenced here using a relative path.  //  // It's not advisable to add code directly here, but if you do, it'll appear at the bottom of the  // compiled file. diff --git a/railties/lib/rails/generators/rails/app/templates/app/assets/stylesheets/application.css b/railties/lib/rails/generators/rails/app/templates/app/assets/stylesheets/application.css index a443db3401..0cdd2788d0 100644 --- a/railties/lib/rails/generators/rails/app/templates/app/assets/stylesheets/application.css +++ b/railties/lib/rails/generators/rails/app/templates/app/assets/stylesheets/application.css @@ -3,12 +3,11 @@   * listed below.   *   * Any CSS and SCSS file within this directory, lib/assets/stylesheets, vendor/assets/stylesheets, - * or vendor/assets/stylesheets of plugins, if any, can be referenced here using a relative path. + * or any plugin's vendor/assets/stylesheets directory can be referenced here using a relative path.   *   * You're free to add application-wide styles to this file and they'll appear at the bottom of the - * compiled file so the styles you add here take precedence over styles defined in any styles - * defined in the other CSS/SCSS files in this directory. It is generally better to create a new - * file per style scope. + * compiled file so the styles you add here take precedence over styles defined in any other CSS/SCSS + * files in this directory. It is generally better to create a new file per style scope.   *   *= require_tree .   *= require_self diff --git a/railties/lib/rails/generators/rails/app/templates/bin/rails b/railties/lib/rails/generators/rails/app/templates/bin/rails index 6a128b95e5..80ec8080ab 100644 --- a/railties/lib/rails/generators/rails/app/templates/bin/rails +++ b/railties/lib/rails/generators/rails/app/templates/bin/rails @@ -1,3 +1,3 @@ -APP_PATH = File.expand_path('../../config/application',  __FILE__) +APP_PATH = File.expand_path('../../config/application', __FILE__)  require_relative '../config/boot'  require 'rails/commands' diff --git a/railties/lib/rails/generators/rails/app/templates/bin/setup b/railties/lib/rails/generators/rails/app/templates/bin/setup index 0e22b3fa5c..eee810be30 100644 --- a/railties/lib/rails/generators/rails/app/templates/bin/setup +++ b/railties/lib/rails/generators/rails/app/templates/bin/setup @@ -1,28 +1,30 @@  require 'pathname' +require 'fileutils' +include FileUtils  # path to your application root. -APP_ROOT = Pathname.new File.expand_path('../../',  __FILE__) +APP_ROOT = Pathname.new File.expand_path('../../', __FILE__) -Dir.chdir APP_ROOT do +chdir APP_ROOT do    # This script is a starting point to setup your application. -  # Add necessary setup steps to this file: +  # Add necessary setup steps to this file. -  puts "== Installing dependencies ==" -  system "gem install bundler --conservative" -  system "bundle check || bundle install" +  puts '== Installing dependencies ==' +  system 'gem install bundler --conservative' +  system('bundle check') or system('bundle install')    # puts "\n== Copying sample files ==" -  # unless File.exist?("config/database.yml") -  #   system "cp config/database.yml.sample config/database.yml" +  # unless File.exist?('config/database.yml') +  #   cp 'config/database.yml.sample', 'config/database.yml'    # end    puts "\n== Preparing database ==" -  system "bin/rake db:setup" +  system 'ruby bin/rake db:setup'    puts "\n== Removing old logs and tempfiles ==" -  system "rm -f log/*" -  system "rm -rf tmp/cache" +  rm_f Dir.glob('log/*') +  rm_rf 'tmp/cache'    puts "\n== Restarting application server ==" -  system "touch tmp/restart.txt" +  touch 'tmp/restart.txt'  end diff --git a/railties/lib/rails/generators/rails/app/templates/config.ru b/railties/lib/rails/generators/rails/app/templates/config.ru index 5bc2a619e8..bd83b25412 100644 --- a/railties/lib/rails/generators/rails/app/templates/config.ru +++ b/railties/lib/rails/generators/rails/app/templates/config.ru @@ -1,4 +1,4 @@  # This file is used by Rack-based servers to start the application. -require ::File.expand_path('../config/environment',  __FILE__) +require ::File.expand_path('../config/environment', __FILE__)  run Rails.application diff --git a/railties/lib/rails/generators/rails/app/templates/config/application.rb b/railties/lib/rails/generators/rails/app/templates/config/application.rb index 111b680e4b..a2661bfb51 100644 --- a/railties/lib/rails/generators/rails/app/templates/config/application.rb +++ b/railties/lib/rails/generators/rails/app/templates/config/application.rb @@ -3,15 +3,16 @@ require File.expand_path('../boot', __FILE__)  <% if include_all_railties? -%>  require 'rails/all'  <% else -%> +require "rails"  # Pick the frameworks you want:  require "active_model/railtie"  require "active_job/railtie"  <%= comment_if :skip_active_record %>require "active_record/railtie"  require "action_controller/railtie" -require "action_mailer/railtie" +<%= comment_if :skip_action_mailer %>require "action_mailer/railtie"  require "action_view/railtie"  <%= comment_if :skip_sprockets %>require "sprockets/railtie" -<%= comment_if :skip_test_unit %>require "rails/test_unit/railtie" +<%= comment_if :skip_test %>require "rails/test_unit/railtie"  <% end -%>  # Require the gems listed in Gemfile, including any gems @@ -31,10 +32,5 @@ module <%= app_const_base %>      # The default locale is :en and all translations from config/locales/*.rb,yml are auto loaded.      # config.i18n.load_path += Dir[Rails.root.join('my', 'locales', '*.{rb,yml}').to_s]      # config.i18n.default_locale = :de -    <%- unless options.skip_active_record? -%> - -    # Do not swallow errors in after_commit/after_rollback callbacks. -    config.active_record.raise_in_transactional_callbacks = true -    <%- end -%>    end  end diff --git a/railties/lib/rails/generators/rails/app/templates/config/databases/mysql.yml b/railties/lib/rails/generators/rails/app/templates/config/databases/mysql.yml index 4b2e6646c7..596c916573 100644 --- a/railties/lib/rails/generators/rails/app/templates/config/databases/mysql.yml +++ b/railties/lib/rails/generators/rails/app/templates/config/databases/mysql.yml @@ -1,6 +1,6 @@  # MySQL.  Versions 5.0+ are recommended.  # -# Install the MYSQL driver +# Install the MySQL driver  #   gem install mysql2  #  # Ensure the MySQL gem is defined in your Gemfile diff --git a/railties/lib/rails/generators/rails/app/templates/config/environments/development.rb.tt b/railties/lib/rails/generators/rails/app/templates/config/environments/development.rb.tt index d8326d1728..ecb5d4170f 100644 --- a/railties/lib/rails/generators/rails/app/templates/config/environments/development.rb.tt +++ b/railties/lib/rails/generators/rails/app/templates/config/environments/development.rb.tt @@ -12,9 +12,11 @@ Rails.application.configure do    # Show full error reports and disable caching.    config.consider_all_requests_local       = true    config.action_controller.perform_caching = false +  <%- unless options.skip_action_mailer? -%>    # Don't care if the mailer can't send.    config.action_mailer.raise_delivery_errors = false +  <%- end -%>    # Print deprecation notices to the Rails logger.    config.active_support.deprecation = :log diff --git a/railties/lib/rails/generators/rails/app/templates/config/environments/production.rb.tt b/railties/lib/rails/generators/rails/app/templates/config/environments/production.rb.tt index 92ff0de030..8c09396fc1 100644 --- a/railties/lib/rails/generators/rails/app/templates/config/environments/production.rb.tt +++ b/railties/lib/rails/generators/rails/app/templates/config/environments/production.rb.tt @@ -14,14 +14,9 @@ Rails.application.configure do    config.consider_all_requests_local       = false    config.action_controller.perform_caching = true -  # Enable Rack::Cache to put a simple HTTP cache in front of your application -  # Add `rack-cache` to your Gemfile before enabling this. -  # For large-scale production use, consider using a caching reverse proxy like -  # NGINX, varnish or squid. -  # config.action_dispatch.rack_cache = true - -  # Disable Rails's static asset server (Apache or NGINX will already do this). -  config.serve_static_assets = false +  # Disable serving static files from the `/public` folder by default since +  # Apache or NGINX already handles this. +  config.serve_static_files = ENV['RAILS_SERVE_STATIC_FILES'].present?    <%- unless options.skip_sprockets? -%>    # Compress JavaScripts and CSS. @@ -38,6 +33,9 @@ Rails.application.configure do    # `config.assets.precompile` and `config.assets.version` have moved to config/initializers/assets.rb    <%- end -%> +  # Enable serving of images, stylesheets, and JavaScripts from an asset server. +  # config.action_controller.asset_host = 'http://assets.example.com' +    # Specifies the header that your server uses for sending files.    # config.action_dispatch.x_sendfile_header = 'X-Sendfile' # for Apache    # config.action_dispatch.x_sendfile_header = 'X-Accel-Redirect' # for NGINX @@ -45,11 +43,12 @@ Rails.application.configure do    # Force all access to the app over SSL, use Strict-Transport-Security, and use secure cookies.    # config.force_ssl = true -  # Decrease the log volume. -  # config.log_level = :info +  # Use the lowest log level to ensure availability of diagnostic information +  # when problems arise. +  config.log_level = :debug    # Prepend all log lines with the following tags. -  # config.log_tags = [ :subdomain, :uuid ] +  # config.log_tags = [ :subdomain, :request_id ]    # Use a different logger for distributed setups.    # config.logger = ActiveSupport::TaggedLogging.new(SyslogLogger.new) @@ -57,12 +56,15 @@ Rails.application.configure do    # Use a different cache store in production.    # config.cache_store = :mem_cache_store -  # Enable serving of images, stylesheets, and JavaScripts from an asset server. -  # config.action_controller.asset_host = 'http://assets.example.com' +  # Use a real queuing backend for Active Job (and separate queues per environment) +  # config.active_job.queue_adapter     = :resque +  # config.active_job.queue_name_prefix = "<%= app_name %>_#{Rails.env}" +  <%- unless options.skip_action_mailer? -%>    # Ignore bad email addresses and do not raise email delivery errors.    # Set this to true and configure the email server for immediate delivery to raise delivery errors.    # config.action_mailer.raise_delivery_errors = false +  <%- end -%>    # Enable locale fallbacks for I18n (makes lookups for any locale fall back to    # the I18n.default_locale when a translation cannot be found). diff --git a/railties/lib/rails/generators/rails/app/templates/config/environments/test.rb.tt b/railties/lib/rails/generators/rails/app/templates/config/environments/test.rb.tt index 32756eb88b..0306deb18c 100644 --- a/railties/lib/rails/generators/rails/app/templates/config/environments/test.rb.tt +++ b/railties/lib/rails/generators/rails/app/templates/config/environments/test.rb.tt @@ -12,8 +12,8 @@ Rails.application.configure do    # preloads Rails for running tests, you may have to set it to true.    config.eager_load = false -  # Configure static asset server for tests with Cache-Control for performance. -  config.serve_static_assets  = true +  # Configure static file server for tests with Cache-Control for performance. +  config.serve_static_files   = true    config.static_cache_control = 'public, max-age=3600'    # Show full error reports and disable caching. @@ -25,13 +25,15 @@ Rails.application.configure do    # Disable request forgery protection in test environment.    config.action_controller.allow_forgery_protection = false +  <%- unless options.skip_action_mailer? -%>    # Tell Action Mailer not to deliver emails to the real world.    # The :test delivery method accumulates sent emails in the    # ActionMailer::Base.deliveries array.    config.action_mailer.delivery_method = :test +  <%- end -%> -  # Randomize the order test cases are executed +  # Randomize the order test cases are executed.    config.active_support.test_order = :random    # Print deprecation notices to the stderr. diff --git a/railties/lib/rails/generators/rails/app/templates/config/initializers/active_record_belongs_to_required_by_default.rb b/railties/lib/rails/generators/rails/app/templates/config/initializers/active_record_belongs_to_required_by_default.rb new file mode 100644 index 0000000000..30c4f89792 --- /dev/null +++ b/railties/lib/rails/generators/rails/app/templates/config/initializers/active_record_belongs_to_required_by_default.rb @@ -0,0 +1,4 @@ +# Be sure to restart your server when you modify this file. + +# Require `belongs_to` associations by default. +Rails.application.config.active_record.belongs_to_required_by_default = true diff --git a/railties/lib/rails/generators/rails/app/templates/config/initializers/application_controller_renderer.rb b/railties/lib/rails/generators/rails/app/templates/config/initializers/application_controller_renderer.rb new file mode 100644 index 0000000000..ea930f54da --- /dev/null +++ b/railties/lib/rails/generators/rails/app/templates/config/initializers/application_controller_renderer.rb @@ -0,0 +1,6 @@ +## Change renderer defaults here. +# +# ApplicationController.renderer.defaults.merge!( +#   http_host: 'example.org', +#   https: false +# ) diff --git a/railties/lib/rails/generators/rails/app/templates/config/initializers/callback_terminator.rb b/railties/lib/rails/generators/rails/app/templates/config/initializers/callback_terminator.rb new file mode 100644 index 0000000000..e63022da91 --- /dev/null +++ b/railties/lib/rails/generators/rails/app/templates/config/initializers/callback_terminator.rb @@ -0,0 +1,4 @@ +# Be sure to restart your server when you modify this file. + +# Do not halt callback chains when a callback returns false. +Rails.application.config.active_support.halt_callback_chains_on_return_false = false diff --git a/railties/lib/rails/generators/rails/app/templates/config/initializers/wrap_parameters.rb.tt b/railties/lib/rails/generators/rails/app/templates/config/initializers/wrap_parameters.rb.tt index f2110c2c70..94f612c3dd 100644 --- a/railties/lib/rails/generators/rails/app/templates/config/initializers/wrap_parameters.rb.tt +++ b/railties/lib/rails/generators/rails/app/templates/config/initializers/wrap_parameters.rb.tt @@ -11,6 +11,6 @@ end  # To enable root element in JSON for ActiveRecord objects.  # ActiveSupport.on_load(:active_record) do -#  self.include_root_in_json = true +#   self.include_root_in_json = true  # end  <%- end -%> diff --git a/railties/lib/rails/generators/rails/app/templates/gitignore b/railties/lib/rails/generators/rails/app/templates/gitignore index 8775e5e235..7c6f2098b8 100644 --- a/railties/lib/rails/generators/rails/app/templates/gitignore +++ b/railties/lib/rails/generators/rails/app/templates/gitignore @@ -14,5 +14,6 @@  <% end -%>  # Ignore all logfiles and tempfiles. -/log/*.log +/log/* +!/log/.keep  /tmp diff --git a/railties/lib/rails/generators/rails/migration/migration_generator.rb b/railties/lib/rails/generators/rails/migration/migration_generator.rb index 965c42db36..fca2a8fef4 100644 --- a/railties/lib/rails/generators/rails/migration/migration_generator.rb +++ b/railties/lib/rails/generators/rails/migration/migration_generator.rb @@ -2,7 +2,7 @@ module Rails    module Generators      class MigrationGenerator < NamedBase # :nodoc:        argument :attributes, type: :array, default: [], banner: "field[:type][:index] field[:type][:index]" -      hook_for :orm, required: true +      hook_for :orm, required: true, desc: "ORM to be invoked"      end    end  end diff --git a/railties/lib/rails/generators/rails/model/USAGE b/railties/lib/rails/generators/rails/model/USAGE index 8c3b63c3b4..11daa5c3cb 100644 --- a/railties/lib/rails/generators/rails/model/USAGE +++ b/railties/lib/rails/generators/rails/model/USAGE @@ -22,7 +22,7 @@ Description:      If you pass a namespaced model name (e.g. admin/account or Admin::Account)      then the generator will create a module with a table_name_prefix method -    to prefix the model's table name with the module name (e.g. admin_account) +    to prefix the model's table name with the module name (e.g. admin_accounts)  Available field types: @@ -79,10 +79,15 @@ Available field types:          `rails generate model product supplier:references{polymorphic}:index`      If you require a `password_digest` string column for use with -    has_secure_password, you should specify `password:digest`: +    has_secure_password, you can specify `password:digest`:          `rails generate model user password:digest` +    If you require a `token` string column for use with +    has_secure_token, you can specify `auth_token:token`: + +        `rails generate model user auth_token:token` +  Examples:      `rails generate model account` diff --git a/railties/lib/rails/generators/rails/model/model_generator.rb b/railties/lib/rails/generators/rails/model/model_generator.rb index 87bab129bb..ec78fd855d 100644 --- a/railties/lib/rails/generators/rails/model/model_generator.rb +++ b/railties/lib/rails/generators/rails/model/model_generator.rb @@ -6,7 +6,7 @@ module Rails        include Rails::Generators::ModelHelpers        argument :attributes, type: :array, default: [], banner: "field[:type][:index] field[:type][:index]" -      hook_for :orm, required: true +      hook_for :orm, required: true, desc: "ORM to be invoked"      end    end  end diff --git a/railties/lib/rails/generators/rails/plugin/plugin_generator.rb b/railties/lib/rails/generators/rails/plugin/plugin_generator.rb index 584f776c01..68c3829515 100644 --- a/railties/lib/rails/generators/rails/plugin/plugin_generator.rb +++ b/railties/lib/rails/generators/rails/plugin/plugin_generator.rb @@ -18,14 +18,14 @@ module Rails      def app        if mountable?          directory 'app' -        empty_directory_with_keep_file "app/assets/images/#{name}" +        empty_directory_with_keep_file "app/assets/images/#{namespaced_name}"        elsif full?          empty_directory_with_keep_file 'app/models'          empty_directory_with_keep_file 'app/controllers'          empty_directory_with_keep_file 'app/views'          empty_directory_with_keep_file 'app/helpers'          empty_directory_with_keep_file 'app/mailers' -        empty_directory_with_keep_file "app/assets/images/#{name}" +        empty_directory_with_keep_file "app/assets/images/#{namespaced_name}"        end      end @@ -50,10 +50,10 @@ module Rails      end      def lib -      template "lib/%name%.rb" -      template "lib/tasks/%name%_tasks.rake" -      template "lib/%name%/version.rb" -      template "lib/%name%/engine.rb" if engine? +      template "lib/%namespaced_name%.rb" +      template "lib/tasks/%namespaced_name%_tasks.rake" +      template "lib/%namespaced_name%/version.rb" +      template "lib/%namespaced_name%/engine.rb" if engine?      end      def config @@ -62,7 +62,7 @@ module Rails      def test        template "test/test_helper.rb" -      template "test/%name%_test.rb" +      template "test/%namespaced_name%_test.rb"        append_file "Rakefile", <<-EOF  #{rakefile_test_tasks} @@ -74,7 +74,8 @@ task default: :test      end      PASSTHROUGH_OPTIONS = [ -      :skip_active_record, :skip_javascript, :database, :javascript, :quiet, :pretend, :force, :skip +      :skip_active_record, :skip_action_mailer, :skip_javascript, :database, +      :javascript, :quiet, :pretend, :force, :skip      ]      def generate_test_dummy(force = false) @@ -116,9 +117,9 @@ task default: :test      def stylesheets        if mountable?          copy_file "rails/stylesheets.css", -                  "app/assets/stylesheets/#{name}/application.css" +                  "app/assets/stylesheets/#{namespaced_name}/application.css"        elsif full? -        empty_directory_with_keep_file "app/assets/stylesheets/#{name}" +        empty_directory_with_keep_file "app/assets/stylesheets/#{namespaced_name}"        end      end @@ -127,9 +128,9 @@ task default: :test        if mountable?          template "rails/javascripts.js", -                 "app/assets/javascripts/#{name}/application.js" +                 "app/assets/javascripts/#{namespaced_name}/application.js"        elsif full? -        empty_directory_with_keep_file "app/assets/javascripts/#{name}" +        empty_directory_with_keep_file "app/assets/javascripts/#{namespaced_name}"        end      end @@ -225,7 +226,7 @@ task default: :test        end        def create_test_files -        build(:test) unless options[:skip_test_unit] +        build(:test) unless options[:skip_test]        end        def create_test_dummy_files @@ -255,6 +256,14 @@ task default: :test          end        end +      def underscored_name +        @underscored_name ||= original_name.underscore +      end + +      def namespaced_name +        @namespaced_name ||= name.gsub('-', '/') +      end +      protected        def app_templates_dir @@ -293,7 +302,7 @@ task default: :test        end        def with_dummy_app? -        options[:skip_test_unit].blank? || options[:dummy_path] != 'test/dummy' +        options[:skip_test].blank? || options[:dummy_path] != 'test/dummy'        end        def self.banner @@ -304,6 +313,27 @@ task default: :test          @original_name ||= File.basename(destination_root)        end +      def modules +        @modules ||= namespaced_name.camelize.split("::") +      end + +      def wrap_in_modules(unwrapped_code) +        unwrapped_code = "#{unwrapped_code}".strip.gsub(/\W$\n/, '') +        modules.reverse.inject(unwrapped_code) do |content, mod| +          str = "module #{mod}\n" +          str += content.lines.map { |line| "  #{line}" }.join +          str += content.present? ? "\nend" : "end" +        end +      end + +      def camelized_modules +        @camelized_modules ||= namespaced_name.camelize +      end + +      def humanized +        @humanized ||= original_name.underscore.humanize +      end +        def camelized          @camelized ||= name.gsub(/\W/, '_').squeeze('_').camelize        end @@ -327,8 +357,10 @@ task default: :test        end        def valid_const? -        if original_name =~ /[^0-9a-zA-Z_]+/ -          raise Error, "Invalid plugin name #{original_name}. Please give a name which use only alphabetic or numeric or \"_\" characters." +        if original_name =~ /-\d/ +          raise Error, "Invalid plugin name #{original_name}. Please give a name which does not contain a namespace starting with numeric characters." +        elsif original_name =~ /[^\w-]+/ +          raise Error, "Invalid plugin name #{original_name}. Please give a name which uses only alphabetic, numeric, \"_\" or \"-\" characters."          elsif camelized =~ /^\d/            raise Error, "Invalid plugin name #{original_name}. Please give a name which does not start with numbers."          elsif RESERVED_NAMES.include?(name) diff --git a/railties/lib/rails/generators/rails/plugin/templates/%name%.gemspec b/railties/lib/rails/generators/rails/plugin/templates/%name%.gemspec index 919c349470..f8ece4fe73 100644 --- a/railties/lib/rails/generators/rails/plugin/templates/%name%.gemspec +++ b/railties/lib/rails/generators/rails/plugin/templates/%name%.gemspec @@ -1,21 +1,21 @@  $:.push File.expand_path("../lib", __FILE__)  # Maintain your gem's version: -require "<%= name %>/version" +require "<%= namespaced_name %>/version"  # Describe your gem and declare its dependencies:  Gem::Specification.new do |s|    s.name        = "<%= name %>" -  s.version     = <%= camelized %>::VERSION +  s.version     = <%= camelized_modules %>::VERSION    s.authors     = ["<%= author %>"]    s.email       = ["<%= email %>"]    s.homepage    = "TODO" -  s.summary     = "TODO: Summary of <%= camelized %>." -  s.description = "TODO: Description of <%= camelized %>." +  s.summary     = "TODO: Summary of <%= camelized_modules %>." +  s.description = "TODO: Description of <%= camelized_modules %>."    s.license     = "MIT"    s.files = Dir["{app,config,db,lib}/**/*", "MIT-LICENSE", "Rakefile", "README.rdoc"] -<% unless options.skip_test_unit? -%> +<% unless options.skip_test? -%>    s.test_files = Dir["test/**/*"]  <% end -%> diff --git a/railties/lib/rails/generators/rails/plugin/templates/Gemfile b/railties/lib/rails/generators/rails/plugin/templates/Gemfile index 35ad9fbf9e..2c91c6a0ea 100644 --- a/railties/lib/rails/generators/rails/plugin/templates/Gemfile +++ b/railties/lib/rails/generators/rails/plugin/templates/Gemfile @@ -37,11 +37,11 @@ end  <% end -%>  <% end -%> -<% unless defined?(JRUBY_VERSION) -%> +<% if RUBY_ENGINE == 'ruby' -%>  # To use a debugger -  <%- if RUBY_VERSION < '2.0.0' -%> -# gem 'debugger', group: [:development, :test] -  <%- else -%>  # gem 'byebug', group: [:development, :test] -  <%- end -%> +<% end -%> +<% if RUBY_PLATFORM.match(/bccwin|cygwin|emx|mingw|mswin|wince|java/) -%> + +gem 'tzinfo-data', platforms: [:mingw, :mswin, :x64_mingw, :jruby]  <% end -%> diff --git a/railties/lib/rails/generators/rails/plugin/templates/README.rdoc b/railties/lib/rails/generators/rails/plugin/templates/README.rdoc index 301d647731..25983ca5da 100644 --- a/railties/lib/rails/generators/rails/plugin/templates/README.rdoc +++ b/railties/lib/rails/generators/rails/plugin/templates/README.rdoc @@ -1,3 +1,3 @@ -= <%= camelized %> += <%= camelized_modules %>  This project rocks and uses MIT-LICENSE.
\ No newline at end of file diff --git a/railties/lib/rails/generators/rails/plugin/templates/Rakefile b/railties/lib/rails/generators/rails/plugin/templates/Rakefile index c338a0bdb1..bda55bae29 100644 --- a/railties/lib/rails/generators/rails/plugin/templates/Rakefile +++ b/railties/lib/rails/generators/rails/plugin/templates/Rakefile @@ -8,7 +8,7 @@ require 'rdoc/task'  RDoc::Task.new(:rdoc) do |rdoc|    rdoc.rdoc_dir = 'rdoc' -  rdoc.title    = '<%= camelized %>' +  rdoc.title    = '<%= camelized_modules %>'    rdoc.options << '--line-numbers'    rdoc.rdoc_files.include('README.rdoc')    rdoc.rdoc_files.include('lib/**/*.rb') diff --git a/railties/lib/rails/generators/rails/plugin/templates/app/controllers/%name%/application_controller.rb.tt b/railties/lib/rails/generators/rails/plugin/templates/app/controllers/%namespaced_name%/application_controller.rb.tt index 448ad7f989..7157e48c42 100644 --- a/railties/lib/rails/generators/rails/plugin/templates/app/controllers/%name%/application_controller.rb.tt +++ b/railties/lib/rails/generators/rails/plugin/templates/app/controllers/%namespaced_name%/application_controller.rb.tt @@ -1,4 +1,5 @@ -module <%= camelized %> +<%= wrap_in_modules <<-rb.strip_heredoc    class ApplicationController < ActionController::Base    end -end +rb +%> diff --git a/railties/lib/rails/generators/rails/plugin/templates/app/helpers/%name%/application_helper.rb.tt b/railties/lib/rails/generators/rails/plugin/templates/app/helpers/%name%/application_helper.rb.tt deleted file mode 100644 index 40ae9f52c2..0000000000 --- a/railties/lib/rails/generators/rails/plugin/templates/app/helpers/%name%/application_helper.rb.tt +++ /dev/null @@ -1,4 +0,0 @@ -module <%= camelized %> -  module ApplicationHelper -  end -end diff --git a/railties/lib/rails/generators/rails/plugin/templates/app/helpers/%namespaced_name%/application_helper.rb.tt b/railties/lib/rails/generators/rails/plugin/templates/app/helpers/%namespaced_name%/application_helper.rb.tt new file mode 100644 index 0000000000..25d692732d --- /dev/null +++ b/railties/lib/rails/generators/rails/plugin/templates/app/helpers/%namespaced_name%/application_helper.rb.tt @@ -0,0 +1,5 @@ +<%= wrap_in_modules <<-rb.strip_heredoc +  module ApplicationHelper +  end +rb +%> diff --git a/railties/lib/rails/generators/rails/plugin/templates/app/views/layouts/%name%/application.html.erb.tt b/railties/lib/rails/generators/rails/plugin/templates/app/views/layouts/%name%/application.html.erb.tt deleted file mode 100644 index 1d380420b4..0000000000 --- a/railties/lib/rails/generators/rails/plugin/templates/app/views/layouts/%name%/application.html.erb.tt +++ /dev/null @@ -1,14 +0,0 @@ -<!DOCTYPE html> -<html> -<head> -  <title><%= camelized %></title> -  <%%= stylesheet_link_tag    "<%= name %>/application", media: "all" %> -  <%%= javascript_include_tag "<%= name %>/application" %> -  <%%= csrf_meta_tags %> -</head> -<body> - -<%%= yield %> - -</body> -</html> diff --git a/railties/lib/rails/generators/rails/plugin/templates/app/views/layouts/%namespaced_name%/application.html.erb.tt b/railties/lib/rails/generators/rails/plugin/templates/app/views/layouts/%namespaced_name%/application.html.erb.tt new file mode 100644 index 0000000000..6bc480161d --- /dev/null +++ b/railties/lib/rails/generators/rails/plugin/templates/app/views/layouts/%namespaced_name%/application.html.erb.tt @@ -0,0 +1,14 @@ +<!DOCTYPE html> +<html> +<head> +  <title><%= humanized %></title> +  <%%= stylesheet_link_tag    "<%= namespaced_name %>/application", media: "all" %> +  <%%= javascript_include_tag "<%= namespaced_name %>/application" %> +  <%%= csrf_meta_tags %> +</head> +<body> + +<%%= yield %> + +</body> +</html> diff --git a/railties/lib/rails/generators/rails/plugin/templates/bin/rails.tt b/railties/lib/rails/generators/rails/plugin/templates/bin/rails.tt index c3314d7e68..3edaac35c9 100644 --- a/railties/lib/rails/generators/rails/plugin/templates/bin/rails.tt +++ b/railties/lib/rails/generators/rails/plugin/templates/bin/rails.tt @@ -1,7 +1,7 @@  # This command will automatically be run when you run "rails" with Rails 4 gems installed from the root of your application.  ENGINE_ROOT = File.expand_path('../..', __FILE__) -ENGINE_PATH = File.expand_path('../../lib/<%= name -%>/engine', __FILE__) +ENGINE_PATH = File.expand_path('../../lib/<%= namespaced_name -%>/engine', __FILE__)  # Set up gems listed in the Gemfile.  ENV['BUNDLE_GEMFILE'] ||= File.expand_path('../../Gemfile', __FILE__) diff --git a/railties/lib/rails/generators/rails/plugin/templates/config/routes.rb b/railties/lib/rails/generators/rails/plugin/templates/config/routes.rb index 8e158d5831..154452bfe5 100644 --- a/railties/lib/rails/generators/rails/plugin/templates/config/routes.rb +++ b/railties/lib/rails/generators/rails/plugin/templates/config/routes.rb @@ -1,5 +1,5 @@  <% if mountable? -%> -<%= camelized %>::Engine.routes.draw do +<%= camelized_modules %>::Engine.routes.draw do  <% else -%>  Rails.application.routes.draw do  <% end -%> diff --git a/railties/lib/rails/generators/rails/plugin/templates/gitignore b/railties/lib/rails/generators/rails/plugin/templates/gitignore index 086d87818a..d524fcbc4e 100644 --- a/railties/lib/rails/generators/rails/plugin/templates/gitignore +++ b/railties/lib/rails/generators/rails/plugin/templates/gitignore @@ -1,10 +1,10 @@  .bundle/  log/*.log  pkg/ -<% unless options[:skip_test_unit] && options[:dummy_path] == 'test/dummy' -%> +<% unless options[:skip_test] && options[:dummy_path] == 'test/dummy' -%>  <%= dummy_path %>/db/*.sqlite3  <%= dummy_path %>/db/*.sqlite3-journal  <%= dummy_path %>/log/*.log  <%= dummy_path %>/tmp/  <%= dummy_path %>/.sass-cache -<% end -%>
\ No newline at end of file +<% end -%> diff --git a/railties/lib/rails/generators/rails/plugin/templates/lib/%name%.rb b/railties/lib/rails/generators/rails/plugin/templates/lib/%name%.rb deleted file mode 100644 index 40c074cced..0000000000 --- a/railties/lib/rails/generators/rails/plugin/templates/lib/%name%.rb +++ /dev/null @@ -1,6 +0,0 @@ -<% if engine? -%> -require "<%= name %>/engine" - -<% end -%> -module <%= camelized %> -end diff --git a/railties/lib/rails/generators/rails/plugin/templates/lib/%name%/engine.rb b/railties/lib/rails/generators/rails/plugin/templates/lib/%name%/engine.rb deleted file mode 100644 index 967668fe66..0000000000 --- a/railties/lib/rails/generators/rails/plugin/templates/lib/%name%/engine.rb +++ /dev/null @@ -1,7 +0,0 @@ -module <%= camelized %> -  class Engine < ::Rails::Engine -<% if mountable? -%> -    isolate_namespace <%= camelized %> -<% end -%> -  end -end diff --git a/railties/lib/rails/generators/rails/plugin/templates/lib/%name%/version.rb b/railties/lib/rails/generators/rails/plugin/templates/lib/%name%/version.rb deleted file mode 100644 index ef07ef2e19..0000000000 --- a/railties/lib/rails/generators/rails/plugin/templates/lib/%name%/version.rb +++ /dev/null @@ -1,3 +0,0 @@ -module <%= camelized %> -  VERSION = "0.0.1" -end diff --git a/railties/lib/rails/generators/rails/plugin/templates/lib/%namespaced_name%.rb b/railties/lib/rails/generators/rails/plugin/templates/lib/%namespaced_name%.rb new file mode 100644 index 0000000000..40b1c4cee7 --- /dev/null +++ b/railties/lib/rails/generators/rails/plugin/templates/lib/%namespaced_name%.rb @@ -0,0 +1,5 @@ +<% if engine? -%> +require "<%= namespaced_name %>/engine" + +<% end -%> +<%= wrap_in_modules "# Your code goes here..." %> diff --git a/railties/lib/rails/generators/rails/plugin/templates/lib/%namespaced_name%/engine.rb b/railties/lib/rails/generators/rails/plugin/templates/lib/%namespaced_name%/engine.rb new file mode 100644 index 0000000000..17afd52177 --- /dev/null +++ b/railties/lib/rails/generators/rails/plugin/templates/lib/%namespaced_name%/engine.rb @@ -0,0 +1,6 @@ +<%= wrap_in_modules <<-rb.strip_heredoc +  class Engine < ::Rails::Engine +  #{mountable? ? '  isolate_namespace ' + camelized_modules : ' '} +  end +rb +%> diff --git a/railties/lib/rails/generators/rails/plugin/templates/lib/%namespaced_name%/version.rb b/railties/lib/rails/generators/rails/plugin/templates/lib/%namespaced_name%/version.rb new file mode 100644 index 0000000000..d257295988 --- /dev/null +++ b/railties/lib/rails/generators/rails/plugin/templates/lib/%namespaced_name%/version.rb @@ -0,0 +1 @@ +<%= wrap_in_modules 'VERSION = "0.0.1"' %> diff --git a/railties/lib/rails/generators/rails/plugin/templates/lib/tasks/%name%_tasks.rake b/railties/lib/rails/generators/rails/plugin/templates/lib/tasks/%namespaced_name%_tasks.rake index 7121f5ae23..88a2c4120f 100644 --- a/railties/lib/rails/generators/rails/plugin/templates/lib/tasks/%name%_tasks.rake +++ b/railties/lib/rails/generators/rails/plugin/templates/lib/tasks/%namespaced_name%_tasks.rake @@ -1,4 +1,4 @@  # desc "Explaining what the task does" -# task :<%= name %> do +# task :<%= underscored_name %> do  #   # Task goes here  # end diff --git a/railties/lib/rails/generators/rails/plugin/templates/rails/application.rb b/railties/lib/rails/generators/rails/plugin/templates/rails/application.rb index b2aa82344a..b1038c839e 100644 --- a/railties/lib/rails/generators/rails/plugin/templates/rails/application.rb +++ b/railties/lib/rails/generators/rails/plugin/templates/rails/application.rb @@ -6,13 +6,13 @@ require 'rails/all'  # Pick the frameworks you want:  <%= comment_if :skip_active_record %>require "active_record/railtie"  require "action_controller/railtie" -require "action_mailer/railtie" +<%= comment_if :skip_action_mailer %>require "action_mailer/railtie"  require "action_view/railtie"  <%= comment_if :skip_sprockets %>require "sprockets/railtie" -<%= comment_if :skip_test_unit %>require "rails/test_unit/railtie" +<%= comment_if :skip_test %>require "rails/test_unit/railtie"  <% end -%>  Bundler.require(*Rails.groups) -require "<%= name %>" +require "<%= namespaced_name %>"  <%= application_definition %> diff --git a/railties/lib/rails/generators/rails/plugin/templates/rails/javascripts.js b/railties/lib/rails/generators/rails/plugin/templates/rails/javascripts.js index 5bc2e1c8b5..c28e5badc6 100644 --- a/railties/lib/rails/generators/rails/plugin/templates/rails/javascripts.js +++ b/railties/lib/rails/generators/rails/plugin/templates/rails/javascripts.js @@ -2,7 +2,7 @@  // listed below.  //  // Any JavaScript/Coffee file within this directory, lib/assets/javascripts, vendor/assets/javascripts, -// or vendor/assets/javascripts of plugins, if any, can be referenced here using a relative path. +// or any plugin's vendor/assets/javascripts directory can be referenced here using a relative path.  //  // It's not advisable to add code directly here, but if you do, it'll appear at the bottom of the  // compiled file. diff --git a/railties/lib/rails/generators/rails/plugin/templates/rails/routes.rb b/railties/lib/rails/generators/rails/plugin/templates/rails/routes.rb index 730ee31c3d..673de44108 100644 --- a/railties/lib/rails/generators/rails/plugin/templates/rails/routes.rb +++ b/railties/lib/rails/generators/rails/plugin/templates/rails/routes.rb @@ -1,4 +1,4 @@  Rails.application.routes.draw do -  mount <%= camelized %>::Engine => "/<%= name %>" +  mount <%= camelized_modules %>::Engine => "/<%= name %>"  end diff --git a/railties/lib/rails/generators/rails/plugin/templates/rails/stylesheets.css b/railties/lib/rails/generators/rails/plugin/templates/rails/stylesheets.css index a443db3401..0cdd2788d0 100644 --- a/railties/lib/rails/generators/rails/plugin/templates/rails/stylesheets.css +++ b/railties/lib/rails/generators/rails/plugin/templates/rails/stylesheets.css @@ -3,12 +3,11 @@   * listed below.   *   * Any CSS and SCSS file within this directory, lib/assets/stylesheets, vendor/assets/stylesheets, - * or vendor/assets/stylesheets of plugins, if any, can be referenced here using a relative path. + * or any plugin's vendor/assets/stylesheets directory can be referenced here using a relative path.   *   * You're free to add application-wide styles to this file and they'll appear at the bottom of the - * compiled file so the styles you add here take precedence over styles defined in any styles - * defined in the other CSS/SCSS files in this directory. It is generally better to create a new - * file per style scope. + * compiled file so the styles you add here take precedence over styles defined in any other CSS/SCSS + * files in this directory. It is generally better to create a new file per style scope.   *   *= require_tree .   *= require_self diff --git a/railties/lib/rails/generators/rails/plugin/templates/test/%name%_test.rb b/railties/lib/rails/generators/rails/plugin/templates/test/%name%_test.rb deleted file mode 100644 index 0a8bbd4aaf..0000000000 --- a/railties/lib/rails/generators/rails/plugin/templates/test/%name%_test.rb +++ /dev/null @@ -1,7 +0,0 @@ -require 'test_helper' - -class <%= camelized %>Test < ActiveSupport::TestCase -  test "truth" do -    assert_kind_of Module, <%= camelized %> -  end -end diff --git a/railties/lib/rails/generators/rails/plugin/templates/test/%namespaced_name%_test.rb b/railties/lib/rails/generators/rails/plugin/templates/test/%namespaced_name%_test.rb new file mode 100644 index 0000000000..1ee05d7871 --- /dev/null +++ b/railties/lib/rails/generators/rails/plugin/templates/test/%namespaced_name%_test.rb @@ -0,0 +1,7 @@ +require 'test_helper' + +class <%= camelized_modules %>::Test < ActiveSupport::TestCase +  test "truth" do +    assert_kind_of Module, <%= camelized_modules %> +  end +end diff --git a/railties/lib/rails/generators/rails/plugin/templates/test/test_helper.rb b/railties/lib/rails/generators/rails/plugin/templates/test/test_helper.rb index d492e68357..0852ffce9a 100644 --- a/railties/lib/rails/generators/rails/plugin/templates/test/test_helper.rb +++ b/railties/lib/rails/generators/rails/plugin/templates/test/test_helper.rb @@ -10,7 +10,9 @@ ActiveRecord::Migrator.migrations_paths << File.expand_path('../../db/migrate',  <% end -%>  require "rails/test_help" -Rails.backtrace_cleaner.remove_silencers! +# Filter out Minitest backtrace while allowing backtrace from other libraries +# to be shown. +Minitest.backtrace_filter = Minitest::BacktraceFilter.new  # Load support files  Dir["#{File.dirname(__FILE__)}/support/**/*.rb"].each { |f| require f } @@ -18,4 +20,6 @@ Dir["#{File.dirname(__FILE__)}/support/**/*.rb"].each { |f| require f }  # Load fixtures from the engine  if ActiveSupport::TestCase.respond_to?(:fixture_path=)    ActiveSupport::TestCase.fixture_path = File.expand_path("../fixtures", __FILE__) +  ActiveSupport::TestCase.file_fixture_path = ActiveSupport::TestCase.fixture_path + "files" +  ActiveSupport::TestCase.fixtures :all  end diff --git a/railties/lib/rails/generators/rails/scaffold/templates/scaffold.css b/railties/lib/rails/generators/rails/scaffold/templates/scaffold.css index 1ae7000299..69af1e8307 100644 --- a/railties/lib/rails/generators/rails/scaffold/templates/scaffold.css +++ b/railties/lib/rails/generators/rails/scaffold/templates/scaffold.css @@ -4,6 +4,7 @@ body, p, ol, ul, td {    font-family: verdana, arial, helvetica, sans-serif;    font-size:   13px;    line-height: 18px; +  margin: 33px;  }  pre { @@ -16,6 +17,16 @@ a { color: #000; }  a:visited { color: #666; }  a:hover { color: #fff; background-color:#000; } +th { +  padding-bottom: 5px; +} + +td { +  padding-bottom: 7px; +  padding-left: 5px; +  padding-right: 5px; +} +  div.field, div.actions {    margin-bottom: 10px;  } diff --git a/railties/lib/rails/generators/rails/scaffold_controller/scaffold_controller_generator.rb b/railties/lib/rails/generators/rails/scaffold_controller/scaffold_controller_generator.rb index 6bf0a33a5f..c01b82884d 100644 --- a/railties/lib/rails/generators/rails/scaffold_controller/scaffold_controller_generator.rb +++ b/railties/lib/rails/generators/rails/scaffold_controller/scaffold_controller_generator.rb @@ -7,6 +7,7 @@ module Rails        check_class_collision suffix: "Controller" +      class_option :helper, type: :boolean        class_option :orm, banner: "NAME", type: :string, required: true,                           desc: "ORM to generate the controller for" diff --git a/railties/lib/rails/generators/resource_helpers.rb b/railties/lib/rails/generators/resource_helpers.rb index 4669935156..9c2037783e 100644 --- a/railties/lib/rails/generators/resource_helpers.rb +++ b/railties/lib/rails/generators/resource_helpers.rb @@ -8,7 +8,7 @@ module Rails      module ResourceHelpers # :nodoc:        def self.included(base) #:nodoc: -        base.send :include, Rails::Generators::ModelHelpers +        base.include(Rails::Generators::ModelHelpers)          base.class_option :model_name, type: :string, desc: "ModelName to be used"        end @@ -39,7 +39,7 @@ module Rails          def assign_controller_names!(name)            @controller_name = name            @controller_class_path = name.include?('/') ? name.split('/') : name.split('::') -          @controller_class_path.map! { |m| m.underscore } +          @controller_class_path.map!(&:underscore)            @controller_file_name = @controller_class_path.pop          end @@ -48,7 +48,7 @@ module Rails          end          def controller_class_name -          (controller_class_path + [controller_file_name]).map!{ |m| m.camelize }.join('::') +          (controller_class_path + [controller_file_name]).map!(&:camelize).join('::')          end          def controller_i18n_scope diff --git a/railties/lib/rails/generators/test_unit/mailer/mailer_generator.rb b/railties/lib/rails/generators/test_unit/mailer/mailer_generator.rb index 85dee1a066..343c8a3949 100644 --- a/railties/lib/rails/generators/test_unit/mailer/mailer_generator.rb +++ b/railties/lib/rails/generators/test_unit/mailer/mailer_generator.rb @@ -6,16 +6,21 @@ module TestUnit # :nodoc:        argument :actions, type: :array, default: [], banner: "method method"        def check_class_collision -        class_collisions "#{class_name}Test", "#{class_name}Preview" +        class_collisions "#{class_name}MailerTest", "#{class_name}MailerPreview"        end        def create_test_files -        template "functional_test.rb", File.join('test/mailers', class_path, "#{file_name}_test.rb") +        template "functional_test.rb", File.join('test/mailers', class_path, "#{file_name}_mailer_test.rb")        end        def create_preview_files -        template "preview.rb", File.join('test/mailers/previews', class_path, "#{file_name}_preview.rb") +        template "preview.rb", File.join('test/mailers/previews', class_path, "#{file_name}_mailer_preview.rb")        end + +      protected +        def file_name +          @_file_name ||= super.gsub(/\_mailer/i, '') +        end      end    end  end diff --git a/railties/lib/rails/generators/test_unit/mailer/templates/functional_test.rb b/railties/lib/rails/generators/test_unit/mailer/templates/functional_test.rb index 7e204105a3..a2f2d30de5 100644 --- a/railties/lib/rails/generators/test_unit/mailer/templates/functional_test.rb +++ b/railties/lib/rails/generators/test_unit/mailer/templates/functional_test.rb @@ -1,10 +1,10 @@  require 'test_helper'  <% module_namespacing do -%> -class <%= class_name %>Test < ActionMailer::TestCase +class <%= class_name %>MailerTest < ActionMailer::TestCase  <% actions.each do |action| -%>    test "<%= action %>" do -    mail = <%= class_name %>.<%= action %> +    mail = <%= class_name %>Mailer.<%= action %>      assert_equal <%= action.to_s.humanize.inspect %>, mail.subject      assert_equal ["to@example.org"], mail.to      assert_equal ["from@example.com"], mail.from diff --git a/railties/lib/rails/generators/test_unit/mailer/templates/preview.rb b/railties/lib/rails/generators/test_unit/mailer/templates/preview.rb index 3bfd5426e8..6b85764a66 100644 --- a/railties/lib/rails/generators/test_unit/mailer/templates/preview.rb +++ b/railties/lib/rails/generators/test_unit/mailer/templates/preview.rb @@ -1,11 +1,11 @@  <% module_namespacing do -%>  # Preview all emails at http://localhost:3000/rails/mailers/<%= file_path %> -class <%= class_name %>Preview < ActionMailer::Preview +class <%= class_name %>MailerPreview < ActionMailer::Preview  <% actions.each do |action| -%>    # Preview this email at http://localhost:3000/rails/mailers/<%= file_path %>/<%= action %>    def <%= action %> -    <%= class_name %>.<%= action %> +    <%= class_name %>Mailer.<%= action %>    end  <% end -%> diff --git a/railties/lib/rails/generators/test_unit/model/templates/fixtures.yml b/railties/lib/rails/generators/test_unit/model/templates/fixtures.yml index f19e9d1d87..50ca61a35b 100644 --- a/railties/lib/rails/generators/test_unit/model/templates/fixtures.yml +++ b/railties/lib/rails/generators/test_unit/model/templates/fixtures.yml @@ -5,6 +5,8 @@  <% attributes.each do |attribute| -%>    <%- if attribute.password_digest? -%>    password_digest: <%%= BCrypt::Password.create('secret') %> +  <%- elsif attribute.reference? -%> +  <%= yaml_key_value(attribute.column_name.sub(/_id$/, ''), attribute.default) %>    <%- else -%>    <%= yaml_key_value(attribute.column_name, attribute.default) %>    <%- end -%> diff --git a/railties/lib/rails/generators/test_unit/scaffold/templates/functional_test.rb b/railties/lib/rails/generators/test_unit/scaffold/templates/functional_test.rb index 18bd1ece9d..8d825ae7b0 100644 --- a/railties/lib/rails/generators/test_unit/scaffold/templates/functional_test.rb +++ b/railties/lib/rails/generators/test_unit/scaffold/templates/functional_test.rb @@ -19,30 +19,30 @@ class <%= controller_class_name %>ControllerTest < ActionController::TestCase    test "should create <%= singular_table_name %>" do      assert_difference('<%= class_name %>.count') do -      post :create, <%= "#{singular_table_name}: { #{attributes_hash} }" %> +      post :create, params: { <%= "#{singular_table_name}: { #{attributes_hash} }" %> }      end      assert_redirected_to <%= singular_table_name %>_path(assigns(:<%= singular_table_name %>))    end    test "should show <%= singular_table_name %>" do -    get :show, id: <%= "@#{singular_table_name}" %> +    get :show, params: { id: <%= "@#{singular_table_name}" %> }      assert_response :success    end    test "should get edit" do -    get :edit, id: <%= "@#{singular_table_name}" %> +    get :edit, params: { id: <%= "@#{singular_table_name}" %> }      assert_response :success    end    test "should update <%= singular_table_name %>" do -    patch :update, id: <%= "@#{singular_table_name}" %>, <%= "#{singular_table_name}: { #{attributes_hash} }" %> +    patch :update, params: { id: <%= "@#{singular_table_name}" %>, <%= "#{singular_table_name}: { #{attributes_hash} }" %> }      assert_redirected_to <%= singular_table_name %>_path(assigns(:<%= singular_table_name %>))    end    test "should destroy <%= singular_table_name %>" do      assert_difference('<%= class_name %>.count', -1) do -      delete :destroy, id: <%= "@#{singular_table_name}" %> +      delete :destroy, params: { id: <%= "@#{singular_table_name}" %> }      end      assert_redirected_to <%= index_helper %>_path diff --git a/railties/lib/rails/generators/testing/behaviour.rb b/railties/lib/rails/generators/testing/behaviour.rb index fd2ea274e1..c9700e1cd7 100644 --- a/railties/lib/rails/generators/testing/behaviour.rb +++ b/railties/lib/rails/generators/testing/behaviour.rb @@ -2,6 +2,7 @@ require 'active_support/core_ext/class/attribute'  require 'active_support/core_ext/module/delegation'  require 'active_support/core_ext/hash/reverse_merge'  require 'active_support/core_ext/kernel/reporting' +require 'active_support/testing/stream'  require 'active_support/concern'  require 'rails/generators' @@ -10,6 +11,7 @@ module Rails      module Testing        module Behaviour          extend ActiveSupport::Concern +        include ActiveSupport::Testing::Stream          included do            class_attribute :destination_root, :current_path, :generator_class, :default_arguments @@ -101,22 +103,6 @@ module Rails              Dir.glob("#{dirname}/[0-9]*_*.rb").grep(/\d+_#{file_name}.rb$/).first            end -          def capture(stream) -            stream = stream.to_s -            captured_stream = Tempfile.new(stream) -            stream_io = eval("$#{stream}") -            origin_stream = stream_io.dup -            stream_io.reopen(captured_stream) - -            yield - -            stream_io.rewind -            return captured_stream.read -          ensure -            captured_stream.close -            captured_stream.unlink -            stream_io.reopen(origin_stream) -          end        end      end    end diff --git a/railties/lib/rails/info.rb b/railties/lib/rails/info.rb index 357aebf584..5909446b66 100644 --- a/railties/lib/rails/info.rb +++ b/railties/lib/rails/info.rb @@ -1,11 +1,14 @@  require "cgi"  module Rails +  # This module helps build the runtime properties used to display in the +  # Rails::InfoController responses. Including the active Rails version, Ruby +  # version, Rack version, and so on.    module Info      mattr_accessor :properties      class << (@@properties = [])        def names -        map {|val| val.first } +        map(&:first)        end        def value_for(property_name) @@ -23,7 +26,7 @@ module Rails        end        def to_s -        column_width = properties.names.map {|name| name.length}.max +        column_width = properties.names.map(&:length).max          info = properties.map do |name, value|            value = value.join(", ") if value.is_a?(Array)            "%-#{column_width}s   %s" % [name, value] diff --git a/railties/lib/rails/paths.rb b/railties/lib/rails/paths.rb index 3eb66c07af..5458036219 100644 --- a/railties/lib/rails/paths.rb +++ b/railties/lib/rails/paths.rb @@ -77,23 +77,23 @@ module Rails        end        def all_paths -        values.tap { |v| v.uniq! } +        values.tap(&:uniq!)        end        def autoload_once -        filter_by { |p| p.autoload_once? } +        filter_by(&:autoload_once?)        end        def eager_load -        filter_by { |p| p.eager_load? } +        filter_by(&:eager_load?)        end        def autoload_paths -        filter_by { |p| p.autoload? } +        filter_by(&:autoload?)        end        def load_paths -        filter_by { |p| p.load_path? } +        filter_by(&:load_path?)        end      private @@ -167,8 +167,8 @@ module Rails          @paths.concat paths        end -      def unshift(path) -        @paths.unshift path +      def unshift(*paths) +        @paths.unshift(*paths)        end        def to_ary diff --git a/railties/lib/rails/rack.rb b/railties/lib/rails/rack.rb index 886f0e52e1..a4c4527a72 100644 --- a/railties/lib/rails/rack.rb +++ b/railties/lib/rails/rack.rb @@ -1,7 +1,5 @@  module Rails    module Rack -    autoload :Debugger,      "rails/rack/debugger"   if RUBY_VERSION < '2.0.0' -    autoload :Logger,        "rails/rack/logger" -    autoload :LogTailer,     "rails/rack/log_tailer" +    autoload :Logger, "rails/rack/logger"    end  end diff --git a/railties/lib/rails/rack/debugger.rb b/railties/lib/rails/rack/debugger.rb index f7b77bcb3b..1fde3db070 100644 --- a/railties/lib/rails/rack/debugger.rb +++ b/railties/lib/rails/rack/debugger.rb @@ -1,24 +1,3 @@ -module Rails -  module Rack -    class Debugger -      def initialize(app) -        @app = app +require 'active_support/deprecation' -        ARGV.clear # clear ARGV so that rails server options aren't passed to IRB - -        require 'debugger' - -        ::Debugger.start -        ::Debugger.settings[:autoeval] = true if ::Debugger.respond_to?(:settings) -        puts "=> Debugger enabled" -      rescue LoadError -        puts "You're missing the 'debugger' gem. Add it to your Gemfile, bundle it and try again." -        exit(1) -      end - -      def call(env) -        @app.call(env) -      end -    end -  end -end +ActiveSupport::Deprecation.warn("This file is deprecated and will be removed in Rails 5.1 with no replacement.") diff --git a/railties/lib/rails/rack/log_tailer.rb b/railties/lib/rails/rack/log_tailer.rb deleted file mode 100644 index 46517713c9..0000000000 --- a/railties/lib/rails/rack/log_tailer.rb +++ /dev/null @@ -1,38 +0,0 @@ -require 'active_support/deprecation' - -module Rails -  module Rack -    class LogTailer -      def initialize(app, log = nil) -        ActiveSupport::Deprecation.warn('LogTailer is deprecated and will be removed on Rails 5.') - -        @app = app - -        path = Pathname.new(log || "#{::File.expand_path(Rails.root)}/log/#{Rails.env}.log").cleanpath - -        @cursor = @file = nil -        if ::File.exist?(path) -          @cursor = ::File.size(path) -          @file = ::File.open(path, 'r') -        end -      end - -      def call(env) -        response = @app.call(env) -        tail! -        response -      end - -      def tail! -        return unless @cursor -        @file.seek @cursor - -        unless @file.eof? -          contents = @file.read -          @cursor = @file.tell -          $stdout.print contents -        end -      end -    end -  end -end diff --git a/railties/lib/rails/railtie.rb b/railties/lib/rails/railtie.rb index 2b33beaa2b..8c24d1d56d 100644 --- a/railties/lib/rails/railtie.rb +++ b/railties/lib/rails/railtie.rb @@ -93,7 +93,7 @@ module Rails    #     end    #   end    # -  # By default, Rails load generators from your load path. However, if you want to place +  # By default, Rails loads generators from your load path. However, if you want to place    # your generators at a different location, you can specify in your Railtie a block which    # will load them during normal generators lookup:    # diff --git a/railties/lib/rails/ruby_version_check.rb b/railties/lib/rails/ruby_version_check.rb index df74643a59..aea3d2339c 100644 --- a/railties/lib/rails/ruby_version_check.rb +++ b/railties/lib/rails/ruby_version_check.rb @@ -1,13 +1,13 @@ -if RUBY_VERSION < '1.9.3' +if RUBY_VERSION < '2.2.0'    desc = defined?(RUBY_DESCRIPTION) ? RUBY_DESCRIPTION : "ruby #{RUBY_VERSION} (#{RUBY_RELEASE_DATE})"    abort <<-end_message -    Rails 4 prefers to run on Ruby 2.1 or newer. +    Rails 5 requires to run on Ruby 2.2.0 or newer.      You're running        #{desc} -    Please upgrade to Ruby 1.9.3 or newer to continue. +    Please upgrade to Ruby 2.2.0 or newer to continue.    end_message  end diff --git a/railties/lib/rails/source_annotation_extractor.rb b/railties/lib/rails/source_annotation_extractor.rb index 201532d299..9b058a1848 100644 --- a/railties/lib/rails/source_annotation_extractor.rb +++ b/railties/lib/rails/source_annotation_extractor.rb @@ -80,9 +80,8 @@ class SourceAnnotationExtractor    # Returns a hash that maps filenames under +dir+ (recursively) to arrays    # with their annotations. Only files with annotations are included. Files -  # with extension +.builder+, +.rb+, +.erb+, +.haml+, +.slim+, +.css+, -  # +.scss+, +.js+, +.coffee+, +.rake+, +.sass+ and +.less+ -  # are taken into account. +  # with extension +.builder+, +.rb+, +.rake+, +.yml+, +.yaml+, +.ruby+, +  # +.css+, +.js+ and +.erb+ are taken into account.    def find_in(dir)      results = {} diff --git a/railties/lib/rails/tasks.rb b/railties/lib/rails/tasks.rb index af5f2707b1..945fbdb3e2 100644 --- a/railties/lib/rails/tasks.rb +++ b/railties/lib/rails/tasks.rb @@ -1,7 +1,8 @@ +require 'rake' +  # Load Rails Rakefile extensions  %w(    annotations -  documentation    framework    log    middleware diff --git a/railties/lib/rails/tasks/documentation.rake b/railties/lib/rails/tasks/documentation.rake deleted file mode 100644 index 8544890553..0000000000 --- a/railties/lib/rails/tasks/documentation.rake +++ /dev/null @@ -1,70 +0,0 @@ -begin -  require 'rdoc/task' -rescue LoadError -  # Rubinius installs RDoc as a gem, and for this interpreter "rdoc/task" is -  # available only if the application bundle includes "rdoc" (normally as a -  # dependency of the "sdoc" gem.) -  # -  # If RDoc is not available it is fine that we do not generate the tasks that -  # depend on it. Just be robust to this gotcha and go on. -else -  require 'rails/api/task' - -  # Monkey-patch to remove redoc'ing and clobber descriptions to cut down on rake -T noise -  class RDocTaskWithoutDescriptions < RDoc::Task -    include ::Rake::DSL - -    def define -      task rdoc_task_name - -      task rerdoc_task_name => [clobber_task_name, rdoc_task_name] - -      task clobber_task_name do -        rm_r rdoc_dir rescue nil -      end - -      task :clobber => [clobber_task_name] - -      directory @rdoc_dir -      task rdoc_task_name => [rdoc_target] -      file rdoc_target => @rdoc_files + [Rake.application.rakefile] do -        rm_r @rdoc_dir rescue nil -        @before_running_rdoc.call if @before_running_rdoc -        args = option_list + @rdoc_files -        if @external -          argstring = args.join(' ') -          sh %{ruby -Ivendor vendor/rd #{argstring}} -        else -          require 'rdoc/rdoc' -          RDoc::RDoc.new.document(args) -        end -      end -      self -    end -  end - -  namespace :doc do -    RDocTaskWithoutDescriptions.new("app") { |rdoc| -      rdoc.rdoc_dir = 'doc/app' -      rdoc.template = ENV['template'] if ENV['template'] -      rdoc.title    = ENV['title'] || "Rails Application Documentation" -      rdoc.options << '--line-numbers' -      rdoc.options << '--charset' << 'utf-8' -      rdoc.rdoc_files.include('README.rdoc') -      rdoc.rdoc_files.include('app/**/*.rb') -      rdoc.rdoc_files.include('lib/**/*.rb') -    } -    Rake::Task['doc:app'].comment = "Generate docs for the app -- also available doc:rails, doc:guides (options: TEMPLATE=/rdoc-template.rb, TITLE=\"Custom Title\")" - -    # desc 'Generate documentation for the Rails framework.' -    Rails::API::AppTask.new('rails') -  end -end - -namespace :doc do -  task :guides do -    rails_gem_dir = Gem::Specification.find_by_name("rails").gem_dir -    require File.expand_path(File.join(rails_gem_dir, "/guides/rails_guides")) -    RailsGuides::Generator.new(Rails.root.join("doc/guides")).generate -  end -end diff --git a/railties/lib/rails/tasks/statistics.rake b/railties/lib/rails/tasks/statistics.rake index b94cd244be..735c36eb3a 100644 --- a/railties/lib/rails/tasks/statistics.rake +++ b/railties/lib/rails/tasks/statistics.rake @@ -1,6 +1,6 @@ -# while having global constant is not good, -# many 3rd party tools depend on it, like rspec-rails, cucumber-rails, etc -# so if will be removed - deprecation warning is needed +# While global constants are bad, many 3rd party tools depend on this one (e.g +# rspec-rails & cucumber-rails). So a deprecation warning is needed if we want +# to remove it.  STATS_DIRECTORIES = [    %w(Controllers        app/controllers),    %w(Helpers            app/helpers), @@ -14,10 +14,9 @@ STATS_DIRECTORIES = [    %w(Helper\ tests      test/helpers),    %w(Model\ tests       test/models),    %w(Mailer\ tests      test/mailers), +  %w(Job\ tests         test/jobs),    %w(Integration\ tests test/integration), -  %w(Functional\ tests\ (old)  test/functional), -  %w(Unit\ tests \ (old)       test/unit) -].collect do |name, dir|  +].collect do |name, dir|    [ name, "#{File.dirname(Rake.application.rakefile_location)}/#{dir}" ]  end.select { |name, dir| File.directory?(dir) } diff --git a/railties/lib/rails/tasks/tmp.rake b/railties/lib/rails/tasks/tmp.rake index 116988665f..9162ef234a 100644 --- a/railties/lib/rails/tasks/tmp.rake +++ b/railties/lib/rails/tasks/tmp.rake @@ -1,9 +1,8 @@  namespace :tmp do -  desc "Clear session, cache, and socket files from tmp/ (narrow w/ tmp:sessions:clear, tmp:cache:clear, tmp:sockets:clear)" -  task clear: [ "tmp:sessions:clear",  "tmp:cache:clear", "tmp:sockets:clear"] +  desc "Clear cache and socket files from tmp/ (narrow w/ tmp:cache:clear, tmp:sockets:clear)" +  task clear: ["tmp:cache:clear", "tmp:sockets:clear"] -  tmp_dirs = [ 'tmp/sessions', -               'tmp/cache', +  tmp_dirs = [ 'tmp/cache',                 'tmp/sockets',                 'tmp/pids',                 'tmp/cache/assets/development', @@ -12,16 +11,9 @@ namespace :tmp do    tmp_dirs.each { |d| directory d } -  desc "Creates tmp directories for sessions, cache, sockets, and pids" +  desc "Creates tmp directories for cache, sockets, and pids"    task create: tmp_dirs -  namespace :sessions do -    # desc "Clears all files in tmp/sessions" -    task :clear do -      FileUtils.rm(Dir['tmp/sessions/[^.]*']) -    end -  end -    namespace :cache do      # desc "Clears all files and directories in tmp/cache"      task :clear do diff --git a/railties/lib/rails/templates/rails/mailers/email.html.erb b/railties/lib/rails/templates/rails/mailers/email.html.erb index 1dc1d70f8d..0b08a01896 100644 --- a/railties/lib/rails/templates/rails/mailers/email.html.erb +++ b/railties/lib/rails/templates/rails/mailers/email.html.erb @@ -2,6 +2,10 @@  <html><head>  <meta name="viewport" content="width=device-width" />  <style type="text/css"> +  html, body, iframe { +    height: 100%; +  } +    body {      margin: 0;    } @@ -38,7 +42,6 @@    iframe {      border: 0;      width: 100%; -    height: 800px;    }  </style>  </head> diff --git a/railties/lib/rails/templates/rails/welcome/index.html.erb b/railties/lib/rails/templates/rails/welcome/index.html.erb index 89792066d5..6726c23fc9 100644 --- a/railties/lib/rails/templates/rails/welcome/index.html.erb +++ b/railties/lib/rails/templates/rails/welcome/index.html.erb @@ -237,7 +237,7 @@            <ol>              <li> -              <h2>Use <code>rails generate</code> to create your models and controllers</h2> +              <h2>Use <code>bin/rails generate</code> to create your models and controllers</h2>                <p>To see all available options, run it without parameters.</p>              </li> diff --git a/railties/lib/rails/test_help.rb b/railties/lib/rails/test_help.rb index c837fadb40..40a1915b54 100644 --- a/railties/lib/rails/test_help.rb +++ b/railties/lib/rails/test_help.rb @@ -21,6 +21,7 @@ if defined?(ActiveRecord::Base)    class ActiveSupport::TestCase      include ActiveRecord::TestFixtures      self.fixture_path = "#{Rails.root}/test/fixtures/" +    self.file_fixture_path = self.fixture_path + "files"    end    ActionDispatch::IntegrationTest.fixture_path = ActiveSupport::TestCase.fixture_path diff --git a/railties/lib/rails/test_unit/testing.rake b/railties/lib/rails/test_unit/testing.rake index 957deb8a60..d836c0d6d6 100644 --- a/railties/lib/rails/test_unit/testing.rake +++ b/railties/lib/rails/test_unit/testing.rake @@ -3,28 +3,23 @@ require 'rails/test_unit/sub_test_task'  task default: :test -desc 'Runs test:units, test:functionals, test:generators, test:integration, test:jobs together' +desc "Runs all tests in test folder"  task :test do    Rails::TestTask.test_creator(Rake.application.top_level_tasks).invoke_rake_task  end  namespace :test do    task :prepare do -    # Placeholder task for other Railtie and plugins to enhance. See Active Record for an example. +    # Placeholder task for other Railtie and plugins to enhance. +    # If used with Active Record, this task runs before the database schema is synchronized.    end -  task :run => ['test:units', 'test:functionals', 'test:generators', 'test:integration', 'test:jobs'] - -  # Inspired by: http://ngauthier.com/2012/02/quick-tests-with-bash.html -  desc "Run tests quickly by merging all types and not resetting db" -  Rails::TestTask.new(:all) do |t| +  Rails::TestTask.new(:run) do |t|      t.pattern = "test/**/*_test.rb"    end -  namespace :all do -    desc "Run tests quickly, but also reset db" -    task :db => %w[db:test:prepare test:all] -  end +  desc "Run tests quickly, but also reset db" +  task :db => %w[db:test:prepare test]    Rails::TestTask.new(single: "test:prepare")  | 
