aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authornatsuoto <[email protected]>2026-07-11 16:01:11 +0530
committernatsuoto <[email protected]>2026-07-11 16:01:11 +0530
commit9a5ca59f3ba1aad45bc2c133fe7aee7ce2eebd10 (patch)
tree3df7d62ae464ae7f07e7f0acff5df9c6fb353d79
parent3c8c3581a12d8453450ce273f733b301565c1979 (diff)
downloadedify-9a5ca59f3ba1aad45bc2c133fe7aee7ce2eebd10.tar.xz
edify-9a5ca59f3ba1aad45bc2c133fe7aee7ce2eebd10.zip
feat(library/media): 11 media patterns (mimetype, extension, filename, glob, regex, shebang, encoding, charset, locale, favicon, codec)
-rw-r--r--edify/library/media/__init__.py15
-rw-r--r--edify/library/media/charset.py5
-rw-r--r--edify/library/media/codec.py5
-rw-r--r--edify/library/media/encoding.py5
-rw-r--r--edify/library/media/extension.py5
-rw-r--r--edify/library/media/favicon.py5
-rw-r--r--edify/library/media/filename.py5
-rw-r--r--edify/library/media/glob.py5
-rw-r--r--edify/library/media/locale.py5
-rw-r--r--edify/library/media/mimetype.py5
-rw-r--r--edify/library/media/regex.py19
-rw-r--r--edify/library/media/shebang.py5
12 files changed, 84 insertions, 0 deletions
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."""