fake_ftp 0.2.0 → 0.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/.codeclimate.yml +16 -0
- data/.gitignore +1 -0
- data/.rspec +2 -0
- data/.rubocop.yml +27 -0
- data/.rubocop_todo.yml +7 -0
- data/.simplecov +6 -0
- data/.travis.yml +27 -2
- data/CHANGELOG.md +136 -0
- data/Gemfile +9 -7
- data/Guardfile +5 -4
- data/LICENSE.md +20 -0
- data/README.md +30 -63
- data/Rakefile +12 -7
- data/fake_ftp.gemspec +16 -17
- data/lib/fake_ftp.rb +3 -2
- data/lib/fake_ftp/file.rb +11 -5
- data/lib/fake_ftp/server.rb +138 -261
- data/lib/fake_ftp/server_commands.rb +6 -0
- data/lib/fake_ftp/server_commands/acct.rb +11 -0
- data/lib/fake_ftp/server_commands/cdup.rb +11 -0
- data/lib/fake_ftp/server_commands/cwd.rb +13 -0
- data/lib/fake_ftp/server_commands/dele.rb +25 -0
- data/lib/fake_ftp/server_commands/list.rb +39 -0
- data/lib/fake_ftp/server_commands/mdtm.rb +17 -0
- data/lib/fake_ftp/server_commands/mkd.rb +11 -0
- data/lib/fake_ftp/server_commands/nlst.rb +32 -0
- data/lib/fake_ftp/server_commands/pass.rb +11 -0
- data/lib/fake_ftp/server_commands/pasv.rb +15 -0
- data/lib/fake_ftp/server_commands/port.rb +23 -0
- data/lib/fake_ftp/server_commands/pwd.rb +11 -0
- data/lib/fake_ftp/server_commands/quit.rb +13 -0
- data/lib/fake_ftp/server_commands/retr.rb +32 -0
- data/lib/fake_ftp/server_commands/rnfr.rb +18 -0
- data/lib/fake_ftp/server_commands/rnto.rb +22 -0
- data/lib/fake_ftp/server_commands/site.rb +11 -0
- data/lib/fake_ftp/server_commands/size.rb +11 -0
- data/lib/fake_ftp/server_commands/stor.rb +30 -0
- data/lib/fake_ftp/server_commands/type.rb +18 -0
- data/lib/fake_ftp/server_commands/user.rb +12 -0
- data/lib/fake_ftp/server_commands/wat.rb +33 -0
- data/lib/fake_ftp/version.rb +3 -1
- data/spec/functional/server_spec.rb +459 -358
- data/spec/integration/server_spec.rb +39 -29
- data/spec/models/fake_ftp/file_spec.rb +22 -21
- data/spec/models/fake_ftp/server_spec.rb +33 -32
- data/spec/spec_helper.rb +98 -14
- metadata +32 -3
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA1:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 7a8165d49d247b14c5a9c6dddde8ebf348b54a97
|
|
4
|
+
data.tar.gz: f57a69068555bf2911e54008695a7a72b1d51baf
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 357a8a7b06d3c6eb7ece24592724e30357859299ca3718cd42a54e90da48b69b95f320010d7c773527fc0dd1dc402ce14a0ca58d97c3fd35f80f0c81e4f44e13
|
|
7
|
+
data.tar.gz: e539dfca9312bd701c72e0e71ae6e3b6a08e7bf6abcaab69da55047c1cbf86f6db5c768c44f68fc9600d34913643d670524afa8ecfc409e0d9c74e39030600be
|
data/.codeclimate.yml
ADDED
data/.gitignore
CHANGED
data/.rspec
CHANGED
data/.rubocop.yml
ADDED
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
inherit_from: .rubocop_todo.yml
|
|
2
|
+
|
|
3
|
+
AllCops:
|
|
4
|
+
TargetRubyVersion: '2.4'
|
|
5
|
+
|
|
6
|
+
Style/Documentation:
|
|
7
|
+
Enabled: false
|
|
8
|
+
|
|
9
|
+
Metrics/AbcSize:
|
|
10
|
+
Max: 40
|
|
11
|
+
|
|
12
|
+
Metrics/CyclomaticComplexity:
|
|
13
|
+
Max: 15
|
|
14
|
+
|
|
15
|
+
Metrics/MethodLength:
|
|
16
|
+
Max: 45
|
|
17
|
+
|
|
18
|
+
Metrics/PerceivedComplexity:
|
|
19
|
+
Max: 15
|
|
20
|
+
|
|
21
|
+
Metrics/BlockLength:
|
|
22
|
+
Exclude:
|
|
23
|
+
- 'spec/**/*'
|
|
24
|
+
Max: 40
|
|
25
|
+
|
|
26
|
+
Metrics/ClassLength:
|
|
27
|
+
Max: 200
|
data/.rubocop_todo.yml
ADDED
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
# This configuration was generated by
|
|
2
|
+
# `rubocop --auto-gen-config`
|
|
3
|
+
# on 2017-08-01 12:55:33 -0400 using RuboCop version 0.49.1.
|
|
4
|
+
# The point is for the user to remove these configuration records
|
|
5
|
+
# one by one as the offenses are removed from the code base.
|
|
6
|
+
# Note that changes in the inspected code, or installation of new
|
|
7
|
+
# versions of RuboCop, may require this file to be generated again.
|
data/.simplecov
ADDED
data/.travis.yml
CHANGED
|
@@ -1,8 +1,33 @@
|
|
|
1
1
|
language: ruby
|
|
2
2
|
sudo: false
|
|
3
3
|
dist: trusty
|
|
4
|
-
cache:
|
|
4
|
+
cache:
|
|
5
|
+
bundler: true
|
|
6
|
+
directories:
|
|
7
|
+
- ~/.local/bin
|
|
5
8
|
rvm:
|
|
6
9
|
- 2.4.1
|
|
7
10
|
- 2.3.4
|
|
8
|
-
|
|
11
|
+
env:
|
|
12
|
+
matrix:
|
|
13
|
+
- COVERAGE=0 FUNCTIONAL_SPECS=0 INTEGRATION_SPECS=0
|
|
14
|
+
- COVERAGE=1 FUNCTIONAL_SPECS=1 INTEGRATION_SPECS=1
|
|
15
|
+
global:
|
|
16
|
+
- PATH="$HOME/.local/bin:$PATH"
|
|
17
|
+
before_install:
|
|
18
|
+
- if ! cc-test-reporter --version; then
|
|
19
|
+
mkdir -p ~/.local/bin;
|
|
20
|
+
curl -sSL
|
|
21
|
+
-o ~/.local/bin/cc-test-reporter
|
|
22
|
+
https://codeclimate.com/downloads/test-reporter/test-reporter-latest-linux-amd64;
|
|
23
|
+
chmod +x ~/.local/bin/cc-test-reporter;
|
|
24
|
+
fi
|
|
25
|
+
- cc-test-reporter before-build
|
|
26
|
+
after_script:
|
|
27
|
+
- if [[ "${TRAVIS_PULL_REQUEST}" == "false" &&
|
|
28
|
+
"${COVERAGE}" == "1" &&
|
|
29
|
+
"${FUNCTIONAL_SPECS}" == "1" &&
|
|
30
|
+
"${INTEGRATION_SPECS}" == "1" &&
|
|
31
|
+
"${TRAVIS_RUBY_VERSION}" == "2.4.1" ]]; then
|
|
32
|
+
cc-test-reporter after-build --exit-code "${TRAVIS_TEST_RESULT}";
|
|
33
|
+
fi
|
data/CHANGELOG.md
ADDED
|
@@ -0,0 +1,136 @@
|
|
|
1
|
+
# Changelog
|
|
2
|
+
All notable changes to this project will be documented in this file.
|
|
3
|
+
|
|
4
|
+
The format is based on [Keep a Changelog](http://keepachangelog.com/en/1.0.0/)
|
|
5
|
+
and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0.html).
|
|
6
|
+
|
|
7
|
+
## [Unreleased]
|
|
8
|
+
|
|
9
|
+
### Added
|
|
10
|
+
|
|
11
|
+
### Changed
|
|
12
|
+
|
|
13
|
+
### Deprecated
|
|
14
|
+
|
|
15
|
+
### Removed
|
|
16
|
+
|
|
17
|
+
### Fixed
|
|
18
|
+
|
|
19
|
+
### Security
|
|
20
|
+
|
|
21
|
+
## [0.3.0] - 2017-08-01
|
|
22
|
+
### Added
|
|
23
|
+
- integration with Code Climate + simplecov
|
|
24
|
+
- RuboCop with auto-fixes
|
|
25
|
+
- this changelog
|
|
26
|
+
- server: more debugging
|
|
27
|
+
|
|
28
|
+
### Changed
|
|
29
|
+
- server:
|
|
30
|
+
- command dispatch via class
|
|
31
|
+
- store files as a set
|
|
32
|
+
|
|
33
|
+
### Removed
|
|
34
|
+
- tests: running against ruby 2.2.7
|
|
35
|
+
|
|
36
|
+
## [0.2.0] - 2017-07-26
|
|
37
|
+
### Added
|
|
38
|
+
- server: `size` command implementation
|
|
39
|
+
|
|
40
|
+
### Changed
|
|
41
|
+
- tests: updated ruby versions tested via Travis CI
|
|
42
|
+
|
|
43
|
+
## [0.1.1] - 2014-04-17
|
|
44
|
+
### Added
|
|
45
|
+
- documentation: more, plus a contributors doc
|
|
46
|
+
|
|
47
|
+
### Changed
|
|
48
|
+
- server:
|
|
49
|
+
- fail to initialize if control or passive ports are invalid
|
|
50
|
+
- reset port from initial server address
|
|
51
|
+
|
|
52
|
+
## [0.1.0] - 2013-09-30
|
|
53
|
+
### Added
|
|
54
|
+
- tests: integration with Travis CI
|
|
55
|
+
- documentation: GitHub-flavored markdown changes
|
|
56
|
+
- file: `last_modified_time`
|
|
57
|
+
- server:
|
|
58
|
+
- wildcard support in `list` command
|
|
59
|
+
- `mdtm` command implementation
|
|
60
|
+
- `rnfr` command implementation
|
|
61
|
+
- `rnto` command implementation
|
|
62
|
+
- `dele` command implementation
|
|
63
|
+
- `mkd` command implementation
|
|
64
|
+
|
|
65
|
+
### Changed
|
|
66
|
+
- server: real implementation of `cwd` command
|
|
67
|
+
|
|
68
|
+
## [0.0.9] - 2011-11-21
|
|
69
|
+
### Changed
|
|
70
|
+
- server: initial respond code `220`
|
|
71
|
+
|
|
72
|
+
## [0.0.8] - 2011-11-21
|
|
73
|
+
### Changed
|
|
74
|
+
- server: detect running state via `TCPSocket` instead of `lsof`
|
|
75
|
+
|
|
76
|
+
## [0.0.7] - 2011-10-07
|
|
77
|
+
### Added
|
|
78
|
+
- server: `reset` command to clear stored files
|
|
79
|
+
|
|
80
|
+
## [0.0.6] - 2011-06-12
|
|
81
|
+
### Changed
|
|
82
|
+
- server: pass args to commands via splat
|
|
83
|
+
|
|
84
|
+
## [0.0.5] - 2011-05-12
|
|
85
|
+
### Added
|
|
86
|
+
- file: accessors for data and created fields
|
|
87
|
+
- server:
|
|
88
|
+
- `add_file` method for direct file addition
|
|
89
|
+
- `retr` command implementation
|
|
90
|
+
- `list` command implementation
|
|
91
|
+
- `nlst` command implementation
|
|
92
|
+
|
|
93
|
+
## [0.0.4] - 2011-03-06
|
|
94
|
+
### Added
|
|
95
|
+
- docs: show how to test active upload
|
|
96
|
+
|
|
97
|
+
### Changed
|
|
98
|
+
- file: accept active/passive type at initialization
|
|
99
|
+
|
|
100
|
+
## [0.0.3] - 2011-03-06
|
|
101
|
+
### Added
|
|
102
|
+
- server:
|
|
103
|
+
- initial active mode implementation
|
|
104
|
+
- `port` command
|
|
105
|
+
|
|
106
|
+
### Changed
|
|
107
|
+
- server:
|
|
108
|
+
- `stor` behavior depending on active/passive mode
|
|
109
|
+
|
|
110
|
+
## [0.0.2] - 2011-03-05
|
|
111
|
+
### Added
|
|
112
|
+
- file: initial implementation for in-memory store
|
|
113
|
+
- server:
|
|
114
|
+
- `#files` method for fetching all stored file names
|
|
115
|
+
- `#file` method for fetching rich file object by name
|
|
116
|
+
|
|
117
|
+
### Changed
|
|
118
|
+
- server: use in-memory store instead of local scratch directory
|
|
119
|
+
|
|
120
|
+
## 0.0.1 - 2011-02-28
|
|
121
|
+
|
|
122
|
+
### Added
|
|
123
|
+
- initial release with basic usage and docs
|
|
124
|
+
|
|
125
|
+
[Unreleased]: https://github.com/livinginthepast/fake_ftp/compare/v0.2.0...HEAD
|
|
126
|
+
[0.2.0]: https://github.com/livinginthepast/fake_ftp/compare/v0.1.1...v0.2.0
|
|
127
|
+
[0.1.1]: https://github.com/livinginthepast/fake_ftp/compare/v0.1.0...v0.1.1
|
|
128
|
+
[0.1.0]: https://github.com/livinginthepast/fake_ftp/compare/v0.0.9...v0.1.0
|
|
129
|
+
[0.0.9]: https://github.com/livinginthepast/fake_ftp/compare/v0.0.8...v0.0.9
|
|
130
|
+
[0.0.8]: https://github.com/livinginthepast/fake_ftp/compare/v0.0.7...v0.0.8
|
|
131
|
+
[0.0.7]: https://github.com/livinginthepast/fake_ftp/compare/v0.0.6...v0.0.7
|
|
132
|
+
[0.0.6]: https://github.com/livinginthepast/fake_ftp/compare/v0.0.5...v0.0.6
|
|
133
|
+
[0.0.5]: https://github.com/livinginthepast/fake_ftp/compare/v0.0.4...v0.0.5
|
|
134
|
+
[0.0.4]: https://github.com/livinginthepast/fake_ftp/compare/v0.0.3...v0.0.4
|
|
135
|
+
[0.0.3]: https://github.com/livinginthepast/fake_ftp/compare/v0.0.2...v0.0.3
|
|
136
|
+
[0.0.2]: https://github.com/livinginthepast/fake_ftp/compare/v0.0.1...v0.0.2
|
data/Gemfile
CHANGED
|
@@ -1,12 +1,14 @@
|
|
|
1
|
-
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
source 'http://rubygems.org'
|
|
2
4
|
|
|
3
|
-
# Specify your gem's dependencies in fake_ftp.gemspec
|
|
4
5
|
gemspec
|
|
5
6
|
|
|
6
7
|
group :test do
|
|
7
|
-
gem
|
|
8
|
-
gem
|
|
9
|
-
|
|
10
|
-
gem
|
|
11
|
-
gem '
|
|
8
|
+
gem 'guard-rspec', '~> 4.7.3'
|
|
9
|
+
gem 'pry-nav', '~> 0.2.4'
|
|
10
|
+
gem 'rake', '~> 12.0.0'
|
|
11
|
+
gem 'rspec', '~> 3.6.0'
|
|
12
|
+
gem 'rubocop', '~> 0.49.1'
|
|
13
|
+
gem 'simplecov', '~> 0.14.1', require: false
|
|
12
14
|
end
|
data/Guardfile
CHANGED
|
@@ -1,10 +1,11 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
1
3
|
# A sample Guardfile
|
|
2
4
|
# More info at https://github.com/guard/guard#readme
|
|
3
5
|
|
|
4
|
-
guard 'rspec', :
|
|
6
|
+
guard 'rspec', version: 2 do
|
|
5
7
|
watch(%r{^spec/.+_spec\.rb$})
|
|
6
8
|
watch(%r{^lib/(.+)\.rb$}) { |m| "spec/lib/#{m[1]}_spec.rb" }
|
|
7
|
-
watch('spec/spec_helper.rb') {
|
|
8
|
-
watch(%r{^spec/support/(.+)\.rb$})
|
|
9
|
+
watch('spec/spec_helper.rb') { 'spec' }
|
|
10
|
+
watch(%r{^spec/support/(.+)\.rb$}) { 'spec' }
|
|
9
11
|
end
|
|
10
|
-
|
data/LICENSE.md
ADDED
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
The MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2017 Eric Saxby
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy of
|
|
6
|
+
this software and associated documentation files (the "Software"), to deal in
|
|
7
|
+
the Software without restriction, including without limitation the rights to
|
|
8
|
+
use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
|
|
9
|
+
the Software, and to permit persons to whom the Software is furnished to do so,
|
|
10
|
+
subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
|
|
17
|
+
FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
|
|
18
|
+
COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
|
|
19
|
+
IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
|
20
|
+
CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
data/README.md
CHANGED
|
@@ -1,25 +1,21 @@
|
|
|
1
|
-
FakeFtp
|
|
2
|
-
=======
|
|
1
|
+
# FakeFtp
|
|
3
2
|
|
|
4
|
-
[](http://travis-ci.org/livinginthepast/fake_ftp)
|
|
9
4
|
|
|
5
|
+
This is a gem that allows you to test FTP implementations in ruby. It is a
|
|
6
|
+
minimal single-client FTP server that can be bound to any arbitrary port on
|
|
7
|
+
localhost.
|
|
10
8
|
|
|
11
9
|
## Why?
|
|
12
10
|
|
|
13
|
-
We want to ensure that our code works, in a way that is agnostic to the
|
|
11
|
+
We want to ensure that our code works, in a way that is agnostic to the
|
|
14
12
|
implementation used (unlike with stubs or mocks).
|
|
15
13
|
|
|
16
|
-
|
|
17
14
|
## How
|
|
18
15
|
|
|
19
|
-
FakeFtp is a simple FTP server that fakes out enough of the protocol to
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
16
|
+
FakeFtp is a simple FTP server that fakes out enough of the protocol to get us
|
|
17
|
+
by, allowing us to test that files get to their intended destination rather than
|
|
18
|
+
testing how our code does so.
|
|
23
19
|
|
|
24
20
|
## Usage
|
|
25
21
|
|
|
@@ -40,10 +36,10 @@ ftp.passive = true
|
|
|
40
36
|
ftp.put('some_file.txt')
|
|
41
37
|
ftp.close
|
|
42
38
|
|
|
43
|
-
server.files.
|
|
44
|
-
server.file('some_file.txt').bytes.
|
|
45
|
-
server.file('some_file.txt').
|
|
46
|
-
server.file('some_file.txt').
|
|
39
|
+
expect(server.files).to include('some_file.txt')
|
|
40
|
+
expect(server.file('some_file.txt').bytes).to eq 25
|
|
41
|
+
expect(server.file('some_file.txt')).to be_passive
|
|
42
|
+
expect(server.file('some_file.txt')).not_not be_active
|
|
47
43
|
|
|
48
44
|
server.stop
|
|
49
45
|
```
|
|
@@ -62,73 +58,44 @@ ftp.passive = false
|
|
|
62
58
|
ftp.put('some_file.txt')
|
|
63
59
|
ftp.close
|
|
64
60
|
|
|
65
|
-
server.files.
|
|
66
|
-
server.file('some_file.txt').bytes.
|
|
67
|
-
server.file('some_file.txt').
|
|
68
|
-
server.file('some_file.txt').
|
|
61
|
+
expect(server.files).to include('some_file.txt')
|
|
62
|
+
expect(server.file('some_file.txt').bytes).to eq 25
|
|
63
|
+
expect(server.file('some_file.txt')).to be_active
|
|
64
|
+
expect(server.file('some_file.txt')).to_not be_passive
|
|
69
65
|
|
|
70
66
|
server.stop
|
|
71
67
|
```
|
|
72
68
|
|
|
73
69
|
Note that many FTP clients default to active, unless specified otherwise.
|
|
74
70
|
|
|
75
|
-
|
|
76
71
|
## Caveats
|
|
77
72
|
|
|
78
|
-
This is *not* a real FTP server and should not be treated as one. The goal
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
them to an FTP server.
|
|
73
|
+
This is *not* a real FTP server and should not be treated as one. The goal of
|
|
74
|
+
this gem is not to create a thread-safe multi-client implementation. It is best
|
|
75
|
+
used to unit test code that generates files and transfers them to an FTP server.
|
|
82
76
|
|
|
83
77
|
As such, there are some things that won't be accepted upstream from pull
|
|
84
78
|
requests:
|
|
85
79
|
* simultaneous multi-client code
|
|
86
|
-
* support
|
|
80
|
+
* persistence support
|
|
87
81
|
* binding to arbitrary IPs
|
|
88
82
|
* global state beyond that required to pass the minimum required to
|
|
89
83
|
generate passing tests
|
|
90
84
|
|
|
91
|
-
|
|
92
85
|
## Recommendations for testing patterns
|
|
93
86
|
|
|
94
|
-
*Separate configuration from code.* Do not hard code the IP address,
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
and should be avoided.
|
|
98
|
-
|
|
99
|
-
*Separate the code that generates files from the code that uploads
|
|
100
|
-
files.* You tests will run much more quickly if you only try to upload
|
|
101
|
-
small files. If you have tests showing that you generate correct files
|
|
102
|
-
from your data, then you can trust that. Why do you need to upload a 20M
|
|
103
|
-
file in your tests if you can stub out your file generation method and
|
|
104
|
-
test file upload against 10 bytes? Fast fast fast.
|
|
87
|
+
*Separate configuration from code.* Do not hard code the IP address, FQDN or
|
|
88
|
+
port of an FTP server in your code. It introduces fragility into your tests.
|
|
89
|
+
Also, the default FTP port of 21 is a privileged port, and should be avoided.
|
|
105
90
|
|
|
91
|
+
*Separate the code that generates files from the code that uploads files.* You
|
|
92
|
+
tests will run much more quickly if you only try to upload small files. If you
|
|
93
|
+
have tests showing that you generate correct files from your data, then you can
|
|
94
|
+
trust that. Why do you need to upload a 20M file in your tests if you can stub
|
|
95
|
+
out your file generation method and test file upload against 10 bytes? Fast fast
|
|
96
|
+
fast.
|
|
106
97
|
|
|
107
98
|
## References
|
|
108
99
|
|
|
109
100
|
* http://rubyforge.org/projects/ftpd/ - a simple ftp daemon written by Chris Wanstrath
|
|
110
101
|
* http://ruby-doc.org/stdlib/libdoc/gserver/rdoc/index.html - a generic server in the Ruby standard library, by John W Small
|
|
111
|
-
|
|
112
|
-
## License
|
|
113
|
-
|
|
114
|
-
The MIT License
|
|
115
|
-
|
|
116
|
-
Copyright (c) 2011 Eric Saxby
|
|
117
|
-
|
|
118
|
-
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
119
|
-
of this software and associated documentation files (the "Software"), to deal
|
|
120
|
-
in the Software without restriction, including without limitation the rights
|
|
121
|
-
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
122
|
-
copies of the Software, and to permit persons to whom the Software is
|
|
123
|
-
furnished to do so, subject to the following conditions:
|
|
124
|
-
|
|
125
|
-
The above copyright notice and this permission notice shall be included in
|
|
126
|
-
all copies or substantial portions of the Software.
|
|
127
|
-
|
|
128
|
-
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
129
|
-
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
130
|
-
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
131
|
-
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
132
|
-
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
133
|
-
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
|
134
|
-
THE SOFTWARE.
|