slimmer 7.0.0 → 8.0.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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 9764cb7281a906d7133016e1d48fc732a2d5ad50
4
- data.tar.gz: 7020a355e1246293785e8a0be2f92d03a31e02b3
3
+ metadata.gz: 5f23b920aad27dfc980397b64f2f9e401b96d863
4
+ data.tar.gz: 79a169c43fcc6d616172ff4dcc637857cf2d1419
5
5
  SHA512:
6
- metadata.gz: bb99ec91c22a9e76db811c330b8466ba2f5217915f770045c14a48028d7533bc8d365cf8b23b85e27dbbceea55a1a2b310369a670579aa9becdadd5960afcd0a
7
- data.tar.gz: 88920a6e6fe1d6ebda6f43870e1e09dd7b9e06ac979843c6d6247fc1e3261e03e1aa467fefc2d5d3f7724c2c93e8e62d2c85ed277203834153f4a8c95132af75
6
+ metadata.gz: 34a7a53a6e06102e2f2db641c9971bc25891a76ed726739ed5a66fcc0db731b7535238884adb97d449616a04e57c259baea0498dd4cf9df67e152bb8755dac9f
7
+ data.tar.gz: 328d89ec79ca51cfd76a4fb7ebb80d59f53461eb8832115750d6f4998b4adf9f7ac6beced889fba4f71705f980ae6c3a306d51b2ae5872450525e12eb00f9535
data/CHANGELOG.md CHANGED
@@ -1,3 +1,19 @@
1
+ # 8.0.0
2
+
3
+ * Switch from JS custom variables to HTML meta tags
4
+
5
+ Slimmer now appends page metadata as meta tags instead of setting Google
6
+ custom variables within a script tag. The Google-specific implementation
7
+ details have been removed.
8
+
9
+ Any apps that need to report analytics events will require additional
10
+ Javascript that reads the meta tags and sends the relevant data to the
11
+ analytics platform. The current best practice for doing this is using
12
+ the GOV.UK Analytics API - you can find the [code, examples and documentation
13
+ in `govuk_frontend_toolkit`](https://github.com/alphagov/govuk_frontend_toolkit/blob/master/docs/analytics.md).
14
+
15
+ * Remove Proposition header, since this information wasn't being used
16
+
1
17
  # 7.0.0
2
18
 
3
19
  * Remove AlphaLabelInserter, BetaNoticeInserter, BetaLabelInserter. These are
data/lib/slimmer.rb CHANGED
@@ -26,7 +26,7 @@ module Slimmer
26
26
  autoload :BodyInserter, 'slimmer/processors/body_inserter'
27
27
  autoload :ConditionalCommentMover, 'slimmer/processors/conditional_comment_mover'
28
28
  autoload :FooterRemover, 'slimmer/processors/footer_remover'
29
- autoload :GoogleAnalyticsConfigurator, 'slimmer/processors/google_analytics_configurator'
29
+ autoload :MetadataInserter, 'slimmer/processors/metadata_inserter'
30
30
  autoload :HeaderContextInserter, 'slimmer/processors/header_context_inserter'
31
31
  autoload :NavigationMover, 'slimmer/processors/navigation_mover'
32
32
  autoload :MetaViewportRemover, 'slimmer/processors/meta_viewport_remover'
@@ -8,7 +8,6 @@ module Slimmer
8
8
  application_name: "Application-Name",
9
9
  format: "Format",
10
10
  page_owner: "Page-Owner",
11
- proposition: "Proposition",
12
11
  organisations: "Organisations",
13
12
  report_a_problem: "Report-a-Problem",
14
13
  world_locations: "World-Locations",
@@ -0,0 +1,34 @@
1
+ module Slimmer::Processors
2
+ class MetadataInserter
3
+ def initialize(response, artefact)
4
+ @headers = response.headers
5
+ @artefact = artefact
6
+ end
7
+
8
+ def filter(src, dest)
9
+ head = dest.at_css('head')
10
+
11
+ if @artefact
12
+ add_meta_tag('section', @artefact.primary_root_section["title"].downcase, head) if @artefact.primary_root_section
13
+ add_meta_tag('need-ids', @artefact.need_ids.join(',').downcase, head) if @artefact.need_ids
14
+ end
15
+
16
+ add_meta_tag('analytics:organisations', @headers[Slimmer::Headers::ORGANISATIONS_HEADER], head)
17
+ add_meta_tag('analytics:world-locations', @headers[Slimmer::Headers::WORLD_LOCATIONS_HEADER], head)
18
+ add_meta_tag('format', @headers[Slimmer::Headers::FORMAT_HEADER], head)
19
+ add_meta_tag('search-result-count', @headers[Slimmer::Headers::RESULT_COUNT_HEADER], head)
20
+ end
21
+
22
+ private
23
+
24
+ def add_meta_tag(name, content, head)
25
+ if content
26
+ meta_node = Nokogiri::XML::Node.new('meta', head)
27
+ meta_node['name'] = "govuk:#{name}"
28
+ meta_node['content'] = content
29
+
30
+ head.add_child(meta_node)
31
+ end
32
+ end
33
+ end
34
+ end
data/lib/slimmer/skin.rb CHANGED
@@ -117,7 +117,7 @@ module Slimmer
117
117
  Processors::BodyClassCopier.new,
118
118
  Processors::HeaderContextInserter.new(),
119
119
  Processors::SectionInserter.new(artefact),
120
- Processors::GoogleAnalyticsConfigurator.new(response, artefact),
120
+ Processors::MetadataInserter.new(response, artefact),
121
121
  Processors::SearchParameterInserter.new(response),
122
122
  Processors::SearchPathSetter.new(response),
123
123
  Processors::RelatedItemsInserter.new(self, artefact),
@@ -1,3 +1,3 @@
1
1
  module Slimmer
2
- VERSION = '7.0.0'
2
+ VERSION = '8.0.0'
3
3
  end
@@ -2,11 +2,6 @@
2
2
  <html>
3
3
  <head>
4
4
  <title>Slimmer, yay!</title>
5
- <script id="ga-params" type="text/javascript">
6
- var GOVUK = GOVUK || {};
7
- GOVUK.Analytics = GOVUK.Analytics || {};
8
- var _gaq = _gaq || [];
9
- </script>
10
5
  </head>
11
6
  <body>
12
7
  <header id="global-header"><h1>I AM A TITLE</h1></header>
@@ -0,0 +1,149 @@
1
+ require_relative "../test_helper"
2
+
3
+ module MetadataInserterTest
4
+
5
+ GENERIC_DOCUMENT = <<-END
6
+ <html>
7
+ <head>
8
+ <title>The title of the page</title>
9
+ </head>
10
+ <body class="body_class">
11
+ <div id="wrapper">The body of the page</div>
12
+ </body>
13
+ </html>
14
+ END
15
+
16
+ module MetaTagAssertions
17
+ def assert_meta_tag(name, content)
18
+ template = Nokogiri::HTML(last_response.body)
19
+ assert_in template, "head meta[name='govuk:#{name}'][content='#{content}']"
20
+ end
21
+
22
+ def refute_meta_tag(name)
23
+ template = Nokogiri::HTML(last_response.body)
24
+ assert_not_in template, "head meta[name='govuk:#{name}']"
25
+ end
26
+ end
27
+
28
+ class WithHeadersTest < SlimmerIntegrationTest
29
+ include MetaTagAssertions
30
+
31
+ def setup
32
+ super
33
+
34
+ artefact = artefact_for_slug_in_a_subsection("something", "rhubarb/in-puddings")
35
+ artefact["details"].merge!(
36
+ "need_ids" => [100001,100002],
37
+ )
38
+ headers = {
39
+ Slimmer::Headers::FORMAT_HEADER => "custard",
40
+ Slimmer::Headers::RESULT_COUNT_HEADER => "3",
41
+ Slimmer::Headers::ARTEFACT_HEADER => artefact.to_json,
42
+ Slimmer::Headers::ORGANISATIONS_HEADER => "<P1><D422>",
43
+ Slimmer::Headers::WORLD_LOCATIONS_HEADER => "<WL3>"
44
+ }
45
+
46
+ given_response 200, GENERIC_DOCUMENT, headers
47
+ end
48
+
49
+ def test_should_include_section_meta_tag
50
+ assert_meta_tag "section", "rhubarb"
51
+ end
52
+
53
+ def test_should_include_format_meta_tag
54
+ assert_meta_tag "format", "custard"
55
+ end
56
+
57
+ def test_should_include_need_ids_meta_tag
58
+ assert_meta_tag "need-ids", "100001,100002"
59
+ end
60
+
61
+ def test_should_include_organisations_meta_tag
62
+ assert_meta_tag "analytics:organisations", "<P1><D422>"
63
+ end
64
+
65
+ def test_should_include_world_locations_meta_tag
66
+ assert_meta_tag "analytics:world-locations", "<WL3>"
67
+ end
68
+
69
+ def test_should_include_search_result_count_meta_tag
70
+ assert_meta_tag "search-result-count", "3"
71
+ end
72
+ end
73
+
74
+ class WithInvalidAttributes < SlimmerIntegrationTest
75
+ include MetaTagAssertions
76
+
77
+ def setup
78
+ super
79
+ end
80
+
81
+ def test_should_skip_passing_need_ids_if_they_are_nil
82
+ artefact = artefact_for_slug_in_a_subsection("something", "rhubarb/in-puddings")
83
+ headers = {
84
+ Slimmer::Headers::ARTEFACT_HEADER => artefact.to_json,
85
+ Slimmer::Headers::FORMAT_HEADER => "custard"
86
+ }
87
+ given_response 200, GENERIC_DOCUMENT, headers
88
+
89
+ refute_meta_tag "need-ids"
90
+ # the presence of these attributes tests that the nil check worked
91
+ assert_meta_tag "section", "rhubarb"
92
+ assert_meta_tag "format", "custard"
93
+ end
94
+ end
95
+
96
+ class WithoutHeadersTest < SlimmerIntegrationTest
97
+ include MetaTagAssertions
98
+
99
+ given_response 200, GENERIC_DOCUMENT, {}
100
+
101
+ def test_should_omit_section
102
+ refute_meta_tag "section"
103
+ end
104
+
105
+ def test_should_omit_internal_format_name
106
+ refute_meta_tag "format"
107
+ end
108
+
109
+ def test_should_omit_need_ID
110
+ refute_meta_tag "need-ids"
111
+ end
112
+
113
+ def test_should_omit_organisations
114
+ refute_meta_tag "analytics:organisations"
115
+ end
116
+
117
+ def test_should_omit_world_locations
118
+ refute_meta_tag "analytics:world-locations"
119
+ end
120
+
121
+ def test_should_omit_result_count
122
+ refute_meta_tag "search-result-count"
123
+ end
124
+ end
125
+
126
+ class WithNilHeaderTest < SlimmerIntegrationTest
127
+ include MetaTagAssertions
128
+
129
+ def setup
130
+ super
131
+
132
+ artefact = artefact_for_slug_in_a_subsection("something", "rhubarb/in-puddings")
133
+ artefact["details"].merge!(
134
+ "need_ids" => [100001, 100002],
135
+ )
136
+ headers = {
137
+ Slimmer::Headers::RESULT_COUNT_HEADER => "3",
138
+ Slimmer::Headers::ARTEFACT_HEADER => artefact.to_json,
139
+ Slimmer::Headers::ORGANISATIONS_HEADER => "<P1><D422>"
140
+ }
141
+
142
+ given_response 200, GENERIC_DOCUMENT, headers
143
+ end
144
+
145
+ def test_should_include_organisation_meta_tag_without_crashing
146
+ assert_meta_tag "analytics:organisations", "<P1><D422>"
147
+ end
148
+ end
149
+ end
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: 7.0.0
4
+ version: 8.0.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Ben Griffiths
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2015-02-13 00:00:00.000000000 Z
12
+ date: 2015-03-13 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: nokogiri
@@ -266,9 +266,9 @@ files:
266
266
  - lib/slimmer/processors/body_inserter.rb
267
267
  - lib/slimmer/processors/conditional_comment_mover.rb
268
268
  - lib/slimmer/processors/footer_remover.rb
269
- - lib/slimmer/processors/google_analytics_configurator.rb
270
269
  - lib/slimmer/processors/header_context_inserter.rb
271
270
  - lib/slimmer/processors/meta_viewport_remover.rb
271
+ - lib/slimmer/processors/metadata_inserter.rb
272
272
  - lib/slimmer/processors/navigation_mover.rb
273
273
  - lib/slimmer/processors/related_items_inserter.rb
274
274
  - lib/slimmer/processors/report_a_problem_inserter.rb
@@ -300,9 +300,9 @@ files:
300
300
  - test/fixtures/wrapper.html.erb
301
301
  - test/headers_test.rb
302
302
  - test/processors/body_inserter_test.rb
303
- - test/processors/google_analytics_test.rb
304
303
  - test/processors/header_context_inserter_test.rb
305
304
  - test/processors/meta_viewport_remover_test.rb
305
+ - test/processors/metadata_inserter_test.rb
306
306
  - test/processors/navigation_mover_test.rb
307
307
  - test/processors/related_items_inserter_test.rb
308
308
  - test/processors/report_a_problem_inserter_test.rb
@@ -361,9 +361,9 @@ test_files:
361
361
  - test/processors/navigation_mover_test.rb
362
362
  - test/processors/related_items_inserter_test.rb
363
363
  - test/processors/search_path_setter_test.rb
364
- - test/processors/google_analytics_test.rb
365
364
  - test/processors/meta_viewport_remover_test.rb
366
365
  - test/processors/search_parameter_inserter_test.rb
367
366
  - test/processors/section_inserter_test.rb
368
367
  - test/processors/report_a_problem_inserter_test.rb
369
368
  - test/processors/tag_mover_test.rb
369
+ - test/processors/metadata_inserter_test.rb
@@ -1,47 +0,0 @@
1
- require "json"
2
-
3
- module Slimmer::Processors
4
- class GoogleAnalyticsConfigurator
5
- PAGE_LEVEL_EVENT = 3
6
-
7
- def initialize(response, artefact)
8
- @headers = response.headers
9
- @artefact = artefact
10
- end
11
-
12
- def filter(src, dest)
13
- custom_vars = []
14
- if @artefact
15
- custom_vars << set_custom_var_downcase(1, "Section", @artefact.primary_root_section["title"]) if @artefact.primary_root_section
16
- custom_vars << set_multivalue_custom_var(3, "NeedID", @artefact.need_ids)
17
- custom_vars << set_custom_var_downcase(4, "Proposition", (@artefact.business_proposition ? 'business' : 'citizen')) unless @artefact.business_proposition.nil?
18
- end
19
- custom_vars << set_custom_var(9, "Organisations", @headers[Slimmer::Headers::ORGANISATIONS_HEADER])
20
- custom_vars << set_custom_var(10, "WorldLocations", @headers[Slimmer::Headers::WORLD_LOCATIONS_HEADER])
21
- custom_vars << set_custom_var_downcase(2, "Format", @headers[Slimmer::Headers::FORMAT_HEADER])
22
- custom_vars << set_custom_var_downcase(5, "ResultCount", @headers[Slimmer::Headers::RESULT_COUNT_HEADER])
23
-
24
- if dest.at_css("#ga-params")
25
- dest.at_css("#ga-params").content += custom_vars.compact.join("\n")
26
- end
27
- end
28
-
29
- private
30
- def set_custom_var_downcase(slot, name, value)
31
- return nil unless value
32
- set_custom_var(slot, name, value.downcase)
33
- end
34
-
35
- def set_multivalue_custom_var(slot, name, values)
36
- return nil if !values.is_a?(Array) || values.empty?
37
- set_custom_var(slot, name, values.join(',').downcase)
38
- end
39
-
40
- def set_custom_var(slot, name, value)
41
- return nil unless value
42
- response = "_gaq.push(#{JSON.dump([ "_setCustomVar", slot, name, value, PAGE_LEVEL_EVENT])});\n"
43
- response + "GOVUK.Analytics.#{name} = \"#{value}\";"
44
- end
45
- end
46
- end
47
-
@@ -1,198 +0,0 @@
1
- require_relative "../test_helper"
2
- require "v8"
3
-
4
- module GoogleAnalyticsTest
5
- PAGE_LEVEL_EVENT = 3
6
-
7
- GENERIC_DOCUMENT = <<-END
8
- <html>
9
- <head>
10
- <title>The title of the page</title>
11
- </head>
12
- <body class="body_class">
13
- <div id="wrapper">The body of the page</div>
14
- </body>
15
- </html>
16
- END
17
-
18
- module JavaScriptAssertions
19
- def gaq
20
- js = Nokogiri::HTML(last_response.body).at_css("#ga-params").text
21
- context = V8::Context.new
22
- context.eval(js)
23
- context.eval("_gaq");
24
- end
25
-
26
- def govuk
27
- js = Nokogiri::HTML(last_response.body).at_css("#ga-params").text
28
- context = V8::Context.new
29
- context.eval(js)
30
- context.eval("GOVUK.Analytics");
31
- end
32
-
33
- def assert_custom_var(slot, name, value, page_level)
34
- # Ruby Racer JS arrays don't accept range indexing, so we must
35
- # use a slightly longer workaround
36
- vars = gaq.select { |a| a[0] == "_setCustomVar" }.
37
- map { |a| (1..4).map { |i| a[i] } }
38
- assert_includes vars, [slot, name, value, page_level]
39
- end
40
-
41
- def assert_set_var(name, value, object)
42
- assert_equal value, object.find { |each| each[0] == name }[1]
43
- end
44
-
45
- def refute_custom_var(name)
46
- vars = gaq.select { |a| a[0] == "_setCustomVar" }.map { |a| a[2] }
47
- refute_includes vars, name
48
- end
49
- end
50
-
51
- class WithHeadersTest < SlimmerIntegrationTest
52
- include JavaScriptAssertions
53
-
54
- def setup
55
- super
56
-
57
- artefact = artefact_for_slug_in_a_subsection("something", "rhubarb/in-puddings")
58
- artefact["details"].merge!(
59
- "need_ids" => [100001,100002],
60
- "business_proposition" => true,
61
- )
62
- headers = {
63
- Slimmer::Headers::FORMAT_HEADER => "custard",
64
- Slimmer::Headers::RESULT_COUNT_HEADER => "3",
65
- Slimmer::Headers::ARTEFACT_HEADER => artefact.to_json,
66
- Slimmer::Headers::ORGANISATIONS_HEADER => "<P1><D422>",
67
- Slimmer::Headers::WORLD_LOCATIONS_HEADER => "<WL3>"
68
- }
69
-
70
- given_response 200, GENERIC_DOCUMENT, headers
71
- end
72
-
73
- def test_should_pass_section_to_GA
74
- assert_custom_var 1, "Section", "rhubarb", PAGE_LEVEL_EVENT
75
- end
76
-
77
- def test_should_set_section_in_GOVUK_object
78
- assert_set_var "Section", "rhubarb", govuk
79
- end
80
-
81
- def test_should_pass_internal_format_name_to_GA
82
- assert_custom_var 2, "Format", "custard", PAGE_LEVEL_EVENT
83
- end
84
-
85
- def test_should_set_internal_format_name_in_GOVUK_object
86
- assert_set_var "Format", "custard", govuk
87
- end
88
-
89
- def test_should_pass_need_ids_to_GA
90
- assert_custom_var 3, "NeedID", "100001,100002", PAGE_LEVEL_EVENT
91
- end
92
-
93
- def test_should_set_need_ids_in_GOVUK_object
94
- assert_set_var "NeedID", "100001,100002", govuk
95
- end
96
-
97
- def test_should_pass_proposition_to_GA
98
- assert_custom_var 4, "Proposition", "business", PAGE_LEVEL_EVENT
99
- end
100
-
101
- def test_should_pass_organisation_to_GA
102
- assert_custom_var 9, "Organisations", "<P1><D422>", PAGE_LEVEL_EVENT
103
- end
104
-
105
- def test_should_pass_world_location_to_GA
106
- assert_custom_var 10, "WorldLocations", "<WL3>", PAGE_LEVEL_EVENT
107
- end
108
-
109
- def test_should_set_proposition_in_GOVUK_object
110
- assert_set_var "Proposition", "business", govuk
111
- end
112
-
113
- def test_should_pass_result_count_to_GA
114
- assert_custom_var 5, "ResultCount", "3", PAGE_LEVEL_EVENT
115
- end
116
-
117
- def test_should_set_result_count_in_GOVUK_object
118
- assert_set_var "ResultCount", "3", govuk
119
- end
120
- end
121
-
122
- class WithInvalidAttributes < SlimmerIntegrationTest
123
- include JavaScriptAssertions
124
-
125
- def setup
126
- super
127
- end
128
-
129
- def test_should_skip_passing_need_ids_if_they_are_nil
130
- artefact = artefact_for_slug_in_a_subsection("something", "rhubarb/in-puddings")
131
- headers = {
132
- Slimmer::Headers::ARTEFACT_HEADER => artefact.to_json,
133
- Slimmer::Headers::FORMAT_HEADER => "custard"
134
- }
135
- given_response 200, GENERIC_DOCUMENT, headers
136
-
137
- refute_custom_var "NeedID"
138
- # the presence of these attributes tests that the nil check worked
139
- assert_custom_var 1, "Section", "rhubarb", PAGE_LEVEL_EVENT
140
- assert_custom_var 2, "Format", "custard", PAGE_LEVEL_EVENT
141
- end
142
- end
143
-
144
- class WithoutHeadersTest < SlimmerIntegrationTest
145
- include JavaScriptAssertions
146
-
147
- given_response 200, GENERIC_DOCUMENT, {}
148
-
149
- def test_should_omit_section
150
- refute_custom_var "Section"
151
- end
152
-
153
- def test_should_omit_internal_format_name
154
- refute_custom_var "Format"
155
- end
156
-
157
- def test_should_omit_need_ID
158
- refute_custom_var "NeedID"
159
- end
160
-
161
- def test_should_omit_proposition
162
- refute_custom_var "Proposition"
163
- end
164
-
165
- def test_should_omit_organisations
166
- refute_custom_var "Organisations"
167
- end
168
-
169
- def test_should_omit_result_count
170
- refute_custom_var "ResultCount"
171
- end
172
- end
173
-
174
- class WithNilHeaderTest < SlimmerIntegrationTest
175
- include JavaScriptAssertions
176
-
177
- def setup
178
- super
179
-
180
- artefact = artefact_for_slug_in_a_subsection("something", "rhubarb/in-puddings")
181
- artefact["details"].merge!(
182
- "need_ids" => [100001, 100002],
183
- "business_proposition" => true
184
- )
185
- headers = {
186
- Slimmer::Headers::RESULT_COUNT_HEADER => "3",
187
- Slimmer::Headers::ARTEFACT_HEADER => artefact.to_json,
188
- Slimmer::Headers::ORGANISATIONS_HEADER => "<P1><D422>"
189
- }
190
-
191
- given_response 200, GENERIC_DOCUMENT, headers
192
- end
193
-
194
- def test_should_pass_organisation_to_GA_without_crashing
195
- assert_custom_var 9, "Organisations", "<P1><D422>", PAGE_LEVEL_EVENT
196
- end
197
- end
198
- end