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 +43 -29
- data/lib/slimmer/version.rb +1 -1
- data/test/fixtures/404.html.erb +13 -0
- data/test/fixtures/500.html.erb +13 -0
- data/test/fixtures/wrapper.html.erb +14 -0
- data/test/slimmer_test.rb +9 -3
- data/test/test_helper.rb +21 -3
- metadata +32 -17
- data/test/unparse_esi_test.rb +0 -17
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
|
-
|
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
|
242
|
-
|
243
|
-
|
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
|
249
|
-
|
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
|
256
|
-
|
257
|
-
ERB.new(source).result binding
|
266
|
+
def template_cached? name
|
267
|
+
!cached_template(name).nil?
|
258
268
|
end
|
259
269
|
|
260
|
-
def
|
261
|
-
|
262
|
-
@template_path
|
270
|
+
def cached_template name
|
271
|
+
templated_cache[name]
|
263
272
|
end
|
264
273
|
|
265
|
-
def
|
266
|
-
|
274
|
+
def cache name, template
|
275
|
+
templated_cache[name] = template
|
267
276
|
end
|
268
277
|
|
269
|
-
def
|
270
|
-
|
271
|
-
|
272
|
-
|
273
|
-
|
274
|
-
|
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
|
-
|
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
|
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
|
-
|
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
|
-
|
332
|
+
process(processors,body,template(template_name))
|
319
333
|
end
|
320
334
|
end
|
321
335
|
|
data/lib/slimmer/version.rb
CHANGED
@@ -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,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
|
-
|
6
|
-
|
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
|
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)
|
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.
|
5
|
-
prerelease:
|
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-
|
13
|
+
date: 2011-11-24 00:00:00.000000000Z
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|
16
16
|
name: nokogiri
|
17
|
-
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: *
|
25
|
+
version_requirements: *70176912260840
|
26
26
|
- !ruby/object:Gem::Dependency
|
27
27
|
name: rack
|
28
|
-
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: *
|
36
|
+
version_requirements: *70176912260080
|
37
37
|
- !ruby/object:Gem::Dependency
|
38
38
|
name: rake
|
39
|
-
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: *
|
47
|
+
version_requirements: *70176912259180
|
48
48
|
- !ruby/object:Gem::Dependency
|
49
49
|
name: rack-test
|
50
|
-
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: *
|
58
|
+
version_requirements: *70176912258520
|
59
59
|
- !ruby/object:Gem::Dependency
|
60
60
|
name: mocha
|
61
|
-
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: *
|
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:
|
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
|
data/test/unparse_esi_test.rb
DELETED
@@ -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
|