[DRE-commits] [ruby-actionpack-action-caching] 01/08: New upstream version 1.2.0
Marc Dequènes
duck at moszumanska.debian.org
Mon Sep 11 17:09:47 UTC 2017
This is an automated email from the git hooks/post-receive script.
duck pushed a commit to branch master
in repository ruby-actionpack-action-caching.
commit 994077fc3e0ada85bad66c5029b0618a500ba61c
Author: Marc Dequènes (Duck) <Duck at DuckCorp.org>
Date: Tue Sep 12 01:10:05 2017 +0900
New upstream version 1.2.0
---
.codeclimate.yml | 7 +
.gitignore | 18 +-
.rubocop.yml | 116 +++++
.travis.yml | 41 +-
CHANGELOG.md | 36 +-
Gemfile | 4 +-
README.md | 72 +--
Rakefile | 10 +-
actionpack-action_caching.gemspec | 29 +-
gemfiles/Gemfile-4-0-stable | 7 +-
gemfiles/Gemfile-4-1-stable | 6 +
gemfiles/Gemfile-4-2-stable | 10 +
gemfiles/Gemfile-5-0-stable | 5 +
gemfiles/Gemfile-edge | 7 +-
lib/action_controller/action_caching.rb | 2 +-
lib/action_controller/caching/actions.rb | 77 ++-
lib/actionpack/action_caching.rb | 2 +-
lib/actionpack/action_caching/railtie.rb | 6 +-
metadata.yml | 117 -----
test/abstract_unit.rb | 45 +-
test/caching_test.rb | 609 +++++++++++++++++++-----
test/fixtures/layouts/talk_from_action.erb | 2 -
test/fixtures/layouts/talk_from_action.html.erb | 2 +
23 files changed, 844 insertions(+), 386 deletions(-)
diff --git a/.codeclimate.yml b/.codeclimate.yml
new file mode 100644
index 0000000..18f3dbb
--- /dev/null
+++ b/.codeclimate.yml
@@ -0,0 +1,7 @@
+engines:
+ rubocop:
+ enabled: true
+
+ratings:
+ paths:
+ - "**.rb"
diff --git a/.gitignore b/.gitignore
index d87d4be..f4e3708 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,17 +1,5 @@
-*.gem
-*.rbc
-.bundle
-.config
-.yardoc
+.ruby-version
Gemfile.lock
-InstalledFiles
-_yardoc
-coverage
-doc/
-lib/bundler/man
-pkg
-rdoc
-spec/reports
+gemfiles/*.lock
+pkg/*
test/tmp
-test/version_tmp
-tmp
diff --git a/.rubocop.yml b/.rubocop.yml
new file mode 100644
index 0000000..34ec2a5
--- /dev/null
+++ b/.rubocop.yml
@@ -0,0 +1,116 @@
+AllCops:
+ TargetRubyVersion: 2.2
+ # RuboCop has a bunch of cops enabled by default. This setting tells RuboCop
+ # to ignore them, so only the ones explicitly set in this file are enabled.
+ DisabledByDefault: true
+
+# Prefer &&/|| over and/or.
+Style/AndOr:
+ Enabled: true
+
+# Do not use braces for hash literals when they are the last argument of a
+# method call.
+Style/BracesAroundHashParameters:
+ Enabled: true
+
+# Align `when` with `case`.
+Style/CaseIndentation:
+ Enabled: true
+
+# Align comments with method definitions.
+Style/CommentIndentation:
+ Enabled: true
+
+# No extra empty lines.
+Style/EmptyLines:
+ Enabled: true
+
+# In a regular class definition, no empty lines around the body.
+Style/EmptyLinesAroundClassBody:
+ Enabled: true
+
+# In a regular module definition, no empty lines around the body.
+Style/EmptyLinesAroundModuleBody:
+ Enabled: true
+
+# Use Ruby >= 1.9 syntax for hashes. Prefer { a: :b } over { :a => :b }.
+Style/HashSyntax:
+ Enabled: true
+
+# Method definitions after `private` or `protected` isolated calls need one
+# extra level of indentation.
+Style/IndentationConsistency:
+ Enabled: true
+ EnforcedStyle: rails
+
+# Two spaces, no tabs (for indentation).
+Style/IndentationWidth:
+ Enabled: true
+
+Style/SpaceAfterColon:
+ Enabled: true
+
+Style/SpaceAfterComma:
+ Enabled: true
+
+Style/SpaceAroundEqualsInParameterDefault:
+ Enabled: true
+
+Style/SpaceAroundKeyword:
+ Enabled: true
+
+Style/SpaceAroundOperators:
+ Enabled: true
+
+Style/SpaceBeforeFirstArg:
+ Enabled: true
+
+# Defining a method with parameters needs parentheses.
+Style/MethodDefParentheses:
+ Enabled: true
+
+# Use `foo {}` not `foo{}`.
+Style/SpaceBeforeBlockBraces:
+ Enabled: true
+
+# Use `foo { bar }` not `foo {bar}`.
+Style/SpaceInsideBlockBraces:
+ Enabled: true
+
+# Use `{ a: 1 }` not `{a:1}`.
+Style/SpaceInsideHashLiteralBraces:
+ Enabled: true
+
+Style/SpaceInsideParens:
+ Enabled: true
+
+# Check quotes usage according to lint rule below.
+Style/StringLiterals:
+ Enabled: true
+ EnforcedStyle: double_quotes
+
+# Detect hard tabs, no hard tabs.
+Style/Tab:
+ Enabled: true
+
+# Blank lines should not have any spaces.
+Style/TrailingBlankLines:
+ Enabled: true
+
+# No trailing whitespace.
+Style/TrailingWhitespace:
+ Enabled: true
+
+# Use quotes for string literals when they are enough.
+Style/UnneededPercentQ:
+ Enabled: true
+
+# Align `end` with the matching keyword or starting expression except for
+# assignments, where it should be aligned with the LHS.
+Lint/EndAlignment:
+ Enabled: true
+ AlignWith: variable
+
+# Use my_method(my_arg) not my_method( my_arg ) or my_method my_arg.
+Lint/RequireParentheses:
+ Enabled: true
diff --git a/.travis.yml b/.travis.yml
index 5e74365..d1a4516 100644
--- a/.travis.yml
+++ b/.travis.yml
@@ -1,16 +1,55 @@
language: ruby
+sudo: false
+
+cache:
+ bundler: true
+
before_install:
- gem install bundler
+
rvm:
- 1.9.3
- 2.0.0
+ - 2.1.9
+ - 2.2.6
+ - 2.3.3
+ - 2.4.0
+
gemfile:
- Gemfile
- - gemfiles/Gemfile-edge
- gemfiles/Gemfile-4-0-stable
+ - gemfiles/Gemfile-4-1-stable
+ - gemfiles/Gemfile-4-2-stable
+ - gemfiles/Gemfile-5-0-stable
+ - gemfiles/Gemfile-edge
+
matrix:
allow_failures:
- gemfile: gemfiles/Gemfile-edge
+ exclude:
+ - rvm: 1.9.3
+ gemfile: Gemfile
+ - rvm: 2.0.0
+ gemfile: Gemfile
+ - rvm: 2.1.9
+ gemfile: Gemfile
+ - rvm: 1.9.3
+ gemfile: gemfiles/Gemfile-5-0-stable
+ - rvm: 2.0.0
+ gemfile: gemfiles/Gemfile-5-0-stable
+ - rvm: 2.1.9
+ gemfile: gemfiles/Gemfile-5-0-stable
+ - rvm: 1.9.3
+ gemfile: gemfiles/Gemfile-edge
+ - rvm: 2.0.0
+ gemfile: gemfiles/Gemfile-edge
+ - rvm: 2.1.9
+ gemfile: gemfiles/Gemfile-edge
+ - rvm: 2.4.0
+ gemfile: gemfiles/Gemfile-4-0-stable
+ - rvm: 2.4.0
+ gemfile: gemfiles/Gemfile-4-1-stable
+
notifications:
email: false
irc:
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 10960cf..e6f234f 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,10 +1,41 @@
-## 1.1.1
+## 1.2.0 (January 23, 2014)
+
+* Support proc options with zero arguments
+
+ Fixes #40.
+
+ *Andrew White*
+
+* The options `:layout` and `:cache_path` now behave the same when
+ passed a `Symbol`, `Proc` or object that responds to call.
+
+ *Andrew White*
+
+* Respect `Accept` header when caching actions
+
+ Fixes #18.
+
+ *Andrew White*
+
+* Support Rails 4.0, 4.1, 4.2, 5.0 and edge
+
+ *Eileen Uchitelle*, *Andrew White*
+
+* Call `to_s` on the extension as it may be a symbol
+
+ Fixes #10.
+
+ *Andrew White*
+
+
+## 1.1.1 (January 2, 2014)
* Fix load order problem with other gems
*Andrew White*
-## 1.1.0
+
+## 1.1.0 (November 1, 2013)
* Allow to use non-proc object in `cache_path` option. You can pass an object that
responds to a `call` method.
@@ -24,6 +55,7 @@
*Piotr Niełacny*
+
## 1.0.0 (February 28, 2013)
* Extract Action Pack - Action Caching from Rails core.
diff --git a/Gemfile b/Gemfile
index ef52326..b473cf7 100644
--- a/Gemfile
+++ b/Gemfile
@@ -1,5 +1,5 @@
-source 'https://rubygems.org'
+source "https://rubygems.org"
gemspec
-gem 'rails'
+gem "rails"
diff --git a/README.md b/README.md
index 757cf29..abb1497 100644
--- a/README.md
+++ b/README.md
@@ -3,14 +3,12 @@ actionpack-action_caching
Action caching for Action Pack (removed from core in Rails 4.0).
-**NOTE:** It will continue to be officially maintained until Rails 4.1.
-
Installation
------------
Add this line to your application's Gemfile:
- gem 'actionpack-action_caching'
+ gem "actionpack-action_caching"
And then execute:
@@ -31,7 +29,7 @@ authentication and other restrictions on whether someone is allowed
to execute such action.
class ListsController < ApplicationController
- before_filter :authenticate, except: :public
+ before_action :authenticate, except: :public
caches_page :public
caches_action :index, :show
@@ -56,17 +54,18 @@ Different representations of the same resource, e.g.
`http://david.example.com/lists.xml`
are treated like separate requests and so are cached separately.
Keep in mind when expiring an action cache that
-`action: 'lists'` is not the same as
-`action: 'list', format: :xml`.
+`action: "lists"` is not the same as
+`action: "list", format: :xml`.
You can modify the default action cache path by passing a
`:cache_path` option. This will be passed directly to
`ActionCachePath.new`. This is handy for actions with
multiple possible routes that should be cached differently. If a
-block is given, it is called with the current controller instance.
+proc (or an object that responds to `to_proc`) is given, it is
+called with the current controller instance.
-And you can also use `:if` (or `:unless`) to pass a
-proc that specifies when the action should be cached.
+And you can also use `:if` (or `:unless`) to control when the action
+should be cached, similar to how you use them with `before_action`.
As of Rails 3.0, you can also pass `:expires_in` with a time
interval (in seconds) to schedule expiration of the cached item.
@@ -74,38 +73,45 @@ interval (in seconds) to schedule expiration of the cached item.
The following example depicts some of the points made above:
class ListsController < ApplicationController
- before_filter :authenticate, except: :public
+ before_action :authenticate, except: :public
+
+ # simple fragment cache
+ caches_action :current
+
+ # expire cache after an hour
+ caches_action :archived, expires_in: 1.hour
- caches_page :public
+ # cache unless it's a JSON request
+ caches_action :index, unless: -> { request.format.json? }
- caches_action :index, if: Proc.new do
- !request.format.json? # cache if is not a JSON request
- end
+ # custom cache path
+ caches_action :show, cache_path: { project: 1 }
- caches_action :show, cache_path: { project: 1 },
- expires_in: 1.hour
+ # custom cache path with a proc
+ caches_action :history, cache_path: -> { request.domain }
- caches_action :feed, cache_path: Proc.new do
- if params[:user_id]
- user_list_url(params[:user_id], params[:id])
- else
- list_url(params[:id])
+ # custom cache path with a symbol
+ caches_action :feed, cache_path: :user_cache_path
+
+ protected
+ def user_cache_path
+ if params[:user_id]
+ user_list_url(params[:user_id], params[:id])
+ else
+ list_url(params[:id])
+ end
end
- end
end
If you pass `layout: false`, it will only cache your action
content. That's useful when your layout has dynamic information.
-Warning: If the format of the request is determined by the Accept HTTP
-header the Content-Type of the cached response could be wrong because
-no information about the MIME type is stored in the cache key. So, if
-you first ask for MIME type M in the Accept header, a cache entry is
-created, and then perform a second request to the same resource asking
-for a different MIME type, you'd get the content cached for M.
-
-The `:format` parameter is taken into account though. The safest
-way to cache by MIME type is to pass the format in the route.
+Note: Both the `:format` param and the `Accept` header are taken
+into account when caching the fragment with the `:format` having
+precedence. For backwards compatibility when the `Accept` header
+indicates a HTML request the fragment is stored without the
+extension but if an explicit `"html"` is passed in `:format` then
+that _is_ used for storing the fragment.
Contributing
------------
@@ -119,5 +125,5 @@ Contributing
Code Status
-----------
-* [](https://travis-ci.org/rails/actionpack-action_caching)
-* [](https://gemnasium.com/rails/actionpack-action_caching)
+* [](https://travis-ci.org/rails/actionpack-action_caching)
+* [](https://gemnasium.com/rails/actionpack-action_caching)
diff --git a/Rakefile b/Rakefile
index 95e7910..6efeb91 100644
--- a/Rakefile
+++ b/Rakefile
@@ -1,11 +1,11 @@
#!/usr/bin/env rake
-require 'bundler/gem_tasks'
-require 'rake/testtask'
+require "bundler/gem_tasks"
+require "rake/testtask"
Rake::TestTask.new do |t|
- t.libs = ['test']
- t.pattern = 'test/**/*_test.rb'
- t.ruby_opts = ['-w']
+ t.libs = ["test"]
+ t.pattern = "test/**/*_test.rb"
+ t.ruby_opts = ["-w"]
end
task default: :test
diff --git a/actionpack-action_caching.gemspec b/actionpack-action_caching.gemspec
index ff7e0d7..2bc1eec 100644
--- a/actionpack-action_caching.gemspec
+++ b/actionpack-action_caching.gemspec
@@ -1,22 +1,21 @@
-# -*- encoding: utf-8 -*-
-
Gem::Specification.new do |gem|
- gem.name = 'actionpack-action_caching'
- gem.version = '1.1.1'
- gem.author = 'David Heinemeier Hansson'
- gem.email = 'david at loudthinking.com'
- gem.description = 'Action caching for Action Pack (removed from core in Rails 4.0)'
- gem.summary = 'Action caching for Action Pack (removed from core in Rails 4.0)'
- gem.homepage = 'https://github.com/rails/actionpack-action_caching'
+ gem.name = "actionpack-action_caching"
+ gem.version = "1.2.0"
+ gem.author = "David Heinemeier Hansson"
+ gem.email = "david at loudthinking.com"
+ gem.description = "Action caching for Action Pack (removed from core in Rails 4.0)"
+ gem.summary = "Action caching for Action Pack (removed from core in Rails 4.0)"
+ gem.homepage = "https://github.com/rails/actionpack-action_caching"
+ gem.required_ruby_version = ">= 1.9.3"
gem.files = `git ls-files`.split($/)
- gem.executables = gem.files.grep(%r{^bin/}).map{ |f| File.basename(f) }
+ gem.executables = gem.files.grep(%r{^bin/}).map { |f| File.basename(f) }
gem.test_files = gem.files.grep(%r{^(test|spec|features)/})
- gem.require_paths = ['lib']
- gem.license = 'MIT'
+ gem.require_paths = ["lib"]
+ gem.license = "MIT"
- gem.add_dependency 'actionpack', '>= 4.0.0', '< 5.0'
+ gem.add_dependency "actionpack", ">= 4.0.0", "< 6"
- gem.add_development_dependency 'mocha'
- gem.add_development_dependency 'activerecord', '>= 4.0.0.beta', '< 5'
+ gem.add_development_dependency "mocha"
+ gem.add_development_dependency "activerecord", ">= 4.0.0", "< 6"
end
diff --git a/gemfiles/Gemfile-4-0-stable b/gemfiles/Gemfile-4-0-stable
index c0cb216..f1e23a7 100644
--- a/gemfiles/Gemfile-4-0-stable
+++ b/gemfiles/Gemfile-4-0-stable
@@ -1,5 +1,6 @@
-source 'https://rubygems.org'
+source "https://rubygems.org"
-gemspec path: '..'
+gemspec path: ".."
-gem 'rails', github: 'rails/rails', branch: '4-0-stable'
+gem "rails", github: "rails/rails", branch: "4-0-stable"
+gem "mime-types", "< 3"
diff --git a/gemfiles/Gemfile-4-1-stable b/gemfiles/Gemfile-4-1-stable
new file mode 100644
index 0000000..0c05078
--- /dev/null
+++ b/gemfiles/Gemfile-4-1-stable
@@ -0,0 +1,6 @@
+source "https://rubygems.org"
+
+gemspec path: ".."
+
+gem "rails", github: "rails/rails", branch: "4-1-stable"
+gem "mime-types", "< 3"
diff --git a/gemfiles/Gemfile-4-2-stable b/gemfiles/Gemfile-4-2-stable
new file mode 100644
index 0000000..4089561
--- /dev/null
+++ b/gemfiles/Gemfile-4-2-stable
@@ -0,0 +1,10 @@
+source "https://rubygems.org"
+
+gemspec path: ".."
+
+gem "rails", github: "rails/rails", branch: "4-2-stable"
+gem "mime-types", "< 3"
+
+if RUBY_VERSION < "2.1"
+ gem "nokogiri", "< 1.7"
+end
diff --git a/gemfiles/Gemfile-5-0-stable b/gemfiles/Gemfile-5-0-stable
new file mode 100644
index 0000000..9e3aa5c
--- /dev/null
+++ b/gemfiles/Gemfile-5-0-stable
@@ -0,0 +1,5 @@
+source "https://rubygems.org"
+
+gemspec path: ".."
+
+gem "rails", github: "rails/rails", branch: "5-0-stable"
diff --git a/gemfiles/Gemfile-edge b/gemfiles/Gemfile-edge
index 4b72e7d..689c9a5 100644
--- a/gemfiles/Gemfile-edge
+++ b/gemfiles/Gemfile-edge
@@ -1,5 +1,6 @@
-source 'https://rubygems.org'
+source "https://rubygems.org"
-gemspec path: '..'
+gemspec path: ".."
-gem 'rails', github: 'rails/rails', branch: 'master'
+gem "rails", github: "rails/rails", branch: "master"
+gem "arel", github: "rails/arel", branch: "master"
diff --git a/lib/action_controller/action_caching.rb b/lib/action_controller/action_caching.rb
index b5e630a..8e04000 100644
--- a/lib/action_controller/action_caching.rb
+++ b/lib/action_controller/action_caching.rb
@@ -1,4 +1,4 @@
-require 'action_controller/caching/actions'
+require "action_controller/caching/actions"
module ActionController
module Caching
diff --git a/lib/action_controller/caching/actions.rb b/lib/action_controller/caching/actions.rb
index 280f80c..0127d61 100644
--- a/lib/action_controller/caching/actions.rb
+++ b/lib/action_controller/caching/actions.rb
@@ -1,4 +1,4 @@
-require 'set'
+require "set"
module ActionController
module Caching
@@ -10,7 +10,7 @@ module ActionController
# to execute such action.
#
# class ListsController < ApplicationController
- # before_filter :authenticate, except: :public
+ # before_action :authenticate, except: :public
#
# caches_page :public
# caches_action :index, :show
@@ -35,8 +35,8 @@ module ActionController
# <tt>http://david.example.com/lists.xml</tt>
# are treated like separate requests and so are cached separately.
# Keep in mind when expiring an action cache that
- # <tt>action: 'lists'</tt> is not the same as
- # <tt>action: 'lists', format: :xml</tt>.
+ # <tt>action: "lists"</tt> is not the same as
+ # <tt>action: "lists", format: :xml</tt>.
#
# You can modify the default action cache path by passing a
# <tt>:cache_path</tt> option. This will be passed directly to
@@ -66,7 +66,7 @@ module ActionController
#
#
# class ListsController < ApplicationController
- # before_filter :authenticate, except: :public
+ # before_action :authenticate, except: :public
#
# caches_page :public
#
@@ -85,7 +85,7 @@ module ActionController
# end
# end
#
- # caches_action :posts, cache_path: CachePathCreator.new('posts')
+ # caches_action :posts, cache_path: CachePathCreator.new("posts")
# end
#
# If you pass <tt>layout: false</tt>, it will only cache your action
@@ -113,12 +113,12 @@ module ActionController
filter_options = options.extract!(:if, :unless).merge(only: actions)
cache_options = options.extract!(:layout, :cache_path).merge(store_options: options)
- around_filter ActionCacheFilter.new(cache_options), filter_options
+ around_action ActionCacheFilter.new(cache_options), filter_options
end
end
def _save_fragment(name, options)
- content = ''
+ content = ""
response_body.each do |parts|
content << parts
end
@@ -152,16 +152,8 @@ module ActionController
end
def around(controller)
- cache_layout = @cache_layout.respond_to?(:call) ? @cache_layout.call(controller) : @cache_layout
-
- path_options = if @cache_path.is_a?(Proc)
- controller.instance_exec(controller, &@cache_path)
- elsif @cache_path.respond_to?(:call)
- @cache_path.call(controller)
- else
- @cache_path
- end
-
+ cache_layout = expand_option(controller, @cache_layout)
+ path_options = expand_option(controller, @cache_path)
cache_path = ActionCachePath.new(controller, path_options || {})
body = controller.read_fragment(cache_path.path, @store_options)
@@ -173,11 +165,41 @@ module ActionController
body = controller._save_fragment(cache_path.path, @store_options)
end
- body = controller.render_to_string(text: body, layout: true) unless cache_layout
+ body = render_to_string(controller, body) unless cache_layout
controller.response_body = body
controller.content_type = Mime[cache_path.extension || :html]
end
+
+ if ActionPack::VERSION::STRING < "4.1"
+ def render_to_string(controller, body)
+ controller.render_to_string(text: body, layout: true)
+ end
+ else
+ def render_to_string(controller, body)
+ controller.render_to_string(html: body, layout: true)
+ end
+ end
+
+ private
+ def expand_option(controller, option)
+ option = option.to_proc if option.respond_to?(:to_proc)
+
+ if option.is_a?(Proc)
+ case option.arity
+ when -2, -1, 1
+ controller.instance_exec(controller, &option)
+ when 0
+ controller.instance_exec(&option)
+ else
+ raise ArgumentError, "Invalid proc arity of #{option.arity} - proc options should have an arity of 0 or 1"
+ end
+ elsif option.respond_to?(:call)
+ option.call(controller)
+ else
+ option
+ end
+ end
end
class ActionCachePath
@@ -189,19 +211,26 @@ module ActionController
# request format.
def initialize(controller, options = {}, infer_extension = true)
if infer_extension
- @extension = controller.params[:format]
+ if controller.params.key?(:format)
+ @extension = controller.params[:format]
+ elsif !controller.request.format.html?
+ @extension = controller.request.format.to_sym
+ else
+ @extension = nil
+ end
+
options.reverse_merge!(format: @extension) if options.is_a?(Hash)
end
- path = controller.url_for(options).split('://', 2).last
+ path = controller.url_for(options).split("://", 2).last
@path = normalize!(path)
end
private
def normalize!(path)
- ext = URI.parser.escape(extension) if extension
- path << 'index' if path[-1] == ?/
- path << ".#{ext}" if extension and !path.split('?', 2).first.ends_with?(".#{ext}")
+ ext = URI.parser.escape(extension.to_s) if extension
+ path << "index" if path[-1] == ?/
+ path << ".#{ext}" if extension && !path.split("?", 2).first.ends_with?(".#{ext}")
URI.parser.unescape(path)
end
end
diff --git a/lib/actionpack/action_caching.rb b/lib/actionpack/action_caching.rb
index 4f29f19..39c2792 100644
--- a/lib/actionpack/action_caching.rb
+++ b/lib/actionpack/action_caching.rb
@@ -1 +1 @@
-require 'action_controller/action_caching'
+require "actionpack/action_caching/railtie"
diff --git a/lib/actionpack/action_caching/railtie.rb b/lib/actionpack/action_caching/railtie.rb
index 8b09ad5..4708597 100644
--- a/lib/actionpack/action_caching/railtie.rb
+++ b/lib/actionpack/action_caching/railtie.rb
@@ -1,11 +1,11 @@
-require 'rails/railtie'
+require "rails/railtie"
module ActionPack
module ActionCaching
class Railtie < Rails::Railtie
- initializer 'action_pack.action_caching' do
+ initializer "action_pack.action_caching" do
ActiveSupport.on_load(:action_controller) do
- require 'action_controller/action_caching'
+ require "action_controller/action_caching"
end
end
end
diff --git a/metadata.yml b/metadata.yml
deleted file mode 100644
index 70604a1..0000000
--- a/metadata.yml
+++ /dev/null
@@ -1,117 +0,0 @@
---- !ruby/object:Gem::Specification
-name: actionpack-action_caching
-version: !ruby/object:Gem::Version
- version: 1.1.1
-platform: ruby
-authors:
-- David Heinemeier Hansson
-autorequire:
-bindir: bin
-cert_chain: []
-date: 2014-01-02 00:00:00.000000000 Z
-dependencies:
-- !ruby/object:Gem::Dependency
- name: actionpack
- requirement: !ruby/object:Gem::Requirement
- requirements:
- - - ">="
- - !ruby/object:Gem::Version
- version: 4.0.0
- - - "<"
- - !ruby/object:Gem::Version
- version: '5.0'
- type: :runtime
- prerelease: false
- version_requirements: !ruby/object:Gem::Requirement
- requirements:
- - - ">="
- - !ruby/object:Gem::Version
- version: 4.0.0
- - - "<"
- - !ruby/object:Gem::Version
- version: '5.0'
-- !ruby/object:Gem::Dependency
- name: mocha
- requirement: !ruby/object:Gem::Requirement
- requirements:
- - - ">="
- - !ruby/object:Gem::Version
- version: '0'
- type: :development
- prerelease: false
- version_requirements: !ruby/object:Gem::Requirement
- requirements:
- - - ">="
- - !ruby/object:Gem::Version
- version: '0'
-- !ruby/object:Gem::Dependency
- name: activerecord
- requirement: !ruby/object:Gem::Requirement
- requirements:
- - - ">="
- - !ruby/object:Gem::Version
- version: 4.0.0.beta
- - - "<"
- - !ruby/object:Gem::Version
- version: '5'
- type: :development
- prerelease: false
- version_requirements: !ruby/object:Gem::Requirement
- requirements:
- - - ">="
- - !ruby/object:Gem::Version
- version: 4.0.0.beta
- - - "<"
- - !ruby/object:Gem::Version
- version: '5'
-description: Action caching for Action Pack (removed from core in Rails 4.0)
-email: david at loudthinking.com
-executables: []
-extensions: []
-extra_rdoc_files: []
-files:
-- ".gitignore"
-- ".travis.yml"
-- CHANGELOG.md
-- Gemfile
-- LICENSE.txt
-- README.md
-- Rakefile
-- actionpack-action_caching.gemspec
-- gemfiles/Gemfile-4-0-stable
-- gemfiles/Gemfile-edge
-- lib/action_controller/action_caching.rb
-- lib/action_controller/caching/actions.rb
-- lib/actionpack/action_caching.rb
-- lib/actionpack/action_caching/railtie.rb
-- test/abstract_unit.rb
-- test/caching_test.rb
-- test/fixtures/layouts/talk_from_action.erb
-homepage: https://github.com/rails/actionpack-action_caching
-licenses:
-- MIT
-metadata: {}
-post_install_message:
-rdoc_options: []
-require_paths:
-- lib
-required_ruby_version: !ruby/object:Gem::Requirement
- requirements:
- - - ">="
- - !ruby/object:Gem::Version
- version: '0'
-required_rubygems_version: !ruby/object:Gem::Requirement
- requirements:
- - - ">="
- - !ruby/object:Gem::Version
- version: '0'
-requirements: []
-rubyforge_project:
-rubygems_version: 2.2.0
-signing_key:
-specification_version: 4
-summary: Action caching for Action Pack (removed from core in Rails 4.0)
-test_files:
-- test/abstract_unit.rb
-- test/caching_test.rb
-- test/fixtures/layouts/talk_from_action.erb
diff --git a/test/abstract_unit.rb b/test/abstract_unit.rb
index 9407a31..dbd6a1b 100644
--- a/test/abstract_unit.rb
+++ b/test/abstract_unit.rb
@@ -1,40 +1,11 @@
-require 'bundler/setup'
-require 'minitest/autorun'
-require 'action_controller'
-require 'active_record'
-require 'action_controller/action_caching'
+require "bundler/setup"
+require "minitest/autorun"
+require "action_controller"
+require "active_record"
+require "action_controller/action_caching"
-FIXTURE_LOAD_PATH = File.join(File.dirname(__FILE__), 'fixtures')
+FIXTURE_LOAD_PATH = File.expand_path("../fixtures", __FILE__)
-SharedTestRoutes = ActionDispatch::Routing::RouteSet.new
-
-module ActionController
- class Base
- include SharedTestRoutes.url_helpers
-
- self.view_paths = FIXTURE_LOAD_PATH
- end
-
- class TestCase
- def setup
- @routes = SharedTestRoutes
-
- @routes.draw do
- get ':controller(/:action)'
- end
- end
- end
-end
-
-module RackTestUtils
- def body_to_string(body)
- if body.respond_to?(:each)
- str = ''
- body.each {|s| str << s }
- str
- else
- body
- end
- end
- extend self
+if ActiveSupport.respond_to?(:test_order)
+ ActiveSupport.test_order = :random
end
diff --git a/test/caching_test.rb b/test/caching_test.rb
index 1e3d739..49b3d3b 100644
--- a/test/caching_test.rb
+++ b/test/caching_test.rb
@@ -1,8 +1,10 @@
-require 'abstract_unit'
+require "abstract_unit"
+require "mocha/setup"
-CACHE_DIR = 'test_cache'
-# Don't change '/../temp/' cavalierly or you might hose something you don't want hosed
-FILE_STORE_PATH = File.join(File.dirname(__FILE__), '/../temp/', CACHE_DIR)
+CACHE_DIR = "test_cache"
+# Don't change "../tmp" cavalierly or you might hose something you don't want hosed
+TEST_TMP_DIR = File.expand_path("../tmp", __FILE__)
+FILE_STORE_PATH = File.join(TEST_TMP_DIR, CACHE_DIR)
class CachingController < ActionController::Base
abstract!
@@ -12,7 +14,7 @@ end
class CachePath
def call(controller)
- ['controller', controller.params[:id]].compact.join('-')
+ ["controller", controller.params[:id]].compact.join("-")
end
end
@@ -23,99 +25,159 @@ class ActionCachingTestController < CachingController
rescue_from(ActiveRecord::RecordNotFound) { head :not_found }
end
- # Eliminate uninitialized ivar warning
- before_filter { @title = nil }
+ self.view_paths = FIXTURE_LOAD_PATH
- caches_action :index, :redirected, :forbidden, if: Proc.new { |c| c.request.format && !c.request.format.json? }, expires_in: 1.hour
- caches_action :show, cache_path: 'http://test.host/custom/show'
- caches_action :edit, cache_path: Proc.new { |c| c.params[:id] ? "http://test.host/#{c.params[:id]};edit" : 'http://test.host/edit' }
+ before_action only: :with_symbol_format do
+ request.params[:format] = :json
+ end
+
+ caches_action :index, :redirected, :forbidden, if: ->(c) { c.request.format && !c.request.format.json? }, expires_in: 1.hour
+ caches_action :show, cache_path: "http://test.host/custom/show"
+ caches_action :edit, cache_path: ->(c) { c.params[:id] ? "http://test.host/#{c.params[:id]};edit" : "http://test.host/edit" }
caches_action :custom_cache_path, cache_path: CachePath.new
+ caches_action :symbol_cache_path, cache_path: :cache_path_protected_method
caches_action :with_layout
- caches_action :with_format_and_http_param, cache_path: Proc.new { |c| { key: 'value' } }
+ caches_action :with_format_and_http_param, cache_path: ->(c) { { key: "value" } }
+ caches_action :with_symbol_format, cache_path: "http://test.host/action_caching_test/with_symbol_format"
+ caches_action :not_url_cache_path, cache_path: ->(c) { "#{c.params[:action]}_key" }
+ caches_action :not_url_cache_path_no_args, cache_path: -> { "#{params[:action]}_key" }
caches_action :layout_false, layout: false
- caches_action :with_layout_proc_param, layout: Proc.new { |c| c.params[:layout] }
+ caches_action :with_layout_proc_param, layout: ->(c) { c.params[:layout] != "false" }
+ caches_action :with_layout_proc_param_no_args, layout: -> { params[:layout] != "false" }
caches_action :record_not_found, :four_oh_four, :simple_runtime_error
caches_action :streaming
caches_action :invalid
+ caches_action :accept
- layout 'talk_from_action'
+ layout "talk_from_action"
def index
@cache_this = MockTime.now.to_f.to_s
- render text: @cache_this
+ render plain: @cache_this
end
def redirected
- redirect_to action: 'index'
+ redirect_to action: "index"
end
def forbidden
- render text: 'Forbidden'
- response.status = '403 Forbidden'
+ render plain: "Forbidden"
+ response.status = "403 Forbidden"
end
def with_layout
@cache_this = MockTime.now.to_f.to_s
- @title = nil
- render text: @cache_this, layout: true
+ render html: @cache_this, layout: true
end
def with_format_and_http_param
@cache_this = MockTime.now.to_f.to_s
- render text: @cache_this
+ render plain: @cache_this
+ end
+
+ def with_symbol_format
+ @cache_this = MockTime.now.to_f.to_s
+ render json: { timestamp: @cache_this }
+ end
+
+ def not_url_cache_path
+ render plain: "cache_this"
end
+ alias_method :not_url_cache_path_no_args, :not_url_cache_path
def record_not_found
- raise ActiveRecord::RecordNotFound, 'oops!'
+ raise ActiveRecord::RecordNotFound, "oops!"
end
def four_oh_four
- render text: "404'd!", status: 404
+ render plain: "404'd!", status: 404
end
def simple_runtime_error
- raise 'oops!'
+ raise "oops!"
end
alias_method :show, :index
alias_method :edit, :index
alias_method :destroy, :index
alias_method :custom_cache_path, :index
+ alias_method :symbol_cache_path, :index
alias_method :layout_false, :with_layout
alias_method :with_layout_proc_param, :with_layout
+ alias_method :with_layout_proc_param_no_args, :with_layout
def expire
- expire_action controller: 'action_caching_test', action: 'index'
- render nothing: true
+ expire_action controller: "action_caching_test", action: "index"
+ head :ok
end
def expire_xml
- expire_action controller: 'action_caching_test', action: 'index', format: 'xml'
- render nothing: true
+ expire_action controller: "action_caching_test", action: "index", format: "xml"
+ head :ok
end
def expire_with_url_string
- expire_action url_for(controller: 'action_caching_test', action: 'index')
- render nothing: true
+ expire_action url_for(controller: "action_caching_test", action: "index")
+ head :ok
end
def streaming
- render text: 'streaming', stream: true
+ render plain: "streaming", stream: true
end
def invalid
@cache_this = MockTime.now.to_f.to_s
respond_to do |format|
- format.json{ render json: @cache_this }
+ format.json { render json: @cache_this }
end
end
+
+ def accept
+ @cache_this = MockTime.now.to_f.to_s
+
+ respond_to do |format|
+ format.html { render html: @cache_this }
+ format.json { render json: @cache_this }
+ end
+ end
+
+ def expire_accept
+ if params.key?(:format)
+ expire_action action: "accept", format: params[:format]
+ elsif !request.format.html?
+ expire_action action: "accept", format: request.format.to_sym
+ else
+ expire_action action: "accept"
+ end
+
+ head :ok
+ end
+
+ protected
+ def cache_path_protected_method
+ ["controller", params[:id]].compact.join("-")
+ end
+
+ if ActionPack::VERSION::STRING < "4.1"
+ def render(options)
+ if options.key?(:plain)
+ super({ text: options.delete(:plain) }.merge(options))
+ response.content_type = "text/plain"
+ elsif options.key?(:html)
+ super({ text: options.delete(:html) }.merge(options))
+ response.content_type = "text/html"
+ else
+ super
+ end
+ end
+ end
end
class MockTime < Time
# Let Time spicy to assure that Time.now != Time.now
def to_f
- super+rand
+ super + rand
end
end
@@ -136,9 +198,9 @@ class ActionCachingMockController
end
def request
- Object.new.instance_eval(<<-EVAL)
- def path; '#{@mock_path}' end
- def format; 'all' end
+ Object.new.instance_eval <<-EVAL
+ def path; "#{@mock_path}" end
+ def format; "all" end
def parameters; { format: nil }; end
self
EVAL
@@ -150,7 +212,10 @@ class ActionCacheTest < ActionController::TestCase
def setup
super
- @request.host = 'hostname.com'
+
+ @routes = ActionDispatch::Routing::RouteSet.new
+
+ @request.host = "hostname.com"
FileUtils.mkdir_p(FILE_STORE_PATH)
@path_class = ActionController::Caching::Actions::ActionCachePath
@mock_controller = ActionCachingMockController.new
@@ -162,11 +227,15 @@ class ActionCacheTest < ActionController::TestCase
end
def test_simple_action_cache_with_http_head
+ draw do
+ get "/action_caching_test", to: "action_caching_test#index"
+ end
+
head :index
assert_response :success
cached_time = content_to_cache
assert_equal cached_time, @response.body
- assert fragment_exist?('hostname.com/action_caching_test')
+ assert fragment_exist?("hostname.com/action_caching_test")
head :index
assert_response :success
@@ -174,11 +243,15 @@ class ActionCacheTest < ActionController::TestCase
end
def test_simple_action_cache
+ draw do
+ get "/action_caching_test", to: "action_caching_test#index"
+ end
+
get :index
assert_response :success
cached_time = content_to_cache
assert_equal cached_time, @response.body
- assert fragment_exist?('hostname.com/action_caching_test')
+ assert fragment_exist?("hostname.com/action_caching_test")
get :index
assert_response :success
@@ -186,103 +259,155 @@ class ActionCacheTest < ActionController::TestCase
end
def test_simple_action_not_cached
+ draw do
+ get "/action_caching_test/destroy", to: "action_caching_test#destroy"
+ end
+
get :destroy
assert_response :success
cached_time = content_to_cache
assert_equal cached_time, @response.body
- assert !fragment_exist?('hostname.com/action_caching_test/destroy')
+ assert !fragment_exist?("hostname.com/action_caching_test/destroy")
get :destroy
assert_response :success
assert_not_equal cached_time, @response.body
end
- include RackTestUtils
-
def test_action_cache_with_layout
+ draw do
+ get "/action_caching_test/with_layout", to: "action_caching_test#with_layout"
+ end
+
get :with_layout
assert_response :success
cached_time = content_to_cache
assert_not_equal cached_time, @response.body
- assert fragment_exist?('hostname.com/action_caching_test/with_layout')
+ assert fragment_exist?("hostname.com/action_caching_test/with_layout")
get :with_layout
assert_response :success
assert_not_equal cached_time, @response.body
- body = body_to_string(read_fragment('hostname.com/action_caching_test/with_layout'))
- assert_equal @response.body, body
+ assert_equal @response.body, read_fragment("hostname.com/action_caching_test/with_layout")
end
def test_action_cache_with_layout_and_layout_cache_false
- get :layout_false
+ draw do
+ get "/action_caching_test/layout_false", to: "action_caching_test#layout_false"
+ end
+
+ get :layout_false, params: { title: "Request 1" }
assert_response :success
cached_time = content_to_cache
- assert_not_equal cached_time, @response.body
- assert fragment_exist?('hostname.com/action_caching_test/layout_false')
+ assert_equal "<title>Request 1</title>\n#{cached_time}", @response.body
+ assert_equal cached_time, read_fragment("hostname.com/action_caching_test/layout_false")
- get :layout_false
+ get :layout_false, params: { title: "Request 2" }
assert_response :success
- assert_not_equal cached_time, @response.body
- body = body_to_string(read_fragment('hostname.com/action_caching_test/layout_false'))
- assert_equal cached_time, body
+ assert_equal "<title>Request 2</title>\n#{cached_time}", @response.body
+ assert_equal cached_time, read_fragment("hostname.com/action_caching_test/layout_false")
end
def test_action_cache_with_layout_and_layout_cache_false_via_proc
- get :with_layout_proc_param, layout: false
+ draw do
+ get "/action_caching_test/with_layout_proc_param", to: "action_caching_test#with_layout_proc_param"
+ end
+
+ get :with_layout_proc_param, params: { title: "Request 1", layout: "false" }
assert_response :success
cached_time = content_to_cache
- assert_not_equal cached_time, @response.body
- assert fragment_exist?('hostname.com/action_caching_test/with_layout_proc_param')
+ assert_equal "<title>Request 1</title>\n#{cached_time}", @response.body
+ assert_equal cached_time, read_fragment("hostname.com/action_caching_test/with_layout_proc_param")
- get :with_layout_proc_param, layout: false
+ get :with_layout_proc_param, params: { title: "Request 2", layout: "false" }
assert_response :success
- assert_not_equal cached_time, @response.body
- body = body_to_string(read_fragment('hostname.com/action_caching_test/with_layout_proc_param'))
- assert_equal cached_time, body
+ assert_equal "<title>Request 2</title>\n#{cached_time}", @response.body
+ assert_equal cached_time, read_fragment("hostname.com/action_caching_test/with_layout_proc_param")
end
def test_action_cache_with_layout_and_layout_cache_true_via_proc
- get :with_layout_proc_param, layout: true
+ draw do
+ get "/action_caching_test/with_layout_proc_param", to: "action_caching_test#with_layout_proc_param"
+ end
+
+ get :with_layout_proc_param, params: { title: "Request 1", layout: "true" }
assert_response :success
cached_time = content_to_cache
- assert_not_equal cached_time, @response.body
- assert fragment_exist?('hostname.com/action_caching_test/with_layout_proc_param')
+ assert_equal "<title>Request 1</title>\n#{cached_time}", @response.body
+ assert_equal "<title>Request 1</title>\n#{cached_time}", read_fragment("hostname.com/action_caching_test/with_layout_proc_param")
- get :with_layout_proc_param, layout: true
+ get :with_layout_proc_param, params: { title: "Request 2", layout: "true" }
assert_response :success
- assert_not_equal cached_time, @response.body
- body = body_to_string(read_fragment('hostname.com/action_caching_test/with_layout_proc_param'))
- assert_equal @response.body, body
+ assert_equal "<title>Request 1</title>\n#{cached_time}", @response.body
+ assert_equal "<title>Request 1</title>\n#{cached_time}", read_fragment("hostname.com/action_caching_test/with_layout_proc_param")
end
def test_action_cache_conditional_options
- @request.env['HTTP_ACCEPT'] = 'application/json'
+ draw do
+ get "/action_caching_test", to: "action_caching_test#index"
+ end
+
+ @request.accept = "application/json"
get :index
assert_response :success
- assert !fragment_exist?('hostname.com/action_caching_test')
+ assert !fragment_exist?("hostname.com/action_caching_test")
end
def test_action_cache_with_format_and_http_param
- get :with_format_and_http_param, format: 'json'
+ draw do
+ get "/action_caching_test/with_format_and_http_param", to: "action_caching_test#with_format_and_http_param"
+ end
+
+ get :with_format_and_http_param, format: "json"
+ assert_response :success
+ assert !fragment_exist?("hostname.com/action_caching_test/with_format_and_http_param.json?key=value.json")
+ assert fragment_exist?("hostname.com/action_caching_test/with_format_and_http_param.json?key=value")
+ end
+
+ def test_action_cache_with_symbol_format
+ draw do
+ get "/action_caching_test/with_symbol_format", to: "action_caching_test#with_symbol_format"
+ end
+
+ get :with_symbol_format
+ assert_response :success
+ assert !fragment_exist?("test.host/action_caching_test/with_symbol_format")
+ assert fragment_exist?("test.host/action_caching_test/with_symbol_format.json")
+ end
+
+ def test_action_cache_not_url_cache_path
+ draw do
+ get "/action_caching_test/not_url_cache_path", to: "action_caching_test#not_url_cache_path"
+ end
+
+ get :not_url_cache_path
assert_response :success
- assert !fragment_exist?('hostname.com/action_caching_test/with_format_and_http_param.json?key=value.json')
- assert fragment_exist?('hostname.com/action_caching_test/with_format_and_http_param.json?key=value')
+ assert !fragment_exist?("test.host/action_caching_test/not_url_cache_path")
+ assert fragment_exist?("not_url_cache_path_key")
end
def test_action_cache_with_store_options
+ draw do
+ get "/action_caching_test", to: "action_caching_test#index"
+ end
+
MockTime.expects(:now).returns(12345).once
- @controller.expects(:read_fragment).with('hostname.com/action_caching_test', expires_in: 1.hour).once
- @controller.expects(:write_fragment).with('hostname.com/action_caching_test', '12345.0', expires_in: 1.hour).once
+ @controller.expects(:read_fragment).with("hostname.com/action_caching_test", expires_in: 1.hour).once
+ @controller.expects(:write_fragment).with("hostname.com/action_caching_test", "12345.0", expires_in: 1.hour).once
get :index
assert_response :success
end
def test_action_cache_with_custom_cache_path
+ draw do
+ get "/action_caching_test/show", to: "action_caching_test#show"
+ end
+
get :show
assert_response :success
cached_time = content_to_cache
assert_equal cached_time, @response.body
- assert fragment_exist?('test.host/custom/show')
+ assert fragment_exist?("test.host/custom/show")
get :show
assert_response :success
@@ -290,26 +415,53 @@ class ActionCacheTest < ActionController::TestCase
end
def test_action_cache_with_custom_cache_path_in_block
+ draw do
+ get "/action_caching_test/edit(/:id)", to: "action_caching_test#edit"
+ end
+
get :edit
assert_response :success
- assert fragment_exist?('test.host/edit')
+ assert fragment_exist?("test.host/edit")
- get :edit, id: 1
+ get :edit, params: { id: 1 }
assert_response :success
- assert fragment_exist?('test.host/1;edit')
+ assert fragment_exist?("test.host/1;edit")
end
def test_action_cache_with_custom_cache_path_with_custom_object
+ draw do
+ get "/action_caching_test/custom_cache_path(/:id)", to: "action_caching_test#custom_cache_path"
+ end
+
get :custom_cache_path
assert_response :success
- assert fragment_exist?('controller')
+ assert fragment_exist?("controller")
- get :custom_cache_path, id: 1
+ get :custom_cache_path, params: { id: 1 }
assert_response :success
- assert fragment_exist?('controller-1')
+ assert fragment_exist?("controller-1")
+ end
+
+ def test_action_cache_with_symbol_cache_path
+ draw do
+ get "/action_caching_test/symbol_cache_path(/:id)", to: "action_caching_test#symbol_cache_path"
+ end
+
+ get :symbol_cache_path
+ assert_response :success
+ assert fragment_exist?("controller")
+
+ get :symbol_cache_path, params: { id: 1 }
+ assert_response :success
+ assert fragment_exist?("controller-1")
end
def test_cache_expiration
+ draw do
+ get "/action_caching_test", to: "action_caching_test#index"
+ get "/action_caching_test/expire", to: "action_caching_test#expire"
+ end
+
get :index
assert_response :success
cached_time = content_to_cache
@@ -332,6 +484,11 @@ class ActionCacheTest < ActionController::TestCase
end
def test_cache_expiration_isnt_affected_by_request_format
+ draw do
+ get "/action_caching_test", to: "action_caching_test#index"
+ get "/action_caching_test/expire", to: "action_caching_test#expire"
+ end
+
get :index
cached_time = content_to_cache
@@ -345,6 +502,11 @@ class ActionCacheTest < ActionController::TestCase
end
def test_cache_expiration_with_url_string
+ draw do
+ get "/action_caching_test", to: "action_caching_test#index"
+ get "/action_caching_test/expire_with_url_string", to: "action_caching_test#expire_with_url_string"
+ end
+
get :index
cached_time = content_to_cache
@@ -358,29 +520,38 @@ class ActionCacheTest < ActionController::TestCase
end
def test_cache_is_scoped_by_subdomain
- @request.host = 'jamis.hostname.com'
+ draw do
+ get "/action_caching_test", to: "action_caching_test#index"
+ end
+
+ @request.host = "jamis.hostname.com"
get :index
assert_response :success
jamis_cache = content_to_cache
- @request.host = 'david.hostname.com'
+ @request.host = "david.hostname.com"
get :index
assert_response :success
david_cache = content_to_cache
assert_not_equal jamis_cache, @response.body
- @request.host = 'jamis.hostname.com'
+ @request.host = "jamis.hostname.com"
get :index
assert_response :success
assert_equal jamis_cache, @response.body
- @request.host = 'david.hostname.com'
+ @request.host = "david.hostname.com"
get :index
assert_response :success
assert_equal david_cache, @response.body
end
def test_redirect_is_not_cached
+ draw do
+ get "/action_caching_test", to: "action_caching_test#index"
+ get "/action_caching_test/redirected", to: "action_caching_test#redirected"
+ end
+
get :redirected
assert_response :redirect
get :redirected
@@ -388,6 +559,10 @@ class ActionCacheTest < ActionController::TestCase
end
def test_forbidden_is_not_cached
+ draw do
+ get "/action_caching_test/forbidden", to: "action_caching_test#forbidden"
+ end
+
get :forbidden
assert_response :forbidden
get :forbidden
@@ -395,71 +570,90 @@ class ActionCacheTest < ActionController::TestCase
end
def test_xml_version_of_resource_is_treated_as_different_cache
- with_routing do |set|
- set.draw do
- get ':controller(/:action(.:format))'
- end
+ draw do
+ get "/action_caching_test/index", to: "action_caching_test#index"
+ get "/action_caching_test/expire_xml", to: "action_caching_test#expire_xml"
+ end
- get :index, format: 'xml'
- assert_response :success
- cached_time = content_to_cache
- assert_equal cached_time, @response.body
- assert fragment_exist?('hostname.com/action_caching_test/index.xml')
+ get :index, format: "xml"
+ assert_response :success
+ cached_time = content_to_cache
+ assert_equal cached_time, @response.body
+ assert fragment_exist?("hostname.com/action_caching_test/index.xml")
- get :index, format: 'xml'
- assert_response :success
- assert_equal cached_time, @response.body
- assert_equal 'application/xml', @response.content_type
+ get :index, format: "xml"
+ assert_response :success
+ assert_equal cached_time, @response.body
+ assert_equal "application/xml", @response.content_type
- get :expire_xml
- assert_response :success
+ get :expire_xml
+ assert_response :success
- get :index, format: 'xml'
- assert_response :success
- assert_not_equal cached_time, @response.body
- end
+ get :index, format: "xml"
+ assert_response :success
+ assert_not_equal cached_time, @response.body
end
def test_correct_content_type_is_returned_for_cache_hit
+ draw do
+ get "/action_caching_test/index/:id", to: "action_caching_test#index"
+ end
+
# run it twice to cache it the first time
- get :index, id: 'content-type', format: 'xml'
- get :index, id: 'content-type', format: 'xml'
+ get :index, params: { id: "content-type" }, format: "xml"
+ get :index, params: { id: "content-type" }, format: "xml"
assert_response :success
- assert_equal 'application/xml', @response.content_type
+ assert_equal "application/xml", @response.content_type
end
def test_correct_content_type_is_returned_for_cache_hit_on_action_with_string_key
+ draw do
+ get "/action_caching_test/show", to: "action_caching_test#show"
+ end
+
# run it twice to cache it the first time
- get :show, format: 'xml'
- get :show, format: 'xml'
+ get :show, format: "xml"
+ get :show, format: "xml"
assert_response :success
- assert_equal 'application/xml', @response.content_type
+ assert_equal "application/xml", @response.content_type
end
def test_correct_content_type_is_returned_for_cache_hit_on_action_with_string_key_from_proc
+ draw do
+ get "/action_caching_test/edit/:id", to: "action_caching_test#edit"
+ end
+
# run it twice to cache it the first time
- get :edit, id: 1, format: 'xml'
- get :edit, id: 1, format: 'xml'
+ get :edit, params: { id: 1 }, format: "xml"
+ get :edit, params: { id: 1 }, format: "xml"
assert_response :success
- assert_equal 'application/xml', @response.content_type
+ assert_equal "application/xml", @response.content_type
end
def test_empty_path_is_normalized
- @mock_controller.mock_url_for = 'http://example.org/'
- @mock_controller.mock_path = '/'
+ @mock_controller.mock_url_for = "http://example.org/"
+ @mock_controller.mock_path = "/"
- assert_equal 'example.org/index', @path_class.new(@mock_controller, {}).path
+ assert_equal "example.org/index", @path_class.new(@mock_controller, {}).path
end
def test_file_extensions
- get :index, id: 'kitten.jpg'
- get :index, id: 'kitten.jpg'
+ draw do
+ get "/action_caching_test/index/*id", to: "action_caching_test#index", format: false
+ end
+
+ get :index, params: { id: "kitten.jpg" }
+ get :index, params: { id: "kitten.jpg" }
assert_response :success
end
if defined? ActiveRecord
def test_record_not_found_returns_404_for_multiple_requests
+ draw do
+ get "/action_caching_test/record_not_found", to: "action_caching_test#record_not_found"
+ end
+
get :record_not_found
assert_response 404
get :record_not_found
@@ -468,6 +662,10 @@ class ActionCacheTest < ActionController::TestCase
end
def test_four_oh_four_returns_404_for_multiple_requests
+ draw do
+ get "/action_caching_test/four_oh_four", to: "action_caching_test#four_oh_four"
+ end
+
get :four_oh_four
assert_response 404
get :four_oh_four
@@ -475,11 +673,19 @@ class ActionCacheTest < ActionController::TestCase
end
def test_four_oh_four_renders_content
+ draw do
+ get "/action_caching_test/four_oh_four", to: "action_caching_test#four_oh_four"
+ end
+
get :four_oh_four
assert_equal "404'd!", @response.body
end
def test_simple_runtime_error_returns_500_for_multiple_requests
+ draw do
+ get "/action_caching_test/simple_runtime_error", to: "action_caching_test#simple_runtime_error"
+ end
+
get :simple_runtime_error
assert_response 500
get :simple_runtime_error
@@ -487,35 +693,177 @@ class ActionCacheTest < ActionController::TestCase
end
def test_action_caching_plus_streaming
+ draw do
+ get "/action_caching_test/streaming", to: "action_caching_test#streaming"
+ end
+
get :streaming
assert_response :success
assert_match(/streaming/, @response.body)
- assert fragment_exist?('hostname.com/action_caching_test/streaming')
+ assert fragment_exist?("hostname.com/action_caching_test/streaming")
end
def test_invalid_format_returns_not_acceptable
- get :invalid, format: 'json'
+ draw do
+ get "/action_caching_test/invalid", to: "action_caching_test#invalid"
+ end
+
+ get :invalid, format: "json"
assert_response :success
cached_time = content_to_cache
assert_equal cached_time, @response.body
assert fragment_exist?("hostname.com/action_caching_test/invalid.json")
- get :invalid, format: 'json'
+ get :invalid, format: "json"
assert_response :success
assert_equal cached_time, @response.body
- get :invalid, format: 'xml'
+ get :invalid, format: "xml"
assert_response :not_acceptable
- get :invalid, format: '\xC3\x83'
+ get :invalid, format: "\xC3\x83"
assert_response :not_acceptable
end
+ def test_format_from_accept_header
+ draw do
+ get "/action_caching_test/accept", to: "action_caching_test#accept"
+ get "/action_caching_test/accept/expire", to: "action_caching_test#expire_accept"
+ end
+
+ # Cache the JSON format
+ get_json :accept
+ json_cached_time = content_to_cache
+ assert_cached json_cached_time, "application/json"
+
+ # Check that the JSON format is cached
+ get_json :accept
+ assert_cached json_cached_time, "application/json"
+
+ # Cache the HTML format
+ get_html :accept
+ html_cached_time = content_to_cache
+ assert_cached html_cached_time
+
+ # Check that it's not the JSON format
+ assert_not_equal json_cached_time, @response.body
+
+ # Check that the HTML format is cached
+ get_html :accept
+ assert_cached html_cached_time
+
+ # Check that the JSON format is still cached
+ get_json :accept
+ assert_cached json_cached_time, "application/json"
+
+ # Expire the JSON format
+ get_json :expire_accept
+ assert_response :success
+
+ # Check that the HTML format is still cached
+ get_html :accept
+ assert_cached html_cached_time
+
+ # Check the JSON format was expired
+ get_json :accept
+ new_json_cached_time = content_to_cache
+ assert_cached new_json_cached_time, "application/json"
+ assert_not_equal json_cached_time, @response.body
+
+ # Expire the HTML format
+ get_html :expire_accept
+ assert_response :success
+
+ # Check that the JSON format is still cached
+ get_json :accept
+ assert_cached new_json_cached_time, "application/json"
+
+ # Check the HTML format was expired
+ get_html :accept
+ new_html_cached_time = content_to_cache
+ assert_cached new_html_cached_time
+ assert_not_equal html_cached_time, @response.body
+ end
+
+ def test_explicit_html_format_is_used_for_fragment_path
+ draw do
+ get "/action_caching_test/accept", to: "action_caching_test#accept"
+ get "/action_caching_test/accept/expire", to: "action_caching_test#expire_accept"
+ end
+
+ get :accept, format: "html"
+ cached_time = content_to_cache
+ assert_cached cached_time
+
+ assert fragment_exist?("hostname.com/action_caching_test/accept.html")
+
+ get :accept, format: "html"
+ cached_time = content_to_cache
+ assert_cached cached_time
+
+ get :expire_accept, format: "html"
+ assert_response :success
+
+ assert !fragment_exist?("hostname.com/action_caching_test/accept.html")
+
+ get :accept, format: "html"
+ assert_not_cached cached_time
+ end
+
+ def test_lambda_arity_with_cache_path
+ draw do
+ get "/action_caching_test/not_url_cache_path_no_args", to: "action_caching_test#not_url_cache_path_no_args"
+ end
+
+ get :not_url_cache_path_no_args
+ assert_response :success
+ assert !fragment_exist?("test.host/action_caching_test/not_url_cache_path_no_args")
+ assert fragment_exist?("not_url_cache_path_no_args_key")
+ end
+
+ def test_lambda_arity_with_layout
+ draw do
+ get "/action_caching_test/with_layout_proc_param_no_args", to: "action_caching_test#with_layout_proc_param_no_args"
+ end
+
+ get :with_layout_proc_param_no_args, params: { title: "Request 1", layout: "false" }
+ assert_response :success
+ cached_time = content_to_cache
+ assert_equal "<title>Request 1</title>\n#{cached_time}", @response.body
+ assert_equal cached_time, read_fragment("hostname.com/action_caching_test/with_layout_proc_param_no_args")
+
+ get :with_layout_proc_param_no_args, params: { title: "Request 2", layout: "false" }
+ assert_response :success
+ assert_equal "<title>Request 2</title>\n#{cached_time}", @response.body
+ assert_equal cached_time, read_fragment("hostname.com/action_caching_test/with_layout_proc_param_no_args")
+ end
+
private
+ def get_html(*args)
+ @request.accept = "text/html"
+ get(*args)
+ end
+
+ def get_json(*args)
+ @request.accept = "application/json"
+ get(*args)
+ end
+
+ def assert_cached(cache_time, content_type = "text/html")
+ assert_response :success
+ assert_equal cache_time, @response.body
+ assert_equal content_type, @response.content_type
+ end
+
+ def assert_not_cached(cache_time, content_type = "text/html")
+ assert_response :success
+ assert_not_equal cache_time, @response.body
+ assert_equal content_type, @response.content_type
+ end
def content_to_cache
- assigns(:cache_this)
+ @controller.instance_variable_get(:@cache_this)
end
def fragment_exist?(path)
@@ -525,4 +873,21 @@ class ActionCacheTest < ActionController::TestCase
def read_fragment(path)
@controller.read_fragment(path)
end
+
+ def draw(&block)
+ @routes = ActionDispatch::Routing::RouteSet.new
+ @routes.draw(&block)
+ @controller.extend(@routes.url_helpers)
+ end
+
+ if ActionPack::VERSION::STRING < "5.0"
+ def get(action, options = {})
+ format = options.slice(:format)
+ params = options[:params] || {}
+ session = options[:session] || {}
+ flash = options[:flash] || {}
+
+ super(action, params.merge(format), session, flash)
+ end
+ end
end
diff --git a/test/fixtures/layouts/talk_from_action.erb b/test/fixtures/layouts/talk_from_action.erb
deleted file mode 100644
index 935a3f0..0000000
--- a/test/fixtures/layouts/talk_from_action.erb
+++ /dev/null
@@ -1,2 +0,0 @@
-<title><%= @title || yield(:title) %></title>
-<%= yield -%>
diff --git a/test/fixtures/layouts/talk_from_action.html.erb b/test/fixtures/layouts/talk_from_action.html.erb
new file mode 100644
index 0000000..15009ed
--- /dev/null
+++ b/test/fixtures/layouts/talk_from_action.html.erb
@@ -0,0 +1,2 @@
+<title><%= params[:title] %></title>
+<%= yield -%>
--
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/pkg-ruby-extras/ruby-actionpack-action-caching.git
More information about the Pkg-ruby-extras-commits
mailing list