Class: Fog::AWS::S3::Mock

Inherits:
Object
  • Object
show all
Includes:
Collections, Utils
Defined in:
lib/fog/aws/s3.rb,
lib/fog/aws/requests/s3/get_bucket.rb,
lib/fog/aws/requests/s3/get_object.rb,
lib/fog/aws/requests/s3/put_bucket.rb,
lib/fog/aws/requests/s3/put_object.rb,
lib/fog/aws/requests/s3/copy_object.rb,
lib/fog/aws/requests/s3/get_service.rb,
lib/fog/aws/requests/s3/head_object.rb,
lib/fog/aws/requests/s3/delete_bucket.rb,
lib/fog/aws/requests/s3/delete_object.rb,
lib/fog/aws/requests/s3/get_bucket_acl.rb,
lib/fog/aws/requests/s3/get_object_acl.rb,
lib/fog/aws/requests/s3/get_object_url.rb,
lib/fog/aws/requests/s3/put_bucket_acl.rb,
lib/fog/aws/requests/s3/put_object_url.rb,
lib/fog/aws/requests/s3/get_bucket_logging.rb,
lib/fog/aws/requests/s3/get_object_torrent.rb,
lib/fog/aws/requests/s3/put_bucket_logging.rb,
lib/fog/aws/requests/s3/get_bucket_location.rb,
lib/fog/aws/requests/s3/get_request_payment.rb,
lib/fog/aws/requests/s3/put_request_payment.rb,
lib/fog/aws/requests/s3/get_bucket_versioning.rb,
lib/fog/aws/requests/s3/put_bucket_versioning.rb,
lib/fog/aws/requests/s3/get_bucket_object_versions.rb

Class Method Summary collapse

Instance Method Summary collapse

Methods included from Utils

#parse_data, #url

Methods included from Collections

#directories

Constructor Details

#initialize(options = {}) ⇒ Mock

Returns a new instance of Mock.



91
92
93
94
# File 'lib/fog/aws/s3.rb', line 91

def initialize(options={})
  @aws_access_key_id = options[:aws_access_key_id]
  @data = self.class.data[@aws_access_key_id]
end

Class Method Details

.dataObject



77
78
79
80
81
82
83
# File 'lib/fog/aws/s3.rb', line 77

def self.data
  @data ||= Hash.new do |hash, key|
    hash[key] = {
      :buckets => {}
    }
  end
end

.reset_data(keys = data.keys) ⇒ Object



85
86
87
88
89
# File 'lib/fog/aws/s3.rb', line 85

def self.reset_data(keys=data.keys)
  for key in [*keys]
    data.delete(key)
  end
end

Instance Method Details

#copy_object(source_bucket_name, source_object_name, target_bucket_name, target_object_name, options = {}) ⇒ Object



44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
# File 'lib/fog/aws/requests/s3/copy_object.rb', line 44

def copy_object(source_bucket_name, source_object_name, target_bucket_name, target_object_name, options = {})
  response = Excon::Response.new
  source_bucket = @data[:buckets][source_bucket_name]
  source_object = source_bucket && source_bucket[:objects][source_object_name]
  target_bucket = @data[:buckets][target_bucket_name]

  if source_object && target_bucket
    response.status = 200
    target_object = source_object.dup
    target_object.merge!({
      'Name' => target_object_name
    })
    target_bucket[:objects][target_object_name] = target_object
    response.body = {
      'ETag'          => target_object['ETag'],
      'LastModified'  => Time.parse(target_object['LastModified'])
    }
  else
    response.status = 404
    raise(Excon::Errors.status_error({:expects => 200}, response))
  end

  response
end

#delete_bucket(bucket_name) ⇒ Object



27
28
29
30
31
32
33
34
35
36
37
38
39
40
# File 'lib/fog/aws/requests/s3/delete_bucket.rb', line 27

