ftpmock 0.0.0 → 0.1.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.gitignore +3 -0
- data/.rubocop.yml +60 -2
- data/.travis.yml +19 -2
- data/Gemfile +1 -1
- data/Gemfile.lock +30 -11
- data/README.md +136 -12
- data/ftpmock.gemspec +6 -1
- data/images/ftpmock.png +0 -0
- data/images/ruby.png +0 -0
- data/lib/ftpmock.rb +19 -1
- data/lib/ftpmock/core/cache.rb +186 -0
- data/lib/ftpmock/core/configuration.rb +33 -0
- data/lib/ftpmock/helpers/get_helper.rb +46 -0
- data/lib/ftpmock/helpers/list_helper.rb +53 -0
- data/lib/ftpmock/helpers/path_helper.rb +24 -0
- data/lib/ftpmock/helpers/put_helper.rb +39 -0
- data/lib/ftpmock/proxies/method_missing_mixin.rb +9 -0
- data/lib/ftpmock/proxies/net_ftp_proxy.rb +287 -0
- data/lib/ftpmock/proxies/net_sftp_proxy.rb +50 -0
- data/lib/ftpmock/utils/color_utils.rb +27 -0
- data/lib/ftpmock/utils/string_utils.rb +29 -0
- data/lib/ftpmock/utils/verbose_utils.rb +19 -0
- data/lib/ftpmock/version.rb +1 -1
- metadata +74 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: c9fcde1b94eb86b0f144b748def95e77104d92bd45a024527a3a33dd9445e5ca
|
4
|
+
data.tar.gz: ac31e623824872dd372e65233d9d4a1de3277a248beda3b18cba8442b5054bcd
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: e9fe1e4d12970f57eb15d7ed68d76fc278460360de769526f58f7ed2a093a0fe294a4f59cc69c7dff4596cf664a2a80537ae490e89b62fe4f8165e6e6fcc948b
|
7
|
+
data.tar.gz: 48d26252d595a84ab33252c223508a059397145d57a61422b47d1da45a844a191b3610bdc2feaecf16b9f2669ff5726ba69343660ae8256596d91bbcd7aacc68
|
data/.gitignore
CHANGED
data/.rubocop.yml
CHANGED
@@ -9,7 +9,7 @@ AllCops:
|
|
9
9
|
EnabledByDefault: false
|
10
10
|
UseCache: true
|
11
11
|
CacheRootDirectory: ~
|
12
|
-
TargetRubyVersion: 2.
|
12
|
+
TargetRubyVersion: 2.7
|
13
13
|
Exclude:
|
14
14
|
- 'a/*'
|
15
15
|
- 'bin/*'
|
@@ -43,11 +43,69 @@ Naming:
|
|
43
43
|
Style:
|
44
44
|
Enabled: true
|
45
45
|
|
46
|
+
# Undefaulted
|
47
|
+
|
48
|
+
Style/HashEachMethods:
|
49
|
+
Enabled: true
|
50
|
+
Style/HashTransformKeys:
|
51
|
+
Enabled: true
|
52
|
+
Style/HashTransformValues:
|
53
|
+
Enabled: true
|
54
|
+
|
46
55
|
# Custom
|
47
56
|
|
48
|
-
|
57
|
+
Layout/LineLength:
|
49
58
|
Max: 80
|
59
|
+
Exclude:
|
60
|
+
- 'spec/ftpmock/proxies_net_ftp/integration_spec.rb'
|
50
61
|
|
51
62
|
# If you think this should be true, reach out!
|
52
63
|
Style/FrozenStringLiteralComment:
|
53
64
|
Enabled: false
|
65
|
+
|
66
|
+
Style/Documentation:
|
67
|
+
Enabled: false
|
68
|
+
|
69
|
+
Style/GuardClause:
|
70
|
+
Enabled: false
|
71
|
+
|
72
|
+
Style/MethodMissingSuper:
|
73
|
+
Exclude:
|
74
|
+
- 'lib/ftpmock/proxies/method_missing_mixin.rb'
|
75
|
+
Style/MissingRespondToMissing:
|
76
|
+
Exclude:
|
77
|
+
- 'lib/ftpmock/proxies/method_missing_mixin.rb'
|
78
|
+
|
79
|
+
Metrics/BlockLength:
|
80
|
+
Exclude:
|
81
|
+
- 'spec/**/*.rb'
|
82
|
+
|
83
|
+
Naming/ConstantName:
|
84
|
+
Exclude:
|
85
|
+
- 'lib/ftpmock/proxies/*_proxy.rb'
|
86
|
+
|
87
|
+
Naming/MethodParameterName:
|
88
|
+
Exclude:
|
89
|
+
- 'spec/ftpmock/helpers/*.rb'
|
90
|
+
|
91
|
+
# http://c2.com/cgi/wiki?AbcMetric, https://en.wikipedia.org/wiki/ABC_Software_Metric
|
92
|
+
Metrics/AbcSize:
|
93
|
+
# Max: 15 (default)
|
94
|
+
Max: 20
|
95
|
+
Exclude:
|
96
|
+
- 'spec/ftpmock/helpers/*.rb'
|
97
|
+
|
98
|
+
# https://rubystyle.guide#short-methods
|
99
|
+
Metrics/MethodLength:
|
100
|
+
# Max: 10 (default)
|
101
|
+
Max: 15
|
102
|
+
Exclude:
|
103
|
+
- 'spec/ftpmock/helpers/*.rb'
|
104
|
+
|
105
|
+
Metrics/ClassLength:
|
106
|
+
# Max: 100 (default)
|
107
|
+
Max: 200
|
108
|
+
|
109
|
+
Metrics/CyclomaticComplexity:
|
110
|
+
Exclude:
|
111
|
+
- 'lib/ftpmock/proxies/*_proxy.rb'
|
data/.travis.yml
CHANGED
@@ -1,7 +1,24 @@
|
|
1
1
|
---
|
2
2
|
sudo: false
|
3
3
|
language: ruby
|
4
|
-
|
4
|
+
|
5
5
|
rvm:
|
6
|
-
- 2.
|
6
|
+
- 2.3
|
7
|
+
- 2.4
|
8
|
+
- 2.5
|
9
|
+
- 2.6
|
10
|
+
- 2.7
|
11
|
+
- ruby-head
|
12
|
+
|
7
13
|
before_install: gem install bundler -v 2.0.2
|
14
|
+
|
15
|
+
cache:
|
16
|
+
- bundler
|
17
|
+
- apt
|
18
|
+
|
19
|
+
addons:
|
20
|
+
code_climate:
|
21
|
+
repo_token: e91dbff92783b09f531028ccb33b372a03b8ee2ec0b15bf8e250359c80e06838
|
22
|
+
|
23
|
+
after_success:
|
24
|
+
- bundle exec codeclimate-test-reporter
|
data/Gemfile
CHANGED
data/Gemfile.lock
CHANGED
@@ -2,50 +2,69 @@ PATH
|
|
2
2
|
remote: .
|
3
3
|
specs:
|
4
4
|
ftpmock (0.1.0)
|
5
|
+
diffy (~> 3.0)
|
5
6
|
|
6
7
|
GEM
|
7
8
|
remote: https://rubygems.org/
|
8
9
|
specs:
|
9
10
|
ast (2.4.0)
|
11
|
+
codeclimate-test-reporter (1.0.9)
|
12
|
+
simplecov (<= 0.13)
|
10
13
|
diff-lcs (1.3)
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
+
diffy (3.3.0)
|
15
|
+
docile (1.1.5)
|
16
|
+
jaro_winkler (1.5.4)
|
17
|
+
json (2.3.0)
|
18
|
+
net-sftp (2.1.2)
|
19
|
+
net-ssh (>= 2.6.5)
|
20
|
+
net-ssh (5.2.0)
|
21
|
+
parallel (1.19.1)
|
22
|
+
parser (2.7.0.2)
|
14
23
|
ast (~> 2.4.0)
|
15
24
|
rainbow (3.0.0)
|
16
25
|
rake (10.5.0)
|
26
|
+
rexml (3.2.4)
|
17
27
|
rspec (3.9.0)
|
18
28
|
rspec-core (~> 3.9.0)
|
19
29
|
rspec-expectations (~> 3.9.0)
|
20
30
|
rspec-mocks (~> 3.9.0)
|
21
|
-
rspec-core (3.9.
|
22
|
-
rspec-support (~> 3.9.
|
31
|
+
rspec-core (3.9.1)
|
32
|
+
rspec-support (~> 3.9.1)
|
23
33
|
rspec-expectations (3.9.0)
|
24
34
|
diff-lcs (>= 1.2.0, < 2.0)
|
25
35
|
rspec-support (~> 3.9.0)
|
26
|
-
rspec-mocks (3.9.
|
36
|
+
rspec-mocks (3.9.1)
|
27
37
|
diff-lcs (>= 1.2.0, < 2.0)
|
28
38
|
rspec-support (~> 3.9.0)
|
29
|
-
rspec-support (3.9.
|
30
|
-
rubocop (0.
|
39
|
+
rspec-support (3.9.2)
|
40
|
+
rubocop (0.80.0)
|
31
41
|
jaro_winkler (~> 1.5.1)
|
32
42
|
parallel (~> 1.10)
|
33
|
-
parser (>= 2.
|
43
|
+
parser (>= 2.7.0.1)
|
34
44
|
rainbow (>= 2.2.2, < 4.0)
|
45
|
+
rexml
|
35
46
|
ruby-progressbar (~> 1.7)
|
36
47
|
unicode-display_width (>= 1.4.0, < 1.7)
|
37
48
|
ruby-progressbar (1.10.1)
|
38
|
-
|
49
|
+
simplecov (0.13.0)
|
50
|
+
docile (~> 1.1.0)
|
51
|
+
json (>= 1.8, < 3)
|
52
|
+
simplecov-html (~> 0.10.0)
|
53
|
+
simplecov-html (0.10.2)
|
54
|
+
unicode-display_width (1.6.1)
|
39
55
|
|
40
56
|
PLATFORMS
|
41
57
|
ruby
|
42
58
|
|
43
59
|
DEPENDENCIES
|
44
60
|
bundler (~> 2.0)
|
61
|
+
codeclimate-test-reporter
|
45
62
|
ftpmock!
|
63
|
+
net-sftp
|
46
64
|
rake (~> 10.0)
|
47
65
|
rspec (~> 3.0)
|
48
|
-
rubocop (= 0.
|
66
|
+
rubocop (= 0.80.0)
|
67
|
+
simplecov
|
49
68
|
|
50
69
|
BUNDLED WITH
|
51
70
|
2.0.2
|
data/README.md
CHANGED
@@ -1,38 +1,162 @@
|
|
1
1
|
# Ftpmock
|
2
2
|
|
3
|
-
|
3
|
+
Test your FTP calls offline.
|
4
4
|
|
5
|
-
|
5
|
+
## Status
|
6
|
+
|
7
|
+
| Is It Working? | Is It Tested? | Code Quality | **# of Downloads** | **Get Involved!** |
|
8
|
+
|:---|:---|:---|:---|:---|
|
9
|
+
| [![Master Build Status](https://api.travis-ci.org/thejamespinto/ftpmock.svg?branch=master)](https://travis-ci.org/thejamespinto/ftpmock) | [![Test Coverage](https://api.codeclimate.com/v1/badges/25ac02fa4774e3fcb569/test_coverage)](https://codeclimate.com/github/thejamespinto/ftpmock/test_coverage) | [![Maintainability](https://api.codeclimate.com/v1/badges/25ac02fa4774e3fcb569/maintainability)](https://codeclimate.com/github/thejamespinto/ftpmock/maintainability) | [![Downloads](http://img.shields.io/gem/dt/ftpmock.svg)](https://rubygems.org/gems/ftpmock) | [![GitHub Issues](https://img.shields.io/github/issues/thejamespinto/ftpmock.svg)](https://github.com/thejamespinto/ftpmock/issues) |
|
10
|
+
|
11
|
+
## Compatibility
|
12
|
+
|
13
|
+
| <image width=16 src='./images/ruby.png'> Ruby 2.3 | <image width=16 src='./images/ruby.png'> Ruby 2.4 | <image width=16 src='./images/ruby.png'> Ruby 2.5 | <image width=16 src='./images/ruby.png'> Ruby 2.6 | <image width=16 src='./images/ruby.png'> Ruby 2.7 |
|
14
|
+
| :--- | :--- | :--- | :--- | :--- |
|
6
15
|
|
7
16
|
## Installation
|
8
17
|
|
9
18
|
Add this line to your application's Gemfile:
|
10
19
|
|
11
20
|
```ruby
|
12
|
-
|
21
|
+
group :test do
|
22
|
+
gem 'ftpmock'
|
23
|
+
end
|
13
24
|
```
|
14
25
|
|
15
|
-
|
26
|
+
## Usage
|
16
27
|
|
17
|
-
|
28
|
+
If you know your way around tests
|
18
29
|
|
19
|
-
|
30
|
+
```ruby
|
31
|
+
require 'ftpmock'
|
32
|
+
|
33
|
+
RSpec.configure do |config|
|
34
|
+
config.around(:example) do |example|
|
35
|
+
Ftpmock.on! do
|
36
|
+
example.run
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
40
|
+
```
|
20
41
|
|
21
|
-
|
42
|
+
If you need to see a full example
|
22
43
|
|
23
|
-
|
44
|
+
```ruby
|
45
|
+
require 'rubygems'
|
46
|
+
require 'test/unit'
|
47
|
+
require 'ftpmock'
|
48
|
+
|
49
|
+
# Optional (default values)
|
50
|
+
Ftpmock.configure do |c|
|
51
|
+
c.path = 'test/ftp_records'
|
52
|
+
c.verbose = true
|
53
|
+
end
|
54
|
+
|
55
|
+
class FtpmockTest < Test::Unit::TestCase
|
56
|
+
def test_ubuntu_mirror
|
57
|
+
Ftpmock.on! do
|
58
|
+
# Ubuntu Download - University of Pittsburgh
|
59
|
+
ftp = Net::FTP.new
|
60
|
+
assert_equal(Ftpmock::NetFtpProxy, ftp.class)
|
61
|
+
assert ftp.connect('mirror.cs.pitt.edu', 21)
|
62
|
+
assert ftp.login('', '')
|
63
|
+
|
64
|
+
t = Time.now
|
65
|
+
3.times do |i|
|
66
|
+
list = ftp.list('/ubuntu/releases')
|
67
|
+
assert list.size.positive?
|
68
|
+
|
69
|
+
ftp.get('/ubuntu/releases/robots.txt', 'tmp/ubuntu_robots.txt')
|
70
|
+
assert File.exist?('tmp/ubuntu_robots.txt')
|
71
|
+
|
72
|
+
puts "[Take #{i+1}] #{(Time.now-t).round(3)}s"
|
73
|
+
end
|
74
|
+
end
|
75
|
+
end
|
76
|
+
end
|
77
|
+
```
|
78
|
+
|
79
|
+
Run this test once, and Ftpmock will record the FTP requests to __test/ftp\_records/mirror-cs-pitt-edu\_21\_\_/__
|
80
|
+
|
81
|
+
Run it again, and Ftpmock will replay the responses from __mirror.cs.pitt.edu__ when the FTP request is made.
|
82
|
+
|
83
|
+
Your tests are now blazing fast because no real FTP requests are made anymore.
|
84
|
+
|
85
|
+
The test will continue to pass, even if you are offline, or if the University of Pittsburgh FTP servers are down for maintenance.
|
86
|
+
|
87
|
+
The responses will be accurate since they will contain the same list and files you get from a real request.
|
24
88
|
|
25
|
-
|
89
|
+
Unlike VCR, Ftpmock combines your four credentials _(address + port + username + password)_ and caches onto the exact same directory, optimizing for both storage and readability.
|
26
90
|
|
27
91
|
## Development
|
28
92
|
|
29
|
-
After checking out the repo, run `bin/setup` to install dependencies.
|
93
|
+
After checking out the repo, run `bin/setup` to install dependencies.
|
94
|
+
|
95
|
+
Then, run `bundle exec rake spec` to run the tests.
|
96
|
+
|
97
|
+
You can also run `bin/console` for an interactive prompt that will allow you to experiment.
|
98
|
+
|
99
|
+
To install this gem onto your local machine, run `bundle exec rake install`.
|
100
|
+
|
101
|
+
## Documentation
|
102
|
+
|
103
|
+
![Chart](./images/ftpmock.png)
|
104
|
+
|
105
|
+
- Core
|
106
|
+
- [x] Stubber
|
107
|
+
- [x] Configuration
|
108
|
+
- [x] Cache
|
109
|
+
- [x] Helpers
|
110
|
+
- Proxies
|
111
|
+
- [x] Proxy for Ruby's native Net::FTP library
|
112
|
+
- [ ] Proxy for Jamis Buck's gem 'net-sftp'
|
113
|
+
|
114
|
+
### Core instantiable classes & procedural modules
|
115
|
+
|
116
|
+
links: [lib/ftpmock/core](./lib/ftpmock/core)
|
117
|
+
|
118
|
+
- [x] stubber for proxies
|
119
|
+
- [x] configuration class
|
120
|
+
- [x] cache class
|
121
|
+
- [x] cache path helper
|
122
|
+
- [x] cache list helper
|
123
|
+
- [x] cache get helper
|
124
|
+
- [x] cache put helper
|
125
|
+
|
126
|
+
### Proxy for Ruby's native Net::FTP library (Ftpmock::NetFtpProxy)
|
127
|
+
|
128
|
+
links: [lib/ftpmock/proxies/net_ftp_proxy.rb](./lib/ftpmock/proxies/net_ftp_proxy.rb) , https://apidock.com/ruby/Net/FTP & https://github.com/ruby/ruby/tree/master/lib/net
|
129
|
+
|
130
|
+
- [x] proxy class
|
131
|
+
- [x] stubbers
|
132
|
+
- [x] address & port forwarding
|
133
|
+
- [x] username & password forwarding
|
134
|
+
- [x] chdir forwarding
|
135
|
+
- [x] pwd
|
136
|
+
- [x] list
|
137
|
+
- [x] get
|
138
|
+
- [x] put
|
139
|
+
- [ ] ssl support
|
140
|
+
- [x] unit tests
|
141
|
+
- [x] integration tests
|
142
|
+
|
143
|
+
### Proxy for Jamis Buck's gem 'net-sftp' (Ftpmock::NetSftpProxy)
|
144
|
+
|
145
|
+
links: [lib/ftpmock/proxies/net_sftp_proxy.rb](./lib/ftpmock/proxies/net_sftp_proxy.rb) , https://rubygems.org/gems/net-sftp & https://github.com/net-ssh/net-sftp
|
30
146
|
|
31
|
-
|
147
|
+
- [x] proxy class
|
148
|
+
- [x] stubbers
|
149
|
+
- [ ] address & port forwarding
|
150
|
+
- [ ] username & password forwarding
|
151
|
+
- [ ] list
|
152
|
+
- [ ] get
|
153
|
+
- [ ] put
|
154
|
+
- [ ] unit tests
|
155
|
+
- [ ] integration tests
|
32
156
|
|
33
157
|
## Contributing
|
34
158
|
|
35
|
-
Bug reports and pull requests are welcome on GitHub at https://github.com/
|
159
|
+
Bug reports and pull requests are welcome on GitHub at https://github.com/thejamespinto/ftpmock.
|
36
160
|
|
37
161
|
## License
|
38
162
|
|
data/ftpmock.gemspec
CHANGED
@@ -8,7 +8,7 @@ Gem::Specification.new do |spec|
|
|
8
8
|
spec.authors = ['James Pinto']
|
9
9
|
spec.email = ['thejamespinto@gmail.com']
|
10
10
|
|
11
|
-
spec.summary = '
|
11
|
+
spec.summary = 'Test your FTP calls offline.'
|
12
12
|
spec.description = 'Just like VCR and WebMock, but for FTP.'
|
13
13
|
spec.homepage = 'https://github.com/thejamespinto/ftpmock'
|
14
14
|
spec.license = 'MIT'
|
@@ -31,6 +31,11 @@ Gem::Specification.new do |spec|
|
|
31
31
|
spec.require_paths = ['lib']
|
32
32
|
|
33
33
|
spec.add_development_dependency 'bundler', '~> 2.0'
|
34
|
+
spec.add_development_dependency 'codeclimate-test-reporter'
|
35
|
+
spec.add_development_dependency 'net-sftp'
|
34
36
|
spec.add_development_dependency 'rake', '~> 10.0'
|
35
37
|
spec.add_development_dependency 'rspec', '~> 3.0'
|
38
|
+
spec.add_development_dependency 'simplecov'
|
39
|
+
|
40
|
+
spec.add_dependency 'diffy', '~> 3.0'
|
36
41
|
end
|
data/images/ftpmock.png
ADDED
Binary file
|
data/images/ruby.png
ADDED
Binary file
|
data/lib/ftpmock.rb
CHANGED
@@ -1,6 +1,24 @@
|
|
1
|
+
require 'pathname'
|
1
2
|
require 'ftpmock/version'
|
2
3
|
|
4
|
+
Dir['lib/ftpmock/{utils,core,helpers,proxies}/*.rb'].each do |f|
|
5
|
+
load f
|
6
|
+
end
|
7
|
+
|
3
8
|
module Ftpmock
|
4
9
|
class Error < StandardError; end
|
5
|
-
|
10
|
+
class GetNotFetched < StandardError; end
|
11
|
+
class PutFileNotFound < Error; end
|
12
|
+
class PutLocalDiffersFromCache < Error; end
|
13
|
+
|
14
|
+
def self.on!(&block)
|
15
|
+
NetFtpProxy.on! do
|
16
|
+
NetSftpProxy.on!(&block)
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
def self.off!
|
21
|
+
NetFtpProxy.off!
|
22
|
+
NetSftpProxy.off!
|
23
|
+
end
|
6
24
|
end
|
@@ -0,0 +1,186 @@
|
|
1
|
+
module Ftpmock
|
2
|
+
class Cache
|
3
|
+
attr_reader :credentials, :configuration
|
4
|
+
|
5
|
+
def initialize(configuration, credentials)
|
6
|
+
@configuration = configuration
|
7
|
+
@credentials = credentials
|
8
|
+
@chdir = nil
|
9
|
+
end
|
10
|
+
|
11
|
+
def path
|
12
|
+
@path ||= Pathname("#{configuration.path}/#{path_dir}")
|
13
|
+
end
|
14
|
+
|
15
|
+
def path_dir
|
16
|
+
StringUtils.parameterize(credentials.map(&:to_s).join('_'))
|
17
|
+
end
|
18
|
+
|
19
|
+
def _alert(tag, content, color = :green)
|
20
|
+
configuration.verbose && VerboseUtils.alert(tag, content, color)
|
21
|
+
end
|
22
|
+
|
23
|
+
def chdir(dirname = nil)
|
24
|
+
return @chdir if dirname.nil?
|
25
|
+
|
26
|
+
original = @chdir
|
27
|
+
@chdir = PathHelper.join(@chdir, dirname)
|
28
|
+
|
29
|
+
_chdir_alert(dirname, original, @chdir)
|
30
|
+
@chdir
|
31
|
+
end
|
32
|
+
|
33
|
+
def _chdir_alert(dirname, old_chdir, new_chdir)
|
34
|
+
tag = "ftpmock.cache.chdir '#{dirname}'"
|
35
|
+
|
36
|
+
_alert tag, "changed from '#{old_chdir}' to '#{new_chdir}'", :green
|
37
|
+
end
|
38
|
+
|
39
|
+
def list(*args)
|
40
|
+
key = args.join(',')
|
41
|
+
tag = _list_tag_for(key)
|
42
|
+
|
43
|
+
list = ListHelper.read(path, chdir, key)
|
44
|
+
_list_alert_hit(tag, list)
|
45
|
+
return list if list
|
46
|
+
|
47
|
+
_list_alert_miss(tag)
|
48
|
+
list = yield
|
49
|
+
|
50
|
+
_list_alert_storing(tag, list)
|
51
|
+
ListHelper.write(path, chdir, key, list)
|
52
|
+
|
53
|
+
list
|
54
|
+
end
|
55
|
+
|
56
|
+
def _list_tag_for(key)
|
57
|
+
tag = "ftpmock.cache.list '#{key}'"
|
58
|
+
tag += ", chdir: '#{chdir}'" if chdir
|
59
|
+
tag
|
60
|
+
end
|
61
|
+
|
62
|
+
def _list_alert_hit(tag, list)
|
63
|
+
list.nil? || _alert(tag, "hit! (#{list.size} lines)")
|
64
|
+
end
|
65
|
+
|
66
|
+
def _list_alert_miss(tag)
|
67
|
+
_alert tag, 'miss!', :yellow
|
68
|
+
end
|
69
|
+
|
70
|
+
def _list_alert_storing(tag, list)
|
71
|
+
_alert tag, "storing #{list.size} lines!"
|
72
|
+
end
|
73
|
+
|
74
|
+
def get(remotefile, localfile = File.basename(remotefile))
|
75
|
+
tag = _get_tag_for(remotefile)
|
76
|
+
|
77
|
+
if GetHelper.read(path, chdir, remotefile, localfile)
|
78
|
+
_get_alert_hit(tag, localfile)
|
79
|
+
return
|
80
|
+
end
|
81
|
+
|
82
|
+
_get_alert_miss(tag)
|
83
|
+
yield
|
84
|
+
|
85
|
+
if GetHelper.fetched?(localfile)
|
86
|
+
_get_alert_storing(tag, localfile)
|
87
|
+
GetHelper.write(path, chdir, remotefile, localfile)
|
88
|
+
else
|
89
|
+
_get_raise_localfile_not_fetched(remotefile, localfile)
|
90
|
+
end
|
91
|
+
end
|
92
|
+
|
93
|
+
def _get_tag_for(remotefile)
|
94
|
+
tag = "ftpmock.cache.get '#{remotefile}'"
|
95
|
+
tag += ", chdir: '#{chdir}'" if chdir
|
96
|
+
tag
|
97
|
+
end
|
98
|
+
|
99
|
+
def _get_alert_hit(tag, localfile)
|
100
|
+
_alert tag, "hit! (#{localfile})"
|
101
|
+
end
|
102
|
+
|
103
|
+
def _get_alert_miss(tag)
|
104
|
+
_alert tag, 'miss!', :yellow
|
105
|
+
end
|
106
|
+
|
107
|
+
def _get_alert_storing(tag, localfile)
|
108
|
+
_alert tag, "storing #{localfile}"
|
109
|
+
end
|
110
|
+
|
111
|
+
def _get_raise_localfile_not_fetched(remotefile, localfile)
|
112
|
+
msg = "FTP GET '#{remotefile}' should have created '#{localfile}'"
|
113
|
+
msg = "#{msg}, but didn't."
|
114
|
+
raise GetNotFetched, msg
|
115
|
+
end
|
116
|
+
|
117
|
+
def put(localfile, remotefile = File.basename(localfile))
|
118
|
+
tag = _put_tag_for(localfile)
|
119
|
+
|
120
|
+
_put_alert_exists(tag)
|
121
|
+
PutHelper.exist?(localfile) || _put_raise_not_found(remotefile, localfile)
|
122
|
+
|
123
|
+
if PutHelper.cached?(path, remotefile)
|
124
|
+
_put_cached(tag, path, localfile, remotefile)
|
125
|
+
else
|
126
|
+
_put_alert_miss(tag)
|
127
|
+
yield
|
128
|
+
|
129
|
+
_put_alert_storing(tag, remotefile)
|
130
|
+
PutHelper.write(path, localfile, remotefile)
|
131
|
+
end
|
132
|
+
|
133
|
+
true
|
134
|
+
end
|
135
|
+
|
136
|
+
def _put_tag_for(localfile)
|
137
|
+
tag = "ftpmock.cache.put '#{localfile}'"
|
138
|
+
tag += ", chdir: '#{chdir}'" if chdir
|
139
|
+
tag
|
140
|
+
end
|
141
|
+
|
142
|
+
def _put_alert_exists(tag)
|
143
|
+
_alert tag, 'file exists?'
|
144
|
+
end
|
145
|
+
|
146
|
+
def _put_alert_miss(tag)
|
147
|
+
_alert tag, 'miss!', :yellow
|
148
|
+
end
|
149
|
+
|
150
|
+
def _put_alert_storing(tag, remotefile)
|
151
|
+
_alert tag, "storing #{remotefile}"
|
152
|
+
end
|
153
|
+
|
154
|
+
def _put_cached(tag, path, localfile, remotefile)
|
155
|
+
diff = PutHelper.compare(path, localfile, remotefile)
|
156
|
+
|
157
|
+
_put_alert_hit(tag, diff.size)
|
158
|
+
|
159
|
+
diff.any? && _put_raise_localfile_differs(remotefile, localfile, diff)
|
160
|
+
end
|
161
|
+
|
162
|
+
def _put_alert_hit(tag, size)
|
163
|
+
color = size.zero? ? :green : :red
|
164
|
+
_alert tag, "hit! (#{size} differing lines)", color
|
165
|
+
end
|
166
|
+
|
167
|
+
def _put_raise_not_found(remotefile, localfile)
|
168
|
+
msg = "FTP PUT '#{remotefile}' has failed"
|
169
|
+
msg = "#{msg} because '#{localfile}' does not exist."
|
170
|
+
raise PutFileNotFound, msg
|
171
|
+
end
|
172
|
+
|
173
|
+
def _put_raise_localfile_differs(remotefile, localfile, diff)
|
174
|
+
spaces = ' ' * 20
|
175
|
+
VerboseUtils.puts
|
176
|
+
VerboseUtils.puts ColorUtils.highlight "#{spaces}Diffy Begin#{spaces}"
|
177
|
+
VerboseUtils.puts diff
|
178
|
+
VerboseUtils.puts ColorUtils.highlight "#{spaces} Diffy End #{spaces}"
|
179
|
+
VerboseUtils.puts
|
180
|
+
|
181
|
+
msg = "FTP PUT '#{remotefile}' has failed because"
|
182
|
+
msg = "#{msg} '#{localfile}' contents don't match #{path}/#{remotefile}"
|
183
|
+
raise PutLocalDiffersFromCache, msg
|
184
|
+
end
|
185
|
+
end
|
186
|
+
end
|