Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Ported to python 3, compatible with python 2 #41

Open
wants to merge 24 commits into
base: master
Choose a base branch
from

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