Deprecate tests used as filters (#32361)

* Warn on tests used as filters

* Update docs, add aliases for tests that fit more gramatically with test syntax

* Fix rst formatting

* Add successful filter, alias of success

* Remove renamed_deprecation, it was overkill

* Make directory alias for is_dir

* Update tests to use proper jinja test syntax

* Update additional documentation, living outside of YAML files, to reflect proper jinja test syntax

* Add conversion script, porting guide updates, and changelog updates

* Update newly added uses of tests as filters

* No underscore variable

* Convert recent tests as filter changes to win_stat

* Fix some changes related to rebasing a few integration tests

* Make tests_as_filters_warning explicitly accept the name of the test, instead of inferring the name

* Add test for tests_as_filters_warning

* Update tests as filters in newly added/modified tests

* Address recent changes to several integration tests

* Address recent changes in cs_vpc
This commit is contained in:
Matt Martz 2017-11-27 16:58:08 -06:00 committed by ansibot
commit 4fe08441be
349 changed files with 4086 additions and 3844 deletions

View file

@ -161,7 +161,7 @@ EXAMPLES = r'''
state: absent
register: result
failed_when:
- not result|success
- result is not successful
- "'referenced by one or more applications' not in result.msg"
- name: Configure a service using more complicated parameters

View file

@ -185,7 +185,7 @@ EXAMPLES = '''
state: present
properties:
name: "{{ enterprise_new_name }}-basic"
when: nuage_check_enterprise | failed
when: nuage_check_enterprise is failed
# Creating a User in an Enterprise
- name: Create admin user

View file

@ -60,7 +60,7 @@ EXAMPLES = '''
key_filename: "/tmp/ssh.key"
newpassword: "badpassword"
register: result
until: not result|failed
until: result is not failed
retries: 10
delay: 30
'''

View file

@ -70,7 +70,7 @@ EXAMPLES = '''
ip_address: "192.168.1.1"
password: "admin"
register: result
until: not result|failed
until: result is not failed
retries: 10
delay: 30
'''

View file

@ -110,7 +110,7 @@ EXAMPLES = '''
# - copy:
# dest: /var/www/html/{{ sample_com_challenge['challenge_data']['sample.com']['http-01']['resource'] }}
# content: "{{ sample_com_challenge['challenge_data']['sample.com']['http-01']['resource_value'] }}"
# when: sample_com_challenge|changed
# when: sample_com_challenge is changed
- letsencrypt:
account_key: /etc/pki/cert/private/account.key

View file

@ -30,7 +30,7 @@ from ansible import errors
def failed(result):
''' Test if task result yields failed '''
if not isinstance(result, MutableMapping):
raise errors.AnsibleFilterError("|failed expects a dictionary")
raise errors.AnsibleFilterError("The failed test expects a dictionary")
return result.get('failed', False)
@ -42,7 +42,7 @@ def success(result):
def changed(result):
''' Test if task result yields changed '''
if not isinstance(result, MutableMapping):
raise errors.AnsibleFilterError("|changed expects a dictionary")
raise errors.AnsibleFilterError("The changed test expects a dictionary")
if 'changed' not in result:
changed = False
if (
@ -62,7 +62,7 @@ def changed(result):
def skipped(result):
''' Test if task result yields skipped '''
if not isinstance(result, MutableMapping):
raise errors.AnsibleFilterError("|skipped expects a dictionary")
raise errors.AnsibleFilterError("The skipped test expects a dictionary")
return result.get('skipped', False)
@ -129,6 +129,7 @@ class TestModule(object):
'failure': failed,
'succeeded': success,
'success': success,
'successful': success,
# changed testing
'changed': changed,
@ -145,6 +146,7 @@ class TestModule(object):
# version comparison
'version_compare': version_compare,
'version': version_compare,
# lists
'any': any,

View file

@ -30,13 +30,19 @@ class TestModule(object):
return {
# file testing
'is_dir': isdir,
'directory': isdir,
'is_file': isfile,
'file': isfile,
'is_link': islink,
'link': islink,
'exists': exists,
'link_exists': lexists,
# path testing
'is_abs': isabs,
'abs': isabs,
'is_same_file': samefile,
'same_file': samefile,
'is_mount': ismount,
'mount': ismount,
}

View file

@ -43,6 +43,9 @@ class TestModule:
return {
# set theory
'issubset': issubset,
'subset': issubset,
'issuperset': issuperset,
'superset': issuperset,
'isnan': isnotanumber,
'nan': isnotanumber,
}

View file

@ -27,6 +27,7 @@ import pwd
import re
import time
from functools import wraps
from io import StringIO
from numbers import Number
@ -157,6 +158,26 @@ def _count_newlines_from_end(in_str):
return i
def tests_as_filters_warning(name, func):
'''
Closure to enable displaying a deprecation warning when tests are used as a filter
This closure is only used when registering ansible provided tests as filters
This function should be removed in 2.9 along with registering ansible provided tests as filters
in Templar._get_filters
'''
@wraps(func)
def wrapper(*args, **kwargs):
display.deprecated(
'Using tests as filters is deprecated. Instead of using `result|%(name)s` instead use '
'`result is %(name)s`' % dict(name=name),
version='2.9'
)
return func(*args, **kwargs)
return wrapper
class AnsibleContext(Context):
'''
A custom context, which intercepts resolve() calls and sets a flag
@ -283,7 +304,10 @@ class Templar:
self._filters = dict()
for fp in plugins:
self._filters.update(fp.filters())
self._filters.update(self._get_tests())
# TODO: Remove registering tests as filters in 2.9
for name, func in self._get_tests().items():
self._filters[name] = tests_as_filters_warning(name, func)
return self._filters.copy()