← Back to team overview

txaws-dev team mailing list archive

[Merge] lp:~djfroofy/txaws/newagent-767205 into lp:txaws

 

You have been requested to review the proposed merge of lp:~djfroofy/txaws/newagent-767205 into lp:txaws.

For more details, see:
https://code.launchpad.net/~djfroofy/txaws/newagent-767205/+merge/93312



-- 
https://code.launchpad.net/~djfroofy/txaws/newagent-767205/+merge/93312
Your team txAWS Technical List is requested to review the proposed merge of lp:~djfroofy/txaws/newagent-767205 into lp:txaws.
=== modified file 'txaws/client/base.py'
--- txaws/client/base.py	2012-02-15 22:23:18 +0000
+++ txaws/client/base.py	2012-02-15 22:23:18 +0000
@@ -74,9 +74,10 @@
     @param query_factory: The class or function that produces a query
         object for making requests to the EC2 service.
     @param parser: A parser object for parsing responses from the EC2 service.
+    @param receiver_factory: Factory for receiving responses from EC2 service.
     """
     def __init__(self, creds=None, endpoint=None, query_factory=None,
-                 parser=None):
+                 parser=None, receiver_factory=None):
         if creds is None:
             creds = AWSCredentials()
         if endpoint is None:
@@ -84,6 +85,7 @@
         self.creds = creds
         self.endpoint = endpoint
         self.query_factory = query_factory
+        self.receiver_factory = receiver_factory
         self.parser = parser
 
 class StreamingError(Exception):

=== modified file 'txaws/s3/client.py'
--- txaws/s3/client.py	2012-01-28 00:39:00 +0000
+++ txaws/s3/client.py	2012-02-15 22:23:18 +0000
@@ -74,10 +74,12 @@
 class S3Client(BaseClient):
     """A client for S3."""
 
-    def __init__(self, creds=None, endpoint=None, query_factory=None):
+    def __init__(self, creds=None, endpoint=None, query_factory=None,
+        receiver_factory=None):
         if query_factory is None:
             query_factory = Query
-        super(S3Client, self).__init__(creds, endpoint, query_factory)
+        super(S3Client, self).__init__(creds, endpoint, query_factory,
+            receiver_factory=receiver_factory)
 
     def list_buckets(self):
         """
@@ -87,7 +89,8 @@
         the request.
         """
         query = self.query_factory(
-            action="GET", creds=self.creds, endpoint=self.endpoint)
+            action="GET", creds=self.creds, endpoint=self.endpoint,
+            receiver_factory=self.receiver_factory)
         d = query.submit()
         return d.addCallback(self._parse_list_buckets)
 
@@ -131,7 +134,7 @@
         """
         query = self.query_factory(
             action="GET", creds=self.creds, endpoint=self.endpoint,
-            bucket=bucket)
+            bucket=bucket, receiver_factory=self.receiver_factory)
         d = query.submit()
         return d.addCallback(self._parse_get_bucket)
 
@@ -174,7 +177,8 @@
         """
         query = self.query_factory(action="GET", creds=self.creds,
                                    endpoint=self.endpoint, bucket=bucket,
-                                   object_name="?location")
+                                   object_name="?location",
+                                   receiver_factory=self.receiver_factory)
         d = query.submit()
         return d.addCallback(self._parse_bucket_location)
 
@@ -193,7 +197,8 @@
         """
         query = self.query_factory(
             action='GET', creds=self.creds, endpoint=self.endpoint,
-            bucket=bucket, object_name='?lifecycle')
+            bucket=bucket, object_name='?lifecycle',
+            receiver_factory=self.receiver_factory)
         return query.submit().addCallback(self._parse_lifecycle_config)
 
     def _parse_lifecycle_config(self, xml_bytes):
@@ -221,7 +226,8 @@
         """
         query = self.query_factory(
             action='GET', creds=self.creds, endpoint=self.endpoint,
-            bucket=bucket, object_name='?website')
+            bucket=bucket, object_name='?website',
+            receiver_factory=self.receiver_factory)
         return query.submit().addCallback(self._parse_website_config)
 
     def _parse_website_config(self, xml_bytes):
@@ -242,7 +248,8 @@
         """
         query = self.query_factory(
             action='GET', creds=self.creds, endpoint=self.endpoint,
-            bucket=bucket, object_name='?notification')
+            bucket=bucket, object_name='?notification',
+            receiver_factory=self.receiver_factory)
         return query.submit().addCallback(self._parse_notification_config)
 
     def _parse_notification_config(self, xml_bytes):
