plntr-fakes3 1.0.0.pre.9test9 → 1.0.0.pre.10

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: 0d7d7534e1cb3a29382c746a57c385dcf4c2562398fc9f48ed3080ad1edcf09b
4
- data.tar.gz: a1a7eed1674f3b1bc8723ec12d03cc3571f92f0f878c8ab33255aa6bbedd6355
3
+ metadata.gz: 6172bc1c1a9d1f643197e35dbfeb6e8b943a27a2c6e18cf6c53d1b48f6b7428d
4
+ data.tar.gz: cc4c2ee5640e9f2b4e0f1af47b6b46a7cddb441dd562e6a4c8f7ec2e8dfcedb8
5
5
  SHA512:
6
- metadata.gz: f40ab027de1f168e10219a4abe8d0b7b2318236f4ea3374f96e85f69edc89ca9d002d6ff9c24caa156220ea8b509c91d59d729398ebeb2115908a9762e3c7b5e
7
- data.tar.gz: eb3f2a7b1ec661e48d00002a9a39b724833a0b589af75474676d6b3267c511d11126dc7c2ac2e3ad4a470d9f9703980ac7245a99c33d99582ea0183424707c12
6
+ metadata.gz: ac49b2d42151ee6105daf77b6e45d8a7113bce6bdb13f598411da3262bae7204d1ab950c89dedc0a16056781b6291ce4e08b86211ce4b8f8c42a6392ef0a4070
7
+ data.tar.gz: 51f4d295844bdb3a8ad81f4a0c7b1042bdc3746711ab0329fa54c7f7b83893de0adfa434220307b37cfef6bceb5bd057a1dff8e738282171a4e05988b95b4574
data/Makefile CHANGED
@@ -1,4 +1,35 @@
1
- .PHONY: test
1
+ .PHONY: build-run-docker test
2
+
3
+ build-run-docker:
4
+ gem build ./fakes3.gemspec | tee gem-build.txt
5
+ gem push $$(grep '^ File: ' gem-build.txt | sed 's@^ File: @@')
6
+ echo "Waiting for gem to appear in the repo" && \
7
+ v=$$(grep '^ File: ' gem-build.txt | sed -e 's@^ File: plntr-fakes3-@@' -e 's@\.gem$$@@') && \
8
+ until gem list plntr-fakes3 -r --prerelease | grep -q -w $${v}; do \
9
+ echo -n '.'; \
10
+ sleep 3; \
11
+ done && \
12
+ echo
13
+ v=$$(grep '^ File: ' gem-build.txt | sed -e 's@^ File: plntr-fakes3-@@' -e 's@\.gem$$@@') && \
14
+ sed -i "s/^PLNTR_FAKES3_VERSION=.*/PLNTR_FAKES3_VERSION=$${v}/" \
15
+ ~/dev/docker-image-fakes3/Makefile
16
+ make -C ~/dev/docker-image-fakes3/ || make -C ~/dev/docker-image-fakes3/
17
+ docker rm -f fakes3 || true
18
+ docker run -ti --rm \
19
+ --name fakes3 \
20
+ -e HOSTNAME=b2d \
21
+ -p 4567:4567 \
22
+ -v /tmp/s3:/s3 \
23
+ planitar/fakes3
24
+
25
+ run-docker:
26
+ make -C ~/dev/docker-image-fakes3/
27
+ docker rm -f fakes3 || true
28
+ docker run -ti --rm \
29
+ -e HOSTNAME=b2d \
30
+ -p 4567:4567 \
31
+ -v /tmp/s3:/s3 \
32
+ planitar/fakes3
2
33
 
3
34
  build-test-container:
4
35
  docker build -t fake-s3 .
@@ -79,13 +79,8 @@ module FakeS3
79
79
 
80
80
  def get_object(bucket, object_name, request)
81
81
  begin
82
- warn "get_object:"
83
- warn ". root: '#{@root}'"
84
- warn ". bucket: '#{bucket}'"
85
- warn ". path: '#{object_name}'"
86
82
  real_obj = S3Object.new
87
83
  obj_root = File.join(@root,bucket,object_name,FAKE_S3_METADATA_DIR)
88
- warn ". metadata: '#{File.join(obj_root, "metadata")}'"
89
84
  metadata = File.open(File.join(obj_root, "metadata")) { |file| YAML::load(file) }
90
85
  real_obj.name = object_name
91
86
  real_obj.md5 = metadata[:md5]
@@ -111,17 +106,8 @@ module FakeS3
111
106
 
112
107
  def copy_object(src_bucket_name, src_name, dst_bucket_name, dst_name, request)
113
108
  begin
114
- warn "copy_object:"
115
- warn ". root: '#{@root}'"
116
- warn ". dst bucket: '#{dst_bucket_name}'"
117
- warn ". dst path: '#{dst_name}'"
118
- warn ". src bucket: '#{src_bucket_name}'"
119
- warn ". src path: '#{src_name}'"
120
109
  src_root = File.join(@root,src_bucket_name,src_name,FAKE_S3_METADATA_DIR)
121
110
  src_metadata_filename = File.join(src_root, "metadata")
122
- warn ". src metadata: '#{src_metadata_filename}'"
123
- warn ""
124
- # src_metadata = YAML.load(File.open(src_metadata_filename, 'rb').read)
125
111
  src_metadata = File.open(src_metadata_filename) { |file| YAML::load(file) }
126
112
  src_content_filename = File.join(src_root, "content")
127
113
 
@@ -266,7 +252,7 @@ module FakeS3
266
252
  object
267
253
  end
268
254
 
269
- def delete_object(bucket,object_name,request)
255
+ def delete_object(bucket,object_name)
270
256
  begin
271
257
  filename = File.join(@root,bucket.name,object_name)
272
258
  FileUtils.rm_rf(filename)
data/lib/fakes3/server.rb CHANGED
@@ -25,6 +25,7 @@ module FakeS3
25
25
  SET_ACL = "SET_ACL"
26
26
  MOVE = "MOVE"
27
27
  DELETE_OBJECT = "DELETE_OBJECT"
28
+ DELETE_OBJECTS = "DELETE_OBJECTS"
28
29
  DELETE_BUCKET = "DELETE_BUCKET"
29
30
 
30
31
  attr_accessor :bucket, :object, :type, :src_bucket,
@@ -62,8 +63,6 @@ module FakeS3
62
63
  end
63
64
 
64
65
  def do_GET(request, response)
65
- warn "= do_GET"
66
- dump_request request
67
66
  s_req = normalize_request(request)
68
67
 
69
68
  case s_req.type
@@ -173,8 +172,6 @@ module FakeS3
173
172
  end
174
173
 
175
174
  def do_PUT(request, response)
176
- warn "= do_PUT"
177
- dump_request request
178
175
  s_req = normalize_request(request)
179
176
  query = CGI::parse(request.request_uri.query || "")
180
177
 
@@ -249,6 +246,10 @@ module FakeS3
249
246
  end
250
247
 
251
248
  def do_POST(request,response)
249
+ if request.request_line =~ /\?delete\b/
250
+ return do_DELETE(request, response)
251
+ end
252
+
252
253
  s_req = normalize_request(request)
253
254
  key = request.query['key']
254
255
  query = CGI::parse(request.request_uri.query || "")
@@ -325,13 +326,32 @@ module FakeS3
325
326
  case s_req.type
326
327
  when Request::DELETE_OBJECT
327
328
  bucket_obj = @store.get_bucket(s_req.bucket)
328
- @store.delete_object(bucket_obj,s_req.object,s_req.webrick_request)
329
+ @store.delete_object(bucket_obj,s_req.object)
330
+ response.status = 204
331
+ response.body = ""
329
332
  when Request::DELETE_BUCKET
330
333
  @store.delete_bucket(s_req.bucket)
334
+ response.status = 204
335
+ response.body = ""
336
+ when Request::DELETE_OBJECTS
337
+ objects = parse_delete_objects s_req.webrick_request
338
+ bucket_obj = @store.get_bucket(s_req.bucket)
339
+ results = objects.collect do |obj|
340
+ if not obj[:version_id].nil?
341
+ {
342
+ key: obj[:key],
343
+ code: 'XXX_Unimplmented_XXX',
344
+ message: 'Deletion of object verions is not implemented',
345
+ }
346
+ else
347
+ @store.delete_object(bucket_obj, obj[:key])
348
+ { key: obj[:key] }
349
+ end
350
+ end
351
+ response.status = 200
352
+ response.body = XmlAdapter.delete_objects_result(results)
331
353
  end
332
354
 
