bucket_store 0.4.0 → 0.5.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: e251b7658b3f9e155f3e9e329d2022e6f4791e502de43bba2b8a0563634ba499
4
- data.tar.gz: f66fbec21d4a07e2ff0feb0ad45383eccb71daa13d733cc92f2a0ae54d6cd9f4
3
+ metadata.gz: 14fe28facb1db7af27414a3d1ce64ad24974c79e72c5b9faca796860f679c3d8
4
+ data.tar.gz: 4b6a4fe4e68bb81b4e7df6d76d2f8e14dc6210508955263fe579b067c7b1af61
5
5
  SHA512:
6
- metadata.gz: cb3aeab11c33767d349fb4c7efe744000c9a129131cfff3054c308de7971da12e1ea3c32fafeaa8722ddf07049d4e2f0e1cf6ba85b24d6c997ac1f3fe4eb14af
7
- data.tar.gz: 5f2d1e70e8f0bc27ccfbf998ec3c4e1c89fb9ed0e179b8b2a808a7345bf4cda38dcc45fbadc842a142a0eb42d51fdb44247159c1fe58f5717cf302a6145ecff3
6
+ metadata.gz: 60b864052d68196fd7bda4a67a67bb66a82ef9bb828f01fb9364ce8aeca67ea414f8f2c34259982fd3dd76a3545b9c72172400e3acbb277fe3cc907d5d449e36
7
+ data.tar.gz: 5aab2c949368e330f73470f5a9c705c681662ec7209d8e8600c3ea971f852c79d2ce6f6af52350760c9f585cc25ab94f51431001cbb4ff053276333515bf8fd1
data/README.md CHANGED
@@ -159,6 +159,15 @@ BucketStore.for("inmemory://bucket/path/file.xml").delete!
159
159
  => true
160
160
  ```
161
161
 
162
+ ## Development
163
+
164
+ ### Running tests
165
+ BucketStore comes with both unit and integration tests. While unit tests can be run by simply
166
+ executing `bundle exec rspec`, integration tests require running minio locally. We provide an
167
+ helper script (`scripts/run-minio.sh`) that spins up a pre-configured docker container with
168
+ a single test bucket. Once minio has started, integration tests can be executed with
169
+ `bundle exec rspec --tag integration`.
170
+
162
171
  ## License & Contributing
163
172
 
164
173
  * BucketStore is available as open source under the terms of the [MIT License](http://opensource.org/licenses/MIT).
@@ -78,7 +78,7 @@ module BucketStore
78
78
  end
79
79
 
80
80
  def sanitize_filename(filename)
81
- filename.gsub(%r{[^0-9A-z.\-/]}, "_")
81
+ filename.gsub(%r{[^0-9A-z.\- /]}, "_")
82
82
  end
83
83
  end
84
84
  end
@@ -19,18 +19,35 @@ module BucketStore
19
19
  end
20
20
 
21
21
  def self.parse(raw_key)
22
- uri = URI(raw_key)
22
+ uri = URI(escape(raw_key))
23
+
24
+ scheme = unescape(uri.scheme)
25
+ bucket = unescape(uri.host)
23
26
 
24
27
  # A key should never be `nil` but can be empty. Depending on the operation, this may
25
28
  # or may not be a valid configuration (e.g. an empty key is likely valid on a
26
29
  # `list`, but not during a `download`).
27
- key = uri.path.sub!(%r{/}, "") || ""
30
+ key = unescape(uri.path).sub!(%r{/}, "") || ""
28
31
 
29
- raise KeyParseException if [uri.scheme, uri.host, key].map(&:nil?).any?
32
+ raise KeyParseException if [scheme, bucket, key].map(&:nil?).any?
30
33
 
31
- KeyContext.new(adapter: uri.scheme,
32
- bucket: uri.host,
34
+ KeyContext.new(adapter: scheme,
35
+ bucket: bucket,
33
36
  key: key)
34
37
  end
38
+
39
+ def self.escape(key)
40
+ return key if key.nil?
41
+
42
+ URI::DEFAULT_PARSER.escape(key)
43
+ end
44
+ private_class_method :escape
45
+
46
+ def self.unescape(key)
47
+ return key if key.nil?
48
+
49
+ URI::DEFAULT_PARSER.unescape(key)
50
+ end
51
+ private_class_method :unescape
35
52
  end
36
53
  end
@@ -153,7 +153,7 @@ module BucketStore
153
153
  #
154
154
  # @return [bool] `true` if the given key exists, `false` if not
155
155
  def exists?
156
- list.first == "#{adapter_type}://#{bucket}/#{key}"
156
+ list(page_size: 1).first == "#{adapter_type}://#{bucket}/#{key}"
157
157
  end
158
158
 
159
159
  private
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module BucketStore
4
- VERSION = "0.4.0"
4
+ VERSION = "0.5.0"
5
5
  end
data/lib/bucket_store.rb CHANGED
@@ -4,6 +4,7 @@ require "bucket_store/version"
4
4
  require "bucket_store/configuration"
5
5
  require "bucket_store/key_context"
6
6
  require "bucket_store/key_storage"
7
+ require "bucket_store/uri_builder"
7
8
 
8
9
  # An abstraction layer on the top of file cloud storage systems such as Google Cloud
9
10
  # Storage or S3. This module exposes a generic interface that allows interoperability
@@ -41,8 +42,8 @@ module BucketStore
41
42
  # Given a `key` in the format of `adapter://bucket/key` returns the corresponding
42
43
  # adapter that will allow to manipulate (e.g. download, upload or list) such key.
43
44
  #
44
- # Currently supported adapters are `gs` (Google Cloud Storage), `inmemory` (an
45
- # in-memory key-value storage) and `disk` (a disk-backed key-value store).
45
+ # Currently supported adapters are `gs` (Google Cloud Storage), `s3` (AWS S3),
46
+ # `inmemory` (an in-memory key-value storage) and `disk` (a disk-backed key-value store).
46
47
  #
47
48
  # @param [String] key The reference key
48
49
  # @return [KeyStorage] An interface to the adapter that can handle requests on the given key
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: bucket_store
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.4.0
4
+ version: 0.5.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - GoCardless Engineering
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2021-10-29 00:00:00.000000000 Z
11
+ date: 2021-11-09 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: aws-sdk-s3