fog-aws 3.6.6 → 3.10.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 +4 -4
- data/.github/dependabot.yml +10 -0
- data/.github/workflows/ruby.yml +36 -0
- data/.github/workflows/stale.yml +23 -0
- data/CHANGELOG.md +169 -18
- data/Gemfile +1 -1
- data/README.md +21 -1
- data/fog-aws.gemspec +2 -2
- data/lib/fog/aws/credential_fetcher.rb +34 -3
- data/lib/fog/aws/models/compute/flavors.rb +460 -0
- data/lib/fog/aws/models/storage/file.rb +125 -3
- data/lib/fog/aws/models/storage/files.rb +32 -2
- data/lib/fog/aws/parsers/storage/upload_part_copy_object.rb +18 -0
- data/lib/fog/aws/requests/compute/request_spot_instances.rb +1 -1
- data/lib/fog/aws/requests/storage/delete_multiple_objects.rb +18 -8
- data/lib/fog/aws/requests/storage/shared_mock_methods.rb +1 -0
- data/lib/fog/aws/requests/storage/upload_part_copy.rb +119 -0
- data/lib/fog/aws/storage.rb +6 -3
- data/lib/fog/aws/version.rb +1 -1
- data/tests/credentials_tests.rb +42 -0
- data/tests/helpers/succeeds_helper.rb +2 -2
- data/tests/models/storage/directory_tests.rb +113 -2
- data/tests/models/storage/files_tests.rb +32 -0
- data/tests/requests/storage/bucket_tests.rb +1 -1
- data/tests/requests/storage/multipart_copy_tests.rb +93 -0
- data/tests/requests/storage/object_tests.rb +7 -0
- data/tests/requests/storage/versioning_tests.rb +38 -0
- metadata +18 -15
- data/.travis.yml +0 -53
- data/gemfiles/Gemfile-ruby-2.0 +0 -7
- data/stale.yml +0 -17
    
        data/lib/fog/aws/version.rb
    CHANGED
    
    
    
        data/tests/credentials_tests.rb
    CHANGED
    
    | @@ -60,6 +60,47 @@ Shindo.tests('AWS | credentials', ['aws']) do | |
| 60 60 |  | 
| 61 61 | 
             
                ENV['AWS_CONTAINER_CREDENTIALS_RELATIVE_URI'] = nil
         | 
| 62 62 |  | 
| 63 | 
            +
                ENV['AWS_WEB_IDENTITY_TOKEN_FILE'] = File.dirname(__FILE__) + '/lorem.txt'
         | 
| 64 | 
            +
                ENV['AWS_ROLE_ARN'] = "dummyrole"
         | 
| 65 | 
            +
                ENV['AWS_ROLE_SESSION_NAME'] = "dummyrolesessionname"
         | 
| 66 | 
            +
                document = 
         | 
| 67 | 
            +
                  '<AssumeRoleWithWebIdentityResponse xmlns="https://sts.amazonaws.com/doc/2011-06-15/">'\
         | 
| 68 | 
            +
                    '<AssumeRoleWithWebIdentityResult>'\
         | 
| 69 | 
            +
                      '<Credentials>'\
         | 
| 70 | 
            +
                        '<SessionToken>dummytoken</SessionToken>'\
         | 
| 71 | 
            +
                        '<SecretAccessKey>dummysecret</SecretAccessKey>'\
         | 
| 72 | 
            +
                        "<Expiration>#{expires_at.xmlschema}</Expiration>"\
         | 
| 73 | 
            +
                        '<AccessKeyId>dummykey</AccessKeyId>'\
         | 
| 74 | 
            +
                      '</Credentials>'\
         | 
| 75 | 
            +
                    '</AssumeRoleWithWebIdentityResult>'\
         | 
| 76 | 
            +
                  '</AssumeRoleWithWebIdentityResponse>'
         | 
| 77 | 
            +
                
         | 
| 78 | 
            +
                Excon.stub({method: :get, path: "/", idempotent: true}, { status: 200, body: document})
         | 
| 79 | 
            +
             | 
| 80 | 
            +
                tests('#fetch_credentials token based') do
         | 
| 81 | 
            +
                  returns(
         | 
| 82 | 
            +
                    aws_access_key_id: 'dummykey',
         | 
| 83 | 
            +
                    aws_secret_access_key: 'dummysecret',
         | 
| 84 | 
            +
                    aws_session_token: 'dummytoken',
         | 
| 85 | 
            +
                    region: 'us-west-1',
         | 
| 86 | 
            +
                    aws_credentials_expire_at: expires_at
         | 
| 87 | 
            +
                  ) { Fog::AWS::Compute.fetch_credentials(use_iam_profile: true) }
         | 
| 88 | 
            +
                end
         | 
| 89 | 
            +
             | 
| 90 | 
            +
                ENV['AWS_ROLE_SESSION_NAME'] = nil
         | 
| 91 | 
            +
             | 
| 92 | 
            +
                tests('#fetch_credentials token based without session name') do
         | 
