Update more code-smell tests. (#36570)
* Enhance use-compat-six code-smell test. * Enhance use-argspec-type-path code-smell test. * Enhance replace-urlopen code-smell test. * Enhance boilerplate code-smell test. * Enhance no-underscore-variable code-smell test.
This commit is contained in:
parent
0e0d6cf4f2
commit
5b5cba5e50
15 changed files with 370 additions and 314 deletions
6
test/sanity/code-smell/boilerplate.json
Normal file
6
test/sanity/code-smell/boilerplate.json
Normal file
|
@ -0,0 +1,6 @@
|
|||
{
|
||||
"extensions": [
|
||||
".py"
|
||||
],
|
||||
"output": "path-message"
|
||||
}
|
72
test/sanity/code-smell/boilerplate.py
Executable file
72
test/sanity/code-smell/boilerplate.py
Executable file
|
@ -0,0 +1,72 @@
|
|||
#!/usr/bin/env python
|
||||
|
||||
import sys
|
||||
|
||||
|
||||
def main():
|
||||
skip = set([
|
||||
'lib/ansible/compat/selectors/_selectors2.py',
|
||||
'lib/ansible/module_utils/six/_six.py',
|
||||
'setup.py',
|
||||
])
|
||||
|
||||
prune = [
|
||||
'contrib/inventory/',
|
||||
'contrib/vault/',
|
||||
'docs/',
|
||||
'examples/',
|
||||
'hacking/',
|
||||
'lib/ansible/module_utils/',
|
||||
'lib/ansible/modules/cloud/amazon/',
|
||||
'lib/ansible/modules/cloud/cloudstack/',
|
||||
'lib/ansible/modules/cloud/ovirt/',
|
||||
'lib/ansible/modules/network/aos/',
|
||||
'lib/ansible/modules/network/avi/',
|
||||
'lib/ansible/modules/network/cloudengine/',
|
||||
'lib/ansible/modules/network/eos/',
|
||||
'lib/ansible/modules/network/ios/',
|
||||
'lib/ansible/modules/network/netvisor/',
|
||||
'lib/ansible/modules/network/nxos/',
|
||||
'lib/ansible/modules/network/panos/',
|
||||
'lib/ansible/modules/network/vyos/',
|
||||
'lib/ansible/modules/windows/',
|
||||
'lib/ansible/utils/module_docs_fragments/',
|
||||
'test/'
|
||||
]
|
||||
|
||||
for path in sys.argv[1:]:
|
||||
if path in skip:
|
||||
continue
|
||||
|
||||
if any(path.startswith(p) for p in prune):
|
||||
continue
|
||||
|
||||
with open(path, 'r') as path_fd:
|
||||
future_ok = None
|
||||
metaclass_ok = None
|
||||
|
||||
lines = path_fd.read().splitlines()
|
||||
|
||||
if not lines:
|
||||
continue
|
||||
|
||||
for line, text in enumerate(lines):
|
||||
if text in ('from __future__ import (absolute_import, division, print_function)',
|
||||
'from __future__ import absolute_import, division, print_function'):
|
||||
future_ok = line
|
||||
|
||||
if text == '__metaclass__ = type':
|
||||
metaclass_ok = line
|
||||
|
||||
if future_ok and metaclass_ok:
|
||||
break
|
||||
|
||||
if future_ok is None:
|
||||
print('%s: missing: from __future__ import (absolute_import, division, print_function)' % path)
|
||||
|
||||
if metaclass_ok is None:
|
||||
print('%s: missing: __metaclass__ = type' % path)
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
main()
|
|
@ -1,94 +0,0 @@
|
|||
#!/bin/sh
|
||||
|
||||
metaclass1=$(find ./bin -type f -exec grep -HL '__metaclass__ = type' '{}' '+')
|
||||
future1=$(find ./bin -type f -exec grep -HL 'from __future__ import (absolute_import, division, print_function)' '{}' '+')
|
||||
|
||||
# We eventually want to remove the module_utils pruning from metaclass2 and future2
|
||||
metaclass2=$(find ./lib/ansible -path ./lib/ansible/modules -prune \
|
||||
-o -path ./lib/ansible/module_utils -prune \
|
||||
-o -path ./lib/ansible/module_utils/six/_six.py -prune \
|
||||
-o -path ./lib/ansible/compat/selectors/_selectors2.py -prune \
|
||||
-o -path ./lib/ansible/utils/module_docs_fragments -prune \
|
||||
-o -name '*.py' -type f -size +0c -exec grep -HL '__metaclass__ = type' '{}' '+')
|
||||
|
||||
future2=$(find ./lib/ansible -path ./lib/ansible/modules -prune \
|
||||
-o -path ./lib/ansible/module_utils -prune \
|
||||
-o -path ./lib/ansible/module_utils/six/_six.py -prune \
|
||||
-o -path ./lib/ansible/compat/selectors/_selectors2.py -prune \
|
||||
-o -path ./lib/ansible/utils/module_docs_fragments -prune \
|
||||
-o -name '*.py' -type f -size +0c -exec grep -HL 'from __future__ import (absolute_import, division, print_function)' '{}' '+')
|
||||
|
||||
# Eventually we want metaclass3 and future3 to get down to 0
|
||||
metaclass3=$(find ./lib/ansible/modules -path ./lib/ansible/modules/windows -prune \
|
||||
-o -path ./lib/ansible/modules/cloud/ovirt -prune \
|
||||
-o -path ./lib/ansible/modules/cloud/cloudstack -prune \
|
||||
-o -path ./lib/ansible/modules/cloud/amazon -prune \
|
||||
-o -path ./lib/ansible/modules/network/aos -prune \
|
||||
-o -path ./lib/ansible/modules/network/avi -prune \
|
||||
-o -path ./lib/ansible/modules/network/cloudengine -prune \
|
||||
-o -path ./lib/ansible/modules/network/eos -prune \
|
||||
-o -path ./lib/ansible/modules/network/ios -prune \
|
||||
-o -path ./lib/ansible/modules/network/netvisor -prune \
|
||||
-o -path ./lib/ansible/modules/network/nxos -prune \
|
||||
-o -path ./lib/ansible/modules/network/panos -prune \
|
||||
-o -path ./lib/ansible/modules/network/vyos -prune \
|
||||
-o -name '*.py' -type f -size +0c -exec grep -HL '__metaclass__ = type' '{}' '+')
|
||||
|
||||
future3=$(find ./lib/ansible/modules -path ./lib/ansible/modules/windows -prune \
|
||||
-o -path ./lib/ansible/modules/cloud/ovirt -prune \
|
||||
-o -path ./lib/ansible/modules/cloud/cloudstack -prune \
|
||||
-o -path ./lib/ansible/modules/cloud/amazon -prune \
|
||||
-o -path ./lib/ansible/modules/network/aos -prune \
|
||||
-o -path ./lib/ansible/modules/network/avi -prune \
|
||||
-o -path ./lib/ansible/modules/network/cloudengine -prune \
|
||||
-o -path ./lib/ansible/modules/network/eos -prune \
|
||||
-o -path ./lib/ansible/modules/network/ios -prune \
|
||||
-o -path ./lib/ansible/modules/network/netvisor -prune \
|
||||
-o -path ./lib/ansible/modules/network/nxos -prune \
|
||||
-o -path ./lib/ansible/modules/network/panos -prune \
|
||||
-o -path ./lib/ansible/modules/network/vyos -prune \
|
||||
-o -name '*.py' -type f -size +0c -exec egrep -HL 'from __future__ import (?absolute_import, division, print_function)?' '{}' '+')
|
||||
|
||||
###
|
||||
### Important: If you're looking for a list of files to cleanup for boilerplate
|
||||
### Look at this wikipage instead: https://github.com/ansible/community/wiki/Testing:-boilerplate,-wildcard-imports,-and-get_exception
|
||||
###
|
||||
|
||||
### TODO:
|
||||
### - module_utils <=== these are important but not well organized so we'd
|
||||
### have to construct the test file by file
|
||||
### - contrib/ <=== Not a priority as these will move to inventory plugins over time
|
||||
|
||||
|
||||
if test -n "$metaclass1" -o -n "$metaclass2" -o -n "$metaclass3" ; then
|
||||
printf "\n== Missing __metaclass__ = type ==\n"
|
||||
fi
|
||||
|
||||
if test -n "$metaclass1" ; then
|
||||
printf "%s\n" "$metaclass1"
|
||||
fi
|
||||
if test -n "$metaclass2" ; then
|
||||
printf "%s\n" "$metaclass2"
|
||||
fi
|
||||
if test -n "$metaclass3" ; then
|
||||
printf "%s\n" "$metaclass3"
|
||||
fi
|
||||
|
||||
if test -n "$future1" -o -n "$future2" -o -n "$future3" ; then
|
||||
printf "\n== Missing from __future__ import (absolute_import, division, print_function) ==\n"
|
||||
fi
|
||||
|
||||
if test -n "$future1" ; then
|
||||
printf "%s\n" "$future1"
|
||||
fi
|
||||
if test -n "$future2" ; then
|
||||
printf "%s\n" "$future2"
|
||||
fi
|
||||
if test -n "$future3" ; then
|
||||
printf "%s\n" "$future3"
|
||||
fi
|
||||
|
||||
if test -n "$future1$future2$future3$metaclass1$metaclass2$metaclass3" ; then
|
||||
exit 2
|
||||
fi
|
||||
exit 0
|
6
test/sanity/code-smell/no-underscore-variable.json
Normal file
6
test/sanity/code-smell/no-underscore-variable.json
Normal file
|
@ -0,0 +1,6 @@
|
|||
{
|
||||
"extensions": [
|
||||
".py"
|
||||
],
|
||||
"output": "path-line-column-message"
|
||||
}
|
140
test/sanity/code-smell/no-underscore-variable.py
Executable file
140
test/sanity/code-smell/no-underscore-variable.py
Executable file
|
@ -0,0 +1,140 @@
|
|||
#!/usr/bin/env python
|
||||
|
||||
# Only needed until we can enable a pylint test for this. We may have to write
|
||||
# one or add it to another existing test (like the one to warn on inappropriate
|
||||
# variable names). Adding to an existing test may be hard as we may have many
|
||||
# other things that are not compliant with that test.
|
||||
|
||||
import os
|
||||
import re
|
||||
import sys
|
||||
|
||||
|
||||
def main():
|
||||
skip = set([
|
||||
'test/sanity/code-smell/%s' % os.path.basename(__file__),
|
||||
# These files currently use _ as a variable. Fix them and then remove them
|
||||
# from this list. Note that we're not sure if we'll translate module return
|
||||
# values. If we decide never to do that, then we can stop checking for those.
|
||||
'contrib/inventory/gce.py',
|
||||
'lib/ansible/cli/console.py',
|
||||
'lib/ansible/compat/selectors/_selectors2.py',
|
||||
'lib/ansible/executor/playbook_executor.py',
|
||||
'lib/ansible/executor/task_queue_manager.py',
|
||||
'lib/ansible/module_utils/facts/network/linux.py',
|
||||
'lib/ansible/module_utils/urls.py',
|
||||
'lib/ansible/modules/cloud/amazon/data_pipeline.py',
|
||||
'lib/ansible/modules/cloud/amazon/ec2_group_facts.py',
|
||||
'lib/ansible/modules/cloud/amazon/ec2_vpc_nat_gateway.py',
|
||||
'lib/ansible/modules/cloud/amazon/ec2_vpc_vpn.py',
|
||||
'lib/ansible/modules/cloud/amazon/efs.py',
|
||||
'lib/ansible/modules/cloud/amazon/efs_facts.py',
|
||||
'lib/ansible/modules/cloud/amazon/kinesis_stream.py',
|
||||
'lib/ansible/modules/cloud/amazon/route53_zone.py',
|
||||
'lib/ansible/modules/cloud/amazon/s3_sync.py',
|
||||
'lib/ansible/modules/cloud/azure/azure_rm_loadbalancer.py',
|
||||
'lib/ansible/modules/cloud/docker/docker_container.py',
|
||||
'lib/ansible/modules/cloud/docker/docker_service.py',
|
||||
'lib/ansible/modules/cloud/google/gce.py',
|
||||
'lib/ansible/modules/cloud/google/gce_eip.py',
|
||||
'lib/ansible/modules/cloud/google/gce_img.py',
|
||||
'lib/ansible/modules/cloud/google/gce_instance_template.py',
|
||||
'lib/ansible/modules/cloud/google/gce_lb.py',
|
||||
'lib/ansible/modules/cloud/google/gce_mig.py',
|
||||
'lib/ansible/modules/cloud/google/gce_net.py',
|
||||
'lib/ansible/modules/cloud/google/gce_pd.py',
|
||||
'lib/ansible/modules/cloud/google/gce_snapshot.py',
|
||||
'lib/ansible/modules/cloud/google/gce_tag.py',
|
||||
'lib/ansible/modules/cloud/google/gcp_backend_service.py',
|
||||
'lib/ansible/modules/cloud/google/gcp_healthcheck.py',
|
||||
'lib/ansible/modules/cloud/lxc/lxc_container.py',
|
||||
'lib/ansible/modules/files/copy.py',
|
||||
'lib/ansible/modules/files/patch.py',
|
||||
'lib/ansible/modules/files/synchronize.py',
|
||||
'lib/ansible/modules/monitoring/statusio_maintenance.py',
|
||||
'lib/ansible/modules/monitoring/zabbix/zabbix_maintenance.py',
|
||||
'lib/ansible/modules/net_tools/basics/uri.py',
|
||||
'lib/ansible/modules/network/cloudengine/ce_acl.py',
|
||||
'lib/ansible/modules/network/cloudengine/ce_command.py',
|
||||
'lib/ansible/modules/network/cloudengine/ce_dldp_interface.py',
|
||||
'lib/ansible/modules/network/cloudengine/ce_mlag_interface.py',
|
||||
'lib/ansible/modules/network/cloudvision/cv_server_provision.py',
|
||||
'lib/ansible/modules/network/f5/bigip_remote_syslog.py',
|
||||
'lib/ansible/modules/network/illumos/dladm_etherstub.py',
|
||||
'lib/ansible/modules/network/illumos/dladm_iptun.py',
|
||||
'lib/ansible/modules/network/illumos/dladm_linkprop.py',
|
||||
'lib/ansible/modules/network/illumos/dladm_vlan.py',
|
||||
'lib/ansible/modules/network/illumos/dladm_vnic.py',
|
||||
'lib/ansible/modules/network/illumos/flowadm.py',
|
||||
'lib/ansible/modules/network/illumos/ipadm_addr.py',
|
||||
'lib/ansible/modules/network/illumos/ipadm_addrprop.py',
|
||||
'lib/ansible/modules/network/illumos/ipadm_if.py',
|
||||
'lib/ansible/modules/network/illumos/ipadm_ifprop.py',
|
||||
'lib/ansible/modules/network/illumos/ipadm_prop.py',
|
||||
'lib/ansible/modules/network/vyos/vyos_command.py',
|
||||
'lib/ansible/modules/packaging/language/pip.py',
|
||||
'lib/ansible/modules/packaging/os/yum.py',
|
||||
'lib/ansible/modules/source_control/git.py',
|
||||
'lib/ansible/modules/system/alternatives.py',
|
||||
'lib/ansible/modules/system/beadm.py',
|
||||
'lib/ansible/modules/system/cronvar.py',
|
||||
'lib/ansible/modules/system/dconf.py',
|
||||
'lib/ansible/modules/system/filesystem.py',
|
||||
'lib/ansible/modules/system/gconftool2.py',
|
||||
'lib/ansible/modules/system/interfaces_file.py',
|
||||
'lib/ansible/modules/system/iptables.py',
|
||||
'lib/ansible/modules/system/java_cert.py',
|
||||
'lib/ansible/modules/system/lvg.py',
|
||||
'lib/ansible/modules/system/lvol.py',
|
||||
'lib/ansible/modules/system/parted.py',
|
||||
'lib/ansible/modules/system/timezone.py',
|
||||
'lib/ansible/modules/system/ufw.py',
|
||||
'lib/ansible/modules/utilities/logic/wait_for.py',
|
||||
'lib/ansible/modules/web_infrastructure/rundeck_acl_policy.py',
|
||||
'lib/ansible/parsing/vault/__init__.py',
|
||||
'lib/ansible/playbook/base.py',
|
||||
'lib/ansible/playbook/helpers.py',
|
||||
'lib/ansible/playbook/role/__init__.py',
|
||||
'lib/ansible/playbook/taggable.py',
|
||||
'lib/ansible/plugins/callback/hipchat.py',
|
||||
'lib/ansible/plugins/connection/lxc.py',
|
||||
'lib/ansible/plugins/filter/core.py',
|
||||
'lib/ansible/plugins/lookup/sequence.py',
|
||||
'lib/ansible/plugins/strategy/__init__.py',
|
||||
'lib/ansible/plugins/strategy/linear.py',
|
||||
'test/legacy/cleanup_gce.py',
|
||||
'test/legacy/gce_credentials.py',
|
||||
'test/runner/lib/cloud/cs.py',
|
||||
'test/runner/lib/core_ci.py',
|
||||
'test/runner/lib/delegation.py',
|
||||
'test/runner/lib/docker_util.py',
|
||||
'test/runner/lib/executor.py',
|
||||
'test/runner/lib/http.py',
|
||||
'test/runner/lib/import_analysis.py',
|
||||
'test/runner/lib/manage_ci.py',
|
||||
'test/runner/lib/target.py',
|
||||
'test/runner/lib/util.py',
|
||||
'test/sanity/import/importer.py',
|
||||
'test/sanity/validate-modules/main.py',
|
||||
'test/units/executor/test_play_iterator.py',
|
||||
'test/units/module_utils/basic/test_run_command.py',
|
||||
'test/units/modules/cloud/amazon/test_ec2_vpc_nat_gateway.py',
|
||||
'test/units/modules/cloud/amazon/test_ec2_vpc_vpn.py',
|
||||
'test/units/modules/system/interfaces_file/test_interfaces_file.py',
|
||||
])
|
||||
|
||||
for path in sys.argv[1:]:
|
||||
if path in skip:
|
||||
continue
|
||||
|
||||
with open(path, 'r') as path_fd:
|
||||
for line, text in enumerate(path_fd.readlines()):
|
||||
match = re.search(r'(?: |[^C]\()(_)(?: |,|\))', text)
|
||||
|
||||
if match:
|
||||
print('%s:%d:%d: use `dummy` instead of `_` for a variable name' % (
|
||||
path, line + 1, match.start(1) + 1))
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
main()
|
|
@ -1,142 +0,0 @@
|
|||
#!/bin/sh
|
||||
|
||||
# Only needed until we can enable a pylint test for this. We may have to write
|
||||
# one or add it to another existing test (like the one to warn on inappropriate
|
||||
# variable names). Adding to an existing test may be hard as we may have many
|
||||
# other things that are not compliant with that test.
|
||||
|
||||
# These files currently use _ as a variable. Fix them and then remove them
|
||||
# from this list note that we're not sure if we'll translate module return
|
||||
# values. If we decide never to do that, then we can stop checking for those.
|
||||
|
||||
TO_BE_FIXED='
|
||||
./contrib/inventory/gce.py
|
||||
./lib/ansible/cli/console.py
|
||||
./lib/ansible/compat/selectors/_selectors2.py
|
||||
./lib/ansible/executor/playbook_executor.py
|
||||
./lib/ansible/executor/task_queue_manager.py
|
||||
./lib/ansible/module_utils/facts/network/linux.py
|
||||
./lib/ansible/module_utils/urls.py
|
||||
./lib/ansible/modules/cloud/amazon/data_pipeline.py
|
||||
./lib/ansible/modules/cloud/amazon/ec2_group_facts.py
|
||||
./lib/ansible/modules/cloud/amazon/ec2_vpc_nat_gateway.py
|
||||
./lib/ansible/modules/cloud/amazon/ec2_vpc_vpn.py
|
||||
./lib/ansible/modules/cloud/amazon/efs.py
|
||||
./lib/ansible/modules/cloud/amazon/efs_facts.py
|
||||
./lib/ansible/modules/cloud/amazon/kinesis_stream.py
|
||||
./lib/ansible/modules/cloud/amazon/route53_zone.py
|
||||
./lib/ansible/modules/cloud/amazon/s3_sync.py
|
||||
./lib/ansible/modules/cloud/azure/azure_rm_loadbalancer.py
|
||||
./lib/ansible/modules/cloud/docker/_docker.py
|
||||
./lib/ansible/modules/cloud/docker/docker_container.py
|
||||
./lib/ansible/modules/cloud/docker/docker_service.py
|
||||
./lib/ansible/modules/cloud/google/gce.py
|
||||
./lib/ansible/modules/cloud/google/gce_eip.py
|
||||
./lib/ansible/modules/cloud/google/gce_img.py
|
||||
./lib/ansible/modules/cloud/google/gce_instance_template.py
|
||||
./lib/ansible/modules/cloud/google/gce_lb.py
|
||||
./lib/ansible/modules/cloud/google/gce_mig.py
|
||||
./lib/ansible/modules/cloud/google/gce_net.py
|
||||
./lib/ansible/modules/cloud/google/gce_pd.py
|
||||
./lib/ansible/modules/cloud/google/gce_snapshot.py
|
||||
./lib/ansible/modules/cloud/google/gce_tag.py
|
||||
./lib/ansible/modules/cloud/google/gcp_backend_service.py
|
||||
./lib/ansible/modules/cloud/google/gcp_healthcheck.py
|
||||
./lib/ansible/modules/cloud/lxc/lxc_container.py
|
||||
./lib/ansible/modules/clustering/oc.py
|
||||
./lib/ansible/modules/files/copy.py
|
||||
./lib/ansible/modules/files/patch.py
|
||||
./lib/ansible/modules/files/synchronize.py
|
||||
./lib/ansible/modules/monitoring/statusio_maintenance.py
|
||||
./lib/ansible/modules/monitoring/zabbix/zabbix_maintenance.py
|
||||
./lib/ansible/modules/net_tools/basics/uri.py
|
||||
./lib/ansible/modules/network/cloudengine/ce_acl.py
|
||||
./lib/ansible/modules/network/cloudengine/ce_command.py
|
||||
./lib/ansible/modules/network/cloudengine/ce_dldp_interface.py
|
||||
./lib/ansible/modules/network/cloudengine/ce_mlag_interface.py
|
||||
./lib/ansible/modules/network/cloudvision/cv_server_provision.py
|
||||
./lib/ansible/modules/network/f5/bigip_remote_syslog.py
|
||||
./lib/ansible/modules/network/illumos/dladm_etherstub.py
|
||||
./lib/ansible/modules/network/illumos/dladm_iptun.py
|
||||
./lib/ansible/modules/network/illumos/dladm_linkprop.py
|
||||
./lib/ansible/modules/network/illumos/dladm_vlan.py
|
||||
./lib/ansible/modules/network/illumos/dladm_vnic.py
|
||||
./lib/ansible/modules/network/illumos/flowadm.py
|
||||
./lib/ansible/modules/network/illumos/ipadm_addr.py
|
||||
./lib/ansible/modules/network/illumos/ipadm_addrprop.py
|
||||
./lib/ansible/modules/network/illumos/ipadm_if.py
|
||||
./lib/ansible/modules/network/illumos/ipadm_ifprop.py
|
||||
./lib/ansible/modules/network/illumos/ipadm_prop.py
|
||||
./lib/ansible/modules/network/vyos/vyos_command.py
|
||||
./lib/ansible/modules/packaging/language/pip.py
|
||||
./lib/ansible/modules/packaging/os/yum.py
|
||||
./lib/ansible/modules/source_control/git.py
|
||||
./lib/ansible/modules/system/alternatives.py
|
||||
./lib/ansible/modules/system/beadm.py
|
||||
./lib/ansible/modules/system/cronvar.py
|
||||
./lib/ansible/modules/system/dconf.py
|
||||
./lib/ansible/modules/system/filesystem.py
|
||||
./lib/ansible/modules/system/gconftool2.py
|
||||
./lib/ansible/modules/system/interfaces_file.py
|
||||
./lib/ansible/modules/system/iptables.py
|
||||
./lib/ansible/modules/system/java_cert.py
|
||||
./lib/ansible/modules/system/lvg.py
|
||||
./lib/ansible/modules/system/lvol.py
|
||||
./lib/ansible/modules/system/parted.py
|
||||
./lib/ansible/modules/system/timezone.py
|
||||
./lib/ansible/modules/system/ufw.py
|
||||
./lib/ansible/modules/utilities/logic/wait_for.py
|
||||
./lib/ansible/modules/web_infrastructure/letsencrypt.py
|
||||
./lib/ansible/modules/web_infrastructure/rundeck_acl_policy.py
|
||||
./lib/ansible/parsing/vault/__init__.py
|
||||
./lib/ansible/playbook/base.py
|
||||
./lib/ansible/playbook/helpers.py
|
||||
./lib/ansible/playbook/role/__init__.py
|
||||
./lib/ansible/playbook/taggable.py
|
||||
./lib/ansible/plugins/callback/hipchat.py
|
||||
./lib/ansible/plugins/connection/lxc.py
|
||||
./lib/ansible/plugins/filter/core.py
|
||||
./lib/ansible/plugins/lookup/sequence.py
|
||||
./lib/ansible/plugins/strategy/__init__.py
|
||||
./lib/ansible/plugins/strategy/linear.py
|
||||
./test/legacy/cleanup_gce.py
|
||||
./test/legacy/gce_credentials.py
|
||||
./test/sanity/import/importer.py
|
||||
./test/runner/lib/cloud/cs.py
|
||||
./test/runner/lib/core_ci.py
|
||||
./test/runner/lib/delegation.py
|
||||
./test/runner/lib/docker_util.py
|
||||
./test/runner/lib/executor.py
|
||||
./test/runner/lib/http.py
|
||||
./test/runner/lib/import_analysis.py
|
||||
./test/runner/lib/manage_ci.py
|
||||
./test/runner/lib/target.py
|
||||
./test/runner/lib/util.py
|
||||
./test/sanity/validate-modules/main.py
|
||||
./test/units/executor/test_play_iterator.py
|
||||
./test/units/module_utils/basic/test_run_command.py
|
||||
./test/units/modules/cloud/amazon/test_ec2_vpc_nat_gateway.py
|
||||
./test/units/modules/cloud/amazon/test_ec2_vpc_vpn.py
|
||||
./test/units/modules/system/interfaces_file/test_interfaces_file.py
|
||||
'
|
||||
|
||||
for FILE in $TO_BE_FIXED ; do
|
||||
GREP_FORMAT_WHITELIST="$GREP_FORMAT_WHITELIST -e $FILE"
|
||||
done
|
||||
|
||||
# GREP_FORMAT_WHITELIST has been formatted so that wordsplitting is wanted. Therefore no double quotes around the var
|
||||
# shellcheck disable=SC2086
|
||||
underscore_as_variable=$(find . -path ./test/runner/.tox -prune \
|
||||
-path ./contrib/inventory/gce.py \
|
||||
-o -name '*.py' -type f -exec egrep -H '( |[^C]\()_( |,|\))' \{\} \+ | egrep -v $GREP_FORMAT_WHITELIST )
|
||||
|
||||
|
||||
if test -n "$underscore_as_variable" ; then
|
||||
printf "\n== Underscore used as a variable ==\n"
|
||||
printf "%s" "$underscore_as_variable"
|
||||
failures=$(printf "%s" "$underscore_as_variable"| wc -l)
|
||||
failures=$((failures + 2))
|
||||
exit "$failures"
|
||||
fi
|
||||
|
||||
exit 0
|
6
test/sanity/code-smell/replace-urlopen.json
Normal file
6
test/sanity/code-smell/replace-urlopen.json
Normal file
|
@ -0,0 +1,6 @@
|
|||
{
|
||||
"extensions": [
|
||||
".py"
|
||||
],
|
||||
"output": "path-line-column-message"
|
||||
}
|
29
test/sanity/code-smell/replace-urlopen.py
Executable file
29
test/sanity/code-smell/replace-urlopen.py
Executable file
|
@ -0,0 +1,29 @@
|
|||
#!/usr/bin/env python
|
||||
|
||||
import os
|
||||
import re
|
||||
import sys
|
||||
|
||||
|
||||
def main():
|
||||
skip = set([
|
||||
'test/sanity/code-smell/%s' % os.path.basename(__file__),
|
||||
'lib/ansible/module_utils/six/__init__.py',
|
||||
'lib/ansible/module_utils/urls.py',
|
||||
])
|
||||
|
||||
for path in sys.argv[1:]:
|
||||
if path in skip:
|
||||
continue
|
||||
|
||||
with open(path, 'r') as path_fd:
|
||||
for line, text in enumerate(path_fd.readlines()):
|
||||
match = re.search(r'^(?:[^#]*?)(urlopen)', text)
|
||||
|
||||
if match:
|
||||
print('%s:%d:%d: use `ansible.module_utils.urls.open_url` instead of `urlopen`' % (
|
||||
path, line + 1, match.start(1) + 1))
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
main()
|
|
@ -1,15 +0,0 @@
|
|||
#!/bin/sh
|
||||
|
||||
urllib_users=$(find . -name '*.py' -exec grep -H urlopen '{}' '+' | grep -v \
|
||||
-e '^[^:]*/.tox/' \
|
||||
-e '^\./lib/ansible/module_utils/urls.py:' \
|
||||
-e '^\./lib/ansible/module_utils/six/__init__.py:' \
|
||||
-e '^[^:]*:#'
|
||||
)
|
||||
|
||||
if [ "${urllib_users}" ]; then
|
||||
echo "${urllib_users}"
|
||||
echo "One or more file(s) listed above use urlopen."
|
||||
echo "Use open_url from module_utils instead of urlopen."
|
||||
exit 1
|
||||
fi
|
9
test/sanity/code-smell/use-argspec-type-path.json
Normal file
9
test/sanity/code-smell/use-argspec-type-path.json
Normal file
|
@ -0,0 +1,9 @@
|
|||
{
|
||||
"prefixes": [
|
||||
"lib/ansible/modules/"
|
||||
],
|
||||
"extensions": [
|
||||
".py"
|
||||
],
|
||||
"output": "path-line-column-message"
|
||||
}
|
44
test/sanity/code-smell/use-argspec-type-path.py
Executable file
44
test/sanity/code-smell/use-argspec-type-path.py
Executable file
|
@ -0,0 +1,44 @@
|
|||
#!/usr/bin/env python
|
||||
|
||||
import re
|
||||
import sys
|
||||
|
||||
|
||||
def main():
|
||||
skip = set([
|
||||
# add legitimate uses of expanduser to the following list
|
||||
'lib/ansible/modules/cloud/lxc/lxc_container.py',
|
||||
'lib/ansible/modules/cloud/rackspace/rax_files_objects.py',
|
||||
'lib/ansible/modules/database/mongodb/mongodb_parameter.py',
|
||||
'lib/ansible/modules/database/mongodb/mongodb_user.py',
|
||||
'lib/ansible/modules/database/postgresql/postgresql_db.py',
|
||||
'lib/ansible/modules/files/synchronize.py',
|
||||
'lib/ansible/modules/source_control/git.py',
|
||||
'lib/ansible/modules/system/puppet.py',
|
||||
'lib/ansible/modules/utilities/logic/async_status.py',
|
||||
'lib/ansible/modules/utilities/logic/async_wrapper.py',
|
||||
'lib/ansible/modules/web_infrastructure/ansible_tower/tower_host.py',
|
||||
'lib/ansible/modules/web_infrastructure/ansible_tower/tower_group.py',
|
||||
'lib/ansible/modules/web_infrastructure/jenkins_plugin.py',
|
||||
# fix uses of expanduser in the following modules and remove them from the following list
|
||||
'lib/ansible/modules/cloud/rackspace/rax.py',
|
||||
'lib/ansible/modules/cloud/rackspace/rax_scaling_group.py',
|
||||
'lib/ansible/modules/files/archive.py',
|
||||
'lib/ansible/modules/files/find.py',
|
||||
])
|
||||
|
||||
for path in sys.argv[1:]:
|
||||
if path in skip:
|
||||
continue
|
||||
|
||||
with open(path, 'r') as path_fd:
|
||||
for line, text in enumerate(path_fd.readlines()):
|
||||
match = re.search(r'(expanduser)', text)
|
||||
|
||||
if match:
|
||||
print('%s:%d:%d: use argspec type="path" instead of type="str" to avoid use of `expanduser`' % (
|
||||
path, line + 1, match.start(1) + 1))
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
main()
|
|
@ -1,42 +0,0 @@
|
|||
#!/bin/sh
|
||||
|
||||
# Add valid uses of expanduser to this list
|
||||
WHITELIST='cloud/lxc/lxc_container.py
|
||||
cloud/rackspace/rax_files_objects.py
|
||||
database/mongodb/mongodb_parameter.py
|
||||
database/mongodb/mongodb_user.py
|
||||
database/postgresql/postgresql_db.py
|
||||
files/synchronize.py
|
||||
source_control/git.py
|
||||
system/puppet.py
|
||||
utilities/logic/async_status.py
|
||||
utilities/logic/async_wrapper.py
|
||||
web_infrastructure/ansible_tower/tower_host.py
|
||||
web_infrastructure/ansible_tower/tower_group.py
|
||||
web_infrastructure/jenkins_plugin.py'
|
||||
|
||||
# Modules which need to be ported to get rid of expanduser. See: https://github.com/ansible/ansible/projects/12
|
||||
GRANDFATHERED_NEED_PORTING='cloud/rackspace/rax.py
|
||||
cloud/rackspace/rax_scaling_group.py
|
||||
files/find.py
|
||||
files/archive.py'
|
||||
|
||||
for FILE in $WHITELIST ; do
|
||||
GREP_FORMAT_WHITELIST="$GREP_FORMAT_WHITELIST -e $FILE"
|
||||
done
|
||||
|
||||
for FILE in $GRANDFATHERED_NEED_PORTING ; do
|
||||
GREP_FORMAT_WHITELIST="$GREP_FORMAT_WHITELIST -e $FILE"
|
||||
done
|
||||
|
||||
# GREP_FORMAT_WHITELIST has been formatted so that wordsplitting is wanted. Therefore no double quotes around the var
|
||||
# shellcheck disable=SC2086
|
||||
egrep -r 'expanduser' lib/ansible/modules | egrep '\.py:' | egrep -v $GREP_FORMAT_WHITELIST
|
||||
|
||||
if [ $? -ne 1 ]; then
|
||||
printf 'The module(s) listed above use expanduser.\n'
|
||||
printf 'This may indicate the module should be using an argpsec type="path" instead of type="str"\n'
|
||||
printf 'If this is a false positive, add to the whitelist in:\n'
|
||||
printf ' test/sanity/code-smell/use-argspec-type-path.sh\n'
|
||||
exit 1
|
||||
fi
|
6
test/sanity/code-smell/use-compat-six.json
Normal file
6
test/sanity/code-smell/use-compat-six.json
Normal file
|
@ -0,0 +1,6 @@
|
|||
{
|
||||
"extensions": [
|
||||
".py"
|
||||
],
|
||||
"output": "path-line-column-message"
|
||||
}
|
52
test/sanity/code-smell/use-compat-six.py
Executable file
52
test/sanity/code-smell/use-compat-six.py
Executable file
|
@ -0,0 +1,52 @@
|
|||
#!/usr/bin/env python
|
||||
|
||||
import os
|
||||
import re
|
||||
import sys
|
||||
|
||||
|
||||
def main():
|
||||
skip = set([
|
||||
'test/sanity/code-smell/%s' % os.path.basename(__file__),
|
||||
# digital_ocean is checking for six because dopy doesn't specify the
|
||||
# requirement on six so it needs to try importing six to give the correct error message
|
||||
'lib/ansible/modules/cloud/digital_ocean/digital_ocean.py',
|
||||
# correct imports in the following files and remove them from this list
|
||||
'contrib/inventory/apache-libcloud.py',
|
||||
'contrib/inventory/cobbler.py',
|
||||
'contrib/inventory/collins.py',
|
||||
'contrib/inventory/consul_io.py',
|
||||
'contrib/inventory/ec2.py',
|
||||
'contrib/inventory/freeipa.py',
|
||||
'contrib/inventory/lxd.py',
|
||||
'contrib/inventory/nova.py',
|
||||
'contrib/inventory/nsot.py',
|
||||
'contrib/inventory/packet_net.py',
|
||||
'contrib/inventory/proxmox.py',
|
||||
'contrib/inventory/rax.py',
|
||||
'contrib/inventory/rudder.py',
|
||||
'contrib/inventory/scaleway.py',
|
||||
'contrib/inventory/spacewalk.py',
|
||||
'contrib/inventory/vmware.py',
|
||||
'contrib/inventory/vmware_inventory.py',
|
||||
'docs/bin/plugin_formatter.py',
|
||||
])
|
||||
|
||||
for path in sys.argv[1:]:
|
||||
if path in skip:
|
||||
continue
|
||||
|
||||
if path.startswith('test/sanity/pylint/plugins/'):
|
||||
continue
|
||||
|
||||
with open(path, 'r') as path_fd:
|
||||
for line, text in enumerate(path_fd.readlines()):
|
||||
match = re.search(r'((^\s*import\s+six\b)|(^\s*from\s+six\b))', text)
|
||||
|
||||
if match:
|
||||
print('%s:%d:%d: use `ansible.module_utils.six` instead of `six`' % (
|
||||
path, line + 1, match.start(1) + 1))
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
main()
|
|
@ -1,21 +0,0 @@
|
|||
#!/bin/sh
|
||||
|
||||
# Do we want to check dynamic inventory, bin, etc?
|
||||
BASEDIR=${1-"lib"}
|
||||
# REGEX of individual files where the import of six is not a problem
|
||||
# digital_ocean is checking for six because dopy doesn't specify the
|
||||
# requirement on six so it needs to try importing six to give the correct error
|
||||
# message
|
||||
WHITELIST='(lib/ansible/modules/cloud/digital_ocean/digital_ocean.py)'
|
||||
|
||||
SIX_USERS=$(find "$BASEDIR" -name '*.py' -exec grep -wH six '{}' '+' \
|
||||
| grep import \
|
||||
| grep -v ansible.module_utils.six \
|
||||
| grep -v 'ansible.module_utils import six' \
|
||||
| egrep -v "^$WHITELIST:"
|
||||
)
|
||||
|
||||
if [ "${SIX_USERS}" ]; then
|
||||
echo "${SIX_USERS}"
|
||||
exit 1
|
||||
fi
|
Loading…
Reference in a new issue