aliyun-sdk 0.7.1 → 0.7.2

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
  SHA256:
3
- metadata.gz: aea256f156d30bf7e84ed0f6a2cd0670b63c02fe1fc6a6f9641e479dc2dfcbf5
4
- data.tar.gz: 1344db0e4aa351fc9065779ef80297857a57e48fdf5d41527dd5ce3cb62c17cb
3
+ metadata.gz: 5bc5cc4acd9d6e01955fd76f3b15e38d73a352f457c181bb9de469af4f30c4f3
4
+ data.tar.gz: 2ec82c787847ed16ac7172cec823756f8752700a8366048127487d3257a2af32
5
5
  SHA512:
6
- metadata.gz: 53387168b68b6b209f8a2c83e7704c0b0fa5bc02cb7dcd384c19bfe357eece672a5e9b2e566e2da261d1133d5a99280455e74eb71ef3aa09158659948b3fb2bf
7
- data.tar.gz: 93615f26a714a0daf08cfe18addd2fc25bc5e1d028ec53ab8302f6aeabd4e4b05dc59f254cc823faeba2d846f0b0b8e5a74736fc9348ee1ee6d88366b100cc84
6
+ metadata.gz: e4af5842f0231aa8d5fd3c301e70418f895a5b9e5a36e254a184a4715b70389119a78c931e823ca0df039fde1020b32e82d598becf867b6416b39ecdf904635b
7
+ data.tar.gz: 94edfce3d26df7ee399e62b56e48f22c055df2ab967affd22d40f4145e48f27bdc8ada7a16916464330287569a58eb0cbd17d8c5dbca73ce2fd31b081d96644c
@@ -1,5 +1,9 @@
1
1
  ## Change Log
2
2
 
3
+ ### v0.7.2 / 2020-06-05
4
+
5
+ - add env parameter to descide whether output log file
6
+
3
7
  ### v0.7.1 / 2019-11-16
4
8
 
5
9
  - add the validity check of bucket name
@@ -34,8 +34,13 @@ module Aliyun
34
34
 
35
35
  def self.logger
36
36
  unless @logger
37
+ @log_file = nil
38
+ # Environment parameter ALIYUN_OSS_SDK_LOG_PATH used to control whether output log to a file
39
+ if ENV['ALIYUN_OSS_SDK_LOG_PATH']
40
+ @log_file ||= DEFAULT_LOG_FILE
41
+ end
37
42
  @logger = Logger.new(
38
- @log_file ||= DEFAULT_LOG_FILE, MAX_NUM_LOG, ROTATE_SIZE)
43
+ @log_file, MAX_NUM_LOG, ROTATE_SIZE)
39
44
  @logger.level = Logger::INFO
40
45
  end
41
46
  @logger
@@ -2,6 +2,6 @@
2
2
 
3
3
  module Aliyun
4
4
 
5
- VERSION = "0.7.1"
5
+ VERSION = "0.7.2"
6
6
 
7
7
  end # Aliyun
@@ -89,7 +89,7 @@ module Aliyun
89
89
  if opts.enabled?
90
90
  xml.LoggingEnabled {
91
91
  xml.TargetBucket opts.target_bucket
92
- xml.TargetPrefix opts.target_prefix
92
+ xml.TargetPrefix opts.target_prefix if opts.target_prefix
93
93
  }
94
94
  end
95
95
  }
@@ -392,6 +392,19 @@ module Aliyun
392
392
  .with(:query => query, :body => mock_logging(logging_opts))
393
393
  end
394
394
 
395
+ it "should enable logging without target prefix" do
396
+ query = {'logging' => nil}
397
+ stub_request(:put, request_path).with(:query => query)
398
+
399
+ logging_opts = BucketLogging.new(
400
+ :enable => true,
401
+ :target_bucket => 'target-bucket')
402
+ @protocol.put_bucket_logging(@bucket, logging_opts)
403
+
404
+ expect(WebMock).to have_requested(:put, request_path)
405
+ .with(:query => query, :body => mock_logging(logging_opts))
406
+ end
407
+
395
408
  it "should disable logging" do
396
409
  query = {'logging' => nil}
397
410
  stub_request(:put, request_path).with(:query => query)
@@ -420,6 +433,23 @@ module Aliyun
420
433
  expect(logging.to_s).to eq(logging_opts.to_s)
421
434
  end
422
435
 
