gitlab-fog-azure-rm 1.0.1 → 1.3.0

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 6a0941da3e69509575eca6b720890940f33e8617e32bbb37121e19c9e1087e33
4
- data.tar.gz: '09b4913d90bcbba439e9501df86dcc5e4d3d012a57941e2bc7033e4ac7d97806'
3
+ metadata.gz: fc0e6fc125b778bb49c22a6fbfeb0ab779d99bfffaca5496df1834d2a0f69a86
4
+ data.tar.gz: 5f9ce8aa7d939260edc6047636e6fdfbebaeae6cd7fd611921aa7cc2a3c36056
5
5
  SHA512:
6
- metadata.gz: 6df48a1e91089a7c7af40addf64716b712daee65ea431edc4cffc98f1912c85538c5547eddced2bf512bdee1fbcca1cdd43eb2eb76022055a837f07bdad54d8c
7
- data.tar.gz: b4696c93d25c11b5344410a09cd8142eae252350030000c3f6d041b85f69273f2196fa1715e1428ce9105471d150f1d3b036834140813d148b5ff54883481c24
6
+ metadata.gz: 1578489ca552ed032d47387738f1b8807f467bac75b1d2446fe0ea547ed8b96b81d44c9af7c3134d50da7bb86158e757f8bb18ce4e3e998a9badfb5ce76a55e4
7
+ data.tar.gz: ff5993b7140d6e3dd0de19d776dd2666980f65a1cb0baeee5abc28ed98eb29a71386108763530f591cb768116493994fbdec1bd877a2c8939c31c6cb85535385
data/.gitlab-ci.yml CHANGED
@@ -1,4 +1,5 @@
1
- image: "ruby:2.7"
1
+ default:
2
+ image: "ruby:${RUBY_VERSION}"
2
3
 
3
4
  cache:
4
5
  paths:
@@ -11,7 +12,12 @@ before_script:
11
12
  test:
12
13
  script:
13
14
  - bundle exec rake test
15
+ parallel:
16
+ matrix:
17
+ - RUBY_VERSION: [ "2.7", "3.0", "3.1" ]
14
18
 
15
19
  rubocop:
16
20
  script:
17
21
  - bundle exec rubocop
22
+ variables:
23
+ RUBY_VERSION: "2.7"
data/CHANGELOG.md CHANGED
@@ -1,5 +1,21 @@
1
1
  ## Unreleased
2
2
 
3
+ ## 1.3.0
4
+
5
+ - Fix Ruby 3.0 compatibility !27
6
+
7
+ ## 1.2.0
8
+
9
+ - Support setting returned Content-Disposition in GetBlob requests !25
10
+
11
+ ## 1.1.1
12
+
13
+ - Remove trailing periods per path segment when retrieving blob URLs !23
14
+
15
+ ## 1.1.0
16
+
17
+ - Yanked
18
+
3
19
  ## 1.0.1
4
20
 
5
21
  - Fix URL generation for files with UTF-8 characters !21
@@ -240,11 +240,19 @@ module Fog
240
240
  #
241
241
  def url(expires, options = {})
242
242
  requires :key
243
- collection.get_url(key, expires, options)
243
+ collection.get_url(key, expires, normalize_options(options))
244
244
  end
245
245
 
246
246
  private
247
247
 
248
+ def normalize_options(options)
249
+ # AWS S3 and Google Cloud Storage pass response-content-disposition
250
+ # as a query string, while Azure needs the content_disposition parameter
251
+ # to generate a SAS token.
252
+ options[:content_disposition] ||= options.dig(:query, 'response-content-disposition')
253
+ options
254
+ end
255
+
248
256
  # Upload blob
249
257
  def save_blob(options)
250
258
  if options[:blob_type].nil? || options[:blob_type] == 'BlockBlob'
@@ -123,10 +123,10 @@ module Fog
123
123
  #
124
124
  # @return [String] A http URL.
125
125
  #
126
- def get_http_url(key, expires, _options = {})
126
+ def get_http_url(key, expires, options = {})
127
127
  requires :directory
128
128
 
129
- service.get_blob_http_url(directory.key, key, expires)
129
+ service.get_blob_http_url(directory.key, key, expires, options)
130
130
  end
131
131
 
132
132
  # Get the https URL of the file(blob) with the given name.
@@ -139,10 +139,10 @@ module Fog
139
139
  #
140
140
  # @return [String] A https URL.
141
141
  #
