bfs-scp 0.4.3 → 0.6.1
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/bfs-scp.gemspec +1 -1
- data/lib/bfs/bucket/scp.rb +29 -17
- data/spec/bfs/bucket/scp_spec.rb +26 -5
- metadata +6 -6
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 806a4a94596c4967bf51c5017c05cc60444a65ef67c8f76e9eb13448d8989428
|
4
|
+
data.tar.gz: 465ff7c8af4987f2ac97311cfb8039d584193a60e5837dfca2ba7759986d87cb
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 459ec003bfbd273b9aee278f8fd81533b5d0493d573eefa8c6f9303b9e8d1bb444216ab9bd9d1785b3c92ac0e3e60fce8233535374b9be59658b82c85c7ebe4a
|
7
|
+
data.tar.gz: 5b54beb2bd9b9bcfdd40e621adabbb71d34421eee4cddfbae59c0b6c2a32f5fe1156a0657db539880766c33d437d28d2adb458213f7d4eb50e25ffc240ac617a
|
data/bfs-scp.gemspec
CHANGED
@@ -15,7 +15,7 @@ Gem::Specification.new do |s|
|
|
15
15
|
s.files = `git ls-files`.split("\n")
|
16
16
|
s.test_files = `git ls-files -- spec/*`.split("\n")
|
17
17
|
s.require_paths = ['lib']
|
18
|
-
s.required_ruby_version = '>= 2.
|
18
|
+
s.required_ruby_version = '>= 2.5.0'
|
19
19
|
|
20
20
|
s.add_dependency 'bfs', s.version
|
21
21
|
s.add_dependency 'net-scp'
|
data/lib/bfs/bucket/scp.rb
CHANGED
@@ -10,7 +10,7 @@ module BFS
|
|
10
10
|
class CommandError < RuntimeError
|
11
11
|
attr_reader :status
|
12
12
|
|
13
|
-
def initialize(cmd, status, extra=nil)
|
13
|
+
def initialize(cmd, status, extra = nil)
|
14
14
|
@status = status
|
15
15
|
super ["Command '#{cmd}' exited with status #{status}", extra].join(': ')
|
16
16
|
end
|
@@ -28,30 +28,30 @@ module BFS
|
|
28
28
|
# @option opts [Integer] :keepalive_interval interval if keepalive enabled. Default: 300.
|
29
29
|
# @option opts [Array<String>] :keys an array of file names of private keys to use for publickey and hostbased authentication.
|
30
30
|
# @option opts [Boolean|Symbol] :verify_host_key specifying how strict host-key verification should be, either false, true, :very, or :secure.
|
31
|
-
def initialize(host, opts
|
31
|
+
def initialize(host, **opts)
|
32
32
|
opts = opts.dup
|
33
33
|
opts.keys.each do |key|
|
34
34
|
val = opts.delete(key)
|
35
35
|
opts[key.to_sym] = val unless val.nil?
|
36
36
|
end
|
37
|
-
super(opts)
|
37
|
+
super(**opts)
|
38
38
|
|
39
39
|
@prefix = opts.delete(:prefix)
|
40
|
-
@client = Net::SCP.start(host, nil, opts)
|
40
|
+
@client = Net::SCP.start(host, nil, **opts)
|
41
41
|
|
42
42
|
if @prefix # rubocop:disable Style/GuardClause
|
43
43
|
@prefix = norm_path(@prefix) + '/'
|
44
|
-
mkdir_p(@prefix)
|
44
|
+
mkdir_p abs_path(@prefix)
|
45
45
|
end
|
46
46
|
end
|
47
47
|
|
48
48
|
# Lists the contents of a bucket using a glob pattern
|
49
|
-
def ls(pattern='**/*', _opts
|
50
|
-
prefix = @prefix
|
49
|
+
def ls(pattern = '**/*', **_opts)
|
50
|
+
prefix = @prefix ? abs_path(@prefix) : '/'
|
51
51
|
Enumerator.new do |y|
|
52
52
|
sh! 'find', prefix, '-type', 'f' do |out|
|
53
53
|
out.each_line do |line|
|
54
|
-
path = trim_prefix(line.strip)
|
54
|
+
path = trim_prefix(norm_path(line.strip))
|
55
55
|
y << path if File.fnmatch?(pattern, path, File::FNM_PATHNAME)
|
56
56
|
end
|
57
57
|
end
|
@@ -59,7 +59,7 @@ module BFS
|
|
59
59
|
end
|
60
60
|
|
61
61
|
# Info returns the object info
|
62
|
-
def info(path, _opts
|
62
|
+
def info(path, **_opts)
|
63
63
|
full = full_path(path)
|
64
64
|
path = norm_path(path)
|
65
65
|
out = sh! 'stat', '-c', '%s;%Z', full
|
@@ -71,12 +71,15 @@ module BFS
|
|
71
71
|
end
|
72
72
|
|
73
73
|
# Creates a new file and opens it for writing
|
74
|
-
|
74
|
+
# @option opts [String|Encoding] :encoding Custom file encoding.
|
75
|
+
# @option opts [Integer] :perm Custom file permission, default: 0600.
|
76
|
+
def create(path, **opts, &block)
|
75
77
|
full = full_path(path)
|
78
|
+
perm = opts[:perm]
|
76
79
|
enc = opts.delete(:encoding) || @encoding
|
77
|
-
temp = BFS::TempWriter.new(path, encoding: enc) do |temp_path|
|
80
|
+
temp = BFS::TempWriter.new(path, perm: perm, encoding: enc) do |temp_path|
|
78
81
|
mkdir_p File.dirname(full)
|
79
|
-
@client.upload!(temp_path, full)
|
82
|
+
@client.upload!(temp_path, full, preserve: true)
|
80
83
|
end
|
81
84
|
return temp unless block
|
82
85
|
|
@@ -88,7 +91,7 @@ module BFS
|
|
88
91
|
end
|
89
92
|
|
90
93
|
# Opens an existing file for reading
|
91
|
-
def open(path, opts
|
94
|
+
def open(path, **opts, &block)
|
92
95
|
full = full_path(path)
|
93
96
|
enc = opts.delete(:encoding) || @encoding
|
94
97
|
temp = Tempfile.new(File.basename(path), encoding: enc)
|
@@ -101,7 +104,7 @@ module BFS
|
|
101
104
|
end
|
102
105
|
|
103
106
|
# Deletes a file.
|
104
|
-
def rm(path, _opts
|
107
|
+
def rm(path, **_opts)
|
105
108
|
path = full_path(path)
|
106
109
|
sh! 'rm', '-f', path
|
107
110
|
end
|
@@ -110,7 +113,7 @@ module BFS
|
|
110
113
|
#
|
111
114
|
# @param [String] src The source path.
|
112
115
|
# @param [String] dst The destination path.
|
113
|
-
def cp(src, dst, _opts
|
116
|
+
def cp(src, dst, **_opts)
|
114
117
|
full_src = full_path(src)
|
115
118
|
full_dst = full_path(dst)
|
116
119
|
|
@@ -124,7 +127,7 @@ module BFS
|
|
124
127
|
#
|
125
128
|
# @param [String] src The source path.
|
126
129
|
# @param [String] dst The destination path.
|
127
|
-
def mv(src, dst, _opts
|
130
|
+
def mv(src, dst, **_opts)
|
128
131
|
full_src = full_path(src)
|
129
132
|
full_dst = full_path(dst)
|
130
133
|
|
@@ -141,6 +144,15 @@ module BFS
|
|
141
144
|
|
142
145
|
private
|
143
146
|
|
147
|
+
def abs_path(path)
|
148
|
+
path = "/#{path}" unless path.start_with?('~/', './')
|
149
|
+
path
|
150
|
+
end
|
151
|
+
|
152
|
+
def full_path(*)
|
153
|
+
abs_path(super)
|
154
|
+
end
|
155
|
+
|
144
156
|
def mkdir_p(path)
|
145
157
|
sh! 'mkdir', '-p', path
|
146
158
|
end
|
@@ -186,5 +198,5 @@ BFS.register('scp', 'ssh') do |url|
|
|
186
198
|
opts[:password] ||= CGI.unescape(url.password) if url.password
|
187
199
|
opts[:port] ||= url.port if url.port
|
188
200
|
|
189
|
-
BFS::Bucket::SCP.new
|
201
|
+
BFS::Bucket::SCP.new(url.host, **opts)
|
190
202
|
end
|
data/spec/bfs/bucket/scp_spec.rb
CHANGED
@@ -13,15 +13,36 @@ run_spec = \
|
|
13
13
|
end
|
14
14
|
|
15
15
|
RSpec.describe BFS::Bucket::SCP, if: run_spec do
|
16
|
-
|
17
|
-
|
16
|
+
context 'absolute' do
|
17
|
+
subject { described_class.new sandbox[:host], **sandbox[:opts].merge(prefix: SecureRandom.uuid) }
|
18
|
+
after { subject.close }
|
18
19
|
|
19
|
-
|
20
|
-
|
21
|
-
|
20
|
+
it_behaves_like 'a bucket', content_type: false, metadata: false
|
21
|
+
end
|
22
|
+
|
23
|
+
context 'relative' do
|
24
|
+
subject { described_class.new sandbox[:host], **sandbox[:opts].merge(prefix: "~/#{SecureRandom.uuid}") }
|
25
|
+
after { subject.close }
|
26
|
+
|
27
|
+
it_behaves_like 'a bucket', content_type: false, metadata: false
|
28
|
+
end
|
22
29
|
|
23
30
|
it 'should resolve from URL' do
|
24
31
|
bucket = BFS.resolve('scp://root:root@127.0.0.1:7022')
|
25
32
|
expect(bucket).to be_instance_of(described_class)
|
26
33
|
end
|
34
|
+
|
35
|
+
it 'should handle absolute and relative paths' do
|
36
|
+
abs = BFS::Blob.new("scp://root:root@127.0.0.1:7022/#{SecureRandom.uuid}/file.txt")
|
37
|
+
abs.create {|w| w.write 'absolute' }
|
38
|
+
|
39
|
+
rel = BFS::Blob.new("scp://root:root@127.0.0.1:7022/~/#{SecureRandom.uuid}/file.txt")
|
40
|
+
rel.create {|w| w.write 'relative' }
|
41
|
+
|
42
|
+
expect(abs.read).to eq('absolute')
|
43
|
+
expect(rel.read).to eq('relative')
|
44
|
+
|
45
|
+
abs.close
|
46
|
+
rel.close
|
47
|
+
end
|
27
48
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: bfs-scp
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.6.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Dimitrij Denissenko
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2020-02-11 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bfs
|
@@ -16,14 +16,14 @@ dependencies:
|
|
16
16
|
requirements:
|
17
17
|
- - '='
|
18
18
|
- !ruby/object:Gem::Version
|
19
|
-
version: 0.
|
19
|
+
version: 0.6.1
|
20
20
|
type: :runtime
|
21
21
|
prerelease: false
|
22
22
|
version_requirements: !ruby/object:Gem::Requirement
|
23
23
|
requirements:
|
24
24
|
- - '='
|
25
25
|
- !ruby/object:Gem::Version
|
26
|
-
version: 0.
|
26
|
+
version: 0.6.1
|
27
27
|
- !ruby/object:Gem::Dependency
|
28
28
|
name: net-scp
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|
@@ -60,14 +60,14 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
60
60
|
requirements:
|
61
61
|
- - ">="
|
62
62
|
- !ruby/object:Gem::Version
|
63
|
-
version: 2.
|
63
|
+
version: 2.5.0
|
64
64
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
65
65
|
requirements:
|
66
66
|
- - ">="
|
67
67
|
- !ruby/object:Gem::Version
|
68
68
|
version: '0'
|
69
69
|
requirements: []
|
70
|
-
rubygems_version: 3.
|
70
|
+
rubygems_version: 3.1.2
|
71
71
|
signing_key:
|
72
72
|
specification_version: 4
|
73
73
|
summary: SCP/SSH adapter for bfs
|