Skip to content

HTTPS clone URL

Subversion checkout URL

You can clone with
or
.
Download ZIP
Browse files

Clean up the generator, switch to assets usage, use vendor/assets for…

… the default scripts, and more
  • Loading branch information...
commit 6d5e86eb6be6ee925a835bf248c0932945cbc54c 1 parent 101406d
@dhh dhh authored
Showing with 445 additions and 46 deletions.
  1. +403 −0 railties/lib/rails/generators/app_base.rb
  2. +31 −39 railties/lib/rails/generators/rails/app/app_generator.rb
  3. +2 −0  railties/lib/rails/generators/rails/app/templates/app/assets/javascripts/application.js
  4. +1 −0  railties/lib/rails/generators/rails/app/templates/app/assets/stylesheets/application.css
  5. +0 −5 railties/lib/rails/generators/rails/app/templates/config/application.rb
  6. +8 −0 railties/lib/rails/generators/rails/app/templates/config/initializers/new_rails_defaults.rb.tt
  7. +0 −2  railties/lib/rails/generators/rails/app/templates/public/javascripts/application.js
  8. 0  railties/lib/rails/generators/rails/app/templates/{public → vendor/assets}/javascripts/controls.js
  9. 0  railties/lib/rails/generators/rails/app/templates/{public → vendor/assets}/javascripts/dragdrop.js
  10. 0  railties/lib/rails/generators/rails/app/templates/{public → vendor/assets}/javascripts/effects.js
  11. 0  railties/lib/rails/generators/rails/app/templates/{public → vendor/assets}/javascripts/jquery.js
  12. 0  railties/lib/rails/generators/rails/app/templates/{public → vendor/assets}/javascripts/jquery_ujs.js
  13. 0  railties/lib/rails/generators/rails/app/templates/{public → vendor/assets}/javascripts/prototype.js
  14. 0  railties/lib/rails/generators/rails/app/templates/{public → vendor/assets}/javascripts/prototype_ujs.js
