Skip to content

Commit

Permalink
Merge pull request #20961 from ccallebs/add-dev-mode-caching
Browse files Browse the repository at this point in the history
Add dev caching toggle / server options
  • Loading branch information
kaspth committed Aug 5, 2015
2 parents 57989c5 + a01e58a commit 2d00aa7
Show file tree
Hide file tree
Showing 7 changed files with 114 additions and 2 deletions.
12 changes: 12 additions & 0 deletions railties/CHANGELOG.md
@@ -1,3 +1,15 @@
* Make enabling or disabling caching in development mode possible with
rake dev:cache.

Running rake dev:cache will create or remove tmp/caching-dev.txt. When this
file exists config.action_controller.perform_caching will be set to true in
config/environments/development.rb.

Additionally, a server can be started with either --dev-caching or
--no-dev-caching included to toggle caching on startup.

*Jussi Mertanen*, *Chuck Callebs*

* Add a `--api` option in order to generate plugins that can be added
inside an API application.

Expand Down
23 changes: 23 additions & 0 deletions railties/lib/rails/commands/server.rb
Expand Up @@ -34,6 +34,9 @@ def option_parser(options)
opts.on("-P", "--pid=pid", String,
"Specifies the PID file.",
"Default: tmp/pids/server.pid") { |v| options[:pid] = v }
opts.on("-C", "--[no-]dev-caching",
"Specifies whether to perform caching in development.",
"true or false") { |v| options[:caching] = v }

opts.separator ""

Expand Down Expand Up @@ -67,6 +70,7 @@ def start
print_boot_information
trap(:INT) { exit }
create_tmp_directories
setup_dev_caching
log_to_stdout if options[:log_stdout]

super
Expand All @@ -86,12 +90,23 @@ def default_options
DoNotReverseLookup: true,
environment: (ENV['RAILS_ENV'] || ENV['RACK_ENV'] || "development").dup,
daemonize: false,
caching: false,
pid: File.expand_path("tmp/pids/server.pid")
})
end

private

def setup_dev_caching
return unless options[:environment] == "development"

if options[:caching] == false
delete_cache_file
elsif options[:caching]
create_cache_file
end
end

def print_boot_information
url = "#{options[:SSLEnable] ? 'https' : 'http'}://#{options[:Host]}:#{options[:Port]}"
puts "=> Booting #{ActiveSupport::Inflector.demodulize(server)}"
Expand All @@ -101,6 +116,14 @@ def print_boot_information
puts "=> Ctrl-C to shutdown server" unless options[:daemonize]
end

def create_cache_file
FileUtils.touch("tmp/caching-dev.txt")
end

def delete_cache_file
FileUtils.rm("tmp/caching-dev.txt") if File.exists?("tmp/caching-dev.txt")
end

def create_tmp_directories
%w(cache pids sockets).each do |dir_to_make|
FileUtils.mkdir_p(File.join(Rails.root, 'tmp', dir_to_make))
Expand Down
Expand Up @@ -9,9 +9,19 @@ Rails.application.configure do
# Do not eager load code on boot.
config.eager_load = false

# Show full error reports and disable caching.
# Show full error reports.
config.consider_all_requests_local = true
config.action_controller.perform_caching = false

# Enable/disable caching. By default caching is disabled.
if Rails.root.join('tmp/caching-dev.txt').exist?
config.action_controller.perform_caching = true
config.static_cache_control = "public, max-age=172800"
config.cache_store = :memory_store
else
config.action_controller.perform_caching = false
config.cache_store = :null_store
end

<%- unless options.skip_action_mailer? -%>

# Don't care if the mailer can't send.
Expand Down
1 change: 1 addition & 0 deletions railties/lib/rails/tasks.rb
Expand Up @@ -3,6 +3,7 @@
# Load Rails Rakefile extensions
%w(
annotations
dev
framework
initializers
log
Expand Down
15 changes: 15 additions & 0 deletions railties/lib/rails/tasks/dev.rake
@@ -0,0 +1,15 @@
namespace :dev do
task :cache do
desc 'Toggle development mode caching on/off'

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
35 changes: 35 additions & 0 deletions railties/test/application/rake/dev_test.rb
@@ -0,0 +1,35 @@
require 'isolation/abstract_unit'

module ApplicationTests
module RakeTests
class RakeDevTest < ActiveSupport::TestCase
include ActiveSupport::Testing::Isolation

def setup
build_app
boot_rails
end

def teardown
teardown_app
end

test 'dev:cache creates file and outputs message' do
Dir.chdir(app_path) do
output = `rake dev:cache`
assert File.exist?('tmp/caching-dev.txt')
assert_match(/Development mode is now being cached/, output)
end
end

test 'dev:cache deletes file and outputs message' do
Dir.chdir(app_path) do
output = `rake dev:cache`
output = `rake dev:cache`
assert_not File.exist?('tmp/caching-dev.txt')
assert_match(/Development mode is no longer being cached/, output)
end
end
end
end
end
16 changes: 16 additions & 0 deletions railties/test/commands/server_test.rb
Expand Up @@ -44,6 +44,22 @@ def test_environment_with_rack_env
end
end

def test_caching_without_option
args = []
options = Rails::Server::Options.new.parse!(args)
assert_equal nil, options[:caching]
end

def test_caching_with_option
args = ["--dev-caching"]
options = Rails::Server::Options.new.parse!(args)
assert_equal true, options[:caching]

args = ["--no-dev-caching"]
options = Rails::Server::Options.new.parse!(args)
assert_equal false, options[:caching]
end

def test_log_stdout
with_rack_env nil do
with_rails_env nil do
Expand Down

0 comments on commit 2d00aa7

Please sign in to comment.