adva-cache 0.0.3 → 0.0.4

Sign up to get free protection for your applications and to get access to all the features.
data/lib/adva-cache.rb ADDED
@@ -0,0 +1 @@
1
+ require 'adva/cache'
data/lib/adva/cache.rb ADDED
@@ -0,0 +1,20 @@
1
+ require 'adva/core'
2
+
3
+ require 'rack/cache'
4
+ require 'rack/cache/purge'
5
+ require 'rack/cache/tags'
6
+
7
+ module Adva
8
+ class Cache < ::Rails::Engine
9
+ autoload :Responder, 'adva/cache/responder'
10
+
11
+ include Adva::Engine
12
+
13
+ # TODO [config] add config vars to specify rack-cache storage uris
14
+ config.app_middleware.insert_after 'Rails::Rack::Logger', ::Rack::Cache
15
+ config.app_middleware.insert_after 'Rack::Cache', ::Rack::Cache::Purge
16
+ config.app_middleware.insert_after 'Rack::Cache::Purge', ::Rack::Cache::Tags
17
+ end
18
+ end
19
+
20
+ Adva::Responder.send(:include, Adva::Cache::Responder::Purge)
@@ -0,0 +1,7 @@
1
+ module Adva
2
+ class Cache
3
+ module Responder
4
+ autoload :Purge, 'adva/cache/responder/purge'
5
+ end
6
+ end
7
+ end
@@ -0,0 +1,20 @@
1
+ module Adva
2
+ class Cache
3
+ module Responder
4
+ module Purge
5
+ delegate :purge, :to => :controller
6
+ delegate :purge?, :to => :'controller.class'
7
+
8
+ def to_html
9
+ super.tap { purge(purge_resources) if purge?(params[:action]) }
10
+ end
11
+
12
+ protected
13
+
14
+ def purge_resources
15
+ resource.respond_to?(:persisted?) ? [resource] : []
16
+ end
17
+ end
18
+ end
19
+ end
20
+ end
@@ -0,0 +1,3 @@
1
+ module AdvaCache
2
+ VERSION = "0.0.4"
3
+ end
@@ -0,0 +1,55 @@
1
+ When /^(?:|I )have visited (.+)$/ do |page|
2
+ visit path_to(page)
3
+ follow_redirect! if redirect?
4
+ end
5
+
6
+ When /^the following urls are tagged:$/ do |table|
7
+ table.hashes.each do |attributes|
8
+ url = "http://www.example.com#{attributes[:url]}"
9
+ attributes[:tags].split(',').map(&:strip).each do |tag|
10
+ Rack::Cache::Tags::Store::ActiveRecord::Tagging.create!(:tag => tag, :url => url)
11
+ end
12
+ end
13
+ end
14
+
15
+ Then /^the following urls should be tagged:$/ do |table|
16
+ table.hashes.each do |hash|
17
+ url = "http://www.example.com#{hash[:url]}"
18
+ actual = Rack::Cache::Tags::Store::ActiveRecord::Tagging.where(:url => url).map(&:tag)
19
+ expected = hash[:tags].split(',').map(&:strip)
20
+ assert_equal expected, expected & actual
21
+ end
22
+ end
23
+
24
+ Webrat::Session.class_eval do
25
+ cattr_accessor :follow_redirects
26
+ self.follow_redirects = true
27
+
28
+ def internal_redirect_with_skipping?
29
+ follow_redirects && internal_redirect_without_skipping?
30
+ end
31
+ alias_method_chain :internal_redirect?, :skipping
32
+ end
33
+
34
+ Before do
35
+ Webrat::Session.follow_redirects = true
36
+ end
37
+
38
+ When /I don't follow any http redirects/ do
39
+ Webrat::Session.follow_redirects = false
40
+ end
41
+
42
+ Then /^it should purge cache entries tagged: (.+)$/ do |tags|
43
+ expected = tags.split(',').map(&:strip)
44
+ actual = response.headers[Rack::Cache::Tags::PURGE_TAGS_HEADER]
45
+ assert actual, 'no purge tags headers found'
46
+ assert_equal expected.sort, actual.split("\n").sort
47
+ end
48
+
49
+ Then /^it should purge the cache entries: (.+)$/ do |urls|
50
+ expected = urls.split(',').map(&:strip).sort
51
+ actual = response.headers[Rack::Cache::Purge::PURGE_HEADER]
52
+ assert actual, 'no purge headers found'
53
+ actual = actual.split("\n").map { |url| url.sub('http://www.example.com', '') }.sort
54
+ assert_equal expected, actual, "did not purge the expected urls.\n expected: #{expected.inspect}\n actual: #{actual.inspect}"
55
+ end
metadata CHANGED
@@ -1,13 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: adva-cache
3
3
  version: !ruby/object:Gem::Version
4
- hash: 25
4
+ hash: 23
5
5
  prerelease: false
6
6
  segments:
7
7
  - 0
8
8
  - 0
