From 9a5ca59f3ba1aad45bc2c133fe7aee7ce2eebd10 Mon Sep 17 00:00:00 2001 From: natsuoto <279971144+natsuoto@users.noreply.github.com> Date: Sat, 11 Jul 2026 16:01:11 +0530 Subject: feat(library/media): 11 media patterns (mimetype, extension, filename, glob, regex, shebang, encoding, charset, locale, favicon, codec) --- edify/library/media/__init__.py | 15 +++++++++++++++ edify/library/media/charset.py | 5 +++++ edify/library/media/codec.py | 5 +++++ edify/library/media/encoding.py | 5 +++++ edify/library/media/extension.py | 5 +++++ edify/library/media/favicon.py | 5 +++++ edify/library/media/filename.py | 5 +++++ edify/library/media/glob.py | 5 +++++ edify/library/media/locale.py | 5 +++++ edify/library/media/mimetype.py | 5 +++++ edify/library/media/regex.py | 19 +++++++++++++++++++ edify/library/media/shebang.py | 5 +++++ 12 files changed, 84 insertions(+) create mode 100644 edify/library/media/__init__.py create mode 100644 edify/library/media/charset.py create mode 100644 edify/library/media/codec.py create mode 100644 edify/library/media/encoding.py create mode 100644 edify/library/media/extension.py create mode 100644 edify/library/media/favicon.py create mode 100644 edify/library/media/filename.py create mode 100644 edify/library/media/glob.py create mode 100644 edify/library/media/locale.py create mode 100644 edify/library/media/mimetype.py create mode 100644 edify/library/media/regex.py create mode 100644 edify/library/media/shebang.py diff --git a/edify/library/media/__init__.py b/edify/library/media/__init__.py new file mode 100644 index 0000000..1f5a8f2 --- /dev/null +++ b/edify/library/media/__init__.py @@ -0,0 +1,15 @@ +from edify.library.media.charset import charset +from edify.library.media.codec import codec +from edify.library.media.encoding import encoding +from edify.library.media.extension import extension +from edify.library.media.favicon import favicon +from edify.library.media.filename import filename +from edify.library.media.glob import glob +from edify.library.media.locale import locale +from edify.library.media.mimetype import mimetype +from edify.library.media.regex import regex +from edify.library.media.shebang import shebang +__all__ = [ + "charset", "codec", "encoding", "extension", "favicon", "filename", + "glob", "locale", "mimetype", "regex", "shebang", +] diff --git a/edify/library/media/charset.py b/edify/library/media/charset.py new file mode 100644 index 0000000..b605a9b --- /dev/null +++ b/edify/library/media/charset.py @@ -0,0 +1,5 @@ +"""``charset`` — character set name shape.""" +from __future__ import annotations +from edify.library._support.regex import RegexBackedPattern +charset = RegexBackedPattern(r"^[a-zA-Z][a-zA-Z0-9_+.\-]{1,39}$") +"""Callable :class:`Pattern` for an IANA character-set name.""" diff --git a/edify/library/media/codec.py b/edify/library/media/codec.py new file mode 100644 index 0000000..cedf22e --- /dev/null +++ b/edify/library/media/codec.py @@ -0,0 +1,5 @@ +"""``codec`` — media codec name shape.""" +from __future__ import annotations +from edify.library._support.regex import RegexBackedPattern +codec = RegexBackedPattern(r"^[a-zA-Z][a-zA-Z0-9_.\-]{1,29}$") +"""Callable :class:`Pattern` for a media codec name (``h264``, ``vp9``, ``aac``, etc.).""" diff --git a/edify/library/media/encoding.py b/edify/library/media/encoding.py new file mode 100644 index 0000000..cc6decd --- /dev/null +++ b/edify/library/media/encoding.py @@ -0,0 +1,5 @@ +"""``encoding`` — text encoding name shape.""" +from __future__ import annotations +from edify.library._support.regex import RegexBackedPattern +encoding = RegexBackedPattern(r"^[a-zA-Z][a-zA-Z0-9_+.\-]{1,39}$") +"""Callable :class:`Pattern` for a text-encoding name (utf-8, latin-1, etc.).""" diff --git a/edify/library/media/extension.py b/edify/library/media/extension.py new file mode 100644 index 0000000..00a74b2 --- /dev/null +++ b/edify/library/media/extension.py @@ -0,0 +1,5 @@ +"""``extension`` — file extension shape (``.ext``).""" +from __future__ import annotations +from edify.library._support.regex import RegexBackedPattern +extension = RegexBackedPattern(r"^\.[a-zA-Z0-9]{1,10}$") +"""Callable :class:`Pattern` for a file extension: dot + 1-10 alphanumeric.""" diff --git a/edify/library/media/favicon.py b/edify/library/media/favicon.py new file mode 100644 index 0000000..1a9a308 --- /dev/null +++ b/edify/library/media/favicon.py @@ -0,0 +1,5 @@ +"""``favicon`` — favicon filename/URL shape.""" +from __future__ import annotations +from edify.library._support.regex import RegexBackedPattern +favicon = RegexBackedPattern(r"^(?:[^\x00-\x1f/\\]+/)*favicon\.(?:ico|png|svg|gif)$") +"""Callable :class:`Pattern` for a favicon file name or URL path.""" diff --git a/edify/library/media/filename.py b/edify/library/media/filename.py new file mode 100644 index 0000000..ccf230b --- /dev/null +++ b/edify/library/media/filename.py @@ -0,0 +1,5 @@ +"""``filename`` — file name shape (basename with extension).""" +from __future__ import annotations +from edify.library._support.regex import RegexBackedPattern +filename = RegexBackedPattern(r"^[^\x00-\x1f/\\:*?\"<>|]+\.[a-zA-Z0-9]{1,10}$") +"""Callable :class:`Pattern` for a valid file name with extension.""" diff --git a/edify/library/media/glob.py b/edify/library/media/glob.py new file mode 100644 index 0000000..ea7304b --- /dev/null +++ b/edify/library/media/glob.py @@ -0,0 +1,5 @@ +"""``glob`` — Unix glob-pattern shape.""" +from __future__ import annotations +from edify.library._support.regex import RegexBackedPattern +glob = RegexBackedPattern(r"^[^\x00-\x1f]*[*?[\]][^\x00-\x1f]*$") +"""Callable :class:`Pattern` for a Unix glob (must contain at least one wildcard).""" diff --git a/edify/library/media/locale.py b/edify/library/media/locale.py new file mode 100644 index 0000000..280fb0b --- /dev/null +++ b/edify/library/media/locale.py @@ -0,0 +1,5 @@ +"""``locale`` — POSIX/BCP-47 locale-tag shape.""" +from __future__ import annotations +from edify.library._support.regex import RegexBackedPattern +locale = RegexBackedPattern(r"^[a-z]{2,3}(?:[_-][A-Z]{2})?(?:\.[a-zA-Z0-9-]+)?(?:@[a-zA-Z0-9]+)?$") +"""Callable :class:`Pattern` for a POSIX/BCP-47 locale tag (``en``, ``en_US``, ``en-US.UTF-8``).""" diff --git a/edify/library/media/mimetype.py b/edify/library/media/mimetype.py new file mode 100644 index 0000000..daa6ca5 --- /dev/null +++ b/edify/library/media/mimetype.py @@ -0,0 +1,5 @@ +"""``mimetype`` — RFC 6838 MIME type shape.""" +from __future__ import annotations +from edify.library._support.regex import RegexBackedPattern +mimetype = RegexBackedPattern(r"^[a-zA-Z][a-zA-Z0-9!#$&\-^_.+]*/[a-zA-Z][a-zA-Z0-9!#$&\-^_.+]*$") +"""Callable :class:`Pattern` for the ``type/subtype`` MIME shape.""" diff --git a/edify/library/media/regex.py b/edify/library/media/regex.py new file mode 100644 index 0000000..7282f06 --- /dev/null +++ b/edify/library/media/regex.py @@ -0,0 +1,19 @@ +"""``regex`` — pattern that itself compiles as a valid regex.""" +from __future__ import annotations +import re +from edify.pattern.composition import Pattern + +class _RegexPattern(Pattern): + def __call__(self, value: str) -> bool: # type: ignore[override] + if not isinstance(value, str): + return False + try: + re.compile(value) + except re.error: + return False + return True + +regex = _RegexPattern() +"""Callable :class:`Pattern` that returns True iff ``value`` compiles as +a valid Python regular expression. +""" diff --git a/edify/library/media/shebang.py b/edify/library/media/shebang.py new file mode 100644 index 0000000..2bc31bd --- /dev/null +++ b/edify/library/media/shebang.py @@ -0,0 +1,5 @@ +"""``shebang`` — script shebang line shape.""" +from __future__ import annotations +from edify.library._support.regex import RegexBackedPattern +shebang = RegexBackedPattern(r"^#!/(?:usr/)?(?:bin|sbin|local)/(?:env\s+)?[a-zA-Z0-9._+/-]+$") +"""Callable :class:`Pattern` for a shebang line at the top of a script.""" -- cgit v1.2.3