Merge lp:~djfroofy/txaws/485533-reqestpayment into lp:txaws

Proposed by Drew Smathers
Status: Merged
Merged at revision: 76
Proposed branch: lp:~djfroofy/txaws/485533-reqestpayment
Merge into: lp:txaws
Diff against target: 176 lines (+121/-0)
4 files modified
txaws/s3/client.py (+24/-0)
txaws/s3/model.py (+24/-0)
txaws/s3/tests/test_client.py (+66/-0)
txaws/testing/payload.py (+7/-0)
To merge this branch: bzr merge lp:~djfroofy/txaws/485533-reqestpayment
Reviewer Review Type Date Requested Status
Jamu Kakar Approve
Review via email: mp+35895@code.launchpad.net
To post a comment you must log in.
Revision history for this message
Jamu Kakar (jkakar) wrote :

Nice work, +1! As before, I made some minor cosmetic changes before
merging.

review: Approve

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1=== modified file 'txaws/s3/client.py'
2--- txaws/s3/client.py 2009-11-23 00:55:44 +0000
3+++ txaws/s3/client.py 2010-09-17 21:57:56 +0000
4@@ -221,6 +221,30 @@
5 return query.submit()
6
7
8+ def put_request_payment(self, bucket, payer):
9+ """
10+ Set request payment configuration on bucket to payer.
11+ """
12+ data = model.RequestPayment(payer).to_xml()
13+ query = self.query_factory(
14+ action='PUT', creds=self.creds, endpoint=self.endpoint,
15+ bucket=bucket, object_name='?requestPayment', data=data)
16+ return query.submit()
17+
18+ def get_request_payment(self, bucket):
19+ """
20+ Get the request payment configuration on a bucket.
21+ """
22+ query = self.query_factory(
23+ action='GET', creds=self.creds, endpoint=self.endpoint,
24+ bucket=bucket, object_name='?requestPayment')
25+ return query.submit().addCallback(self._parse_get_request_payment)
26+
27+
28+ def _parse_get_request_payment(self, xml_bytes):
29+ return model.RequestPayment.from_xml(xml_bytes).payer
30+
31+
32 class Query(BaseQuery):
33 """A query for submission to the S3 service."""
34
35
36=== modified file 'txaws/s3/model.py'
37--- txaws/s3/model.py 2009-11-23 00:55:44 +0000
38+++ txaws/s3/model.py 2010-09-17 21:57:56 +0000
39@@ -1,3 +1,5 @@
40+from txaws.util import XML
41+
42 class Bucket(object):
43 """
44 An Amazon S3 storage bucket.
45@@ -49,3 +51,25 @@
46 S3 returns file chunks, 10 MB at a time, until the entire file is returned.
47 These chunks need to be assembled once they are all returned.
48 """
49+
50+class RequestPayment(object):
51+
52+ payer_choices = ('Requester', 'BucketOwner')
53+
54+ def __init__(self, payer):
55+ if payer not in self.payer_choices:
56+ raise ValueError('Invalid value for payer: `%s`. Must be one of %s' %
57+ (payer, ','.join(self.payer_choices)))
58+ self.payer = payer
59+
60+ def to_xml(self):
61+ return ('<RequestPaymentConfiguration xmlns="http://s3.amazonaws.com/doc/2006-03-01/">\n'
62+ ' <Payer>%s</Payer>\n'
63+ '</RequestPaymentConfiguration>' % self.payer)
64+
65+ @classmethod
66+ def from_xml(cls, xml_bytes):
67+ root = XML(xml_bytes)
68+ return cls(root.findtext('Payer'))
69+
70+
71
72=== modified file 'txaws/s3/tests/test_client.py'
73--- txaws/s3/tests/test_client.py 2009-11-23 00:55:44 +0000
74+++ txaws/s3/tests/test_client.py 2010-09-17 21:57:56 +0000
75@@ -2,6 +2,7 @@
76
77 from txaws.credentials import AWSCredentials
78 from txaws.s3 import client
79+from txaws.s3 import model
80 from txaws.service import AWSServiceEndpoint
81 from txaws.testing import payload
82 from txaws.testing.base import TXAWSTestCase
83@@ -196,6 +197,64 @@
84 s3 = client.S3Client(creds, query_factory=StubQuery)
85 return s3.delete_bucket("mybucket")
86
87+
88+ def test_put_request_payment(self):
89+
90+ class StubQuery(client.Query):
91+
92+ def __init__(query, action, creds, endpoint, bucket=None,
93+ object_name=None, data=None, content_type=None,
94+ metadata=None):
95+ super(StubQuery, query).__init__(
96+ action=action, creds=creds, bucket=bucket,
97+ object_name=object_name, data=data,
98+ content_type=content_type, metadata=metadata)
99+ self.assertEqual(action, "PUT")
100+ self.assertEqual(creds.access_key, "foo")
101+ self.assertEqual(creds.secret_key, "bar")
102+ self.assertEqual(query.bucket, "mybucket")
103+ self.assertEqual(query.object_name, "?requestPayment")
104+ self.assertEqual(query.data, ('<RequestPaymentConfiguration xmlns="http://s3.amazonaws.com/doc/2006-03-01/">\n'
105+ ' <Payer>Requester</Payer>\n'
106+ '</RequestPaymentConfiguration>'))
107+ self.assertEqual(query.metadata, None)
108+
109+ def submit(query):
110+ return succeed(None)
111+
112+ creds = AWSCredentials("foo", "bar")
113+ s3 = client.S3Client(creds, query_factory=StubQuery)
114+ return s3.put_request_payment("mybucket", "Requester")
115+
116+ def test_data_request_payment(self):
117+
118+ class StubQuery(client.Query):
119+
120+ def __init__(query, action, creds, endpoint, bucket=None,
121+ object_name=None, data=None, content_type=None,
122+ metadata=None):
123+ super(StubQuery, query).__init__(
124+ action=action, creds=creds, bucket=bucket,
125+ object_name=object_name, data=data,
126+ content_type=content_type, metadata=metadata)
127+ self.assertEqual(action, "GET")
128+ self.assertEqual(creds.access_key, "foo")
129+ self.assertEqual(creds.secret_key, "bar")
130+ self.assertEqual(query.bucket, "mybucket")
131+ self.assertEqual(query.object_name, "?requestPayment")
132+ self.assertEqual(query.metadata, None)
133+
134+ def submit(query):
135+ return succeed(payload.sample_request_payment)
136+
137+ def check_request_payment(result):
138+ self.assertEquals(result, 'Requester')
139+
140+ creds = AWSCredentials("foo", "bar")
141+ s3 = client.S3Client(creds, query_factory=StubQuery)
142+ return s3.get_request_payment("mybucket").addCallback(check_request_payment)
143+
144+
145 def test_put_object(self):
146
147 class StubQuery(client.Query):
148@@ -474,3 +533,10 @@
149
150 def test_content_md5(self):
151 self.assertEqual(calculate_md5("somedata"), "rvr3UC1SmUw7AZV2NqPN0g==")
152+
153+ def test_request_payment_enum(self):
154+ model.RequestPayment('Requester')
155+ model.RequestPayment('BucketOwner')
156+ self.assertRaises(ValueError, model.RequestPayment, 'Bob')
157+
158+
159
160=== modified file 'txaws/testing/payload.py'
161--- txaws/testing/payload.py 2010-07-20 10:15:48 +0000
162+++ txaws/testing/payload.py 2010-09-17 21:57:56 +0000
163@@ -878,6 +878,13 @@
164 </ListBucketResult>
165 """ % (version.s3_api,)
166
167+
168+sample_request_payment = """\
169+<?xml version="1.0" encoding="UTF-8"?>
170+<RequestPaymentConfiguration xmlns="http://s3.amazonaws.com/doc/2006-03-01/">
171+ <Payer>Requester</Payer>
172+</RequestPaymentConfiguration>"""
173+
174 sample_s3_signature_mismatch = """\
175 <?xml version="1.0" encoding="UTF-8"?>
176 <Error>

Subscribers

People subscribed via source and target branches