9
- - 3
10
- version: 0.0.3
9
+ - 4
10
+ version: 0.0.4
11
11
  platform: ruby
12
12
  authors:
13
13
  - Sven Fuchs
@@ -15,7 +15,7 @@ autorequire:
15
15
  bindir: bin
16
16
  cert_chain: []
17
17
 
18
- date: 2010-11-19 00:00:00 +01:00
18
+ date: 2010-12-03 00:00:00 +01:00
19
19
  default_executable:
20
20
  dependencies:
21
21
  - !ruby/object:Gem::Dependency
@@ -89,7 +89,12 @@ extensions: []
89
89
  extra_rdoc_files: []
90
90
 
91
91
  files:
92
- - lib/bundler/repository.rb
92
+ - lib/adva-cache.rb
93
+ - lib/adva/cache/responder/purge.rb
94
+ - lib/adva/cache/responder.rb
95
+ - lib/adva/cache.rb
96
+ - lib/adva_cache/version.rb
97
+ - lib/testing/step_definitions.rb
93
98
  has_rdoc: true
94
99
  homepage: http://github.com/svenfuchs/adva-cms2
95
100
  licenses: []
@@ -1,118 +0,0 @@
1
- require 'pathname'
2
-
3
- # Bundler gemfile support for local/remote workspaces/repositories for work in
4
- # development teams.
5
- #
6
- # Usage:
7
- #
8
- # # define paths to be searched for repositories:
9
- # workspace '~/.projects ~/Development/{projects,work}'
10
- #
11
- # # define developer preferences for using local or remote repositories (uses ENV['user']):
12
- # developer :sven, :prefer => :local
13
- #
14
- # # define repositories to be used for particular gems:
15
- # adva_cms = repository('adva-cms2', :git => 'git@github.com:svenfuchs/adva-cms2.git', :ref => 'c2af0de')
16
- # adva_shop = repository('adva-shop', :source => :local)
17
- #
18
- # # now use repositories to define gems:
19
- # adva_cms.gem 'adva-core'
20
- # adva_shop.gem 'adva-catalog'
21
- #
22
- # # The gem definition will now be proxied to Bundler with arguments according
23
- # # to the setup defined earlier. E.g. as:
24
- #
25
- # gem 'adva-core', :path => 'Development/projects/adva-cms2/adva-core' # for developer 'sven'
26
- # gem 'adva-core', :git => 'git@github.com:svenfuchs/adva-cms2.git', :ref => 'c2af0de' # for other developers
27
- # gem 'adva-catalog', :path => 'Development/projects/adva-shop/adva-catalog' # for all developers
28
- #
29
- # One can also set an environment variable FORCE_REMOTE which will force remote
30
- # repositories to be used *except* when a repository was defined with :source => :local
31
- # which always forces the local repository to be used.
32
- #
33
- class Repository
34
- class << self
35
- def paths
36
- @paths ||= []
37
- end
38
-
39
- def path(*paths)
40
- paths.join(' ').split(' ').each do |path|
41
- self.paths.concat(Pathname.glob(File.expand_path(path)))
42
- end
43
- end
44
-
45
- def developer(name, preferences)
46
- developers[name] = preferences
47
- workspaces(preferences[:workspace])
48
- end
49
-
50
- def current_developer
51
- developers[ENV['USER'].to_sym] || {}
52
- end
53
-
54
- def developers(developers = nil)
55
- @developers ||= {}
56
- end
57
- end
58
-
59
- class Gem < Array
60
- def initialize(name, repository)
61
- if repository.local?
62
- sub_path = repository.path.join(name)
63
- super([name, { :path => sub_path.exist? ? sub_path.to_s : repository.path.to_s }])
64
- else
65
- super([name, repository.options.dup])
66
- end
67
- end
68
- end
69
-
70
- attr_reader :bundler, :name, :options, :source
71
-
72
- def initialize(bundler, name, options)
73
- @bundler = bundler
74
- @name = name
75
- @source = options.delete(:source)
76
- @options = options
77
- end
78
-
79
- def gem(name)
80
- bundler.gem(*Gem.new(name, self))
81
- end
82
-
83
- def local?
84
- source == :local # && path
85
- end
86
-
87
- def source
88
- @source ||= forced_source || preferred_source || :remote
89
- end
90
-
91
- def forced_source
92
- :remote if ENV['FORCE_REMOTE']
93
- end
94
-
95
- def preferred_source
96
- self.class.current_developer[:prefer] || self.class.current_developer[name.to_sym]
97
- end
98
-
99
- def path
100
- @path ||= begin
101
- path = self.class.paths.detect { |path| path.join(name).exist? }
102
- path ? path.join(name) : Pathname.new('.')
103
- end
104
- end
105
- end
106
-
107
- def workspace(*paths)
108
- Repository.path(*paths)
109
- end
110
- alias :workspaces :workspace
111
-
112
- def developer(name, preferences)
113
- Repository.developer(name, preferences)
114
- end
115
-
116
- def repository(*args)
117
- Repository.new(self, *args)
118
- end