s33r 0.3.1 → 0.4

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.
Files changed (120) hide show
  1. data/examples/cli/acl_x.rb +41 -0
  2. data/examples/cli/logging_x.rb +20 -0
  3. data/{bin → examples/cli}/s3cli.rb +13 -20
  4. data/examples/fores33r/README +183 -0
  5. data/examples/fores33r/Rakefile +10 -0
  6. data/examples/fores33r/app/controllers/application.rb +4 -0
  7. data/examples/fores33r/app/controllers/browser_controller.rb +68 -0
  8. data/examples/fores33r/app/helpers/application_helper.rb +8 -0
  9. data/examples/fores33r/app/views/browser/index.rhtml +14 -0
  10. data/examples/fores33r/app/views/browser/show_bucket.rhtml +14 -0
  11. data/examples/fores33r/app/views/layouts/application.rhtml +29 -0
  12. data/examples/fores33r/config/boot.rb +44 -0
  13. data/examples/fores33r/config/database.yml +35 -0
  14. data/examples/fores33r/config/environment.rb +64 -0
  15. data/examples/fores33r/config/environments/development.rb +21 -0
  16. data/examples/fores33r/config/environments/production.rb +18 -0
  17. data/examples/fores33r/config/environments/test.rb +19 -0
  18. data/examples/fores33r/config/routes.rb +23 -0
  19. data/examples/fores33r/doc/README_FOR_APP +2 -0
  20. data/examples/fores33r/log/development.log +5507 -0
  21. data/examples/fores33r/log/production.log +0 -0
  22. data/examples/fores33r/log/server.log +0 -0
  23. data/examples/fores33r/log/test.log +0 -0
  24. data/examples/fores33r/public/404.html +8 -0
  25. data/examples/fores33r/public/500.html +8 -0
  26. data/examples/fores33r/public/dispatch.cgi +10 -0
  27. data/examples/fores33r/public/dispatch.fcgi +24 -0
  28. data/examples/fores33r/public/dispatch.rb +10 -0
  29. data/examples/fores33r/public/favicon.ico +0 -0
  30. data/examples/fores33r/public/images/rails.png +0 -0
  31. data/examples/fores33r/public/javascripts/application.js +2 -0
  32. data/examples/fores33r/public/javascripts/controls.js +815 -0
  33. data/examples/fores33r/public/javascripts/dragdrop.js +913 -0
  34. data/examples/fores33r/public/javascripts/effects.js +958 -0
  35. data/examples/fores33r/public/javascripts/prototype.js +2006 -0
  36. data/examples/fores33r/public/robots.txt +1 -0
  37. data/examples/fores33r/public/stylesheets/core.css +37 -0
  38. data/examples/fores33r/script/about +3 -0
  39. data/examples/fores33r/script/breakpointer +3 -0
  40. data/examples/fores33r/script/console +3 -0
  41. data/examples/fores33r/script/destroy +3 -0
  42. data/examples/fores33r/script/generate +3 -0
  43. data/examples/fores33r/script/performance/benchmarker +3 -0
  44. data/examples/fores33r/script/performance/profiler +3 -0
  45. data/examples/fores33r/script/plugin +3 -0
  46. data/examples/fores33r/script/process/reaper +3 -0
  47. data/examples/fores33r/script/process/spawner +3 -0
  48. data/examples/fores33r/script/runner +3 -0
  49. data/examples/fores33r/script/server +3 -0
  50. data/examples/fores33r/test/test_helper.rb +28 -0
  51. data/examples/fores33r/tmp/sessions/ruby_sess.39d37e054d21d545 +0 -0
  52. data/examples/fores33r/tmp/sessions/ruby_sess.acf71fc73aa74983 +0 -0
  53. data/examples/fores33r/tmp/sessions/ruby_sess.c1697b7d6670f3cd +0 -0
  54. data/examples/s3.yaml +11 -0
  55. data/html/classes/Net/HTTPGenericRequest.html +32 -32
  56. data/html/classes/Net/HTTPResponse.html +20 -19
  57. data/html/classes/S33r.html +422 -190
  58. data/html/classes/S33r/BucketListing.html +107 -70
  59. data/html/classes/S33r/Client.html +888 -414
  60. data/html/classes/S33r/LoggingResource.html +222 -0
  61. data/html/classes/S33r/NamedBucket.html +149 -150
  62. data/html/classes/S33r/OrderlyXmlMarkup.html +165 -0
  63. data/html/classes/S33r/S33rException.html +3 -0
  64. data/html/classes/S33r/S33rException/BucketNotLogTargetable.html +119 -0
  65. data/html/classes/S33r/S33rException/InvalidPermission.html +111 -0
  66. data/html/classes/S33r/S33rException/InvalidS3GroupType.html +111 -0
  67. data/html/classes/S33r/S3ACL.html +125 -0
  68. data/html/classes/S33r/S3ACL/ACLDoc.html +521 -0
  69. data/html/classes/S33r/{S3User.html → S3ACL/AmazonCustomer.html} +27 -30
  70. data/html/classes/S33r/S3ACL/CanonicalUser.html +212 -0
  71. data/html/classes/S33r/S3ACL/Grant.html +403 -0
  72. data/html/classes/S33r/S3ACL/Grantee.html +239 -0
  73. data/html/classes/S33r/S3ACL/Group.html +178 -0
  74. data/html/classes/S33r/S3Object.html +53 -50
  75. data/html/classes/S33r/Sync.html +6 -6
  76. data/html/classes/XML.html +4 -2
  77. data/html/created.rid +1 -1
  78. data/html/files/README_txt.html +82 -28
  79. data/html/files/lib/s33r/bucket_listing_rb.html +1 -8
  80. data/html/files/lib/s33r/builder_rb.html +108 -0
  81. data/html/files/lib/s33r/client_rb.html +2 -1
  82. data/html/files/lib/s33r/core_rb.html +2 -1
  83. data/html/files/lib/s33r/libxml_extensions_rb.html +1 -1
  84. data/html/files/lib/s33r/logging_rb.html +109 -0
  85. data/html/files/lib/s33r/named_bucket_rb.html +1 -1
  86. data/html/files/lib/s33r/s33r_exception_rb.html +1 -1
  87. data/html/files/lib/s33r/s33r_http_rb.html +1 -1
  88. data/html/files/lib/s33r/s3_acl_rb.html +109 -0
  89. data/html/fr_class_index.html +12 -1
  90. data/html/fr_file_index.html +3 -0
  91. data/html/fr_method_index.html +101 -57
  92. data/lib/s33r/bucket_listing.rb +21 -22
  93. data/lib/s33r/builder.rb +20 -0
  94. data/lib/s33r/client.rb +240 -42
  95. data/lib/s33r/core.rb +106 -36
  96. data/lib/s33r/libxml_extensions.rb +2 -2
  97. data/lib/s33r/logging.rb +43 -0
  98. data/lib/s33r/named_bucket.rb +16 -17
  99. data/lib/s33r/s33r_exception.rb +11 -0
  100. data/lib/s33r/s33r_http.rb +2 -1
  101. data/lib/s33r/s3_acl.rb +337 -0
  102. data/test/cases/spec_acl.rb +146 -0
  103. data/test/cases/spec_all_buckets.rb +28 -0
  104. data/test/cases/spec_bucket_listing.rb +2 -2
  105. data/test/cases/spec_client.rb +45 -18
  106. data/test/cases/spec_core.rb +0 -9
  107. data/test/cases/spec_namedbucket.rb +3 -3
  108. data/test/files/acl.xml +47 -0
  109. data/test/files/acl_grant1.xml +7 -0
  110. data/test/files/acl_grant2.xml +6 -0
  111. data/test/files/acl_grant3.xml +6 -0
  112. data/test/files/acl_grant4.xml +6 -0
  113. data/test/files/all_buckets.xml +21 -0
  114. data/test/files/bucket_listing.xml +138 -1
  115. data/test/files/client_config.yml +0 -1
  116. data/test/files/logging_acl.xml +34 -0
  117. data/test/files/namedbucket_config.yml +1 -5
  118. data/test/files/namedbucket_config2.yml +1 -5
  119. data/test/test_setup.rb +1 -0
  120. metadata +132 -7
@@ -0,0 +1,146 @@
1
+ base = File.dirname(__FILE__)
2
+ require base + '/../test_setup'
3
+
4
+ context 'S33r ACL functions' do
5
+ setup do
6
+ @acl_grant_xml1 = clean_xml(File.open(File.join(File.dirname(__FILE__), '../files/acl_grant1.xml')).read)
7
+ @canonical_user = CanonicalUser.new('a9a7b886d6fd24a52fe8ca5bef65f89a64e0193f23000e241bf9b1c61be666e9',
8
+ 'chriscustomer')
9
+ @canonical_user_grant = Grant.new(@canonical_user, :all)
10
+ @canonical_user2 = CanonicalUser.new('baa7b886d6fd24a52fe8ca5bef65f89a64e0193f23000e241bf9b1c61be666e9',
11
+ 'mimbo')
12
+ @canonical_user_grant2 = Grant.new(@canonical_user2, :read)
13
+
14
+ @acl_grant_xml2 = clean_xml(File.open(File.join(File.dirname(__FILE__), '../files/acl_grant2.xml')).read)
15
+ @amazon_grantee = AmazonCustomer.new('elliot@test.org')
16
+ @amazon_grant = Grant.new(@amazon_grantee, :read)
17
+ @amazon_grantee2 = AmazonCustomer.new('bingo@blinky.com')
18
+ @amazon_grant2 = Grant.new(@amazon_grantee2, :write)
19
+
20
+ @acl_grant_xml3 = clean_xml(File.open(File.join(File.dirname(__FILE__), '../files/acl_grant3.xml')).read)
21
+ @group_grantee = Group.new(:all_users)
22
+ @group_grant = Grant.new(@group_grantee, :write)
23
+
24
+ @acl_grant_xml4 = clean_xml(File.open(File.join(File.dirname(__FILE__), '../files/acl_grant4.xml')).read)
25
+ @group_grantee2 = Group.new(:authenticated_users)
26
+ @group_grant2 = Grant.new(@group_grantee2, :read_acl)
27
+
28
+ @full_acl_xml = clean_xml(File.open(File.join(File.dirname(__FILE__), '../files/acl.xml')).read)
29
+ @full_acl_doc = ACLDoc.new(@canonical_user)
30
+ @full_acl_doc.grants = [@canonical_user_grant, @canonical_user_grant2, @amazon_grant,
31
+ @amazon_grant2, @group_grant, @group_grant2]
32
+
33
+ # Grants created using convenience methods
34
+ @con_canonical_user_grant = Grant.for_canonical_user('a9a7b886d6fd24a52fe8ca5bef65f89a64e0193f23000e241bf9b1c61be666e9',
35
+ 'chriscustomer', :all)
36
+ @con_canonical_user_grant2 = Grant.for_canonical_user('baa7b886d6fd24a52fe8ca5bef65f89a64e0193f23000e241bf9b1c61be666e9',
37
+ 'mimbo', :read)
38
+ @con_amazon_grant = Grant.for_amazon_customer('elliot@test.org', :read)
39
+ @con_amazon_grant2 = Grant.for_amazon_customer('bingo@blinky.com', :write)
40
+ @con_group_grant1 = Grant.for_group(:all_users, :write)
41
+ @con_group_grant2 = Grant.for_group(:authenticated_users, :read_acl)
42
+ @con_full_acl_doc = ACLDoc.new(@canonical_user)
43
+ @con_full_acl_doc.grants = [@con_canonical_user_grant, @con_canonical_user_grant2,
44
+ @con_amazon_grant, @con_amazon_grant2, @con_group_grant1, @con_group_grant2]
45
+
46
+ # Tests for logging ACLs
47
+ @logging_acl_xml = clean_xml(File.open(File.join(File.dirname(__FILE__), '../files/logging_acl.xml')).read)
48
+ @logging_acl_doc = ACLDoc.from_xml(@logging_acl_xml)
49
+ @log_delivery_write = Grant.for_group(:log_delivery, :write)
50
+ @log_delivery_read_acl = Grant.for_group(:log_delivery, :read_acl)
51
+
52
+ # clone without the logging grants
53
+ @logging_acl_doc_no_grants = ACLDoc.from_xml(@logging_acl_xml)
54
+ @logging_acl_doc_no_grants.grants.delete_if { |g| @log_delivery_write == g or @log_delivery_read_acl == g }
55
+ end
56
+
57
+ specify 'should represent a grant for a CanonicalUser' do
58
+ clean_xml(@canonical_user_grant.to_xml).should.equal @acl_grant_xml1
59
+ end
60
+
61
+ specify 'should represent a grant for an AmazonUserByEmail' do
62
+ clean_xml(@amazon_grant.to_xml).should.equal @acl_grant_xml2
63
+ end
64
+
65
+ specify 'should represent a grant for AllUsers' do
66
+ clean_xml(@group_grant.to_xml).should.equal @acl_grant_xml3
67
+ end
68
+
69
+ specify 'should represent a grant for AuthenticatedUsers' do
70
+ clean_xml(@group_grant2.to_xml).should.equal @acl_grant_xml4
71
+ end
72
+
73
+ specify 'should generate a valid AccessControlPolicy document' do
74
+ clean_xml(@full_acl_doc.to_xml).should.equal @full_acl_xml
75
+ end
76
+
77
+ specify 'should provide convenience classes for grants' do
78
+ clean_xml(@con_full_acl_doc.to_xml).should.equal @full_acl_xml
79
+ end
80
+
81
+ specify 'needs equality method for grantees' do
82
+ test_grantee = Group.new(:all_users)
83
+ test_grantee.should.equal @group_grantee
84
+ test_grantee.should.not.equal @amazon_grantee
85
+ end
86
+
87
+ specify 'should only accept valid permission specifiers' do
88
+ lambda { Grant.new(@group_grantee, nil) }.should.raise InvalidPermission
89
+ lambda { Grant.new(@group_grantee, :broken) }.should.raise InvalidPermission
90
+ end
91
+
92
+ specify 'should correctly create AmazonCustomer grantee from XML node' do
93
+ xml = "<Grantee xsi:type='AmazonCustomerByEmail' xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\">" +
94
+ "<EmailAddress>elliot@test.org</EmailAddress>" +
95
+ "</Grantee>"
96
+ doc = XML.get_xml_doc(xml)
97
+ grantee = Grantee.from_xml(doc)
98
+ grantee.should.equal @amazon_grantee
99
+ end
100
+
101
+ specify 'should correctly create Group grantee from XML node' do
102
+ xml = "<Grantee xsi:type=\"Group\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\">" +
103
+ "<URI>http://acs.amazonaws.com/groups/global/AllUsers</URI>" +
104
+ "</Grantee>"
105
+ doc = XML.get_xml_doc(xml)
106
+ grantee = Grantee.from_xml(doc)
107
+ grantee.should.equal @group_grantee
108
+ end
109
+
110
+ specify 'should correctly create Group grantee for AuthenticatedUsers from XML node' do
111
+ xml = "<Grantee xsi:type=\"Group\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\">" +
112
+ "<URI>http://acs.amazonaws.com/groups/global/AuthenticatedUsers</URI>" +
113
+ "</Grantee>"
114
+ doc = XML.get_xml_doc(xml)
115
+ grantee = Grantee.from_xml(doc)
116
+ grantee.should.equal @group_grantee2
117
+ p grantee.group_type
118
+ p @group_grantee2.group_type
119
+ end
120
+
121
+ specify 'should parse AccessControlPolicy documents' do
122
+ acl_doc_from_xml = ACLDoc.from_xml(@full_acl_xml)
123
+ acl_doc_from_xml.owner.should.equal @full_acl_doc.owner
124
+ @full_acl_doc.grants.each do |g|
125
+ acl_doc_from_xml.grants = acl_doc_from_xml.grants.delete_if { |i| i == g }
126
+ end
127
+ acl_doc_from_xml.grants.should.be.empty
128
+ end
129
+
130
+ specify 'should represent LogDelivery grants so buckets can act as logging targets' do
131
+ @logging_acl_doc.grants.should.include @log_delivery_write
132
+ @logging_acl_doc.grants.should.include @log_delivery_read_acl
133
+ end
134
+
135
+ specify 'should be able to report whether an ACL indicates bucket is a logging target' do
136
+ @logging_acl_doc.log_targetable?.should.be true
137
+
138
+ # check the variant where the grants have been removed
139
+ @logging_acl_doc_no_grants.log_targetable?.should.be false
140
+ end
141
+
142
+ specify 'should be able to simply add logging target grants to an ACL' do
143
+ @logging_acl_doc_no_grants.add_log_target_grants
144
+ clean_xml(@logging_acl_doc_no_grants.to_xml).should.equal @logging_acl_xml
145
+ end
146
+ end
@@ -0,0 +1,28 @@
1
+ base = File.dirname(__FILE__)
2
+ require base + '/../test_setup'
3
+
4
+ require 'rubygems'
5
+ require_gem 'FakeWeb'
6
+
7
+ context 'S33r list of all buckets' do
8
+ setup do
9
+ @client = Client.new(Testing::ACCESS_KEY, Testing::SECRET_ACCESS_KEY, :use_ssl => false, :dump_requests => true)
10
+
11
+ xml_file = File.join(File.dirname(__FILE__), '../files/all_buckets.xml')
12
+ @list_all_buckets_result = File.open(xml_file) { |f| f.read }
13
+
14
+ listallbuckets_response = Net::HTTPResponse.new('1.1', '200', 'OK')
15
+ listallbuckets_response.body = @list_all_buckets_result
16
+
17
+ base_url = s3_url('/')
18
+ FakeWeb.register_uri(base_url, :status => 200, :response => listallbuckets_response)
19
+ FakeWeb.register_uri(base_url + 'elliotsmith-backup', :status => 200)
20
+ FakeWeb.register_uri(base_url + 'elliotsmith-helloworld', :status => 200)
21
+ FakeWeb.register_uri(base_url + 'elliotsmith-herbert', :status => 200)
22
+ end
23
+
24
+ specify 'should parse ListAllMyBucketsResult and get right number of buckets' do
25
+ buckets = @client.list_buckets
26
+ buckets.size.should.be 3
27
+ end
28
+ end
@@ -103,9 +103,9 @@ context 'S3 object' do
103
103
  end
