heel 3.2.1 → 4.0.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/HISTORY.md +11 -0
- data/Manifest.txt +11 -19
- data/README.md +32 -25
- data/Rakefile +21 -9
- data/data/css/pico.min.css +5 -0
- data/data/css/syntax-highlighting.css +61 -0
- data/data/error.rhtml +18 -16
- data/data/lineicons/code-browser.svg +16 -0
- data/data/lineicons/file.svg +12 -0
- data/data/lineicons/folder-alt.svg +9 -0
- data/data/lineicons/html5.svg +21 -0
- data/data/lineicons/image.svg +17 -0
- data/data/lineicons/pdf.svg +18 -0
- data/data/lineicons/presentation.svg +10 -0
- data/data/lineicons/word.svg +23 -0
- data/data/lineicons/zip.svg +14 -0
- data/data/listing.rhtml +40 -30
- data/lib/heel/directory_indexer.rb +1 -1
- data/lib/heel/mime_map.rb +13 -16
- data/lib/heel/rackapp.rb +47 -28
- data/lib/heel/server.rb +7 -6
- data/lib/heel/template_vars.rb +4 -0
- data/lib/heel.rb +1 -1
- data/spec/configuration_spec.rb +10 -6
- data/spec/directory_indexer_spec.rb +14 -11
- data/spec/rackapp_spec.rb +13 -13
- data/spec/server_spec.rb +24 -24
- data/spec/template_vars_spec.rb +2 -2
- data/tasks/default.rake +24 -16
- data/tasks/this.rb +6 -3
- metadata +80 -57
- data/data/css/coderay-alpha.css +0 -120
- data/data/css/coderay-cycnus.css +0 -104
- data/data/css/coderay-murphy.css +0 -98
- data/data/css/index.css +0 -77
- data/data/famfamfam/icons/application.png +0 -0
- data/data/famfamfam/icons/compress.png +0 -0
- data/data/famfamfam/icons/error.png +0 -0
- data/data/famfamfam/icons/folder.png +0 -0
- data/data/famfamfam/icons/html.png +0 -0
- data/data/famfamfam/icons/page_excel.png +0 -0
- data/data/famfamfam/icons/page_white.png +0 -0
- data/data/famfamfam/icons/page_white_acrobat.png +0 -0
- data/data/famfamfam/icons/page_white_code.png +0 -0
- data/data/famfamfam/icons/page_white_powerpoint.png +0 -0
- data/data/famfamfam/icons/page_white_text.png +0 -0
- data/data/famfamfam/icons/picture.png +0 -0
- data/data/famfamfam/icons/xhtml.png +0 -0
- data/data/famfamfam/readme.html +0 -1495
- data/data/famfamfam/readme.txt +0 -22
@@ -0,0 +1,10 @@
|
|
1
|
+
<?xml version="1.0" encoding="utf-8"?>
|
2
|
+
<!-- Generator: Adobe Illustrator 22.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
|
3
|
+
<svg version="1.1" id="lni_lni-presentation" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"
|
4
|
+
x="0px" y="0px" viewBox="0 0 64 64" style="enable-background:new 0 0 64 64;" xml:space="preserve">
|
5
|
+
<path d="M57,5.5H7c-2.9,0-5.3,2.4-5.3,5.3v6.4c0,1.2,1,2.3,2.3,2.3h0.2v20.3c0,2.9,2.4,5.3,5.3,5.3h20.3v5.5L25,54.5
|
6
|
+
c-1,0.8-1.1,2.2-0.3,3.2c0.4,0.5,1.1,0.8,1.7,0.8c0.5,0,1-0.2,1.4-0.5l4.1-3.4l4.1,3.4c1,0.8,2.4,0.7,3.2-0.3c0.8-1,0.7-2.4-0.3-3.2
|
7
|
+
l-4.7-3.9V45h20.3c2.9,0,5.3-2.4,5.3-5.3V19.5H60c1.2,0,2.3-1,2.3-2.3v-6.4C62.3,7.9,59.9,5.5,57,5.5z M6.3,10.8
|
8
|
+
C6.3,10.4,6.6,10,7,10h50c0.4,0,0.8,0.3,0.8,0.8V15h-0.1c0,0-0.1,0-0.1,0H6.4c0,0-0.1,0-0.1,0H6.3V10.8z M55.3,39.8
|
9
|
+
c0,0.4-0.3,0.8-0.8,0.8H9.4c-0.4,0-0.8-0.3-0.8-0.8V19.5h46.6V39.8z"/>
|
10
|
+
</svg>
|
@@ -0,0 +1,23 @@
|
|
1
|
+
<?xml version="1.0" encoding="utf-8"?>
|
2
|
+
<!-- Generator: Adobe Illustrator 22.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
|
3
|
+
<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
|
4
|
+
viewBox="0 0 65 64" style="enable-background:new 0 0 65 64;" xml:space="preserve">
|
5
|
+
<g>
|
6
|
+
<path d="M10.6,29.8c1.2,0,2.3-1,2.3-2.3V8c0-1,0.8-1.8,1.8-1.8h22.6V19c0,1.2,1,2.3,2.3,2.3h12.7V27c0,1.2,1,2.3,2.3,2.3
|
7
|
+
s2.3-1,2.3-2.3v-7.4c0-1.1-0.5-2.2-1.3-3L41.6,3c-0.8-0.8-1.9-1.2-3-1.2h-24c-3.4,0-6.3,2.8-6.3,6.3v19.5
|
8
|
+
C8.4,28.7,9.4,29.8,10.6,29.8z M41.7,9.4l7.5,7.4h-7.5V9.4z"/>
|
9
|
+
<path d="M54.4,51.8c-1.2,0-2.3,1-2.3,2.3v2c0,1-0.8,1.8-1.8,1.8H14.6c-1,0-1.8-0.8-1.8-1.8v-1.4c0-1.2-1-2.3-2.3-2.3
|
10
|
+
s-2.3,1-2.3,2.3V56c0,3.4,2.8,6.3,6.3,6.3h35.7c3.4,0,6.3-2.8,6.3-6.3v-2C56.6,52.8,55.6,51.8,54.4,51.8z"/>
|
11
|
+
<path d="M56.7,30.3h-4.6c-1.2,0-2.3,1-2.3,2.3v15.1c0,1.2,1,2.3,2.3,2.3h4.6c3.5,0,6.4-2.9,6.4-6.5v-6.6
|
12
|
+
C63.1,33.2,60.2,30.3,56.7,30.3z M58.6,43.4c0,1.1-0.9,2-1.9,2h-2.3V34.8h2.3c1,0,1.9,0.9,1.9,2V43.4z"/>
|
13
|
+
<path d="M47.1,39.4v-6.6c0-1.2-1-2.3-2.3-2.3h-7.1c-1.2,0-2.3,1-2.3,2.3v14.9c0,1.2,1,2.3,2.3,2.3s2.3-1,2.3-2.3v-5.3l4,6.5
|
14
|
+
c0.4,0.7,1.2,1.1,1.9,1.1c0.4,0,0.8-0.1,1.2-0.3c1.1-0.7,1.4-2,0.7-3.1l-3-4.8h0C46.1,41.7,47.1,40.7,47.1,39.4z M40,35h2.6v2.1H40
|
15
|
+
V35z"/>
|
16
|
+
<path d="M20.5,36.8v6.9c0,3.5,2.8,6.3,6.3,6.3s6.3-2.8,6.3-6.3v-6.9c0-3.5-2.8-6.3-6.3-6.3S20.5,33.4,20.5,36.8z M28.6,36.8v6.9
|
17
|
+
c0,1-0.8,1.8-1.8,1.8S25,44.7,25,43.7v-6.9c0-1,0.8-1.8,1.8-1.8S28.6,35.8,28.6,36.8z"/>
|
18
|
+
<path d="M10.5,48.2l0.3-1.4l0.3,1.4c0.2,1,1.1,1.7,2.1,1.8c1,0,2-0.6,2.2-1.6l4-14.1c0.3-1.2-0.4-2.4-1.6-2.8
|
19
|
+
c-1.2-0.3-2.4,0.4-2.8,1.6l-1.5,5.4l-0.7-3.1c-0.2-1-1.1-1.8-2.2-1.8c0,0,0,0,0,0c-1.1,0-2,0.8-2.2,1.8l-0.6,3.1L6.3,33
|
20
|
+
c-0.3-1.2-1.6-1.9-2.8-1.5C2.4,31.8,1.7,33,2,34.2l4.1,14.1c0.3,1,1.2,1.6,2.2,1.6c0,0,0.1,0,0.1,0C9.4,49.9,10.3,49.2,10.5,48.2z"
|
21
|
+
/>
|
22
|
+
</g>
|
23
|
+
</svg>
|
@@ -0,0 +1,14 @@
|
|
1
|
+
<?xml version="1.0" encoding="utf-8"?>
|
2
|
+
<!-- Generator: Adobe Illustrator 22.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
|
3
|
+
<svg version="1.1" id="lni_lni-zip" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px"
|
4
|
+
y="0px" viewBox="0 0 64 64" style="enable-background:new 0 0 64 64;" xml:space="preserve">
|
5
|
+
<path d="M56.3,11.6h-3.4V9.4c0-4.2-3.4-7.6-7.6-7.6H10.8c-4.2,0-7.6,3.4-7.6,7.6v30.7c0,1.4,0.6,2.7,1.6,3.6L23,60.9
|
6
|
+
c0.9,0.9,2.1,1.3,3.4,1.3h18.8c4.2,0,7.6-3.4,7.6-7.6V34.5h3.4c1.4,0,2.5-1.1,2.5-2.5V14.2C58.8,12.8,57.7,11.6,56.3,11.6z
|
7
|
+
M10.3,42.8H23c0.2,0,0.4,0.2,0.4,0.4v11.9L10.3,42.8z M48.4,54.6c0,1.7-1.4,3.1-3.1,3.1H28V43.2c0-2.7-2.2-4.9-4.9-4.9H7.6V9.4
|
8
|
+
c0-1.7,1.4-3.1,3.1-3.1h34.5c1.7,0,3.1,1.4,3.1,3.1v2.3H18.1c-1.4,0-2.5,1.1-2.5,2.5V32c0,1.4,1.1,2.5,2.5,2.5h30.3V54.6z
|
9
|
+
M38.4,19.3v7.6c0,1.4-1.1,2.5-2.5,2.5s-2.5-1.1-2.5-2.5v-7.6c0-1.4,1.1-2.5,2.5-2.5S38.4,17.9,38.4,19.3z M30.8,26.9
|
10
|
+
c0,1.4-1.1,2.5-2.5,2.5H24c-0.9,0-1.8-0.5-2.2-1.3c-0.4-0.8-0.4-1.8,0.1-2.6l2.3-3.8h-0.9c-1.4,0-2.5-1.1-2.5-2.5
|
11
|
+
c0-1.4,1.1-2.5,2.5-2.5h5.5c0.9,0,1.8,0.5,2.2,1.3c0.4,0.8,0.4,1.8-0.1,2.6l-2.3,3.8C29.8,24.5,30.8,25.6,30.8,26.9z M48.6,26.9
|
12
|
+
h-2.5c0,1.4-1.1,2.5-2.5,2.5S41,28.3,41,26.9v-2.5v-5.1c0-1.4,1.1-2.5,2.5-2.5h5.1c2.8,0,5.1,2.3,5.1,5.1
|
13
|
+
C53.7,24.6,51.4,26.9,48.6,26.9z"/>
|
14
|
+
</svg>
|
data/data/listing.rhtml
CHANGED
@@ -1,20 +1,18 @@
|
|
1
1
|
<!DOCTYPE html>
|
2
|
-
<html lang='en'>
|
2
|
+
<html lang='en' data-theme="light">
|
3
3
|
<head>
|
4
4
|
<title>Index of <%= base_uri %></title>
|
5
|
+
|
5
6
|
<meta charset='utf-8'>
|
6
|
-
<
|
7
|
-
|
8
|
-
|
9
|
-
<script src='//html5shiv.googlecode.com/svn/trunk/html5.js'></script>
|
10
|
-
<![endif]-->
|
7
|
+
<meta name="viewport" content="width=device-width, initial-scale=1" >
|
8
|
+
|
9
|
+
<link href='/heel_css/pico.min.css' rel='stylesheet' type='text/css'>
|
11
10
|
</head>
|
12
11
|
<body>
|
13
|
-
<
|
14
|
-
<
|
15
|
-
|
16
|
-
|
17
|
-
<div role='content'>
|
12
|
+
<main class="container">
|
13
|
+
<h1>Index of: <%= base_uri %></h1>
|
14
|
+
|
15
|
+
<figure>
|
18
16
|
<table>
|
19
17
|
<thead>
|
20
18
|
<tr>
|
@@ -24,33 +22,45 @@
|
|
24
22
|
<th>Type</th>
|
25
23
|
</tr>
|
26
24
|
</thead>
|
25
|
+
|
27
26
|
<tbody>
|
28
27
|
<% entries.each do |entry| %>
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
28
|
+
<tr>
|
29
|
+
<td>
|
30
|
+
<a href="<%= "#{base_uri.chomp('/')}/#{entry.link}" %>">
|
31
|
+
<% if entry.icon_url then %>
|
32
|
+
<img src="<%= entry.icon_url %>" width="32" height="32" alt="icon for type <%= entry.content_type %>">
|
33
|
+
<% end %>
|
34
|
+
<%= entry.name %>
|
35
|
+
</a>
|
36
|
+
<% if highlighting? && (entry.content_type != 'Directory') then %>
|
37
|
+
(<a download="<%= entry.name %>" href="<%= "#{base_uri.chomp('/')}/#{entry.link}?highlighting=false" %>">download</a>)
|
34
38
|
<% end %>
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
</td>
|
41
|
-
<td><%= entry.last_modified %></td>
|
42
|
-
<td class="<%= entry.content_type == "Directory" ? 'c' : 'n' %>" ><%= entry.size %></td>
|
43
|
-
<td><%= entry.content_type %></td>
|
44
|
-
</tr>
|
39
|
+
</td>
|
40
|
+
<td><%= entry.last_modified %></td>
|
41
|
+
<td class="<%= entry.content_type == "Directory" ? 'c' : 'n' %>" ><%= entry.size %></td>
|
42
|
+
<td><%= entry.content_type %></td>
|
43
|
+
</tr>
|
45
44
|
<% end %>
|
46
45
|
</tbody>
|
46
|
+
|
47
|
+
<tfoot>
|
48
|
+
<tr>
|
49
|
+
<th>Name</th>
|
50
|
+
<th>Last Modified</th>
|
51
|
+
<th>Size</th>
|
52
|
+
<th>Type</th>
|
53
|
+
</tr>
|
54
|
+
</tfoot>
|
47
55
|
</table>
|
48
|
-
</
|
49
|
-
|
56
|
+
</figure>
|
57
|
+
|
58
|
+
<footer class="container">
|
59
|
+
<hr>
|
50
60
|
<p>
|
51
|
-
|
61
|
+
<small><a href="<%= homepage %>" target="_blank">heel</a> v<%= Heel::VERSION %></small>
|
52
62
|
</p>
|
53
63
|
</footer>
|
54
|
-
</
|
64
|
+
</main>
|
55
65
|
</body>
|
56
66
|
</html>
|
@@ -87,7 +87,7 @@ module Heel
|
|
87
87
|
entries << entry_data
|
88
88
|
end
|
89
89
|
|
90
|
-
template_vars = TemplateVars.new( :base_uri => req.path_info )
|
90
|
+
template_vars = TemplateVars.new( :base_uri => req.path_info, :highlighting => highlighting? )
|
91
91
|
template_vars.entries = entries.sort_by { |e| e.link }
|
92
92
|
template_vars.homepage = Heel::Configuration::HOMEPAGE
|
93
93
|
|
data/lib/heel/mime_map.rb
CHANGED
@@ -15,22 +15,19 @@ module Heel
|
|
15
15
|
class << self
|
16
16
|
def icons_by_mime_type
|
17
17
|
@icons_by_mime_type ||= {
|
18
|
-
"text/plain" => "
|
19
|
-
"image" => "
|
20
|
-
"pdf" => "
|
21
|
-
"
|
22
|
-
"
|
23
|
-
"gzip"
|
24
|
-
"
|
25
|
-
"application/
|
26
|
-
"
|
27
|
-
"application
|
28
|
-
"
|
29
|
-
|
30
|
-
|
31
|
-
"text" => "page_white_text.png",
|
32
|
-
:directory => "folder.png",
|
33
|
-
:default => "page_white.png",
|
18
|
+
"text/plain" => "file.svg",
|
19
|
+
"image" => "image.svg",
|
20
|
+
"pdf" => "pdf.svg",
|
21
|
+
"x-zip-compressed" => "zip.svg",
|
22
|
+
"x-gtar" => "zip.svg",
|
23
|
+
"x-gzip" => "zip.svg",
|
24
|
+
"application/x-word" => "word.svg",
|
25
|
+
"application/powerpoint" => "presentation.svg",
|
26
|
+
"text/html" => "html5.svg",
|
27
|
+
"application" => "file.svg",
|
28
|
+
"text" => "file.svg",
|
29
|
+
:directory => "folder-alt.svg",
|
30
|
+
:default => "file.svg",
|
34
31
|
}
|
35
32
|
end
|
36
33
|
|
data/lib/heel/rackapp.rb
CHANGED
@@ -5,8 +5,7 @@
|
|
5
5
|
|
6
6
|
require 'rack'
|
7
7
|
require 'rack/utils'
|
8
|
-
require '
|
9
|
-
require 'coderay/helpers/file_type'
|
8
|
+
require 'rouge'
|
10
9
|
require 'time'
|
11
10
|
|
12
11
|
module Heel
|
@@ -63,7 +62,7 @@ module Heel
|
|
63
62
|
def directory_index_response(req)
|
64
63
|
response = ::Rack::Response.new
|
65
64
|
dir_index = File.join(req.request_path, directory_index_html)
|
66
|
-
if File.file?(dir_index)
|
65
|
+
if File.file?(dir_index) && File.readable?(dir_index) then
|
67
66
|
response['Content-Type'] = mime_map.mime_type_of(dir_index).to_s
|
68
67
|
response.write( File.read( dir_index ) )
|
69
68
|
elsif directory_listing_allowed? then
|
@@ -76,44 +75,64 @@ module Heel
|
|
76
75
|
return response.finish
|
77
76
|
end
|
78
77
|
|
78
|
+
def slurp_path(path)
|
79
|
+
source = nil
|
80
|
+
File.open(path, 'rt:bom|utf-8') do |f|
|
81
|
+
source = f.read
|
82
|
+
end
|
83
|
+
return source
|
84
|
+
end
|
85
|
+
|
86
|
+
def highlight_contents(req, file_type)
|
87
|
+
source = slurp_path(req.request_path)
|
88
|
+
# only do a rouge type check if we are going to use rouge in the
|
89
|
+
# response
|
90
|
+
lexer = ::Rouge::Lexer.guess(
|
91
|
+
filename: req.request_path,
|
92
|
+
source: source,
|
93
|
+
mime_type: file_type
|
94
|
+
)
|
95
|
+
|
96
|
+
formatter = ::Rouge::Formatters::HTMLPygments.new(::Rouge::Formatters::HTML.new)
|
97
|
+
content = formatter.format(lexer.lex(source))
|
98
|
+
|
99
|
+
body = <<-EOM
|
100
|
+
<html>
|
101
|
+
<head>
|
102
|
+
<title>#{req.path_info}</title>
|
103
|
+
<link href='/heel_css/syntax-highlighting.css' rel='stylesheet' type='text/css'>
|
104
|
+
</head>
|
105
|
+
<body>
|
106
|
+
#{content}
|
107
|
+
</body>
|
108
|
+
</html>
|
109
|
+
EOM
|
110
|
+
|
111
|
+
return body
|
112
|
+
end
|
79
113
|
|
80
|
-
|
81
|
-
#
|
114
|
+
|
115
|
+
# formulate a file content response. Possibly a rouge highlighted file if
|
116
|
+
# it is a type that rouge can deal with and the file is not already an
|
82
117
|
# html file.
|
83
118
|
#
|
84
119
|
def file_response(req)
|
85
120
|
response = ::Rack::Response.new
|
86
|
-
|
87
121
|
response['Last-Modified'] = req.stat.mtime.rfc822
|
122
|
+
file_type = mime_map.mime_type_of(req.request_path)
|
88
123
|
|
89
|
-
if highlighting? and req.highlighting? then
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
body = <<-EOM
|
95
|
-
<html>
|
96
|
-
<head>
|
97
|
-
<title>#{req.path_info}</title>
|
98
|
-
<!-- CodeRay syntax highlighting CSS -->
|
99
|
-
<link rel="stylesheet" href="/heel_css/coderay-alpha.css" type="text/css" />
|
100
|
-
</head>
|
101
|
-
<body>
|
102
|
-
#{CodeRay.scan_file(req.request_path,:auto).html({ :wrap => :div, :line_numbers => :inline })}
|
103
|
-
</body>
|
104
|
-
</html>
|
105
|
-
EOM
|
106
|
-
response['Content-Type'] = 'text/html'
|
107
|
-
response['Content-Length'] = body.length.to_s
|
124
|
+
if highlighting? and req.highlighting? then
|
125
|
+
if file_type && (file_type != 'text/html') then
|
126
|
+
body = highlight_contents(req, file_type)
|
127
|
+
response['Content-Type'] = 'text/html'
|
128
|
+
response['Content-Length'] = body.length.to_s
|
108
129
|
response.write( body )
|
109
130
|
return response.finish
|
110
131
|
end
|
111
132
|
end
|
112
133
|
|
113
134
|
# fall through to a default file return
|
114
|
-
|
115
|
-
file_type = mime_map.mime_type_of(req.request_path)
|
116
|
-
response['Content-Type'] = file_type.to_s
|
135
|
+
response['Content-Type'] = file_type.to_s
|
117
136
|
File.open( req.request_path ) do |f|
|
118
137
|
while p = f.read( 8192 ) do
|
119
138
|
response.write( p )
|
data/lib/heel/server.rb
CHANGED
@@ -7,6 +7,7 @@ require 'ostruct'
|
|
7
7
|
require 'launchy'
|
8
8
|
require 'fileutils'
|
9
9
|
require 'heel/rackapp'
|
10
|
+
require 'rackup'
|
10
11
|
require 'puma'
|
11
12
|
|
12
13
|
module Heel
|
@@ -56,7 +57,7 @@ module Heel
|
|
56
57
|
defaults.port = 4331
|
57
58
|
defaults.document_root = Dir.pwd
|
58
59
|
defaults.daemonize = false
|
59
|
-
defaults.highlighting =
|
60
|
+
defaults.highlighting = true
|
60
61
|
defaults.kill = false
|
61
62
|
defaults.launch_browser = true
|
62
63
|
return defaults
|
@@ -228,17 +229,17 @@ module Heel
|
|
228
229
|
run app
|
229
230
|
end
|
230
231
|
map "/heel_css" do
|
231
|
-
run Rack::
|
232
|
+
run Rack::Files.new(Heel::Configuration.data_path( "css" ))
|
232
233
|
end
|
233
234
|
map "/heel_icons" do
|
234
|
-
run Rack::
|
235
|
+
run Rack::Files.new(Heel::Configuration.data_path("lineicons"))
|
235
236
|
end
|
236
237
|
}
|
237
238
|
return stack.to_app
|
238
239
|
end
|
239
240
|
|
240
241
|
# If we are daemonizing the fork and wait for the child to launch the server
|
241
|
-
# If we are not daemonizing, throw the
|
242
|
+
# If we are not daemonizing, throw the ::Rackup::Server in a background thread
|
242
243
|
def start_server
|
243
244
|
if options.daemonize then
|
244
245
|
start_background_server
|
@@ -252,14 +253,14 @@ module Heel
|
|
252
253
|
if cpid = fork then
|
253
254
|
Process.waitpid( cpid )
|
254
255
|
else
|
255
|
-
server =
|
256
|
+
server = ::Rackup::Server.new( server_options )
|
256
257
|
server.start
|
257
258
|
end
|
258
259
|
end
|
259
260
|
|
260
261
|
def start_foreground_server
|
261
262
|
Thread.new {
|
262
|
-
server =
|
263
|
+
server = ::Rackup::Server.new( server_options )
|
263
264
|
server.start
|
264
265
|
}
|
265
266
|
end
|
data/lib/heel/template_vars.rb
CHANGED
data/lib/heel.rb
CHANGED
data/spec/configuration_spec.rb
CHANGED
@@ -6,19 +6,23 @@ describe Heel::Configuration do
|
|
6
6
|
@proj_root = Pathname.new( __FILE__ ).parent.parent
|
7
7
|
end
|
8
8
|
it "finds files relative to root of gem" do
|
9
|
-
Heel::Configuration.root_dir
|
9
|
+
root_dir = Heel::Configuration.root_dir
|
10
|
+
_(root_dir).must_equal @proj_root.expand_path.to_s + File::SEPARATOR
|
10
11
|
end
|
11
12
|
|
12
13
|
it "finds files in the config dir of the project" do
|
13
|
-
Heel::Configuration.config_path('config.rb')
|
14
|
+
config_rb = Heel::Configuration.config_path('config.rb')
|
15
|
+
_(config_rb).must_equal @proj_root.join("config", "config.rb").to_s
|
14
16
|
end
|
15
|
-
|
17
|
+
|
16
18
|
it "finds files in the data dir of the project" do
|
17
|
-
Heel::Configuration.data_path('
|
19
|
+
icons = Heel::Configuration.data_path('lineicons', 'icons')
|
20
|
+
_(icons).must_equal @proj_root.join( "data", "lineicons", "icons" ).to_s
|
18
21
|
end
|
19
|
-
|
22
|
+
|
20
23
|
it "finds files in the lib dir of the project" do
|
21
|
-
Heel::Configuration.lib_path('heel.rb')
|
24
|
+
heel_rb = Heel::Configuration.lib_path('heel.rb')
|
25
|
+
_(heel_rb).must_equal @proj_root.join("lib", "heel.rb").to_s
|
22
26
|
end
|
23
27
|
|
24
28
|
end
|
@@ -7,41 +7,44 @@ describe Heel::DirectoryIndexer do
|
|
7
7
|
|
8
8
|
it "should ignore .htaccess files" do
|
9
9
|
@indexer.options[:ignore_globs] = %w( *~ .htaccess . )
|
10
|
-
@indexer.should_ignore?(".htaccess").must_equal true
|
10
|
+
_(@indexer.should_ignore?(".htaccess")).must_equal true
|
11
11
|
end
|
12
12
|
|
13
13
|
it "should not ignore .html files " do
|
14
14
|
@indexer.options[:ignore_globs] = %w( *~ .htaccess . )
|
15
|
-
@indexer.should_ignore?("something.html").must_equal false
|
15
|
+
_(@indexer.should_ignore?("something.html")).must_equal false
|
16
16
|
end
|
17
17
|
|
18
18
|
it "can tell if highlighting is to be performed" do
|
19
|
-
@indexer.must_be :highlighting?
|
19
|
+
_(@indexer).must_be :highlighting?
|
20
20
|
end
|
21
21
|
|
22
22
|
it "knows if the template should be reloaded on changes" do
|
23
|
-
@indexer.reload_on_template_change
|
23
|
+
_(@indexer.reload_on_template_change?).must_equal false
|
24
24
|
end
|
25
25
|
|
26
26
|
it "uses icons" do
|
27
|
-
@indexer.using_icons
|
27
|
+
_(@indexer.using_icons?).must_equal false
|
28
28
|
end
|
29
29
|
|
30
30
|
it "uses a mime map" do
|
31
|
-
@indexer.mime_map.must_be_instance_of(Heel::MimeMap)
|
31
|
+
_(@indexer.mime_map).must_be_instance_of(Heel::MimeMap)
|
32
32
|
end
|
33
33
|
|
34
|
-
[
|
34
|
+
[
|
35
|
+
{ :ext => 'svg', :type => 'image/svg+xml' },
|
35
36
|
{ :ext => 'flv', :type => 'video/x-flv' },
|
36
|
-
{ :ext => '
|
37
|
+
{ :ext => 'rb', :type => 'text/plain' },
|
38
|
+
{ :ext => 'rhtml', :type => 'text/plain' }
|
39
|
+
].each do |m|
|
37
40
|
it "finds #{m[:ext]} extension in the map as #{m[:type]}" do
|
38
|
-
@indexer.mime_map.mime_type_of( "test.#{m[:ext]}" ).must_equal m[:type]
|
41
|
+
_(@indexer.mime_map.mime_type_of( "test.#{m[:ext]}" )).must_equal m[:type]
|
39
42
|
end
|
40
43
|
end
|
41
44
|
|
42
|
-
%w[ md markdown rdoc
|
45
|
+
%w[ md markdown rdoc ].each do |ext|
|
43
46
|
it "finds #{ext} in the map as text/plain" do
|
44
|
-
@indexer.mime_map.mime_type_of( "test.#{ext}" ).must_equal "text/plain"
|
47
|
+
_(@indexer.mime_map.mime_type_of( "test.#{ext}" )).must_equal "text/plain"
|
45
48
|
end
|
46
49
|
end
|
47
50
|
end
|
data/spec/rackapp_spec.rb
CHANGED
@@ -10,34 +10,34 @@ describe Heel::RackApp do
|
|
10
10
|
|
11
11
|
it "should return the a listing for the currrent directory" do
|
12
12
|
res = @request.get("/")
|
13
|
-
res.must_be :ok?
|
14
|
-
res['Content-Type'].must_equal "text/html"
|
15
|
-
res.body.must_match( /Rakefile/ )
|
13
|
+
_(res).must_be :ok?
|
14
|
+
_(res['Content-Type']).must_equal "text/html"
|
15
|
+
_(res.body).must_match( /Rakefile/ )
|
16
16
|
end
|
17
17
|
|
18
18
|
it 'should highlight a ruby file' do
|
19
19
|
res = @request.get("/lib/heel.rb")
|
20
|
-
res.must_be :ok?
|
21
|
-
res['Content-Type'].must_equal "text/html"
|
22
|
-
res.body.must_match( /class="
|
20
|
+
_(res).must_be :ok?
|
21
|
+
_(res['Content-Type']).must_equal "text/html"
|
22
|
+
_(res.body).must_match( /class="highlight"/ )
|
23
23
|
end
|
24
24
|
|
25
25
|
it "should not highlight a ruby file if told not to" do
|
26
26
|
res = @request.get("/lib/heel.rb?highlighting=off")
|
27
|
-
res.must_be :ok?
|
28
|
-
res.body.size.must_equal File.size("lib/heel.rb")
|
29
|
-
res['Content-Type'].must_equal "text/plain"
|
27
|
+
_(res).must_be :ok?
|
28
|
+
_(res.body.size).must_equal File.size("lib/heel.rb")
|
29
|
+
_(res['Content-Type']).must_equal "text/plain"
|
30
30
|
end
|
31
31
|
|
32
32
|
it "should return a 405 if given a non-GET request" do
|
33
33
|
res = @request.post("/")
|
34
|
-
res.wont_be :ok?
|
35
|
-
res.status.must_equal 405
|
34
|
+
_(res).wont_be :ok?
|
35
|
+
_(res.status).must_equal 405
|
36
36
|
end
|
37
37
|
|
38
38
|
it "should return a 403 if accessing an invalid location" do
|
39
39
|
res = @request.get("/../../../../etc/passwd")
|
40
|
-
res.wont_be :ok?
|
41
|
-
res.status.must_equal 403
|
40
|
+
_(res).wont_be :ok?
|
41
|
+
_(res.status).must_equal 403
|
42
42
|
end
|
43
43
|
end
|
data/spec/server_spec.rb
CHANGED
@@ -19,8 +19,8 @@ describe Heel::Server do
|
|
19
19
|
begin
|
20
20
|
server.run
|
21
21
|
rescue SystemExit => se
|
22
|
-
se.status.must_equal 0
|
23
|
-
@stdout.string.must_match( /version #{Heel::VERSION}/ )
|
22
|
+
_(se.status).must_equal 0
|
23
|
+
_(@stdout.string).must_match( /version #{Heel::VERSION}/ )
|
24
24
|
end
|
25
25
|
end
|
26
26
|
|
@@ -30,8 +30,8 @@ describe Heel::Server do
|
|
30
30
|
begin
|
31
31
|
server.run
|
32
32
|
rescue SystemExit => se
|
33
|
-
se.status.must_equal 0
|
34
|
-
@stdout.string.must_match( /Usage/m )
|
33
|
+
_(se.status).must_equal 0
|
34
|
+
_(@stdout.string).must_match( /Usage/m )
|
35
35
|
end
|
36
36
|
end
|
37
37
|
|
@@ -41,8 +41,8 @@ describe Heel::Server do
|
|
41
41
|
begin
|
42
42
|
server.run
|
43
43
|
rescue SystemExit => se
|
44
|
-
se.status.must_equal 1
|
45
|
-
@stdout.string.must_match( /Try .*--help/m )
|
44
|
+
_(se.status).must_equal 1
|
45
|
+
_(@stdout.string).must_match( /Try .*--help/m )
|
46
46
|
end
|
47
47
|
end
|
48
48
|
|
@@ -52,34 +52,34 @@ describe Heel::Server do
|
|
52
52
|
begin
|
53
53
|
server.run
|
54
54
|
rescue SystemExit => se
|
55
|
-
se.status.must_equal 1
|
56
|
-
@stdout.string.must_match( /Try .*--help/m )
|
55
|
+
_(se.status).must_equal 1
|
56
|
+
_(@stdout.string).must_match( /Try .*--help/m )
|
57
57
|
end
|
58
58
|
end
|
59
59
|
|
60
60
|
it "should allow port and address to be set" do
|
61
61
|
server = Heel::Server.new(%w[--port 4242 --address 192.168.1.1])
|
62
62
|
server.merge_options
|
63
|
-
server.options.address.must_equal "192.168.1.1"
|
64
|
-
server.options.port.must_equal 4242
|
63
|
+
_(server.options.address).must_equal "192.168.1.1"
|
64
|
+
_(server.options.port).must_equal 4242
|
65
65
|
end
|
66
66
|
|
67
67
|
it "should allow the highlighting option to be set" do
|
68
|
-
server = Heel::Server.new(%w[--highlighting])
|
68
|
+
server = Heel::Server.new(%w[--no-highlighting])
|
69
69
|
server.merge_options
|
70
|
-
server.options.highlighting.must_equal
|
70
|
+
_(server.options.highlighting).must_equal false
|
71
71
|
end
|
72
72
|
|
73
|
-
it "should have highlighting
|
73
|
+
it "should have highlighting on as a default" do
|
74
74
|
server = Heel::Server.new
|
75
75
|
server.merge_options
|
76
|
-
server.options.highlighting.must_equal
|
76
|
+
_(server.options.highlighting).must_equal true
|
77
77
|
end
|
78
78
|
|
79
79
|
it "should set no-launch-browser option" do
|
80
80
|
server = Heel::Server.new(%w[--no-launch-browser])
|
81
81
|
server.merge_options
|
82
|
-
server.options.launch_browser.must_equal false
|
82
|
+
_(server.options.launch_browser).must_equal false
|
83
83
|
end
|
84
84
|
|
85
85
|
it "should attempt to kill the process" do
|
@@ -90,18 +90,18 @@ describe Heel::Server do
|
|
90
90
|
server.run
|
91
91
|
violated("Should have thrown SystemExit")
|
92
92
|
rescue SystemExit => se
|
93
|
-
se.status.must_equal 0
|
94
|
-
@stdout.string.must_match( /Done/m )
|
93
|
+
_(se.status).must_equal 0
|
94
|
+
_(@stdout.string).must_match( /Done/m )
|
95
95
|
end
|
96
96
|
end
|
97
97
|
|
98
98
|
it "should setup a heel directory" do
|
99
99
|
server = Heel::Server.new(%w[--daemonize])
|
100
100
|
server.set_io(@stdin,@stdout)
|
101
|
-
File.directory?(server.default_directory).must_equal false
|
101
|
+
_(File.directory?(server.default_directory)).must_equal false
|
102
102
|
server.setup_heel_dir
|
103
|
-
File.directory?(server.default_directory).must_equal true
|
104
|
-
@stdout.string.must_match( /Created/m )
|
103
|
+
_(File.directory?(server.default_directory)).must_equal true
|
104
|
+
_(@stdout.string).must_match( /Created/m )
|
105
105
|
end
|
106
106
|
|
107
107
|
it "should send a signal to a pid" do
|
@@ -114,20 +114,20 @@ describe Heel::Server do
|
|
114
114
|
server.run
|
115
115
|
violated("Should have exited")
|
116
116
|
rescue SystemExit => se
|
117
|
-
se.status.must_equal 0
|
118
|
-
@stdout.string.must_match( /Sending TERM to process -42/m )
|
117
|
+
_(se.status).must_equal 0
|
118
|
+
_(@stdout.string).must_match( /Sending TERM to process -42/m )
|
119
119
|
end
|
120
120
|
end
|
121
121
|
|
122
122
|
it "records the port of the server process in the pid filename" do
|
123
123
|
server = Heel::Server.new( %w[ --port 4222 ] )
|
124
124
|
server.merge_options
|
125
|
-
File.basename( server.pid_file ).must_equal( "heel.4222.pid" )
|
125
|
+
_(File.basename( server.pid_file )).must_equal( "heel.4222.pid" )
|
126
126
|
end
|
127
127
|
|
128
128
|
it "records the port of the server process in the log filename" do
|
129
129
|
server = Heel::Server.new( %w[ --port 4222 ] )
|
130
130
|
server.merge_options
|
131
|
-
File.basename( server.log_file ).must_equal( "heel.4222.log" )
|
131
|
+
_(File.basename( server.log_file )).must_equal( "heel.4222.log" )
|
132
132
|
end
|
133
133
|
end
|