#!/usr/bin/env python3

#
# 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 bgit y 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 setuptools

with open("README.md", "r") as fh:
    long_description = fh.read()

with open('requirements.txt') as f:
    requirements = f.read().splitlines()
    print(requirements)

setuptools.setup(
    name="liminal",
    version=os.environ["LIMINAL_BUILD_VERSION"],
    author="liminal team",
    description="A package for authoring and deploying machine learning workflows",
    long_description=long_description,
    long_description_content_type="text/markdown",
    url="https://github.com/apache/incubator-liminal",
    packages=setuptools.find_packages(),
    classifiers=[
        "Programming Language :: Python :: 3",
        "License :: OSI Approved :: Apache Software License",
        "Operating System :: OS Independent",
    ],
    license='Apache License, Version 2.0',
    python_requires='>=3.6',
    install_requires=requirements,
    scripts=['scripts/liminal', 'scripts/package.sh'],
    include_package_data=True,
    data_files=[('liminal-resources', ['scripts/docker-compose.yml',
                                       'requirements-airflow.txt',
                                       'liminal/runners/airflow/dag/liminal_dags.py'])]
)
