fakes3 0.1.7 → 0.2.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
  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