slimmer 1.1.19 → 1.1.20

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/lib/slimmer/app.rb CHANGED
@@ -32,8 +32,8 @@ module Slimmer
32
32
  end
33
33
  end
34
34
 
35
- def on_success(request,body)
36
- @skin.success(request, body)
35
+ def on_success(source_request, request, body)
36
+ @skin.success(source_request, request, body)
37
37
  end
38
38
 
39
39
  def admin(request,body)
@@ -55,8 +55,8 @@ module Slimmer
55
55
  b
56
56
  end
57
57
 
58
- def rewrite_response(env,triplet)
59
- status, headers, app_body = triplet
58
+ def rewrite_response(env, response_to_skin)
59
+ status, headers, app_body = response_to_skin
60
60
  logger.debug "Slimmer: constructing request object"
61
61
  source_request = Rack::Request.new(env)
62
62
  logger.debug "Slimmer: constructing request headers object"
@@ -75,7 +75,7 @@ module Slimmer
75
75
  rewritten_body = admin(request,s(app_body))
76
76
  else
77
77
  logger.debug "Slimmer: Rewriting this request as a public request"
78
- rewritten_body = on_success(request,s(app_body))
78
+ rewritten_body = on_success(source_request, request, s(app_body))
79
79
  end
80
80
  when 301, 302, 304
81
81
  logger.debug "Slimmer: I will not rewrite this request"
@@ -0,0 +1,32 @@
1
+ require 'gds_api/helpers'
2
+
3
+ class RelatedItemsInserter
4
+ include GdsApi::Helpers
5
+ include ERB::Util
6
+
7
+ def initialize(related_block_template, external_request)
8
+ @related_block_template = related_block_template
9
+ @external_request = external_request
10
+ end
11
+
12
+ def requested_slug
13
+ url_parts = @external_request.path_info.split('/')
14
+ url_parts.size > 0 ? url_parts[1] : ''
15
+ end
16
+
17
+ def filter(content_document, page_template)
18
+ if content_document.at_css('body.citizen div#related-items')
19
+ page_template.at_css('body.citizen div#related-items').replace(related_item_block)
20
+ end
21
+ end
22
+
23
+ def metadata_from_panopticon
24
+ fetch_artefact(slug: requested_slug)
25
+ end
26
+
27
+ def related_item_block
28
+ artefact = metadata_from_panopticon
29
+ html = ERB.new(@related_block_template).result(binding)
30
+ Nokogiri::HTML.fragment(html)
31
+ end
32
+ end
data/lib/slimmer/skin.rb CHANGED
@@ -56,8 +56,13 @@ module Slimmer
56
56
  url = template_url template_name
57
57
  logger.debug "Slimmer: template lives at '#{url}'"
58
58
  source = open(url, "r:UTF-8", :ssl_verify_mode => OpenSSL::SSL::VERIFY_NONE).read
59
- logger.debug "Slimmer: Evaluating the template as ERB"
60
- template = ERB.new(source).result binding
59
+ if template_name =~ /\.raw/
60
+ logger.debug "Slimmer: reading the raw template"
61
+ template = source
62
+ else
63
+ logger.debug "Slimmer: Evaluating the template as ERB"
64
+ template = ERB.new(source).result binding
65
+ end
61
66
  cache template_name, template
62
67
  logger.debug "Slimmer: Returning evaluated template"
63
68
  template
@@ -117,7 +122,7 @@ module Slimmer
117
122
  process(processors,body,template('admin'))
118
123
  end
119
124
 
120
- def success(request,body)
125
+ def success(source_request, request, body)
121
126
  processors = [
122
127
  TitleInserter.new(),
123
128
  TagMover.new(),
@@ -126,6 +131,7 @@ module Slimmer
126
131
  HeaderContextInserter.new(),
127
132
  SectionInserter.new(),
128
133
  GoogleAnalyticsConfigurator.new(request.env),
134
+ RelatedItemsInserter.new(template('related.raw'), source_request),
129
135
  ]
130
136
 
131
137
  template_name = request.env.has_key?(TEMPLATE_HEADER) ? request.env[TEMPLATE_HEADER] : 'wrapper'
@@ -1,3 +1,3 @@
1
1
  module Slimmer
2
- VERSION = '1.1.19'
2
+ VERSION = '1.1.20'
3
3
  end
data/lib/slimmer.rb CHANGED
@@ -27,6 +27,7 @@ module Slimmer
27
27
  autoload :UrlRewriter, 'slimmer/url_rewriter'
