Code cleanup for test infrastructure. (#59046)

* Remove useless object inheritance in test code.
* Remove unnecessary pass statements from test code.
* Comment on why certain pylint rules are ignored.
* Add more pylint test contexts.
* Fix import order.
* Remove unused variables.
* Remove unnecessary pass statement.
* Fix bad continuations.
* Remove unnecessary elif.
* Allow legitimate broad except statements.
* Allow legitimate protected access.
* Clean up names to make pylint pass.
pull/59052/head
Matt Clay 7 years ago committed by GitHub
parent 8c55a9c70b
commit 6645054329
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

@ -3,7 +3,7 @@ from __future__ import (absolute_import, division, print_function)
__metaclass__ = type __metaclass__ = type
class CommonCache(object): class CommonCache:
"""Common cache.""" """Common cache."""
def __init__(self, args): def __init__(self, args):
""" """

@ -42,10 +42,9 @@ class InvalidBranch(ApplicationError):
class ChangeDetectionNotSupported(ApplicationError): class ChangeDetectionNotSupported(ApplicationError):
"""Exception for cases where change detection is not supported.""" """Exception for cases where change detection is not supported."""
pass
class ShippableChanges(object): class ShippableChanges:
"""Change information for Shippable build.""" """Change information for Shippable build."""
def __init__(self, args, git): def __init__(self, args, git):
""" """
@ -120,7 +119,7 @@ class ShippableChanges(object):
return last_successful_commit return last_successful_commit
class LocalChanges(object): class LocalChanges:
"""Change information for local work.""" """Change information for local work."""
def __init__(self, args, git): def __init__(self, args, git):
""" """

@ -170,7 +170,7 @@ def categorize_changes(args, paths, verbose_command=None):
return changes return changes
class PathMapper(object): class PathMapper:
"""Map file paths to test commands and targets.""" """Map file paths to test commands and targets."""
def __init__(self, args): def __init__(self, args):
""" """

@ -388,24 +388,21 @@ class CloudEnvironment(CloudBase):
def setup(self): def setup(self):
"""Setup which should be done once per environment instead of once per test target.""" """Setup which should be done once per environment instead of once per test target."""
pass
@abc.abstractmethod @abc.abstractmethod
def get_environment_config(self): def get_environment_config(self):
""" """
:rtype: CloudEnvironmentConfig :rtype: CloudEnvironmentConfig
""" """
pass
def on_failure(self, target, tries): def on_failure(self, target, tries):
""" """
:type target: IntegrationTarget :type target: IntegrationTarget
:type tries: int :type tries: int
""" """
pass
class CloudEnvironmentConfig(object): class CloudEnvironmentConfig:
"""Configuration for the environment.""" """Configuration for the environment."""
def __init__(self, env_vars=None, ansible_vars=None, module_defaults=None, callback_plugins=None): def __init__(self, env_vars=None, ansible_vars=None, module_defaults=None, callback_plugins=None):
""" """

@ -19,7 +19,6 @@ class OpenNebulaCloudProvider(CloudProvider):
def filter(self, targets, exclude): def filter(self, targets, exclude):
""" no need to filter modules, they can either run from config file or from fixtures""" """ no need to filter modules, they can either run from config file or from fixtures"""
pass
def setup(self): def setup(self):
"""Setup the cloud resource before delegation and register a cleanup callback.""" """Setup the cloud resource before delegation and register a cleanup callback."""

@ -185,7 +185,7 @@ class TowerCloudEnvironment(CloudEnvironment):
) )
class TowerConfig(object): class TowerConfig:
"""Tower settings.""" """Tower settings."""
def __init__(self, values): def __init__(self, values):
self.version = values.get('version') self.version = values.get('version')

