|
| 1 | +#!/tmp/zstream-venv/bin/python3 |
| 2 | +"""Generate files with random names filled with lorem ipsum paragraphs.""" |
| 3 | + |
| 4 | +import argparse |
| 5 | +import random |
| 6 | +import sys |
| 7 | +from pathlib import Path |
| 8 | +from lorem_text import lorem |
| 9 | + |
| 10 | +ADJECTIVES = [ |
| 11 | + "boogie", "funky", "wobbly", "snazzy", "jazzy", "groovy", "zippy", |
| 12 | + "bouncy", "fluffy", "crunchy", "sparkly", "fuzzy", "spiffy", "dandy", |
| 13 | + "peppy", "snappy", "sassy", "zesty", "swanky", "nifty", "plucky", |
| 14 | + "quirky", "wacky", "goofy", "dizzy", "breezy", "cheery", "perky", |
| 15 | + "frisky", "chirpy", "feisty", "jolly", "lively", "merry", "spunky", |
| 16 | + "frisky", "zippy", "vivid", "brisk", "sunny", "witty", "kinky", |
| 17 | +] |
| 18 | + |
| 19 | +NOUNS = [ |
| 20 | + "woogie", "monkey", "noodle", "pickle", "muffin", "waffle", "pebble", |
| 21 | + "wobble", "doodle", "tangle", "giggle", "wiggle", "jiggle", "sparkle", |
| 22 | + "crinkle", "twinkle", "frizzle", "drizzle", "sizzle", "fizzle", |
| 23 | + "puddle", "bubble", "muddle", "huddle", "cuddle", "juggle", "muggle", |
| 24 | + "snuggle", "tuggle", "buggle", "nugget", "widget", "gadget", "gibbet", |
| 25 | + "trinket", "bracket", "racket", "jacket", "ticket", "cricket", "thicket", |
| 26 | + "biscuit", "circuit", "summit", "muppet", "trumpet", "basket", "casket", |
| 27 | +] |
| 28 | + |
| 29 | +def random_name(used: set) -> str: |
| 30 | + for _ in range(1000): |
| 31 | + name = f"{random.choice(ADJECTIVES)}-{random.choice(NOUNS)}" |
| 32 | + if name not in used: |
| 33 | + return name |
| 34 | + # Fallback: append a number |
| 35 | + base = f"{random.choice(ADJECTIVES)}-{random.choice(NOUNS)}" |
| 36 | + i = 2 |
| 37 | + while f"{base}-{i}" in used: |
| 38 | + i += 1 |
| 39 | + return f"{base}-{i}" |
| 40 | + |
| 41 | + |
| 42 | +def fill_file(path: Path, target_size: int, repeat=False) -> None: |
| 43 | + content_parts = [] |
| 44 | + total = 0 |
| 45 | + para = lorem.paragraph() |
| 46 | + while total < target_size: |
| 47 | + content_parts.append(para) |
| 48 | + total += len(para) + 1 # +1 for newline |
| 49 | + if not repeat: |
| 50 | + para = lorem.paragraph() |
| 51 | + path.write_text("\n\n".join(content_parts) + "\n") |
| 52 | + |
| 53 | + |
| 54 | +def main(): |
| 55 | + parser = argparse.ArgumentParser( |
| 56 | + description="Generate files with random names and lorem ipsum content." |
| 57 | + ) |
| 58 | + parser.add_argument("count", type=int, help="Number of files to create") |
| 59 | + parser.add_argument("-d", "--directory", default=".", help="Target directory (default: .)") |
| 60 | + parser.add_argument("-r", "--repeat", action="store_true", help="Fill files with reps of a single paragraph") |
| 61 | + parser.add_argument("--min-size", type=int, default=16384, help="Minimum file size in bytes (default: 2048)") |
| 62 | + parser.add_argument("--max-size", type=int, default=128000, help="Maximum file size in bytes (default: 128000)") |
| 63 | + args = parser.parse_args() |
| 64 | + |
| 65 | + if args.min_size >= args.max_size: |
| 66 | + print(f"error: min-size ({args.min_size}) must be less than max-size ({args.max_size})", file=sys.stderr) |
| 67 | + sys.exit(1) |
| 68 | + |
| 69 | + directory = Path(args.directory) |
| 70 | + directory.mkdir(parents=True, exist_ok=True) |
| 71 | + |
| 72 | + used_names = set() |
| 73 | + for i in range(args.count): |
| 74 | + name = random_name(used_names) |
| 75 | + used_names.add(name) |
| 76 | + target_size = random.randint(args.min_size, args.max_size) |
| 77 | + path = directory / name |
| 78 | + fill_file(path, target_size, args.repeat) |
| 79 | + print(f" {path} ({path.stat().st_size:,} bytes)") |
| 80 | + |
| 81 | + |
| 82 | +if __name__ == "__main__": |
| 83 | + main() |
0 commit comments