From 943d6ca6fdf61700895284f2a00a92c11067b420 Mon Sep 17 00:00:00 2001 From: Victor Popov Date: Tue, 7 Apr 2020 11:34:07 +0300 Subject: [PATCH] [pybindings] PR review improvements - PEP8 formatting - suppress warning about package name - add package data to pygen, pysearch, pytraffic bindings - improve documentation a bit --- docs/building_pybindings.txt | 15 ++++++-- pyhelpers/setup.py | 67 ++++++++++++++++++++++++++++-------- 2 files changed, 65 insertions(+), 17 deletions(-) diff --git a/docs/building_pybindings.txt b/docs/building_pybindings.txt index 171ab81f91..be4b4d8294 100644 --- a/docs/building_pybindings.txt +++ b/docs/building_pybindings.txt @@ -35,7 +35,7 @@ Current list of available modules and setup's: Run chosen setup.py with Python you want to build binding for. Examples: - $ python kml/pykmlib/setup.py build install + $ python kml/pykmlib/setup.py build install --user $ python3.6 generator/mwm_diff/pymwm_diff/setup.py bdist_wheel During build, our setup.py will configure and build boost_python library for @@ -73,10 +73,21 @@ This will create wheels for all pybindings in `../omim-build/pybindings-dist/`. Pip installation ---------------- - One can install pybinding straight from source: $ pip install git+https://github.com/mapsme/omim.git@master#egg=pykmlib&subdirectory=kml/pykmlib But this can be a long wait, it is better to use already compiled .whl distribution. + + +Running and testing built pybinding +----------------------------------- +Install your freshly built pybinding either with `setup.py install`, or by +installing .whl with `pip install`. + +Run tests: + + MWM_RESOURCES_DIR=data \ + MWM_WRITABLE_DIR=data \ + search/pysearch/run_search_engine.py diff --git a/pyhelpers/setup.py b/pyhelpers/setup.py index 0909912976..ce38698d7a 100644 --- a/pyhelpers/setup.py +++ b/pyhelpers/setup.py @@ -6,24 +6,34 @@ import os import re import sys -from setuptools import setup as setuptools_setup -from setuptools.command.build_ext import build_ext as setuptools_build_ext -from setuptools.command.build_py import build_py as setuptools_build_py -from setuptools.command.egg_info import egg_info as setuptools_egg_info, manifest_maker as setuptools_manifest_maker -from setuptools.command.install import install as setuptools_install -from setuptools.command.install_lib import install_lib as setuptools_install_lib -from setuptools.extension import Extension from distutils.command.bdist import bdist as distutils_bdist from distutils.command.build import build as distutils_build from distutils.core import Command from distutils.dir_util import mkpath, remove_tree from distutils.file_util import copy_file from distutils.spawn import spawn, find_executable -from distutils.sysconfig import get_python_version, get_python_inc, get_config_var +from distutils.sysconfig import ( + get_python_version, get_python_inc, get_config_var +) from distutils.version import LooseVersion from distutils import log +from setuptools import dist, setup as setuptools_setup +from setuptools.command.build_ext import build_ext as setuptools_build_ext +from setuptools.command.build_py import build_py as setuptools_build_py +from setuptools.command.egg_info import ( + egg_info as setuptools_egg_info, + manifest_maker as setuptools_manifest_maker +) +from setuptools.command.install import install as setuptools_install +from setuptools.command.install_lib import ( + install_lib as setuptools_install_lib +) +from setuptools.extension import Extension +"""Monkey-patching to disable checking package names""" +dist.check_packages = lambda dist, attr, value: None + pyhelpers_dir = os.path.abspath(os.path.dirname(__file__)) omim_root = os.path.dirname(pyhelpers_dir) boost_root = os.path.join(omim_root, '3party', 'boost') @@ -181,17 +191,28 @@ class install_lib(setuptools_install_lib, object): install_root = self.get_finalized_command('install').root or '' excludes = set() for ext_name in set(PYBINDINGS.keys()) - include_ext_names: - excludes.add(os.path.join(install_root, build_ext.get_ext_filename(ext_name))) + excludes.add(os.path.join( + install_root, build_ext.get_ext_filename(ext_name) + )) for data_path in PYBINDINGS[ext_name].get('package_data', []): excludes.add(os.path.join(install_root, data_path)) + + own_files = { + os.path.join(install_root, data_path) + for ext_name in include_ext_names + for data_path in PYBINDINGS[ext_name].get('package_data', []) + } + excludes -= own_files return super(install_lib, self).get_exclusions() | excludes class build_boost_python(Command, object): user_options = [ - ('force', 'f', "forcibly build boost_python library (ignore existence)"), - ('omim-builddir=', None, "Path to omim build directory"), + ('force', 'f', + "forcibly build boost_python library (ignore existence)"), + ('omim-builddir=', None, + "Path to omim build directory"), ] boolean_options = ['force'] @@ -340,6 +361,10 @@ VERSIONS_LOCATIONS = { PYBINDINGS = { 'pygen': { 'description': 'Binding for working with generation data', + 'package_data': ( + 'data/classificator.txt', + 'data/types.txt', + ) }, 'pykmlib': { 'description': 'Binding for working with maps.me KML files', @@ -356,6 +381,13 @@ PYBINDINGS = { }, 'pysearch': { 'description': 'Binding to access maps.me search engine', + 'package_data': ( + 'data/categories_brands.txt', + 'data/categories_cuisines.txt', + 'data/categories.txt', + 'data/classificator.txt', + 'data/types.txt', + ) }, 'pytracking': { 'description': 'Binding for working with user tracks', @@ -363,6 +395,10 @@ PYBINDINGS = { 'pytraffic': { 'description': 'Binding for generationg traffic ' 'data for maps.me application', + 'package_data': ( + 'data/classificator.txt', + 'data/types.txt', + ) }, } @@ -372,9 +408,9 @@ def get_version(): with open(os.path.join(omim_root, *path), 'r') as f: for line in f: m = re.search( - "^\s*{}\s*=\s*(.*)".format(varname), - line.strip() - ) + "^\s*{}\s*=\s*(.*)".format(varname), + line.strip() + ) if m: versions.append(LooseVersion(m.group(1))) break @@ -428,7 +464,8 @@ def setup_omim_pybinding( }, classifiers=[ # Trove classifiers - # Full list: https://pypi.python.org/pypi?%3Aaction=list_classifiers + # Full list: + # https://pypi.python.org/pypi?%3Aaction=list_classifiers 'License :: OSI Approved :: Apache Software License', 'Programming Language :: Python', 'Programming Language :: Python :: Implementation :: CPython',