bfs 0.1.0 → 0.2.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 40e2210b5438bc6bcbdb01204c8a573b674a80f94fdb5dee0cab48b989f77c5a
4
- data.tar.gz: 558aab1337ec9959c8eac6c6d13c9b2fbbd2692243a1fbd0d3d5ebe9b4ef7c21
3
+ metadata.gz: a625c88ce474019b57f7ba1cd34618f79efa2b090ec8601934805e04a4ce6f41
4
+ data.tar.gz: 7f3a794d63f4c1490fcc3c5c509b6d10c749f987cbd364304b7b8b867f0725d7
5
5
  SHA512:
6
- metadata.gz: e7047002ef910561427ddd5048f52a1460e1a15ca9752ae4497f0988fcdf0117fe17aa797b9c0946d231b4a58e62e94fb8d980ea327cc82323246e174fa5af0f
7
- data.tar.gz: ff34edc0f19c435a1f520750beae893934c1921330fdaa3f105231d1082f749588c47e295b2891986c7820d21e97a3be7799060b0a067a4b979cc1cf39fd7069
6
+ metadata.gz: 6bc5f7c5c9313736c23753a9bb9d7837bcd0586782b9014d1032771f17ad9c76e47bebaa8fd9b5a7a99c23610193602bf2775bdd275f3167e3c9f81d1993946b
7
+ data.tar.gz: 56a751d745a83226e99f646f7586ce6a54dc053ee6acb796735fe8afdeec869d88318963445a1315579ec3c37e272c0833fafd0a4b8ac8e4371e01ca155a4150
data/lib/bfs.rb CHANGED
@@ -15,8 +15,16 @@ module BFS
15
15
 
16
16
  rsl.call(url)
17
17
  end
18
+
19
+ def self.norm_path(path)
20
+ path = path.to_s.dup
21
+ path.gsub!(File::SEPARATOR, '/')
22
+ path.sub!(%r{^/+}, '')
23
+ path
24
+ end
18
25
  end
19
26
 
20
27
  require 'bfs/helpers'
21
28
  require 'bfs/bucket'
22
29
  require 'bfs/errors'
30
+ require 'bfs/blob'
@@ -0,0 +1,50 @@
1
+ module BFS
2
+ # Blobs are references to single blob objects within a bucket.
3
+ class Blob
4
+ attr_reader :path
5
+
6
+ def initialize(url)
7
+ url = URI.parse(url) unless url.is_a?(::URI)
8
+ @bucket = BFS.resolve(url)
9
+ @path = BFS.norm_path(url.path)
10
+ end
11
+
12
+ # Info returns the blob info
13
+ def info(opts={})
14
+ @bucket.info(path, opts)
15
+ end
16
+
17
+ # Creates the blob and opens it for writing
18
+ def create(opts={}, &block)
19
+ @bucket.create(path, opts, &block)
20
+ end
21
+
22
+ # Opens the blob for reading
23
+ # May raise BFS::FileNotFound
24
+ def open(opts={}, &block)
25
+ @bucket.open(path, opts, &block)
26
+ end
27
+
28
+ # Deletes the blob
29
+ def rm(opts={})
30
+ @bucket.rm(path, opts)
31
+ end
32
+
33
+ # Shortcut method to read the contents of the blob
34
+ def read(opts={})
35
+ open(opts, &:read)
36
+ end
37
+
38
+ # Shortcut method to write data to blob
39
+ def write(data, opts={})
40
+ create(opts) {|f| f.write data }
41
+ end
42
+
43
+ # Moves blob to dst
44
+ def mv(dst, opts={})
45
+ dst = BFS.norm_path(dst)
46
+ @bucket.mv(path, dst, opts)
47
+ @path = dst
48
+ end
49
+ end
50
+ end
@@ -1,7 +1,8 @@
1
1
  module BFS
2
2
  module Bucket
3
- autoload :Abstract, 'bfs/bucket/abstract'
4
- autoload :FS, 'bfs/bucket/fs'
5
- autoload :InMem, 'bfs/bucket/in_mem'
6
3
  end
7
4
  end
5
+
6
+ require 'bfs/bucket/abstract'
7
+ require 'bfs/bucket/fs'
8
+ require 'bfs/bucket/in_mem'
@@ -57,7 +57,7 @@ module BFS
57
57
  protected
58
58
 
59
59
  def norm_path(path)
60
- path.gsub(File::SEPARATOR, '/').sub(%r{^/+}, '')
60
+ BFS.norm_path(path)
61
61
  end
62
62
  end
63
63
  end
@@ -1,4 +1,5 @@
1
1
  require 'bfs'
2
+ require 'cgi'
2
3
  require 'fileutils'