| 93 | 
            +
                  returns(
         | 
| 94 | 
            +
                    aws_access_key_id: 'dummykey',
         | 
| 95 | 
            +
                    aws_secret_access_key: 'dummysecret',
         | 
| 96 | 
            +
                    aws_session_token: 'dummytoken',
         | 
| 97 | 
            +
                    region: 'us-west-1',
         | 
| 98 | 
            +
                    aws_credentials_expire_at: expires_at
         | 
| 99 | 
            +
                  ) { Fog::AWS::Compute.fetch_credentials(use_iam_profile: true) }
         | 
| 100 | 
            +
                end
         | 
| 101 | 
            +
             | 
| 102 | 
            +
                ENV['AWS_WEB_IDENTITY_TOKEN_FILE'] = nil
         | 
| 103 | 
            +
             | 
| 63 104 | 
             
                compute = Fog::AWS::Compute.new(use_iam_profile: true)
         | 
| 64 105 |  | 
| 65 106 | 
             
                tests('#refresh_credentials_if_expired') do
         | 
| @@ -100,6 +141,7 @@ Shindo.tests('AWS | credentials', ['aws']) do | |
| 100 141 | 
             
                end
         | 
| 101 142 | 
             
              ensure
         | 
| 102 143 | 
             
                ENV['AWS_CONTAINER_CREDENTIALS_RELATIVE_URI'] = nil
         | 
| 144 | 
            +
                ENV['AWS_WEB_IDENTITY_TOKEN_FILE'] = nil
         | 
| 103 145 | 
             
                Excon.stubs.clear
         | 
| 104 146 | 
             
                Excon.defaults[:mock] = old_mock_value
         | 
| 105 147 | 
             
                Fog.mock! if fog_was_mocked
         | 
| @@ -1,4 +1,117 @@ | |
| 1 1 | 
             
            Shindo.tests("Storage[:aws] | directory", ["aws"]) do
         | 
| 2 | 
            +
              tests('Fog::Storage[:aws]', "#request_params") do
         | 
| 3 | 
            +
                def slice(hash, *args)
         | 
| 4 | 
            +
                  hash.select { |k, _| args.include?(k) }
         | 
| 5 | 
            +
                end
         | 
| 6 | 
            +
             | 
| 7 | 
            +
                instance = Fog::Storage[:aws]
         | 
| 8 | 
            +
                method = instance.method(:request_params)
         | 
| 9 | 
            +
             | 
| 10 | 
            +
                params = {bucket_name: 'profile-uploads', host: 'profile-uploads.s3.us-west-2.amazonaws.com'}
         | 
| 11 | 
            +
                tests("given #{params}, request_params[:host]").returns("profile-uploads.s3.us-west-2.amazonaws.com") do
         | 
| 12 | 
            +
                  method.call(params)[:host]
         | 
| 13 | 
            +
                end
         | 
| 14 | 
            +
             | 
| 15 | 
            +
                params = {bucket_name: 'profile-uploads.johnsmith.net', cname: 'profile-uploads.johnsmith.net', virtual_host: true}
         | 
| 16 | 
            +
                tests("given #{params}, request_params[:host]").returns("profile-uploads.johnsmith.net") do
         | 
| 17 | 
            +
                  method.call(params)[:host]
         | 
| 18 | 
            +
                end
         | 
| 19 | 
            +
             | 
| 20 | 
            +
                params = {bucket_name: 'profile-uploads.johnsmith.net', cname: 'profile-uploads.johnsmith.net', virtual_host: false}
         | 
| 21 | 
            +
                tests("given #{params}, request_params[:host], request_params[:path]").
         | 
| 22 | 
            +
                  returns({host: "s3.amazonaws.com", path: "/profile-uploads.johnsmith.net/"}) do
         | 
| 23 | 
            +
                  slice(method.call(params), :host, :path)
         | 
| 24 | 
            +
                end
         | 
| 25 | 
            +
             | 
| 26 | 
            +
                params = {bucket_name: 'profile-uploads.johnsmith.net', bucket_cname: 'profile-uploads.johnsmith.net'}
         | 
| 27 | 
            +
                tests("given #{params}, request_params[:host]").returns("profile-uploads.johnsmith.net") do
         | 
| 28 | 
            +
                  method.call(params)[:host]
         | 
| 29 | 
            +
                end
         | 
| 30 | 
            +
             | 
| 31 | 
            +
                params = {bucket_name: 'profile-uploads'}
         | 
| 32 | 
            +
                tests("given #{params}, request_params[:path], request_params[:host]").
         | 
| 33 | 
            +
                  returns({path: "/", host: "profile-uploads.s3.amazonaws.com"}) do
         | 
| 34 | 
            +
                    slice(method.call(params), :path, :host)
         | 
| 35 | 
            +
                  end
         | 
| 36 | 
            +
             | 
| 37 | 
            +
                params = {bucket_name: 'profile-uploads', path_style: true}
         | 
| 38 | 
            +
                tests("given #{params}, request_params[:path], request_params[:host]").
         | 
| 39 | 
            +
                  returns({path: "/profile-uploads/", host: "s3.amazonaws.com"}) do
         | 
| 40 | 
            +
                    slice(method.call(params), :path, :host)
         | 
| 41 | 
            +
                  end
         | 
| 42 | 
            +
             | 
| 43 | 
            +
                params = {bucket_name: 'profile-uploads', path_style: false}
         | 
| 44 | 
            +
                tests("given #{params}, request_params[:path], request_params[:host]").
         | 
| 45 | 
            +
                  returns({path: "/", host: "profile-uploads.s3.amazonaws.com"}) do
         | 
| 46 | 
            +
                    slice(method.call(params), :path, :host)
         | 
| 47 | 
            +
                  end
         | 
| 48 | 
            +
             | 
| 49 | 
            +
                params = {scheme: 'https', bucket_name: 'profile.uploads', path_style: false}
         | 
| 50 | 
            +
                tests("given #{params}, request_params[:path], request_params[:host]").
         | 
| 51 | 
            +
                  returns(path: "/profile.uploads/", host: "s3.amazonaws.com") do
         | 
| 52 | 
            +
                    slice(method.call(params), :path, :host)
         | 
| 53 | 
            +
                  end
         | 
| 54 | 
            +
             | 
| 55 | 
            +
                params = {:headers=>{:"Content-Type"=>"application/json"}}
         | 
| 56 | 
            +
                tests("given #{params}, request_params[:headers]").returns({:"Content-Type"=>"application/json"}) do
         | 
| 57 | 
            +
                  method.call(params)[:headers]
         | 
| 58 | 
            +
                end
         | 
| 59 | 
            +
             | 
| 60 | 
            +
                params = {headers: {}}
         | 
| 61 | 
            +
                tests("given #{params}, request_params[:headers]").returns({}) do
         | 
| 62 | 
            +
                  method.call(params)[:headers]
         | 
| 63 | 
            +
                end
         | 
| 64 | 
            +
             | 
| 65 | 
            +
                params = {scheme: 'http'}
         | 
| 66 | 
            +
                tests("given #{params}, request_params[:scheme]").returns('http') do
         | 
| 67 | 
            +
                  method.call(params)[:scheme]
         | 
| 68 | 
            +
                end
         | 
| 69 | 
            +
             | 
| 70 | 
            +
                params = {}
         | 
| 71 | 
            +
                tests("given #{params}, request_params[:scheme]").returns('https') do
         | 
| 72 | 
            +
                  method.call(params)[:scheme]
         | 
| 73 | 
            +
                end
         | 
| 74 | 
            +
             | 
| 75 | 
            +
                params = {scheme: 'http', port: 8080}
         | 
| 76 | 
            +
                tests("given #{params} (default scheme), request_params[:port]").returns(8080) do
         | 
| 77 | 
            +
                  method.call(params)[:port]
         | 
| 78 | 
            +
                end
         | 
| 79 | 
            +
             | 
| 80 | 
            +
                params = {scheme: 'https', port: 443}
         | 
| 81 | 
            +
                tests("given #{params}, request_params[:port]").returns(nil) do
         | 
| 82 | 
            +
                  method.call(params)[:port]
         | 
| 83 | 
            +
                end
         | 
| 84 | 
            +
             | 
| 85 | 
            +
                params = {}
         | 
| 86 | 
            +
                tests("given #{params}, request_params[:host]").returns("s3.amazonaws.com") do
         | 
| 87 | 
            +
                  method.call(params)[:host]
         | 
| 88 | 
            +
                end
         | 
| 89 | 
            +
             | 
| 90 | 
            +
                params = {region: 'us-east-1'}
         | 
| 91 | 
            +
                tests("given #{params}, request_params[:host]").returns("s3.amazonaws.com") do
         | 
| 92 | 
            +
                  method.call(params)[:host]
         | 
| 93 | 
            +
                end
         | 
| 94 | 
            +
             | 
| 95 | 
            +
                params = {region: 'us-west-2'}
         | 
| 96 | 
            +
                tests("given #{params}, request_params[:host]").returns("s3.us-west-2.amazonaws.com") do
         | 
| 97 | 
            +
                  method.call(params)[:host]
         | 
| 98 | 
            +
                end
         | 
| 99 | 
            +
             | 
| 100 | 
            +
                params= {region: 'us-east-1', host: 's3.us-west-2.amazonaws.com'}
         | 
| 101 | 
            +
                tests("given #{params}, request_params[:host]").returns("s3.us-west-2.amazonaws.com") do
         | 
| 102 | 
            +
                  method.call(params)[:host]
         | 
| 103 | 
            +
                end
         | 
| 104 | 
            +
             | 
| 105 | 
            +
                params = {object_name: 'image.png'}
         | 
| 106 | 
            +
                tests("given #{params}, request_params[:host]").returns("/image.png") do
         | 
| 107 | 
            +
                  method.call(params)[:path]
         | 
| 108 | 
            +
                end
         | 
| 109 | 
            +
             | 
| 110 | 
            +
                params = {object_name: 'image.png', path: '/images/image.png'}
         | 
| 111 | 
            +
                tests("given #{params}, request_params[:host]").returns("/images/image.png") do
         | 
| 112 | 
            +
                  method.call(params)[:path]
         | 
| 113 | 
            +
                end
         | 