View
403 railties/lib/rails/generators/app_base.rb
@@ -177,6 +177,409 @@ def dev_or_edge?
def empty_directory_with_gitkeep(destination, config = {})
empty_directory(destination, config)
+ git_keep(destination)
+ end
+
+ def git_keep(destination)
+ create_file("#{destination}/.gitkeep") unless options[:skip_git]
+ end
+
+ # Returns Ruby 1.9 style key-value pair if current code is running on
+ # Ruby 1.9.x. Returns the old-style (with hash rocket) otherwise.
+ def key_value(key, value)
+ if options[:old_style_hash] || RUBY_VERSION < '1.9'
+ ":#{key} => #{value}"
+ else
+ "#{key}: #{value}"
+ end
+ end
+ end
+ end
+end
+require 'digest/md5'
+require 'active_support/secure_random'
+require 'active_support/core_ext/string/strip'
+require 'rails/version' unless defined?(Rails::VERSION)
+require 'rbconfig'
+require 'open-uri'
+require 'uri'
+
+module Rails
+ module Generators
+ class AppBase < Base
+ DATABASES = %w( mysql oracle postgresql sqlite3 frontbase ibm_db )
+ JAVASCRIPTS = %w( jquery prototype )
+
+ attr_accessor :rails_template
+ add_shebang_option!
+
+ argument :app_path, :type => :string
+
+ def self.add_shared_options_for(name)
+ class_option :builder, :type => :string, :aliases => "-b",
+ :desc => "Path to a #{name} builder (can be a filesystem path or URL)"
+
+ class_option :template, :type => :string, :aliases => "-m",
+ :desc => "Path to an #{name} template (can be a filesystem path or URL)"
+
+ class_option :skip_gemfile, :type => :boolean, :default => false,
+ :desc => "Don't create a Gemfile"
+
+ class_option :skip_git, :type => :boolean, :aliases => "-G", :default => false,
+ :desc => "Skip Git ignores and keeps"
+
+ class_option :skip_active_record, :type => :boolean, :aliases => "-O", :default => false,
+ :desc => "Skip Active Record files"
+
+ class_option :database, :type => :string, :aliases => "-d", :default => "sqlite3",
+ :desc => "Preconfigure for selected database (options: #{DATABASES.join('/')})"
+
+ class_option :javascript, :type => :string, :aliases => "-j", :default => "jquery",
+ :desc => "Preconfigure for selected JavaScript library (options: #{JAVASCRIPTS.join('/')})"
+
+ class_option :skip_javascript, :type => :boolean, :aliases => "-J", :default => false,
+ :desc => "Skip JavaScript files"
+
+ class_option :dev, :type => :boolean, :default => false,
+ :desc => "Setup the #{name} with Gemfile pointing to your Rails checkout"
+
+ class_option :edge, :type => :boolean, :default => false,
+ :desc => "Setup the #{name} with Gemfile pointing to Rails repository"
+
+ class_option :skip_test_unit, :type => :boolean, :aliases => "-T", :default => false,
+ :desc => "Skip Test::Unit files"
+
+ class_option :help, :type => :boolean, :aliases => "-h", :group => :rails,
+ :desc => "Show this help message and quit"
+
+ class_option :old_style_hash, :type => :boolean, :default => false,
+ :desc => "Force using old style hash (:foo => 'bar') on Ruby >= 1.9"
+ end
+
+ def initialize(*args)
+ @original_wd = Dir.pwd
+
+ super
+ end
+
+ protected
+
+ def builder
+ @builder ||= begin
+ if path = options[:builder]
+ if URI(path).is_a?(URI::HTTP)
+ contents = open(path, "Accept" => "application/x-thor-template") {|io| io.read }
+ else
+ contents = open(File.expand_path(path, @original_wd)) {|io| io.read }
+ end
+
+ prok = eval("proc { #{contents} }", TOPLEVEL_BINDING, path, 1)
+ instance_eval(&prok)
+ end
+
+ builder_class = get_builder_class
+ builder_class.send(:include, ActionMethods)
+ builder_class.new(self)
+ end
+ end
+
+ def build(meth, *args)
+ builder.send(meth, *args) if builder.respond_to?(meth)
+ end
+
+ def create_root
+ self.destination_root = File.expand_path(app_path, destination_root)
+ valid_const?
+
+ empty_directory '.'
+ set_default_accessors!
+ FileUtils.cd(destination_root) unless options[:pretend]
+ end
+
+ def apply_rails_template
+ apply rails_template if rails_template
+ rescue Thor::Error, LoadError, Errno::ENOENT => e
+ raise Error, "The template [#{rails_template}] could not be loaded. Error: #{e}"
+ end
+
+ def set_default_accessors!
+ self.rails_template = case options[:template]
+ when /^https?:\/\//
+ options[:template]
+ when String
+ File.expand_path(options[:template], Dir.pwd)
+ else
+ options[:template]
+ end
+ end
+
+ def database_gemfile_entry
+ entry = options[:skip_active_record] ? "" : "gem '#{gem_for_database}'"
+ if options[:database] == 'mysql'
+ if options.dev? || options.edge?
+ entry += ", :git => 'git://github.com/brianmario/mysql2.git'"
+ else
+ entry += "\n# gem 'mysql2', :git => 'git://github.com/brianmario/mysql2.git'"
+ end
+ end
+ entry
+ end
+
+ def rails_gemfile_entry
+ if options.dev?
+ <<-GEMFILE.strip_heredoc
+ gem 'rails', :path => '#{Rails::Generators::RAILS_DEV_PATH}'
+ gem 'arel', :git => 'git://github.com/rails/arel.git'
+ gem 'rack', :git => 'git://github.com/rack/rack.git'
+ gem 'sprockets', :git => "git://github.com/sstephenson/sprockets.git"
+ gem 'json' # Sprockets dependency
+ GEMFILE
+ elsif options.edge?
+ <<-GEMFILE.strip_heredoc
+ gem 'rails', :git => 'git://github.com/rails/rails.git'
+ gem 'arel', :git => 'git://github.com/rails/arel.git'
+ gem 'rack', :git => 'git://github.com/rack/rack.git'
+ gem 'sprockets', :git => "git://github.com/sstephenson/sprockets.git"
+ gem 'json' # Sprockets dependency
+ GEMFILE
+ else
+ <<-GEMFILE.strip_heredoc
+ gem 'rails', '#{Rails::VERSION::STRING}'
+
+ # Bundle edge Rails instead:
+ # gem 'rails', :git => 'git://github.com/rails/rails.git'
+ # gem 'arel', :git => 'git://github.com/rails/arel.git'
+ # gem 'rack', :git => 'git://github.com/rack/rack.git'
+ # gem 'sprockets', :git => "git://github.com/sstephenson/sprockets.git"
+ # gem 'json' # Sprockets dependency
+ GEMFILE
+ end
+ end
+
+ def gem_for_database
+ # %w( mysql oracle postgresql sqlite3 frontbase ibm_db )
+ case options[:database]
+ when "oracle" then "ruby-oci8"
+ when "postgresql" then "pg"
+ when "frontbase" then "ruby-frontbase"
+ when "mysql" then "mysql2"
+ else options[:database]
+ end
+ end
+
+ def bundle_if_dev_or_edge
+ bundle_command = File.basename(Thor::Util.ruby_command).sub(/ruby/, 'bundle')
+ run "#{bundle_command} install" if dev_or_edge?
+ end
+
+ def dev_or_edge?
+ options.dev? || options.edge?
+ end
+
+ def empty_directory_with_gitkeep(destination, config = {})
+ empty_directory(destination, config)
+ git_keep(destination)
+ end
+
+ def git_keep(destination)
+ create_file("#{destination}/.gitkeep") unless options[:skip_git]
+ end
+
+ # Returns Ruby 1.9 style key-value pair if current code is running on
+ # Ruby 1.9.x. Returns the old-style (with hash rocket) otherwise.
+ def key_value(key, value)
+ if options[:old_style_hash] || RUBY_VERSION < '1.9'
+ ":#{key} => #{value}"
+ else
+ "#{key}: #{value}"
+ end
+ end
+ end
+ end
+end
+require 'digest/md5'
+require 'active_support/secure_random'
+require 'active_support/core_ext/string/strip'
+require 'rails/version' unless defined?(Rails::VERSION)
+require 'rbconfig'
+require 'open-uri'
+require 'uri'
+
+module Rails
+ module Generators
+ class AppBase < Base
+ DATABASES = %w( mysql oracle postgresql sqlite3 frontbase ibm_db )
+ JAVASCRIPTS = %w( jquery prototype )
+
+ attr_accessor :rails_template
+ add_shebang_option!
+
+ argument :app_path, :type => :string
+
+ def self.add_shared_options_for(name)
+ class_option :builder, :type => :string, :aliases => "-b",
+ :desc => "Path to a #{name} builder (can be a filesystem path or URL)"
+
+ class_option :template, :type => :string, :aliases => "-m",
+ :desc => "Path to an #{name} template (can be a filesystem path or URL)"
+
+ class_option :skip_gemfile, :type => :boolean, :default => false,
+ :desc => "Don't create a Gemfile"
+
+ class_option :skip_git, :type => :boolean, :aliases => "-G", :default => false,
+ :desc => "Skip Git ignores and keeps"
+
+ class_option :skip_active_record, :type => :boolean, :aliases => "-O", :default => false,
+ :desc => "Skip Active Record files"
+
+ class_option :database, :type => :string, :aliases => "-d", :default => "sqlite3",
+ :desc => "Preconfigure for selected database (options: #{DATABASES.join('/')})"
+
+ class_option :javascript, :type => :string, :aliases => "-j", :default => "jquery",
+ :desc => "Preconfigure for selected JavaScript library (options: #{JAVASCRIPTS.join('/')})"
+
+ class_option :skip_javascript, :type => :boolean, :aliases => "-J", :default => false,
+ :desc => "Skip JavaScript files"
+
+ class_option :dev, :type => :boolean, :default => false,
+ :desc => "Setup the #{name} with Gemfile pointing to your Rails checkout"
+
+ class_option :edge, :type => :boolean, :default => false,
+ :desc => "Setup the #{name} with Gemfile pointing to Rails repository"
+
+ class_option :skip_test_unit, :type => :boolean, :aliases => "-T", :default => false,
+ :desc => "Skip Test::Unit files"
+
+ class_option :help, :type => :boolean, :aliases => "-h", :group => :rails,
+ :desc => "Show this help message and quit"
+
+ class_option :old_style_hash, :type => :boolean, :default => false,
+ :desc => "Force using old style hash (:foo => 'bar') on Ruby >= 1.9"
+ end
+
+ def initialize(*args)
+ @original_wd = Dir.pwd
+
+ super
+ end
+
+ protected
+
+ def builder
+ @builder ||= begin
+ if path = options[:builder]
+ if URI(path).is_a?(URI::HTTP)
+ contents = open(path, "Accept" => "application/x-thor-template") {|io| io.read }
+ else
+ contents = open(File.expand_path(path, @original_wd)) {|io| io.read }
+ end
+
+ prok = eval("proc { #{contents} }", TOPLEVEL_BINDING, path, 1)
+ instance_eval(&prok)
+ end
+
+ builder_class = get_builder_class
+ builder_class.send(:include, ActionMethods)
+ builder_class.new(self)
+ end
+ end
+
+ def build(meth, *args)
+ builder.send(meth, *args) if builder.respond_to?(meth)
+ end
+
+ def create_root
+ self.destination_root = File.expand_path(app_path, destination_root)
+ valid_const?
+
+ empty_directory '.'
+ set_default_accessors!
+ FileUtils.cd(destination_root) unless options[:pretend]
+ end
+
+ def apply_rails_template
+ apply rails_template if rails_template
+ rescue Thor::Error, LoadError, Errno::ENOENT => e
+ raise Error, "The template [#{rails_template}] could not be loaded. Error: #{e}"
+ end
+
+ def set_default_accessors!
+ self.rails_template = case options[:template]
+ when /^https?:\/\//
+ options[:template]
+ when String
+ File.expand_path(options[:template], Dir.pwd)
+ else
+ options[:template]
+ end
+ end
+
+ def database_gemfile_entry
+ entry = options[:skip_active_record] ? "" : "gem '#{gem_for_database}'"
+ if options[:database] == 'mysql'
+ if options.dev? || options.edge?
+ entry += ", :git => 'git://github.com/brianmario/mysql2.git'"
+ else
+ entry += "\n# gem 'mysql2', :git => 'git://github.com/brianmario/mysql2.git'"
+ end
+ end
+ entry
+ end
+
+ def rails_gemfile_entry
+ if options.dev?
+ <<-GEMFILE.strip_heredoc
+ gem 'rails', :path => '#{Rails::Generators::RAILS_DEV_PATH}'
+ gem 'arel', :git => 'git://github.com/rails/arel.git'
+ gem 'rack', :git => 'git://github.com/rack/rack.git'
+ gem 'sprockets', :git => "git://github.com/sstephenson/sprockets.git"
+ GEMFILE
+ elsif options.edge?
+ <<-GEMFILE.strip_heredoc
+ gem 'rails', :git => 'git://github.com/rails/rails.git'
+ gem 'arel', :git => 'git://github.com/rails/arel.git'
+ gem 'rack', :git => 'git://github.com/rack/rack.git'
+ gem 'sprockets', :git => "git://github.com/sstephenson/sprockets.git"
+ GEMFILE
+ else
+ <<-GEMFILE.strip_heredoc
+ gem 'rails', '#{Rails::VERSION::STRING}'
+
+ # Bundle edge Rails instead:
+ # gem 'rails', :git => 'git://github.com/rails/rails.git'
+ # gem 'arel', :git => 'git://github.com/rails/arel.git'
+ # gem 'rack', :git => 'git://github.com/rack/rack.git'
+ # gem 'sprockets', :git => "git://github.com/sstephenson/sprockets.git"
+ GEMFILE
+ end
+ end
+
+ def gem_for_database
+ # %w( mysql oracle postgresql sqlite3 frontbase ibm_db )
+ case options[:database]
+ when "oracle" then "ruby-oci8"
+ when "postgresql" then "pg"
+ when "frontbase" then "ruby-frontbase"
+ when "mysql" then "mysql2"
+ else options[:database]
+ end
+ end
+
+ def bundle_if_dev_or_edge
+ bundle_command = File.basename(Thor::Util.ruby_command).sub(/ruby/, 'bundle')
+ run "#{bundle_command} install" if dev_or_edge?
+ end
+
+ def dev_or_edge?
+ options.dev? || options.edge?
+ end
+
+ def empty_directory_with_gitkeep(destination, config = {})
+ empty_directory(destination, config)
+ git_keep(destination)
+ end
+
+ def git_keep(destination)
create_file("#{destination}/.gitkeep") unless options[:skip_git]
end
View
70 railties/lib/rails/generators/rails/app/app_generator.rb
@@ -46,6 +46,8 @@ def gitignore
def app
directory 'app'
+ git_keep 'app/mailers'
+ git_keep 'app/models'
end
def config
@@ -80,14 +82,7 @@ def lib
end
def log
- empty_directory "log"
-
- inside "log" do
- %w( server production development test ).each do |file|
- create_file "#{file}.log"
- chmod "#{file}.log", 0666, :verbose => false
- end
- end
+ empty_directory_with_gitkeep "log"
end
def public_directory
@@ -98,27 +93,6 @@ def images
directory "public/images"
end
- def stylesheets
- empty_directory_with_gitkeep "public/stylesheets"
- end
-
- def javascripts
- empty_directory "public/javascripts"
-
- unless options[:skip_javascript]
- copy_file "public/javascripts/#{options[:javascript]}.js"
- copy_file "public/javascripts/#{options[:javascript]}_ujs.js", "public/javascripts/rails.js"
-
- if options[:javascript] == "prototype"
- copy_file "public/javascripts/controls.js"
- copy_file "public/javascripts/dragdrop.js"
- copy_file "public/javascripts/effects.js"
- end
- end
-
- copy_file "public/javascripts/application.js"
- end
-
def script
directory "script" do |content|
"#{shebang}\n" + content
@@ -127,19 +101,38 @@ def script
end
def test
- directory "test"
+ empty_directory_with_gitkeep "test/fixtures"
+ empty_directory_with_gitkeep "test/functional"
+ empty_directory_with_gitkeep "test/integration"
+ empty_directory_with_gitkeep "test/unit"
+
+ #empty_directory "test/performance"
+ copy_file "test/performance/browsing_test.rb"
end
def tmp
- empty_directory "tmp"
+ empty_directory_with_gitkeep "tmp"
@sikachu Collaborator
sikachu added a note

