sinatra-cache 0.3.4 → 0.3.5

Sign up to get free protection for your applications and to get access to all the features.
@@ -374,6 +374,17 @@ Report it here: http://github.com/kematzy/sinatra-cache/issues
374
374
 
375
375
  * Work out and include instructions on how to use a '../public/custom/cache/dir' with Passenger.
376
376
 
377
+ * Enable time-based / date-based cache expiry and regeneration of the cached-pages. [ht oakleafs]
378
+
379
+ * Enable .gz version of the cached file, further reducing the processing on the server. [ht oakleafs]
380
+ It would be killer to have <b>an extra .gz file next to the cached file</b>. That way, in Apache, you set it up like that:
381
+
382
+ RewriteCond %{HTTP:Accept-Encoding} gzip
383
+ RewriteCond %{REQUEST_FILENAME}.gz$ -f
384
+ RewriteRule ^(.*)$ $1.gz [L,QSA]
385
+
386
+ And it should serve the compressed file if available.
387
+
377
388
  * Write more tests to ensure everything is very solid.
378
389
 
379
390
  * Any other improvements you or I can think of.
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.3.4
1
+ 0.3.5
@@ -3,7 +3,7 @@ require 'sinatra/outputbuffer'
3
3
 
4
4
  module Sinatra
5
5
  module Cache
6
- VERSION = '0.3.4' unless const_defined?(:VERSION)
6
+ VERSION = '0.3.5' unless const_defined?(:VERSION)
7
7
  def self.version; "Sinatra::Cache v#{VERSION}"; end
8
8
  end #/ Cache
9
9
  end #/ Sinatra
@@ -15,12 +15,15 @@ module Sinatra
15
15
  def render(engine, data, options={}, locals={}, &block)
16
16
  # merge app-level options
17
17
  options = settings.send(engine).merge(options) if settings.respond_to?(engine)
18
+ options[:outvar] ||= '@_out_buf'
18
19
 
19
20
  # extract generic options
20
- locals = options.delete(:locals) || locals || {}
21
- views = options.delete(:views) || settings.views || "./views"
22
- layout = options.delete(:layout)
23
- layout = :layout if layout.nil? || layout == true
21
+ locals = options.delete(:locals) || locals || {}
22
+ views = options.delete(:views) || settings.views || "./views"
23
+ @default_layout = :layout if @default_layout.nil?
24
+ layout = options.delete(:layout)
25
+ layout = @default_layout if layout.nil? or layout == true
26
+ content_type = options.delete(:content_type) || options.delete(:default_content_type)
24
27
 
25
28
  # set the cache related options
26
29
  cache_enabled = settings.respond_to?(:cache_enabled) ? settings.send(:cache_enabled) : false
@@ -30,8 +33,11 @@ module Sinatra
30
33
  cache_option = true if cache_option.nil?
31
34
 
32
35
  # compile and render template
33
- template = compile_template(engine, data, options, views)
34
- output = template.render(self, locals, &block)
36
+ layout_was = @default_layout
37
+ @default_layout = false
38
+ template = compile_template(engine, data, options, views)
39
+ output = template.render(self, locals, &block)
40
+ @default_layout = layout_was
35
41
 
36
42
  # render layout
37
43
  if layout
@@ -48,6 +54,9 @@ module Sinatra
48
54
  # rendering without a layout
49
55
  (cache_enabled && cache_option && settings.send(:environment) == settings.cache_environment) ?
50
56
  cache_write_file(cache_file_path, output.gsub(/\n\r?$/,"") ) : output
57
+
58
+ output.extend(ContentTyped).content_type = content_type if content_type
59
+ output
51
60
  end
52
61
 
53
62
  end #/module Templates
@@ -5,11 +5,11 @@
5
5
 
6
6
  Gem::Specification.new do |s|
7
7
  s.name = %q{sinatra-cache}
8
- s.version = "0.3.4"
8
+ s.version = "0.3.5"
9
9
 
10
10
  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
11
  s.authors = ["kematzy"]
12
- s.date = %q{2010-05-14}
12
+ s.date = %q{2010-11-15}
13
13
  s.description = %q{A Sinatra Extension that makes Page and Fragment Caching easy.}
14
14
  s.email = %q{kematzy@gmail.com}
15
15
  s.extra_rdoc_files = [
@@ -32,13 +32,16 @@ Gem::Specification.new do |s|
32
32
  "spec/fixtures/apps/base/views/index.erb",
33
33
  "spec/fixtures/apps/base/views/layout.erb",
34
34
  "spec/fixtures/apps/base/views/params.erb",
35
+ "spec/fixtures/apps/partials/views/home/index.erb",
36
+ "spec/fixtures/apps/partials/views/layout.erb",
37
+ "spec/fixtures/apps/partials/views/shared/_header.erb",
35
38
  "spec/sinatra/cache_spec.rb",
36
39
  "spec/spec_helper.rb"
37
40
  ]
