From bf77e53d4484161859e2dd57e7d46f80ded1dc01 Mon Sep 17 00:00:00 2001 From: "James E. Blair" Date: Tue, 16 Dec 2014 08:46:46 -0800 Subject: [PATCH] Remove requirements overlap check The requirements overlap check was originally designed to address a behavior introduced by our requirements-driven pypi mirror. Now that we use full mirrors of pypi, it is no longer necessary and is an artifical restriction that may cause problems for us. This reverts commit f3127601efc483f0949c8eb58d74d7f29caf8a66. Change-Id: I7d2302d4a0ba0def9d6fcc5af89e6e7a5d1fab45 Partial-Bug: 1274731 --- tests/test_versions_overlap_parent.py | 105 ------------------ tox.ini | 4 - versions_overlap_parent.py | 149 -------------------------- 3 files changed, 258 deletions(-) delete mode 100644 tests/test_versions_overlap_parent.py delete mode 100644 versions_overlap_parent.py diff --git a/tests/test_versions_overlap_parent.py b/tests/test_versions_overlap_parent.py deleted file mode 100644 index 1386a130cb..0000000000 --- a/tests/test_versions_overlap_parent.py +++ /dev/null @@ -1,105 +0,0 @@ -# Copyright 2014 IBM Corp. -# -# Licensed 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 pkg_resources -import testtools -from testtools import matchers - -import versions_overlap_parent as vop - - -class TestVersionsOverlapParent(testtools.TestCase): - def test_increase_version(self): - self.assertThat(vop.increase_version('1.0'), matchers.Equals('1.1')) - - def test_decrease_version(self): - self.assertThat(vop.decrease_version('1.0'), matchers.Equals('1.9')) - - def _test_get_version_required(self, start_version, op, exp_version): - req = pkg_resources.Requirement.parse('pkg%s%s' % (op, start_version)) - self.assertThat(vop.get_version_required(req.specs[0]), - matchers.Equals(exp_version)) - - def test_get_version_required_eq(self): - self._test_get_version_required('1.0', '==', '1.0') - - def test_get_version_required_gt(self): - self._test_get_version_required('1.0', '>', '1.1') - - def test_get_version_required_ge(self): - self._test_get_version_required('1.0', '>=', '1.0') - - def test_get_version_required_lt(self): - self._test_get_version_required('1.0', '<', '1.9') - - def test_get_version_required_le(self): - self._test_get_version_required('1.0', '<=', '1.0') - - def test_get_version_required_ne(self): - self._test_get_version_required('1.0', '!=', '1.0') - - def test_RequirementsList_read_requirements_empty_line(self): - rl = vop.RequirementsList('something') - rl.read_requirements(['']) - self.assertThat(rl.reqs, matchers.Equals({})) - - def test_RequirementsList_read_requirements_comment_line(self): - rl = vop.RequirementsList('something') - rl.read_requirements(['# comment']) - self.assertThat(rl.reqs, matchers.Equals({})) - - def test_RequirementsList_read_requirements_skips(self): - # Lines starting with certain strings are skipped. - rl = vop.RequirementsList('something') - rl.read_requirements(['http://tarballs.openstack.org/something', - '-esomething', - '-fsomething']) - self.assertThat(rl.reqs, matchers.Equals({})) - - def test_RequirementsList_read_requirements_parse(self): - rl = vop.RequirementsList('something') - rl.read_requirements(['extras', - 'sphinx>=1.1.2,!=1.2.0,<1.3 # BSD', ]) - self.assertThat(rl.reqs['extras'].specs, - matchers.Equals([])) - exp_sphinx_specs = [('>=', '1.1.2'), ('!=', '1.2.0'), ('<', '1.3')] - self.assertThat(rl.reqs['sphinx'].specs, - matchers.Equals(exp_sphinx_specs)) - - def _compare(self, head_reqs, parent_reqs): - vop_obj = vop.VersionsOverlapParent() - vop_obj.set_head_requirements(head_reqs) - vop_obj.set_parent_requirements(parent_reqs) - vop_obj.compare_reqs() - - def test_VersionsOverlapParent_same(self): - # No problem if the requirements list is the same. - self._compare(['extras'], ['extras']) - - def test_VersionsOverlapParent_add(self): - # No problem if a new requirement is added - self._compare(['extras'], ['extras', 'new_requirement>=1.0']) - - def test_VersionsOverlapParent_remove(self): - # No problem if a requirement is removed. - self._compare(['extras', 'old_requirement>=1.0'], ['extras']) - - def test_VersionsOverlapParent_update_overlap(self): - # No problem if a requirement is updated and it overlaps - self._compare(['package>=1.0'], ['package>=1.0,<2.0']) - - def test_VersionsOverlapParent_update_nooverlap_fails(self): - # Fails if versions don't overlap. - cmp_fn = lambda: self._compare(['package>=1.0,<2.0'], ['package>=2.0']) - self.assertThat(cmp_fn, matchers.raises(Exception)) diff --git a/tox.ini b/tox.ini index 5f590bb34f..5fe5e7efa2 100644 --- a/tox.ini +++ b/tox.ini @@ -19,10 +19,6 @@ deps = setuptools>3.4 [testenv:pep8] commands = flake8 -[testenv:versions-overlap-parent] -commands = - python versions_overlap_parent.py - [flake8] ignore = H803 exclude = .venv,.git,.tox,dist,doc,*egg,build diff --git a/versions_overlap_parent.py b/versions_overlap_parent.py deleted file mode 100644 index a841eb7713..0000000000 --- a/versions_overlap_parent.py +++ /dev/null @@ -1,149 +0,0 @@ -#! /usr/bin/env python -# Copyright (C) 2011 OpenStack, LLC. -# Copyright (c) 2013 Hewlett-Packard Development Company, L.P. -# Copyright (c) 2013 OpenStack Foundation -# Copyright 2014 IBM Corp. -# -# Licensed 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 subprocess - -import pkg_resources - - -def increase_version(version_string): - """Returns simple increased version string.""" - items = version_string.split('.') - for i in range(len(items) - 1, 0, -1): - current_item = items[i] - if current_item.isdigit(): - current_item = int(current_item) + 1 - items[i] = str(current_item) - break - final = '.'.join(items) - return final - - -def decrease_version(version_string): - """Returns simple decreased version string.""" - items = version_string.split('.') - for i in range(len(items) - 1, 0, -1): - current_item = items[i] - if current_item.isdigit(): - current_item = int(current_item) - 1 - if current_item >= 0: - items[i] = str(current_item) - break - else: - # continue to parent - items[i] = '9' - - final = '.'.join(items) - return final - - -def get_version_required(req): - """Returns required version string depending on reqs.""" - operator = req[0] - version = req[1] - if operator == '>': - version = increase_version(version) - elif operator == '<': - version = decrease_version(version) - return version - - -class RequirementsList(object): - def __init__(self, name): - self.name = name - self.reqs = {} - - def read_requirements(self, req_lines): - """Read requirements.""" - for line in req_lines: - if '#' in line: - line = line[:line.find('#')] - line = line.strip() - if (not line or - line.startswith('http://tarballs.openstack.org/') or - line.startswith('-e') or - line.startswith('-f')): - continue - req = pkg_resources.Requirement.parse(line) - self.reqs[req.project_name.lower()] = req - - -def compare_reqs(parent_reqs, head_reqs): - failed = False - for req in head_reqs.reqs.values(): - name = req.project_name.lower() - parent_req = parent_reqs.reqs.get(name) - if not parent_req: - # head req didn't exist in parent reqs. - continue - - if req == parent_req: - # Requirement is the same, nothing to do. - continue - - # check if overlaps - for spec in req.specs: - version = get_version_required(spec) - if not parent_req.__contains__(version): - failed = True - print("Requirement %s does not overlap with parent " % - str(req)) - - if failed: - raise Exception("Problem with requirements, check previous output.") - - -class VersionsOverlapParent(object): - GLOBAL_REQUIREMENTS_FILENAME = 'global-requirements.txt' - - def set_head_requirements(self, head_requirements): - head_reqs = RequirementsList(name='HEAD') - head_reqs.read_requirements(head_requirements) - self._head_reqs = head_reqs - - def set_parent_requirements(self, parent_requirements): - parent_reqs = RequirementsList(name='parent') - parent_reqs.read_requirements(parent_requirements) - self._parent_reqs = parent_reqs - - def compare_reqs(self): - compare_reqs(self._parent_reqs, self._head_reqs) - - def run(self): - # Parse current commit requirements list. - with open(self.GLOBAL_REQUIREMENTS_FILENAME) as global_reqs: - self.set_head_requirements(global_reqs) - - # Read the global requirements file from the parent commit. - parent_global_reqs = subprocess.check_output( - ['git', 'show', 'HEAD~1:%s' % self.GLOBAL_REQUIREMENTS_FILENAME]) - - # Store parent commit requirements list. - self.set_parent_requirements(parent_global_reqs.splitlines()) - - self.compare_reqs() - - -def main(): - versions_overlap_parent = VersionsOverlapParent() - versions_overlap_parent.run() - - -if __name__ == '__main__': - - main()