@@ -262,7 +269,8 @@
         """
         query = self.query_factory(
             action='GET', creds=self.creds, endpoint=self.endpoint,
-            bucket=bucket, object_name='?versioning')
+            bucket=bucket, object_name='?versioning',
+            receiver_factory=self.receiver_factory)
         return query.submit().addCallback(self._parse_versioning_config)
 
     def _parse_versioning_config(self, xml_bytes):
@@ -279,7 +287,8 @@
         """
         query = self.query_factory(
             action='GET', creds=self.creds, endpoint=self.endpoint,
-            bucket=bucket, object_name='?acl')
+            bucket=bucket, object_name='?acl',
+            receiver_factory=self.receiver_factory)
         return query.submit().addCallback(self._parse_acl)
 
     def put_bucket_acl(self, bucket, access_control_policy):
@@ -289,7 +298,8 @@
         data = access_control_policy.to_xml()
         query = self.query_factory(
             action='PUT', creds=self.creds, endpoint=self.endpoint,
-            bucket=bucket, object_name='?acl', data=data)
+            bucket=bucket, object_name='?acl', data=data,
+            receiver_factory=self.receiver_factory)
         return query.submit().addCallback(self._parse_acl)
 
     def _parse_acl(self, xml_bytes):
@@ -299,8 +309,8 @@
         """
         return AccessControlPolicy.from_xml(xml_bytes)
 
-    def put_object(self, bucket, object_name, data, content_type=None,
-                   metadata={}, amz_headers={}):
+    def put_object(self, bucket, object_name, data=None, content_type=None,
+                   metadata={}, amz_headers={}, body_producer=None):
         """
         Put an object in a bucket.
 
@@ -318,7 +328,8 @@
             action="PUT", creds=self.creds, endpoint=self.endpoint,
             bucket=bucket, object_name=object_name, data=data,
             content_type=content_type, metadata=metadata,
-            amz_headers=amz_headers)
+            amz_headers=amz_headers, body_producer=body_producer,
+            receiver_factory=self.receiver_factory)
         return query.submit()
 
     def copy_object(self, source_bucket, source_object_name, dest_bucket=None,
@@ -344,7 +355,8 @@
         query = self.query_factory(
             action="PUT", creds=self.creds, endpoint=self.endpoint,
             bucket=dest_bucket, object_name=dest_object_name,
-            metadata=metadata, amz_headers=amz_headers)
+            metadata=metadata, amz_headers=amz_headers,
+            receiver_factory=self.receiver_factory)
         return query.submit()
 
     def get_object(self, bucket, object_name):
@@ -353,7 +365,8 @@
         """
         query = self.query_factory(
             action="GET", creds=self.creds, endpoint=self.endpoint,
-            bucket=bucket, object_name=object_name)
+            bucket=bucket, object_name=object_name,
+            receiver_factory=self.receiver_factory)
         return query.submit()
 
     def head_object(self, bucket, object_name):
@@ -384,7 +397,8 @@
         data = access_control_policy.to_xml()
         query = self.query_factory(
             action='PUT', creds=self.creds, endpoint=self.endpoint,
-            bucket=bucket, object_name='%s?acl' % object_name, data=data)
+            bucket=bucket, object_name='%s?acl' % object_name, data=data,
+            receiver_factory=self.receiver_factory)
         return query.submit().addCallback(self._parse_acl)
 
     def get_object_acl(self, bucket, object_name):
@@ -393,7 +407,8 @@
         """
         query = self.query_factory(
             action='GET', creds=self.creds, endpoint=self.endpoint,
-            bucket=bucket, object_name='%s?acl' % object_name)
+            bucket=bucket, object_name='%s?acl' % object_name,
+            receiver_factory=self.receiver_factory)
         return query.submit().addCallback(self._parse_acl)
 
     def put_request_payment(self, bucket, payer):
@@ -407,7 +422,8 @@
         data = RequestPayment(payer).to_xml()
         query = self.query_factory(
             action="PUT", creds=self.creds, endpoint=self.endpoint,
-            bucket=bucket, object_name="?requestPayment", data=data)
+            bucket=bucket, object_name="?requestPayment", data=data,
+            receiver_factory=self.receiver_factory)
         return query.submit()
 
     def get_request_payment(self, bucket):
