From faa364138450fc390906956e2db358387200e19d Mon Sep 17 00:00:00 2001 From: Guido Günther Date: Mon, 3 Oct 2016 11:42:30 +0200 Subject: Python3 (#37) * Handle python3's configparser as well * tests: Open file in text mode to avoid string bytes conversion with Python3 * tests: drop unnecessary dict These arent sortable in Python3 * Convert returned facts to list While Python2 has a list here Python3 returns dict_values which is not indexable as is. * tests: Parse url for comparison Python3 uses hash seeds for comparison so the QS parts dont have a fixed order. * Test python3.4 and python3.5 as well --- .travis.yml | 2 ++ foreman_ansible_inventory.py | 9 +++++++-- tests/test_get_json.py | 43 ++++++++++++++++++++++++++++++------------- tests/test_read_settings.py | 2 +- 4 files changed, 40 insertions(+), 16 deletions(-) diff --git a/.travis.yml b/.travis.yml index 1caed6a..64e3d86 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,6 +1,8 @@ language: python python: - "2.7" + - "3.4" + - "3.5" install: "pip install -r requirements.txt" script: - flake8 diff --git a/foreman_ansible_inventory.py b/foreman_ansible_inventory.py index a77ca5b..d969360 100755 --- a/foreman_ansible_inventory.py +++ b/foreman_ansible_inventory.py @@ -21,7 +21,6 @@ from __future__ import print_function import argparse -import ConfigParser import copy import os import re @@ -30,6 +29,12 @@ from requests.auth import HTTPBasicAuth import sys from time import time +try: + import ConfigParser +except ImportError: + import configparser as ConfigParser + + try: import json except ImportError: @@ -237,7 +242,7 @@ class ForemanInventory(object): if len(ret.values()) == 0: facts = {} elif len(ret.values()) == 1: - facts = ret.values()[0] + facts = list(ret.values())[0] else: raise ValueError("More than one set of facts returned for '%s'" % host) return facts diff --git a/tests/test_get_json.py b/tests/test_get_json.py index d424936..eca8765 100644 --- a/tests/test_get_json.py +++ b/tests/test_get_json.py @@ -2,6 +2,10 @@ import responses import unittest +try: + import urlparse +except ImportError: + from urllib import parse as urlparse from foreman_ansible_inventory import ForemanInventory @@ -14,6 +18,18 @@ class TestGetJson(unittest.TestCase): self.inv.foreman_pw = 'mastter' self.inv.foreman_ssl_verify = True + def assertEqualUrl(self, url1, url2): + p1 = urlparse.urlparse(url1) + p2 = urlparse.urlparse(url2) + q1 = urlparse.parse_qs(p1.query) + q2 = urlparse.parse_qs(p2.query) + self.assertEqual(p1.scheme, p2.scheme) + self.assertEqual(p1.netloc, p2.netloc) + self.assertEqual(p1.path, p2.path) + self.assertEqual(p1.params, p2.params) + self.assertEqual(p1.fragment, p2.fragment) + self.assertEqual(q1, q2) + @responses.activate def test_get_hosts(self): url = 'http://localhost:3000/api/v2/hosts' @@ -25,16 +41,16 @@ class TestGetJson(unittest.TestCase): status=200) ret = self.inv._get_hosts() - self.assertEqual(sorted(ret), - sorted([{u'name': u'foo'}, - {u'name': u'bar'}, - {u'name': u'foo'}, - {u'name': u'bar'}])) + self.assertEqual(ret, + [{u'name': u'foo'}, + {u'name': u'bar'}, + {u'name': u'foo'}, + {u'name': u'bar'}]) self.assertEqual(len(responses.calls), 2) - self.assertEqual(responses.calls[0].request.url, - '%s?per_page=250&page=1' % url) - self.assertEqual(responses.calls[1].request.url, - '%s?per_page=250&page=2' % url) + self.assertEqualUrl(responses.calls[0].request.url, + '%s?per_page=250&page=1' % url) + self.assertEqualUrl(responses.calls[1].request.url, + '%s?per_page=250&page=2' % url) @responses.activate def test_get_facts(self): @@ -52,8 +68,8 @@ class TestGetJson(unittest.TestCase): ret = self.inv._get_facts({'id': 10}) self.assertEqual(ret, {u'fact2': u'val2', u'fact1': u'val1'}) self.assertEqual(len(responses.calls), 1) - self.assertEqual(responses.calls[0].request.url, - '%s?per_page=250&page=1' % url) + self.assertEqualUrl(responses.calls[0].request.url, + '%s?per_page=250&page=1' % url) @responses.activate def test_resolve_params(self): @@ -72,5 +88,6 @@ class TestGetJson(unittest.TestCase): sorted({'param1': 'value1', 'param2': 'value2'}.items())) self.assertEqual(len(responses.calls), 1) - self.assertEqual(responses.calls[0].request.url, - '%s?per_page=250&page=1' % url) + + self.assertEqualUrl(responses.calls[0].request.url, + '%s?per_page=250&page=1' % url) diff --git a/tests/test_read_settings.py b/tests/test_read_settings.py index 65cb0ae..ac97b18 100644 --- a/tests/test_read_settings.py +++ b/tests/test_read_settings.py @@ -20,7 +20,7 @@ class TestReadSettings(unittest.TestCase): self.assertFalse(self.inv.read_settings()) def test_parse_params(self): - with tempfile.NamedTemporaryFile() as t: + with tempfile.NamedTemporaryFile(mode='w+') as t: print(""" [foreman] url=http://127.0.0.1 -- cgit v1.2.3