Commit 61525a97 by Matt Martz

Add regex (search, match, regex) jinja2 filters. Fixes #3725

parent 119b6d73
...@@ -22,6 +22,7 @@ import yaml ...@@ -22,6 +22,7 @@ import yaml
import types import types
import pipes import pipes
import glob import glob
import re
from ansible import errors from ansible import errors
from ansible.utils import md5s from ansible.utils import md5s
...@@ -98,6 +99,27 @@ def fileglob(pathname): ...@@ -98,6 +99,27 @@ def fileglob(pathname):
''' return list of matched files for glob ''' ''' return list of matched files for glob '''
return glob.glob(pathname) return glob.glob(pathname)
def regex(value='', pattern='', ignorecase=False, match_type='search'):
''' Expose `re` as a boolean filter using the `search` method by default.
This is likely only useful for `search` and `match` which already
have their own filters.
'''
if ignorecase:
flags = re.I
else:
flags = 0
_re = re.compile(pattern, flags=flags)
_bool = __builtins__.get('bool')
return _bool(getattr(_re, match_type, 'search')(value))
def match(value, pattern='', ignorecase=False):
''' Perform a `re.match` returning a boolean '''
return regex(value, pattern, ignorecase, 'match')
def search(value, pattern='', ignorecase=False):
''' Perform a `re.search` returning a boolean '''
return regex(value, pattern, ignorecase, 'search')
class FilterModule(object): class FilterModule(object):
''' Ansible core jinja2 filters ''' ''' Ansible core jinja2 filters '''
...@@ -145,5 +167,10 @@ class FilterModule(object): ...@@ -145,5 +167,10 @@ class FilterModule(object):
# file glob # file glob
'fileglob': fileglob, 'fileglob': fileglob,
# regex
'match': match,
'search': search,
'regex': regex,
} }
...@@ -89,6 +89,33 @@ class TestFilters(unittest.TestCase): ...@@ -89,6 +89,33 @@ class TestFilters(unittest.TestCase):
a = ansible.runner.filter_plugins.core.fileglob(pathname) a = ansible.runner.filter_plugins.core.fileglob(pathname)
assert __file__ in a assert __file__ in a
def test_regex(self):
a = ansible.runner.filter_plugins.core.regex('ansible', 'ansible',
match_type='findall')
assert a == True
def test_match_case_sensitive(self):
a = ansible.runner.filter_plugins.core.match('ansible', 'ansible')
assert a == True
def test_match_case_insensitive(self):
a = ansible.runner.filter_plugins.core.match('ANSIBLE', 'ansible',
True)
assert a == True
def test_match_no_match(self):
a = ansible.runner.filter_plugins.core.match(' ansible', 'ansible')
assert a == False
def test_search_case_sensitive(self):
a = ansible.runner.filter_plugins.core.search(' ansible ', 'ansible')
assert a == True
def test_search_case_insensitive(self):
a = ansible.runner.filter_plugins.core.search(' ANSIBLE ', 'ansible',
True)
assert a == True
#def test_filters(self): #def test_filters(self):
# this test is pretty low level using a playbook, hence I am disabling it for now -- MPD. # this test is pretty low level using a playbook, hence I am disabling it for now -- MPD.
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment