#
# 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.
#

"""pulsar functions setuptools based setup module"""
import os, re, sys
from setuptools import setup, find_packages

package_name = "pulsarfunction"
release_version = "VERSION"

# read the requirements file
here = os.path.abspath(os.path.dirname(__file__))
requirement_file = os.path.join(here, 'requirements.txt')
with open(requirement_file, 'r') as f:
  raw_requirements = f.read().strip()

requirements = raw_requirements.split('\n')
print "Requirements: %s" % requirements

long_description = "The pulsarfunctin package enables you to write Pulsar Functions in Python. " \
                   "Pulsar Functions can be run under different deployment models, either alongside " \
                   "brokers, separate compute workers or locally"

setup(
  name=package_name,
  version=release_version,
  description='Pulsar Function API',
  long_description=long_description,

  url='https://github.com/apache/pulsar',

  author='Pulsar Team',
  author_email='dev@pulsar.incubator.apache.org',

  classifiers=[
    'Development Status :: 3 - Alpha',

    'Intended Audience :: Developers',

    'Programming Language :: Python',
  ],

  keywords='pulsar function python',
  packages=find_packages(),

  install_requires=requirements
)
