Repository: qpid-proton Updated Branches: refs/heads/master e769ad5c8 -> 9a72a30cd
NO-JIRA: proton.Url fill in defaults by default. Constructing a proton.Url will call self.defaults() to fill in any missing parts of the url with defaults. This is almost always what you want and means that users don't have to call url.defaults() manually. The old behavior is still available by constructing the Url with defaults=False, in case this is ever useful. In that case we parse the URL string but leave any missing fields as None. The str of the URL reflects the original, incomplete string. Project: http://git-wip-us.apache.org/repos/asf/qpid-proton/repo Commit: http://git-wip-us.apache.org/repos/asf/qpid-proton/commit/2828d331 Tree: http://git-wip-us.apache.org/repos/asf/qpid-proton/tree/2828d331 Diff: http://git-wip-us.apache.org/repos/asf/qpid-proton/diff/2828d331 Branch: refs/heads/master Commit: 2828d331313cebbe556d1f56a9c76ccee2e054a9 Parents: e769ad5 Author: Alan Conway <[email protected]> Authored: Thu Dec 11 18:21:34 2014 -0500 Committer: Alan Conway <[email protected]> Committed: Thu Dec 11 18:21:34 2014 -0500 ---------------------------------------------------------------------- proton-c/bindings/python/proton/__init__.py | 8 +++- tests/python/proton_tests/url.py | 61 ++++++++++++++++-------- 2 files changed, 47 insertions(+), 22 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/2828d331/proton-c/bindings/python/proton/__init__.py ---------------------------------------------------------------------- diff --git a/proton-c/bindings/python/proton/__init__.py b/proton-c/bindings/python/proton/__init__.py index 356ac4a..0fb7270 100644 --- a/proton-c/bindings/python/proton/__init__.py +++ b/proton-c/bindings/python/proton/__init__.py @@ -3770,9 +3770,11 @@ class Url(object): else: raise ValueError("Not a valid port number or service name: '%s'" % value) - def __init__(self, url=None, **kwargs): + def __init__(self, url=None, defaults=True, **kwargs): """ @param url: URL string to parse. + @param defaults: If true, fill in missing default values in the URL. + If false, you can fill them in later by calling self.defaults() @param kwargs: scheme, user, password, host, port, path. If specified, replaces corresponding part in url string. """ @@ -3784,6 +3786,7 @@ class Url(object): for k in kwargs: # Let kwargs override values parsed from url getattr(self, k) # Check for invalid kwargs setattr(self, k, kwargs[k]) + if defaults: self.defaults() class PartDescriptor(object): def __init__(self, part): @@ -3812,6 +3815,9 @@ class Url(object): def __repr__(self): return "Url(%r)" % str(self) + def __eq__(self, x): return str(self) == str(x) + def __ne__(self, x): return not self == x + def __del__(self): pn_url_free(self._url); del self._url http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/2828d331/tests/python/proton_tests/url.py ---------------------------------------------------------------------- diff --git a/tests/python/proton_tests/url.py b/tests/python/proton_tests/url.py index f8ededb..77a16ff 100644 --- a/tests/python/proton_tests/url.py +++ b/tests/python/proton_tests/url.py @@ -40,16 +40,24 @@ class UrlTest(common.Test): def testDefaults(self): # Check that we allow None for scheme, port - url = Url(username='me', password='secret', host='myhost', path='foobar') + url = Url(username='me', password='secret', host='myhost', path='foobar', defaults=False) self.assertEqual(str(url), "me:secret@myhost/foobar") self.assertUrl(url, None, 'me', 'secret', 'myhost', None, 'foobar') - self.assertEqual(str(Url("amqp://me:secret@myhost/foobar").defaults()), + self.assertEqual(str(Url("amqp://me:secret@myhost/foobar")), "amqp://me:secret@myhost:amqp/foobar") # Empty string vs. None for path self.assertEqual(Url("myhost/").path, "") - assert Url("myhost").path is None + assert Url("myhost", defaults=False).path is None + + # Expanding abbreviated url strings. + for s, u in [ + ("", "amqp://0.0.0.0:amqp"), + ("foo", "amqp://foo:amqp"), + (":1234", "amqp://0.0.0.0:1234"), + ("/path", "amqp://0.0.0.0:amqp/path") + ]: self.assertEqual(str(Url(s)), u) def assertPort(self, port, portint, portstr): self.assertEqual((port, port), (portint, portstr)) @@ -70,13 +78,13 @@ class UrlTest(common.Test): assert False, "Expected ValueError" except ValueError: pass - self.assertEqual(str(Url("host:amqp")), "host:amqp") - self.assertEqual(Url("host:amqp").port, 5672) + self.assertEqual(str(Url("host:amqp", defaults=False)), "host:amqp") + self.assertEqual(Url("host:amqp", defaults=False).port, 5672) def testArgs(self): - u = Url("amqp://u:p@host:amqp/path", scheme='foo', host='bar', port=1234, path='garden') + u = Url("amqp://u:p@host:amqp/path", scheme='foo', host='bar', port=1234, path='garden', defaults=False) self.assertUrl(u, 'foo', 'u', 'p', 'bar', 1234, 'garden') - u = Url() + u = Url(defaults=False) self.assertUrl(u, None, None, None, None, None, None) def assertRaises(self, exception, function, *args, **kwargs): @@ -86,33 +94,44 @@ class UrlTest(common.Test): except exception: pass def testMissing(self): - self.assertUrl(Url(), None, None, None, None, None, None) - self.assertUrl(Url('amqp://'), 'amqp', None, None, None, None, None) - self.assertUrl(Url('username@'), None, 'username', None, None, None, None) - self.assertUrl(Url(':pass@'), None, '', 'pass', None, None, None) - self.assertUrl(Url('host'), None, None, None, 'host', None, None) - self.assertUrl(Url(':1234'), None, None, None, None, 1234, None) - self.assertUrl(Url('/path'), None, None, None, None, None, 'path') + self.assertUrl(Url(defaults=False), None, None, None, None, None, None) + self.assertUrl(Url('amqp://', defaults=False), 'amqp', None, None, None, None, None) + self.assertUrl(Url('username@', defaults=False), None, 'username', None, None, None, None) + self.assertUrl(Url(':pass@', defaults=False), None, '', 'pass', None, None, None) + self.assertUrl(Url('host', defaults=False), None, None, None, 'host', None, None) + self.assertUrl(Url(':1234', defaults=False), None, None, None, None, 1234, None) + self.assertUrl(Url('/path', defaults=False), None, None, None, None, None, 'path') for s in ['amqp://', 'username@', ':pass@', ':1234', '/path']: - self.assertEqual(s, str(Url(s))) + self.assertEqual(s, str(Url(s, defaults=False))) for s, full in [ ('amqp://', 'amqp://0.0.0.0:amqp'), ('username@', 'amqp://[email protected]:amqp'), (':pass@', 'amqp://:[email protected]:amqp'), (':1234', 'amqp://0.0.0.0:1234'), - ('/path', 'amqp://0.0.0.0:amqp/path')]: - self.assertEqual(str(Url(s).defaults()), full) + ('/path', 'amqp://0.0.0.0:amqp/path'), + ('foo/path', 'amqp://foo:amqp/path'), + (':1234/path', 'amqp://0.0.0.0:1234/path') + ]: + self.assertEqual(str(Url(s)), full) def testAmqps(self): # Scheme defaults - self.assertEqual(str(Url("me:secret@myhost/foobar").defaults()), + self.assertEqual(str(Url("me:secret@myhost/foobar")), "amqp://me:secret@myhost:amqp/foobar") # Correct port for amqps vs. amqps - self.assertEqual(str(Url("amqps://me:secret@myhost/foobar").defaults()), + self.assertEqual(str(Url("amqps://me:secret@myhost/foobar")), "amqps://me:secret@myhost:amqps/foobar") self.assertPort(Url.Port('amqps'), 5671, 'amqps') - self.assertEqual(str(Url("host:amqps")), "host:amqps") - self.assertEqual(Url("host:amqps").port, 5671) + self.assertEqual(str(Url("host:amqps", defaults=False)), "host:amqps") + self.assertEqual(Url("host:amqps", defaults=False).port, 5671) + + def testEqual(self): + self.assertEqual(Url("foo/path"), 'amqp://foo:amqp/path') + self.assertEqual('amqp://foo:amqp/path', Url("foo/path")) + self.assertEqual(Url("foo/path"), Url("foo/path")) + self.assertNotEqual(Url("foo/path"), 'xamqp://foo:amqp/path') + self.assertNotEqual('xamqp://foo:amqp/path', Url("foo/path")) + self.assertNotEqual(Url("foo/path"), Url("bar/path")) --------------------------------------------------------------------- To unsubscribe, e-mail: [email protected] For additional commands, e-mail: [email protected]
