txawsteam team mailing list archive
-
txawsteam team
-
Mailing list archive
-
Message #00014
[Merge] lp:~oubiwann/txaws/413738-method-name-cleanup into lp:txaws
Duncan McGreggor has proposed merging lp:~oubiwann/txaws/413738-method-name-cleanup into lp:txaws.
Requested reviews:
txAWS Team (txawsteam)
This is ready for review. The PEP-8 path was chosen instead of the Twisted coding standard.
--
https://code.launchpad.net/~oubiwann/txaws/413738-method-name-cleanup/+merge/10245
Your team txAWS Team is subscribed to branch lp:txaws.
=== modified file 'txaws/storage/client.py'
--- txaws/storage/client.py 2009-04-27 08:53:11 +0000
+++ txaws/storage/client.py 2009-08-17 12:49:40 +0000
@@ -7,111 +7,107 @@
functionality in this wrapper.
"""
-
from hashlib import md5
from base64 import b64encode
-
from epsilon.extime import Time
from twisted.web.client import getPage
from twisted.web.http import datetimeToString
+from txaws.util import XML, calculate_md5
from txaws.credentials import AWSCredentials
-from txaws.util import XML
-
-
-def calculateMD5(data):
- digest = md5(data).digest()
- return b64encode(digest)
+
+
+NS = '{http://s3.amazonaws.com/doc/2006-03-01/}'
class S3Request(object):
- def __init__(self, verb, bucket=None, objectName=None, data='',
- contentType=None, metadata={}, rootURI='https://s3.amazonaws.com',
- creds=None):
+
+ def __init__(
+ self, verb, bucket=None, object_name=None, data='', content_type=None,
+ metadata={}, root_uri='https://s3.amazonaws.com', creds=None):
self.verb = verb
self.bucket = bucket
- self.objectName = objectName
+ self.object_name = object_name
self.data = data
- self.contentType = contentType
+ self.content_type = content_type
self.metadata = metadata
- self.rootURI = rootURI
+ self.root_uri = root_uri
self.creds = creds
self.date = datetimeToString()
- def getURIPath(self):
+ def get_uri_path(self):
path = '/'
if self.bucket is not None:
path += self.bucket
- if self.objectName is not None:
- path += '/' + self.objectName
+ if self.object_name is not None:
+ path += '/' + self.object_name
return path
- def getURI(self):
- return self.rootURI + self.getURIPath()
+ def get_uri(self):
+ return self.root_uri + self.get_uri_path()
- def getHeaders(self):
+ def get_headers(self):
headers = {'Content-Length': len(self.data),
- 'Content-MD5': calculateMD5(self.data),
+ 'Content-MD5': calculate_md5(self.data),
'Date': self.date}
for key, value in self.metadata.iteritems():
headers['x-amz-meta-' + key] = value
- if self.contentType is not None:
- headers['Content-Type'] = self.contentType
+ if self.content_type is not None:
+ headers['Content-Type'] = self.content_type
if self.creds is not None:
- signature = self.getSignature(headers)
+ signature = self.get_signature(headers)
headers['Authorization'] = 'AWS %s:%s' % (self.creds.access_key, signature)
return headers
- def getCanonicalizedResource(self):
- return self.getURIPath()
+ def get_canonicalized_resource(self):
+ return self.get_uri_path()
- def getCanonicalizedAmzHeaders(self, headers):
+ def get_canonicalized_amz_headers(self, headers):
result = ''
headers = [(name.lower(), value) for name, value in headers.iteritems() if name.lower().startswith('x-amz-')]
headers.sort()
return ''.join('%s:%s\n' % (name, value) for name, value in headers)
- def getSignature(self, headers):
+ def get_signature(self, headers):
text = self.verb + '\n'
text += headers.get('Content-MD5', '') + '\n'
text += headers.get('Content-Type', '') + '\n'
text += headers.get('Date', '') + '\n'
- text += self.getCanonicalizedAmzHeaders(headers)
- text += self.getCanonicalizedResource()
+ text += self.get_canonicalized_amz_headers(headers)
+ text += self.get_canonicalized_resource()
return self.creds.sign(text)
def submit(self):
- return self.getPage(url=self.getURI(), method=self.verb, postdata=self.data, headers=self.getHeaders())
+ return self.get_page(url=self.get_uri(), method=self.verb, postdata=self.data, headers=self.get_headers())
- def getPage(self, *a, **kw):
+ def get_page(self, *a, **kw):
return getPage(*a, **kw)
-NS = '{http://s3.amazonaws.com/doc/2006-03-01/}'
-
class S3(object):
- rootURI = 'https://s3.amazonaws.com/'
- requestFactory = S3Request
+
+ root_uri = 'https://s3.amazonaws.com/'
+ request_factory = S3Request
def __init__(self, creds):
self.creds = creds
- def makeRequest(self, *a, **kw):
+ def make_request(self, *a, **kw):
"""
Create a request with the arguments passed in.
- This uses the requestFactory attribute, adding the credentials to the
+ This uses the request_factory attribute, adding the credentials to the
arguments passed in.
"""
- return self.requestFactory(creds=self.creds, *a, **kw)
+ return self.request_factory(creds=self.creds, *a, **kw)
- def _parseBucketList(self, response):
+ def _parse_bucket_list(self, response):
"""
Parse XML bucket list response.
"""
@@ -120,57 +116,57 @@
yield {'name': bucket.findtext(NS + 'Name'),
'created': Time.fromISO8601TimeAndDate(bucket.findtext(NS + 'CreationDate'))}
- def listBuckets(self):
+ def list_buckets(self):
"""
List all buckets.
Returns a list of all the buckets owned by the authenticated sender of
the request.
"""
- return self.makeRequest('GET').submit().addCallback(self._parseBucketList)
+ return self.make_request('GET').submit().addCallback(self._parse_bucket_list)
- def createBucket(self, bucket):
+ def create_bucket(self, bucket):
"""
Create a new bucket.
"""
- return self.makeRequest('PUT', bucket).submit()
+ return self.make_request('PUT', bucket).submit()
- def deleteBucket(self, bucket):
+ def delete_bucket(self, bucket):
"""
Delete a bucket.
The bucket must be empty before it can be deleted.
"""
- return self.makeRequest('DELETE', bucket).submit()
+ return self.make_request('DELETE', bucket).submit()
- def putObject(self, bucket, objectName, data, contentType=None, metadata={}):
+ def put_object(self, bucket, object_name, data, content_type=None, metadata={}):
"""
Put an object in a bucket.
Any existing object of the same name will be replaced.
"""
- return self.makeRequest('PUT', bucket, objectName, data, contentType, metadata).submit()
+ return self.make_request('PUT', bucket, object_name, data, content_type, metadata).submit()
- def getObject(self, bucket, objectName):
+ def get_object(self, bucket, object_name):
"""
Get an object from a bucket.
"""
- return self.makeRequest('GET', bucket, objectName).submit()
+ return self.make_request('GET', bucket, object_name).submit()
- def headObject(self, bucket, objectName):
+ def head_object(self, bucket, object_name):
"""
Retrieve object metadata only.
- This is like getObject, but the object's content is not retrieved.
+ This is like get_object, but the object's content is not retrieved.
Currently the metadata is not returned to the caller either, so this
method is mostly useless, and only provided for completeness.
"""
- return self.makeRequest('HEAD', bucket, objectName).submit()
+ return self.make_request('HEAD', bucket, object_name).submit()
- def deleteObject(self, bucket, objectName):
+ def delete_object(self, bucket, object_name):
"""
Delete an object from a bucket.
Once deleted, there is no method to restore or undelete an object.
"""
- return self.makeRequest('DELETE', bucket, objectName).submit()
+ return self.make_request('DELETE', bucket, object_name).submit()
=== modified file 'txaws/storage/test/test_client.py'
--- txaws/storage/test/test_client.py 2009-04-26 08:32:36 +0000
+++ txaws/storage/test/test_client.py 2009-08-17 12:49:40 +0000
@@ -4,17 +4,21 @@
from twisted.internet.defer import succeed
+from txaws.util import calculate_md5
+from txaws.tests import TXAWSTestCase
from txaws.credentials import AWSCredentials
-from txaws.tests import TXAWSTestCase
-from txaws.storage.client import S3, S3Request, calculateMD5
+from txaws.storage.client import S3, S3Request
+
class StubbedS3Request(S3Request):
- def getPage(self, url, method, postdata, headers):
+
+ def get_page(self, url, method, postdata, headers):
self.getPageArgs = (url, method, postdata, headers)
return succeed('')
class RequestTests(TXAWSTestCase):
+
creds = AWSCredentials(access_key='0PN5J17HBGZHT7JJ3X82',
secret_key='uV3F3YluFJax1cknvbcGwgjvx4QpvB+leU8dUj2o')
@@ -25,10 +29,10 @@
DATA = 'objectData'
DIGEST = 'zhdB6gwvocWv/ourYUWMxA=='
- request = S3Request('PUT', 'somebucket', 'object/name/here', DATA, contentType='text/plain', metadata={'foo': 'bar'})
+ request = S3Request('PUT', 'somebucket', 'object/name/here', DATA, content_type='text/plain', metadata={'foo': 'bar'})
self.assertEqual(request.verb, 'PUT')
- self.assertEqual(request.getURI(), 'https://s3.amazonaws.com/somebucket/object/name/here')
- headers = request.getHeaders()
+ self.assertEqual(request.get_uri(), 'https://s3.amazonaws.com/somebucket/object/name/here')
+ headers = request.get_headers()
self.assertNotEqual(headers.pop('Date'), '')
self.assertEqual(headers,
{'Content-Type': 'text/plain',
@@ -45,8 +49,8 @@
request = S3Request('GET', 'somebucket')
self.assertEqual(request.verb, 'GET')
- self.assertEqual(request.getURI(), 'https://s3.amazonaws.com/somebucket')
- headers = request.getHeaders()
+ self.assertEqual(request.get_uri(), 'https://s3.amazonaws.com/somebucket')
+ headers = request.get_headers()
self.assertNotEqual(headers.pop('Date'), '')
self.assertEqual(headers,
{'Content-Length': 0,
@@ -63,10 +67,10 @@
self.assertEqual(result, '')
url, method, postdata, headers = request.getPageArgs
- self.assertEqual(url, request.getURI())
+ self.assertEqual(url, request.get_uri())
self.assertEqual(method, request.verb)
self.assertEqual(postdata, request.data)
- self.assertEqual(headers, request.getHeaders())
+ self.assertEqual(headers, request.get_headers())
return request.submit().addCallback(_postCheck)
@@ -74,7 +78,7 @@
req = S3Request('GET', creds=self.creds)
req.date = 'Wed, 28 Mar 2007 01:29:59 +0000'
- headers = req.getHeaders()
+ headers = req.get_headers()
self.assertEqual(headers['Authorization'], 'AWS 0PN5J17HBGZHT7JJ3X82:jF7L3z/FTV47vagZzhKupJ9oNig=')
@@ -102,13 +106,13 @@
"""
Testable version of S3.
- This subclass stubs requestFactory to use InertRequest, making it easy to
+ This subclass stubs request_factory to use InertRequest, making it easy to
assert things about the requests that are created in response to various
operations.
"""
response = None
- def requestFactory(self, *a, **kw):
+ def request_factory(self, *a, **kw):
req = InertRequest(response=self.response, *a, **kw)
self._lastRequest = req
return req
@@ -143,9 +147,9 @@
self.creds = AWSCredentials(access_key='accessKey', secret_key='secretKey')
self.s3 = TestableS3(creds=self.creds)
- def test_makeRequest(self):
+ def test_make_request(self):
"""
- Test that makeRequest passes in the service credentials.
+ Test that make_request passes in the service credentials.
"""
marker = object()
@@ -153,79 +157,79 @@
self.assertEqual(kw['creds'], self.creds)
return marker
- self.s3.requestFactory = _cb
- self.assertIdentical(self.s3.makeRequest('GET'), marker)
+ self.s3.request_factory = _cb
+ self.assertIdentical(self.s3.make_request('GET'), marker)
- def test_listBuckets(self):
+ def test_list_buckets(self):
self.s3.response = samples['ListAllMyBucketsResult']
- d = self.s3.listBuckets()
+ d = self.s3.list_buckets()
req = self.s3._lastRequest
self.assertTrue(req.submitted)
self.assertEqual(req.verb, 'GET')
self.assertEqual(req.bucket, None)
- self.assertEqual(req.objectName, None)
+ self.assertEqual(req.object_name, None)
- def _checkResult(buckets):
+ def _check_result(buckets):
self.assertEqual(list(buckets),
[{'name': u'quotes',
'created': Time.fromDatetime(datetime(2006, 2, 3, 16, 45, 9))},
{'name': u'samples',
'created': Time.fromDatetime(datetime(2006, 2, 3, 16, 41, 58))}])
- return d.addCallback(_checkResult)
+ return d.addCallback(_check_result)
- def test_createBucket(self):
- self.s3.createBucket('foo')
+ def test_create_bucket(self):
+ self.s3.create_bucket('foo')
req = self.s3._lastRequest
self.assertTrue(req.submitted)
self.assertEqual(req.verb, 'PUT')
self.assertEqual(req.bucket, 'foo')
- self.assertEqual(req.objectName, None)
+ self.assertEqual(req.object_name, None)
- def test_deleteBucket(self):
- self.s3.deleteBucket('foo')
+ def test_delete_bucket(self):
+ self.s3.delete_bucket('foo')
req = self.s3._lastRequest
self.assertTrue(req.submitted)
self.assertEqual(req.verb, 'DELETE')
self.assertEqual(req.bucket, 'foo')
- self.assertEqual(req.objectName, None)
+ self.assertEqual(req.object_name, None)
- def test_putObject(self):
- self.s3.putObject('foobucket', 'foo', 'data', 'text/plain', {'foo': 'bar'})
+ def test_put_object(self):
+ self.s3.put_object('foobucket', 'foo', 'data', 'text/plain', {'foo': 'bar'})
req = self.s3._lastRequest
self.assertTrue(req.submitted)
self.assertEqual(req.verb, 'PUT')
self.assertEqual(req.bucket, 'foobucket')
- self.assertEqual(req.objectName, 'foo')
+ self.assertEqual(req.object_name, 'foo')
self.assertEqual(req.data, 'data')
- self.assertEqual(req.contentType, 'text/plain')
+ self.assertEqual(req.content_type, 'text/plain')
self.assertEqual(req.metadata, {'foo': 'bar'})
- def test_getObject(self):
- self.s3.getObject('foobucket', 'foo')
+ def test_get_object(self):
+ self.s3.get_object('foobucket', 'foo')
req = self.s3._lastRequest
self.assertTrue(req.submitted)
self.assertEqual(req.verb, 'GET')
self.assertEqual(req.bucket, 'foobucket')
- self.assertEqual(req.objectName, 'foo')
+ self.assertEqual(req.object_name, 'foo')
- def test_headObject(self):
- self.s3.headObject('foobucket', 'foo')
+ def test_head_object(self):
+ self.s3.head_object('foobucket', 'foo')
req = self.s3._lastRequest
self.assertTrue(req.submitted)
self.assertEqual(req.verb, 'HEAD')
self.assertEqual(req.bucket, 'foobucket')
- self.assertEqual(req.objectName, 'foo')
+ self.assertEqual(req.object_name, 'foo')
- def test_deleteObject(self):
- self.s3.deleteObject('foobucket', 'foo')
+ def test_delete_object(self):
+ self.s3.delete_object('foobucket', 'foo')
req = self.s3._lastRequest
self.assertTrue(req.submitted)
self.assertEqual(req.verb, 'DELETE')
self.assertEqual(req.bucket, 'foobucket')
- self.assertEqual(req.objectName, 'foo')
+ self.assertEqual(req.object_name, 'foo')
class MiscellaneousTests(TXAWSTestCase):
def test_contentMD5(self):
- self.assertEqual(calculateMD5('somedata'), 'rvr3UC1SmUw7AZV2NqPN0g==')
+ self.assertEqual(calculate_md5('somedata'), 'rvr3UC1SmUw7AZV2NqPN0g==')
=== modified file 'txaws/util.py'
--- txaws/util.py 2009-04-27 08:53:11 +0000
+++ txaws/util.py 2009-08-17 12:49:40 +0000
@@ -6,16 +6,23 @@
__all__ = ['hmac_sha1', 'iso8601time']
+import time
+import hmac
+from hashlib import sha1, md5
from base64 import b64encode
-from hashlib import sha1
-import hmac
-import time
+
# Import XML from somwhere; here in one place to prevent duplication.
try:
from xml.etree.ElementTree import XML
except ImportError:
from elementtree.ElementTree import XML
+
+def calculate_md5(data):
+ digest = md5(data).digest()
+ return b64encode(digest)
+
+
def hmac_sha1(secret, data):
digest = hmac.new(secret, data, sha1).digest()
return b64encode(digest)
Follow ups