photocopier 0.0.10 → 1.0.0.pre
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.gitignore +16 -0
- data/.rspec +2 -1
- data/.ruby-gemset +1 -0
- data/.ruby-version +1 -1
- data/.travis.yml +2 -2
- data/CHANGELOG.md +8 -0
- data/README.md +7 -7
- data/bin/console +7 -0
- data/bin/rspec +16 -0
- data/bin/setup +7 -0
- data/lib/photocopier/adapter.rb +1 -7
- data/lib/photocopier/ftp.rb +16 -19
- data/lib/photocopier/ssh.rb +27 -31
- data/lib/photocopier/version.rb +1 -1
- data/lib/photocopier.rb +11 -1
- data/photocopier.gemspec +29 -22
- metadata +74 -62
- data/.rvmrc +0 -1
- data/Gemfile.lock +0 -51
- data/spec/adapter_spec.rb +0 -6
- data/spec/ftp_spec.rb +0 -163
- data/spec/shared_examples_for_adapter.rb +0 -71
- data/spec/ssh_spec.rb +0 -161
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 3ba20dc26aeefaef97481f03d7195f203b74800c
|
4
|
+
data.tar.gz: 02e7e5bb7a24ad4052a39c75cb8d86f2e6125374
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: d568ac3259e1609af3efa5c0609385ef255a5479ce8d7800a7e068eab727ce1ad02dbabd3e805ac351ed4e2740f783dcdcb874aaa1c96964ecaeb63aea93474a
|
7
|
+
data.tar.gz: 9f5b43f82fbed2e7e78d459001a2a84aeb650fd56c494f1a1df2b03b8394955faf9334d4b9903a3530bd730ba57b8afbb8b1591568f43d128df8122690b89529
|
data/.gitignore
CHANGED
data/.rspec
CHANGED
@@ -1 +1,2 @@
|
|
1
|
-
--
|
1
|
+
--color
|
2
|
+
--require spec_helper
|
data/.ruby-gemset
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
photocopier
|
data/.ruby-version
CHANGED
@@ -1 +1 @@
|
|
1
|
-
2.
|
1
|
+
2.1.2
|
data/.travis.yml
CHANGED
data/CHANGELOG.md
ADDED
data/README.md
CHANGED
@@ -44,7 +44,7 @@ ssh.put('./local_file.txt', 'remote_file.txt')
|
|
44
44
|
# deletes a file
|
45
45
|
ssh.delete('remote_file.txt')
|
46
46
|
|
47
|
-
# mirros the remote directory into the local machine (needs rsync on the local machine)
|
47
|
+
# mirros the remote directory content into the local machine (needs rsync on the local machine)
|
48
48
|
ssh.get_directory('remote_dir', './local_dir')
|
49
49
|
|
50
50
|
# and viceversa
|
@@ -57,14 +57,14 @@ The very same commands are valid for the `Photocopier::FTP` adapter.
|
|
57
57
|
|
58
58
|
## FTP
|
59
59
|
|
60
|
-
`Photocopier::FTP.new` accepts the following parameters
|
61
|
-
all).
|
60
|
+
`Photocopier::FTP.new` accepts the following parameters
|
62
61
|
|
63
62
|
```ruby
|
64
63
|
{
|
65
|
-
host: '',
|
66
|
-
user: '',
|
67
|
-
password: ''
|
64
|
+
host: '', #mandatory
|
65
|
+
user: '', #mandatory
|
66
|
+
password: '', #mandatory
|
67
|
+
scheme: 'ftp' #default, could be any scheme compatibile with your lftp version
|
68
68
|
}
|
69
69
|
```
|
70
70
|
For performance reasons, the `.get_directory` and `.put_directory` commands make
|
@@ -107,7 +107,7 @@ On Linux, you can install it with your standard package manager. On Mac, you can
|
|
107
107
|
have it via [`brew`](https://github.com/mxcl/homebrew):
|
108
108
|
|
109
109
|
```
|
110
|
-
|
110
|
+
brew install https://raw.github.com/eugeneoden/homebrew/eca9de1/Library/Formula/sshpass.rb
|
111
111
|
```
|
112
112
|
|
113
113
|
**Please note that on Ubuntu 11.10 `sshpass` is at version 1.04, which has a
|
data/bin/console
ADDED
data/bin/rspec
ADDED
@@ -0,0 +1,16 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
#
|
3
|
+
# This file was generated by Bundler.
|
4
|
+
#
|
5
|
+
# The application 'rspec' is installed as part of a gem, and
|
6
|
+
# this file is here to facilitate running it.
|
7
|
+
#
|
8
|
+
|
9
|
+
require 'pathname'
|
10
|
+
ENV['BUNDLE_GEMFILE'] ||= File.expand_path("../../Gemfile",
|
11
|
+
Pathname.new(__FILE__).realpath)
|
12
|
+
|
13
|
+
require 'rubygems'
|
14
|
+
require 'bundler/setup'
|
15
|
+
|
16
|
+
load Gem.bin_path('rspec-core', 'rspec')
|
data/bin/setup
ADDED
data/lib/photocopier/adapter.rb
CHANGED
@@ -1,8 +1,3 @@
|
|
1
|
-
require 'escape'
|
2
|
-
require 'tempfile'
|
3
|
-
require 'logger'
|
4
|
-
require 'active_support/all'
|
5
|
-
|
6
1
|
module Photocopier
|
7
2
|
|
8
3
|
class Adapter
|
@@ -30,8 +25,7 @@ module Photocopier
|
|
30
25
|
|
31
26
|
protected
|
32
27
|
|
33
|
-
def run(
|
34
|
-
command = Escape.shell_command(args)
|
28
|
+
def run(command)
|
35
29
|
if logger.present?
|
36
30
|
logger.info command
|
37
31
|
end
|
data/lib/photocopier/ftp.rb
CHANGED
@@ -1,7 +1,3 @@
|
|
1
|
-
require 'net/ftp'
|
2
|
-
require 'photocopier/adapter'
|
3
|
-
require 'fileutils'
|
4
|
-
|
5
1
|
module Photocopier
|
6
2
|
class FTP < Adapter
|
7
3
|
|
@@ -34,6 +30,8 @@ module Photocopier
|
|
34
30
|
lftp(local_path, remote_path, true, exclude)
|
35
31
|
end
|
36
32
|
|
33
|
+
private
|
34
|
+
|
37
35
|
def session
|
38
36
|
if @session.nil?
|
39
37
|
@session = Net::FTP.open(options[:host], options[:user], options[:password])
|
@@ -42,26 +40,25 @@ module Photocopier
|
|
42
40
|
@session
|
43
41
|
end
|
44
42
|
|
45
|
-
private
|
46
|
-
|
47
43
|
def lftp(local, remote, reverse, exclude)
|
48
|
-
|
49
|
-
"-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
44
|
+
command = [
|
45
|
+
"set ftp:list-options -a",
|
46
|
+
"open #{remote_ftp_url}",
|
47
|
+
"mkdir -p #{Shellwords.escape(remote)}",
|
48
|
+
"cd #{Shellwords.escape(remote)}",
|
49
|
+
"lcd #{Shellwords.escape(local)}",
|
50
|
+
lftp_mirror_arguments(reverse, exclude)
|
51
|
+
].join("; ")
|
52
|
+
|
53
|
+
run "lftp -c '#{command}'"
|
58
54
|
end
|
59
55
|
|
60
56
|
def remote_ftp_url
|
61
|
-
url = "ftp
|
57
|
+
url = options[:scheme].presence || "ftp"
|
58
|
+
url << "://"
|
62
59
|
if options[:user].present?
|
63
|
-
url << options[:user]
|
64
|
-
url << ":#{options[:password]}" if options[:password].present?
|
60
|
+
url << CGI.escape(options[:user])
|
61
|
+
url << ":#{CGI.escape(options[:password])}" if options[:password].present?
|
65
62
|
url << "@"
|
66
63
|
end
|
67
64
|
url << options[:host]
|
data/lib/photocopier/ssh.rb
CHANGED
@@ -1,10 +1,3 @@
|
|
1
|
-
require 'net/ssh'
|
2
|
-
require 'net/ssh/gateway'
|
3
|
-
require 'net/scp'
|
4
|
-
require 'fileutils'
|
5
|
-
|
6
|
-
require 'photocopier/adapter'
|
7
|
-
|
8
1
|
module Photocopier
|
9
2
|
class SSH < Adapter
|
10
3
|
|
@@ -29,28 +22,18 @@ module Photocopier
|
|
29
22
|
end
|
30
23
|
|
31
24
|
def delete(remote_path)
|
32
|
-
exec!("rm -rf #{remote_path}")
|
25
|
+
exec!("rm -rf #{Shellwords.escape(remote_path)}")
|
33
26
|
end
|
34
27
|
|
35
28
|
def get_directory(remote_path, local_path, exclude = [])
|
36
29
|
FileUtils.mkdir_p(local_path)
|
30
|
+
remote_path << "/" unless remote_path.end_with?("/")
|
37
31
|
rsync ":#{remote_path}", local_path, exclude
|
38
32
|
end
|
39
33
|
|
40
34
|
def put_directory(local_path, remote_path, exclude = [])
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
def session
|
45
|
-
opts = options
|
46
|
-
host = opts.delete(:host)
|
47
|
-
user = opts.delete(:user)
|
48
|
-
|
49
|
-
@session ||= if gateway_options
|
50
|
-
gateway.ssh(host, user, opts)
|
51
|
-
else
|
52
|
-
Net::SSH.start(host, user, opts)
|
53
|
-
end
|
35
|
+
local_path << "/" unless local_path.end_with?("/")
|
36
|
+
rsync "#{local_path}", ":#{remote_path}", exclude
|
54
37
|
end
|
55
38
|
|
56
39
|
def exec!(cmd)
|
@@ -74,31 +57,47 @@ module Photocopier
|
|
74
57
|
[ stdout, stderr, exit_code ]
|
75
58
|
end
|
76
59
|
|
60
|
+
private
|
61
|
+
|
62
|
+
def session
|
63
|
+
opts = options
|
64
|
+
host = opts.delete(:host)
|
65
|
+
user = opts.delete(:user)
|
66
|
+
|
67
|
+
@session ||= if gateway_options
|
68
|
+
gateway.ssh(host, user, opts)
|
69
|
+
else
|
70
|
+
Net::SSH.start(host, user, opts)
|
71
|
+
end
|
72
|
+
end
|
73
|
+
|
77
74
|
def rsync_command
|
78
|
-
[
|
75
|
+
command = [
|
79
76
|
"rsync",
|
80
77
|
"--progress",
|
81
78
|
"-e",
|
82
|
-
rsh_arguments,
|
79
|
+
"'#{rsh_arguments}'",
|
83
80
|
"-rlpt",
|
84
81
|
"--compress",
|
85
82
|
"--omit-dir-times",
|
86
83
|
"--delete",
|
87
|
-
|
88
|
-
|
84
|
+
]
|
85
|
+
command.concat Shellwords.split(rsync_options) if rsync_options
|
86
|
+
command.compact
|
89
87
|
end
|
90
88
|
|
91
89
|
def rsync(source, destination, exclude = [])
|
92
90
|
command = rsync_command
|
93
91
|
|
94
|
-
exclude.
|
92
|
+
exclude.each do |glob|
|
95
93
|
command << "--exclude"
|
96
94
|
command << glob
|
97
95
|
end
|
98
96
|
|
99
|
-
command <<
|
97
|
+
command << Shellwords.escape(source)
|
98
|
+
command << Shellwords.escape(destination)
|
100
99
|
|
101
|
-
run
|
100
|
+
run command.join(" ")
|
102
101
|
end
|
103
102
|
|
104
103
|
def rsh_arguments
|
@@ -119,8 +118,6 @@ module Photocopier
|
|
119
118
|
command
|
120
119
|
end
|
121
120
|
|
122
|
-
private
|
123
|
-
|
124
121
|
def gateway
|
125
122
|
return unless gateway_options
|
126
123
|
|
@@ -130,6 +127,5 @@ module Photocopier
|
|
130
127
|
|
131
128
|
@gateway ||= Net::SSH::Gateway.new(host, user, opts)
|
132
129
|
end
|
133
|
-
|
134
130
|
end
|
135
131
|
end
|
data/lib/photocopier/version.rb
CHANGED
data/lib/photocopier.rb
CHANGED
@@ -1,4 +1,14 @@
|
|
1
|
-
require
|
1
|
+
require 'tempfile'
|
2
|
+
require 'logger'
|
3
|
+
require 'fileutils'
|
4
|
+
require 'net/ftp'
|
5
|
+
require 'net/ssh'
|
6
|
+
require 'net/ssh/gateway'
|
7
|
+
require 'net/scp'
|
8
|
+
require 'fileutils'
|
9
|
+
require 'shellwords'
|
10
|
+
require 'active_support/all'
|
2
11
|
|
12
|
+
require 'photocopier/adapter'
|
3
13
|
require "photocopier/ssh"
|
4
14
|
require "photocopier/ftp"
|
data/photocopier.gemspec
CHANGED
@@ -1,27 +1,34 @@
|
|
1
|
-
#
|
2
|
-
|
1
|
+
# coding: utf-8
|
2
|
+
lib = File.expand_path('../lib', __FILE__)
|
3
|
+
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
4
|
+
require "photocopier/version"
|
3
5
|
|
4
|
-
Gem::Specification.new do |
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
gem.homepage = "https://github.com/welaika/photocopier"
|
6
|
+
Gem::Specification.new do |spec|
|
7
|
+
spec.name = "photocopier"
|
8
|
+
spec.version = Photocopier::VERSION
|
9
|
+
spec.authors = ["Stefano Verna", "Ju Liu", "Fabrizio Monti"]
|
10
|
+
spec.email = ["stefano.verna@welaika.com", "ju.liu@welaika.com", "fabrizio.monti@welaika.com"]
|
10
11
|
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
gem.require_paths = ["lib"]
|
16
|
-
gem.version = Photocopier::VERSION
|
12
|
+
spec.summary = %q{Photocopier provides FTP/SSH adapters to abstract away file and directory copying.}
|
13
|
+
spec.description = %q{Photocopier provides FTP/SSH adapters to abstract away file and directory copying.}
|
14
|
+
spec.homepage = "https://github.com/welaika/photocopier"
|
15
|
+
spec.license = "MIT"
|
17
16
|
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
gem.add_dependency "net-ssh-gateway"
|
23
|
-
gem.add_dependency "escape"
|
17
|
+
spec.files = `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) }
|
18
|
+
spec.bindir = "exe"
|
19
|
+
spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
|
20
|
+
spec.require_paths = ["lib"]
|
24
21
|
|
25
|
-
|
26
|
-
|
22
|
+
spec.required_ruby_version = ">= 2.1.2"
|
23
|
+
|
24
|
+
spec.add_dependency "activesupport", "~> 4.2.0"
|
25
|
+
spec.add_dependency "net-ssh", "~> 2.9.2"
|
26
|
+
spec.add_dependency "net-scp", "~> 1.2.1"
|
27
|
+
spec.add_dependency "net-ssh-gateway", "~> 1.2.0"
|
28
|
+
spec.add_dependency "escape", "~> 0.0.4"
|
29
|
+
|
30
|
+
spec.add_development_dependency "bundler", ">= 1.6.2"
|
31
|
+
spec.add_development_dependency "rake", "~> 10.0"
|
32
|
+
spec.add_development_dependency "rspec", "~> 3.2"
|
33
|
+
spec.add_development_dependency "pry-byebug", "~> 3.0.1"
|
27
34
|
end
|
metadata
CHANGED
@@ -1,159 +1,175 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: photocopier
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 1.0.0.pre
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Stefano Verna
|
8
8
|
- Ju Liu
|
9
|
+
- Fabrizio Monti
|
9
10
|
autorequire:
|
10
|
-
bindir:
|
11
|
+
bindir: exe
|
11
12
|
cert_chain: []
|
12
|
-
date:
|
13
|
+
date: 2015-03-21 00:00:00.000000000 Z
|
13
14
|
dependencies:
|
14
15
|
- !ruby/object:Gem::Dependency
|
15
16
|
name: activesupport
|
16
17
|
requirement: !ruby/object:Gem::Requirement
|
17
18
|
requirements:
|
18
|
-
- -
|
19
|
+
- - "~>"
|
19
20
|
- !ruby/object:Gem::Version
|
20
|
-
version:
|
21
|
+
version: 4.2.0
|
21
22
|
type: :runtime
|
22
23
|
prerelease: false
|
23
24
|
version_requirements: !ruby/object:Gem::Requirement
|
24
25
|
requirements:
|
25
|
-
- -
|
26
|
+
- - "~>"
|
26
27
|
- !ruby/object:Gem::Version
|
27
|
-
version:
|
28
|
+
version: 4.2.0
|
28
29
|
- !ruby/object:Gem::Dependency
|
29
|
-
name:
|
30
|
+
name: net-ssh
|
30
31
|
requirement: !ruby/object:Gem::Requirement
|
31
32
|
requirements:
|
32
|
-
- -
|
33
|
+
- - "~>"
|
33
34
|
- !ruby/object:Gem::Version
|
34
|
-
version:
|
35
|
+
version: 2.9.2
|
35
36
|
type: :runtime
|
36
37
|
prerelease: false
|
37
38
|
version_requirements: !ruby/object:Gem::Requirement
|
38
39
|
requirements:
|
39
|
-
- -
|
40
|
+
- - "~>"
|
40
41
|
- !ruby/object:Gem::Version
|
41
|
-
version:
|
42
|
+
version: 2.9.2
|
42
43
|
- !ruby/object:Gem::Dependency
|
43
|
-
name: net-
|
44
|
+
name: net-scp
|
44
45
|
requirement: !ruby/object:Gem::Requirement
|
45
46
|
requirements:
|
46
|
-
- -
|
47
|
+
- - "~>"
|
47
48
|
- !ruby/object:Gem::Version
|
48
|
-
version:
|
49
|
+
version: 1.2.1
|
49
50
|
type: :runtime
|
50
51
|
prerelease: false
|
51
52
|
version_requirements: !ruby/object:Gem::Requirement
|
52
53
|
requirements:
|
53
|
-
- -
|
54
|
+
- - "~>"
|
54
55
|
- !ruby/object:Gem::Version
|
55
|
-
version:
|
56
|
+
version: 1.2.1
|
56
57
|
- !ruby/object:Gem::Dependency
|
57
|
-
name: net-
|
58
|
+
name: net-ssh-gateway
|
58
59
|
requirement: !ruby/object:Gem::Requirement
|
59
60
|
requirements:
|
60
|
-
- -
|
61
|
+
- - "~>"
|
61
62
|
- !ruby/object:Gem::Version
|
62
|
-
version:
|
63
|
+
version: 1.2.0
|
63
64
|
type: :runtime
|
64
65
|
prerelease: false
|
65
66
|
version_requirements: !ruby/object:Gem::Requirement
|
66
67
|
requirements:
|
67
|
-
- -
|
68
|
+
- - "~>"
|
68
69
|
- !ruby/object:Gem::Version
|
69
|
-
version:
|
70
|
+
version: 1.2.0
|
70
71
|
- !ruby/object:Gem::Dependency
|
71
|
-
name:
|
72
|
+
name: escape
|
72
73
|
requirement: !ruby/object:Gem::Requirement
|
73
74
|
requirements:
|
74
|
-
- -
|
75
|
+
- - "~>"
|
75
76
|
- !ruby/object:Gem::Version
|
76
|
-
version:
|
77
|
+
version: 0.0.4
|
77
78
|
type: :runtime
|
78
79
|
prerelease: false
|
79
80
|
version_requirements: !ruby/object:Gem::Requirement
|
80
81
|
requirements:
|
81
|
-
- -
|
82
|
+
- - "~>"
|
82
83
|
- !ruby/object:Gem::Version
|
83
|
-
version:
|
84
|
+
version: 0.0.4
|
84
85
|
- !ruby/object:Gem::Dependency
|
85
|
-
name:
|
86
|
+
name: bundler
|
86
87
|
requirement: !ruby/object:Gem::Requirement
|
87
88
|
requirements:
|
88
|
-
- -
|
89
|
+
- - ">="
|
89
90
|
- !ruby/object:Gem::Version
|
90
|
-
version:
|
91
|
-
type: :
|
91
|
+
version: 1.6.2
|
92
|
+
type: :development
|
92
93
|
prerelease: false
|
93
94
|
version_requirements: !ruby/object:Gem::Requirement
|
94
95
|
requirements:
|
95
|
-
- -
|
96
|
+
- - ">="
|
96
97
|
- !ruby/object:Gem::Version
|
97
|
-
version:
|
98
|
+
version: 1.6.2
|
98
99
|
- !ruby/object:Gem::Dependency
|
99
100
|
name: rake
|
100
101
|
requirement: !ruby/object:Gem::Requirement
|
101
102
|
requirements:
|
102
|
-
- -
|
103
|
+
- - "~>"
|
103
104
|
- !ruby/object:Gem::Version
|
104
|
-
version: '0'
|
105
|
+
version: '10.0'
|
105
106
|
type: :development
|
106
107
|
prerelease: false
|
107
108
|
version_requirements: !ruby/object:Gem::Requirement
|
108
109
|
requirements:
|
109
|
-
- -
|
110
|
+
- - "~>"
|
110
111
|
- !ruby/object:Gem::Version
|
111
|
-
version: '0'
|
112
|
+
version: '10.0'
|
112
113
|
- !ruby/object:Gem::Dependency
|
113
114
|
name: rspec
|
114
115
|
requirement: !ruby/object:Gem::Requirement
|
115
116
|
requirements:
|
116
|
-
- -
|
117
|
+
- - "~>"
|
118
|
+
- !ruby/object:Gem::Version
|
119
|
+
version: '3.2'
|
120
|
+
type: :development
|
121
|
+
prerelease: false
|
122
|
+
version_requirements: !ruby/object:Gem::Requirement
|
123
|
+
requirements:
|
124
|
+
- - "~>"
|
125
|
+
- !ruby/object:Gem::Version
|
126
|
+
version: '3.2'
|
127
|
+
- !ruby/object:Gem::Dependency
|
128
|
+
name: pry-byebug
|
129
|
+
requirement: !ruby/object:Gem::Requirement
|
130
|
+
requirements:
|
131
|
+
- - "~>"
|
117
132
|
- !ruby/object:Gem::Version
|
118
|
-
version:
|
133
|
+
version: 3.0.1
|
119
134
|
type: :development
|
120
135
|
prerelease: false
|
121
136
|
version_requirements: !ruby/object:Gem::Requirement
|
122
137
|
requirements:
|
123
|
-
- -
|
138
|
+
- - "~>"
|
124
139
|
- !ruby/object:Gem::Version
|
125
|
-
version:
|
140
|
+
version: 3.0.1
|
126
141
|
description: Photocopier provides FTP/SSH adapters to abstract away file and directory
|
127
142
|
copying.
|
128
143
|
email:
|
129
144
|
- stefano.verna@welaika.com
|
130
145
|
- ju.liu@welaika.com
|
146
|
+
- fabrizio.monti@welaika.com
|
131
147
|
executables: []
|
132
148
|
extensions: []
|
133
149
|
extra_rdoc_files: []
|
134
150
|
files:
|
135
|
-
- .gitignore
|
136
|
-
- .rspec
|
137
|
-
- .ruby-
|
138
|
-
- .
|
139
|
-
- .travis.yml
|
151
|
+
- ".gitignore"
|
152
|
+
- ".rspec"
|
153
|
+
- ".ruby-gemset"
|
154
|
+
- ".ruby-version"
|
155
|
+
- ".travis.yml"
|
156
|
+
- CHANGELOG.md
|
140
157
|
- Gemfile
|
141
|
-
- Gemfile.lock
|
142
158
|
- LICENSE
|
143
159
|
- README.md
|
144
160
|
- Rakefile
|
161
|
+
- bin/console
|
162
|
+
- bin/rspec
|
163
|
+
- bin/setup
|
145
164
|
- lib/photocopier.rb
|
146
165
|
- lib/photocopier/adapter.rb
|
147
166
|
- lib/photocopier/ftp.rb
|
148
167
|
- lib/photocopier/ssh.rb
|
149
168
|
- lib/photocopier/version.rb
|
150
169
|
- photocopier.gemspec
|
151
|
-
- spec/adapter_spec.rb
|
152
|
-
- spec/ftp_spec.rb
|
153
|
-
- spec/shared_examples_for_adapter.rb
|
154
|
-
- spec/ssh_spec.rb
|
155
170
|
homepage: https://github.com/welaika/photocopier
|
156
|
-
licenses:
|
171
|
+
licenses:
|
172
|
+
- MIT
|
157
173
|
metadata: {}
|
158
174
|
post_install_message:
|
159
175
|
rdoc_options: []
|
@@ -161,23 +177,19 @@ require_paths:
|
|
161
177
|
- lib
|
162
178
|
required_ruby_version: !ruby/object:Gem::Requirement
|
163
179
|
requirements:
|
164
|
-
- -
|
180
|
+
- - ">="
|
165
181
|
- !ruby/object:Gem::Version
|
166
|
-
version:
|
182
|
+
version: 2.1.2
|
167
183
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
168
184
|
requirements:
|
169
|
-
- -
|
185
|
+
- - ">"
|
170
186
|
- !ruby/object:Gem::Version
|
171
|
-
version:
|
187
|
+
version: 1.3.1
|
172
188
|
requirements: []
|
173
189
|
rubyforge_project:
|
174
|
-
rubygems_version: 2.
|
190
|
+
rubygems_version: 2.4.5
|
175
191
|
signing_key:
|
176
192
|
specification_version: 4
|
177
193
|
summary: Photocopier provides FTP/SSH adapters to abstract away file and directory
|
178
194
|
copying.
|
179
|
-
test_files:
|
180
|
-
- spec/adapter_spec.rb
|
181
|
-
- spec/ftp_spec.rb
|
182
|
-
- spec/shared_examples_for_adapter.rb
|
183
|
-
- spec/ssh_spec.rb
|
195
|
+
test_files: []
|
data/.rvmrc
DELETED
@@ -1 +0,0 @@
|
|
1
|
-
rvm use 1.9.3@photocopier
|
data/Gemfile.lock
DELETED
@@ -1,51 +0,0 @@
|
|
1
|
-
PATH
|
2
|
-
remote: .
|
3
|
-
specs:
|
4
|
-
photocopier (0.0.10)
|
5
|
-
activesupport
|
6
|
-
escape
|
7
|
-
i18n
|
8
|
-
net-scp
|
9
|
-
net-ssh
|
10
|
-
net-ssh-gateway
|
11
|
-
|
12
|
-
GEM
|
13
|
-
remote: https://rubygems.org/
|
14
|
-
specs:
|
15
|
-
activesupport (4.0.0)
|
16
|
-
i18n (~> 0.6, >= 0.6.4)
|
17
|
-
minitest (~> 4.2)
|
18
|
-
multi_json (~> 1.3)
|
19
|
-
thread_safe (~> 0.1)
|
20
|
-
tzinfo (~> 0.3.37)
|
21
|
-
atomic (1.1.13)
|
22
|
-
diff-lcs (1.1.3)
|
23
|
-
escape (0.0.4)
|
24
|
-
i18n (0.6.5)
|
25
|
-
minitest (4.7.5)
|
26
|
-
multi_json (1.7.9)
|
27
|
-
net-scp (1.1.2)
|
28
|
-
net-ssh (>= 2.6.5)
|
29
|
-
net-ssh (2.6.8)
|
30
|
-
net-ssh-gateway (1.2.0)
|
31
|
-
net-ssh (>= 2.6.5)
|
32
|
-
rake (10.1.0)
|
33
|
-
rspec (2.11.0)
|
34
|
-
rspec-core (~> 2.11.0)
|
35
|
-
rspec-expectations (~> 2.11.0)
|
36
|
-
rspec-mocks (~> 2.11.0)
|
37
|
-
rspec-core (2.11.1)
|
38
|
-
rspec-expectations (2.11.3)
|
39
|
-
diff-lcs (~> 1.1.3)
|
40
|
-
rspec-mocks (2.11.3)
|
41
|
-
thread_safe (0.1.2)
|
42
|
-
atomic
|
43
|
-
tzinfo (0.3.37)
|
44
|
-
|
45
|
-
PLATFORMS
|
46
|
-
ruby
|
47
|
-
|
48
|
-
DEPENDENCIES
|
49
|
-
photocopier!
|
50
|
-
rake
|
51
|
-
rspec
|
data/spec/adapter_spec.rb
DELETED
data/spec/ftp_spec.rb
DELETED
@@ -1,163 +0,0 @@
|
|
1
|
-
require 'photocopier/ftp'
|
2
|
-
require 'shared_examples_for_adapter'
|
3
|
-
|
4
|
-
describe Photocopier::FTP do
|
5
|
-
it_behaves_like "a Photocopier adapter"
|
6
|
-
|
7
|
-
let(:ftp) { Photocopier::FTP.new(options) }
|
8
|
-
let(:options) do { host: "host", user: "user", password: "password" } end
|
9
|
-
|
10
|
-
context "#session" do
|
11
|
-
it "retrieves an FTP session" do
|
12
|
-
Net::FTP.should_receive(:open).with("host", "user", "password")
|
13
|
-
ftp.session
|
14
|
-
end
|
15
|
-
|
16
|
-
context "passive mode" do
|
17
|
-
let(:options) do { host: "host", passive: true } end
|
18
|
-
let(:ftp) { double('ftp').as_null_object }
|
19
|
-
|
20
|
-
it "should enable passive mode" do
|
21
|
-
Net::FTP.stub(:open).and_return(ftp)
|
22
|
-
ftp.session.should be_passive
|
23
|
-
end
|
24
|
-
end
|
25
|
-
end
|
26
|
-
|
27
|
-
context "#remote_ftp_url" do
|
28
|
-
let(:options) do { host: "host" } end
|
29
|
-
|
30
|
-
it "should build an ftp url" do
|
31
|
-
ftp.send(:remote_ftp_url).should == "ftp://host"
|
32
|
-
end
|
33
|
-
|
34
|
-
context "given an username" do
|
35
|
-
let(:options) do { host: "host", user: "user" } end
|
36
|
-
|
37
|
-
it "should add it to the url" do
|
38
|
-
ftp.send(:remote_ftp_url).should == "ftp://user@host"
|
39
|
-
end
|
40
|
-
|
41
|
-
context "given a password" do
|
42
|
-
let(:options) do { host: "host", user: "user", password: "password" } end
|
43
|
-
|
44
|
-
it "should add it to the url" do
|
45
|
-
ftp.send(:remote_ftp_url).should == "ftp://user:password@host"
|
46
|
-
end
|
47
|
-
end
|
48
|
-
end
|
49
|
-
end
|
50
|
-
|
51
|
-
context "#lftp_mirror_arguments" do
|
52
|
-
let(:lftp_arguments) do
|
53
|
-
%w(
|
54
|
-
mirror
|
55
|
-
--delete
|
56
|
-
--use-cache
|
57
|
-
--verbose
|
58
|
-
--allow-chown
|
59
|
-
--allow-suid
|
60
|
-
--no-umask
|
61
|
-
--parallel=2
|
62
|
-
)
|
63
|
-
end
|
64
|
-
|
65
|
-
it "should build arguments for lftp" do
|
66
|
-
ftp.send(:lftp_mirror_arguments, false, []).should == lftp_arguments.join(" ")
|
67
|
-
end
|
68
|
-
|
69
|
-
it "should build args for reverse mirroring" do
|
70
|
-
lftp_arguments << "--reverse"
|
71
|
-
ftp.send(:lftp_mirror_arguments, true, []).should == lftp_arguments.join(" ")
|
72
|
-
end
|
73
|
-
|
74
|
-
it "should exclude files" do
|
75
|
-
lftp_arguments << "--exclude-glob .git"
|
76
|
-
ftp.send(:lftp_mirror_arguments, false, [".git"]).should == lftp_arguments.join(" ")
|
77
|
-
end
|
78
|
-
end
|
79
|
-
|
80
|
-
context "#lftp" do
|
81
|
-
|
82
|
-
let(:remote) { "remote" }
|
83
|
-
let(:local) { "local" }
|
84
|
-
|
85
|
-
before(:each) do
|
86
|
-
ftp.stub(:remote_ftp_url).and_return("remote_ftp_url")
|
87
|
-
ftp.stub(:lftp_mirror_arguments).and_return("lftp_mirror_arguments")
|
88
|
-
end
|
89
|
-
|
90
|
-
let(:lftp_command) do
|
91
|
-
[
|
92
|
-
"lftp",
|
93
|
-
"-c",
|
94
|
-
[
|
95
|
-
"set ftp:list-options -a",
|
96
|
-
"open remote_ftp_url",
|
97
|
-
"mkdir -p #{remote}",
|
98
|
-
"cd #{remote}",
|
99
|
-
"lcd #{local}",
|
100
|
-
"lftp_mirror_arguments"
|
101
|
-
].join("; ")
|
102
|
-
]
|
103
|
-
end
|
104
|
-
|
105
|
-
it "should build a lftp command" do
|
106
|
-
ftp.should_receive(:run).with(*lftp_command)
|
107
|
-
ftp.send(:lftp, local, remote, false, [])
|
108
|
-
end
|
109
|
-
end
|
110
|
-
|
111
|
-
context "adapter interface" do
|
112
|
-
|
113
|
-
let(:remote_path) { double }
|
114
|
-
let(:local_path) { double }
|
115
|
-
let(:file_path) { double }
|
116
|
-
let(:session) { double }
|
117
|
-
|
118
|
-
before(:each) do
|
119
|
-
ftp.stub(:session).and_return(session)
|
120
|
-
end
|
121
|
-
|
122
|
-
context "#get" do
|
123
|
-
it "should get a remote path" do
|
124
|
-
session.should_receive(:get).with(remote_path, file_path)
|
125
|
-
ftp.get(remote_path, file_path)
|
126
|
-
end
|
127
|
-
end
|
128
|
-
|
129
|
-
context "#put_file" do
|
130
|
-
it "should send a file to remote" do
|
131
|
-
session.should_receive(:put).with(file_path, remote_path)
|
132
|
-
ftp.put_file(file_path, remote_path)
|
133
|
-
end
|
134
|
-
end
|
135
|
-
|
136
|
-
context "#delete" do
|
137
|
-
it "should delete a remote path" do
|
138
|
-
session.should_receive(:delete).with(remote_path)
|
139
|
-
ftp.delete(remote_path)
|
140
|
-
end
|
141
|
-
end
|
142
|
-
|
143
|
-
context "directories management" do
|
144
|
-
let(:remote_path) { "remote_path" }
|
145
|
-
let(:exclude_list) { [] }
|
146
|
-
|
147
|
-
context "#get_directory" do
|
148
|
-
it "should get a remote directory" do
|
149
|
-
FileUtils.should_receive(:mkdir_p).with(local_path)
|
150
|
-
ftp.should_receive(:lftp).with(local_path, remote_path, false, exclude_list)
|
151
|
-
ftp.get_directory(remote_path, local_path, exclude_list)
|
152
|
-
end
|
153
|
-
end
|
154
|
-
|
155
|
-
context "#put_directory" do
|
156
|
-
it "should send a directory to remote" do
|
157
|
-
ftp.should_receive(:lftp).with(local_path, remote_path, true, exclude_list)
|
158
|
-
ftp.put_directory(local_path, remote_path, exclude_list)
|
159
|
-
end
|
160
|
-
end
|
161
|
-
end
|
162
|
-
end
|
163
|
-
end
|
@@ -1,71 +0,0 @@
|
|
1
|
-
require 'photocopier/adapter'
|
2
|
-
|
3
|
-
shared_examples_for "a Photocopier adapter" do
|
4
|
-
let(:adapter) { described_class.new }
|
5
|
-
|
6
|
-
context "adapter interface" do
|
7
|
-
it "should expose all adapter methods" do
|
8
|
-
[
|
9
|
-
:put,
|
10
|
-
:put_file,
|
11
|
-
:put_directory,
|
12
|
-
:get,
|
13
|
-
:get_directory,
|
14
|
-
:delete
|
15
|
-
].each do |sym|
|
16
|
-
adapter.should respond_to(sym)
|
17
|
-
end
|
18
|
-
end
|
19
|
-
end
|
20
|
-
|
21
|
-
context "#put" do
|
22
|
-
let(:file_path) { Tempfile.new("tmp").path }
|
23
|
-
let(:remote_path) { double }
|
24
|
-
|
25
|
-
context "given a real file path" do
|
26
|
-
it "should put a file" do
|
27
|
-
adapter.should_receive(:put_file).with(file_path, remote_path)
|
28
|
-
adapter.put(file_path, remote_path)
|
29
|
-
end
|
30
|
-
end
|
31
|
-
|
32
|
-
context "given a string" do
|
33
|
-
let(:string) { "foobar" }
|
34
|
-
let(:file) { double(path: "path") }
|
35
|
-
|
36
|
-
it "should write it to file, put it and remove the file" do
|
37
|
-
Tempfile.stub(:new).and_return(file)
|
38
|
-
|
39
|
-
file.should_receive(:write).with(string)
|
40
|
-
file.should_receive(:close)
|
41
|
-
adapter.should_receive(:put_file).with("path", remote_path)
|
42
|
-
file.should_receive(:unlink)
|
43
|
-
|
44
|
-
adapter.put(string, remote_path)
|
45
|
-
end
|
46
|
-
end
|
47
|
-
|
48
|
-
context "#run" do
|
49
|
-
let(:arg) { double }
|
50
|
-
let(:command) { double }
|
51
|
-
before(:each) {
|
52
|
-
Escape.stub(:shell_command).with([arg]).and_return(command)
|
53
|
-
}
|
54
|
-
|
55
|
-
it "should delegate to Kernel system" do
|
56
|
-
adapter.should_receive(:system).with(command)
|
57
|
-
adapter.send(:run, arg)
|
58
|
-
end
|
59
|
-
|
60
|
-
context "given a logger" do
|
61
|
-
let(:logger) { double }
|
62
|
-
|
63
|
-
it "should send the command to the logger" do
|
64
|
-
adapter.logger = logger
|
65
|
-
logger.should_receive(:info).with(command)
|
66
|
-
adapter.send(:run, arg)
|
67
|
-
end
|
68
|
-
end
|
69
|
-
end
|
70
|
-
end
|
71
|
-
end
|
data/spec/ssh_spec.rb
DELETED
@@ -1,161 +0,0 @@
|
|
1
|
-
require 'photocopier/ssh'
|
2
|
-
require 'shared_examples_for_adapter'
|
3
|
-
|
4
|
-
describe Photocopier::SSH do
|
5
|
-
it_behaves_like "a Photocopier adapter"
|
6
|
-
|
7
|
-
let(:ssh) { Photocopier::SSH.new(options) }
|
8
|
-
let(:options) do { host: "host", user: "user" } end
|
9
|
-
let(:gateway_config) do { host: "gate_host", user: "gate_user" } end
|
10
|
-
let(:options_with_gateway) do
|
11
|
-
{
|
12
|
-
host: "host",
|
13
|
-
user: "user",
|
14
|
-
gateway: gateway_config
|
15
|
-
}
|
16
|
-
end
|
17
|
-
|
18
|
-
context "#session" do
|
19
|
-
it "retrieves an SSH session" do
|
20
|
-
Net::SSH.should_receive(:start).with("host", "user", {})
|
21
|
-
ssh.session
|
22
|
-
end
|
23
|
-
|
24
|
-
context "given a gateway " do
|
25
|
-
let(:options) { options_with_gateway }
|
26
|
-
let(:gateway) { double }
|
27
|
-
|
28
|
-
it "goes through it to retrieve a session" do
|
29
|
-
Net::SSH::Gateway.stub(:new).with("gate_host", "gate_user", {}).and_return(gateway)
|
30
|
-
gateway.should_receive(:ssh).with("host", "user", {})
|
31
|
-
ssh.session
|
32
|
-
end
|
33
|
-
end
|
34
|
-
end
|
35
|
-
|
36
|
-
context "#ssh_command" do
|
37
|
-
let(:options) do { host: "host" } end
|
38
|
-
|
39
|
-
it "should build an ssh command" do
|
40
|
-
ssh.ssh_command(options).should == "ssh host"
|
41
|
-
end
|
42
|
-
|
43
|
-
context "given a port" do
|
44
|
-
let(:options) do { host: "host", port: "port" } end
|
45
|
-
it "should be added to the command" do
|
46
|
-
ssh.ssh_command(options).should == "ssh -p port host"
|
47
|
-
end
|
48
|
-
end
|
49
|
-
|
50
|
-
context "given a user" do
|
51
|
-
let(:options) do { host: "host", user: "user" } end
|
52
|
-
it "should be added to the command" do
|
53
|
-
ssh.ssh_command(options).should == "ssh user@host"
|
54
|
-
end
|
55
|
-
end
|
56
|
-
|
57
|
-
context "given a password" do
|
58
|
-
let(:options) do { host: "host", password: "password" } end
|
59
|
-
|
60
|
-
it "sshpass should be added to the command" do
|
61
|
-
ssh.ssh_command(options).should == "sshpass -p password ssh host"
|
62
|
-
end
|
63
|
-
end
|
64
|
-
end
|
65
|
-
|
66
|
-
context "#rsh_arguments" do
|
67
|
-
it "should build arguments for rsync" do
|
68
|
-
ssh.should_receive(:ssh_command).with(options)
|
69
|
-
ssh.rsh_arguments
|
70
|
-
end
|
71
|
-
|
72
|
-
context "given a gateway" do
|
73
|
-
let(:options) { options_with_gateway }
|
74
|
-
|
75
|
-
it "should include gateway options" do
|
76
|
-
ssh.should_receive(:ssh_command).with(gateway_config)
|
77
|
-
ssh.should_receive(:ssh_command).with(options)
|
78
|
-
ssh.rsh_arguments
|
79
|
-
end
|
80
|
-
end
|
81
|
-
end
|
82
|
-
|
83
|
-
context "#rsync" do
|
84
|
-
before(:each) do
|
85
|
-
ssh.stub(:rsh_arguments).and_return("rsh_arguments")
|
86
|
-
ssh.stub(:rsync_options).and_return("rsync_options")
|
87
|
-
end
|
88
|
-
|
89
|
-
let(:rsync_command) { ssh.rsync_command }
|
90
|
-
|
91
|
-
it "should build an rsync command" do
|
92
|
-
rsync_command << "source/" << "destination"
|
93
|
-
ssh.should_receive(:run).with(*rsync_command)
|
94
|
-
ssh.rsync("source", "destination")
|
95
|
-
end
|
96
|
-
|
97
|
-
context "given an exclude list" do
|
98
|
-
it "should skip excluded paths" do
|
99
|
-
rsync_command << "--exclude" << ".git"
|
100
|
-
rsync_command << "source/" << "destination"
|
101
|
-
ssh.should_receive(:run).with(*rsync_command)
|
102
|
-
ssh.rsync("source", "destination", [".git"])
|
103
|
-
end
|
104
|
-
end
|
105
|
-
end
|
106
|
-
|
107
|
-
context "adapter interface" do
|
108
|
-
|
109
|
-
let(:remote_path) { double }
|
110
|
-
let(:local_path) { double }
|
111
|
-
let(:file_path) { double }
|
112
|
-
let(:scp) { double }
|
113
|
-
let(:session) { double(scp: scp) }
|
114
|
-
|
115
|
-
before(:each) do
|
116
|
-
ssh.stub(:session).and_return(session)
|
117
|
-
end
|
118
|
-
|
119
|
-
context "#get" do
|
120
|
-
it "should get a remote path" do
|
121
|
-
scp.should_receive(:download!).with(remote_path, file_path)
|
122
|
-
ssh.get(remote_path, file_path)
|
123
|
-
end
|
124
|
-
end
|
125
|
-
|
126
|
-
context "#put_file" do
|
127
|
-
it "should send a file to remote" do
|
128
|
-
scp.should_receive(:upload!).with(file_path, remote_path)
|
129
|
-
ssh.put_file(file_path, remote_path)
|
130
|
-
end
|
131
|
-
end
|
132
|
-
|
133
|
-
context "#delete" do
|
134
|
-
it "should delete a remote path" do
|
135
|
-
ssh.should_receive(:exec!).with("rm -rf foo")
|
136
|
-
ssh.delete("foo")
|
137
|
-
end
|
138
|
-
end
|
139
|
-
|
140
|
-
context "directories management" do
|
141
|
-
let(:remote_path) { "remote_path" }
|
142
|
-
let(:exclude_list) { [] }
|
143
|
-
|
144
|
-
context "#get_directory" do
|
145
|
-
it "should get a remote directory" do
|
146
|
-
FileUtils.should_receive(:mkdir_p).with(local_path)
|
147
|
-
ssh.should_receive(:rsync).with(":remote_path", local_path, exclude_list)
|
148
|
-
ssh.get_directory(remote_path, local_path, exclude_list)
|
149
|
-
end
|
150
|
-
end
|
151
|
-
|
152
|
-
context "#put_directory" do
|
153
|
-
it "should send a directory to remote" do
|
154
|
-
ssh.should_receive(:rsync).with(local_path, ":remote_path", exclude_list)
|
155
|
-
ssh.put_directory(local_path, remote_path, exclude_list)
|
156
|
-
end
|
157
|
-
end
|
158
|
-
end
|
159
|
-
end
|
160
|
-
|
161
|
-
end
|