photocopier 0.0.10 → 1.0.0.pre
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/.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
|