104
104
 
105
105
  specify 'should treat the owner as an object in his/her own right' do
106
- [@s3obj.owner.id, @s3obj.owner.display_name].should.equal \
106
+ [@s3obj.owner.user_id, @s3obj.owner.display_name].should.equal \
107
107
  ['56efddfead5aa65da942f156fb2b294f44d78fd932d701331edc5fba19620fd4', 'elliotsmith3']
108
- @s3obj.owner.should_be_instance_of S3User
108
+ @s3obj.owner.should_be_instance_of S3ACL::CanonicalUser
109
109
  end
110
110
 
111
111
  specify 'can be associated with a NamedBucket' do
@@ -7,31 +7,48 @@ require_gem 'FakeWeb'
7
7
  context 'S33r Client' do
8
8
  setup do
9
9
  @base = File.dirname(__FILE__)
10
+
11
+ # client for testing: one without SSL, one with
10
12
  @client = Client.new(Testing::ACCESS_KEY, Testing::SECRET_ACCESS_KEY, :use_ssl => false, :dump_requests => true)
11
13
  @client2 = Client.new(Testing::ACCESS_KEY, Testing::SECRET_ACCESS_KEY)
12
- @bucket = 'testingtesting'
13
- @url = url_join('http://', HOST, @bucket)
14
14
 
