action_controller_tweaks 0.1

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: aeeb3006ab00803aac920b909546dbfcb1853544
4
+ data.tar.gz: ed85182325fced848b6d19bc30f18c996197d583
5
+ SHA512:
6
+ metadata.gz: 43e666c777d955b2da529f99afa44054ea51e2915ad4c6d61c30df1524cd41881179817170cb541b19d47787bda3b22b4f4ce7679757326102be9f4f1b29f30d
7
+ data.tar.gz: 4b68f979cc6074dbbe199cd11b857bc6f3c01ccfe1a9c82cf9d800468140bced99a692e611feb82f36704ef5b7cc60fedf08a108c7a4845cde3df04726ca21e8
data/.gitignore ADDED
@@ -0,0 +1,2 @@
1
+ gemfiles/*.gemfile.lock
2
+ Gemfile.lock
data/.rspec ADDED
@@ -0,0 +1 @@
1
+ --color
data/.travis.yml ADDED
@@ -0,0 +1,13 @@
1
+ script: "bundle exec rspec"
2
+ rvm:
3
+ - 1.9.2
4
+ - 1.9.3
5
+ - 2.0.0
6
+ gemfile:
7
+ - gemfiles/rails3_2.gemfile
8
+ - gemfiles/rails4_0.gemfile
9
+ matrix:
10
+ exclude:
11
+ - rvm: 1.9.2
12
+ gemfile: gemfiles/rails4_0.gemfile
13
+
data/Appraisals ADDED
@@ -0,0 +1,12 @@
1
+
2
+ appraise "rails3-2" do
3
+ version = "3.2.14"
4
+ gem 'activesupport', version
5
+ gem 'actionpack', version
6
+ end
7
+
8
+ appraise "rails4-0" do
9
+ version = "4.0.0"
10
+ gem 'activesupport', version
11
+ gem 'actionpack', version
12
+ end
data/CHANGELOG.md ADDED
@@ -0,0 +1,5 @@
1
+ ### Changelog
2
+
3
+
4
+ - **0.1**
5
+ - Initial Release
data/Gemfile ADDED
@@ -0,0 +1,2 @@
1
+ source 'https://rubygems.org'
2
+ gemspec
data/LICENSE ADDED
@@ -0,0 +1,20 @@
1
+ The MIT License (MIT)
2
+
3
+ Copyright (c) 2013 PikachuEXE
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy of
6
+ this software and associated documentation files (the "Software"), to deal in
7
+ the Software without restriction, including without limitation the rights to
8
+ use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
9
+ the Software, and to permit persons to whom the Software is furnished to do so,
10
+ subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
17
+ FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
18
+ COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
19
+ IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
20
+ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
data/README.md ADDED
@@ -0,0 +1,51 @@
1
+ Action Controller Tweaks
2
+ ===========
3
+
4
+ ActionController is great, but could be better. Here are some tweaks for it.
5
+
6
+ ### Support
7
+ ===========
8
+ Tested against:
9
+ - Action Controller of version `3.2` and `4.0` (`3.1` and below got problem with buggy `rspec-rails`)
10
+ - Ruby `1.9.2`, `1.9.3`, `2.0.0` (except Rails 4 with `1.9.2`)
11
+
12
+ [![Build Status](https://travis-ci.org/PikachuEXE/action_controller_tweaks.png?branch=master)](https://travis-ci.org/PikachuEXE/action_controller_tweaks)
13
+ [![Gem Version](https://badge.fury.io/rb/action_controller_tweaks.png)](http://badge.fury.io/rb/action_controller_tweaks)
14
+ [![Dependency Status](https://gemnasium.com/PikachuEXE/action_controller_tweaks.png)](https://gemnasium.com/PikachuEXE/action_controller_tweaks)
15
+ [![Coverage Status](https://coveralls.io/repos/PikachuEXE/action_controller_tweaks/badge.png)](https://coveralls.io/r/PikachuEXE/action_controller_tweaks)
16
+ [![Code Climate](https://codeclimate.com/github/PikachuEXE/action_controller_tweaks.png)](https://codeclimate.com/github/PikachuEXE/action_controller_tweaks)
17
+
18
+ Install
19
+ =======
20
+
21
+ ```ruby
22
+ gem 'action_controller_tweaks'
23
+ ```
24
+
25
+ Usage
26
+ =====
27
+
28
+ Either include it in specific controller or just `ApplicationController`
29
+ ```ruby
30
+ class SomeController
31
+ include ActionControllerTweaks
32
+ end
33
+ ```
34
+
35
+ ### `#set_no_cache`
36
+ I got the code from [This Stack Overflow Answer](http://stackoverflow.com/questions/711418/how-to-prevent-browser-page-caching-in-rails)
37
+ `#expires_now` is not good enough when I test a mobile version page with Chrome on iOS
38
+ Usage:
39
+ ```ruby
40
+ # Just like using #expires_now
41
+ set_no_cache
42
+ ```
43
+
44
+ ### `#set_session`
45
+ I write this on my own, it's ok to blame me if it's buggy :P
46
+ This method let's you set session, with expiry time!
47
+ Example:
48
+ ```ruby
49
+ set_session(:key, 'value', expire_in: 1.day)
50
+ ```
51
+ Note: Please don't use the session key `session_keys_to_expire`, it's reserved for internal processing
data/Rakefile ADDED
@@ -0,0 +1,11 @@
1
+ require 'appraisal'
2
+ require 'rubygems'
3
+ require 'bundler/setup'
4
+ require 'bundler/gem_tasks'
5
+ require 'rspec/core/rake_task'
6
+
7
+ task :default do
8
+ sh "rake appraisal:install && rake appraisal spec"
9
+ end
10
+
11
+ RSpec::Core::RakeTask.new(:spec)
@@ -0,0 +1,37 @@
1
+ # -*- encoding: utf-8 -*-
2
+ $:.push File.expand_path("../lib", __FILE__)
3
+
4
+ author_name = 'PikachuEXE'
5
+ gem_name = 'action_controller_tweaks'
6
+
7
+ require "#{gem_name}/version"
8
+
9
+ Gem::Specification.new do |s|
10
+ s.platform = Gem::Platform::RUBY
11
+ s.name = gem_name
12
+ s.version = ActionControllerTweaks::VERSION
13
+ s.summary = 'Some Tweaks for ActionController'
14
+ s.description = 'ActionController is great, but could be better. Here are some tweaks for it.'
15
+
16
+ s.license = 'MIT'
17
+
18
+ s.authors = [author_name]
19
+ s.email = ['pikachuexe@gmail.com']
20
+ s.homepage = "http://github.com/#{author_name}/#{gem_name}"
21
+
22
+ s.files = `git ls-files`.split("\n")
23
+ s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
24
+ s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
25
+ s.require_paths = ['lib']
26
+
27
+ s.add_dependency 'activesupport', '>= 3.2.0', '< 5.0.0'
28
+ s.add_dependency 'actionpack', '>= 3.2.0', '< 5.0.0'
29
+
30
+ s.add_development_dependency 'rake'
31
+ s.add_development_dependency 'appraisal'
32
+ s.add_development_dependency 'rspec'
33
+ s.add_development_dependency 'rspec-rails'
34
+ s.add_development_dependency 'activerecord', '>= 3.2.0', '< 5.0.0' # rspec-rails needs activerecord...
35
+ s.add_development_dependency 'timecop'
36
+ s.add_development_dependency 'coveralls'
37
+ end
@@ -0,0 +1,8 @@
1
+ # This file was generated by Appraisal
2
+
3
+ source "https://rubygems.org"
4
+
5
+ gem "activesupport", "3.2.14"
6
+ gem "actionpack", "3.2.14"
7
+
8
+ gemspec :path=>"../"
@@ -0,0 +1,8 @@
1
+ # This file was generated by Appraisal
2
+
3
+ source "https://rubygems.org"
4
+
5
+ gem "activesupport", "4.0.0"
6
+ gem "actionpack", "4.0.0"
7
+
8
+ gemspec :path=>"../"
@@ -0,0 +1,14 @@
1
+ require 'active_support/concern'
2
+
3
+ require 'action_controller_tweaks/version'
4
+ require 'action_controller_tweaks/caching'
5
+ require 'action_controller_tweaks/session'
6
+
7
+ module ActionControllerTweaks
8
+ extend ActiveSupport::Concern
9
+
10
+ included do
11
+ include Caching
12
+ include Session
13
+ end
14
+ end
@@ -0,0 +1,24 @@
1
+ require 'active_support/concern'
2
+
3
+ module ActionControllerTweaks
4
+ module Caching
5
+ extend ActiveSupport::Concern
6
+
7
+ HEADERS = {
8
+ "Cache-Control" => "no-cache, no-store, max-age=0, must-revalidate, pre-check=0, post-check=0", # HTTP 1.1
9
+ "no-cache" => "no-cache", # HTTP 1.0
10
+ "Expires" => "Fri, 01 Jan 1990 00:00:00 GMT", # Proxies
11
+ }.freeze
12
+
13
+ included do
14
+ private
15
+
16
+ # Should be more powerful than #expire_now
17
+ def set_no_cache
18
+ HEADERS.each do |key, value|
19
+ response.headers[key] = value
20
+ end
21
+ end
22
+ end
23
+ end
24
+ end
@@ -0,0 +1,57 @@
1
+ require 'active_support/concern'
2
+ require 'active_support/time'
3
+
4
+ module ActionControllerTweaks
5
+ module Session
6
+ extend ActiveSupport::Concern
7
+
8
+ SPECIAL_KEYS = %w( session_keys_to_expire )
9
+
10
+ included do
11
+ before_filter :delete_expired_session_keys
12
+
13
+ private
14
+
15
+ def set_session(key, value, options = {})
16
+ key = key.to_sym
17
+
18
+ if SPECIAL_KEYS.include?(key.to_s)
19
+ return
20
+ end
21
+
22
+ session[key] = value
23
+
24
+ # Set special session
25
+ new_session_keys_to_expire = session_keys_to_expire
26
+
27
+ expire_in = options.delete(:expire_in)
28
+ if expire_in && expire_in.is_a?(Integer) # Time period
29
+ new_session_keys_to_expire[key] = expire_in.from_now
30
+ end
31
+
32
+ session[:session_keys_to_expire] = new_session_keys_to_expire
33
+ end
34
+
35
+ def delete_expired_session_keys
36
+ # Remove keys that are expired
37
+ session_keys_to_expire.each do |key, expire_at_str|
38
+ begin
39
+ if Time.now > Time.parse(expire_at_str.to_s)
40
+ session.delete(key)
41
+ session_keys_to_expire.delete(key)
42
+ end
43
+ rescue ArgumentError
44
+ # Parse error
45
+ # Let's expire it to be safe
46
+ session.delete(key)
47
+ session_keys_to_expire.delete(key)
48
+ end
49
+ end
50
+ end
51
+
52
+ def session_keys_to_expire
53
+ session[:session_keys_to_expire] || {}
54
+ end
55
+ end
56
+ end
57
+ end
@@ -0,0 +1,3 @@
1
+ module ActionControllerTweaks
2
+ VERSION = '0.1'.freeze
3
+ end
@@ -0,0 +1,84 @@
1
+ require 'spec_helper'
2
+
3
+ describe PostsController, type: :controller do
4
+ describe 'included modules' do
5
+ it do
6
+ described_class.ancestors.should include(ActionControllerTweaks)
7
+ end
8
+ end
9
+
10
+ describe '::Caching' do
11
+ describe '#set_no_cache' do
12
+ before do
13
+ get :index, no_cache: true
14
+ end
15
+
16
+ it 'includes the pre defined headeres' do
17
+ controller.headers.deep_include?(ActionControllerTweaks::Caching::HEADERS).should be_true
18
+ end
19
+ end
20
+ end
21
+
22
+ describe '::Session' do
23
+ describe '#set_session' do
24
+ let(:session_key) { :key }
25
+ let(:session_value) { 'value' }
26
+ let(:expire_in) { 60 * 60 } # 1 hour
27
+ let!(:time_now) { Time.new(2013, 1, 1) }
28
+ let!(:time_before_expire) { time_now + (expire_in / 2) }
29
+ let!(:time_after_expire) { time_now + (expire_in * 2) }
30
+
31
+ context 'when calling it without option' do
32
+ before do
33
+ controller.send(:set_session, session_key, session_value)
34
+ end
35
+
36
+ it 'set the session' do
37
+ session[session_key].should eq session_value
38
+ end
39
+
40
+ context 'with a special key' do
41
+ let(:session_key) { ActionControllerTweaks::Session::SPECIAL_KEYS.first }
42
+
43
+ it 'does not set the session' do
44
+ session[session_key].should be_nil
45
+ end
46
+ end
47
+ end
48
+
49
+ context 'when calling it with option expire_in' do
50
+ before do
51
+ Timecop.freeze(time_now)
52
+ controller.send(:set_session, session_key, session_value, expire_in: expire_in)
53
+ end
54
+
55
+ it 'set the session' do
56
+ session[session_key].should eq session_value
57
+ end
58
+
59
+ context 'before expire time' do
60
+ before do
61
+ Timecop.travel(time_before_expire)
62
+ # Runs before_filter
63
+ get :index
64
+ end
65
+
66
+ it 'keeps the session key' do
67
+ session[session_key].should eq session_value
68
+ end
69
+ end
70
+ context 'after expire time' do
71
+ before do
72
+ Timecop.travel(time_after_expire)
73
+ # Runs before_filter
74
+ get :index
75
+ end
76
+
77
+ it 'keeps the session key' do
78
+ session.key?(session_key).should be_false
79
+ end
80
+ end
81
+ end
82
+ end
83
+ end
84
+ end
@@ -0,0 +1,21 @@
1
+ require 'active_support/all'
2
+ require 'action_controller'
3
+ require 'action_dispatch'
4
+
5
+ module Rails
6
+ class App
7
+ def env_config; {} end
8
+ def routes
9
+ return @routes if defined?(@routes)
10
+ @routes = ActionDispatch::Routing::RouteSet.new
11
+ @routes.draw do
12
+ resources :posts # Replace with your own needs
13
+ end
14
+ @routes
15
+ end
16
+ end
17
+
18
+ def self.application
19
+ @app ||= App.new
20
+ end
21
+ end
@@ -0,0 +1,16 @@
1
+ class TestController < ActionController::Base
2
+ include Rails.application.routes.url_helpers
3
+
4
+ def render(*attributes); end
5
+ end
6
+
7
+ class PostsController < TestController
8
+ include ActionControllerTweaks
9
+
10
+ def index
11
+ if params[:no_cache]
12
+ set_no_cache
13
+ end
14
+ end
15
+
16
+ end
@@ -0,0 +1,28 @@
1
+ require 'coveralls'
2
+ Coveralls.wear!('rails')
3
+
4
+ require 'action_controller_tweaks'
5
+
6
+ require 'fixtures/application'
7
+ require 'fixtures/controllers'
8
+ require 'rspec/rails'
9
+
10
+ require 'timecop'
11
+ require 'logger'
12
+
13
+
14
+ # For comparison
15
+ class Hash
16
+ def deep_include?(sub_hash)
17
+ sub_hash.keys.all? do |key|
18
+ self.has_key?(key) && if sub_hash[key].is_a?(Hash)
19
+ self[key].is_a?(Hash) && self[key].deep_include?(sub_hash[key])
20
+ else
21
+ self[key] == sub_hash[key]
22
+ end
23
+ end
24
+ end
25
+ end
26
+
27
+ RSpec.configure do |config|
28
+ end
metadata ADDED
@@ -0,0 +1,213 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: action_controller_tweaks
3
+ version: !ruby/object:Gem::Version
4
+ version: '0.1'
5
+ platform: ruby
6
+ authors:
7
+ - PikachuEXE
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2013-08-30 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: activesupport
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - '>='
18
+ - !ruby/object:Gem::Version
19
+ version: 3.2.0
20
+ - - <
21
+ - !ruby/object:Gem::Version
22
+ version: 5.0.0
23
+ type: :runtime
24
+ prerelease: false
25
+ version_requirements: !ruby/object:Gem::Requirement
26
+ requirements:
27
+ - - '>='
28
+ - !ruby/object:Gem::Version
29
+ version: 3.2.0
30
+ - - <
31
+ - !ruby/object:Gem::Version
32
+ version: 5.0.0
33
+ - !ruby/object:Gem::Dependency
34
+ name: actionpack
35
+ requirement: !ruby/object:Gem::Requirement
36
+ requirements:
37
+ - - '>='
38
+ - !ruby/object:Gem::Version
39
+ version: 3.2.0
40
+ - - <
41
+ - !ruby/object:Gem::Version
42
+ version: 5.0.0
43
+ type: :runtime
44
+ prerelease: false
45
+ version_requirements: !ruby/object:Gem::Requirement
46
+ requirements:
47
+ - - '>='
48
+ - !ruby/object:Gem::Version
49
+ version: 3.2.0
50
+ - - <
51
+ - !ruby/object:Gem::Version
52
+ version: 5.0.0
53
+ - !ruby/object:Gem::Dependency
54
+ name: rake
55
+ requirement: !ruby/object:Gem::Requirement
56
+ requirements:
57
+ - - '>='
58
+ - !ruby/object:Gem::Version
59
+ version: '0'
60
+ type: :development
61
+ prerelease: false
62
+ version_requirements: !ruby/object:Gem::Requirement
63
+ requirements:
64
+ - - '>='
65
+ - !ruby/object:Gem::Version
66
+ version: '0'
67
+ - !ruby/object:Gem::Dependency
68
+ name: appraisal
69
+ requirement: !ruby/object:Gem::Requirement
70
+ requirements:
71
+ - - '>='
72
+ - !ruby/object:Gem::Version
73
+ version: '0'
74
+ type: :development
75
+ prerelease: false
76
+ version_requirements: !ruby/object:Gem::Requirement
77
+ requirements:
78
+ - - '>='
79
+ - !ruby/object:Gem::Version
80
+ version: '0'
81
+ - !ruby/object:Gem::Dependency
82
+ name: rspec
83
+ requirement: !ruby/object:Gem::Requirement
84
+ requirements:
85
+ - - '>='
86
+ - !ruby/object:Gem::Version
87
+ version: '0'
88
+ type: :development
89
+ prerelease: false
90
+ version_requirements: !ruby/object:Gem::Requirement
91
+ requirements:
92
+ - - '>='
93
+ - !ruby/object:Gem::Version
94
+ version: '0'
95
+ - !ruby/object:Gem::Dependency
96
+ name: rspec-rails
97
+ requirement: !ruby/object:Gem::Requirement
98
+ requirements:
99
+ - - '>='
100
+ - !ruby/object:Gem::Version
101
+ version: '0'
102
+ type: :development
103
+ prerelease: false
104
+ version_requirements: !ruby/object:Gem::Requirement
105
+ requirements:
106
+ - - '>='
107
+ - !ruby/object:Gem::Version
108
+ version: '0'
109
+ - !ruby/object:Gem::Dependency
110
+ name: activerecord
111
+ requirement: !ruby/object:Gem::Requirement
112
+ requirements:
113
+ - - '>='
114
+ - !ruby/object:Gem::Version
115
+ version: 3.2.0
116
+ - - <
117
+ - !ruby/object:Gem::Version
118
+ version: 5.0.0
119
+ type: :development
120
+ prerelease: false
121
+ version_requirements: !ruby/object:Gem::Requirement
122
+ requirements:
123
+ - - '>='
124
+ - !ruby/object:Gem::Version
125
+ version: 3.2.0
126
+ - - <
127
+ - !ruby/object:Gem::Version
128
+ version: 5.0.0
129
+ - !ruby/object:Gem::Dependency
130
+ name: timecop
131
+ requirement: !ruby/object:Gem::Requirement
132
+ requirements:
133
+ - - '>='
134
+ - !ruby/object:Gem::Version
135
+ version: '0'
136
+ type: :development
137
+ prerelease: false
138
+ version_requirements: !ruby/object:Gem::Requirement
139
+ requirements:
140
+ - - '>='
141
+ - !ruby/object:Gem::Version
142
+ version: '0'
143
+ - !ruby/object:Gem::Dependency
144
+ name: coveralls
145
+ requirement: !ruby/object:Gem::Requirement
146
+ requirements:
147
+ - - '>='
148
+ - !ruby/object:Gem::Version
149
+ version: '0'
150
+ type: :development
151
+ prerelease: false
152
+ version_requirements: !ruby/object:Gem::Requirement
153
+ requirements:
154
+ - - '>='
155
+ - !ruby/object:Gem::Version
156
+ version: '0'
157
+ description: ActionController is great, but could be better. Here are some tweaks
158
+ for it.
159
+ email:
160
+ - pikachuexe@gmail.com
161
+ executables: []
162
+ extensions: []
163
+ extra_rdoc_files: []
164
+ files:
165
+ - .gitignore
166
+ - .rspec
167
+ - .travis.yml
168
+ - Appraisals
169
+ - CHANGELOG.md
170
+ - Gemfile
171
+ - LICENSE
172
+ - README.md
173
+ - Rakefile
174
+ - action_controller_tweaks.gemspec
175
+ - gemfiles/rails3_2.gemfile
176
+ - gemfiles/rails4_0.gemfile
177
+ - lib/action_controller_tweaks.rb
178
+ - lib/action_controller_tweaks/caching.rb
179
+ - lib/action_controller_tweaks/session.rb
180
+ - lib/action_controller_tweaks/version.rb
181
+ - spec/action_controller_tweaks_spec.rb
182
+ - spec/fixtures/application.rb
183
+ - spec/fixtures/controllers.rb
184
+ - spec/spec_helper.rb
185
+ homepage: http://github.com/PikachuEXE/action_controller_tweaks
186
+ licenses:
187
+ - MIT
188
+ metadata: {}
189
+ post_install_message:
190
+ rdoc_options: []
191
+ require_paths:
192
+ - lib
193
+ required_ruby_version: !ruby/object:Gem::Requirement
194
+ requirements:
195
+ - - '>='
196
+ - !ruby/object:Gem::Version
197
+ version: '0'
198
+ required_rubygems_version: !ruby/object:Gem::Requirement
199
+ requirements:
200
+ - - '>='
201
+ - !ruby/object:Gem::Version
202
+ version: '0'
203
+ requirements: []
204
+ rubyforge_project:
205
+ rubygems_version: 2.0.7
206
+ signing_key:
207
+ specification_version: 4
208
+ summary: Some Tweaks for ActionController
209
+ test_files:
210
+ - spec/action_controller_tweaks_spec.rb
211
+ - spec/fixtures/application.rb
212
+ - spec/fixtures/controllers.rb
213
+ - spec/spec_helper.rb