purgeable 0.0.1 → 0.1.0
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.
- data/GEM_VERSION +1 -0
- data/README.md +91 -0
- data/generators/purgeable/purgeable_install_generator.rb +27 -0
- data/lib/generators/purgeable/install_generator.rb +19 -0
- data/lib/purgeable.rb +2 -0
- data/lib/purgeable/client.rb +11 -4
- data/lib/purgeable/http_resource.rb +1 -1
- data/lib/purgeable/railtie.rb +14 -0
- data/lib/purgeable/settings.rb +22 -9
- data/lib/purgeable/version.rb +17 -0
- data/rails/init.rb +9 -0
- data/templates/install/purgeable.yml +23 -0
- metadata +12 -4
data/GEM_VERSION
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
v0.1.0
|
data/README.md
ADDED
@@ -0,0 +1,91 @@
|
|
1
|
+
# Purgeable
|
2
|
+
|
3
|
+
Purge contents from shared caches easily by sending a HTTP method "PURGE".
|
4
|
+
|
5
|
+
## Configuration
|
6
|
+
|
7
|
+
Configuration file structure:
|
8
|
+
|
9
|
+
```yaml
|
10
|
+
# ./purgeable.yml
|
11
|
+
sample: &sample
|
12
|
+
http_cache:
|
13
|
+
- resource_hosts:
|
14
|
+
- "www.example.com"
|
15
|
+
- "www2.example.com"
|
16
|
+
cache_locations:
|
17
|
+
- "varnish1.example.com"
|
18
|
+
- "varnish2.example.com"
|
19
|
+
- resource_hosts:
|
20
|
+
- "www3.example.com"
|
21
|
+
- "www4.example.com"
|
22
|
+
cache_locations:
|
23
|
+
- "varnish3.example.com"
|
24
|
+
- "varnish4.example.com"
|
25
|
+
|
26
|
+
production:
|
27
|
+
<<: *sample
|
28
|
+
```
|
29
|
+
|
30
|
+
Configuration load example:
|
31
|
+
|
32
|
+
```ruby
|
33
|
+
Purgeable.load_settings("./purgeable.yml", "production")
|
34
|
+
```
|
35
|
+
|
36
|
+
## Rails generators
|
37
|
+
|
38
|
+
Rails 2 generator:
|
39
|
+
|
40
|
+
```bash
|
41
|
+
$ script/generate purgeable_install
|
42
|
+
create config/purgeable.yml
|
43
|
+
```
|
44
|
+
|
45
|
+
Rails 3 generator:
|
46
|
+
|
47
|
+
```bash
|
48
|
+
$ script/rails generate purgeable:install
|
49
|
+
create config/purgeable.yml
|
50
|
+
```
|
51
|
+
|
52
|
+
## Usage
|
53
|
+
|
54
|
+
Simple usage:
|
55
|
+
|
56
|
+
```ruby
|
57
|
+
client = Purgeable::Client.new
|
58
|
+
urls = %w[
|
59
|
+
http://www.example.com/article/my-example
|
60
|
+
http://www3.example.com/article/id/1234
|
61
|
+
]
|
62
|
+
client.purge(urls) # => {
|
63
|
+
# "http://www.example.com/article/my-example" => {
|
64
|
+
# "varnish1.example.com" => #<Net::HTTPOK 200 Purged readbody=true>,
|
65
|
+
# "varnish2.example.com" => #<Net::HTTPOK 200 Purged readbody=true>
|
66
|
+
# },
|
67
|
+
# "http://www3.example.com/article/id/1234" => {
|
68
|
+
# "varnish3.example.com" => #<Net::HTTPOK 200 Purged readbody=true>,
|
69
|
+
# "varnish4.example.com" => #<Net::HTTPOK 200 Purged readbody=true>
|
70
|
+
# },
|
71
|
+
# }
|
72
|
+
```
|
73
|
+
|
74
|
+
Model helpers usage:
|
75
|
+
|
76
|
+
```ruby
|
77
|
+
class Article < ActiveRecord::Base
|
78
|
+
include Purgeable::HttpResource
|
79
|
+
|
80
|
+
def resource_url
|
81
|
+
"http://www3.example.com/article/id/#{id}"
|
82
|
+
end
|
83
|
+
|
84
|
+
http_purge { "http://www.example.com/article/#{friendly_title}" }
|
85
|
+
http_purge :resource_url
|
86
|
+
|
87
|
+
after_save :perform_purge # send the HTTP PURGE to configured caches on save
|
88
|
+
end
|
89
|
+
```
|
90
|
+
|
91
|
+
Enjoy it.
|
@@ -0,0 +1,27 @@
|
|
1
|
+
require 'rbconfig'
|
2
|
+
|
3
|
+
class PurgeableInstallGenerator < Rails::Generator::Base
|
4
|
+
def manifest
|
5
|
+
record do |m|
|
6
|
+
m.file "purgeable.yml", "config/purgeable.yml"
|
7
|
+
end
|
8
|
+
end
|
9
|
+
|
10
|
+
def self.gem_root
|
11
|
+
File.expand_path('../../../', __FILE__)
|
12
|
+
end
|
13
|
+
|
14
|
+
def self.source_root
|
15
|
+
File.join(gem_root, 'templates', 'install')
|
16
|
+
end
|
17
|
+
|
18
|
+
def source_root
|
19
|
+
self.class.source_root
|
20
|
+
end
|
21
|
+
|
22
|
+
private
|
23
|
+
|
24
|
+
def banner
|
25
|
+
"Usage: #{$0} purgeable_install"
|
26
|
+
end
|
27
|
+
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
require 'rbconfig'
|
2
|
+
|
3
|
+
module Purgeable
|
4
|
+
class InstallGenerator < ::Rails::Generators::Base
|
5
|
+
|
6
|
+
def generate
|
7
|
+
copy_file "purgeable.yml", "config/purgeable.yml"
|
8
|
+
end
|
9
|
+
|
10
|
+
def self.gem_root
|
11
|
+
File.expand_path("../../../../", __FILE__)
|
12
|
+
end
|
13
|
+
|
14
|
+
def self.source_root
|
15
|
+
File.join(gem_root, 'templates/install')
|
16
|
+
end
|
17
|
+
|
18
|
+
end
|
19
|
+
end
|
data/lib/purgeable.rb
CHANGED
@@ -2,7 +2,9 @@
|
|
2
2
|
module Purgeable
|
3
3
|
autoload :HttpResource, "purgeable/http_resource"
|
4
4
|
autoload :Client, "purgeable/client"
|
5
|
+
autoload :VERSION, "purgeable/version"
|
5
6
|
end
|
6
7
|
|
7
8
|
require "purgeable/http/purge"
|
8
9
|
require "purgeable/settings"
|
10
|
+
require "purgeable/railtie" if defined?(::Rails) && defined?(::Rails::Railtie)
|
data/lib/purgeable/client.rb
CHANGED
@@ -2,15 +2,22 @@
|
|
2
2
|
module Purgeable
|
3
3
|
class Client
|
4
4
|
def purge(urls)
|
5
|
+
purge_all(urls)
|
6
|
+
end
|
7
|
+
|
8
|
+
private
|
9
|
+
def purge_all(urls, responses = {})
|
5
10
|
if urls.is_a?(String)
|
6
|
-
cache_locations_for(urls).
|
11
|
+
cache_locations_for(urls).each do |location|
|
12
|
+
next if (responses[urls] ||= {}).has_key?(location)
|
13
|
+
responses[urls][location] = perform_purge(location, urls)
|
14
|
+
end
|
7
15
|
elsif urls.is_a?(Array)
|
8
|
-
urls.
|
16
|
+
urls.each{ |url| purge_all(url, responses) }
|
9
17
|
end
|
18
|
+
responses
|
10
19
|
end
|
11
20
|
|
12
|
-
private
|
13
|
-
|
14
21
|
def perform_purge(location, url)
|
15
22
|
ip, port = location.split(/:/)
|
16
23
|
port = 80 if port.nil? || port.empty?
|
@@ -0,0 +1,14 @@
|
|
1
|
+
# encoding: UTF-8
|
2
|
+
module Purgeable
|
3
|
+
class Railtie < ::Rails::Railtie
|
4
|
+
initializer "setup http cache" do
|
5
|
+
config_file = ::Rails.root.join("config/purgeable.yml")
|
6
|
+
if File.exists? config_file
|
7
|
+
Purgeable.load_settings config_file, ::Rails.env
|
8
|
+
else
|
9
|
+
puts "Purgeable config not found. Create a config file at: config/purgeable.yml"
|
10
|
+
puts "to generate one run: rails generate purgeable:install"
|
11
|
+
end
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
data/lib/purgeable/settings.rb
CHANGED
@@ -6,19 +6,32 @@ require "methodize"
|
|
6
6
|
module Purgeable
|
7
7
|
SETTINGS = {}.extend ::Methodize
|
8
8
|
|
9
|
-
def self.load_settings
|
9
|
+
def self.load_settings(file_path, env)
|
10
10
|
raise "Invalid config location: #{file_path.inspect}" unless File.exists? file_path
|
11
11
|
config = YAML.load(ERB.new(File.read(file_path)).result)[env]
|
12
12
|
SETTINGS.merge! config if config.is_a?(Hash)
|
13
|
-
|
14
|
-
SETTINGS.http_cache.each do |cfg|
|
15
|
-
cfg.extend ::Methodize unless cfg.kind_of?(MethodizedHash)
|
16
|
-
end
|
17
|
-
end
|
13
|
+
normalize_settings
|
18
14
|
end
|
19
15
|
|
20
|
-
|
21
|
-
|
22
|
-
|
16
|
+
private
|
17
|
+
|
18
|
+
def self.normalize_settings
|
19
|
+
SETTINGS["http_cache"] = [] unless SETTINGS.http_cache.is_a?(Array)
|
20
|
+
SETTINGS.http_cache.each do |cfg|
|
21
|
+
next unless cfg.is_a?(Hash)
|
22
|
+
cfg.extend ::Methodize if defined?(::MethodizedHash) && !cfg.kind_of?(MethodizedHash)
|
23
|
+
cfg["cache_locations"] =
|
24
|
+
case cfg["cache_locations"]
|
25
|
+
when String then [cfg["cache_locations"]]
|
26
|
+
when Array then cfg["cache_locations"]
|
27
|
+
else []
|
28
|
+
end
|
29
|
+
cfg["resource_hosts"] =
|
30
|
+
case cfg["resource_hosts"]
|
31
|
+
when String then [cfg["resource_hosts"]]
|
32
|
+
when Array then cfg["resource_hosts"]
|
33
|
+
else []
|
34
|
+
end
|
35
|
+
end
|
23
36
|
end
|
24
37
|
end
|
@@ -0,0 +1,17 @@
|
|
1
|
+
# encoding: UTF-8
|
2
|
+
module Purgeable
|
3
|
+
version = nil
|
4
|
+
version_file = ::File.expand_path('../../../GEM_VERSION', __FILE__)
|
5
|
+
version = File.read(version_file) if version.nil? && ::File.exists?(version_file)
|
6
|
+
version = $1 if version.nil? && ::File.expand_path('../..', __FILE__) =~ /\/purgeable-(\d+(?:\.\d+)+)/
|
7
|
+
if version.nil? && ::File.exists?(::File.expand_path('../../../.git', __FILE__))
|
8
|
+
begin
|
9
|
+
require 'step-up'
|
10
|
+
version = ::StepUp::Driver::Git.new.last_version_tag("HEAD", true)
|
11
|
+
rescue
|
12
|
+
version = "v0.0.0"
|
13
|
+
end
|
14
|
+
::File.open(version_file, "w"){ |f| f.write version }
|
15
|
+
end
|
16
|
+
VERSION = version.gsub(/^v?([^\+]+)\+?\d*$/, '\1')
|
17
|
+
end
|
data/rails/init.rb
ADDED
@@ -0,0 +1,9 @@
|
|
1
|
+
# encoding: UTF-8
|
2
|
+
config_file = ::Rails.root.join("config/purgeable.yml")
|
3
|
+
if File.exists? config_file
|
4
|
+
Purgeable.load_settings config_file, ::Rails.env
|
5
|
+
else
|
6
|
+
puts "Purgeable config not found. Create a config file at: config/purgeable.yml"
|
7
|
+
puts "to generate one run: script/generate purgeable_install"
|
8
|
+
end
|
9
|
+
|
@@ -0,0 +1,23 @@
|
|
1
|
+
sample: &sample
|
2
|
+
http_cache:
|
3
|
+
- resource_hosts:
|
4
|
+
- "www1.example.com"
|
5
|
+
- "www2.example.com"
|
6
|
+
cache_locations:
|
7
|
+
- "varnish1.example.com"
|
8
|
+
- "varnish2.example.com"
|
9
|
+
- resource_hosts:
|
10
|
+
- "www3.example.com"
|
11
|
+
- "www4.example.com"
|
12
|
+
cache_locations:
|
13
|
+
- "varnish3.example.com"
|
14
|
+
- "varnish4.example.com"
|
15
|
+
|
16
|
+
development:
|
17
|
+
<<: *sample
|
18
|
+
|
19
|
+
test:
|
20
|
+
http_cache: []
|
21
|
+
|
22
|
+
production:
|
23
|
+
http_cache: []
|
metadata
CHANGED
@@ -1,13 +1,13 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: purgeable
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
hash:
|
4
|
+
hash: 27
|
5
5
|
prerelease:
|
6
6
|
segments:
|
7
7
|
- 0
|
8
|
-
- 0
|
9
8
|
- 1
|
10
|
-
|
9
|
+
- 0
|
10
|
+
version: 0.1.0
|
11
11
|
platform: ruby
|
12
12
|
authors:
|
13
13
|
- Marcelo Manzan
|
@@ -15,7 +15,7 @@ autorequire:
|
|
15
15
|
bindir: bin
|
16
16
|
cert_chain: []
|
17
17
|
|
18
|
-
date: 2012-03-
|
18
|
+
date: 2012-03-16 00:00:00 Z
|
19
19
|
dependencies:
|
20
20
|
- !ruby/object:Gem::Dependency
|
21
21
|
name: methodize
|
@@ -90,11 +90,19 @@ extensions: []
|
|
90
90
|
extra_rdoc_files: []
|
91
91
|
|
92
92
|
files:
|
93
|
+
- README.md
|
94
|
+
- generators/purgeable/purgeable_install_generator.rb
|
95
|
+
- lib/generators/purgeable/install_generator.rb
|
93
96
|
- lib/purgeable.rb
|
94
97
|
- lib/purgeable/client.rb
|
95
98
|
- lib/purgeable/http/purge.rb
|
96
99
|
- lib/purgeable/http_resource.rb
|
100
|
+
- lib/purgeable/railtie.rb
|
97
101
|
- lib/purgeable/settings.rb
|
102
|
+
- lib/purgeable/version.rb
|
103
|
+
- rails/init.rb
|
104
|
+
- templates/install/purgeable.yml
|
105
|
+
- GEM_VERSION
|
98
106
|
homepage: http://github.com/abril/
|
99
107
|
licenses: []
|
100
108
|
|