| 114 | 
            +
              end
         | 
| 2 115 |  | 
| 3 116 | 
             
              directory_attributes = {
         | 
| 4 117 | 
             
                :key => uniq_id('fogdirectorytests')
         | 
| @@ -85,7 +198,5 @@ Shindo.tests("Storage[:aws] | directory", ["aws"]) do | |
| 85 198 | 
             
                    @instance.versioning?
         | 
| 86 199 | 
             
                  end
         | 
| 87 200 | 
             
                end
         | 
| 88 | 
            -
             | 
| 89 201 | 
             
              end
         | 
| 90 | 
            -
             | 
| 91 202 | 
             
            end
         | 
| @@ -50,6 +50,38 @@ Shindo.tests("Storage[:aws] | files", ["aws"]) do | |
| 50 50 | 
             
                  end
         | 
| 51 51 | 
             
                end
         | 
| 52 52 |  | 
| 53 | 
            +
                tests('#normalize_headers') do
         | 
| 54 | 
            +
                  files = @directory.files
         | 
| 55 | 
            +
                  response = Excon::Response.new
         | 
| 56 | 
            +
                  current_time = Time.new(2021, 02, 21)
         | 
| 57 | 
            +
             | 
| 58 | 
            +
                  response.headers['last-modified'] = current_time.to_s
         | 
| 59 | 
            +
                  response.headers['etag'] = '12345'
         | 
| 60 | 
            +
                  response.headers['ETAG'] = '12345'
         | 
| 61 | 
            +
                  response.headers['Cache-Control'] = 'no-cache'
         | 
| 62 | 
            +
                  response.headers['Content-disposition'] = 'attachment'
         | 
| 63 | 
            +
                  response.headers['content-length'] = 100
         | 
| 64 | 
            +
                  response.headers['content-Encoding'] = 'gzip'
         | 
| 65 | 
            +
                  response.headers['content-md5'] = 'ABCDEAB'
         | 
| 66 | 
            +
                  response.headers['content-Md5'] = 'ABCDEAB'
         | 
| 67 | 
            +
                  response.headers['ConTent-Type'] = 'application/json'
         | 
| 68 | 
            +
             | 
| 69 | 
            +
                  expected = {
         | 
| 70 | 
            +
                    'Last-Modified' => current_time,
         | 
| 71 | 
            +
                    'ETag' => '12345',
         | 
| 72 | 
            +
                    'Cache-Control' => 'no-cache',
         | 
| 73 | 
            +
                    'Content-Disposition' => 'attachment',
         | 
| 74 | 
            +
                    'Content-Length' => 100,
         | 
| 75 | 
            +
                    'Content-Encoding' => 'gzip',
         | 
| 76 | 
            +
                    'Content-MD5' => 'ABCDEAB',
         | 
| 77 | 
            +
                    'Content-Type' => 'application/json'
         | 
| 78 | 
            +
                  }
         | 
| 79 | 
            +
             | 
| 80 | 
            +
                  tests('header keys are normalized').returns(expected) do
         | 
| 81 | 
            +
                    files.normalize_headers(response)
         | 
| 82 | 
            +
                    response.headers
         | 
| 83 | 
            +
                  end
         | 
| 84 | 
            +
                end
         | 
| 53 85 | 
             
              end
         | 
| 54 86 |  | 
| 55 87 | 
             
              @directory.versions.each(&:destroy)
         | 
| @@ -158,7 +158,7 @@ Shindo.tests('Fog::Storage[:aws] | bucket requests', ["aws"]) do | |
| 158 158 | 
             
                  Fog::Storage[:aws].put_bucket_website(@aws_bucket_name, :IndexDocument => 'index.html')
         | 
| 159 159 | 
             
                end
         | 
| 160 160 |  | 
| 161 | 
            -
                tests("#put_bucket_website('#{@aws_bucket_name}', :RedirectAllRequestsTo => 'redirect.example | 
| 161 | 
            +
                tests("#put_bucket_website('#{@aws_bucket_name}', :RedirectAllRequestsTo => 'redirect.example.com')").succeeds do
         | 
| 162 162 | 
             
                  Fog::Storage[:aws].put_bucket_website(@aws_bucket_name, :RedirectAllRequestsTo => 'redirect.example.com')
         | 
| 163 163 | 
             
                end
         | 
| 164 164 |  | 
| @@ -0,0 +1,93 @@ | |
| 1 | 
            +
            require 'securerandom'
         | 
| 2 | 
            +
             | 
| 3 | 
            +
            Shindo.tests('Fog::Storage[:aws] | copy requests', ["aws"]) do
         | 
| 4 | 
            +
             | 
| 5 | 
            +
              @directory = Fog::Storage[:aws].directories.create(:key => uniq_id('fogmultipartcopytests'))
         | 
| 6 | 
            +
              @large_data = SecureRandom.hex * 600000
         | 
| 7 | 
            +
              @large_blob = Fog::Storage[:aws].put_object(@directory.identity, 'large_object', @large_data)
         | 
| 8 | 
            +
             | 
| 9 | 
            +
              tests('copies an empty object') do
         | 
| 10 | 
            +
                Fog::Storage[:aws].put_object(@directory.identity, 'empty_object', '')
         | 
| 11 | 
            +
             | 
| 12 | 
            +
                file = Fog::Storage[:aws].directories.new(key: @directory.identity).files.get('empty_object')
         | 
| 13 | 
            +
                file.multipart_chunk_size = Fog::AWS::Storage::File::MIN_MULTIPART_CHUNK_SIZE
         | 
| 14 | 
            +
             | 
| 15 | 
            +
                tests("#copy_object('#{@directory.identity}', 'empty_copied_object'").succeeds do
         | 
| 16 | 
            +
                  file.copy(@directory.identity, 'empty_copied_object')
         | 
| 17 | 
            +
                end
         | 
| 18 | 
            +
             | 
| 19 | 
            +
                copied = Fog::Storage[:aws].directories.new(key: @directory.identity).files.get('empty_copied_object')
         | 
| 20 | 
            +
                test("copied is the same") { copied.body == file.body }
         | 
| 21 | 
            +
              end
         | 
| 22 | 
            +
             | 
| 23 | 
            +
              tests('copies a small object') do
         | 
| 24 | 
            +
                Fog::Storage[:aws].put_object(@directory.identity, 'fog_object', lorem_file)
         | 
| 25 | 
            +
             | 
| 26 | 
            +
                file = Fog::Storage[:aws].directories.new(key: @directory.identity).files.get('fog_object')
         | 
| 27 | 
            +
             | 
| 28 | 
            +
                tests("#copy_object('#{@directory.identity}', 'copied_object'").succeeds do
         | 
| 29 | 
            +
                  file.copy(@directory.identity, 'copied_object')
         | 
| 30 | 
            +
                end
         | 
| 31 | 
            +
             | 
| 32 | 
            +
                copied = Fog::Storage[:aws].directories.new(key: @directory.identity).files.get('copied_object')
         | 
| 33 | 
            +
                test("copied is the same") { copied.body == file.body }
         | 
| 34 | 
            +
              end
         | 
| 35 | 
            +
             | 
| 36 | 
            +
              tests('copies a file needing a single part') do
         | 
| 37 | 
            +
                data = '*' * Fog::AWS::Storage::File::MIN_MULTIPART_CHUNK_SIZE
         | 
| 38 | 
            +
                Fog::Storage[:aws].put_object(@directory.identity, '1_part_object', data)
         | 
| 39 | 
            +
             | 
| 40 | 
            +
                file = Fog::Storage[:aws].directories.new(key: @directory.identity).files.get('1_part_object')
         | 
| 41 | 
            +
                file.multipart_chunk_size = Fog::AWS::Storage::File::MIN_MULTIPART_CHUNK_SIZE
         | 
| 42 | 
            +
             | 
| 43 | 
            +
                tests("#copy_object('#{@directory.identity}', '1_part_copied_object'").succeeds do
         | 
| 44 | 
            +
                  file.copy(@directory.identity, '1_part_copied_object')
         | 
| 45 | 
            +
                end
         | 
| 46 | 
            +
             | 
| 47 | 
            +
                copied = Fog::Storage[:aws].directories.new(key: @directory.identity).files.get('1_part_copied_object')
         | 
| 48 | 
            +
                test("copied is the same") { copied.body == file.body }
         | 
| 49 | 
            +
              end
         | 
| 50 | 
            +
             | 
| 51 | 
            +
              tests('copies a file with many parts') do
         | 
| 52 | 
            +
                file = Fog::Storage[:aws].directories.new(key: @directory.identity).files.get('large_object')
         | 
| 53 | 
            +
                file.multipart_chunk_size = Fog::AWS::Storage::File::MIN_MULTIPART_CHUNK_SIZE
         | 
| 54 | 
            +
             | 
| 55 | 
            +
                tests("#copy_object('#{@directory.identity}', 'large_copied_object'").succeeds do
         | 
| 56 | 
            +
                  file.copy(@directory.identity, 'large_copied_object')
         | 
| 57 | 
            +
                end
         | 
| 58 | 
            +
             | 
| 59 | 
            +
                copied = Fog::Storage[:aws].directories.new(key: @directory.identity).files.get('large_copied_object')
         | 
| 60 | 
            +
             | 
| 61 | 
            +
                test("concurrency defaults to 1") { file.concurrency == 1 }
         | 
| 62 | 
            +
                test("copied is the same") { copied.body == file.body }
         | 
| 63 | 
            +
              end
         | 
| 64 | 
            +
             | 
| 65 | 
            +
              tests('copies a file with many parts with 10 threads') do
         | 
| 66 | 
            +
                file = Fog::Storage[:aws].directories.new(key: @directory.identity).files.get('large_object')
         | 
| 67 | 
            +
                file.multipart_chunk_size = Fog::AWS::Storage::File::MIN_MULTIPART_CHUNK_SIZE
         | 
| 68 | 
            +
                file.concurrency = 10
         | 
| 69 | 
            +
             | 
| 70 | 
            +
                test("concurrency is set to 10") { file.concurrency == 10 }
         | 
| 71 | 
            +
             | 
| 72 | 
            +
                tests("#copy_object('#{@directory.identity}', 'copied_object_with_10_threads'").succeeds do
         | 
| 73 | 
            +
                  file.copy(@directory.identity, 'copied_object_with_10_threads')
         | 
| 74 | 
            +
                end
         | 
| 75 | 
            +
             | 
| 76 | 
            +
                copied = Fog::Storage[:aws].directories.new(key: @directory.identity).files.get('copied_object_with_10_threads')
         | 
| 77 | 
            +
             | 
| 78 | 
            +
                test("copied is the same") { copied.body == file.body }
         | 
| 79 | 
            +
              end
         | 
| 80 | 
            +
             | 
| 81 | 
            +
              tests('copies an object with unknown headers') do
         | 
| 82 | 
            +
                file = Fog::Storage[:aws].directories.new(key: @directory.identity).files.get('large_object')
         | 
| 83 | 
            +
                file.multipart_chunk_size = Fog::AWS::Storage::File::MIN_MULTIPART_CHUNK_SIZE
         | 
| 84 | 
            +
                file.concurrency = 10
         | 
| 85 | 
            +
             | 
| 86 | 
            +
                tests("#copy_object('#{@directory.identity}', 'copied_object'").succeeds do
         | 
| 87 | 
            +
                  file.copy(@directory.identity, 'copied_object', { unknown: 1 } )
         | 
| 88 | 
            +
                end
         | 
| 89 | 
            +
             | 
| 90 | 
            +
                copied = Fog::Storage[:aws].directories.new(key: @directory.identity).files.get('copied_object')
         | 
| 91 | 
            +
                test("copied is the same") { copied.body == file.body }
         | 
| 92 | 
            +
              end
         | 
| 93 | 
            +
            end
         | 
| @@ -18,6 +18,13 @@ Shindo.tests('AWS::Storage | object requests', ['aws']) do | |
| 18 18 | 
             
                  Fog::Storage[:aws].put_object(@directory.identity, 'fog_object', lorem_file)
         | 
| 19 19 | 
             
                end
         | 
| 20 20 |  | 
| 21 | 
            +
                tests("#put_object('#{@directory.identity}', 'fog_object', lorem_file at EOF)").returns(lorem_file.read) do
         | 
| 22 | 
            +
                  file = lorem_file
         | 
| 23 | 
            +
                  file.read
         | 
| 24 | 
            +
                  Fog::Storage[:aws].put_object(@directory.identity, 'fog_object', file)
         | 
| 25 | 
            +
                  Fog::Storage[:aws].get_object(@directory.identity, 'fog_object').body
         | 
| 26 | 
            +
                end
         | 
| 27 | 
            +
             | 
| 21 28 | 
             
                tests("#copy_object('#{@directory.identity}', 'fog_object', '#{@directory.identity}', 'fog_other_object')").succeeds do
         | 
| 22 29 | 
             
                  Fog::Storage[:aws].copy_object(@directory.identity, 'fog_object', @directory.identity, 'fog_other_object')
         | 
| 23 30 | 
             
                end
         | 
| @@ -134,6 +134,44 @@ Shindo.tests('Fog::Storage[:aws] | versioning', ["aws"]) do | |
| 134 134 | 
             
                  end
         | 
| 135 135 | 
             
                end
         | 
| 136 136 |  | 
| 137 | 
            +
                tests("deleting_multiple_objects_versions('#{@aws_bucket_name}", 'file') do
         | 
| 138 | 
            +
                  clear_bucket
         | 
| 139 | 
            +
             | 
| 140 | 
            +
                  bucket = Fog::Storage[:aws].directories.get(@aws_bucket_name)
         | 
| 141 | 
            +
             | 
| 142 | 
            +
                  file_count = 5
         | 
| 143 | 
            +
                  file_names = []
         | 
| 144 | 
            +
                  files = {}
         | 
| 145 | 
            +
                  file_count.times do |id|
         | 
| 146 | 
            +
                    file_names << "file_#{id}"
         | 
| 147 | 
            +
                    file_version_count = rand(1..5)
         | 
| 148 | 
            +
                    file_version_count.times do
         | 
| 149 | 
            +
                      files[file_names.last] = bucket.files.create(:body => 'a',
         | 
| 150 | 
            +
                                                                  :key => file_names.last)
         | 
| 151 | 
            +
                    end
         | 
| 152 | 
            +
                  end
         | 
| 153 | 
            +
             | 
| 154 | 
            +
                  tests("deleting an object with multiple versions").returns(true) do
         | 
| 155 | 
            +
                    versions = Fog::Storage[:aws].get_bucket_object_versions(
         | 
| 156 | 
            +
                                    @aws_bucket_name) 
         | 
| 157 | 
            +
                    file_versions = {}
         | 
| 158 | 
            +
                    versions.body['Versions'].each do |version|
         | 
| 159 | 
            +
                      object = version[version.keys.first]
         | 
| 160 | 
            +
                      if file_versions[object['Key']]
         | 
| 161 | 
            +
                        file_versions[object['Key']] = file_versions[object['Key']] << object['VersionId']
         | 
| 162 | 
            +
                      else
         | 
| 163 | 
            +
                        file_versions[object['Key']] = [object['VersionId']]
         | 
| 164 | 
            +
                      end
         | 
| 165 | 
            +
                    end
         | 
| 166 | 
            +
             | 
| 167 | 
            +
                    Fog::Storage[:aws].delete_multiple_objects(@aws_bucket_name,
         | 
| 168 | 
            +
                                                              file_names, 'versionId' => file_versions)
         | 
| 169 | 
            +
                    versions = Fog::Storage[:aws].get_bucket_object_versions(
         | 
| 170 | 
            +
                                  @aws_bucket_name)
         | 
| 171 | 
            +
                    versions.body['Versions'].empty?
         | 
| 172 | 
            +
                  end
         | 
| 173 | 
            +
                end
         | 
| 174 | 
            +
             | 
| 137 175 | 
             
                tests("deleting_multiple_objects('#{@aws_bucket_name}", 'file') do
         | 
| 138 176 | 
             
                  clear_bucket
         | 
| 139 177 |  | 
    
        metadata
    CHANGED
    
    | @@ -1,44 +1,44 @@ | |
| 1 1 | 
             
            --- !ruby/object:Gem::Specification
         | 
| 2 2 | 
             
            name: fog-aws
         | 
| 3 3 | 
             
            version: !ruby/object:Gem::Version
         | 
| 4 | 
            -
              version: 3. | 
| 4 | 
            +
              version: 3.10.0
         | 
| 5 5 | 
             
            platform: ruby
         | 
| 6 6 | 
             
            authors:
         | 
| 7 7 | 
             
            - Josh Lane
         | 
| 8 8 | 
             
            - Wesley Beary
         | 
| 9 | 
            -
            autorequire: | 
| 9 | 
            +
            autorequire:
         | 
| 10 10 | 
             
            bindir: bin
         | 
| 11 11 | 
             
            cert_chain: []
         | 
| 12 | 
            -
            date:  | 
| 12 | 
            +
            date: 2021-03-22 00:00:00.000000000 Z
         | 
| 13 13 | 
             
            dependencies:
         | 
| 14 14 | 
             
            - !ruby/object:Gem::Dependency
         | 
| 15 15 | 
             
              name: bundler
         | 
| 16 16 | 
             
              requirement: !ruby/object:Gem::Requirement
         | 
| 17 17 | 
             
                requirements:
         | 
| 18 | 
            -
                - - " | 
| 18 | 
            +
                - - ">="
         | 
| 19 19 | 
             
                  - !ruby/object:Gem::Version
         | 
| 20 | 
            -
                    version: ' | 
| 20 | 
            +
                    version: '0'
         | 
| 21 21 | 
             
              type: :development
         | 
| 22 22 | 
             
              prerelease: false
         | 
| 23 23 | 
             
              version_requirements: !ruby/object:Gem::Requirement
         | 
| 24 24 | 
             
                requirements:
         | 
| 25 | 
            -
                - - " | 
| 25 | 
            +
                - - ">="
         | 
| 26 26 | 
             
                  - !ruby/object:Gem::Version
         | 
| 27 | 
            -
                    version: ' | 
| 27 | 
            +
                    version: '0'
         | 
| 28 28 | 
             
            - !ruby/object:Gem::Dependency
         | 
| 29 29 | 
             
              name: github_changelog_generator
         | 
| 30 30 | 
             
              requirement: !ruby/object:Gem::Requirement
         | 
| 31 31 | 
             
                requirements:
         | 
| 32 32 | 
             
                - - "~>"
         | 
| 33 33 | 
             
                  - !ruby/object:Gem::Version
         | 
| 34 | 
            -
                    version: '1. | 
| 34 | 
            +
                    version: '1.16'
         | 
| 35 35 | 
             
              type: :development
         | 
| 36 36 | 
             
              prerelease: false
         | 
| 37 37 | 
             
              version_requirements: !ruby/object:Gem::Requirement
         | 
| 38 38 | 
             
                requirements:
         | 
| 39 39 | 
             
                - - "~>"
         | 
| 40 40 | 
             
                  - !ruby/object:Gem::Version
         | 
| 41 | 
            -
                    version: '1. | 
| 41 | 
            +
                    version: '1.16'
         | 
| 42 42 | 
             
            - !ruby/object:Gem::Dependency
         | 
| 43 43 | 
             
              name: rake
         | 
| 44 44 | 
             
              requirement: !ruby/object:Gem::Requirement
         | 
| @@ -147,8 +147,10 @@ executables: [] | |
| 147 147 | 
             
            extensions: []
         | 
| 148 148 | 
             
            extra_rdoc_files: []
         | 
| 149 149 | 
             
            files:
         | 
| 150 | 
            +
            - ".github/dependabot.yml"
         | 
| 151 | 
            +
            - ".github/workflows/ruby.yml"
         | 
| 152 | 
            +
            - ".github/workflows/stale.yml"
         | 
| 150 153 | 
             
            - ".gitignore"
         | 
| 151 | 
            -
            - ".travis.yml"
         | 
| 152 154 | 
             
            - CHANGELOG.md
         | 
| 153 155 | 
             
            - CONTRIBUTING.md
         | 
| 154 156 | 
             
            - CONTRIBUTORS.md
         | 
| @@ -160,7 +162,6 @@ files: | |
| 160 162 | 
             
            - bin/setup
         | 
| 161 163 | 
             
            - fog-aws.gemspec
         | 
| 162 164 | 
             
            - gemfiles/Gemfile-edge
         | 
| 163 | 
            -
            - gemfiles/Gemfile-ruby-2.0
         | 
| 164 165 | 
             
            - lib/fog-aws.rb
         | 
| 165 166 | 
             
            - lib/fog/aws.rb
         | 
| 166 167 | 
             
            - lib/fog/aws/auto_scaling.rb
         | 
| @@ -754,6 +755,7 @@ files: | |
| 754 755 | 
             
            - lib/fog/aws/parsers/storage/initiate_multipart_upload.rb
         | 
| 755 756 | 
             
            - lib/fog/aws/parsers/storage/list_multipart_uploads.rb
         | 
| 756 757 | 
             
            - lib/fog/aws/parsers/storage/list_parts.rb
         | 
| 758 | 
            +
            - lib/fog/aws/parsers/storage/upload_part_copy_object.rb
         | 
| 757 759 | 
             
            - lib/fog/aws/parsers/sts/assume_role.rb
         | 
| 758 760 | 
             
            - lib/fog/aws/parsers/sts/assume_role_with_saml.rb
         | 
| 759 761 | 
             
            - lib/fog/aws/parsers/sts/assume_role_with_web_identity.rb
         | 
| @@ -1442,6 +1444,7 @@ files: | |
| 1442 1444 | 
             
            - lib/fog/aws/requests/storage/shared_mock_methods.rb
         | 
| 1443 1445 | 
             
            - lib/fog/aws/requests/storage/sync_clock.rb
         | 
| 1444 1446 | 
             
            - lib/fog/aws/requests/storage/upload_part.rb
         | 
| 1447 | 
            +
            - lib/fog/aws/requests/storage/upload_part_copy.rb
         | 
| 1445 1448 | 
             
            - lib/fog/aws/requests/sts/assume_role.rb
         | 
| 1446 1449 | 
             
            - lib/fog/aws/requests/sts/assume_role_with_saml.rb
         | 
| 1447 1450 | 
             
            - lib/fog/aws/requests/sts/assume_role_with_web_identity.rb
         | 
| @@ -1459,7 +1462,6 @@ files: | |
| 1459 1462 | 
             
            - lib/fog/aws/sts.rb
         | 
| 1460 1463 | 
             
            - lib/fog/aws/support.rb
         | 
| 1461 1464 | 
             
            - lib/fog/aws/version.rb
         | 
| 1462 | 
            -
            - stale.yml
         | 
| 1463 1465 | 
             
            - tests/credentials_tests.rb
         | 
| 1464 1466 | 
             
            - tests/helper.rb
         | 
| 1465 1467 | 
             
            - tests/helpers/collection_helper.rb
         | 
| @@ -1709,6 +1711,7 @@ files: | |
| 1709 1711 | 
             
            - tests/requests/storage/bucket_tests.rb
         | 
| 1710 1712 | 
             
            - tests/requests/storage/cors_utils_tests.rb
         | 
| 1711 1713 | 
             
            - tests/requests/storage/delete_multiple_objects_tests.rb
         | 
| 1714 | 
            +
            - tests/requests/storage/multipart_copy_tests.rb
         | 
| 1712 1715 | 
             
            - tests/requests/storage/multipart_upload_tests.rb
         | 
| 1713 1716 | 
             
            - tests/requests/storage/object_tests.rb
         | 
| 1714 1717 | 
             
            - tests/requests/storage/versioning_tests.rb
         | 
| @@ -1726,7 +1729,7 @@ homepage: https://github.com/fog/fog-aws | |
| 1726 1729 | 
             
            licenses:
         | 
| 1727 1730 | 
             
            - MIT
         | 
| 1728 1731 | 
             
            metadata: {}
         | 
| 1729 | 
            -
            post_install_message: | 
| 1732 | 
            +
            post_install_message:
         | 
| 1730 1733 | 
             
            rdoc_options: []
         | 
| 1731 1734 | 
             
            require_paths:
         | 
| 1732 1735 | 
             
            - lib
         | 
| @@ -1741,8 +1744,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement | |
| 1741 1744 | 
             
                - !ruby/object:Gem::Version
         | 
| 1742 1745 | 
             
                  version: '0'
         | 
| 1743 1746 | 
             
            requirements: []
         | 
| 1744 | 
            -
            rubygems_version: 3. | 
| 1745 | 
            -
            signing_key: | 
| 1747 | 
            +
            rubygems_version: 3.1.2
         | 
| 1748 | 
            +
            signing_key:
         | 
| 1746 1749 | 
             
            specification_version: 4
         | 
| 1747 1750 | 
             
            summary: Module for the 'fog' gem to support Amazon Web Services.
         | 
| 1748 1751 | 
             
            test_files: []
         |