hacking: check for common double word typos
Adds a local hacking check for common double word typos like "the the", "to to", etc. Change-Id: I824a4a4b0f3bc18a16d5df50bd66cc626888ebaf
This commit is contained in:
@@ -53,6 +53,7 @@ Nova Specific Commandments
|
|||||||
- [N340] Check nova.utils.spawn() is used instead of greenthread.spawn() and eventlet.spawn()
|
- [N340] Check nova.utils.spawn() is used instead of greenthread.spawn() and eventlet.spawn()
|
||||||
- [N341] contextlib.nested is deprecated
|
- [N341] contextlib.nested is deprecated
|
||||||
- [N342] Config options should be in the central location ``nova/conf/``
|
- [N342] Config options should be in the central location ``nova/conf/``
|
||||||
|
- [N343] Check for common double word typos
|
||||||
|
|
||||||
Creating Unit Tests
|
Creating Unit Tests
|
||||||
-------------------
|
-------------------
|
||||||
|
@@ -1277,7 +1277,7 @@ class CellV2Commands(object):
|
|||||||
if cell_uuid is None:
|
if cell_uuid is None:
|
||||||
raise Exception(_("cell_uuid must be set"))
|
raise Exception(_("cell_uuid must be set"))
|
||||||
else:
|
else:
|
||||||
# Validate the the cell exists
|
# Validate the cell exists
|
||||||
cell_mapping = objects.CellMapping.get_by_uuid(ctxt, cell_uuid)
|
cell_mapping = objects.CellMapping.get_by_uuid(ctxt, cell_uuid)
|
||||||
filters = {}
|
filters = {}
|
||||||
instances = objects.InstanceList.get_by_filters(
|
instances = objects.InstanceList.get_by_filters(
|
||||||
|
@@ -1913,7 +1913,7 @@ def instance_get_all_by_filters(context, filters, sort_key, sort_dir,
|
|||||||
def instance_get_all_by_filters_sort(context, filters, limit=None, marker=None,
|
def instance_get_all_by_filters_sort(context, filters, limit=None, marker=None,
|
||||||
columns_to_join=None, use_slave=False,
|
columns_to_join=None, use_slave=False,
|
||||||
sort_keys=None, sort_dirs=None):
|
sort_keys=None, sort_dirs=None):
|
||||||
"""Return instances that match all filters sorted the the given keys.
|
"""Return instances that match all filters sorted by the given keys.
|
||||||
Deleted instances will be returned by default, unless there's a filter that
|
Deleted instances will be returned by default, unless there's a filter that
|
||||||
says otherwise.
|
says otherwise.
|
||||||
|
|
||||||
|
@@ -101,6 +101,8 @@ http_not_implemented_re = re.compile(r"raise .*HTTPNotImplemented\(")
|
|||||||
spawn_re = re.compile(
|
spawn_re = re.compile(
|
||||||
r".*(eventlet|greenthread)\.(?P<spawn_part>spawn(_n)?)\(.*\)")
|
r".*(eventlet|greenthread)\.(?P<spawn_part>spawn(_n)?)\(.*\)")
|
||||||
contextlib_nested = re.compile(r"^with (contextlib\.)?nested\(")
|
contextlib_nested = re.compile(r"^with (contextlib\.)?nested\(")
|
||||||
|
doubled_words_re = re.compile(
|
||||||
|
r"\b(then?|[iao]n|i[fst]|but|f?or|at|and|[dt]o)\s+\1\b")
|
||||||
|
|
||||||
|
|
||||||
class BaseASTChecker(ast.NodeVisitor):
|
class BaseASTChecker(ast.NodeVisitor):
|
||||||
@@ -576,6 +578,19 @@ def check_config_option_in_central_place(logical_line, filename):
|
|||||||
yield(0, msg)
|
yield(0, msg)
|
||||||
|
|
||||||
|
|
||||||
|
def check_doubled_words(physical_line, filename):
|
||||||
|
"""Check for the common doubled-word typos
|
||||||
|
|
||||||
|
N343
|
||||||
|
"""
|
||||||
|
msg = ("N343: Doubled word '%(word)s' typo found")
|
||||||
|
|
||||||
|
match = re.search(doubled_words_re, physical_line)
|
||||||
|
|
||||||
|
if match:
|
||||||
|
return (0, msg % {'word': match.group(1)})
|
||||||
|
|
||||||
|
|
||||||
def factory(register):
|
def factory(register):
|
||||||
register(import_no_db_in_virt)
|
register(import_no_db_in_virt)
|
||||||
register(no_db_session_in_public_api)
|
register(no_db_session_in_public_api)
|
||||||
@@ -605,3 +620,4 @@ def factory(register):
|
|||||||
register(check_no_contextlib_nested)
|
register(check_no_contextlib_nested)
|
||||||
register(check_greenthread_spawns)
|
register(check_greenthread_spawns)
|
||||||
register(check_config_option_in_central_place)
|
register(check_config_option_in_central_place)
|
||||||
|
register(check_doubled_words)
|
||||||
|
@@ -2748,7 +2748,7 @@ class ComputeManagerUnitTestCase(test.NoDBTestCase):
|
|||||||
uuids.instance, 'fake-mac',
|
uuids.instance, 'fake-mac',
|
||||||
start_period=0, use_slave=True)
|
start_period=0, use_slave=True)
|
||||||
# NOTE(sdague): bw_usage_update happens at some time in
|
# NOTE(sdague): bw_usage_update happens at some time in
|
||||||
# the future, so what last_refreshed is is irrelevant.
|
# the future, so what last_refreshed is irrelevant.
|
||||||
bw_usage_update.assert_called_once_with(self.context,
|
bw_usage_update.assert_called_once_with(self.context,
|
||||||
uuids.instance,
|
uuids.instance,
|
||||||
'fake-mac', 0, 4, 6, 1, 2,
|
'fake-mac', 0, 4, 6, 1, 2,
|
||||||
|
@@ -628,3 +628,14 @@ class HackingTestCase(test.NoDBTestCase):
|
|||||||
checks.check_config_option_in_central_place,
|
checks.check_config_option_in_central_place,
|
||||||
filename="nova/cmd/serialproxy.py",
|
filename="nova/cmd/serialproxy.py",
|
||||||
expected_errors=errors)
|
expected_errors=errors)
|
||||||
|
|
||||||
|
def test_check_doubled_words(self):
|
||||||
|
errors = [(1, 0, "N343")]
|
||||||
|
|
||||||
|
# Artificial break to stop pep8 detecting the test !
|
||||||
|
code = "This is the" + " the best comment"
|
||||||
|
self._assert_has_errors(code, checks.check_doubled_words,
|
||||||
|
expected_errors=errors)
|
||||||
|
|
||||||
|
code = "This is the then best comment"
|
||||||
|
self._assert_has_no_errors(code, checks.check_doubled_words)
|
||||||
|
@@ -1351,7 +1351,7 @@ class ComputeDriver(object):
|
|||||||
:param nova.objects.aggregate.Aggregate aggregate:
|
:param nova.objects.aggregate.Aggregate aggregate:
|
||||||
The aggregate which should add the given `host`
|
The aggregate which should add the given `host`
|
||||||
:param str host:
|
:param str host:
|
||||||
The name of the host to add to the the given `aggregate`.
|
The name of the host to add to the given `aggregate`.
|
||||||
:param dict kwargs:
|
:param dict kwargs:
|
||||||
A free-form thingy...
|
A free-form thingy...
|
||||||
|
|
||||||
@@ -1370,7 +1370,7 @@ class ComputeDriver(object):
|
|||||||
:param nova.objects.aggregate.Aggregate aggregate:
|
:param nova.objects.aggregate.Aggregate aggregate:
|
||||||
The aggregate which should remove the given `host`
|
The aggregate which should remove the given `host`
|
||||||
:param str host:
|
:param str host:
|
||||||
The name of the host to remove from the the given `aggregate`.
|
The name of the host to remove from the given `aggregate`.
|
||||||
:param dict kwargs:
|
:param dict kwargs:
|
||||||
A free-form thingy...
|
A free-form thingy...
|
||||||
|
|
||||||
|
@@ -1373,7 +1373,7 @@ def get_host_numa_usage_from_instance(host, instance, free=False,
|
|||||||
|
|
||||||
:param host: nova.objects.ComputeNode instance, or a db object or dict
|
:param host: nova.objects.ComputeNode instance, or a db object or dict
|
||||||
:param instance: nova.objects.Instance instance, or a db object or dict
|
:param instance: nova.objects.Instance instance, or a db object or dict
|
||||||
:param free: if True the the returned topology will have it's usage
|
:param free: if True the returned topology will have it's usage
|
||||||
decreased instead.
|
decreased instead.
|
||||||
:param never_serialize_result: if True result will always be an instance of
|
:param never_serialize_result: if True result will always be an instance of
|
||||||
objects.NUMATopology class.
|
objects.NUMATopology class.
|
||||||
|
@@ -454,7 +454,7 @@ def get_instance_path(instance, forceold=False, relative=False):
|
|||||||
|
|
||||||
|
|
||||||
def get_instance_path_at_destination(instance, migrate_data=None):
|
def get_instance_path_at_destination(instance, migrate_data=None):
|
||||||
"""Get the the instance path on destination node while live migration.
|
"""Get the instance path on destination node while live migration.
|
||||||
|
|
||||||
This method determines the directory name for instance storage on
|
This method determines the directory name for instance storage on
|
||||||
destination node, while live migration.
|
destination node, while live migration.
|
||||||
|
@@ -40,7 +40,7 @@ DcInfo = collections.namedtuple('DcInfo',
|
|||||||
['ref', 'name', 'vmFolder'])
|
['ref', 'name', 'vmFolder'])
|
||||||
|
|
||||||
# A cache for datastore/datacenter mappings. The key will be
|
# A cache for datastore/datacenter mappings. The key will be
|
||||||
# the datastore moref. The value will the the DcInfo object.
|
# the datastore moref. The value will be the DcInfo object.
|
||||||
_DS_DC_MAPPING = {}
|
_DS_DC_MAPPING = {}
|
||||||
|
|
||||||
|
|
||||||
|
@@ -330,7 +330,7 @@ class Application(object):
|
|||||||
res = exc.HTTPForbidden(explanation='Nice try')
|
res = exc.HTTPForbidden(explanation='Nice try')
|
||||||
|
|
||||||
# Option 3: a webob Response object (in case you need to play with
|
# Option 3: a webob Response object (in case you need to play with
|
||||||
# headers, or you want to be treated like an iterable, or or or)
|
# headers, or you want to be treated like an iterable, or ...)
|
||||||
res = Response()
|
res = Response()
|
||||||
res.app_iter = open('somefile')
|
res.app_iter = open('somefile')
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user