28
28
  autoload :HeaderContextInserter, 'slimmer/header_context_inserter'
29
29
  autoload :GoogleAnalyticsConfigurator, 'slimmer/google_analytics_configurator'
30
+ autoload :RelatedItemsInserter, 'slimmer/related_items_inserter'
30
31
 
31
32
  class TemplateNotFoundException < StandardError; end
32
33
  class CouldNotRetrieveTemplate < StandardError; end
@@ -0,0 +1,30 @@
1
+ <% if artefact && artefact.present? && artefact.related_items.size > 0 %>
2
+
3
+ <!-- related -->
4
+ <div class="related-positioning">
5
+ <div class="related-container">
6
+
7
+ <div class="related">
8
+ <div class="inner group">
9
+ <h2>Related tools &amp; topics</h2>
10
+ <nav role="navigation">
11
+ <ul>
12
+ <% (artefact.related_items || []).each do |item| %>
13
+ <% if item.artefact %>
14
+ <li class="<%= h(item.artefact.kind) %>">
15
+ <a href="/<%= h(item.artefact.slug) %>"><%= h(item.artefact.name) %></a>
16
+ </li>
17
+ <% end %>
18
+ <% end %>
19
+ <% if artefact.section %>
20
+ <li class="related-topic"><a href="/browse/<%= h(artefact.section.parameterize) %>">View more in <span><%= h(artefact.section) %>&rarr;</span></a></li>
21
+ <% end %>
22
+ </ul>
23
+ </nav>
24
+ </div>
25
+ </div>
26
+
27
+ </div>
28
+ </div>
29
+ <!-- end related -->
30
+ <% end %>
data/test/test_helper.rb CHANGED
@@ -1,9 +1,13 @@
1
1
  require_relative '../lib/slimmer'
2
2
  require 'minitest/autorun'
3
+ require 'minitest/unit'
3
4
  require 'rack/test'
4
5
  require 'webmock/minitest'
6
+ require 'json'
7
+ require 'logger'
5
8
 
6
9
  WebMock.disable_net_connect!
10
+ ENV['FACTER_govuk_platform'] = 'test'
7
11
 
8
12
  class MiniTest::Unit::TestCase
9
13
  def as_nokogiri(html_string)
@@ -22,7 +26,7 @@ end
22
26
  class SlimmerIntegrationTest < MiniTest::Unit::TestCase
23
27
  include Rack::Test::Methods
24
28
 
25
- def self.given_response(code, body, headers={})
29
+ def self.given_response(code, body, headers={}, url="/")
26
30
  define_method(:app) do