38
41
  s.homepage = %q{http://github.com/kematzy/sinatra-cache}
39
42
  s.rdoc_options = ["--charset=UTF-8"]
40
43
  s.require_paths = ["lib"]
41
- s.rubygems_version = %q{1.3.6}
44
+ s.rubygems_version = %q{1.3.7}
42
45
  s.summary = %q{A Sinatra Extension that makes Page and Fragment Caching easy.}
43
46
  s.test_files = [
44
47
  "spec/sinatra/cache_spec.rb",
@@ -49,7 +52,7 @@ Gem::Specification.new do |s|
49
52
  current_version = Gem::Specification::CURRENT_SPECIFICATION_VERSION
50
53
  s.specification_version = 3
51
54
 
52
- if Gem::Version.new(Gem::RubyGemsVersion) >= Gem::Version.new('1.2.0') then
55
+ if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
53
56
  s.add_runtime_dependency(%q<sinatra>, [">= 1.0"])
54
57
  s.add_runtime_dependency(%q<sinatra-outputbuffer>, [">= 0.1.0"])
55
58
  s.add_development_dependency(%q<sinatra-tests>, [">= 0.1.6"])
@@ -0,0 +1,4 @@
1
+ <% content_for :section_header do %>
2
+ <h1>HELLO from [content_for(:section_header)]</h1>
3
+ <% end %>
4
+ <h2>HELLO FROM [FILE <%= __FILE__ %>]</h2>
@@ -0,0 +1,11 @@
1
+ <html>
2
+ <head>
3
+ <title>Sinatra::Cache</title>
4
+ <%= cache_timestamp %>
5
+ </head>
6
+ <body>
7
+ <%= partial("shared/header") %>
8
+
9
+ <%= yield %>
10
+ </body>
11
+ </html>
@@ -0,0 +1,3 @@
1
+ <div id="header">
2
+ <%= yield_content :section_header %>
3
+ </div>
@@ -426,7 +426,7 @@ describe "Sinatra" do
426
426
  end
427
427
 
428
428
  it "should output the correct CSS as expected" do
429
- body.should == "body { color: red; }"
429
+ body.should == "body { color: red; }\n"
430
430
  end
431
431
 
432
432
  it "should automatically create the cache /css output directory" do
@@ -656,6 +656,183 @@ describe "Sinatra" do
656
656
 
657
657
  end #/ with caching enabled
658
658
 
659
+ describe "EDGE cases" do
660
+
661
+ describe "Using nested buffers" do
662
+
663
+ it "should use Sinatra v1.1" do
664
+ Sinatra::VERSION.should == '1.1.0'
665
+ end
666
+
667
+ require 'sinatra/outputbuffer'
668
+
669
+ class MyPartialsTestApp < Sinatra::Base
670
+ register(Sinatra::Tests)
671
+
672
+ enable :raise_errors
673
+
674
+ register(Sinatra::OutputBuffer)
675
+ register(Sinatra::Cache)
676
+
677
+ # need to set the root of the app for the default :cache_fragments_output_dir to work
678
+ set :root, ::APP_ROOT
679
+ set :app_dir, "#{APP_ROOT}/apps/partials"
680
+ set :public, "#{fixtures_path}/public"
681
+ set :views, "#{APP_ROOT}/apps/partials/views"
682
+
683
+ set :cache_enabled, true
684
+ set :cache_environment, :test
685
+ set :cache_output_dir, "#{test_cache_path('system/cache')}"
686
+ set :cache_fragments_output_dir, "#{test_cache_path('system/cache')}_fragments"
687
+
688
+ # NB! Although without tests, the positioning of the custom method in relation to other
689
+ # Cache related declaration has no effect.
690
+ helpers do
691
+ def uncached_erb(template, options={})
692
+ erb(template, options.merge(:cache => false ))
693
+ end
694
+
695
+ ##
696
+ # Renders ERB partials
697
+ #
698
+ # ==== Examples
699
+ #
700
+ # <%= partial('shared/header') %> => renders app/views/shared/_header.erb
701
+ #
702
+ # <%= partial('snippets/snippet') %> => renders app/views/snippets/_snippet.erb
703
+ #
704
+ #
705
+ # @api public
706
+ def partial(template, *args)
707
+ template_array = template.to_s.split('/')
708
+ template = template_array[0..-2].join('/') + "/_#{template_array[-1]}"
709
+ options = args.last.is_a?(Hash) ? args.pop : {}
710
+ options.merge!(:layout => false, :cache => false) # add support for Sinatra::Cache
711
+ # options[:outvar] = '@_out_buf'
712
+ if collection = options.delete(:collection) then
713
+ collection.inject([]) do |buffer, member|
714
+ buffer << erb(:"#{template}", options.merge(:layout => false, :locals => { template_array[-1].to_sym => member } ) )
715
+ end.join("\n")
716
+ else
717
+ erb(:"#{template}", options)
718
+ end
719
+ rescue Errno::ENOENT => e
720
+ out = "ERROR: The partial [views/#{template.to_s}] is missing."
721
+ out << " Please create it to remove this error. [ Exception: #{h e.inspect}]" if self.class.development? || self.class.test?
722
+ out
723
+ rescue Exception => e
724
+ if self.class.production?
725
+ # TODO:: must store the error in the log somehow.
726
+ "<!-- ERROR: rendering the partial [#{template.to_s}] -->"
727
+ else
728
+ throw e
729
+ end
730
+ end
731
+
732
+ end
733
+
734
+ get('/') { erb(:"home/index") }
735
+ # get('/erb/?') { erb(:index, :layout => false) }
736
+
737
+ # complex regex URL, matches
738
+ get %r{^/params/?([\s\w-]+)?/?([\w-]+)?/?([\w-]+)?/?([\w-]+)?/?([\w-]+)?/?([\w-]+)?} do
739
+ @captures = params[:captures].nil? ? [] : params[:captures].compact
740
+ erb(:params)
741
+ end
742
+ get('/file-extensions.*') do
743
+ @vars = { :framework => "Sinatra", :url => "www.sinatrarb.com" }
744
+ case params[:splat].first.to_sym
745
+ when :json
746
+ erb(@vars.to_json, :layout => false )
747
+ when :yaml
748
+ erb(@vars.to_yaml,:layout => false)
749
+ else
750
+ # direct output, should NOT be Cached
751
+ @vars.inspect
752
+ # @vars.inspect
753
+ end
754
+ end
755
+
756
+ ## NO CACHING
757
+ get('/uncached/erb'){ erb(:index, :cache => false) }
758
+ get('/uncached/erb/no/layout'){ erb(:index, :cache => false, :layout => false ) }
759
+ get('/uncached/uncached_erb'){ uncached_erb(:index) }
760
+
761
+ get '/css/screen.css' do
762
+ content_type 'text/css'
763
+ sass(:css, :style => :compact)
764
+ end
765
+ get '/css/no/cache.css' do
766
+ content_type 'text/css'
767
+ sass(:css, :style => :compact, :cache => false)
768
+ end
769
+
770
+ # enable :method_override
771
+ post('/post/?') { erb("POST", :layout => false) }
772
+ put('/put/?') { erb('PUT', :layout => false) }
773
+ delete('/delete/?') { erb('DELETE', :layout => false) }
774
+
775
+ get %r{^/fragments/?([\s\w-]+)?/?([\w-]+)?/?([\w-]+)?/?([\w-]+)?/?([\w-]+)?/?([\w-]+)?} do
776
+ erb(:fragments, :layout => false, :cache => false)
777
+ end
778
+ get %r{^/sharedfragments/?([\s\w-]+)?/?([\w-]+)?/?([\w-]+)?/?([\w-]+)?/?([\w-]+)?/?([\w-]+)?} do
779
+ erb(:fragments_shared, :layout => false, :cache => false)
780
+ end
781
+
782
+ end
783
+
784
+ def app; ::MyPartialsTestApp.new ; end
785
+
786
+ describe "basic Page caching" do
787
+
788
+ describe "GET requests for" do
789
+
790
+ describe "the Home page - ['/' => /index.html] (with layout)" do
791
+
792
+ before(:each) do
793
+ @cache_file = "#{test_cache_path('system/cache')}/index.html"
794
+ get('/')
795
+ end
796
+
797
+ after(:each) do
798
+ FileUtils.rm(@cache_file) if @delete_cached_test_files
799
+ end
800
+
801
+ it "should render the expected output" do
802
+ # <html>
803
+ # <head>
804
+ # <title>Sinatra::Cache</title>
805
+ # <!-- page cached: 2010-11-15 18:21:06 -->
806
+ # </head>
807
+ # <body>
808
+ # <div id="header">
809
+ # <h1>HELLO from [content_for(:section_header)]</h1>
810
+ # </div>
811
+ # <h2>HELLO FROM [FILE ../sinatra-cache/spec/fixtures/apps/partials/views/home/index.erb]</h2>
812
+ # </body>
813
+ # </html>
814
+ body.should have_tag('html > head > title', 'Sinatra::Cache')
815
+ body.should match(/<!-- page cached: \d\d\d\d-\d\d-\d\d \d\d:\d\d:\d\d -->/)
816
+ body.should have_tag('html > body > div#header > h1', /HELLO from \[content_for\(:section_header\)\]/)
817
+ body.should have_tag('html > body > h2', /HELLO FROM \[/)
818
+ end
819
+
820
+ it "should create a cached file in the cache output directory" do
821
+ test(?f, @cache_file).should == true
822
+ end
823
+
824
+ end #/ GET ['/' => /index.html]
825
+
826
+ end #/ GET requests
827
+
828
+ end #/ basic Page caching
829
+
830
+
831
+ end #/ Using nested buffers
832
+
833
+ end #/ EDGE cases
834
+
835
+
659
836
  end #/ Cache
660
837
 
661
838
  end #/ Sinatra
metadata CHANGED
@@ -1,12 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: sinatra-cache
3
3
  version: !ruby/object:Gem::Version
4
+ hash: 25
4
5
  prerelease: false
5
6
  segments:
6
7
  - 0
7
8
  - 3
8
- - 4
9
- version: 0.3.4
9
+ - 5
10
+ version: 0.3.5
10
11
  platform: ruby
11
12
  authors:
12
13
  - kematzy
@@ -14,16 +15,18 @@ autorequire:
14
15
  bindir: bin
15
16
  cert_chain: []
16
17
 
17
- date: 2010-05-14 00:00:00 +08:00
18
+ date: 2010-11-15 00:00:00 +08:00
18
19
  default_executable:
19
20
  dependencies:
20
21
  - !ruby/object:Gem::Dependency
21
22
  name: sinatra
22
23
  prerelease: false
23
24
  requirement: &id001 !ruby/object:Gem::Requirement
25
+ none: false
24
26
  requirements:
25
27
  - - ">="
26
28
  - !ruby/object:Gem::Version
29
+ hash: 15
27
30
  segments:
28
31
  - 1
29
32
  - 0
@@ -34,9 +37,11 @@ dependencies:
34
37
  name: sinatra-outputbuffer
35
38
  prerelease: false
36
39
  requirement: &id002 !ruby/object:Gem::Requirement
40
+ none: false
37
41
  requirements:
38
42
  - - ">="
39
43
  - !ruby/object:Gem::Version
44
+ hash: 27
40
45
  segments:
41
46
  - 0
42
47
  - 1
@@ -48,9 +53,11 @@ dependencies:
48
53
  name: sinatra-tests
49
54
  prerelease: false
50
55
  requirement: &id003 !ruby/object:Gem::Requirement
56
+ none: false
51
57
  requirements:
52
58
  - - ">="
53
59
  - !ruby/object:Gem::Version
60
+ hash: 23
54
61
  segments:
55
62
  - 0
56
63
  - 1
@@ -62,9 +69,11 @@ dependencies:
62
69
  name: rspec
63
70
  prerelease: false
64
71
  requirement: &id004 !ruby/object:Gem::Requirement
72
+ none: false
65
73
  requirements:
66
74
  - - ">="
67
75
  - !ruby/object:Gem::Version
76
+ hash: 27
68
77
  segments:
69
78
  - 1
70
79
  - 3
@@ -97,6 +106,9 @@ files:
97
106
  - spec/fixtures/apps/base/views/index.erb
98
107
  - spec/fixtures/apps/base/views/layout.erb
99
108
  - spec/fixtures/apps/base/views/params.erb
109
+ - spec/fixtures/apps/partials/views/home/index.erb
110
+ - spec/fixtures/apps/partials/views/layout.erb
111
+ - spec/fixtures/apps/partials/views/shared/_header.erb
100
112
  - spec/sinatra/cache_spec.rb
101
113
  - spec/spec_helper.rb
102
114
  has_rdoc: true
@@ -109,23 +121,27 @@ rdoc_options:
109
121
  require_paths:
110
122
  - lib
111
123
  required_ruby_version: !ruby/object:Gem::Requirement
124
+ none: false
112
125
  requirements:
113
126
  - - ">="
114
127
  - !ruby/object:Gem::Version
128
+ hash: 3
115
129
  segments:
116
130
  - 0
117
131
  version: "0"
118
132
  required_rubygems_version: !ruby/object:Gem::Requirement
133
+ none: false
119
134
  requirements:
120
135
  - - ">="
121
136
  - !ruby/object:Gem::Version
137
+ hash: 3
122
138
  segments:
123
139
  - 0
124
140
  version: "0"
125
141
  requirements: []
126
142
 
127
143
  rubyforge_project:
128
- rubygems_version: 1.3.6
144
+ rubygems_version: 1.3.7
129
145
  signing_key:
130
146
  specification_version: 3
131
147
  summary: A Sinatra Extension that makes Page and Fragment Caching easy.