#!/usr/bin/env python

#  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 setuptools import setup

DESC = """Search plugin for Apache(TM) Bloodhound.

Add free text search and query functionality to Bloodhound sites.
"""

versions = [
    (0, 4, 0),
    (0, 5, 0),
    (0, 6, 0),
    (0, 7, 0),
    (0, 8, 0),
    (0, 9, 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 = 'BloodhoundSearchPlugin'
PKG_INFO = {'bhsearch': ('bhsearch',  # 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'],
                         ),
            'bhsearch.search_resources': (
                'bhsearch/search_resources',  # Package dir
                []
            ),
            #            'search.widgets' : ('bhsearch/widgets',     # Package dir
            #                            # Package data
            #                            ['templates/*', 'htdocs/*.css'],
            #                          ),
            #            'search.layouts' : ('bhsearch/layouts',     # Package dir
            #                            # Package data
            #                            ['templates/*'],
            #                          ),
            'bhsearch.tests': ('bhsearch/tests',  # Package dir
                               # Package data
                               ['data/*.*'],
                               ),
            'bhsearch.tests.search_resources': (
                'bhsearch/tests/search_resources',  # Package dir
                # Package data
                ['data/*.*'],
            ),
            'bhsearch.utils': ('bhsearch/utils',  # Package dir
                               # Package data
                               [],
                               ),
            }

ENTRY_POINTS = {
    'trac.plugins': [
        'bhsearch.web_ui = bhsearch.web_ui',
        'bhsearch.api = bhsearch.api',
        'bhsearch.admin = bhsearch.admin',
        'bhsearch.search_resources.changeset_search =\
            bhsearch.search_resources.changeset_search',
        'bhsearch.search_resources.ticket_search =\
            bhsearch.search_resources.ticket_search',
        'bhsearch.search_resources.wiki_search = \
            bhsearch.search_resources.wiki_search',
        'bhsearch.search_resources.milestone_search = \
            bhsearch.search_resources.milestone_search',
        'bhsearch.query_parser = bhsearch.query_parser',
        'bhsearch.query_suggestion = bhsearch.query_suggestion',
        'bhsearch.security = bhsearch.security',
        'bhsearch.whoosh_backend = bhsearch.whoosh_backend',
    ],
}

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'] = {
            'bhsearch': 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'],
    install_requires=['whoosh>=2.5.1'],
    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='bhsearch.tests.test_suite',
    tests_require=['unittest2'] if sys.version_info < (2, 7) else [],
    **extra
)
