action_controller_tweaks 0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
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