ansible-core 2.18.0b1__py3-none-any.whl → 2.18.0rc2__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


This version of ansible-core might be problematic. Click here for more details.

Files changed (41) hide show
  1. ansible/errors/__init__.py +6 -2
  2. ansible/executor/play_iterator.py +18 -0
  3. ansible/executor/task_executor.py +2 -2
  4. ansible/galaxy/collection/concrete_artifact_manager.py +8 -3
  5. ansible/module_utils/ansible_release.py +1 -1
  6. ansible/module_utils/facts/system/distribution.py +1 -1
  7. ansible/module_utils/facts/timeout.py +1 -1
  8. ansible/modules/debconf.py +16 -13
  9. ansible/modules/dnf5.py +9 -1
  10. ansible/modules/user.py +18 -3
  11. ansible/playbook/base.py +5 -5
  12. ansible/plugins/action/dnf.py +7 -5
  13. ansible/plugins/action/include_vars.py +2 -1
  14. ansible/plugins/action/package.py +5 -4
  15. ansible/plugins/filter/unique.yml +28 -0
  16. ansible/plugins/strategy/__init__.py +2 -0
  17. ansible/plugins/strategy/linear.py +1 -13
  18. ansible/release.py +1 -1
  19. ansible/utils/galaxy.py +1 -1
  20. {ansible_core-2.18.0b1.dist-info → ansible_core-2.18.0rc2.dist-info}/METADATA +1 -1
  21. {ansible_core-2.18.0b1.dist-info → ansible_core-2.18.0rc2.dist-info}/RECORD +41 -41
  22. {ansible_core-2.18.0b1.dist-info → ansible_core-2.18.0rc2.dist-info}/WHEEL +1 -1
  23. ansible_test/_data/completion/docker.txt +3 -3
  24. ansible_test/_data/requirements/sanity.pylint.txt +4 -4
  25. ansible_test/_internal/docker_util.py +9 -1
  26. ansible_test/_internal/encoding.py +4 -4
  27. ansible_test/_internal/util.py +16 -8
  28. ansible_test/_util/controller/sanity/pylint/config/ansible-test-target.cfg +5 -0
  29. ansible_test/_util/controller/sanity/pylint/config/ansible-test.cfg +5 -0
  30. ansible_test/_util/controller/sanity/pylint/config/code-smell.cfg +5 -0
  31. ansible_test/_util/controller/sanity/pylint/config/collection.cfg +5 -0
  32. ansible_test/_util/controller/sanity/pylint/config/default.cfg +5 -0
  33. ansible_test/_util/controller/sanity/pylint/plugins/hide_unraisable.py +3 -4
  34. ansible_test/_util/target/setup/requirements.py +4 -4
  35. {ansible_core-2.18.0b1.dist-info → ansible_core-2.18.0rc2.dist-info}/Apache-License.txt +0 -0
  36. {ansible_core-2.18.0b1.dist-info → ansible_core-2.18.0rc2.dist-info}/COPYING +0 -0
  37. {ansible_core-2.18.0b1.dist-info → ansible_core-2.18.0rc2.dist-info}/MIT-license.txt +0 -0
  38. {ansible_core-2.18.0b1.dist-info → ansible_core-2.18.0rc2.dist-info}/PSF-license.txt +0 -0
  39. {ansible_core-2.18.0b1.dist-info → ansible_core-2.18.0rc2.dist-info}/entry_points.txt +0 -0
  40. {ansible_core-2.18.0b1.dist-info → ansible_core-2.18.0rc2.dist-info}/simplified_bsd.txt +0 -0
  41. {ansible_core-2.18.0b1.dist-info → ansible_core-2.18.0rc2.dist-info}/top_level.txt +0 -0
@@ -66,14 +66,18 @@ class AnsibleError(Exception):
66
66
  from ansible.parsing.yaml.objects import AnsibleBaseYAMLObject
67
67
 
68
68
  message = [self._message]
69
+
70
+ # Add from previous exceptions
71
+ if self.orig_exc:
72
+ message.append('. %s' % to_native(self.orig_exc))
73
+
74
+ # Add from yaml to give specific file/line no
69
75
  if isinstance(self.obj, AnsibleBaseYAMLObject):
70
76
  extended_error = self._get_extended_error()
71
77
  if extended_error and not self._suppress_extended_error:
72
78
  message.append(
73
79
  '\n\n%s' % to_native(extended_error)
74
80
  )
75
- elif self.orig_exc:
76
- message.append('. %s' % to_native(self.orig_exc))
77
81
 
78
82
  return ''.join(message)
79
83
 
@@ -447,6 +447,24 @@ class PlayIterator:
447
447
 
448
448
  # if something above set the task, break out of the loop now
449
449
  if task:
450
+ # skip implicit flush_handlers if there are no handlers notified
451
+ if (
452
+ task.implicit
453
+ and task.action in C._ACTION_META
454
+ and task.args.get('_raw_params', None) == 'flush_handlers'
455
+ and (
456
+ # the state store in the `state` variable could be a nested state,
457
+ # notifications are always stored in the top level state, get it here
458
+ not self.get_state_for_host(host.name).handler_notifications
459
+ # in case handlers notifying other handlers, the notifications are not
460
+ # saved in `handler_notifications` and handlers are notified directly
461
+ # to prevent duplicate handler runs, so check whether any handler
462
+ # is notified
463
+ and all(not h.notified_hosts for h in self.handlers)
464
+ )
465
+ ):
466
+ continue
467
+
450
468
  break
451
469
 
452
470
  return (state, task)
@@ -684,8 +684,8 @@ class TaskExecutor:
684
684
  self._handler.cleanup()
685
685
  display.debug("handler run complete")
686
686
 
687
- # preserve no log
688
- result["_ansible_no_log"] = no_log
687
+ # propagate no log to result- the action can set this, so only overwrite it with the task's value if missing or falsey
688
+ result["_ansible_no_log"] = bool(no_log or result.get('_ansible_no_log', False))
689
689
 
690
690
  if self._task.action not in C._ACTION_WITH_CLEAN_FACTS:
691
691
  result = wrap_var(result)
@@ -10,6 +10,7 @@ import os
10
10
  import tarfile
11
11
  import subprocess
12
12
  import typing as t
13
+ import yaml
13
14
 
14
15
  from contextlib import contextmanager
15
16
  from hashlib import sha256
@@ -24,6 +25,7 @@ if t.TYPE_CHECKING:
24
25
  )
25
26
  from ansible.galaxy.token import GalaxyToken
26
27
 
28
+ from ansible import context
27
29
  from ansible.errors import AnsibleError
28
30
  from ansible.galaxy import get_collections_galaxy_meta_info
29
31
  from ansible.galaxy.api import should_retry_error
@@ -38,7 +40,7 @@ from ansible.module_utils.urls import open_url
38
40
  from ansible.utils.display import Display
39
41
  from ansible.utils.sentinel import Sentinel
40
42
 
41
- import yaml
43
+ import ansible.constants as C
42
44
 
43
45
 
44
46
  display = Display()
@@ -425,11 +427,14 @@ def _extract_collection_from_git(repo_url, coll_ver, b_path):
425
427
 
426
428
  # Perform a shallow clone if simply cloning HEAD
427
429
  if version == 'HEAD':
428
- git_clone_cmd = git_executable, 'clone', '--depth=1', git_url, to_text(b_checkout_path)
430
+ git_clone_cmd = [git_executable, 'clone', '--depth=1', git_url, to_text(b_checkout_path)]
429
431
  else:
430
- git_clone_cmd = git_executable, 'clone', git_url, to_text(b_checkout_path)
432
+ git_clone_cmd = [git_executable, 'clone', git_url, to_text(b_checkout_path)]
431
433
  # FIXME: '--branch', version
432
434
 
435
+ if context.CLIARGS['ignore_certs'] or C.GALAXY_IGNORE_CERTS:
436
+ git_clone_cmd.extend(['-c', 'http.sslVerify=false'])
437
+
433
438
  try:
434
439
  subprocess.check_call(git_clone_cmd)
435
440
  except subprocess.CalledProcessError as proc_err:
@@ -17,6 +17,6 @@
17
17
 
18
18
  from __future__ import annotations
19
19
 
20
- __version__ = '2.18.0b1'
20
+ __version__ = '2.18.0rc2'
21
21
  __author__ = 'Ansible, Inc.'
22
22
  __codename__ = "Fool in the Rain"
@@ -30,7 +30,7 @@ def get_uname(module, flags=('-v')):
30
30
 
31
31
  def _file_exists(path, allow_empty=False):
32
32
  # not finding the file, exit early
33
- if not os.path.exists(path):
33
+ if not os.path.isfile(path):
34
34
  return False
35
35
 
36
36
  # if just the path needs to exists (ie, it can be empty) we are done
@@ -48,7 +48,7 @@ def timeout(seconds=None, error_message="Timer expired"):
48
48
  return res.get(timeout_value)
49
49
  except multiprocessing.TimeoutError:
50
50
  # This is an ansible.module_utils.common.facts.timeout.TimeoutError
51
- raise TimeoutError('Timer expired after %s seconds' % timeout_value)
51
+ raise TimeoutError(f'{error_message} after {timeout_value} seconds')
52
52
  finally:
53
53
  pool.terminate()
54
54
 
@@ -134,21 +134,24 @@ def get_password_value(module, pkg, question, vtype):
134
134
  cmd = [getsel]
135
135
  rc, out, err = module.run_command(cmd)
136
136
  if rc != 0:
137
- module.fail_json(msg="Failed to get the value '%s' from '%s'" % (question, pkg))
137
+ module.fail_json(msg=f"Failed to get the value '{question}' from '{pkg}': {err}")
138
138
 
139
- desired_line = None
140
139
  for line in out.split("\n"):
141
- if line.startswith(pkg):
142
- desired_line = line
143
- break
144
-
145
- if not desired_line:
146
- module.fail_json(msg="Failed to find the value '%s' from '%s'" % (question, pkg))
147
-
148
- (dpkg, dquestion, dvtype, dvalue) = desired_line.split()
149
- if dquestion == question and dvtype == vtype:
150
- return dvalue
151
- return ''
140
+ if not line.startswith(pkg):
141
+ continue
142
+
143
+ # line is a collection of tab separated values
144
+ fields = line.split('\t')
145
+ if len(fields) <= 3:
146
+ # No password found, return a blank password
147
+ return ''
148
+ try:
149
+ if fields[1] == question and fields[2] == vtype:
150
+ # If correct question and question type found, return password value
151
+ return fields[3]
152
+ except IndexError:
153
+ # Fail safe
154
+ return ''
152
155
 