142
- def get_https_url(key, expires, _options = {})
142
+ def get_https_url(key, expires, options = {})
143
143
  requires :directory
144
144
 
145
- service.get_blob_https_url(directory.key, key, expires)
145
+ service.get_blob_https_url(directory.key, key, expires, options)
146
146
  end
147
147
 
148
148
  # Get the file(blob) without content with the given name.
@@ -5,7 +5,7 @@ module Fog
5
5
  class Real
6
6
  BLOCK_SIZE = 32 * 1024 * 1024 # 32 MB
7
7
 
8
- def get_blob_with_block_given(container_name, blob_name, options, &_block)
8
+ def get_blob_with_block_given(container_name, blob_name, options, &block)
9
9
  options[:request_id] = SecureRandom.uuid
10
10
  msg = "get_blob_with_block_given: blob #{blob_name} in the container #{container_name}. options: #{options}"
11
11
  Fog::Logger.debug msg
@@ -19,7 +19,7 @@ module Fog
19
19
 
20
20
  content_length = blob.properties[:content_length]
21
21
  if content_length.zero?
22
- Proc.new.call('', 0, 0)
22
+ block.call('', 0, 0)
23
23
  return [blob, '']
24
24
  end
25
25
 
@@ -30,7 +30,7 @@ module Fog
30
30
  raise ArgumentError.new(':end_range MUST be greater than :start_range') if start_range > end_range
31
31
 
32
32
  if start_range == end_range
33
- Proc.new.call('', 0, 0)
33
+ block.call('', 0, 0)
34
34
  return [blob, '']
35
35
  end
36
36
 
@@ -55,7 +55,7 @@ module Fog
55
55
  raise_azure_exception(ex, msg)
56
56
  end
57
57
 
58
- Proc.new.call(content, end_range - buffer_end_range, total_bytes)
58
+ block.call(content, end_range - buffer_end_range, total_bytes)
59
59
  buffer_start_range += buffer_size
60
60
  end
61
61
  # No need to return content when block is given.
@@ -84,7 +84,7 @@ module Fog
84
84
 
85
85
  # This class provides the mock implementation for unit tests.
86
86
  class Mock
87
- def get_blob(_container_name, _blob_name, _options = {}, &_block)
87
+ def get_blob(_container_name, _blob_name, _options = {}, &block)
88
88
  Fog::Logger.debug 'get_blob successfully.'
89
89
  unless block_given?
90
90
  return [
@@ -122,7 +122,7 @@ module Fog
122
122
  remaining = total_bytes = data.length
123
123
  while remaining > 0
124
124
  chunk = data.read([remaining, 2].min)
125
- Proc.new.call(chunk, remaining, total_bytes)
125
+ block.call(chunk, remaining, total_bytes)
126
126
  remaining -= 2
127
127
  end
128
128
 
@@ -13,13 +13,15 @@ module Fog
13
13
  #
14
14
  # @see https://msdn.microsoft.com/en-us/library/azure/mt584140.aspx
15
15
  #
16
- def get_blob_http_url(container_name, blob_name, expires)
16
+ def get_blob_http_url(container_name, blob_name, expires, options = {})
17
17
  relative_path = "#{container_name}/#{blob_name}"
18
+ relative_path = remove_trailing_periods_from_path_segments(relative_path)
18
19
  params = {
19
20
  service: 'b',
20
21
  resource: 'b',
21
22
  permissions: 'r',
22
- expiry: expires.utc.iso8601
23
+ expiry: expires.utc.iso8601,
24
+ content_disposition: options[:content_disposition]
23
25
  }
24
26
  token = @signature_client.generate_service_sas_token(relative_path, params)
25
27
  uri = @blob_client.generate_uri(relative_path, {}, { encode: true })
@@ -13,14 +13,16 @@ module Fog
13
13
  #
14
14
  # @see https://msdn.microsoft.com/en-us/library/azure/mt584140.aspx
15
15
  #
16
- def get_blob_https_url(container_name, blob_name, expires)
16
+ def get_blob_https_url(container_name, blob_name, expires, options = {})
17
17
  relative_path = "#{container_name}/#{blob_name}"
18
+ relative_path = remove_trailing_periods_from_path_segments(relative_path)
18
19
  params = {
19
20
  service: 'b',
20
21
  resource: 'b',
21
22
  permissions: 'r',
22
23
  expiry: expires.utc.iso8601,
23
- protocol: 'https'
24
+ protocol: 'https',
25
+ content_disposition: options[:content_disposition]
24
26
  }
25
27
  token = @signature_client.generate_service_sas_token(relative_path, params)
26
28
  uri = @blob_client.generate_uri(relative_path, {}, { encode: true })
@@ -5,15 +5,15 @@ module Fog
5
5
  class Real
6
6
  # Get a public blob url from Azure blob storage
7
7
  # This is to make this library compatible with CarrierWave.
8
- def get_object_url(container_name, blob_name, expires)
9
- get_blob_https_url(container_name, blob_name, expires)
8
+ def get_object_url(container_name, blob_name, expires, options = {})
9
+ get_blob_https_url(container_name, blob_name, expires, options)
10
10
  end
11
11
  end
12
12
 
13
13
  # This class provides the mock implementation for unit tests.
14
14
  class Mock
15
- def get_object_url(container_name, blob_name, expires)
16
- get_blob_https_url(container_name, blob_name, expires)
15
+ def get_object_url(container_name, blob_name, expires, options = {})
16
+ get_blob_https_url(container_name, blob_name, expires, options)
17
17
  end
18
18
  end
19
19
  end
@@ -189,3 +189,7 @@ end
189
189
  def get_subscription_id(id)
190
190
  id.split('/')[2]
191
191
  end
192
+
193
+ def remove_trailing_periods_from_path_segments(path)
194
+ path.split('/').map { |segment| segment.gsub(/\.*$/, '') }.join('/')
195
+ end
@@ -1,5 +1,5 @@
1
1
  module Fog
2
2
  module AzureRM
3
- VERSION = '1.0.1'.freeze
3
+ VERSION = '1.3.0'.freeze
4
4
  end
5
5
  end
@@ -1,7 +1,7 @@
1
1
  require File.expand_path '../../test_helper', __dir__
2
2
 
3
3
  # Test class for Storage Container Model
4
- class TestFile < Minitest::Test
4
+ class TestFile < Minitest::Test # rubocop:disable Metrics/ClassLength
5
5
  def setup
6
6
  @service = Fog::Storage::AzureRM.new(storage_account_credentials)
7
7
  @directory = directory(@service)
@@ -283,6 +283,18 @@ class TestFile < Minitest::Test
283
283
  end
284
284
  end
285
285
 
286
+ def test_url_method_with_content_disposition
287
+ @file.collection.stub :get_url, @blob_https_url, { content_disposition: 'attachment' } do
288
+ assert @file.url(Time.now + 3600, content_disposition: 'attachment'), @blob_https_url
289
+ end
290
+ end
291
+
292
+ def test_url_method_with_response_content_disposition
293
+ @file.collection.stub :get_url, @blob_https_url, { content_disposition: 'attachment' } do
294
+ assert @file.url(Time.now + 3600, { query: { 'response-content-disposition' => 'attachment' } }), @blob_https_url
295
+ end
296
+ end
297
+
286
298
  def test_url_method_without_key_exception
287
299
  assert_raises(ArgumentError) do
288
300
  @file.attributes.delete(:key)
@@ -24,6 +24,43 @@ class TestGetBlobHttpUrl < Minitest::Test
24
24
  end
25
25
  end
26
26
 
27
+ def test_get_blob_http_url_with_content_disposition
28
+ mock_generate_uri = Minitest::Mock.new
29
+ mock_generate_service_token = Minitest::Mock.new
30
+ url_params = { content_disposition: 'attachment' }
31
+
32
+ mock_generate_uri.expect(:call, @url, ['test_container/test_blob', {}, { encode: true }])
33
+ mock_generate_service_token.expect(:call, @token) do |_relative_path, params|
34
+ params[:service] == 'b' &&
35
+ params[:resource] == 'b' &&
36
+ params[:permissions] == 'r' &&
37
+ params[:protocol].nil? &&
38
+ params[:content_disposition] == url_params[:content_disposition]
39
+ end
40
+
41
+ @blob_client.stub :generate_uri, mock_generate_uri do
42
+ @signature_client.stub :generate_service_sas_token, mock_generate_service_token do
43
+ assert_equal "#{@url}?#{@token}", @service.get_blob_http_url('test_container', 'test_blob', Time.now.utc + 3600, url_params)
44
+ end
45
+ end
46
+ end
47
+
48
+ def test_get_url_remove_trailing_periods_from_path_segments
49
+ mock_generate_uri = Minitest::Mock.new
50
+ mock_generate_service_token = Minitest::Mock.new
51
+
52
+ mock_generate_uri.expect(:call, @url, ['.test0/..test1/...test2', {}, { encode: true }])
53
+ mock_generate_service_token.expect(:call, @token) do |relative_path, _|
54
+ relative_path == '.test0/..test1/...test2'
55
+ end
56
+
57
+ @blob_client.stub :generate_uri, mock_generate_uri do
58
+ @signature_client.stub :generate_service_sas_token, mock_generate_service_token do
59
+ assert_equal "#{@url}?#{@token}", @service.get_blob_http_url('.test0.', '..test1../...test2...', Time.now.utc + 3600)
60
+ end
61
+ end
62
+ end
63
+
27
64
  def test_get_blob_http_url_mock
28
65
  assert_equal "#{@url}?#{@token}", @mock_service.get_blob_http_url('test_container', 'test_blob', Time.now.utc + 3600)
29
66
  end
@@ -31,6 +31,48 @@ class TestGetBlobHttpsUrl < Minitest::Test
31
31
  end
32
32
  end
33
33
 
34
+ def test_get_blob_https_url_with_content_disposition
35
+ mock_generate_uri = Minitest::Mock.new
36
+ mock_generate_service_token = Minitest::Mock.new
37
+ url_params = { content_disposition: 'attachment' }
38
+
39
+ 2.times do
40
+ mock_generate_uri.expect(:call, @url, ['test_container/test_blob', {}, { encode: true }])
41
+ mock_generate_service_token.expect(:call, @token) do |_relative_path, params|
42
+ params[:service] == 'b' &&
43
+ params[:resource] == 'b' &&
44
+ params[:permissions] == 'r' &&
45
+ params[:content_disposition] == url_params[:content_disposition]
46
+ end
47
+ end
48
+
49
+ @blob_client.stub :generate_uri, mock_generate_uri do
50
+ @signature_client.stub :generate_service_sas_token, mock_generate_service_token do
51
+ assert_equal "#{@url}?#{@token}", @service.get_blob_https_url('test_container', 'test_blob', Time.now.utc + 3600, url_params)
52
+ assert_equal "#{@url}?#{@token}", @service.get_object_url('test_container', 'test_blob', Time.now.utc + 3600, url_params)
53
+ end
54
+ end
55
+ end
56
+
57
+ def test_get_url_remove_trailing_periods_from_path_segments
58
+ mock_generate_uri = Minitest::Mock.new
59
+ mock_generate_service_token = Minitest::Mock.new
60
+
61
+ 2.times do
62
+ mock_generate_uri.expect(:call, @url, ['.test0/..test1/...test2', {}, { encode: true }])
63
+ mock_generate_service_token.expect(:call, @token) do |relative_path, _|
64
+ relative_path == '.test0/..test1/...test2'
65
+ end
66
+ end
67
+
68
+ @blob_client.stub :generate_uri, mock_generate_uri do
69
+ @signature_client.stub :generate_service_sas_token, mock_generate_service_token do
70
+ assert_equal "#{@url}?#{@token}", @service.get_blob_https_url('.test0.', '..test1../...test2...', Time.now.utc + 3600)
71
+ assert_equal "#{@url}?#{@token}", @service.get_object_url('.test0.', '..test1../...test2...', Time.now.utc + 3600)
72
+ end
73
+ end
74
+ end
75
+
34
76
  def test_get_blob_https_url_with_domain_success
35
77
  service = Fog::Storage::AzureRM.new(storage_account_credentials_with_domain)
36
78
  blob_client = service.instance_variable_get(:@blob_client)
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: gitlab-fog-azure-rm
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.1
4
+ version: 1.3.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Shaffan Chaudhry
@@ -18,7 +18,7 @@ authors:
18
18
  autorequire:
19
19
  bindir: bin
20
20
  cert_chain: []
21
- date: 2021-02-22 00:00:00.000000000 Z
21
+ date: 2022-06-02 00:00:00.000000000 Z
22
22
  dependencies:
23
23
  - !ruby/object:Gem::Dependency
24
24
  name: codeclimate-test-reporter
@@ -338,7 +338,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
338
338
  - !ruby/object:Gem::Version
339
339
  version: '0'
340
340
  requirements: []
341
- rubygems_version: 3.1.4
341
+ rubygems_version: 3.1.6
342
342
  signing_key:
343
343
  specification_version: 4
344
344
  summary: Module for the 'fog' gem to support Azure Blob Storage with CarrierWave and