aboutsummaryrefslogtreecommitdiffstats
path: root/railties/lib/rails/commands
diff options
context:
space:
mode:
Diffstat (limited to 'railties/lib/rails/commands')
-rw-r--r--railties/lib/rails/commands/command.rb75
-rw-r--r--railties/lib/rails/commands/commands_tasks.rb6
-rw-r--r--railties/lib/rails/commands/dev_cache.rb21
3 files changed, 101 insertions, 1 deletions
diff --git a/railties/lib/rails/commands/command.rb b/railties/lib/rails/commands/command.rb
new file mode 100644
index 0000000000..c8707be3ab
--- /dev/null
+++ b/railties/lib/rails/commands/command.rb
@@ -0,0 +1,75 @@
+module Rails
+ module Commands
+ class Command
+ attr_reader :argv
+
+ def initialize(argv = [])
+ @argv = argv
+
+ @option_parser = build_option_parser
+ @options = {}
+ end
+
+ def run(task_name)
+ command_name = self.class.command_name_for(task_name)
+
+ parse_options_for(command_name)
+ @option_parser.parse! @argv
+
+ if command = command_for(command_name)
+ command.public_send(command_name)
+ else
+ puts @option_parser
+ end
+ end
+
+ def self.options_for(command_name, &options_to_parse)
+ @@command_options[command_name] = options_to_parse
+ end
+
+ def self.set_banner(command_name, banner)
+ options_for(command_name) { |opts, _| opts.banner = banner }
+ end
+
+ def exists?(task_name) # :nodoc:
+ command_name = self.class.command_name_for(task_name)
+ !command_for(command_name).nil?
+ end
+
+ private
+ @@commands = []
+ @@command_options = {}
+
+ def parse_options_for(command_name)
+ @@command_options.fetch(command_name, proc {}).call(@option_parser, @options)
+ end
+
+ def build_option_parser
+ OptionParser.new do |opts|
+ opts.on('-h', '--help', 'Show this help.') do
+ puts opts
+ exit
+ end
+ end
+ end
+
+ def self.inherited(command)
+ @@commands << command
+ end
+
+ def self.command_name_for(task_name)
+ task_name.gsub(':', '_').to_sym
+ end
+
+ def command_for(command_name)
+ klass = @@commands.find do |command|
+ command.public_instance_methods.include?(command_name)
+ end
+
+ if klass
+ klass.new(@argv)
+ end
+ end
+ end
+ end
+end
diff --git a/railties/lib/rails/commands/commands_tasks.rb b/railties/lib/rails/commands/commands_tasks.rb
index 685d55eea8..f79b40b2ab 100644
--- a/railties/lib/rails/commands/commands_tasks.rb
+++ b/railties/lib/rails/commands/commands_tasks.rb
@@ -32,11 +32,15 @@ EOT
def initialize(argv)
@argv = argv
+ @rails_command = Rails::Commands::Command.new(argv)
end
def run_command!(command)
command = parse_command(command)
- if COMMAND_WHITELIST.include?(command)
+
+ if @rails_command.exists?(command)
+ @rails_command.run(command)
+ elsif COMMAND_WHITELIST.include?(command)
send(command)
else
write_error_message(command)
diff --git a/railties/lib/rails/commands/dev_cache.rb b/railties/lib/rails/commands/dev_cache.rb
new file mode 100644
index 0000000000..43675c0e69
--- /dev/null
+++ b/railties/lib/rails/commands/dev_cache.rb
@@ -0,0 +1,21 @@
+require 'rails/commands/command'
+
+module Rails
+ module Commands
+ # This is a wrapper around the Rails dev:cache command
+ class DevCache < Command
+ set_banner :dev_cache, 'Toggle development mode caching on/off'
+ def dev_cache
+ if File.exist? 'tmp/caching-dev.txt'
+ File.delete 'tmp/caching-dev.txt'
+ puts 'Development mode is no longer being cached.'
+ else
+ FileUtils.touch 'tmp/caching-dev.txt'
+ puts 'Development mode is now being cached.'
+ end
+
+ FileUtils.touch 'tmp/restart.txt'
+ end
+ end
+ end
+end