From: Bradley M. Froehle <brad.froehle@gmail.com>
Subject: Safer Cython version check
 The Cython version check breaks with certain pre-release versions of Cython.
Origin: upstream, http://code.google.com/p/mpi4py/source/detail?r=841e9df9c4a3
Bug: http://code.google.com/p/mpi4py/issues/detail?id=27
--- a/setup.py
+++ b/setup.py
@@ -459,9 +459,10 @@ def run_setup():
           **metadata)
 
 def chk_cython(VERSION):
-    CYTHON_VERSION_REQUIRED = VERSION
+    import re
     from distutils import log
-    from distutils.version import StrictVersion as Version
+    from distutils.version import LooseVersion
+    from distutils.version import StrictVersion
     warn = lambda msg='': sys.stderr.write(msg+'\n')
     #
     cython_zip = 'cython.zip'
@@ -486,17 +487,20 @@ def chk_cython(VERSION):
         CYTHON_VERSION = Cython.__version__
     except AttributeError:
         from Cython.Compiler.Version import version as CYTHON_VERSION
-    CYTHON_VERSION = CYTHON_VERSION.split('+', 1)[0]
-    for s in ('.alpha', 'alpha'):
-        CYTHON_VERSION = CYTHON_VERSION.replace(s, 'a')
-    for s in ('.beta',  'beta', '.rc', 'rc', '.c', 'c'):
-        CYTHON_VERSION = CYTHON_VERSION.replace(s, 'b')
-    if (CYTHON_VERSION_REQUIRED is not None and
-        Version(CYTHON_VERSION) < Version(CYTHON_VERSION_REQUIRED)):
+    REQUIRED = VERSION
+    m = re.match(r"(\d+\.\d+(?:\.\d+)?).*", CYTHON_VERSION)
+    if m:
+        Version = StrictVersion
+        AVAILABLE = m.groups()[0]
+    else:
+        Version = LooseVersion
+        AVAILABLE = CYTHON_VERSION
+    if (REQUIRED is not None and
+        Version(AVAILABLE) < Version(REQUIRED)):
         warn("*"*80)
         warn()
         warn(" You need to install Cython %s (you have version %s)"
-             % (CYTHON_VERSION_REQUIRED, CYTHON_VERSION))
+             % (REQUIRED, CYTHON_VERSION))
         warn(" Download and install Cython <http://www.cython.org>")
         warn()
         warn("*"*80)
