#!/usr/bin/env python
# -*- coding: UTF-8 -*-

#  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 sys
from pkg_resources import parse_version
try:
    from setuptools import setup
except ImportError:
    from distutils.core import setup

DESC = """Ticket relations plugin for Apache(TM) Bloodhound.

Add ticket relations functionality to Bloodhound sites.
"""

versions = [
    (0, 4, 0),
    (0, 5, 0),
    (0, 6, 0),
    (0, 7, 0),
    (0, 8, 0),
    ]

latest = '.'.join(str(x) for x in versions[-1])

status = {
    'planning' :  "Development Status :: 1 - Planning",
    'pre-alpha' : "Development Status :: 2 - Pre-Alpha",
    'alpha' :     "Development Status :: 3 - Alpha",
    'beta' :      "Development Status :: 4 - Beta",
    'stable' :    "Development Status :: 5 - Production/Stable",
    'mature' :    "Development Status :: 6 - Mature",
    'inactive' :  "Development Status :: 7 - Inactive"
    }
dev_status = status["alpha"]

cats = [
      dev_status,
      "Environment :: Plugins",
      "Environment :: Web Environment",
      "Framework :: Trac",
      "Intended Audience :: Developers",
      "Intended Audience :: Information Technology",
      "Intended Audience :: Other Audience",
      "Intended Audience :: System Administrators",
      "License :: Unknown",
      "Operating System :: OS Independent",
      "Programming Language :: Python",
      "Programming Language :: Python :: 2.5",
      "Programming Language :: Python :: 2.6",
      "Programming Language :: Python :: 2.7",
      "Topic :: Internet :: WWW/HTTP :: Dynamic Content :: CGI Tools/Libraries",
      "Topic :: Internet :: WWW/HTTP :: HTTP Servers",
      "Topic :: Internet :: WWW/HTTP :: WSGI",
      "Topic :: Software Development :: Bug Tracking",
      "Topic :: Software Development :: Libraries :: Application Frameworks",
      "Topic :: Software Development :: Libraries :: Python Modules",
      "Topic :: Software Development :: User Interfaces",
    ]

# Add the change log to the package description.
chglog = None
try:
    from os.path import dirname, join
    chglog = open(join(dirname(__file__), "CHANGES"))
    DESC+= ('\n\n' + chglog.read())
finally:
    if chglog:
        chglog.close()

DIST_NM = 'BloodhoundRelationsPlugin'
PKG_INFO = {'bhrelations': ('bhrelations',                     # Package dir
                            # Package data
                            ['../CHANGES', '../TODO', '../COPYRIGHT',
                              '../NOTICE', '../README', '../TESTING_README',
                              'htdocs/*.*', 'htdocs/css/*.css',
                              'htdocs/img/*.*', 'htdocs/js/*.js',
                              'templates/*', 'default-pages/*',
                              'locale/*/LC_MESSAGES/*.mo'],
                          ),
            'bhrelations.widgets': (
                'bhrelations/widgets', ['templates/*.html']),
            'bhrelations.tests': (
                'bhrelations/tests', ['data/*.*']),
            'bhrelations.utils': (
                'bhrelations/utils', []),
            }

ENTRY_POINTS = {
    'trac.plugins': [
        'bhrelations.api = bhrelations.api',
        'bhrelations.search = bhrelations.search',
        'bhrelations.validation = bhrelations.validation',
        'bhrelations.web_ui = bhrelations.web_ui',
        'bhrelations.widgets.ticketrelations = bhrelations.widgets.relations',
    ],
}

extra = {}
try:
    from trac.util.dist import get_l10n_cmdclass
    cmdclass = get_l10n_cmdclass()
    if cmdclass:
        extra['cmdclass'] = cmdclass
        extractors = [
            ('**.py',                'trac.dist:extract_python', None),
            ('**/templates/**.html', 'genshi', None),
            ('**/templates/**.txt',  'genshi', {
                'template_class': 'genshi.template:TextTemplate'
            }),
        ]
        extra['message_extractors'] = {
            'bhrelations': extractors,
        }
except ImportError:
    pass

setup(
    name=DIST_NM,
    version=latest,
    description=DESC.split('\n', 1)[0],
    author = "Apache Bloodhound",
    license = "Apache License v2",
    url = "https://bloodhound.apache.org/",
    requires = ['trac'],
    package_dir = dict([p, i[0]] for p, i in PKG_INFO.iteritems()),
    packages = PKG_INFO.keys(),
    package_data = dict([p, i[1]] for p, i in PKG_INFO.iteritems()),
    include_package_data=True,
    provides = ['%s (%s)' % (p, latest) for p in PKG_INFO.keys()],
    obsoletes = ['%s (>=%s.0.0, <%s)' % (p, versions[-1][0], latest) \
                  for p in PKG_INFO.keys()],
    entry_points = ENTRY_POINTS,
    classifiers = cats,
    long_description= DESC,
    test_suite='bhrelations.tests.test_suite',
    tests_require=['unittest2' if parse_version(sys.version) < parse_version('2.7') else ''],
    **extra
    )
