diff --git a/opensrs/opensrsapi.py b/opensrs/opensrsapi.py index 8b01202..c093d93 100644 --- a/opensrs/opensrsapi.py +++ b/opensrs/opensrsapi.py @@ -119,16 +119,17 @@ class OpenSRS(object): MSG_ALREADY_RENEWED_SANDBOX = 'Domain Already Renewed' - def __init__(self, host, port, username, private_key, default_timeout): + def __init__(self, host, port, username, private_key, default_timeout, proxy=None): self.host = host self.port = port self.username = username self.private_key = private_key self.default_timeout = default_timeout + self.proxy = proxy def _get_channel(self): return XCPChannel(self.host, self.port, self.username, - self.private_key, self.default_timeout) + self.private_key, self.default_timeout, proxy=self.proxy) def _req(self, action, object, attributes, **kw): msg = XCPMessage(action, object, attributes, **kw) diff --git a/opensrs/xcp.py b/opensrs/xcp.py index a50caaa..6e192c7 100644 --- a/opensrs/xcp.py +++ b/opensrs/xcp.py @@ -1,9 +1,9 @@ import hashlib import logging try: - from urllib.request import urlopen, Request + from urllib.request import urlopen, Request, ProxyHandler, build_opener, install_opener except ImportError: - from urllib2 import urlopen, Request + from urllib2 import urlopen, Request, ProxyHandler, build_opener, install_opener from xml.etree import ElementTree as ET from opensrs.errors import XCPError @@ -87,17 +87,17 @@ def get_data(self, base_node=None): if not ET.iselement(base_node): return base_node if base_node.tag == 'item': - if base_node.getchildren() == []: + if list(base_node) == []: return base_node.text return self.get_data(base_node[0]) if base_node.tag == 'dt_array': indexed_children = [(e.get('key'), e) for e in - base_node.getchildren()] + list(base_node)] indexed_children.sort() return [self.get_data(e) for i, e in indexed_children] if base_node.tag == 'dt_assoc': data = {} - for e in base_node.getchildren(): + for e in list(base_node): data[e.get('key')] = self.get_data(e) return data if base_node.tag == 'dt_scalar': @@ -128,15 +128,20 @@ def sign(self, private_key): class XCPChannel(object): - def __init__(self, host, port, username, private_key, default_timeout): + def __init__(self, host, port, username, private_key, default_timeout, proxy=None): self.host = host self.port = port self.username = username self.private_key = private_key.encode('UTF-8') self.default_timeout = default_timeout + self.proxy = proxy def _make_call(self, message): """All network interaction is isolated here for stubbing out.""" + if self.proxy: + proxy = ProxyHandler(proxies={"https": self.proxy}) + opener = build_opener(proxy) + install_opener(opener) request = Request('https://%s:%s/' % (self.host, self.port)) headers = { 'Content-Type': 'text/xml', @@ -144,7 +149,6 @@ def _make_call(self, message): 'X-Signature': message.sign(self.private_key), } [request.add_header(k, v) for k, v in headers.items()] - timeout = message.timeout or self.default_timeout log.debug('Making XCP call with timeout = %s', timeout) xml = urlopen(request, message.get_content(), timeout).read() diff --git a/requirements.txt b/requirements.txt index 449b60c..aaeac37 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,6 +1,6 @@ -demands == 4.0.0 -flake8 == 2.4.1 -funcsigs < 0.5 -mock < 1.2.0 -nose < 2.0.0 -python-dateutil == 2.5.3 +demands == 5.1.0 +flake8 >= 6.0.0 +mock >= 5.0.0 +pytest >= 7.0.0 +python-dateutil >= 2.8.2 +requests >= 2.31.0 diff --git a/tests/test_opensrsapi.py b/tests/test_opensrsapi.py index d6d6a25..9e2614b 100644 --- a/tests/test_opensrsapi.py +++ b/tests/test_opensrsapi.py @@ -102,8 +102,9 @@ def add_req(self, req, resp): self.requests.append(req) self.responses.append(resp) - def __call__(self, host, port, username, private_key, timeout): + def __call__(self, host, port, username, private_key, timeout, proxy=None): self.private_key = private_key + self.proxy = proxy return self def make_request(self, message): @@ -331,7 +332,7 @@ def test_suggest_domains(self): } opensrs = self.safe_opensrs(self._data_suggest_domains('foo', 4), response_data) - self.assertEquals(expected, + self.assertEqual(expected, opensrs.suggest_domains( 'foo', ['.COM', '.ORG', '.NET', '.INFO'], 4)) @@ -399,7 +400,7 @@ def test_register_succeed(self): 'ref_number': '1065034' } } - self.assertEquals(expected, opensrs.register_domain( + self.assertEqual(expected, opensrs.register_domain( 'foo.com', 1, self._objdata_user_contact(), 'foo', 'bar')) def test_register_succeed_nameservers(self): @@ -430,7 +431,7 @@ def test_register_succeed_nameservers(self): 'ref_number': '1065034' } } - self.assertEquals(expected, opensrs.register_domain( + self.assertEqual(expected, opensrs.register_domain( 'foo.com', 1, self._objdata_user_contact(), 'foo', 'bar', nameservers=nameservers)) @@ -455,7 +456,7 @@ def test_create_pending_domain_registration_succeeds(self): 'ref_number': '1065034' } } - self.assertEquals(expected, opensrs.create_pending_domain_registration( + self.assertEqual(expected, opensrs.create_pending_domain_registration( 'foo.com', 1, self._objdata_user_contact(), 'foo', 'bar')) def test_renew_domain_fails_when_already_renewed(self): @@ -511,7 +512,7 @@ def test_create_pending_domain_renewal_succeeds(self): attributes={'order_id': '1065034'}) ) expected = '1065034' - self.assertEquals(expected, opensrs.create_pending_domain_renewal( + self.assertEqual(expected, opensrs.create_pending_domain_renewal( 'foo.com', '2017', '1')) def test_renew_domain_renewal_succeeds(self): @@ -528,7 +529,7 @@ def test_renew_domain_renewal_succeeds(self): attributes={'order_id': '1065034'}) ) expected = '1065034' - self.assertEquals(expected, opensrs.renew_domain( + self.assertEqual(expected, opensrs.renew_domain( 'foo.com', '2017', '1')) def test_domain_transfer_fails_when_domain_is_not_transferable(self): diff --git a/tox.ini b/tox.ini index d8b2ea7..7cdec91 100644 --- a/tox.ini +++ b/tox.ini @@ -1,11 +1,13 @@ [tox] -envlist = py27,py35 +envlist = py312 +isolated_build = true [testenv] deps = -rrequirements.txt + pytest setenv = PYTHONPATH = {toxinidir} commands = /bin/cp test_settings.py.sample test_settings.py - nosetests + pytest