ferver 1.2.1 → 1.3.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.
- checksums.yaml +4 -4
- data/.ruby-version +1 -1
- data/.travis.yml +4 -1
- data/CHANGELOG.md +17 -1
- data/README.md +15 -11
- data/Rakefile +4 -23
- data/bin/ferver +6 -1
- data/lib/ferver.rb +11 -10
- data/lib/ferver/configuration.rb +8 -1
- data/lib/ferver/controller.rb +22 -13
- data/lib/ferver/directory_not_found_error.rb +1 -2
- data/lib/ferver/file_id_request.rb +5 -10
- data/lib/ferver/file_list.rb +14 -24
- data/lib/ferver/found_file.rb +16 -0
- data/lib/ferver/version.rb +1 -1
- data/lib/ferver/views/index.erb +3 -3
- data/spec/configuration_spec.rb +17 -2
- data/spec/ferver_spec.rb +12 -6
- data/spec/file_list_spec.rb +21 -29
- data/spec/spec_helper.rb +1 -0
- metadata +4 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 53cab51e0ed1cb913ac92f9a19e927f9287115c4
|
4
|
+
data.tar.gz: 2be0b531e9d3b69bca13fbda397f84851fcbc414
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 0768729a9b85bb19183db20980214eeb22499d62a0fe23739dee08d9b635ff0eda80b937d09ee8e8801dadcefc041e1c07fbd7d3ff4087603af1e8f4d504aa43
|
7
|
+
data.tar.gz: 23c93f96598a6397cdc0e073acb16f58bd3da509be09a806638895d256c3d81b742e219822de5aa2897156906996b3ea768ed52af8fe6708c01c83528f69c50f
|
data/.ruby-version
CHANGED
@@ -1 +1 @@
|
|
1
|
-
2.
|
1
|
+
2.2.0
|
data/.travis.yml
CHANGED
@@ -1,10 +1,13 @@
|
|
1
1
|
language: ruby
|
2
|
+
sudo: false
|
2
3
|
rvm:
|
3
4
|
- 1.9.3
|
4
5
|
- 2.0.0
|
5
6
|
- 2.1.0
|
7
|
+
- 2.2.0
|
6
8
|
- ruby-head
|
7
9
|
|
8
10
|
addons:
|
9
11
|
code_climate:
|
10
|
-
repo_token: aaa2bcd71ac641474a13caabe294beeb26abcc7c4dd82f3395a7b9193bb20d02
|
12
|
+
repo_token: aaa2bcd71ac641474a13caabe294beeb26abcc7c4dd82f3395a7b9193bb20d02
|
13
|
+
|
data/CHANGELOG.md
CHANGED
@@ -1,7 +1,23 @@
|
|
1
1
|
# Changelog
|
2
2
|
All notable changes to this project will be documented in this file.
|
3
3
|
|
4
|
-
## 1.
|
4
|
+
## 1.3.0 - 2015-10-24 - TBC
|
5
|
+
|
6
|
+
### Added
|
7
|
+
* Don't serve hidden files by default
|
8
|
+
* New `--all` option to serve hidden files
|
9
|
+
* Sort files listed alphabetically
|
10
|
+
|
11
|
+
### Deprecated
|
12
|
+
- Nothing.
|
13
|
+
|
14
|
+
### Removed
|
15
|
+
- Nothing.
|
16
|
+
|
17
|
+
### Fixed
|
18
|
+
- Don't serve empty files
|
19
|
+
|
20
|
+
## 1.2.1 - 2014-11-15 - de54826
|
5
21
|
|
6
22
|
### Added
|
7
23
|
|
data/README.md
CHANGED
@@ -17,6 +17,7 @@ Here's the spec for **ferver**:
|
|
17
17
|
* available over http
|
18
18
|
* provide a list of files as html and json
|
19
19
|
* ignore directories
|
20
|
+
* ignore dotfiles - turn off with setting
|
20
21
|
* serve files as individual files
|
21
22
|
* minimal config
|
22
23
|
* able to specify the directory to serve files from
|
@@ -41,15 +42,25 @@ $ ferver
|
|
41
42
|
|
42
43
|
##### Use a specific directory
|
43
44
|
|
44
|
-
For exmple, to serve files from **/Users/rob/Projects/ferver/** directory pass the path in as below
|
45
|
+
For exmple, to serve files from **/Users/rob/Projects/ferver/** directory pass the path in as below using the `--directory` option.
|
45
46
|
|
46
47
|
```bash
|
47
48
|
$ ferver -d /Users/rob/Projects/ferver/
|
48
49
|
````
|
49
50
|
|
51
|
+
##### Serve all files
|
52
|
+
|
53
|
+
By default, dotfiles will be hidden. Use the `--all` option to serve all files.
|
54
|
+
|
55
|
+
```bash
|
56
|
+
$ ferver -a
|
57
|
+
````
|
58
|
+
|
59
|
+
> Note that zero size files will always be hidden.
|
60
|
+
|
50
61
|
##### Command line help
|
51
62
|
|
52
|
-
For a list of arguments just use the
|
63
|
+
For a list of arguments just use the `--help` switch.
|
53
64
|
|
54
65
|
```bash
|
55
66
|
$ ferver -h
|
@@ -67,7 +78,7 @@ List available files in your browser.
|
|
67
78
|
|
68
79
|
#### JSON
|
69
80
|
|
70
|
-
Requesting content-type `json`, for
|
81
|
+
Requesting content-type `json`, for example passing the header `Accept: application/json` will return the list of files as json.
|
71
82
|
|
72
83
|
```bash
|
73
84
|
curl -i -H "Accept: application/json" http://localhost:4567/files
|
@@ -83,15 +94,8 @@ For example to download file appearing third in the list displayed earlier, requ
|
|
83
94
|
|
84
95
|
Please use the GitHub pull-request mechanism to submit contributions.
|
85
96
|
|
86
|
-
After cloning the repo, you can run the web application without having to install the gem package by
|
87
|
-
|
88
|
-
```bash
|
89
|
-
$ rake s
|
97
|
+
After cloning the repo, you can run the web application without having to publish and then install the gem package by calling the executable as per normal.
|
90
98
|
|
91
|
-
# or
|
92
|
-
|
93
|
-
$ rake s /path/to/dir
|
94
|
-
```
|
95
99
|
|
96
100
|
### License
|
97
101
|
|
data/Rakefile
CHANGED
@@ -1,27 +1,8 @@
|
|
1
|
-
require
|
2
|
-
require
|
3
|
-
require
|
1
|
+
require "bundler/gem_tasks"
|
2
|
+
require "rspec/core"
|
3
|
+
require "rspec/core/rake_task"
|
4
4
|
|
5
|
-
task :
|
6
|
-
task :s => :server
|
5
|
+
task default: :spec
|
7
6
|
|
8
7
|
desc "Run all specs in spec directory (excluding plugin specs)"
|
9
8
|
RSpec::Core::RakeTask.new(:spec)
|
10
|
-
|
11
|
-
desc 'Run ferver locally from source'
|
12
|
-
task :server do
|
13
|
-
require 'rubygems'
|
14
|
-
require 'bundler'
|
15
|
-
Bundler.setup
|
16
|
-
require 'ferver'
|
17
|
-
|
18
|
-
# use the last argument (first is the rake task) as the file path to serve from
|
19
|
-
ferver_path = (ARGV.length == 2 && ARGV.last) || nil
|
20
|
-
Ferver.configure do |config|
|
21
|
-
config.directory_path = ferver_path
|
22
|
-
end
|
23
|
-
Ferver::App.set :raise_errors, false
|
24
|
-
|
25
|
-
# run!
|
26
|
-
Ferver::App.run!
|
27
|
-
end
|
data/bin/ferver
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
#!/usr/bin/env ruby
|
2
2
|
|
3
3
|
require 'optparse'
|
4
|
-
|
4
|
+
$:.unshift File.join( File.dirname(__FILE__), "/../lib")
|
5
5
|
require 'ferver'
|
6
6
|
|
7
7
|
options = {}
|
@@ -9,6 +9,10 @@ OptionParser.new do |opts|
|
|
9
9
|
opts.banner = 'Ferver: A simple web app to serve files over HTTP. Version: ' + Ferver::VERSION
|
10
10
|
opts.separator ''
|
11
11
|
|
12
|
+
opts.on('-a', '--all', 'Serve hidden files') do |a|
|
13
|
+
options[:hidden] = a
|
14
|
+
end
|
15
|
+
|
12
16
|
opts.on('-d', '--directory [DIRECTORY]', 'Specify the path to the directory to serve files from [optional]') do |directory|
|
13
17
|
options[:directory] = directory
|
14
18
|
end
|
@@ -20,6 +24,7 @@ OptionParser.new do |opts|
|
|
20
24
|
end.parse!
|
21
25
|
|
22
26
|
Ferver.configure do |config|
|
27
|
+
config.serve_hidden = options[:hidden]
|
23
28
|
config.directory_path = options[:directory]
|
24
29
|
end
|
25
30
|
Ferver::App.set :environment, :production
|
data/lib/ferver.rb
CHANGED
@@ -4,6 +4,7 @@ require_relative 'ferver/configuration'
|
|
4
4
|
require_relative 'ferver/directory_not_found_error'
|
5
5
|
require_relative 'ferver/file_id_request'
|
6
6
|
require_relative 'ferver/file_list'
|
7
|
+
require_relative 'ferver/found_file'
|
7
8
|
require_relative 'ferver/version'
|
8
9
|
|
9
10
|
module Ferver
|
@@ -11,18 +12,18 @@ module Ferver
|
|
11
12
|
DEFAULT_FILE_SERVER_DIR_PATH = './'
|
12
13
|
|
13
14
|
class << self
|
14
|
-
|
15
|
-
end
|
15
|
+
attr_accessor :configuration
|
16
16
|
|
17
|
-
|
18
|
-
|
19
|
-
|
17
|
+
def configuration
|
18
|
+
@configuration ||= Configuration.new
|
19
|
+
end
|
20
20
|
|
21
|
-
|
22
|
-
|
23
|
-
|
21
|
+
def reset
|
22
|
+
@configuration = Configuration.new
|
23
|
+
end
|
24
24
|
|
25
|
-
|
26
|
-
|
25
|
+
def configure
|
26
|
+
yield(configuration)
|
27
|
+
end
|
27
28
|
end
|
28
29
|
end
|
data/lib/ferver/configuration.rb
CHANGED
@@ -1,11 +1,18 @@
|
|
1
1
|
module Ferver
|
2
2
|
class Configuration
|
3
|
-
attr_accessor :directory_path
|
3
|
+
attr_accessor :directory_path, :serve_hidden
|
4
4
|
|
5
5
|
# Return the absolute path to the directory Ferver is serving files from.
|
6
6
|
#
|
7
7
|
def directory_path
|
8
8
|
@directory_path || Ferver::DEFAULT_FILE_SERVER_DIR_PATH
|
9
9
|
end
|
10
|
+
|
11
|
+
# Default to not serving hidden files
|
12
|
+
#
|
13
|
+
def serve_hidden
|
14
|
+
@serve_hidden || false
|
15
|
+
end
|
16
|
+
alias_method :serve_hidden?, :serve_hidden
|
10
17
|
end
|
11
18
|
end
|
data/lib/ferver/controller.rb
CHANGED
@@ -10,6 +10,12 @@ module Ferver
|
|
10
10
|
@ferver_list = FileList.new(current_ferver_path)
|
11
11
|
end
|
12
12
|
|
13
|
+
before '/files/:id' do
|
14
|
+
halt(400, 'Bad request') unless valid_file_request?
|
15
|
+
|
16
|
+
find_file!
|
17
|
+
end
|
18
|
+
|
13
19
|
error Ferver::DirectoryNotFoundError do
|
14
20
|
halt 500, "Ferver: Directory '#{current_ferver_path}' not found."
|
15
21
|
end
|
@@ -24,26 +30,19 @@ module Ferver
|
|
24
30
|
if request.preferred_type.to_s == 'application/json'
|
25
31
|
content_type :json
|
26
32
|
|
27
|
-
ferver_list.
|
33
|
+
ferver_list.map(&:name).to_json
|
28
34
|
else
|
29
|
-
erb :index, locals: { file_list: ferver_list
|
30
|
-
ferver_path:
|
35
|
+
erb :index, locals: { file_list: ferver_list,
|
36
|
+
ferver_path: current_full_path,
|
31
37
|
file_count: ferver_list.size }
|
32
38
|
end
|
33
39
|
end
|
34
40
|
|
35
41
|
# download file
|
36
42
|
get '/files/:id' do
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
file_name = ferver_list.file_by_id(file_id_request.value)
|
41
|
-
file = FileList.path_for_file(current_ferver_path, file_name)
|
42
|
-
|
43
|
-
send_file(file, disposition: 'attachment', filename: File.basename(file))
|
44
|
-
else
|
45
|
-
status 404
|
46
|
-
end
|
43
|
+
send_file(
|
44
|
+
@file.path_to_file, disposition: 'attachment', filename: @file.name
|
45
|
+
)
|
47
46
|
end
|
48
47
|
|
49
48
|
private
|
@@ -58,8 +57,18 @@ module Ferver
|
|
58
57
|
file_id_request.valid?
|
59
58
|
end
|
60
59
|
|
60
|
+
def find_file!
|
61
|
+
@file = ferver_list.file_by_id(file_id_request.value)
|
62
|
+
rescue IndexError
|
63
|
+
halt 404, 'File requested not found.'
|
64
|
+
end
|
65
|
+
|
61
66
|
def current_ferver_path
|
62
67
|
Ferver.configuration.directory_path
|
63
68
|
end
|
69
|
+
|
70
|
+
def current_full_path
|
71
|
+
File.expand_path(current_ferver_path)
|
72
|
+
end
|
64
73
|
end
|
65
74
|
end
|
@@ -10,14 +10,7 @@ module Ferver
|
|
10
10
|
end
|
11
11
|
|
12
12
|
def value=(value)
|
13
|
-
|
14
|
-
|
15
|
-
if id.nil?
|
16
|
-
@is_valid = false
|
17
|
-
else
|
18
|
-
@value = id
|
19
|
-
@is_valid = true
|
20
|
-
end
|
13
|
+
@value = parse_value(value)
|
21
14
|
end
|
22
15
|
|
23
16
|
def valid?
|
@@ -28,9 +21,11 @@ module Ferver
|
|
28
21
|
|
29
22
|
def parse_value(value)
|
30
23
|
begin
|
31
|
-
Integer(value)
|
24
|
+
int_val = Integer(value)
|
25
|
+
@is_valid = true
|
26
|
+
int_val
|
32
27
|
rescue
|
33
|
-
|
28
|
+
@is_valid = false
|
34
29
|
end
|
35
30
|
end
|
36
31
|
end
|
data/lib/ferver/file_list.rb
CHANGED
@@ -4,44 +4,33 @@ require 'forwardable'
|
|
4
4
|
#
|
5
5
|
module Ferver
|
6
6
|
class FileList
|
7
|
-
extend Forwardable
|
8
7
|
include Enumerable
|
9
8
|
|
10
|
-
def_delegators :@files, :size, :each
|
11
|
-
|
12
9
|
# Create a new instance with a path
|
13
10
|
#
|
14
11
|
def initialize(path)
|
15
12
|
fail ArgumentError, 'No path is specified' if path.empty?
|
16
13
|
fail DirectoryNotFoundError unless Dir.exist?(path)
|
17
14
|
|
18
|
-
@files = []
|
19
15
|
@configured_file_path = File.expand_path(path)
|
20
|
-
find_files
|
16
|
+
@files = find_files.sort_by! { |f| f.name.downcase }
|
21
17
|
end
|
22
18
|
|
23
|
-
|
24
|
-
|
25
|
-
def self.path_for_file(directory, file_name)
|
26
|
-
File.join(directory, file_name)
|
19
|
+
def each(&block)
|
20
|
+
files.each(&block)
|
27
21
|
end
|
28
22
|
|
29
|
-
|
30
|
-
|
31
|
-
def file_id_valid?(file_id)
|
32
|
-
file_id < files.size
|
23
|
+
def size
|
24
|
+
files.size
|
33
25
|
end
|
34
26
|
|
35
27
|
# Filename by its index
|
28
|
+
# An id out of range with raise IndexError
|
36
29
|
#
|
37
30
|
def file_by_id(id)
|
38
31
|
files.fetch(id)
|
39
32
|
end
|
40
33
|
|
41
|
-
def all
|
42
|
-
files
|
43
|
-
end
|
44
|
-
|
45
34
|
private
|
46
35
|
|
47
36
|
attr_reader :configured_file_path, :files
|
@@ -49,13 +38,14 @@ module Ferver
|
|
49
38
|
# Iterate through files in specified dir for files
|
50
39
|
#
|
51
40
|
def find_files
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
41
|
+
[].tap do |results|
|
42
|
+
Dir.foreach(configured_file_path) do |file_name|
|
43
|
+
next if file_name == '.' || file_name == '..'
|
44
|
+
next if file_name =~ /^\./ && !Ferver.configuration.serve_hidden?
|
45
|
+
|
46
|
+
found_file = FoundFile.new(configured_file_path, file_name)
|
47
|
+
results << found_file if found_file.valid?
|
48
|
+
end
|
59
49
|
end
|
60
50
|
end
|
61
51
|
end
|
@@ -0,0 +1,16 @@
|
|
1
|
+
module Ferver
|
2
|
+
class FoundFile
|
3
|
+
attr_reader :file_name, :path_to_file
|
4
|
+
|
5
|
+
alias_method :name, :file_name
|
6
|
+
|
7
|
+
def initialize(directory, file_name)
|
8
|
+
@file_name = file_name
|
9
|
+
@path_to_file = File.join(directory, file_name)
|
10
|
+
end
|
11
|
+
|
12
|
+
def valid?
|
13
|
+
File.file?(path_to_file) && !File.zero?(path_to_file)
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
data/lib/ferver/version.rb
CHANGED
data/lib/ferver/views/index.erb
CHANGED
@@ -7,9 +7,9 @@
|
|
7
7
|
<body>
|
8
8
|
<h3>Files served:</h3>
|
9
9
|
<ul>
|
10
|
-
<% file_list.each_with_index do |
|
10
|
+
<% file_list.each_with_index do |file, index| %>
|
11
11
|
|
12
|
-
<li><a href="/files/<%= index %>"><%=
|
12
|
+
<li><a href="/files/<%= index %>"><%= file.name %></a></li>
|
13
13
|
|
14
14
|
<% end %>
|
15
15
|
|
@@ -25,4 +25,4 @@
|
|
25
25
|
</html>
|
26
26
|
|
27
27
|
<html>
|
28
|
-
<body>
|
28
|
+
<body>
|
data/spec/configuration_spec.rb
CHANGED
@@ -1,10 +1,9 @@
|
|
1
1
|
require 'spec_helper'
|
2
2
|
|
3
3
|
describe Ferver::Configuration do
|
4
|
-
subject {
|
4
|
+
subject { described_class.new }
|
5
5
|
|
6
6
|
describe 'configured directory path' do
|
7
|
-
|
8
7
|
context 'with no path set' do
|
9
8
|
it 'should return default path' do
|
10
9
|
expect(subject.directory_path).to eq(Ferver::DEFAULT_FILE_SERVER_DIR_PATH)
|
@@ -21,4 +20,20 @@ describe Ferver::Configuration do
|
|
21
20
|
end
|
22
21
|
end
|
23
22
|
end
|
23
|
+
|
24
|
+
describe "serving all files" do
|
25
|
+
context "with no configuration set" do
|
26
|
+
it "is false by default" do
|
27
|
+
expect(subject.serve_hidden?).to be false
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
context "when configured to serve hidden" do
|
32
|
+
it "is true" do
|
33
|
+
subject.serve_hidden = true
|
34
|
+
|
35
|
+
expect(subject.serve_hidden?).to be true
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
24
39
|
end
|
data/spec/ferver_spec.rb
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
require 'spec_helper'
|
2
2
|
|
3
3
|
describe 'ferver' do
|
4
|
-
let(:file_list) { double('
|
4
|
+
let(:file_list) { double('Ferver::FileList') }
|
5
5
|
|
6
6
|
context 'given a request to the server root' do
|
7
7
|
before do
|
@@ -22,7 +22,7 @@ describe 'ferver' do
|
|
22
22
|
|
23
23
|
describe 'choosing directory to serve files from' do
|
24
24
|
before do
|
25
|
-
allow(file_list).to receive(:
|
25
|
+
allow(file_list).to receive(:each_with_index)
|
26
26
|
allow(file_list).to receive(:size).and_return(0)
|
27
27
|
end
|
28
28
|
|
@@ -63,7 +63,7 @@ describe 'ferver' do
|
|
63
63
|
|
64
64
|
context 'given an empty list of files' do
|
65
65
|
before do
|
66
|
-
allow(file_list).to receive(:
|
66
|
+
allow(file_list).to receive(:each_with_index)
|
67
67
|
allow(file_list).to receive(:size).and_return(0)
|
68
68
|
allow(Ferver::FileList).to receive(:new).and_return(file_list)
|
69
69
|
end
|
@@ -83,6 +83,8 @@ describe 'ferver' do
|
|
83
83
|
|
84
84
|
context 'when json content-type is requested' do
|
85
85
|
before do
|
86
|
+
allow(file_list).to receive(:map).and_return([])
|
87
|
+
|
86
88
|
get '/files', {}, 'HTTP_ACCEPT' => 'application/json'
|
87
89
|
end
|
88
90
|
|
@@ -99,8 +101,10 @@ describe 'ferver' do
|
|
99
101
|
end
|
100
102
|
|
101
103
|
context 'given a list of files' do
|
104
|
+
let(:file_1) { double('file', name: 'file1') }
|
105
|
+
let(:file_2) { double('file', name: 'file2') }
|
102
106
|
before do
|
103
|
-
allow(file_list).to receive(:
|
107
|
+
allow(file_list).to receive(:each_with_index).and_yield(file_1, 1).and_yield(file_2, 2)
|
104
108
|
allow(file_list).to receive(:size).and_return(2)
|
105
109
|
allow(Ferver::FileList).to receive(:new).and_return(file_list)
|
106
110
|
end
|
@@ -129,6 +133,8 @@ describe 'ferver' do
|
|
129
133
|
|
130
134
|
context 'when json content-type is requested' do
|
131
135
|
before do
|
136
|
+
allow(file_list).to receive(:map).and_return([file_1.name, file_2.name])
|
137
|
+
|
132
138
|
get '/files', {}, 'HTTP_ACCEPT' => 'application/json'
|
133
139
|
end
|
134
140
|
|
@@ -140,7 +146,7 @@ describe 'ferver' do
|
|
140
146
|
it 'should contain no file list in response content' do
|
141
147
|
list = JSON.parse last_response.body
|
142
148
|
expect(list.count).to eq(2)
|
143
|
-
expect(list).to match_array(
|
149
|
+
expect(list).to match_array([file_1.name, file_2.name])
|
144
150
|
end
|
145
151
|
end
|
146
152
|
end
|
@@ -149,7 +155,7 @@ describe 'ferver' do
|
|
149
155
|
|
150
156
|
context 'when requesting a file out of range' do
|
151
157
|
before do
|
152
|
-
allow(file_list).to receive(:
|
158
|
+
allow(file_list).to receive(:file_by_id).with(3).and_raise(IndexError)
|
153
159
|
get '/files/3'
|
154
160
|
end
|
155
161
|
|
data/spec/file_list_spec.rb
CHANGED
@@ -1,6 +1,9 @@
|
|
1
1
|
require 'spec_helper'
|
2
2
|
|
3
3
|
describe Ferver::FileList do
|
4
|
+
let(:file_1) { double('file', name: 'file1') }
|
5
|
+
let(:file_2) { double('file', name: 'file2') }
|
6
|
+
|
4
7
|
before { allow(Dir).to receive(:exist?).and_return(true) }
|
5
8
|
subject { Ferver::FileList.new('/foo') }
|
6
9
|
|
@@ -47,14 +50,15 @@ describe Ferver::FileList do
|
|
47
50
|
end
|
48
51
|
|
49
52
|
it 'should return empty array of files' do
|
50
|
-
expect(subject.
|
53
|
+
expect(subject.to_a).to eq(EMPTY_FILE_LIST)
|
51
54
|
end
|
52
55
|
end
|
53
56
|
|
54
57
|
context 'when path directory contains current working dir and parent' do
|
55
58
|
before(:each) do
|
56
|
-
allow(Dir).to receive(:foreach).and_yield('.').and_yield('.').and_yield(
|
59
|
+
allow(Dir).to receive(:foreach).and_yield('.').and_yield('.').and_yield(file_1.name)
|
57
60
|
allow(File).to receive(:file?).and_return(true)
|
61
|
+
allow(File).to receive(:zero?).and_return(false)
|
58
62
|
end
|
59
63
|
|
60
64
|
it 'should not count current working dir and parent' do
|
@@ -62,14 +66,15 @@ describe Ferver::FileList do
|
|
62
66
|
end
|
63
67
|
|
64
68
|
it 'should not include current working dir and parent' do
|
65
|
-
expect(subject.
|
69
|
+
expect(subject.to_a.first.name).to eq(file_1.name)
|
66
70
|
end
|
67
71
|
end
|
68
72
|
|
69
73
|
context 'when path directory contains file and directory' do
|
70
74
|
before(:each) do
|
71
|
-
allow(Dir).to receive(:foreach).and_yield(
|
75
|
+
allow(Dir).to receive(:foreach).and_yield(file_1.name).and_yield('a_directory')
|
72
76
|
allow(File).to receive(:file?).twice.and_return(true, false)
|
77
|
+
allow(File).to receive(:zero?).twice.and_return(false, true)
|
73
78
|
end
|
74
79
|
|
75
80
|
it 'should not count the directory' do
|
@@ -77,30 +82,30 @@ describe Ferver::FileList do
|
|
77
82
|
end
|
78
83
|
|
79
84
|
it 'should not include the directory' do
|
80
|
-
expect(subject.
|
85
|
+
expect(subject.to_a.first.name).to eq(file_1.name)
|
81
86
|
end
|
82
87
|
end
|
83
88
|
|
84
89
|
context 'when path directory contains valid files' do
|
85
|
-
let(:files) { %w(file1 file2) }
|
86
90
|
before do
|
87
|
-
allow(Dir).to receive(:foreach).and_yield(
|
91
|
+
allow(Dir).to receive(:foreach).and_yield(file_1.name).and_yield(file_2.name)
|
88
92
|
allow(File).to receive(:file?).twice.and_return(true)
|
93
|
+
allow(File).to receive(:zero?).twice.and_return(false)
|
89
94
|
end
|
90
95
|
|
91
96
|
it 'should count all files' do
|
92
97
|
expect(subject.size).to eq(2)
|
93
98
|
end
|
94
99
|
|
95
|
-
|
96
|
-
|
97
|
-
|
100
|
+
describe "ordering" do
|
101
|
+
let(:file_2) { double('file', name: 'alpha') }
|
102
|
+
let(:file_1) { double('file', name: 'zeta') }
|
103
|
+
let(:ordered_files) { [file_2.name, file_1.name] }
|
98
104
|
|
99
|
-
describe 'iterating over files list' do
|
100
105
|
it 'should yield files in order' do
|
101
106
|
i = 0
|
102
107
|
subject.each do | file |
|
103
|
-
expect(file).to eq(
|
108
|
+
expect(file.name).to eq(ordered_files[i])
|
104
109
|
i += 1
|
105
110
|
end
|
106
111
|
end
|
@@ -109,35 +114,22 @@ describe Ferver::FileList do
|
|
109
114
|
|
110
115
|
describe 'requesting files' do
|
111
116
|
before(:each) do
|
112
|
-
allow(Dir).to receive(:foreach).and_yield(
|
117
|
+
allow(Dir).to receive(:foreach).and_yield(file_1.name).and_yield(file_2.name)
|
113
118
|
allow(File).to receive(:file?).and_return(true)
|
119
|
+
allow(File).to receive(:zero?).and_return(false)
|
114
120
|
end
|
115
121
|
|
116
122
|
context 'when requesting valid file_id' do
|
117
|
-
# TODO: possible to redesign this
|
118
|
-
|
119
|
-
it '#file_id_valid? should return true for first file' do
|
120
|
-
expect(subject.file_id_valid?(0)).to be_truthy
|
121
|
-
end
|
122
|
-
|
123
|
-
it '#file_id_valid? should return true for second file' do
|
124
|
-
expect(subject.file_id_valid?(1)).to be_truthy
|
125
|
-
end
|
126
|
-
|
127
123
|
it '#file_by_id should return the correct file for the first file' do
|
128
|
-
expect(subject.file_by_id(0)).to eq(
|
124
|
+
expect(subject.file_by_id(0).name).to eq(file_1.name)
|
129
125
|
end
|
130
126
|
|
131
127
|
it '#file_by_id should return the correct file for the second file' do
|
132
|
-
expect(subject.file_by_id(1)).to eq(
|
128
|
+
expect(subject.file_by_id(1).name).to eq(file_2.name)
|
133
129
|
end
|
134
130
|
end
|
135
131
|
|
136
132
|
context 'when requesting invalid file_id' do
|
137
|
-
it 'should return false for invalid file_id' do
|
138
|
-
expect(subject.file_id_valid?(2)).to be_falsey
|
139
|
-
end
|
140
|
-
|
141
133
|
it 'should raise_error if file_by_id is called' do
|
142
134
|
expect { subject.file_by_id(2) }.to raise_error(IndexError)
|
143
135
|
end
|
data/spec/spec_helper.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: ferver
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.
|
4
|
+
version: 1.3.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Rob Murray
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2015-10-24 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -163,6 +163,7 @@ files:
|
|
163
163
|
- lib/ferver/directory_not_found_error.rb
|
164
164
|
- lib/ferver/file_id_request.rb
|
165
165
|
- lib/ferver/file_list.rb
|
166
|
+
- lib/ferver/found_file.rb
|
166
167
|
- lib/ferver/version.rb
|
167
168
|
- lib/ferver/views/index.erb
|
168
169
|
- spec/configuration_spec.rb
|
@@ -190,7 +191,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
190
191
|
version: '0'
|
191
192
|
requirements: []
|
192
193
|
rubyforge_project:
|
193
|
-
rubygems_version: 2.4.
|
194
|
+
rubygems_version: 2.4.8
|
194
195
|
signing_key:
|
195
196
|
specification_version: 4
|
196
197
|
summary: A simple web app to serve files over HTTP.
|