docs: def parse(cls, addr):
          """Parses a new `Uri` instance from a string representation of a URI.
  
          >>> u1 = Uri.parse('/foo/bar')
          >>> u1.node, u1.steps, u1.path, u1.name
          (None, ['', 'foo', 'bar'], '/foo/bar', 'bar')
          >>> u2 = Uri.parse('somenode:123/foo/bar')
          >>> u2.node, u1.steps, u2.path, ur2.name
          ('somenode:123', ['', 'foo', 'bar'], '/foo/bar', 'bar')
          >>> u1 = Uri.parse('foo/bar')
          >>> u1.node, u1.steps, u1.path, u1.name
          (None, ['foo', 'bar'], 'foo/bar', 'bar')
  
          """
          if addr.endswith('/'):
              raise ValueError("Uris must not end in '/'")  # pragma: no cover
          parts = addr.split('/')
          if ':' in parts[0]:
              node, parts[0] = parts[0], ''
          else:
              node = None
  
          ret = None  # Uri(name=None, parent=None, node=node) if node else None
          for step in parts:
              ret = Uri(name=step, parent=ret, node=node)
              node = None  # only set the node on the root Uri
          return ret