From 1b816d502444ce2b3153d8c689d0057f1c257eee Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jos=C3=A9=20Valim?= Date: Thu, 29 Apr 2010 08:39:44 +0200 Subject: The rake task :environment now loads config/environment.rb instead of initializing the application on its own. This fixes [#4492 state:resolved] and also avoids the application being initialized twice in some rake tasks. --- railties/lib/rails/application.rb | 4 +- railties/lib/rails/application/bootstrap.rb | 3 +- railties/lib/rails/application/configuration.rb | 17 ++-- railties/lib/rails/commands.rb | 102 ++++++++++----------- railties/lib/rails/commands/benchmarker.rb | 23 +++++ .../lib/rails/commands/performance/benchmarker.rb | 23 ----- .../lib/rails/commands/performance/profiler.rb | 46 ---------- railties/lib/rails/commands/profiler.rb | 46 ++++++++++ railties/lib/rails/commands/runner.rb | 3 +- .../generators/rails/app/templates/script/rails | 7 +- 10 files changed, 134 insertions(+), 140 deletions(-) create mode 100644 railties/lib/rails/commands/benchmarker.rb delete mode 100644 railties/lib/rails/commands/performance/benchmarker.rb delete mode 100644 railties/lib/rails/commands/performance/profiler.rb create mode 100644 railties/lib/rails/commands/profiler.rb (limited to 'railties/lib/rails') diff --git a/railties/lib/rails/application.rb b/railties/lib/rails/application.rb index 7cec14c738..d39f9a2ae9 100644 --- a/railties/lib/rails/application.rb +++ b/railties/lib/rails/application.rb @@ -85,7 +85,7 @@ module Rails delegate :metal_loader, :to => :config def require_environment! - environment = config.paths.config.environment.to_a.first + environment = paths.config.environment.to_a.first require environment if environment end @@ -153,7 +153,7 @@ module Rails require "rails/tasks" task :environment do $rails_rake_task = true - initialize! + require_environment! end end diff --git a/railties/lib/rails/application/bootstrap.rb b/railties/lib/rails/application/bootstrap.rb index 06243f2e5e..022e1a91d8 100644 --- a/railties/lib/rails/application/bootstrap.rb +++ b/railties/lib/rails/application/bootstrap.rb @@ -6,7 +6,8 @@ module Rails include Initializable initializer :load_environment_config do - require_environment! + environment = config.paths.config.environments.to_a.first + require environment if environment end initializer :load_all_active_support do diff --git a/railties/lib/rails/application/configuration.rb b/railties/lib/rails/application/configuration.rb index 874b3a78b6..a58f7e9079 100644 --- a/railties/lib/rails/application/configuration.rb +++ b/railties/lib/rails/application/configuration.rb @@ -43,14 +43,15 @@ module Rails @paths ||= begin paths = super paths.app.controllers << builtin_controller if builtin_controller - paths.config.database "config/database.yml" - paths.config.environment "config/environments", :glob => "#{Rails.env}.rb" - paths.lib.templates "lib/templates" - paths.log "log/#{Rails.env}.log" - paths.tmp "tmp" - paths.tmp.cache "tmp/cache" - paths.vendor "vendor", :load_path => true - paths.vendor.plugins "vendor/plugins" + paths.config.database "config/database.yml" + paths.config.environment "config/environment.rb" + paths.config.environments "config/environments", :glob => "#{Rails.env}.rb" + paths.lib.templates "lib/templates" + paths.log "log/#{Rails.env}.log" + paths.tmp "tmp" + paths.tmp.cache "tmp/cache" + paths.vendor "vendor", :load_path => true + paths.vendor.plugins "vendor/plugins" if File.exists?("#{root}/test/mocks/#{Rails.env}") ActiveSupport::Deprecation.warn "\"Rails.root/test/mocks/#{Rails.env}\" won't be added " << diff --git a/railties/lib/rails/commands.rb b/railties/lib/rails/commands.rb index 12748da18b..c8254f588f 100644 --- a/railties/lib/rails/commands.rb +++ b/railties/lib/rails/commands.rb @@ -1,8 +1,50 @@ -if ARGV.empty? - ARGV << '--help' -end +ARGV << '--help' if ARGV.empty? -HELP_TEXT = <<-EOT +aliases = { + "g" => "generate", + "c" => "console", + "s" => "server", + "db" => "dbconsole" +} + +command = ARGV.shift +command = aliases[command] || command + +case command +when 'generate', 'destroy', 'plugin', 'benchmarker', 'performance' + require APP_PATH + Rails::Application.require_environment! + require "rails/commands/#{command}" + +when 'console' + require 'rails/commands/console' + require APP_PATH + Rails::Application.require_environment! + Rails::Console.start(Rails::Application) + +when 'server' + require 'rails/commands/server' + Rails::Server.new.tap { |server| + require APP_PATH + Dir.chdir(Rails::Application.root) + server.start + } + +when 'dbconsole' + require 'rails/commands/dbconsole' + require APP_PATH + Rails::DBConsole.start(Rails::Application) + +when 'application', 'runner' + require "rails/commands/#{command}" + +when '--version', '-v' + ARGV.unshift '--version' + require 'rails/commands/application' + +else + puts "Error: Command not recognized" unless %w(-h --help).include?(command) + puts <<-EOT Usage: rails COMMAND [ARGS] The most common rails commands are: @@ -21,53 +63,5 @@ In addition to those, there are: runner Run a piece of code in the application environment All commands can be run with -h for more information. -EOT - - -case ARGV.shift -when 'g', 'generate' - require ENV_PATH - require 'rails/commands/generate' -when 'c', 'console' - require 'rails/commands/console' - require ENV_PATH - Rails::Console.start(Rails::Application) -when 's', 'server' - require 'rails/commands/server' - # Initialize the server first, so environment options are set - server = Rails::Server.new - require APP_PATH - - Dir.chdir(Rails::Application.root) - server.start -when 'db', 'dbconsole' - require 'rails/commands/dbconsole' - require APP_PATH - Rails::DBConsole.start(Rails::Application) - -when 'application' - require 'rails/commands/application' -when 'destroy' - require ENV_PATH - require 'rails/commands/destroy' -when 'benchmarker' - require ENV_PATH - require 'rails/commands/performance/benchmarker' -when 'profiler' - require ENV_PATH - require 'rails/commands/performance/profiler' -when 'plugin' - require APP_PATH - require 'rails/commands/plugin' -when 'runner' - require 'rails/commands/runner' - -when '--help', '-h' - puts HELP_TEXT -when '--version', '-v' - ARGV.unshift '--version' - require 'rails/commands/application' -else - puts "Error: Command not recognized" - puts HELP_TEXT -end + EOT +end \ No newline at end of file diff --git a/railties/lib/rails/commands/benchmarker.rb b/railties/lib/rails/commands/benchmarker.rb new file mode 100644 index 0000000000..0432261802 --- /dev/null +++ b/railties/lib/rails/commands/benchmarker.rb @@ -0,0 +1,23 @@ +if [nil, "-h", "--help"].include?(ARGV.first) + puts "Usage: rails benchmarker [times] 'Person.expensive_way' 'Person.another_expensive_way' ..." + exit 1 +end + +begin + N = Integer(ARGV.first) + ARGV.shift +rescue ArgumentError + N = 1 +end + +require 'benchmark' +include Benchmark + +# Don't include compilation in the benchmark +ARGV.each { |expression| eval(expression) } + +bm(6) do |x| + ARGV.each_with_index do |expression, idx| + x.report("##{idx + 1}") { N.times { eval(expression) } } + end +end diff --git a/railties/lib/rails/commands/performance/benchmarker.rb b/railties/lib/rails/commands/performance/benchmarker.rb deleted file mode 100644 index 0432261802..0000000000 --- a/railties/lib/rails/commands/performance/benchmarker.rb +++ /dev/null @@ -1,23 +0,0 @@ -if [nil, "-h", "--help"].include?(ARGV.first) - puts "Usage: rails benchmarker [times] 'Person.expensive_way' 'Person.another_expensive_way' ..." - exit 1 -end - -begin - N = Integer(ARGV.first) - ARGV.shift -rescue ArgumentError - N = 1 -end - -require 'benchmark' -include Benchmark - -# Don't include compilation in the benchmark -ARGV.each { |expression| eval(expression) } - -bm(6) do |x| - ARGV.each_with_index do |expression, idx| - x.report("##{idx + 1}") { N.times { eval(expression) } } - end -end diff --git a/railties/lib/rails/commands/performance/profiler.rb b/railties/lib/rails/commands/performance/profiler.rb deleted file mode 100644 index 6d9717b5cd..0000000000 --- a/railties/lib/rails/commands/performance/profiler.rb +++ /dev/null @@ -1,46 +0,0 @@ -if [nil, "-h", "--help"].include?(ARGV.first) - $stderr.puts "Usage: rails profiler 'Person.expensive_method(10)' [times] [flat|graph|graph_html]" - exit(1) -end - -# Define a method to profile. -if ARGV[1] and ARGV[1].to_i > 1 - eval "def profile_me() #{ARGV[1]}.times { #{ARGV[0]} } end" -else - eval "def profile_me() #{ARGV[0]} end" -end - -# Use the ruby-prof extension if available. Fall back to stdlib profiler. -begin - begin - require "ruby-prof" - $stderr.puts 'Using the ruby-prof extension.' - RubyProf.measure_mode = RubyProf::WALL_TIME - RubyProf.start - profile_me - results = RubyProf.stop - if ARGV[2] - printer_class = RubyProf.const_get((ARGV[2] + "_printer").classify) - else - printer_class = RubyProf::FlatPrinter - end - printer = printer_class.new(results) - printer.print($stderr) - rescue LoadError - require "prof" - $stderr.puts 'Using the old ruby-prof extension.' - Prof.clock_mode = Prof::GETTIMEOFDAY - Prof.start - profile_me - results = Prof.stop - require 'rubyprof_ext' - Prof.print_profile(results, $stderr) - end -rescue LoadError - require 'profiler' - $stderr.puts 'Using the standard Ruby profiler.' - Profiler__.start_profile - profile_me - Profiler__.stop_profile - Profiler__.print_profile($stderr) -end diff --git a/railties/lib/rails/commands/profiler.rb b/railties/lib/rails/commands/profiler.rb new file mode 100644 index 0000000000..6d9717b5cd --- /dev/null +++ b/railties/lib/rails/commands/profiler.rb @@ -0,0 +1,46 @@ +if [nil, "-h", "--help"].include?(ARGV.first) + $stderr.puts "Usage: rails profiler 'Person.expensive_method(10)' [times] [flat|graph|graph_html]" + exit(1) +end + +# Define a method to profile. +if ARGV[1] and ARGV[1].to_i > 1 + eval "def profile_me() #{ARGV[1]}.times { #{ARGV[0]} } end" +else + eval "def profile_me() #{ARGV[0]} end" +end + +# Use the ruby-prof extension if available. Fall back to stdlib profiler. +begin + begin + require "ruby-prof" + $stderr.puts 'Using the ruby-prof extension.' + RubyProf.measure_mode = RubyProf::WALL_TIME + RubyProf.start + profile_me + results = RubyProf.stop + if ARGV[2] + printer_class = RubyProf.const_get((ARGV[2] + "_printer").classify) + else + printer_class = RubyProf::FlatPrinter + end + printer = printer_class.new(results) + printer.print($stderr) + rescue LoadError + require "prof" + $stderr.puts 'Using the old ruby-prof extension.' + Prof.clock_mode = Prof::GETTIMEOFDAY + Prof.start + profile_me + results = Prof.stop + require 'rubyprof_ext' + Prof.print_profile(results, $stderr) + end +rescue LoadError + require 'profiler' + $stderr.puts 'Using the standard Ruby profiler.' + Profiler__.start_profile + profile_me + Profiler__.stop_profile + Profiler__.print_profile($stderr) +end diff --git a/railties/lib/rails/commands/runner.rb b/railties/lib/rails/commands/runner.rb index 1dd11e1241..278548558e 100644 --- a/railties/lib/rails/commands/runner.rb +++ b/railties/lib/rails/commands/runner.rb @@ -36,7 +36,8 @@ ARGV.delete(code_or_file) ENV["RAILS_ENV"] = options[:environment] -require ENV_PATH +require APP_PATH +Rails::Application.require_environment! begin if code_or_file.nil? diff --git a/railties/lib/rails/generators/rails/app/templates/script/rails b/railties/lib/rails/generators/rails/app/templates/script/rails index b01d1ee183..11bc1edde9 100644 --- a/railties/lib/rails/generators/rails/app/templates/script/rails +++ b/railties/lib/rails/generators/rails/app/templates/script/rails @@ -1,8 +1,5 @@ # This command will automatically be run when you run "rails" with Rails 3 gems installed from the root of your application. -ENV_PATH = File.expand_path('../../config/environment', __FILE__) -BOOT_PATH = File.expand_path('../../config/boot', __FILE__) -APP_PATH = File.expand_path('../../config/application', __FILE__) - -require BOOT_PATH +APP_PATH = File.expand_path('../../config/application', __FILE__) +require File.expand_path('../../config/boot', __FILE__) require 'rails/commands' -- cgit v1.2.3 From 1bea5c755c25cd90171477fe725e64b26395b810 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jos=C3=A9=20Valim?= Date: Thu, 29 Apr 2010 09:31:06 +0200 Subject: Ops. Rename performance to profiler. --- railties/lib/rails/commands.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'railties/lib/rails') diff --git a/railties/lib/rails/commands.rb b/railties/lib/rails/commands.rb index c8254f588f..de93a87615 100644 --- a/railties/lib/rails/commands.rb +++ b/railties/lib/rails/commands.rb @@ -11,7 +11,7 @@ command = ARGV.shift command = aliases[command] || command case command -when 'generate', 'destroy', 'plugin', 'benchmarker', 'performance' +when 'generate', 'destroy', 'plugin', 'benchmarker', 'profiler' require APP_PATH Rails::Application.require_environment! require "rails/commands/#{command}" -- cgit v1.2.3 From e9a9ef094e84abfe6a0167e9255abcf5b63412d9 Mon Sep 17 00:00:00 2001 From: Ravinder Singh Date: Fri, 16 Apr 2010 16:58:14 +0530 Subject: warn user if options are given before application name [#3435 state:resolved] MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: José Valim --- railties/lib/rails/generators/rails/app/app_generator.rb | 1 + 1 file changed, 1 insertion(+) (limited to 'railties/lib/rails') diff --git a/railties/lib/rails/generators/rails/app/app_generator.rb b/railties/lib/rails/generators/rails/app/app_generator.rb index aa066fe3c4..667a123025 100644 --- a/railties/lib/rails/generators/rails/app/app_generator.rb +++ b/railties/lib/rails/generators/rails/app/app_generator.rb @@ -55,6 +55,7 @@ module Rails::Generators :desc => "Show this help message and quit" def initialize(*args) + raise Error, "Options should be given after the application name. For details run: rails --help" if args[0].blank? super if !options[:skip_activerecord] && !DATABASES.include?(options[:database]) raise Error, "Invalid value for --database option. Supported for preconfiguration are: #{DATABASES.join(", ")}." -- cgit v1.2.3 From 3dfcb56e4585c8530be6dcc5129ae0c4d16c0dea Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jos=C3=A9=20Valim?= Date: Thu, 29 Apr 2010 13:24:24 +0200 Subject: ActiveRecord middlewares should be inserted before AD::Cascade [#4493 state:resolved]. --- railties/lib/rails/application/configuration.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'railties/lib/rails') diff --git a/railties/lib/rails/application/configuration.rb b/railties/lib/rails/application/configuration.rb index a58f7e9079..77f5eea3c4 100644 --- a/railties/lib/rails/application/configuration.rb +++ b/railties/lib/rails/application/configuration.rb @@ -143,7 +143,7 @@ module Rails middleware.use('::Rack::Runtime') middleware.use('::Rails::Rack::Logger') middleware.use('::ActionDispatch::ShowExceptions', lambda { consider_all_requests_local }, :if => lambda { action_dispatch.show_exceptions }) - middleware.use("::ActionDispatch::RemoteIp", lambda { action_dispatch.ip_spoofing_check }, lambda { action_dispatch.trusted_proxies }) + middleware.use('::ActionDispatch::RemoteIp', lambda { action_dispatch.ip_spoofing_check }, lambda { action_dispatch.trusted_proxies }) middleware.use('::Rack::Sendfile', lambda { action_dispatch.x_sendfile_header }) middleware.use('::ActionDispatch::Callbacks', lambda { !cache_classes }) middleware.use('::ActionDispatch::Cookies') -- cgit v1.2.3 From fef31be2bceba083744c856f29dabdc3fb03402b Mon Sep 17 00:00:00 2001 From: Jeremy Kemper Date: Thu, 29 Apr 2010 11:34:41 -0700 Subject: Add missing deprecation requires --- railties/lib/rails/application/configuration.rb | 1 + railties/lib/rails/configuration.rb | 1 + railties/lib/rails/railtie.rb | 1 + 3 files changed, 3 insertions(+) (limited to 'railties/lib/rails') diff --git a/railties/lib/rails/application/configuration.rb b/railties/lib/rails/application/configuration.rb index 77f5eea3c4..1ad77fdfec 100644 --- a/railties/lib/rails/application/configuration.rb +++ b/railties/lib/rails/application/configuration.rb @@ -1,3 +1,4 @@ +require 'active_support/deprecation' require 'rails/engine/configuration' module Rails diff --git a/railties/lib/rails/configuration.rb b/railties/lib/rails/configuration.rb index dfd849b4bb..bd404f4a14 100644 --- a/railties/lib/rails/configuration.rb +++ b/railties/lib/rails/configuration.rb @@ -1,3 +1,4 @@ +require 'active_support/deprecation' require 'active_support/ordered_options' require 'rails/paths' require 'rails/rack' diff --git a/railties/lib/rails/railtie.rb b/railties/lib/rails/railtie.rb index 6ac6be092e..b6b57bc5b5 100644 --- a/railties/lib/rails/railtie.rb +++ b/railties/lib/rails/railtie.rb @@ -1,6 +1,7 @@ require 'rails/initializable' require 'rails/configuration' require 'active_support/inflector' +require 'active_support/deprecation' module Rails # Railtie is the core of the Rails Framework and provides several hooks to extend -- cgit v1.2.3 From 20f0e9f3203560f34f451a37130caf237bb94867 Mon Sep 17 00:00:00 2001 From: Jeremy Kemper Date: Thu, 29 Apr 2010 11:43:09 -0700 Subject: Fix docs typo: app.middlewares -> app.middleware --- railties/lib/rails/engine.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'railties/lib/rails') diff --git a/railties/lib/rails/engine.rb b/railties/lib/rails/engine.rb index 36fcc896ae..ab0ead65a9 100644 --- a/railties/lib/rails/engine.rb +++ b/railties/lib/rails/engine.rb @@ -42,7 +42,7 @@ module Rails # config.load_paths << File.expand_path("../lib/some/path", __FILE__) # # initializer "my_engine.add_middleware" do |app| - # app.middlewares.use MyEngine::Middleware + # app.middleware.use MyEngine::Middleware # end # end # -- cgit v1.2.3 From c54c84b7b4d933013ffc7a3ca449117bd7663433 Mon Sep 17 00:00:00 2001 From: Carlhuda Date: Thu, 29 Apr 2010 16:45:45 -0700 Subject: Move ActionMailer generator to AM --- railties/lib/rails/commands/application.rb | 2 +- railties/lib/rails/generators/rails/mailer/USAGE | 15 --------------- .../rails/generators/rails/mailer/mailer_generator.rb | 14 -------------- .../rails/generators/rails/mailer/templates/mailer.rb | 16 ---------------- 4 files changed, 1 insertion(+), 46 deletions(-) delete mode 100644 railties/lib/rails/generators/rails/mailer/USAGE delete mode 100644 railties/lib/rails/generators/rails/mailer/mailer_generator.rb delete mode 100644 railties/lib/rails/generators/rails/mailer/templates/mailer.rb (limited to 'railties/lib/rails') diff --git a/railties/lib/rails/commands/application.rb b/railties/lib/rails/commands/application.rb index 438c976b35..8a8143e00e 100644 --- a/railties/lib/rails/commands/application.rb +++ b/railties/lib/rails/commands/application.rb @@ -10,4 +10,4 @@ require 'rubygems' if ARGV.include?("--dev") require 'rails/generators' require 'rails/generators/rails/app/app_generator' -Rails::Generators::AppGenerator.start \ No newline at end of file +Rails::Generators::AppGenerator.start diff --git a/railties/lib/rails/generators/rails/mailer/USAGE b/railties/lib/rails/generators/rails/mailer/USAGE deleted file mode 100644 index a08d459739..0000000000 --- a/railties/lib/rails/generators/rails/mailer/USAGE +++ /dev/null @@ -1,15 +0,0 @@ -Description: - Stubs out a new mailer and its views. Pass the mailer name, either - CamelCased or under_scored, and an optional list of emails as arguments. - - This generates a mailer class in app/mailers and invokes your template - engine and test framework generators. - -Example: - `rails generate mailer Notifications signup forgot_password invoice` - - creates a Notifications mailer class, views, test, and fixtures: - Mailer: app/mailers/notifications.rb - Views: app/views/notifications/signup.erb [...] - Test: test/functional/notifications_test.rb - Fixtures: test/fixtures/notifications/signup [...] diff --git a/railties/lib/rails/generators/rails/mailer/mailer_generator.rb b/railties/lib/rails/generators/rails/mailer/mailer_generator.rb deleted file mode 100644 index 8993181d79..0000000000 --- a/railties/lib/rails/generators/rails/mailer/mailer_generator.rb +++ /dev/null @@ -1,14 +0,0 @@ -module Rails - module Generators - class MailerGenerator < NamedBase - argument :actions, :type => :array, :default => [], :banner => "method method" - check_class_collision - - def create_mailer_file - template "mailer.rb", File.join('app/mailers', class_path, "#{file_name}.rb") - end - - hook_for :template_engine, :test_framework - end - end -end diff --git a/railties/lib/rails/generators/rails/mailer/templates/mailer.rb b/railties/lib/rails/generators/rails/mailer/templates/mailer.rb deleted file mode 100644 index 7343eb28b3..0000000000 --- a/railties/lib/rails/generators/rails/mailer/templates/mailer.rb +++ /dev/null @@ -1,16 +0,0 @@ -class <%= class_name %> < ActionMailer::Base - default :from => "from@example.com" -<% for action in actions -%> - - # Subject can be set in your I18n file at config/locales/en.yml - # with the following lookup: - # - # en.actionmailer.<%= file_name %>.<%= action %>.subject - # - def <%= action %> - @greeting = "Hi" - - mail :to => "to@example.org" - end -<% end -%> -end -- cgit v1.2.3 From cde168edbbe2d95dd8af40524dd9f42220481ef6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jos=C3=A9=20Valim?= Date: Fri, 30 Apr 2010 12:42:12 +0200 Subject: Update generators to use thor 0.13.6 with simpler source_root handling. --- railties/lib/rails/generators/base.rb | 38 +++++++++++++--------- .../templates/%file_name%_generator.rb.tt | 4 +-- 2 files changed, 23 insertions(+), 19 deletions(-) (limited to 'railties/lib/rails') diff --git a/railties/lib/rails/generators/base.rb b/railties/lib/rails/generators/base.rb index 0da85ea4a4..766644bbc2 100644 --- a/railties/lib/rails/generators/base.rb +++ b/railties/lib/rails/generators/base.rb @@ -20,24 +20,19 @@ module Rails add_runtime_options! - # Automatically sets the source root based on the class name. - # - def self.source_root - @_rails_source_root ||= begin - if base_name && generator_name - File.expand_path(File.join(base_name, generator_name, 'templates'), File.dirname(__FILE__)) - end - end + # Returns the source root for this generator using default_source_root as default. + def self.source_root(path=nil) + @_source_root = path if path + @_source_root ||= default_source_root end # Tries to get the description from a USAGE file one folder above the source # root otherwise uses a default description. - # def self.desc(description=nil) return super if description - usage = File.expand_path(File.join(source_root, "..", "USAGE")) + usage = source_root && File.expand_path("../USAGE", source_root) - @desc ||= if File.exist?(usage) + @desc ||= if usage && File.exist?(usage) File.read(usage) else "Description:\n Create #{base_name.humanize.downcase} files for #{generator_name} generator." @@ -47,7 +42,6 @@ module Rails # Convenience method to get the namespace from the class name. It's the # same as Thor default except that the Generator at the end of the class # is removed. - # def self.namespace(name=nil) return super if name @namespace ||= super.sub(/_generator$/, '').sub(/:generators:/, ':') @@ -200,7 +194,6 @@ module Rails end # Make class option aware of Rails::Generators.options and Rails::Generators.aliases. - # def self.class_option(name, options={}) #:nodoc: options[:desc] = "Indicates when to generate #{name.to_s.humanize.downcase}" unless options.key?(:desc) options[:aliases] = default_aliases_for_option(name, options) @@ -208,14 +201,27 @@ module Rails super(name, options) end + # Returns the default source root for a given generator. This is used internally + # by rails to set its generators source root. If you want to customize your source + # root, you should use source_root. + def self.default_source_root + return unless base_name && generator_name + path = File.expand_path(File.join(base_name, generator_name, 'templates'), base_root) + path if File.exists?(path) + end + + # Returns the base root for a common set of generators. This is used to dynamically + # guess the default source root. + def self.base_root + File.dirname(__FILE__) + end + # Cache source root and add lib/generators/base/generator/templates to # source paths. - # def self.inherited(base) #:nodoc: super - # Cache source root, we need to do this, since __FILE__ is a relative value - # and can point to wrong directions when inside an specified directory. + # Invoke source_root so the default_source_root is set. base.source_root if base.name && base.name !~ /Base$/ diff --git a/railties/lib/rails/generators/rails/generator/templates/%file_name%_generator.rb.tt b/railties/lib/rails/generators/rails/generator/templates/%file_name%_generator.rb.tt index d8757460e4..d0575772bc 100644 --- a/railties/lib/rails/generators/rails/generator/templates/%file_name%_generator.rb.tt +++ b/railties/lib/rails/generators/rails/generator/templates/%file_name%_generator.rb.tt @@ -1,5 +1,3 @@ class <%= class_name %>Generator < Rails::Generators::NamedBase - def self.source_root - @source_root ||= File.expand_path('../templates', __FILE__) - end + source_root File.expand_path('../templates', __FILE__) end -- cgit v1.2.3 From 0761d1b0f7e89d49fe8cd6ab7eed3f084bd56fbd Mon Sep 17 00:00:00 2001 From: Carlhuda Date: Thu, 29 Apr 2010 18:30:19 -0700 Subject: Set up app generator class to make it easier to for alt-stacks to override targeted areas --- .../rails/generators/rails/app/app_generator.rb | 321 ++++++++++++++------- 1 file changed, 217 insertions(+), 104 deletions(-) (limited to 'railties/lib/rails') diff --git a/railties/lib/rails/generators/rails/app/app_generator.rb b/railties/lib/rails/generators/rails/app/app_generator.rb index 667a123025..29e78a898c 100644 --- a/railties/lib/rails/generators/rails/app/app_generator.rb +++ b/railties/lib/rails/generators/rails/app/app_generator.rb @@ -3,87 +3,30 @@ require 'active_support/secure_random' require 'rails/version' unless defined?(Rails::VERSION) require 'rbconfig' -module Rails::Generators - # We need to store the RAILS_DEV_PATH in a constant, otherwise the path - # can change in Ruby 1.8.7 when we FileUtils.cd. - RAILS_DEV_PATH = File.expand_path("../../../../../..", File.dirname(__FILE__)) - - RESERVED_NAMES = %w[generate console server dbconsole - application destroy benchmarker profiler - plugin runner test] - - class AppGenerator < Base - DATABASES = %w( mysql oracle postgresql sqlite3 frontbase ibm_db ) - - attr_accessor :rails_template - add_shebang_option! - - argument :app_path, :type => :string - - class_option :database, :type => :string, :aliases => "-d", :default => "sqlite3", - :desc => "Preconfigure for selected database (options: #{DATABASES.join('/')})" - - class_option :template, :type => :string, :aliases => "-m", - :desc => "Path to an application template (can be a filesystem path or URL)." - - class_option :dev, :type => :boolean, :default => false, - :desc => "Setup the application with Gemfile pointing to your Rails checkout" - - class_option :edge, :type => :boolean, :default => false, - :desc => "Setup the application with Gemfile pointing to Rails repository" - - class_option :skip_gemfile, :type => :boolean, :default => false, - :desc => "Don't create a Gemfile" - - class_option :skip_activerecord, :type => :boolean, :aliases => "-O", :default => false, - :desc => "Skip ActiveRecord files" - - class_option :skip_testunit, :type => :boolean, :aliases => "-T", :default => false, - :desc => "Skip TestUnit files" - - class_option :skip_prototype, :type => :boolean, :aliases => "-J", :default => false, - :desc => "Skip Prototype files" - - class_option :skip_git, :type => :boolean, :aliases => "-G", :default => false, - :desc => "Skip Git ignores and keeps" - - # Add bin/rails options - class_option :version, :type => :boolean, :aliases => "-v", :group => :rails, - :desc => "Show Rails version number and quit" - - class_option :help, :type => :boolean, :aliases => "-h", :group => :rails, - :desc => "Show this help message and quit" - - def initialize(*args) - raise Error, "Options should be given after the application name. For details run: rails --help" if args[0].blank? - super - if !options[:skip_activerecord] && !DATABASES.include?(options[:database]) - raise Error, "Invalid value for --database option. Supported for preconfiguration are: #{DATABASES.join(", ")}." - end +module Rails + class AppBuilder + def initialize(generator) + @generator = generator + @options = generator.options end - def create_root - self.destination_root = File.expand_path(app_path, destination_root) - valid_app_const? - - empty_directory '.' - set_default_accessors! - FileUtils.cd(destination_root) + def gemfile + template "Gemfile" end - def create_root_files - copy_file "README" - copy_file "gitignore", ".gitignore" unless options[:skip_git] - template "Rakefile" + def configru template "config.ru" - template "Gemfile" unless options[:skip_gemfile] end - def create_app_files + def gitignore + copy_file "gitignore", ".gitignore" + end + + def app directory 'app' end - def create_config_files + def config empty_directory "config" inside "config" do @@ -97,29 +40,24 @@ module Rails::Generators end end - def create_boot_file - template "config/boot.rb" - end - - def create_activerecord_files - return if options[:skip_activerecord] - template "config/databases/#{options[:database]}.yml", "config/database.yml" + def database_yml + template "config/databases/#{@options[:database]}.yml", "config/database.yml" end - def create_db_files + def db directory "db" end - def create_doc_files + def doc directory "doc" end - def create_lib_files + def lib empty_directory "lib" empty_directory_with_gitkeep "lib/tasks" end - def create_log_files + def log empty_directory "log" inside "log" do @@ -130,39 +68,34 @@ module Rails::Generators end end - def create_public_files - directory "public", "public", :recursive => false # Do small steps, so anyone can overwrite it. + def public_directory + directory "public", "public", :recursive => false end - def create_public_image_files + def images directory "public/images" end - def create_public_stylesheets_files + def stylesheets empty_directory_with_gitkeep "public/stylesheets" end - def create_prototype_files - unless options[:skip_prototype] - directory "public/javascripts" - else - empty_directory_with_gitkeep "public/javascripts" - end + def javascripts + directory "public/javascripts" end - def create_script_files + def script directory "script" do |content| "#{shebang}\n" + content end chmod "script", 0755, :verbose => false end - def create_test_files - return if options[:skip_testunit] + def test directory "test" end - def create_tmp_files + def tmp empty_directory "tmp" inside "tmp" do @@ -172,20 +105,195 @@ module Rails::Generators end end - def create_vendor_files + def vendor_plugins empty_directory_with_gitkeep "vendor/plugins" 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}" + + private + %w(template copy_file directory empty_directory inside + empty_directory_with_gitkeep create_file chmod shebang).each do |method| + class_eval <<-RUBY + def #{method}(*args, &block) + @generator.send(:#{method}, *args, &block) + end + RUBY 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? + # TODO: Remove once this is fully in place + def method_missing(meth, *args, &block) + STDERR.puts "Calling #{meth} with #{args.inspect} with #{block}" + @generator.send(meth, *args, &block) end + end + + module Generators + # We need to store the RAILS_DEV_PATH in a constant, otherwise the path + # can change in Ruby 1.8.7 when we FileUtils.cd. + RAILS_DEV_PATH = File.expand_path("../../../../../..", File.dirname(__FILE__)) + + RESERVED_NAMES = %w[generate console server dbconsole + application destroy benchmarker profiler + plugin runner test] + + class AppGenerator < Base + DATABASES = %w( mysql oracle postgresql sqlite3 frontbase ibm_db ) + + attr_accessor :rails_template + add_shebang_option! + + argument :app_path, :type => :string + + class_option :database, :type => :string, :aliases => "-d", :default => "sqlite3", + :desc => "Preconfigure for selected database (options: #{DATABASES.join('/')})" + + class_option :template, :type => :string, :aliases => "-m", + :desc => "Path to an application template (can be a filesystem path or URL)." + + class_option :dev, :type => :boolean, :default => false, + :desc => "Setup the application with Gemfile pointing to your Rails checkout" + + class_option :edge, :type => :boolean, :default => false, + :desc => "Setup the application with Gemfile pointing to Rails repository" + + class_option :skip_gemfile, :type => :boolean, :default => false, + :desc => "Don't create a Gemfile" + + class_option :skip_activerecord, :type => :boolean, :aliases => "-O", :default => false, + :desc => "Skip ActiveRecord files" + + class_option :skip_testunit, :type => :boolean, :aliases => "-T", :default => false, + :desc => "Skip TestUnit files" + + class_option :skip_prototype, :type => :boolean, :aliases => "-J", :default => false, + :desc => "Skip Prototype files" + + class_option :skip_git, :type => :boolean, :aliases => "-G", :default => false, + :desc => "Skip Git ignores and keeps" + + # Add bin/rails options + class_option :version, :type => :boolean, :aliases => "-v", :group => :rails, + :desc => "Show Rails version number and quit" + + class_option :help, :type => :boolean, :aliases => "-h", :group => :rails, + :desc => "Show this help message and quit" + + def initialize(*args) + raise Error, "Options should be given after the application name. For details run: rails --help" if args[0].blank? + super + + if builder = options[:builder] + apply builder + end + + @builder = AppBuilder.new(self) + + if !options[:skip_activerecord] && !DATABASES.include?(options[:database]) + raise Error, "Invalid value for --database option. Supported for preconfiguration are: #{DATABASES.join(", ")}." + end + end + + def create_root + self.destination_root = File.expand_path(app_path, destination_root) + valid_app_const? + + empty_directory '.' + set_default_accessors! + FileUtils.cd(destination_root) + end + + def create_root_files + copy_file "README" + template "Rakefile" + build(:configru) + build(:gitignore) unless options[:skip_git] + build(:gemfile) unless options[:skip_gemfile] + end + + def create_app_files + build(:app) + end + + def create_config_files + build(:config) + end + + def create_boot_file + template "config/boot.rb" + end + + def create_activerecord_files + return if options[:skip_activerecord] + build(:database_yml) + end + + def create_db_files + build(:db) + end + + def create_doc_files + build(:doc) + end + + def create_lib_files + build(:lib) + end + + def create_log_files + build(:log) + end + + def create_public_files + build(:public) + end + + def create_public_image_files + build(:images) + end + + def create_public_stylesheets_files + build(:stylesheets) + empty_directory_with_gitkeep "public/stylesheets" + end + + def create_prototype_files + unless options[:skip_prototype] + build(:javascripts) + else + empty_directory_with_gitkeep "public/javascripts" + end + end + + def create_script_files + build(:script) + end + + def create_test_files + build(:test) unless options[:skip_testunit] + end + + def create_tmp_files + build(:tmp) + end + + def create_vendor_files + build(:vendor_plugins) + end + + def finish_template + build(:leftovers) + 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 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 protected @@ -193,6 +301,10 @@ module Rails::Generators "rails #{self.arguments.map(&:usage).join(' ')} [options]" end + def build(meth, *args) + @builder.send(meth, *args) if @builder.respond_to?(meth) + end + def set_default_accessors! self.rails_template = case options[:template] when /^http:\/\// @@ -274,5 +386,6 @@ module Rails::Generators empty_directory(destination, config) create_file("#{destination}/.gitkeep") unless options[:skip_git] end + end end end -- cgit v1.2.3 From 785493ffed41abcca0686bf05b0a0157e0844d47 Mon Sep 17 00:00:00 2001 From: Carlhuda Date: Fri, 30 Apr 2010 13:08:28 -0700 Subject: Provide a mechanism for overriding the entire generator via a class that handles the individual elements of generating a new Rails application --- .../rails/generators/rails/app/app_generator.rb | 142 ++++++++++++--------- 1 file changed, 85 insertions(+), 57 deletions(-) (limited to 'railties/lib/rails') diff --git a/railties/lib/rails/generators/rails/app/app_generator.rb b/railties/lib/rails/generators/rails/app/app_generator.rb index 29e78a898c..380057a10e 100644 --- a/railties/lib/rails/generators/rails/app/app_generator.rb +++ b/railties/lib/rails/generators/rails/app/app_generator.rb @@ -2,14 +2,44 @@ require 'digest/md5' require 'active_support/secure_random' require 'rails/version' unless defined?(Rails::VERSION) require 'rbconfig' +require 'open-uri' +require 'uri' module Rails - class AppBuilder + module ActionMethods + attr_reader :options + def initialize(generator) @generator = generator @options = generator.options end + private + %w(template copy_file directory empty_directory inside + empty_directory_with_gitkeep create_file chmod shebang).each do |method| + class_eval <<-RUBY + def #{method}(*args, &block) + @generator.send(:#{method}, *args, &block) + end + RUBY + end + + # TODO: Remove once this is fully in place + def method_missing(meth, *args, &block) + STDERR.puts "Calling #{meth} with #{args.inspect} with #{block}" + @generator.send(meth, *args, &block) + end + end + + class AppBuilder + def rakefile + template "Rakefile" + end + + def readme + copy_file "README" + end + def gemfile template "Gemfile" end @@ -81,7 +111,11 @@ module Rails end def javascripts - directory "public/javascripts" + unless options[:skip_prototype] + directory "public/javascripts" + else + empty_directory_with_gitkeep "public/javascripts" + end end def script @@ -108,23 +142,6 @@ module Rails def vendor_plugins empty_directory_with_gitkeep "vendor/plugins" end - - - private - %w(template copy_file directory empty_directory inside - empty_directory_with_gitkeep create_file chmod shebang).each do |method| - class_eval <<-RUBY - def #{method}(*args, &block) - @generator.send(:#{method}, *args, &block) - end - RUBY - end - - # TODO: Remove once this is fully in place - def method_missing(meth, *args, &block) - STDERR.puts "Calling #{meth} with #{args.inspect} with #{block}" - @generator.send(meth, *args, &block) - end end module Generators @@ -142,52 +159,49 @@ module Rails attr_accessor :rails_template add_shebang_option! - argument :app_path, :type => :string + argument :app_path, :type => :string - class_option :database, :type => :string, :aliases => "-d", :default => "sqlite3", - :desc => "Preconfigure for selected database (options: #{DATABASES.join('/')})" + class_option :database, :type => :string, :aliases => "-d", :default => "sqlite3", + :desc => "Preconfigure for selected database (options: #{DATABASES.join('/')})" - class_option :template, :type => :string, :aliases => "-m", - :desc => "Path to an application template (can be a filesystem path or URL)." + class_option :builder, :type => :string, :aliases => "-b", + :desc => "Path to an application builder (can be a filesystem path or URL)" - class_option :dev, :type => :boolean, :default => false, - :desc => "Setup the application with Gemfile pointing to your Rails checkout" + class_option :template, :type => :string, :aliases => "-m", + :desc => "Path to an application template (can be a filesystem path or URL)." - class_option :edge, :type => :boolean, :default => false, - :desc => "Setup the application with Gemfile pointing to Rails repository" + class_option :dev, :type => :boolean, :default => false, + :desc => "Setup the application with Gemfile pointing to your Rails checkout" - class_option :skip_gemfile, :type => :boolean, :default => false, - :desc => "Don't create a Gemfile" + class_option :edge, :type => :boolean, :default => false, + :desc => "Setup the application with Gemfile pointing to Rails repository" - class_option :skip_activerecord, :type => :boolean, :aliases => "-O", :default => false, - :desc => "Skip ActiveRecord files" + class_option :skip_gemfile, :type => :boolean, :default => false, + :desc => "Don't create a Gemfile" - class_option :skip_testunit, :type => :boolean, :aliases => "-T", :default => false, - :desc => "Skip TestUnit files" + class_option :skip_activerecord, :type => :boolean, :aliases => "-O", :default => false, + :desc => "Skip ActiveRecord files" - class_option :skip_prototype, :type => :boolean, :aliases => "-J", :default => false, - :desc => "Skip Prototype files" + class_option :skip_testunit, :type => :boolean, :aliases => "-T", :default => false, + :desc => "Skip TestUnit files" - class_option :skip_git, :type => :boolean, :aliases => "-G", :default => false, - :desc => "Skip Git ignores and keeps" + class_option :skip_prototype, :type => :boolean, :aliases => "-J", :default => false, + :desc => "Skip Prototype files" + + class_option :skip_git, :type => :boolean, :aliases => "-G", :default => false, + :desc => "Skip Git ignores and keeps" # 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" - class_option :help, :type => :boolean, :aliases => "-h", :group => :rails, - :desc => "Show this help message and quit" + class_option :help, :type => :boolean, :aliases => "-h", :group => :rails, + :desc => "Show this help message and quit" def initialize(*args) raise Error, "Options should be given after the application name. For details run: rails --help" if args[0].blank? super - if builder = options[:builder] - apply builder - end - - @builder = AppBuilder.new(self) - if !options[:skip_activerecord] && !DATABASES.include?(options[:database]) raise Error, "Invalid value for --database option. Supported for preconfiguration are: #{DATABASES.join(", ")}." end @@ -203,8 +217,8 @@ module Rails end def create_root_files - copy_file "README" - template "Rakefile" + build(:readme) + build(:rakefile) build(:configru) build(:gitignore) unless options[:skip_git] build(:gemfile) unless options[:skip_gemfile] @@ -253,15 +267,10 @@ module Rails def create_public_stylesheets_files build(:stylesheets) - empty_directory_with_gitkeep "public/stylesheets" end def create_prototype_files - unless options[:skip_prototype] - build(:javascripts) - else - empty_directory_with_gitkeep "public/javascripts" - end + build(:javascripts) end def create_script_files @@ -301,8 +310,27 @@ module Rails "rails #{self.arguments.map(&:usage).join(' ')} [options]" end + 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(path) {|io| io.read } + end + + prok = eval("proc { #{contents} }", TOPLEVEL_BINDING, path, 1) + instance_eval(&prok) + end + + builder_class = defined?(::AppBuilder) ? ::AppBuilder : Rails::AppBuilder + builder_class.send(:include, ActionMethods) + builder_class.new(self) + end + end + def build(meth, *args) - @builder.send(meth, *args) if @builder.respond_to?(meth) + builder.send(meth, *args) if builder.respond_to?(meth) end def set_default_accessors! -- cgit v1.2.3 From 95c98799a4871fb3eb92729d0a3db72a823b070a Mon Sep 17 00:00:00 2001 From: Carl Lerche Date: Fri, 30 Apr 2010 16:19:35 -0700 Subject: Fix a bug in the generators from the previous commit --- railties/lib/rails/generators/rails/app/app_generator.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'railties/lib/rails') diff --git a/railties/lib/rails/generators/rails/app/app_generator.rb b/railties/lib/rails/generators/rails/app/app_generator.rb index 380057a10e..10d8b8f85a 100644 --- a/railties/lib/rails/generators/rails/app/app_generator.rb +++ b/railties/lib/rails/generators/rails/app/app_generator.rb @@ -258,7 +258,7 @@ module Rails end def create_public_files - build(:public) + build(:public_directory) end def create_public_image_files -- cgit v1.2.3