436
+ it "should get logging without target-bucket" do
437
+ query = {'logging' => nil}
438
+ logging_opts = BucketLogging.new(
439
+ :enable => false,
440
+ :target_bucket => nil, :target_prefix => nil)
441
+
442
+ stub_request(:get, request_path)
443
+ .with(:query => query)
444
+ .to_return(:body => mock_logging(logging_opts))
445
+
446
+ logging = @protocol.get_bucket_logging(@bucket)
447
+
448
+ expect(WebMock).to have_requested(:get, request_path)
449
+ .with(:query => query, :body => nil)
450
+ expect(logging.to_s).to eq(logging_opts.to_s)
451
+ end
452
+
423
453
  it "should delete logging" do
424
454
  query = {'logging' => nil}
425
455
  stub_request(:delete, request_path).with(:query => query)
@@ -430,6 +460,18 @@ module Aliyun
430
460
  .with(:query => query, :body => nil)
431
461
  end
432
462
 
463
+ it "should raise Exception when enable logging" do
464
+ query = {'logging' => nil}
465
+ stub_request(:put, request_path).with(:query => query)
466
+
467
+ logging_opts = BucketLogging.new(
468
+ :enable => true,
469
+ :target_bucket => nil, :target_prefix => nil)
470
+ expect {
471
+ @protocol.put_bucket_logging(@bucket, logging_opts)
472
+ }.to raise_error(ClientError)
473
+ end
474
+
433
475
  it "should update website" do
434
476
  query = {'website' => nil}
435
477
  stub_request(:put, request_path).with(:query => query)
@@ -442,6 +484,18 @@ module Aliyun
442
484
  .with(:query => query, :body => mock_website(website_opts))
443
485
  end
444
486
 
487
+ it "should update website with index only" do
488
+ query = {'website' => nil}
489
+ stub_request(:put, request_path).with(:query => query)
490
+
491
+ website_opts = BucketWebsite.new(
492
+ :enable => true, :index => 'index.html', :error => nil)
493
+ @protocol.put_bucket_website(@bucket, website_opts)
494
+
495
+ expect(WebMock).to have_requested(:put, request_path)
496
+ .with(:query => query, :body => mock_website(website_opts))
497
+ end
498
+
445
499
  it "should get website" do
446
500
  query = {'website' => nil}
