setup.py (122 lines of code) (raw):
# Copyright (c) Facebook, Inc. and its affiliates. (http://www.facebook.com)
# -*- coding: utf-8 -*-
"""
setup.py
This file implements the configuration for uploading the projec to PyPi
Reference::
1. https://packaging.python.org/tutorials/packaging-projects/
2. https://www.youtube.com/watch?v=GIF3LaRqgXo
:copyright: (c) 2021 Facebook
:license: MIT LICENSE
"""
# Packages
import setuptools # setup, find_packages, Command
import os
import sys
import json
import shutil
# Setup variables. Change as needed
NAME = "mapillary"
VERSION = "1.0.3"
AUTHOR = "Christopher Beddow"
AUTHOR_EMAIL = "support@mapillary.zendesk.com"
LICENSE = "MIT"
PLATFORM = ["POSIX", "MacOS X", "Linux", "Windows"]
DESCRIPTION = (
"A Python 3 library built on the Mapillary API v4 to facilitate retrieving and "
"working with Mapillary data"
)
LONG_DESCRIPTION_CONTENT_TYPE = "text/markdown"
URL = "https://github.com/mapillary/mapillary-python-sdk"
REQUIRES_PYTHON = ">=3.0"
HERE = os.path.abspath(os.path.dirname(__file__))
REQUIREMENTS = [
"mercantile",
"mapbox-vector-tile",
"pytest",
"vt2geojson",
"shapely",
"turfpy",
]
CLASSIFIERS = [
"Development Status :: 5 - Production/Stable",
"Intended Audience :: Developers",
"Intended Audience :: Science/Research",
"Topic :: Scientific/Engineering :: GIS",
"Topic :: Scientific/Engineering :: Information Analysis",
"Natural Language :: English",
"Operating System :: OS Independent",
"Operating System :: POSIX :: Linux",
"Operating System :: Microsoft",
"Operating System :: MacOS",
"Operating System :: POSIX",
"License :: OSI Approved :: MIT License",
"Programming Language :: Python",
"Programming Language :: Python :: 3",
"Programming Language :: Python :: 3.5",
"Programming Language :: Python :: 3.6",
"Programming Language :: Python :: 3.7",
"Programming Language :: Python :: 3.8",
"Programming Language :: Python :: 3.9",
]
PROJECT_URLS = {
"Download": "https://pypi.org/project/mapillary/#files",
"Release Notes": "https://github.com/mapillary/mapillary-python-sdk/releases",
"Bug Tracker": "https://github.com/mapillary/mapillary-python-sdk/issues",
"Source": "https://github.com/mapillary/mapillary-python-sdk",
"Twitter": "https://twitter.com/mapillary",
"Developer Resources": "https://www.mapillary.com/developer",
"Community Forum": "https://forum.mapillary.com/",
"Blog": "https://blog.mapillary.com/",
"Facebook": "https://www.facebook.com/mapillary/",
"Website": "https://www.mapillary.com/",
}
PACKAGE_DIR = {"": "src"}
# Import the README and use it as the long-description.
# Note: this will only work if 'README.md' is present in your MANIFEST.in file!
try:
with open(os.path.join(HERE, "README.md"), encoding="utf-8") as f:
LONG_DESCRIPTION = "\n" + f.read()
except FileNotFoundError:
LONG_DESCRIPTION = DESCRIPTION
def locked_requirements(section):
"""Look through the 'Pipfile.lock' to fetch requirements by section."""
with open("Pipfile.lock") as pip_file:
pipfile_json = json.load(pip_file)
if section not in pipfile_json:
print("{0} section missing from Pipfile.lock".format(section))
return []
return [
package + detail.get("version", "")
for package, detail in pipfile_json[section].items()
]
class UploadCommand(setuptools.Command):
"""Support setup.py upload."""
description = "Build and publish the package."
user_options = []
@staticmethod
def status(s):
"""Prints things in bold."""
print("\033[1m{0}\033[0m".format(s))
def initialize_options(self):
pass
def finalize_options(self):
pass
def run(self):
try:
self.status("Removing previous builds…")
shutil.rmtree(os.path.join(HERE, "dist"))
except OSError:
pass
self.status("Building Source and Wheel (universal) distribution…")
os.system(f"{sys.executable} setup.py sdist bdist_wheel --universal")
self.status("Uploading the package to PyPI via Twine…")
os.system("twine upload dist/*")
self.status("Pushing git tags…")
os.system(f"git tag v{VERSION}")
os.system("git push --tags")
sys.exit()
# Where the magic happens
setuptools.setup(
# METADATA
# # Package name
name=NAME,
# # Package versioning
version=VERSION,
# # Author name(s)
author=AUTHOR,
# # License
license=LICENSE,
# # Platform specification
platforms=PLATFORM,
# # Author email(s)
author_email=AUTHOR_EMAIL,
# # Short description about the package
description=DESCRIPTION,
# # Long descirption about the package
long_description=LONG_DESCRIPTION,
# # Content type of the long description
long_description_content_type=LONG_DESCRIPTION_CONTENT_TYPE,
# # URL to the project on GitHub
url=URL,
# # Dictionary of useful project related URLs
project_urls=PROJECT_URLS,
# Codebase, Wheel, Egg Setup
# Setuptools for finding other needed packages from Pipfile
packages=setuptools.find_packages(where="src"),
# # Specifiy the package directory
package_dir=PACKAGE_DIR,
# # A string or list of strings specifying what other distributions need to be installed
# # when this one is
install_requires=locked_requirements("default"),
# # What Python version is required
python_requires=REQUIRES_PYTHON,
# # What package data to include
include_package_data=True,
# # List of classifiers for metadata on PyPI
classifiers=CLASSIFIERS,
# # What commands to run
cmdclass={
"upload": UploadCommand,
},
# # A dictionary mapping names of “extras” (optional features of your project) to strings or
# # lists of strings specifying what other distributions must be installed to support those
# # features
# # Right now, this fetches development dependencies which are un-needed
# extras_require={"dev": locked_requirements("develop")},
)