Skip to content

Commit

Permalink
Merge pull request #353 from yozachar/workshop
Browse files Browse the repository at this point in the history
feat: lays foundation for URI validation
  • Loading branch information
yozachar committed Apr 2, 2024
2 parents 8026364 + 79a2451 commit 3b36ec7
Show file tree
Hide file tree
Showing 2 changed files with 92 additions and 1 deletion.
91 changes: 91 additions & 0 deletions src/validators/uri.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,91 @@
"""URI."""

# Read: https://stackoverflow.com/questions/176264
# https://www.rfc-editor.org/rfc/rfc3986#section-3

# local
from .email import email
from .url import url
from .utils import validator


def _file_url(value: str):
if not value.startswith("file:///"):
return False
return True


def _ipfs_url(value: str):
if not value.startswith("ipfs://"):
return False
return True


@validator
def uri(value: str, /):
"""Return whether or not given value is a valid URI.
Examples:
>>> uri('mailto:example@domain.com')
# Output: True
>>> uri('file:path.txt')
# Output: ValidationError(func=uri, ...)
Args:
value:
URI to validate.
Returns:
(Literal[True]): If `value` is a valid URI.
(ValidationError): If `value` is an invalid URI.
"""
if not value:
return False

# TODO: work on various validations

# url
if any(
# fmt: off
value.startswith(item) for item in {
"ftp", "ftps", "git", "http", "https",
"irc", "rtmp", "rtmps", "rtsp", "sftp",
"ssh", "telnet",
}
# fmt: on
):
return url(value)

# email
if value.startswith("mailto:"):
return email(value.lstrip("mailto:"))

# file
if value.startswith("file:"):
return _file_url(value)

# ipfs
if value.startswith("ipfs:"):
return _ipfs_url(value)

# magnet
if value.startswith("magnet:?"):
return True

# telephone
if value.startswith("tel:"):
return True

# data
if value.startswith("data:"):
return True

# urn
if value.startswith("urn:"):
return True

# urc
if value.startswith("urc:"):
return True

return False
2 changes: 1 addition & 1 deletion src/validators/url.py
Original file line number Diff line number Diff line change
Expand Up @@ -44,7 +44,7 @@ def _validate_scheme(value: str):
# fmt: off
in {
"ftp", "ftps", "git", "http", "https",
"rtmp", "rtmps", "rtsp", "sftp",
"irc", "rtmp", "rtmps", "rtsp", "sftp",
"ssh", "telnet",
}
# fmt: on
Expand Down

0 comments on commit 3b36ec7

Please sign in to comment.