diff --git a/noid.py b/noid.py new file mode 100644 index 0000000..f4519d4 --- /dev/null +++ b/noid.py @@ -0,0 +1,80 @@ +#!/usr/bin/env python + +from dataclasses import dataclass, field +from typing import ClassVar + +@dataclass +class Counter(): + top: int + value: int + + +@dataclass +class Minter(): + legalstring: ClassVar[str] = "0123456789bcdfghjkmnpqrstvwxz" + alphacount: ClassVar[int] = len(legalstring) + digitcount: ClassVar[int] = 10 + + oacounter: int = 0 + template: str = "" + total: int = 0 + prefix: str = "" + mask: str = "" + active_counters: list[Counter] = field(default_factory=list) + inactive_counters: list[Counter] = field(default_factory=list) + + def parse_template(self, template: str) -> int: + """ + >>> m = Minter() + >>> m.parse_template("test") + -1 + >>> m.template + 'test' + >>> m.prefix + '' + >>> m.mask + 'test' + >>> m.parse_template("testkktest") + -1 + >>> m.parse_template("rtesk") + -1 + >>> m.parse_template("rteksk") + -1 + >>> m.parse_template("rtkkes") + -1 + >>> m.parse_template("reded") + 84100 + >>> m.parse_template("ed") + -1 + >>> m.parse_template("red") + 290 + >>> m.parse_template("redk") + 290 + """ + self.template = template + template = template.strip().removesuffix('/').strip() + try: + self.prefix, *_, self.mask = template.split(".") + except ValueError: + self.prefix = "" + self.mask = template + + if self.mask[0] not in ("r", "s", "z"): + return -1 # mask must begin with of the letters: r, s or z + if "k" in self.mask and (self.mask.count("k") > 1 or self.mask[-1] != "k"): + return -1 + if not all(char in ("d", "e") for char in self.mask.rstrip("k")[1:]): + return -1 + self.total = 1 + for chr in self.mask: + match chr: + case "e": + self.total *= self.alphacount + case "d": + self.total *= self.digitcount + return self.total + + +if __name__ == "__main__": + import doctest + doctest.testmod() diff --git a/uv.lock b/uv.lock new file mode 100644 index 0000000..dc242b1 --- /dev/null +++ b/uv.lock @@ -0,0 +1,8 @@ +version = 1 +revision = 3 +requires-python = ">=3.14" + +[[package]] +name = "noid" +version = "0.1.0" +source = { virtual = "." }