mirror of
https://github.com/ansible-collections/community.general.git
synced 2025-04-28 21:31:26 -07:00
Refactor the parameter splitting in ini lookup to handle more path formats (#16477)
Refactor the parameter splitting in ini lookup to handle more path formats. Fixes #16468
This commit is contained in:
parent
3afe50dfe2
commit
4ba60d00c8
2 changed files with 96 additions and 4 deletions
|
@ -19,12 +19,41 @@ __metaclass__ = type
|
||||||
|
|
||||||
from io import StringIO
|
from io import StringIO
|
||||||
import os
|
import os
|
||||||
import ConfigParser
|
|
||||||
import re
|
import re
|
||||||
|
|
||||||
|
try:
|
||||||
|
# python2
|
||||||
|
import ConfigParser as configparser
|
||||||
|
except ImportError:
|
||||||
|
# python3
|
||||||
|
import configparser
|
||||||
|
|
||||||
from ansible.errors import AnsibleError
|
from ansible.errors import AnsibleError
|
||||||
from ansible.plugins.lookup import LookupBase
|
from ansible.plugins.lookup import LookupBase
|
||||||
|
|
||||||
|
|
||||||
|
def _parse_params(term):
|
||||||
|
'''Safely split parameter term to preserve spaces'''
|
||||||
|
|
||||||
|
keys = ['key', 'section', 'file', 're']
|
||||||
|
params = {}
|
||||||
|
for k in keys:
|
||||||
|
params[k] = ''
|
||||||
|
|
||||||
|
thiskey = 'key'
|
||||||
|
for idp,phrase in enumerate(term.split()):
|
||||||
|
for k in keys:
|
||||||
|
if ('%s=' % k) in phrase:
|
||||||
|
thiskey = k
|
||||||
|
if idp == 0 or not params[thiskey]:
|
||||||
|
params[thiskey] = phrase
|
||||||
|
else:
|
||||||
|
params[thiskey] += ' ' + phrase
|
||||||
|
|
||||||
|
rparams = [params[x] for x in keys if params[x]]
|
||||||
|
return rparams
|
||||||
|
|
||||||
|
|
||||||
class LookupModule(LookupBase):
|
class LookupModule(LookupBase):
|
||||||
|
|
||||||
def read_properties(self, filename, key, dflt, is_regexp):
|
def read_properties(self, filename, key, dflt, is_regexp):
|
||||||
|
@ -46,7 +75,7 @@ class LookupModule(LookupBase):
|
||||||
# Retrieve a single value
|
# Retrieve a single value
|
||||||
try:
|
try:
|
||||||
value = self.cp.get(section, key)
|
value = self.cp.get(section, key)
|
||||||
except ConfigParser.NoOptionError:
|
except configparser.NoOptionError:
|
||||||
return dflt
|
return dflt
|
||||||
return value
|
return value
|
||||||
|
|
||||||
|
@ -54,11 +83,11 @@ class LookupModule(LookupBase):
|
||||||
|
|
||||||
basedir = self.get_basedir(variables)
|
basedir = self.get_basedir(variables)
|
||||||
self.basedir = basedir
|
self.basedir = basedir
|
||||||
self.cp = ConfigParser.ConfigParser()
|
self.cp = configparser.ConfigParser()
|
||||||
|
|
||||||
ret = []
|
ret = []
|
||||||
for term in terms:
|
for term in terms:
|
||||||
params = term.split()
|
params = _parse_params(term)
|
||||||
key = params[0]
|
key = params[0]
|
||||||
|
|
||||||
paramvals = {
|
paramvals = {
|
||||||
|
|
63
test/units/plugins/lookup/test_ini.py
Normal file
63
test/units/plugins/lookup/test_ini.py
Normal file
|
@ -0,0 +1,63 @@
|
||||||
|
# -*- coding: utf-8 -*-
|
||||||
|
# (c) 2015, Toshio Kuratomi <tkuratomi@ansible.com>
|
||||||
|
#
|
||||||
|
# This file is part of Ansible
|
||||||
|
#
|
||||||
|
# Ansible is free software: you can redistribute it and/or modify
|
||||||
|
# it under the terms of the GNU General Public License as published by
|
||||||
|
# the Free Software Foundation, either version 3 of the License, or
|
||||||
|
# (at your option) any later version.
|
||||||
|
#
|
||||||
|
# Ansible is distributed in the hope that it will be useful,
|
||||||
|
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
# GNU General Public License for more details.
|
||||||
|
#
|
||||||
|
# You should have received a copy of the GNU General Public License
|
||||||
|
# along with Ansible. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
|
# Make coding more python3-ish
|
||||||
|
from __future__ import (absolute_import, division, print_function)
|
||||||
|
__metaclass__ = type
|
||||||
|
|
||||||
|
from ansible.compat.tests import unittest
|
||||||
|
from ansible.plugins.lookup.ini import _parse_params
|
||||||
|
|
||||||
|
|
||||||
|
class TestINILookup(unittest.TestCase):
|
||||||
|
|
||||||
|
# Currently there isn't a new-style
|
||||||
|
old_style_params_data = (
|
||||||
|
# Simple case
|
||||||
|
dict(term=u'keyA section=sectionA file=/path/to/file',
|
||||||
|
expected=[u'keyA', u'section=sectionA', u'file=/path/to/file'],
|
||||||
|
),
|
||||||
|
dict(term=u'keyB section=sectionB with space file=/path/with/embedded spaces and/file',
|
||||||
|
expected=[u'keyB', u'section=sectionB with space', u'file=/path/with/embedded spaces and/file'],
|
||||||
|
),
|
||||||
|
dict(term=u'keyC section=sectionC file=/path/with/equals/cn=com.ansible',
|
||||||
|
expected=[u'keyC', u'section=sectionC', u'file=/path/with/equals/cn=com.ansible'],
|
||||||
|
),
|
||||||
|
dict(term=u'keyD section=sectionD file=/path/with space and/equals/cn=com.ansible',
|
||||||
|
expected=[u'keyD', u'section=sectionD', u'file=/path/with space and/equals/cn=com.ansible'],
|
||||||
|
),
|
||||||
|
dict(term=u'keyE section=sectionE file=/path/with/unicode/くらとみ/file',
|
||||||
|
expected=[u'keyE', u'section=sectionE', u'file=/path/with/unicode/くらとみ/file'],
|
||||||
|
),
|
||||||
|
dict(term=u'keyF section=sectionF file=/path/with/utf 8 and spaces/くらとみ/file',
|
||||||
|
expected=[u'keyF', u'section=sectionF', u'file=/path/with/utf 8 and spaces/くらとみ/file'],
|
||||||
|
),
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
def setUp(self):
|
||||||
|
pass
|
||||||
|
|
||||||
|
def tearDown(self):
|
||||||
|
pass
|
||||||
|
|
||||||
|
def test_parse_parameters(self):
|
||||||
|
for testcase in self.old_style_params_data:
|
||||||
|
#print(testcase)
|
||||||
|
params = _parse_params(testcase['term'])
|
||||||
|
self.assertEqual(params, testcase['expected'])
|
Loading…
Add table
Add a link
Reference in a new issue