@ -37,7 +37,7 @@ AWS_ENDPOINTS = {
} }
class AnsibleCoreCI(object): class AnsibleCoreCI:
"""Client for Ansible Core CI services.""" """Client for Ansible Core CI services."""
def __init__(self, args, platform, version, stage='prod', persist=True, load=True, name=None, provider=None): def __init__(self, args, platform, version, stage='prod', persist=True, load=True, name=None, provider=None):
""" """
@ -537,7 +537,7 @@ class CoreHttpError(HttpError):
self.remote_stack_trace = remote_stack_trace self.remote_stack_trace = remote_stack_trace
class SshKey(object): class SshKey:
"""Container for SSH key used to connect to remote instances.""" """Container for SSH key used to connect to remote instances."""
KEY_NAME = 'id_rsa' KEY_NAME = 'id_rsa'
PUB_NAME = 'id_rsa.pub' PUB_NAME = 'id_rsa.pub'
@ -574,7 +574,7 @@ class SshKey(object):
self.pub_contents = pub_fd.read().strip() self.pub_contents = pub_fd.read().strip()
class InstanceConnection(object): class InstanceConnection:
"""Container for remote instance status and connection details.""" """Container for remote instance status and connection details."""
def __init__(self, running, hostname, port, username, password): def __init__(self, running, hostname, port, username, password):
""" """

@ -21,7 +21,7 @@ def parse_diff(lines):
return DiffParser(lines).files return DiffParser(lines).files
class FileDiff(object): class FileDiff:
"""Parsed diff for a single file.""" """Parsed diff for a single file."""
def __init__(self, old_path, new_path): def __init__(self, old_path, new_path):
""" """
@ -47,7 +47,7 @@ class FileDiff(object):
return self.old.is_complete and self.new.is_complete return self.old.is_complete and self.new.is_complete
class DiffSide(object): class DiffSide:
"""Parsed diff for a single 'side' of a single file.""" """Parsed diff for a single 'side' of a single file."""
def __init__(self, path, new): def __init__(self, path, new):
""" """
@ -134,7 +134,7 @@ class DiffSide(object):
return ['%s:%4d %s' % (self.path, line[0], line[1]) for line in lines] return ['%s:%4d %s' % (self.path, line[0], line[1]) for line in lines]
class DiffParser(object): class DiffParser:
"""Parse diff lines.""" """Parse diff lines."""
def __init__(self, lines): def __init__(self, lines):
""" """

@ -1795,7 +1795,7 @@ def get_python_interpreter(args, configs, name):
return python_interpreter return python_interpreter
class EnvironmentDescription(object): class EnvironmentDescription:
"""Description of current running environment.""" """Description of current running environment."""
def __init__(self, args): def __init__(self, args):
"""Initialize snapshot of environment configuration. """Initialize snapshot of environment configuration.

@ -10,7 +10,7 @@ from lib.util import (
) )
class Git(object): class Git:
"""Wrapper around git command-line tools.""" """Wrapper around git command-line tools."""
def __init__(self, root=None): # type: (t.Optional[str]) -> None def __init__(self, root=None): # type: (t.Optional[str]) -> None
self.git = 'git' self.git = 'git'

@ -33,7 +33,7 @@ from lib.util_common import (
) )
class HttpClient(object): class HttpClient:
"""Make HTTP requests via curl.""" """Make HTTP requests via curl."""
def __init__(self, args, always=False, insecure=False, proxy=None): def __init__(self, args, always=False, insecure=False, proxy=None):
""" """
@ -146,7 +146,7 @@ class HttpClient(object):
return HttpResponse(method, url, status_code, body) return HttpResponse(method, url, status_code, body)
class HttpResponse(object): class HttpResponse:
"""HTTP response from curl.""" """HTTP response from curl."""
def __init__(self, method, url, status_code, response): def __init__(self, method, url, status_code, response):
""" """

@ -255,7 +255,7 @@ def integration_test_config_file(args, env_config, integration_dir):
yield path yield path
class IntegrationEnvironment(object): class IntegrationEnvironment:
"""Details about the integration environment.""" """Details about the integration environment."""
def __init__(self, integration_dir, inventory_path, ansible_config, vars_file): def __init__(self, integration_dir, inventory_path, ansible_config, vars_file):
self.integration_dir = integration_dir self.integration_dir = integration_dir

