slimmer 0.9.0.beta4 → 1.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.
data/lib/slimmer.rb CHANGED
@@ -15,7 +15,14 @@ module Slimmer
15
15
  def initialize(app, *args, &block)
16
16
  options = args.first || {}
17
17
  @app = app
18
- @skin = Skin.new(options[:asset_host], options[:template_path])
18
+
19
+ if options.key? :template_path
20
+ raise "Template path should not be used. Use asset_host instead."
21
+ end
22
+
23
+ raise "Provide an asset_host" unless options[:asset_host]
24
+
25
+ @skin = Skin.new options[:asset_host]
19
26
  end
20
27
 
21
28
  def call(env)
@@ -149,6 +156,9 @@ module Slimmer
149
156
  meta_link = dest.at_css('meta[name="x-section-link"]')
150
157
  list = dest.at_css('nav[role=navigation] ol')
151
158
 
159
+ # FIXME: Presumably this is meant to stop us adding a 'current section'
160
+ # link if we're missing navigation, or x-section-* meta tags.
161
+ # It doesn't work: #at_css will return a truthy object in any case.
152
162
  if meta_name && meta_link && list
153
163
  link_node = Nokogiri::XML::Node.new('a', dest)
154
164
  link_node['href'] = meta_link['content']
@@ -237,48 +247,53 @@ module Slimmer
237
247
  end
238
248
 
239
249
  class Skin
250
+ attr_accessor :templated_cache
251
+ private :templated_cache=, :templated_cache
252
+
253
+ attr_accessor :asset_host
254
+ private :asset_host=, :asset_host
240
255
 
241
- def initialize(asset_host = nil, template_path = nil)
242
- @template_path = template_path || File.expand_path("../../templates", __FILE__)
243
- @asset_host = asset_host
244
- @template = {}
256
+ def initialize asset_host
257
+ self.asset_host = asset_host
258
+ self.templated_cache = {}
245
259
  end
246
260
 
247
261
  def template(template_name)
248
- if templates_are_local?
249
- load_template(template_name)
250
- else
251
- @template[template_name] ||= load_template(template_name)
252
- end
262
+ return cached_template(template_name) if template_cached? template_name
263
+ load_template template_name
253
264
  end
254
265
 
255
- def load_template(template_name)
256
- source = open("#{template_path}/#{template_name}.html.erb", "r:UTF-8").read
257
- ERB.new(source).result binding
266
+ def template_cached? name
267
+ !cached_template(name).nil?
258
268
  end
259
269
 
260
- def template_path
261
- return (@asset_host.to_s + '/templates') unless @asset_host.nil?
262
- @template_path
270
+ def cached_template name
271
+ templated_cache[name]
263
272
  end
264
273
 
265
- def templates_are_local?
266
- !@asset_host.nil?
274
+ def cache name, template
275
+ templated_cache[name] = template
267
276
  end
268
277
 
269
- def unparse_esi(doc)
270
- ## HTML doesn't really have namespaces, and nokogiri's
271
- ## default behaviour is to strip the namespace, but to
272
- ## leave the tag name intact. Ugly hack here to reverse
273
- ## that for ESI includes
274
- doc.gsub("<include","<esi:include").gsub(/><\/(esi:)?include>/, ' />')
278
+ def load_template template_name
279
+ url = template_url template_name
280
+ source = open(url, "r:UTF-8").read
281
+ template = ERB.new(source).result binding
282
+ cache template_name, template
283
+ template
284
+ end
285
+
286
+ def template_url template_name
287
+ host = asset_host.dup
288
+ host += '/' unless host =~ /\/$/
289
+ "#{host}templates/#{template_name}.html.erb"
275
290
  end
276
291
 
277
292
  def error(request, template_name, body)
278
293
  processors = [
279
294
  TitleInserter.new()
280
295
  ]
281
- self.process(processors, body, template(template_name))
296
+ process(processors, body, template(template_name))
282
297
  end
283
298
 
284
299
  def process(processors,body,template)
@@ -289,7 +304,7 @@ module Slimmer
289
304
  p.filter(src,dest)
290
305
  end
291
306
 
292
- return unparse_esi(dest.to_html)
307
+ return dest.to_html
293
308
  end
294
309
 
295
310
  def admin(request,body)
@@ -301,11 +316,10 @@ module Slimmer
301
316
  BodyInserter.new(),
302
317
  BodyClassCopier.new
303
318
  ]
304
- self.process(processors,body,template('admin'))
319
+ process(processors,body,template('admin'))
305
320
  end
306
321
 
307
322
  def success(request,body)
308
-
309
323
  processors = [
310
324
  TitleInserter.new(),
311
325
  TagMover.new(),
@@ -315,7 +329,7 @@ module Slimmer
315
329
  ]
316
330
 
317
331
  template_name = request.env.has_key?(TEMPLATE_HEADER) ? request.env[TEMPLATE_HEADER] : 'wrapper'
