sinatra-cache 0.3.4 → 0.3.5

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.
@@ -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.