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.
- checksums.yaml +4 -4
- data/CHANGELOG.md +7 -0
- data/README.md +6 -31
- data/Rakefile +0 -6
- data/lib/slimmer.rb +12 -2
- data/lib/slimmer/app.rb +1 -4
- data/lib/slimmer/component_resolver.rb +2 -6
- data/lib/slimmer/govuk_components.rb +12 -0
- data/lib/slimmer/govuk_request_id.rb +0 -5
- data/lib/slimmer/headers.rb +42 -0
- data/lib/slimmer/http_client.rb +16 -0
- data/lib/slimmer/i18n_backend.rb +3 -10
- data/lib/slimmer/skin.rb +3 -7
- data/lib/slimmer/version.rb +1 -1
- metadata +20 -72
- data/lib/slimmer/cache.rb +0 -46
- data/test/cache_test.rb +0 -53
- data/test/changelog_test.rb +0 -10
- data/test/component_resolver_test.rb +0 -41
- data/test/fixtures/404.html.erb +0 -13
- data/test/fixtures/410.html.erb +0 -13
- data/test/fixtures/500.html.erb +0 -13
- data/test/fixtures/core_layout.html.erb +0 -19
- data/test/fixtures/proposition_menu.html.erb +0 -7
- data/test/fixtures/report_a_problem.raw.html.erb +0 -23
- data/test/headers_test.rb +0 -57
- data/test/processors/body_inserter_test.rb +0 -43
- data/test/processors/header_context_inserter_test.rb +0 -51
- data/test/processors/inside_header_inserter_test.rb +0 -35
- data/test/processors/metadata_inserter_test.rb +0 -86
- data/test/processors/navigation_mover_test.rb +0 -53
- data/test/processors/report_a_problem_inserter_test.rb +0 -75
- data/test/processors/search_parameter_inserter_test.rb +0 -39
- data/test/processors/search_path_setter_test.rb +0 -39
- data/test/processors/search_remover_test.rb +0 -62
- data/test/processors/tag_mover_test.rb +0 -95
- data/test/skin_test.rb +0 -99
- data/test/test_helper.rb +0 -136
- data/test/test_helpers/govuk_components_test.rb +0 -19
- data/test/test_template_dependency_on_static_test.rb +0 -25
- 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
|
data/test/changelog_test.rb
DELETED
@@ -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
|
data/test/fixtures/404.html.erb
DELETED
@@ -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>
|
data/test/fixtures/410.html.erb
DELETED
data/test/fixtures/500.html.erb
DELETED
@@ -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,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
|