3
4
  require 'pathname'
4
5
 
@@ -77,3 +78,18 @@ module BFS
77
78
  end
78
79
  end
79
80
  end
81
+
82
+ BFS.register('file') do |url|
83
+ params = CGI.parse(url.query.to_s)
84
+
85
+ parts = [url.host, url.path].compact
86
+ root = case params.key?('scope') && params['scope'].first
87
+ when 'root'
88
+ '/'
89
+ when 'dir'
90
+ File.dirname(File.join(*parts))
91
+ else
92
+ File.join(*parts)
93
+ end
94
+ BFS::Bucket::FS.new root
95
+ end
@@ -0,0 +1,27 @@
1
+ require 'spec_helper'
2
+
3
+ RSpec.describe BFS::Blob do
4
+ let(:bucket) { BFS::Bucket::InMem.new }
5
+ before { allow(BFS).to receive(:resolve).and_return(bucket) }
6
+ subject { described_class.new('memtest://bucket/path/to/file.txt') }
7
+
8
+ it 'should move' do
9
+ expect(subject.path).to eq('path/to/file.txt')
10
+ expect { subject.mv('/to/other/path.txt') }.to raise_error(BFS::FileNotFound)
11
+
12
+ subject.write('TESTDATA')
13
+ subject.mv('/to/other/path.txt')
14
+ expect(subject.path).to eq('to/other/path.txt')
15
+ end
16
+
17
+ it 'should write/read' do
18
+ expect { subject.read }.to raise_error(BFS::FileNotFound)
19
+ subject.write('TESTDATA')
20
+
21
+ info = subject.info
22
+ expect(info).to eq(BFS::FileInfo.new('path/to/file.txt', 8, info.mtime))
23
+ expect(info.mtime).to be_within(1).of(Time.now)
24
+
25
+ expect(subject.read).to eq('TESTDATA')
26
+ end
27
+ end
@@ -6,4 +6,20 @@ RSpec.describe BFS::Bucket::FS do
6
6
  subject { described_class.new(tmpdir) }
7
7
 
8
8
  it_behaves_like 'a bucket'
9
+
10
+ it 'should resolve from URL' do
11
+ File.open(File.join(tmpdir, 'test.txt'), 'w') {|f| f.write 'TESTDATA' }
12
+
13
+ bucket = BFS.resolve("file://#{tmpdir}")
14
+ expect(bucket).to be_instance_of(described_class)
15
+ expect(bucket.ls).to eq(['test.txt'])
16
+
17
+ bucket = BFS.resolve("file://#{tmpdir}/test.txt?scope=dir")
18
+ expect(bucket).to be_instance_of(described_class)
19
+ expect(bucket.ls).to eq(['test.txt'])
20
+
21
+ bucket = BFS.resolve("file://#{tmpdir}/test.txt?scope=root")
22
+ expect(bucket).to be_instance_of(described_class)
23
+ expect(bucket.instance_variable_get(:@root).to_s).to eq('/')
24
+ end
9
25
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: bfs
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0
4
+ version: 0.2.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-10-10 00:00:00.000000000 Z
11
+ date: 2018-10-17 00:00:00.000000000 Z
12
12
  dependencies: []
13
13
  description: Minimalist abstraction for bucket storage
14
14
  email: dimitrij@blacksquaremedia.com
@@ -18,12 +18,14 @@ extra_rdoc_files: []
18
18
  files:
19
19
  - bfs.gemspec
20
20
  - lib/bfs.rb
21
+ - lib/bfs/blob.rb
21
22
  - lib/bfs/bucket.rb
22
23
  - lib/bfs/bucket/abstract.rb
23
24
  - lib/bfs/bucket/fs.rb
24
25
  - lib/bfs/bucket/in_mem.rb
25
26
  - lib/bfs/errors.rb
26
27
  - lib/bfs/helpers.rb
28
+ - spec/bfs/blob_spec.rb
27
29
  - spec/bfs/bucket/fs_spec.rb
28
30
  - spec/bfs/bucket/in_mem_spec.rb
29
31
  homepage: https://github.com/bsm/bfs.rb
@@ -46,10 +48,11 @@ required_rubygems_version: !ruby/object:Gem::Requirement
46
48
  version: '0'
47
49
  requirements: []
48
50
  rubyforge_project:
49
- rubygems_version: 2.7.6
51
+ rubygems_version: 2.7.7
50
52
  signing_key:
51
53
  specification_version: 4
52
54
  summary: Multi-platform cloud bucket adapter
53
55
  test_files:
56
+ - spec/bfs/blob_spec.rb
54
57
  - spec/bfs/bucket/fs_spec.rb
55
58
  - spec/bfs/bucket/in_mem_spec.rb