glitchlings 0.4.0__cp311-cp311-macosx_11_0_universal2.whl → 0.4.2__cp311-cp311-macosx_11_0_universal2.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


This version of glitchlings might be problematic. Click here for more details.

Files changed (39) hide show
  1. glitchlings/__init__.py +26 -17
  2. glitchlings/__main__.py +0 -1
  3. glitchlings/_zoo_rust.cpython-311-darwin.so +0 -0
  4. glitchlings/compat.py +215 -0
  5. glitchlings/config.py +136 -19
  6. glitchlings/dlc/_shared.py +68 -0
  7. glitchlings/dlc/huggingface.py +26 -41
  8. glitchlings/dlc/prime.py +64 -101
  9. glitchlings/lexicon/__init__.py +26 -19
  10. glitchlings/lexicon/_cache.py +104 -0
  11. glitchlings/lexicon/graph.py +18 -39
  12. glitchlings/lexicon/metrics.py +1 -8
  13. glitchlings/lexicon/vector.py +29 -67
  14. glitchlings/lexicon/wordnet.py +39 -30
  15. glitchlings/main.py +9 -13
  16. glitchlings/util/__init__.py +18 -4
  17. glitchlings/util/adapters.py +27 -0
  18. glitchlings/zoo/__init__.py +21 -14
  19. glitchlings/zoo/_ocr_confusions.py +1 -3
  20. glitchlings/zoo/_rate.py +1 -4
  21. glitchlings/zoo/_sampling.py +0 -1
  22. glitchlings/zoo/_text_utils.py +1 -5
  23. glitchlings/zoo/adjax.py +0 -2
  24. glitchlings/zoo/core.py +185 -56
  25. glitchlings/zoo/jargoyle.py +9 -14
  26. glitchlings/zoo/mim1c.py +11 -10
  27. glitchlings/zoo/redactyl.py +5 -8
  28. glitchlings/zoo/reduple.py +3 -1
  29. glitchlings/zoo/rushmore.py +2 -8
  30. glitchlings/zoo/scannequin.py +5 -4
  31. glitchlings/zoo/typogre.py +3 -7
  32. glitchlings/zoo/zeedub.py +2 -2
  33. {glitchlings-0.4.0.dist-info → glitchlings-0.4.2.dist-info}/METADATA +68 -4
  34. glitchlings-0.4.2.dist-info/RECORD +42 -0
  35. glitchlings-0.4.0.dist-info/RECORD +0 -38
  36. {glitchlings-0.4.0.dist-info → glitchlings-0.4.2.dist-info}/WHEEL +0 -0
  37. {glitchlings-0.4.0.dist-info → glitchlings-0.4.2.dist-info}/entry_points.txt +0 -0
  38. {glitchlings-0.4.0.dist-info → glitchlings-0.4.2.dist-info}/licenses/LICENSE +0 -0
  39. {glitchlings-0.4.0.dist-info → glitchlings-0.4.2.dist-info}/top_level.txt +0 -0
@@ -9,9 +9,11 @@ from glitchlings.lexicon import Lexicon, get_default_lexicon
9
9
  try: # pragma: no cover - optional WordNet dependency
10
10
  from glitchlings.lexicon.wordnet import (
11
11
  WordNetLexicon,
12
+ )
13
+ from glitchlings.lexicon.wordnet import (
12
14
  dependencies_available as _lexicon_dependencies_available,
13
- ensure_wordnet as _lexicon_ensure_wordnet,
14
15
  )
16
+ from glitchlings.lexicon.wordnet import ensure_wordnet as _lexicon_ensure_wordnet
15
17
  except Exception: # pragma: no cover - triggered when nltk unavailable
16
18
  WordNetLexicon = None # type: ignore[assignment]
17
19
 
@@ -33,7 +35,6 @@ ensure_wordnet = _lexicon_ensure_wordnet
33
35
 
34
36
  def dependencies_available() -> bool:
35
37
  """Return ``True`` when a synonym backend is accessible."""
36
-
37
38
  if _lexicon_dependencies_available():
38
39
  return True
39
40
 
@@ -58,7 +59,6 @@ _VALID_POS: tuple[PartOfSpeech, ...] = ("n", "v", "a", "r")
58
59
 
59
60
  def _split_token(token: str) -> tuple[str, str, str]:
60
61
  """Split a token into leading punctuation, core word, and trailing punctuation."""
61
-
62
62
  match = re.match(r"^(\W*)(.*?)(\W*)$", token)
63
63
  if not match:
64
64
  return "", token, ""
@@ -70,23 +70,18 @@ def _normalize_parts_of_speech(
70
70
  part_of_speech: PartOfSpeechInput,
71
71
  ) -> NormalizedPartsOfSpeech:
72
72
  """Coerce user input into a tuple of valid WordNet POS tags."""