@ -32,7 +32,7 @@ from lib.config import (
) )
class ManageWindowsCI(object): class ManageWindowsCI:
"""Manage access to a Windows instance provided by Ansible Core CI.""" """Manage access to a Windows instance provided by Ansible Core CI."""
def __init__(self, core_ci): def __init__(self, core_ci):
""" """
@ -56,7 +56,6 @@ class ManageWindowsCI(object):
"""Used in delegate_remote to setup the host, no action is required for Windows. """Used in delegate_remote to setup the host, no action is required for Windows.
:type python_version: str :type python_version: str
""" """
pass
def wait(self): def wait(self):
"""Wait for instance to respond to ansible ping.""" """Wait for instance to respond to ansible ping."""
@ -136,7 +135,7 @@ class ManageWindowsCI(object):
raise ApplicationError('Failed transfer: %s -> %s' % (src, dst)) raise ApplicationError('Failed transfer: %s -> %s' % (src, dst))
class ManageNetworkCI(object): class ManageNetworkCI:
"""Manage access to a network instance provided by Ansible Core CI.""" """Manage access to a network instance provided by Ansible Core CI."""
def __init__(self, core_ci): def __init__(self, core_ci):
""" """
@ -177,7 +176,7 @@ class ManageNetworkCI(object):
(self.core_ci.platform, self.core_ci.version, self.core_ci.instance_id)) (self.core_ci.platform, self.core_ci.version, self.core_ci.instance_id))
class ManagePosixCI(object): class ManagePosixCI:
"""Manage access to a POSIX instance provided by Ansible Core CI.""" """Manage access to a POSIX instance provided by Ansible Core CI."""
def __init__(self, core_ci): def __init__(self, core_ci):
""" """

@ -17,7 +17,7 @@ from lib.diff import (
) )
class Metadata(object): class Metadata:
"""Metadata object for passing data to delegated tests.""" """Metadata object for passing data to delegated tests."""
def __init__(self): def __init__(self):
"""Initialize metadata.""" """Initialize metadata."""
@ -102,7 +102,7 @@ class Metadata(object):
return metadata return metadata
class ChangeDescription(object): class ChangeDescription:
"""Description of changes.""" """Description of changes."""
def __init__(self): def __init__(self):
self.command = '' # type: str self.command = '' # type: str

@ -28,7 +28,6 @@ class TarFilter(ABC):
:type item: tarfile.TarInfo :type item: tarfile.TarInfo
:rtype: tarfile.TarInfo | None :rtype: tarfile.TarInfo | None
""" """
pass
class DefaultTarFilter(TarFilter): class DefaultTarFilter(TarFilter):