def delete_bucket(bucket_name)
  response = Excon::Response.new
  if @data[:buckets][bucket_name].nil?
    response.status = 404
    raise(Excon::Errors.status_error({:expects => 204}, response))
  elsif @data[:buckets][bucket_name] && !@data[:buckets][bucket_name][:objects].empty?
    response.status = 409
    raise(Excon::Errors.status_error({:expects => 204}, response))
  else
    @data[:buckets].delete(bucket_name)
    response.status = 204
  end
  response
end

#delete_object(bucket_name, object_name) ⇒ Object



30
31
32
33
34
35
36
37
38
39
40
# File 'lib/fog/aws/requests/s3/delete_object.rb', line 30

def delete_object(bucket_name, object_name)
  response = Excon::Response.new
  if bucket = @data[:buckets][bucket_name]
    response.status = 204
    bucket[:objects].delete(object_name)
  else
    response.status = 404
    raise(Excon::Errors.status_error({:expects => 204}, response))
  end
  response
end

#get_bucket(bucket_name, options = {}) ⇒ Object



58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
# File 'lib/fog/aws/requests/s3/get_bucket.rb', line 58

def get_bucket(bucket_name, options = {})
  unless bucket_name
    raise ArgumentError.new('bucket_name is required')
  end
  response = Excon::Response.new
  if bucket = @data[:buckets][bucket_name]
    response.status = 200
    response.body = {
      'Contents' => bucket[:objects].values.sort {|x,y| x['Key'] <=> y['Key']}.reject do |object|
          (options['prefix'] && object['Key'][0...options['prefix'].length] != options['prefix']) ||
          (options['marker'] && object['Key'] <= options['marker'])
        end.map do |object|
          data = object.reject {|key, value| !['ETag', 'Key', 'LastModified', 'Size', 'StorageClass'].include?(key)}
          data.merge!({
            'LastModified' => Time.parse(data['LastModified']),
            'Owner'        => bucket['Owner'],
            'Size'         => data['Size'].to_i
          })
        data
      end,
      'IsTruncated' => false,
      'Marker'      => options['marker'],
      'MaxKeys'     => options['max-keys'] || 1000,
      'Name'        => bucket['Name'],
      'Prefix'      => options['prefix']
    }
    if options['max-keys'] && options['max-keys'] < response.body['Contents'].length
        response.body['IsTruncated'] = true
        response.body['Contents'] = response.body['Contents'][0...options['max-keys']]
    end
  else
    response.status = 404
    raise(Excon::Errors.status_error({:expects => 200}, response))
  end
  response
end

#get_bucket_acl(bucket_name) ⇒ Object



48
49
50
# File 'lib/fog/aws/requests/s3/get_bucket_acl.rb', line 48

def get_bucket_acl(bucket_name)
  Fog::Mock.not_implemented
end

#get_bucket_location(bucket_name) ⇒ Object



33
34
35
36
37
38
39
40
41
42
43
# File 'lib/fog/aws/requests/s3/get_bucket_location.rb', line 33

def get_bucket_location(bucket_name)
  response = Excon::Response.new
  if bucket = @data[:buckets][bucket_name]
    response.status = 200
    response.body = {'LocationConstraint' => bucket['LocationConstraint'] }
  else
    response.status = 404
    raise(Excon::Errors.status_error({:expects => 200}, response))
  end
  response
end

#get_bucket_logging(bucket_name) ⇒ Object



48
49
50
# File 'lib/fog/aws/requests/s3/get_bucket_logging.rb', line 48

def get_bucket_logging(bucket_name)
  Fog::Mock.not_implemented
end

#get_bucket_object_versions(bucket_name, options = {}) ⇒ Object



73
74
75
# File 'lib/fog/aws/requests/s3/get_bucket_object_versions.rb', line 73

def get_bucket_object_versions(bucket_name, options = {})
  Fog::Mock.not_implemented
end

#get_bucket_versioning(bucket_name) ⇒ Object



38
39
40
# File 'lib/fog/aws/requests/s3/get_bucket_versioning.rb', line 38

def get_bucket_versioning(bucket_name)
  Fog::Mock.not_implemented
end

#get_object(bucket_name, object_name, options = {}, &block) ⇒ Object



57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
# File 'lib/fog/aws/requests/s3/get_object.rb', line 57

def get_object(bucket_name, object_name, options = {}, &block)
  unless bucket_name
    raise ArgumentError.new('bucket_name is required')
  end
  unless object_name
    raise ArgumentError.new('object_name is required')
  end
  response = Excon::Response.new
  if (bucket = @data[:buckets][bucket_name]) && (object = bucket[:objects][object_name])
    if options['If-Match'] && options['If-Match'] != object['ETag']
      response.status = 412
    elsif options['If-Modified-Since'] && options['If-Modified-Since'] > Time.parse(object['LastModified'])
      response.status = 304
    elsif options['If-None-Match'] && options['If-None-Match'] == object['ETag']
      response.status = 304
    elsif options['If-Unmodified-Since'] && options['If-Unmodified-Since'] < Time.parse(object['LastModified'])
      response.status = 412
    else
      response.status = 200
      response.headers = {
        'Content-Length'  => object['Size'],
        'Content-Type'    => object['Content-Type'],
        'ETag'            => object['ETag'],
        'Last-Modified'   => object['LastModified']
      }
      unless block_given?
        response.body = object[:body]
      else
        data = StringIO.new(object[:body])
        remaining = data.length
        while remaining > 0
          chunk = data.read([remaining, Excon::CHUNK_SIZE].min)
          block.call(chunk)
          remaining -= Excon::CHUNK_SIZE
        end
      end
    end
  else
    response.status = 404
    raise(Excon::Errors.status_error({:expects => 200}, response))
  end
  response
end

#get_object_acl(bucket_name, object_name) ⇒ Object



59
60
61
# File 'lib/fog/aws/requests/s3/get_object_acl.rb', line 59

def get_object_acl(bucket_name, object_name)
  Fog::Mock.not_implemented
end

#get_object_object(bucket_name, object_name) ⇒ Object



48
49
50
# File 'lib/fog/aws/requests/s3/get_object_torrent.rb', line 48

def get_object_object(bucket_name, object_name)
  Fog::Mock.not_implemented
end

#get_object_url(bucket_name, object_name, expires) ⇒ Object



36
37
38
39
40
41
42
43
44
45
46
47
48
49
# File 'lib/fog/aws/requests/s3/get_object_url.rb', line 36

def get_object_url(bucket_name, object_name, expires)
  unless bucket_name
    raise ArgumentError.new('bucket_name is required')
  end
  unless object_name
    raise ArgumentError.new('object_name is required')
  end
  url({
    :headers  => {},
    :host     => "#{bucket_name}.#{@host}",
    :method   => 'GET',
    :path     => CGI.escape(object_name)
  }, expires)
end

#get_request_payment(bucket_name) ⇒ Object



33
34
35
36
37
38
39
40
41
42
43
# File 'lib/fog/aws/requests/s3/get_request_payment.rb', line 33

def get_request_payment(bucket_name)
  response = Excon::Response.new
  if bucket = @data[:buckets][bucket_name]
    response.status = 200
    response.body = { 'Payer' => bucket['Payer'] }
  else
    response.status = 404
    raise(Excon::Errors.status_error({:expects => 200}, response))
  end
  response
end

#get_serviceObject



35
36
37
38
39
40
41
42
43
44
45
46
47
48
# File 'lib/fog/aws/requests/s3/get_service.rb', line 35

def get_service
  response = Excon::Response.new
  response.headers['Status'] = 200
  buckets = @data[:buckets].values.map do |bucket|
    bucket.reject do |key, value|
      !['CreationDate', 'Name'].include?(key)
    end
  end
  response.body = {
    'Buckets' => buckets,
    'Owner'   => { 'DisplayName' => 'owner', 'ID' => 'some_id'}
  }
  response
end

#head_object(bucket_name, object_name, options = {}) ⇒ Object



55
56
57
58
59
# File 'lib/fog/aws/requests/s3/head_object.rb', line 55

