bfs-s3 0.2.2 → 0.3.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/bfs-s3.gemspec +1 -1
- data/lib/bfs/bucket/s3.rb +12 -4
- data/spec/bfs/bucket/s3_spec.rb +16 -30
- 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: 4103371b6039d46aba27c96dc7ec740935ffa8353a1d52d09b1225ba6f2e152d
|
4
|
+
data.tar.gz: 179845d43b49fd2681230f3a3a064496983e5156382575e7c234aeda654bfc04
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 54a4afbfaae7f55b40fdeeab4dba2990a133525e2d513c65c13036e15703d65394e0cc581141448cdaed79c9f5435bc4087d78d5f56963c69c70992059989445
|
7
|
+
data.tar.gz: 84d9af9c6f5abc03751d158e9716aaa58841ded7f182750c11c5f06744fca3931e1f7e8e7ae7715fb88ef735b03958369a792fe943eaf717237e78666df4d918
|
data/bfs-s3.gemspec
CHANGED
data/lib/bfs/bucket/s3.rb
CHANGED
@@ -36,9 +36,17 @@ module BFS
|
|
36
36
|
|
37
37
|
# Lists the contents of a bucket using a glob pattern
|
38
38
|
def ls(pattern='**/*', opts={})
|
39
|
-
|
40
|
-
|
41
|
-
|
39
|
+
next_token = nil
|
40
|
+
Enumerator.new do |y|
|
41
|
+
loop do
|
42
|
+
resp = @client.list_objects_v2 opts.merge(bucket: name, continuation_token: next_token)
|
43
|
+
resp.contents.each do |obj|
|
44
|
+
y << obj.key if File.fnmatch?(pattern, obj.key, File::FNM_PATHNAME)
|
45
|
+
end
|
46
|
+
next_token = resp.next_continuation_token.to_s
|
47
|
+
break if next_token.empty?
|
48
|
+
end
|
49
|
+
end
|
42
50
|
end
|
43
51
|
|
44
52
|
# Info returns the object info
|
@@ -85,7 +93,7 @@ module BFS
|
|
85
93
|
# Opens an existing file for reading
|
86
94
|
def open(path, opts={}, &block)
|
87
95
|
path = norm_path(path)
|
88
|
-
temp = Tempfile.new(File.basename(path))
|
96
|
+
temp = Tempfile.new(File.basename(path), binmode: true)
|
89
97
|
temp.close
|
90
98
|
|
91
99
|
opts = opts.merge(
|
data/spec/bfs/bucket/s3_spec.rb
CHANGED
@@ -1,59 +1,42 @@
|
|
1
1
|
require 'spec_helper'
|
2
2
|
|
3
3
|
RSpec.describe BFS::Bucket::S3 do
|
4
|
-
let(:
|
5
|
-
let
|
6
|
-
|
4
|
+
let(:files) { {} }
|
5
|
+
let :mock_client do
|
6
|
+
client = double Aws::S3::Client
|
7
7
|
|
8
|
-
# stub put_object calls and store file data
|
9
|
-
before do
|
10
8
|
allow(client).to receive(:put_object).with(hash_including(bucket: 'mock-bucket')) do |opts|
|
11
9
|
files[opts[:key]] = opts[:body].read
|
12
10
|
nil
|
13
11
|
end
|
14
|
-
end
|
15
12
|
|
16
|
-
# stub get_object calls
|
17
|
-
before do
|
18
13
|
allow(client).to receive(:get_object).with(hash_including(bucket: 'mock-bucket')) do |opts|
|
19
14
|
data = files[opts[:key]]
|
20
15
|
raise Aws::S3::Errors::NoSuchKey.new(nil, nil) unless data
|
21
16
|
|
22
|
-
File.open(opts[:response_target], '
|
17
|
+
File.open(opts[:response_target], 'wb') {|f| f.write(data) }
|
23
18
|
nil
|
24
19
|
end
|
25
|
-
end
|
26
20
|
|
27
|
-
before do
|
28
21
|
allow(client).to receive(:delete_object).with(hash_including(bucket: 'mock-bucket')) do |opts|
|
29
22
|
raise Aws::S3::Errors::NoSuchKey.new(nil, nil) unless files.key?(opts[:key])
|
30
23
|
|
31
24
|
files.delete(opts[:key])
|
32
25
|
nil
|
33
26
|
end
|
34
|
-
end
|
35
27
|
|
36
|
-
|
37
|
-
before do
|
38
|
-
allow(client).to receive(:list_objects_v2).with(bucket: 'mock-bucket') do |*|
|
28
|
+
allow(client).to receive(:list_objects_v2).with(bucket: 'mock-bucket', continuation_token: nil) do |*|
|
39
29
|
contents = files.keys.map {|key| Aws::S3::Types::Object.new(key: key) }
|
40
|
-
double 'ListObjectsV2Response', contents: contents
|
30
|
+
double 'ListObjectsV2Response', contents: contents, next_continuation_token: ''
|
31
|
+
end
|
32
|
+
allow(client).to receive(:list_objects_v2).with(bucket: 'mock-bucket', max_keys: 1, prefix: 'a/b/c.txt') do |*|
|
33
|
+
obj = Aws::S3::Types::Object.new(key: 'a/b/c.txt', size: 10, last_modified: Time.now)
|
34
|
+
double 'ListObjectsV2Response', contents: [obj]
|
35
|
+
end
|
36
|
+
allow(client).to receive(:list_objects_v2).with(bucket: 'mock-bucket', max_keys: 1, prefix: 'missing.txt') do |*|
|
37
|
+
double 'ListObjectsV2Response', contents: []
|
41
38
|
end
|
42
|
-
end
|
43
|
-
|
44
|
-
# stub list_objects_v2, single object calls
|
45
|
-
before do
|
46
|
-
match = double 'ListObjectsV2Response', contents: [
|
47
|
-
Aws::S3::Types::Object.new(key: 'a/b/c.txt', size: 10, last_modified: Time.now),
|
48
|
-
]
|
49
|
-
no_match = double 'ListObjectsV2Response', contents: []
|
50
|
-
|
51
|
-
allow(client).to receive(:list_objects_v2).with(bucket: 'mock-bucket', max_keys: 1, prefix: 'a/b/c.txt').and_return(match)
|
52
|
-
allow(client).to receive(:list_objects_v2).with(bucket: 'mock-bucket', max_keys: 1, prefix: 'missing.txt').and_return(no_match)
|
53
|
-
end
|
54
39
|
|
55
|
-
# stub copy_object calls
|
56
|
-
before do
|
57
40
|
allow(client).to receive(:copy_object).with(hash_including(bucket: 'mock-bucket')) do |opts|
|
58
41
|
src = opts[:copy_source].sub('/mock-bucket/', '')
|
59
42
|
raise Aws::S3::Errors::NoSuchKey.new(nil, nil) unless files.key?(src)
|
@@ -61,8 +44,11 @@ RSpec.describe BFS::Bucket::S3 do
|
|
61
44
|
files[opts[:key]] = files[src]
|
62
45
|
nil
|
63
46
|
end
|
47
|
+
|
48
|
+
client
|
64
49
|
end
|
65
50
|
|
51
|
+
subject { described_class.new('mock-bucket', client: mock_client) }
|
66
52
|
it_behaves_like 'a bucket'
|
67
53
|
|
68
54
|
it 'should resolve from URL' do
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: bfs-s3
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.3.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Dimitrij Denissenko
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2018-
|
11
|
+
date: 2018-11-09 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: aws-sdk-s3
|
@@ -28,16 +28,16 @@ dependencies:
|
|
28
28
|
name: bfs
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|
30
30
|
requirements:
|
31
|
-
- -
|
31
|
+
- - '='
|
32
32
|
- !ruby/object:Gem::Version
|
33
|
-
version:
|
33
|
+
version: 0.3.0
|
34
34
|
type: :runtime
|
35
35
|
prerelease: false
|
36
36
|
version_requirements: !ruby/object:Gem::Requirement
|
37
37
|
requirements:
|
38
|
-
- -
|
38
|
+
- - '='
|
39
39
|
- !ruby/object:Gem::Version
|
40
|
-
version:
|
40
|
+
version: 0.3.0
|
41
41
|
description: https://github.com/bsm/bfs.rb
|
42
42
|
email: dimitrij@blacksquaremedia.com
|
43
43
|
executables: []
|