333
- response.status = 204
334
- response.body = ""
335
355
  end
336
356
 
337
357
  def do_OPTIONS(request, response)
@@ -476,6 +496,10 @@ module FakeS3
476
496
  else
477
497
  s_req.object = path[1..-1]
478
498
  end
499
+
500
+ if webrick_req.request_line =~ /\?delete\b/
501
+ s_req.type = Request::DELETE_OBJECTS
502
+ end
479
503
  end
480
504
 
481
505
  # This method takes a webrick request and generates a normalized FakeS3 request
@@ -486,13 +510,10 @@ module FakeS3
486
510
  s_req = Request.new
487
511
  s_req.path = webrick_req.path
488
512
  s_req.is_path_style = true
489
- warn "normalize_request: host='#{host}' path='#{s_req.path}' is_path_style=T"
490
513
 
491
- warn " : root-hostnames='#{@root_hostnames}'"
492
514
  if !@root_hostnames.include?(host) && !(IPAddr.new(host) rescue nil)
493
515
  s_req.bucket = host.split(".")[0]
494
516
  s_req.is_path_style = false
495
- warn " : bucket='#{s_req.bucket}' is_path_style=F"
496
517
  end
497
518
 
498
519
  s_req.http_verb = webrick_req.request_method
@@ -530,14 +551,29 @@ module FakeS3
530
551
  end
531
552
  end
532
553
 
554
+ def parse_delete_objects(request)
555
+ objects_xml = ""
556
+ request.body { |chunk| objects_xml << chunk }
557
+
558
+ # TODO: improve parsing xml
559
+ objects_xml = objects_xml.scan(/<Object>.*?<\/Object>/)
560
+
561
+ objects_xml.collect do |obj|
562
+ {
563
+ key: obj[/<Key>(.+)<\/Key>/, 1],
564
+ version_id: obj[/<VersionId>(.+)<\/VersionId>/, 1]
565
+ }
566
+ end
567
+ end
568
+
533
569
  def dump_request(request)
534
- warn "----------Dump Request-------------"
535
- warn request.request_method
536
- warn request.path
570
+ puts "----------Dump Request-------------"
571
+ puts request.request_method
572
+ puts request.path
537
573
  request.each do |k,v|
538
- warn "#{k}:#{v}"
574
+ puts "#{k}:#{v}"
539
575
  end
540
- warn "----------End Dump -------------"
576
+ puts "----------End Dump -------------"
541
577
  end
542
578
  end
543
579
 
@@ -1,3 +1,3 @@
1
1
  module FakeS3
2
- VERSION = "1.0.0-9test9"
2
+ VERSION = "1.0.0-10"
3
3
  end
@@ -218,5 +218,37 @@ module FakeS3
218
218
  }
219
219
  output
220
220
  end
221
+
222
+ # <DeleteResult xmlns="http://s3.amazonaws.com/doc/2006-03-01/">
223
+ # <Deleted>
224
+ # <Key>sample1.txt</Key>
225
+ # </Deleted>
226
+ # <Error>
227
+ # <Key>sample2.txt</Key>
228
+ # <Code>AccessDenied</Code>
229
+ # <Message>Access Denied</Message>
230
+ # </Error>
231
+ # </DeleteResult>
232
+ def self.delete_objects_result(result_objects)
233
+ output = ""
234
+ xml = Builder::XmlMarkup.new(:target => output)
235
+ xml.instruct! :xml, :version=>"1.0", :encoding=>"UTF-8"
236
+ xml.DeleteResult(:xmlns => "http://s3.amazonaws.com/doc/2006-03-01/") { |result|
237
+ result_objects.each do |res|
238
+ if not res[:code].nil?
239
+ result.Error { |error|
240
+ error.Key(res[:key])
241
+ error.Code(res[:code])
242
+ error.Message(res[:message])
243
+ }
244
+ else
245
+ result.Deleted { |deleted|
246
+ deleted.Key(res[:key])
247
+ }
248
+ end
249
+ end
250
+ }
251
+ output
252
+ end
221
253
  end
222
254
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: plntr-fakes3
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.0.pre.9test9
4
+ version: 1.0.0.pre.10
5
5
  platform: ruby
6
6
  authors:
7
7
  - Curtis Spencer
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2020-01-22 00:00:00.000000000 Z
11
+ date: 2020-01-30 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler