#!/usr/bin/env python """The setup and build script for the python-telegram-bot library.""" import subprocess import sys from pathlib import Path from setuptools import find_packages, setup def get_requirements(raw=False): """Build the requirements list for this project""" requirements_list = [] with Path("requirements.txt").open() as reqs: for install in reqs: if install.startswith("# only telegram.ext:"): if raw: break continue requirements_list.append(install.strip()) return requirements_list def get_packages_requirements(raw=False): """Build the package & requirements list for this project""" reqs = get_requirements(raw=raw) exclude = ["tests*"] if raw: exclude.append("telegram.ext*") packs = find_packages(exclude=exclude) return packs, reqs def get_setup_kwargs(raw=False): """Builds a dictionary of kwargs for the setup function""" packages, requirements = get_packages_requirements(raw=raw) raw_ext = "-raw" if raw else "" readme = Path(f'README{"_RAW" if raw else ""}.rst') version_file = Path("telegram/_version.py").read_text() first_part = version_file.split("# SETUP.PY MARKER")[0] exec(first_part) kwargs = dict( script_name=f"setup{raw_ext}.py", name=f"python-telegram-bot{raw_ext}", version=locals()["__version__"], author="Leandro Toledo", author_email="devs@python-telegram-bot.org", license="LGPLv3", url="https://python-telegram-bot.org/", # Keywords supported by PyPI can be found at https://github.com/pypa/warehouse/blob/aafc5185e57e67d43487ce4faa95913dd4573e14/warehouse/templates/packaging/detail.html#L20-L58 project_urls={ "Documentation": "https://python-telegram-bot.readthedocs.io", "Bug Tracker": "https://github.com/python-telegram-bot/python-telegram-bot/issues", "Source Code": "https://github.com/python-telegram-bot/python-telegram-bot", "News": "https://t.me/pythontelegrambotchannel", "Changelog": "https://python-telegram-bot.readthedocs.io/en/stable/changelog.html", }, download_url=f"https://pypi.org/project/python-telegram-bot{raw_ext}/", keywords="python telegram bot api wrapper", description="We have made you a wrapper you can't refuse", long_description=readme.read_text(), long_description_content_type="text/x-rst", packages=packages, install_requires=requirements, extras_require={ "socks": "httpx[socks]", # json and cryptography are very stable, so we use a reasonably new version as # lower bound and have no upper bound "json": "ujson>=4.0.0", # 3.4-3.4.3 contained some cyclical import bugs "passport": "cryptography!=3.4,!=3.4.1,!=3.4.2,!=3.4.3,>=3.0", }, include_package_data=True, classifiers=[ "Development Status :: 5 - Production/Stable", "Intended Audience :: Developers", "License :: OSI Approved :: GNU Lesser General Public License v3 (LGPLv3)", "Operating System :: OS Independent", "Topic :: Software Development :: Libraries :: Python Modules", "Topic :: Communications :: Chat", "Topic :: Internet", "Programming Language :: Python", "Programming Language :: Python :: 3", "Programming Language :: Python :: 3.7", "Programming Language :: Python :: 3.8", "Programming Language :: Python :: 3.9", "Programming Language :: Python :: 3.10", ], python_requires=">=3.7", ) return kwargs def main(): # If we're building, build ptb-raw as well if set(sys.argv[1:]) in [{"bdist_wheel"}, {"sdist"}, {"sdist", "bdist_wheel"}]: args = ["python", "setup-raw.py"] args.extend(sys.argv[1:]) subprocess.run(args, check=True, capture_output=True) setup(**get_setup_kwargs(raw=False)) if __name__ == "__main__": main()