From 8c96a4d85674e164d562f9e7907c18bc997d0efb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Herv=C3=A9=20Beraud?= Date: Wed, 20 Nov 2019 19:37:27 +0100 Subject: [PATCH] Remove six and python 2.7 full support Six is in use to help us to keep support for python 2.7. Since the ussuri cycle we decide to remove the python 2.7 support so we can go ahead and also remove six usage from the python code. Review process and help ----------------------- Removing six introduce a lot of changes and an huge amount of modified files To simplify reviews we decided to split changes into several patches to avoid painful reviews and avoid mistakes. To review this patch you can use the six documentation [1] to obtain help and understand choices. Additional informations ----------------------- Changes related to 'six.b(data)' [2] ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ six.b [2] encode the given datas in latin-1 in python3 so I did the same things in this patch. Latin-1 is equal to iso-8859-1 [3]. This encoding is the default encoding [4] of certain descriptive HTTP headers. I suggest to keep latin-1 for the moment and to move to another encoding in a follow-up patch if needed to move to most powerful encoding (utf8). HTML4 support utf8 charset and utf8 is the default charset for HTML5 [5]. Note that this commit message is autogenerated and not necesserly contains changes related to 'six.b' [1] https://six.readthedocs.io/ [2] https://six.readthedocs.io/#six.b [3] https://docs.python.org/3/library/codecs.html#standard-encodings [4] https://www.w3schools.com/charsets/ref_html_8859.asp [5] https://www.w3schools.com/html/html_charset.asp Patch 28 of a serie of 28 patches six fully removed now! Thank you six for the rendered services! Change-Id: If44ee4b565cc9390fa0422fba4dda080b4f90b98 --- heat/tests/test_validate.py | 37 +++++++++---------- heat_integrationtests/common/test.py | 5 +-- .../functional/test_autoscaling.py | 3 +- .../functional/test_aws_stack.py | 2 +- .../functional/test_resource_group.py | 5 +-- .../functional/test_template_resource.py | 5 +-- requirements.txt | 1 - tools/custom_guidelines.py | 7 ++-- 8 files changed, 29 insertions(+), 36 deletions(-) diff --git a/heat/tests/test_validate.py b/heat/tests/test_validate.py index 94780f5db6..febef0d4e9 100644 --- a/heat/tests/test_validate.py +++ b/heat/tests/test_validate.py @@ -13,7 +13,6 @@ import mock from oslo_messaging.rpc import dispatcher -import six import webob from heat.common import exception @@ -1309,7 +1308,7 @@ class ValidateTest(common.HeatTestCase): res = dict(self.engine.validate_template(self.ctx, t, {})) self.assertEqual({'Error': 'Resources must contain Resource. ' - 'Found a [%s] instead' % six.text_type}, + 'Found a [%s] instead' % str}, res) def test_invalid_section_cfn(self): @@ -1621,7 +1620,7 @@ class ValidateTest(common.HeatTestCase): 'parameter_groups.Database ' 'Group: The InstanceType parameter must be ' 'assigned to one parameter group only.'), - six.text_type(exc)) + str(exc)) def test_validate_duplicate_parameters_no_label(self): t = template_format.parse(test_template_parameters_duplicate_no_label) @@ -1634,7 +1633,7 @@ class ValidateTest(common.HeatTestCase): 'parameter_groups.: ' 'The key_name parameter must be ' 'assigned to one parameter group only.'), - six.text_type(exc)) + str(exc)) def test_validate_invalid_parameter_in_group(self): t = template_format.parse(test_template_invalid_parameter_name) @@ -1652,7 +1651,7 @@ class ValidateTest(common.HeatTestCase): 'parameter_groups.Database Group: The grouped ' 'parameter SomethingNotHere does not ' 'reference a valid parameter.'), - six.text_type(exc)) + str(exc)) def test_validate_invalid_parameter_no_label(self): t = template_format.parse(test_template_invalid_parameter_no_label) @@ -1666,7 +1665,7 @@ class ValidateTest(common.HeatTestCase): 'parameter_groups.: The grouped ' 'parameter key_name does not ' 'reference a valid parameter.'), - six.text_type(exc)) + str(exc)) def test_validate_no_parameters_in_group(self): t = template_format.parse(test_template_no_parameters) @@ -1677,7 +1676,7 @@ class ValidateTest(common.HeatTestCase): self.assertEqual(_('Parameter Groups error: parameter_groups.Server ' 'Group: The parameters must be provided for each ' - 'parameter group.'), six.text_type(exc)) + 'parameter group.'), str(exc)) def test_validate_parameter_groups_not_list(self): t = template_format.parse(test_template_parameter_groups_not_list) @@ -1688,7 +1687,7 @@ class ValidateTest(common.HeatTestCase): self.assertEqual(_('Parameter Groups error: parameter_groups: ' 'The parameter_groups should be ' - 'a list.'), six.text_type(exc)) + 'a list.'), str(exc)) def test_validate_parameters_not_list(self): t = template_format.parse(test_template_parameters_not_list) @@ -1700,7 +1699,7 @@ class ValidateTest(common.HeatTestCase): self.assertEqual(_('Parameter Groups error: ' 'parameter_groups.Server Group: ' 'The parameters of parameter group should be ' - 'a list.'), six.text_type(exc)) + 'a list.'), str(exc)) def test_validate_parameters_error_no_label(self): t = template_format.parse(test_template_parameters_error_no_label) @@ -1711,7 +1710,7 @@ class ValidateTest(common.HeatTestCase): self.assertEqual(_('Parameter Groups error: parameter_groups.: ' 'The parameters of parameter group should be ' - 'a list.'), six.text_type(exc)) + 'a list.'), str(exc)) def test_validate_allowed_values_integer(self): t = template_format.parse(test_template_allowed_integers) @@ -1750,7 +1749,7 @@ class ValidateTest(common.HeatTestCase): err = self.assertRaises(exception.StackValidationFailed, stack.validate) self.assertIn('"3" is not an allowed value [1, 4, 8]', - six.text_type(err)) + str(err)) # test with size parameter provided as number template.env = environment.Environment({'size': 3}) @@ -1758,7 +1757,7 @@ class ValidateTest(common.HeatTestCase): err = self.assertRaises(exception.StackValidationFailed, stack.validate) self.assertIn('3 is not an allowed value [1, 4, 8]', - six.text_type(err)) + str(err)) def test_validate_not_allowed_values_integer_str(self): t = template_format.parse(test_template_allowed_integers_str) @@ -1770,7 +1769,7 @@ class ValidateTest(common.HeatTestCase): err = self.assertRaises(exception.StackValidationFailed, stack.validate) self.assertIn('"3" is not an allowed value ["1", "4", "8"]', - six.text_type(err)) + str(err)) # test with size parameter provided as number template.env = environment.Environment({'size': 3}) @@ -1778,7 +1777,7 @@ class ValidateTest(common.HeatTestCase): err = self.assertRaises(exception.StackValidationFailed, stack.validate) self.assertIn('3 is not an allowed value ["1", "4", "8"]', - six.text_type(err)) + str(err)) def test_validate_invalid_outputs(self): t = template_format.parse(test_template_invalid_outputs) @@ -1789,7 +1788,7 @@ class ValidateTest(common.HeatTestCase): error_message = ('outputs.string.value.get_attr: Arguments to ' '"get_attr" must be of the form ' '[resource_name, attribute, (path), ...]') - self.assertEqual(error_message, six.text_type(err)) + self.assertEqual(error_message, str(err)) def test_validate_resource_attr_invalid_type(self): t = template_format.parse(""" @@ -1802,7 +1801,7 @@ class ValidateTest(common.HeatTestCase): stack = parser.Stack(self.ctx, 'test_stack', template) ex = self.assertRaises(exception.StackValidationFailed, stack.validate) self.assertEqual('Resource resource type type must be string', - six.text_type(ex)) + str(ex)) def test_validate_resource_attr_invalid_type_cfn(self): t = template_format.parse(""" @@ -1814,7 +1813,7 @@ class ValidateTest(common.HeatTestCase): stack = parser.Stack(self.ctx, 'test_stack', tmpl.Template(t)) ex = self.assertRaises(exception.StackValidationFailed, stack.validate) self.assertEqual('Resource Resource Type type must be string', - six.text_type(ex)) + str(ex)) def test_validate_resource_invalid_key(self): t = template_format.parse(""" @@ -1827,7 +1826,7 @@ class ValidateTest(common.HeatTestCase): template = tmpl.Template(t) stack = parser.Stack(self.ctx, 'test_stack', template) ex = self.assertRaises(exception.StackValidationFailed, stack.validate) - self.assertIn('wibble', six.text_type(ex)) + self.assertIn('wibble', str(ex)) def test_validate_resource_invalid_cfn_key_in_hot(self): t = template_format.parse(""" @@ -1840,7 +1839,7 @@ class ValidateTest(common.HeatTestCase): template = tmpl.Template(t) stack = parser.Stack(self.ctx, 'test_stack', template) ex = self.assertRaises(exception.StackValidationFailed, stack.validate) - self.assertIn('Properties', six.text_type(ex)) + self.assertIn('Properties', str(ex)) def test_validate_resource_invalid_key_cfn(self): t = template_format.parse(""" diff --git a/heat_integrationtests/common/test.py b/heat_integrationtests/common/test.py index d5c2595019..afa1ec20d0 100644 --- a/heat_integrationtests/common/test.py +++ b/heat_integrationtests/common/test.py @@ -15,14 +15,13 @@ import random import re import subprocess import time +import urllib import fixtures from heatclient import exc as heat_exceptions from keystoneauth1 import exceptions as kc_exceptions from oslo_log import log as logging from oslo_utils import timeutils -import six -from six.moves import urllib from tempest import config import testscenarios import testtools @@ -59,7 +58,7 @@ def call_until_true(duration, sleep_for, func, *args, **kwargs): def rand_name(name=''): - randbits = six.text_type(random.randint(1, 0x7fffffff)) + randbits = str(random.randint(1, 0x7fffffff)) if name: return name + '-' + randbits else: diff --git a/heat_integrationtests/functional/test_autoscaling.py b/heat_integrationtests/functional/test_autoscaling.py index 369fa000cf..46da2a86e0 100644 --- a/heat_integrationtests/functional/test_autoscaling.py +++ b/heat_integrationtests/functional/test_autoscaling.py @@ -15,7 +15,6 @@ import json from heatclient import exc from oslo_log import log as logging -import six from testtools import matchers from heat_integrationtests.common import test @@ -736,7 +735,7 @@ outputs: stack_identifier, 'ScaleUpPolicy') error_msg = 'Signal resource during SUSPEND is not supported' - self.assertIn(error_msg, six.text_type(ex)) + self.assertIn(error_msg, str(ex)) ev = self.wait_for_event_with_reason( stack_identifier, reason='Cannot signal resource during SUSPEND', diff --git a/heat_integrationtests/functional/test_aws_stack.py b/heat_integrationtests/functional/test_aws_stack.py index 05539dca85..3e775ca7a6 100644 --- a/heat_integrationtests/functional/test_aws_stack.py +++ b/heat_integrationtests/functional/test_aws_stack.py @@ -13,8 +13,8 @@ import hashlib import json import random +from urllib import parse -from six.moves.urllib import parse from swiftclient import utils as swiftclient_utils import yaml diff --git a/heat_integrationtests/functional/test_resource_group.py b/heat_integrationtests/functional/test_resource_group.py index 95ae7799f3..ebce70df72 100644 --- a/heat_integrationtests/functional/test_resource_group.py +++ b/heat_integrationtests/functional/test_resource_group.py @@ -14,7 +14,6 @@ import copy import json from heatclient import exc -import six import yaml from heat_integrationtests.functional import functional_base @@ -88,12 +87,12 @@ resources: ex = self.assertRaises(exc.HTTPBadRequest, self.update_stack, stack_identifier, template_two_nested, environment=env, files=files) - self.assertIn(expected_err, six.text_type(ex)) + self.assertIn(expected_err, str(ex)) ex = self.assertRaises(exc.HTTPBadRequest, self.stack_create, template=template_two_nested, environment=env, files=files) - self.assertIn(expected_err, six.text_type(ex)) + self.assertIn(expected_err, str(ex)) def _validate_resources(self, stack_identifier, expected_count): resources = self.list_group_resources(stack_identifier, diff --git a/heat_integrationtests/functional/test_template_resource.py b/heat_integrationtests/functional/test_template_resource.py index 21a4ec061a..f2a513b3a6 100644 --- a/heat_integrationtests/functional/test_template_resource.py +++ b/heat_integrationtests/functional/test_template_resource.py @@ -13,7 +13,6 @@ import json from heatclient import exc as heat_exceptions -import six import yaml from heat_integrationtests.common import test @@ -804,7 +803,7 @@ outputs: except heat_exceptions.HTTPBadRequest as exc: exp = ('ERROR: Required property two for facade ' 'OS::Thingy missing in provider') - self.assertEqual(exp, six.text_type(exc)) + self.assertEqual(exp, str(exc)) def test_missing_output(self): templ_missing_output = ''' @@ -828,7 +827,7 @@ resources: except heat_exceptions.HTTPBadRequest as exc: exp = ('ERROR: Attribute here-it-is for facade ' 'OS::Thingy missing in provider') - self.assertEqual(exp, six.text_type(exc)) + self.assertEqual(exp, str(exc)) class TemplateResourceNewParamTest(functional_base.FunctionalTestsBase): diff --git a/requirements.txt b/requirements.txt index f77d011a49..ad414aa173 100644 --- a/requirements.txt +++ b/requirements.txt @@ -59,7 +59,6 @@ PyYAML>=3.12 # MIT requests>=2.14.2 # Apache-2.0 tenacity>=4.4.0 # Apache-2.0 Routes>=2.3.1 # MIT -six>=1.10.0 # MIT SQLAlchemy!=1.1.5,!=1.1.6,!=1.1.7,!=1.1.8,>=1.0.10 # MIT sqlalchemy-migrate>=0.11.0 # Apache-2.0 stevedore>=1.20.0 # Apache-2.0 diff --git a/tools/custom_guidelines.py b/tools/custom_guidelines.py index 3e8f4e2c79..53306d0cce 100644 --- a/tools/custom_guidelines.py +++ b/tools/custom_guidelines.py @@ -16,7 +16,6 @@ import re import sys from oslo_log import log -import six from heat.common.i18n import _ from heat.engine import constraints @@ -101,7 +100,7 @@ class HeatCustomGuidelines(object): def _check_resource_schemas(self, resource, schema, schema_name, error_path=None): - for key, value in six.iteritems(schema): + for key, value in schema.items(): if error_path is None: error_path = [resource.__name__, key] else: @@ -129,7 +128,7 @@ class HeatCustomGuidelines(object): error_path.pop() def _check_resource_methods(self, resource): - for method in six.itervalues(resource.__dict__): + for method in resource.__dict__.values(): # need to skip non-functions attributes if not callable(method): continue @@ -159,7 +158,7 @@ class HeatCustomGuidelines(object): cls_file = open(cls.__module__.replace('.', '/') + '.py') except IOError as ex: LOG.warning('Cannot perform trailing spaces check on ' - 'resource module: %s', six.text_type(ex)) + 'resource module: %s', str(ex)) continue lines = [line.strip() for line in cls_file.readlines()] idx = 0