slimmer 7.0.0 → 8.0.0

Sign up to get free protection for your applications and to get access to all the features.
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