318
- self.process(processors,body,template(template_name))
332
+ process(processors,body,template(template_name))
319
333
  end
320
334
  end
321
335
 
@@ -1,3 +1,3 @@
1
1
  module Slimmer
2
- VERSION = '0.9.0.beta4'
2
+ VERSION = '1.0.0'
3
3
  end
@@ -0,0 +1,13 @@
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>
@@ -0,0 +1,13 @@
1
+ <!DOCTYPE html>
2
+ <html>
3
+ <head>
4
+ <title>Slimmer, yay!</title>
5
+ </head>
6
+ <body>
7
+ <div class="content">
8
+ <header><h1>We seem to be having a problem.</h1></header>
9
+ <div id="wrapper" class="group">
10
+ </div>
11
+ </div>
12
+ </body>
13
+ </html>
@@ -0,0 +1,14 @@
1
+ <!DOCTYPE html>
2
+ <html>
3
+ <head>
4
+ <title>Slimmer, yay!</title>
5
+ </head>
6
+ <body>
7
+ <div class="content">
8
+ <header><h1>I AM A TITLE</h1></header>
9
+ <nav role="navigation"><ol><li>MySite</li></ol></nav>
10
+ <div id="wrapper" class="group">
11
+ </div>
12
+ </div>
13
+ </body>
14
+ </html>
data/test/slimmer_test.rb CHANGED
@@ -2,7 +2,13 @@ require "test_helper"
2
2
 
3
3
  class TestSlimmer < MiniTest::Unit::TestCase
4
4
  def test_template_can_be_loaded
5
- s = Slimmer::Skin.new
6
- assert s.load_template('wrapper')
5
+ skin = Slimmer::Skin.new "http://example.local/"
6
+ expected_url = "http://example.local/templates/example.html.erb"
7
+ stub_request(:get, expected_url).to_return :body => "<foo />"
8
+
9
+ template = skin.load_template 'example'
10
+
11
+ assert_requested :get, "http://example.local/templates/example.html.erb"
12
+ assert_equal "<foo />", template
7
13
  end
8
- end
14
+ end
data/test/test_helper.rb CHANGED
@@ -1,6 +1,9 @@
1
1
  require_relative '../lib/slimmer'
2
2
  require 'minitest/autorun'
3
3
  require 'rack/test'
4
+ require 'webmock/minitest'
5
+
6
+ WebMock.disable_net_connect!
4
7
 
5
8
  class MiniTest::Unit::TestCase
6
9
  def as_nokogiri(html_string)
@@ -20,10 +23,25 @@ class SlimmerIntegrationTest < MiniTest::Unit::TestCase
20
23
  inner_app = proc { |env|
21
24
  [code, headers.merge("Content-Type" => "text/html"), body]
22
25
  }
23
- Slimmer::App.new(inner_app)
26
+ Slimmer::App.new inner_app, :asset_host => "http://template.local"
27
+ end
28
+
29
+ define_method :teardown do
30
+ WebMock.reset!
24
31
  end
25
32
 
26
- define_method(:setup) { get "/" }
33
+ define_method(:setup) do
34
+ template_name = case code
35
+ when 200 then 'wrapper'
36
+ when 404 then '404'
37
+ else '500'
38
+ end
39
+
40
+ template = File.read File.dirname(__FILE__) + "/fixtures/#{template_name}.html.erb"
41
+ stub_request(:get, "http://template.local/templates/#{template_name}.html.erb").
42
+ to_return(:body => template)
43
+ get "/"
44
+ end
27
45
  end
28
46
 
29
47
  private
@@ -44,4 +62,4 @@ class SlimmerIntegrationTest < MiniTest::Unit::TestCase
44
62
  assert element, message
45
63
  assert_equal content, element.inner_html.to_s, message if content
46
64
  end
47
- end
65
+ end
metadata CHANGED
@@ -1,8 +1,8 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: slimmer
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.9.0.beta4
5
- prerelease: 6
4
+ version: 1.0.0
5
+ prerelease:
6
6
  platform: ruby
7
7
  authors:
8
8
  - Ben Griffiths
@@ -10,11 +10,11 @@ authors:
10
10
  autorequire:
11
11
  bindir: bin
12
12
  cert_chain: []
13
- date: 2011-11-23 00:00:00.000000000Z
13
+ date: 2011-11-24 00:00:00.000000000Z
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
16
16
  name: nokogiri
17
- requirement: &70276692208060 !ruby/object:Gem::Requirement
17
+ requirement: &70176912260840 !ruby/object:Gem::Requirement
18
18
  none: false
19
19
  requirements:
20
20
  - - ~>
@@ -22,10 +22,10 @@ dependencies:
22
22
  version: 1.5.0
23
23
  type: :runtime
24
24
  prerelease: false
25
- version_requirements: *70276692208060
25
+ version_requirements: *70176912260840
26
26
  - !ruby/object:Gem::Dependency
27
27
  name: rack
