Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 6 additions & 2 deletions src/hyperlink/_url.py
Original file line number Diff line number Diff line change
Expand Up @@ -479,7 +479,7 @@ def register_scheme(
text, uses_netloc=True, default_port=None, query_plus_is_space=True
):
# type: (Text, bool, Optional[int], bool) -> None
"""Registers new scheme information, resulting in correct port and
"""Registers or updates scheme information, resulting in correct port and
slash behavior from the URL object. There are dozens of standard
schemes preregistered, so this function is mostly meant for
proprietary internal customizations or stopgaps on missing
Expand Down Expand Up @@ -510,18 +510,22 @@ def register_scheme(
)

if uses_netloc is True:
NO_NETLOC_SCHEMES.discard(text)
SCHEME_PORT_MAP[text] = default_port
elif uses_netloc is False:
if default_port is not None:
raise ValueError(
"unexpected default port while specifying"
" non-netloc scheme: %r" % default_port
)
SCHEME_PORT_MAP.pop(text, None)
NO_NETLOC_SCHEMES.add(text)
else:
raise ValueError("uses_netloc expected bool, not: %r" % uses_netloc)

if not query_plus_is_space:
if query_plus_is_space:
NO_QUERY_PLUS_SCHEMES.discard(text)
else:
NO_QUERY_PLUS_SCHEMES.add(text)

return
Expand Down
28 changes: 28 additions & 0 deletions src/hyperlink/test/test_scheme_registration.py
Original file line number Diff line number Diff line change
Expand Up @@ -13,11 +13,13 @@ def setUp(self):
# type: () -> None
self._orig_scheme_port_map = dict(_url.SCHEME_PORT_MAP)
self._orig_no_netloc_schemes = set(_url.NO_NETLOC_SCHEMES)
self._orig_no_query_plus_schemes = set(_url.NO_QUERY_PLUS_SCHEMES)

def tearDown(self):
# type: () -> None
_url.SCHEME_PORT_MAP = self._orig_scheme_port_map
_url.NO_NETLOC_SCHEMES = self._orig_no_netloc_schemes
_url.NO_QUERY_PLUS_SCHEMES = self._orig_no_query_plus_schemes

def test_register_scheme_basic(self):
# type: () -> None
Expand Down Expand Up @@ -49,6 +51,32 @@ def test_register_no_netloc_scheme(self):
u4 = u4.replace(path=("example", "path"))
assert u4.to_text() == "noloctron:example/path"

def test_reregister_scheme_replaces_previous_settings(self):
# type: () -> None
register_scheme(
"switchable",
uses_netloc=True,
default_port=8080,
query_plus_is_space=False,
)
register_scheme(
"switchable", uses_netloc=False, query_plus_is_space=True
)

assert _url.scheme_uses_netloc("switchable") is False
assert "switchable" not in _url.SCHEME_PORT_MAP
assert "switchable" not in _url.NO_QUERY_PLUS_SCHEMES
decoded = DecodedURL.from_text("switchable:path?q=a+b")
assert decoded.get("q") == ["a b"]

register_scheme("switchable", uses_netloc=True, default_port=8080)
assert _url.scheme_uses_netloc("switchable") is True
assert "switchable" not in _url.NO_NETLOC_SCHEMES
assert "switchable" not in _url.NO_QUERY_PLUS_SCHEMES
assert URL.from_text("switchable://example.com").port == 8080
decoded = DecodedURL.from_text("switchable://example.com/?q=a+b")
assert decoded.get("q") == ["a b"]

def test_register_no_netloc_with_port(self):
# type: () -> None
with self.assertRaises(ValueError):
Expand Down