Skip to main content

Wishful thinking for Python

Project description

wishful ๐Ÿช„

"Code so good, you'd think it was wishful thinking"

Stop writing boilerplate. Start wishing for it instead.

wishful turns your wildest import dreams into reality. Just write the import you wish existed, and an LLM conjures up the code on the spot. The first run? Pure magic. Every run after? Blazing fast, because it's cached like real Python.

Think of it as wishful thinking, but for imports. The kind that actually works.

โœจ Quick Wish

1. Install the dream

pip install wishful

2. Set your credentials (litellm reads the usual suspects)

Export them or toss them in a .env file:

export OPENAI_API_KEY=... 
export DEFAULT_MODEL=azure/gpt-4.1
``

or

```bash
export AZURE_API_KEY=...
export AZURE_API_BASE=https://<your-endpoint>.openai.azure.com/
export AZURE_API_VERSION=2025-04-01-preview
export DEFAULT_MODEL=azure/gpt-4.1

or any provider else supported by litellm

3. Import your wildest fantasies

from wishful.text import extract_emails
from wishful.dates import to_yyyy_mm_dd

raw = "Contact us at team@example.com or sales@demo.dev"
print(extract_emails(raw))  # ['team@example.com', 'sales@demo.dev']
print(to_yyyy_mm_dd("31.12.2025"))  # '2025-12-31'

What just happened?

  • First import: wishful waves its wand ๐Ÿช„, asks the LLM to write extract_emails and to_yyyy_mm_dd, validates the code for safety, and caches it to .wishful/text.py and .wishful/dates.py.
  • Every subsequent run: instant. Just regular Python imports. No latency, no drama, no API calls.

It's like having a junior dev who never sleeps and always delivers exactly what you asked for (well, almost always).


๐ŸŽฏ Wishful Guidance: Help the AI Read Your Mind

Want better results? Drop hints. Literal comments. wishful reads the code around your import and forwards that context to the LLM.

# desired: parse standard nginx combined logs into list of dicts
from wishful.logs import parse_nginx_logs

records = parse_nginx_logs(Path("/var/log/nginx/access.log").read_text())

The AI sees your comment and knows exactly what you're after. It's like pair programming, but your partner is a disembodied intelligence with questionable opinions about semicolons.


๐Ÿ—„๏ธ Cache Ops: Because Sometimes Wishes Need Revising

Python API

import wishful

# See what you've wished for
wishful.inspect_cache()   # ['.wishful/text.py', '.wishful/dates.py']

# Regret a wish? Regenerate it
wishful.regenerate("wishful.text")  # Next import re-generates from scratch

# Nuclear option: forget everything
wishful.clear_cache()  # Deletes the entire .wishful/ directory

CLI Commands

wishful comes with a command-line interface for managing your cache:

# View all cached modules
wishful inspect

# Clear the entire cache
wishful clear

# Regenerate a specific module
wishful regen wishful.text

The cache is just regular Python files in .wishful/. Want to tweak the generated code? Edit it directly. It's your wish, after all.


โš™๏ธ Configuration: Fine-Tune Your Wishes

import wishful

wishful.configure(
    model="gpt-4o-mini",        # Switch models like changing channels
    cache_dir="/tmp/.wishful",  # Hide your wishes somewhere else
    spinner=False,              # Silence the "generating..." spinner
    review=True,                # Paranoid? Review code before it runs
    allow_unsafe=False,         # Keep the safety rails ON (recommended)
)

Environment Variables (for the env-obsessed)

Set these in your shell or .env file:

  • WISHFUL_MODEL / DEFAULT_MODEL โ€” which AI overlord to summon
  • WISHFUL_CACHE_DIR โ€” where to stash generated wishes (default: .wishful)
  • WISHFUL_REVIEW โ€” set to 1 to manually approve every wish (trust issues?)
  • WISHFUL_DEBUG โ€” verbose logging for when things go sideways
  • WISHFUL_UNSAFE โ€” set to 1 to disable safety checks (โš ๏ธ danger zone)
  • WISHFUL_SPINNER โ€” set to 0 to disable the fancy spinner
  • WISHFUL_MAX_TOKENS โ€” cap the LLM's verbosity (default: 800)
  • WISHFUL_TEMPERATURE โ€” creativity dial (default: 0 = boring but safe)

๐Ÿ›ก๏ธ Safety Rails: Wishful Isn't That Reckless

Generated code gets AST-scanned to block obviously dangerous patterns:

  • โŒ Imports like os, subprocess, sys
  • โŒ Calls to eval() or exec()
  • โŒ open() in write/append mode
  • โŒ Shenanigans like os.system() or subprocess.call()

Override at your own peril: WISHFUL_UNSAFE=1 or allow_unsafe=True turns off the guardrails.


๐Ÿงช Testing: Wishes Without Consequences

Need deterministic, offline behavior? Set WISHFUL_FAKE_LLM=1 and wishful will generate placeholder stub functions instead of hitting the network.

Perfect for CI, unit tests, or when your Wi-Fi is acting up.

export WISHFUL_FAKE_LLM=1
python my_tests.py  # No API calls, just predictable stubs

๐Ÿ”ฎ How the Magic Actually Works

Here's the 30-second version:

  1. Import hook: wishful installs a MagicFinder on sys.meta_path that intercepts wishful.* imports.
  2. Cache check: If .wishful/<module>.py exists, it loads instantly. No AI needed.
  3. LLM generation: If not cached, wishful calls the LLM (via litellm) to generate the code based on your import and surrounding context.
  4. Validation: The generated code is AST-parsed and safety-checked (unless you disabled that like a madman).
  5. Execution: Code is written to .wishful/, compiled, and executed as the import result.
  6. Transparency: The cache is just plain Python files. Edit them. Commit them. They're yours.

It's import hooks meets LLMs meets "why didn't this exist already?"


๐ŸŽญ Fun with Wishful Thinking

# Need some cosmic horror? Just wish for it.
from wishful.story import cosmic_horror_intro

intro = cosmic_horror_intro(
    setting="a deserted amusement park",
    word_count_at_least=100
)
print(intro)  # ๐ŸŽข๐Ÿ‘ป

# Math that writes itself
from wishful.numbers import primes_from_to, sum_list

total = sum_list(list=primes_from_to(1, 100))
print(total)  # 1060 (probably)

# Because who has time to write date parsers?
from wishful.dates import parse_fuzzy_date

print(parse_fuzzy_date("next Tuesday"))  # Your guess is as good as mine

๐Ÿ’ป Development: Working with This Repo

This project uses uv for blazing-fast Python package management.

Setup

# Install uv if needed
curl -LsSf https://astral.sh/uv/install.sh | sh

# Clone the repo
git clone https://github.com/pyros-projects/wishful.git
cd wishful

# Install dependencies (uv handles everything)
uv sync

Running Tests

# Run the full test suite
uv run pytest tests/ -v

# Run a specific test file
uv run pytest tests/test_import_hook.py -v

# Run with coverage
uv run pytest --cov=wishful tests/

Running Examples

All examples support WISHFUL_FAKE_LLM=1 for deterministic testing:

# Run with fake LLM (no API calls)
WISHFUL_FAKE_LLM=1 uv run python examples/00_quick_start.py

# Run with real LLM (requires API keys)
uv run python examples/00_quick_start.py

Adding Dependencies

# Add a runtime dependency
uv add package-name

# Add a dev dependency
uv add --dev package-name

# Update all dependencies
uv lock --upgrade

Project Structure

wishful/
โ”œโ”€โ”€ src/wishful/          # Main package
โ”‚   โ”œโ”€โ”€ __init__.py       # Public API
โ”‚   โ”œโ”€โ”€ __main__.py       # CLI interface
โ”‚   โ”œโ”€โ”€ config.py         # Configuration
โ”‚   โ”œโ”€โ”€ cache/            # Cache management
โ”‚   โ”œโ”€โ”€ core/             # Import hooks
โ”‚   โ”œโ”€โ”€ llm/              # LLM integration
โ”‚   โ””โ”€โ”€ safety/           # Safety validation
โ”œโ”€โ”€ tests/                # Test suite
โ”œโ”€โ”€ examples/             # Usage examples
โ””โ”€โ”€ pyproject.toml        # Project config

๐Ÿค” FAQ (Frequently Asked Wishes)

Q: Is this production-ready?
A: Define "production." ๐Ÿ™ƒ

Q: What if the LLM generates bad code?
A: That's what the cache is for. Check .wishful/, tweak it, commit it, and it's locked in.

Q: Can I use this with OpenAI/Claude/local models?
A: Yes! Built on litellm, so anything it supports works here.

Q: What if I import something that doesn't make sense?
A: The LLM will do its best. Results may vary. Hilarity may ensue.

Q: Is this just lazy programming?
A: It's not lazy. It's efficient wishful thinking. ๐Ÿ˜Ž


๐Ÿ“œ License

MIT. Wish responsibly.

Go forth and wish. โœจ

Your imports will never be the same.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

wishful-0.1.5.tar.gz (12.2 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

wishful-0.1.5-py3-none-any.whl (17.5 kB view details)

Uploaded Python 3

File details

Details for the file wishful-0.1.5.tar.gz.

File metadata

  • Download URL: wishful-0.1.5.tar.gz
  • Upload date:
  • Size: 12.2 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for wishful-0.1.5.tar.gz
Algorithm Hash digest
SHA256 8058625ec004b920c176944380d971a53b129811de89aaf811fb706e92298203
MD5 f0a490e3ec28c233f2a210d96983e7dd
BLAKE2b-256 b89cd47ee2c70b2b12508796bb8096002d6b930dc8f37e1fa0990fe55413420d

See more details on using hashes here.

File details

Details for the file wishful-0.1.5-py3-none-any.whl.

File metadata

  • Download URL: wishful-0.1.5-py3-none-any.whl
  • Upload date:
  • Size: 17.5 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for wishful-0.1.5-py3-none-any.whl
Algorithm Hash digest
SHA256 bca78059d4c765ca7ab48c5971b1353ea433da274b481b35bae40cd935b2f772
MD5 fd045f4be7c86a680c06bb57e8f3ed3e
BLAKE2b-256 695fb5b01512a1a5a639edc99099801c622bd51d37ddb845f769535095004cf0

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page