@ -196,10 +196,9 @@ class SanityFailure(TestFailure):
class SanityMessage(TestMessage): class SanityMessage(TestMessage):
"""Single sanity test message for one file.""" """Single sanity test message for one file."""
pass
class SanityTargets(object): class SanityTargets:
"""Sanity test target information.""" """Sanity test target information."""
def __init__(self, include, exclude, require): def __init__(self, include, exclude, require):
""" """
@ -363,7 +362,6 @@ class SanitySingleVersion(SanityFunc):
:type targets: SanityTargets :type targets: SanityTargets
:rtype: TestResult :rtype: TestResult
""" """
pass
class SanityMultipleVersion(SanityFunc): class SanityMultipleVersion(SanityFunc):
@ -376,7 +374,6 @@ class SanityMultipleVersion(SanityFunc):
:type python_version: str :type python_version: str
:rtype: TestResult :rtype: TestResult
""" """
pass
SANITY_TESTS = ( SANITY_TESTS = (

@ -153,6 +153,8 @@ class PylintTest(SanitySingleVersion):
return context_filter return context_filter
add_context(remaining_paths, 'ansible-test', filter_path('test/runner/')) add_context(remaining_paths, 'ansible-test', filter_path('test/runner/'))
add_context(remaining_paths, 'validate-modules', filter_path('test/sanity/validate-modules/'))
add_context(remaining_paths, 'sanity', filter_path('test/sanity/'))
add_context(remaining_paths, 'units', filter_path('test/units/')) add_context(remaining_paths, 'units', filter_path('test/units/'))
add_context(remaining_paths, 'test', filter_path('test/')) add_context(remaining_paths, 'test', filter_path('test/'))
add_context(remaining_paths, 'hacking', filter_path('hacking/')) add_context(remaining_paths, 'hacking', filter_path('hacking/'))

@ -392,7 +392,7 @@ def analyze_integration_target_dependencies(integration_targets):
return dependencies return dependencies
class CompletionTarget(object): class CompletionTarget:
"""Command-line argument completion target base class.""" """Command-line argument completion target base class."""
__metaclass__ = abc.ABCMeta __metaclass__ = abc.ABCMeta

@ -55,7 +55,7 @@ def calculate_confidence(path, line, metadata):
return 50 return 50
class TestResult(object): class TestResult:
"""Base class for test results.""" """Base class for test results."""
def __init__(self, command, test, python_version=None): def __init__(self, command, test, python_version=None):
""" """
@ -96,23 +96,19 @@ class TestResult(object):
def write_console(self): def write_console(self):
"""Write results to console.""" """Write results to console."""
pass
def write_lint(self): def write_lint(self):
"""Write lint results to stdout.""" """Write lint results to stdout."""
pass
def write_bot(self, args): def write_bot(self, args):
""" """
:type args: TestConfig :type args: TestConfig
""" """
pass
def write_junit(self, args): def write_junit(self, args):
""" """
:type args: TestConfig :type args: TestConfig
""" """
pass
def create_path(self, directory, extension): def create_path(self, directory, extension):
""" """
@ -419,7 +415,7 @@ class TestFailure(TestResult):
return message return message
class TestMessage(object): class TestMessage:
"""Single test message for one file.""" """Single test message for one file."""
def __init__(self, message, path, line=0, column=0, level='error', code=None, confidence=None): def __init__(self, message, path, line=0, column=0, level='error', code=None, confidence=None):
""" """

@ -513,7 +513,7 @@ def generate_password():
return password return password
class Display(object): class Display:
"""Manages color console output.""" """Manages color console output."""
clear = '\033[0m' clear = '\033[0m'
red = '\033[31m' red = '\033[31m'
@ -626,12 +626,10 @@ class Display(object):
class ApplicationError(Exception): class ApplicationError(Exception):
"""General application error.""" """General application error."""
pass
class ApplicationWarning(Exception): class ApplicationWarning(Exception):
"""General application warning which interrupts normal program flow.""" """General application warning which interrupts normal program flow."""
pass
class SubprocessError(ApplicationError): class SubprocessError(ApplicationError):

@ -24,7 +24,7 @@ from lib.util import (
) )
class CommonConfig(object): class CommonConfig:
"""Configuration common to all commands.""" """Configuration common to all commands."""
def __init__(self, args, command): def __init__(self, args, command):
""" """

@ -14,8 +14,6 @@ from voluptuous.humanize import humanize_error
from ansible.module_utils.six import string_types from ansible.module_utils.six import string_types
list_string_types = list(string_types)
def main(): def main():
"""Validate BOTMETA""" """Validate BOTMETA"""
@ -27,10 +25,12 @@ def main():
except yaml.error.MarkedYAMLError as ex: except yaml.error.MarkedYAMLError as ex:
print('%s:%d:%d: YAML load failed: %s' % (path, ex.context_mark.line + 1, ex.context_mark.column + 1, re.sub(r'\s+', ' ', str(ex)))) print('%s:%d:%d: YAML load failed: %s' % (path, ex.context_mark.line + 1, ex.context_mark.column + 1, re.sub(r'\s+', ' ', str(ex))))
sys.exit() sys.exit()
except Exception as ex: except Exception as ex: # pylint: disable=broad-except
print('%s:%d:%d: YAML load failed: %s' % (path, 0, 0, re.sub(r'\s+', ' ', str(ex)))) print('%s:%d:%d: YAML load failed: %s' % (path, 0, 0, re.sub(r'\s+', ' ', str(ex))))
sys.exit() sys.exit()
list_string_types = list(string_types)
files_schema = Any( files_schema = Any(
Schema(*string_types), Schema(*string_types),
Schema({ Schema({

@ -25,10 +25,10 @@ import os
import re import re
import sys import sys
import yaml
from distutils.version import StrictVersion from distutils.version import StrictVersion
import yaml
import ansible.config import ansible.config
from ansible.plugins.loader import fragment_loader from ansible.plugins.loader import fragment_loader
@ -39,32 +39,32 @@ DOC_RE = re.compile(b'^DOCUMENTATION', flags=re.M)
ANSIBLE_MAJOR = StrictVersion('.'.join(ansible_version.split('.')[:2])) ANSIBLE_MAJOR = StrictVersion('.'.join(ansible_version.split('.')[:2]))
def find_deprecations(o, path=None): def find_deprecations(obj, path=None):
if not isinstance(o, (list, dict)): if not isinstance(obj, (list, dict)):
return return
try: try:
items = o.items() items = obj.items()
except AttributeError: except AttributeError:
items = enumerate(o) items = enumerate(obj)
for k, v in items: for key, value in items:
if path is None: if path is None:
this_path = [] this_path = []
else: else:
this_path = path[:] this_path = path[:]
this_path.append(k) this_path.append(key)
if k != 'deprecated': if key != 'deprecated':
for result in find_deprecations(v, path=this_path): for result in find_deprecations(value, path=this_path):
yield result yield result
else: else:
try: try:
version = v['version'] version = value['version']
this_path.append('version') this_path.append('version')
except KeyError: except KeyError:
version = v['removed_in'] version = value['removed_in']
this_path.append('removed_in') this_path.append('removed_in')
if StrictVersion(version) <= ANSIBLE_MAJOR: if StrictVersion(version) <= ANSIBLE_MAJOR:
yield (this_path, version) yield (this_path, version)
@ -75,12 +75,12 @@ def main():
for path in sys.argv[1:] or sys.stdin.read().splitlines(): for path in sys.argv[1:] or sys.stdin.read().splitlines():
with open(path, 'rb') as f: with open(path, 'rb') as f:
try: try:
mm = mmap.mmap(f.fileno(), 0, access=mmap.ACCESS_READ) mm_file = mmap.mmap(f.fileno(), 0, access=mmap.ACCESS_READ)
except ValueError: except ValueError:
continue continue
if DOC_RE.search(mm): if DOC_RE.search(mm_file):
plugins.append(path) plugins.append(path)
mm.close() mm_file.close()
for plugin in plugins: for plugin in plugins:
data = {} data = {}

@ -57,8 +57,8 @@ ILLEGAL_END_CHARS = [
def check_path(path, is_dir=False): def check_path(path, is_dir=False):
type_name = 'directory' if is_dir else 'file' type_name = 'directory' if is_dir else 'file'
parent, file_name = os.path.split(path) file_name = os.path.basename(path)
name, ext = os.path.splitext(file_name) name = os.path.splitext(file_name)[0]
if name.upper() in ILLEGAL_NAMES: if name.upper() in ILLEGAL_NAMES:
print("%s: illegal %s name %s" % (path, type_name, name.upper())) print("%s: illegal %s name %s" % (path, type_name, name.upper()))

@ -22,7 +22,7 @@ def main():
if match: if match:
print('%s:%d:%d: use only one of `default` or `required` with `FieldAttribute`' % ( print('%s:%d:%d: use only one of `default` or `required` with `FieldAttribute`' % (
path, line + 1, match.start(1) + 1)) path, line + 1, match.start(1) + 1))
if __name__ == '__main__': if __name__ == '__main__':

@ -92,9 +92,9 @@ def main():
is_integration = True is_integration = True
if dirname.endswith('/library') or dirname.endswith('/plugins/modules') or dirname in ( if dirname.endswith('/library') or dirname.endswith('/plugins/modules') or dirname in (
# non-standard module library directories # non-standard module library directories
'test/integration/targets/module_precedence/lib_no_extension', 'test/integration/targets/module_precedence/lib_no_extension',
'test/integration/targets/module_precedence/lib_with_extension', 'test/integration/targets/module_precedence/lib_with_extension',
): ):
is_module = True is_module = True
elif dirname == 'plugins/modules': elif dirname == 'plugins/modules':

@ -20,7 +20,7 @@ def main():
try: try:
parser.suite(source) parser.suite(source)
except SyntaxError: except SyntaxError:
ex_type, ex, ex_traceback = sys.exc_info() ex = sys.exc_info()[1]
status = 1 status = 1
message = ex.text.splitlines()[0].strip() message = ex.text.splitlines()[0].strip()
sys.stdout.write("%s:%d:%d: SyntaxError: %s\n" % (path, ex.lineno, ex.offset, message)) sys.stdout.write("%s:%d:%d: SyntaxError: %s\n" % (path, ex.lineno, ex.offset, message))

@ -12,9 +12,9 @@ import warnings
try: try:
import importlib.util import importlib.util
imp = None imp = None # pylint: disable=invalid-name
except ImportError: except ImportError:
importlib = None importlib = None # pylint: disable=invalid-name
import imp import imp
try: try:
@ -28,10 +28,9 @@ import ansible.module_utils.common.removed
class ImporterAnsibleModuleException(Exception): class ImporterAnsibleModuleException(Exception):
"""Exception thrown during initialization of ImporterAnsibleModule.""" """Exception thrown during initialization of ImporterAnsibleModule."""
pass
class ImporterAnsibleModule(object): class ImporterAnsibleModule:
"""Replacement for AnsibleModule to support import testing.""" """Replacement for AnsibleModule to support import testing."""
def __init__(self, *args, **kwargs): def __init__(self, *args, **kwargs):
raise ImporterAnsibleModuleException() raise ImporterAnsibleModuleException()
@ -40,7 +39,7 @@ class ImporterAnsibleModule(object):
# stop Ansible module execution during AnsibleModule instantiation # stop Ansible module execution during AnsibleModule instantiation
ansible.module_utils.basic.AnsibleModule = ImporterAnsibleModule ansible.module_utils.basic.AnsibleModule = ImporterAnsibleModule
# no-op for _load_params since it may be called before instantiating AnsibleModule # no-op for _load_params since it may be called before instantiating AnsibleModule
ansible.module_utils.basic._load_params = lambda *args, **kwargs: {} ansible.module_utils.basic._load_params = lambda *args, **kwargs: {} # pylint: disable=protected-access
# no-op for removed_module since it is called in place of AnsibleModule instantiation # no-op for removed_module since it is called in place of AnsibleModule instantiation
ansible.module_utils.common.removed.removed_module = lambda *args, **kwargs: None ansible.module_utils.common.removed.removed_module = lambda *args, **kwargs: None
@ -142,7 +141,7 @@ def test_python_module(path, base_dir, messages, ansible_module):
report_message(error, messages) report_message(error, messages)
class Capture(object): class Capture:
"""Captured output and/or exception.""" """Captured output and/or exception."""
def __init__(self): def __init__(self):
self.stdout = StringIO() self.stdout = StringIO()

@ -10,11 +10,9 @@ disable=
too-many-nested-blocks, too-many-nested-blocks,
too-many-return-statements, too-many-return-statements,
too-many-statements, too-many-statements,
unnecessary-pass, unused-import, # pylint does not understand PEP 484 type hints
unused-import, consider-using-dict-comprehension, # requires Python 2.6, which we still support
useless-object-inheritance, consider-using-set-comprehension, # requires Python 2.6, which we still support
consider-using-dict-comprehension,
consider-using-set-comprehension,
[BASIC] [BASIC]

@ -0,0 +1,40 @@
[MESSAGES CONTROL]
disable=
too-few-public-methods,
too-many-arguments,
too-many-branches,
too-many-instance-attributes,
too-many-lines,
too-many-locals,
too-many-nested-blocks,
too-many-return-statements,
too-many-statements,
missing-docstring,
unused-import, # pylint does not understand PEP 484 type hints
consider-using-dict-comprehension, # requires Python 2.6, which we still support
consider-using-set-comprehension, # requires Python 2.6, which we still support
[BASIC]
bad-names=foo,
bar,
baz,
toto,
tutu,
tata,
_,
good-names=i,
j,
k,
f,
e,
ex,
Run,
C,
__metaclass__,
module-rgx=[a-z_][a-z0-9_-]{2,40}$
method-rgx=[a-z_][a-z0-9_]{2,40}$
function-rgx=[a-z_][a-z0-9_]{2,40}$

@ -9,7 +9,7 @@ from pylint.checkers import BaseChecker
from pylint.interfaces import IAstroidChecker from pylint.interfaces import IAstroidChecker
class BlacklistEntry(object): class BlacklistEntry:
"""Defines a import blacklist entry.""" """Defines a import blacklist entry."""
def __init__(self, alternative, modules_only=False, names=None, ignore_paths=None): def __init__(self, alternative, modules_only=False, names=None, ignore_paths=None):
""" """

@ -70,7 +70,7 @@ class AnsibleDeprecatedChecker(BaseChecker):
if len(node.keywords) == 1 and keyword.arg is None: if len(node.keywords) == 1 and keyword.arg is None:
# This is likely a **kwargs splat # This is likely a **kwargs splat
return return
elif keyword.arg == 'version': if keyword.arg == 'version':
if isinstance(keyword.value.value, astroid.Name): if isinstance(keyword.value.value, astroid.Name):
# This is likely a variable # This is likely a variable
return return

@ -74,7 +74,7 @@ class AnsibleStringFormatChecker(BaseChecker):
if node.starargs or node.kwargs: if node.starargs or node.kwargs:
return return
try: try:
fields, num_args, manual_pos = parse_format_method_string(strnode.value) num_args = parse_format_method_string(strnode.value)[1]
except utils.IncompleteFormatString: except utils.IncompleteFormatString:
return return

@ -94,7 +94,7 @@ class ReporterEncoder(json.JSONEncoder):
return json.JSONEncoder.default(self, o) return json.JSONEncoder.default(self, o)
class Reporter(object): class Reporter:
def __init__(self): def __init__(self):
self.files = OrderedDict() self.files = OrderedDict()
@ -1699,7 +1699,7 @@ def main():
sys.exit(reporter.json(warnings=args.warnings, output=args.output)) sys.exit(reporter.json(warnings=args.warnings, output=args.output))
class GitCache(object): class GitCache:
def __init__(self, base_branch): def __init__(self, base_branch):
self.base_branch = base_branch self.base_branch = base_branch

@ -21,7 +21,7 @@ def main():
checker.report() checker.report()
class YamlChecker(object): class YamlChecker:
"""Wrapper around yamllint that supports YAML embedded in Ansible modules.""" """Wrapper around yamllint that supports YAML embedded in Ansible modules."""
def __init__(self): def __init__(self):
self.messages = [] self.messages = []
@ -177,7 +177,7 @@ class YamlChecker(object):
column=ex.offset, column=ex.offset,
level='error', level='error',
)) ))
except Exception as ex: except Exception as ex: # pylint: disable=broad-except
self.messages.append(dict( self.messages.append(dict(
code='python-parse-error', code='python-parse-error',
message=str(ex), message=str(ex),

Loading…
Cancel
Save