fakes3 0.1.7 → 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
  SHA1:
3
- metadata.gz: c929e6ff3d8522ac143785588c7fdc480d70ddde
4
- data.tar.gz: 1c746e1eb8f08619a2a43cd8fddd8b3ce5287151
3
+ metadata.gz: e4b5a4bfc64bf07bbf5ebaf3038c4ddf95c7a3e4
4
+ data.tar.gz: 86835f87289156cbbf1ef050d9892d020adbe281
5
5
  SHA512:
6
- metadata.gz: 1a6199d155b318c48d28532aab032197bc5bb25cf73f4902dcb62c55898f75c5e8187c62da57cef0e4820d849558aa77b4b2ca6c21f9d65f3a566662f9af22c1
7
- data.tar.gz: 3975513dbc9051c4fe1207261ff44efafef820d3c19e7e7fceaa7042e035a6da8bcdac83a7c87f90bb0194e95492e1a14c4647b4a39551512e923dba95440aa7
6
+ metadata.gz: 76f712e660a295b7b1b7435ccf7890a8eb87eefdcbdfa7847d512077792206e6463d63b93786ffb60bbb250e7ebc2885817db2acf85577937dfcff8e9ec004ab
7
+ data.tar.gz: 691fecdbc4e377f2f23a4e19256db8a018e6357beff5ceb3d0b77915da3f529f25862bbb4177d6de4165c7f4aec2c411396ded814ce5d2a9f817435ff9b0b14f
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- fakes3 (0.1.7)
4
+ fakes3 (0.2.0)
5
5
  builder
6
6
  thor
7
7
 
data/lib/fakes3/bucket.rb CHANGED
@@ -57,6 +57,7 @@ module FakeS3
57
57
  bq.delimiter = delimiter
58
58
  bq.matches = match_set.matches
59
59
  bq.is_truncated = match_set.is_truncated
60
+ bq.common_prefixes = match_set.common_prefixes
60
61
  return bq
61
62
  end
62
63
 
@@ -1,7 +1,7 @@
1
1
  module FakeS3
2
2
  class BucketQuery
3
3
  attr_accessor :prefix,:matches,:marker,:max_keys,
4
- :delimiter,:bucket,:is_truncated
4
+ :delimiter,:bucket,:is_truncated,:common_prefixes
5
5
 
6
6
  # Syntactic sugar
7
7
  def is_truncated?
data/lib/fakes3/server.rb CHANGED
@@ -50,6 +50,13 @@ module FakeS3
50
50
  @root_hostnames = [hostname,'localhost','s3.amazonaws.com','s3.localhost']
51
51
  end
52
52
 
53
+ def validate_request(request)
54
+ req = request.webrick_request
55
+ return if req.nil?
56
+ return if not req.header.has_key?('expect')
57
+ req.continue if req.header['expect'].first=='100-continue'
58
+ end
59
+
53
60
  def do_GET(request, response)
54
61
  s_req = normalize_request(request)
55
62
 
@@ -379,6 +386,8 @@ module FakeS3
379
386
  raise "Unknown Request"
380
387
  end
381
388
 
389
+ validate_request(s_req)
390
+
382
391
  return s_req
383
392
  end
384
393
 
@@ -1,10 +1,11 @@
1
1
  require 'set'
2
2
  module FakeS3
3
3
  class S3MatchSet
4
- attr_accessor :matches,:is_truncated
4
+ attr_accessor :matches,:is_truncated,:common_prefixes
5
5
  def initialize
6
6
  @matches = []
7
7
  @is_truncated = false
8
+ @common_prefixes = []
8
9
  end
9
10
  end
10
11
 
@@ -73,9 +74,45 @@ module FakeS3
73
74
  end
74
75
  end
75
76
 
77
+ if delimiter
78
+ if prefix
79
+ base_prefix = prefix
80
+ else
81
+ base_prefix = ""
82
+ end
83
+ prefix_offset = base_prefix.length
84
+ end
85
+
76
86
  count = 0
87
+ last_chunk = nil
77
88
  @sorted_set.each do |s3_object|
78
89
  if marker_found && (!prefix or s3_object.name.index(prefix) == 0)
