From 03b46e2c6b441343b5fc38e76eebac1c4a2fce53 Mon Sep 17 00:00:00 2001 From: Maksim Andrianov Date: Fri, 10 Jul 2020 12:02:06 +0300 Subject: [PATCH] [python] Added setup.py files to generator packages. --- pyhelpers/setup.py | 29 +++++++++ tools/python/airmaps/requirements.txt | 5 +- tools/python/airmaps/requirements_dev.txt | 5 ++ tools/python/airmaps/setup.py | 35 ++++++++++ tools/python/booking/requirements.txt | 8 +-- tools/python/booking/requirements_dev.txt | 4 ++ tools/python/booking/setup.py | 31 +++++++++ tools/python/data/__init__.py | 0 tools/python/data/all/setup.py | 25 ++++++++ tools/python/data/base.py | 64 +++++++++++++++++++ tools/python/data/basic/setup.py | 45 +++++++++++++ tools/python/data/borders/setup.py | 10 +++ tools/python/data/fonts/setup.py | 23 +++++++ tools/python/data/styles/setup.py | 25 ++++++++ .../python/descriptions/requirements_dev.txt | 5 ++ tools/python/descriptions/setup.py | 32 ++++++++++ .../maps_generator/generator/settings.py | 13 +++- tools/python/maps_generator/requirements.txt | 5 +- .../maps_generator/requirements_dev.txt | 6 ++ tools/python/maps_generator/setup.py | 37 +++++++++++ tools/python/mwm/__init__.py | 13 +++- tools/python/mwm/requirements.txt | 2 + tools/python/mwm/requirements_dev.txt | 0 tools/python/mwm/setup.py | 31 +++++++++ tools/python/post_generation/requirements.txt | 2 +- .../post_generation/requirements_dev.txt | 1 + tools/python/post_generation/setup.py | 31 +++++++++ 27 files changed, 473 insertions(+), 14 deletions(-) create mode 100644 tools/python/airmaps/requirements_dev.txt create mode 100755 tools/python/airmaps/setup.py create mode 100644 tools/python/booking/requirements_dev.txt create mode 100755 tools/python/booking/setup.py create mode 100644 tools/python/data/__init__.py create mode 100755 tools/python/data/all/setup.py create mode 100644 tools/python/data/base.py create mode 100755 tools/python/data/basic/setup.py create mode 100755 tools/python/data/borders/setup.py create mode 100755 tools/python/data/fonts/setup.py create mode 100755 tools/python/data/styles/setup.py create mode 100644 tools/python/descriptions/requirements_dev.txt create mode 100755 tools/python/descriptions/setup.py create mode 100644 tools/python/maps_generator/requirements_dev.txt create mode 100755 tools/python/maps_generator/setup.py create mode 100644 tools/python/mwm/requirements_dev.txt create mode 100755 tools/python/mwm/setup.py create mode 100644 tools/python/post_generation/requirements_dev.txt create mode 100644 tools/python/post_generation/setup.py diff --git a/pyhelpers/setup.py b/pyhelpers/setup.py index 1130fd0012..6114bd7ffd 100644 --- a/pyhelpers/setup.py +++ b/pyhelpers/setup.py @@ -39,6 +39,13 @@ from setuptools.command.egg_info import egg_info, manifest_maker from setuptools.command.install import install from setuptools.extension import Extension +try: + # for pip >= 10 + from pip._internal.req import parse_requirements +except ImportError: + # for pip <= 9.0.3 + from pip.req import parse_requirements + # Monkey-patching to disable checking package names dist.check_packages = lambda dist, attr, value: None @@ -499,6 +506,28 @@ def get_version(): return max(versions) +def get_requirements(path="", omim_package_version=get_version()): + requirements = [] + fpath = os.path.join(path, "requirements.txt") + for d in parse_requirements(fpath, session="s"): + try: + req_with_version = d.requirement + except AttributeError: + req_with_version = str(d.req) + + if req_with_version.startswith("omim"): + index = len(req_with_version) - 1 + for i, ch in enumerate(req_with_version): + if not (ch.isalnum() or ch in "-_"): + index = i + break + + req_without_version = req_with_version[0: index + 1] + req_with_version = "{}=={}".format(req_with_version, omim_package_version) + requirements.append(req_with_version) + return requirements + + def setup_omim_pybinding( name, version=None, diff --git a/tools/python/airmaps/requirements.txt b/tools/python/airmaps/requirements.txt index 7034a8db88..20d0bc268b 100644 --- a/tools/python/airmaps/requirements.txt +++ b/tools/python/airmaps/requirements.txt @@ -1,5 +1,6 @@ +omim-data-all +omim-maps_generator apache-airflow [postgres]==1.10.10 psycopg2-binary==2.8.4 cryptography==2.8 -webdavclient==1.0.8 --r ../maps_generator/requirements.txt \ No newline at end of file +webdavclient==1.0.8 \ No newline at end of file diff --git a/tools/python/airmaps/requirements_dev.txt b/tools/python/airmaps/requirements_dev.txt new file mode 100644 index 0000000000..f4528d3091 --- /dev/null +++ b/tools/python/airmaps/requirements_dev.txt @@ -0,0 +1,5 @@ +-r ../maps_generator/requirements.txt +apache-airflow [postgres]==1.10.10 +psycopg2-binary==2.8.4 +cryptography==2.8 +webdavclient==1.0.8 \ No newline at end of file diff --git a/tools/python/airmaps/setup.py b/tools/python/airmaps/setup.py new file mode 100755 index 0000000000..de10f04a16 --- /dev/null +++ b/tools/python/airmaps/setup.py @@ -0,0 +1,35 @@ +#!/usr/bin/env python +import os +import sys + +import setuptools + +module_dir = os.path.abspath(os.path.dirname(__file__)) +sys.path.insert(0, os.path.join(module_dir, "..", "..", "..")) + +from pyhelpers.setup import chdir +from pyhelpers.setup import get_version +from pyhelpers.setup import get_requirements + + +with chdir(os.path.abspath(os.path.dirname(__file__))): + setuptools.setup( + name="omim-airmaps", + version=str(get_version()), + author="My.com B.V. (Mail.Ru Group)", + author_email="dev@maps.me", + description="This package contains tools for generating maps with Apache Airflow.", + url="https://github.com/mapsme", + package_dir={"airmaps": ""}, + packages=[ + "airmaps", + "airmaps.dags", + "airmaps.instruments", + ], + classifiers=[ + "Programming Language :: Python :: 3", + "License :: OSI Approved :: Apache Software License", + ], + python_requires=">=3.6", + install_requires=get_requirements(), + ) diff --git a/tools/python/booking/requirements.txt b/tools/python/booking/requirements.txt index 4e17d841e3..c5250fba09 100644 --- a/tools/python/booking/requirements.txt +++ b/tools/python/booking/requirements.txt @@ -1,4 +1,4 @@ -eviltransform -ratelimit -requests -tqdm +eviltransform==0.1.1 +ratelimit==2.2.1 +requests==2.23.0 +tqdm==4.32.2 \ No newline at end of file diff --git a/tools/python/booking/requirements_dev.txt b/tools/python/booking/requirements_dev.txt new file mode 100644 index 0000000000..4d4a6ca08a --- /dev/null +++ b/tools/python/booking/requirements_dev.txt @@ -0,0 +1,4 @@ +eviltransform==0.1.1 +ratelimit==2.2.1 +requests==2.23.0 +tqdm==4.32.2 diff --git a/tools/python/booking/setup.py b/tools/python/booking/setup.py new file mode 100755 index 0000000000..a9b705b85e --- /dev/null +++ b/tools/python/booking/setup.py @@ -0,0 +1,31 @@ +#!/usr/bin/env python +import os +import sys + +import setuptools + +module_dir = os.path.abspath(os.path.dirname(__file__)) +sys.path.insert(0, os.path.join(module_dir, "..", "..", "..")) + +from pyhelpers.setup import chdir +from pyhelpers.setup import get_version +from pyhelpers.setup import get_requirements + + +with chdir(os.path.abspath(os.path.dirname(__file__))): + setuptools.setup( + name="omim-booking", + version=str(get_version()), + author="My.com B.V. (Mail.Ru Group)", + author_email="dev@maps.me", + description="This package is a library for dealing with booking.com.", + url="https://github.com/mapsme", + package_dir={"booking": ""}, + packages=["booking", "booking.api"], + classifiers=[ + "Programming Language :: Python :: 3", + "License :: OSI Approved :: Apache Software License", + ], + python_requires=">=3.6", + install_requires=get_requirements(), + ) diff --git a/tools/python/data/__init__.py b/tools/python/data/__init__.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/tools/python/data/all/setup.py b/tools/python/data/all/setup.py new file mode 100755 index 0000000000..4c0fc8a2cf --- /dev/null +++ b/tools/python/data/all/setup.py @@ -0,0 +1,25 @@ +#!/usr/bin/env python +import os +import sys + +module_dir = os.path.abspath(os.path.dirname(__file__)) +sys.path.insert(0, os.path.join(module_dir, "..", "..")) + +from data.base import setup + +module_dir = os.path.abspath(os.path.dirname(__file__)) +sys.path.insert(0, os.path.join(module_dir, "..", "..", "..", "..")) + +from pyhelpers.setup import get_version + + +_V = get_version() + +_D = [ + "omim-data-basic", + "omim-data-borders", + "omim-data-fonts", + "omim-data-styles", +] + +setup(__file__, "all", [], ["{}=={}".format(d, _V) for d in _D]) diff --git a/tools/python/data/base.py b/tools/python/data/base.py new file mode 100644 index 0000000000..f426910e98 --- /dev/null +++ b/tools/python/data/base.py @@ -0,0 +1,64 @@ +import os +import sys +from collections import defaultdict + +import setuptools + +module_dir = os.path.abspath(os.path.dirname(__file__)) +sys.path.insert(0, os.path.join(module_dir, "..", "..", "..")) + +from pyhelpers.setup import chdir +from pyhelpers.setup import get_version + + +DATA_PATH = os.path.abspath( + os.path.join(os.path.dirname(__file__), "..", "..", "..", "data") +) + + +def get_files_from_dir(abs_root_path, b, data_files): + for root, dirs, files in os.walk(abs_root_path): + data_files[b].extend(os.path.join(root, f) for f in files) + for d in dirs: + get_files_from_dir( + os.path.join(abs_root_path, d), os.path.join(b, d), data_files + ) + + +def get_data_files(relative_data_paths): + data_files = defaultdict(lambda: []) + for p in relative_data_paths: + path = os.path.join(DATA_PATH, p) + b = os.path.join("omim-data", path.replace(DATA_PATH + os.path.sep, "")) + if os.path.isdir(path): + get_files_from_dir(path, b, data_files) + else: + b = os.path.dirname(b) + data_files[b].append(path) + return data_files.items() + + +def setup( + source_file, + suffix, + relative_data_paths, + install_requires=None, + supported_pythons=("2", "2.7", "3", "3.5", "3.6", "3.7"), +): + with chdir(os.path.abspath(os.path.dirname(source_file))): + setuptools.setup( + name="omim-data-{}".format(suffix), + version=str(get_version()), + author="My.com B.V. (Mail.Ru Group)", + author_email="dev@maps.me", + description="This package contains {} data files.".format(suffix), + url="https://github.com/mapsme", + packages=[], + classifiers=["License :: OSI Approved :: Apache Software License",] + + [ + "Programming Language :: Python :: {}".format(supported_python) + for supported_python in supported_pythons + ], + install_requires=install_requires or [], + data_files=get_data_files(relative_data_paths), + ) diff --git a/tools/python/data/basic/setup.py b/tools/python/data/basic/setup.py new file mode 100755 index 0000000000..9ffe2992a2 --- /dev/null +++ b/tools/python/data/basic/setup.py @@ -0,0 +1,45 @@ +#!/usr/bin/env python +import os +import sys + +module_dir = os.path.abspath(os.path.dirname(__file__)) +sys.path.insert(0, os.path.join(module_dir, "..", "..")) + +from data.base import setup + +setup( + __file__, + "basic", + [ + "booking_excluded.txt", + "borders_vs_osm.csv", + "categories_brands.txt", + "categories_cuisines.txt", + "categories.txt", + "classificator.txt", + "colors.txt", + "countries_meta.txt", + "countries_synonyms.csv", + "countries.txt", + "external_resources.txt", + "fonts_blacklist.txt", + "fonts_whitelist.txt", + "hierarchy.txt", + "local_ads_symbols.txt", + "mapcss-dynamic.txt", + "mapcss-mapping.csv", + "mixed_nodes.txt", + "mixed_tags.txt", + "mwm_names_en.txt", + "old_vs_new.csv", + "patterns.txt", + "replaced_tags.txt", + "skipped_elements.json", + "synonyms.txt", + "transit_colors.txt", + "types.txt", + "ugc_types.csv", + "unicode_blocks.txt", + "visibility.txt", + ], +) diff --git a/tools/python/data/borders/setup.py b/tools/python/data/borders/setup.py new file mode 100755 index 0000000000..59d4bc53f5 --- /dev/null +++ b/tools/python/data/borders/setup.py @@ -0,0 +1,10 @@ +#!/usr/bin/env python +import os +import sys + +module_dir = os.path.abspath(os.path.dirname(__file__)) +sys.path.insert(0, os.path.join(module_dir, "..", "..")) + +from data.base import setup + +setup(__file__, "borders", ["borders", "packed_polygons.bin"]) diff --git a/tools/python/data/fonts/setup.py b/tools/python/data/fonts/setup.py new file mode 100755 index 0000000000..1a21cf3a27 --- /dev/null +++ b/tools/python/data/fonts/setup.py @@ -0,0 +1,23 @@ +#!/usr/bin/env python +import os +import sys + +module_dir = os.path.abspath(os.path.dirname(__file__)) +sys.path.insert(0, os.path.join(module_dir, "..", "..")) + +from data.base import setup + +setup( + __file__, + "fonts", + [ + "00_roboto_regular.ttf", + "01_dejavusans.ttf", + "02_droidsans-fallback.ttf", + "03_jomolhari-id-a3d.ttf", + "04_padauk.ttf", + "05_khmeros.ttf", + "06_code2000.ttf", + "07_roboto_medium.ttf", + ], +) diff --git a/tools/python/data/styles/setup.py b/tools/python/data/styles/setup.py new file mode 100755 index 0000000000..263d7a7f48 --- /dev/null +++ b/tools/python/data/styles/setup.py @@ -0,0 +1,25 @@ +#!/usr/bin/env python +import os +import sys + +module_dir = os.path.abspath(os.path.dirname(__file__)) +sys.path.insert(0, os.path.join(module_dir, "..", "..")) + +from data.base import setup + +setup( + __file__, + "styles", + [ + "drules_proto.bin", + "drules_proto-bw.bin", + "drules_proto_clear.bin", + "drules_proto_clear.txt", + "drules_proto_dark.bin", + "drules_proto_dark.txt", + "drules_proto_vehicle_clear.bin", + "drules_proto_vehicle_clear.txt", + "drules_proto_vehicle_dark.bin", + "drules_proto_vehicle_dark.txt", + ], +) diff --git a/tools/python/descriptions/requirements_dev.txt b/tools/python/descriptions/requirements_dev.txt new file mode 100644 index 0000000000..e206ccfe6e --- /dev/null +++ b/tools/python/descriptions/requirements_dev.txt @@ -0,0 +1,5 @@ +htmlmin==0.1.12 +requests==2.23.0 +beautifulsoup4==4.9.1 +wikidata==0.6.1 +wikipedia-api==0.5.4 diff --git a/tools/python/descriptions/setup.py b/tools/python/descriptions/setup.py new file mode 100755 index 0000000000..4031155bf4 --- /dev/null +++ b/tools/python/descriptions/setup.py @@ -0,0 +1,32 @@ +#!/usr/bin/env python +import os +import sys + +import setuptools + +module_dir = os.path.abspath(os.path.dirname(__file__)) +sys.path.insert(0, os.path.join(module_dir, "..", "..", "..")) + +from pyhelpers.setup import chdir +from pyhelpers.setup import get_version +from pyhelpers.setup import get_requirements + + +with chdir(os.path.abspath(os.path.dirname(__file__))): + setuptools.setup( + name="omim-descriptions", + version=str(get_version()), + author="My.com B.V. (Mail.Ru Group)", + author_email="dev@maps.me", + description="This package is a library that provides descriptions " + "(such as those from Wikipedia) to geographic objects.", + url="https://github.com/mapsme", + package_dir={"descriptions": ""}, + packages=["descriptions"], + classifiers=[ + "Programming Language :: Python :: 3", + "License :: OSI Approved :: Apache Software License", + ], + python_requires=">=3.6", + install_requires=get_requirements(), + ) diff --git a/tools/python/maps_generator/generator/settings.py b/tools/python/maps_generator/generator/settings.py index 0ab2f54b06..5269885783 100644 --- a/tools/python/maps_generator/generator/settings.py +++ b/tools/python/maps_generator/generator/settings.py @@ -1,6 +1,7 @@ import argparse import multiprocessing import os +import site import sys from configparser import ConfigParser from configparser import ExtendedInterpolation @@ -11,6 +12,8 @@ from typing import AnyStr from maps_generator.utils.md5 import md5_ext from maps_generator.utils.system import total_virtual_memory +ETC_DIR = os.path.join(os.path.dirname(__file__), "..", "var", "etc") + parser = argparse.ArgumentParser(add_help=False) opt_config = "--config" parser.add_argument(opt_config, type=str, default="", help="Path to config") @@ -88,7 +91,13 @@ OSM_TOOLS_PATH = os.path.join(_WORK_PATH, "osmctools") # Generator tool section: NODE_STORAGE = "mem" if total_virtual_memory() / 10 ** 9 >= 64 else "map" -USER_RESOURCE_PATH = os.path.join(OMIM_PATH, "data") + +_omim_data_dir = "omim-data" +USER_RESOURCE_PATH = os.path.join(sys.prefix, _omim_data_dir) +if not os.path.exists(USER_RESOURCE_PATH): + USER_RESOURCE_PATH = os.path.join(site.USER_BASE, _omim_data_dir) +if not os.path.exists(USER_RESOURCE_PATH): + USER_RESOURCE_PATH = os.path.join(OMIM_PATH, "data") # Stages section: NEED_PLANET_UPDATE = False @@ -115,7 +124,7 @@ SRTM_PATH = "" ISOLINES_PATH = "" # Stats section: -STATS_TYPES_CONFIG = "" +STATS_TYPES_CONFIG = os.path.join(ETC_DIR, "stats_types_config.txt") # Other variables: PLANET = "planet" diff --git a/tools/python/maps_generator/requirements.txt b/tools/python/maps_generator/requirements.txt index 77402d564a..1081a8dd8b 100644 --- a/tools/python/maps_generator/requirements.txt +++ b/tools/python/maps_generator/requirements.txt @@ -1,5 +1,6 @@ --r ../post_generation/requirements.txt --r ../descriptions/requirements.txt +omim-data-all +omim-descriptions +omim-post_generation filelock==3.0.10 beautifulsoup4==4.9.1 requests==2.23.0 diff --git a/tools/python/maps_generator/requirements_dev.txt b/tools/python/maps_generator/requirements_dev.txt new file mode 100644 index 0000000000..77402d564a --- /dev/null +++ b/tools/python/maps_generator/requirements_dev.txt @@ -0,0 +1,6 @@ +-r ../post_generation/requirements.txt +-r ../descriptions/requirements.txt +filelock==3.0.10 +beautifulsoup4==4.9.1 +requests==2.23.0 +requests_file==1.5.1 diff --git a/tools/python/maps_generator/setup.py b/tools/python/maps_generator/setup.py new file mode 100755 index 0000000000..098ada33c0 --- /dev/null +++ b/tools/python/maps_generator/setup.py @@ -0,0 +1,37 @@ +#!/usr/bin/env python +import os +import sys + +import setuptools + +module_dir = os.path.abspath(os.path.dirname(__file__)) +sys.path.insert(0, os.path.join(module_dir, "..", "..", "..")) + +from pyhelpers.setup import chdir +from pyhelpers.setup import get_version +from pyhelpers.setup import get_requirements + + +with chdir(os.path.abspath(os.path.dirname(__file__))): + setuptools.setup( + name="omim-maps_generator", + version=str(get_version()), + author="My.com B.V. (Mail.Ru Group)", + author_email="dev@maps.me", + description="This package contains tools for maps generation.", + url="https://github.com/mapsme", + package_dir={"maps_generator": ""}, + package_data={"": ["var/*"]}, + packages=[ + "maps_generator", + "maps_generator.generator", + "maps_generator.utils", + "maps_generator.checks" + ], + classifiers=[ + "Programming Language :: Python :: 3", + "License :: OSI Approved :: Apache Software License", + ], + python_requires=">=3.6", + install_requires=get_requirements(), + ) diff --git a/tools/python/mwm/__init__.py b/tools/python/mwm/__init__.py index 95effadff3..bcf5e15eb8 100644 --- a/tools/python/mwm/__init__.py +++ b/tools/python/mwm/__init__.py @@ -1,8 +1,15 @@ import os +import site +import sys -resource_path = os.path.join( - os.path.dirname(os.path.realpath(__file__)), "..", "..", "..", "data", -) +_omim_data_dir = "omim-data" +resource_path = os.path.join(sys.prefix, _omim_data_dir) +if not os.path.exists(resource_path): + resource_path = os.path.join(site.USER_BASE, _omim_data_dir) +if not os.path.exists(resource_path): + resource_path = os.path.join( + os.path.dirname(os.path.realpath(__file__)), "..", "..", "..", "data", + ) from mwm.types import init as _init diff --git a/tools/python/mwm/requirements.txt b/tools/python/mwm/requirements.txt index e69de29bb2..ee4ec8ea54 100644 --- a/tools/python/mwm/requirements.txt +++ b/tools/python/mwm/requirements.txt @@ -0,0 +1,2 @@ +omim-data-basic +omim-pygen \ No newline at end of file diff --git a/tools/python/mwm/requirements_dev.txt b/tools/python/mwm/requirements_dev.txt new file mode 100644 index 0000000000..e69de29bb2 diff --git a/tools/python/mwm/setup.py b/tools/python/mwm/setup.py new file mode 100755 index 0000000000..475dbc11be --- /dev/null +++ b/tools/python/mwm/setup.py @@ -0,0 +1,31 @@ +#!/usr/bin/env python +import os +import sys + +import setuptools + +module_dir = os.path.abspath(os.path.dirname(__file__)) +sys.path.insert(0, os.path.join(module_dir, "..", "..", "..")) + +from pyhelpers.setup import chdir +from pyhelpers.setup import get_version +from pyhelpers.setup import get_requirements + + +with chdir(os.path.abspath(os.path.dirname(__file__))): + setuptools.setup( + name="omim-mwm", + version=str(get_version()), + author="My.com B.V. (Mail.Ru Group)", + author_email="dev@maps.me", + description="This package is a library that can work with mwm files.", + url="https://github.com/mapsme", + package_dir={"mwm": ""}, + packages=["mwm"], + classifiers=[ + "Programming Language :: Python :: 3", + "License :: OSI Approved :: Apache Software License", + ], + python_requires=">=3.6", + install_requires=get_requirements(), + ) diff --git a/tools/python/post_generation/requirements.txt b/tools/python/post_generation/requirements.txt index b4fb832e2d..bc38829902 100644 --- a/tools/python/post_generation/requirements.txt +++ b/tools/python/post_generation/requirements.txt @@ -1 +1 @@ --r ../mwm/requirements.txt \ No newline at end of file +omim-mwm \ No newline at end of file diff --git a/tools/python/post_generation/requirements_dev.txt b/tools/python/post_generation/requirements_dev.txt new file mode 100644 index 0000000000..b4fb832e2d --- /dev/null +++ b/tools/python/post_generation/requirements_dev.txt @@ -0,0 +1 @@ +-r ../mwm/requirements.txt \ No newline at end of file diff --git a/tools/python/post_generation/setup.py b/tools/python/post_generation/setup.py new file mode 100644 index 0000000000..7688a5e7cf --- /dev/null +++ b/tools/python/post_generation/setup.py @@ -0,0 +1,31 @@ +#!/usr/bin/env python +import os +import sys + +import setuptools + +module_dir = os.path.abspath(os.path.dirname(__file__)) +sys.path.insert(0, os.path.join(module_dir, "..", "..", "..")) + +from pyhelpers.setup import chdir +from pyhelpers.setup import get_version +from pyhelpers.setup import get_requirements + + +with chdir(os.path.abspath(os.path.dirname(__file__))): + setuptools.setup( + name="omim-post_generation", + version=str(get_version()), + author="My.com B.V. (Mail.Ru Group)", + author_email="dev@maps.me", + description="This package is a library for post-processing the generated maps.", + url="https://github.com/mapsme", + package_dir={"post_generation": ""}, + packages=["post_generation"], + classifiers=[ + "Programming Language :: Python :: 3", + "License :: OSI Approved :: Apache Software License", + ], + python_requires=">=3.6", + install_requires=get_requirements(), + )