#!/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.
"""
Test for an order of dependencies in setup.py
"""

import os
import re
import unittest


class TestOrderSetup(unittest.TestCase):

    def setUp(self):
        current_dir = os.path.dirname(os.path.abspath(__file__))
        parent_dir = os.path.dirname(current_dir)
        self.setup_file = open('{parent_dir}/setup.py'.format(parent_dir=parent_dir))
        self.setup_context = self.setup_file.read()

    def tearDown(self):
        self.setup_file.close()

    def test_main_dependent_group(self):
        """
        Test for an order of dependencies groups between mark
        '# Start dependencies group' and '# End dependencies group' in setup.py
        """
        pattern_main_dependent_group = re.compile(
            '# Start dependencies group\n(.*)# End dependencies group', re.DOTALL)
        main_dependent_group = pattern_main_dependent_group.findall(self.setup_context)[0]

        pattern_sub_dependent = re.compile(' = \\[.*?\\]\n', re.DOTALL)
        main_dependent = pattern_sub_dependent.sub(',', main_dependent_group)

        src = main_dependent.strip(',').split(',')
        alphabetical = sorted(src)
        self.assertListEqual(alphabetical, src)

    def test_sub_dependent_group(self):
        """
        Test for an order of each dependencies groups declare like
        `^dependent_group_name = [.*?]\n` in setup.py
        """
        pattern_dependent_group_name = re.compile('^(\\w+) = \\[', re.MULTILINE)
        dependent_group_names = pattern_dependent_group_name.findall(self.setup_context)

        pattern_dependent_version = re.compile('[~|>|<|=|;].*')
        for group_name in dependent_group_names:
            pattern_sub_dependent = re.compile(
                '{group_name} = \\[(.*?)\\]'.format(group_name=group_name), re.DOTALL)
            sub_dependent = pattern_sub_dependent.findall(self.setup_context)[0]
            pattern_dependent = re.compile('\'(.*?)\'')
            dependent = pattern_dependent.findall(sub_dependent)

            src = [pattern_dependent_version.sub('', p) for p in dependent]
            alphabetical = sorted(src)
            self.assertListEqual(alphabetical, src)

    def test_alias_dependent_group(self):
        """
        Test for an order of each dependencies groups declare like
        `alias_dependent_group = dependent_group_1 + ... + dependent_group_n` in setup.py
        """
        pattern = re.compile('^\\w+ = (\\w+ \\+.*)', re.MULTILINE)
        dependents = pattern.findall(self.setup_context)
        for dependent in dependents:
            src = dependent.split(' + ')
            alphabetical = sorted(src)
            self.assertListEqual(alphabetical, src)

    def test_devel_all(self):
        """
        Test for an order of dependencies groups
        devel_all = (dependent_group_1 + ... + dependent_group_n) in setup.py
        """
        pattern = re.compile('devel_all = \\((.*?)\\)', re.DOTALL)
        dependent = pattern.findall(self.setup_context)[0]
        pattern_new_line = re.compile('\\n *')

        src = pattern_new_line.sub(' ', dependent).split(' + ')
        alphabetical = sorted(src)
        self.assertListEqual(alphabetical, src)

    def test_install_and_setup_requires(self):
        """
        Test for an order of dependencies in function do_setup section
        install_requires and setup_requires in setup.py
        """
        pattern_install_and_setup_requires = re.compile(
            '(install_requires|setup_requires)=\\[(.*?)\\]', re.DOTALL)
        install_and_setup_requires = pattern_install_and_setup_requires.findall(self.setup_context)

        for dependent_requires in install_and_setup_requires:
            pattern_dependent = re.compile('\'(.*?)\'')
            dependent = pattern_dependent.findall(dependent_requires[1])
            pattern_dependent_version = re.compile('[~|>|<|=|;].*')

            src = [pattern_dependent_version.sub('', p) for p in dependent]
            alphabetical = sorted(src)
            self.assertListEqual(alphabetical, src)

    def test_extras_require(self):
        """
        Test for an order of dependencies in function do_setup section
        extras_require in setup.py
        """
        pattern_extras_requires = re.compile('extras_require=\\{(.*?)\\}', re.DOTALL)
        extras_requires = pattern_extras_requires.findall(self.setup_context)[0]

        pattern_dependent = re.compile('\'(.*?)\'')
        src = pattern_dependent.findall(extras_requires)
        alphabetical = sorted(src)
        self.assertListEqual(alphabetical, src)


if __name__ == '__main__':
    unittest.main(verbosity=2)
