1
0
Fork 0
mirror of https://github.com/ansible-collections/community.general.git synced 2024-09-14 20:13:21 +02:00

Merge pull request #12502 from mgedmin/py3k

Python 3: make test_variable_manager_precedence pass
This commit is contained in:
James Cammarata 2015-09-25 03:05:02 -04:00
commit ccddda1ebc
7 changed files with 126 additions and 11 deletions

View file

@ -38,6 +38,12 @@ class Host:
def __eq__(self, other): def __eq__(self, other):
return self.name == other.name return self.name == other.name
def __ne__(self, other):
return not self.__eq__(other)
def __hash__(self):
return hash(self.name)
def serialize(self): def serialize(self):
groups = [] groups = []
for group in self.groups: for group in self.groups:

View file

@ -20,7 +20,6 @@ from __future__ import (absolute_import, division, print_function)
__metaclass__ = type __metaclass__ = type
import ast import ast
import shlex
import re import re
from ansible import constants as C from ansible import constants as C
@ -30,7 +29,8 @@ from ansible.inventory.group import Group
from ansible.inventory.expand_hosts import detect_range from ansible.inventory.expand_hosts import detect_range
from ansible.inventory.expand_hosts import expand_hostname_range from ansible.inventory.expand_hosts import expand_hostname_range
from ansible.parsing.utils.addresses import parse_address from ansible.parsing.utils.addresses import parse_address
from ansible.utils.unicode import to_unicode, to_bytes from ansible.utils.shlex import shlex_split
from ansible.utils.unicode import to_unicode
class InventoryParser(object): class InventoryParser(object):
""" """
@ -231,13 +231,11 @@ class InventoryParser(object):
# beta:2345 user=admin # we'll tell shlex # beta:2345 user=admin # we'll tell shlex
# gamma sudo=True user=root # to ignore comments # gamma sudo=True user=root # to ignore comments
line = to_bytes(line)
try: try:
tokens = shlex.split(line, comments=True) tokens = shlex_split(line, comments=True)
except ValueError as e: except ValueError as e:
self._raise_error("Error parsing host definition '%s': %s" % (varstring, e)) self._raise_error("Error parsing host definition '%s': %s" % (varstring, e))
tokens = [ to_unicode(t) for t in tokens]
(hostnames, port) = self._expand_hostpattern(tokens[0]) (hostnames, port) = self._expand_hostpattern(tokens[0])
hosts = self._Hosts(hostnames, port) hosts = self._Hosts(hostnames, port)

View file

@ -22,7 +22,7 @@ __metaclass__ = type
import ast import ast
import re import re
from six import string_types from six import string_types, text_type, binary_type
from jinja2 import Environment from jinja2 import Environment
from jinja2.loaders import FileSystemLoader from jinja2.loaders import FileSystemLoader
from jinja2.exceptions import TemplateSyntaxError, UndefinedError from jinja2.exceptions import TemplateSyntaxError, UndefinedError
@ -217,10 +217,10 @@ class Templar:
# Don't template unsafe variables, instead drop them back down to # Don't template unsafe variables, instead drop them back down to
# their constituent type. # their constituent type.
if hasattr(variable, '__UNSAFE__'): if hasattr(variable, '__UNSAFE__'):
if isinstance(variable, unicode): if isinstance(variable, text_type):
return unicode(variable) return text_type(variable)
elif isinstance(variable, str): elif isinstance(variable, binary_type):
return str(variable) return bytes(variable)
else: else:
return variable return variable

View file

@ -0,0 +1,33 @@
# (c) 2015, Marius Gedminas <marius@gedmin.as>
#
# 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
# alongwith Ansible. If not, see <http://www.gnu.org/licenses/>.
from __future__ import absolute_import
import shlex
from six import PY3
from ansible.utils.unicode import to_bytes, to_unicode
if PY3:
# shlex.split() wants Unicode (i.e. ``str``) input on Python 3
shlex_split = shlex.split
else:
# shlex.split() wants bytes (i.e. ``str``) input on Python 2
def shlex_split(s, comments=False, posix=True):
return map(to_unicode, shlex.split(to_bytes(s), comments, posix))
shlex_split.__doc__ = shlex.split.__doc__

View file

@ -24,6 +24,7 @@ import os
from collections import defaultdict from collections import defaultdict
from collections import MutableMapping from collections import MutableMapping
from six import iteritems
from jinja2.exceptions import UndefinedError from jinja2.exceptions import UndefinedError
try: try:
@ -312,7 +313,7 @@ class VariableManager:
if self._inventory is not None: if self._inventory is not None:
all_vars['groups'] = dict() all_vars['groups'] = dict()
for (group_name, group) in self._inventory.groups.iteritems(): for (group_name, group) in iteritems(self._inventory.groups):
all_vars['groups'][group_name] = [h.name for h in group.get_hosts()] all_vars['groups'][group_name] = [h.name for h in group.get_hosts()]
if include_hostvars: if include_hostvars:

View file

@ -0,0 +1,38 @@
# Copyright 2015 Marius Gedminas <marius@gedmin.as>
#
# 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/>.
import unittest
from ansible.inventory.host import Host
class TestHost(unittest.TestCase):
def setUp(self):
self.hostA = Host('a')
self.hostB = Host('b')
def test_equality(self):
self.assertEqual(self.hostA, self.hostA)
self.assertNotEqual(self.hostA, self.hostB)
self.assertEqual(self.hostA, Host('a'))
# __ne__ is a separate method
self.assertFalse(self.hostA != Host('a'))
def test_hashability(self):
# equality implies the hash values are the same
self.assertEqual(hash(self.hostA), hash(Host('a')))

View file

@ -0,0 +1,39 @@
# (c) 2015, Marius Gedminas <marius@gedmin.as>
#
# 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/>.
import unittest
from ansible.utils.shlex import shlex_split
class TestSplit(unittest.TestCase):
def test_trivial(self):
self.assertEqual(shlex_split("a b c"), ["a", "b", "c"])
def test_unicode(self):
self.assertEqual(shlex_split(u"a b \u010D"), [u"a", u"b", u"\u010D"])
def test_quoted(self):
self.assertEqual(shlex_split('"a b" c'), ["a b", "c"])
def test_comments(self):
self.assertEqual(shlex_split('"a b" c # d', comments=True), ["a b", "c"])
def test_error(self):
self.assertRaises(ValueError, shlex_split, 'a "b')