def head_object(bucket_name, object_name, options = {})
  response = get_object(bucket_name, object_name, options)
  response.body = nil
  response
end

#put_bucket(bucket_name, options = {}) ⇒ Object



41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
# File 'lib/fog/aws/requests/s3/put_bucket.rb', line 41

def put_bucket(bucket_name, options = {})
  response = Excon::Response.new
  response.status = 200
  bucket = {
    :objects        => {},
    'Name'          => bucket_name,
    'CreationDate'  => Time.now,
    'Owner'         => { 'DisplayName' => 'owner', 'ID' => 'some_id'},
    'Payer'         => 'BucketOwner'
  }
  if options['LocationConstraint']
    bucket['LocationConstraint'] = options['LocationConstraint']
  else
    bucket['LocationConstraint'] = ''
  end
  unless @data[:buckets][bucket_name]
    @data[:buckets][bucket_name] = bucket
  end
  response
end

#put_bucket_acl(bucket_name, acl) ⇒ Object



73
74
75
# File 'lib/fog/aws/requests/s3/put_bucket_acl.rb', line 73

def put_bucket_acl(bucket_name, acl)
  Fog::Mock.not_implemented
end

#put_bucket_logging(bucket_name, logging_status) ⇒ Object



80
81
82
# File 'lib/fog/aws/requests/s3/put_bucket_logging.rb', line 80

def put_bucket_logging(bucket_name, logging_status)
  Fog::Mock.not_implemented
end

#put_bucket_versioning(bucket_name, status) ⇒ Object



33
34
35
# File 'lib/fog/aws/requests/s3/put_bucket_versioning.rb', line 33

def put_bucket_versioning(bucket_name, status)
  Fog::Mock.not_implemented
end

#put_object(bucket_name, object_name, data, options = {}) ⇒ Object



44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
# File 'lib/fog/aws/requests/s3/put_object.rb', line 44

def put_object(bucket_name, object_name, data, options = {})
  data = parse_data(data)
  unless data[:body].is_a?(String)
    data[:body] = data[:body].read
  end
  response = Excon::Response.new
  if (bucket = @data[:buckets][bucket_name])
    response.status = 200
    bucket[:objects][object_name] = {
      :body           => data[:body],
      'ETag'          => Fog::AWS::Mock.etag,
      'Key'           => object_name,
      'LastModified'  => Time.now.utc.strftime("%a, %d %b %Y %H:%M:%S +0000"),
      'Size'          => data[:headers]['Content-Length'],
      'StorageClass'  => 'STANDARD'
    }
    bucket[:objects][object_name]['Content-Type'] = data[:headers]['Content-Type']
  else
    response.status = 404
    raise(Excon::Errors.status_error({:expects => 200}, response))
  end
  response
end

#put_object_url(bucket_name, object_name, expires) ⇒ Object



36
37
38
39
40
41
42
43
44
45
46
47
48
49
# File 'lib/fog/aws/requests/s3/put_object_url.rb', line 36

def put_object_url(bucket_name, object_name, expires)
  unless bucket_name
    raise ArgumentError.new('bucket_name is required')
  end
  unless object_name
    raise ArgumentError.new('object_name is required')
  end
  url({
    :headers  => {},
    :host     => "#{bucket_name}.#{@host}",
    :method   => 'PUT',
    :path     => CGI.escape(object_name)
  }, expires)
end

#put_request_payment(bucket_name, payer) ⇒ Object



32
33
34
35
36
37
38
39
40
41
42
# File 'lib/fog/aws/requests/s3/put_request_payment.rb', line 32

def put_request_payment(bucket_name, payer)
  response = Excon::Response.new
  if bucket = @data[:buckets][bucket_name]
    response.status = 200
    bucket['Payer'] = payer
  else
    response.status = 404
    raise(Excon::Errors.status_error({:expects => 200}, response))
  end
  response
end

#signature(params) ⇒ Object



96
97
98
# File 'lib/fog/aws/s3.rb', line 96

def signature(params)
  "foo"
end