slimmer 4.2.0 → 4.2.1

Sign up to get free protection for your applications and to get access to all the features.
data/CHANGELOG.md CHANGED
@@ -1,3 +1,8 @@
1
+ # 4.2.1
2
+
3
+ * Use a shared cache between shared templates and skin templates so that they
4
+ all update together
5
+
1
6
  # 4.2.0
2
7
 
3
8
  * Add ability to load shared erb templates over the network
data/lib/slimmer.rb CHANGED
@@ -17,6 +17,8 @@ module Slimmer
17
17
  autoload :Railtie, 'slimmer/railtie'
18
18
  autoload :Skin, 'slimmer/skin'
19
19
 
20
+ autoload :Cache, 'slimmer/cache'
21
+
20
22
  autoload :Template, 'slimmer/template'
21
23
  autoload :App, 'slimmer/app'
22
24
  autoload :Headers, 'slimmer/headers'
data/lib/slimmer/app.rb CHANGED
@@ -28,7 +28,10 @@ module Slimmer
28
28
  options[:asset_host] = Plek.current.find("static")
29
29
  end
30
30
 
31
- @skin = Skin.new options.merge(logger: self.logger)
31
+ cache = Cache.instance
32
+ cache.use_cache = options[:use_cache] if options[:use_cache]
33
+
34
+ @skin = Skin.new options.merge(logger: self.logger, cache: cache)
32
35
  end
33
36
 
34
37
  def call(env)
@@ -0,0 +1,46 @@
1
+ require 'singleton'
2
+
3
+ module Slimmer
4
+ class Cache
5
+ include Singleton
6
+ attr_writer :use_cache, :cache_ttl
7
+
8
+ # TODO: use a real cache rather than an in memory hash
9
+ def initialize
10
+ @cache_last_reset= Time.now
11
+
12
+ @use_cache = false
13
+ @cache_ttl = (5 * 60) # 5 mins
14
+
15
+ @data_store = {}
16
+ end
17
+
18
+ def clear
19
+ @data_store.clear
20
+ end
21
+
22
+ def fetch(key)
23
+ clear_cache_if_stale
24
+ data = @data_store[key]
25
+
26
+ if data.nil?
27
+ data = yield
28
+ end
29
+
30
+ if @use_cache
31
+ @data_store[key] = data
32
+ end
33
+
34
+ data
35
+ end
36
+
37
+ private
38
+ def clear_cache_if_stale
39
+ time_to_clear_cache = @cache_last_reset + @cache_ttl
40
+ if time_to_clear_cache < Time.now
41
+ @data_store.clear
42
+ @cache_last_reset = Time.now
43
+ end
44
+ end
45
+ end
46
+ end
@@ -3,14 +3,23 @@ require 'active_support/core_ext/string/inflections'
3
3
 
4
4
  module Slimmer
5
5
  class ComponentResolver < ::ActionView::Resolver
6
+ def self.caching
7
+ # this turns off the default ActionView::Resolver caching which caches
8
+ # all templates for the duration of the current process in production
9
+ false
10
+ end
11
+
6
12
  def find_templates(name, prefix, partial, details)
7
13
  return [] unless prefix == 'govuk_component'
14
+ cache = Cache.instance
8
15
 
9
16
  template_path = [prefix, name].join('/')
10
17
  if test?
11
18
  template_body = test_body(template_path)
12
19
  else
13
- template_body = fetch(template_url(template_path))
20
+ template_body = cache.fetch(template_path) do
21
+ fetch(template_url(template_path))
22
+ end
14
23
  end
15
24
 
