slimmer 0.9.0.beta4 → 1.0.0

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