Skip to main content

gemurl

A library for normalizing gemini:// URLs

Usage

The package can be installed from PyPI using pip:

$ pip install gemurl

Use it like this:

from gemurl import normalize_url

print(normalize_url("GEMINI://EXAMPLE.COM:1965"))
# Should print: gemini://example.com/

The package also includes a command like tool:

$ gemurl normalize GEMINI://EXAMPLE.COM:1965
gemini://example.com/

API of gemurl Module

The GemurlError is the base class for all exceptions raised by functions in this module.

normalize_url(url: str) -> str

Normalize a URL according to RFC 3986 and the Gemini specification. Raises NormalizarionError if the input is not a valid (gemini) URL. Raises NonGeminiUrlError (which is a subclass of NormalizarionError) if the scheme is non-gemini.

host_port_pair_from_url(normalized_url: str) -> tuple[str, int]

Get a (host, port) tuple suitable for connecting a socket. The input URL must be normalized for this function to work correctly.

capsule_prefix(normalized_url: str) -> str

Find the prefix of the URL that uniquely identifies its capsule. Two URLs belong to the same capsule if the hostnames and ports match, but if the path begins with "/~USER/" or "/users/USER/", then the USER part needs to match too.

This definition is borrowed from khuxkm's Molniya. Thanks!

Features

The normamlization function ensures that:

  • Scheme and host case are always lowercase.
  • The host is IDNA-encoded, if it has non-ASCII characters.
  • The port is removed if it has the default 1965 value.
  • Percent encoding hex digit are always uppercase.
  • Non-reserved characters are never percent encoded.
  • Non-printable (and non-ASCII) characters are always percent encoded.
  • Percent encoding of reserved characters are not changed (since that would change the meaning).
  • URLs with no paths get a single slash path.
  • . and .. path segments are collapsed.
  • Empty queries and fragments are distinct from missing ones.
  • See test cases in test_url.py in te source code for the full list.

Ideas for Future Improvements

  • Function to resolve relative URLs
  • Function to convert URLs to display form (decode percent and IDNA encoding)

Metadata

Release files for gemurl 1.1.0

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for gemurl 1.1.0
File Size Uploaded
gemurl-1.1.0.tar.gz 3.6 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for gemurl 1.1.0
File Interpreter ABI Platform
gemurl-1.1.0-py3-none-any.whl Python 3 none any Details

Total release size: 7.5 kB

Release files / gemurl-1.1.0.tar.gz

Download URL gemurl-1.1.0.tar.gz
Size 3.6 kB
Tags Source
SHA-256 checksum
How to use checksums
1690471cfd3dd505635b51e7fbfa17f98c02f47e4a75ee81c02a73a3050a3a3f
BLAKE2b-256 checksum
How to use checksums
e72743dd6a235a92eb4011043352b057d376b3466d0525606233402ea1f6aef2
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/4.0.1 CPython/3.9.2

Release files / gemurl-1.1.0-py3-none-any.whl

Download URL gemurl-1.1.0-py3-none-any.whl
Size 3.9 kB
Tags Python 3
SHA-256 checksum
How to use checksums
85b1aa96fa8f7ae7b15b92970cafef7f88dc669e996d0b876ffc54059956feb5
BLAKE2b-256 checksum
How to use checksums
0c31bb82069af02424414299ce79cc99a371d64dcae780d41cd5cfee2965bc16
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/4.0.1 CPython/3.9.2

Release history Release notifications | RSS feed

This release

1.1.0 This release

2 release files

1.0.0

2 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page