15
+ # test config. files
15
16
  @plain_config_file = File.join(@base, '../files/client_config.yml')
16
17
  @custom_config_file = File.join(@base, '../files/namedbucket_config.yml')
17
18
 
19
+ # OK bucket with attached response
20
+ @bucket = 'testingtesting'
21
+ @url = s3_public_url(@bucket)
18
22
  xml_file = File.join(@base, '../files/bucket_listing.xml')
19
23
  @bucket_listing_xml = File.open(xml_file) { |f| f.read }
20
-
21
24
  listbucket_response = Net::HTTPResponse.new('1.1', '200', 'OK')
22
25
  listbucket_response.body = @bucket_listing_xml
23
-
24
26
  FakeWeb.register_uri(@url, :status => 200, :response => listbucket_response)
25
27
 
26
- # for testing behaviour if S3 is unavailable
28
+ # broken bucket: for testing behaviour if S3 is unavailable
27
29
  @bucket2 = 's3broken'
28
- @url2 = url_join('http://', HOST, @bucket2)
30
+ @url2 = s3_public_url(@bucket2)
29
31
  FakeWeb.register_uri(@url2, :status => 503)
32
+
33
+ # OK resource
34
+ @resource_key = 'iamhere'
35
+ @url3 = s3_public_url(@bucket, @resource_key)
36
+ FakeWeb.register_uri(@url3, :status => 200)
37
+
38
+ # missing resource
39
+ @missing_resource = 'iammissing'
40
+ @url4 = s3_public_url(@bucket, @missing_resource)
41
+ FakeWeb.register_uri(@url4, :status => 404)
42
+
43
+ # missing bucket
44
+ @missing_bucket = 'iamamissingbucket'
45
+ @url5 = s3_public_url(@missing_bucket)
46
+ FakeWeb.register_uri(@url5, :status => 404)
30
47
  end
31
48
 
32
49
  specify 'should return use_ssl setting correctly' do
33
- @client.use_ssl?.should.not.be true
34
- @client2.use_ssl?.should.be true
50
+ @client.use_ssl.should.not.be true
51
+ @client2.use_ssl.should.be true
35
52
  end
36
53
 
37
54
  specify 'should trap max_keys too high in bucket listing request' do
@@ -40,19 +57,22 @@ context 'S33r Client' do
40
57
  end
41
58
 
42
59
  specify 'should fetch bucket listing ok' do
43
- resp, _ = @client.list_bucket(@bucket)
60
+ resp, listing = @client.list_bucket(@bucket)
44
61
  resp.ok?.should.be true
45
62
  end
46
63
 
64
+ # NB tests for content of BucketListing in depth are done in spec_bucket_listing
65
+ specify 'should attach BucketListing instance to ListBucketResult responses' do
66
+ resp, listing = @client.list_bucket(@bucket)
67
+ listing.should.be.an_instance_of BucketListing
68
+ listing.contents.size.should.be 10
69
+ end
70
+
47
71
  specify 'can be initialised from plain config file' do
48
72
  c = Client.init(@plain_config_file)
49
73
  c.aws_access_key.should.equal 'youraccesskey'
50
74
  c.aws_secret_access_key.should.equal 'yoursecretkey'
51
75
  end
52
-
53
- specify 'should attach BucketListing instance to ListBucketResult responses' do
54
- todo
55
- end
56
76
 
57
77
  specify 'should retain leading slashes on keys when constructing request URLs' do
58
78
  todo
@@ -62,13 +82,20 @@ context 'S33r Client' do
62
82
  lambda { @client.list_bucket(@bucket2) }.should.raise S3FallenOver
63
83
  end
64
84
 
65
- specify 'should return S3Object with metadata properties' do
85
+ specify 'should return S3Object with metadata properties when getting a resource key' do
66
86
  todo
67
87
  end
68
88
 
69
- specify 'should recognise custom config variables passed to configuration file loader' do
70
- _, _, _, custom = Client.load_config(@custom_config_file)
71
- custom[:from_email].should.equal 'you@example.com'
72
- custom[:to_email].should.equal 'me@example.com'
89
+ specify 'should identify whether resources exist' do
90
+ # resource_exists? should work just with a bucket name
91
+ @client.resource_exists?(@bucket).should.be true
92
+
93
+ # these ones exist
94
+ @client.bucket_exists?(@bucket).should.be true
95
+ @client.resource_exists?(@bucket, @resource_key).should.be true
96
+
97
+ # the missing ones
98
+ @client.resource_exists?(@bucket, @missing_resource).should.be false
99
+ @client.bucket_exists?(@missing_bucket).should.be false
73
100
  end
74
101
  end
@@ -115,15 +115,6 @@ context 'S33r core' do
115
115
  specify 'should convert integers to strings when generating querystrings' do
116
116
  generate_querystring({ 'max-keys' => 400 }).should.equal('?max-keys=400')
117
117
  end
118
-
119
- specify 'should be able to construct correct URL paths from path fragments' do
120
- url_join('http://', 'localhost/', 'test').should.equal('http://localhost/test')
121
- url_join('ftp://test.com', '/public/', '/files').should.equal('ftp://test.com/public/files')
122
- url_join('http://localhost/', '/index.html').should.equal('http://localhost/index.html')
123
- url_join('http://', 'localhost', 'test').should.equal('http://localhost/test')
124
- url_join('http://localhost:8080/test/', '/path/', 'element.html').should.equal('http://localhost:8080/test/path/element.html')
125
- url_join('/test/', 'index.html').should.equal '/test/index.html'
126
- end
127
118
 
128
119
  specify 'should generate URLs with authentication parameters' do