28
- requirement: &70276692192860 !ruby/object:Gem::Requirement
28
+ requirement: &70176912260080 !ruby/object:Gem::Requirement
29
29
  none: false
30
30
  requirements:
31
31
  - - ~>
@@ -33,10 +33,10 @@ dependencies:
33
33
  version: 1.3.5
34
34
  type: :runtime
35
35
  prerelease: false
36
- version_requirements: *70276692192860
36
+ version_requirements: *70176912260080
37
37
  - !ruby/object:Gem::Dependency
38
38
  name: rake
39
- requirement: &70276692178740 !ruby/object:Gem::Requirement
39
+ requirement: &70176912259180 !ruby/object:Gem::Requirement
40
40
  none: false
41
41
  requirements:
42
42
  - - ~>
@@ -44,10 +44,10 @@ dependencies:
44
44
  version: 0.9.2.2
45
45
  type: :development
46
46
  prerelease: false
47
- version_requirements: *70276692178740
47
+ version_requirements: *70176912259180
48
48
  - !ruby/object:Gem::Dependency
49
49
  name: rack-test
50
- requirement: &70276692176660 !ruby/object:Gem::Requirement
50
+ requirement: &70176912258520 !ruby/object:Gem::Requirement
51
51
  none: false
52
52
  requirements:
53
53
  - - ~>
@@ -55,10 +55,10 @@ dependencies:
55
55
  version: 0.6.1
56
56
  type: :development
57
57
  prerelease: false
58
- version_requirements: *70276692176660
58
+ version_requirements: *70176912258520
59
59
  - !ruby/object:Gem::Dependency
60
60
  name: mocha
61
- requirement: &70276692174440 !ruby/object:Gem::Requirement
61
+ requirement: &70176912257880 !ruby/object:Gem::Requirement
62
62
  none: false
63
63
  requirements:
64
64
  - - ~>
@@ -66,7 +66,18 @@ dependencies:
66
66
  version: 0.9.12
67
67
  type: :development
68
68
  prerelease: false
69
- version_requirements: *70276692174440
69
+ version_requirements: *70176912257880
70
+ - !ruby/object:Gem::Dependency
71
+ name: webmock
72
+ requirement: &70176912257140 !ruby/object:Gem::Requirement
73
+ none: false
74
+ requirements:
75
+ - - ~>
76
+ - !ruby/object:Gem::Version
77
+ version: '1.7'
78
+ type: :development
79
+ prerelease: false
80
+ version_requirements: *70176912257140
70
81
  description: Rack middleware for skinning pages using a specific template
71
82
  email:
72
83
  - bengriffiths@gmail.com
@@ -83,11 +94,13 @@ files:
83
94
  - lib/slimmer.rb
84
95
  - lib/tasks/slimmer.rake
85
96
  - Rakefile
97
+ - test/fixtures/404.html.erb
98
+ - test/fixtures/500.html.erb
99
+ - test/fixtures/wrapper.html.erb
86
100
  - test/processors/body_inserter_test.rb
87
101
  - test/slimmer_test.rb
88
102
  - test/test_helper.rb
89
103
  - test/typical_usage_test.rb
90
- - test/unparse_esi_test.rb
91
104
  homepage: http://github.com/alphagov/slimmer
92
105
  licenses: []
93
106
  post_install_message:
@@ -103,9 +116,9 @@ required_ruby_version: !ruby/object:Gem::Requirement
103
116
  required_rubygems_version: !ruby/object:Gem::Requirement
104
117
  none: false
105
118
  requirements:
106
- - - ! '>'
119
+ - - ! '>='
107
120
  - !ruby/object:Gem::Version
108
- version: 1.3.1
121
+ version: '0'
109
122
  requirements: []
110
123
  rubyforge_project: slimmer
111
124
  rubygems_version: 1.8.10
@@ -113,8 +126,10 @@ signing_key:
113
126
  specification_version: 3
114
127
  summary: Thinner than the skinner
115
128
  test_files:
129
+ - test/fixtures/404.html.erb
130
+ - test/fixtures/500.html.erb
131
+ - test/fixtures/wrapper.html.erb
116
132
  - test/processors/body_inserter_test.rb
117
133
  - test/slimmer_test.rb
118
134
  - test/test_helper.rb
119
135
  - test/typical_usage_test.rb
120
- - test/unparse_esi_test.rb
@@ -1,17 +0,0 @@
1
- require "test_helper"
2
-
3
- class UnparseESITest < MiniTest::Unit::TestCase
4
- def test_unparse_esi
5
- options = [
6
- "<include src='/blah/blah'></include>",
7
- "<esi:include src='/blah/blah'></esi:include>",
8
- "<esi:include src='/blah/blah' />",
9
- "<include src='/blah/blah' />"
10
- ]
11
-
12
- options.each do |doc|
13
- s = Slimmer::Skin.new('blah')
14
- assert_equal "<esi:include src='/blah/blah' />", s.unparse_esi(doc)
15
- end
16
- end
17
- end