clan_cli: Added ClanURI class parser
All checks were successful
checks-impure / test (pull_request) Successful in 1m25s
checks / test (pull_request) Successful in 2m17s

This commit is contained in:
Luis Hebendanz 2023-12-05 16:17:15 +01:00
parent 0cadbe0f1d
commit 63c820ed86
2 changed files with 84 additions and 0 deletions

View File

@ -0,0 +1,50 @@
# Import the urllib.parse module
import urllib.parse
from enum import Enum
from .errors import ClanError
class ClanScheme(Enum):
HTTP = "http"
HTTPS = "https"
FILE = "file"
# Define the ClanURI class
class ClanURI:
# Initialize the class with a clan:// URI
def __init__(self, uri: str) -> None:
if uri.startswith("clan://"):
uri = uri[7:]
else:
raise ClanError("Invalid scheme: expected clan://, got {}".format(uri))
# Parse the URI into components
self.components = urllib.parse.urlparse(uri)
try:
self.scheme = ClanScheme(self.components.scheme)
except ValueError:
raise ClanError("Unsupported scheme: {}".format(self.components.scheme))
# Define a method to get the path of the URI
@property
def path(self) -> str:
return self.components.path
@property
def url(self) -> str:
return self.components.geturl()
# Define a method to check if the URI is a remote HTTP URL
def is_remote(self) -> bool:
match self.scheme:
case ClanScheme.HTTP | ClanScheme.HTTPS:
return True
case ClanScheme.FILE:
return False
# Define a method to check if the URI is a local path
def is_local(self) -> bool:
return not self.is_remote()

View File

@ -0,0 +1,34 @@
import pytest
from clan_cli.clan_uri import ClanURI
from clan_cli.errors import ClanError
def test_local_uri() -> None:
# Create a ClanURI object from a local URI
uri = ClanURI("clan://file:///home/user/Downloads")
# Check that the URI is local
assert uri.is_local()
# Check that the URI is not remote
assert not uri.is_remote()
# Check that the URI path is correct
assert uri.path == "/home/user/Downloads"
def test_unsupported_schema() -> None:
with pytest.raises(ClanError, match="Unsupported scheme: ftp"):
# Create a ClanURI object from an unsupported URI
ClanURI("clan://ftp://ftp.example.com")
def test_is_remote() -> None:
# Create a ClanURI object from a remote URI
uri = ClanURI("clan://https://example.com")
# Check that the URI is remote
assert uri.is_remote()
# Check that the URI is not local
assert not uri.is_local()
# Check that the URI path is correct
assert uri.path == ""
assert uri.url == "https://example.com"