]> review.fuel-infra Code Review - openstack-build/neutron-build.git/commitdiff
Python 3: use six.string_types instead of basestring
authorCyril Roelandt <cyril.roelandt@enovance.com>
Wed, 20 May 2015 13:09:13 +0000 (15:09 +0200)
committerCyril Roelandt <cyril.roelandt@enovance.com>
Thu, 21 May 2015 02:03:17 +0000 (04:03 +0200)
In Python 3, there is no "basestring". In Python 3, "six.string_types" is
"basestring", and "str" in Python 3.

Change-Id: Ic22e932cbf3c4b75cd424f4b41428da869f197cf
Blueprint: neutron-python3

HACKING.rst
neutron/agent/ovsdb/impl_vsctl.py
neutron/api/v2/attributes.py
neutron/db/common_db_mixin.py
neutron/db/l3_dvr_db.py
neutron/db/migration/alembic_migrations/heal_script.py
neutron/extensions/securitygroup.py
neutron/hacking/checks.py
neutron/quota.py
neutron/tests/unit/hacking/test_checks.py

index ce05f7f15b424d1b86f516f52c60b763ab7bde14..101726231dce25da4c10e6c1b93ae26d152b24a7 100644 (file)
@@ -15,6 +15,7 @@ Neutron Specific Commandments
 - [N323] Enforce namespace-less imports for oslo libraries
 - [N324] Prevent use of deprecated contextlib.nested.
 - [N325] Python 3: Do not use xrange.
+- [N326] Python 3: do not use basestring.
 
 Creating Unit Tests
 -------------------
index f1189d3527d253c71f27a4610d1a2ef94c381cb5..4fd8937d346c671f5fcb7ee8e2dcb5dd70556af1 100644 (file)
@@ -19,6 +19,7 @@ import uuid
 from oslo_log import log as logging
 from oslo_serialization import jsonutils
 from oslo_utils import excutils
+import six
 
 from neutron.agent.common import utils
 from neutron.agent.ovsdb import api as ovsdb
@@ -255,7 +256,7 @@ def _set_colval_args(*col_values):
             args += ["%s:%s%s%s" % (
                 col, k, op, _py_to_val(v)) for k, v in val.items()]
         elif (isinstance(val, collections.Sequence)
-                and not isinstance(val, basestring)):
+                and not isinstance(val, six.string_types)):
             args.append("%s%s%s" % (col, op, ",".join(map(_py_to_val, val))))
         else:
             args.append("%s%s%s" % (col, op, _py_to_val(val)))
index 1f992a0c18192e6037df780d46d0511ecab8e532..6bf9e94d2cd2ffdd515d9cfac9bc1fd34f2b4ea5 100644 (file)
@@ -17,6 +17,7 @@ import re
 
 import netaddr
 from oslo_log import log as logging
+import six
 
 from neutron.common import constants
 from neutron.common import exceptions as n_exc
@@ -105,7 +106,7 @@ def _validate_string_or_none(data, max_len=None):
 
 
 def _validate_string(data, max_len=None):
-    if not isinstance(data, basestring):
+    if not isinstance(data, six.string_types):
         msg = _("'%s' is not a valid string") % data
         LOG.debug(msg)
         return msg
@@ -481,7 +482,7 @@ def _validate_non_negative(data, valid_values=None):
 
 
 def convert_to_boolean(data):
-    if isinstance(data, basestring):
+    if isinstance(data, six.string_types):
         val = data.lower()
         if val == "true" or val == "1":
             return True
index e75f2d1266c98ff8511c9e87b953ee1a3c7c50b6..143c8f0e416298e00ca879a09a30d9f9fa7030d3 100644 (file)
@@ -15,6 +15,7 @@
 
 import weakref
 
+import six
 from sqlalchemy import sql
 
 from neutron.common import exceptions as n_exc
@@ -91,13 +92,13 @@ class CommonDbMixin(object):
         for _name, hooks in self._model_query_hooks.get(model,
                                                         {}).iteritems():
             query_hook = hooks.get('query')
-            if isinstance(query_hook, basestring):
+            if isinstance(query_hook, six.string_types):
                 query_hook = getattr(self, query_hook, None)
             if query_hook:
                 query = query_hook(context, model, query)
 
             filter_hook = hooks.get('filter')
-            if isinstance(filter_hook, basestring):
+            if isinstance(filter_hook, six.string_types):
                 filter_hook = getattr(self, filter_hook, None)
             if filter_hook:
                 query_filter = filter_hook(context, model, query_filter)
@@ -141,7 +142,7 @@ class CommonDbMixin(object):
             for _name, hooks in self._model_query_hooks.get(model,
                                                             {}).iteritems():
                 result_filter = hooks.get('result_filters', None)
-                if isinstance(result_filter, basestring):
+                if isinstance(result_filter, six.string_types):
                     result_filter = getattr(self, result_filter, None)
 
                 if result_filter:
@@ -153,7 +154,7 @@ class CommonDbMixin(object):
         for func in self._dict_extend_functions.get(
             resource_type, []):
             args = (response, db_object)
-            if isinstance(func, basestring):
+            if isinstance(func, six.string_types):
                 func = getattr(self, func, None)
             else:
                 # must call unbound method - use self as 1st argument
index 3d15e969829304a00c5282ce77e5cd94bfe38446..95c82f1a8ab240769e5c85c72d6ec5accedf2931 100644 (file)
@@ -16,6 +16,7 @@ import collections
 from oslo_config import cfg
 from oslo_log import log as logging
 from oslo_utils import excutils
+import six
 
 from neutron.api.v2 import attributes
 from neutron.callbacks import events
@@ -165,7 +166,7 @@ class L3_NAT_with_dvr_db_mixin(l3_db.L3_NAT_db_mixin,
 
     def _get_device_owner(self, context, router=None):
         """Get device_owner for the specified router."""
-        router_is_uuid = isinstance(router, basestring)
+        router_is_uuid = isinstance(router, six.string_types)
         if router_is_uuid:
             router = self._get_router(context, router)
         if is_distributed_router(router):
index e20e4ee9588c393c76a1e9e7439a0b34919ba2eb..71bd21d05e108aa28b4cface1f6a34a62c20f2eb 100644 (file)
@@ -20,6 +20,7 @@ from alembic import autogenerate as autogen
 from alembic import context
 from alembic import op
 
+import six
 import sqlalchemy
 from sqlalchemy import schema as sa_schema
 import sqlalchemy.sql.expression as expr
@@ -113,12 +114,12 @@ def parse_modify_command(command):
                 return
         elif modified.endswith('default'):
             modified = 'server_default'
-        if isinstance(new, basestring):
+        if isinstance(new, six.string_types):
             new = text(new)
         kwargs = {modified: new, 'schema': schema}
         default = existing.get('existing_server_default')
         if default and isinstance(default, sa_schema.DefaultClause):
-            if isinstance(default.arg, basestring):
+            if isinstance(default.arg, six.string_types):
                 existing['existing_server_default'] = default.arg
             else:
                 existing['existing_server_default'] = default.arg.text
index c8861e24d02dbe67657e5556386d5123ec0a3355..a772be5692f1c2481bbc5c902ee50ea4fe780f29 100644 (file)
@@ -151,7 +151,7 @@ def convert_protocol(value):
 
 
 def convert_ethertype_to_case_insensitive(value):
-    if isinstance(value, basestring):
+    if isinstance(value, six.string_types):
         for ethertype in sg_supported_ethertypes:
             if ethertype.lower() == value.lower():
                 return ethertype
index 10b26050f2a31a4ddf168a00efad78d14f384dcb..0426d8c29541026cbe21b78c64789a618e737c9e 100644 (file)
@@ -166,6 +166,13 @@ def check_python3_xrange(logical_line):
                  "large loops.")
 
 
+def check_no_basestring(logical_line):
+    if re.search(r"\bbasestring\b", logical_line):
+        msg = ("N326: basestring is not Python3-compatible, use "
+               "six.string_types instead.")
+        yield(0, msg)
+
+
 def factory(register):
     register(validate_log_translations)
     register(use_jsonutils)
@@ -174,3 +181,4 @@ def factory(register):
     register(check_oslo_namespace_imports)
     register(check_no_contextlib_nested)
     register(check_python3_xrange)
+    register(check_no_basestring)
index cd6a6b71433537319011dc00854fd40a1b96394e..c9f550b054e8f48ed67da2ae324a756244120ef3 100644 (file)
@@ -19,6 +19,7 @@ import sys
 from oslo_config import cfg
 from oslo_log import log as logging
 from oslo_utils import importutils
+import six
 import webob
 
 from neutron.common import exceptions
@@ -219,7 +220,7 @@ class QuotaEngine(object):
                 _driver_class = QUOTA_CONF_DRIVER
                 LOG.info(_LI("ConfDriver is used as quota_driver because the "
                              "loaded plugin does not support 'quotas' table."))
-            if isinstance(_driver_class, basestring):
+            if isinstance(_driver_class, six.string_types):
                 _driver_class = importutils.import_object(_driver_class)
             if isinstance(_driver_class, ConfDriver):
                 versionutils.report_deprecated_feature(
index 1445923b916034769e14d40a82880aa9b9546653..dc7c2f3f764ab438a8b9c54ac88d2a8d2434cb05 100644 (file)
@@ -129,3 +129,7 @@ class HackingTestCase(base.BaseTestCase):
         self.assertLineFails(f, 'c = xrange(1, 10, 2)')
         self.assertLinePasses(f, 'd = range(1000)')
         self.assertLinePasses(f, 'e = six.moves.range(1337)')
+
+    def test_no_basestring(self):
+        self.assertEqual(1,
+            len(list(checks.check_no_basestring("isinstance(x, basestring)"))))