Skip to content

Conversation

@simonzack
Copy link

Inspired by @t0m's efforts, I've ported over everything except for the cython stuff to python 3 this weekend, so that all unit tests pass on python 3.4 and 2.6, except for the following which I don't have the appropriate setup and haven't tested:

pyamf/tests/adapters/test_django.py
pyamf/tests/adapters/test_elixir.py
pyamf/tests/adapters/test_google.py
pyamf/tests/adapters/test_sqlalchemy.py
pyamf/tests/gateway/*

It's not intended to be compatible for pythons <=2.5 and there are too many compatibility issues there with python 3, I hope this is ok (I think lots of packages aiming to support python 2 & 3 do the same thing).

Issue #24.

@simonzack simonzack changed the title Ported to python 3, compatible with python 2, #24 Ported to python 3, compatible with python 2 Jan 23, 2015
Conflicts:
	distribute_setup.py
	pyamf/adapters/_django_utils_translation.py
	pyamf/alias.py
	pyamf/amf3.py
@njoyce
Copy link
Member

njoyce commented Jan 23, 2015

This is awesome!

I know what I will be doing this weekend ..

@simonzack
Copy link
Author

Glad you're interested :)

@yan12125
Copy link

yan12125 commented Jun 6, 2015

Just a bump. Any progress on this PR?

With some additional modifications:

diff --git a/pyamf/__init__.py b/pyamf/__init__.py
index 738c5b6..caba861 100644
--- a/pyamf/__init__.py
+++ b/pyamf/__init__.py
@@ -13,7 +13,7 @@ is compatible with the Adobe U{Flash Player

 import types
 import inspect
-from six import iteritems
+from six import iteritems, text_type

 from pyamf import util, _version
 from pyamf.adapters import register_adapters
@@ -238,7 +238,7 @@ class ErrorAlias(ClassAlias):
     def getEncodableAttributes(self, obj, **kwargs):
         attrs = ClassAlias.getEncodableAttributes(self, obj, **kwargs)

-        attrs['message'] = unicode(obj)
+        attrs['message'] = text_type(obj)
         attrs['name'] = obj.__class__.__name__

         return attrs
diff --git a/pyamf/remoting/gateway/__init__.py b/pyamf/remoting/gateway/__init__.py
index 924fe63..f6e1911 100644
--- a/pyamf/remoting/gateway/__init__.py
+++ b/pyamf/remoting/gateway/__init__.py
@@ -317,7 +317,10 @@ class BaseGateway(object):
             if isinstance(service, class_types):
                 name = service.__name__
             elif isinstance(service, types.FunctionType):
-                name = service.func_name
+                if hasattr(service, 'func_name'):
+                    name = service.func_name
+                else:
+                    name = service.__name__
             elif isinstance(service, types.ModuleType):
                 name = service.__name__
             else:
diff --git a/pyamf/tests/gateway/test_django.py b/pyamf/tests/gateway/test_django.py
index 04f18cb..38c9edd 100644
--- a/pyamf/tests/gateway/test_django.py
+++ b/pyamf/tests/gateway/test_django.py
@@ -16,7 +16,10 @@ import os
 try:
     from cStringIO import StringIO
 except ImportError:
-    from StringIO import StringIO
+    try:
+        from StringIO import StringIO
+    except ImportError:
+        from io import StringIO

 try:
     import django as _django
diff --git a/pyamf/tests/gateway/test_wsgi.py b/pyamf/tests/gateway/test_wsgi.py
index 2f16088..3b661a8 100644
--- a/pyamf/tests/gateway/test_wsgi.py
+++ b/pyamf/tests/gateway/test_wsgi.py
@@ -81,7 +81,7 @@ class WSGIServerTestCase(unittest.TestCase):

         response = self.doRequest(request, start_response)

-        envelope = remoting.decode(''.join(response))
+        envelope = remoting.decode(b''.join(response))

         message = envelope['/1']

@@ -184,7 +184,7 @@ class WSGIServerTestCase(unittest.TestCase):
         self.gw.timezone_offset = -18000

         response = self.doRequest(self.makeRequest('echo', now), None)
-        envelope = remoting.decode(''.join(response))
+        envelope = remoting.decode(b''.join(response))
         message = envelope['/1']

         self.assertEqual(message.body, now)
diff --git a/pyamf/util/pure.py b/pyamf/util/pure.py
index bde9bbf..9579c82 100644
--- a/pyamf/util/pure.py
+++ b/pyamf/util/pure.py
@@ -118,6 +118,8 @@ class BytesIOProxy(object):

         @param s: Raw bytes
         """
+        if isinstance(s, text_type):
+            s = s.encode('utf-8', 'replace')
         self._buffer.write(s)
         self._len_changed = True

diff --git a/setup.py b/setup.py
index b46cf8c..59bdde7 100644
--- a/setup.py
+++ b/setup.py
@@ -68,7 +68,7 @@ def setup_package():
         zip_safe=False,
         extras_require=setupinfo.get_extras_require(),
         classifiers=(
-            filter(None, classifiers.strip().split('\n')) +
+            list(filter(None, classifiers.strip().split('\n'))) +
             setupinfo.get_trove_classifiers()
         ),
         **setupinfo.extra_setup_args())

Both python2 setup.py test and python3 setup.py test pass.

I'm using Python 3.4.3 and Python 2.7.10 on Arch Linux. None of cython, django, sqlalchemy, twisted and gae_sdk is installed on my machine.

@yan12125
Copy link

yan12125 commented Jun 6, 2015

Well, I think the patch for setup.py in #54 is better. Ignore mine.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants