mirror of
https://github.com/ansible-collections/community.general.git
synced 2025-10-23 12:33:59 -07:00
parent
9d0150b2c3
commit
6cd4665412
34 changed files with 70 additions and 120 deletions
2
changelogs/fragments/10873-six.yml
Normal file
2
changelogs/fragments/10873-six.yml
Normal file
|
@ -0,0 +1,2 @@
|
||||||
|
bugfixes:
|
||||||
|
- "Avoid usage of deprecated ``ansible.module_utils.six`` in all code that does not have to support Python 2 (https://github.com/ansible-collections/community.general/pull/10873)."
|
|
@ -59,8 +59,8 @@ notes:
|
||||||
- This plugin ignores the C(become_user) supplied and uses C(pmrun)'s own configuration to select the user.
|
- This plugin ignores the C(become_user) supplied and uses C(pmrun)'s own configuration to select the user.
|
||||||
"""
|
"""
|
||||||
|
|
||||||
|
from shlex import quote as shlex_quote
|
||||||
from ansible.plugins.become import BecomeBase
|
from ansible.plugins.become import BecomeBase
|
||||||
from ansible.module_utils.six.moves import shlex_quote
|
|
||||||
|
|
||||||
|
|
||||||
class BecomeModule(BecomeBase):
|
class BecomeModule(BecomeBase):
|
||||||
|
|
6
plugins/cache/pickle.py
vendored
6
plugins/cache/pickle.py
vendored
|
@ -48,7 +48,6 @@ try:
|
||||||
except ImportError:
|
except ImportError:
|
||||||
import pickle
|
import pickle
|
||||||
|
|
||||||
from ansible.module_utils.six import PY3
|
|
||||||
from ansible.plugins.cache import BaseFileCacheModule
|
from ansible.plugins.cache import BaseFileCacheModule
|
||||||
|
|
||||||
|
|
||||||
|
@ -61,10 +60,7 @@ class CacheModule(BaseFileCacheModule):
|
||||||
def _load(self, filepath):
|
def _load(self, filepath):
|
||||||
# Pickle is a binary format
|
# Pickle is a binary format
|
||||||
with open(filepath, 'rb') as f:
|
with open(filepath, 'rb') as f:
|
||||||
if PY3:
|
return pickle.load(f, encoding='bytes')
|
||||||
return pickle.load(f, encoding='bytes')
|
|
||||||
else:
|
|
||||||
return pickle.load(f)
|
|
||||||
|
|
||||||
def _dump(self, value, filepath):
|
def _dump(self, value, filepath):
|
||||||
with open(filepath, 'wb') as f:
|
with open(filepath, 'wb') as f:
|
||||||
|
|
|
@ -27,7 +27,6 @@ try:
|
||||||
except ImportError:
|
except ImportError:
|
||||||
pass
|
pass
|
||||||
|
|
||||||
from ansible.module_utils.six import binary_type, text_type
|
|
||||||
from collections.abc import MutableMapping, MutableSequence
|
from collections.abc import MutableMapping, MutableSequence
|
||||||
from ansible.plugins.callback.default import CallbackModule as CallbackModule_default
|
from ansible.plugins.callback.default import CallbackModule as CallbackModule_default
|
||||||
from ansible.utils.color import colorize, hostcolor
|
from ansible.utils.color import colorize, hostcolor
|
||||||
|
@ -236,7 +235,7 @@ class CallbackModule(CallbackModule_default):
|
||||||
|
|
||||||
# Remove empty attributes (list, dict, str)
|
# Remove empty attributes (list, dict, str)
|
||||||
for attr in result.copy():
|
for attr in result.copy():
|
||||||
if isinstance(result[attr], (MutableSequence, MutableMapping, binary_type, text_type)):
|
if isinstance(result[attr], (MutableSequence, MutableMapping, bytes, str)):
|
||||||
if not result[attr]:
|
if not result[attr]:
|
||||||
del result[attr]
|
del result[attr]
|
||||||
|
|
||||||
|
|
|
@ -88,7 +88,6 @@ from os.path import basename
|
||||||
|
|
||||||
from ansible.errors import AnsibleError, AnsibleRuntimeError
|
from ansible.errors import AnsibleError, AnsibleRuntimeError
|
||||||
from ansible.module_utils.ansible_release import __version__ as ansible_version
|
from ansible.module_utils.ansible_release import __version__ as ansible_version
|
||||||
from ansible.module_utils.six import raise_from
|
|
||||||
from ansible.plugins.callback import CallbackBase
|
from ansible.plugins.callback import CallbackBase
|
||||||
|
|
||||||
try:
|
try:
|
||||||
|
@ -308,9 +307,7 @@ class CallbackModule(CallbackBase):
|
||||||
self.disabled = False
|
self.disabled = False
|
||||||
|
|
||||||
if ELASTIC_LIBRARY_IMPORT_ERROR:
|
if ELASTIC_LIBRARY_IMPORT_ERROR:
|
||||||
raise_from(
|
raise AnsibleError('The `elastic-apm` must be installed to use this plugin') from ELASTIC_LIBRARY_IMPORT_ERROR
|
||||||
AnsibleError('The `elastic-apm` must be installed to use this plugin'),
|
|
||||||
ELASTIC_LIBRARY_IMPORT_ERROR)
|
|
||||||
|
|
||||||
self.tasks_data = OrderedDict()
|
self.tasks_data = OrderedDict()
|
||||||
|
|
||||||
|
|
|
@ -66,7 +66,8 @@ options:
|
||||||
type: string
|
type: string
|
||||||
"""
|
"""
|
||||||
|
|
||||||
from ansible.module_utils.six.moves.urllib.parse import urlencode
|
from urllib.parse import urlencode
|
||||||
|
|
||||||
from ansible.module_utils.common.text.converters import to_bytes
|
from ansible.module_utils.common.text.converters import to_bytes
|
||||||
from ansible.module_utils.urls import open_url
|
from ansible.module_utils.urls import open_url
|
||||||
from ansible.plugins.callback import CallbackBase
|
from ansible.plugins.callback import CallbackBase
|
||||||
|
|
|
@ -137,15 +137,13 @@ import json
|
||||||
import os
|
import os
|
||||||
import socket
|
import socket
|
||||||
import uuid
|
import uuid
|
||||||
from time import time_ns
|
|
||||||
|
|
||||||
from collections import OrderedDict
|
from collections import OrderedDict
|
||||||
from os.path import basename
|
from os.path import basename
|
||||||
|
from time import time_ns
|
||||||
|
from urllib.parse import urlparse
|
||||||
|
|
||||||
from ansible.errors import AnsibleError
|
from ansible.errors import AnsibleError
|
||||||
from ansible.module_utils.ansible_release import __version__ as ansible_version
|
from ansible.module_utils.ansible_release import __version__ as ansible_version
|
||||||
from ansible.module_utils.six import raise_from
|
|
||||||
from ansible.module_utils.six.moves.urllib.parse import urlparse
|
|
||||||
from ansible.plugins.callback import CallbackBase
|
from ansible.plugins.callback import CallbackBase
|
||||||
|
|
||||||
try:
|
try:
|
||||||
|
@ -495,9 +493,9 @@ class CallbackModule(CallbackBase):
|
||||||
self.otel_exporter_otlp_traces_protocol = None
|
self.otel_exporter_otlp_traces_protocol = None
|
||||||
|
|
||||||
if OTEL_LIBRARY_IMPORT_ERROR:
|
if OTEL_LIBRARY_IMPORT_ERROR:
|
||||||
raise_from(
|
raise AnsibleError(
|
||||||
AnsibleError('The `opentelemetry-api`, `opentelemetry-exporter-otlp` or `opentelemetry-sdk` must be installed to use this plugin'),
|
'The `opentelemetry-api`, `opentelemetry-exporter-otlp` or `opentelemetry-sdk` must be installed to use this plugin'
|
||||||
OTEL_LIBRARY_IMPORT_ERROR)
|
) from OTEL_LIBRARY_IMPORT_ERROR
|
||||||
|
|
||||||
self.tasks_data = OrderedDict()
|
self.tasks_data = OrderedDict()
|
||||||
|
|
||||||
|
|
|
@ -75,11 +75,11 @@ import os
|
||||||
import os.path
|
import os.path
|
||||||
import subprocess
|
import subprocess
|
||||||
import traceback
|
import traceback
|
||||||
|
from shlex import quote as shlex_quote
|
||||||
|
|
||||||
from ansible.errors import AnsibleError
|
from ansible.errors import AnsibleError
|
||||||
from ansible.module_utils.basic import is_executable
|
from ansible.module_utils.basic import is_executable
|
||||||
from ansible.module_utils.common.process import get_bin_path
|
from ansible.module_utils.common.process import get_bin_path
|
||||||
from ansible.module_utils.six.moves import shlex_quote
|
|
||||||
from ansible.module_utils.common.text.converters import to_bytes
|
from ansible.module_utils.common.text.converters import to_bytes
|
||||||
from ansible.plugins.connection import ConnectionBase, BUFSIZE
|
from ansible.plugins.connection import ConnectionBase, BUFSIZE
|
||||||
from ansible.utils.display import Display
|
from ansible.utils.display import Display
|
||||||
|
|
|
@ -38,9 +38,9 @@ import os
|
||||||
import os.path
|
import os.path
|
||||||
import subprocess
|
import subprocess
|
||||||
import traceback
|
import traceback
|
||||||
|
from shlex import quote as shlex_quote
|
||||||
|
|
||||||
from ansible.errors import AnsibleError
|
from ansible.errors import AnsibleError
|
||||||
from ansible.module_utils.six.moves import shlex_quote
|
|
||||||
from ansible.module_utils.common.process import get_bin_path
|
from ansible.module_utils.common.process import get_bin_path
|
||||||
from ansible.module_utils.common.text.converters import to_bytes, to_native, to_text
|
from ansible.module_utils.common.text.converters import to_bytes, to_native, to_text
|
||||||
from ansible.plugins.connection import ConnectionBase, BUFSIZE
|
from ansible.plugins.connection import ConnectionBase, BUFSIZE
|
||||||
|
|
|
@ -31,9 +31,9 @@ import os
|
||||||
import os.path
|
import os.path
|
||||||
import subprocess
|
import subprocess
|
||||||
import traceback
|
import traceback
|
||||||
|
from shlex import quote as shlex_quote
|
||||||
|
|
||||||
from ansible.errors import AnsibleError
|
from ansible.errors import AnsibleError
|
||||||
from ansible.module_utils.six.moves import shlex_quote
|
|
||||||
from ansible.module_utils.common.process import get_bin_path
|
from ansible.module_utils.common.process import get_bin_path
|
||||||
from ansible.module_utils.common.text.converters import to_bytes
|
from ansible.module_utils.common.text.converters import to_bytes
|
||||||
from ansible.plugins.connection import ConnectionBase, BUFSIZE
|
from ansible.plugins.connection import ConnectionBase, BUFSIZE
|
||||||
|
|
|
@ -45,10 +45,10 @@ _value:
|
||||||
"""
|
"""
|
||||||
|
|
||||||
|
|
||||||
|
from io import StringIO
|
||||||
|
from configparser import ConfigParser
|
||||||
|
|
||||||
from ansible.errors import AnsibleFilterError
|
from ansible.errors import AnsibleFilterError
|
||||||
from ansible.module_utils.six import string_types
|
|
||||||
from ansible.module_utils.six.moves import StringIO
|
|
||||||
from ansible.module_utils.six.moves.configparser import ConfigParser
|
|
||||||
|
|
||||||
|
|
||||||
class IniParser(ConfigParser):
|
class IniParser(ConfigParser):
|
||||||
|
@ -73,7 +73,7 @@ class IniParser(ConfigParser):
|
||||||
def from_ini(obj):
|
def from_ini(obj):
|
||||||
''' Read the given string as INI file and return a dict '''
|
''' Read the given string as INI file and return a dict '''
|
||||||
|
|
||||||
if not isinstance(obj, string_types):
|
if not isinstance(obj, str):
|
||||||
raise AnsibleFilterError(f'from_ini requires a str, got {type(obj)}')
|
raise AnsibleFilterError(f'from_ini requires a str, got {type(obj)}')
|
||||||
|
|
||||||
parser = IniParser()
|
parser = IniParser()
|
||||||
|
|
|
@ -196,7 +196,6 @@ _value:
|
||||||
"""
|
"""
|
||||||
|
|
||||||
from ansible.errors import AnsibleFilterError
|
from ansible.errors import AnsibleFilterError
|
||||||
from ansible.module_utils.six import string_types
|
|
||||||
from collections.abc import Mapping, Sequence
|
from collections.abc import Mapping, Sequence
|
||||||
from ansible.utils.vars import merge_hash
|
from ansible.utils.vars import merge_hash
|
||||||
|
|
||||||
|
@ -257,7 +256,7 @@ def lists_mergeby(*terms, **kwargs):
|
||||||
|
|
||||||
index = terms[-1]
|
index = terms[-1]
|
||||||
|
|
||||||
if not isinstance(index, string_types):
|
if not isinstance(index, str):
|
||||||
msg = ("First argument after the lists for community.general.lists_mergeby must be string. "
|
msg = ("First argument after the lists for community.general.lists_mergeby must be string. "
|
||||||
"%s is %s")
|
"%s is %s")
|
||||||
raise AnsibleFilterError(msg % (index, type(index)))
|
raise AnsibleFilterError(msg % (index, type(index)))
|
||||||
|
|
|
@ -45,14 +45,13 @@ import re
|
||||||
from random import Random, SystemRandom
|
from random import Random, SystemRandom
|
||||||
|
|
||||||
from ansible.errors import AnsibleFilterError
|
from ansible.errors import AnsibleFilterError
|
||||||
from ansible.module_utils.six import string_types
|
|
||||||
|
|
||||||
|
|
||||||
def random_mac(value, seed=None):
|
def random_mac(value, seed=None):
|
||||||
''' takes string prefix, and return it completed with random bytes
|
''' takes string prefix, and return it completed with random bytes
|
||||||
to get a complete 6 bytes MAC address '''
|
to get a complete 6 bytes MAC address '''
|
||||||
|
|
||||||
if not isinstance(value, string_types):
|
if not isinstance(value, str):
|
||||||
raise AnsibleFilterError('Invalid value type (%s) for random_mac (%s)' %
|
raise AnsibleFilterError('Invalid value type (%s) for random_mac (%s)' %
|
||||||
(type(value), value))
|
(type(value), value))
|
||||||
|
|
||||||
|
|
|
@ -49,11 +49,10 @@ _value:
|
||||||
type: string
|
type: string
|
||||||
"""
|
"""
|
||||||
|
|
||||||
|
|
||||||
from ansible.errors import AnsibleFilterError
|
|
||||||
from collections.abc import Mapping
|
from collections.abc import Mapping
|
||||||
from ansible.module_utils.six.moves import StringIO
|
from configparser import ConfigParser
|
||||||
from ansible.module_utils.six.moves.configparser import ConfigParser
|
from io import StringIO
|
||||||
|
from ansible.errors import AnsibleFilterError
|
||||||
|
|
||||||
|
|
||||||
class IniParser(ConfigParser):
|
class IniParser(ConfigParser):
|
||||||
|
|
|
@ -117,7 +117,6 @@ except ImportError:
|
||||||
|
|
||||||
from ansible.errors import AnsibleFilterError
|
from ansible.errors import AnsibleFilterError
|
||||||
from ansible.module_utils.common.text.converters import to_text
|
from ansible.module_utils.common.text.converters import to_text
|
||||||
from ansible.module_utils.six import string_types
|
|
||||||
|
|
||||||
|
|
||||||
class TypeValidationError(AnsibleFilterError):
|
class TypeValidationError(AnsibleFilterError):
|
||||||
|
@ -128,7 +127,7 @@ class TypeValidationError(AnsibleFilterError):
|
||||||
expected: Description of expected type
|
expected: Description of expected type
|
||||||
"""
|
"""
|
||||||
def __init__(self, obj, expected):
|
def __init__(self, obj, expected):
|
||||||
type_name = "string" if isinstance(obj, string_types) else type(obj).__name__
|
type_name = "string" if isinstance(obj, str) else type(obj).__name__
|
||||||
super().__init__(f"Expected {expected}, got a {type_name}")
|
super().__init__(f"Expected {expected}, got a {type_name}")
|
||||||
|
|
||||||
|
|
||||||
|
@ -157,7 +156,7 @@ def _validate_list_param(param, param_name, ensure_strings=True):
|
||||||
|
|
||||||
if ensure_strings:
|
if ensure_strings:
|
||||||
for item in param:
|
for item in param:
|
||||||
if not isinstance(item, string_types):
|
if not isinstance(item, str):
|
||||||
# Maintain original error message format
|
# Maintain original error message format
|
||||||
if param_name == "column_order":
|
if param_name == "column_order":
|
||||||
error_msg = "a string for column name"
|
error_msg = "a string for column name"
|
||||||
|
@ -183,7 +182,7 @@ def _match_key(item_dict, lookup_key):
|
||||||
return lookup_key
|
return lookup_key
|
||||||
|
|
||||||
# Try boolean conversion for 'true'/'false' strings
|
# Try boolean conversion for 'true'/'false' strings
|
||||||
if isinstance(lookup_key, string_types):
|
if isinstance(lookup_key, str):
|
||||||
if lookup_key.lower() == 'true' and True in item_dict:
|
if lookup_key.lower() == 'true' and True in item_dict:
|
||||||
return True
|
return True
|
||||||
if lookup_key.lower() == 'false' and False in item_dict:
|
if lookup_key.lower() == 'false' and False in item_dict:
|
||||||
|
@ -335,11 +334,11 @@ def to_prettytable(data, *args, **kwargs):
|
||||||
# Validate column_alignments keys and values
|
# Validate column_alignments keys and values
|
||||||
for key, value in column_alignments.items():
|
for key, value in column_alignments.items():
|
||||||
# Check that keys are strings
|
# Check that keys are strings
|
||||||
if not isinstance(key, string_types):
|
if not isinstance(key, str):
|
||||||
raise TypeValidationError(key, "a string for column_alignments key")
|
raise TypeValidationError(key, "a string for column_alignments key")
|
||||||
|
|
||||||
# Check that values are strings
|
# Check that values are strings
|
||||||
if not isinstance(value, string_types):
|
if not isinstance(value, str):
|
||||||
raise TypeValidationError(value, "a string for column_alignments value")
|
raise TypeValidationError(value, "a string for column_alignments value")
|
||||||
|
|
||||||
# Check that values are valid alignments
|
# Check that values are valid alignments
|
||||||
|
@ -391,7 +390,7 @@ def to_prettytable(data, *args, **kwargs):
|
||||||
row.append(item.get(matched_key, ""))
|
row.append(item.get(matched_key, ""))
|
||||||
else:
|
else:
|
||||||
# Try case-insensitive lookup as last resort
|
# Try case-insensitive lookup as last resort
|
||||||
lower_col = col.lower() if isinstance(col, string_types) else str(col).lower()
|
lower_col = col.lower() if isinstance(col, str) else str(col).lower()
|
||||||
if lower_col in reverse_key_map:
|
if lower_col in reverse_key_map:
|
||||||
row.append(item.get(reverse_key_map[lower_col], ""))
|
row.append(item.get(reverse_key_map[lower_col], ""))
|
||||||
else:
|
else:
|
||||||
|
|
|
@ -49,7 +49,6 @@ _value:
|
||||||
from unicodedata import normalize
|
from unicodedata import normalize
|
||||||
|
|
||||||
from ansible.errors import AnsibleFilterError
|
from ansible.errors import AnsibleFilterError
|
||||||
from ansible.module_utils.six import text_type
|
|
||||||
|
|
||||||
try:
|
try:
|
||||||
from ansible.errors import AnsibleTypeError
|
from ansible.errors import AnsibleTypeError
|
||||||
|
@ -69,7 +68,7 @@ def unicode_normalize(data, form='NFC'):
|
||||||
A normalized unicode string of the specified 'form'.
|
A normalized unicode string of the specified 'form'.
|
||||||
"""
|
"""
|
||||||
|
|
||||||
if not isinstance(data, text_type):
|
if not isinstance(data, str):
|
||||||
raise AnsibleTypeError("%s is not a valid input type" % type(data))
|
raise AnsibleTypeError("%s is not a valid input type" % type(data))
|
||||||
|
|
||||||
if form not in ('NFC', 'NFD', 'NFKC', 'NFKD'):
|
if form not in ('NFC', 'NFD', 'NFKC', 'NFKD'):
|
||||||
|
|
|
@ -135,7 +135,6 @@ import socket
|
||||||
|
|
||||||
from ansible.errors import AnsibleError
|
from ansible.errors import AnsibleError
|
||||||
from ansible.plugins.inventory import BaseInventoryPlugin, Cacheable, to_safe_group_name
|
from ansible.plugins.inventory import BaseInventoryPlugin, Cacheable, to_safe_group_name
|
||||||
from ansible.module_utils.six import text_type
|
|
||||||
|
|
||||||
from ansible_collections.community.general.plugins.plugin_utils.unsafe import make_unsafe
|
from ansible_collections.community.general.plugins.plugin_utils.unsafe import make_unsafe
|
||||||
|
|
||||||
|
@ -264,7 +263,7 @@ class InventoryModule(BaseInventoryPlugin, Cacheable):
|
||||||
self.cobbler = xmlrpc_client.Server(self.cobbler_url, allow_none=True)
|
self.cobbler = xmlrpc_client.Server(self.cobbler_url, allow_none=True)
|
||||||
self.token = None
|
self.token = None
|
||||||
if self.get_option('user') is not None:
|
if self.get_option('user') is not None:
|
||||||
self.token = self.cobbler.login(text_type(self.get_option('user')), text_type(self.get_option('password')))
|
self.token = self.cobbler.login(str(self.get_option('user')), str(self.get_option('password')))
|
||||||
|
|
||||||
self.cache_key = self.get_cache_key(path)
|
self.cache_key = self.get_cache_key(path)
|
||||||
self.use_cache = cache and self.get_option('cache')
|
self.use_cache = cache and self.get_option('cache')
|
||||||
|
|
|
@ -95,11 +95,11 @@ compose:
|
||||||
"""
|
"""
|
||||||
|
|
||||||
import json
|
import json
|
||||||
|
from urllib.error import HTTPError
|
||||||
|
|
||||||
from ansible.errors import AnsibleParserError
|
from ansible.errors import AnsibleParserError
|
||||||
from ansible.plugins.inventory import BaseInventoryPlugin, Constructable
|
from ansible.plugins.inventory import BaseInventoryPlugin, Constructable
|
||||||
from ansible.module_utils.urls import open_url
|
from ansible.module_utils.urls import open_url
|
||||||
from ansible.module_utils.six.moves.urllib.error import HTTPError
|
|
||||||
|
|
||||||
from ansible_collections.community.general.plugins.plugin_utils.unsafe import make_unsafe
|
from ansible_collections.community.general.plugins.plugin_utils.unsafe import make_unsafe
|
||||||
|
|
||||||
|
|
|
@ -171,12 +171,12 @@ import json
|
||||||
import re
|
import re
|
||||||
import time
|
import time
|
||||||
import os
|
import os
|
||||||
|
from urllib.parse import urlencode
|
||||||
|
|
||||||
from ansible.plugins.inventory import BaseInventoryPlugin
|
from ansible.plugins.inventory import BaseInventoryPlugin
|
||||||
from ansible.module_utils.common.text.converters import to_native, to_text
|
from ansible.module_utils.common.text.converters import to_native, to_text
|
||||||
from ansible.module_utils.common.dict_transformations import dict_merge
|
from ansible.module_utils.common.dict_transformations import dict_merge
|
||||||
from ansible.module_utils.six import raise_from
|
|
||||||
from ansible.errors import AnsibleError, AnsibleParserError
|
from ansible.errors import AnsibleError, AnsibleParserError
|
||||||
from ansible.module_utils.six.moves.urllib.parse import urlencode
|
|
||||||
from ansible_collections.community.general.plugins.module_utils.lxd import LXDClient, LXDClientException
|
from ansible_collections.community.general.plugins.module_utils.lxd import LXDClient, LXDClientException
|
||||||
from ansible_collections.community.general.plugins.plugin_utils.unsafe import make_unsafe
|
from ansible_collections.community.general.plugins.plugin_utils.unsafe import make_unsafe
|
||||||
|
|
||||||
|
@ -1094,9 +1094,7 @@ class InventoryModule(BaseInventoryPlugin):
|
||||||
Returns:
|
Returns:
|
||||||
None"""
|
None"""
|
||||||
if IPADDRESS_IMPORT_ERROR:
|
if IPADDRESS_IMPORT_ERROR:
|
||||||
raise_from(
|
raise AnsibleError('another_library must be installed to use this plugin') from IPADDRESS_IMPORT_ERROR
|
||||||
AnsibleError('another_library must be installed to use this plugin'),
|
|
||||||
IPADDRESS_IMPORT_ERROR)
|
|
||||||
|
|
||||||
super(InventoryModule, self).parse(inventory, loader, path, cache=False)
|
super(InventoryModule, self).parse(inventory, loader, path, cache=False)
|
||||||
# Read the inventory YAML file
|
# Read the inventory YAML file
|
||||||
|
|
|
@ -62,13 +62,13 @@ groups:
|
||||||
|
|
||||||
import json
|
import json
|
||||||
from sys import version as python_version
|
from sys import version as python_version
|
||||||
|
from urllib.parse import urljoin
|
||||||
|
|
||||||
from ansible.errors import AnsibleError
|
from ansible.errors import AnsibleError
|
||||||
from ansible.module_utils.urls import open_url
|
from ansible.module_utils.urls import open_url
|
||||||
from ansible.plugins.inventory import BaseInventoryPlugin
|
from ansible.plugins.inventory import BaseInventoryPlugin
|
||||||
from ansible.module_utils.common.text.converters import to_text
|
from ansible.module_utils.common.text.converters import to_text
|
||||||
from ansible.module_utils.ansible_release import __version__ as ansible_version
|
from ansible.module_utils.ansible_release import __version__ as ansible_version
|
||||||
from ansible.module_utils.six.moves.urllib.parse import urljoin
|
|
||||||
|
|
||||||
from ansible_collections.community.general.plugins.plugin_utils.unsafe import make_unsafe
|
from ansible_collections.community.general.plugins.plugin_utils.unsafe import make_unsafe
|
||||||
|
|
||||||
|
|
|
@ -132,9 +132,8 @@ from ansible_collections.community.general.plugins.module_utils.scaleway import
|
||||||
from ansible_collections.community.general.plugins.plugin_utils.unsafe import make_unsafe
|
from ansible_collections.community.general.plugins.plugin_utils.unsafe import make_unsafe
|
||||||
from ansible.module_utils.urls import open_url
|
from ansible.module_utils.urls import open_url
|
||||||
from ansible.module_utils.common.text.converters import to_text
|
from ansible.module_utils.common.text.converters import to_text
|
||||||
from ansible.module_utils.six import raise_from
|
|
||||||
|
|
||||||
import ansible.module_utils.six.moves.urllib.parse as urllib_parse
|
import urllib.parse as urllib_parse
|
||||||
|
|
||||||
|
|
||||||
def _fetch_information(token, url):
|
def _fetch_information(token, url):
|
||||||
|
@ -338,7 +337,7 @@ class InventoryModule(BaseInventoryPlugin, Constructable):
|
||||||
|
|
||||||
def parse(self, inventory, loader, path, cache=True):
|
def parse(self, inventory, loader, path, cache=True):
|
||||||
if YAML_IMPORT_ERROR:
|
if YAML_IMPORT_ERROR:
|
||||||
raise_from(AnsibleError('PyYAML is probably missing'), YAML_IMPORT_ERROR)
|
raise AnsibleError('PyYAML is probably missing') from YAML_IMPORT_ERROR
|
||||||
super(InventoryModule, self).parse(inventory, loader, path)
|
super(InventoryModule, self).parse(inventory, loader, path)
|
||||||
self._read_config_data(path=path)
|
self._read_config_data(path=path)
|
||||||
|
|
||||||
|
|
|
@ -112,7 +112,8 @@ _raw:
|
||||||
type: dict
|
type: dict
|
||||||
"""
|
"""
|
||||||
|
|
||||||
from ansible.module_utils.six.moves.urllib.parse import urlparse
|
from urllib.parse import urlparse
|
||||||
|
|
||||||
from ansible.errors import AnsibleError, AnsibleAssertionError
|
from ansible.errors import AnsibleError, AnsibleAssertionError
|
||||||
from ansible.plugins.lookup import LookupBase
|
from ansible.plugins.lookup import LookupBase
|
||||||
from ansible.module_utils.common.text.converters import to_text
|
from ansible.module_utils.common.text.converters import to_text
|
||||||
|
|
|
@ -122,7 +122,6 @@ _list:
|
||||||
|
|
||||||
from ansible.errors import AnsibleLookupError
|
from ansible.errors import AnsibleLookupError
|
||||||
from collections.abc import Mapping, Sequence
|
from collections.abc import Mapping, Sequence
|
||||||
from ansible.module_utils.six import string_types
|
|
||||||
from ansible.plugins.lookup import LookupBase
|
from ansible.plugins.lookup import LookupBase
|
||||||
from ansible.template import Templar
|
from ansible.template import Templar
|
||||||
|
|
||||||
|
@ -215,7 +214,7 @@ class LookupModule(LookupBase):
|
||||||
raise AnsibleLookupError(
|
raise AnsibleLookupError(
|
||||||
f'The variable {k!r} appears more than once')
|
f'The variable {k!r} appears more than once')
|
||||||
vars_so_far.add(k)
|
vars_so_far.add(k)
|
||||||
if isinstance(v, string_types):
|
if isinstance(v, str):
|
||||||
data.append((k, v, None))
|
data.append((k, v, None))
|
||||||
elif isinstance(v, (Sequence, Mapping)):
|
elif isinstance(v, (Sequence, Mapping)):
|
||||||
data.append((k, None, v))
|
data.append((k, None, v))
|
||||||
|
|
|
@ -37,7 +37,6 @@ _raw:
|
||||||
type: list
|
type: list
|
||||||
"""
|
"""
|
||||||
from ansible.errors import AnsibleError
|
from ansible.errors import AnsibleError
|
||||||
from ansible.module_utils.six import string_types
|
|
||||||
from ansible.plugins.lookup import LookupBase
|
from ansible.plugins.lookup import LookupBase
|
||||||
from ansible.utils.listify import listify_lookup_plugin_terms
|
from ansible.utils.listify import listify_lookup_plugin_terms
|
||||||
|
|
||||||
|
@ -65,7 +64,7 @@ class LookupModule(LookupBase):
|
||||||
# ignore undefined items
|
# ignore undefined items
|
||||||
break
|
break
|
||||||
|
|
||||||
if isinstance(term, string_types):
|
if isinstance(term, str):
|
||||||
# convert a variable to a list
|
# convert a variable to a list
|
||||||
term2 = listify_lookup_plugin_terms(term, templar=self._templar)
|
term2 = listify_lookup_plugin_terms(term, templar=self._templar)
|
||||||
# but avoid converting a plain string to a list of one string
|
# but avoid converting a plain string to a list of one string
|
||||||
|
|
|
@ -89,8 +89,9 @@ except ImportError:
|
||||||
|
|
||||||
import time
|
import time
|
||||||
import json
|
import json
|
||||||
|
from urllib.error import HTTPError
|
||||||
|
|
||||||
from ansible.module_utils.urls import open_url
|
from ansible.module_utils.urls import open_url
|
||||||
from ansible.module_utils.six.moves.urllib.error import HTTPError
|
|
||||||
from ansible.errors import AnsibleError, AnsibleOptionsError
|
from ansible.errors import AnsibleError, AnsibleOptionsError
|
||||||
from ansible.plugins.lookup import LookupBase
|
from ansible.plugins.lookup import LookupBase
|
||||||
from ansible.utils.display import Display
|
from ansible.utils.display import Display
|
||||||
|
|
|
@ -85,7 +85,6 @@ from ansible.plugins.lookup import LookupBase
|
||||||
from ansible.errors import AnsibleLookupError, AnsibleOptionsError
|
from ansible.errors import AnsibleLookupError, AnsibleOptionsError
|
||||||
from ansible.module_utils.common.process import get_bin_path
|
from ansible.module_utils.common.process import get_bin_path
|
||||||
from ansible.module_utils.common.text.converters import to_bytes, to_text
|
from ansible.module_utils.common.text.converters import to_bytes, to_text
|
||||||
from ansible.module_utils.six import with_metaclass
|
|
||||||
|
|
||||||
from ansible_collections.community.general.plugins.module_utils.onepassword import OnePasswordConfig
|
from ansible_collections.community.general.plugins.module_utils.onepassword import OnePasswordConfig
|
||||||
|
|
||||||
|
@ -98,7 +97,7 @@ def _lower_if_possible(value):
|
||||||
return value
|
return value
|
||||||
|
|
||||||
|
|
||||||
class OnePassCLIBase(with_metaclass(abc.ABCMeta, object)):
|
class OnePassCLIBase(object, metaclass=abc.ABCMeta):
|
||||||
bin = "op"
|
bin = "op"
|
||||||
|
|
||||||
def __init__(
|
def __init__(
|
||||||
|
|
|
@ -66,7 +66,6 @@ EXAMPLES = r"""
|
||||||
from ansible.plugins.lookup import LookupBase
|
from ansible.plugins.lookup import LookupBase
|
||||||
from ansible.utils.display import Display
|
from ansible.utils.display import Display
|
||||||
from ansible.errors import AnsibleError
|
from ansible.errors import AnsibleError
|
||||||
from ansible.module_utils.six import raise_from
|
|
||||||
|
|
||||||
try:
|
try:
|
||||||
from pam.revbits_ansible.server import SecretServer
|
from pam.revbits_ansible.server import SecretServer
|
||||||
|
@ -87,10 +86,7 @@ class LookupModule(LookupBase):
|
||||||
|
|
||||||
def run(self, terms, variables, **kwargs):
|
def run(self, terms, variables, **kwargs):
|
||||||
if ANOTHER_LIBRARY_IMPORT_ERROR:
|
if ANOTHER_LIBRARY_IMPORT_ERROR:
|
||||||
raise_from(
|
raise AnsibleError('revbits_ansible must be installed to use this plugin') from ANOTHER_LIBRARY_IMPORT_ERROR
|
||||||
AnsibleError('revbits_ansible must be installed to use this plugin'),
|
|
||||||
ANOTHER_LIBRARY_IMPORT_ERROR
|
|
||||||
)
|
|
||||||
self.set_options(var_options=variables, direct=kwargs)
|
self.set_options(var_options=variables, direct=kwargs)
|
||||||
secret_server = LookupModule.Client(
|
secret_server = LookupModule.Client(
|
||||||
{
|
{
|
||||||
|
|
|
@ -258,7 +258,6 @@ EXAMPLES = r"""
|
||||||
import abc
|
import abc
|
||||||
import os
|
import os
|
||||||
from ansible.errors import AnsibleError, AnsibleOptionsError
|
from ansible.errors import AnsibleError, AnsibleOptionsError
|
||||||
from ansible.module_utils import six
|
|
||||||
from ansible.plugins.lookup import LookupBase
|
from ansible.plugins.lookup import LookupBase
|
||||||
from ansible.utils.display import Display
|
from ansible.utils.display import Display
|
||||||
|
|
||||||
|
@ -289,8 +288,7 @@ except ImportError:
|
||||||
display = Display()
|
display = Display()
|
||||||
|
|
||||||
|
|
||||||
@six.add_metaclass(abc.ABCMeta)
|
class TSSClient(object, metaclass=abc.ABCMeta):
|
||||||
class TSSClient(object):
|
|
||||||
def __init__(self):
|
def __init__(self):
|
||||||
self._client = None
|
self._client = None
|
||||||
|
|
||||||
|
|
|
@ -9,7 +9,6 @@ __metaclass__ = type
|
||||||
import re
|
import re
|
||||||
|
|
||||||
from ansible.errors import AnsibleFilterError
|
from ansible.errors import AnsibleFilterError
|
||||||
from ansible.module_utils.six import string_types
|
|
||||||
from collections.abc import Mapping, Sequence
|
from collections.abc import Mapping, Sequence
|
||||||
|
|
||||||
|
|
||||||
|
@ -32,7 +31,7 @@ def _keys_filter_params(data, matching_parameter):
|
||||||
raise AnsibleFilterError(msg % (elem, type(elem)))
|
raise AnsibleFilterError(msg % (elem, type(elem)))
|
||||||
|
|
||||||
for elem in data:
|
for elem in data:
|
||||||
if not all(isinstance(item, string_types) for item in elem.keys()):
|
if not all(isinstance(item, str) for item in elem.keys()):
|
||||||
msg = "Top level keys must be strings. keys: %s"
|
msg = "Top level keys must be strings. keys: %s"
|
||||||
raise AnsibleFilterError(msg % elem.keys())
|
raise AnsibleFilterError(msg % elem.keys())
|
||||||
|
|
||||||
|
@ -65,12 +64,12 @@ def _keys_filter_target_str(target, matching_parameter):
|
||||||
|
|
||||||
if isinstance(target, list):
|
if isinstance(target, list):
|
||||||
for elem in target:
|
for elem in target:
|
||||||
if not isinstance(elem, string_types):
|
if not isinstance(elem, str):
|
||||||
msg = "The target items must be strings. %s is %s"
|
msg = "The target items must be strings. %s is %s"
|
||||||
raise AnsibleFilterError(msg % (elem, type(elem)))
|
raise AnsibleFilterError(msg % (elem, type(elem)))
|
||||||
|
|
||||||
if matching_parameter == 'regex':
|
if matching_parameter == 'regex':
|
||||||
if isinstance(target, string_types):
|
if isinstance(target, str):
|
||||||
r = target
|
r = target
|
||||||
else:
|
else:
|
||||||
if len(target) > 1:
|
if len(target) > 1:
|
||||||
|
@ -83,7 +82,7 @@ def _keys_filter_target_str(target, matching_parameter):
|
||||||
except re.error:
|
except re.error:
|
||||||
msg = "The target must be a valid regex if matching_parameter=regex. target is %s"
|
msg = "The target must be a valid regex if matching_parameter=regex. target is %s"
|
||||||
raise AnsibleFilterError(msg % r)
|
raise AnsibleFilterError(msg % r)
|
||||||
elif isinstance(target, string_types):
|
elif isinstance(target, str):
|
||||||
tt = (target, )
|
tt = (target, )
|
||||||
else:
|
else:
|
||||||
tt = tuple(set(target))
|
tt = tuple(set(target))
|
||||||
|
@ -117,10 +116,10 @@ def _keys_filter_target_dict(target, matching_parameter):
|
||||||
if not all(k in elem for k in ('before', 'after')):
|
if not all(k in elem for k in ('before', 'after')):
|
||||||
msg = "All dictionaries in target must include attributes: after, before."
|
msg = "All dictionaries in target must include attributes: after, before."
|
||||||
raise AnsibleFilterError(msg)
|
raise AnsibleFilterError(msg)
|
||||||
if not isinstance(elem['before'], string_types):
|
if not isinstance(elem['before'], str):
|
||||||
msg = "The attributes before must be strings. %s is %s"
|
msg = "The attributes before must be strings. %s is %s"
|
||||||
raise AnsibleFilterError(msg % (elem['before'], type(elem['before'])))
|
raise AnsibleFilterError(msg % (elem['before'], type(elem['before'])))
|
||||||
if not isinstance(elem['after'], string_types):
|
if not isinstance(elem['after'], str):
|
||||||
msg = "The attributes after must be strings. %s is %s"
|
msg = "The attributes after must be strings. %s is %s"
|
||||||
raise AnsibleFilterError(msg % (elem['after'], type(elem['after'])))
|
raise AnsibleFilterError(msg % (elem['after'], type(elem['after'])))
|
||||||
|
|
||||||
|
|
|
@ -7,7 +7,6 @@ __metaclass__ = type
|
||||||
|
|
||||||
import re
|
import re
|
||||||
|
|
||||||
from ansible.module_utils.six import binary_type, text_type
|
|
||||||
from collections.abc import Mapping, Set
|
from collections.abc import Mapping, Set
|
||||||
from ansible.module_utils.common.collections import is_sequence
|
from ansible.module_utils.common.collections import is_sequence
|
||||||
from ansible.utils.unsafe_proxy import (
|
from ansible.utils.unsafe_proxy import (
|
||||||
|
@ -29,11 +28,11 @@ def make_unsafe(value):
|
||||||
return set(make_unsafe(elt) for elt in value)
|
return set(make_unsafe(elt) for elt in value)
|
||||||
elif is_sequence(value):
|
elif is_sequence(value):
|
||||||
return type(value)(make_unsafe(elt) for elt in value)
|
return type(value)(make_unsafe(elt) for elt in value)
|
||||||
elif isinstance(value, binary_type):
|
elif isinstance(value, bytes):
|
||||||
if _RE_TEMPLATE_CHARS_BYTES.search(value):
|
if _RE_TEMPLATE_CHARS_BYTES.search(value):
|
||||||
value = _make_unsafe(value)
|
value = _make_unsafe(value)
|
||||||
return value
|
return value
|
||||||
elif isinstance(value, text_type):
|
elif isinstance(value, str):
|
||||||
if _RE_TEMPLATE_CHARS.search(value):
|
if _RE_TEMPLATE_CHARS.search(value):
|
||||||
value = _make_unsafe(value)
|
value = _make_unsafe(value)
|
||||||
return value
|
return value
|
||||||
|
|
|
@ -223,8 +223,9 @@ _value:
|
||||||
type: bool
|
type: bool
|
||||||
'''
|
'''
|
||||||
|
|
||||||
|
from collections.abc import Sequence
|
||||||
|
|
||||||
from ansible.errors import AnsibleFilterError
|
from ansible.errors import AnsibleFilterError
|
||||||
from ansible.module_utils.six.moves.collections_abc import Sequence
|
|
||||||
from ansible_collections.community.general.plugins.plugin_utils.ansible_type import _ansible_type
|
from ansible_collections.community.general.plugins.plugin_utils.ansible_type import _ansible_type
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -5,16 +5,6 @@
|
||||||
from __future__ import (absolute_import, division, print_function)
|
from __future__ import (absolute_import, division, print_function)
|
||||||
__metaclass__ = type
|
__metaclass__ = type
|
||||||
|
|
||||||
from ansible.errors import AnsibleError
|
|
||||||
from ansible.module_utils.six import raise_from
|
|
||||||
|
|
||||||
try:
|
|
||||||
from fqdn import FQDN
|
|
||||||
except ImportError as imp_exc:
|
|
||||||
ANOTHER_LIBRARY_IMPORT_ERROR = imp_exc
|
|
||||||
else:
|
|
||||||
ANOTHER_LIBRARY_IMPORT_ERROR = None
|
|
||||||
|
|
||||||
|
|
||||||
DOCUMENTATION = '''
|
DOCUMENTATION = '''
|
||||||
name: fqdn_valid
|
name: fqdn_valid
|
||||||
|
@ -74,6 +64,15 @@ _value:
|
||||||
type: bool
|
type: bool
|
||||||
'''
|
'''
|
||||||
|
|
||||||
|
from ansible.errors import AnsibleError
|
||||||
|
|
||||||
|
try:
|
||||||
|
from fqdn import FQDN
|
||||||
|
except ImportError as imp_exc:
|
||||||
|
ANOTHER_LIBRARY_IMPORT_ERROR = imp_exc
|
||||||
|
else:
|
||||||
|
ANOTHER_LIBRARY_IMPORT_ERROR = None
|
||||||
|
|
||||||
|
|
||||||
def fqdn_valid(name, min_labels=1, allow_underscores=False):
|
def fqdn_valid(name, min_labels=1, allow_underscores=False):
|
||||||
"""
|
"""
|
||||||
|
@ -83,10 +82,7 @@ def fqdn_valid(name, min_labels=1, allow_underscores=False):
|
||||||
"""
|
"""
|
||||||
|
|
||||||
if ANOTHER_LIBRARY_IMPORT_ERROR:
|
if ANOTHER_LIBRARY_IMPORT_ERROR:
|
||||||
raise_from(
|
raise AnsibleError('Python package fqdn must be installed to use this test.') from ANOTHER_LIBRARY_IMPORT_ERROR
|
||||||
AnsibleError('Python package fqdn must be installed to use this test.'),
|
|
||||||
ANOTHER_LIBRARY_IMPORT_ERROR
|
|
||||||
)
|
|
||||||
|
|
||||||
fobj = FQDN(name, min_labels=min_labels, allow_underscores=allow_underscores)
|
fobj = FQDN(name, min_labels=min_labels, allow_underscores=allow_underscores)
|
||||||
return (fobj.is_valid)
|
return (fobj.is_valid)
|
||||||
|
|
|
@ -5,8 +5,6 @@
|
||||||
from __future__ import (absolute_import, division, print_function)
|
from __future__ import (absolute_import, division, print_function)
|
||||||
__metaclass__ = type
|
__metaclass__ = type
|
||||||
|
|
||||||
from ansible.module_utils.six import string_types
|
|
||||||
|
|
||||||
|
|
||||||
def callback_results_extractor(outputs_results):
|
def callback_results_extractor(outputs_results):
|
||||||
results = []
|
results = []
|
||||||
|
@ -18,7 +16,7 @@ def callback_results_extractor(outputs_results):
|
||||||
line = "line_%s" % (i + 1)
|
line = "line_%s" % (i + 1)
|
||||||
test_line = stdout_lines[i] if i < len(stdout_lines) else None
|
test_line = stdout_lines[i] if i < len(stdout_lines) else None
|
||||||
expected_lines = expected_output[i] if i < len(expected_output) else None
|
expected_lines = expected_output[i] if i < len(expected_output) else None
|
||||||
if not isinstance(expected_lines, string_types) and expected_lines is not None:
|
if not isinstance(expected_lines, str) and expected_lines is not None:
|
||||||
if test_line not in expected_lines:
|
if test_line not in expected_lines:
|
||||||
differences.append({
|
differences.append({
|
||||||
'line': {
|
'line': {
|
||||||
|
|
|
@ -1,19 +1,3 @@
|
||||||
plugins/cache/pickle.py pylint:ansible-bad-import-from
|
|
||||||
plugins/callback/dense.py pylint:ansible-bad-import-from
|
|
||||||
plugins/callback/elastic.py pylint:ansible-bad-import-from
|
|
||||||
plugins/callback/opentelemetry.py pylint:ansible-bad-import-from
|
|
||||||
plugins/filter/from_ini.py pylint:ansible-bad-import-from
|
|
||||||
plugins/filter/lists_mergeby.py pylint:ansible-bad-import-from
|
|
||||||
plugins/filter/random_mac.py pylint:ansible-bad-import-from
|
|
||||||
plugins/filter/to_prettytable.py pylint:ansible-bad-import-from
|
|
||||||
plugins/filter/unicode_normalize.py pylint:ansible-bad-import-from
|
|
||||||
plugins/inventory/cobbler.py pylint:ansible-bad-import-from
|
|
||||||
plugins/inventory/lxd.py pylint:ansible-bad-import-from
|
|
||||||
plugins/inventory/scaleway.py pylint:ansible-bad-import-from
|
|
||||||
plugins/lookup/dependent.py pylint:ansible-bad-import-from
|
|
||||||
plugins/lookup/flattened.py pylint:ansible-bad-import-from
|
|
||||||
plugins/lookup/onepassword.py pylint:ansible-bad-import-from
|
|
||||||
plugins/lookup/revbitspss.py pylint:ansible-bad-import-from
|
|
||||||
plugins/module_utils/csv.py pylint:ansible-bad-import-from
|
plugins/module_utils/csv.py pylint:ansible-bad-import-from
|
||||||
plugins/module_utils/gitlab.py pylint:ansible-bad-import-from
|
plugins/module_utils/gitlab.py pylint:ansible-bad-import-from
|
||||||
plugins/module_utils/homebrew.py pylint:ansible-bad-import-from
|
plugins/module_utils/homebrew.py pylint:ansible-bad-import-from
|
||||||
|
@ -56,10 +40,6 @@ plugins/modules/xfconf.py validate-modules:return-syntax-error
|
||||||
plugins/modules/xml.py pylint:ansible-bad-import-from
|
plugins/modules/xml.py pylint:ansible-bad-import-from
|
||||||
plugins/modules/zpool_facts.py pylint:ansible-bad-import-from
|
plugins/modules/zpool_facts.py pylint:ansible-bad-import-from
|
||||||
plugins/modules/zypper_repository.py pylint:ansible-bad-import-from
|
plugins/modules/zypper_repository.py pylint:ansible-bad-import-from
|
||||||
plugins/plugin_utils/keys_filter.py pylint:ansible-bad-import-from
|
|
||||||
plugins/plugin_utils/unsafe.py pylint:ansible-bad-import-from
|
|
||||||
plugins/test/fqdn_valid.py pylint:ansible-bad-import-from
|
|
||||||
tests/integration/targets/callback/filter_plugins/helper.py pylint:ansible-bad-import-from
|
|
||||||
tests/unit/plugins/module_utils/identity/keycloak/test_keycloak_connect.py pylint:ansible-bad-import-from
|
tests/unit/plugins/module_utils/identity/keycloak/test_keycloak_connect.py pylint:ansible-bad-import-from
|
||||||
tests/unit/plugins/module_utils/net_tools/pritunl/test_api.py pylint:ansible-bad-import-from
|
tests/unit/plugins/module_utils/net_tools/pritunl/test_api.py pylint:ansible-bad-import-from
|
||||||
tests/unit/plugins/modules/conftest.py pylint:ansible-bad-import-from
|
tests/unit/plugins/modules/conftest.py pylint:ansible-bad-import-from
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue