################################################################################
#  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 os
import sys

from setuptools import setup

this_directory = os.path.abspath(os.path.dirname(__file__))
version_file = os.path.join(this_directory, 'pypaimon/version.py')

try:
    exec(open(version_file).read())
except IOError:
    print("Failed to load PyPaimon version file for packaging. " +
          "'%s' not found!" % version_file,
          file=sys.stderr)
    sys.exit(-1)
VERSION = __version__  # noqa

PACKAGES = [
    'pypaimon',
    'pypaimon.api',
    'pypaimon.py4j',
    'pypaimon.py4j.util',
    'pypaimon.jars',
    'pypaimon.hadoop-deps'
]

install_requires = [
    'py4j==0.10.9.7',
    'pandas>=1.3.0',
    'pyarrow>=5.0.0',
    'polars>=1.31.0'
]

long_description = 'See Apache Paimon Python API \
[Doc](https://paimon.apache.org/docs/master/program-api/python-api/) for usage.'

setup(
    name='pypaimon',
    version=VERSION,
    packages=PACKAGES,
    include_package_data=True,
    # releasing tool will generate deps
    package_dir={
        "pypaimon.jars": "deps/jars",
        "pypaimon.hadoop-deps": "deps/hadoop"
    },
    package_data={
        "pypaimon.jars": ["*.jar"],
        "pypaimon.hadoop-deps": ["*.jar"]
    },
    install_requires=install_requires,
    extras_require={
        'avro': [
            'fastavro>=1.9.0',
            'zstandard>=0.23.0'
        ]
    },
    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.8',
        'Programming Language :: Python :: 3.9',
        'Programming Language :: Python :: 3.10',
        'Programming Language :: Python :: 3.11'],
    python_requires='>=3.8'
)
