From f3efea9b9ec120c876e7b1b4e4b3e785e7c594d6 Mon Sep 17 00:00:00 2001 From: natsuoto <279971144+natsuoto@users.noreply.github.com> Date: Tue, 14 Jul 2026 18:32:43 +0530 Subject: rename(atoms): single-word filenames (octet/port/label/uuid/hexcolor/nibble/isodate/clock/localpart) --- edify/atoms/__init__.py | 36 ++++++++++++++++++------------------ edify/atoms/clock.py | 23 +++++++++++++++++++++++ edify/atoms/date_iso8601.py | 10 ---------- edify/atoms/domain_label.py | 32 -------------------------------- edify/atoms/email_local.py | 36 ------------------------------------ edify/atoms/hex_color.py | 22 ---------------------- edify/atoms/hex_nibble.py | 8 -------- edify/atoms/hexcolor.py | 22 ++++++++++++++++++++++ edify/atoms/hostname.py | 4 ++-- edify/atoms/ipv4_octet.py | 14 -------------- edify/atoms/isodate.py | 8 ++++++++ edify/atoms/label.py | 32 ++++++++++++++++++++++++++++++++ edify/atoms/localpart.py | 36 ++++++++++++++++++++++++++++++++++++ edify/atoms/nibble.py | 8 ++++++++ edify/atoms/octet.py | 14 ++++++++++++++ edify/atoms/port.py | 16 ++++++++++++++++ edify/atoms/port_number.py | 16 ---------------- edify/atoms/time_24h.py | 23 ----------------------- edify/atoms/uuid.py | 27 +++++++++++++++++++++++++++ edify/atoms/uuid_v4.py | 27 --------------------------- edify/library/address/ip.py | 12 +++++------- edify/library/address/ptr.py | 4 ++-- edify/library/address/socket.py | 6 ++---- tests/atoms/clock.test.py | 26 ++++++++++++++++++++++++++ tests/atoms/date_iso8601.test.py | 26 -------------------------- tests/atoms/domain_label.test.py | 26 -------------------------- tests/atoms/email_local.test.py | 26 -------------------------- tests/atoms/hex_color.test.py | 26 -------------------------- tests/atoms/hex_nibble.test.py | 26 -------------------------- tests/atoms/hexcolor.test.py | 26 ++++++++++++++++++++++++++ tests/atoms/ipv4_octet.test.py | 26 -------------------------- tests/atoms/isodate.test.py | 26 ++++++++++++++++++++++++++ tests/atoms/label.test.py | 26 ++++++++++++++++++++++++++ tests/atoms/localpart.test.py | 26 ++++++++++++++++++++++++++ tests/atoms/nibble.test.py | 26 ++++++++++++++++++++++++++ tests/atoms/octet.test.py | 26 ++++++++++++++++++++++++++ tests/atoms/port.test.py | 26 ++++++++++++++++++++++++++ tests/atoms/port_number.test.py | 26 -------------------------- tests/atoms/time_24h.test.py | 26 -------------------------- tests/atoms/uuid.test.py | 26 ++++++++++++++++++++++++++ tests/atoms/uuid_v4.test.py | 26 -------------------------- 41 files changed, 449 insertions(+), 455 deletions(-) create mode 100644 edify/atoms/clock.py delete mode 100644 edify/atoms/date_iso8601.py delete mode 100644 edify/atoms/domain_label.py delete mode 100644 edify/atoms/email_local.py delete mode 100644 edify/atoms/hex_color.py delete mode 100644 edify/atoms/hex_nibble.py create mode 100644 edify/atoms/hexcolor.py delete mode 100644 edify/atoms/ipv4_octet.py create mode 100644 edify/atoms/isodate.py create mode 100644 edify/atoms/label.py create mode 100644 edify/atoms/localpart.py create mode 100644 edify/atoms/nibble.py create mode 100644 edify/atoms/octet.py create mode 100644 edify/atoms/port.py delete mode 100644 edify/atoms/port_number.py delete mode 100644 edify/atoms/time_24h.py create mode 100644 edify/atoms/uuid.py delete mode 100644 edify/atoms/uuid_v4.py create mode 100644 tests/atoms/clock.test.py delete mode 100644 tests/atoms/date_iso8601.test.py delete mode 100644 tests/atoms/domain_label.test.py delete mode 100644 tests/atoms/email_local.test.py delete mode 100644 tests/atoms/hex_color.test.py delete mode 100644 tests/atoms/hex_nibble.test.py create mode 100644 tests/atoms/hexcolor.test.py delete mode 100644 tests/atoms/ipv4_octet.test.py create mode 100644 tests/atoms/isodate.test.py create mode 100644 tests/atoms/label.test.py create mode 100644 tests/atoms/localpart.test.py create mode 100644 tests/atoms/nibble.test.py create mode 100644 tests/atoms/octet.test.py create mode 100644 tests/atoms/port.test.py delete mode 100644 tests/atoms/port_number.test.py delete mode 100644 tests/atoms/time_24h.test.py create mode 100644 tests/atoms/uuid.test.py delete mode 100644 tests/atoms/uuid_v4.test.py diff --git a/edify/atoms/__init__.py b/edify/atoms/__init__.py index b30189c..17e1c67 100644 --- a/edify/atoms/__init__.py +++ b/edify/atoms/__init__.py @@ -5,32 +5,32 @@ Each atom is an unanchored fragment meant to be spliced into a builder via directly from ``edify.atoms``. """ -from edify.atoms.date_iso8601 import date_iso8601 -from edify.atoms.domain_label import domain_label -from edify.atoms.email_local import email_local -from edify.atoms.hex_color import hex_color -from edify.atoms.hex_nibble import hex_nibble +from edify.atoms.clock import clock +from edify.atoms.hexcolor import hexcolor from edify.atoms.hostname import hostname -from edify.atoms.ipv4_octet import ipv4_octet -from edify.atoms.port_number import port_number +from edify.atoms.isodate import isodate +from edify.atoms.label import label +from edify.atoms.localpart import localpart +from edify.atoms.nibble import nibble +from edify.atoms.octet import octet +from edify.atoms.port import port from edify.atoms.semver import semver from edify.atoms.slug import slug -from edify.atoms.time_24h import time_24h from edify.atoms.username import username -from edify.atoms.uuid_v4 import uuid_v4 +from edify.atoms.uuid import uuid __all__ = [ - "date_iso8601", - "domain_label", - "email_local", - "hex_color", - "hex_nibble", + "clock", + "hexcolor", "hostname", - "ipv4_octet", - "port_number", + "isodate", + "label", + "localpart", + "nibble", + "octet", + "port", "semver", "slug", - "time_24h", "username", - "uuid_v4", + "uuid", ] diff --git a/edify/atoms/clock.py b/edify/atoms/clock.py new file mode 100644 index 0000000..9ad64d3 --- /dev/null +++ b/edify/atoms/clock.py @@ -0,0 +1,23 @@ +"""``clock`` — 24-hour ``HH:MM[:SS]`` clock time.""" + +from __future__ import annotations + +from edify import Pattern + +clock = ( + Pattern() + .any_of() + .subexpression(Pattern().char("2").range("0", "3")) + .subexpression(Pattern().range("0", "1").digit()) + .end() + .char(":") + .range("0", "5") + .digit() + .optional() + .group() + .char(":") + .range("0", "5") + .digit() + .end() +) +"""Composable :class:`Pattern` fragment for a 24-hour clock time.""" diff --git a/edify/atoms/date_iso8601.py b/edify/atoms/date_iso8601.py deleted file mode 100644 index 6ca34da..0000000 --- a/edify/atoms/date_iso8601.py +++ /dev/null @@ -1,10 +0,0 @@ -"""``date_iso8601`` — ISO 8601 calendar date ``YYYY-MM-DD``.""" - -from __future__ import annotations - -from edify import Pattern - -date_iso8601 = ( - Pattern().exactly(4).digit().char("-").exactly(2).digit().char("-").exactly(2).digit() -) -"""Composable :class:`Pattern` fragment for an ISO 8601 ``YYYY-MM-DD`` date.""" diff --git a/edify/atoms/domain_label.py b/edify/atoms/domain_label.py deleted file mode 100644 index cb13f7c..0000000 --- a/edify/atoms/domain_label.py +++ /dev/null @@ -1,32 +0,0 @@ -"""``domain_label`` — one RFC 1123 DNS label.""" - -from __future__ import annotations - -from edify import Pattern - -domain_label = ( - Pattern() - .any_of() - .range("a", "z") - .range("A", "Z") - .range("0", "9") - .end() - .optional() - .group() - .between(0, 61) - .any_of() - .range("a", "z") - .range("A", "Z") - .range("0", "9") - .char("-") - .end() - .any_of() - .range("a", "z") - .range("A", "Z") - .range("0", "9") - .end() - .end() -) -"""Composable :class:`Pattern` fragment for one RFC 1123 DNS label -(letter/digit start, up to 63 chars, letter/digit end). -""" diff --git a/edify/atoms/email_local.py b/edify/atoms/email_local.py deleted file mode 100644 index 9b95e89..0000000 --- a/edify/atoms/email_local.py +++ /dev/null @@ -1,36 +0,0 @@ -"""``email_local`` — RFC 5322 email local-part shape (permissive).""" - -from __future__ import annotations - -from edify import Pattern - -email_local = ( - Pattern() - .between(1, 64) - .any_of() - .range("a", "z") - .range("A", "Z") - .range("0", "9") - .char("!") - .char("#") - .char("$") - .char("%") - .char("&") - .char("'") - .char("*") - .char("+") - .char("/") - .char("=") - .char("?") - .char("^") - .char("_") - .char("`") - .char("{") - .char("|") - .char("}") - .char("~") - .char(".") - .char("-") - .end() -) -"""Composable :class:`Pattern` fragment for the local part of an email address.""" diff --git a/edify/atoms/hex_color.py b/edify/atoms/hex_color.py deleted file mode 100644 index df1f7ac..0000000 --- a/edify/atoms/hex_color.py +++ /dev/null @@ -1,22 +0,0 @@ -"""``hex_color`` — CSS hex-colour shape (``#RGB``, ``#RGBA``, ``#RRGGBB``, ``#RRGGBBAA``).""" - -from __future__ import annotations - -from edify import Pattern -from edify.atoms.hex_nibble import hex_nibble - -hex_color = ( - Pattern() - .char("#") - .any_of() - .exactly(8) - .use(hex_nibble) - .exactly(6) - .use(hex_nibble) - .exactly(4) - .use(hex_nibble) - .exactly(3) - .use(hex_nibble) - .end() -) -"""Composable :class:`Pattern` fragment for a CSS hex colour.""" diff --git a/edify/atoms/hex_nibble.py b/edify/atoms/hex_nibble.py deleted file mode 100644 index 3c0dc02..0000000 --- a/edify/atoms/hex_nibble.py +++ /dev/null @@ -1,8 +0,0 @@ -"""``hex_nibble`` — one hexadecimal nibble ``[0-9a-fA-F]``.""" - -from __future__ import annotations - -from edify import Pattern - -hex_nibble = Pattern().any_of().range("0", "9").range("a", "f").range("A", "F").end() -"""Composable :class:`Pattern` fragment for one mixed-case hex nibble.""" diff --git a/edify/atoms/hexcolor.py b/edify/atoms/hexcolor.py new file mode 100644 index 0000000..cdb162b --- /dev/null +++ b/edify/atoms/hexcolor.py @@ -0,0 +1,22 @@ +"""``hexcolor`` — CSS hex-colour shape (``#RGB``, ``#RGBA``, ``#RRGGBB``, ``#RRGGBBAA``).""" + +from __future__ import annotations + +from edify import Pattern +from edify.atoms.nibble import nibble + +hexcolor = ( + Pattern() + .char("#") + .any_of() + .exactly(8) + .use(nibble) + .exactly(6) + .use(nibble) + .exactly(4) + .use(nibble) + .exactly(3) + .use(nibble) + .end() +) +"""Composable :class:`Pattern` fragment for a CSS hex colour.""" diff --git a/edify/atoms/hostname.py b/edify/atoms/hostname.py index ad04036..14feb0f 100644 --- a/edify/atoms/hostname.py +++ b/edify/atoms/hostname.py @@ -3,7 +3,7 @@ from __future__ import annotations from edify import Pattern -from edify.atoms.domain_label import domain_label +from edify.atoms.label import label -hostname = Pattern().use(domain_label).zero_or_more().group().char(".").use(domain_label).end() +hostname = Pattern().use(label).zero_or_more().group().char(".").use(label).end() """Composable :class:`Pattern` fragment for an RFC 1123 hostname.""" diff --git a/edify/atoms/ipv4_octet.py b/edify/atoms/ipv4_octet.py deleted file mode 100644 index 8ccc1bc..0000000 --- a/edify/atoms/ipv4_octet.py +++ /dev/null @@ -1,14 +0,0 @@ -"""``ipv4_octet`` — one IPv4 octet in the range ``0``-``255``.""" - -from __future__ import annotations - -from edify import Pattern, any_of - -ipv4_octet = any_of( - Pattern().string("25").range("0", "5"), - Pattern().char("2").range("0", "4").digit(), - Pattern().char("1").digit().digit(), - Pattern().range("1", "9").digit(), - Pattern().digit(), -) -"""Composable :class:`Pattern` fragment for a single IPv4 octet (``0``-``255``).""" diff --git a/edify/atoms/isodate.py b/edify/atoms/isodate.py new file mode 100644 index 0000000..7408bba --- /dev/null +++ b/edify/atoms/isodate.py @@ -0,0 +1,8 @@ +"""``isodate`` — ISO 8601 calendar date ``YYYY-MM-DD``.""" + +from __future__ import annotations + +from edify import Pattern + +isodate = Pattern().exactly(4).digit().char("-").exactly(2).digit().char("-").exactly(2).digit() +"""Composable :class:`Pattern` fragment for an ISO 8601 ``YYYY-MM-DD`` date.""" diff --git a/edify/atoms/label.py b/edify/atoms/label.py new file mode 100644 index 0000000..bad0ae4 --- /dev/null +++ b/edify/atoms/label.py @@ -0,0 +1,32 @@ +"""``label`` — one RFC 1123 DNS label.""" + +from __future__ import annotations + +from edify import Pattern + +label = ( + Pattern() + .any_of() + .range("a", "z") + .range("A", "Z") + .range("0", "9") + .end() + .optional() + .group() + .between(0, 61) + .any_of() + .range("a", "z") + .range("A", "Z") + .range("0", "9") + .char("-") + .end() + .any_of() + .range("a", "z") + .range("A", "Z") + .range("0", "9") + .end() + .end() +) +"""Composable :class:`Pattern` fragment for one RFC 1123 DNS label +(letter/digit start, up to 63 chars, letter/digit end). +""" diff --git a/edify/atoms/localpart.py b/edify/atoms/localpart.py new file mode 100644 index 0000000..92f9682 --- /dev/null +++ b/edify/atoms/localpart.py @@ -0,0 +1,36 @@ +"""``localpart`` — RFC 5322 email local-part shape (permissive).""" + +from __future__ import annotations + +from edify import Pattern + +localpart = ( + Pattern() + .between(1, 64) + .any_of() + .range("a", "z") + .range("A", "Z") + .range("0", "9") + .char("!") + .char("#") + .char("$") + .char("%") + .char("&") + .char("'") + .char("*") + .char("+") + .char("/") + .char("=") + .char("?") + .char("^") + .char("_") + .char("`") + .char("{") + .char("|") + .char("}") + .char("~") + .char(".") + .char("-") + .end() +) +"""Composable :class:`Pattern` fragment for the local part of an email address.""" diff --git a/edify/atoms/nibble.py b/edify/atoms/nibble.py new file mode 100644 index 0000000..7e7cd9e --- /dev/null +++ b/edify/atoms/nibble.py @@ -0,0 +1,8 @@ +"""``nibble`` — one hexadecimal nibble ``[0-9a-fA-F]``.""" + +from __future__ import annotations + +from edify import Pattern + +nibble = Pattern().any_of().range("0", "9").range("a", "f").range("A", "F").end() +"""Composable :class:`Pattern` fragment for one mixed-case hex nibble.""" diff --git a/edify/atoms/octet.py b/edify/atoms/octet.py new file mode 100644 index 0000000..5911b47 --- /dev/null +++ b/edify/atoms/octet.py @@ -0,0 +1,14 @@ +"""``octet`` — one IPv4 octet in the range ``0``-``255``.""" + +from __future__ import annotations + +from edify import Pattern, any_of + +octet = any_of( + Pattern().string("25").range("0", "5"), + Pattern().char("2").range("0", "4").digit(), + Pattern().char("1").digit().digit(), + Pattern().range("1", "9").digit(), + Pattern().digit(), +) +"""Composable :class:`Pattern` fragment for a single IPv4 octet (``0``-``255``).""" diff --git a/edify/atoms/port.py b/edify/atoms/port.py new file mode 100644 index 0000000..1a52024 --- /dev/null +++ b/edify/atoms/port.py @@ -0,0 +1,16 @@ +"""``port`` — one TCP/UDP port in the range ``0``-``65535``.""" + +from __future__ import annotations + +from edify import Pattern, any_of + +port = any_of( + Pattern().string("6553").range("0", "5"), + Pattern().string("655").range("0", "2").digit(), + Pattern().string("65").range("0", "4").digit().digit(), + Pattern().char("6").range("0", "4").digit().digit().digit(), + Pattern().range("1", "5").exactly(4).digit(), + Pattern().range("1", "9").between(0, 3).digit(), + Pattern().char("0"), +) +"""Composable :class:`Pattern` fragment for a TCP/UDP port number.""" diff --git a/edify/atoms/port_number.py b/edify/atoms/port_number.py deleted file mode 100644 index 36a4214..0000000 --- a/edify/atoms/port_number.py +++ /dev/null @@ -1,16 +0,0 @@ -"""``port_number`` — one TCP/UDP port in the range ``0``-``65535``.""" - -from __future__ import annotations - -from edify import Pattern, any_of - -port_number = any_of( - Pattern().string("6553").range("0", "5"), - Pattern().string("655").range("0", "2").digit(), - Pattern().string("65").range("0", "4").digit().digit(), - Pattern().char("6").range("0", "4").digit().digit().digit(), - Pattern().range("1", "5").exactly(4).digit(), - Pattern().range("1", "9").between(0, 3).digit(), - Pattern().char("0"), -) -"""Composable :class:`Pattern` fragment for a TCP/UDP port number.""" diff --git a/edify/atoms/time_24h.py b/edify/atoms/time_24h.py deleted file mode 100644 index a9302bb..0000000 --- a/edify/atoms/time_24h.py +++ /dev/null @@ -1,23 +0,0 @@ -"""``time_24h`` — 24-hour ``HH:MM[:SS]`` clock time.""" - -from __future__ import annotations - -from edify import Pattern - -time_24h = ( - Pattern() - .any_of() - .subexpression(Pattern().char("2").range("0", "3")) - .subexpression(Pattern().range("0", "1").digit()) - .end() - .char(":") - .range("0", "5") - .digit() - .optional() - .group() - .char(":") - .range("0", "5") - .digit() - .end() -) -"""Composable :class:`Pattern` fragment for a 24-hour clock time.""" diff --git a/edify/atoms/uuid.py b/edify/atoms/uuid.py new file mode 100644 index 0000000..cb5fe4f --- /dev/null +++ b/edify/atoms/uuid.py @@ -0,0 +1,27 @@ +"""``uuid`` — version-4 UUID shape.""" + +from __future__ import annotations + +from edify import Pattern +from edify.atoms.nibble import nibble + +uuid = ( + Pattern() + .exactly(8) + .use(nibble) + .char("-") + .exactly(4) + .use(nibble) + .char("-") + .char("4") + .exactly(3) + .use(nibble) + .char("-") + .any_of_chars("89ab") + .exactly(3) + .use(nibble) + .char("-") + .exactly(12) + .use(nibble) +) +"""Composable :class:`Pattern` fragment for a version-4 UUID.""" diff --git a/edify/atoms/uuid_v4.py b/edify/atoms/uuid_v4.py deleted file mode 100644 index ea99660..0000000 --- a/edify/atoms/uuid_v4.py +++ /dev/null @@ -1,27 +0,0 @@ -"""``uuid_v4`` — version-4 UUID shape.""" - -from __future__ import annotations - -from edify import Pattern -from edify.atoms.hex_nibble import hex_nibble - -uuid_v4 = ( - Pattern() - .exactly(8) - .use(hex_nibble) - .char("-") - .exactly(4) - .use(hex_nibble) - .char("-") - .char("4") - .exactly(3) - .use(hex_nibble) - .char("-") - .any_of_chars("89ab") - .exactly(3) - .use(hex_nibble) - .char("-") - .exactly(12) - .use(hex_nibble) -) -"""Composable :class:`Pattern` fragment for a version-4 UUID.""" diff --git a/edify/library/address/ip.py b/edify/library/address/ip.py index 3665fd7..85945d7 100644 --- a/edify/library/address/ip.py +++ b/edify/library/address/ip.py @@ -3,17 +3,15 @@ from __future__ import annotations from edify import Pattern, any_of -from edify.atoms.hex_nibble import hex_nibble -from edify.atoms.ipv4_octet import ipv4_octet +from edify.atoms.nibble import nibble +from edify.atoms.octet import octet def _hex_group() -> Pattern: - return Pattern().between(1, 4).subexpression(hex_nibble) + return Pattern().between(1, 4).subexpression(nibble) -_ipv4 = ( - Pattern().subexpression(ipv4_octet).exactly(3).group().char(".").subexpression(ipv4_octet).end() -) +_ipv4 = Pattern().subexpression(octet).exactly(3).group().char(".").subexpression(octet).end() def _b1() -> Pattern: @@ -97,7 +95,7 @@ def _b_link_local() -> Pattern: .group() .char(":") .between(0, 4) - .subexpression(hex_nibble) + .subexpression(nibble) .end() .char("%") .one_or_more() diff --git a/edify/library/address/ptr.py b/edify/library/address/ptr.py index 17b4b68..87382f1 100644 --- a/edify/library/address/ptr.py +++ b/edify/library/address/ptr.py @@ -3,7 +3,7 @@ from __future__ import annotations from edify import Pattern, any_of -from edify.atoms.hex_nibble import hex_nibble +from edify.atoms.nibble import nibble _ipv4_ptr = ( Pattern() @@ -23,7 +23,7 @@ _ipv6_ptr = ( Pattern() .exactly(32) .group() - .subexpression(hex_nibble) + .subexpression(nibble) .char(".") .end() .string("ip6") diff --git a/edify/library/address/socket.py b/edify/library/address/socket.py index d65dedb..7231448 100644 --- a/edify/library/address/socket.py +++ b/edify/library/address/socket.py @@ -3,11 +3,9 @@ from __future__ import annotations from edify import Pattern, any_of -from edify.atoms.ipv4_octet import ipv4_octet +from edify.atoms.octet import octet -_ipv4 = ( - Pattern().subexpression(ipv4_octet).exactly(3).group().char(".").subexpression(ipv4_octet).end() -) +_ipv4 = Pattern().subexpression(octet).exactly(3).group().char(".").subexpression(octet).end() _ipv6_bracket = ( Pattern() .char("[") diff --git a/tests/atoms/clock.test.py b/tests/atoms/clock.test.py new file mode 100644 index 0000000..2abe10a --- /dev/null +++ b/tests/atoms/clock.test.py @@ -0,0 +1,26 @@ +from edify import Pattern +from edify.atoms import clock + + +def _anchored(): + return Pattern().start_of_input().use(clock).end_of_input() + + +def test_accepts_sample_from_shape(): + assert _anchored()("23:59") + + +def test_rejects_off_shape_input(): + assert not _anchored()("24:00") + + +def test_atom_composes_inside_a_larger_pattern(): + embedded = Pattern().start_of_input().string("v=").use(clock).end_of_input() + assert embedded("v=" + "23:59") + assert not embedded("23:59") + + +def test_atom_regex_string_is_non_empty(): + fragment = clock.to_regex_string() + assert fragment + assert isinstance(fragment, str) diff --git a/tests/atoms/date_iso8601.test.py b/tests/atoms/date_iso8601.test.py deleted file mode 100644 index 71b0af6..0000000 --- a/tests/atoms/date_iso8601.test.py +++ /dev/null @@ -1,26 +0,0 @@ -from edify import Pattern -from edify.atoms import date_iso8601 - - -def _anchored(): - return Pattern().start_of_input().use(date_iso8601).end_of_input() - - -def test_accepts_sample_from_shape(): - assert _anchored()("2024-01-15") - - -def test_rejects_off_shape_input(): - assert not _anchored()("2024/01/15") - - -def test_atom_composes_inside_a_larger_pattern(): - embedded = Pattern().start_of_input().string("v=").use(date_iso8601).end_of_input() - assert embedded("v=" + "2024-01-15") - assert not embedded("2024-01-15") - - -def test_atom_regex_string_is_non_empty(): - fragment = date_iso8601.to_regex_string() - assert fragment - assert isinstance(fragment, str) diff --git a/tests/atoms/domain_label.test.py b/tests/atoms/domain_label.test.py deleted file mode 100644 index 58d02c1..0000000 --- a/tests/atoms/domain_label.test.py +++ /dev/null @@ -1,26 +0,0 @@ -from edify import Pattern -from edify.atoms import domain_label - - -def _anchored(): - return Pattern().start_of_input().use(domain_label).end_of_input() - - -def test_accepts_sample_from_shape(): - assert _anchored()("example") - - -def test_rejects_off_shape_input(): - assert not _anchored()("-bad") - - -def test_atom_composes_inside_a_larger_pattern(): - embedded = Pattern().start_of_input().string("v=").use(domain_label).end_of_input() - assert embedded("v=" + "example") - assert not embedded("example") - - -def test_atom_regex_string_is_non_empty(): - fragment = domain_label.to_regex_string() - assert fragment - assert isinstance(fragment, str) diff --git a/tests/atoms/email_local.test.py b/tests/atoms/email_local.test.py deleted file mode 100644 index 440f2ba..0000000 --- a/tests/atoms/email_local.test.py +++ /dev/null @@ -1,26 +0,0 @@ -from edify import Pattern -from edify.atoms import email_local - - -def _anchored(): - return Pattern().start_of_input().use(email_local).end_of_input() - - -def test_accepts_sample_from_shape(): - assert _anchored()("user.name") - - -def test_rejects_off_shape_input(): - assert not _anchored()("") - - -def test_atom_composes_inside_a_larger_pattern(): - embedded = Pattern().start_of_input().string("v=").use(email_local).end_of_input() - assert embedded("v=" + "user.name") - assert not embedded("user.name") - - -def test_atom_regex_string_is_non_empty(): - fragment = email_local.to_regex_string() - assert fragment - assert isinstance(fragment, str) diff --git a/tests/atoms/hex_color.test.py b/tests/atoms/hex_color.test.py deleted file mode 100644 index 9e5b270..0000000 --- a/tests/atoms/hex_color.test.py +++ /dev/null @@ -1,26 +0,0 @@ -from edify import Pattern -from edify.atoms import hex_color - - -def _anchored(): - return Pattern().start_of_input().use(hex_color).end_of_input() - - -def test_accepts_sample_from_shape(): - assert _anchored()("#abc") - - -def test_rejects_off_shape_input(): - assert not _anchored()("nope") - - -def test_atom_composes_inside_a_larger_pattern(): - embedded = Pattern().start_of_input().string("v=").use(hex_color).end_of_input() - assert embedded("v=" + "#abc") - assert not embedded("#abc") - - -def test_atom_regex_string_is_non_empty(): - fragment = hex_color.to_regex_string() - assert fragment - assert isinstance(fragment, str) diff --git a/tests/atoms/hex_nibble.test.py b/tests/atoms/hex_nibble.test.py deleted file mode 100644 index 578a7a1..0000000 --- a/tests/atoms/hex_nibble.test.py +++ /dev/null @@ -1,26 +0,0 @@ -from edify import Pattern -from edify.atoms import hex_nibble - - -def _anchored(): - return Pattern().start_of_input().use(hex_nibble).end_of_input() - - -def test_accepts_sample_from_shape(): - assert _anchored()("a") - - -def test_rejects_off_shape_input(): - assert not _anchored()("g") - - -def test_atom_composes_inside_a_larger_pattern(): - embedded = Pattern().start_of_input().string("v=").use(hex_nibble).end_of_input() - assert embedded("v=" + "a") - assert not embedded("a") - - -def test_atom_regex_string_is_non_empty(): - fragment = hex_nibble.to_regex_string() - assert fragment - assert isinstance(fragment, str) diff --git a/tests/atoms/hexcolor.test.py b/tests/atoms/hexcolor.test.py new file mode 100644 index 0000000..6dbd865 --- /dev/null +++ b/tests/atoms/hexcolor.test.py @@ -0,0 +1,26 @@ +from edify import Pattern +from edify.atoms import hexcolor + + +def _anchored(): + return Pattern().start_of_input().use(hexcolor).end_of_input() + + +def test_accepts_sample_from_shape(): + assert _anchored()("#abc") + + +def test_rejects_off_shape_input(): + assert not _anchored()("nope") + + +def test_atom_composes_inside_a_larger_pattern(): + embedded = Pattern().start_of_input().string("v=").use(hexcolor).end_of_input() + assert embedded("v=" + "#abc") + assert not embedded("#abc") + + +def test_atom_regex_string_is_non_empty(): + fragment = hexcolor.to_regex_string() + assert fragment + assert isinstance(fragment, str) diff --git a/tests/atoms/ipv4_octet.test.py b/tests/atoms/ipv4_octet.test.py deleted file mode 100644 index 5b9631b..0000000 --- a/tests/atoms/ipv4_octet.test.py +++ /dev/null @@ -1,26 +0,0 @@ -from edify import Pattern -from edify.atoms import ipv4_octet - - -def _anchored(): - return Pattern().start_of_input().use(ipv4_octet).end_of_input() - - -def test_accepts_sample_from_shape(): - assert _anchored()("192") - - -def test_rejects_off_shape_input(): - assert not _anchored()("999") - - -def test_atom_composes_inside_a_larger_pattern(): - embedded = Pattern().start_of_input().string("v=").use(ipv4_octet).end_of_input() - assert embedded("v=" + "192") - assert not embedded("192") - - -def test_atom_regex_string_is_non_empty(): - fragment = ipv4_octet.to_regex_string() - assert fragment - assert isinstance(fragment, str) diff --git a/tests/atoms/isodate.test.py b/tests/atoms/isodate.test.py new file mode 100644 index 0000000..aefb79a --- /dev/null +++ b/tests/atoms/isodate.test.py @@ -0,0 +1,26 @@ +from edify import Pattern +from edify.atoms import isodate + + +def _anchored(): + return Pattern().start_of_input().use(isodate).end_of_input() + + +def test_accepts_sample_from_shape(): + assert _anchored()("2024-01-15") + + +def test_rejects_off_shape_input(): + assert not _anchored()("2024/01/15") + + +def test_atom_composes_inside_a_larger_pattern(): + embedded = Pattern().start_of_input().string("v=").use(isodate).end_of_input() + assert embedded("v=" + "2024-01-15") + assert not embedded("2024-01-15") + + +def test_atom_regex_string_is_non_empty(): + fragment = isodate.to_regex_string() + assert fragment + assert isinstance(fragment, str) diff --git a/tests/atoms/label.test.py b/tests/atoms/label.test.py new file mode 100644 index 0000000..ba16b34 --- /dev/null +++ b/tests/atoms/label.test.py @@ -0,0 +1,26 @@ +from edify import Pattern +from edify.atoms import label + + +def _anchored(): + return Pattern().start_of_input().use(label).end_of_input() + + +def test_accepts_sample_from_shape(): + assert _anchored()("example") + + +def test_rejects_off_shape_input(): + assert not _anchored()("-bad") + + +def test_atom_composes_inside_a_larger_pattern(): + embedded = Pattern().start_of_input().string("v=").use(label).end_of_input() + assert embedded("v=" + "example") + assert not embedded("example") + + +def test_atom_regex_string_is_non_empty(): + fragment = label.to_regex_string() + assert fragment + assert isinstance(fragment, str) diff --git a/tests/atoms/localpart.test.py b/tests/atoms/localpart.test.py new file mode 100644 index 0000000..51003ca --- /dev/null +++ b/tests/atoms/localpart.test.py @@ -0,0 +1,26 @@ +from edify import Pattern +from edify.atoms import localpart + + +def _anchored(): + return Pattern().start_of_input().use(localpart).end_of_input() + + +def test_accepts_sample_from_shape(): + assert _anchored()("user.name") + + +def test_rejects_off_shape_input(): + assert not _anchored()("") + + +def test_atom_composes_inside_a_larger_pattern(): + embedded = Pattern().start_of_input().string("v=").use(localpart).end_of_input() + assert embedded("v=" + "user.name") + assert not embedded("user.name") + + +def test_atom_regex_string_is_non_empty(): + fragment = localpart.to_regex_string() + assert fragment + assert isinstance(fragment, str) diff --git a/tests/atoms/nibble.test.py b/tests/atoms/nibble.test.py new file mode 100644 index 0000000..94f39c8 --- /dev/null +++ b/tests/atoms/nibble.test.py @@ -0,0 +1,26 @@ +from edify import Pattern +from edify.atoms import nibble + + +def _anchored(): + return Pattern().start_of_input().use(nibble).end_of_input() + + +def test_accepts_sample_from_shape(): + assert _anchored()("a") + + +def test_rejects_off_shape_input(): + assert not _anchored()("g") + + +def test_atom_composes_inside_a_larger_pattern(): + embedded = Pattern().start_of_input().string("v=").use(nibble).end_of_input() + assert embedded("v=" + "a") + assert not embedded("a") + + +def test_atom_regex_string_is_non_empty(): + fragment = nibble.to_regex_string() + assert fragment + assert isinstance(fragment, str) diff --git a/tests/atoms/octet.test.py b/tests/atoms/octet.test.py new file mode 100644 index 0000000..00985b2 --- /dev/null +++ b/tests/atoms/octet.test.py @@ -0,0 +1,26 @@ +from edify import Pattern +from edify.atoms import octet + + +def _anchored(): + return Pattern().start_of_input().use(octet).end_of_input() + + +def test_accepts_sample_from_shape(): + assert _anchored()("192") + + +def test_rejects_off_shape_input(): + assert not _anchored()("999") + + +def test_atom_composes_inside_a_larger_pattern(): + embedded = Pattern().start_of_input().string("v=").use(octet).end_of_input() + assert embedded("v=" + "192") + assert not embedded("192") + + +def test_atom_regex_string_is_non_empty(): + fragment = octet.to_regex_string() + assert fragment + assert isinstance(fragment, str) diff --git a/tests/atoms/port.test.py b/tests/atoms/port.test.py new file mode 100644 index 0000000..3c3958b --- /dev/null +++ b/tests/atoms/port.test.py @@ -0,0 +1,26 @@ +from edify import Pattern +from edify.atoms import port + + +def _anchored(): + return Pattern().start_of_input().use(port).end_of_input() + + +def test_accepts_sample_from_shape(): + assert _anchored()("65535") + + +def test_rejects_off_shape_input(): + assert not _anchored()("65536") + + +def test_atom_composes_inside_a_larger_pattern(): + embedded = Pattern().start_of_input().string("v=").use(port).end_of_input() + assert embedded("v=" + "65535") + assert not embedded("65535") + + +def test_atom_regex_string_is_non_empty(): + fragment = port.to_regex_string() + assert fragment + assert isinstance(fragment, str) diff --git a/tests/atoms/port_number.test.py b/tests/atoms/port_number.test.py deleted file mode 100644 index 04bae73..0000000 --- a/tests/atoms/port_number.test.py +++ /dev/null @@ -1,26 +0,0 @@ -from edify import Pattern -from edify.atoms import port_number - - -def _anchored(): - return Pattern().start_of_input().use(port_number).end_of_input() - - -def test_accepts_sample_from_shape(): - assert _anchored()("65535") - - -def test_rejects_off_shape_input(): - assert not _anchored()("65536") - - -def test_atom_composes_inside_a_larger_pattern(): - embedded = Pattern().start_of_input().string("v=").use(port_number).end_of_input() - assert embedded("v=" + "65535") - assert not embedded("65535") - - -def test_atom_regex_string_is_non_empty(): - fragment = port_number.to_regex_string() - assert fragment - assert isinstance(fragment, str) diff --git a/tests/atoms/time_24h.test.py b/tests/atoms/time_24h.test.py deleted file mode 100644 index a3865eb..0000000 --- a/tests/atoms/time_24h.test.py +++ /dev/null @@ -1,26 +0,0 @@ -from edify import Pattern -from edify.atoms import time_24h - - -def _anchored(): - return Pattern().start_of_input().use(time_24h).end_of_input() - - -def test_accepts_sample_from_shape(): - assert _anchored()("23:59") - - -def test_rejects_off_shape_input(): - assert not _anchored()("24:00") - - -def test_atom_composes_inside_a_larger_pattern(): - embedded = Pattern().start_of_input().string("v=").use(time_24h).end_of_input() - assert embedded("v=" + "23:59") - assert not embedded("23:59") - - -def test_atom_regex_string_is_non_empty(): - fragment = time_24h.to_regex_string() - assert fragment - assert isinstance(fragment, str) diff --git a/tests/atoms/uuid.test.py b/tests/atoms/uuid.test.py new file mode 100644 index 0000000..b085719 --- /dev/null +++ b/tests/atoms/uuid.test.py @@ -0,0 +1,26 @@ +from edify import Pattern +from edify.atoms import uuid + + +def _anchored(): + return Pattern().start_of_input().use(uuid).end_of_input() + + +def test_accepts_sample_from_shape(): + assert _anchored()("550e8400-e29b-41d4-a716-446655440000") + + +def test_rejects_off_shape_input(): + assert not _anchored()("nope") + + +def test_atom_composes_inside_a_larger_pattern(): + embedded = Pattern().start_of_input().string("v=").use(uuid).end_of_input() + assert embedded("v=" + "550e8400-e29b-41d4-a716-446655440000") + assert not embedded("550e8400-e29b-41d4-a716-446655440000") + + +def test_atom_regex_string_is_non_empty(): + fragment = uuid.to_regex_string() + assert fragment + assert isinstance(fragment, str) diff --git a/tests/atoms/uuid_v4.test.py b/tests/atoms/uuid_v4.test.py deleted file mode 100644 index d672aa5..0000000 --- a/tests/atoms/uuid_v4.test.py +++ /dev/null @@ -1,26 +0,0 @@ -from edify import Pattern -from edify.atoms import uuid_v4 - - -def _anchored(): - return Pattern().start_of_input().use(uuid_v4).end_of_input() - - -def test_accepts_sample_from_shape(): - assert _anchored()("550e8400-e29b-41d4-a716-446655440000") - - -def test_rejects_off_shape_input(): - assert not _anchored()("nope") - - -def test_atom_composes_inside_a_larger_pattern(): - embedded = Pattern().start_of_input().string("v=").use(uuid_v4).end_of_input() - assert embedded("v=" + "550e8400-e29b-41d4-a716-446655440000") - assert not embedded("550e8400-e29b-41d4-a716-446655440000") - - -def test_atom_regex_string_is_non_empty(): - fragment = uuid_v4.to_regex_string() - assert fragment - assert isinstance(fragment, str) -- cgit v1.2.3