Drew Smathers has proposed merging lp:~djfroofy/txaws/485533-reqestpayment into lp:txaws.
Requested reviews: txAWS Developers (txaws-dev) Related bugs: #485533 Implement S3 requestPayment https://bugs.launchpad.net/bugs/485533 -- https://code.launchpad.net/~djfroofy/txaws/485533-reqestpayment/+merge/35895 Your team txAWS Developers is requested to review the proposed merge of lp:~djfroofy/txaws/485533-reqestpayment into lp:txaws.
=== modified file 'txaws/s3/client.py' --- txaws/s3/client.py 2009-11-23 00:55:44 +0000 +++ txaws/s3/client.py 2010-09-17 21:57:56 +0000 @@ -221,6 +221,30 @@ return query.submit() + def put_request_payment(self, bucket, payer): + """ + Set request payment configuration on bucket to payer. + """ + data = model.RequestPayment(payer).to_xml() + query = self.query_factory( + action='PUT', creds=self.creds, endpoint=self.endpoint, + bucket=bucket, object_name='?requestPayment', data=data) + return query.submit() + + def get_request_payment(self, bucket): + """ + Get the request payment configuration on a bucket. + """ + query = self.query_factory( + action='GET', creds=self.creds, endpoint=self.endpoint, + bucket=bucket, object_name='?requestPayment') + return query.submit().addCallback(self._parse_get_request_payment) + + + def _parse_get_request_payment(self, xml_bytes): + return model.RequestPayment.from_xml(xml_bytes).payer + + class Query(BaseQuery): """A query for submission to the S3 service.""" === modified file 'txaws/s3/model.py' --- txaws/s3/model.py 2009-11-23 00:55:44 +0000 +++ txaws/s3/model.py 2010-09-17 21:57:56 +0000 @@ -1,3 +1,5 @@ +from txaws.util import XML + class Bucket(object): """ An Amazon S3 storage bucket. @@ -49,3 +51,25 @@ S3 returns file chunks, 10 MB at a time, until the entire file is returned. These chunks need to be assembled once they are all returned. """ + +class RequestPayment(object): + + payer_choices = ('Requester', 'BucketOwner') + + def __init__(self, payer): + if payer not in self.payer_choices: + raise ValueError('Invalid value for payer: `%s`. Must be one of %s' % + (payer, ','.join(self.payer_choices))) + self.payer = payer + + def to_xml(self): + return ('<RequestPaymentConfiguration xmlns="http://s3.amazonaws.com/doc/2006-03-01/">\n' + ' <Payer>%s</Payer>\n' + '</RequestPaymentConfiguration>' % self.payer) + + @classmethod + def from_xml(cls, xml_bytes): + root = XML(xml_bytes) + return cls(root.findtext('Payer')) + + === modified file 'txaws/s3/tests/test_client.py' --- txaws/s3/tests/test_client.py 2009-11-23 00:55:44 +0000 +++ txaws/s3/tests/test_client.py 2010-09-17 21:57:56 +0000 @@ -2,6 +2,7 @@ from txaws.credentials import AWSCredentials from txaws.s3 import client +from txaws.s3 import model from txaws.service import AWSServiceEndpoint from txaws.testing import payload from txaws.testing.base import TXAWSTestCase @@ -196,6 +197,64 @@ s3 = client.S3Client(creds, query_factory=StubQuery) return s3.delete_bucket("mybucket") + + def test_put_request_payment(self): + + class StubQuery(client.Query): + + def __init__(query, action, creds, endpoint, bucket=None, + object_name=None, data=None, content_type=None, + metadata=None): + super(StubQuery, query).__init__( + action=action, creds=creds, bucket=bucket, + object_name=object_name, data=data, + content_type=content_type, metadata=metadata) + self.assertEqual(action, "PUT") + self.assertEqual(creds.access_key, "foo") + self.assertEqual(creds.secret_key, "bar") + self.assertEqual(query.bucket, "mybucket") + self.assertEqual(query.object_name, "?requestPayment") + self.assertEqual(query.data, ('<RequestPaymentConfiguration xmlns="http://s3.amazonaws.com/doc/2006-03-01/">\n' + ' <Payer>Requester</Payer>\n' + '</RequestPaymentConfiguration>')) + self.assertEqual(query.metadata, None) + + def submit(query): + return succeed(None) + + creds = AWSCredentials("foo", "bar") + s3 = client.S3Client(creds, query_factory=StubQuery) + return s3.put_request_payment("mybucket", "Requester") + + def test_data_request_payment(self): + + class StubQuery(client.Query): + + def __init__(query, action, creds, endpoint, bucket=None, + object_name=None, data=None, content_type=None, + metadata=None): + super(StubQuery, query).__init__( + action=action, creds=creds, bucket=bucket, + object_name=object_name, data=data, + content_type=content_type, metadata=metadata) + self.assertEqual(action, "GET") + self.assertEqual(creds.access_key, "foo") + self.assertEqual(creds.secret_key, "bar") + self.assertEqual(query.bucket, "mybucket") + self.assertEqual(query.object_name, "?requestPayment") + self.assertEqual(query.metadata, None) + + def submit(query): + return succeed(payload.sample_request_payment) + + def check_request_payment(result): + self.assertEquals(result, 'Requester') + + creds = AWSCredentials("foo", "bar") + s3 = client.S3Client(creds, query_factory=StubQuery) + return s3.get_request_payment("mybucket").addCallback(check_request_payment) + + def test_put_object(self): class StubQuery(client.Query): @@ -474,3 +533,10 @@ def test_content_md5(self): self.assertEqual(calculate_md5("somedata"), "rvr3UC1SmUw7AZV2NqPN0g==") + + def test_request_payment_enum(self): + model.RequestPayment('Requester') + model.RequestPayment('BucketOwner') + self.assertRaises(ValueError, model.RequestPayment, 'Bob') + + === modified file 'txaws/testing/payload.py' --- txaws/testing/payload.py 2010-07-20 10:15:48 +0000 +++ txaws/testing/payload.py 2010-09-17 21:57:56 +0000 @@ -878,6 +878,13 @@ </ListBucketResult> """ % (version.s3_api,) + +sample_request_payment = """\ +<?xml version="1.0" encoding="UTF-8"?> +<RequestPaymentConfiguration xmlns="http://s3.amazonaws.com/doc/2006-03-01/"> + <Payer>Requester</Payer> +</RequestPaymentConfiguration>""" + sample_s3_signature_mismatch = """\ <?xml version="1.0" encoding="UTF-8"?> <Error>
_______________________________________________ Mailing list: https://launchpad.net/~txaws-dev Post to : txaws-dev@lists.launchpad.net Unsubscribe : https://launchpad.net/~txaws-dev More help : https://help.launchpad.net/ListHelp