153
156
 
154
157
  def get_selections(module, pkg):
ansible/modules/dnf5.py CHANGED
@@ -451,7 +451,15 @@ class Dnf5Module(YumDnf):
451
451
 
452
452
  def fail_on_non_existing_plugins(self, base):
453
453
  # https://github.com/rpm-software-management/dnf5/issues/1460
454
- plugin_names = [p.get_name() for p in base.get_plugins_info()]
454
+ try:
455
+ plugin_names = [p.get_name() for p in base.get_plugins_info()]
456
+ except AttributeError:
457
+ # plugins functionality requires python3-libdnf5 5.2.0.0+
458
+ # silently ignore here, the module will fail later when
459
+ # base.enable_disable_plugins is attempted to be used if
460
+ # user specifies enable_plugin/disable_plugin
461
+ return
462
+
455
463
  msg = []
456
464
  if enable_unmatched := set(self.enable_plugin).difference(plugin_names):
457
465
  msg.append(
ansible/modules/user.py CHANGED
@@ -1220,9 +1220,11 @@ class User(object):
1220
1220
  overwrite = None
1221
1221
  try:
1222
1222
  ssh_key_file = self.get_ssh_key_path()
1223
+ pub_file = f'{ssh_key_file}.pub'
1223
1224
  except Exception as e:
1224
1225
  return (1, '', to_native(e))
1225
1226
  ssh_dir = os.path.dirname(ssh_key_file)
1227
+
1226
1228
  if not os.path.exists(ssh_dir):
1227
1229
  if self.module.check_mode:
1228
1230
  return (0, '', '')
@@ -1231,12 +1233,23 @@ class User(object):
1231
1233
  os.chown(ssh_dir, info[2], info[3])
1232
1234
  except OSError as e:
1233
1235
  return (1, '', 'Failed to create %s: %s' % (ssh_dir, to_native(e)))
1236
+
1234
1237
  if os.path.exists(ssh_key_file):
1235
1238
  if self.force:
1236
- # ssh-keygen doesn't support overwriting the key interactively, so send 'y' to confirm
1239
+ self.module.warn(f'Overwriting existing ssh key private file "{ssh_key_file}"')
1237
1240
  overwrite = 'y'
1238
1241
  else:
1242
+ self.module.warn(f'Found existing ssh key private file "{ssh_key_file}", no force, so skipping ssh-keygen generation')
1239
1243
  return (None, 'Key already exists, use "force: yes" to overwrite', '')
1244
+
1245
+ if os.path.exists(pub_file):
1246
+ if self.force:
1247
+ self.module.warn(f'Overwriting existing ssh key public file "{pub_file}"')
1248
+ os.unlink(pub_file)
1249
+ else:
1250
+ self.module.warn(f'Found existing ssh key public file "{pub_file}", no force, so skipping ssh-keygen generation')
1251
+ return (None, 'Public key already exists, use "force: yes" to overwrite', '')
1252
+
1240
1253
  cmd = [self.module.get_bin_path('ssh-keygen', True)]
1241
1254
  cmd.append('-t')
1242
1255
  cmd.append(self.ssh_type)
@@ -1303,7 +1316,7 @@ class User(object):
1303
1316
  # If the keys were successfully created, we should be able
1304
1317
  # to tweak ownership.
1305
1318
  os.chown(ssh_key_file, info[2], info[3])
1306
- os.chown('%s.pub' % ssh_key_file, info[2], info[3])
1319
+ os.chown(pub_file, info[2], info[3])
1307
1320
  return (rc, out, err)
1308
1321
 
1309
1322
  def ssh_key_fingerprint(self):
@@ -1375,7 +1388,9 @@ class User(object):
1375
1388
  for d in dirs:
1376
1389
  os.chown(os.path.join(root, d), uid, gid)
1377
1390
  for f in files:
1378
- os.chown(os.path.join(root, f), uid, gid)
1391
+ full_path = os.path.join(root, f)
1392
+ if not os.path.islink(full_path):
1393
+ os.chown(full_path, uid, gid)
1379
1394
  except OSError as e:
1380
1395
  self.module.exit_json(failed=True, msg="%s" % to_native(e))
1381
1396
 
ansible/playbook/base.py CHANGED
@@ -19,7 +19,7 @@ from ansible import context
19
19
  from ansible.errors import AnsibleError, AnsibleParserError, AnsibleUndefinedVariable, AnsibleAssertionError
20
20
  from ansible.module_utils.six import string_types
21
21
  from ansible.module_utils.parsing.convert_bool import boolean
22
- from ansible.module_utils.common.text.converters import to_text, to_native
22
+ from ansible.module_utils.common.text.converters import to_text
23
23
  from ansible.parsing.dataloader import DataLoader
24
24
  from ansible.playbook.attribute import Attribute, FieldAttribute, ConnectionFieldAttribute, NonInheritableFieldAttribute
25
25
  from ansible.plugins.loader import module_loader, action_loader
@@ -567,14 +567,14 @@ class FieldAttributeBase:
567
567
  setattr(self, name, value)
568
568
  except (TypeError, ValueError) as e:
569
569
  value = getattr(self, name)
570
- raise AnsibleParserError("the field '%s' has an invalid value (%s), and could not be converted to %s. "
571
- "The error was: %s" % (name, value, attribute.isa, e), obj=self.get_ds(), orig_exc=e)
570
+ raise AnsibleParserError(f"the field '{name}' has an invalid value ({value!r}), and could not be converted to {attribute.isa}.",
571
+ obj=self.get_ds(), orig_exc=e)
572
572
  except (AnsibleUndefinedVariable, UndefinedError) as e:
573
573
  if templar._fail_on_undefined_errors and name != 'name':
574
574
  if name == 'args':
575
- msg = "The task includes an option with an undefined variable. The error was: %s" % (to_native(e))
575
+ msg = "The task includes an option with an undefined variable."
576
576
  else:
577
- msg = "The field '%s' has an invalid value, which includes an undefined variable. The error was: %s" % (name, to_native(e))
577
+ msg = f"The field '{name}' has an invalid value, which includes an undefined variable."
578
578
  raise AnsibleParserError(msg, obj=self.get_ds(), orig_exc=e)
579
579
 
580
580
  self._finalized = True
@@ -41,6 +41,13 @@ class ActionModule(ActionBase):
41
41
  facts = self._execute_module(
42
42
  module_name="ansible.legacy.setup", module_args=dict(filter="ansible_pkg_mgr", gather_subset="!all"),
43
43
  task_vars=task_vars)
44
+
45
+ if facts.get("failed", False):
46
+ raise AnsibleActionFail(
47
+ f"Failed to fetch ansible_pkg_mgr to determine the dnf action backend: {facts.get('msg')}",
48
+ result=facts,
49
+ )
50
+
44
51
  display.debug("Facts %s" % facts)
45
52
  module = facts.get("ansible_facts", {}).get("ansible_pkg_mgr", "auto")
46
53
  if (not self._task.delegate_to or self._task.delegate_facts) and module != 'auto':
@@ -75,9 +82,4 @@ class ActionModule(ActionBase):
75
82
  result.update(self._execute_module(
76
83
  module_name=module, module_args=new_module_args, task_vars=task_vars, wrap_async=self._task.async_val))
77
84
 
78
- # Cleanup
79
- if not self._task.async_val:
80
- # remove a temporary path we created
81
- self._remove_tmp_path(self._connection._shell.tmpdir)
82
-
83
85
  return result
@@ -237,7 +237,8 @@ class ActionModule(ActionBase):
237
237
  b_data, show_content = self._loader._get_file_contents(filename)
238
238
  data = to_text(b_data, errors='surrogate_or_strict')
239
239
 
240
- self.show_content = show_content
240
+ self.show_content &= show_content # mask all results if any file was encrypted
241
+
241
242
  data = self._loader.load(data, file_name=filename, show_content=show_content)
242
243
  if not data:
243
244
  data = dict()
@@ -68,6 +68,11 @@ class ActionModule(ActionBase):
68
68
  module_args=dict(filter='ansible_pkg_mgr', gather_subset='!all'),
69
69
  task_vars=task_vars,
70
70
  )
71
+ if facts.get("failed", False):
72
+ raise AnsibleActionFail(
73
+ f"Failed to fetch ansible_pkg_mgr to determine the package action backend: {facts.get('msg')}",
74
+ result=facts,
75
+ )
71
76
  pmgr = 'ansible_pkg_mgr'
72
77
 
73
78
  try:
@@ -103,9 +108,5 @@ class ActionModule(ActionBase):
103
108
 
104
109
  except AnsibleAction as e:
105
110
  result.update(e.result)
106
- finally:
107
- if not self._task.async_val:
108
- # remove a temporary path we created
109
- self._remove_tmp_path(self._connection._shell.tmpdir)
110
111
 
111
112
  return result
@@ -10,6 +10,13 @@ DOCUMENTATION:
10
10
  description: A list.
11
11
  type: list
12
12
  required: true
13
+ case_sensitive:
14
+ description: Whether to consider case when comparing elements.
15
+ default: false
16
+ type: bool
17
+ attribute:
18
+ description: Filter objects with unique values for this attribute.
19
+ type: str
13
20
  seealso:
14
21
  - plugin_type: filter
15
22
  plugin: ansible.builtin.difference
@@ -24,6 +31,27 @@ EXAMPLES: |
24
31
  # list1: [1, 2, 5, 1, 3, 4, 10]
25
32
  {{ list1 | unique }}
26
33
  # => [1, 2, 5, 3, 4, 10]
