6ac14737b7
Compute the dependency set for the python code being released and report when the old minimum version no longer falls within the specified range. For releases from master treat the message as an error. For other branches treat the message as a warning. Update clone_repo() to return the location where the clone was written as a convenience to the caller. Extract the logic for determining if a version is using pre-versioning (alpha, beta, etc.) so it can be reused. Change-Id: I22a2f6df7f3502e4fcbf2d61ef5fee849ab15529 Signed-off-by: Doug Hellmann <doug@doughellmann.com>
224 lines
6.7 KiB
Python
224 lines
6.7 KiB
Python
# All Rights Reserved.
|
|
#
|
|
# 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 textwrap
|
|
|
|
import mock
|
|
from oslotest import base
|
|
import pkg_resources
|
|
|
|
from openstack_releases import requirements
|
|
|
|
|
|
class TestParseRequirements(base.BaseTestCase):
|
|
|
|
def test_empty(self):
|
|
self.assertEqual({}, requirements.parse_requirements(''))
|
|
self.assertEqual({}, requirements.parse_requirements('\n'))
|
|
|
|
def test_comments(self):
|
|
self.assertEqual({}, requirements.parse_requirements('#'))
|
|
self.assertEqual({}, requirements.parse_requirements('#\n'))
|
|
|
|
def test_simple(self):
|
|
self.assertEqual(
|
|
[('', 'pbr')],
|
|
list(requirements.parse_requirements(textwrap.dedent('''
|
|
pbr>=1.6
|
|
''')).keys()),
|
|
)
|
|
|
|
def test_multiline(self):
|
|
self.assertEqual(
|
|
[('', 'keyring'),
|
|
('', 'pbr')],
|
|
list(
|
|
sorted(
|
|
requirements.parse_requirements(
|
|
textwrap.dedent('''
|
|
pbr>=1.6
|
|
keyring==7.3
|
|
''')
|
|
).keys()
|
|
)
|
|
)
|
|
)
|
|
|
|
|
|
class TestGetMinSpecifier(base.BaseTestCase):
|
|
|
|
def test_none(self):
|
|
actual = requirements.get_min_specifier(
|
|
pkg_resources.Requirement.parse('pbr').specifier,
|
|
)
|
|
self.assertIsNone(actual)
|
|
|
|
def test_greater(self):
|
|
actual = requirements.get_min_specifier(
|
|
pkg_resources.Requirement.parse('pbr>1.6').specifier,
|
|
)
|
|
self.assertEqual('1.6', actual.version)
|
|
|
|
def test_greater_equal(self):
|
|
actual = requirements.get_min_specifier(
|
|
pkg_resources.Requirement.parse('pbr>=1.6').specifier,
|
|
)
|
|
self.assertEqual('1.6', actual.version)
|
|
|
|
|
|
class TestCompareLowerBounds(base.BaseTestCase):
|
|
|
|
def test_new_requirement(self):
|
|
warnings = []
|
|
old = {
|
|
}
|
|
new = {
|
|
(None, 'pbr'): pkg_resources.Requirement.parse('pbr'),
|
|
}
|
|
requirements.compare_lower_bounds(
|
|
old, new, warnings.append,
|
|
)
|
|
print(warnings)
|
|
self.assertEqual(1, len(warnings))
|
|
|
|
def test_dropped_requirement(self):
|
|
warnings = []
|
|
old = {
|
|
(None, 'pbr'): pkg_resources.Requirement.parse('pbr'),
|
|
}
|
|
new = {
|
|
}
|
|
requirements.compare_lower_bounds(
|
|
old, new, warnings.append,
|
|
)
|
|
print(warnings)
|
|
self.assertEqual(0, len(warnings))
|
|
|
|
def test_no_lower(self):
|
|
warnings = []
|
|
old = {
|
|
(None, 'pbr'): pkg_resources.Requirement.parse('pbr'),
|
|
}
|
|
new = {
|
|
(None, 'pbr'): pkg_resources.Requirement.parse('pbr'),
|
|
}
|
|
requirements.compare_lower_bounds(
|
|
old, new, warnings.append,
|
|
)
|
|
print(warnings)
|
|
self.assertEqual(0, len(warnings))
|
|
|
|
def test_new_lower(self):
|
|
warnings = []
|
|
old = {
|
|
(None, 'pbr'): pkg_resources.Requirement.parse('pbr'),
|
|
}
|
|
new = {
|
|
(None, 'pbr'): pkg_resources.Requirement.parse('pbr>=1.6'),
|
|
}
|
|
requirements.compare_lower_bounds(
|
|
old, new, warnings.append,
|
|
)
|
|
print(warnings)
|
|
self.assertEqual(1, len(warnings))
|
|
|
|
def test_raised_lower(self):
|
|
warnings = []
|
|
old = {
|
|
(None, 'pbr'): pkg_resources.Requirement.parse('pbr>=1.5'),
|
|
}
|
|
new = {
|
|
(None, 'pbr'): pkg_resources.Requirement.parse('pbr>=1.6'),
|
|
}
|
|
requirements.compare_lower_bounds(
|
|
old, new, warnings.append,
|
|
)
|
|
print(warnings)
|
|
self.assertEqual(1, len(warnings))
|
|
|
|
def test_new_lower_format(self):
|
|
warnings = []
|
|
old = {
|
|
(None, 'pbr'): pkg_resources.Requirement.parse('pbr>=1.6'),
|
|
}
|
|
new = {
|
|
(None, 'pbr'): pkg_resources.Requirement.parse('pbr>=1.6.0'),
|
|
}
|
|
requirements.compare_lower_bounds(
|
|
old, new, warnings.append,
|
|
)
|
|
print(warnings)
|
|
self.assertEqual(0, len(warnings))
|
|
|
|
def test_new_lower_comparator(self):
|
|
warnings = []
|
|
old = {
|
|
(None, 'pbr'): pkg_resources.Requirement.parse('pbr>=1.6'),
|
|
}
|
|
new = {
|
|
(None, 'pbr'): pkg_resources.Requirement.parse('pbr>1.6'),
|
|
}
|
|
requirements.compare_lower_bounds(
|
|
old, new, warnings.append,
|
|
)
|
|
print(warnings)
|
|
self.assertEqual(1, len(warnings))
|
|
|
|
|
|
class TestFindBadLowerBoundsIncreases(base.BaseTestCase):
|
|
|
|
@mock.patch('openstack_releases.requirements.get_requirements_at_ref')
|
|
def test_skip_for_beta(self, get_req):
|
|
warnings = []
|
|
get_req.side_effect = AssertionError('should not be called')
|
|
requirements.find_bad_lower_bound_increases(
|
|
None, None, '1.0.0', '2.0.0.0b1', None,
|
|
warnings.append,
|
|
)
|
|
print(warnings)
|
|
self.assertEqual(0, len(warnings))
|
|
|
|
@mock.patch('openstack_releases.requirements.get_requirements_at_ref')
|
|
def test_skip_for_rc(self, get_req):
|
|
warnings = []
|
|
get_req.side_effect = AssertionError('should not be called')
|
|
requirements.find_bad_lower_bound_increases(
|
|
None, None, '1.0.0', '2.0.0.0rc1', None,
|
|
warnings.append,
|
|
)
|
|
print(warnings)
|
|
self.assertEqual(0, len(warnings))
|
|
|
|
@mock.patch('openstack_releases.requirements.get_requirements_at_ref')
|
|
def test_skip_for_zero_patch_major(self, get_req):
|
|
warnings = []
|
|
get_req.side_effect = AssertionError('should not be called')
|
|
requirements.find_bad_lower_bound_increases(
|
|
None, None, '1.0.0', '2.0.0', None,
|
|
warnings.append,
|
|
)
|
|
print(warnings)
|
|
self.assertEqual(0, len(warnings))
|
|
|
|
@mock.patch('openstack_releases.requirements.get_requirements_at_ref')
|
|
def test_skip_for_zero_patch_minor(self, get_req):
|
|
warnings = []
|
|
get_req.side_effect = AssertionError('should not be called')
|
|
requirements.find_bad_lower_bound_increases(
|
|
None, None, '1.0.0', '1.1.0', None,
|
|
warnings.append,
|
|
)
|
|
print(warnings)
|
|
self.assertEqual(0, len(warnings))
|