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]

Reply via email to