34
+
35
+ # return case sensitive unique elements
36
+ {{ ['a', 'A', 'a'] | unique(case_sensitive='true') }}
37
+ # => ['a', 'A']
38
+
39
+ # return case insensitive unique elements
40
+ {{ ['b', 'B', 'b'] | unique() }}
41
+ # => ['b']
42
+
43
+ # return unique elements of list based on attribute
44
+ # => [{"age": 12, "name": "a" }, { "age": 14, "name": "b"}]
45
+ - debug:
46
+ msg: "{{ sample | unique(attribute='age') }}"
47
+ vars:
48
+ sample:
49
+ - name: a
50
+ age: 12
51
+ - name: b
52
+ age: 14
53
+ - name: c
54
+ age: 14
27
55
  RETURN:
28
56
  _value:
29
57
  description: A list with unique elements, also known as a set.
@@ -926,6 +926,8 @@ class StrategyBase:
926
926
  meta_action = task.args.get('_raw_params')
927
927
 
928
928
  def _evaluate_conditional(h):
929
+ if not task.when:
930
+ return True
929
931
  all_vars = self._variable_manager.get_vars(play=iterator._play, host=h, task=task,
930
932
  _hosts=self._hosts_cache, _hosts_all=self._hosts_cache_all)
931
933
  templar = Templar(loader=self._loader, variables=all_vars)
@@ -34,7 +34,6 @@ from ansible.errors import AnsibleError, AnsibleAssertionError, AnsibleParserErr
34
34
  from ansible.module_utils.common.text.converters import to_text
35
35
  from ansible.playbook.handler import Handler
36
36
  from ansible.playbook.included_file import IncludedFile
37
- from ansible.playbook.task import Task
38
37
  from ansible.plugins.loader import action_loader
39
38
  from ansible.plugins.strategy import StrategyBase
40
39
  from ansible.template import Templar
@@ -51,12 +50,6 @@ class StrategyModule(StrategyBase):
51
50
  be a noop task to keep the iterator in lock step across
52
51
  all hosts.
