slimmer 10.0.0 → 10.1.0

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.
Files changed (41) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +7 -0
  3. data/README.md +6 -31
  4. data/Rakefile +0 -6
  5. data/lib/slimmer.rb +12 -2
  6. data/lib/slimmer/app.rb +1 -4
  7. data/lib/slimmer/component_resolver.rb +2 -6
  8. data/lib/slimmer/govuk_components.rb +12 -0
  9. data/lib/slimmer/govuk_request_id.rb +0 -5
  10. data/lib/slimmer/headers.rb +42 -0
  11. data/lib/slimmer/http_client.rb +16 -0
  12. data/lib/slimmer/i18n_backend.rb +3 -10
  13. data/lib/slimmer/skin.rb +3 -7
  14. data/lib/slimmer/version.rb +1 -1
  15. metadata +20 -72
  16. data/lib/slimmer/cache.rb +0 -46
  17. data/test/cache_test.rb +0 -53
  18. data/test/changelog_test.rb +0 -10
  19. data/test/component_resolver_test.rb +0 -41
  20. data/test/fixtures/404.html.erb +0 -13
  21. data/test/fixtures/410.html.erb +0 -13
  22. data/test/fixtures/500.html.erb +0 -13
  23. data/test/fixtures/core_layout.html.erb +0 -19
  24. data/test/fixtures/proposition_menu.html.erb +0 -7
  25. data/test/fixtures/report_a_problem.raw.html.erb +0 -23
  26. data/test/headers_test.rb +0 -57
  27. data/test/processors/body_inserter_test.rb +0 -43
  28. data/test/processors/header_context_inserter_test.rb +0 -51
  29. data/test/processors/inside_header_inserter_test.rb +0 -35
  30. data/test/processors/metadata_inserter_test.rb +0 -86
  31. data/test/processors/navigation_mover_test.rb +0 -53
  32. data/test/processors/report_a_problem_inserter_test.rb +0 -75
  33. data/test/processors/search_parameter_inserter_test.rb +0 -39
  34. data/test/processors/search_path_setter_test.rb +0 -39
  35. data/test/processors/search_remover_test.rb +0 -62
  36. data/test/processors/tag_mover_test.rb +0 -95
  37. data/test/skin_test.rb +0 -99
  38. data/test/test_helper.rb +0 -136
  39. data/test/test_helpers/govuk_components_test.rb +0 -19
  40. data/test/test_template_dependency_on_static_test.rb +0 -25
  41. data/test/typical_usage_test.rb +0 -358
