el_finder 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/.autotest +23 -0
- data/History.txt +19 -0
- data/Manifest.txt +22 -0
- data/README.txt +98 -0
- data/Rakefile +13 -0
- data/lib/el_finder.rb +11 -0
- data/lib/el_finder/connector.rb +342 -0
- data/lib/el_finder/image_resize.rb +14 -0
- data/lib/el_finder/image_size.rb +17 -0
- data/lib/el_finder/mime_type.rb +78 -0
- data/lib/el_finder/pathname.rb +47 -0
- data/test/files/README.txt +2 -0
- data/test/files/elfinder.png +0 -0
- data/test/files/foo/philip.txt +1 -0
- data/test/files/foo/sam.txt +1 -0
- data/test/files/foo/sandy.txt +1 -0
- data/test/files/foo/tom.txt +1 -0
- data/test/files/pjkh.png +0 -0
- data/test/test_el_finder.rb +265 -0
- data/test/test_el_finder_image_size.rb +23 -0
- data/test/test_el_finder_mime_type.rb +30 -0
- data/test/test_el_finder_pathname.rb +76 -0
- metadata +144 -0
data/.autotest
ADDED
@@ -0,0 +1,23 @@
|
|
1
|
+
# -*- ruby -*-
|
2
|
+
|
3
|
+
require 'autotest/restart'
|
4
|
+
|
5
|
+
# Autotest.add_hook :initialize do |at|
|
6
|
+
# at.extra_files << "../some/external/dependency.rb"
|
7
|
+
#
|
8
|
+
# at.libs << ":../some/external"
|
9
|
+
#
|
10
|
+
# at.add_exception 'vendor'
|
11
|
+
#
|
12
|
+
# at.add_mapping(/dependency.rb/) do |f, _|
|
13
|
+
# at.files_matching(/test_.*rb$/)
|
14
|
+
# end
|
15
|
+
#
|
16
|
+
# %w(TestA TestB).each do |klass|
|
17
|
+
# at.extra_class_map[klass] = "test/test_misc.rb"
|
18
|
+
# end
|
19
|
+
# end
|
20
|
+
|
21
|
+
# Autotest.add_hook :run_command do |at|
|
22
|
+
# system "rake build"
|
23
|
+
# end
|
data/History.txt
ADDED
@@ -0,0 +1,19 @@
|
|
1
|
+
CHANGELOG
|
2
|
+
|
3
|
+
2010-10-15 Philip Hallstrom
|
4
|
+
|
5
|
+
* update manifest
|
6
|
+
* test each of the connector methods
|
7
|
+
* use base64 encode/decode for hash to get around javascript unfriendly characters
|
8
|
+
* add image size/resize handling
|
9
|
+
* almost functionally complete
|
10
|
+
* migrate over alpha code from past project
|
11
|
+
|
12
|
+
2010-10-14 Philip Hallstrom
|
13
|
+
|
14
|
+
* begin work on connector
|
15
|
+
* enforce that all pathnames reside beneath the root
|
16
|
+
* initial library and tests for mime_type/pathname
|
17
|
+
* bin/elfinder not necessary
|
18
|
+
* Initial commit
|
19
|
+
|
data/Manifest.txt
ADDED
@@ -0,0 +1,22 @@
|
|
1
|
+
.autotest
|
2
|
+
History.txt
|
3
|
+
Manifest.txt
|
4
|
+
README.txt
|
5
|
+
Rakefile
|
6
|
+
lib/el_finder.rb
|
7
|
+
lib/el_finder/connector.rb
|
8
|
+
lib/el_finder/image_resize.rb
|
9
|
+
lib/el_finder/image_size.rb
|
10
|
+
lib/el_finder/mime_type.rb
|
11
|
+
lib/el_finder/pathname.rb
|
12
|
+
test/files/README.txt
|
13
|
+
test/files/elfinder.png
|
14
|
+
test/files/foo/philip.txt
|
15
|
+
test/files/foo/sam.txt
|
16
|
+
test/files/foo/sandy.txt
|
17
|
+
test/files/foo/tom.txt
|
18
|
+
test/files/pjkh.png
|
19
|
+
test/test_el_finder.rb
|
20
|
+
test/test_el_finder_image_size.rb
|
21
|
+
test/test_el_finder_mime_type.rb
|
22
|
+
test/test_el_finder_pathname.rb
|
data/README.txt
ADDED
@@ -0,0 +1,98 @@
|
|
1
|
+
== el_finder
|
2
|
+
|
3
|
+
* http://elrte.org/redmine/projects/elfinder
|
4
|
+
|
5
|
+
== Description:
|
6
|
+
|
7
|
+
Ruby library to provide server side functionality for elFinder. elFinder is an
|
8
|
+
open-source file manager for web, written in JavaScript using jQuery UI.
|
9
|
+
|
10
|
+
== Features/Problems:
|
11
|
+
|
12
|
+
* Does not yet support archive/extraction.
|
13
|
+
* Does not yet support thumbnail generation.
|
14
|
+
|
15
|
+
== Todo:
|
16
|
+
|
17
|
+
* Add support for archive/extraction.
|
18
|
+
* Add support for thumbnail generation.
|
19
|
+
* Document library.
|
20
|
+
* Document how to implement custom image size/resize methods.
|
21
|
+
|
22
|
+
== Requirements:
|
23
|
+
|
24
|
+
The gem, by default, relies upon the 'imagesize' ruby gem and ImageMagick's 'mogrify' command.
|
25
|
+
These requirements can be changed by implementing custom methods for determining image size
|
26
|
+
and resizing of an image.
|
27
|
+
|
28
|
+
== Install:
|
29
|
+
|
30
|
+
* Install elFinder (http://elrte.org/redmine/projects/elfinder/wiki/Install_EN)
|
31
|
+
* Install ImageMagick (http://www.imagemagick.org/)
|
32
|
+
* Do whatever is necessary for your Ruby framework to tie it together.
|
33
|
+
|
34
|
+
=== Rails 3
|
35
|
+
|
36
|
+
* Add "gem 'el_finder'" to Gemfile
|
37
|
+
* % bundle install
|
38
|
+
* Switch to using jQuery instead of Prototype
|
39
|
+
* Add the following action to a controller of your choosing.
|
40
|
+
|
41
|
+
skip_before_filter :verify_authenticity_token, :only => ['elfinder']
|
42
|
+
def elfinder
|
43
|
+
h, r = ElFinder::Connector.new(
|
44
|
+
:root => File.join(Rails.public_path, 'system', 'elfinder'),
|
45
|
+
:url => '/system/elfinder'
|
46
|
+
).run(params)
|
47
|
+
headers.merge!(h)
|
48
|
+
render (r.empty? ? {:nothing => true} : {:text => r.to_json}), :layout => false
|
49
|
+
end
|
50
|
+
|
51
|
+
* Add the appropriate route to config/routes.rb such as:
|
52
|
+
|
53
|
+
match 'elfinder' => 'home#elfinder'
|
54
|
+
|
55
|
+
* Add the following to your layout. The paths may be different depending
|
56
|
+
on where you installed the various js/css files.
|
57
|
+
|
58
|
+
<%= stylesheet_link_tag 'jquery-ui/base/jquery.ui.all', 'elfinder' %>
|
59
|
+
<%= javascript_include_tag :defaults, 'elfinder/elfinder.min' %>
|
60
|
+
|
61
|
+
* Add the following to the view that will display elFinder:
|
62
|
+
|
63
|
+
<%= javascript_tag do %>
|
64
|
+
$().ready(function() {
|
65
|
+
$('#elfinder').elfinder({
|
66
|
+
url: '/elfinder',
|
67
|
+
lang: 'en'
|
68
|
+
})
|
69
|
+
})
|
70
|
+
<% end %>
|
71
|
+
<div id='elfinder'></div>
|
72
|
+
|
73
|
+
* That's it. I think. If not, check out the example rails application at http://github.com/phallstrom/el_finder-rails-example.
|
74
|
+
|
75
|
+
== License:
|
76
|
+
|
77
|
+
(The MIT License)
|
78
|
+
|
79
|
+
Copyright (c) 2010 Philip Hallstrom
|
80
|
+
|
81
|
+
Permission is hereby granted, free of charge, to any person obtaining
|
82
|
+
a copy of this software and associated documentation files (the
|
83
|
+
'Software'), to deal in the Software without restriction, including
|
84
|
+
without limitation the rights to use, copy, modify, merge, publish,
|
85
|
+
distribute, sublicense, and/or sell copies of the Software, and to
|
86
|
+
permit persons to whom the Software is furnished to do so, subject to
|
87
|
+
the following conditions:
|
88
|
+
|
89
|
+
The above copyright notice and this permission notice shall be
|
90
|
+
included in all copies or substantial portions of the Software.
|
91
|
+
|
92
|
+
THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,
|
93
|
+
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
94
|
+
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
|
95
|
+
IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
|
96
|
+
CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
|
97
|
+
TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
|
98
|
+
SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
data/Rakefile
ADDED
data/lib/el_finder.rb
ADDED
@@ -0,0 +1,342 @@
|
|
1
|
+
require 'base64'
|
2
|
+
|
3
|
+
module ElFinder
|
4
|
+
class Connector
|
5
|
+
|
6
|
+
VALID_COMMANDS = %w[archive duplicate edit extract mkdir mkfile open paste ping read rename resize rm tmb upload]
|
7
|
+
|
8
|
+
DEFAULT_OPTIONS = {
|
9
|
+
:mime_handler => ElFinder::MimeType,
|
10
|
+
:image_size_handler => ElFinder::ImageSize,
|
11
|
+
:image_resize_handler => ElFinder::ImageResize,
|
12
|
+
:original_filename_method => lambda {|file| file.original_filename},
|
13
|
+
:disabled_commands => [],
|
14
|
+
:show_dot_files => true,
|
15
|
+
:upload_max_size => '50M',
|
16
|
+
:archivers => [],
|
17
|
+
:extractors => [],
|
18
|
+
:home => 'Home',
|
19
|
+
}
|
20
|
+
|
21
|
+
#
|
22
|
+
def initialize(options = {})
|
23
|
+
@options = DEFAULT_OPTIONS.merge(options)
|
24
|
+
|
25
|
+
raise(RuntimeError, "Missing required :url option") unless @options.key?(:url)
|
26
|
+
raise(RuntimeError, "Missing required :root option") unless @options.key?(:root)
|
27
|
+
|
28
|
+
@mime_handler = @options.delete(:mime_handler)
|
29
|
+
raise(RuntimeError, "Mime Handler is invalid") unless @mime_handler.respond_to?(:for)
|
30
|
+
|
31
|
+
@image_size_handler = @options.delete(:image_size_handler)
|
32
|
+
raise(RuntimeError, "Image Size Handler is invalid") unless @image_size_handler.nil? || @image_size_handler.respond_to?(:for)
|
33
|
+
|
34
|
+
@image_resize_handler = @options.delete(:image_resize_handler)
|
35
|
+
raise(RuntimeError, "Image Resize Handler is invalid") unless @image_resize_handler.nil? || @image_resize_handler.respond_to?(:resize)
|
36
|
+
|
37
|
+
@root = ElFinder::Pathname.new(options[:root])
|
38
|
+
|
39
|
+
@headers = {}
|
40
|
+
@response = {}
|
41
|
+
end # of initialize
|
42
|
+
|
43
|
+
#
|
44
|
+
def run(params = {})
|
45
|
+
@params = params.dup
|
46
|
+
|
47
|
+
if VALID_COMMANDS.include?(@params[:cmd])
|
48
|
+
|
49
|
+
@current = @params[:current] ? from_hash(@params[:current]) : nil
|
50
|
+
@target = @params[:target] ? from_hash(@params[:target]) : nil
|
51
|
+
if params[:targets]
|
52
|
+
@targets = @params[:targets].map{|t| from_hash(t)}
|
53
|
+
end
|
54
|
+
|
55
|
+
send("_#{@params[:cmd]}")
|
56
|
+
else
|
57
|
+
invalid_request
|
58
|
+
end
|
59
|
+
|
60
|
+
return @headers, @response
|
61
|
+
end # of run
|
62
|
+
|
63
|
+
#
|
64
|
+
def to_hash(pathname)
|
65
|
+
Base64.encode64(pathname == @root ? '/' : pathname.relative_path_from(@root).to_s).chomp
|
66
|
+
end # of to_hash
|
67
|
+
|
68
|
+
#
|
69
|
+
def from_hash(hash)
|
70
|
+
pathname = ElFinder::Pathname.new_with_root(@root, Base64.decode64(hash))
|
71
|
+
end # of from_hash
|
72
|
+
|
73
|
+
################################################################################
|
74
|
+
protected
|
75
|
+
|
76
|
+
#
|
77
|
+
def _open(target = nil)
|
78
|
+
target ||= @target
|
79
|
+
|
80
|
+
if target.nil?
|
81
|
+
_open(@root)
|
82
|
+
elsif target.file?
|
83
|
+
command_not_implemented
|
84
|
+
elsif target.directory?
|
85
|
+
@response[:cwd] = cwd_for(target)
|
86
|
+
@response[:cdc] = target.children.map{|e| cdc_for(e)}
|
87
|
+
|
88
|
+
if @params[:tree]
|
89
|
+
@response[:tree] = {
|
90
|
+
:name => @options[:home],
|
91
|
+
:hash => to_hash(@root),
|
92
|
+
:read => @root.readable?,
|
93
|
+
:write => @root.writable?,
|
94
|
+
:dirs => tree_for(@root)
|
95
|
+
}
|
96
|
+
end
|
97
|
+
|
98
|
+
if @params[:init]
|
99
|
+
@response[:disabled] = @options[:disabled_commands]
|
100
|
+
@response[:params] = {
|
101
|
+
:dotFiles => @options[:show_dot_files],
|
102
|
+
:uplMaxSize => @options[:upload_max_size],
|
103
|
+
:archives => @options[:archivers],
|
104
|
+
:extract => @options[:extractors],
|
105
|
+
:url => @options[:url]
|
106
|
+
}
|
107
|
+
end
|
108
|
+
|
109
|
+
# FIXME - add 'tmb:true' when necessary
|
110
|
+
|
111
|
+
else
|
112
|
+
@response[:error] = "Directory does not exist"
|
113
|
+
_open(@root)
|
114
|
+
end
|
115
|
+
|
116
|
+
end # of open
|
117
|
+
|
118
|
+
#
|
119
|
+
def _mkdir
|
120
|
+
dir = @current + @params[:name]
|
121
|
+
if !dir.exist? && dir.mkdir
|
122
|
+
@params[:tree] = true
|
123
|
+
@response[:select] = [to_hash(dir)]
|
124
|
+
_open(@current)
|
125
|
+
else
|
126
|
+
@response[:error] = "Unable to create folder"
|
127
|
+
end
|
128
|
+
end # of mkdir
|
129
|
+
|
130
|
+
#
|
131
|
+
def _mkfile
|
132
|
+
file = @current + @params[:name]
|
133
|
+
if !file.exist? && FileUtils.touch(file)
|
134
|
+
@response[:select] = [to_hash(file)]
|
135
|
+
_open(@current)
|
136
|
+
else
|
137
|
+
@response[:error] = "Unable to create file"
|
138
|
+
end
|
139
|
+
end # of mkfile
|
140
|
+
|
141
|
+
#
|
142
|
+
def _rename
|
143
|
+
to = @current + @params[:name]
|
144
|
+
if to.exist?
|
145
|
+
@response[:error] = "Unable to rename #{@target.ftype}. '#{to.basename}' already exists"
|
146
|
+
elsif @target.rename(to)
|
147
|
+
@params[:tree] = to.directory?
|
148
|
+
@response[:select] = [to_hash(to)]
|
149
|
+
_open(@current)
|
150
|
+
else
|
151
|
+
@response[:error] = "Unable to rename #{@target.ftype}"
|
152
|
+
end
|
153
|
+
end # of rename
|
154
|
+
|
155
|
+
#
|
156
|
+
def _upload
|
157
|
+
select = []
|
158
|
+
@params[:upload].to_a.each do |file|
|
159
|
+
dst = @current + @options[:original_filename_method].call(file)
|
160
|
+
File.rename(file.path, dst)
|
161
|
+
select << to_hash(dst)
|
162
|
+
end
|
163
|
+
@response[:select] = select
|
164
|
+
_open(@current)
|
165
|
+
end # of upload
|
166
|
+
|
167
|
+
#
|
168
|
+
def _ping
|
169
|
+
@headers['Connection'] = 'Close'
|
170
|
+
end # of ping
|
171
|
+
|
172
|
+
#
|
173
|
+
def _paste
|
174
|
+
@targets.to_a.each do |src|
|
175
|
+
dst = from_hash(@params[:dst]) + src.basename
|
176
|
+
if dst.exist?
|
177
|
+
@response[:error] = 'Some files were unable to be copied'
|
178
|
+
@response[:errorData] ||= {}
|
179
|
+
@response[:errorData][src.basename] = "already exists in '#{dst.dirname.relative_path_from(@root)}'"
|
180
|
+
else
|
181
|
+
if @params[:cut].to_i > 0
|
182
|
+
File.rename(src, dst)
|
183
|
+
else
|
184
|
+
if src.directory?
|
185
|
+
FileUtils.cp_r(src, dst)
|
186
|
+
else
|
187
|
+
FileUtils.copy(src, dst)
|
188
|
+
end
|
189
|
+
end
|
190
|
+
end
|
191
|
+
end
|
192
|
+
@params[:tree] = true
|
193
|
+
_open(@current)
|
194
|
+
end # of paste
|
195
|
+
|
196
|
+
#
|
197
|
+
def _rm
|
198
|
+
if @targets.empty?
|
199
|
+
@response[:error] = "No files were selected for removal"
|
200
|
+
else
|
201
|
+
FileUtils.rm_rf(@targets)
|
202
|
+
@params[:tree] = true
|
203
|
+
_open(@current)
|
204
|
+
end
|
205
|
+
end # of rm
|
206
|
+
|
207
|
+
#
|
208
|
+
def _duplicate
|
209
|
+
duplicate = @target.duplicate
|
210
|
+
if @target.directory?
|
211
|
+
FileUtils.cp_r(@target, duplicate)
|
212
|
+
else
|
213
|
+
FileUtils.copy(@target, duplicate)
|
214
|
+
end
|
215
|
+
@response[:select] = [to_hash(duplicate)]
|
216
|
+
_open(@current)
|
217
|
+
end # of duplicate
|
218
|
+
|
219
|
+
#
|
220
|
+
def _read
|
221
|
+
@response[:content] = @target.read
|
222
|
+
end # of read
|
223
|
+
|
224
|
+
#
|
225
|
+
def _edit
|
226
|
+
@target.open('w') { |f| f.write @params[:content] }
|
227
|
+
@response[:file] = cdc_for(@target)
|
228
|
+
end # of edit
|
229
|
+
|
230
|
+
#
|
231
|
+
def _extract
|
232
|
+
command_not_implemented
|
233
|
+
end # of extract
|
234
|
+
|
235
|
+
#
|
236
|
+
def _archive
|
237
|
+
command_not_implemented
|
238
|
+
end # of archive
|
239
|
+
|
240
|
+
#
|
241
|
+
def _tmb
|
242
|
+
command_not_implemented
|
243
|
+
end # of tmb
|
244
|
+
|
245
|
+
#
|
246
|
+
def _resize
|
247
|
+
if @image_resize_handler.nil?
|
248
|
+
command_not_implemented
|
249
|
+
else
|
250
|
+
if @target.file?
|
251
|
+
@image_resize_handler.resize(@target, :width => @params[:width].to_i, :height => @params[:height].to_i)
|
252
|
+
@response[:select] = [to_hash(@target)]
|
253
|
+
_open(@current)
|
254
|
+
else
|
255
|
+
@response[:error] = "Unable to resize file. It does not exist"
|
256
|
+
end
|
257
|
+
end
|
258
|
+
end # of resize
|
259
|
+
|
260
|
+
################################################################################
|
261
|
+
private
|
262
|
+
|
263
|
+
#
|
264
|
+
def cwd_for(pathname)
|
265
|
+
{
|
266
|
+
:name => pathname.basename.to_s,
|
267
|
+
:hash => to_hash(pathname),
|
268
|
+
:mime => 'directory',
|
269
|
+
:rel => (@options[:home] + '/' + pathname.relative_path_from(@root)),
|
270
|
+
:size => 0,
|
271
|
+
:date => pathname.mtime.to_s,
|
272
|
+
:read => pathname.readable?,
|
273
|
+
:write => pathname.writable?,
|
274
|
+
:rm => (pathname != @root && pathname.writable?),
|
275
|
+
}
|
276
|
+
end
|
277
|
+
|
278
|
+
# TODO - Implement link, linkTo, and parent
|
279
|
+
def cdc_for(pathname)
|
280
|
+
response = {
|
281
|
+
:name => pathname.basename.to_s,
|
282
|
+
:hash => to_hash(pathname),
|
283
|
+
:date => pathname.mtime.to_s,
|
284
|
+
:read => pathname.readable?,
|
285
|
+
:write => pathname.writable?,
|
286
|
+
:rm => pathname.writable?,
|
287
|
+
}
|
288
|
+
|
289
|
+
if pathname.directory?
|
290
|
+
response.merge!(
|
291
|
+
:size => 0,
|
292
|
+
:mime => 'directory'
|
293
|
+
)
|
294
|
+
elsif pathname.symlink?
|
295
|
+
response.merge!(
|
296
|
+
:link => 'FIXME',
|
297
|
+
:linkTo => 'FIXME',
|
298
|
+
:parent => 'FIXME'
|
299
|
+
)
|
300
|
+
elsif pathname.file?
|
301
|
+
response.merge!(
|
302
|
+
:size => pathname.size,
|
303
|
+
:mime => @mime_handler.for(pathname),
|
304
|
+
:url => (@options[:url] + '/' + pathname.relative_path_from(@root))
|
305
|
+
)
|
306
|
+
|
307
|
+
if response[:mime] =~ /image/ && !@image_size_handler.nil? && !@image_resize_handler.nil?
|
308
|
+
response.merge!(
|
309
|
+
:resize => true,
|
310
|
+
:dim => @image_size_handler.for(pathname)
|
311
|
+
)
|
312
|
+
end
|
313
|
+
|
314
|
+
end
|
315
|
+
|
316
|
+
return response
|
317
|
+
end
|
318
|
+
|
319
|
+
#
|
320
|
+
def tree_for(root)
|
321
|
+
root.children.select{ |child| child.directory? }.sort_by{|e| e.basename.to_s.downcase}.map { |child|
|
322
|
+
{:name => child.basename.to_s,
|
323
|
+
:hash => to_hash(child),
|
324
|
+
:read => child.readable?,
|
325
|
+
:write => child.writable?,
|
326
|
+
:dirs => tree_for(child),
|
327
|
+
}
|
328
|
+
}
|
329
|
+
end # of tree_for
|
330
|
+
|
331
|
+
#
|
332
|
+
def invalid_request
|
333
|
+
@response[:error] = "Invalid command '#{@params[:cmd]}'"
|
334
|
+
end # of invalid_request
|
335
|
+
|
336
|
+
#
|
337
|
+
def command_not_implemented
|
338
|
+
@response[:error] = "Command '#{@params[:cmd]}' not yet implemented"
|
339
|
+
end # of command_not_implemented
|
340
|
+
|
341
|
+
end # of class Connector
|
342
|
+
end # of module ElFinder
|
@@ -0,0 +1,14 @@
|
|
1
|
+
require 'shellwords'
|
2
|
+
|
3
|
+
module ElFinder
|
4
|
+
|
5
|
+
class ImageResize
|
6
|
+
|
7
|
+
def self.resize(pathname, options = {})
|
8
|
+
return nil unless File.exist?(pathname)
|
9
|
+
system( ::Shellwords.join(['mogrify', '-resize', "#{options[:width]}x#{options[:height]}!", pathname.to_s]) )
|
10
|
+
end # of self.resize
|
11
|
+
|
12
|
+
end # of class ImageSize
|
13
|
+
|
14
|
+
end # of module ElFinder
|
@@ -0,0 +1,17 @@
|
|
1
|
+
require 'rubygems'
|
2
|
+
require 'image_size'
|
3
|
+
|
4
|
+
module ElFinder
|
5
|
+
|
6
|
+
class ImageSize < ::ImageSize
|
7
|
+
|
8
|
+
def self.for(pathname)
|
9
|
+
return nil unless File.exist?(pathname)
|
10
|
+
s = new(File.open(pathname)).get_size.join('x').to_s
|
11
|
+
s = nil if s == 'x'
|
12
|
+
return s
|
13
|
+
end
|
14
|
+
|
15
|
+
end # of class ImageSize
|
16
|
+
|
17
|
+
end # of module ElFinder
|
@@ -0,0 +1,78 @@
|
|
1
|
+
module ElFinder
|
2
|
+
|
3
|
+
class MimeType
|
4
|
+
|
5
|
+
TYPES = {
|
6
|
+
'ai' => 'application/postscript',
|
7
|
+
'eps' => 'application/postscript',
|
8
|
+
'exe' => 'application/octet-stream',
|
9
|
+
'doc' => 'application/vnd.ms-word',
|
10
|
+
'xls' => 'application/vnd.ms-excel',
|
11
|
+
'ppt' => 'application/vnd.ms-powerpoint',
|
12
|
+
'pps' => 'application/vnd.ms-powerpoint',
|
13
|
+
'pdf' => 'application/pdf',
|
14
|
+
'xml' => 'application/xml',
|
15
|
+
'odt' => 'application/vnd.oasis.opendocument.text',
|
16
|
+
'swf' => 'application/x-shockwave-flash',
|
17
|
+
# archives
|
18
|
+
'gz' => 'application/x-gzip',
|
19
|
+
'tgz' => 'application/x-gzip',
|
20
|
+
'bz' => 'application/x-bzip2',
|
21
|
+
'bz2' => 'application/x-bzip2',
|
22
|
+
'tbz' => 'application/x-bzip2',
|
23
|
+
'zip' => 'application/zip',
|
24
|
+
'rar' => 'application/x-rar',
|
25
|
+
'tar' => 'application/x-tar',
|
26
|
+
'7z' => 'application/x-7z-compressed',
|
27
|
+
# texts
|
28
|
+
'txt' => 'text/plain',
|
29
|
+
'php' => 'text/x-php',
|
30
|
+
'html' => 'text/html',
|
31
|
+
'htm' => 'text/html',
|
32
|
+
'js' => 'text/javascript',
|
33
|
+
'css' => 'text/css',
|
34
|
+
'rtf' => 'text/rtf',
|
35
|
+
'rtfd' => 'text/rtfd',
|
36
|
+
'py' => 'text/x-python',
|
37
|
+
'java' => 'text/x-java-source',
|
38
|
+
'rb' => 'text/x-ruby',
|
39
|
+
'sh' => 'text/x-shellscript',
|
40
|
+
'pl' => 'text/x-perl',
|
41
|
+
'sql' => 'text/x-sql',
|
42
|
+
# images
|
43
|
+
'bmp' => 'image/x-ms-bmp',
|
44
|
+
'jpg' => 'image/jpeg',
|
45
|
+
'jpeg' => 'image/jpeg',
|
46
|
+
'gif' => 'image/gif',
|
47
|
+
'png' => 'image/png',
|
48
|
+
'tif' => 'image/tiff',
|
49
|
+
'tiff' => 'image/tiff',
|
50
|
+
'tga' => 'image/x-targa',
|
51
|
+
'psd' => 'image/vnd.adobe.photoshop',
|
52
|
+
# audio
|
53
|
+
'mp3' => 'audio/mpeg',
|
54
|
+
'mid' => 'audio/midi',
|
55
|
+
'ogg' => 'audio/ogg',
|
56
|
+
'mp4a' => 'audio/mp4',
|
57
|
+
'wav' => 'audio/wav',
|
58
|
+
'wma' => 'audio/x-ms-wma',
|
59
|
+
# video
|
60
|
+
'avi' => 'video/x-msvideo',
|
61
|
+
'dv' => 'video/x-dv',
|
62
|
+
'mp4' => 'video/mp4',
|
63
|
+
'mpeg' => 'video/mpeg',
|
64
|
+
'mpg' => 'video/mpeg',
|
65
|
+
'mov' => 'video/quicktime',
|
66
|
+
'wm' => 'video/x-ms-wmv',
|
67
|
+
'flv' => 'video/x-flv',
|
68
|
+
'mkv' => 'video/x-matroska'
|
69
|
+
}
|
70
|
+
|
71
|
+
def self.for(pathname)
|
72
|
+
pathname = ::Pathname.new(pathname) if pathname.is_a?(String)
|
73
|
+
TYPES[pathname.extname.downcase[1..-1]] || 'unknown/unknown'
|
74
|
+
end # of for
|
75
|
+
|
76
|
+
end # of class MimeType
|
77
|
+
|
78
|
+
end # of module ElFinder
|
@@ -0,0 +1,47 @@
|
|
1
|
+
require 'pathname'
|
2
|
+
|
3
|
+
module ElFinder
|
4
|
+
|
5
|
+
class Pathname < ::Pathname
|
6
|
+
|
7
|
+
#
|
8
|
+
def +(other)
|
9
|
+
self.class.new(super(other).to_s)
|
10
|
+
end
|
11
|
+
|
12
|
+
#
|
13
|
+
def join(*args)
|
14
|
+
self.class.new(super(*args).to_s)
|
15
|
+
end
|
16
|
+
|
17
|
+
#
|
18
|
+
def self.new_with_root(root, path = '')
|
19
|
+
new(superclass.new(File.join(root, path)).cleanpath.to_s)
|
20
|
+
end # of self.new_with_root
|
21
|
+
|
22
|
+
#
|
23
|
+
def duplicate
|
24
|
+
_dirname = dirname
|
25
|
+
_extname = extname
|
26
|
+
_basename = basename(_extname)
|
27
|
+
copy = 0
|
28
|
+
if _basename.to_s =~ /^(.*) copy (\d+)$/
|
29
|
+
_basename = $1
|
30
|
+
copy = $2.to_i
|
31
|
+
end
|
32
|
+
|
33
|
+
begin
|
34
|
+
copy += 1
|
35
|
+
duplicate = self.class.superclass.new(_dirname + "#{_basename} copy #{copy}#{_extname}")
|
36
|
+
end while duplicate.exist?
|
37
|
+
duplicate
|
38
|
+
end # of duplicate
|
39
|
+
|
40
|
+
#
|
41
|
+
def relative_to(pathname)
|
42
|
+
self == pathname ? '' : relative_path_from(pathname).to_s
|
43
|
+
end # of relative_to
|
44
|
+
|
45
|
+
end # of class Pathname
|
46
|
+
|
47
|
+
end # of module ElFinder
|
Binary file
|
@@ -0,0 +1 @@
|
|
1
|
+
philip
|
@@ -0,0 +1 @@
|
|
1
|
+
sam
|
@@ -0,0 +1 @@
|
|
1
|
+
sandy
|
@@ -0,0 +1 @@
|
|
1
|
+
tom
|
data/test/files/pjkh.png
ADDED
Binary file
|
@@ -0,0 +1,265 @@
|
|
1
|
+
require "test/unit"
|
2
|
+
require "el_finder"
|
3
|
+
|
4
|
+
class TestElFinder < Test::Unit::TestCase
|
5
|
+
|
6
|
+
def setup
|
7
|
+
@vroot = '/tmp/elfinder'
|
8
|
+
FileUtils.mkdir_p(@vroot)
|
9
|
+
FileUtils.cp_r "#{File.dirname(__FILE__)}/files/.", @vroot
|
10
|
+
@elfinder = ElFinder::Connector.new({
|
11
|
+
:root => @vroot,
|
12
|
+
:url => '/elfinder',
|
13
|
+
:original_filename_method => lambda {|file| File.basename(file.path)}
|
14
|
+
})
|
15
|
+
end
|
16
|
+
|
17
|
+
def teardown
|
18
|
+
FileUtils.rm_rf(@vroot)
|
19
|
+
end
|
20
|
+
|
21
|
+
################################################################################
|
22
|
+
|
23
|
+
def test_should_fail_initialization_if_required_options_not_passed
|
24
|
+
assert_raise RuntimeError do
|
25
|
+
ElFinder::Connector.new()
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
def test_should_fail_initialization_if_no_root_specified
|
30
|
+
assert_raise RuntimeError do
|
31
|
+
ElFinder::Connector.new({:url => '/elfinder'})
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
def test_should_fail_initialization_if_no_url_specified
|
36
|
+
assert_raise RuntimeError do
|
37
|
+
ElFinder::Connector.new({:root => '/tmp/elfinder'})
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
def test_should_fail_initialization_if_mime_handler_is_invalid
|
42
|
+
assert_raise RuntimeError do
|
43
|
+
ElFinder::Connector.new({:root => '/tmp/elfinder', :url => '/elfinder', :mime_handler => Object})
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
47
|
+
################################################################################
|
48
|
+
|
49
|
+
def test_should_return_two_hashes
|
50
|
+
h, r = @elfinder.run({})
|
51
|
+
assert_instance_of Hash, h
|
52
|
+
assert_instance_of Hash, r
|
53
|
+
end
|
54
|
+
|
55
|
+
|
56
|
+
def test_should_return_invalid_request_if_command_is_invalid
|
57
|
+
h, r = @elfinder.run({:cmd => 'INVALID'})
|
58
|
+
assert_not_nil r[:error]
|
59
|
+
assert_match(/invalid command/i, r[:error])
|
60
|
+
end
|
61
|
+
|
62
|
+
################################################################################
|
63
|
+
|
64
|
+
def test_to_hash_method
|
65
|
+
assert_equal Base64.encode64('foo/bar').chomp, @elfinder.to_hash(ElFinder::Pathname.new_with_root(@vroot, 'foo/bar'))
|
66
|
+
assert_equal Base64.encode64('/').chomp, @elfinder.to_hash(ElFinder::Pathname.new_with_root(@vroot))
|
67
|
+
end
|
68
|
+
|
69
|
+
def test_from_hash_method
|
70
|
+
assert_equal File.join(@vroot, 'foo/bar'), @elfinder.from_hash(Base64.encode64('foo/bar').chomp).to_s
|
71
|
+
assert_equal @vroot, @elfinder.from_hash(Base64.encode64('').chomp).to_s
|
72
|
+
end
|
73
|
+
|
74
|
+
################################################################################
|
75
|
+
|
76
|
+
def test_init_via_open
|
77
|
+
h, r = @elfinder.run(:cmd => 'open', :init => 'true', :target => '')
|
78
|
+
assert_not_nil r[:cwd]
|
79
|
+
assert_not_nil r[:cdc]
|
80
|
+
assert_not_nil r[:disabled]
|
81
|
+
assert_not_nil r[:params]
|
82
|
+
r[:cdc].each do |e|
|
83
|
+
case e[:name]
|
84
|
+
when 'foo'
|
85
|
+
assert_nil e[:dim]
|
86
|
+
assert_nil e[:resize]
|
87
|
+
assert_equal 'directory', e[:mime]
|
88
|
+
assert_equal 0, e[:size]
|
89
|
+
when 'pjkh.png'
|
90
|
+
assert_equal '100x100', e[:dim]
|
91
|
+
assert e[:resize]
|
92
|
+
assert_equal 'image/png', e[:mime]
|
93
|
+
assert_equal 1142, e[:size]
|
94
|
+
end
|
95
|
+
end
|
96
|
+
end
|
97
|
+
|
98
|
+
def test_mkdir
|
99
|
+
h, r = @elfinder.run(:cmd => 'open', :init => 'true', :target => '')
|
100
|
+
h1, r1 = @elfinder.run(:cmd => 'mkdir', :current => r[:cwd][:hash], :name => 'dir1')
|
101
|
+
assert File.directory?(File.join(@vroot, 'dir1'))
|
102
|
+
assert_not_nil r1[:select]
|
103
|
+
|
104
|
+
h1, r1 = @elfinder.run(:cmd => 'mkdir', :current => r[:cwd][:hash], :name => 'dir1')
|
105
|
+
assert_match(/unable/i, r1[:error])
|
106
|
+
|
107
|
+
h1, r1 = @elfinder.run(:cmd => 'mkdir', :current => r[:cwd][:hash], :name => 'foo')
|
108
|
+
assert_match(/unable/i, r1[:error])
|
109
|
+
end
|
110
|
+
|
111
|
+
def test_mkfile
|
112
|
+
h, r = @elfinder.run(:cmd => 'open', :init => 'true', :target => '')
|
113
|
+
h1, r1 = @elfinder.run(:cmd => 'mkfile', :current => r[:cwd][:hash], :name => 'file1')
|
114
|
+
assert File.file?(File.join(@vroot, 'file1'))
|
115
|
+
assert_not_nil r1[:select]
|
116
|
+
|
117
|
+
h1, r1 = @elfinder.run(:cmd => 'mkfile', :current => r[:cwd][:hash], :name => 'file1')
|
118
|
+
assert_match(/unable/i, r1[:error])
|
119
|
+
|
120
|
+
h1, r1 = @elfinder.run(:cmd => 'mkfile', :current => r[:cwd][:hash], :name => 'README.txt')
|
121
|
+
assert_match(/unable/i, r1[:error])
|
122
|
+
end
|
123
|
+
|
124
|
+
def test_rename_ok
|
125
|
+
h, r = @elfinder.run(:cmd => 'open', :init => 'true', :target => '')
|
126
|
+
target = r[:cdc].find{|e| e[:name] == 'README.txt'}
|
127
|
+
h1, r1 = @elfinder.run(:cmd => 'rename', :target => target[:hash], :current => r[:cwd][:hash], :name => 'file1')
|
128
|
+
assert File.file?(File.join(@vroot, 'file1'))
|
129
|
+
assert_not_nil r1[:select]
|
130
|
+
end
|
131
|
+
|
132
|
+
def test_rename_fail
|
133
|
+
h, r = @elfinder.run(:cmd => 'open', :init => 'true', :target => '')
|
134
|
+
target = r[:cdc].find{|e| e[:name] == 'README.txt'}
|
135
|
+
h1, r1 = @elfinder.run(:cmd => 'rename', :target => target[:hash], :current => r[:cwd][:hash], :name => 'foo')
|
136
|
+
assert_match(/unable.*already exists/i, r1[:error])
|
137
|
+
assert File.file?(File.join(@vroot, 'README.txt'))
|
138
|
+
assert_nil r1[:select]
|
139
|
+
end
|
140
|
+
|
141
|
+
def test_upload
|
142
|
+
h, r = @elfinder.run(:cmd => 'open', :init => 'true', :target => '')
|
143
|
+
uploads = []
|
144
|
+
uploads << File.open(File.join(@vroot, 'foo/philip.txt'))
|
145
|
+
uploads << File.open(File.join(@vroot, 'foo/sandy.txt'))
|
146
|
+
h, r = @elfinder.run(:cmd => 'upload', :upload => uploads, :current => r[:cwd][:hash])
|
147
|
+
assert File.exist?(File.join(@vroot, 'philip.txt'))
|
148
|
+
assert File.exist?(File.join(@vroot, 'sandy.txt'))
|
149
|
+
assert_not_nil r[:select]
|
150
|
+
end
|
151
|
+
|
152
|
+
def test_ping
|
153
|
+
h, r = @elfinder.run(:cmd => 'ping')
|
154
|
+
assert r.empty?
|
155
|
+
assert_equal 'Close', h['Connection']
|
156
|
+
end
|
157
|
+
|
158
|
+
def test_paste_copy
|
159
|
+
h, r = @elfinder.run(:cmd => 'open', :init => 'true', :target => '')
|
160
|
+
targets = r[:cdc].select{|e| e[:mime] != 'directory'}
|
161
|
+
dst = r[:cdc].find{|e| e[:name] == 'foo'}
|
162
|
+
|
163
|
+
h, r = @elfinder.run(:cmd => 'paste', :targets => targets.map{|e| e[:hash]}, :dst => dst[:hash])
|
164
|
+
assert_not_nil r[:tree]
|
165
|
+
assert File.exist?(File.join(@vroot, 'README.txt'))
|
166
|
+
assert File.exist?(File.join(@vroot, 'pjkh.png'))
|
167
|
+
assert File.exist?(File.join(@vroot, 'elfinder.png'))
|
168
|
+
assert File.exist?(File.join(@vroot, 'foo', 'README.txt'))
|
169
|
+
assert File.exist?(File.join(@vroot, 'foo', 'pjkh.png'))
|
170
|
+
assert File.exist?(File.join(@vroot, 'foo', 'elfinder.png'))
|
171
|
+
end
|
172
|
+
|
173
|
+
def test_paste_cut
|
174
|
+
h, r = @elfinder.run(:cmd => 'open', :init => 'true', :target => '')
|
175
|
+
targets = r[:cdc].select{|e| e[:mime] != 'directory'}
|
176
|
+
dst = r[:cdc].find{|e| e[:name] == 'foo'}
|
177
|
+
|
178
|
+
h, r = @elfinder.run(:cmd => 'paste', :targets => targets.map{|e| e[:hash]}, :dst => dst[:hash], :cut => '1')
|
179
|
+
assert_not_nil r[:tree]
|
180
|
+
assert !File.exist?(File.join(@vroot, 'README.txt'))
|
181
|
+
assert !File.exist?(File.join(@vroot, 'pjkh.png'))
|
182
|
+
assert !File.exist?(File.join(@vroot, 'elfinder.png'))
|
183
|
+
assert File.exist?(File.join(@vroot, 'foo', 'README.txt'))
|
184
|
+
assert File.exist?(File.join(@vroot, 'foo', 'pjkh.png'))
|
185
|
+
assert File.exist?(File.join(@vroot, 'foo', 'elfinder.png'))
|
186
|
+
end
|
187
|
+
|
188
|
+
def test_paste_partial_failure
|
189
|
+
h, r = @elfinder.run(:cmd => 'open', :init => 'true', :target => '')
|
190
|
+
h, r = @elfinder.run(:cmd => 'mkfile', :current => r[:cwd][:hash], :name => 'philip.txt')
|
191
|
+
h, r = @elfinder.run(:cmd => 'open', :init => 'true', :target => '')
|
192
|
+
|
193
|
+
targets = r[:cdc].select{|e| e[:mime] != 'directory'}
|
194
|
+
dst = r[:cdc].find{|e| e[:name] == 'foo'}
|
195
|
+
|
196
|
+
h, r = @elfinder.run(:cmd => 'paste', :targets => targets.map{|e| e[:hash]}, :dst => dst[:hash])
|
197
|
+
assert_not_nil r[:tree]
|
198
|
+
assert_match(/unable to be copied/i, r[:error])
|
199
|
+
assert_not_nil r[:errorData]
|
200
|
+
assert_equal 1, r[:errorData].size
|
201
|
+
assert File.exist?(File.join(@vroot, 'philip.txt'))
|
202
|
+
assert File.exist?(File.join(@vroot, 'foo', 'philip.txt'))
|
203
|
+
assert File.exist?(File.join(@vroot, 'foo', 'README.txt'))
|
204
|
+
assert File.exist?(File.join(@vroot, 'foo', 'pjkh.png'))
|
205
|
+
assert File.exist?(File.join(@vroot, 'foo', 'elfinder.png'))
|
206
|
+
end
|
207
|
+
|
208
|
+
def test_rm
|
209
|
+
h, r = @elfinder.run(:cmd => 'open', :init => 'true', :target => '')
|
210
|
+
h, r = @elfinder.run(:cmd => 'rm', :current => r[:cwd][:hash], :targets => [])
|
211
|
+
assert_match(/no files/i, r[:error])
|
212
|
+
|
213
|
+
h, r = @elfinder.run(:cmd => 'rm', :targets => r[:cdc].reject{|e| e[:mime] =~ /image/}.map{|e| e[:hash]})
|
214
|
+
assert !File.exist?(File.join(@vroot, 'README.txt'))
|
215
|
+
assert File.exist?(File.join(@vroot, 'pjkh.png'))
|
216
|
+
assert File.exist?(File.join(@vroot, 'elfinder.png'))
|
217
|
+
assert !File.exist?(File.join(@vroot, 'foo'))
|
218
|
+
end
|
219
|
+
|
220
|
+
def test_duplicate
|
221
|
+
h, r = @elfinder.run(:cmd => 'open', :init => 'true', :target => '')
|
222
|
+
duplicate = r[:cdc].find{|e| e[:name] == 'README.txt'}
|
223
|
+
assert File.exist?(File.join(@vroot, 'README.txt'))
|
224
|
+
h, r = @elfinder.run(:cmd => 'duplicate', :target => duplicate[:hash])
|
225
|
+
assert File.exist?(File.join(@vroot, 'README copy 1.txt'))
|
226
|
+
assert_not_nil r[:select]
|
227
|
+
h, r = @elfinder.run(:cmd => 'duplicate', :target => duplicate[:hash])
|
228
|
+
assert File.exist?(File.join(@vroot, 'README copy 2.txt'))
|
229
|
+
end
|
230
|
+
|
231
|
+
def test_read
|
232
|
+
h, r = @elfinder.run(:cmd => 'open', :init => 'true', :target => '')
|
233
|
+
file = r[:cdc].find{|e| e[:name] == 'README.txt'}
|
234
|
+
h, r = @elfinder.run(:cmd => 'read', :target => file[:hash])
|
235
|
+
assert_equal r[:content], File.read(File.join(@vroot, 'README.txt'))
|
236
|
+
end
|
237
|
+
|
238
|
+
def test_edit
|
239
|
+
h, r = @elfinder.run(:cmd => 'open', :init => 'true', :target => '')
|
240
|
+
file = r[:cdc].find{|e| e[:name] == 'README.txt'}
|
241
|
+
h, r = @elfinder.run(:cmd => 'edit', :target => file[:hash], :content => 'Hello')
|
242
|
+
assert_equal 'Hello', File.read(File.join(@vroot, 'README.txt'))
|
243
|
+
assert_not_nil r[:file]
|
244
|
+
end
|
245
|
+
|
246
|
+
def test_resize
|
247
|
+
h, r = @elfinder.run(:cmd => 'open', :init => 'true', :target => '')
|
248
|
+
file = r[:cdc].find{|e| e[:name] == 'pjkh.png'}
|
249
|
+
h, r = @elfinder.run(:cmd => 'resize', :target => file[:hash], :current => r[:cwd][:hash], :width => '50', :height => '25')
|
250
|
+
assert File.exist?(File.join(@vroot, 'pjkh.png'))
|
251
|
+
assert_equal '50x25', ElFinder::ImageSize.for(File.join(@vroot, 'pjkh.png')).to_s
|
252
|
+
end
|
253
|
+
|
254
|
+
end
|
255
|
+
|
256
|
+
__END__
|
257
|
+
/Users/philip/Desktop/el_finder/test/files
|
258
|
+
14615625 16 -rw-r--r-- 1 philip staff 7718 Oct 15 14:19 ./elfinder.png
|
259
|
+
14569851 0 drwxr-xr-x 6 philip staff 204 Oct 15 11:19 ./foo
|
260
|
+
14605469 8 -rw-r--r-- 1 philip staff 7 Oct 15 11:19 ./foo/philip.txt
|
261
|
+
14605474 8 -rw-r--r-- 1 philip staff 4 Oct 15 11:19 ./foo/sam.txt
|
262
|
+
14605479 8 -rw-r--r-- 1 philip staff 6 Oct 15 11:19 ./foo/sandy.txt
|
263
|
+
14605486 8 -rw-r--r-- 1 philip staff 4 Oct 15 11:19 ./foo/tom.txt
|
264
|
+
14569820 8 -rw-r--r-- 1 philip staff 1142 Dec 6 2007 ./pjkh.png
|
265
|
+
14605515 8 -rw-r--r-- 1 philip staff 186 Oct 15 11:20 ./README.txt
|
@@ -0,0 +1,23 @@
|
|
1
|
+
require "test/unit"
|
2
|
+
require "el_finder"
|
3
|
+
|
4
|
+
class TestElFinderImageSize < Test::Unit::TestCase
|
5
|
+
|
6
|
+
def test_that_method_exists
|
7
|
+
assert_respond_to ElFinder::ImageSize, :for
|
8
|
+
end
|
9
|
+
|
10
|
+
def test_that_logos_are_correct_size
|
11
|
+
assert_equal '70x66', ElFinder::ImageSize.for( File.join(File.dirname(__FILE__), 'files/elfinder.png') )
|
12
|
+
assert_equal '100x100', ElFinder::ImageSize.for( File.join(File.dirname(__FILE__), 'files/pjkh.png') )
|
13
|
+
end
|
14
|
+
|
15
|
+
def test_that_nil_is_returned_on_non_images
|
16
|
+
assert_equal nil, ElFinder::ImageSize.for( File.join(File.dirname(__FILE__), 'files/README.txt') )
|
17
|
+
end
|
18
|
+
|
19
|
+
def test_that_nil_is_returned_on_nonexistint_files
|
20
|
+
assert_equal nil, ElFinder::ImageSize.for( File.join(File.dirname(__FILE__), 'files/NON_EXIST') )
|
21
|
+
end
|
22
|
+
|
23
|
+
end
|
@@ -0,0 +1,30 @@
|
|
1
|
+
require "test/unit"
|
2
|
+
require "el_finder"
|
3
|
+
|
4
|
+
class TestElFinderMimeType < Test::Unit::TestCase
|
5
|
+
|
6
|
+
def test_that_method_exists
|
7
|
+
assert_respond_to ElFinder::MimeType, :for
|
8
|
+
end
|
9
|
+
|
10
|
+
def test_known_mime_types
|
11
|
+
assert_equal 'image/jpeg', ElFinder::MimeType.for('image.jpg')
|
12
|
+
end
|
13
|
+
|
14
|
+
def test_unknown_mime_types
|
15
|
+
assert_equal 'unknown/unknown', ElFinder::MimeType.for('image.foo')
|
16
|
+
end
|
17
|
+
|
18
|
+
def test_uppercase_extensions
|
19
|
+
assert_equal 'image/jpeg', ElFinder::MimeType.for('image.JPG')
|
20
|
+
end
|
21
|
+
|
22
|
+
def test_missing_extension
|
23
|
+
assert_equal 'unknown/unknown', ElFinder::MimeType.for('README')
|
24
|
+
end
|
25
|
+
|
26
|
+
def test_passing_pathname
|
27
|
+
assert_equal 'text/plain', ElFinder::MimeType.for(ElFinder::Pathname.new('README.txt'))
|
28
|
+
end
|
29
|
+
|
30
|
+
end
|
@@ -0,0 +1,76 @@
|
|
1
|
+
require "test/unit"
|
2
|
+
require "el_finder"
|
3
|
+
require "fileutils"
|
4
|
+
|
5
|
+
class TestElFinderPathname < Test::Unit::TestCase
|
6
|
+
|
7
|
+
def setup
|
8
|
+
@vroot = '/tmp/elfinder'
|
9
|
+
FileUtils.mkdir_p(@vroot)
|
10
|
+
FileUtils.cp_r "#{File.dirname(__FILE__)}/files/.", @vroot
|
11
|
+
end
|
12
|
+
|
13
|
+
def teardown
|
14
|
+
FileUtils.rm_rf(@vroot)
|
15
|
+
end
|
16
|
+
|
17
|
+
################################################################################
|
18
|
+
|
19
|
+
def test_paths_are_always_clean
|
20
|
+
assert_equal File.join(@vroot, 'foo/bar'), ElFinder::Pathname.new_with_root(@vroot, File.join('foo', '..', 'foo', 'bar')).to_s
|
21
|
+
assert_equal @vroot, ElFinder::Pathname.new_with_root(@vroot, '').to_s
|
22
|
+
assert_equal File.join(@vroot, 'foo/bar'), ElFinder::Pathname.new_with_root(@vroot, File.join('/foo', 'bar')).to_s
|
23
|
+
end
|
24
|
+
|
25
|
+
def test_duplication_without_extension
|
26
|
+
assert_equal File.join(@vroot, 'README copy 1'), ElFinder::Pathname.new_with_root(@vroot,'README').duplicate.to_s
|
27
|
+
end
|
28
|
+
|
29
|
+
def test_2nd_duplication_without_extension
|
30
|
+
::FileUtils.touch(File.join(@vroot, 'README copy 1'))
|
31
|
+
assert_equal File.join(@vroot, 'README copy 2'), ElFinder::Pathname.new_with_root(@vroot,'README').duplicate.to_s
|
32
|
+
end
|
33
|
+
|
34
|
+
def test_duplication_with_extension
|
35
|
+
assert_equal File.join(@vroot, 'README copy 1.txt'), ElFinder::Pathname.new_with_root(@vroot,'README.txt').duplicate.to_s
|
36
|
+
end
|
37
|
+
|
38
|
+
def test_2nd_duplication_with_extension
|
39
|
+
::FileUtils.touch(File.join(@vroot, 'README copy 1.txt'))
|
40
|
+
assert_equal File.join(@vroot, 'README copy 2.txt'), ElFinder::Pathname.new_with_root(@vroot,'README.txt').duplicate.to_s
|
41
|
+
end
|
42
|
+
|
43
|
+
def test_duplication_of_duplication_lookalike
|
44
|
+
assert_equal File.join(@vroot, 'README copy A copy 1.txt'), ElFinder::Pathname.new_with_root(@vroot,'README copy A.txt').duplicate.to_s
|
45
|
+
end
|
46
|
+
|
47
|
+
def test_duplication_of_duplication_lookalike2
|
48
|
+
assert_equal File.join(@vroot, 'README copy copy 1.txt'), ElFinder::Pathname.new_with_root(@vroot,'README copy.txt').duplicate.to_s
|
49
|
+
end
|
50
|
+
|
51
|
+
def test_on_disk_duplication
|
52
|
+
file = ElFinder::Pathname.new_with_root(@vroot, 'README.txt')
|
53
|
+
FileUtils.touch(file)
|
54
|
+
assert_equal true, File.exist?(File.join(@vroot, 'README.txt'))
|
55
|
+
duplicate = file.duplicate
|
56
|
+
FileUtils.touch(duplicate)
|
57
|
+
assert_equal true, File.exist?(File.join(@vroot, 'README copy 1.txt'))
|
58
|
+
end
|
59
|
+
|
60
|
+
################################################################################
|
61
|
+
|
62
|
+
def test_relative_to_method
|
63
|
+
assert_equal "", ElFinder::Pathname.new_with_root(@vroot).relative_to(::Pathname.new(@vroot)).to_s
|
64
|
+
assert_equal "foo.txt", ElFinder::Pathname.new_with_root(@vroot, 'foo.txt').relative_to(::Pathname.new(@vroot)).to_s
|
65
|
+
assert_equal "foo/bar.txt", ElFinder::Pathname.new_with_root(@vroot, 'foo/bar.txt').relative_to(::Pathname.new(@vroot)).to_s
|
66
|
+
end
|
67
|
+
|
68
|
+
################################################################################
|
69
|
+
|
70
|
+
def test_class_type
|
71
|
+
assert_kind_of ElFinder::Pathname, ElFinder::Pathname.new_with_root(@vroot, 'foo')
|
72
|
+
assert_kind_of ElFinder::Pathname, ElFinder::Pathname.new_with_root(@vroot, 'foo') + 'bar'
|
73
|
+
assert_kind_of ElFinder::Pathname, ElFinder::Pathname.new_with_root(@vroot, 'foo').join('bar')
|
74
|
+
end
|
75
|
+
|
76
|
+
end
|
metadata
ADDED
@@ -0,0 +1,144 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: el_finder
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
hash: 23
|
5
|
+
prerelease: false
|
6
|
+
segments:
|
7
|
+
- 1
|
8
|
+
- 0
|
9
|
+
- 0
|
10
|
+
version: 1.0.0
|
11
|
+
platform: ruby
|
12
|
+
authors:
|
13
|
+
- Philip Hallstrom
|
14
|
+
autorequire:
|
15
|
+
bindir: bin
|
16
|
+
cert_chain: []
|
17
|
+
|
18
|
+
date: 2010-10-15 00:00:00 -07:00
|
19
|
+
default_executable:
|
20
|
+
dependencies:
|
21
|
+
- !ruby/object:Gem::Dependency
|
22
|
+
name: imagesize
|
23
|
+
prerelease: false
|
24
|
+
requirement: &id001 !ruby/object:Gem::Requirement
|
25
|
+
none: false
|
26
|
+
requirements:
|
27
|
+
- - ">="
|
28
|
+
- !ruby/object:Gem::Version
|
29
|
+
hash: 25
|
30
|
+
segments:
|
31
|
+
- 0
|
32
|
+
- 1
|
33
|
+
- 1
|
34
|
+
version: 0.1.1
|
35
|
+
type: :runtime
|
36
|
+
version_requirements: *id001
|
37
|
+
- !ruby/object:Gem::Dependency
|
38
|
+
name: rubyforge
|
39
|
+
prerelease: false
|
40
|
+
requirement: &id002 !ruby/object:Gem::Requirement
|
41
|
+
none: false
|
42
|
+
requirements:
|
43
|
+
- - ">="
|
44
|
+
- !ruby/object:Gem::Version
|
45
|
+
hash: 7
|
46
|
+
segments:
|
47
|
+
- 2
|
48
|
+
- 0
|
49
|
+
- 4
|
50
|
+
version: 2.0.4
|
51
|
+
type: :development
|
52
|
+
version_requirements: *id002
|
53
|
+
- !ruby/object:Gem::Dependency
|
54
|
+
name: hoe
|
55
|
+
prerelease: false
|
56
|
+
requirement: &id003 !ruby/object:Gem::Requirement
|
57
|
+
none: false
|
58
|
+
requirements:
|
59
|
+
- - ">="
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
hash: 19
|
62
|
+
segments:
|
63
|
+
- 2
|
64
|
+
- 6
|
65
|
+
- 2
|
66
|
+
version: 2.6.2
|
67
|
+
type: :development
|
68
|
+
version_requirements: *id003
|
69
|
+
description: |-
|
70
|
+
Ruby library to provide server side functionality for elFinder. elFinder is an
|
71
|
+
open-source file manager for web, written in JavaScript using jQuery UI.
|
72
|
+
email:
|
73
|
+
- philip@pjkh.com
|
74
|
+
executables: []
|
75
|
+
|
76
|
+
extensions: []
|
77
|
+
|
78
|
+
extra_rdoc_files:
|
79
|
+
- History.txt
|
80
|
+
- Manifest.txt
|
81
|
+
- README.txt
|
82
|
+
files:
|
83
|
+
- .autotest
|
84
|
+
- History.txt
|
85
|
+
- Manifest.txt
|
86
|
+
- README.txt
|
87
|
+
- Rakefile
|
88
|
+
- lib/el_finder.rb
|
89
|
+
- lib/el_finder/connector.rb
|
90
|
+
- lib/el_finder/image_resize.rb
|
91
|
+
- lib/el_finder/image_size.rb
|
92
|
+
- lib/el_finder/mime_type.rb
|
93
|
+
- lib/el_finder/pathname.rb
|
94
|
+
- test/files/README.txt
|
95
|
+
- test/files/elfinder.png
|
96
|
+
- test/files/foo/philip.txt
|
97
|
+
- test/files/foo/sam.txt
|
98
|
+
- test/files/foo/sandy.txt
|
99
|
+
- test/files/foo/tom.txt
|
100
|
+
- test/files/pjkh.png
|
101
|
+
- test/test_el_finder.rb
|
102
|
+
- test/test_el_finder_image_size.rb
|
103
|
+
- test/test_el_finder_mime_type.rb
|
104
|
+
- test/test_el_finder_pathname.rb
|
105
|
+
has_rdoc: true
|
106
|
+
homepage: http://elrte.org/redmine/projects/elfinder
|
107
|
+
licenses: []
|
108
|
+
|
109
|
+
post_install_message:
|
110
|
+
rdoc_options:
|
111
|
+
- --main
|
112
|
+
- README.txt
|
113
|
+
require_paths:
|
114
|
+
- lib
|
115
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
116
|
+
none: false
|
117
|
+
requirements:
|
118
|
+
- - ">="
|
119
|
+
- !ruby/object:Gem::Version
|
120
|
+
hash: 3
|
121
|
+
segments:
|
122
|
+
- 0
|
123
|
+
version: "0"
|
124
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
125
|
+
none: false
|
126
|
+
requirements:
|
127
|
+
- - ">="
|
128
|
+
- !ruby/object:Gem::Version
|
129
|
+
hash: 3
|
130
|
+
segments:
|
131
|
+
- 0
|
132
|
+
version: "0"
|
133
|
+
requirements: []
|
134
|
+
|
135
|
+
rubyforge_project: el_finder
|
136
|
+
rubygems_version: 1.3.7
|
137
|
+
signing_key:
|
138
|
+
specification_version: 3
|
139
|
+
summary: Ruby library to provide server side functionality for elFinder
|
140
|
+
test_files:
|
141
|
+
- test/test_el_finder.rb
|
142
|
+
- test/test_el_finder_image_size.rb
|
143
|
+
- test/test_el_finder_mime_type.rb
|
144
|
+
- test/test_el_finder_pathname.rb
|