@@ -419,7 +435,8 @@
         """
         query = self.query_factory(
             action="GET", creds=self.creds, endpoint=self.endpoint,
-            bucket=bucket, object_name="?requestPayment")
+            bucket=bucket, object_name="?requestPayment",
+            receiver_factory=self.receiver_factory)
         return query.submit().addCallback(self._parse_get_request_payment)
 
     def _parse_get_request_payment(self, xml_bytes):
@@ -434,12 +451,13 @@
     """A query for submission to the S3 service."""
 
     def __init__(self, bucket=None, object_name=None, data="",
-                 content_type=None, metadata={}, amz_headers={}, *args,
-                 **kwargs):
+                 content_type=None, metadata={}, amz_headers={},
+                 body_producer=None, *args, **kwargs):
         super(Query, self).__init__(*args, **kwargs)
         self.bucket = bucket
         self.object_name = object_name
         self.data = data
+        self.body_producer = body_producer
         self.content_type = content_type
         self.metadata = metadata
         self.amz_headers = amz_headers
@@ -463,9 +481,14 @@
         """
         Build the list of headers needed in order to perform S3 operations.
         """
-        headers = {"Content-Length": len(self.data),
-                   "Content-MD5": calculate_md5(self.data),
+        if self.body_producer:
+            content_length = self.body_producer.length
+        else:
+            content_length = len(self.data)
+        headers = {"Content-Length": content_length,
                    "Date": self.date}
+        if self.body_producer is None:
+            headers["Content-MD5"] = calculate_md5(self.data)
         for key, value in self.metadata.iteritems():
             headers["x-amz-meta-" + key] = value
         for key, value in self.amz_headers.iteritems():
@@ -529,5 +552,6 @@
                 self.endpoint, self.bucket, self.object_name)
         d = self.get_page(
             url_context.get_url(), method=self.action, postdata=self.data,
-            headers=self.get_headers())
+            headers=self.get_headers(), body_producer=self.body_producer,
+            receiver_factory=self.receiver_factory)
         return d.addErrback(s3_error_wrapper)

=== modified file 'txaws/s3/tests/test_client.py'
--- txaws/s3/tests/test_client.py	2012-01-28 00:44:53 +0000
+++ txaws/s3/tests/test_client.py	2012-02-15 22:23:18 +0000
@@ -10,6 +10,7 @@
     s3clientSkip = None
 from txaws.s3.acls import AccessControlPolicy
 from txaws.s3.model import RequestPayment
+from txaws.testing.producers import StringBodyProducer
 from txaws.service import AWSServiceEndpoint
 from txaws.testing import payload
 from txaws.testing.base import TXAWSTestCase
@@ -100,7 +101,8 @@
 
         class StubQuery(client.Query):
 
-            def __init__(query, action, creds, endpoint):
+            def __init__(query, action, creds, endpoint,
+                body_producer=None, receiver_factory=None):
                 super(StubQuery, query).__init__(
                     action=action, creds=creds)
                 self.assertEquals(action, "GET")
@@ -134,7 +136,8 @@
 
         class StubQuery(client.Query):
 
-            def __init__(query, action, creds, endpoint, bucket=None):
+            def __init__(query, action, creds, endpoint, bucket=None,
+                body_producer=None, receiver_factory=None):
                 super(StubQuery, query).__init__(
                     action=action, creds=creds, bucket=bucket)
                 self.assertEquals(action, "PUT")
@@ -156,7 +159,8 @@
 
         class StubQuery(client.Query):
 
-            def __init__(query, action, creds, endpoint, bucket=None):
+            def __init__(query, action, creds, endpoint, bucket=None,
+                body_producer=None, receiver_factory=None):
                 super(StubQuery, query).__init__(
                     action=action, creds=creds, bucket=bucket)
                 self.assertEquals(action, "GET")
@@ -208,7 +212,8 @@
         class StubQuery(client.Query):
 
             def __init__(query, action, creds, endpoint, bucket=None,
-                         object_name=None):
+                         object_name=None, body_producer=None,
+                         receiver_factory=None):
                 super(StubQuery, query).__init__(action=action, creds=creds,
                                                  bucket=bucket,
                                                  object_name=object_name)
@@ -243,7 +248,8 @@
         class StubQuery(client.Query):
 
             def __init__(query, action, creds, endpoint, bucket=None,
-                         object_name=None):
+                         object_name=None, body_producer=None,
+                         receiver_factory=None):
                 super(StubQuery, query).__init__(action=action, creds=creds,
                                                  bucket=bucket,
                                                  object_name=object_name)
@@ -284,7 +290,8 @@
         class StubQuery(client.Query):
 
             def __init__(query, action, creds, endpoint, bucket=None,
-                         object_name=None):
+                         object_name=None, body_producer=None,
+                         receiver_factory=None):
                 super(StubQuery, query).__init__(action=action, creds=creds,
                                                  bucket=bucket,
                                                  object_name=object_name)
@@ -323,7 +330,8 @@
         class StubQuery(client.Query):
 
             def __init__(query, action, creds, endpoint, bucket=None,
-                         object_name=None):
+                         object_name=None, body_producer=None,
+                         receiver_factory=None):
                 super(StubQuery, query).__init__(action=action, creds=creds,
                                                  bucket=bucket,
                                                  object_name=object_name)
@@ -360,7 +368,8 @@
         class StubQuery(client.Query):
 
             def __init__(query, action, creds, endpoint, bucket=None,
-                         object_name=None):
+                         object_name=None, body_producer=None,
+                         receiver_factory=None):
                 super(StubQuery, query).__init__(action=action, creds=creds,
                                                  bucket=bucket,
                                                  object_name=object_name)
@@ -396,7 +405,8 @@
         class StubQuery(client.Query):
 
             def __init__(query, action, creds, endpoint, bucket=None,
-                         object_name=None):
+                         object_name=None, body_producer=None,
+                         receiver_factory=None):
                 super(StubQuery, query).__init__(action=action, creds=creds,
                                                  bucket=bucket,
                                                  object_name=object_name)
@@ -433,7 +443,8 @@
         class StubQuery(client.Query):
 
             def __init__(query, action, creds, endpoint, bucket=None,
-                         object_name=None):
+                         object_name=None, body_producer=None,
+                         receiver_factory=None):
                 super(StubQuery, query).__init__(action=action, creds=creds,
                                                  bucket=bucket,
                                                  object_name=object_name)
@@ -473,7 +484,8 @@
         class StubQuery(client.Query):
 
             def __init__(query, action, creds, endpoint, bucket=None,
-                         object_name=None):
+                         object_name=None, body_producer=None,
+                         receiver_factory=None):
                 super(StubQuery, query).__init__(action=action, creds=creds,
                                                  bucket=bucket,
                                                  object_name=object_name)
@@ -509,7 +521,8 @@
         class StubQuery(client.Query):
 
             def __init__(query, action, creds, endpoint, bucket=None,
-                         object_name=None):
+                         object_name=None, body_producer=None,
+                         receiver_factory=None):
                 super(StubQuery, query).__init__(action=action, creds=creds,
                                                  bucket=bucket,
                                                  object_name=object_name)
@@ -546,7 +559,8 @@
         class StubQuery(client.Query):
 
             def __init__(query, action, creds, endpoint, bucket=None,
-                         object_name=None):
+                         object_name=None, body_producer=None,
+                         receiver_factory=None):
                 super(StubQuery, query).__init__(action=action, creds=creds,
                                                  bucket=bucket,
                                                  object_name=object_name)
@@ -576,7 +590,8 @@
 
         class StubQuery(client.Query):
 
-            def __init__(query, action, creds, endpoint, bucket=None):
+            def __init__(query, action, creds, endpoint, bucket=None,
+                body_producer=None, receiver_factory=None):
                 super(StubQuery, query).__init__(
                     action=action, creds=creds, bucket=bucket)
                 self.assertEquals(action, "DELETE")
@@ -599,7 +614,8 @@
         class StubQuery(client.Query):
 
             def __init__(query, action, creds, endpoint, bucket=None,
-                         object_name=None, data=""):
+                         object_name=None, data="", body_producer=None,
+                         receiver_factory=None):
                 super(StubQuery, query).__init__(action=action, creds=creds,
                                                  bucket=bucket,
                                                  object_name=object_name,
@@ -630,7 +646,8 @@
         class StubQuery(client.Query):
 
             def __init__(query, action, creds, endpoint, bucket=None,
-                         object_name=None, data=""):
+                         object_name=None, data="", receiver_factory=None,
+                         body_producer=None):
                 super(StubQuery, query).__init__(action=action, creds=creds,
                                                  bucket=bucket,
                                                  object_name=object_name,
@@ -665,7 +682,7 @@
 
             def __init__(query, action, creds, endpoint, bucket=None,
                 object_name=None, data=None, content_type=None,
-                metadata=None):
+                metadata=None, body_producer=None, receiver_factory=None):
                 super(StubQuery, query).__init__(
                     action=action, creds=creds, bucket=bucket,
                     object_name=object_name, data=data,
@@ -701,7 +718,7 @@
 
             def __init__(query, action, creds, endpoint, bucket=None,
                 object_name=None, data=None, content_type=None,
-                metadata=None):
+                metadata=None, body_producer=None, receiver_factory=None):
                 super(StubQuery, query).__init__(
                     action=action, creds=creds, bucket=bucket,
                     object_name=object_name, data=data,
@@ -730,7 +747,8 @@
 
             def __init__(query, action, creds, endpoint, bucket=None,
                 object_name=None, data=None, content_type=None,
-                metadata=None, amz_headers=None):
+                metadata=None, amz_headers=None, body_producer=None,
+                receiver_factory=None):
                 super(StubQuery, query).__init__(
                     action=action, creds=creds, bucket=bucket,
                     object_name=object_name, data=data,
@@ -756,6 +774,42 @@
                              metadata={"key": "some meta data"},
                              amz_headers={"acl": "public-read"})
 
+    def test_put_object_with_custom_body_producer(self):
+
+        class StubQuery(client.Query):
+
+            def __init__(query, action, creds, endpoint, bucket=None,
+                object_name=None, data=None, content_type=None,
+                metadata=None, amz_headers=None, body_producer=None,
+                receiver_factory=None):
+                super(StubQuery, query).__init__(
+                    action=action, creds=creds, bucket=bucket,
+                    object_name=object_name, data=data,
+                    content_type=content_type, metadata=metadata,
+                    amz_headers=amz_headers, body_producer=body_producer)
+                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, "objectname")
+                self.assertEqual(query.content_type, "text/plain")
+                self.assertEqual(query.metadata, {"key": "some meta data"})
+                self.assertEqual(query.amz_headers, {"acl": "public-read"})
+                self.assertIdentical(body_producer, string_producer)
+
+            def submit(query):
+                return succeed(None)
+
+
+        string_producer = StringBodyProducer("some data")
+        creds = AWSCredentials("foo", "bar")
+        s3 = client.S3Client(creds, query_factory=StubQuery)
+        return s3.put_object("mybucket", "objectname",
+                             content_type="text/plain",
+                             metadata={"key": "some meta data"},
+                             amz_headers={"acl": "public-read"},
+                             body_producer=string_producer)
+
     def test_copy_object(self):
         """
         L{S3Client.copy_object} creates a L{Query} to copy an object from one
@@ -766,7 +820,8 @@
 
             def __init__(query, action, creds, endpoint, bucket=None,
                 object_name=None, data=None, content_type=None,
-                metadata=None, amz_headers=None):
+                metadata=None, amz_headers=None, body_producer=None,
+                receiver_factory=None):
                 super(StubQuery, query).__init__(
                     action=action, creds=creds, bucket=bucket,
                     object_name=object_name, data=data,
@@ -798,7 +853,8 @@
 
             def __init__(query, action, creds, endpoint, bucket=None,
                 object_name=None, data=None, content_type=None,
-                metadata=None, amz_headers=None):
+                metadata=None, amz_headers=None, body_producer=None,
+                receiver_factory=None):
                 super(StubQuery, query).__init__(
                     action=action, creds=creds, bucket=bucket,
                     object_name=object_name, data=data,
@@ -822,7 +878,7 @@
 
             def __init__(query, action, creds, endpoint, bucket=None,
                 object_name=None, data=None, content_type=None,
-                metadata=None):
+                metadata=None, body_producer=None, receiver_factory=None):
                 super(StubQuery, query).__init__(
                     action=action, creds=creds, bucket=bucket,
                     object_name=object_name, data=data,
@@ -846,7 +902,7 @@
 
             def __init__(query, action, creds, endpoint, bucket=None,
                 object_name=None, data=None, content_type=None,
-                metadata=None):
+                metadata=None, body_producer=None, receiver_factory=None):
                 super(StubQuery, query).__init__(
                     action=action, creds=creds, bucket=bucket,
                     object_name=object_name, data=data,
@@ -869,7 +925,8 @@
         class StubQuery(client.Query):
 
             def __init__(query, action, creds, endpoint, bucket=None,
-                         object_name=None, data=""):
+                         object_name=None, data="", body_producer=None,
+                         receiver_factory=None):
                 super(StubQuery, query).__init__(action=action, creds=creds,
                                                  bucket=bucket,
                                                  object_name=object_name,
@@ -902,7 +959,8 @@
         class StubQuery(client.Query):
 
             def __init__(query, action, creds, endpoint, bucket=None,
-                         object_name=None, data=""):
+                         object_name=None, data="", body_producer=None,
+                         receiver_factory=None):
                 super(StubQuery, query).__init__(action=action, creds=creds,
                                                  bucket=bucket,
                                                  object_name=object_name,
@@ -1077,7 +1135,8 @@
         """
         class StubQuery(client.Query):
 
-            def __init__(query, action, creds, endpoint, bucket):
+            def __init__(query, action, creds, endpoint, bucket,
+                body_producer=None, receiver_factory=None):
                 super(StubQuery, query).__init__(
                     action=action, creds=creds, bucket=bucket)
                 self.assertEquals(action, "GET")