129
120
  s3_authenticated_url(Testing::ACCESS_KEY, Testing::SECRET_ACCESS_KEY, 'quotes', 'nelson', \
@@ -9,7 +9,7 @@ context 'NamedBucket client' do
9
9
  @base = File.dirname(__FILE__)
10
10
  @config_filename = @base + '/../files/namedbucket_config.yml'
11
11
  @config_filename2 = @base + '/../files/namedbucket_config2.yml'
12
- @url = url_join('http://', HOST, 'nobucket')
12
+ @url = s3_public_url('nobucket')
13
13
  end
14
14
 
15
15
  specify 'should keep a copy of the current bucket listing inside as a property' do
@@ -33,10 +33,10 @@ context 'NamedBucket client' do
33
33
  client = NamedBucket.init(@config_filename)
34
34
  client.aws_access_key.should.equal 'youraccesskey'
35
35
  client.aws_secret_access_key.should.equal 'yoursecretkey'
36
- client.bucket_name.should.equal 'nobucket'
36
+ client.name.should.equal 'nobucket'
37
37
  client.strict?.should.be false
38
38
  client.public_contents?.should.be true
39
- client.use_ssl?.should.be false
39
+ client.use_ssl.should.be false
40
40
  end
41
41
 
42
42
  specify 'cannot be initialised for non-existent bucket' do
@@ -0,0 +1,47 @@
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <AccessControlPolicy xmlns="http://s3.amazonaws.com/doc/2006-03-01/">
3
+ <Owner>
4
+ <ID>a9a7b886d6fd24a52fe8ca5bef65f89a64e0193f23000e241bf9b1c61be666e9</ID>
5
+ <DisplayName>chriscustomer</DisplayName>
6
+ </Owner>
7
+ <AccessControlList>
8
+ <Grant>
9
+ <Grantee xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="CanonicalUser">
10
+ <ID>a9a7b886d6fd24a52fe8ca5bef65f89a64e0193f23000e241bf9b1c61be666e9</ID>
11
+ <DisplayName>chriscustomer</DisplayName>
12
+ </Grantee>
13
+ <Permission>FULL_CONTROL</Permission>
14
+ </Grant>
15
+ <Grant>
16
+ <Grantee xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="CanonicalUser">
17
+ <ID>baa7b886d6fd24a52fe8ca5bef65f89a64e0193f23000e241bf9b1c61be666e9</ID>
18
+ <DisplayName>mimbo</DisplayName>
19
+ </Grantee>
20
+ <Permission>READ</Permission>
21
+ </Grant>
22
+ <Grant>
23
+ <Grantee xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="AmazonCustomerByEmail">
24
+ <EmailAddress>elliot@test.org</EmailAddress>
25
+ </Grantee>
26
+ <Permission>READ</Permission>
27
+ </Grant>
28
+ <Grant>
29
+ <Grantee xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="AmazonCustomerByEmail">
30
+ <EmailAddress>bingo@blinky.com</EmailAddress>
31
+ </Grantee>
32
+ <Permission>WRITE</Permission>
33
+ </Grant>
34
+ <Grant>
35
+ <Grantee xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="Group">
36
+ <URI>http://acs.amazonaws.com/groups/global/AllUsers</URI>
37
+ </Grantee>
38
+ <Permission>WRITE</Permission>
39
+ </Grant>
40
+ <Grant>
41
+ <Grantee xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="Group">
42
+ <URI>http://acs.amazonaws.com/groups/global/AuthenticatedUsers</URI>
43
+ </Grantee>
44
+ <Permission>READ_ACP</Permission>
45
+ </Grant>
46
+ </AccessControlList>
47
+ </AccessControlPolicy>
@@ -0,0 +1,7 @@
1
+ <Grant>
2
+ <Grantee xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="CanonicalUser">
3
+ <ID>a9a7b886d6fd24a52fe8ca5bef65f89a64e0193f23000e241bf9b1c61be666e9</ID>
4
+ <DisplayName>chriscustomer</DisplayName>
5
+ </Grantee>
6
+ <Permission>FULL_CONTROL</Permission>
7
+ </Grant>
@@ -0,0 +1,6 @@
1
+ <Grant>
2
+ <Grantee xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="AmazonCustomerByEmail">
3
+ <EmailAddress>elliot@test.org</EmailAddress>
4
+ </Grantee>
5
+ <Permission>READ</Permission>
6
+ </Grant>
@@ -0,0 +1,6 @@
1
+ <Grant>
2
+ <Grantee xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="Group">
3
+ <URI>http://acs.amazonaws.com/groups/global/AllUsers</URI>
4
+ </Grantee>
5
+ <Permission>WRITE</Permission>
6
+ </Grant>
@@ -0,0 +1,6 @@
1
+ <Grant>
2
+ <Grantee xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="Group">
3
+ <URI>http://acs.amazonaws.com/groups/global/AuthenticatedUsers</URI>
4
+ </Grantee>
5
+ <Permission>READ_ACP</Permission>
6
+ </Grant>
@@ -0,0 +1,21 @@
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <ListAllMyBucketsResult xmlns="http://s3.amazonaws.com/doc/2006-03-01/">
3
+ <Owner>
4
+ <ID>56efddfead5aa65da942f156fb2 b294f44d78fd932d701331edc5fba19620fd4</ID>
5
+ <DisplayName>elliotsmith3</DisplayName>
6
+ </Owner>
7
+ <Buckets>
8
+ <Bucket>
9
+ <Name>elliotsmith-backup</Name>
10
+ <CreationDate>2006-07-2 0T13:25:47.000Z</CreationDate>
11
+ </Bucket>
12
+ <Bucket>
13
+ <Name>elliotsmith-helloworld</Name>
14
+ <CreationDate>2006-09-06T14:35:36.000Z</CreationDate>
15
+ </Bucket>
16
+ <Bucket>
17
+ <Name>elliotsmith-herbert</Name>
18
+ <CreationDate>2006-04-18T22:37:06.000Z</CreationDate>
19
+ </Bucket>
20
+ </Buckets>
21
+ </ListAllMyBucketsResult>
@@ -1 +1,138 @@
1
- <?xml version="1.0" encoding="UTF-8"?><ListBucketResult xmlns="http://s3.amazonaws.com/doc/2006-03-01/"><Name>testingtesting</Name><Prefix/><Marker/><MaxKeys>1000</MaxKeys><IsTruncated>false</IsTruncated><Contents><Key>/home/ell/dir1/four.txt</Key><LastModified>2006-08-19T22:53:29.000Z</LastModified><ETag>"24ce59274b89287b3960c184153ac24b"</ETag><Size>14</Size><Owner><ID>56efddfead5aa65da942f156fb2b294f44d78fd932d701331edc5fba19620fd4</ID><DisplayName>elliotsmith3</DisplayName></Owner><StorageClass>STANDARD</StorageClass></Contents><Contents><Key>/home/ell/dir1/three.txt</Key><LastModified>2006-08-19T22:53:28.000Z</LastModified><ETag>"d01f8d7ad25e962f59f661126e4a5057"</ETag><Size>15</Size><Owner><ID>56efddfead5aa65da942f156fb2b294f44d78fd932d701331edc5fba19620fd4</ID><DisplayName>elliotsmith3</DisplayName></Owner><StorageClass>STANDARD</StorageClass></Contents><Contents><Key>/home/ell/dir2/five.txt</Key><LastModified>2006-08-19T22:53:29.000Z</LastModified><ETag>"495f6ea4d6c70f64f767b08818c876dd"</ETag><Size>14</Size><Owner><ID>56efddfead5aa65da942f156fb2b294f44d78fd932d701331edc5fba19620fd4</ID><DisplayName>elliotsmith3</DisplayName></Owner><StorageClass>STANDARD</StorageClass></Contents><Contents><Key>/home/ell/dir2/six.txt</Key><LastModified>2006-08-19T22:53:30.000Z</LastModified><ETag>"1d7407ec32f45f4ac15b121a45932059"</ETag><Size>13</Size><Owner><ID>56efddfead5aa65da942f156fb2b294f44d78fd932d701331edc5fba19620fd4</ID><DisplayName>elliotsmith3</DisplayName></Owner><StorageClass>STANDARD</StorageClass></Contents><Contents><Key>/home/ell/dir2/subdir21/seven.txt</Key><LastModified>2006-08-19T22:53:31.000Z</LastModified><ETag>"b6bc8a2efb68c39c1e06469d32bc66f2"</ETag><Size>15</Size><Owner><ID>56efddfead5aa65da942f156fb2b294f44d78fd932d701331edc5fba19620fd4</ID><DisplayName>elliotsmith3</DisplayName></Owner><StorageClass>STANDARD</StorageClass></Contents><Contents><Key>/home/ell/dir2/subdir22/eight.txt</Key><LastModified>2006-08-19T22:53:31.000Z</LastModified><ETag>"61fa424274f4caacbc7d4b6fd575ce1a"</ETag><Size>15</Size><Owner><ID>56efddfead5aa65da942f156fb2b294f44d78fd932d701331edc5fba19620fd4</ID><DisplayName>elliotsmith3</DisplayName></Owner><StorageClass>STANDARD</StorageClass></Contents><Contents><Key>/home/ell/dir2/subdir22/subdir221/nine.txt</Key><LastModified>2006-08-19T22:53:32.000Z</LastModified><ETag>"d3dc4897b611eb4b0a2cd7bb99eb2f50"</ETag><Size>14</Size><Owner><ID>56efddfead5aa65da942f156fb2b294f44d78fd932d701331edc5fba19620fd4</ID><DisplayName>elliotsmith3</DisplayName></Owner><StorageClass>STANDARD</StorageClass></Contents><Contents><Key>/home/ell/dir2/subdir22/subdir221/ten.txt</Key><LastModified>2006-08-19T22:53:32.000Z</LastModified><ETag>"5ecc5853945efc6448d17ea80d2aa4c0"</ETag><Size>13</Size><Owner><ID>56efddfead5aa65da942f156fb2b294f44d78fd932d701331edc5fba19620fd4</ID><DisplayName>elliotsmith3</DisplayName></Owner><StorageClass>STANDARD</StorageClass></Contents><Contents><Key>/home/ell/one.txt</Key><LastModified>2006-08-19T22:53:27.000Z</LastModified><ETag>"420f7bf33402d3e6715d623bdac0dbcc"</ETag><Size>13</Size><Owner><ID>56efddfead5aa65da942f156fb2b294f44d78fd932d701331edc5fba19620fd4</ID><DisplayName>elliotsmith3</DisplayName></Owner><StorageClass>STANDARD</StorageClass></Contents><Contents><Key>/home/ell/two.txt</Key><LastModified>2006-08-19T22:53:27.000Z</LastModified><ETag>"3be782e5229216c508fcb3be5fc8505d"</ETag><Size>13</Size><Owner><ID>56efddfead5aa65da942f156fb2b294f44d78fd932d701331edc5fba19620fd4</ID><DisplayName>elliotsmith3</DisplayName></Owner><StorageClass>STANDARD</StorageClass></Contents></ListBucketResult>
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <ListBucketResult xmlns="http://s3.amazonaws.com/doc/2006-03-01/">
3
+ <Name>testingtesting</Name>
4
+ <Prefix />
5
+ <Marker />
6
+ <MaxKeys>1000</MaxKeys>
7
+ <IsTruncated>false</IsTruncated>
8
+ <Contents>
9
+ <Key>/home/ell/dir1/four.txt</Key>
10
+ <LastModified>2006-08-19T22:53:29.000Z</LastModified>
11
+ <ETag>"24ce59274b89287b3960c184153ac24b"</ETag>
12
+ <Size>14</Size>
13
+ <Owner>
14
+ <ID>
15
+ 56efddfead5aa65da942f156fb2b294f44d78fd932d701331edc5fba19620fd4
16
+ </ID>
17
+ <DisplayName>elliotsmith3</DisplayName>
18
+ </Owner>
19
+ <StorageClass>STANDARD</StorageClass>
20
+ </Contents>
21
+ <Contents>
22
+ <Key>/home/ell/dir1/three.txt</Key>
23
+ <LastModified>2006-08-19T22:53:28.000Z</LastModified>
24
+ <ETag>"d01f8d7ad25e962f59f661126e4a5057"</ETag>
25
+ <Size>15</Size>
26
+ <Owner>
27
+ <ID>
28
+ 56efddfead5aa65da942f156fb2b294f44d78fd932d701331edc5fba19620fd4
29
+ </ID>
30
+ <DisplayName>elliotsmith3</DisplayName>
31
+ </Owner>
32
+ <StorageClass>STANDARD</StorageClass>
33
+ </Contents>
34
+ <Contents>
35
+ <Key>/home/ell/dir2/five.txt</Key>
36
+ <LastModified>2006-08-19T22:53:29.000Z</LastModified>
37
+ <ETag>"495f6ea4d6c70f64f767b08818c876dd"</ETag>
38
+ <Size>14</Size>
39
+ <Owner>
40
+ <ID>
41
+ 56efddfead5aa65da942f156fb2b294f44d78fd932d701331edc5fba19620fd4
42
+ </ID>
43
+ <DisplayName>elliotsmith3</DisplayName>
44
+ </Owner>
45
+ <StorageClass>STANDARD</StorageClass>
46
+ </Contents>
47
+ <Contents>
48
+ <Key>/home/ell/dir2/six.txt</Key>
49
+ <LastModified>2006-08-19T22:53:30.000Z</LastModified>
50
+ <ETag>"1d7407ec32f45f4ac15b121a45932059"</ETag>
51
+ <Size>13</Size>
52
+ <Owner>
53
+ <ID>
54
+ 56efddfead5aa65da942f156fb2b294f44d78fd932d701331edc5fba19620fd4
55
+ </ID>
56
+ <DisplayName>elliotsmith3</DisplayName>
57
+ </Owner>
58
+ <StorageClass>STANDARD</StorageClass>
59
+ </Contents>
60
+ <Contents>
61
+ <Key>/home/ell/dir2/subdir21/seven.txt</Key>
62
+ <LastModified>2006-08-19T22:53:31.000Z</LastModified>
63
+ <ETag>"b6bc8a2efb68c39c1e06469d32bc66f2"</ETag>
64
+ <Size>15</Size>
65
+ <Owner>
66
+ <ID>
67
+ 56efddfead5aa65da942f156fb2b294f44d78fd932d701331edc5fba19620fd4
68
+ </ID>
69
+ <DisplayName>elliotsmith3</DisplayName>
70
+ </Owner>
71
+ <StorageClass>STANDARD</StorageClass>
72
+ </Contents>
73
+ <Contents>
74
+ <Key>/home/ell/dir2/subdir22/eight.txt</Key>
75
+ <LastModified>2006-08-19T22:53:31.000Z</LastModified>
76
+ <ETag>"61fa424274f4caacbc7d4b6fd575ce1a"</ETag>
77
+ <Size>15</Size>
78
+ <Owner>
79
+ <ID>
80
+ 56efddfead5aa65da942f156fb2b294f44d78fd932d701331edc5fba19620fd4
81
+ </ID>
82
+ <DisplayName>elliotsmith3</DisplayName>
83
+ </Owner>
84
+ <StorageClass>STANDARD</StorageClass>
85
+ </Contents>
86
+ <Contents>
87
+ <Key>/home/ell/dir2/subdir22/subdir221/nine.txt</Key>
88
+ <LastModified>2006-08-19T22:53:32.000Z</LastModified>
89
+ <ETag>"d3dc4897b611eb4b0a2cd7bb99eb2f50"</ETag>
90
+ <Size>14</Size>
91
+ <Owner>
92
+ <ID>
93
+ 56efddfead5aa65da942f156fb2b294f44d78fd932d701331edc5fba19620fd4
94
+ </ID>
95
+ <DisplayName>elliotsmith3</DisplayName>
96
+ </Owner>
97
+ <StorageClass>STANDARD</StorageClass>
98
+ </Contents>
99
+ <Contents>
100
+ <Key>/home/ell/dir2/subdir22/subdir221/ten.txt</Key>
101
+ <LastModified>2006-08-19T22:53:32.000Z</LastModified>
102
+ <ETag>"5ecc5853945efc6448d17ea80d2aa4c0"</ETag>
103
+ <Size>13</Size>
104
+ <Owner>
105
+ <ID>
106
+ 56efddfead5aa65da942f156fb2b294f44d78fd932d701331edc5fba19620fd4
107
+ </ID>
108
+ <DisplayName>elliotsmith3</DisplayName>
109
+ </Owner>
110
+ <StorageClass>STANDARD</StorageClass>
111
+ </Contents>
112
+ <Contents>
113
+ <Key>/home/ell/one.txt</Key>
114
+ <LastModified>2006-08-19T22:53:27.000Z</LastModified>
115
+ <ETag>"420f7bf33402d3e6715d623bdac0dbcc"</ETag>
116
+ <Size>13</Size>
117
+ <Owner>
118
+ <ID>
119
+ 56efddfead5aa65da942f156fb2b294f44d78fd932d701331edc5fba19620fd4
120
+ </ID>
121
+ <DisplayName>elliotsmith3</DisplayName>
122
+ </Owner>
123
+ <StorageClass>STANDARD</StorageClass>
124
+ </Contents>
125
+ <Contents>
126
+ <Key>/home/ell/two.txt</Key>
127
+ <LastModified>2006-08-19T22:53:27.000Z</LastModified>
128
+ <ETag>"3be782e5229216c508fcb3be5fc8505d"</ETag>
129
+ <Size>13</Size>
130
+ <Owner>
131
+ <ID>
132
+ 56efddfead5aa65da942f156fb2b294f44d78fd932d701331edc5fba19620fd4
133
+ </ID>
134
+ <DisplayName>elliotsmith3</DisplayName>
135
+ </Owner>
136
+ <StorageClass>STANDARD</StorageClass>
137
+ </Contents>
138
+ </ListBucketResult>