varnish_sweeper 0.0.4

Sign up to get free protection for your applications and to get access to all the features.
data/.document ADDED
@@ -0,0 +1,5 @@
1
+ lib/**/*.rb
2
+ bin/*
3
+ -
4
+ features/**/*.feature
5
+ LICENSE.txt
data/.rspec ADDED
@@ -0,0 +1 @@
1
+ --color
data/Gemfile ADDED
@@ -0,0 +1,18 @@
1
+ source "http://rubygems.org"
2
+ # Add dependencies required to use your gem here.
3
+ # Example:
4
+ # gem "activesupport", ">= 2.3.5"
5
+
6
+ # Add dependencies to develop your gem here.
7
+ # Include everything needed to run rake, tests, features, etc.
8
+ gem "resque"
9
+ gem "resque-loner"
10
+ gem "curb"
11
+ #
12
+ group :development do
13
+ gem "rspec", "~> 2.0.0"
14
+ gem "yard", "~> 0.6.0"
15
+ gem "bundler", "~> 1.0.0"
16
+ gem "jeweler", "~> 1.5.0.pre6"
17
+ gem "rcov", ">= 0"
18
+ end
data/Gemfile.lock ADDED
@@ -0,0 +1,54 @@
1
+ GEM
2
+ remote: http://rubygems.org/
3
+ specs:
4
+ curb (0.7.9)
5
+ diff-lcs (1.1.2)
6
+ git (1.2.5)
7
+ jeweler (1.5.2)
8
+ bundler (~> 1.0.0)
9
+ git (>= 1.2.5)
10
+ rake
11
+ json (1.4.6)
12
+ rack (1.2.1)
13
+ rake (0.8.7)
14
+ rcov (0.9.9)
15
+ redis (2.1.1)
16
+ redis-namespace (0.8.0)
17
+ redis (< 3.0.0)
18
+ resque (1.10.0)
19
+ json (~> 1.4.6)
20
+ redis-namespace (~> 0.8.0)
21
+ sinatra (>= 0.9.2)
22
+ vegas (~> 0.1.2)
23
+ resque-loner (0.1.3)
24
+ resque (~> 1.0)
25
+ rspec (2.0.1)
26
+ rspec-core (~> 2.0.1)
27
+ rspec-expectations (~> 2.0.1)
28
+ rspec-mocks (~> 2.0.1)
29
+ rspec-core (2.0.1)
30
+ rspec-expectations (2.0.1)
31
+ diff-lcs (>= 1.1.2)
32
+ rspec-mocks (2.0.1)
33
+ rspec-core (~> 2.0.1)
34
+ rspec-expectations (~> 2.0.1)
35
+ sinatra (1.1.2)
36
+ rack (~> 1.1)
37
+ tilt (~> 1.2)
38
+ tilt (1.2.1)
39
+ vegas (0.1.8)
40
+ rack (>= 1.0.0)
41
+ yard (0.6.4)
42
+
43
+ PLATFORMS
44
+ ruby
45
+
46
+ DEPENDENCIES
47
+ bundler (~> 1.0.0)
48
+ curb
49
+ jeweler (~> 1.5.0.pre6)
50
+ rcov
51
+ resque
52
+ resque-loner
53
+ rspec (~> 2.0.0)
54
+ yard (~> 0.6.0)
data/LICENSE.txt ADDED
@@ -0,0 +1,20 @@
1
+ Copyright (c) 2011 Daniel Bornkessel
2
+
3
+ Permission is hereby granted, free of charge, to any person obtaining
4
+ a copy of this software and associated documentation files (the
5
+ "Software"), to deal in the Software without restriction, including
6
+ without limitation the rights to use, copy, modify, merge, publish,
7
+ distribute, sublicense, and/or sell copies of the Software, and to
8
+ permit persons to whom the Software is furnished to do so, subject to
9
+ the following conditions:
10
+
11
+ The above copyright notice and this permission notice shall be
12
+ included in all copies or substantial portions of the Software.
13
+
14
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
15
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
16
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
17
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
18
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
19
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
20
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
data/README.rdoc ADDED
@@ -0,0 +1,19 @@
1
+ = varnish_sweeper
2
+
3
+ Description goes here.
4
+
5
+ == Contributing to varnish_sweeper
6
+
7
+ * Check out the latest master to make sure the feature hasn't been implemented or the bug hasn't been fixed yet
8
+ * Check out the issue tracker to make sure someone already hasn't requested it and/or contributed it
9
+ * Fork the project
10
+ * Start a feature/bugfix branch
11
+ * Commit and push until you are happy with your contribution
12
+ * Make sure to add tests for it. This is important so I don't break it in a future version unintentionally.
13
+ * Please try not to mess with the Rakefile, version, or history. If you want to have your own version, or is otherwise necessary, that is fine, but please isolate to its own commit so I can cherry-pick around it.
14
+
15
+ == Copyright
16
+
17
+ Copyright (c) 2011 Daniel Bornkessel. See LICENSE.txt for
18
+ further details.
19
+
data/Rakefile ADDED
@@ -0,0 +1,43 @@
1
+ require 'rubygems'
2
+ require 'bundler'
3
+ begin
4
+ Bundler.setup(:default, :development)
5
+ rescue Bundler::BundlerError => e
6
+ $stderr.puts e.message
7
+ $stderr.puts "Run `bundle install` to install missing gems"
8
+ exit e.status_code
9
+ end
10
+ require 'rake'
11
+
12
+ require 'jeweler'
13
+ Jeweler::Tasks.new do |gem|
14
+ # gem is a Gem::Specification... see http://docs.rubygems.org/read/chapter/20 for more options
15
+ gem.name = "varnish_sweeper"
16
+ gem.homepage = "http://github.com/kesselborn/varnish_sweeper"
17
+ gem.license = "MIT"
18
+ gem.summary = %Q{A few helper functions that help caching web pages}
19
+ gem.description = %Q{hihih}
20
+ gem.email = "daniel@moviepilot.com"
21
+ gem.authors = ["Daniel Bornkessel"]
22
+ # Include your dependencies below. Runtime dependencies are required when using your gem,
23
+ # and development dependencies are only needed for development (ie running rake tasks, tests, etc)
24
+ # gem.add_runtime_dependency 'jabber4r', '> 0.1'
25
+ # gem.add_development_dependency 'rspec', '> 1.2.3'
26
+ end
27
+ Jeweler::RubygemsDotOrgTasks.new
28
+
29
+ require 'rspec/core'
30
+ require 'rspec/core/rake_task'
31
+ RSpec::Core::RakeTask.new(:spec) do |spec|
32
+ spec.pattern = FileList['spec/**/*_spec.rb']
33
+ end
34
+
35
+ RSpec::Core::RakeTask.new(:rcov) do |spec|
36
+ spec.pattern = 'spec/**/*_spec.rb'
37
+ spec.rcov = true
38
+ end
39
+
40
+ task :default => :spec
41
+
42
+ require 'yard'
43
+ YARD::Rake::YardocTask.new
data/VERSION ADDED
@@ -0,0 +1 @@
1
+ 0.0.4
@@ -0,0 +1,16 @@
1
+ require 'resque-loner'
2
+
3
+ class SweeperJob < Resque::Plugins::Loner::UniqueJob
4
+ @queue = :sweeper
5
+
6
+ def self.perform( urls, options = {} )
7
+ if urls
8
+ urls.each do |url|
9
+ Curl::Easy.perform(url) do |curl|
10
+ curl.headers["X-Varnish-Control"] = "sweep"
11
+ end
12
+ Rails.logger.debug "sweeped #{url}"
13
+ end
14
+ end
15
+ end
16
+ end
data/lib/varnish.rb ADDED
@@ -0,0 +1,65 @@
1
+ module Varnish
2
+ def make_cacheable(options = {})
3
+ if should_be_cached?(options)
4
+ headers['Cache-Control'] = cache_control_text(options)
5
+ end
6
+
7
+ if options[:depends_on] && request.headers['X_VARNISH']
8
+ remember_url_for_obj(request.url, options)
9
+ end
10
+ end
11
+
12
+ def sweep_cache_for(obj)
13
+ return unless obj
14
+ if cache_data = Rails.cache.read( varnish_cache_key(obj) )
15
+ Rails.cache.delete( varnish_cache_key(obj) )
16
+ Resque.enqueue(SweeperJob, cache_data[:urls])
17
+ end
18
+ end
19
+
20
+ protected
21
+ def cache_control_text(options)
22
+ return unless should_be_cached?(options)
23
+
24
+ string_array = []
25
+ string_array << options[:private] ? "private" : "public"
26
+
27
+ string_array << "max-age=%d" % options[:max_age].to_i if options[:max_age]
28
+ string_array << "s-maxage=%d" % options[:s_max_age].to_i if options[:s_max_age]
29
+
30
+ string_array.join(", ")
31
+ end
32
+
33
+
34
+ def remember_url_for_obj(url, options = {})
35
+ obj = options[:depends_on]
36
+ cache_key = varnish_cache_key(obj)
37
+ current_time = Time.now
38
+
39
+ expire_times = [current_time]
40
+ expire_times << current_time + options[:max_age] if options[:max_age]
41
+ expire_times << current_time + options[:s_max_age] if options[:s_max_age]
42
+
43
+ cached_urls_for_obj = [url]
44
+ cached_data = Rails.cache.read(cache_key)
45
+ if cached_data
46
+ expire_times << cached_data[:expires_at]
47
+ cached_urls_for_obj = cached_urls_for_obj + cached_data[:urls]
48
+ end
49
+
50
+ # EXPIRE THIS BEAST AT SOME POINT OF TIME
51
+ Rails.cache.write( cache_key,
52
+ {:expires_at => expire_times.max, :urls => cached_urls_for_obj.uniq},
53
+ :expires_in => (expire_times.max - Time.now).to_i )
54
+ end
55
+
56
+ def should_be_cached?(options)
57
+ request.headers['X_VARNISH'] && ( options[:max_age] || options[:s_max_age] )
58
+ end
59
+
60
+ def varnish_cache_key(obj)
61
+ "varnish_cw_#{obj.class_name}_#{obj.hash}"
62
+ end
63
+
64
+ end
65
+
@@ -0,0 +1,4 @@
1
+ require 'varnish'
2
+ ApplicationController.send(:include, Varnish)
3
+ ActionController::Caching::Sweeper.send(:include, Varnish)
4
+ require 'sweeper_job'
@@ -0,0 +1,21 @@
1
+ class ApplicationController
2
+ end
3
+
4
+ module ActionController
5
+ module Caching
6
+ class Sweeper
7
+ end
8
+ end
9
+ end
10
+
11
+
12
+ require 'varnish_sweeper'
13
+ require 'rspec'
14
+
15
+ # Requires supporting files with custom matchers and macros, etc,
16
+ # in ./support/ and its subdirectories.
17
+ Dir["#{File.dirname(__FILE__)}/support/**/*.rb"].each {|f| require f}
18
+
19
+ RSpec.configure do |config|
20
+
21
+ end
@@ -0,0 +1,17 @@
1
+ require File.expand_path(File.dirname(__FILE__) + '/spec_helper')
2
+
3
+ describe "VarnishSweeper" do
4
+ it "should provide our functions to the ApplicationController" do
5
+ ApplicationController.new.should respond_to(:make_cacheable)
6
+ ApplicationController.new.should respond_to(:sweep_cache_for)
7
+ end
8
+
9
+ it "should provide our functions to the ActionController::Caching::Sweeper" do
10
+ ActionController::Caching::Sweeper.new.should respond_to(:make_cacheable)
11
+ ActionController::Caching::Sweeper.new.should respond_to(:sweep_cache_for)
12
+ end
13
+
14
+ it "should make the sweeper job available" do
15
+ defined?(SweeperJob).should_not be_nil
16
+ end
17
+ end
@@ -0,0 +1,79 @@
1
+ # Generated by jeweler
2
+ # DO NOT EDIT THIS FILE DIRECTLY
3
+ # Instead, edit Jeweler::Tasks in Rakefile, and run 'rake gemspec'
4
+ # -*- encoding: utf-8 -*-
5
+
6
+ Gem::Specification.new do |s|
7
+ s.name = %q{varnish_sweeper}
8
+ s.version = "0.0.4"
9
+
10
+ s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
+ s.authors = ["Daniel Bornkessel"]
12
+ s.date = %q{2011-01-10}
13
+ s.description = %q{hihih}
14
+ s.email = %q{daniel@moviepilot.com}
15
+ s.extra_rdoc_files = [
16
+ "LICENSE.txt",
17
+ "README.rdoc"
18
+ ]
19
+ s.files = [
20
+ ".document",
21
+ ".rspec",
22
+ "Gemfile",
23
+ "Gemfile.lock",
24
+ "LICENSE.txt",
25
+ "README.rdoc",
26
+ "Rakefile",
27
+ "VERSION",
28
+ "lib/sweeper_job.rb",
29
+ "lib/varnish.rb",
30
+ "lib/varnish_sweeper.rb",
31
+ "spec/spec_helper.rb",
32
+ "spec/varnish_sweeper_spec.rb",
33
+ "varnish_sweeper.gemspec"
34
+ ]
35
+ s.homepage = %q{http://github.com/kesselborn/varnish_sweeper}
36
+ s.licenses = ["MIT"]
37
+ s.require_paths = ["lib"]
38
+ s.rubygems_version = %q{1.3.7}
39
+ s.summary = %q{A few helper functions that help caching web pages}
40
+ s.test_files = [
41
+ "spec/spec_helper.rb",
42
+ "spec/varnish_sweeper_spec.rb"
43
+ ]
44
+
45
+ if s.respond_to? :specification_version then
46
+ current_version = Gem::Specification::CURRENT_SPECIFICATION_VERSION
47
+ s.specification_version = 3
48
+
49
+ if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
50
+ s.add_runtime_dependency(%q<resque>, [">= 0"])
51
+ s.add_runtime_dependency(%q<resque-loner>, [">= 0"])
52
+ s.add_runtime_dependency(%q<curb>, [">= 0"])
53
+ s.add_development_dependency(%q<rspec>, ["~> 2.0.0"])
54
+ s.add_development_dependency(%q<yard>, ["~> 0.6.0"])
55
+ s.add_development_dependency(%q<bundler>, ["~> 1.0.0"])
56
+ s.add_development_dependency(%q<jeweler>, ["~> 1.5.0.pre6"])
57
+ s.add_development_dependency(%q<rcov>, [">= 0"])
58
+ else
59
+ s.add_dependency(%q<resque>, [">= 0"])
60
+ s.add_dependency(%q<resque-loner>, [">= 0"])
61
+ s.add_dependency(%q<curb>, [">= 0"])
62
+ s.add_dependency(%q<rspec>, ["~> 2.0.0"])
63
+ s.add_dependency(%q<yard>, ["~> 0.6.0"])
64
+ s.add_dependency(%q<bundler>, ["~> 1.0.0"])
65
+ s.add_dependency(%q<jeweler>, ["~> 1.5.0.pre6"])
66
+ s.add_dependency(%q<rcov>, [">= 0"])
67
+ end
68
+ else
69
+ s.add_dependency(%q<resque>, [">= 0"])
70
+ s.add_dependency(%q<resque-loner>, [">= 0"])
71
+ s.add_dependency(%q<curb>, [">= 0"])
72
+ s.add_dependency(%q<rspec>, ["~> 2.0.0"])
73
+ s.add_dependency(%q<yard>, ["~> 0.6.0"])
74
+ s.add_dependency(%q<bundler>, ["~> 1.0.0"])
75
+ s.add_dependency(%q<jeweler>, ["~> 1.5.0.pre6"])
76
+ s.add_dependency(%q<rcov>, [">= 0"])
77
+ end
78
+ end
79
+
metadata ADDED
@@ -0,0 +1,192 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: varnish_sweeper
3
+ version: !ruby/object:Gem::Version
4
+ prerelease: false
5
+ segments:
6
+ - 0
7
+ - 0
8
+ - 4
9
+ version: 0.0.4
10
+ platform: ruby
11
+ authors:
12
+ - Daniel Bornkessel
13
+ autorequire:
14
+ bindir: bin
15
+ cert_chain: []
16
+
17
+ date: 2011-01-10 00:00:00 +01:00
18
+ default_executable:
19
+ dependencies:
20
+ - !ruby/object:Gem::Dependency
21
+ name: resque
22
+ requirement: &id001 !ruby/object:Gem::Requirement
23
+ none: false
24
+ requirements:
25
+ - - ">="
26
+ - !ruby/object:Gem::Version
27
+ segments:
28
+ - 0
29
+ version: "0"
30
+ type: :runtime
31
+ prerelease: false
32
+ version_requirements: *id001
33
+ - !ruby/object:Gem::Dependency
34
+ name: resque-loner
35
+ requirement: &id002 !ruby/object:Gem::Requirement
36
+ none: false
37
+ requirements:
38
+ - - ">="
39
+ - !ruby/object:Gem::Version
40
+ segments:
41
+ - 0
42
+ version: "0"
43
+ type: :runtime
44
+ prerelease: false
45
+ version_requirements: *id002
46
+ - !ruby/object:Gem::Dependency
47
+ name: curb
48
+ requirement: &id003 !ruby/object:Gem::Requirement
49
+ none: false
50
+ requirements:
51
+ - - ">="
52
+ - !ruby/object:Gem::Version
53
+ segments:
54
+ - 0
55
+ version: "0"
56
+ type: :runtime
57
+ prerelease: false
58
+ version_requirements: *id003
59
+ - !ruby/object:Gem::Dependency
60
+ name: rspec
61
+ requirement: &id004 !ruby/object:Gem::Requirement
62
+ none: false
63
+ requirements:
64
+ - - ~>
65
+ - !ruby/object:Gem::Version
66
+ segments:
67
+ - 2
68
+ - 0
69
+ - 0
70
+ version: 2.0.0
71
+ type: :development
72
+ prerelease: false
73
+ version_requirements: *id004
74
+ - !ruby/object:Gem::Dependency
75
+ name: yard
76
+ requirement: &id005 !ruby/object:Gem::Requirement
77
+ none: false
78
+ requirements:
79
+ - - ~>
80
+ - !ruby/object:Gem::Version
81
+ segments:
82
+ - 0
83
+ - 6
84
+ - 0
85
+ version: 0.6.0
86
+ type: :development
87
+ prerelease: false
88
+ version_requirements: *id005
89
+ - !ruby/object:Gem::Dependency
90
+ name: bundler
91
+ requirement: &id006 !ruby/object:Gem::Requirement
92
+ none: false
93
+ requirements:
94
+ - - ~>
95
+ - !ruby/object:Gem::Version
96
+ segments:
97
+ - 1
98
+ - 0
99
+ - 0
100
+ version: 1.0.0
101
+ type: :development
102
+ prerelease: false
103
+ version_requirements: *id006
104
+ - !ruby/object:Gem::Dependency
105
+ name: jeweler
106
+ requirement: &id007 !ruby/object:Gem::Requirement
107
+ none: false
108
+ requirements:
109
+ - - ~>
110
+ - !ruby/object:Gem::Version
111
+ segments:
112
+ - 1
113
+ - 5
114
+ - 0
115
+ - pre6
116
+ version: 1.5.0.pre6
117
+ type: :development
118
+ prerelease: false
119
+ version_requirements: *id007
120
+ - !ruby/object:Gem::Dependency
121
+ name: rcov
122
+ requirement: &id008 !ruby/object:Gem::Requirement
123
+ none: false
124
+ requirements:
125
+ - - ">="
126
+ - !ruby/object:Gem::Version
127
+ segments:
128
+ - 0
129
+ version: "0"
130
+ type: :development
131
+ prerelease: false
132
+ version_requirements: *id008
133
+ description: hihih
134
+ email: daniel@moviepilot.com
135
+ executables: []
136
+
137
+ extensions: []
138
+
139
+ extra_rdoc_files:
140
+ - LICENSE.txt
141
+ - README.rdoc
142
+ files:
143
+ - .document
144
+ - .rspec
145
+ - Gemfile
146
+ - Gemfile.lock
147
+ - LICENSE.txt
148
+ - README.rdoc
149
+ - Rakefile
150
+ - VERSION
151
+ - lib/sweeper_job.rb
152
+ - lib/varnish.rb
153
+ - lib/varnish_sweeper.rb
154
+ - spec/spec_helper.rb
155
+ - spec/varnish_sweeper_spec.rb
156
+ - varnish_sweeper.gemspec
157
+ has_rdoc: true
158
+ homepage: http://github.com/kesselborn/varnish_sweeper
159
+ licenses:
160
+ - MIT
161
+ post_install_message:
162
+ rdoc_options: []
163
+
164
+ require_paths:
165
+ - lib
166
+ required_ruby_version: !ruby/object:Gem::Requirement
167
+ none: false
168
+ requirements:
169
+ - - ">="
170
+ - !ruby/object:Gem::Version
171
+ hash: -1409484695132746894
172
+ segments:
173
+ - 0
174
+ version: "0"
175
+ required_rubygems_version: !ruby/object:Gem::Requirement
176
+ none: false
177
+ requirements:
178
+ - - ">="
179
+ - !ruby/object:Gem::Version
180
+ segments:
181
+ - 0
182
+ version: "0"
183
+ requirements: []
184
+
185
+ rubyforge_project:
186
+ rubygems_version: 1.3.7
187
+ signing_key:
188
+ specification_version: 3
189
+ summary: A few helper functions that help caching web pages
190
+ test_files:
191
+ - spec/spec_helper.rb
192
+ - spec/varnish_sweeper_spec.rb