53
52
  '''
54
- noop_task = Task()
55
- noop_task.action = 'meta'
56
- noop_task.args['_raw_params'] = 'noop'
57
- noop_task.implicit = True
58
- noop_task.set_loader(iterator._play._loader)
59
-
60
53
  state_task_per_host = {}
61
54
  for host in hosts:
62
55
  state, task = iterator.get_next_task_for_host(host, peek=True)
@@ -64,7 +57,7 @@ class StrategyModule(StrategyBase):
64
57
  state_task_per_host[host] = state, task
65
58
 
66
59
  if not state_task_per_host:
67
- return [(h, None) for h in hosts]
60
+ return []
68
61
 
69
62
  task_uuids = {t._uuid for s, t in state_task_per_host.values()}
70
63
  _loop_cnt = 0
@@ -90,8 +83,6 @@ class StrategyModule(StrategyBase):
90
83
  if cur_task._uuid == task._uuid:
91
84
  iterator.set_state_for_host(host.name, state)
92
85
  host_tasks.append((host, task))
93
- else:
94
- host_tasks.append((host, noop_task))
95
86
 
96
87
  if cur_task.action in C._ACTION_META and cur_task.args.get('_raw_params') == 'flush_handlers':
97
88
  iterator.all_tasks[iterator.cur_task:iterator.cur_task] = [h for b in iterator._play.handlers for h in b.block]
@@ -133,9 +124,6 @@ class StrategyModule(StrategyBase):
133
124
 
134
125
  results = []
135
126
  for (host, task) in host_tasks:
136
- if not task:
137
- continue
138
-
139
127
  if self._tqm._terminated:
140
128
  break
141
129
 
ansible/release.py CHANGED
@@ -17,6 +17,6 @@
17
17
 
18
18
  from __future__ import annotations
19
19
 
20
- __version__ = '2.18.0b1'
20
+ __version__ = '2.18.0rc2'
21
21
  __author__ = 'Ansible, Inc.'
22
22
  __codename__ = "Fool in the Rain"
ansible/utils/galaxy.py CHANGED
@@ -64,7 +64,7 @@ def scm_archive_resource(src, scm='git', name=None, version='HEAD', keep_scm_met
64
64
  clone_cmd = [scm_path, 'clone']
65
65
 
66
66
  # Add specific options for ignoring certificates if requested
67
- ignore_certs = context.CLIARGS['ignore_certs']
67
+ ignore_certs = context.CLIARGS['ignore_certs'] or C.GALAXY_IGNORE_CERTS
68
68
 
69
69
  if ignore_certs:
70
70
  if scm == 'git':
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: ansible-core
3
- Version: 2.18.0b1
3
+ Version: 2.18.0rc2
4
4
  Summary: Radically simple IT automation
5
5
  Author: Ansible Project
6
6
  Project-URL: Homepage, https://ansible.com/
@@ -3,7 +3,7 @@ ansible/__main__.py,sha256=24j-7-YT4lZ2fmV80JD-VRoYBnxR7YoP_VP-orJtDt0,796
3
3
  ansible/constants.py,sha256=dSgbrzNsmhYc4GQOWZvRm4XKgf--_MUWcMa_9_7l5Pc,9757
4
4
  ansible/context.py,sha256=oKYyfjfWpy8vDeProtqfnqSmuij_t75_5e5t0U_hQ1g,1933
5
5
  ansible/keyword_desc.yml,sha256=xD-MRMB8mSRaj2ADwRnjIEbOwJKbc6BYadouGPfS0mI,7462
6
- ansible/release.py,sha256=smp27lAiQVLyT4Mqaf4E16coyapxbkkjeI8JYEdK_sk,838
6
+ ansible/release.py,sha256=gXhvjcTPfQX0uSeFezLYafifTwn4dkgfRceZe8lieM4,839
7
7
  ansible/_vendor/__init__.py,sha256=2QBeBwT7uG7M3Aw-pIdCpt6XPtHMCpbEKfACYKA7xIg,2033
8
8
  ansible/cli/__init__.py,sha256=e0KjeLfG1Ketbwl-uOmQ-zXoq3_El80LnHTGu80d1gs,28111
9
9
  ansible/cli/adhoc.py,sha256=quJ9WzRzf3dz_dtDGmahNMffqyNVy1jzQCMo21YL5Qg,8194
@@ -28,16 +28,16 @@ ansible/config/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
28
28
  ansible/config/ansible_builtin_runtime.yml,sha256=nwL_-rqEEmpuSHxZH70pJBiEosDKOPkYIboH3_7LVEY,376076
29
29
  ansible/config/base.yml,sha256=uC0ApG7cA5evjjINIMH49362fhMI_p2--Bp_aRbELj4,87253
30
30
  ansible/config/manager.py,sha256=27_GXGb3SxX0Shqf5YtHvDSoycinzsDAjaPqwPsbY5o,29132
31
- ansible/errors/__init__.py,sha256=HPflS7WJhE4TWHGIQNXQcGeGKGZ07RTWjkw3G11mSwQ,14850
31
+ ansible/errors/__init__.py,sha256=Dd-jh7JVwfweicHg6irB9ugrK66vHATv9eiRbEep4dM,14943
32
32
  ansible/errors/yaml_strings.py,sha256=fKfgD3rC017dyMackTpu-LkvbsdnsfBAKCxMH-fDtIg,3858
33
33
  ansible/executor/__init__.py,sha256=mRvbCJPA-_veSG5ka3v04G5vsarLVDeB3EWFsu6geSI,749
34
34
  ansible/executor/action_write_locks.py,sha256=Up2n3cwFCr4T4IvttHpe3QOxRBF_9NgWJ1tFm9CHpfM,1915
35
35
  ansible/executor/interpreter_discovery.py,sha256=z0ekwq9rND1wAZChHOYNfav7ycTvnkgVFPEek8aXj-I,9975
36
36
  ansible/executor/module_common.py,sha256=4pVfjMgCle9ttAZTeuwSx3Kdi0rljagyHC11i4VnCl4,65755
37
- ansible/executor/play_iterator.py,sha256=5gdJdHR2Cz8yUSYAvpIBqMV_U3Hst7MiaLmhwXEaqb0,31466
37
+ ansible/executor/play_iterator.py,sha256=Oazd9aWy4zB67uy27sYg4BveFx_Uf_tIsbhD76hMc28,32496
38
38
  ansible/executor/playbook_executor.py,sha256=qurZBiWjAWWRYcHb3ti4sBI8_WotOYvTRDar4JC3leE,14764
39
39
  ansible/executor/stats.py,sha256=gcBhJQrZTgE95737d6lArJ3FpTlbAfVt6GMhEqs5ZPU,3180
40
- ansible/executor/task_executor.py,sha256=5kekBuuw4Na5o1fpaErkLKxxTGLMBUnDxkCjCJfgmd0,61133
40
+ ansible/executor/task_executor.py,sha256=1kc49j7Iwf2UZm4DuSwgihJ51Wzuey2vcQZlBwWeGK4,61280
41
41
  ansible/executor/task_queue_manager.py,sha256=fC404XkveICb7hRwIVu4PvRNgFkFLCNihsGsUDHVFzg,18640
42
42
  ansible/executor/task_result.py,sha256=48zZWpxCiM0Z_MVG9zGQGCxHLNzs1horT68Qmfa-v_8,5696
43
43
  ansible/executor/discovery/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
@@ -61,7 +61,7 @@ ansible/galaxy/role.py,sha256=jTIXiyhgFq25vWnVU18LoWIzUdhqHSArKTvYC9uGFRg,21132
61
61
  ansible/galaxy/token.py,sha256=U6U4-jcsjZKdD4iuALGh3AQPc81N3_fhqfSpRwUOAJY,6573
62
62
  ansible/galaxy/user_agent.py,sha256=_Vr4ZJV8HNXhSbhw_dvUr378OjFdyhtLRHyywCjGU6g,760
63
63
  ansible/galaxy/collection/__init__.py,sha256=sWIZ6agsjWptmmlS4ZAsgKu3jZTynSfHlvwZeJ26qOs,79010
64
- ansible/galaxy/collection/concrete_artifact_manager.py,sha256=2PhdpZISJMEe6e3vMcE6Bwz5YkMzjBwLUSMH5U1uSPA,29287
64
+ ansible/galaxy/collection/concrete_artifact_manager.py,sha256=tOnqzBVdFatkTN44tifEPsCIZGwfieN5G1bjTEIX9M0,29476
65
65
  ansible/galaxy/collection/galaxy_api_proxy.py,sha256=ir_JnTxH5CTvmgnswPkaqbEgMEgaZzW3F11t_NrhWsc,7805
66
66
  ansible/galaxy/collection/gpg.py,sha256=m4_AtZPZyM_D72ARZqAKa-Her9XWICb4ie6KcEh52M8,7540
67
67
  ansible/galaxy/data/COPYING,sha256=vy2E-bFAhZlTU_NCyMSIACNWl7yJSECGdWrRncQ1NWs,1005
@@ -141,7 +141,7 @@ ansible/inventory/host.py,sha256=PDb5OTplhfpUIvdHiP2BckUOB1gUl302N-3sW0_sTyg,503
141
141
  ansible/inventory/manager.py,sha256=45mHgZTAkQ3IjAtrgsNzJXvynC-HIEor-JJE-V3xXN4,29454
142
142
  ansible/module_utils/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
143
143
  ansible/module_utils/_text.py,sha256=VkWgAnSNVCbTQqZgllUObBFsH3uM4EUW5srl1UR9t1g,544
144
- ansible/module_utils/ansible_release.py,sha256=smp27lAiQVLyT4Mqaf4E16coyapxbkkjeI8JYEdK_sk,838
144
+ ansible/module_utils/ansible_release.py,sha256=gXhvjcTPfQX0uSeFezLYafifTwn4dkgfRceZe8lieM4,839
145
145
  ansible/module_utils/api.py,sha256=r4wd6XZGhUnxMF416Ry6ebgq8BIhjCPSPOvO2ZtrYxE,5785
146
146
  ansible/module_utils/basic.py,sha256=fogfpo_l7JtS34WvgwwOebmPfMhFjQaJN5CwjKgUJVE,86291
147
147
  ansible/module_utils/connection.py,sha256=8TviwCucQ7d_JILwaUHE4tCuNfR3U1WFkmxLMxWa8Rw,7671
@@ -200,7 +200,7 @@ ansible/module_utils/facts/default_collectors.py,sha256=iKefVeINbQuhXok28HxuT-MN
200
200
  ansible/module_utils/facts/namespace.py,sha256=EAzWToQ7tP54GodzmFdtEvzyQrc-2deWhOUQ5lGsoCk,2313
201
201
  ansible/module_utils/facts/packages.py,sha256=V_95aIcw3ZavcVxNCRaqcLY6Rv2gYG3l0RZagIh6Apg,4410
202
202
  ansible/module_utils/facts/sysctl.py,sha256=5G3MFADNgY-KvmFJLtCOXMVqnUYFBLZm9WTv6YS6i5I,2035
203
- ansible/module_utils/facts/timeout.py,sha256=LLO9h5wr-2Cf7PB9T_859BOI04dfQktlOJsidMLhCpE,2453
203
+ ansible/module_utils/facts/timeout.py,sha256=rGOnkMaLIvrCDKfCJeQ8ref9jah4tsDzd24KZ-BFPS8,2453
204
204
  ansible/module_utils/facts/utils.py,sha256=cKka93JV5LdMQ_Uec77p7DzyPfSBhitX1AfR0m5v7Dk,3419
205
205
  ansible/module_utils/facts/hardware/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
206
206
  ansible/module_utils/facts/hardware/aix.py,sha256=r9rb_Qz-dPYDeZDDo49gqHQrf6HumHLnxZI6CkGgVxA,10681
@@ -239,7 +239,7 @@ ansible/module_utils/facts/system/caps.py,sha256=ymoLYx8RFh75dX4ODEcd5aGcpQhYcWj
239
239
  ansible/module_utils/facts/system/chroot.py,sha256=KBBOXOZOAvsXLCAYiD24k2vKv8x-vRPYHAFH8Km-bdQ,1517
240
240
  ansible/module_utils/facts/system/cmdline.py,sha256=rStcOy2NX5as62oRlwU-OS0QGWC-a1iDLJNJwuDmFWk,2637
241
241
  ansible/module_utils/facts/system/date_time.py,sha256=oDeUy493BIQzp3JVBkoD1DHtu_m-oTWKdxcR4C_db-Q,3125
242
- ansible/module_utils/facts/system/distribution.py,sha256=vdS0KgqS0oE5VhbwH_F214bX7sWxm7OAz2WFuCxLv3A,32759
242
+ ansible/module_utils/facts/system/distribution.py,sha256=fJZ6xM5vj1xxYF0wPiGLGXj8pOrqYclwJoPFTccd16k,32759
243
243
  ansible/module_utils/facts/system/dns.py,sha256=_UaIcGLEaSt5Dd51O-JTR82ST1exgTm_DppCaZJnhSc,2692
244
244
  ansible/module_utils/facts/system/env.py,sha256=LPPTxo46aaf30o-uMGetD19v6XWsaPJJgGWwxijn2rc,1185
245
245
  ansible/module_utils/facts/system/fips.py,sha256=g9gbq_bHg25kbvRLewOn1boxXsb5newi_Hhj-D2KZv4,1353
@@ -293,10 +293,10 @@ ansible/modules/command.py,sha256=dxhIvyeOwQG_SkVSHN0h652z6a3sTAR532HB_zwM4hc,13
293
293
  ansible/modules/copy.py,sha256=2A1rh9Mpl8oFgTeS7xmVSUZ1v920I60jMEgrkwfBwyg,32106
294
294
  ansible/modules/cron.py,sha256=qR5ePdI3GZQeBSCn9YqxTxWlNEblCaTFnBRZqLjtnPo,26353
295
295
  ansible/modules/deb822_repository.py,sha256=SLJM8bBLc70WYu3-OA67wd5hMft3pznYAMIidYOtmUU,15791
296
- ansible/modules/debconf.py,sha256=Qk-coJRjpiFLA5178RJfkFeBFFVJj1g4S36DwHIpOPg,9211
296
+ ansible/modules/debconf.py,sha256=Y49U5pM6UpKvYAvDbOhYe6kmQFAaxjl7YoYnPrOaGGU,9362
297
297
  ansible/modules/debug.py,sha256=BFbzrU_vl-Try5DuLV20_sLgqxEJlPV9uOrgAtby2e8,2908
298
298
  ansible/modules/dnf.py,sha256=rsb28kjMMnTu-rPW0Pdnbs2RPyvfdhWgXeUORUSgzEI,52288
299
- ansible/modules/dnf5.py,sha256=ySxVFzLkPj9hKX4uHkBdiQEcQbF9W98zQNMmg5P5sIc,27897
299
+ ansible/modules/dnf5.py,sha256=9nM6v8C4icI0vQ_5HIpmCY_XtYPOGHUhBwKabt7pz2Q,28230
300
300
  ansible/modules/dpkg_selections.py,sha256=lTWBhmVFrf6PsV4_BoR23wVTJOloCH1YNPcAn0m7DTY,2805
301
301
  ansible/modules/expect.py,sha256=O4emRoJ09i3OLmVX5j84WHkGKWg6bMytYpZlExOrSmc,9369
302
302
  ansible/modules/fail.py,sha256=95z8jFyVaizwwupSce04kj1wwnOmbM0ooUX7mXluoyU,1659
@@ -347,7 +347,7 @@ ansible/modules/tempfile.py,sha256=lA9e8lyFXf9J5ud0R6Jkt8sIFyRcOwzhc9Jz-5_HOZQ,3
347
347
  ansible/modules/template.py,sha256=D1sm36GB_mEimH0CfWq1cJ4w1eRvpcsHwZ-ufVzC_Gs,4537
348
348
  ansible/modules/unarchive.py,sha256=wdSOFKhZqbAFq5j_tBZtUSamfr_EEW6_cTZDw-erMjs,45405
349
349
  ansible/modules/uri.py,sha256=rhybLSwlciwEvTbxTOvgRTZgdrCrmPaLSfoSdiIu0Xo,28390
350
- ansible/modules/user.py,sha256=uKBkQpOEZR0HaVIrBiLZJ8aXIxyXYB75-Q1B_ywOm60,122606
350
+ ansible/modules/user.py,sha256=w0RVtz89EA2JpAhwav_J-2mGFKnEfW7MxCTKeug-r14,123301
351
351
  ansible/modules/validate_argument_spec.py,sha256=XbWlUr4ElgLfdxo3qCN7M-IES_X2iTl3AgawzCOMQpo,3042
352
352
  ansible/modules/wait_for.py,sha256=VXFFcYG88EJVXnrJfa0fzh9rD_2luSty__qdzRuTAQE,27322
353
353
  ansible/modules/wait_for_connection.py,sha256=8ySz5bhK7LGSaT_7Jzk3jvACcnngyR2g_ziyFLKk6Rk,3367
@@ -371,7 +371,7 @@ ansible/parsing/yaml/loader.py,sha256=S3sAX3n2e62yPf0vioedaH5Zxn0Yhypnzh2H2dowte
371
371
  ansible/parsing/yaml/objects.py,sha256=PQHwPCp-K6-Ad_ytO8NCzogowCFodYd4i5Id_GbIM5o,10456
372
372
  ansible/playbook/__init__.py,sha256=Gm8oIkn9z9zSBLYXVJiPcXnfLjk1lJXuHP3vRJdQF5U,4740
373
373
  ansible/playbook/attribute.py,sha256=dMrZEhRqwZPU2TbWnEtO3_9tglbO3CEidbVjd7YgluQ,7649
374
- ansible/playbook/base.py,sha256=sU2aEIHXQjsjo_MrMI9IwazzBlY1_o6P13lYYrN3c7k,33634
374
+ ansible/playbook/base.py,sha256=t_A35l6DLJmJHqAUm1SDFh1_JISaEwD3R8XDur7_y4w,33522
375
375
  ansible/playbook/block.py,sha256=ZQgbwzqh6QcxKbjQkWtVII-kSiWeAMPlIh_U75H-TD0,16515
376
376
  ansible/playbook/collectionsearch.py,sha256=tJN4E9m8dRc_6UNki21htiitiVOMj8T4GR1RCArRMqI,2601
377
377
  ansible/playbook/conditional.py,sha256=yqv1fjQEr01myNW7lejWKfCl496IEtvsIUoJ3-eU_XU,4882
@@ -405,14 +405,14 @@ ansible/plugins/action/async_status.py,sha256=Cv6dLt94Z6YIPZpPIDhS_yC7yqKtT13HyD
405
405
  ansible/plugins/action/command.py,sha256=N09Vf2QypBMZ6NSptQGbf6EAN-kfqLCROGPkOSgV3SY,1069
406
406
  ansible/plugins/action/copy.py,sha256=5gEcEtSkZ3FXljZY9lldsS_g6e1DgAyEXTgHjNnlvn0,27446
407
407
  ansible/plugins/action/debug.py,sha256=vPmHIfMAbuqpHb2aq0QS7M_g7Fu5pFTwMoYjCKCAa2E,3472
408
- ansible/plugins/action/dnf.py,sha256=GdqJh2FHyer8SXiwrKW7dyg4cQwlDF8sfvnL7RaLnsw,3588
408
+ ansible/plugins/action/dnf.py,sha256=N10UXOlFgqzwQgoQfzlqpXIAgHB69OZvfwoC-m2-geM,3667
409
409
  ansible/plugins/action/fail.py,sha256=_1JuS0Z8Y8EB4FKG1u7KdP6xMuLobRHJsmtzmvN2CkU,1457
410
410
  ansible/plugins/action/fetch.py,sha256=cQAmUWEGMDjfVfHGviNtsT4i06rnoubL3EgrOlUZbLw,10188
411
411
  ansible/plugins/action/gather_facts.py,sha256=JFkrn3_78A7eUw0I3DsfUoe3Pu3wVLkhLUiOJ7Oyk0A,7863
412
412
  ansible/plugins/action/group_by.py,sha256=97d4TF9o7vS5y0s1HfGgvh70l2gkQ2uUGxy0knlok5Y,1894
413
- ansible/plugins/action/include_vars.py,sha256=XnX2mgcZpK4NHn7Bktc8IUjzRkVbjA4xHsiJ_vap9U0,11525
413
+ ansible/plugins/action/include_vars.py,sha256=_xPrP_BeGqbhvpJYQFDUkREL9UzZ6Y4q_AnCshvsn1A,11573
414
414
  ansible/plugins/action/normal.py,sha256=cCHrZ3z2kB_wnnSNkmJHJWcJNRgdoxnLUNeHex-P8DE,1854
415
- ansible/plugins/action/package.py,sha256=pEQ9Wg6Ik3-7nazy1pawlECdKa7-PjMC9xfRzqovvlg,4883
415
+ ansible/plugins/action/package.py,sha256=UWk7T-hG6GoqixgUzz1iDT16hUQ2-bM26IZ-w52xoS4,5014
416
416
  ansible/plugins/action/pause.py,sha256=A_U8FhGeFdaOXUadEM-Mv42v9lwsjnxPOE7ExvEfl1s,5674
417
417
  ansible/plugins/action/raw.py,sha256=4kmANddcBwXFRhu8zIwBu392QE-p7WReO4DWD1YDnGU,1762
418
418
  ansible/plugins/action/reboot.py,sha256=EFTn8KtawFI4E38COh55_ygDe0vkpI_vMdHDNBKB5ao,22032
@@ -530,7 +530,7 @@ ansible/plugins/filter/to_uuid.yml,sha256=bUQBkaXfpLXVmF6RbGG12FI7RNO01bWjIPhhdz
530
530
  ansible/plugins/filter/to_yaml.yml,sha256=F4f1WmvPNrBtgG7JzrvW7WNP-uml_f_tAj7RXITSPtM,1672
531
531
  ansible/plugins/filter/type_debug.yml,sha256=xrs13AsR9lV9hRmqsUg4U6zApJpYGCMspUI3or2AdYk,508
532
532
  ansible/plugins/filter/union.yml,sha256=qBIbwRisbsImGixrLj6YDYXJSUGziZkjt_4aJsbhcj0,1018
533
- ansible/plugins/filter/unique.yml,sha256=ZII1RymJplBWxzNOXmpDltqfAvhi8EEbLy0hIrNNzgo,839
533
+ ansible/plugins/filter/unique.yml,sha256=aip4HWd5ZCgg7wYFB6CUqLK0ldrY7qd2Wb_MlTtee3M,1592
534
534
  ansible/plugins/filter/unvault.yml,sha256=GBpNWkLs5sg66PHmrEAR_NsMphuxsWm8dgeVUchbZPI,1069
535
535
  ansible/plugins/filter/urldecode.yml,sha256=zPEvZ6HGc59figLfFMJHISqKCgR1ymdsNYe_nZjTJ_k,716
536
536
  ansible/plugins/filter/urls.py,sha256=b2Zmy1iQuDc4ybU4QqRRAw2HL5xeG5D2kQrT2bybiPM,457
@@ -583,11 +583,11 @@ ansible/plugins/shell/__init__.py,sha256=8pc3ab91OGbnvzk3oQ-sU8uXMXNoNbjtdCbdXmZ
583
583
  ansible/plugins/shell/cmd.py,sha256=kPCSKrJJFH5XTkmteEI3P1Da6WfPSXxDnV39VFpgD-A,2170
584
584
  ansible/plugins/shell/powershell.py,sha256=-AR5n5Yr2HPM-V5ogAwvLeLehfc1XrrhqmX85ZtXHFU,13134
585
585
  ansible/plugins/shell/sh.py,sha256=wblaY2EGdA2O00gNuTVZVgVV08RH0e_g4V_AkE50Iws,3884
586
- ansible/plugins/strategy/__init__.py,sha256=VxNZVwRV8oUmgTR1EoP20oFQ_HGRLKL0anMpixuenKs,57435
586
+ ansible/plugins/strategy/__init__.py,sha256=v-aMyfOUmBSULxmtqxwMCb8Uu_VKdM6XcpAtepAkKG4,57493
587
587
  ansible/plugins/strategy/debug.py,sha256=yMmfT-lQHfR2y9bQcqrSPzqHuWZMo7V9y4ZWOXoboRE,1205
588
588
  ansible/plugins/strategy/free.py,sha256=WNrpfg2B8fVcYC5qvBhn4uEH0Cc1-UmFzBH6Hhs3u_I,16728
589
589
  ansible/plugins/strategy/host_pinned.py,sha256=GrDDQCtohmmJn3t9VOPb0lUZK_nUWy0s__z5Tq_rHfI,1875
590
- ansible/plugins/strategy/linear.py,sha256=no9JgVrgqoN3SphXE38y3DTK1P9FpB48Qn21ro2qFZU,18394
590
+ ansible/plugins/strategy/linear.py,sha256=syZPVmCr2hlHBAzdpUtoajIz4Zs3ycXzcvlUGyQl5_0,17997
591
591
  ansible/plugins/terminal/__init__.py,sha256=EqeJpMokRzuUMO66yYErPSyninjqNX0_5r55CEkTc4o,4420
592
592
  ansible/plugins/test/__init__.py,sha256=m-XTUgWU-qSLJoZvHN3A85igElMjhaBJrzCTDrU7zhs,418
593
593
  ansible/plugins/test/abs.yml,sha256=lZA0XP1oBNg___Du6SqNOkDeQC9xIcZpROYV5XJG9bg,764
@@ -657,7 +657,7 @@ ansible/utils/context_objects.py,sha256=vYulSJkzR3zxsQF_6_AqbPCCMy8WGC5dSqLFXJZq
657
657
  ansible/utils/display.py,sha256=PlgOUgJRZAcbV4rXtHQaLZcgql5wmaDammItkWs4oPU,32856
658
658
  ansible/utils/encrypt.py,sha256=MU0teLATt7qtTwk-y809H5HApafSl2QMW1INWIUL3T4,7221
659
659
  ansible/utils/fqcn.py,sha256=Jx5SwYzlbMZ-SlkjyKkM4pCe5jIyXeeo62BU1msUunU,1215
660
- ansible/utils/galaxy.py,sha256=wQ3s8Mr7Ib0C2ou1SloA76ZOraJr48ADZZf_6vaNYdg,3830
660
+ ansible/utils/galaxy.py,sha256=Un3XgXhx8FoC6tkp1cZ33rmiAaRg634exKruwOVhtdQ,3855
661
661
  ansible/utils/hashing.py,sha256=RKJSXjZ5dgnTdqC4NOqOKYm_r7F4vw5ToW9YgxIt8QU,2837
662
662
  ansible/utils/helpers.py,sha256=GECErEAio6-mOcUrMtPWRvegTNfCBToBdmHXrGXYBbc,1759
663
663
  ansible/utils/jsonrpc.py,sha256=NyVItx9-ppCCsnn856VGoeSeRdu--e8ieZ6WzrD-4CI,3806
@@ -690,7 +690,7 @@ ansible/vars/reserved.py,sha256=kZiQMPvaFin35006gLwDpX16w-9xlu6EaL4LSTKP40U,2531
690
690
  ansible_test/__init__.py,sha256=20VPOj11c6Ut1Av9RaurgwJvFhMqkWG3vAvcCbecNKw,66
691
691
  ansible_test/_data/ansible.cfg,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
692
692
  ansible_test/_data/coveragerc,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
693
- ansible_test/_data/completion/docker.txt,sha256=ajUmmq2mQkUfRhb78nKKZ84dYLQz7FKxmYopBZozj0A,648
693
+ ansible_test/_data/completion/docker.txt,sha256=Z5pvUK4XUkJV5qBW8QuBPk8BzuEnvYFQU7W_ULwycGE,648
694
694
  ansible_test/_data/completion/network.txt,sha256=BxVN0UxlVkRUrPi9MBArQOe6nR8exaow0oCAznUdfKQ,100
695
695
  ansible_test/_data/completion/remote.txt,sha256=qnV9FcKHL9hETVB3iVMoSX_Lo560bN_9MrpAMotuxV4,921
696
696
  ansible_test/_data/completion/windows.txt,sha256=T67veSrF2tqHC1W6Ddsq3LCBwMCBUmp9LoZBy1QlXOo,238
@@ -725,7 +725,7 @@ ansible_test/_data/requirements/sanity.pep8.in,sha256=rHbIEiXmvsJ016mFcLVcF_d-dK
725
725
  ansible_test/_data/requirements/sanity.pep8.txt,sha256=oH7ycSz_RCrlX0J7_Y0GHn8P3g76rlkdxVmq4jmRwY4,113
726
726
  ansible_test/_data/requirements/sanity.pslint.ps1,sha256=JoDUUNLXQ4xDXUB5_W00q9o-gZ1oW1oShLp--f5OEIE,1624
727
727
  ansible_test/_data/requirements/sanity.pylint.in,sha256=CqgyF_s4K3o41RSc6KZVicBlhrb4twRm9zbp-HBwFeE,49
728
- ansible_test/_data/requirements/sanity.pylint.txt,sha256=eng3SJZb0zmRPfnbyrftWeM1UB4vWW_KaO8je9K9kxI,216
728
+ ansible_test/_data/requirements/sanity.pylint.txt,sha256=HoN0oqhHfFAWFNRf0dVAW9D30dBd4ebuPJGAJ-WwPmk,216
729
729
  ansible_test/_data/requirements/sanity.runtime-metadata.in,sha256=QzOCB5QxVHYuXHXQvkUsa5MwRQzPhI-ZDD-M2htj36s,18
730
730
  ansible_test/_data/requirements/sanity.runtime-metadata.txt,sha256=ZTrFKxqX5TCmxWv-jXBz1S0RpOOfIyGmUsNNA9AdQ9A,150
731
731
  ansible_test/_data/requirements/sanity.validate-modules.in,sha256=OVQi9h1QurdF-wa3-TkBuztXIs-QnyY2g8iYtOpo2cw,117
@@ -751,8 +751,8 @@ ansible_test/_internal/coverage_util.py,sha256=_SPR0sqkgPoGw2bzuRS5gr4XOyIU8MQ4a
751
751
  ansible_test/_internal/data.py,sha256=OFDpRa47yqBqQO1aSvTZVQQpScHvBHsr861586MQEUI,11184
752
752
  ansible_test/_internal/delegation.py,sha256=D8hluDQf_YN3DtVG_8HW0iumRBY3gjp_zP-rlc3VNY4,13418
753
753
  ansible_test/_internal/diff.py,sha256=qfzSL7BtoW7bLLgzF0-m--jthVDpUQSr9aBw1fCMIHk,7310
754
- ansible_test/_internal/docker_util.py,sha256=hIcb3EdzJVrFWhCHXLtGnhcZTxnqQCA8hdqCMQMuvYE,37901
755
- ansible_test/_internal/encoding.py,sha256=E61EfXbQw0uQoFhbN3SYx3Oy_1tAMCPAAvY9hkEcSSo,1367
754
+ ansible_test/_internal/docker_util.py,sha256=laK-q6qdKYBuOO5oVpgfBiD_XJzCpmgFC68YAYCiBHQ,38220
755
+ ansible_test/_internal/encoding.py,sha256=4GAcVhcswUJW77XSBTLRIP7ll6kT9J-yIBtVsFXiw2g,1379
756
756
  ansible_test/_internal/executor.py,sha256=KW5yI-f-giErQ077MTj707fTtFkf_Kr8IV_Nr36NNmc,2959
757
757
  ansible_test/_internal/git.py,sha256=njtciWq2DlzZ1DAkQi08HRRP-TgH0mgeGZsWcsJGctI,4366
758
758
  ansible_test/_internal/host_configs.py,sha256=ElAo2t3kSyb7bShqBENiHH0oEe-8Am8JXG9xY5l7HY4,18634
@@ -773,7 +773,7 @@ ansible_test/_internal/target.py,sha256=Whtb_n0jn4zbiMmX7je5jewgzsRczfXRm_ndYtjT
773
773
  ansible_test/_internal/test.py,sha256=znQmGjKACqDU8T0EAPqcv2qyy0J7M2w4OmyYhwHLqT0,14515
774
774
  ansible_test/_internal/thread.py,sha256=WQoZ2q2ljmEkKHRDkIqwxW7eZbkCKDrG3YZfcaxHzHw,2596
775
775
  ansible_test/_internal/timeout.py,sha256=X8LxoMSU85lw4MszfEljaG6V7Aff4Btveg3r89Fe25U,4052
776
- ansible_test/_internal/util.py,sha256=oPHyIw0Q5ucOFOZXU2Jnkgrrhx4-bKyVPsH-uQWZvRU,38643
776
+ ansible_test/_internal/util.py,sha256=iv1RD99PvhMixH0wxinwqkaM0POv-zrVxwbkbruHEDI,38868
777
777
  ansible_test/_internal/util_common.py,sha256=wSygjQRWlkFNpqQnPSSXnz_3Cr0pWrPvCP-6lMdfuAk,17490
778
778
  ansible_test/_internal/venv.py,sha256=k7L9_Ocpsdwp4kQFLF59BVguymd2nqJ-bLHH1NlMET0,5521
779
779
  ansible_test/_internal/ci/__init__.py,sha256=QOaC_8_wUzqFEbsFCXYAnElWoUo6gB40CXvP9RJ-Iyo,7738
@@ -925,13 +925,13 @@ ansible_test/_util/controller/sanity/integration-aliases/yaml_to_json.py,sha256=
925
925
  ansible_test/_util/controller/sanity/pep8/current-ignore.txt,sha256=9VSaFOsdxN4_8GJVhnmpl5kXos2TPU3M08eC_NRI2Ks,196
926
926
  ansible_test/_util/controller/sanity/pslint/pslint.ps1,sha256=h0fLdkwF7JhGGjApvqAsCU87BKy0E_UiFJ_O7MARz6U,1089
927
927
  ansible_test/_util/controller/sanity/pslint/settings.psd1,sha256=QJnOH39HTVkJbPhhVo29olmQ_ftvzYpNa8uQ-figgws,1869
928
- ansible_test/_util/controller/sanity/pylint/config/ansible-test-target.cfg,sha256=Kcn-gmpU2JK-KJke_CGGylgmsCxc-q3OCVLjP4ZPeS0,1766
929
- ansible_test/_util/controller/sanity/pylint/config/ansible-test.cfg,sha256=vJ0MdtRw0uO_51xza4mDii58THzi5ulIkvZP7dBn8Hg,1830
930
- ansible_test/_util/controller/sanity/pylint/config/code-smell.cfg,sha256=SFagBkyV65ZrK28BXBi58aP-qsTM_YFuX7a1WNPB_4I,1602
931
- ansible_test/_util/controller/sanity/pylint/config/collection.cfg,sha256=ddx8OaYJBKmzHMezQT7XWfZS37tI3CtPWtUoKrXsxRw,4410
932
- ansible_test/_util/controller/sanity/pylint/config/default.cfg,sha256=Oo0JGb6dHvm4ba8d-2vUpF032Nd_aoJkyA2vuYj4xyk,3916
928
+ ansible_test/_util/controller/sanity/pylint/config/ansible-test-target.cfg,sha256=D-p9gji_fJQRiWiI4Hxm5xoPbt4L9WKa3oj0J0naBPQ,2036
929
+ ansible_test/_util/controller/sanity/pylint/config/ansible-test.cfg,sha256=awNl5xOX76hgqu4B7rIZZ4rkIfVN7I3ultwsRpnHtRs,2100
930
+ ansible_test/_util/controller/sanity/pylint/config/code-smell.cfg,sha256=iZUVNd9h0GOQcaqpvaHBrjRdsKzSgIwqZrxsanqPFyY,1872
931
+ ansible_test/_util/controller/sanity/pylint/config/collection.cfg,sha256=s6Ls4YnyMXzNOGWcTnUM1Zh03kL8EgSC-w5yjyw53mw,4680
932
+ ansible_test/_util/controller/sanity/pylint/config/default.cfg,sha256=xW5e7oIxI1gl1gHw7NUV2I3VZJ99x4v-IHxa1YoD5qE,4186
933
933
  ansible_test/_util/controller/sanity/pylint/plugins/deprecated.py,sha256=-tt6FknJaM_SjNKB0FXBofYsO8bESTLd1BlM199csxM,18008
934
- ansible_test/_util/controller/sanity/pylint/plugins/hide_unraisable.py,sha256=HU4zOeVgNcr_xtz9f7OFSCiT9gB2oRC1Nc8v-5CSk4E,894
934
+ ansible_test/_util/controller/sanity/pylint/plugins/hide_unraisable.py,sha256=Fua0oKX3ONMELx4UrmWDJOx-KBP9ZkvuSq-EgqHedtE,835
935
935
  ansible_test/_util/controller/sanity/pylint/plugins/string_format.py,sha256=hAX_9P0VR5ngilRKxN5NOgS4vJmoeGCgLJ2mMI8IliA,2626
936
936
  ansible_test/_util/controller/sanity/pylint/plugins/unwanted.py,sha256=9ZS9CiTARriKsHw807pO4Wp9FGg01xQqWJXwD9MeiJ8,9061
937
937
  ansible_test/_util/controller/sanity/shellcheck/exclude.txt,sha256=8U3ZTe1A1YRCXUB1AIAIgcd33ejBhzelBPkVdOJnhj8,21
@@ -963,7 +963,7 @@ ansible_test/_util/target/setup/bootstrap.sh,sha256=QjJcNCUBRMeBaYwQtO1Ue8Om79AN
963
963
  ansible_test/_util/target/setup/check_systemd_cgroup_v1.sh,sha256=Aq0T62x_KLtkGaWzYqWjvhchTqYFflrTbQET3h6xrT0,395
964
964
  ansible_test/_util/target/setup/probe_cgroups.py,sha256=wUHvjW_GXpcyMGw308w26T09cOtBW5EU7i9WagGDQ7o,659
965
965
  ansible_test/_util/target/setup/quiet_pip.py,sha256=d3bvh9k2XI_z8-vb3ZoI4lwL8LaFkwvjJE7PpApBlcw,1979
966
- ansible_test/_util/target/setup/requirements.py,sha256=SV1VetcmvfrZ0dXMdkLmRty5lBYc8mkfGF_EaTd4_Ho,13686
966
+ ansible_test/_util/target/setup/requirements.py,sha256=PHiCVcdharSp0zKUMO1L_o7JWkRt871neWaXp35guws,13698
967
967
  ansible_test/_util/target/tools/virtualenvcheck.py,sha256=GvSiTu41y9exgrGw_pfgB46XClxLOIv5S3tP7XDY50c,465
968
968
  ansible_test/_util/target/tools/yamlcheck.py,sha256=3pUXIByD4lKdHmKgC8sKvPWiDGhan9lij6dCwPoFqEc,311
969
969
  ansible_test/config/cloud-config-aws.ini.template,sha256=XRzB9pG9aRS_fxLMcOcbyb9NeUHpcTZVXvceIl2GNy8,1280
@@ -980,13 +980,13 @@ ansible_test/config/cloud-config-vultr.ini.template,sha256=XLKHk3lg_8ReQMdWfZzhh
980
980
  ansible_test/config/config.yml,sha256=1zdGucnIl6nIecZA7ISIANvqXiHWqq6Dthsk_6MUwNc,2642
981
981
  ansible_test/config/inventory.networking.template,sha256=bFNSk8zNQOaZ_twaflrY0XZ9mLwUbRLuNT0BdIFwvn4,1335
982
982
  ansible_test/config/inventory.winrm.template,sha256=1QU8W-GFLnYEw8yY9bVIvUAVvJYPM3hyoijf6-M7T00,1098
983
- ansible_core-2.18.0b1.dist-info/Apache-License.txt,sha256=y16Ofl9KOYjhBjwULGDcLfdWBfTEZRXnduOspt-XbhQ,11325
984
- ansible_core-2.18.0b1.dist-info/COPYING,sha256=OXLcl0T2SZ8Pmy2_dmlvKuetivmyPd5m1q-Gyd-zaYY,35149
985
- ansible_core-2.18.0b1.dist-info/METADATA,sha256=zq4ShfYDP4pNVPtY8drvX0d0HkEus44bALknZixpp7A,7673
986
- ansible_core-2.18.0b1.dist-info/MIT-license.txt,sha256=jLXp2XurnyZKbye40g9tfmLGtVlxh3pPD4n8xNqX8xc,1023
987
- ansible_core-2.18.0b1.dist-info/PSF-license.txt,sha256=g7BC_H1qyg8Q1o5F76Vrm8ChSWYI5-dyj-CdGlNKBUo,2484
988
- ansible_core-2.18.0b1.dist-info/WHEEL,sha256=GV9aMThwP_4oNCtvEC2ec3qUYutgWeAzklro_0m4WJQ,91
989
- ansible_core-2.18.0b1.dist-info/entry_points.txt,sha256=S9yJij5Im6FgRQxzkqSCnPQokC7PcWrDW_NSygZczJU,451
990
- ansible_core-2.18.0b1.dist-info/simplified_bsd.txt,sha256=8R5R7R7sOa0h1Fi6RNgFgHowHBfun-OVOMzJ4rKAk2w,1237
991
- ansible_core-2.18.0b1.dist-info/top_level.txt,sha256=IFbRLjAvih1DYzJWg3_F6t4sCzEMxRO7TOMNs6GkYHo,21
992
- ansible_core-2.18.0b1.dist-info/RECORD,,
983
+ ansible_core-2.18.0rc2.dist-info/Apache-License.txt,sha256=y16Ofl9KOYjhBjwULGDcLfdWBfTEZRXnduOspt-XbhQ,11325
984
+ ansible_core-2.18.0rc2.dist-info/COPYING,sha256=OXLcl0T2SZ8Pmy2_dmlvKuetivmyPd5m1q-Gyd-zaYY,35149
985
+ ansible_core-2.18.0rc2.dist-info/METADATA,sha256=yJz_cgLahyCU3CiI1tgxw-XLtVulnaw8B87804oNu_s,7674
986
+ ansible_core-2.18.0rc2.dist-info/MIT-license.txt,sha256=jLXp2XurnyZKbye40g9tfmLGtVlxh3pPD4n8xNqX8xc,1023
987
+ ansible_core-2.18.0rc2.dist-info/PSF-license.txt,sha256=g7BC_H1qyg8Q1o5F76Vrm8ChSWYI5-dyj-CdGlNKBUo,2484
988
+ ansible_core-2.18.0rc2.dist-info/WHEEL,sha256=P9jw-gEje8ByB7_hXoICnHtVCrEwMQh-630tKvQWehc,91
989
+ ansible_core-2.18.0rc2.dist-info/entry_points.txt,sha256=S9yJij5Im6FgRQxzkqSCnPQokC7PcWrDW_NSygZczJU,451
990
+ ansible_core-2.18.0rc2.dist-info/simplified_bsd.txt,sha256=8R5R7R7sOa0h1Fi6RNgFgHowHBfun-OVOMzJ4rKAk2w,1237
991
+ ansible_core-2.18.0rc2.dist-info/top_level.txt,sha256=IFbRLjAvih1DYzJWg3_F6t4sCzEMxRO7TOMNs6GkYHo,21
992
+ ansible_core-2.18.0rc2.dist-info/RECORD,,
@@ -1,5 +1,5 @@
1
1
  Wheel-Version: 1.0
2
- Generator: setuptools (75.1.0)
2
+ Generator: setuptools (75.3.0)
3
3
  Root-Is-Purelib: true
4
4
  Tag: py3-none-any
5
5
 
@@ -1,6 +1,6 @@
1
- base image=quay.io/ansible/base-test-container:7.5.0 python=3.12,3.8,3.9,3.10,3.11,3.13
2
- default image=quay.io/ansible/default-test-container:10.5.0 python=3.12,3.8,3.9,3.10,3.11,3.13 context=collection
3
- default image=quay.io/ansible/ansible-core-test-container:10.5.0 python=3.12,3.8,3.9,3.10,3.11,3.13 context=ansible-core
1
+ base image=quay.io/ansible/base-test-container:7.7.0 python=3.13,3.8,3.9,3.10,3.11,3.12
2
+ default image=quay.io/ansible/default-test-container:10.9.0 python=3.13,3.8,3.9,3.10,3.11,3.12 context=collection
3
+ default image=quay.io/ansible/ansible-core-test-container:10.9.0 python=3.13,3.8,3.9,3.10,3.11,3.12 context=ansible-core
4
4
  alpine320 image=quay.io/ansible/alpine320-test-container:8.1.0 python=3.12 cgroup=none audit=none
5
5
  fedora40 image=quay.io/ansible/fedora40-test-container:8.1.0 python=3.12
6
6
  ubuntu2204 image=quay.io/ansible/ubuntu2204-test-container:8.1.0 python=3.10
@@ -1,9 +1,9 @@
1
1
  # edit "sanity.pylint.in" and generate with: hacking/update-sanity-requirements.py --test pylint
2
- astroid==3.2.4
3
- dill==0.3.8
2
+ astroid==3.3.5
3
+ dill==0.3.9
4
4
  isort==5.13.2
5
5
  mccabe==0.7.0
6
- platformdirs==4.3.2
7
- pylint==3.2.7
6
+ platformdirs==4.3.6
7
+ pylint==3.3.1
8
8
  PyYAML==6.0.2
9
9
  tomlkit==0.13.2
@@ -20,6 +20,8 @@ from .util import (
20
20
  SubprocessError,
21
21
  cache,
22
22
  OutputStream,
23
+ InternalError,
24
+ format_command_output,
23
25
  )
24
26
 
25
27
  from .util_common import (
@@ -300,7 +302,7 @@ def detect_host_properties(args: CommonConfig) -> ContainerHostProperties:
300
302
  options = ['--volume', '/sys/fs/cgroup:/probe:ro']
301
303
  cmd = ['sh', '-c', ' && echo "-" && '.join(multi_line_commands)]
302
304
 
303
- stdout = run_utility_container(args, 'ansible-test-probe', cmd, options)[0]
305
+ stdout, stderr = run_utility_container(args, 'ansible-test-probe', cmd, options)
304
306
 
305
307
  if args.explain:
306
308
  return ContainerHostProperties(
@@ -313,6 +315,12 @@ def detect_host_properties(args: CommonConfig) -> ContainerHostProperties:
313
315
 
314
316
  blocks = stdout.split('\n-\n')
315
317
 
318
+ if len(blocks) != len(multi_line_commands):
319
+ message = f'Unexpected probe output. Expected {len(multi_line_commands)} blocks but found {len(blocks)}.\n'
320
+ message += format_command_output(stdout, stderr)
321
+
322
+ raise InternalError(message.strip())
323
+
316
324
  values = blocks[0].split('\n')
317
325
 
318
326
  audit_parts = values[0].split(' ', 1)
@@ -6,17 +6,17 @@ import typing as t
6
6
  ENCODING = 'utf-8'
7
7
 
8
8
 
9
- def to_optional_bytes(value: t.Optional[t.AnyStr], errors: str = 'strict') -> t.Optional[bytes]:
9
+ def to_optional_bytes(value: t.Optional[str | bytes], errors: str = 'strict') -> t.Optional[bytes]:
10
10
  """Return the given value as bytes encoded using UTF-8 if not already bytes, or None if the value is None."""
11
11
  return None if value is None else to_bytes(value, errors)
12
12
 
13
13
 
14
- def to_optional_text(value: t.Optional[t.AnyStr], errors: str = 'strict') -> t.Optional[str]:
14
+ def to_optional_text(value: t.Optional[str | bytes], errors: str = 'strict') -> t.Optional[str]:
15
15
  """Return the given value as text decoded using UTF-8 if not already text, or None if the value is None."""
16
16
  return None if value is None else to_text(value, errors)
17
17
 
18
18
 
19
- def to_bytes(value: t.AnyStr, errors: str = 'strict') -> bytes:
19
+ def to_bytes(value: str | bytes, errors: str = 'strict') -> bytes:
20
20
  """Return the given value as bytes encoded using UTF-8 if not already bytes."""
21
21
  if isinstance(value, bytes):
22
22
  return value
@@ -27,7 +27,7 @@ def to_bytes(value: t.AnyStr, errors: str = 'strict') -> bytes:
27
27
  raise Exception('value is not bytes or text: %s' % type(value))
28
28
 
29
29
 
30
- def to_text(value: t.AnyStr, errors: str = 'strict') -> str:
30
+ def to_text(value: str | bytes, errors: str = 'strict') -> str:
31
31
  """Return the given value as text decoded using UTF-8 if not already text."""
32
32
  if isinstance(value, bytes):
33
33
  return value.decode(ENCODING, errors)
@@ -970,14 +970,7 @@ class SubprocessError(ApplicationError):
970
970
  error_callback: t.Optional[c.Callable[[SubprocessError], None]] = None,
971
971
  ) -> None:
972
972
  message = 'Command "%s" returned exit status %s.\n' % (shlex.join(cmd), status)
973
-
974
- if stderr:
975
- message += '>>> Standard Error\n'
976
- message += '%s%s\n' % (stderr.strip(), Display.clear)
977
-
978
- if stdout:
979
- message += '>>> Standard Output\n'
980
- message += '%s%s\n' % (stdout.strip(), Display.clear)
973
+ message += format_command_output(stdout, stderr)
981
974
 
982
975
  self.cmd = cmd
983
976
  self.message = message
@@ -1021,6 +1014,21 @@ class HostConnectionError(ApplicationError):
1021
1014
  self._callback()
1022
1015
 
1023
1016
 
1017
+ def format_command_output(stdout: str, stderr: str) -> str:
1018
+ """Return a formatted string containing the given stdout and stderr (if any)."""
1019
+ message = ''
1020
+
1021
+ if stderr := stderr.strip():
1022
+ message += '>>> Standard Error\n'
1023
+ message += f'{stderr}{Display.clear}\n'
1024
+
1025
+ if stdout := stdout.strip():
1026
+ message += '>>> Standard Output\n'
1027
+ message += f'{stdout}{Display.clear}\n'
1028
+
1029
+ return message
1030
+
1031
+
1024
1032
  def retry(func: t.Callable[..., TValue], ex_type: t.Type[BaseException] = SubprocessError, sleep: int = 10, attempts: int = 10, warn: bool = True) -> TValue:
1025
1033
  """Retry the specified function on failure."""
1026
1034
  for dummy in range(1, attempts):
@@ -3,6 +3,10 @@
3
3
  disable=
4
4
  consider-using-f-string, # Python 2.x support still required
5
5
  cyclic-import, # consistent results require running with --jobs 1 and testing all files
6
+ deprecated-argument, # results vary by Python version
7
+ deprecated-attribute, # results vary by Python version
8
+ deprecated-class, # results vary by Python version
9
+ deprecated-decorator, # results vary by Python version
6
10
  deprecated-method, # results vary by Python version
7
11
  deprecated-module, # results vary by Python version
8
12
  duplicate-code, # consistent results require running with --jobs 1 and testing all files
@@ -20,6 +24,7 @@ disable=
20
24
  too-many-nested-blocks,
21
25
  too-many-return-statements,
22
26
  too-many-statements,
27
+ too-many-positional-arguments,
23
28
  use-dict-literal, # ignoring as a common style issue
24
29
  useless-return, # complains about returning None when the return type is optional
25
30
 
@@ -3,6 +3,10 @@
3
3
  disable=
4
4
  consider-using-f-string, # many occurrences
5
5
  cyclic-import, # consistent results require running with --jobs 1 and testing all files
6
+ deprecated-argument, # results vary by Python version
7
+ deprecated-attribute, # results vary by Python version
8
+ deprecated-class, # results vary by Python version
9
+ deprecated-decorator, # results vary by Python version
6
10
  deprecated-method, # results vary by Python version
7
11
  deprecated-module, # results vary by Python version
8
12
  duplicate-code, # consistent results require running with --jobs 1 and testing all files
@@ -18,6 +22,7 @@ disable=
18
22
  too-many-nested-blocks,
19
23
  too-many-return-statements,
20
24
  too-many-statements,
25
+ too-many-positional-arguments,
21
26
  use-dict-literal, # ignoring as a common style issue
22
27
  unspecified-encoding, # always run with UTF-8 encoding enforced
23
28
  useless-return, # complains about returning None when the return type is optional
@@ -3,6 +3,10 @@
3
3
  disable=
4
4
  consider-using-f-string, # many occurrences
5
5
  cyclic-import, # consistent results require running with --jobs 1 and testing all files
6
+ deprecated-argument, # results vary by Python version
7
+ deprecated-attribute, # results vary by Python version
8
+ deprecated-class, # results vary by Python version
9
+ deprecated-decorator, # results vary by Python version
6
10
  deprecated-method, # results vary by Python version
7
11
  deprecated-module, # results vary by Python version
8
12
  duplicate-code, # consistent results require running with --jobs 1 and testing all files
@@ -17,6 +21,7 @@ disable=
17
21
  too-many-nested-blocks,
18
22
  too-many-return-statements,
19
23
  too-many-statements,
24
+ too-many-positional-arguments,
20
25
  use-dict-literal, # ignoring as a common style issue
21
26
  unspecified-encoding, # always run with UTF-8 encoding enforced
22
27
  useless-return, # complains about returning None when the return type is optional
@@ -30,7 +30,11 @@ disable=
30
30
  consider-using-max-builtin,
31
31
  consider-using-min-builtin,
32
32
  cyclic-import, # consistent results require running with --jobs 1 and testing all files
33
+ deprecated-argument, # results vary by Python version
34
+ deprecated-attribute, # results vary by Python version
35
+ deprecated-class, # results vary by Python version
33
36
  deprecated-comment, # custom plugin only used by ansible-core, not collections
37
+ deprecated-decorator, # results vary by Python version
34
38
  deprecated-method, # results vary by Python version
35
39
  deprecated-module, # results vary by Python version
36
40
  duplicate-code, # consistent results require running with --jobs 1 and testing all files
@@ -98,6 +102,7 @@ disable=
98
102
  too-many-public-methods,
99
103
  too-many-return-statements,
100
104
  too-many-statements,
105
+ too-many-positional-arguments,
101
106
  try-except-raise,
102
107
  unbalanced-tuple-unpacking,
103
108
  undefined-loop-variable,
@@ -28,6 +28,10 @@ disable=
28
28
  consider-using-max-builtin,
29
29
  consider-using-min-builtin,
30
30
  cyclic-import, # consistent results require running with --jobs 1 and testing all files
31
+ deprecated-argument, # results vary by Python version
32
+ deprecated-attribute, # results vary by Python version
33
+ deprecated-class, # results vary by Python version
34
+ deprecated-decorator, # results vary by Python version
31
35
  deprecated-method, # results vary by Python version
32
36
  deprecated-module, # results vary by Python version
33
37
  duplicate-code, # consistent results require running with --jobs 1 and testing all files
@@ -91,6 +95,7 @@ disable=
91
95
  too-many-public-methods,
92
96
  too-many-return-statements,
93
97
  too-many-statements,
98
+ too-many-positional-arguments,
94
99
  try-except-raise,
95
100
  unbalanced-tuple-unpacking,
96
101
  undefined-loop-variable,
@@ -1,4 +1,4 @@
1
- """Temporary plugin to prevent stdout noise pollution from finalization of abandoned generators under Python 3.12"""
1
+ """Temporary plugin to prevent stdout noise pollution from finalization of abandoned generators."""
2
2
  from __future__ import annotations
3
3
 
4
4
  import sys
@@ -10,7 +10,7 @@ if t.TYPE_CHECKING:
10
10
 
11
11
  def _mask_finalizer_valueerror(ur: t.Any) -> None:
12
12
  """Mask only ValueErrors from finalizing abandoned generators; delegate everything else"""
13
- # work around Py3.12 finalizer changes that sometimes spews this error message to stdout
13
+ # work around Python finalizer issue that sometimes spews this error message to stdout
14
14
  # see https://github.com/pylint-dev/pylint/issues/9138
15
15
  if ur.exc_type is ValueError and 'generator already executing' in str(ur.exc_value):
16
16
  return
@@ -20,5 +20,4 @@ def _mask_finalizer_valueerror(ur: t.Any) -> None:
20
20
 
21
21
  def register(linter: PyLinter) -> None: # pylint: disable=unused-argument
22
22
  """PyLint plugin registration entrypoint"""
23
- if sys.version_info >= (3, 12):
24
- sys.unraisablehook = _mask_finalizer_valueerror
23
+ sys.unraisablehook = _mask_finalizer_valueerror
@@ -363,17 +363,17 @@ def open_binary_file(path, mode='rb'): # type: (str, str) -> t.IO[bytes]
363
363
  return io.open(to_bytes(path), mode) # pylint: disable=consider-using-with,unspecified-encoding
364
364
 
365
365
 
366
- def to_optional_bytes(value, errors='strict'): # type: (t.Optional[t.AnyStr], str) -> t.Optional[bytes]
366
+ def to_optional_bytes(value, errors='strict'): # type: (t.Optional[str | bytes], str) -> t.Optional[bytes]
367
367
  """Return the given value as bytes encoded using UTF-8 if not already bytes, or None if the value is None."""
368
368
  return None if value is None else to_bytes(value, errors)
369
369
 
370
370
 
371
- def to_optional_text(value, errors='strict'): # type: (t.Optional[t.AnyStr], str) -> t.Optional[t.Text]
371
+ def to_optional_text(value, errors='strict'): # type: (t.Optional[str | bytes], str) -> t.Optional[t.Text]
372
372
  """Return the given value as text decoded using UTF-8 if not already text, or None if the value is None."""
373
373
  return None if value is None else to_text(value, errors)
374
374
 
375
375
 
376
- def to_bytes(value, errors='strict'): # type: (t.AnyStr, str) -> bytes
376
+ def to_bytes(value, errors='strict'): # type: (str | bytes, str) -> bytes
377
377
  """Return the given value as bytes encoded using UTF-8 if not already bytes."""
378
378
  if isinstance(value, bytes):
379
379
  return value
@@ -384,7 +384,7 @@ def to_bytes(value, errors='strict'): # type: (t.AnyStr, str) -> bytes
384
384
  raise Exception('value is not bytes or text: %s' % type(value))
385
385
 
386
386
 
387
- def to_text(value, errors='strict'): # type: (t.AnyStr, str) -> t.Text
387
+ def to_text(value, errors='strict'): # type: (str | bytes, str) -> t.Text
388
388
  """Return the given value as text decoded using UTF-8 if not already text."""
389
389
  if isinstance(value, bytes):
390
390
  return value.decode(ENCODING, errors)