#!/usr/bin/env python # Copyright (C) 2014 Codethink Limited # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; version 2 of the License. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License along # with this program; if not, write to the Free Software Foundation, Inc., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. import unittest import pip_find_deps from pkg_resources import parse_requirements, parse_version class ConflictDetectionTests(unittest.TestCase): def setUp(self): reqs = ['a == 0.1', 'a == 0.2'] self.test_requirements = parse_requirements(reqs) # ('==', '0.1') conflicts with ('>', 0.1) # ('==', '0.1') conflicts with ('!=', 0.1) # ('<', '0.1') conflicts with ('>', '0.1') # ('<=', 0.1) conflicts with ('>=', 0.2) # ('<', '0.1') conflicts with ('>', '0.2') def test_eqs_two_different_versions(self): # ('==', '0.1') conflicts with ('==', '0.2') deps = pip_find_deps.resolve_version_constraints( self.test_requirements) self.assertEqual(len(deps), 1) _, dep = deps.popitem() self.assertEqual(len(dep.conflicts), 1) self.assertEqual(dep.conflicts, [(('==', parse_version('0.1')), ('==', parse_version('0.2')))]) def test_less_than(self): def run(requirements, expected_conflicts): deps = pip_find_deps.resolve_version_constraints(requirements) self.assertEqual(len(deps), 1) _, dep = deps.popitem() self.assertEqual(len(dep.conflicts), 1) self.assertEqual(dep.conflicts, expected_conflicts) def reverse(xs): return xs[::-1] requirements = list(parse_requirements(['a == 0.1', 'a < 0.1'])) expected_conflicts = [(('==', parse_version('0.1')), ('<', parse_version('0.1')))] # ('==', '0.1') conflicts with ('<', 0.1) run(requirements, expected_conflicts) # ('<', 0.1) conflicts with ('==', '0.1') run(reverse(requirements), reverse(expected_conflicts)) if __name__ == '__main__': suite = unittest.TestLoader().loadTestsFromTestCase(ConflictDetectionTests) unittest.TextTestRunner(verbosity=2).run(suite)