data/lib/slimmer/cache.rb DELETED
@@ -1,46 +0,0 @@
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
data/test/cache_test.rb DELETED
@@ -1,53 +0,0 @@
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
@@ -1,10 +0,0 @@
1
- require_relative 'test_helper'
2
-
3
- describe 'CHANGELOG' do
4
-
5
- it "should have an entry for the current version" do
6
- changelog_contents = File.read(File.expand_path("../../CHANGELOG.md", __FILE__))
7
-
8
- assert_match /^#+\s*#{Regexp.escape(Slimmer::VERSION)}/, changelog_contents, "No entry for #{Slimmer::VERSION} found in CHANGELOG.md"
9
- end
10
- end
@@ -1,41 +0,0 @@
1
- require_relative "test_helper"
2
-
3
- describe Slimmer::ComponentResolver do
4
- describe "find_templates" do
5
- before do
6
- @resolver = Slimmer::ComponentResolver.new
7
- end
8
-
9
- it "should return nothing if the prefix doesn't match 'govuk_component'" do
10
- assert_equal [], @resolver.find_templates('name', 'prefix', false, {}, false)
11
- end
12
-
13
- it "should request a valid template from the server" do
14
- assert_valid_template_requested('name', 'name.raw.html.erb')
15
- end
16
-
17
- it "should request a valid template from the server when a raw template is requested" do
18
- assert_valid_template_requested('name.raw', 'name.raw.html.erb')
19
- end
20
-
21
- it "should request a valid template from the server when the full template filename is requested" do
22
- assert_valid_template_requested('name.raw.html.erb', 'name.raw.html.erb')
23
- end
24
-
25
- it "should return a known template in test mode" do
26
- @resolver.expects(:test?).returns(true)
27
-
28
- templates = @resolver.find_templates('name', 'govuk_component', false, {}, false)
29
- assert_match /<test-govuk-component data-template="govuk_component-name">/, templates.first.args[0]
30
- end
31
- end
32
-
33
- def assert_valid_template_requested(requested, expected)
34
- expected_url = "http://static.dev.gov.uk/templates/govuk_component/#{expected}"
35
- stub_request(:get, expected_url).to_return body: "<foo />"
36
-
37
- templates = @resolver.find_templates(requested, 'govuk_component', false, {}, false)
38
- assert_requested :get, expected_url
39
- assert_equal '<foo />', templates.first.args[0]
40
- end
41
- end
@@ -1,13 +0,0 @@
1
- <!DOCTYPE html>
2
- <html>
3
- <head>
4
- <title>Slimmer, yay!</title>
5
- </head>
6
- <body>
7
- <div class="content">
8
- <header><h1>Oops! We can't find what you're looking for.</h1></header>
9
- <div id="wrapper" class="group">
10
- </div>
11
- </div>
12
- </body>
13
- </html>
@@ -1,13 +0,0 @@
1
- <!DOCTYPE html>
2
- <html>
3
- <head>
4
- <title>Slimmer, yay!</title>
5
- </head>
6
- <body>
7
- <div class="content">
8
- <header><h1>That's gone now, sorry.</h1></header>
9
- <div id="wrapper" class="group">
10
- </div>
11
- </div>
12
- </body>
13
- </html>
@@ -1,13 +0,0 @@
1
- <!DOCTYPE html>
2
- <html>
3
- <head>
4
- <title>Slimmer, yay!</title>
5
- </head>
6
- <body>
7
- <div class="content">
8
- <header><h1>We seem to be having a problem.</h1></header>
9
- <div id="wrapper" class="group">
10
- </div>
11
- </div>
12
- </body>
13
- </html>
@@ -1,19 +0,0 @@
1
- <!DOCTYPE html>
2
- <html>
3
- <head>
4
- <title>Slimmer, yay!</title>
5
- </head>
6
- <body>
7
- <header id="global-header"><h1>I AM A TITLE</h1></header>
8
-
9
- <div id="global-breadcrumb" class="header-context">
10
- <ol role="navigation"><li>MySite</li></ol>
11
- </div>
12
-
13
- <div id="wrapper" class="group">
14
- </div>
15
-
16
- <footer id="footer">
17
- </footer>
18
- </body>
19
- </html>
@@ -1,7 +0,0 @@
1
- <div class="header-proposition">
2
- <div class="content">
3
- <nav id="proposition-menu">
4
- <a href="#">Navigation item</a>
5
- </nav>
6
- </div>
7
- </div>
@@ -1,23 +0,0 @@
1
- <!-- report_a_problem -->
2
- <div class="report-a-problem-container">
3
- <form accept-charset="UTF-8" action="/feedback" method="post">
4
- <div style="margin:0;padding:0;display:inline"><input name="utf8" type="hidden" value="✓"></div>
5
- <input id="url" name="url" type="hidden" value="<%= request_url %>">
6
- <input id="url" name="source" type="hidden" value="<%= source %>">
7
- <input id="url" name="page_owner" type="hidden" value="<%= page_owner %>">
8
- <label for="what_doing">
9
- What were you doing?
10
- <input id="what_doing" name="what_doing" type="text">
11
- </label>
12
- <label for="what_happened">
13
- What happened?
14
- <input id="what_happened" name="what_happened" type="text">
15
- </label>
16
- <label for="what_expected">
17
- What did you expect to happen?
18
- <input id="what_expected" name="what_expected" type="text">
19
- </label>
20
- <input name="commit" type="submit" value="Submit">
21
- </form>
22
- </div>
23
- <!-- end report_a_problem -->
data/test/headers_test.rb DELETED
@@ -1,57 +0,0 @@
1
- require_relative "test_helper"
2
- require "slimmer/headers"
3
-
4
- class HeadersTest < MiniTest::Test
5
- include Slimmer::Headers
6
- attr_accessor :headers
7
-
8
- def setup
9
- self.headers = {}
10
- end
11
-
12
- def test_should_set_section_header
13
- set_slimmer_headers section: "rhubarb"
14
- assert_equal "rhubarb", headers["X-Slimmer-Section"]
15
- end
16
-
17
- def test_should_set_format_header
18
- set_slimmer_headers format: "rhubarb"
19
- assert_equal "rhubarb", headers["X-Slimmer-Format"]
20
- end
21
-
22
- def test_should_set_application_name_header
23
- set_slimmer_headers application_name: "whitehall"
24
- assert_equal "whitehall", headers["X-Slimmer-Application-Name"]
25
- end
26
-
27
- def test_should_set_page_owner_header
28
- set_slimmer_headers page_owner: "bobby"
29
- assert_equal "bobby", headers["X-Slimmer-Page-Owner"]
30
- end
31
-
32
- def test_should_set_organisations_header
33
- set_slimmer_headers organisations: "<D123><P1>"
34
- assert_equal "<D123><P1>", headers["X-Slimmer-Organisations"]
35
- end
36
-
37
- def test_should_set_result_count_header
38
- set_slimmer_headers result_count: 3
39
- assert_equal "3", headers["X-Slimmer-Result-Count"]
40
- end
41
-
42
- def test_should_set_template_header
43
- set_slimmer_headers template: "rhubarb"
44
- assert_equal "rhubarb", headers["X-Slimmer-Template"]
45
- end
46
-
47
- def test_should_set_skip_header
48
- set_slimmer_headers skip: "rhubarb"
49
- assert_equal "rhubarb", headers["X-Slimmer-Skip"]
50
- end
51
-
52
- def test_should_raise_an_exception_if_a_header_has_a_typo
53
- assert_raises Slimmer::Headers::InvalidHeader do
54
- set_slimmer_headers seccion: "wrong"
55
- end
56
- end
57
- end
@@ -1,43 +0,0 @@
1
- require "test_helper"
2
-
3
- class BodyInserterTest < MiniTest::Test
4
- def test_should_replace_contents_of_wrapper_in_template
5
- template = as_nokogiri %{
6
- <html><body><div><div id="wrapper"></div></div></body></html>
7
- }
8
- source = as_nokogiri %{
9
- <html><body><nav></nav><div id="wrapper"><p>this should be moved</p></div></body></html>
10
- }
11
-
12
- Slimmer::Processors::BodyInserter.new.filter(source, template)
13
- assert_in template, "#wrapper", %{<p>this should be moved</p>}
14
- end
15
-
16
- def test_should_copy_across_unicode_characters_without_messing_with_their_encoding
17
- unicode_endash = [0x2013].pack('U*')
18
- template = as_nokogiri %{
19
- <html><body><div><div id="wrapper"></div></div></body></html>
20
- }
21
- source = as_nokogiri %{
22
- <html><body><nav></nav><div id="wrapper"><p>#{unicode_endash}</p></div></body></html>
23
- }
24
-
25
- Slimmer::Processors::BodyInserter.new.filter(source, template)
26
- assert_equal unicode_endash, template.at_css("#wrapper p").inner_text
27
- end
28
-
29
- def test_should_allow_replacement_of_arbitrary_segments_into_wrapper
30
- template = as_nokogiri %{
31
- <html><body><div>
32
- <div id="wrapper">don't touch this</div>
33
- </body></html>
34
- }
35
- source = as_nokogiri %{
36
- <html><body><div id="some_other_id"><p>this should be moved</p></div></body></html>
37
- }
38
-
39
- Slimmer::Processors::BodyInserter.new("some_other_id").filter(source, template)
40
- assert_not_in template, "#wrapper"
41
- assert_in template, "#some_other_id", %{<p>this should be moved</p>}
42
- end
43
- end
@@ -1,51 +0,0 @@
1
- require "test_helper"
2
-
3
- class HeaderContextInserterTest < MiniTest::Test
4
- def test_should_replace_contents_of_header_context_in_template
5
- template = as_nokogiri %{
6
- <html><body><div><div class="header-context"></div></div></body></html>
7
- }
8
- source = as_nokogiri %{
9
- <html><body><nav></nav><div class="header-context"><p>this should be moved</p></div></body></html>
10
- }
11
-
12
- Slimmer::Processors::HeaderContextInserter.new.filter(source, template)
13
- assert_in template, ".header-context", %{<p>this should be moved</p>}
14
- end
15
-
16
- def test_should_replace_classes_of_header_context_in_template
17
- template = as_nokogiri %{
18
- <html><body><div><div class="header-context template-class"></div></div></body></html>
19
- }
20
- source = as_nokogiri %{
21
- <html><body><nav></nav><div class="header-context app-class"><p>this should be moved</p></div></body></html>
22
- }
23
-
24
- Slimmer::Processors::HeaderContextInserter.new.filter(source, template)
25
- assert_in template, ".header-context.app-class", %{<p>this should be moved</p>}
26
- assert_not_in template, ".header-context.template-class"
27
- end
28
-
29
- def test_should_do_nothing_if_no_header_context_was_provided
30
- template = as_nokogiri %{
31
- <html><body><div><div class="header-context">should not be removed</div></div></body></html>
32
- }
33
- source = as_nokogiri %{
34
- <html><body><nav></nav></body></html>
35
- }
36
-
37
- Slimmer::Processors::HeaderContextInserter.new.filter(source, template)
38
- assert_in template, ".header-context", %{should not be removed}
39
- end
40
-
41
- def test_should_do_nothing_if_no_header_context_was_present_in_the_template
42
- template = as_nokogiri %{
43
- <html><body><div></div></body></html>
44
- }
45
- source = as_nokogiri %{
46
- <html><body><div><div class="header-context">should be ignored</div></div></body></html>
47
- }
48
-
49
- Slimmer::Processors::HeaderContextInserter.new.filter(source, template) # should not raise
50
- end
51
- end
@@ -1,35 +0,0 @@
1
- require_relative '../test_helper'
2
-
3
- class InsideHeaderInserterTest < MiniTest::Test
4
- def test_should_insert_into_header
5
- source = as_nokogiri %{
6
- <html>
7
- <body>
8
- <div class="slimmer-inside-header">
9
- <h2>Inserted Page Title</h2>
10
- </div>
11
- </body>
12
- </html>
13
- }
14
- template = as_nokogiri %{
15
- <html>
16
- <body>
17
- <div class="header-global">
18
- <div class="header-logo">
19
- <a href="https://www.gov.uk/" title="Go to the GOV.UK homepage" id="logo" class="content">
20
- <img src="/assets/gov.uk_logotype_crown_invert_trans.png" width="35" height="31" alt="">
21
- </a>
22
- </div>
23
- </div>
24
- </body>
25
- </html>
26
- }
27
-
28
- Slimmer::Processors::InsideHeaderInserter.new.filter(source, template)
29
-
30
- assert_in template,
31
- "div.header-global .header-logo + h2",
32
- "Inserted Page Title",
33
- 'Expecting the H2 to be inserted after .header-logo'
34
- end
35
- end