Metadata-Version: 2.4
Name: passiveaggressive
Version: 0.1.0
Summary: Convert polite messages into subtly passive-aggressive ones.
Author: passiveaggressive contributors
License: MIT
Project-URL: Homepage, https://github.com/example/passiveaggressive
Project-URL: Repository, https://github.com/example/passiveaggressive
Project-URL: Changelog, https://github.com/example/passiveaggressive/blob/main/CHANGELOG.md
Keywords: humor,text,office,email,cli
Classifier: Development Status :: 4 - Beta
Classifier: Environment :: Console
Classifier: Intended Audience :: Developers
Classifier: License :: OSI Approved :: MIT License
Classifier: Programming Language :: Python :: 3
Classifier: Programming Language :: Python :: 3.10
Classifier: Programming Language :: Python :: 3.11
Classifier: Programming Language :: Python :: 3.12
Classifier: Topic :: Communications :: Email
Classifier: Topic :: Software Development :: Libraries :: Python Modules
Classifier: Topic :: Text Processing :: Linguistic
Classifier: Typing :: Typed
Requires-Python: >=3.10
Description-Content-Type: text/markdown
License-File: LICENSE
Provides-Extra: dev
Requires-Dist: pytest>=7.0; extra == "dev"
Requires-Dist: mypy>=1.8; extra == "dev"
Requires-Dist: ruff>=0.4; extra == "dev"
Requires-Dist: black>=24.0; extra == "dev"
Dynamic: license-file

# passiveaggressive

[![CI](https://github.com/example/passiveaggressive/actions/workflows/ci.yml/badge.svg)](https://github.com/example/passiveaggressive/actions/workflows/ci.yml)
[![PyPI](https://img.shields.io/pypi/v/passiveaggressive.svg)](https://pypi.org/project/passiveaggressive/)
[![Python versions](https://img.shields.io/pypi/pyversions/passiveaggressive.svg)](https://pypi.org/project/passiveaggressive/)
[![License: MIT](https://img.shields.io/badge/license-MIT-blue.svg)](LICENSE)

Convert polite messages into subtly passive-aggressive ones — the kind of
message you might get from an overly polite coworker, manager, or customer
support rep. Funny without being mean, office-friendly, and built entirely
from handcrafted phrase templates — no AI, no network calls, no runtime
dependencies.

```python
>>> from passiveaggressive import translate
>>> translate("Please update the documentation.")  # one possible output
'Just a gentle reminder, update the documentation, if time allows. Thanks in advance.'
```

## Installation

```bash
pip install passiveaggressive
```

Or, for local development:

```bash
git clone https://github.com/example/passiveaggressive.git
cd passiveaggressive
pip install -e ".[dev]"
```

Requires Python 3.10+.

## Usage

### Basic translation

```python
from passiveaggressive import translate

translate("Send me the report.")
# "Whenever you have a moment, it would be appreciated if the report
#  could finally be sent over."
```

### Styles

Choose the personality delivering the message:

```python
translate(text, style="coworker")          # default
translate(text, style="manager")
translate(text, style="customer_support")
translate(text, style="british")
translate(text, style="parent")
translate(text, style="teacher")
```

| Style             | Example output |
|-------------------|-----------------|
| `coworker`        | "Just circling back on the PR. Thanks in advance." |
| `manager`         | "Just checking in on this again since I haven't seen an update." |
| `customer_support`| "We wanted to follow up on your request. Much appreciated." |
| `british`         | "Not to be a bother, but I was wondering whether this might be looked at when convenient." |
| `parent`          | "I'll just leave this here in case anyone remembers." |
| `teacher`         | "A gentle reminder, this was mentioned in class." |

### Intensity

Dial the annoyance from 1 (barely-there politeness) to 5 (maximum office
sarcasm):

```python
translate(text, intensity=1)  # "Whenever you have a chance..."
translate(text, intensity=3)  # "Just following up since this seems to have been overlooked."
translate(text, intensity=5)  # "No rush at all—as always—but it would be wonderful if this
                               #  could happen sometime this century."
```

### Randomization & determinism

Repeated calls vary naturally:

```python
translate("Please review the PR.")
# "Just circling back on the PR."
# "Thought I'd mention this again in case it slipped through."
# "Whenever convenient, the PR is still waiting."
```

Pass a `seed` for reproducible output:

```python
translate("Please review the PR.", seed=42)
```

### Extra functions

```python
from passiveaggressive import rewrite, email, subject, signoff

rewrite(text)          # alias of translate()
email(text)            # adds email-specific phrasing
subject()              # e.g. "Gentle Reminder", "Following Up (Again)"
signoff()              # e.g. "Kind regards,", "As always,"
```

## CLI

Installing the package also installs the `passiveaggressive` command:

```bash
$ passiveaggressive "Please send the invoice."
Just checking in regarding the invoice whenever convenient.

$ passiveaggressive "Fix the bug" --style british --intensity 4
$ passiveaggressive "Reply to my email" --seed 10
```

Flags:

- `--style {coworker,manager,customer_support,british,parent,teacher}`
- `--intensity {1,2,3,4,5}`
- `--seed <int>`

## API documentation

### `translate(text, style="coworker", intensity=3, seed=None) -> str`

Transforms `text` into a passive-aggressive message.

- `text` (`str`, required) — the original message. Must be non-empty.
- `style` (`str`) — one of the six supported styles.
- `intensity` (`int`) — 1–5.
- `seed` (`int | None`) — optional seed for deterministic output.

Raises `TypeError` if `text` isn't a string, and `ValueError` if `text` is
empty/whitespace, `style` is unrecognized, or `intensity` is out of range.

### `rewrite(text, style="coworker", intensity=3, seed=None) -> str`

Alias of `translate()`.

### `email(text, style="coworker", intensity=3, seed=None) -> str`

Like `translate()`, but layers in additional email-specific phrasing
(e.g. "Looking forward to hearing from you.").

### `subject(seed=None) -> str`

Generates a passive-aggressive email subject line.

### `signoff(seed=None) -> str`

Generates a passive-aggressive email signoff.

## Random examples

```
"Just circling back on the PR."
"Thought I'd mention this again in case it slipped through."
"Whenever convenient, the PR is still waiting."
"The PR continues to exist, should anyone be interested."
```

## Design philosophy

- Funny without being cruel
- Predictable and reproducible (via `seed`)
- Lightweight, pure Python, zero runtime dependencies
- Easy to extend with additional styles or phrases
- Beginner-friendly

## Contributing

New styles are the most fun thing to add. See [CONTRIBUTING.md](CONTRIBUTING.md)
for setup instructions and the checklist to run before opening a PR.

## Changelog

See [CHANGELOG.md](CHANGELOG.md).

## License

MIT — see [LICENSE](LICENSE).
"# PassiveAggressive" 