This change here break the CI on middleware stack test :bomb:

If you look at https://github.com/rails/rails/blob/master/railties/lib/rails/application/configuration.rb#L92-100, you'll see that it tries to detect if tmp/cache is exists or not. It was exists to default so it will use :file_store as the default cache storage engine, hence ActiveSupport::Cache::Strategy::LocalCache will get added by default.

Currently the railties/application/middleware_test check the existance of that middleware in the stack. I don't know if your intention here is to disable the :file_store cache also or not, so I think I'll ask you first before I fix the CI. So please pick one either

A) You want it to defaults to :file_store, even the tmp/cache directory doesn't exists
B) You want it to defaults to :file_store, and bring back those tmp/* directories
C) You want it to defaults to :memory_store

I'll make a patch to fix it after your response.

@dhh Owner
dhh added a note
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
+ end
+
+ def vendor_javascripts
+ if options[:skip_javascript]
+ empty_directory_with_gitkeep "vendor/assets/javascripts"
+ else
+ copy_file "vendor/assets/javascripts/#{options[:javascript]}.js"
+ copy_file "vendor/assets/javascripts/#{options[:javascript]}_ujs.js"
- inside "tmp" do
- %w(sessions sockets cache pids).each do |dir|
- empty_directory(dir)
+ if options[:javascript] == "prototype"
+ copy_file "vendor/assets/javascripts/controls.js"
+ copy_file "vendor/assets/javascripts/dragdrop.js"
+ copy_file "vendor/assets/javascripts/effects.js"
end
end
end
+ def vendor_stylesheets
+ empty_directory_with_gitkeep "vendor/assets/stylesheets"
+ end
+
def vendor_plugins
empty_directory_with_gitkeep "vendor/plugins"
end
@@ -150,15 +143,14 @@ module Generators
# can change in Ruby 1.8.7 when we FileUtils.cd.
RAILS_DEV_PATH = File.expand_path("../../../../../..", File.dirname(__FILE__))
- RESERVED_NAMES = %w[application destroy benchmarker profiler
- plugin runner test]
+ RESERVED_NAMES = %w[application destroy benchmarker profiler plugin runner test]
class AppGenerator < AppBase
add_shared_options_for "application"
# Add bin/rails options
- class_option :version, :type => :boolean, :aliases => "-v", :group => :rails,
- :desc => "Show Rails version number and quit"
+ class_option :version, :type => :boolean, :aliases => "-v", :group => :rails,
+ :desc => "Show Rails version number and quit"
def initialize(*args)
raise Error, "Options should be given after the application name. For details run: rails --help" if args[0].blank?
@@ -246,7 +238,7 @@ def create_tmp_files
end
def create_vendor_files
- build(:vendor_plugins)
+ build(:vendor)
end
def finish_template
View
2  railties/lib/rails/generators/rails/app/templates/app/assets/javascripts/application.js
@@ -0,0 +1,2 @@
+// Place your application-specific JavaScript functions and classes here
+// FIXME: Tell people how Sprockets and Coffe works
View
1  railties/lib/rails/generators/rails/app/templates/app/assets/stylesheets/application.css
@@ -0,0 +1 @@
+/* Introduce SCSS & Sprockets */
View
5 railties/lib/rails/generators/rails/app/templates/config/application.rb
@@ -57,10 +57,5 @@ class Application < Rails::Application
# Configure sensitive parameters which will be filtered from the log file.
config.filter_parameters += [:password]
-
-<% unless options[:skip_active_record] -%>
- # Enable IdentityMap for Active Record, to disable set to false or remove the line below.
- config.active_record.identity_map = true
-<% end -%>
end
end
View
8 railties/lib/rails/generators/rails/app/templates/config/initializers/new_rails_defaults.rb.tt
@@ -0,0 +1,8 @@
+<%= app_const %>.configure do
+ config.assets.enabled = true
+
+<% unless options[:skip_active_record] -%>
+ # Enable IdentityMap for Active Record, to disable set to false or remove the line below.
+ config.active_record.identity_map = true
+<% end -%>
+end
View
2  railties/lib/rails/generators/rails/app/templates/public/javascripts/application.js
@@ -1,2 +0,0 @@
-// Place your application-specific JavaScript functions and classes here
-// This file is automatically included by javascript_include_tag :defaults
View
0  ...ails/app/templates/public/javascripts/controls.js → ...p/templates/vendor/assets/javascripts/controls.js
File renamed without changes
View
0  ...ails/app/templates/public/javascripts/dragdrop.js → ...p/templates/vendor/assets/javascripts/dragdrop.js
File renamed without changes
View
0  ...rails/app/templates/public/javascripts/effects.js → ...pp/templates/vendor/assets/javascripts/effects.js
File renamed without changes
View
0  .../rails/app/templates/public/javascripts/jquery.js → ...app/templates/vendor/assets/javascripts/jquery.js
File renamed without changes
View
0  ...ls/app/templates/public/javascripts/jquery_ujs.js → ...templates/vendor/assets/javascripts/jquery_ujs.js
File renamed without changes
View
0  ...ils/app/templates/public/javascripts/prototype.js → .../templates/vendor/assets/javascripts/prototype.js
File renamed without changes
View
0  ...app/templates/public/javascripts/prototype_ujs.js → ...plates/vendor/assets/javascripts/prototype_ujs.js
File renamed without changes
Please sign in to comment.
Something went wrong with that request. Please try again.