27
31
  inner_app = proc { |env|
28
32
  [code, headers.merge("Content-Type" => "text/html"), body]
@@ -35,19 +39,25 @@ class SlimmerIntegrationTest < MiniTest::Unit::TestCase
35
39
  end
36
40
 
37
41
  define_method(:setup) do
42
+ additional_setup if self.class.method_defined? :additional_setup
38
43
  template_name = case code
39
44
  when 200 then 'wrapper'
40
45
  when 404 then '404'
41
46
  else '500'
42
47
  end
43
48
 
44
- template = File.read File.dirname(__FILE__) + "/fixtures/#{template_name}.html.erb"
45
- stub_request(:get, "http://template.local/templates/#{template_name}.html.erb").
46
- to_return(:body => template)
47
- get "/"
49
+ use_template(template_name)
50
+ use_template('related.raw')
51
+ get url
48
52
  end
49
53
  end
50
54
 
55
+ def use_template(template_name)
56
+ template = File.read File.dirname(__FILE__) + "/fixtures/#{template_name}.html.erb"
57
+ stub_request(:get, "http://template.local/templates/#{template_name}.html.erb").
58
+ to_return(:body => template)
59
+ end
60
+
51
61
  private
52
62
 
53
63
  def assert_not_rendered_in_template(content)
@@ -63,7 +73,14 @@ class SlimmerIntegrationTest < MiniTest::Unit::TestCase
63
73
  end
64
74
  end
65
75
  element = Nokogiri::HTML.parse(last_response.body).at_css(selector)
66
- assert element, message
67
- assert_equal content, element.inner_html.to_s, message if content
76
+ assert element, message + ", but selector not found."
77
+ if content
78
+ message << ". But found #{element.inner_html.to_s}"
79
+ if content.is_a?(Regexp)
80
+ assert_match content, element.inner_html.to_s, message
81
+ else
82
+ assert_equal content, element.inner_html.to_s, message
83
+ end
84
+ end
68
85
  end
69
86
  end
@@ -1,4 +1,5 @@
1
1
  require "test_helper"
2
+ require "gds_api/test_helpers/panopticon"
2
3
 
3
4
  module TypicalUsage
4
5
 
@@ -53,6 +54,56 @@ module TypicalUsage
53
54
  def test_should_insert_meta_navigation_links_into_the_navigation
54
55
  assert_rendered_in_template "nav[role=navigation] li a[href='/this_section']", "This section"
55
56
  end
57
+
58
+ end
59
+
60
+ class ResponseWithRelatedItemsTest < SlimmerIntegrationTest
61
+ include GdsApi::TestHelpers::Panopticon
62
+
63
+ def additional_setup
64
+ panopticon_has_metadata(
65
+ 'slug' => 'some-slug',
66
+ 'title' => 'Example document',
67
+ 'related_items' => [
68
+ {
69
+ 'artefact' => {
70
+ 'kind' => 'guide',
71
+ 'name' => 'How to test computer software automatically & ensure that 2>1',
72
+ 'slug' => 'how-to-test-computer-software-automatically',
73
+ }
74
+ }
75
+ ]
76
+ )
77
+ end
78
+ end
79
+
80
+ class CitizenRelatedItemsTest < ResponseWithRelatedItemsTest
81
+ given_response 200, %{
82
+ <html>
83
+ <body class="citizen">
84
+ <div id="wrapper">The body of the page<div id="related-items"></div></div>
85
+ </body>
86
+ </html>
87
+ }, {}, "/some-slug"
88
+
89
+ def test_should_insert_related_items_block
90
+ assert_rendered_in_template "div.related nav li.guide a", "How to test computer software automatically &amp; ensure that 2&gt;1"
91
+ assert_rendered_in_template "div.related nav li.guide", %r{href="/how-to-test-computer-software-automatically"}
92
+ end
93
+ end
94
+
95
+ class NonCitizentRelatedItemsTest < ResponseWithRelatedItemsTest
96
+ given_response 200, %{
97
+ <html>
98
+ <body class="noncitizen">
99
+ <div id="wrapper">The body of the page<div id="related-items"></div></div>
100
+ </body>
101
+ </html>
102
+ }, {}, "/some-slug"
103
+
104
+ def test_should_not_insert_related_items_block
105
+ assert_rendered_in_template "div#related-items", ""
106
+ end
56
107
  end
57
108
 
58
109
  class HeaderContextResponseTest < SlimmerIntegrationTest
metadata CHANGED
@@ -1,136 +1,150 @@
1
- --- !ruby/object:Gem::Specification
1
+ --- !ruby/object:Gem::Specification
2
2
  name: slimmer
3
- version: !ruby/object:Gem::Version
4
- version: 1.1.19
3
+ version: !ruby/object:Gem::Version
5
4
  prerelease:
5
+ version: 1.1.20
6
6
  platform: ruby
7
- authors:
7
+ authors:
8
8
  - Ben Griffiths
9
9
  - James Stewart
10
10
  autorequire:
11
11
  bindir: bin
12
12
  cert_chain: []
13
- date: 2012-01-12 00:00:00.000000000 Z
14
- dependencies:
15
- - !ruby/object:Gem::Dependency
13
+
14
+ date: 2012-01-12 00:00:00 Z
15
+ dependencies:
16
+ - !ruby/object:Gem::Dependency
16
17
  name: nokogiri
17
- requirement: &70164012495200 !ruby/object:Gem::Requirement
18
+ requirement: &id001 !ruby/object:Gem::Requirement
18
19
  none: false
19
- requirements:
20
+ requirements:
20
21
  - - ~>
21
- - !ruby/object:Gem::Version
22
+ - !ruby/object:Gem::Version
22
23
  version: 1.5.0
23
24
  type: :runtime
24
25
  prerelease: false
25
- version_requirements: *70164012495200
26
- - !ruby/object:Gem::Dependency
26
+ version_requirements: *id001
27
+ - !ruby/object:Gem::Dependency
27
28
  name: rack
28
- requirement: &70164012494660 !ruby/object:Gem::Requirement
29
+ requirement: &id002 !ruby/object:Gem::Requirement
29
30
  none: false
30
- requirements:
31
+ requirements:
31
32
  - - ~>
32
- - !ruby/object:Gem::Version
33
+ - !ruby/object:Gem::Version
33
34
  version: 1.3.5
34
35
  type: :runtime
35
36
  prerelease: false
36
- version_requirements: *70164012494660
37
- - !ruby/object:Gem::Dependency
37
+ version_requirements: *id002
38
+ - !ruby/object:Gem::Dependency
38
39
  name: plek
39
- requirement: &70164012494160 !ruby/object:Gem::Requirement
40
+ requirement: &id003 !ruby/object:Gem::Requirement
40
41
  none: false
41
- requirements:
42
- - - ! '>='
43
- - !ruby/object:Gem::Version
42
+ requirements:
43
+ - - ">="
44
+ - !ruby/object:Gem::Version
44
45
  version: 0.1.8
45
46
  type: :runtime
46
47
  prerelease: false
47
- version_requirements: *70164012494160
48
- - !ruby/object:Gem::Dependency
48
+ version_requirements: *id003
49
+ - !ruby/object:Gem::Dependency
49
50
  name: json
50
- requirement: &70164012493740 !ruby/object:Gem::Requirement
51
+ requirement: &id004 !ruby/object:Gem::Requirement
51
52
  none: false
52
- requirements:
53
- - - ! '>='
54
- - !ruby/object:Gem::Version
55
- version: '0'
53
+ requirements:
54
+ - - ">="
55
+ - !ruby/object:Gem::Version
56
+ version: "0"
56
57
  type: :runtime
57
58
  prerelease: false
58
- version_requirements: *70164012493740
59
- - !ruby/object:Gem::Dependency
59
+ version_requirements: *id004
60
+ - !ruby/object:Gem::Dependency
60
61
  name: null_logger
61
- requirement: &70164012493260 !ruby/object:Gem::Requirement
62
+ requirement: &id005 !ruby/object:Gem::Requirement
62
63
  none: false
63
- requirements:
64
- - - ! '>='
65
- - !ruby/object:Gem::Version
66
- version: '0'
64
+ requirements:
65
+ - - ">="
66
+ - !ruby/object:Gem::Version
67
+ version: "0"
67
68
  type: :runtime
68
69
  prerelease: false
69
- version_requirements: *70164012493260
70
- - !ruby/object:Gem::Dependency
70
+ version_requirements: *id005
71
+ - !ruby/object:Gem::Dependency
72
+ name: gds-api-adapters
73
+ requirement: &id006 !ruby/object:Gem::Requirement
74
+ none: false
75
+ requirements:
76
+ - - ~>
77
+ - !ruby/object:Gem::Version
78
+ version: 0.0.33
79
+ type: :development
80
+ prerelease: false
81
+ version_requirements: *id006
82
+ - !ruby/object:Gem::Dependency
71
83
  name: rake
72
- requirement: &70164012492300 !ruby/object:Gem::Requirement
84
+ requirement: &id007 !ruby/object:Gem::Requirement
73
85
  none: false
74
- requirements:
86
+ requirements:
75
87
  - - ~>
76
- - !ruby/object:Gem::Version
88
+ - !ruby/object:Gem::Version
77
89
  version: 0.9.2.2
78
90
  type: :development
79
91
  prerelease: false
80
- version_requirements: *70164012492300
81
- - !ruby/object:Gem::Dependency
92
+ version_requirements: *id007
93
+ - !ruby/object:Gem::Dependency
82
94
  name: rack-test
83
- requirement: &70164012491740 !ruby/object:Gem::Requirement
95
+ requirement: &id008 !ruby/object:Gem::Requirement
84
96
  none: false
85
- requirements:
97
+ requirements:
86
98
  - - ~>
87
- - !ruby/object:Gem::Version
99
+ - !ruby/object:Gem::Version
88
100
  version: 0.6.1
89
101
  type: :development
90
102
  prerelease: false
91
- version_requirements: *70164012491740
92
- - !ruby/object:Gem::Dependency
103
+ version_requirements: *id008
104
+ - !ruby/object:Gem::Dependency
93
105
  name: mocha
94
- requirement: &70164012491020 !ruby/object:Gem::Requirement
106
+ requirement: &id009 !ruby/object:Gem::Requirement
95
107
  none: false
96
- requirements:
108
+ requirements:
97
109
  - - ~>
98
- - !ruby/object:Gem::Version
110
+ - !ruby/object:Gem::Version
99
111
  version: 0.9.12
100
112
  type: :development
101
113
  prerelease: false
102
- version_requirements: *70164012491020
103
- - !ruby/object:Gem::Dependency
114
+ version_requirements: *id009
115
+ - !ruby/object:Gem::Dependency
104
116
  name: webmock
105
- requirement: &70164012488760 !ruby/object:Gem::Requirement
117
+ requirement: &id010 !ruby/object:Gem::Requirement
106
118
  none: false
107
- requirements:
119
+ requirements:
108
120
  - - ~>
109
- - !ruby/object:Gem::Version
110
- version: '1.7'
121
+ - !ruby/object:Gem::Version
122
+ version: "1.7"
111
123
  type: :development
112
124
  prerelease: false
113
- version_requirements: *70164012488760
114
- - !ruby/object:Gem::Dependency
125
+ version_requirements: *id010
126
+ - !ruby/object:Gem::Dependency
115
127
  name: therubyracer
116
- requirement: &70164012488340 !ruby/object:Gem::Requirement
128
+ requirement: &id011 !ruby/object:Gem::Requirement
117
129
  none: false
118
- requirements:
119
- - - ! '>='
120
- - !ruby/object:Gem::Version
121
- version: '0'
130
+ requirements:
131
+ - - ">="
132
+ - !ruby/object:Gem::Version
133
+ version: "0"
122
134
  type: :development
123
135
  prerelease: false
124
- version_requirements: *70164012488340
136
+ version_requirements: *id011
125
137
  description: Rack middleware for skinning pages using a specific template
126
- email:
138
+ email:
127
139
  - bengriffiths@gmail.com
128
140
  - james.stewart@digital.cabinet-office.gov.uk
129
- executables:
141
+ executables:
130
142
  - render_slimmer_error
131
143
  extensions: []
144
+
132
145
  extra_rdoc_files: []
133
- files:
146
+
147
+ files:
134
148
  - README.md
135
149
  - CHANGELOG.md
136
150
  - lib/slimmer/admin_title_inserter.rb
@@ -142,6 +156,7 @@ files:
142
156
  - lib/slimmer/header_context_inserter.rb
143
157
  - lib/slimmer/headers.rb
144
158
  - lib/slimmer/railtie.rb
159
+ - lib/slimmer/related_items_inserter.rb
145
160
  - lib/slimmer/section_inserter.rb
146
161
  - lib/slimmer/skin.rb
147
162
  - lib/slimmer/tag_mover.rb
@@ -155,6 +170,7 @@ files:
155
170
  - Rakefile
156
171
  - test/fixtures/404.html.erb
157
172
  - test/fixtures/500.html.erb
173
+ - test/fixtures/related.raw.html.erb
158
174
  - test/fixtures/wrapper.html.erb
159
175
  - test/google_analytics_test.rb
160
176
  - test/headers_test.rb
@@ -166,37 +182,41 @@ files:
166
182
  - bin/render_slimmer_error
167
183
  homepage: http://github.com/alphagov/slimmer
168
184
  licenses: []
185
+
169
186
  post_install_message:
170
187
  rdoc_options: []
171
- require_paths:
188
+
189
+ require_paths:
172
190
  - lib
173
- required_ruby_version: !ruby/object:Gem::Requirement
191
+ required_ruby_version: !ruby/object:Gem::Requirement
174
192
  none: false
175
- requirements:
176
- - - ! '>='
177
- - !ruby/object:Gem::Version
178
- version: '0'
179
- segments:
193
+ requirements:
194
+ - - ">="
195
+ - !ruby/object:Gem::Version
196
+ hash: 4024382224342024618
197
+ segments:
180
198
  - 0
181
- hash: -1615013662764741884
182
- required_rubygems_version: !ruby/object:Gem::Requirement
199
+ version: "0"
200
+ required_rubygems_version: !ruby/object:Gem::Requirement
183
201
  none: false
184
- requirements:
185
- - - ! '>='
186
- - !ruby/object:Gem::Version
187
- version: '0'
188
- segments:
202
+ requirements:
203
+ - - ">="
204
+ - !ruby/object:Gem::Version
205
+ hash: 4024382224342024618
206
+ segments:
189
207
  - 0
190
- hash: -1615013662764741884
208
+ version: "0"
191
209
  requirements: []
210
+
192
211
  rubyforge_project: slimmer
193
- rubygems_version: 1.8.11
212
+ rubygems_version: 1.8.13
194
213
  signing_key:
195
214
  specification_version: 3
196
215
  summary: Thinner than the skinner
197
- test_files:
216
+ test_files:
198
217
  - test/fixtures/404.html.erb
199
218
  - test/fixtures/500.html.erb
219
+ - test/fixtures/related.raw.html.erb
200
220
  - test/fixtures/wrapper.html.erb
201
221
  - test/google_analytics_test.rb
202
222
  - test/headers_test.rb