447
501
  website_opts = BucketWebsite.new(
@@ -468,6 +522,18 @@ module Aliyun
468
522
  .with(:query => query, :body => nil)
469
523
  end
470
524
 
525
+ it "should raise Exception when update website" do
526
+ query = {'website' => nil}
527
+ stub_request(:put, request_path).with(:query => query)
528
+
529
+ website_opts = BucketWebsite.new(
530
+ :enable => true, :index => nil)
531
+
532
+ expect {
533
+ @protocol.put_bucket_website(@bucket, website_opts)
534
+ }.to raise_error(ClientError)
535
+ end
536
+
471
537
  it "should update referer" do
472
538
  query = {'referer' => nil}
473
539
  stub_request(:put, request_path).with(:query => query)
@@ -541,6 +607,44 @@ module Aliyun
541
607
  .with(:query => query, :body => nil)
542
608
  end
543
609
 
610
+ it "should raise Exception when update lifecycle " do
611
+ query = {'lifecycle' => nil}
612
+ stub_request(:put, request_path).with(:query => query)
613
+
614
+ rules = (1..5).map do |i|
615
+ LifeCycleRule.new(
616
+ :id => i, :enable => i % 2 == 0, :prefix => "foo#{i}",
617
+ :expiry => 'invalid')
618
+ end
619
+
620
+ expect {
621
+ @protocol.put_bucket_lifecycle(@bucket, rules)
622
+ }.to raise_error(ClientError)
623
+ end
624
+
625
+ it "should raise Exception when get lifecycle " do
626
+ query = {'lifecycle' => nil}
627
+ body = '<LifecycleConfiguration>
628
+ <Rule>
629
+ <ID>delete after one day</ID>
630
+ <Prefix>logs/</Prefix>
631
+ <Status>Enabled</Status>
632
+ <Expiration>
633
+ <Days>1</Days>
634
+ <Date>2017-01-01T00:00:00.000Z</Date>
635
+ </Expiration>
636
+ </Rule>
637
+ </LifecycleConfiguration>'
638
+
639
+ stub_request(:get, request_path)
640
+ .with(:query => query)
641
+ .to_return(:body => body)
642
+
643
+ expect {
644
+ rules = @protocol.get_bucket_lifecycle(@bucket)
645
+ }.to raise_error(ClientError)
646
+ end
647
+
544
648
  it "should set cors" do
545
649
  query = {'cors' => nil}
546
650
  stub_request(:put, request_path).with(:query => query)
@@ -558,6 +662,24 @@ module Aliyun
558
662
  .with(:query => query, :body => mock_cors(rules))
559
663
  end
560
664
 
665
+ it "should set cors with MaxAgeSeconds " do
666
+ query = {'cors' => nil}
667
+ stub_request(:put, request_path).with(:query => query)
668
+
669
+ rules = (1..5).map do |i|
670
+ CORSRule.new(
671
+ :allowed_origins => (1..3).map {|x| "origin-#{x}"},
672
+ :allowed_methods => ['PUT', 'GET'],
673
+ :allowed_headers => (1..3).map {|x| "header-#{x}"},
674
+ :expose_headers => (1..3).map {|x| "header-#{x}"},
675
+ :max_age_seconds => 5)
676
+ end
677
+ @protocol.set_bucket_cors(@bucket, rules)
678
+
679
+ expect(WebMock).to have_requested(:put, request_path)
680
+ .with(:query => query, :body => mock_cors(rules))
681
+ end
682
+
561
683
  it "should get cors" do
562
684
  query = {'cors' => nil}
563
685
  return_rules = (1..5).map do |i|
@@ -156,6 +156,226 @@ module Aliyun
156
156
  .with(:query => query, :body => nil)
157
157
  end
158
158
 
159
+ it "should set logging setting" do
160
+ query = {'logging' => nil}
161
+
162
+ body = Nokogiri::XML::Builder.new do |xml|
163
+ xml.BucketLoggingStatus {
164
+ xml.LoggingEnabled {
165
+ xml.TargetBucket 'target-bucket'
166
+ }
167
+ }
168
+ end.to_xml
169
+
170
+ stub_request(:put, bucket_url).with(:query => query)
171
+
172
+ @bucket.logging = BucketLogging.new(:enable => true, :target_bucket => 'target-bucket')
173
+
174
+ expect(WebMock).to have_requested(:put, bucket_url)
175
+ .with(:query => query, :body => body)
176
+ end
177
+
178
+ it "should get logging setting" do
179
+ query = {'logging' => nil}
180
+
181
+ retbody = Nokogiri::XML::Builder.new do |xml|
182
+ xml.BucketLoggingStatus {
183
+ xml.LoggingEnabled {
184
+ xml.TargetBucket 'target-bucket'
185
+ xml.TargetPrefix 'target-prefix'
186
+ }
187
+ }
188
+ end.to_xml
189
+
190
+ stub_request(:get, bucket_url)
191
+ .with(:query => query)
192
+ .to_return(status: 200, :body => retbody)
193
+
194
+ logging = @bucket.logging
195
+
196
+ expect(WebMock).to have_requested(:get, bucket_url)
197
+ .with(:query => query, :body => nil)
198
+ expect(logging.enable).to eq(true)
199
+ expect(logging.target_bucket).to eq('target-bucket')
200
+
201
+ end
202
+
203
+ it "should set webseit" do
204
+ query = {'website' => nil}
205
+
206
+ body = Nokogiri::XML::Builder.new do |xml|
207
+ xml.WebsiteConfiguration {
208
+ xml.IndexDocument {
209
+ xml.Suffix 'index.html'
210
+ }
211
+ }
212
+ end.to_xml
213
+
214
+ stub_request(:put, bucket_url)
215
+ .with(:query => query)
216
+ .to_return(status: 200, :body => nil)
217
+
218
+ @bucket.website = BucketWebsite.new(:enable => true, :index => 'index.html')
219
+
220
+ expect(WebMock).to have_requested(:put, bucket_url)
221
+ .with(:query => query, :body => body)
222
+ end
223
+
224
+ it "should delete webseit" do
225
+ query = {'website' => nil}
226
+
227
+ stub_request(:delete, bucket_url)
228
+ .with(:query => query)
229
+ .to_return(status: 204, :body => nil)
230
+
231
+ @bucket.website = BucketWebsite.new(:enable => false)
232
+
233
+ expect(WebMock).to have_requested(:delete, bucket_url)
234
+ .with(:query => query, :body => nil)
235
+ end
236
+
237
+ it "should get webseit" do
238
+ query = {'website' => nil}
239
+
240
+ body = Nokogiri::XML::Builder.new do |xml|
241
+ xml.WebsiteConfiguration {
242
+ xml.IndexDocument {
243
+ xml.Suffix 'index.html'
244
+ }
245
+ xml.ErrorDocument {
246
+ xml.Key 'error.html'
247
+ }
248
+ }
249
+ end.to_xml
250
+
251
+ stub_request(:get, bucket_url)
252
+ .with(:query => query)
253
+ .to_return(status: 200, :body => body)
254
+
255
+ website = @bucket.website
256
+
257
+ expect(WebMock).to have_requested(:get, bucket_url)
258
+ .with(:query => query, :body => nil)
259
+
260
+ expect(website.enable).to eq(true)
261
+ expect(website.index).to eq('index.html')
262
+ expect(website.error).to eq('error.html')
263
+ end
264
+
265
+ it "should set referer" do
266
+ query = {'referer' => nil}
267
+
268
+ body = Nokogiri::XML::Builder.new do |xml|
269
+ xml.RefererConfiguration {
270
+ xml.AllowEmptyReferer 'true'
271
+ xml.RefererList {
272
+ xml.Referer 'http://www.aliyun.com'
273
+ }
274
+ }
275
+ end.to_xml
276
+
277
+ stub_request(:put, bucket_url)
278
+ .with(:query => query)
279
+ .to_return(status: 200, :body => nil)
280
+
281
+ @bucket.referer = BucketReferer.new(:allow_empty => true, :whitelist => ['http://www.aliyun.com'])
282
+
283
+ expect(WebMock).to have_requested(:put, bucket_url)
284
+ .with(:query => query, :body => body)
285
+ end
286
+
287
+ it "should get referer" do
288
+ query = {'referer' => nil}
289
+
290
+ body = Nokogiri::XML::Builder.new do |xml|
291
+ xml.RefererConfiguration {
292
+ xml.AllowEmptyReferer 'true'
293
+ xml.RefererList {
294
+ xml.Referer 'http://www.aliyun.com'
295
+ }
296
+ }
297
+ end.to_xml
298
+
299
+ stub_request(:get, bucket_url)
300
+ .with(:query => query)
301
+ .to_return(status: 200, :body => body)
302
+
303
+ referer = @bucket.referer
304
+
305
+ expect(WebMock).to have_requested(:get, bucket_url)
306
+ .with(:query => query, :body => nil)
307
+
308
+ expect(referer.allow_empty).to eq(true)
309
+ expect(referer.whitelist).to eq(['http://www.aliyun.com'])
310
+ end
311
+
312
+ it "should set cors" do
313
+ query = {'cors' => nil}
314
+
315
+ body = Nokogiri::XML::Builder.new do |xml|
316
+ xml.CORSConfiguration {
317
+ xml.CORSRule {
318
+ xml.AllowedOrigin '*'
319
+ xml.AllowedMethod 'PUT'
320
+ xml.AllowedHeader 'Authorization'
321
+ }
322
+ }
323
+ end.to_xml
324
+
325
+ stub_request(:put, bucket_url)
326
+ .with(:query => query)
327
+ .to_return(status: 200, :body => nil)
328
+
329
+ rules = [
330
+ CORSRule.new(
331
+ :allowed_origins => ['*'],
332
+ :allowed_methods => ['PUT'],
333
+ :allowed_headers => ['Authorization'],
334
+ :expose_headers =>[])
335
+ ]
336
+
337
+ @bucket.cors = rules
338
+
339
+ expect(WebMock).to have_requested(:put, bucket_url)
340
+ .with(:query => query, :body => body)
341
+ end
342
+
343
+ it "should delete cors" do
344
+ query = {'cors' => nil}
345
+
346
+ stub_request(:delete, bucket_url)
347
+ .with(:query => query)
348
+ .to_return(status: 204, :body => nil)
349
+
350
+ @bucket.cors = []
351
+
352
+ expect(WebMock).to have_requested(:delete, bucket_url)
353
+ .with(:query => query, :body => nil)
354
+ end
355
+
356
+ it "should get cors" do
357
+ query = {'cors' => nil}
358
+
359
+ body = Nokogiri::XML::Builder.new do |xml|
360
+ xml.CORSConfiguration {
361
+ xml.CORSRule {
362
+ xml.AllowedOrigin '*'
363
+ xml.AllowedMethod 'PUT'
364
+ xml.AllowedHeader 'Authorization'
365
+ }
366
+ }
367
+ end.to_xml
368
+
369
+ stub_request(:get, bucket_url)
370
+ .with(:query => query)
371
+ .to_return(status: 200, :body => body)
372
+
373
+ cors = @bucket.cors
374
+
375
+ expect(WebMock).to have_requested(:get, bucket_url)
376
+ .with(:query => query, :body => nil)
377
+ end
378
+
159
379
  it "should get bucket url" do
160
380
  expect(@bucket.bucket_url)
161
381
  .to eq('http://rubysdk-bucket.oss-cn-hangzhou.aliyuncs.com/')
@@ -611,6 +611,15 @@ module Aliyun
611
611
  })
