directory_listing 0.3.4 → 0.4
Sign up to get free protection for your applications and to get access to all the features.
- data/Gemfile.lock +1 -1
- data/Rakefile +6 -0
- data/lib/sinatra/directory_listing/layout.rb +1 -3
- data/lib/sinatra/directory_listing/page.rb +62 -2
- data/lib/sinatra/directory_listing/version.rb +1 -1
- data/lib/sinatra/directory_listing.rb +39 -147
- data/test/public/level1/level2/level3/level 4/test +0 -0
- data/test/public/level1/level2/level3/test +0 -0
- data/test/public/level1/level2/test +0 -0
- data/test/public/level1/test +0 -0
- data/test/test_directory_listing.rb +8 -0
- metadata +11 -3
data/Gemfile.lock
CHANGED
data/Rakefile
CHANGED
@@ -5,6 +5,7 @@ require 'yard'
|
|
5
5
|
##
|
6
6
|
# Run the test application
|
7
7
|
|
8
|
+
desc "Run the test application on port 4567"
|
8
9
|
task :run do
|
9
10
|
`ruby test/test_directory_listing_app.rb -o 0.0.0.0`
|
10
11
|
end
|
@@ -22,3 +23,8 @@ end
|
|
22
23
|
Rake::TestTask.new do |t|
|
23
24
|
t.libs << 'test'
|
24
25
|
end
|
26
|
+
|
27
|
+
##
|
28
|
+
# Default -> run tests
|
29
|
+
|
30
|
+
task :default => 'test'
|
@@ -1,5 +1,8 @@
|
|
1
1
|
class Page
|
2
2
|
|
3
|
+
##
|
4
|
+
# Class definition for the page to be generated.
|
5
|
+
|
3
6
|
attr_accessor :should_list_invisibles,
|
4
7
|
:last_modified_format,
|
5
8
|
:filename_truncate_length,
|
@@ -18,5 +21,62 @@ class Page
|
|
18
21
|
:file_sort_link,
|
19
22
|
:mtime_sort_link,
|
20
23
|
:size_sort_link
|
21
|
-
|
22
|
-
|
24
|
+
|
25
|
+
##
|
26
|
+
# Return new parameters for another location with the
|
27
|
+
# same sorting parameters as the passed Page object
|
28
|
+
|
29
|
+
def sorted_url(page)
|
30
|
+
params = ""
|
31
|
+
if page.request_params["sortby"] && page.request_params["direction"]
|
32
|
+
params = "?sortby=" + page.request_params["sortby"] + "&direction=" + page.request_params["direction"]
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
def sorting_info(s_item, s_direction)
|
37
|
+
|
38
|
+
file_link_dir = mtime_link_dir = sortby_link_dir = "ascending"
|
39
|
+
s_item_display = s_direction_display = ""
|
40
|
+
|
41
|
+
case s_item
|
42
|
+
when "file"
|
43
|
+
s_item_display = "alphabetically"
|
44
|
+
case s_direction
|
45
|
+
when "ascending"
|
46
|
+
s_direction_display = ""
|
47
|
+
file_link_dir = "descending"
|
48
|
+
when "descending"
|
49
|
+
s_direction_display = "reversed"
|
50
|
+
file_link_dir = "ascending"
|
51
|
+
end
|
52
|
+
when "mtime"
|
53
|
+
s_item_display = "by modification date"
|
54
|
+
case s_direction
|
55
|
+
when "ascending"
|
56
|
+
s_direction_display = "oldest to newest"
|
57
|
+
mtime_link_dir = "descending"
|
58
|
+
when "descending"
|
59
|
+
s_direction_display = "newest to oldest"
|
60
|
+
mtime_link_dir = "ascending"
|
61
|
+
end
|
62
|
+
when "size"
|
63
|
+
s_item_display = "by size"
|
64
|
+
case s_direction
|
65
|
+
when "ascending"
|
66
|
+
s_direction_display = "smallest to largest"
|
67
|
+
sortby_link_dir = "descending"
|
68
|
+
when "descending"
|
69
|
+
s_direction_display = "largest to smallest"
|
70
|
+
sortby_link_dir = "ascending"
|
71
|
+
end
|
72
|
+
end
|
73
|
+
|
74
|
+
return "?sortby=file&direction=#{file_link_dir}",
|
75
|
+
"?sortby=mtime&direction=#{mtime_link_dir}",
|
76
|
+
"?sortby=size&direction=#{sortby_link_dir}",
|
77
|
+
s_item_display,
|
78
|
+
s_direction_display
|
79
|
+
|
80
|
+
end
|
81
|
+
|
82
|
+
end
|
@@ -5,95 +5,6 @@ require 'pathname'
|
|
5
5
|
require 'uri'
|
6
6
|
require 'erb'
|
7
7
|
|
8
|
-
# ### directory_listing: easy, CSS-styled, Apache-like directory listings for Sinatra.
|
9
|
-
#
|
10
|
-
# ### Install:
|
11
|
-
#
|
12
|
-
# For regular use:
|
13
|
-
#
|
14
|
-
# ```bash
|
15
|
-
# (sudo) gem install directory_listing
|
16
|
-
# ```
|
17
|
-
#
|
18
|
-
# Or from source:
|
19
|
-
#
|
20
|
-
# ```bash
|
21
|
-
# rake install
|
22
|
-
# ```
|
23
|
-
#
|
24
|
-
# ### Usage:
|
25
|
-
#
|
26
|
-
# ```list()``` will return HTML, so the following is a complete Sinatra app that will provide a directory listing of whatever path you navigate to and let you view any file that is served directly:
|
27
|
-
#
|
28
|
-
# ```ruby
|
29
|
-
# require 'sinatra'
|
30
|
-
# require 'sinatra/directory_listing'
|
31
|
-
#
|
32
|
-
# get '*' do |path|
|
33
|
-
# if File.exist?(File.join(settings.public_folder, path))
|
34
|
-
# if File.directory?(File.join(settings.public_folder, path))
|
35
|
-
# list()
|
36
|
-
# else
|
37
|
-
# send_file File.join(settings.public_folder, path)
|
38
|
-
# end
|
39
|
-
# else
|
40
|
-
# not_found
|
41
|
-
# end
|
42
|
-
# end
|
43
|
-
#
|
44
|
-
# not_found do
|
45
|
-
# 'Try again.'
|
46
|
-
# end
|
47
|
-
# ```
|
48
|
-
#
|
49
|
-
# ### Options:
|
50
|
-
#
|
51
|
-
# Options are passed in a hash:
|
52
|
-
#
|
53
|
-
# ```ruby
|
54
|
-
# list({
|
55
|
-
# :stylesheet => "stylesheets/styles.css",
|
56
|
-
# :readme => "<a>Welcome!</a>"
|
57
|
-
# })
|
58
|
-
# ```
|
59
|
-
#
|
60
|
-
# Available options:
|
61
|
-
#
|
62
|
-
# - ```stylesheet``` - a stylesheet that will be added to the <head> of the generated directory listing
|
63
|
-
# - ```readme``` - an HTML string that will be appended at the footer of the generated directory listing
|
64
|
-
# - ```should_list_invisibles``` - whether the directory listing should include invisibles (dotfiles) - true or false, defaults to false
|
65
|
-
# - ```last_modified_format``` - [format](http://www.ruby-doc.org/core-2.0/Time.html) for last modified date - defaults to ```%Y-%m-%d %H:%M:%S```
|
66
|
-
# - ```filename_truncate_length``` - (integer) length to truncate file names to - defaults to 40
|
67
|
-
#
|
68
|
-
# ### Styling:
|
69
|
-
#
|
70
|
-
# It's pretty easy to figure out how to style ```directory_listing``` by looking at the source, but here are some gotchas:
|
71
|
-
#
|
72
|
-
# - Every item listed is a ```<td>``` element in a table. Directories will have a class of ```dir``` and regular files will have a class of ```file```.
|
73
|
-
# - You can style the "File" column with this CSS:
|
74
|
-
#
|
75
|
-
# ```css
|
76
|
-
# table tr > td:first-child {
|
77
|
-
# text-align: left;
|
78
|
-
# }
|
79
|
-
# ```
|
80
|
-
#
|
81
|
-
# - "Last modified" column:
|
82
|
-
#
|
83
|
-
# ```css
|
84
|
-
# table tr > td:first-child + td {
|
85
|
-
# text-align: left;
|
86
|
-
# }
|
87
|
-
# ```
|
88
|
-
#
|
89
|
-
# - "Size" column:
|
90
|
-
#
|
91
|
-
# ```css
|
92
|
-
# table tr > td:first-child + td + td {
|
93
|
-
# text-align: left;
|
94
|
-
# }
|
95
|
-
# ```
|
96
|
-
|
97
8
|
module Sinatra
|
98
9
|
module Directory_listing
|
99
10
|
|
@@ -119,18 +30,13 @@ module Sinatra
|
|
119
30
|
}.merge(o)
|
120
31
|
|
121
32
|
##
|
122
|
-
# Create a page object.
|
33
|
+
# Create a page object and start setting attributes.
|
123
34
|
|
124
35
|
page = Page.new
|
125
36
|
|
126
37
|
page.should_list_invisibles = options[:should_list_invisibles]
|
127
38
|
page.last_modified_format = options[:last_modified_format]
|
128
|
-
page.filename_truncate_length = options[:filename_truncate_length]
|
129
|
-
|
130
|
-
##
|
131
|
-
# Get the public folder, request path, and parameters and
|
132
|
-
# store in globals to be used by the Resource class.
|
133
|
-
|
39
|
+
page.filename_truncate_length = options[:filename_truncate_length]
|
134
40
|
page.public_folder = settings.public_folder
|
135
41
|
page.request_path = request.path
|
136
42
|
page.request_params = request.params
|
@@ -145,19 +51,36 @@ module Sinatra
|
|
145
51
|
end
|
146
52
|
|
147
53
|
##
|
148
|
-
# Generate the
|
54
|
+
# Generate the navigation links
|
149
55
|
# Append the sorting information if the current directory is sorted.
|
150
56
|
|
151
|
-
|
152
|
-
|
153
|
-
|
154
|
-
|
155
|
-
|
156
|
-
page.back_to_link = "
|
57
|
+
path_array = page.current_page.split("/").drop(1)
|
58
|
+
path_count = path_array.count
|
59
|
+
params = page.sorted_url(page)
|
60
|
+
|
61
|
+
if URI.unescape(request.path) == "/"
|
62
|
+
page.back_to_link = "Index of /"
|
157
63
|
else
|
158
|
-
page.back_to_link = "<a
|
64
|
+
page.back_to_link = "Index of <a href=\'/#{params}'>/</a>"
|
159
65
|
end
|
160
|
-
|
66
|
+
|
67
|
+
previous_path = ""
|
68
|
+
0.upto(path_array.count - 1) do |a|
|
69
|
+
escaped_path = path_array[a].gsub(" ", "%20").gsub("'", "%27")
|
70
|
+
escaped_previous = previous_path.gsub(" ", "%20").gsub("'", "%27")
|
71
|
+
if a == path_array.count - 1
|
72
|
+
href = ""
|
73
|
+
else
|
74
|
+
href = "<a href=\'/#{escaped_previous}#{escaped_path}#{params}\'>"
|
75
|
+
end
|
76
|
+
if a == 0
|
77
|
+
page.back_to_link << " #{href}#{path_array[a]}</a>"
|
78
|
+
else
|
79
|
+
page.back_to_link << " / #{href}#{path_array[a]}</a>"
|
80
|
+
end
|
81
|
+
previous_path << path_array[a] + "/"
|
82
|
+
end
|
83
|
+
|
161
84
|
##
|
162
85
|
# Get an array of files to be listed.
|
163
86
|
|
@@ -167,7 +90,8 @@ module Sinatra
|
|
167
90
|
end
|
168
91
|
|
169
92
|
##
|
170
|
-
# If the only thing in the array are invisible files,
|
93
|
+
# If the only thing in the array are invisible files,
|
94
|
+
# display a "No files" listing.
|
171
95
|
|
172
96
|
page.files_html = ""
|
173
97
|
if files == [".", ".."]
|
@@ -188,8 +112,8 @@ module Sinatra
|
|
188
112
|
end
|
189
113
|
|
190
114
|
##
|
191
|
-
# Get the sortby and direction parameters
|
192
|
-
# default).
|
115
|
+
# Get the sortby and direction parameters
|
116
|
+
# ("file" and "ascending" by default).
|
193
117
|
|
194
118
|
page.sort_item = "file"
|
195
119
|
page.sort_direction = "ascending"
|
@@ -207,45 +131,13 @@ module Sinatra
|
|
207
131
|
##
|
208
132
|
# Set display variables and sort links based on sorting variables
|
209
133
|
|
210
|
-
|
211
|
-
|
212
|
-
|
213
|
-
|
214
|
-
|
215
|
-
|
216
|
-
|
217
|
-
page.sort_direction_display = ""
|
218
|
-
file_link_dir = "descending"
|
219
|
-
when "descending"
|
220
|
-
page.sort_direction_display = "reversed"
|
221
|
-
file_link_dir = "ascending"
|
222
|
-
end
|
223
|
-
when "mtime"
|
224
|
-
page.sort_item_display = "by modification date"
|
225
|
-
case page.sort_direction
|
226
|
-
when "ascending"
|
227
|
-
page.sort_direction_display = "oldest to newest"
|
228
|
-
mtime_link_dir = "descending"
|
229
|
-
when "descending"
|
230
|
-
page.sort_direction_display = "newest to oldest"
|
231
|
-
mtime_link_dir = "ascending"
|
232
|
-
end
|
233
|
-
when "size"
|
234
|
-
page.sort_item_display = "by size"
|
235
|
-
case page.sort_direction
|
236
|
-
when "ascending"
|
237
|
-
page.sort_direction_display = "smallest to largest"
|
238
|
-
sortby_link_dir = "descending"
|
239
|
-
when "descending"
|
240
|
-
page.sort_direction_display = "largest to smallest"
|
241
|
-
sortby_link_dir = "ascending"
|
242
|
-
end
|
243
|
-
end
|
244
|
-
|
245
|
-
page.file_sort_link = "?sortby=file&direction=#{file_link_dir}"
|
246
|
-
page.mtime_sort_link = "?sortby=mtime&direction=#{mtime_link_dir}"
|
247
|
-
page.size_sort_link = "?sortby=size&direction=#{sortby_link_dir}"
|
248
|
-
|
134
|
+
page.file_sort_link,
|
135
|
+
page.mtime_sort_link,
|
136
|
+
page.size_sort_link,
|
137
|
+
page.sort_item_display,
|
138
|
+
page.sort_direction_display =
|
139
|
+
page.sorting_info(page.sort_item, page.sort_direction)
|
140
|
+
|
249
141
|
##
|
250
142
|
# Finally, generate the html from the array of Resources.
|
251
143
|
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
@@ -107,4 +107,12 @@ class DirectoryListingTest < Test::Unit::TestCase
|
|
107
107
|
files = files_array(last_response.body)
|
108
108
|
assert_equal ["3k.dat", "2k.dat", "1k.dat"], files
|
109
109
|
end
|
110
|
+
|
111
|
+
##
|
112
|
+
# test navigation bar
|
113
|
+
|
114
|
+
def test_navigation_bar
|
115
|
+
get '/level1/level2/level3/level%204'
|
116
|
+
assert last_response.body.include?('<a href=\'/level1/level2\'>level2</a>')
|
117
|
+
end
|
110
118
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: directory_listing
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: '0.4'
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date:
|
12
|
+
date: 2014-02-20 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: filesize
|
@@ -127,6 +127,10 @@ files:
|
|
127
127
|
- lib/sinatra/directory_listing/resource.rb
|
128
128
|
- lib/sinatra/directory_listing/version.rb
|
129
129
|
- test/public/1234.txt
|
130
|
+
- test/public/level1/level2/level3/level 4/test
|
131
|
+
- test/public/level1/level2/level3/test
|
132
|
+
- test/public/level1/level2/test
|
133
|
+
- test/public/level1/test
|
130
134
|
- test/public/readme/test.txt
|
131
135
|
- test/public/should_list_invisibles/test.txt
|
132
136
|
- test/public/sorting/1k.dat
|
@@ -156,12 +160,16 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
156
160
|
version: '0'
|
157
161
|
requirements: []
|
158
162
|
rubyforge_project:
|
159
|
-
rubygems_version: 1.8.
|
163
|
+
rubygems_version: 1.8.24
|
160
164
|
signing_key:
|
161
165
|
specification_version: 3
|
162
166
|
summary: Easy, CSS-styled, Apache-like directory listings for Sinatra.
|
163
167
|
test_files:
|
164
168
|
- test/public/1234.txt
|
169
|
+
- test/public/level1/level2/level3/level 4/test
|
170
|
+
- test/public/level1/level2/level3/test
|
171
|
+
- test/public/level1/level2/test
|
172
|
+
- test/public/level1/test
|
165
173
|
- test/public/readme/test.txt
|
166
174
|
- test/public/should_list_invisibles/test.txt
|
167
175
|
- test/public/sorting/1k.dat
|