[PATCH piwik] Switch to new style cube and python 3

Nicola Spanti nicola.spanti at logilab.fr
Tue Mar 10 09:30:00 CET 2020


I looks good to me, so I published. I also fixed flake8 but not pytest.

Le 05/03/2020 à 14:59, Philippe Pepiot a écrit :
> # HG changeset patch
> # User Philippe Pepiot <philippe.pepiot at logilab.fr>
> # Date 1583408965 -3600
> #      Thu Mar 05 12:49:25 2020 +0100
> # Node ID e29a7db2b3955a23488e137af431ab2cece9bc01
> # Parent  41f35851830d6fa187b8d4ee95abe6d2b28fcbc7
> Switch to new style cube and python 3
> 
> * switch to new style cube "cubicweb_piwik"
> * Fix missing files in MANIFEST.in
> * Rework tox.ini configuration (previous config doesn't make sense to me).
> * Refresh debian packaging (python3, pybuild)
> * Drop useless test/pytestconf.py file
> * Use unittest directly instead of logilab-common one.
> * Some py3 fixes
> 
> At this time, flake8 and tests don't pass. But cube seems to work, and that's enough for me.
> 
> diff --git a/MANIFEST.in b/MANIFEST.in
> --- a/MANIFEST.in
> +++ b/MANIFEST.in
> @@ -1,5 +1,11 @@
> +include README
>   include *.py
>   include */*.py
> -recursive-include data *.gif *.png *.ico *.css *.js
> -recursive-include i18n *.po
> -recursive-include wdoc *
> +recursive-include cubicweb_piwik *.py
> +recursive-include cubicweb_piwik/data *.gif *.png *.jpg *.ico *.css *.js
> +recursive-include cubicweb_piwik/i18n *.po
> +recursive-include test/data bootstrap_cubes *.py
> +
> +include *.txt
> +include tox.ini
> +prune debian
> diff --git a/cubicweb-piwik.spec b/cubicweb-piwik.spec
> deleted file mode 100644
> --- a/cubicweb-piwik.spec
> +++ /dev/null
> @@ -1,47 +0,0 @@
> -# for el5, force use of python2.6
> -%if 0%{?el5}
> -%define python python26
> -%define __python /usr/bin/python2.6
> -%else
> -%define python python
> -%define __python /usr/bin/python
> -%endif
> -%{!?_python_sitelib: %define _python_sitelib %(%{__python} -c "from distutils.sysconfig import get_python_lib; print get_python_lib()")}
> -
> -Name:           cubicweb-piwik
> -Version:        0.1.0
> -Release:        logilab.1%{?dist}
> -Summary:        component to piwik trackers into the CubicWeb framework
> -Group:          Applications/Internet
> -License:        LGPL
> -Source0:        cubicweb-piwik-%{version}.tar.gz
> -
> -BuildArch:      noarch
> -BuildRoot:      %{_tmppath}/%{name}-%{version}-%{release}-buildroot
> -
> -BuildRequires:  %{python} %{python}-setuptools
> -Requires:       cubicweb >= 3.21.2
> -Requires:       %{python}-six >= 1.4.0
> -
> -%description
> -component to piwik trackers into the CubicWeb framework
> -
> -%prep
> -%setup -q -n cubicweb-piwik-%{version}
> -%if 0%{?el5}
> -# change the python version in shebangs
> -find . -name '*.py' -type f -print0 |  xargs -0 sed -i '1,3s;^#!.*python.*$;#! /usr/bin/python2.6;'
> -%endif
> -
> -%install
> -NO_SETUPTOOLS=1 %{__python} setup.py --quiet install --no-compile --prefix=%{_prefix} --root="$RPM_BUILD_ROOT"
> -# remove generated .egg-info file
> -rm -rf $RPM_BUILD_ROOT/usr/lib/python*
> -
> -
> -%clean
> -rm -rf $RPM_BUILD_ROOT
> -
> -%files
> -%defattr(-, root, root)
> -/*
> diff --git a/__init__.py b/cubicweb_piwik/__init__.py
> rename from __init__.py
> rename to cubicweb_piwik/__init__.py
> diff --git a/__pkginfo__.py b/cubicweb_piwik/__pkginfo__.py
> rename from __pkginfo__.py
> rename to cubicweb_piwik/__pkginfo__.py
> --- a/__pkginfo__.py
> +++ b/cubicweb_piwik/__pkginfo__.py
> @@ -13,7 +13,10 @@ author_email = 'contact at logilab.fr'
>   description = 'component to piwik trackers into the CubicWeb framework'
>   web = 'http://www.cubicweb.org/project/%s' % distname
>   
> -__depends__ = {'cubicweb': '>= 3.21.2', 'six': '>= 1.4.0'}
> +__depends__ = {
> +    'cubicweb': '>= 3.24',
> +    'six': '>= 1.4.0',
> +}
>   __recommends__ = {}
>   
>   classifiers = [
> @@ -21,29 +24,4 @@ classifiers = [
>       'Framework :: CubicWeb',
>       'Programming Language :: Python',
>       'Programming Language :: JavaScript',
> -    ]
> -
> -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)
> -            if fname[0] != '.' and not fname.endswith('.pyc')
> -            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 dname in ('entities', 'views', 'sobjects', 'hooks', 'schema', 'data',
> -              'wdoc', 'i18n', 'migration'):
> -    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/entities.py b/cubicweb_piwik/entities.py
> rename from entities.py
> rename to cubicweb_piwik/entities.py
> diff --git a/hooks.py b/cubicweb_piwik/hooks.py
> rename from hooks.py
> rename to cubicweb_piwik/hooks.py
> diff --git a/i18n/en.po b/cubicweb_piwik/i18n/en.po
> rename from i18n/en.po
> rename to cubicweb_piwik/i18n/en.po
> diff --git a/i18n/es.po b/cubicweb_piwik/i18n/es.po
> rename from i18n/es.po
> rename to cubicweb_piwik/i18n/es.po
> diff --git a/i18n/fr.po b/cubicweb_piwik/i18n/fr.po
> rename from i18n/fr.po
> rename to cubicweb_piwik/i18n/fr.po
> diff --git a/migration/postcreate.py b/cubicweb_piwik/migration/postcreate.py
> rename from migration/postcreate.py
> rename to cubicweb_piwik/migration/postcreate.py
> diff --git a/schema.py b/cubicweb_piwik/schema.py
> rename from schema.py
> rename to cubicweb_piwik/schema.py
> diff --git a/site_cubicweb.py b/cubicweb_piwik/site_cubicweb.py
> rename from site_cubicweb.py
> rename to cubicweb_piwik/site_cubicweb.py
> diff --git a/views.py b/cubicweb_piwik/views.py
> rename from views.py
> rename to cubicweb_piwik/views.py
> diff --git a/debian/compat b/debian/compat
> --- a/debian/compat
> +++ b/debian/compat
> @@ -1,1 +1,1 @@
> -7
> +9
> diff --git a/debian/control b/debian/control
> --- a/debian/control
> +++ b/debian/control
> @@ -3,17 +3,16 @@ Section: web
>   Priority: optional
>   Maintainer: LOGILAB S.A. (Paris, FRANCE) <contact at logilab.fr>
>   Build-Depends:
> - debhelper (>= 7),
> - python (>= 2.6.5),
> + debhelper (>= 9),
> + python3-all,
> + dh-python
>   Standards-Version: 3.9.3
> -X-Python-Version: >= 2.6
> +X-Python3-Version: >= 3.5
>   
> -Package: cubicweb-piwik
> +Package: python3-cubicweb-piwik
>   Architecture: all
>   Depends:
> - cubicweb-common (>= 3.21.2),
> - python-six (>= 1.4.0),
> - ${python:Depends},
> + ${python3:Depends},
>    ${misc:Depends},
>   Description: component to piwik trackers into the CubicWeb framework
>    CubicWeb is a semantic web application framework.
> diff --git a/debian/rules b/debian/rules
> --- a/debian/rules
> +++ b/debian/rules
> @@ -1,9 +1,4 @@
>   #!/usr/bin/make -f
>   
> -export NO_SETUPTOOLS=1
> -
>   %:
> -	dh $@ --with python2
> -
> -override_dh_python2:
> -	dh_python2 -i /usr/share/cubicweb
> +	dh $@ --with python3 --buildsystem=pybuild
> diff --git a/setup.py b/setup.py
> --- a/setup.py
> +++ b/setup.py
> @@ -1,171 +1,82 @@
>   #!/usr/bin/env python
> -# pylint: disable-msg=W0404,W0622,W0704,W0613,W0152
> -# copyright 2003-2010 LOGILAB S.A. (Paris, FRANCE), all rights reserved.
> +# pylint: disable=W0142,W0403,W0404,W0613,W0622,W0622,W0704,R0904,C0103,E0611
> +#
> +# copyright 2003-2016 LOGILAB S.A. (Paris, FRANCE), all rights reserved.
>   # contact http://www.logilab.fr/ -- mailto:contact at logilab.fr
> -
> -__docformat__ = "restructuredtext en"
> +#
> +# This file is part of a cubicweb-piwik
> +#
> +# CubicWeb 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.
> +#
> +# CubicWeb 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 CubicWeb.  If not, see <http://www.gnu.org/licenses/>.
> +"""cubicweb_piwik setup module using data from
> +cubicweb_piwik/__pkginfo__.py file
> +"""
>   
> -import os
> -import sys
> -import shutil
> -from os.path import isdir, exists, join, walk, dirname
> +from os.path import join, dirname
>   
> -try:
> -    if os.environ.get('NO_SETUPTOOLS'):
> -        raise ImportError()
> -    from setuptools import setup
> -    from setuptools.command import install_lib
> -    USE_SETUPTOOLS = 1
> -except ImportError:
> -    from distutils.core import setup
> -    from distutils.command import install_lib
> -    USE_SETUPTOOLS = 0
> +from setuptools import find_packages, setup
> +
> +
> +here = dirname(__file__)
>   
>   # 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 = join(here, 'cubicweb_piwik', '__pkginfo__.py')
> +__pkginfo__ = {}
> +with open(pkginfo) as f:
> +    exec(f.read(), __pkginfo__)
>   
> -pkginfo = {}
> -with open(join(base_dir, "__pkginfo__.py")) as f:
> -    exec(f.read(), pkginfo)
>   # get required metadatas
> -modname = pkginfo['modname']
> -version = pkginfo['version']
> -license = pkginfo['license']
> -description = pkginfo['description']
> -web = pkginfo['web']
> -author = pkginfo['author']
> -author_email = pkginfo['author_email']
> -classifiers = pkginfo['classifiers']
> +distname = __pkginfo__['distname']
> +version = __pkginfo__['version']
> +license = __pkginfo__['license']
> +description = __pkginfo__['description']
> +web = __pkginfo__['web']
> +author = __pkginfo__['author']
> +author_email = __pkginfo__['author_email']
> +classifiers = __pkginfo__['classifiers']
>   
> -with open(join(base_dir, 'README')) as f:
> +with open(join(here, 'README')) as f:
>       long_description = f.read()
>   
>   # get optional metadatas
> -distname = pkginfo.get('distname', modname)
> -scripts = pkginfo.get('scripts', ())
> -include_dirs = pkginfo.get('include_dirs', ())
> -data_files = pkginfo.get('data_files', None)
> -ext_modules = pkginfo.get('ext_modules', None)
> -dependency_links = pkginfo.get('dependency_links', ())
> -
> -if USE_SETUPTOOLS:
> -    requires = {}
> -    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()]
> -else:
> -    install_requires = []
> -
> -BASE_BLACKLIST = ('CVS', '.svn', '.hg', '.git', 'debian', 'dist', 'build')
> -IGNORED_EXTENSIONS = ('.pyc', '.pyo', '.elc', '~')
> +data_files = __pkginfo__.get('data_files', None)
> +dependency_links = __pkginfo__.get('dependency_links', ())
>   
> -def ensure_scripts(linux_scripts):
> -    """Creates the proper script names required for each platform
> -    (taken from 4Suite)
> -    """
> -    from distutils import util
> -    if util.get_platform()[:3] == 'win':
> -        scripts_ = [script + '.bat' for script in linux_scripts]
> -    else:
> -        scripts_ = linux_scripts
> -    return scripts_
> +requires = {}
> +for entry in ("__depends__",):  # "__recommends__"):
> +    requires.update(__pkginfo__.get(entry, {}))
> +install_requires = ["{0} {1}".format(d, v and v or "").strip()
> +                    for d, v in requires.items()]
>   
> -def get_packages(directory, prefix):
> -    """return a list of subpackages for the given directory"""
> -    result = []
> -    for package in os.listdir(directory):
> -        absfile = join(directory, package)
> -        if isdir(absfile):
> -            if exists(join(absfile, '__init__.py')) or \
> -                   package in ('test', 'tests'):
> -                if prefix:
> -                    result.append('%s.%s' % (prefix, package))
> -                else:
> -                    result.append(package)
> -                result += get_packages(absfile, result[-1])
> -    return result
>   
> -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:
> -                print >> sys.stderr, 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, ex:
> -        # file exists ?
> -        import errno
> -        if ex.errno != errno.EEXIST:
> -            raise
> -    walk(from_dir, make_mirror, None)
> -
> -class MyInstallLib(install_lib.install_lib):
> -    """extend install_lib command to handle  package __init__.py and
> -    include_dirs variable if necessary
> -    """
> -    def run(self):
> -        """overridden from install_lib class"""
> -        install_lib.install_lib.run(self)
> -        # manually install included directories if any
> -        if include_dirs:
> -            base = modname
> -            for directory in include_dirs:
> -                dest = join(self.install_dir, base, directory)
> -                export(directory, dest, verbose=False)
> -
> -def install(**kwargs):
> -    """setup entry point"""
> -    if USE_SETUPTOOLS:
> -        if '--force-manifest' in sys.argv:
> -            sys.argv.remove('--force-manifest')
> -    # install-layout option was introduced in 2.5.3-1~exp1
> -    elif sys.version_info < (2, 5, 4) and '--install-layout=deb' in sys.argv:
> -        sys.argv.remove('--install-layout=deb')
> -    if USE_SETUPTOOLS and install_requires:
> -        kwargs['install_requires'] = install_requires
> -        kwargs['dependency_links'] = dependency_links
> -    return setup(name = distname,
> -                 version = version,
> -                 license = license,
> -                 description = description,
> -                 long_description = long_description,
> -                 author = author,
> -                 author_email = author_email,
> -                 url = web,
> -                 scripts = ensure_scripts(scripts),
> -                 data_files = data_files,
> -                 ext_modules = ext_modules,
> -                 cmdclass = {'install_lib': MyInstallLib},
> -                 **kwargs
> -                 )
> -
> -if __name__ == '__main__' :
> -    install()
> +setup(
> +    name=distname,
> +    version=version,
> +    license=license,
> +    description=description,
> +    long_description=long_description,
> +    author=author,
> +    author_email=author_email,
> +    url=web,
> +    classifiers=classifiers,
> +    packages=find_packages(exclude=['test']),
> +    install_requires=install_requires,
> +    include_package_data=True,
> +    entry_points={
> +        'cubicweb.cubes': [
> +            'piwik=cubicweb_piwik',
> +        ],
> +    },
> +    zip_safe=False,
> +)
> diff --git a/test/pytestconf.py b/test/pytestconf.py
> deleted file mode 100644
> --- a/test/pytestconf.py
> +++ /dev/null
> @@ -1,61 +0,0 @@
> -# copyright 2003-2010 LOGILAB S.A. (Paris, FRANCE), all rights reserved.
> -# contact http://www.logilab.fr/ -- mailto:contact at logilab.fr
> -#
> -# This file is part of CubicWeb.
> -#
> -# CubicWeb 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.
> -#
> -# CubicWeb 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 CubicWeb.  If not, see <http://www.gnu.org/licenses/>.
> -"""
> -
> -"""
> -import os
> -import sys
> -
> -from logilab.common.pytest import PyTester
> -
> -
> -def getlogin():
> -    """avoid usinng os.getlogin() because of strange tty / stdin problems
> -    (man 3 getlogin)
> -    Another solution would be to use $LOGNAME, $USER or $USERNAME
> -    """
> -    if sys.platform == 'win32':
> -        return os.environ.get('USERNAME') or 'cubicweb'
> -    import pwd
> -    return pwd.getpwuid(os.getuid())[0]
> -
> -
> -def update_parser(parser):
> -    login = getlogin()
> -    parser.add_option('-r', '--rebuild-database', dest='rebuild_db',
> -                      default=False, action="store_true",
> -                      help="remove tmpdb and rebuilds the test database")
> -    parser.add_option('-u', '--dbuser', dest='dbuser', action='store',
> -                      default=login, help="database user")
> -    parser.add_option('-w', '--dbpassword', dest='dbpassword', action='store',
> -                      default=login, help="database user's password")
> -    parser.add_option('-n', '--dbname', dest='dbname', action='store',
> -                      default=None, help="database name")
> -    parser.add_option('--euser', dest='euser', action='store',
> -                      default=login, help="euser name")
> -    parser.add_option('--epassword', dest='epassword', action='store',
> -                      default=login, help="euser's password' name")
> -    return parser
> -
> -
> -class CustomPyTester(PyTester):
> -    def __init__(self, cvg, options):
> -        super(CustomPyTester, self).__init__(cvg, options)
> -        if options.rebuild_db:
> -            os.unlink('tmpdb')
> -            os.unlink('tmpdb-template')
> diff --git a/test/test_piwik.py b/test/test_piwik.py
> --- a/test/test_piwik.py
> +++ b/test/test_piwik.py
> @@ -17,7 +17,7 @@
>   """cubicweb-piwik automatic tests"""
>   
>   from cubicweb.devtools.testlib import AutomaticWebTest, CubicWebTC
> -from logilab.common.testlib import TestCase, InnerTest, Tags
> +
>   
>   class AutomaticWebTest(AutomaticWebTest):
>       '''provides `to_test_etypes` and/or `list_startup_views` implementation
> @@ -65,8 +65,8 @@ class PiwkiFooterTC(CubicWebTC):
>               #html = entry.view('primary')
>               view = self.vreg['views'].select('primary', req, rset=entry)
>               html = self.vreg['views'].main_template(req, 'main-template', rset=entry, view=view)
> -            self.assertIn('piwik', html)
> +            self.assertIn(b'piwik', html)
>   
>   if __name__ == '__main__':
> -    from logilab.common.testlib import unittest_main
> -    unittest_main()
> +    import unittest
> +    unittest.main()
> diff --git a/tox.ini b/tox.ini
> --- a/tox.ini
> +++ b/tox.ini
> @@ -1,37 +1,33 @@
>   [tox]
> -envlist = py27-default
> -
> -[tox:jenkins]
> -envlist = py27-{stable,default,dev}, flake8-jenkins
> +envlist = py3, flake8, check-manifest
>   
>   [testenv]
> -sitepackages = True
>   deps =
> -  stable: cubicweb < 3.21
> -  default: cubicweb
> -  dev: hg+http://hg.logilab.org/master/cubicweb@cubicweb-3.22#egg=cubicweb
> +  pytest
>     -rtest-requirements.txt
> -commands = {envpython} -c 'from logilab.common import pytest; pytest.run()' -t {toxinidir}/test {posargs}
> +commands =
> +  {envpython} -m pytest {posargs}
> +
> +[pytest]
> +python_files = *test_*.py
> +testpaths = test
> +addopts = -r fEs
>   
>   [testenv:flake8]
>   skip_install = true
> -whitelist_externals =
> -  flake8
> +skipsdist = true
>   deps =
>     flake8
> -commands = flake8 {toxinidir}
> -[testenv:flake8-jenkins]
> -skip_install = true
> -whitelist_externals =
> -  flake8
> -deps =
> -  flake8
> -commands = flake8 --exit-zero --show-source --output-file=code_quality.log {toxinidir}
> +commands = {envpython} -m flake8 {toxinidir} {posargs}
>   
>   [flake8]
> -format = pylint
>   max-line-length = 100
> -exclude = test,migration,__pkginfo__.py,setup.py,.tox
> -ignore = E731,W503
> +exclude = cubicweb_piwik/migration/*,.tox/*
>   
> -
> +[testenv:check-manifest]
> +skip_install = true
> +skipsdist = true
> +deps =
> +  check-manifest
> +commands =
> +  {envpython} -m check_manifest
> 



More information about the cubicweb-devel mailing list