612
612
  end
613
613
 
614
+ it "should raise Exception on error when setting invalid range" do
615
+ object_name = 'ruby'
616
+ url = get_request_path(object_name)
617
+ stub_request(:get, url)
618
+ expect {
619
+ @protocol.get_object(@bucket, object_name, {:range => [0, 10, 5]}) {}
620
+ }.to raise_error(ClientError)
621
+ end
622
+
614
623
  it "should match modify time and etag" do
615
624
  object_name = 'ruby'
616
625
  url = get_request_path(object_name)
@@ -662,6 +671,22 @@ module Aliyun
662
671
  .with(:body => nil, :query => query)
663
672
  end
664
673
 
674
+ it "should get object with headers" do
675
+ object_name = 'ruby'
676
+ url = get_request_path(object_name)
677
+ headers = {
678
+ 'Range' => 'bytes=0-9'
679
+ }
680
+ stub_request(:get, url)
681
+
682
+ @protocol.get_object(@bucket, object_name, {:headers => headers}) {}
683
+
684
+ expect(WebMock).to have_requested(:get, url)
685
+ .with(:body => nil, :query => {},
686
+ :headers => {
687
+ 'Range' => 'bytes=0-9'
688
+ })
689
+ end
665
690
 
666
691
  it "should raise crc exception on error" do
