slimmer 1.1.19 → 1.1.20

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