lanyon 0.4.1 → 0.4.2
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/History.md +5 -0
- data/LICENSE +1 -1
- data/README.md +3 -3
- data/Rakefile +1 -1
- data/lanyon.gemspec +3 -3
- data/lib/lanyon.rb +1 -1
- data/lib/lanyon/application.rb +6 -6
- data/lib/lanyon/version.rb +2 -2
- data/test/helper.rb +1 -3
- data/test/test_build.rb +3 -3
- data/test/test_configuration.rb +20 -21
- data/test/test_integration.rb +64 -63
- data/test/test_router.rb +25 -25
- metadata +9 -9
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 2334bd94271d53dfd592043f857b993de778bbae9ae2d37599626d6eb438f49b
|
4
|
+
data.tar.gz: 32604e26502c3bcd42d2b671ef2147fe3136a024ef17b7b46dd5870886b8a867
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 767061c55f75506891ec7a3e47f4ca9fa844cc9b28b68cfcb4ade8b17b23e2ef45c453a6a4c55d0289014423d35fa8640150160d3d758b4c28eed929e729c52b
|
7
|
+
data.tar.gz: 4e8f14f744ee127c8afb7e158ba8e4f737e6d856896d27b923bef728b396baa28f4aced6a58ff74b38511b8a1158570b9a19edc1e56a8486c35caac340d2eba4
|
data/History.md
CHANGED
data/LICENSE
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
The MIT License (MIT)
|
2
2
|
|
3
|
-
Copyright (c) 2015-
|
3
|
+
Copyright (c) 2015-2020 Marcus Stollsteimer
|
4
4
|
|
5
5
|
Permission is hereby granted, free of charge, to any person obtaining a copy
|
6
6
|
of this software and associated documentation files (the "Software"), to deal
|
data/README.md
CHANGED
@@ -56,7 +56,7 @@ or as Lanyon initialization options in `config.ru`.
|
|
56
56
|
Example:
|
57
57
|
|
58
58
|
``` ruby
|
59
|
-
run Lanyon.application(:
|
59
|
+
run Lanyon.application(destination: "mysite")
|
60
60
|
```
|
61
61
|
|
62
62
|
This will set a custom destination path, overriding the default (`_site`)
|
@@ -70,7 +70,7 @@ Additional Lanyon initialization options:
|
|
70
70
|
(default: false)
|
71
71
|
|
72
72
|
Note that on read-only filesystems a site build will fail,
|
73
|
-
so you must set
|
73
|
+
so you must set `skip_build: true` in these cases.
|
74
74
|
|
75
75
|
### Custum 404 Page
|
76
76
|
|
@@ -107,7 +107,7 @@ Lanyon was inspired by [rack-jekyll][rack-jekyll] and written as a replacement.
|
|
107
107
|
|
108
108
|
## License
|
109
109
|
|
110
|
-
Copyright © 2015-
|
110
|
+
Copyright © 2015-2020 Marcus Stollsteimer
|
111
111
|
|
112
112
|
Lanyon is licensed under the [MIT License][MIT].
|
113
113
|
See also the included `LICENSE` file for more information.
|
data/Rakefile
CHANGED
data/lanyon.gemspec
CHANGED
@@ -10,7 +10,7 @@ Gem::Specification.new do |s|
|
|
10
10
|
|
11
11
|
s.summary = "Lanyon serves your Jekyll site as a Rack application."
|
12
12
|
s.description =
|
13
|
-
"Lanyon is a good friend of Jekyll, the static site generator, "
|
13
|
+
"Lanyon is a good friend of Jekyll, the static site generator, " \
|
14
14
|
"and transforms your website into a Rack application."
|
15
15
|
|
16
16
|
s.authors = ["Marcus Stollsteimer"]
|
@@ -24,8 +24,8 @@ Gem::Specification.new do |s|
|
|
24
24
|
s.add_dependency "jekyll", ">= 2.0"
|
25
25
|
s.add_dependency "rack", ">= 1.6", "< 3.0"
|
26
26
|
|
27
|
-
s.add_development_dependency "rake", "~> 11.2"
|
28
27
|
s.add_development_dependency "minitest", "~> 5.8"
|
28
|
+
s.add_development_dependency "rake", "~> 11.2"
|
29
29
|
|
30
30
|
s.require_paths = ["lib"]
|
31
31
|
|
@@ -40,7 +40,7 @@ Gem::Specification.new do |s|
|
|
40
40
|
] +
|
41
41
|
Dir.glob("lib/**/*") +
|
42
42
|
Dir.glob("test/**/*") +
|
43
|
-
Dir.glob("demo/**/*").reject {|f| f
|
43
|
+
Dir.glob("demo/**/*").reject {|f| f.start_with?("demo/_site/") }
|
44
44
|
|
45
45
|
s.extra_rdoc_files = %w[README.md LICENSE History.md]
|
46
46
|
s.rdoc_options = ["--charset=UTF-8", "--main=README.md"]
|
data/lib/lanyon.rb
CHANGED
data/lib/lanyon/application.rb
CHANGED
@@ -44,7 +44,7 @@ module Lanyon
|
|
44
44
|
|
45
45
|
def response(filename) # :nodoc:
|
46
46
|
response = Rack::Response.new(File.binread(filename))
|
47
|
-
response["Content-Type"]
|
47
|
+
response["Content-Type"] = media_type(filename)
|
48
48
|
|
49
49
|
response.finish
|
50
50
|
end
|
@@ -63,7 +63,7 @@ module Lanyon
|
|
63
63
|
end
|
64
64
|
|
65
65
|
def html_wrap(title, content) # :nodoc:
|
66
|
-
<<-
|
66
|
+
<<-DOCUMENT.gsub(/^ {6}/, "")
|
67
67
|
<!DOCTYPE html>
|
68
68
|
<html lang="en">
|
69
69
|
<head>
|
@@ -73,7 +73,7 @@ module Lanyon
|
|
73
73
|
#{content}
|
74
74
|
</body>
|
75
75
|
</html>
|
76
|
-
|
76
|
+
DOCUMENT
|
77
77
|
end
|
78
78
|
|
79
79
|
def default_404_body # :nodoc:
|
@@ -97,7 +97,7 @@ module Lanyon
|
|
97
97
|
end
|
98
98
|
|
99
99
|
def redirect_body(to_path) # :nodoc:
|
100
|
-
message = %Q
|
100
|
+
message = %Q(<p>Redirecting to <a href="#{to_path}">#{to_path}</a>.</p>)
|
101
101
|
|
102
102
|
html_wrap("Redirection", message)
|
103
103
|
end
|
@@ -110,9 +110,9 @@ module Lanyon
|
|
110
110
|
|
111
111
|
body = redirect_body(location)
|
112
112
|
headers = {
|
113
|
-
"Location"
|
113
|
+
"Location" => location,
|
114
114
|
"Cache-Control" => "max-age=#{cache_time}, must-revalidate",
|
115
|
-
"Expires"
|
115
|
+
"Expires" => (Time.now + cache_time).httpdate
|
116
116
|
}
|
117
117
|
|
118
118
|
html_response(body, 301, headers)
|
data/lib/lanyon/version.rb
CHANGED
data/test/helper.rb
CHANGED
@@ -8,7 +8,7 @@ require "rack/mock"
|
|
8
8
|
require "lanyon"
|
9
9
|
|
10
10
|
|
11
|
-
TEST_DIR = File.expand_path(
|
11
|
+
TEST_DIR = File.expand_path(__dir__)
|
12
12
|
|
13
13
|
SOURCE_DIR = File.join(TEST_DIR, "source")
|
14
14
|
CACHE_DIR = File.join(SOURCE_DIR, ".jekyll-cache")
|
@@ -38,7 +38,6 @@ def sourcedir
|
|
38
38
|
SOURCE_DIR
|
39
39
|
end
|
40
40
|
|
41
|
-
|
42
41
|
def silence_output
|
43
42
|
original_stderr, original_stdout = $stderr, $stdout
|
44
43
|
$stderr, $stdout = StringIO.new, StringIO.new
|
@@ -48,7 +47,6 @@ ensure
|
|
48
47
|
$stderr, $stdout = original_stderr, original_stdout
|
49
48
|
end
|
50
49
|
|
51
|
-
|
52
50
|
def file_must_exist(filename)
|
53
51
|
assert File.exist?(filename),
|
54
52
|
"Expected file `#{filename}' to exist."
|
data/test/test_build.rb
CHANGED
@@ -11,7 +11,7 @@ describe "when creating a Lanyon application" do
|
|
11
11
|
|
12
12
|
destdir = File.join(tempdir, "_site")
|
13
13
|
|
14
|
-
@dir_options = { :
|
14
|
+
@dir_options = { source: sourcedir, destination: destdir }
|
15
15
|
@page = File.join(destdir, "index.html")
|
16
16
|
@no_page = File.join(destdir, "not_a_page.html")
|
17
17
|
|
@@ -36,7 +36,7 @@ describe "when creating a Lanyon application" do
|
|
36
36
|
end
|
37
37
|
|
38
38
|
it "does not build the site when :skip_build option is set" do
|
39
|
-
options = {:
|
39
|
+
options = { skip_build: true }.merge(@dir_options)
|
40
40
|
silence_output do
|
41
41
|
Lanyon.application(options)
|
42
42
|
end
|
@@ -46,7 +46,7 @@ describe "when creating a Lanyon application" do
|
|
46
46
|
end
|
47
47
|
|
48
48
|
it "does always build the site with ::build" do
|
49
|
-
options = {:
|
49
|
+
options = { skip_build: true }.merge(@dir_options)
|
50
50
|
silence_output do
|
51
51
|
Lanyon.build(options)
|
52
52
|
end
|
data/test/test_configuration.rb
CHANGED
@@ -25,7 +25,7 @@ describe "when configuring site" do
|
|
25
25
|
|
26
26
|
it "loads the correct default destination" do
|
27
27
|
config = get_jekyll_config
|
28
|
-
config["destination"].must_equal File.join(Dir.pwd, "_site")
|
28
|
+
_(config["destination"]).must_equal File.join(Dir.pwd, "_site")
|
29
29
|
end
|
30
30
|
end
|
31
31
|
|
@@ -43,8 +43,8 @@ describe "when configuring site" do
|
|
43
43
|
|
44
44
|
it "loads the configuration from file" do
|
45
45
|
config = get_jekyll_config
|
46
|
-
config.must_include "config_file_opt"
|
47
|
-
config["config_file_opt"].must_equal "ok"
|
46
|
+
_(config).must_include "config_file_opt"
|
47
|
+
_(config["config_file_opt"]).must_equal "ok"
|
48
48
|
end
|
49
49
|
end
|
50
50
|
|
@@ -61,28 +61,28 @@ describe "when configuring site" do
|
|
61
61
|
end
|
62
62
|
|
63
63
|
it "loads the configuration from file" do
|
64
|
-
config = get_jekyll_config(:
|
65
|
-
config.must_include "config_file_opt"
|
66
|
-
config["config_file_opt"].must_equal "ok"
|
64
|
+
config = get_jekyll_config(config: "_my_config.yml")
|
65
|
+
_(config).must_include "config_file_opt"
|
66
|
+
_(config["config_file_opt"]).must_equal "ok"
|
67
67
|
end
|
68
68
|
end
|
69
69
|
|
70
70
|
describe "when initialization options are given" do
|
71
71
|
|
72
72
|
it "has the initialization options" do
|
73
|
-
config = get_jekyll_config(:
|
74
|
-
config.must_include "init_opt"
|
75
|
-
config["init_opt"].must_equal "ok"
|
73
|
+
config = get_jekyll_config(init_opt: "ok")
|
74
|
+
_(config).must_include "init_opt"
|
75
|
+
_(config["init_opt"]).must_equal "ok"
|
76
76
|
end
|
77
77
|
|
78
78
|
it "has the correct destination" do
|
79
|
-
config = get_jekyll_config(:
|
80
|
-
config["destination"].must_equal "/project/_site"
|
79
|
+
config = get_jekyll_config(destination: "/project/_site")
|
80
|
+
_(config["destination"]).must_equal "/project/_site"
|
81
81
|
end
|
82
82
|
|
83
83
|
it "does not pass :skip_build on to Jekyll" do
|
84
|
-
config = get_jekyll_config(:
|
85
|
-
config.wont_include "skip_build"
|
84
|
+
config = get_jekyll_config(skip_build: "ok")
|
85
|
+
_(config).wont_include "skip_build"
|
86
86
|
end
|
87
87
|
end
|
88
88
|
|
@@ -101,17 +101,16 @@ describe "when configuring site" do
|
|
101
101
|
end
|
102
102
|
|
103
103
|
it "has all options and initialization options override file options" do
|
104
|
-
config = get_jekyll_config(:
|
105
|
-
|
106
|
-
config.must_include "
|
107
|
-
config.must_include "
|
108
|
-
config.
|
109
|
-
config["common_opt"].must_equal "from init"
|
104
|
+
config = get_jekyll_config(init_opt: "ok", common_opt: "from init")
|
105
|
+
_(config).must_include "init_opt"
|
106
|
+
_(config).must_include "config_file_opt"
|
107
|
+
_(config).must_include "common_opt"
|
108
|
+
_(config["common_opt"]).must_equal "from init"
|
110
109
|
end
|
111
110
|
|
112
111
|
it "has the correct destination" do
|
113
|
-
config = get_jekyll_config(:
|
114
|
-
config["destination"].must_equal "/project/_site_from_init"
|
112
|
+
config = get_jekyll_config(destination: "/project/_site_from_init")
|
113
|
+
_(config["destination"]).must_equal "/project/_site_from_init"
|
115
114
|
end
|
116
115
|
end
|
117
116
|
end
|
data/test/test_integration.rb
CHANGED
@@ -1,5 +1,4 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
|
-
# encoding: UTF-8
|
3
2
|
|
4
3
|
require_relative "helper"
|
5
4
|
|
@@ -19,7 +18,7 @@ describe "when handling requests" do
|
|
19
18
|
|
20
19
|
@destdir = File.join(tempdir, "_site")
|
21
20
|
|
22
|
-
app = get_app(:
|
21
|
+
app = get_app(source: sourcedir, destination: @destdir)
|
23
22
|
@request = Rack::MockRequest.new(app)
|
24
23
|
end
|
25
24
|
|
@@ -36,23 +35,23 @@ describe "when handling requests" do
|
|
36
35
|
end
|
37
36
|
|
38
37
|
it "returns status 200" do
|
39
|
-
@response.status.must_equal 200
|
38
|
+
_(@response.status).must_equal 200
|
40
39
|
end
|
41
40
|
|
42
41
|
it "returns correct Content-Length header" do
|
43
|
-
@response.original_headers["Content-Length"].must_equal "17"
|
42
|
+
_(@response.original_headers["Content-Length"]).must_equal "17"
|
44
43
|
end
|
45
44
|
|
46
45
|
it "returns correct Content-Type header" do
|
47
|
-
@response.headers["Content-Type"].must_equal "text/html"
|
46
|
+
_(@response.headers["Content-Type"]).must_equal "text/html"
|
48
47
|
end
|
49
48
|
|
50
49
|
it "returns an ETag header" do
|
51
|
-
@response.headers["ETag"].wont_be_nil
|
50
|
+
_(@response.headers["ETag"]).wont_be_nil
|
52
51
|
end
|
53
52
|
|
54
53
|
it "returns correct body" do
|
55
|
-
@response.body.must_match %r{<p>Home Page</p>}
|
54
|
+
_(@response.body).must_match %r{<p>Home Page</p>}
|
56
55
|
end
|
57
56
|
end
|
58
57
|
|
@@ -64,20 +63,20 @@ describe "when handling requests" do
|
|
64
63
|
end
|
65
64
|
|
66
65
|
it "returns status 200" do
|
67
|
-
@response.status.must_equal 404
|
66
|
+
_(@response.status).must_equal 404
|
68
67
|
end
|
69
68
|
|
70
69
|
it "returns correct Content-Length header" do
|
71
|
-
@response.original_headers["Content-Length"].must_equal "142"
|
70
|
+
_(@response.original_headers["Content-Length"]).must_equal "142"
|
72
71
|
end
|
73
72
|
|
74
73
|
it "returns correct Content-Type header" do
|
75
|
-
@response.headers["Content-Type"].must_equal "text/html"
|
74
|
+
_(@response.headers["Content-Type"]).must_equal "text/html"
|
76
75
|
end
|
77
76
|
|
78
77
|
it "returns correct body" do
|
79
78
|
expected = %r{<!DOCTYPE html>.*<p>404: Not Found</p>}m
|
80
|
-
@response.body.must_match expected
|
79
|
+
_(@response.body).must_match expected
|
81
80
|
end
|
82
81
|
end
|
83
82
|
|
@@ -88,7 +87,7 @@ describe "when handling requests" do
|
|
88
87
|
@custom_404 = File.join(sourcedir, "404.html")
|
89
88
|
File.open(@custom_404, "w") {|f| f.print "Custom 404" }
|
90
89
|
|
91
|
-
app = get_app(:
|
90
|
+
app = get_app(source: sourcedir, destination: @destdir)
|
92
91
|
request = Rack::MockRequest.new(app)
|
93
92
|
@response = request.get("/not/a/page")
|
94
93
|
end
|
@@ -98,15 +97,15 @@ describe "when handling requests" do
|
|
98
97
|
end
|
99
98
|
|
100
99
|
it "returns correct Content-Length header" do
|
101
|
-
@response.original_headers["Content-Length"].must_equal "10"
|
100
|
+
_(@response.original_headers["Content-Length"]).must_equal "10"
|
102
101
|
end
|
103
102
|
|
104
103
|
it "returns correct Content-Type header" do
|
105
|
-
@response.headers["Content-Type"].must_equal "text/html"
|
104
|
+
_(@response.headers["Content-Type"]).must_equal "text/html"
|
106
105
|
end
|
107
106
|
|
108
107
|
it "returns correct body" do
|
109
|
-
@response.body.must_equal "Custom 404"
|
108
|
+
_(@response.body).must_equal "Custom 404"
|
110
109
|
end
|
111
110
|
end
|
112
111
|
|
@@ -118,19 +117,19 @@ describe "when handling requests" do
|
|
118
117
|
end
|
119
118
|
|
120
119
|
it "returns status 200" do
|
121
|
-
@response.status.must_equal 200
|
120
|
+
_(@response.status).must_equal 200
|
122
121
|
end
|
123
122
|
|
124
123
|
it "returns correct Content-Type header" do
|
125
|
-
@response.headers["Content-Type"].must_equal "text/html"
|
124
|
+
_(@response.headers["Content-Type"]).must_equal "text/html"
|
126
125
|
end
|
127
126
|
|
128
127
|
it "returns correct Content-Length header" do
|
129
|
-
@response.original_headers["Content-Length"].must_equal "19"
|
128
|
+
_(@response.original_headers["Content-Length"]).must_equal "19"
|
130
129
|
end
|
131
130
|
|
132
131
|
it "returns correct body" do
|
133
|
-
@response.body.must_match %r{<p>A Blog Post</p>}
|
132
|
+
_(@response.body).must_match %r{<p>A Blog Post</p>}
|
134
133
|
end
|
135
134
|
end
|
136
135
|
|
@@ -142,12 +141,12 @@ describe "when handling requests" do
|
|
142
141
|
end
|
143
142
|
|
144
143
|
it "returns status 200" do
|
145
|
-
@response.status.must_equal 200
|
144
|
+
_(@response.status).must_equal 200
|
146
145
|
end
|
147
146
|
|
148
147
|
it "returns Content-Type 'application/octet-stream'" do
|
149
148
|
type = @response.headers["Content-Type"]
|
150
|
-
type.must_equal "application/octet-stream"
|
149
|
+
_(type).must_equal "application/octet-stream"
|
151
150
|
end
|
152
151
|
end
|
153
152
|
|
@@ -156,12 +155,12 @@ describe "when handling requests" do
|
|
156
155
|
|
157
156
|
it "returns correct Content-Type for *.css" do
|
158
157
|
type = @request.get("/css/test.css").headers["Content-Type"]
|
159
|
-
type.must_equal "text/css"
|
158
|
+
_(type).must_equal "text/css"
|
160
159
|
end
|
161
160
|
|
162
161
|
it "returns correct Content-Type for *.min.js" do
|
163
162
|
type = @request.get("/js/test.min.js").headers["Content-Type"]
|
164
|
-
type.must_equal "application/javascript"
|
163
|
+
_(type).must_equal "application/javascript"
|
165
164
|
end
|
166
165
|
end
|
167
166
|
|
@@ -169,11 +168,11 @@ describe "when handling requests" do
|
|
169
168
|
describe "when asked for partially matching paths" do
|
170
169
|
|
171
170
|
it "returns status 404 for path 1" do
|
172
|
-
@request.get("/2015/10/05/hello").status.must_equal 404
|
171
|
+
_(@request.get("/2015/10/05/hello").status).must_equal 404
|
173
172
|
end
|
174
173
|
|
175
174
|
it "returns status 404 for path 2" do
|
176
|
-
@request.get("/10/05/hello-world.html").status.must_equal 404
|
175
|
+
_(@request.get("/10/05/hello-world.html").status).must_equal 404
|
177
176
|
end
|
178
177
|
end
|
179
178
|
|
@@ -184,8 +183,8 @@ describe "when handling requests" do
|
|
184
183
|
filename = File.join(@destdir, "/../_site/index.html")
|
185
184
|
assert File.exist?(filename)
|
186
185
|
|
187
|
-
|
188
|
-
|
186
|
+
response = @request.get("/../_site/index.html")
|
187
|
+
_(response.status).must_equal 404
|
189
188
|
end
|
190
189
|
end
|
191
190
|
|
@@ -193,23 +192,24 @@ describe "when handling requests" do
|
|
193
192
|
describe "when a directory is requested" do
|
194
193
|
|
195
194
|
it "redirects to 'directory/' for 'directory' with index.html" do
|
196
|
-
@request.get("/dir-with-index").status.must_equal 301
|
195
|
+
_(@request.get("/dir-with-index").status).must_equal 301
|
197
196
|
end
|
198
197
|
|
199
198
|
it "returns status 200 for 'directory/' with index.html" do
|
200
|
-
@request.get("/dir-with-index/").status.must_equal 200
|
199
|
+
_(@request.get("/dir-with-index/").status).must_equal 200
|
201
200
|
end
|
202
201
|
|
203
202
|
it "returns correct body for 'directory/' with index.html" do
|
204
|
-
@request.get("/dir-with-index/").body
|
203
|
+
response_body = @request.get("/dir-with-index/").body
|
204
|
+
_(response_body).must_match %r{<p>Index of dir-with-index/</p>}
|
205
205
|
end
|
206
206
|
|
207
207
|
it "returns status 404 for 'directory' without index.html" do
|
208
|
-
@request.get("/dir-without-index").status.must_equal 404
|
208
|
+
_(@request.get("/dir-without-index").status).must_equal 404
|
209
209
|
end
|
210
210
|
|
211
211
|
it "returns status 404 for 'directory/' without index.html" do
|
212
|
-
@request.get("/dir-without-index/").status.must_equal 404
|
212
|
+
_(@request.get("/dir-without-index/").status).must_equal 404
|
213
213
|
end
|
214
214
|
end
|
215
215
|
|
@@ -221,20 +221,20 @@ describe "when handling requests" do
|
|
221
221
|
end
|
222
222
|
|
223
223
|
it "returns status 301" do
|
224
|
-
@response.status.must_equal 301
|
224
|
+
_(@response.status).must_equal 301
|
225
225
|
end
|
226
226
|
|
227
227
|
it "returns correct Location header" do
|
228
|
-
@response.headers["Location"].must_equal "/dir-with-index/"
|
228
|
+
_(@response.headers["Location"]).must_equal "/dir-with-index/"
|
229
229
|
end
|
230
230
|
|
231
231
|
it "returns a Cache-Control header" do
|
232
|
-
@response.headers["Cache-Control"].wont_be_nil
|
232
|
+
_(@response.headers["Cache-Control"]).wont_be_nil
|
233
233
|
end
|
234
234
|
|
235
235
|
it "returns correct body" do
|
236
236
|
expected = %r{<!DOCTYPE html>.*<a href="/dir-with-index/">}m
|
237
|
-
@request.get("/dir-with-index").body.must_match expected
|
237
|
+
_(@request.get("/dir-with-index").body).must_match expected
|
238
238
|
end
|
239
239
|
end
|
240
240
|
|
@@ -247,11 +247,11 @@ describe "when handling requests" do
|
|
247
247
|
|
248
248
|
it "returns correct body" do
|
249
249
|
response_body = @response.body.force_encoding("UTF-8")
|
250
|
-
response_body.must_match %r{<p>¡Buenos días!</p>}
|
250
|
+
_(response_body).must_match %r{<p>¡Buenos días!</p>}
|
251
251
|
end
|
252
252
|
|
253
253
|
it "returns the bytesize as Content-Length header" do
|
254
|
-
@response.original_headers["Content-Length"].must_equal "23"
|
254
|
+
_(@response.original_headers["Content-Length"]).must_equal "23"
|
255
255
|
end
|
256
256
|
end
|
257
257
|
|
@@ -264,11 +264,11 @@ describe "when handling requests" do
|
|
264
264
|
|
265
265
|
it "returns correct body" do
|
266
266
|
expected = "File\r\nwith\r\nCRLF\r\nnewlines\r\n"
|
267
|
-
@response.body.must_equal expected
|
267
|
+
_(@response.body).must_equal expected
|
268
268
|
end
|
269
269
|
|
270
270
|
it "returns the bytesize as Content-Length header" do
|
271
|
-
@response.original_headers["Content-Length"].must_equal "28"
|
271
|
+
_(@response.original_headers["Content-Length"]).must_equal "28"
|
272
272
|
end
|
273
273
|
end
|
274
274
|
|
@@ -276,18 +276,18 @@ describe "when handling requests" do
|
|
276
276
|
describe "when URL contains special characters" do
|
277
277
|
|
278
278
|
it "returns status 200 for URL with escapes" do
|
279
|
-
|
280
|
-
|
279
|
+
response = @request.get("%2F2015%2F11%2F05%2Fhello-world.html")
|
280
|
+
_(response.status).must_equal 200
|
281
281
|
end
|
282
282
|
|
283
283
|
it "returns status 200 for resource name with blank" do
|
284
|
-
|
285
|
-
|
284
|
+
response = @request.get("with%20blank.html")
|
285
|
+
_(response.status).must_equal 200
|
286
286
|
end
|
287
287
|
|
288
288
|
it "returns status 200 for resource name with plus" do
|
289
|
-
|
290
|
-
|
289
|
+
response = @request.get("with+plus.html")
|
290
|
+
_(response.status).must_equal 200
|
291
291
|
end
|
292
292
|
end
|
293
293
|
|
@@ -305,20 +305,20 @@ describe "when handling requests" do
|
|
305
305
|
end
|
306
306
|
|
307
307
|
it "returns correct status code for unchanged '/'" do
|
308
|
-
@request.get("/", @correct_etag).status.must_equal 304
|
308
|
+
_(@request.get("/", @correct_etag).status).must_equal 304
|
309
309
|
end
|
310
310
|
|
311
311
|
it "does not return a Content-Length header for unchanged '/'" do
|
312
312
|
response = @request.get("/", @correct_etag)
|
313
|
-
response.original_headers["Content-Length"].must_be_nil
|
313
|
+
_(response.original_headers["Content-Length"]).must_be_nil
|
314
314
|
end
|
315
315
|
|
316
316
|
it "returns correct status code for changed '/'" do
|
317
|
-
@request.get("/", @other_etag).status.must_equal 200
|
317
|
+
_(@request.get("/", @other_etag).status).must_equal 200
|
318
318
|
end
|
319
319
|
|
320
320
|
it "returns correct status code for 404" do
|
321
|
-
@request.get("/not/a/page", @other_etag).status.must_equal 404
|
321
|
+
_(@request.get("/not/a/page", @other_etag).status).must_equal 404
|
322
322
|
end
|
323
323
|
end
|
324
324
|
|
@@ -326,15 +326,15 @@ describe "when handling requests" do
|
|
326
326
|
describe "when handling HEAD requests" do
|
327
327
|
|
328
328
|
it "returns status 200 for '/'" do
|
329
|
-
@request.head("/").status.must_equal 200
|
329
|
+
_(@request.head("/").status).must_equal 200
|
330
330
|
end
|
331
331
|
|
332
332
|
it "returns correct Content-Length header for '/'" do
|
333
|
-
@request.head("/").original_headers["Content-Length"].must_equal "17"
|
333
|
+
_(@request.head("/").original_headers["Content-Length"]).must_equal "17"
|
334
334
|
end
|
335
335
|
|
336
336
|
it "does not return a body" do
|
337
|
-
@request.head("/").body.must_equal ""
|
337
|
+
_(@request.head("/").body).must_equal ""
|
338
338
|
end
|
339
339
|
end
|
340
340
|
|
@@ -342,20 +342,21 @@ describe "when handling requests" do
|
|
342
342
|
describe "when handling OPTIONS requests" do
|
343
343
|
|
344
344
|
it "returns status 200" do
|
345
|
-
@request.options("/").status.must_equal 200
|
345
|
+
_(@request.options("/").status).must_equal 200
|
346
346
|
end
|
347
347
|
|
348
348
|
it "returns correct Allow header" do
|
349
|
-
@request.options("/").original_headers["Allow"]
|
349
|
+
response_allow_header = @request.options("/").original_headers["Allow"]
|
350
|
+
_(response_allow_header).must_equal "GET,HEAD,OPTIONS"
|
350
351
|
end
|
351
352
|
|
352
353
|
it "does not return a body" do
|
353
|
-
@request.options("/").body.must_equal ""
|
354
|
+
_(@request.options("/").body).must_equal ""
|
354
355
|
end
|
355
356
|
|
356
357
|
it "returns 404 for nonexistent resource" do
|
357
|
-
@request.options("/not/a/page").status.must_equal 404
|
358
|
-
@request.options("/not/a/page").body.must_match %r{<p>404: Not Found</p>}
|
358
|
+
_(@request.options("/not/a/page").status).must_equal 404
|
359
|
+
_(@request.options("/not/a/page").body).must_match %r{<p>404: Not Found</p>}
|
359
360
|
end
|
360
361
|
end
|
361
362
|
|
@@ -363,15 +364,15 @@ describe "when handling requests" do
|
|
363
364
|
describe "when handling POST, PUT, DELETE, and other requests" do
|
364
365
|
|
365
366
|
it "returns status 405" do
|
366
|
-
@request.post("/").status.must_equal 405
|
367
|
-
@request.put("/").status.must_equal 405
|
368
|
-
@request.delete("/").status.must_equal 405
|
369
|
-
@request.request("OTHER", "/").status.must_equal 405
|
367
|
+
_(@request.post("/").status).must_equal 405
|
368
|
+
_(@request.put("/").status).must_equal 405
|
369
|
+
_(@request.delete("/").status).must_equal 405
|
370
|
+
_(@request.request("OTHER", "/").status).must_equal 405
|
370
371
|
end
|
371
372
|
|
372
373
|
it "returns correct body" do
|
373
374
|
expected = %r{<!DOCTYPE html>.*<p>405: Method Not Allowed</p>}m
|
374
|
-
@request.post("/").body.must_match expected
|
375
|
+
_(@request.post("/").body).must_match expected
|
375
376
|
end
|
376
377
|
end
|
377
378
|
end
|
data/test/test_router.rb
CHANGED
@@ -43,44 +43,44 @@ describe Lanyon::Router do
|
|
43
43
|
|
44
44
|
it "returns path for '/'" do
|
45
45
|
filename = File.join(@sitedir, "index.html")
|
46
|
-
@router.endpoint("/").must_equal filename
|
46
|
+
_(@router.endpoint("/")).must_equal filename
|
47
47
|
end
|
48
48
|
|
49
49
|
it "returns existing path" do
|
50
50
|
filename = File.join(@sitedir, "page.html")
|
51
|
-
@router.endpoint("/page.html").must_equal filename
|
51
|
+
_(@router.endpoint("/page.html")).must_equal filename
|
52
52
|
end
|
53
53
|
|
54
54
|
it "returns existing path for resource without extension" do
|
55
55
|
filename = File.join(@sitedir, "README")
|
56
|
-
@router.endpoint("/README").must_equal filename
|
56
|
+
_(@router.endpoint("/README")).must_equal filename
|
57
57
|
end
|
58
58
|
|
59
59
|
it "returns :not_found for non-existent path" do
|
60
|
-
@router.endpoint("/not-a-page.html").must_equal :not_found
|
60
|
+
_(@router.endpoint("/not-a-page.html")).must_equal :not_found
|
61
61
|
end
|
62
62
|
|
63
63
|
it "returns :not_found for partially matching paths" do
|
64
|
-
@router.endpoint("/dir1/dir2/").must_equal :not_found
|
65
|
-
@router.endpoint("/dir2/dir3").must_equal :not_found
|
66
|
-
@router.endpoint("ir1/di").must_equal :not_found
|
64
|
+
_(@router.endpoint("/dir1/dir2/")).must_equal :not_found
|
65
|
+
_(@router.endpoint("/dir2/dir3")).must_equal :not_found
|
66
|
+
_(@router.endpoint("ir1/di")).must_equal :not_found
|
67
67
|
end
|
68
68
|
|
69
69
|
it "returns path for '/path/to/dir/' with index" do
|
70
70
|
filename = File.join(@sitedir, "dir-with-index/index.html")
|
71
|
-
@router.endpoint("/dir-with-index/").must_equal filename
|
71
|
+
_(@router.endpoint("/dir-with-index/")).must_equal filename
|
72
72
|
end
|
73
73
|
|
74
74
|
it "returns :must_redirect for '/path/to/dir' with index" do
|
75
|
-
@router.endpoint("/dir-with-index").must_equal :must_redirect
|
75
|
+
_(@router.endpoint("/dir-with-index")).must_equal :must_redirect
|
76
76
|
end
|
77
77
|
|
78
78
|
it "returns :not_found for '/path/to/dir/' without index" do
|
79
|
-
@router.endpoint("/dir-without-index/").must_equal :not_found
|
79
|
+
_(@router.endpoint("/dir-without-index/")).must_equal :not_found
|
80
80
|
end
|
81
81
|
|
82
82
|
it "returns :not_found for '/path/to/dir' without index" do
|
83
|
-
@router.endpoint("/dir-without-index").must_equal :not_found
|
83
|
+
_(@router.endpoint("/dir-without-index")).must_equal :not_found
|
84
84
|
end
|
85
85
|
end
|
86
86
|
|
@@ -89,31 +89,31 @@ describe Lanyon::Router do
|
|
89
89
|
|
90
90
|
it "returns existing path" do
|
91
91
|
filename = File.join(@sitedir, "page.html")
|
92
|
-
@router.endpoint("/page").must_equal filename
|
92
|
+
_(@router.endpoint("/page")).must_equal filename
|
93
93
|
end
|
94
94
|
|
95
95
|
describe "when both `foo' and `foo.html' exist" do
|
96
96
|
|
97
97
|
it "returns `foo' and not `foo.html' when asked for `foo'" do
|
98
98
|
filename = File.join(@sitedir, "foo")
|
99
|
-
@router.endpoint("/foo").must_equal filename
|
99
|
+
_(@router.endpoint("/foo")).must_equal filename
|
100
100
|
end
|
101
101
|
|
102
102
|
it "can also serve `foo.html'" do
|
103
103
|
filename = File.join(@sitedir, "foo.html")
|
104
|
-
@router.endpoint("/foo.html").must_equal filename
|
104
|
+
_(@router.endpoint("/foo.html")).must_equal filename
|
105
105
|
end
|
106
106
|
end
|
107
107
|
|
108
108
|
describe "when both `bar.html' and `bar/index.html' exist" do
|
109
109
|
|
110
110
|
it "returns :must_redirect and not `bar.html' when asked for `bar'" do
|
111
|
-
@router.endpoint("/bar").must_equal :must_redirect
|
111
|
+
_(@router.endpoint("/bar")).must_equal :must_redirect
|
112
112
|
end
|
113
113
|
|
114
114
|
it "can also serve `bar.html'" do
|
115
115
|
filename = File.join(@sitedir, "bar.html")
|
116
|
-
@router.endpoint("/bar.html").must_equal filename
|
116
|
+
_(@router.endpoint("/bar.html")).must_equal filename
|
117
117
|
end
|
118
118
|
end
|
119
119
|
end
|
@@ -123,27 +123,27 @@ describe Lanyon::Router do
|
|
123
123
|
|
124
124
|
it "discards leading '..' for existing path" do
|
125
125
|
filename = File.join(@sitedir, "page.html")
|
126
|
-
@router.endpoint("/../../page.html").must_equal filename
|
126
|
+
_(@router.endpoint("/../../page.html")).must_equal filename
|
127
127
|
end
|
128
128
|
|
129
129
|
it "allows safe directory traversal" do
|
130
130
|
filename = File.join(@sitedir, "index.html")
|
131
|
-
@router.endpoint("/dir1/../").must_equal filename
|
131
|
+
_(@router.endpoint("/dir1/../")).must_equal filename
|
132
132
|
end
|
133
133
|
|
134
134
|
it "returns :not_found for unsafe directory traversal 1" do
|
135
135
|
filename = File.join(@sitedir, "/../_site/page.html")
|
136
136
|
assert File.exist?(filename)
|
137
137
|
|
138
|
-
@router.endpoint("/../_site/page.html").must_equal :not_found
|
138
|
+
_(@router.endpoint("/../_site/page.html")).must_equal :not_found
|
139
139
|
end
|
140
140
|
|
141
141
|
it "returns :not_found for unsafe directory traversal 2" do
|
142
|
-
@router.endpoint("/%2E%2E/_site/").must_equal :not_found
|
142
|
+
_(@router.endpoint("/%2E%2E/_site/")).must_equal :not_found
|
143
143
|
end
|
144
144
|
|
145
145
|
it "returns :not_found for unsafe directory traversal 3" do
|
146
|
-
@router.endpoint("/dir1/../dir1/../../_site/").must_equal :not_found
|
146
|
+
_(@router.endpoint("/dir1/../dir1/../../_site/")).must_equal :not_found
|
147
147
|
end
|
148
148
|
end
|
149
149
|
|
@@ -153,7 +153,7 @@ describe Lanyon::Router do
|
|
153
153
|
describe "when 404.html does not exist" do
|
154
154
|
|
155
155
|
it "returns nil" do
|
156
|
-
@router.custom_404_body.must_be_nil
|
156
|
+
_(@router.custom_404_body).must_be_nil
|
157
157
|
end
|
158
158
|
end
|
159
159
|
|
@@ -169,7 +169,7 @@ describe Lanyon::Router do
|
|
169
169
|
end
|
170
170
|
|
171
171
|
it "returns correct body" do
|
172
|
-
@router.custom_404_body.must_equal "Custom 404"
|
172
|
+
_(@router.custom_404_body).must_equal "Custom 404"
|
173
173
|
end
|
174
174
|
end
|
175
175
|
end
|
@@ -179,14 +179,14 @@ describe Lanyon::Router do
|
|
179
179
|
|
180
180
|
it "strips trailing slash from root" do
|
181
181
|
router = Lanyon::Router.new(@sitedir + "/")
|
182
|
-
router.root.must_equal @sitedir
|
182
|
+
_(router.root).must_equal @sitedir
|
183
183
|
end
|
184
184
|
|
185
185
|
it "does not append a trailing slash to root" do
|
186
186
|
assert !@sitedir.end_with?("/")
|
187
187
|
|
188
188
|
router = Lanyon::Router.new(@sitedir)
|
189
|
-
router.root.must_equal @sitedir
|
189
|
+
_(router.root).must_equal @sitedir
|
190
190
|
end
|
191
191
|
end
|
192
192
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: lanyon
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.4.
|
4
|
+
version: 0.4.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Marcus Stollsteimer
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2020-01-19 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: jekyll
|
@@ -45,33 +45,33 @@ dependencies:
|
|
45
45
|
- !ruby/object:Gem::Version
|
46
46
|
version: '3.0'
|
47
47
|
- !ruby/object:Gem::Dependency
|
48
|
-
name:
|
48
|
+
name: minitest
|
49
49
|
requirement: !ruby/object:Gem::Requirement
|
50
50
|
requirements:
|
51
51
|
- - "~>"
|
52
52
|
- !ruby/object:Gem::Version
|
53
|
-
version: '
|
53
|
+
version: '5.8'
|
54
54
|
type: :development
|
55
55
|
prerelease: false
|
56
56
|
version_requirements: !ruby/object:Gem::Requirement
|
57
57
|
requirements:
|
58
58
|
- - "~>"
|
59
59
|
- !ruby/object:Gem::Version
|
60
|
-
version: '
|
60
|
+
version: '5.8'
|
61
61
|
- !ruby/object:Gem::Dependency
|
62
|
-
name:
|
62
|
+
name: rake
|
63
63
|
requirement: !ruby/object:Gem::Requirement
|
64
64
|
requirements:
|
65
65
|
- - "~>"
|
66
66
|
- !ruby/object:Gem::Version
|
67
|
-
version: '
|
67
|
+
version: '11.2'
|
68
68
|
type: :development
|
69
69
|
prerelease: false
|
70
70
|
version_requirements: !ruby/object:Gem::Requirement
|
71
71
|
requirements:
|
72
72
|
- - "~>"
|
73
73
|
- !ruby/object:Gem::Version
|
74
|
-
version: '
|
74
|
+
version: '11.2'
|
75
75
|
description: Lanyon is a good friend of Jekyll, the static site generator, and transforms
|
76
76
|
your website into a Rack application.
|
77
77
|
email: sto.mar@web.de
|
@@ -140,7 +140,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
140
140
|
- !ruby/object:Gem::Version
|
141
141
|
version: '0'
|
142
142
|
requirements: []
|
143
|
-
rubygems_version: 3.
|
143
|
+
rubygems_version: 3.1.2
|
144
144
|
signing_key:
|
145
145
|
specification_version: 4
|
146
146
|
summary: Lanyon serves your Jekyll site as a Rack application.
|