667
692
  object_name = 'ruby'
@@ -821,7 +846,7 @@ module Aliyun
821
846
 
822
847
  it "should batch delete objects" do
823
848
  url = get_request_path
824
- query = {'delete' => nil, 'encoding-type' => KeyEncoding::URL}
849
+ query = {'delete' => nil}
825
850
 
826
851
  object_names = (1..5).map do |i|
827
852
  "object-#{i}"
@@ -831,7 +856,7 @@ module Aliyun
831
856
  .with(:query => query)
832
857
  .to_return(:body => mock_delete_result(object_names))
833
858
 
834
- opts = {:quiet => false, :encoding => KeyEncoding::URL}
859
+ opts = {:quiet => false}
835
860
  deleted = @protocol.batch_delete_objects(@bucket, object_names, opts)
836
861
 
837
862
  expect(WebMock).to have_requested(:post, url)
@@ -861,6 +886,57 @@ module Aliyun
861
886
  .with(:query => query, :body => mock_delete(object_names, opts))
862
887
  expect(deleted).to match_array(object_names)
863
888
  end
889
+
890
+ it "should batch delete objects in quiet mode" do
891
+ url = get_request_path
892
+ query = {'delete' => nil}
893
+
894
+ object_names = (1..5).map do |i|
895
+ "object-#{i}"
896
+ end
897
+
898
+ stub_request(:post, url)
899
+ .with(:query => query)
900
+ .to_return(:body => "")
901
+
902
+ opts = {:quiet => true}
903
+ deleted = @protocol.batch_delete_objects(@bucket, object_names, opts)
904
+
905
+ expect(WebMock).to have_requested(:post, url)
906
+ .with(:query => query, :body => mock_delete(object_names, opts))
907
+ expect(deleted).to match_array([])
908
+ end
909
+
910
+ it "should rasie Exception wiht invalid responsed body" do
911
+ url = get_request_path
912
+ query = {'delete' => nil}
913
+ body = '<DeleteResult>
914
+ <EncodingType>invaid<EncodingType>
915
+ <Deleted>
916
+ <Key>multipart.data</Key>
917
+ </Deleted>
918
+ <Deleted>
919
+ <Key>test.jpg</Key>
920
+ </Deleted>
921
+ <Deleted>
922
+ <Key>demo.jpg</Key>
923
+ </Deleted>
924
+ </DeleteResult>'
925
+
926
+ object_names = (1..5).map do |i|
927
+ "object-#{i}"
928
+ end
929
+
930
+ stub_request(:post, url)
931
+ .with(:query => query)
932
+ .to_return(:body => body)
933
+
934
+ opts = {:quiet => false}
935
+ expect {
936
+ deleted = @protocol.batch_delete_objects(@bucket, object_names, opts)
937
+ }.to raise_error(ClientError)
938
+
939
+ end
864
940
  end # delete object
865
941
 
866
942
  context "acl" do
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: aliyun-sdk
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.7.1
4
+ version: 0.7.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Tianlong Wu
8
8
  autorequire:
9
9
  bindir: lib/aliyun
10
10
  cert_chain: []
11
- date: 2019-11-16 00:00:00.000000000 Z
11
+ date: 2020-06-05 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: nokogiri