16
25
  details = {
data/lib/slimmer/skin.rb CHANGED
@@ -3,28 +3,19 @@ require 'slimmer/govuk_request_id'
3
3
 
4
4
  module Slimmer
5
5
  class Skin
6
- attr_accessor :use_cache, :template_cache, :asset_host, :logger, :strict, :options
6
+ attr_accessor :template_cache, :asset_host, :logger, :strict, :options
7
7
 
8
- # TODO: Extract the cache to something we can pass in instead of using
9
- # true/false and an in-memory cache.
10
8
  def initialize options = {}
11
9
  @options = options
12
10
  @asset_host = options[:asset_host]
13
-
14
- @use_cache = options[:use_cache] || false
15
- @cache_ttl = options[:cache_ttl] || (15 * 60) # 15 mins
16
- @template_cache = LRUCache.new(:ttl => @cache_ttl) if @use_cache
11
+ @template_cache = options[:cache]
17
12
 
18
13
  @logger = options[:logger] || NullLogger.instance
19
14
  @strict = options[:strict] || (%w{development test}.include?(ENV['RACK_ENV']))
20
15
  end
21
16
 
22
17
  def template(template_name)
23
- if use_cache
24
- template_cache.fetch(template_name) do
25
- load_template(template_name)
26
- end
27
- else
18
+ template_cache.fetch(template_name) do
28
19
  load_template(template_name)
29
20
  end
30
21
  end
@@ -1,3 +1,3 @@
1
1
  module Slimmer
2
- VERSION = '4.2.0'
2
+ VERSION = '4.2.1'
3
3
  end
@@ -0,0 +1,53 @@
1
+ require_relative "test_helper"
2
+
3
+ describe Slimmer::Cache do
4
+ describe "a cache" do
5
+ before do
6
+ @cache = Slimmer::Cache.send(:new)
7
+ @cache.use_cache = false
8
+ end
9
+
10
+ it "should not save item in cache by default" do
11
+ @cache.fetch('not-cached') { "value1" }
12
+ assert_equal 'new-value', @cache.fetch('not-cached') { "new-value" }
13
+ end
14
+
15
+ it "should return passed argument if cache is empty" do
16
+ @cache.use_cache = true
17
+
18
+ assert_equal 'new-value', @cache.fetch('uncached-key') { "new-value" }
19
+ end
20
+
21
+ it "should return cached argument if cache is enabled and warm" do
22
+ @cache.use_cache = true
23
+
24
+ @cache.fetch('cached-key') { "value1" }
25
+ assert_equal 'value1', @cache.fetch('cached-key') { "new-value" }
26
+ end
27
+
28
+ it "should only cache the template for 5 mins by default" do
29
+ @cache.use_cache = true
30
+
31
+ @cache.fetch('timed-cached-key') { "value1" }
32
+ Timecop.travel( 5 * 60 - 30) do # now + 4 mins 30 secs
33
+ assert_equal "value1", @cache.fetch('timed-cached-key') { "value2" }
34
+ end
35
+ Timecop.travel( 5 * 60 + 30) do # now + 5 mins 30 secs
36
+ assert_equal "value3", @cache.fetch('timed-cached-key') { "value3" }
37
+ end
38
+ end
39
+
40
+ it "should allow overriding the cache ttl" do
41
+ @cache.use_cache = true
42
+ @cache.cache_ttl = 10 * 60
43
+
44
+ @cache.fetch('ttl-timed-cached-key') { "value1" }
45
+ Timecop.travel( 10 * 60 - 30) do # now + 9 mins 30 secs
46
+ assert_equal "value1", @cache.fetch('ttl-timed-cached-key') { "value2" }
47
+ end
48
+ Timecop.travel( 10 * 60 + 30) do # now + 10 mins 30 secs
49
+ assert_equal "value3", @cache.fetch('ttl-timed-cached-key') { "value3" }
50
+ end
51
+ end
52
+ end
53
+ end
data/test/headers_test.rb CHANGED
@@ -1,7 +1,7 @@
1
1
  require_relative "test_helper"
2
2
  require "slimmer/headers"
3
3
 
4
- class HeadersTest < MiniTest::Unit::TestCase
4
+ class HeadersTest < MiniTest::Test
5
5
  include Slimmer::Headers
6
6
  attr_accessor :headers
7
7
 
@@ -1,6 +1,6 @@
1
1
  require_relative "../test_helper"
2
2
 
3
- class AlphaLabelInserterTest < MiniTest::Unit::TestCase
3
+ class AlphaLabelInserterTest < MiniTest::Test
4
4
 
5
5
  def setup
6
6
  super
@@ -1,6 +1,6 @@
1
1
  require_relative "../test_helper"
2
2
 
3
- class BetaLabelInserterTest < MiniTest::Unit::TestCase
3
+ class BetaLabelInserterTest < MiniTest::Test
4
4
 
5
5
  def setup
6
6
  super
@@ -1,6 +1,6 @@
1
1
  require "test_helper"
2
2
 
3
- class BodyInserterTest < MiniTest::Unit::TestCase
3
+ class BodyInserterTest < MiniTest::Test
4
4
  def test_should_replace_contents_of_wrapper_in_template
5
5
  template = as_nokogiri %{
6
6
  <html><body><div><div id="wrapper"></div></div></body></html>
@@ -1,6 +1,6 @@
1
1
  require "test_helper"
2
2
 
3
- class HeaderContextInserterTest < MiniTest::Unit::TestCase
3
+ class HeaderContextInserterTest < MiniTest::Test
4
4
  def test_should_replace_contents_of_header_context_in_template
5
5
  template = as_nokogiri %{
6
6
  <html><body><div><div class="header-context"></div></div></body></html>
@@ -1,6 +1,6 @@
1
1
  require_relative '../test_helper'
2
2
 
3
- class NavigationMoverTest < MiniTest::Unit::TestCase
3
+ class NavigationMoverTest < MiniTest::Test
4
4
  def setup
5
5
  super
6
6
  @proposition_header_block = File.read( File.dirname(__FILE__) + "/../fixtures/proposition_menu.html.erb" )
@@ -1,7 +1,7 @@
1
1
  require_relative '../test_helper'
2
2
  require 'gds_api/test_helpers/content_api'
3
3
 
4
- class RelatedItemsInserterTest < MiniTest::Unit::TestCase
4
+ class RelatedItemsInserterTest < MiniTest::Test
5
5
  include GdsApi::TestHelpers::ContentApi
6
6
 
7
7
  def setup
@@ -1,6 +1,6 @@
1
1
  require_relative '../test_helper'
2
2
 
3
- class ReportAProblemInserterTest < MiniTest::Unit::TestCase
3
+ class ReportAProblemInserterTest < MiniTest::Test
4
4
 
5
5
  def setup
6
6
  super
@@ -1,7 +1,7 @@
1
1
  require_relative "../test_helper"
2
2
  require 'gds_api/test_helpers/content_api'
3
3
 
4
- class SectionInserterTest < MiniTest::Unit::TestCase
4
+ class SectionInserterTest < MiniTest::Test
5
5
  include GdsApi::TestHelpers::ContentApi
6
6
 
7
7
  def create_artefact(slug, attributes = {})
@@ -1,6 +1,6 @@
1
1
  require_relative "../test_helper"
2
2
 
3
- class TagMoverTest < MiniTest::Unit::TestCase
3
+ class TagMoverTest < MiniTest::Test
4
4
  def setup
5
5
  super
6
6
  @source = as_nokogiri %{
data/test/skin_test.rb CHANGED
@@ -4,7 +4,8 @@ describe Slimmer::Skin do
4
4
 
5
5
  describe "loading templates" do
6
6
  it "should be able to load the template" do
7
- skin = Slimmer::Skin.new asset_host: "http://example.local/"
7
+ skin = Slimmer::Skin.new asset_host: "http://example.local/", cache: Slimmer::Cache.instance
8
+
8
9
  expected_url = "http://example.local/templates/example.html.erb"
9
10
  stub_request(:get, expected_url).to_return :body => "<foo />"
10
11
 
@@ -16,7 +17,8 @@ describe Slimmer::Skin do
16
17
 
17
18
  describe "should pass the GOVUK-Request-Id header when requesting the template" do
18
19
  before do
19
- @skin = Slimmer::Skin.new asset_host: "http://example.local/"
20
+ @skin = Slimmer::Skin.new asset_host: "http://example.local/", cache: Slimmer::Cache.instance
21
+
20
22
  @expected_url = "http://example.local/templates/example.html.erb"
21
23
  stub_request(:get, @expected_url).to_return :body => "<foo />"
22
24
  end
@@ -42,81 +44,17 @@ describe Slimmer::Skin do
42
44
  end
43
45
  end
44
46
 
45
- describe "template caching" do
46
- it "should not cache the template by default" do
47
- skin = Slimmer::Skin.new asset_host: "http://example.local/"
48
- expected_url = "http://example.local/templates/example.html.erb"
49
- stub_request(:get, expected_url).to_return :body => "<foo />"
50
-
51
- first_access = skin.template 'example'
52
- second_access = skin.template 'example'
53
-
54
- assert_requested :get, "http://example.local/templates/example.html.erb", times: 2
55
- end
56
-
57
- it "should cache the template when requested" do
58
- skin = Slimmer::Skin.new asset_host: "http://example.local/", use_cache: true
59
- expected_url = "http://example.local/templates/example.html.erb"
60
- stub_request(:get, expected_url).to_return :body => "<foo />"
61
-
62
- first_access = skin.template 'example'
63
- second_access = skin.template 'example'
64
-
65
- assert_requested :get, "http://example.local/templates/example.html.erb", times: 1
66
- assert_same first_access, second_access
67
- end
68
-
69
- it "should only cache the template for 15 mins by default" do
70
- skin = Slimmer::Skin.new asset_host: "http://example.local/", use_cache: true
71
- expected_url = "http://example.local/templates/example.html.erb"
72
- stub_request(:get, expected_url).to_return :body => "<foo />"
73
-
74
- first_access = skin.template 'example'
75
- second_access = skin.template 'example'
76
-
77
- assert_requested :get, "http://example.local/templates/example.html.erb", times: 1
78
- assert_same first_access, second_access
79
-
80
- Timecop.travel( 15 * 60 - 30) do # now + 14 mins 30 secs
81
- third_access = skin.template 'example'
82
- assert_requested :get, "http://example.local/templates/example.html.erb", times: 1
83
- assert_same first_access, third_access
84
- end
47
+ it "should try and load templates from the cache" do
48
+ skin = Slimmer::Skin.new asset_host: "http://example.local/", cache: Slimmer::Cache.instance
85
49
 
86
- Timecop.travel( 15 * 60 + 30) do # now + 15 mins 30 secs
87
- fourth_access = skin.template 'example'
88
- assert_requested :get, "http://example.local/templates/example.html.erb", times: 2
89
- assert_equal first_access, fourth_access
90
- end
91
- end
92
-
93
- it "should allow overriding the cache ttl" do
94
- skin = Slimmer::Skin.new asset_host: "http://example.local/", use_cache: true, cache_ttl: 5 * 60
95
- expected_url = "http://example.local/templates/example.html.erb"
96
- stub_request(:get, expected_url).to_return :body => "<foo />"
97
-
98
- first_access = skin.template 'example'
99
- second_access = skin.template 'example'
100
-
101
- assert_requested :get, "http://example.local/templates/example.html.erb", times: 1
102
- assert_same first_access, second_access
103
-
104
- Timecop.travel( 5 * 60 - 30) do # now + 4 mins 30 secs
105
- third_access = skin.template 'example'
106
- assert_requested :get, "http://example.local/templates/example.html.erb", times: 1
107
- assert_same first_access, third_access
108
- end
109
-
110
- Timecop.travel( 5 * 60 + 30) do # now + 5 mins 30 secs
111
- fourth_access = skin.template 'example'
112
- assert_requested :get, "http://example.local/templates/example.html.erb", times: 2
113
- assert_equal first_access, fourth_access
114
- end
115
- end
50
+ Slimmer::Cache.instance.expects(:fetch).with('example-template').returns('cache data')
51
+ template = skin.template 'example-template'
52
+ assert_equal 'cache data', template
116
53
  end
117
54
 
118
55
  it "should raise appropriate exception when template not found" do
119
- skin = Slimmer::Skin.new asset_host: "http://example.local/"
56
+ skin = Slimmer::Skin.new asset_host: "http://example.local/", cache: Slimmer::Cache.instance
57
+
120
58
  expected_url = "http://example.local/templates/example.html.erb"
121
59
  stub_request(:get, expected_url).to_return(:status => '404')
122
60
 
@@ -126,7 +64,8 @@ describe Slimmer::Skin do
126
64
  end
127
65
 
128
66
  it "should raise appropriate exception when cant reach template host" do
129
- skin = Slimmer::Skin.new asset_host: "http://example.local/"
67
+ skin = Slimmer::Skin.new asset_host: "http://example.local/", cache: Slimmer::Cache.instance
68
+
130
69
  expected_url = "http://example.local/templates/example.html.erb"
131
70
  stub_request(:get, expected_url).to_raise(Errno::ECONNREFUSED)
132
71
 
@@ -136,7 +75,8 @@ describe Slimmer::Skin do
136
75
  end
137
76
 
138
77
  it "should raise appropriate exception when hostname cannot be resolved" do
139
- skin = Slimmer::Skin.new asset_host: "http://non-existent.domain/"
78
+ skin = Slimmer::Skin.new asset_host: "http://non-existent.domain/", cache: Slimmer::Cache.instance
79
+
140
80
  expected_url = "http://non-existent.domain/templates/example.html.erb"
141
81
  stub_request(:get, expected_url).to_raise(SocketError)
142
82
 
@@ -148,7 +88,7 @@ describe Slimmer::Skin do
148
88
 
149
89
  describe "parsing artefact from header" do
150
90
  before do
151
- @skin = Slimmer::Skin.new
91
+ @skin = Slimmer::Skin.new cache: Slimmer::Cache.instance
152
92
  @headers = {}
153
93
  @response = stub("Response", :headers => @headers)
154
94
  end
data/test/test_helper.rb CHANGED
@@ -1,14 +1,13 @@
1
1
  require_relative '../lib/slimmer'
2
2
  require 'minitest/autorun'
3
- require 'minitest/unit'
4
3
  require 'rack/test'
5
4
  require 'json'
6
5
  require 'logger'
7
- require 'mocha'
6
+ require 'mocha/setup'
8
7
  require 'timecop'
9
8
  require 'gds_api/test_helpers/content_api'
10
9
 
11
- class MiniTest::Unit::TestCase
10
+ MiniTest::Test.class_eval do
12
11
  def as_nokogiri(html_string)
13
12
  Nokogiri::HTML.parse(html_string.strip)
14
13
  end
@@ -59,7 +58,7 @@ module ActionView
59
58
  end
60
59
  end
61
60
 
62
- class SlimmerIntegrationTest < MiniTest::Unit::TestCase
61
+ class SlimmerIntegrationTest < MiniTest::Test
63
62
  include Rack::Test::Methods
64
63
  include GdsApi::TestHelpers::ContentApi
65
64
 
@@ -1,6 +1,6 @@
1
1
  require "test_helper"
2
2
 
3
- class TestTemplateDependencyOnStaticTest < MiniTest::Unit::TestCase
3
+ class TestTemplateDependencyOnStaticTest < MiniTest::Test
4
4
  def test_scripts_on_static_referenced_in_test_templates_exist
5
5
  template_path = File.dirname(__FILE__).gsub('/test', '/lib/slimmer/test_templates')
6
6
  Dir.foreach(template_path) do | template_file_name |
@@ -153,7 +153,7 @@ module TypicalUsage
153
153
  }
154
154
  def test_should_find_conditional_comments_copied_into_the_head
155
155
  element = Nokogiri::HTML.parse(last_response.body).at_xpath('//comment()')
156
- assert_match element.to_s, /app-ie\.css/, 'Not found conditional comment in output'
156
+ assert_match /app-ie\.css/, element.to_s, 'Not found conditional comment in output'
157
157
  end
158
158
  end
159
159
 
@@ -168,7 +168,7 @@ module TypicalUsage
168
168
  def test_should_find_stylesheet_wrapped_with_conditional_comments
169
169
  assert_rendered_in_template "head link[href='app.css']"
170
170
  element = Nokogiri::HTML.parse(last_response.body).at_xpath('/html/head')
171
- assert_match element.to_s, /<!--\[if gt IE 8\]><!-->.*app\.css.*<!--<!\[endif\]-->/m, 'Not found conditional comment in output'
171
+ assert_match /<!--\[if gt IE 8\]><!-->.*app\.css.*<!--<!\[endif\]-->/m, element.to_s, 'Not found conditional comment in output'
172
172
  end
173
173
  end
174
174
 
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: slimmer
3
3
  version: !ruby/object:Gem::Version
4
- version: 4.2.0
4
+ version: 4.2.1
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -10,11 +10,11 @@ authors:
10
10
  autorequire:
11
11
  bindir: bin
12
12
  cert_chain: []
13
- date: 2014-08-07 00:00:00.000000000 Z
13
+ date: 2014-08-21 00:00:00.000000000 Z
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
16
16
  name: nokogiri
17
- requirement: !ruby/object:Gem::Requirement
17
+ requirement: &7368960 !ruby/object:Gem::Requirement
18
18
  none: false
19
19
  requirements:
20
20
  - - ~>
@@ -22,15 +22,10 @@ dependencies:
22
22
  version: 1.5.0
23
23
  type: :runtime
24
24
  prerelease: false
25
- version_requirements: !ruby/object:Gem::Requirement
26
- none: false
27
- requirements:
28
- - - ~>
29
- - !ruby/object:Gem::Version
30
- version: 1.5.0
25
+ version_requirements: *7368960
31
26
  - !ruby/object:Gem::Dependency
32
27
  name: rack
33
- requirement: !ruby/object:Gem::Requirement
28
+ requirement: &7367000 !ruby/object:Gem::Requirement
34
29
  none: false
35
30
  requirements:
36
31
  - - ! '>='
@@ -38,15 +33,10 @@ dependencies:
38
33
  version: 1.3.5
39
34
  type: :runtime
40
35
  prerelease: false
41
- version_requirements: !ruby/object:Gem::Requirement
42
- none: false
43
- requirements:
44
- - - ! '>='
45
- - !ruby/object:Gem::Version
46
- version: 1.3.5
36
+ version_requirements: *7367000
47
37
  - !ruby/object:Gem::Dependency
48
38
  name: plek
49
- requirement: !ruby/object:Gem::Requirement
39
+ requirement: &7326660 !ruby/object:Gem::Requirement
50
40
  none: false
51
41
  requirements:
52
42
  - - ! '>='
@@ -54,15 +44,10 @@ dependencies:
54
44
  version: 0.1.8
55
45
  type: :runtime
56
46
  prerelease: false
57
- version_requirements: !ruby/object:Gem::Requirement
58
- none: false
59
- requirements:
60
- - - ! '>='
61
- - !ruby/object:Gem::Version
62
- version: 0.1.8
47
+ version_requirements: *7326660
63
48
  - !ruby/object:Gem::Dependency
64
49
  name: json
65
- requirement: !ruby/object:Gem::Requirement
50
+ requirement: &7325300 !ruby/object:Gem::Requirement
66
51
  none: false
67
52
  requirements:
68
53
  - - ! '>='
@@ -70,15 +55,10 @@ dependencies:
70
55
  version: '0'
71
56
  type: :runtime
72
57
  prerelease: false
73
- version_requirements: !ruby/object:Gem::Requirement
74
- none: false
75
- requirements:
76
- - - ! '>='
77
- - !ruby/object:Gem::Version
78
- version: '0'
58
+ version_requirements: *7325300
79
59
  - !ruby/object:Gem::Dependency
80
60
  name: null_logger
81
- requirement: !ruby/object:Gem::Requirement
61
+ requirement: &7711280 !ruby/object:Gem::Requirement
82
62
  none: false
83
63
  requirements:
84
64
  - - ! '>='
@@ -86,31 +66,21 @@ dependencies:
86
66
  version: '0'
87
67
  type: :runtime
88
68
  prerelease: false
89
- version_requirements: !ruby/object:Gem::Requirement
69
+ version_requirements: *7711280
70
+ - !ruby/object:Gem::Dependency
71
+ name: rest-client
72
+ requirement: &7708660 !ruby/object:Gem::Requirement
90
73
  none: false
91
74
  requirements:
92
75
  - - ! '>='
93
76
  - !ruby/object:Gem::Version
94
77
  version: '0'
95
- - !ruby/object:Gem::Dependency
96
- name: lrucache
97
- requirement: !ruby/object:Gem::Requirement
98
- none: false
99
- requirements:
100
- - - ~>
101
- - !ruby/object:Gem::Version
102
- version: 0.1.3
103
78
  type: :runtime
104
79
  prerelease: false
105
- version_requirements: !ruby/object:Gem::Requirement
106
- none: false
107
- requirements:
108
- - - ~>
109
- - !ruby/object:Gem::Version
110
- version: 0.1.3
80
+ version_requirements: *7708660
111
81
  - !ruby/object:Gem::Dependency
112
- name: rest-client
113
- requirement: !ruby/object:Gem::Requirement
82
+ name: activesupport
83
+ requirement: &7794880 !ruby/object:Gem::Requirement
114
84
  none: false
115
85
  requirements:
116
86
  - - ! '>='
@@ -118,31 +88,32 @@ dependencies:
118
88
  version: '0'
119
89
  type: :runtime
120
90
  prerelease: false
121
- version_requirements: !ruby/object:Gem::Requirement
122
- none: false
123
- requirements:
124
- - - ! '>='
125
- - !ruby/object:Gem::Version
126
- version: '0'
91
+ version_requirements: *7794880
127
92
  - !ruby/object:Gem::Dependency
128
- name: rake
129
- requirement: !ruby/object:Gem::Requirement
93
+ name: minitest
94
+ requirement: &7876860 !ruby/object:Gem::Requirement
130
95
  none: false
131
96
  requirements:
132
97
  - - ~>
133
98
  - !ruby/object:Gem::Version
134
- version: 0.9.2.2
99
+ version: '5.4'
135
100
  type: :development
136
101
  prerelease: false
137
- version_requirements: !ruby/object:Gem::Requirement
102
+ version_requirements: *7876860
103
+ - !ruby/object:Gem::Dependency
104
+ name: rake
105
+ requirement: &7876240 !ruby/object:Gem::Requirement
138
106
  none: false
139
107
  requirements:
140
108
  - - ~>
141
109
  - !ruby/object:Gem::Version
142
110
  version: 0.9.2.2
111
+ type: :development
112
+ prerelease: false
113
+ version_requirements: *7876240
143
114
  - !ruby/object:Gem::Dependency
144
115
  name: rack-test
145
- requirement: !ruby/object:Gem::Requirement
116
+ requirement: &7875600 !ruby/object:Gem::Requirement
146
117
  none: false
147
118
  requirements:
148
119
  - - ~>
@@ -150,47 +121,32 @@ dependencies:
150
121
  version: 0.6.1
151
122
  type: :development
152
123
  prerelease: false
153
- version_requirements: !ruby/object:Gem::Requirement
154
- none: false
155
- requirements:
156
- - - ~>
157
- - !ruby/object:Gem::Version
158
- version: 0.6.1
124
+ version_requirements: *7875600
159
125
  - !ruby/object:Gem::Dependency
160
126
  name: mocha
161
- requirement: !ruby/object:Gem::Requirement
127
+ requirement: &7874720 !ruby/object:Gem::Requirement
162
128
  none: false
163
129
  requirements:
164
130
  - - ~>
165
131
  - !ruby/object:Gem::Version
166
- version: 0.12.4
132
+ version: '1.1'
167
133
  type: :development
168
134
  prerelease: false
169
- version_requirements: !ruby/object:Gem::Requirement
170
- none: false
171
- requirements:
172
- - - ~>
173
- - !ruby/object:Gem::Version
174
- version: 0.12.4
135
+ version_requirements: *7874720
175
136
  - !ruby/object:Gem::Dependency
176
137
  name: webmock
177
- requirement: !ruby/object:Gem::Requirement
138
+ requirement: &7871200 !ruby/object:Gem::Requirement
178
139
  none: false
179
140
  requirements:
180
- - - '='
141
+ - - =
181
142
  - !ruby/object:Gem::Version
182
- version: 1.11.0
143
+ version: 1.18.0
183
144
  type: :development
184
145
  prerelease: false
185
- version_requirements: !ruby/object:Gem::Requirement
186
- none: false
187
- requirements:
188
- - - '='
189
- - !ruby/object:Gem::Version
190
- version: 1.11.0
146
+ version_requirements: *7871200
191
147
  - !ruby/object:Gem::Dependency
192
148
  name: therubyracer
193
- requirement: !ruby/object:Gem::Requirement
149
+ requirement: &7939300 !ruby/object:Gem::Requirement
194
150
  none: false
195
151
  requirements:
196
152
  - - ~>
@@ -198,15 +154,10 @@ dependencies:
198
154
  version: 0.10.2
199
155
  type: :development
200
156
  prerelease: false
201
- version_requirements: !ruby/object:Gem::Requirement
202
- none: false
203
- requirements:
204
- - - ~>
205
- - !ruby/object:Gem::Version
206
- version: 0.10.2
157
+ version_requirements: *7939300
207
158
  - !ruby/object:Gem::Dependency
208
159
  name: gem_publisher
209
- requirement: !ruby/object:Gem::Requirement
160
+ requirement: &7991860 !ruby/object:Gem::Requirement
210
161
  none: false
211
162
  requirements:
212
163
  - - ~>
@@ -214,31 +165,21 @@ dependencies:
214
165
  version: 1.1.1
215
166
  type: :development
216
167
  prerelease: false
217
- version_requirements: !ruby/object:Gem::Requirement
218
- none: false
219
- requirements:
220
- - - ~>
221
- - !ruby/object:Gem::Version
222
- version: 1.1.1
168
+ version_requirements: *7991860
223
169
  - !ruby/object:Gem::Dependency
224
170
  name: gds-api-adapters
225
- requirement: !ruby/object:Gem::Requirement
171
+ requirement: &7990140 !ruby/object:Gem::Requirement
226
172
  none: false
227
173
  requirements:
228
- - - '='
174
+ - - =
229
175
  - !ruby/object:Gem::Version
230
176
  version: 2.7.1
231
177
  type: :development
232
178
  prerelease: false
233
- version_requirements: !ruby/object:Gem::Requirement
234
- none: false
235
- requirements:
236
- - - '='
237
- - !ruby/object:Gem::Version
238
- version: 2.7.1
179
+ version_requirements: *7990140
239
180
  - !ruby/object:Gem::Dependency
240
181
  name: timecop
241
- requirement: !ruby/object:Gem::Requirement
182
+ requirement: &7989560 !ruby/object:Gem::Requirement
242
183
  none: false
243
184
  requirements:
244
185
  - - ~>
@@ -246,28 +187,7 @@ dependencies:
246
187
  version: 0.5.1
247
188
  type: :development
248
189
  prerelease: false
249
- version_requirements: !ruby/object:Gem::Requirement
250
- none: false
251
- requirements:
252
- - - ~>
253
- - !ruby/object:Gem::Version
254
- version: 0.5.1
255
- - !ruby/object:Gem::Dependency
256
- name: activesupport
257
- requirement: !ruby/object:Gem::Requirement
258
- none: false
259
- requirements:
260
- - - '='
261
- - !ruby/object:Gem::Version
262
- version: 3.2.13
263
- type: :development
264
- prerelease: false
265
- version_requirements: !ruby/object:Gem::Requirement
266
- none: false
267
- requirements:
268
- - - '='
269
- - !ruby/object:Gem::Version
270
- version: 3.2.13
190
+ version_requirements: *7989560
271
191
  description: Rack middleware for skinning pages using a specific template
272
192
  email:
273
193
  - bengriffiths@gmail.com
@@ -296,6 +216,7 @@ files:
296
216
  - lib/slimmer/govuk_request_id.rb
297
217
  - lib/slimmer/template.rb
298
218
  - lib/slimmer/component_resolver.rb
219
+ - lib/slimmer/cache.rb
299
220
  - lib/slimmer/processors/header_context_inserter.rb
300
221
  - lib/slimmer/processors/navigation_mover.rb
301
222
  - lib/slimmer/processors/google_analytics_configurator.rb
@@ -334,6 +255,7 @@ files:
334
255
  - test/fixtures/beta_notice.html.erb
335
256
  - test/headers_test.rb
336
257
  - test/test_template_dependency_on_static_test.rb
258
+ - test/cache_test.rb
337
259
  - test/test_helper.rb
338
260
  - test/processors/header_context_inserter_test.rb
339
261
  - test/processors/body_inserter_test.rb
@@ -363,7 +285,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
363
285
  version: '0'
364
286
  segments:
365
287
  - 0
366
- hash: 3545050969228992216
288
+ hash: -2123745403723788320
367
289
  required_rubygems_version: !ruby/object:Gem::Requirement
368
290
  none: false
369
291
  requirements:
@@ -372,10 +294,10 @@ required_rubygems_version: !ruby/object:Gem::Requirement
372
294
  version: '0'
373
295
  segments:
374
296
  - 0
375
- hash: 3545050969228992216
297
+ hash: -2123745403723788320
376
298
  requirements: []
377
299
  rubyforge_project: slimmer
378
- rubygems_version: 1.8.23
300
+ rubygems_version: 1.8.11
379
301
  signing_key:
380
302
  specification_version: 3
381
303
  summary: Thinner than the skinner
@@ -397,6 +319,7 @@ test_files:
397
319
  - test/fixtures/beta_notice.html.erb
398
320
  - test/headers_test.rb
399
321
  - test/test_template_dependency_on_static_test.rb
322
+ - test/cache_test.rb
400
323
  - test/test_helper.rb
401
324
  - test/processors/header_context_inserter_test.rb
402
325
  - test/processors/body_inserter_test.rb