kfp-tekton/sdk/python/setup.py

210 lines
7.2 KiB
Python

# Copyright 2020-2021 kubeflow.org
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
# =============================================================================
# To install the kfp_tekton project run:
#
# $ pip3 install -e .
#
# To create a distribution for PyPi run:
#
# $ export KFP_TEKTON_VERSION=1.2.3-rc1
# $ python3 setup.py sdist
# $ twine check dist/kfp-tekton-${KFP_TEKTON_VERSION/-rc/rc}.tar.gz
# $ twine upload --repository pypi dist/kfp-tekton-${KFP_TEKTON_VERSION/-rc/rc}.tar.gz
#
# ... or:
#
# $ make distribution KFP_TEKTON_VERSION=1.2.3-rc1
#
# =============================================================================
import logging
import re
import sys
from os import environ as env
from os.path import abspath, dirname, join
from setuptools import setup
NAME = "kfp-tekton"
# VERSION = ... set the version in kfp_tekton/__init__.py or use KFP_TEKTON_VERSION env var
LICENSE = "Apache 2.0"
HOMEPAGE = "https://github.com/kubeflow/kfp-tekton/"
DESCRIPTION = "Tekton Compiler for Kubeflow Pipelines"
LONG_DESCRIPTION = """\
The kfp-tekton project is an extension of the Kubeflow Pipelines SDK compiler
generating Tekton YAML instead of Argo YAML. The project is still in an early
development stage. Contributions are welcome: {}
""".format(HOMEPAGE)
# NOTICE, after any updates to the following, ./requirements.in should be updated
# accordingly.
REQUIRES = [
"kfp>=1.8.10,<1.8.14",
]
TESTS_REQUIRE = [
'pytest',
]
logging.basicConfig()
logger = logging.getLogger("kfp_tekton/setup.py")
logger.setLevel(logging.INFO)
def find_version(*file_path_parts):
if "KFP_TEKTON_VERSION" in env:
version = env.get("KFP_TEKTON_VERSION")
logger.warning("Using KFP_TEKTON_VERSION={}".format(version))
return version
here = abspath(dirname(__file__))
with open(join(here, *file_path_parts), 'r') as fp:
version_file_text = fp.read()
version_match = re.search(
r"^__version__ = ['\"]([^'\"]*)['\"]",
version_file_text,
re.M,
)
if version_match:
return version_match.group(1)
raise RuntimeError("Unable to find version string.")
def get_long_description() -> str:
"""Extract the content of the sdk/README.md and replace relative links when
running `python3 setup.py sdist`. Return the abbreviated LONG_DESCRIPTION when
running `pip install .`
:return: long_description, Github flavored Markdown from the sdk/README.md
"""
if "sdist" not in sys.argv:
# log messages are only displayed when running `pip --verbose`
logger.warning("This not a distribution build. Using abbreviated "
"long_description: \"{}\"".format(LONG_DESCRIPTION))
return LONG_DESCRIPTION
else:
logger.warning(
"Building a distribution. Using the sdk/README.md for the "
"long_description to be displayed on the PyPi landing page.")
here = abspath(dirname(__file__))
project_root = join(here, "..", "..")
sdk_readme_file = join(project_root, "sdk", "README.md")
with open(sdk_readme_file, "r") as f:
long_description = f.read()
# replace relative links from sdk/README.md with be absolute links to GitHub
github_repo_master_path = "{}/blob/master".format(HOMEPAGE.rstrip("/"))
# replace relative links that are siblings to the README, i.e. [link text](FEATURES.md)
long_description = re.sub(
r"\[([^]]+)\]\((?!http|#|/)([^)]+)\)",
r"[\1]({}/{}/\2)".format(github_repo_master_path, "sdk"),
long_description)
# replace links that are relative to the project root, i.e. [link text](/sdk/FEATURES.md)
long_description = re.sub(
r"\[([^]]+)\]\(/([^)]+)\)",
r"[\1]({}/\2)".format(github_repo_master_path),
long_description)
# add anchor link targets around headings for links from table-of-contents (TOC)
text = []
for line in long_description.splitlines():
matches = re.match(r'^(#+) (.*)$', line)
if matches:
line = '<h{}><a id="{}">{}</a></h{}>'.format(
len(matches.group(1)),
re.sub(r"[`.()]", "", matches.group(2).replace(" ", "-").lower()),
matches.group(2),
len(matches.group(1))
)
text.append(line)
long_description = "\n".join(text)
# generate the README with absolute links for easy side-by-side comparison
sdk_readme_w_abs_links = join(project_root, "sdk", "README_for_PyPi.md")
with open(sdk_readme_w_abs_links, 'w') as f:
f.write(long_description)
# verify all replaced links
import requests # top-level import fails pip install, only required for make dist
invalid_links = []
for (text, link) in re.findall(r"\[([^]]+)\]\((%s[^)]+)\)" % "http",
long_description):
logger.info("checking link: {}".format(link))
response = requests.head(link, allow_redirects=True, timeout=3)
if response.status_code >= 400:
invalid_links.append((text, link))
# report all invalid links
if invalid_links:
links = ["[{}]({})".format(text, link) for (text, link) in invalid_links]
for l in links:
logger.error("invalid link: {}".format(l))
raise RuntimeError(
"Invalid link(s) in long_description: {}"
"Please open an issue at {}/issues".format(
links, HOMEPAGE.rstrip("/")))
return long_description
setup(
name=NAME,
version=find_version("kfp_tekton", "__init__.py"),
description=DESCRIPTION,
long_description=get_long_description(),
long_description_content_type="text/markdown",
author="kubeflow.org",
license=LICENSE,
url=HOMEPAGE,
install_requires=REQUIRES,
tests_require=TESTS_REQUIRE,
packages=[
'kfp_tekton',
'kfp_tekton.compiler',
],
classifiers=[
'Intended Audience :: Developers',
'Intended Audience :: Education',
'Intended Audience :: Science/Research',
'License :: OSI Approved :: Apache Software License',
'Programming Language :: Python :: 3',
'Programming Language :: Python :: 3.6',
'Programming Language :: Python :: 3.7',
'Programming Language :: Python :: 3.8',
'Topic :: Scientific/Engineering',
'Topic :: Scientific/Engineering :: Artificial Intelligence',
'Topic :: Software Development',
'Topic :: Software Development :: Libraries',
'Topic :: Software Development :: Libraries :: Python Modules',
],
python_requires='>=3.6.1',
include_package_data=True,
entry_points={
'console_scripts': [
'dsl-compile-tekton = kfp_tekton.compiler.main:main'
]
})