c8f3bc26a2
Flake8 3.0 enforces the check signature contract that was detailed in 2.x. To prepare Hacking for Flake8 3.0's release, we need to clean up our signatures and stop requesting both logical_line and physical_line, especially when we don't use both in each of those cases. Change-Id: Id55eadb66599a9bf240c837dafa88737aa024a16 Closes-bug: 1597729
47 lines
1.5 KiB
Python
47 lines
1.5 KiB
Python
# 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 tokenize
|
|
|
|
from hacking import core
|
|
|
|
|
|
LOCALS_TEXT_MAP = {
|
|
'locals': 'locals()',
|
|
'self': 'self.__dict__'
|
|
}
|
|
|
|
|
|
@core.flake8ext
|
|
def hacking_no_locals(logical_line, tokens, noqa):
|
|
"""Do not use locals() or self.__dict__ for string formatting.
|
|
|
|
Okay: 'locals()'
|
|
Okay: 'locals'
|
|
Okay: locals()
|
|
Okay: print(locals())
|
|
H501: print("%(something)" % locals())
|
|
H501: LOG.info(_("%(something)") % self.__dict__)
|
|
Okay: print("%(something)" % locals()) # noqa
|
|
"""
|
|
if noqa:
|
|
return
|
|
for_formatting = False
|
|
for token_type, text, start, _, _ in tokens:
|
|
if text == "%" and token_type == tokenize.OP:
|
|
for_formatting = True
|
|
if for_formatting and token_type == tokenize.NAME:
|
|
for k, v in LOCALS_TEXT_MAP.items():
|
|
if text == k and v in logical_line:
|
|
yield (start[1],
|
|
"H501: Do not use %s for string formatting" % v)
|