heel 3.2.1 → 4.0.1
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.
- 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
|