Skip to content

Commit 7654bb7

Browse files
committed
Added Python 3 support with six
1 parent 316bd48 commit 7654bb7

File tree

7 files changed

+54
-63
lines changed

7 files changed

+54
-63
lines changed

cloudfn/django_handler.py

+4-2
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,10 @@
1-
import sys
21
import json
3-
from wsgi_util import wsgi
2+
import sys
3+
44
from django.core.handlers.wsgi import WSGIRequest
55

6+
from wsgi_util import wsgi
7+
68

79
def handle_http_event(app):
810
environ = wsgi(json.loads(sys.stdin.read()))

cloudfn/flask_handler.py

+6-4
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,11 @@
1-
# from wsgi_util import wsgi
21
import json
32
import sys
4-
from urlparse import urlparse
53
from io import StringIO
4+
5+
import six
6+
from six.moves.urllib_parse import urlparse
67
from werkzeug.datastructures import Headers
8+
# from wsgi_util import wsgi
79

810

911
def handle_http_event(app):
@@ -18,7 +20,7 @@ def handle_http_event(app):
1820
req_headers = req_json.get('headers', None)
1921
h = Headers()
2022
if req_headers is not None:
21-
for key, value in req_headers.iteritems():
23+
for key, value in six.iteritems(req_headers):
2224
h.add(key, value)
2325

