diff --git a/lib/ansible/module_utils/facts.py b/lib/ansible/module_utils/facts.py index e698d780ff..23007e1689 100644 --- a/lib/ansible/module_utils/facts.py +++ b/lib/ansible/module_utils/facts.py @@ -34,7 +34,12 @@ import datetime import getpass import pwd import ConfigParser -import StringIO + +# py2 vs py3; replace with six via ziploader +try: + from StringIO import StringIO +except ImportError: + from io import StringIO from string import maketrans diff --git a/lib/ansible/module_utils/shell.py b/lib/ansible/module_utils/shell.py index b9e798603c..bcb88fa790 100644 --- a/lib/ansible/module_utils/shell.py +++ b/lib/ansible/module_utils/shell.py @@ -19,7 +19,11 @@ import re import socket -from StringIO import StringIO +# py2 vs py3; replace with six via ziploader +try: + from StringIO import StringIO +except ImportError: + from io import StringIO try: import paramiko diff --git a/lib/ansible/plugins/lookup/ini.py b/lib/ansible/plugins/lookup/ini.py index 3adbd2c7d6..0e68816dc3 100644 --- a/lib/ansible/plugins/lookup/ini.py +++ b/lib/ansible/plugins/lookup/ini.py @@ -17,7 +17,7 @@ from __future__ import (absolute_import, division, print_function) __metaclass__ = type -import StringIO +from io import StringIO import os import ConfigParser import re @@ -28,8 +28,8 @@ from ansible.plugins.lookup import LookupBase class LookupModule(LookupBase): def read_properties(self, filename, key, dflt, is_regexp): - config = StringIO.StringIO() - config.write('[java_properties]\n' + open(filename).read()) + config = StringIO() + config.write(u'[java_properties]\n' + open(filename).read()) config.seek(0, os.SEEK_SET) self.cp.readfp(config) return self.get_value(key, 'java_properties', dflt, is_regexp) diff --git a/lib/ansible/template/__init__.py b/lib/ansible/template/__init__.py index edb34bb4be..a7a8ac4a37 100644 --- a/lib/ansible/template/__init__.py +++ b/lib/ansible/template/__init__.py @@ -23,8 +23,9 @@ import ast import contextlib import os import re +from io import StringIO -from ansible.compat.six import string_types, text_type, binary_type, StringIO +from ansible.compat.six import string_types, text_type, binary_type from jinja2 import Environment from jinja2.loaders import FileSystemLoader from jinja2.exceptions import TemplateSyntaxError, UndefinedError diff --git a/test/units/module_utils/basic/test_exit_json.py b/test/units/module_utils/basic/test_exit_json.py index 27bbb0f9e5..7d32c8082f 100644 --- a/test/units/module_utils/basic/test_exit_json.py +++ b/test/units/module_utils/basic/test_exit_json.py @@ -23,9 +23,9 @@ __metaclass__ = type import copy import json import sys +from io import BytesIO from ansible.compat.tests import unittest -from ansible.compat.six import StringIO from ansible.module_utils import basic from ansible.module_utils.basic import heuristic_log_sanitize @@ -41,7 +41,7 @@ class TestAnsibleModuleExitJson(unittest.TestCase): basic.MODULE_COMPLEX_ARGS = '{}' self.old_stdout = sys.stdout - self.fake_stream = StringIO() + self.fake_stream = BytesIO() sys.stdout = self.fake_stream self.module = basic.AnsibleModule(argument_spec=dict()) @@ -127,7 +127,7 @@ class TestAnsibleModuleExitValuesRemoved(unittest.TestCase): def test_exit_json_removes_values(self): self.maxDiff = None for args, return_val, expected in self.dataset: - sys.stdout = StringIO() + sys.stdout = BytesIO() basic.MODULE_COMPLEX_ARGS = json.dumps(args) module = basic.AnsibleModule( argument_spec = dict( @@ -146,7 +146,7 @@ class TestAnsibleModuleExitValuesRemoved(unittest.TestCase): expected = copy.deepcopy(expected) del expected['changed'] expected['failed'] = True - sys.stdout = StringIO() + sys.stdout = BytesIO() basic.MODULE_COMPLEX_ARGS = json.dumps(args) module = basic.AnsibleModule( argument_spec = dict( diff --git a/test/units/module_utils/basic/test_run_command.py b/test/units/module_utils/basic/test_run_command.py index 0db6fbe7b9..191560e961 100644 --- a/test/units/module_utils/basic/test_run_command.py +++ b/test/units/module_utils/basic/test_run_command.py @@ -22,16 +22,16 @@ __metaclass__ = type import errno import sys import time +from io import BytesIO from ansible.compat.tests import unittest -from ansible.compat.six import StringIO, BytesIO from ansible.compat.tests.mock import call, MagicMock, Mock, patch, sentinel from ansible.module_utils import basic from ansible.module_utils.basic import AnsibleModule -class OpenStringIO(StringIO): - """StringIO with dummy close() method +class OpenBytesIO(BytesIO): + """BytesIO with dummy close() method So that you can inspect the content after close() was called. """ @@ -77,7 +77,7 @@ class TestAnsibleModuleRunCommand(unittest.TestCase): self.subprocess = patch('ansible.module_utils.basic.subprocess').start() self.cmd = Mock() self.cmd.returncode = 0 - self.cmd.stdin = OpenStringIO() + self.cmd.stdin = OpenBytesIO() self.cmd.stdout.fileno.return_value = sentinel.stdout self.cmd.stderr.fileno.return_value = sentinel.stderr self.subprocess.Popen.return_value = self.cmd diff --git a/test/units/parsing/yaml/test_loader.py b/test/units/parsing/yaml/test_loader.py index 8fd617eea1..48a60b6c53 100644 --- a/test/units/parsing/yaml/test_loader.py +++ b/test/units/parsing/yaml/test_loader.py @@ -20,8 +20,9 @@ from __future__ import (absolute_import, division, print_function) __metaclass__ = type +from io import StringIO + from six import text_type, binary_type -from six.moves import StringIO from collections import Sequence, Set, Mapping from ansible.compat.tests import unittest @@ -44,7 +45,7 @@ class TestAnsibleLoaderBasic(unittest.TestCase): pass def test_parse_number(self): - stream = StringIO(""" + stream = StringIO(u""" 1 """) loader = AnsibleLoader(stream, 'myfile.yml') @@ -53,7 +54,7 @@ class TestAnsibleLoaderBasic(unittest.TestCase): # No line/column info saved yet def test_parse_string(self): - stream = StringIO(""" + stream = StringIO(u""" Ansible """) loader = AnsibleLoader(stream, 'myfile.yml') @@ -64,7 +65,7 @@ class TestAnsibleLoaderBasic(unittest.TestCase): self.assertEqual(data.ansible_pos, ('myfile.yml', 2, 17)) def test_parse_utf8_string(self): - stream = StringIO(""" + stream = StringIO(u""" Cafè Eñyei """) loader = AnsibleLoader(stream, 'myfile.yml') @@ -75,7 +76,7 @@ class TestAnsibleLoaderBasic(unittest.TestCase): self.assertEqual(data.ansible_pos, ('myfile.yml', 2, 17)) def test_parse_dict(self): - stream = StringIO(""" + stream = StringIO(u""" webster: daniel oed: oxford """) @@ -93,7 +94,7 @@ class TestAnsibleLoaderBasic(unittest.TestCase): self.assertEqual(data[u'oed'].ansible_pos, ('myfile.yml', 3, 22)) def test_parse_list(self): - stream = StringIO(""" + stream = StringIO(u""" - a - b """) @@ -109,7 +110,7 @@ class TestAnsibleLoaderBasic(unittest.TestCase): self.assertEqual(data[1].ansible_pos, ('myfile.yml', 3, 19)) def test_parse_short_dict(self): - stream = StringIO("""{"foo": "bar"}""") + stream = StringIO(u"""{"foo": "bar"}""") loader = AnsibleLoader(stream, 'myfile.yml') data = loader.get_single_data() self.assertEqual(data, dict(foo=u'bar')) @@ -117,7 +118,7 @@ class TestAnsibleLoaderBasic(unittest.TestCase): self.assertEqual(data.ansible_pos, ('myfile.yml', 1, 1)) self.assertEqual(data[u'foo'].ansible_pos, ('myfile.yml', 1, 9)) - stream = StringIO("""foo: bar""") + stream = StringIO(u"""foo: bar""") loader = AnsibleLoader(stream, 'myfile.yml') data = loader.get_single_data() self.assertEqual(data, dict(foo=u'bar')) @@ -126,12 +127,12 @@ class TestAnsibleLoaderBasic(unittest.TestCase): self.assertEqual(data[u'foo'].ansible_pos, ('myfile.yml', 1, 6)) def test_error_conditions(self): - stream = StringIO("""{""") + stream = StringIO(u"""{""") loader = AnsibleLoader(stream, 'myfile.yml') self.assertRaises(ParserError, loader.get_single_data) def test_front_matter(self): - stream = StringIO("""---\nfoo: bar""") + stream = StringIO(u"""---\nfoo: bar""") loader = AnsibleLoader(stream, 'myfile.yml') data = loader.get_single_data() self.assertEqual(data, dict(foo=u'bar')) @@ -140,7 +141,7 @@ class TestAnsibleLoaderBasic(unittest.TestCase): self.assertEqual(data[u'foo'].ansible_pos, ('myfile.yml', 2, 6)) # Initial indent (See: #6348) - stream = StringIO(""" - foo: bar\n baz: qux""") + stream = StringIO(u""" - foo: bar\n baz: qux""") loader = AnsibleLoader(stream, 'myfile.yml') data = loader.get_single_data() self.assertEqual(data, [{u'foo': u'bar', u'baz': u'qux'}]) @@ -154,7 +155,7 @@ class TestAnsibleLoaderBasic(unittest.TestCase): class TestAnsibleLoaderPlay(unittest.TestCase): def setUp(self): - stream = StringIO(""" + stream = StringIO(u""" - hosts: localhost vars: number: 1 diff --git a/test/units/plugins/connections/test_connection.py b/test/units/plugins/connections/test_connection.py index 10fa44216d..370768891d 100644 --- a/test/units/plugins/connections/test_connection.py +++ b/test/units/plugins/connections/test_connection.py @@ -19,7 +19,7 @@ from __future__ import (absolute_import, division, print_function) __metaclass__ = type -from six import StringIO +from io import StringIO from ansible.compat.tests import unittest from ansible.playbook.play_context import PlayContext