[PATCH 3 of 6 rememberme] [pkg] Make cube Python3-installable

Denis Laxalde denis.laxalde at logilab.fr
Mon Jun 4 12:06:56 CEST 2018


# HG changeset patch
# User Denis Laxalde <denis.laxalde at logilab.fr>
# Date 1528099755 -7200
#      Mon Jun 04 10:09:15 2018 +0200
# Node ID ec12805b454600f7204725ab4fbb8b2416ea66ab
# Parent  9ee6cfb52c0844a2bfe8a1223fafa7f4dddd0567
# Available At http://hg.logilab.org/review/cubes/rememberme
#              hg pull http://hg.logilab.org/review/cubes/rememberme -r ec12805b4546
# EXP-Topic py3
[pkg] Make cube Python3-installable

We refresh setup.py and __pkginfo__.py using CubicWeb 3.23 skeleton
which is Python3 compatible and still use the legacy layout.

diff --git a/__pkginfo__.py b/__pkginfo__.py
--- a/__pkginfo__.py
+++ b/__pkginfo__.py
@@ -1,6 +1,25 @@
-# pylint: disable-msg=W0622
+# pylint: disable=W0622
+# copyright 2013-2018 LOGILAB S.A. (Paris, FRANCE), all rights reserved.
+# contact http://www.logilab.fr -- mailto:contact at logilab.fr
+#
+# This program is free software: you can redistribute it and/or modify it under
+# the terms of the GNU Lesser General Public License as published by the Free
+# Software Foundation, either version 2.1 of the License, or (at your option)
+# any later version.
+#
+# This program is distributed in the hope that it will be useful, but WITHOUT
+# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+# FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more
+# details.
+#
+# You should have received a copy of the GNU Lesser General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
 """cubicweb-rememberme application packaging information"""
 
+from os import listdir as _listdir
+from os.path import join, isdir
+from glob import glob
+
 modname = 'rememberme'
 distname = 'cubicweb-rememberme'
 
@@ -13,24 +32,21 @@ author = 'LOGILAB S.A. (Paris, FRANCE)'
 author_email = 'contact at logilab.fr'
 web = 'http://www.cubicweb.org/project/%s' % distname
 
-
-__depends__ = {'cubicweb': '>= 3.19.4'}
+__depends__ = {
+    'cubicweb': '>= 3.23.0',
+}
+__recommends__ = {}
 
 classifiers = [
     'Environment :: Web Environment',
     'Framework :: CubicWeb',
     'Programming Language :: Python',
-    'Programming Language :: Python :: 2',
+    'Programming Language :: JavaScript',
     ]
 
 
-# packaging ###
+THIS_CUBE_DIR = join('share', 'cubicweb', 'cubes', modname)
 
-from os import listdir as _listdir
-from os.path import join, isdir
-from glob import glob
-
-THIS_CUBE_DIR = join('share', 'cubicweb', 'cubes', modname)
 
 def listdir(dirpath):
     return [join(dirpath, fname) for fname in _listdir(dirpath)
@@ -38,13 +54,16 @@ def listdir(dirpath):
             and not fname.endswith('~')
             and not isdir(join(dirpath, fname))]
 
+
 data_files = [
     # common files
     [THIS_CUBE_DIR, [fname for fname in glob('*.py') if fname != 'setup.py']],
     ]
+
 # check for possible extended cube layout
-for dirname in ('entities', 'views', 'sobjects', 'hooks', 'schema', 'data', 'i18n', 'migration', 'wdoc'):
-    if isdir(dirname):
-        data_files.append([join(THIS_CUBE_DIR, dirname), listdir(dirname)])
+for dname in ('entities', 'views', 'sobjects', 'hooks',
+              'schema', 'data', 'wdoc', 'i18n', 'migration', 'test'):
+    if isdir(dname):
+        data_files.append([join(THIS_CUBE_DIR, dname), listdir(dname)])
 # Note: here, you'll need to add subdirectories if you want
 # them to be included in the debian package
diff --git a/setup.py b/setup.py
--- a/setup.py
+++ b/setup.py
@@ -1,7 +1,7 @@
 #!/usr/bin/env python
 # pylint: disable=W0142,W0403,W0404,W0613,W0622,W0622,W0704,R0904,C0103,E0611
 #
-# copyright 2003-2015 LOGILAB S.A. (Paris, FRANCE), all rights reserved.
+# copyright 2003-2018 LOGILAB S.A. (Paris, FRANCE), all rights reserved.
 # contact http://www.logilab.fr/ -- mailto:contact at logilab.fr
 #
 # This file is part of CubicWeb rememberme cube.
@@ -16,8 +16,8 @@
 # FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public License for more
 # details.
 #
-# You should have received a copy of the GNU Lesser General Public License along
-# with CubicWeb.  If not, see <http://www.gnu.org/licenses/>.
+# You should have received a copy of the GNU Lesser General Public License
+# along with CubicWeb.  If not, see <http://www.gnu.org/licenses/>.
 """Generic Setup script, takes package info from __pkginfo__.py file
 """
 __docformat__ = "restructuredtext en"
@@ -25,11 +25,11 @@
 import os
 import sys
 import shutil
-from os.path import isdir, exists, join, walk, dirname
+from os.path import exists, join, dirname
 
 try:
     if os.environ.get('NO_SETUPTOOLS'):
-        raise ImportError() # do as there is no setuptools
+        raise ImportError()  # do as there is no setuptools
     from setuptools import setup
     from setuptools.command import install_lib
     USE_SETUPTOOLS = True
@@ -39,15 +39,14 @@ except ImportError:
     USE_SETUPTOOLS = False
 from distutils.command import install_data
 
+
 # load metadata from the __pkginfo__.py file so there is no risk of conflict
 # see https://packaging.python.org/en/latest/single_source_version.html
 base_dir = dirname(__file__)
-
 pkginfo = {}
 with open(join(base_dir, "__pkginfo__.py")) as f:
     exec(f.read(), pkginfo)
 
-
 # get required metadatas
 modname = pkginfo['modname']
 version = pkginfo['version']
@@ -71,16 +70,17 @@ dependency_links = pkginfo.get('dependen
 
 if USE_SETUPTOOLS:
     requires = {}
-    for entry in ("__depends__",): # "__recommends__"):
+    for entry in ("__depends__",):  # "__recommends__"):
         requires.update(pkginfo.get(entry, {}))
     install_requires = [("%s %s" % (d, v and v or "")).strip()
-                       for d, v in requires.iteritems()]
+                        for d, v in requires.items()]
 else:
     install_requires = []
 
 BASE_BLACKLIST = ('CVS', '.svn', '.hg', '.git', 'debian', 'dist', 'build')
 IGNORED_EXTENSIONS = ('.pyc', '.pyo', '.elc', '~')
 
+
 def ensure_scripts(linux_scripts):
     """
     Creates the proper script names required for each platform
@@ -93,37 +93,11 @@ def ensure_scripts(linux_scripts):
         scripts_ = linux_scripts
     return scripts_
 
+
 def export(from_dir, to_dir,
            blacklist=BASE_BLACKLIST,
            ignore_ext=IGNORED_EXTENSIONS,
            verbose=True):
-    """make a mirror of from_dir in to_dir, omitting directories and files
-    listed in the black list
-    """
-    def make_mirror(arg, directory, fnames):
-        """walk handler"""
-        for norecurs in blacklist:
-            try:
-                fnames.remove(norecurs)
-            except ValueError:
-                pass
-        for filename in fnames:
-            # don't include binary files
-            if filename[-4:] in ignore_ext:
-                continue
-            if filename[-1] == '~':
-                continue
-            src = join(directory, filename)
-            dest = to_dir + src[len(from_dir):]
-            if verbose:
-                sys.stderr.write('%s -> %s\n' % (src, dest))
-            if os.path.isdir(src):
-                if not exists(dest):
-                    os.mkdir(dest)
-            else:
-                if exists(dest):
-                    os.remove(dest)
-                shutil.copy2(src, dest)
     try:
         os.mkdir(to_dir)
     except OSError as ex:
@@ -131,7 +105,29 @@ def export(from_dir, to_dir,
         import errno
         if ex.errno != errno.EEXIST:
             raise
-    walk(from_dir, make_mirror, None)
+    for dirpath, dirnames, filenames in os.walk(from_dir):
+        for norecurs in blacklist:
+            try:
+                dirnames.remove(norecurs)
+            except ValueError:
+                pass
+        for dir_name in dirnames:
+            dest = join(to_dir, dir_name)
+            if not exists(dest):
+                os.mkdir(dest)
+        for filename in filenames:
+            # don't include binary files
+            src = join(dirpath, filename)
+            dest = to_dir + src[len(from_dir):]
+            if filename[-4:] in ignore_ext:
+                continue
+            if filename[-1] == '~':
+                continue
+            if exists(dest):
+                os.remove(dest)
+            if verbose:
+                sys.stderr.write('%s -> %s\n' % (src, dest))
+            shutil.copy2(src, dest)
 
 
 class MyInstallLib(install_lib.install_lib):
@@ -148,6 +144,7 @@ class MyInstallLib(install_lib.install_l
                 dest = join(self.install_dir, base, directory)
                 export(directory, dest, verbose=False)
 
+
 # re-enable copying data files in sys.prefix
 old_install_data = install_data.install_data
 if USE_SETUPTOOLS:
@@ -161,13 +158,15 @@ if USE_SETUPTOOLS:
             old_install_data.run(self)
             self.install_dir = _old_install_dir
     try:
-        import setuptools.command.easy_install # only if easy_install available
+        # only if easy_install available
+        import setuptools.command.easy_install  # noqa
         # monkey patch: Crack SandboxViolation verification
         from setuptools.sandbox import DirectorySandbox as DS
         old_ok = DS._ok
+
         def _ok(self, path):
             """Return True if ``path`` can be written during installation."""
-            out = old_ok(self, path) # here for side effect from setuptools
+            out = old_ok(self, path)  # here for side effect from setuptools
             realpath = os.path.normcase(os.path.realpath(path))
             allowed_path = os.path.normcase(sys.prefix)
             if realpath.startswith(allowed_path):
@@ -177,6 +176,7 @@ if USE_SETUPTOOLS:
     except ImportError:
         pass
 
+
 def install(**kwargs):
     """setup entry point"""
     if USE_SETUPTOOLS:
@@ -208,5 +208,6 @@ def install(**kwargs):
                  **kwargs
                  )
 
+
 if __name__ == '__main__':
     install()


More information about the cubicweb-devel mailing list