73
-
74
73
  if isinstance(part_of_speech, str):
75
74
  lowered = part_of_speech.lower()
76
75
  if lowered == "any":
77
76
  return _VALID_POS
78
77
  if lowered not in _VALID_POS:
79
- raise ValueError(
80
- "part_of_speech must be one of 'n', 'v', 'a', 'r', or 'any'"
81
- )
78
+ raise ValueError("part_of_speech must be one of 'n', 'v', 'a', 'r', or 'any'")
82
79
  return (cast(PartOfSpeech, lowered),)
83
80
 
84
81
  normalized: list[PartOfSpeech] = []
85
82
  for pos in part_of_speech:
86
83
  if pos not in _VALID_POS:
87
- raise ValueError(
88
- "part_of_speech entries must be one of 'n', 'v', 'a', or 'r'"
89
- )
84
+ raise ValueError("part_of_speech entries must be one of 'n', 'v', 'a', or 'r'")
90
85
  if pos not in normalized:
91
86
  normalized.append(pos)
92
87
  if not normalized:
@@ -118,6 +113,7 @@ def substitute_random_synonyms(
118
113
  """Replace words with random lexicon-driven synonyms.
119
114
 
120
115
  Parameters
116
+ ----------
121
117
  - text: Input text.
122
118
  - rate: Max proportion of candidate words to replace (default 0.01).
123
119
  - part_of_speech: WordNet POS tag(s) to target. Accepts "n", "v", "a", "r",
@@ -134,6 +130,7 @@ def substitute_random_synonyms(
134
130
  - Replacement positions chosen via rng.sample.
135
131
  - Synonyms sourced through the lexicon; the default backend derives
136
132
  deterministic subsets per word and part-of-speech using the active seed.
133
+
137
134
  """
138
135
  effective_rate = resolve_rate(
139
136
  rate=rate,
@@ -168,7 +165,7 @@ def substitute_random_synonyms(
168
165
  # Split but keep whitespace separators so we can rebuild easily
169
166
  tokens = re.split(r"(\s+)", text)
170
167
 
171
- # Collect indices of candidate tokens (even positions 0,2,.. are words given our split design)
168
+ # Collect candidate word indices (even positions are words because separators are kept)
172
169
  candidate_indices: list[int] = []
173
170
  candidate_metadata: dict[int, CandidateInfo] = {}
174
171
  for idx, tok in enumerate(tokens):
@@ -296,9 +293,7 @@ class Jargoyle(Glitchling):
296
293
  current_lexicon.reseed(self.seed)
297
294
  else:
298
295
  if hasattr(self, "_external_lexicon_original_seed"):
299
- original_seed = getattr(
300
- self, "_external_lexicon_original_seed", None
301
- )
296
+ original_seed = getattr(self, "_external_lexicon_original_seed", None)
302
297
  current_lexicon.reseed(original_seed)
303
298
  elif canonical == "lexicon" and isinstance(value, Lexicon):
304
299
  if getattr(self, "_initializing", False):
glitchlings/zoo/mim1c.py CHANGED
@@ -1,11 +1,11 @@
1
- from collections.abc import Collection
2
1
  import random
2
+ from collections.abc import Collection
3
3
  from typing import Literal
4
4
 
5
5
  from confusable_homoglyphs import confusables
6
6
 
7
- from .core import AttackOrder, AttackWave, Glitchling
8
7
  from ._rate import resolve_rate
8
+ from .core import AttackOrder, AttackWave, Glitchling
9
9
 
10
10
 
11
11
  def swap_homoglyphs(
@@ -21,16 +21,21 @@ def swap_homoglyphs(
21
21
  """Replace characters with visually confusable homoglyphs.
22
22
 
23
23
  Parameters
24
+ ----------
24
25
  - text: Input text.
25
26
  - rate: Max proportion of eligible characters to replace (default 0.02).
26
- - classes: Restrict replacements to these Unicode script classes (default ["LATIN","GREEK","CYRILLIC"]). Use "all" to allow any.
27
+ - classes: Restrict replacements to these Unicode script classes (default
28
+ ["LATIN", "GREEK", "CYRILLIC"]). Use "all" to allow any.
27
29
  - banned_characters: Characters that must never appear as replacements.
28
30
  - seed: Optional seed if `rng` not provided.
29
31
  - rng: Optional RNG; overrides seed.
30
32
 
31
33
  Notes
32
- - Only replaces characters present in confusables.confusables_data with single-codepoint alternatives.
34
+ -----
35
+ - Only replaces characters present in ``confusables.confusables_data`` with
36
+ single-codepoint alternatives.
33
37
  - Maintains determinism by shuffling candidates and sampling via the provided RNG.
38
+
34
39
  """
35
40
  effective_rate = resolve_rate(
36
41
  rate=rate,
@@ -46,9 +51,7 @@ def swap_homoglyphs(
46
51
  classes = ["LATIN", "GREEK", "CYRILLIC"]
47
52
 
48
53
  target_chars = [char for char in text if char.isalnum()]
49
- confusable_chars = [
50
- char for char in target_chars if char in confusables.confusables_data
51
- ]
54
+ confusable_chars = [char for char in target_chars if char in confusables.confusables_data]
52
55
  clamped_rate = max(0.0, effective_rate)
53
56
  num_replacements = int(len(confusable_chars) * clamped_rate)
54
57
  done = 0
@@ -57,9 +60,7 @@ def swap_homoglyphs(
57
60
  for char in confusable_chars:
58
61
  if done >= num_replacements:
59
62
  break
60
- options = [
61
- o["c"] for o in confusables.confusables_data[char] if len(o["c"]) == 1
62
- ]
63
+ options = [o["c"] for o in confusables.confusables_data[char] if len(o["c"]) == 1]
63
64
  if classes != "all":
64
65
  options = [opt for opt in options if confusables.alias(opt) in classes]
65
66
  if banned_set:
@@ -1,5 +1,5 @@
1
- import re
2
1
  import random
2
+ import re
3
3
  from typing import Any
4
4
 
5
5
  from ._rate import resolve_rate
@@ -32,24 +32,22 @@ def _python_redact_words(
32
32
  """Redact random words by replacing their characters.
33
33
 
34
34
  Parameters
35
+ ----------
35
36
  - text: Input text.
36
37
  - replacement_char: The character to use for redaction (default FULL_BLOCK).
37
38
  - rate: Max proportion of words to redact (default 0.05).
38
39
  - merge_adjacent: If True, merges adjacent redactions across intervening non-word chars.
39
40
  - rng: RNG used for sampling decisions.
40
41
  - unweighted: When True, sample words uniformly instead of by length.
42
+
41
43
  """
42
44
  tokens = split_preserving_whitespace(text)
43
45
  word_tokens = collect_word_tokens(tokens)
44
46
  if not word_tokens:
45
- raise ValueError(
46
- "Cannot redact words because the input text contains no redactable words."
47
- )
47
+ raise ValueError("Cannot redact words because the input text contains no redactable words.")
48
48
 
49
49
  population = [token.index for token in word_tokens]
50
- weights = [
51
- 1.0 if unweighted else float(token.core_length) for token in word_tokens
52
- ]
50
+ weights = [1.0 if unweighted else float(token.core_length) for token in word_tokens]
53
51
 
54
52
  clamped_rate = max(0.0, min(rate, 1.0))
55
53
  raw_quota = len(population) * clamped_rate
@@ -105,7 +103,6 @@ def redact_words(
105
103
  unweighted: bool = False,
106
104
  ) -> str:
107
105
  """Redact random words by replacing their characters."""
108
-
109
106
  effective_rate = resolve_rate(
110
107
  rate=rate,
111
108
  legacy_value=redaction_rate,
@@ -21,14 +21,17 @@ def _python_reduplicate_words(
21
21
  """Randomly reduplicate words in the text.
22
22
 
23
23
  Parameters
24
+ ----------
24
25
  - text: Input text.
25
26
  - rate: Max proportion of words to reduplicate (default 0.05).
26
27
  - rng: RNG used for sampling decisions.
27
28
  - unweighted: When True, sample words uniformly instead of length-weighted.
28
29
 
29
30
  Notes
31
+ -----
30
32
  - Preserves spacing and punctuation by tokenizing with separators.
31
33
  - Deterministic when run with a fixed seed or via Gaggle.
34
+
32
35
  """
33
36
  tokens = split_preserving_whitespace(text)
34
37
  word_tokens = collect_word_tokens(tokens)
@@ -77,7 +80,6 @@ def reduplicate_words(
77
80
  Falls back to the Python implementation when the optional Rust
78
81
  extension is unavailable.
79
82
  """
80
-
81
83
  effective_rate = resolve_rate(
82
84
  rate=rate,
83
85
  legacy_value=reduplication_rate,
@@ -21,7 +21,6 @@ def _python_delete_random_words(
21
21
  unweighted: bool = False,
22
22
  ) -> str:
23
23
  """Delete random words from the input text while preserving whitespace."""
24
-
25
24
  effective_rate = max(rate, 0.0)
26
25
  if effective_rate <= 0.0:
27
26
  return text
@@ -37,15 +36,11 @@ def _python_delete_random_words(
37
36
  if not weighted_tokens:
38
37
  return text
39
38
 
40
- allowed_deletions = min(
41
- len(weighted_tokens), math.floor(len(weighted_tokens) * effective_rate)
42
- )
39
+ allowed_deletions = min(len(weighted_tokens), math.floor(len(weighted_tokens) * effective_rate))
43
40
  if allowed_deletions <= 0:
44
41
  return text
45
42
 
46
- mean_weight = sum(weight for _, weight, _ in weighted_tokens) / len(
47
- weighted_tokens
48
- )
43
+ mean_weight = sum(weight for _, weight, _ in weighted_tokens) / len(weighted_tokens)
49
44
 
50
45
  deletions = 0
51
46
  for index, weight, token in weighted_tokens:
@@ -88,7 +83,6 @@ def delete_random_words(
88
83
 
89
84
  Uses the optional Rust implementation when available.
90
85
  """
91
-
92
86
  effective_rate = resolve_rate(
93
87
  rate=rate,
94
88
  legacy_value=max_deletion_rate,
@@ -1,10 +1,10 @@
1
- import re
2
1
  import random
2
+ import re
3
3
  from typing import Any
4
4
 
5
5
  from ._ocr_confusions import load_confusion_table
6
- from .core import Glitchling, AttackWave, AttackOrder
7
6
  from ._rate import resolve_rate
7
+ from .core import AttackOrder, AttackWave, Glitchling
8
8
 
9
9
  try:
10
10
  from glitchlings._zoo_rust import ocr_artifacts as _ocr_artifacts_rust
@@ -21,17 +21,20 @@ def _python_ocr_artifacts(
21
21
  """Introduce OCR-like artifacts into text.
22
22
 
23
23
  Parameters
24
+ ----------
24
25
  - text: Input text to corrupt.
25
26
  - rate: Max proportion of eligible confusion matches to replace (default 0.02).
26
27
  - seed: Optional seed if `rng` not provided.
27
28
  - rng: Optional RNG; overrides seed.
28
29
 
29
30
  Notes
31
+ -----
30
32
  - Uses a curated set of common OCR confusions (rn↔m, cl↔d, O↔0, l/I/1, etc.).
31
33
  - Collects all non-overlapping candidate spans in reading order, then samples
32
34
  a subset deterministically with the provided RNG.
33
35
  - Replacements can change length (e.g., m→rn), so edits are applied from left
34
36
  to right using precomputed spans to avoid index drift.
37
+
35
38
  """
36
39
  if not text:
37
40
  return text
@@ -107,7 +110,6 @@ def ocr_artifacts(
107
110
 
108
111
  Prefers the Rust implementation when available.
109
112
  """
110
-
111
113
  if not text:
112
114
  return text
113
115
 
@@ -164,7 +166,6 @@ class Scannequin(Glitchling):
164
166
  return {"type": "ocr", "error_rate": float(rate)}
165
167
 
166
168
 
167
-
168
169
  scannequin = Scannequin()
169
170
 
170
171
 
@@ -4,9 +4,9 @@ import math
4
4
  import random
5
5
  from typing import Any, Optional
6
6
 
7
- from .core import Glitchling, AttackWave, AttackOrder
8
- from ._rate import resolve_rate
9
7
  from ..util import KEYNEIGHBORS
8
+ from ._rate import resolve_rate
9
+ from .core import AttackOrder, AttackWave, Glitchling
10
10
 
11
11
  try:
12
12
  from glitchlings._zoo_rust import fatfinger as _fatfinger_rust
@@ -64,9 +64,7 @@ def _python_eligible_idx(s: str, i: int) -> bool:
64
64
  return left_ok and right_ok
65
65
 
66
66
 
67
- def _python_draw_eligible_index(
68
- rng: random.Random, s: str, max_tries: int = 16
69
- ) -> Optional[int]:
67
+ def _python_draw_eligible_index(rng: random.Random, s: str, max_tries: int = 16) -> Optional[int]:
70
68
  n = len(s)
71
69
  if n == 0:
72
70
  return None
@@ -151,7 +149,6 @@ def fatfinger(
151
149
  max_change_rate: float | None = None,
152
150
  ) -> str:
153
151
  """Introduce character-level "fat finger" edits with a Rust fast path."""
154
-
155
152
  effective_rate = resolve_rate(
156
153
  rate=rate,
157
154
  legacy_value=max_change_rate,
@@ -230,4 +227,3 @@ typogre = Typogre()
230
227
 
231
228
 
232
229
  __all__ = ["Typogre", "typogre"]
233
-
glitchlings/zoo/zeedub.py CHANGED
@@ -3,9 +3,10 @@ from __future__ import annotations
3
3
  import math
4
4
  import random
5
5
  from collections.abc import Sequence
6
+ from typing import Any
6
7
 
7
- from .core import Glitchling, AttackWave, AttackOrder
8
8
  from ._rate import resolve_rate
9
+ from .core import AttackOrder, AttackWave, Glitchling
9
10
 
10
11
  try:
11
12
  from glitchlings._zoo_rust import inject_zero_widths as _inject_zero_widths_rust
@@ -77,7 +78,6 @@ def insert_zero_widths(
77
78
  characters: Sequence[str] | None = None,
78
79
  ) -> str:
79
80
  """Inject zero-width characters between non-space character pairs."""
80
-
81
81
  effective_rate = resolve_rate(
82
82
  rate=rate,
83
83
  legacy_value=None,
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: glitchlings
3
- Version: 0.4.0
3
+ Version: 0.4.2
4
4
  Summary: Monsters for your language games.
5
5
  Author: osoleve
6
6
  License: Apache License
@@ -239,6 +239,16 @@ Provides-Extra: dev
239
239
  Requires-Dist: pytest>=8.0.0; extra == "dev"
240
240
  Requires-Dist: hypothesis>=6.140.0; extra == "dev"
241
241
  Requires-Dist: numpy<=2.0,>=1.24; extra == "dev"
242
+ Requires-Dist: mkdocs>=1.6.0; extra == "dev"
243
+ Requires-Dist: mkdocstrings[python]>=0.24.0; extra == "dev"
244
+ Requires-Dist: mkdocs-material>=9.5.0; extra == "dev"
245
+ Requires-Dist: mkdocstrings-python>=1.10.0; extra == "dev"
246
+ Requires-Dist: interrogate>=1.5.0; extra == "dev"
247
+ Requires-Dist: black>=24.4.0; extra == "dev"
248
+ Requires-Dist: isort>=5.13.0; extra == "dev"
249
+ Requires-Dist: ruff>=0.6.0; extra == "dev"
250
+ Requires-Dist: mypy>=1.8.0; extra == "dev"
251
+ Requires-Dist: pre-commit>=3.8.0; extra == "dev"
242
252
  Dynamic: license-file
243
253
 
244
254
  #
@@ -338,10 +348,66 @@ They're horrible little gremlins, but they're not _unreasonable_.
338
348
 
339
349
  Keyboard warriors can challenge them directly via the `glitchlings` command:
340
350
 
351
+ <!-- BEGIN: CLI_USAGE -->
341
352
  ```bash
342
353
  # Discover which glitchlings are currently on the loose.
343
354
  glitchlings --list
355
+ ```
356
+
357
+ ```text
358
+ Typogre — scope: Character, order: early
359
+ Mim1c — scope: Character, order: last
360
+ Jargoyle — scope: Word, order: normal
361
+ Adjax — scope: Word, order: normal
362
+ Reduple — scope: Word, order: normal
363
+ Rushmore — scope: Word, order: normal
364
+ Redactyl — scope: Word, order: normal
365
+ Scannequin — scope: Character, order: late
366
+ Zeedub — scope: Character, order: last
367
+ ```
368
+
369
+ ```bash
370
+ # Review the full CLI contract.
371
+ glitchlings --help
372
+ ```
344
373
 
374
+ ```text
375
+ usage: glitchlings [-h] [-g SPEC] [-s SEED] [-f FILE] [--sample] [--diff]
376
+ [--list] [-c CONFIG]
377
+ [text]
378
+
379
+ Summon glitchlings to corrupt text. Provide input text as an argument, via
380
+ --file, or pipe it on stdin.
381
+
382
+ positional arguments:
383
+ text Text to corrupt. If omitted, stdin is used or --sample
384
+ provides fallback text.
385
+
386
+ options:
387
+ -h, --help show this help message and exit
388
+ -g SPEC, --glitchling SPEC
389
+ Glitchling to apply, optionally with parameters like
390
+ Typogre(rate=0.05). Repeat for multiples; defaults to
391
+ all built-ins.
392
+ -s SEED, --seed SEED Seed controlling deterministic corruption order
393
+ (default: 151).
394
+ -f FILE, --file FILE Read input text from a file instead of the command
395
+ line argument.
396
+ --sample Use the included SAMPLE_TEXT when no other input is
397
+ provided.
398
+ --diff Show a unified diff between the original and corrupted
399
+ text.
400
+ --list List available glitchlings and exit.
401
+ -c CONFIG, --config CONFIG
402
+ Load glitchlings from a YAML configuration file.
403
+ ```
404
+ <!-- END: CLI_USAGE -->
405
+
406
+ Run `python docs/build_cli_reference.py` whenever you tweak the CLI so the README stays in sync with the actual output. The script executes the commands above and replaces the block between the markers automatically.
407
+
408
+ Prefer inline tweaks? You can still configure glitchlings directly in the shell:
409
+
410
+ ```bash
345
411
  # Run Typogre against the contents of a file and inspect the diff.
346
412
  glitchlings -g typogre --file documents/report.txt --diff
347
413
 
@@ -355,8 +421,6 @@ echo "Beware LLM-written flavor-text" | glitchlings -g mim1c
355
421
  glitchlings --config experiments/chaos.yaml "Let slips the glitchlings of war"
356
422
  ```
357
423
 
358
- Use `--help` for a complete breakdown of available options, including support for parameterised glitchlings via `-g "Name(arg=value, ...)"` to mirror the Python API.
359
-
360
424
  Attack configurations live in plain YAML files so you can version-control experiments without touching code:
361
425
 
362
426
  ```yaml
@@ -420,7 +484,7 @@ _How can a computer need reading glasses?_
420
484
 
421
485
  ### Zeedub
422
486
 
423
- _A whispering glyph parasite that lives in the interstices of codepoints, marking territory with invisible traces._
487
+ _Watch your step around here._
424
488
 
425
489
  > _**Invisible Ink.**_ Zeedub slips zero-width codepoints between non-space character pairs, forcing models to reason about text whose visible form masks hidden glyphs.
426
490
  >
@@ -0,0 +1,42 @@
1
+ glitchlings/__init__.py,sha256=qAV0OXtnIGs4YnG_L9xUt9bhTcVhYKrDHfN6ZcBMMX4,1114
2
+ glitchlings/__main__.py,sha256=f-P4jiVBd7ZpS6QxRpa_6SJgOG03UhZhcWasMDRWLs8,120
3
+ glitchlings/_zoo_rust.cpython-311-darwin.so,sha256=WTXzOqP-45v51MizLNyiDaJwbeEnBLv88VZyeySMXB0,2488368
4
+ glitchlings/compat.py,sha256=BdGFf4cKbbHbmLPirNT3U76AXhSn3vpZ59DfNdEQWPQ,6827
5
+ glitchlings/config.py,sha256=TshOTvVlQOhokDTteTMTti-7S2qWnVUJR4LyBYDhQAQ,12638
6
+ glitchlings/config.toml,sha256=MWwgbx1-KIRAY3JZmMrCVbZNxFjHgRJXbtNAVuUNcxY,108
7
+ glitchlings/main.py,sha256=FIpDIqN42HCDCSpsU_JkSzyWC-ugszArwCLfmq_ZCYU,10090
8
+ glitchlings/dlc/__init__.py,sha256=eTLEEWrVWPqniXHqee4W23H1rjElI1PQ_jcqWFe9D3g,141
9
+ glitchlings/dlc/_shared.py,sha256=EFSnush3rjjaf4La5QfVaf_KEp0U_l_3-q4PKx0A6NQ,1972
10
+ glitchlings/dlc/huggingface.py,sha256=9lW7TnTHA_bXyo4Is8pymZchrB9BIL1bMCP2p7LCMtg,2576
11
+ glitchlings/dlc/prime.py,sha256=qGFI1d4BiOEIgQZ5v9QnlbYx4J4q-vNlh5tWZng11xs,8607
12
+ glitchlings/lexicon/__init__.py,sha256=myW5MPFBvsurdisvolE6ECfUraO_mF8Dhyp_KhWxIGs,6244
13
+ glitchlings/lexicon/_cache.py,sha256=KQBesSY-XkH2WwM7Xa_LAPbJEZgIARb2odgrZIHrme8,3948
14
+ glitchlings/lexicon/graph.py,sha256=BbK1YfD9vgfQGDg-QTRegII10IDrervAsu6e20gTFPs,10057
15
+ glitchlings/lexicon/metrics.py,sha256=VBFfFpxjiEwZtK-jS55H8xP7MTC_0OjY8lQ5zSQ9aTY,4572
16
+ glitchlings/lexicon/vector.py,sha256=ILK727WItcHYIRqSVnaAAbGIlj9QTTqjbwHy43UXdb0,19671
17
+ glitchlings/lexicon/wordnet.py,sha256=05ApyN9h0bSw0PQEfjZUeInmGWphxVIuGASc8Zoc5n0,6313
18
+ glitchlings/lexicon/data/default_vector_cache.json,sha256=7obKHqmR3odbTfgJPWLSRFYFh4J_6uvv_CntCSe_EjI,725
19
+ glitchlings/util/__init__.py,sha256=vc3EAY8ehRjbOiryFdaqvvljXcyNGtZSPiEp9ok1vVw,4674
20
+ glitchlings/util/adapters.py,sha256=psxQFYSFmh1u7NuqtIrKwQP5FOhOrZoxZzc7X7DDi9U,693
21
+ glitchlings/zoo/__init__.py,sha256=lu1wnD-lRDJy8uTJKVRwL4qL-nyb0Vyfz9GbiOletCI,5107
22
+ glitchlings/zoo/_ocr_confusions.py,sha256=Ju2_avXiwsr1p8zWFUTOzMxJ8vT5PpYobuGIn4L_sqI,1204
23
+ glitchlings/zoo/_rate.py,sha256=Vb1_5HAzrqr9eAh_zzngSV-d0zI264zcYspnT3VHPkE,504
24
+ glitchlings/zoo/_sampling.py,sha256=KrWyUSsYXghlvktS5hQBO0bPqywEEyA49A2qDWInB7Q,1586
25
+ glitchlings/zoo/_text_utils.py,sha256=fS5L_eq-foBbBdiv4ymI8-O0D0csc3yDekHpX8bqfV4,2754
26
+ glitchlings/zoo/adjax.py,sha256=VJgUasyAk7K3E23B5PzoJ5HaqWtcPJG649TzQRAHraA,3528
27
+ glitchlings/zoo/core.py,sha256=yuCgLXFWJtu2fLOJoCWLtHspbcTFRZhUKobv1AlqKqs,19385
28
+ glitchlings/zoo/jargoyle.py,sha256=sUhCy_0sD0KOAHQKRmy9PTu9FwJitaSBDxdhuX9j7ME,11452
29
+ glitchlings/zoo/mim1c.py,sha256=-fgodKWZq--Xw8L2t1EqNbsh48bwX5jZxmiXdoaQShI,3437
30
+ glitchlings/zoo/ocr_confusions.tsv,sha256=KhtR7vJDTITpfTSGa-I7RHr6CK7LkGi2KjdhEWipI6o,183
31
+ glitchlings/zoo/redactyl.py,sha256=6WgHIVumzRaDIyuLbewTJW5TXBs7s1CsKDPVXP4gkJc,5436
32
+ glitchlings/zoo/reduple.py,sha256=GC1Sq4Ch7WOxL6gQZ9Ogs5EgXU2HkktLeMRVObBYFe4,4241
33
+ glitchlings/zoo/rushmore.py,sha256=zxwiwcHHXHGLv8JLvKS4d0cduZ0qnwO9mcKOwXlMA1M,4305
34
+ glitchlings/zoo/scannequin.py,sha256=JBpiSAnuSgCaEgPwCgSItiHms32wdLNXLPMotaBpYAs,4883
35
+ glitchlings/zoo/typogre.py,sha256=7CHGfBkP4W2Bh8MCxtketA-3nlCb5QRCTUthRnXEhnk,6660
36
+ glitchlings/zoo/zeedub.py,sha256=N4MBwWDRgcspLRlOCSAZ0hdwdnIj4h6uZLaJDFExj6Y,4823
37
+ glitchlings-0.4.2.dist-info/licenses/LICENSE,sha256=YCvGip-LoaRyu6h0nPo71q6eHEkzUpsE11psDJOIRkw,11337
38
+ glitchlings-0.4.2.dist-info/METADATA,sha256=1jm8iwNC4bhfp3nSc-O8POL_U0Fr6fw2RvvADpyxuqg,30721
39
+ glitchlings-0.4.2.dist-info/WHEEL,sha256=Tgp8Vc-mmQm0KX-V22BSUoymoX1p0w13bZbX85y8hSs,114
40
+ glitchlings-0.4.2.dist-info/entry_points.txt,sha256=kGOwuAsjFDLtztLisaXtOouq9wFVMOJg5FzaAkg-Hto,54
41
+ glitchlings-0.4.2.dist-info/top_level.txt,sha256=VHFNBrLjtDwPCYXbGKi6o17Eueedi81eNbR3hBOoST0,12
42
+ glitchlings-0.4.2.dist-info/RECORD,,
@@ -1,38 +0,0 @@
1
- glitchlings/__init__.py,sha256=hEmQ1rl3G5uZBDbfJX_W4aIUNSsPAsy_Ai5DgQHasvk,813
2
- glitchlings/__main__.py,sha256=EOiBgay0x6B9VlSDzSQvMuoq6bHJdSvFSgcAVGGKkd4,121
3
- glitchlings/_zoo_rust.cpython-311-darwin.so,sha256=l05pofs9b3aNpJ9yj9RTt7_DGzFP_aQl3BiEkWDjFyA,2450000
4
- glitchlings/config.py,sha256=hwkcMkhEvUzK8FECgG6kbf_4MpMQcopskiSgXzK5B3o,7785
5
- glitchlings/config.toml,sha256=MWwgbx1-KIRAY3JZmMrCVbZNxFjHgRJXbtNAVuUNcxY,108
6
- glitchlings/main.py,sha256=Rw9pCgNrGxwzC1rZbbng7cHUP9xlL0WWWTdjW95XiSM,10084
7
- glitchlings/dlc/__init__.py,sha256=eTLEEWrVWPqniXHqee4W23H1rjElI1PQ_jcqWFe9D3g,141
8
- glitchlings/dlc/huggingface.py,sha256=I1QWanWVxO02awgSpHDtgQEVF-9AQRLtsta2RCitWhE,2933
9
- glitchlings/dlc/prime.py,sha256=wpRMNtgka1vNlEzifeCjGMp1q_-QclZn3NxXczGnNpM,9278
10
- glitchlings/lexicon/__init__.py,sha256=-w35jPtg7WCP_IfRxAUZBNFXeSnlIaVfbJiPDI3f3K4,5663
11
- glitchlings/lexicon/graph.py,sha256=_2w5shu-fEieDN-egpqLvMu0rxG78RAQWqENU0r7PlM,10533
12
- glitchlings/lexicon/metrics.py,sha256=W8TCemZaCjBOUSX8G7JdgQAbMykXXfRTfodkDSkc3aQ,4599
13
- glitchlings/lexicon/vector.py,sha256=Qqspc8KR4hqJiTTiXnu8DCIp2ROYPgEKK4RM4kLkyGY,20284
14
- glitchlings/lexicon/wordnet.py,sha256=FwjTtVPOQEmWEXL0Sl4faM-C4PPNkDu_z7-FyINlh3c,5652
15
- glitchlings/lexicon/data/default_vector_cache.json,sha256=7obKHqmR3odbTfgJPWLSRFYFh4J_6uvv_CntCSe_EjI,725
16
- glitchlings/util/__init__.py,sha256=7KiZ0gKMjocfd34cajneZhTqYb7Hkwi_PpjltPqvkNI,4498
17
- glitchlings/zoo/__init__.py,sha256=eFYmaWeFDlSqfaiED51HWM-OqiTo_BOz0ASeyhOwOsw,4818
18
- glitchlings/zoo/_ocr_confusions.py,sha256=MkCbwk9T24SO2pD3JNPajYCfpMMlm2vQ5_sJty5GoXE,1218
19
- glitchlings/zoo/_rate.py,sha256=TMyfVFV7pLxSGVswPlOAtBvk25Bjtx5xXTtpb_utgik,527
20
- glitchlings/zoo/_sampling.py,sha256=VOSWDgYWXIiAuKxn2IckFJhpRgGotQP_KW28db8kTKI,1587
21
- glitchlings/zoo/_text_utils.py,sha256=nAfFT_VdXMXciCR7eQ5EAmym5wvzL6_Sdn9dvCx2s3Q,2758
22
- glitchlings/zoo/adjax.py,sha256=N3CzfM7m7mAYgFcQYLQkqK2VYLw_vFvEMBM2aNU--ZA,3530
23
- glitchlings/zoo/core.py,sha256=fhceCZKa9W1vVlhpR2zVKBXnzgJICB2-nmDywiqx4js,14207
24
- glitchlings/zoo/jargoyle.py,sha256=6-DJxUFz2AjT-iQDFlK2ZG9pVwq2boDtslEzCNyI_04,11481
25
- glitchlings/zoo/mim1c.py,sha256=yAt1ngR3j2KXLbzc8LhrQlIWRO_KT5dFK1EE8QivMAQ,3429
26
- glitchlings/zoo/ocr_confusions.tsv,sha256=KhtR7vJDTITpfTSGa-I7RHr6CK7LkGi2KjdhEWipI6o,183
27
- glitchlings/zoo/redactyl.py,sha256=H4PwAMBCIsDw1KBOBiTR3VUbRZwynqakwwfx3wHjVp8,5457
28
- glitchlings/zoo/reduple.py,sha256=Q9NRCdvUgaHvvJu8A0n6zW9v_L3pdmNZbWqaJ7uycw4,4216
29
- glitchlings/zoo/rushmore.py,sha256=J1wd4IB7WOAR2TdntkxCMZWseWR0Yii8UQZ7ucfpWCc,4335
30
- glitchlings/zoo/scannequin.py,sha256=Ps8nxysKjkJV408zaL1kjVjy4jliATDBpYcNHLWbNFg,4859
31
- glitchlings/zoo/typogre.py,sha256=0fYaxOEiTnxiCqmsiSN1r_wl1vC1Ueaiks2e94kks70,6668
32
- glitchlings/zoo/zeedub.py,sha256=l51swlo556-TXhDk4nayHOm1XgHwWmfUKzQ01YMuCpE,4801
33
- glitchlings-0.4.0.dist-info/licenses/LICENSE,sha256=YCvGip-LoaRyu6h0nPo71q6eHEkzUpsE11psDJOIRkw,11337
34
- glitchlings-0.4.0.dist-info/METADATA,sha256=Dldj4SIrrNF6TKAvvJghd_L4lVrzdViqb8DWMSvPWVE,28345
35
- glitchlings-0.4.0.dist-info/WHEEL,sha256=Tgp8Vc-mmQm0KX-V22BSUoymoX1p0w13bZbX85y8hSs,114
36
- glitchlings-0.4.0.dist-info/entry_points.txt,sha256=kGOwuAsjFDLtztLisaXtOouq9wFVMOJg5FzaAkg-Hto,54
37
- glitchlings-0.4.0.dist-info/top_level.txt,sha256=VHFNBrLjtDwPCYXbGKi6o17Eueedi81eNbR3hBOoST0,12
38
- glitchlings-0.4.0.dist-info/RECORD,,