blob: e4974bdc9b9e243e0bc8b2b76287b188bf091224 [file]
##########################################################################
# Licensed to the Apache Software Foundation (ASF) under one
# or more contributor license agreements. See the NOTICE file
# distributed with this work for additional information
# regarding copyright ownership. The ASF licenses this file
# to you 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.
##########################################################################
import atexit
import os
import shutil
import subprocess
import sys
import tarfile
import tempfile
from setuptools import find_packages, setup
VERSION = "1.5.dev"
def get_dev_version():
"""Generate dev version with commit date.
Format: 1.5.devYYYYMMDD (e.g. 1.5.dev20260415)
Uses the commit date (author date) for reproducibility.
"""
base = VERSION.rstrip(".")
if not base.endswith("dev"):
return None
try:
date_str = subprocess.check_output(
["git", "log", "-1", "--format=%cd", "--date=format:%Y%m%d"],
stderr=subprocess.DEVNULL
).decode("utf-8").strip()
except Exception:
print("Warning: git not available, skipping dev package.")
return None
return base + date_str
def _build_dev_package():
"""After sdist completes, repack a copy with dev version."""
if "sdist" not in sys.argv:
return
dev_version = get_dev_version()
if dev_version is None:
return
from packaging.version import Version
normalized = str(Version(VERSION))
dev_normalized = str(Version(dev_version))
src_name = "pypaimon-{}".format(normalized)
dev_name = "pypaimon-{}".format(dev_normalized)
src_tar = os.path.join("dist", src_name + ".tar.gz")
if not os.path.exists(src_tar):
return
tmp_dir = tempfile.mkdtemp()
try:
with tarfile.open(src_tar, "r:gz") as tar:
tar.extractall(tmp_dir)
src_dir = os.path.join(tmp_dir, src_name)
dev_dir = os.path.join(tmp_dir, dev_name)
os.rename(src_dir, dev_dir)
# Update version in PKG-INFO files
for pkg_info in [
os.path.join(dev_dir, "PKG-INFO"),
os.path.join(dev_dir, "pypaimon.egg-info", "PKG-INFO"),
]:
if os.path.exists(pkg_info):
with open(pkg_info, "r") as f:
content = f.read()
content = content.replace(
"Version: " + normalized,
"Version: " + dev_normalized
)
with open(pkg_info, "w") as f:
f.write(content)
# Update VERSION in setup.py so pip install gets the correct version
setup_py = os.path.join(dev_dir, "setup.py")
if os.path.exists(setup_py):
with open(setup_py, "r") as f:
content = f.read()
content = content.replace(
'VERSION = "' + VERSION + '"',
'VERSION = "' + dev_version + '"'
)
with open(setup_py, "w") as f:
f.write(content)
dev_tar = os.path.join("dist", dev_name + ".tar.gz")
with tarfile.open(dev_tar, "w:gz") as tar:
tar.add(dev_dir, arcname=dev_name)
print("Created dev package: " + dev_tar)
finally:
shutil.rmtree(tmp_dir)
atexit.register(_build_dev_package)
PACKAGES = find_packages(include=["pypaimon*"], exclude=["pypaimon.tests*"])
def read_requirements():
"""Read requirements from dev/requirements.txt file."""
requirements_path = os.path.join(os.path.dirname(__file__), 'dev', 'requirements.txt')
requirements = []
if os.path.exists(requirements_path):
with open(requirements_path, 'r', encoding='utf-8') as f:
for line in f:
line = line.strip()
# Skip empty lines and comments
if line and not line.startswith('#'):
requirements.append(line)
return requirements
install_requires = read_requirements()
long_description = "See Apache Paimon Python API \
[Doc](https://paimon.apache.org/docs/master/pypaimon/python-api/) for usage."
setup(
name="pypaimon",
version=VERSION,
packages=PACKAGES,
include_package_data=True,
install_requires=install_requires,
entry_points={
'console_scripts': [
'paimon=pypaimon.cli:main',
],
},
extras_require={
'ray': [
'ray>=2.10,<3; python_version>="3.7"',
],
'torch': [
'torch',
],
'daft': [
'daft>=0.7.6; python_version>="3.10"',
],
'oss': [
'ossfs>=2021.8; python_version<"3.8"',
'ossfs>=2023; python_version>="3.8"'
],
'jindo': [
'pyjindosdk>=6.10.4',
],
'lance': [
'pylance>=0.20,<1; python_version>="3.9"',
'pylance>=0.10,<1; python_version>="3.8" and python_version<"3.9"'
],
'vortex': [
'vortex-data==0.70.0; python_version>="3.11"',
],
'mosaic': [
'paimon-mosaic>=0.1.0',
],
'lumina': [
'lumina-data>=0.1.0'
],
'sql': [
'pypaimon-rust; python_version>="3.10"',
'datafusion>=52; python_version>="3.10"',
],
'hdfs': [
'hdfs-native>=0.13,<1; python_version >= "3.10" and platform_system != "Windows"',
],
},
description="Apache Paimon Python API",
long_description=long_description,
long_description_content_type="text/markdown",
author="Apache Software Foundation",
author_email="dev@paimon.apache.org",
url="https://paimon.apache.org",
classifiers=[
"Development Status :: 5 - Production/Stable",
"License :: OSI Approved :: Apache Software License",
"Programming Language :: Python :: 3.6",
"Programming Language :: Python :: 3.7",
"Programming Language :: Python :: 3.8",
"Programming Language :: Python :: 3.9",
"Programming Language :: Python :: 3.10",
"Programming Language :: Python :: 3.11",
],
python_requires=">=3.6",
)