slimmer 4.2.0 → 4.2.1

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/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