210 lines
7.2 KiB
Python
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.3.0-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.3.0-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'
|
|
]
|
|
})
|