2426
with app.test_request_context(
@@ -37,7 +39,7 @@ def handle_http_event(app):
3739
headers = {}
3840
for header in resp.headers:
3941
if header[0] in headers:
40-
headers[header[0]] = headers[header[0]] + ', ' + header[1]
42+
headers[header[0]] += ', ' + header[1]
4143
else:
4244
headers[header[0]] = header[1]
4345

cloudfn/http.py

+10-9
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
1-
import sys
21
import json
3-
from urlparse import urlparse
2+
import sys
3+
4+
import six
5+
from six.moves.urllib_parse import urlparse
46

57

68
class Request:
@@ -23,13 +25,12 @@ def __init__(self, raw_json):
2325

2426

2527
class Response:
26-
def __init__(self, headers={}, body='', status_code=200):
27-
self.headers = headers
28-
self.body = body
29-
if not isinstance(self.body, basestring) \
30-
and not isinstance(self.body, dict) \
31-
and not isinstance(self.body, list):
32-
self.body = str(self.body)
28+
def __init__(self, headers=None, body='', status_code=200):
29+
self.headers = {} if headers is None else headers
30+
if isinstance(body, (six.text_type, six.binary_type, dict, list)):
31+
self.body = body
32+
else:
33+
self.body = str(body)
3334
self.status_code = status_code
3435

3536
def _json_string(self):

cloudfn/pubsub.py

+2-1
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
1-
import sys
21
import json
2+
import sys
3+
34
from dateutil.parser import parse
45

56

cloudfn/storage.py

+27-45
Original file line numberDiff line numberDiff line change
@@ -1,52 +1,39 @@
1-
import sys
21
import json
2+
import sys
3+
34
from dateutil.parser import parse
45

56

7+
def _update_attributes(obj, d, keys, default=None):
8+
"""Updates the attributes of `obj` with keys from `d` in camelCase. """
9+
for key in keys:
10+
parts = key.split('_')
11+
camel_case = parts[0] + ''.join(map(str.title, parts[1:]))
12+
setattr(obj, key, d.get(camel_case, default))
13+
14+
615
class ACL:
16+
__ATTRIBUTES = (
17+
'kind', 'id', 'self_link', 'bucket', 'object', 'generation', 'entity',
18+
'role', 'email', 'entity_id', 'domain', 'project_team', 'etag'
19+
)
20+
721
def __init__(self, raw_json):
8-
self.kind = raw_json.get('kind', None)
9-
self.id = raw_json.get('id', None)
10-
self.self_link = raw_json.get('selfLink', None)
11-
self.bucket = raw_json.get('bucket', None)
12-
self.object = raw_json.get('object', None)
13-
self.generation = raw_json.get('generation', None)
14-
self.entity = raw_json.get('entity', None)
15-
self.role = raw_json.get('role', None)
16-
self.email = raw_json.get('email', None)
17-
self.entity_id = raw_json.get('entityId', None)
18-
self.domain = raw_json.get('domain', None)
19-
self.project_team = raw_json.get('projectTeam', None)
20-
self.etag = raw_json.get('etag', None)
22+
_update_attributes(self, raw_json, self.__ATTRIBUTES)
2123

2224

2325
class Object:
26+
__ATTRIBUTES = (
27+
'kind', 'id', 'self_link', 'bucket', 'object', 'generation',
28+
'metageneration', 'content_type', 'time_created', 'updated',
29+
'time_deleted', 'storage_class', 'time_storage_class_updated', 'size',
30+
'md5_hash', 'media_link', 'content_encoding', 'content_disposition',
31+
'content_language', 'cache_control', 'metadata', 'owner', 'crc32c',
32+
'component_count', 'customer_encryption'
33+
)
34+
2435
def __init__(self, raw_json):
25-
self.kind = raw_json.get('kind', None)
26-
self.id = raw_json.get('id', None)
27-
self.self_link = raw_json.get('selfLink', None)
28-
self.bucket = raw_json.get('bucket', None)
29-
self.generation = raw_json.get('generation', None)
30-
self.metageneration = raw_json.get('metageneration', None)
31-
self.content_type = raw_json.get('contentType', None)
32-
self.time_created = raw_json.get('timeCreated', None)
33-
self.updated = raw_json.get('updated', None)
34-
self.time_deleted = raw_json.get('timeDeleted', None)
35-
self.storage_class = raw_json.get('storageClass', None)
36-
self.time_storage_class_updated = \
37-
raw_json.get('timeStorageClassUpdated', None)
38-
self.size = raw_json.get('size', None)
39-
self.md5_hash = raw_json.get('md5_hash', None)
40-
self.media_link = raw_json.get('mediaLink', None)
41-
self.content_encoding = raw_json.get('contentEncoding', None)
42-
self.content_disposition = raw_json.get('contentDisposition', None)
43-
self.content_language = raw_json.get('contentLanguage', None)
44-
self.cache_control = raw_json.get('cacheControl', None)
45-
self.metadata = raw_json.get('metadata', None)
46-
self.owner = raw_json.get('owner', None)
47-
self.crc32c = raw_json.get('crc32c', None)
48-
self.component_count = raw_json.get('componentCount', None)
49-
self.customer_encryption = raw_json.get('customerEncryption', None)
36+
_update_attributes(self, raw_json, self.__ATTRIBUTES)
5037

5138
if self.time_created is not None:
5239
self.time_created = parse(self.time_created)
@@ -58,12 +45,7 @@ def __init__(self, raw_json):
5845
self.time_storage_class_updated = \
5946
parse(self.time_storage_class_updated)
6047

61-
self.acl = []
62-
acl = raw_json.get('acl', None)
63-
64-
if acl is not None:
65-
for a in acl:
66-
self.acl.append(ACL(a))
48+
self.acl = list(map(ACL, raw_json.get('acl') or []))
6749

6850

6951
def handle_bucket_event(handle_fn):

cloudfn/wsgi_util.py

+4-2
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,9 @@
1-
from urlparse import urlparse
21
import sys
32
from io import BytesIO
43

4+
import six
5+
from six.moves.urllib_parse import urlparse
6+
57

68
def wsgi(raw_json):
79
components = urlparse(raw_json['url'])
@@ -34,6 +36,6 @@ def wsgi(raw_json):
3436
}
3537
headers = raw_json.get('headers', None)
3638
if headers is not None:
37-
for key, value in headers.iteritems():
39+
for key, value in six.iteritems(headers):
3840
environ['HTTP_' + key.replace('-', '_').upper()] = value
3941
return environ

setup.py

+1
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020
'python-dateutil==2.6.0',
2121
'werkzeug==0.12',
2222
'django==1.11.1',
23+
'six==1.10.0'
2324
],
2425
include_package_data=True,
2526
packages=['cloudfn'],

0 commit comments

Comments
 (0)