90
+ if delimiter
91
+ name = s3_object.name
92
+ remainder = name.slice(prefix_offset, name.length)
93
+ chunks = remainder.split(delimiter, 2)
94
+ if chunks.length > 1
95
+ if (last_chunk != chunks[0])
96
+ # "All of the keys rolled up in a common prefix count as
97
+ # a single return when calculating the number of
98
+ # returns. See MaxKeys."
99
+ # (http://awsdocs.s3.amazonaws.com/S3/latest/s3-api.pdf)
100
+ count += 1
101
+ if count <= max_keys
102
+ ms.common_prefixes << base_prefix + chunks[0] + delimiter
103
+ last_chunk = chunks[0]
104
+ else
105
+ is_truncated = true
106
+ break
107
+ end
108
+ end
109
+
110
+ # Continue to the next key, since this one has a
111
+ # delimiter.
112
+ next
113
+ end
114
+ end
115
+
79
116
  count += 1
80
117
  if count <= max_keys
81
118
  ms.matches << s3_object
@@ -1,3 +1,3 @@
1
1
  module FakeS3
2
- VERSION = "0.1.7"
2
+ VERSION = "0.2.0"
3
3
  end
@@ -137,6 +137,14 @@ module FakeS3
137
137
  end
138
138
  end
139
139
 
140
+ def self.append_common_prefixes_to_list_bucket_result(lbr, prefixes)
141
+ return if prefixes.nil? or prefixes.size == 0
142
+
143
+ prefixes.each do |common_prefix|
144
+ lbr.CommonPrefixes { |contents| contents.Prefix(common_prefix) }
145
+ end
146
+ end
147
+
140
148
  def self.bucket_query(bucket_query)
141
149
  output = ""
142
150
  bucket = bucket_query.bucket
@@ -149,6 +157,7 @@ module FakeS3
149
157
  lbr.MaxKeys(bucket_query.max_keys)
150
158
  lbr.IsTruncated(bucket_query.is_truncated?)
151
159
  append_objects_to_list_bucket_result(lbr,bucket_query.matches)
160
+ append_common_prefixes_to_list_bucket_result(lbr, bucket_query.common_prefixes)
152
161
  }
153
162
  output
154
163
  end
@@ -189,6 +198,6 @@ module FakeS3
189
198
  result.ETag("\"#{object.md5}\"")
190
199
  }
191
200
  output
192
- end
201
+ end
193
202
  end
194
203
  end
@@ -55,6 +55,38 @@ class RightAWSCommandsTest < Test::Unit::TestCase
55
55
  assert_equal buf_len,output.size
56
56
  end
57
57
 
58
+ # Test that GET requests with a delimiter return a list of
59
+ def test_list_by_delimiter
60
+ @s3.create_bucket("s3media")
61
+
62
+ @s3.put("s3media", "delimited/item", "item")
63
+
64
+ expected_prefixes = []
65
+ (1..50).each do |i|
66
+ key_prefix = "delimited/%02d/" % i
67
+ @s3.put("s3media", key_prefix + "foo", "foo")
68
+ @s3.put("s3media", key_prefix + "fie", "fie")
69
+ expected_prefixes << key_prefix
70
+ end
71
+
72
+ key_names = []
73
+ common_prefixes = []
74
+ @s3.incrementally_list_bucket("s3media", {:prefix => "delimited", :delimiter => '/'}) do |currentResponse|
75
+ common_prefixes += currentResponse[:common_prefixes]
76
+ end
77
+ assert_equal ["delimited/"], common_prefixes
78
+
79
+ common_prefixes = []
80
+ @s3.incrementally_list_bucket("s3media", {:prefix => "delimited/", :delimiter => '/', "max-keys" => 5}) do |currentResponse|
81
+ key_names += currentResponse[:contents].map do |key|
82
+ key[:key]
83
+ end
84
+ common_prefixes += currentResponse[:common_prefixes]
85
+ end
86
+ assert_equal expected_prefixes, common_prefixes
87
+ assert_equal ["delimited/item"], key_names
88
+ end
89
+
58
90
  def test_multi_directory
59
91
  @s3.put("s3media","dir/right/123.txt","recursive")
60
92
  output = ""
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: fakes3
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.7
4
+ version: 0.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Curtis Spencer
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2015-02-04 00:00:00.000000000 Z
11
+ date: 2015-03-05 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler