Metadata-Version: 2.4
Name: adipro
Version: 0.1.0
Summary: One import for the whole toolbox - every package I use, lazily loaded.
Author: Aditya
License-Expression: MIT
Keywords: toolkit,meta-package,imports,lazy-loading
Classifier: Development Status :: 4 - Beta
Classifier: Intended Audience :: Developers
Classifier: Operating System :: OS Independent
Classifier: Programming Language :: Python :: 3
Classifier: Programming Language :: Python :: 3.10
Classifier: Programming Language :: Python :: 3.11
Classifier: Programming Language :: Python :: 3.12
Classifier: Programming Language :: Python :: 3.13
Classifier: Programming Language :: Python :: 3.14
Classifier: Topic :: Software Development :: Libraries :: Python Modules
Requires-Python: >=3.10
Description-Content-Type: text/markdown
License-File: LICENSE
Requires-Dist: aiohttp
Requires-Dist: anthropic
Requires-Dist: beautifulsoup4
Requires-Dist: boto3
Requires-Dist: cloudscraper
Requires-Dist: curl_cffi
Requires-Dist: dateparser
Requires-Dist: ddgs>=9
Requires-Dist: edge-tts
Requires-Dist: fastapi
Requires-Dist: feedparser
Requires-Dist: ftfy
Requires-Dist: gTTS
Requires-Dist: google-generativeai
Requires-Dist: gradio
Requires-Dist: groq
Requires-Dist: gspread
Requires-Dist: httpx
Requires-Dist: lameenc
Requires-Dist: langchain-google-genai
Requires-Dist: langchain-groq
Requires-Dist: langchain-text-splitters
Requires-Dist: langgraph>=0.2
Requires-Dist: lxml
Requires-Dist: lxml_html_clean
Requires-Dist: nest-asyncio
Requires-Dist: numpy
Requires-Dist: openai
Requires-Dist: openpyxl
Requires-Dist: pandas
Requires-Dist: pdfplumber
Requires-Dist: pillow
Requires-Dist: playwright
Requires-Dist: pycryptodome
Requires-Dist: pydantic>=2
Requires-Dist: pyodbc
Requires-Dist: pypdf>=3
Requires-Dist: python-docx
Requires-Dist: python-dotenv
Requires-Dist: python-pptx
Requires-Dist: rapidfuzz
Requires-Dist: readability-lxml
Requires-Dist: requests
Requires-Dist: rich
Requires-Dist: schedule
Requires-Dist: selenium
Requires-Dist: streamlit
Requires-Dist: tiktoken
Requires-Dist: tqdm
Requires-Dist: uvicorn
Provides-Extra: scraping
Requires-Dist: beautifulsoup4; extra == "scraping"
Requires-Dist: cloudscraper; extra == "scraping"
Requires-Dist: curl_cffi; extra == "scraping"
Requires-Dist: dateparser; extra == "scraping"
Requires-Dist: ddgs>=9; extra == "scraping"
Requires-Dist: feedparser; extra == "scraping"
Requires-Dist: ftfy; extra == "scraping"
Requires-Dist: lxml; extra == "scraping"
Requires-Dist: lxml_html_clean; extra == "scraping"
Requires-Dist: pycryptodome; extra == "scraping"
Requires-Dist: rapidfuzz; extra == "scraping"
Requires-Dist: readability-lxml; extra == "scraping"
Provides-Extra: browser
Requires-Dist: playwright; extra == "browser"
Requires-Dist: selenium; extra == "browser"
Provides-Extra: llm
Requires-Dist: anthropic; extra == "llm"
Requires-Dist: google-generativeai; extra == "llm"
Requires-Dist: groq; extra == "llm"
Requires-Dist: langchain-google-genai; extra == "llm"
Requires-Dist: langchain-groq; extra == "llm"
Requires-Dist: langchain-text-splitters; extra == "llm"
Requires-Dist: langgraph>=0.2; extra == "llm"
Requires-Dist: openai; extra == "llm"
Requires-Dist: tiktoken; extra == "llm"
Provides-Extra: docs
Requires-Dist: openpyxl; extra == "docs"
Requires-Dist: pdfplumber; extra == "docs"
Requires-Dist: pypdf>=3; extra == "docs"
Requires-Dist: python-docx; extra == "docs"
Requires-Dist: python-pptx; extra == "docs"
Provides-Extra: data
Requires-Dist: gspread; extra == "data"
Requires-Dist: pyodbc; extra == "data"
Provides-Extra: media
Requires-Dist: edge-tts; extra == "media"
Requires-Dist: gTTS; extra == "media"
Requires-Dist: lameenc; extra == "media"
Requires-Dist: pillow; extra == "media"
Provides-Extra: cloud
Requires-Dist: boto3; extra == "cloud"
Provides-Extra: app
Requires-Dist: aiohttp; extra == "app"
Requires-Dist: fastapi; extra == "app"
Requires-Dist: gradio; extra == "app"
Requires-Dist: nest-asyncio; extra == "app"
Requires-Dist: pydantic>=2; extra == "app"
Requires-Dist: schedule; extra == "app"
Requires-Dist: streamlit; extra == "app"
Requires-Dist: uvicorn; extra == "app"
Provides-Extra: all
Requires-Dist: aiohttp; extra == "all"
Requires-Dist: anthropic; extra == "all"
Requires-Dist: beautifulsoup4; extra == "all"
Requires-Dist: boto3; extra == "all"
Requires-Dist: cloudscraper; extra == "all"
Requires-Dist: curl_cffi; extra == "all"
Requires-Dist: dateparser; extra == "all"
Requires-Dist: ddgs>=9; extra == "all"
Requires-Dist: edge-tts; extra == "all"
Requires-Dist: fastapi; extra == "all"
Requires-Dist: feedparser; extra == "all"
Requires-Dist: ftfy; extra == "all"
Requires-Dist: gTTS; extra == "all"
Requires-Dist: google-generativeai; extra == "all"
Requires-Dist: gradio; extra == "all"
Requires-Dist: groq; extra == "all"
Requires-Dist: gspread; extra == "all"
Requires-Dist: httpx; extra == "all"
Requires-Dist: lameenc; extra == "all"
Requires-Dist: langchain-google-genai; extra == "all"
Requires-Dist: langchain-groq; extra == "all"
Requires-Dist: langchain-text-splitters; extra == "all"
Requires-Dist: langgraph>=0.2; extra == "all"
Requires-Dist: lxml; extra == "all"
Requires-Dist: lxml_html_clean; extra == "all"
Requires-Dist: nest-asyncio; extra == "all"
Requires-Dist: numpy; extra == "all"
Requires-Dist: openai; extra == "all"
Requires-Dist: openpyxl; extra == "all"
Requires-Dist: pandas; extra == "all"
Requires-Dist: pdfplumber; extra == "all"
Requires-Dist: pillow; extra == "all"
Requires-Dist: playwright; extra == "all"
Requires-Dist: pycryptodome; extra == "all"
Requires-Dist: pydantic>=2; extra == "all"
Requires-Dist: pyodbc; extra == "all"
Requires-Dist: pypdf>=3; extra == "all"
Requires-Dist: python-docx; extra == "all"
Requires-Dist: python-dotenv; extra == "all"
Requires-Dist: python-pptx; extra == "all"
Requires-Dist: rapidfuzz; extra == "all"
Requires-Dist: readability-lxml; extra == "all"
Requires-Dist: requests; extra == "all"
Requires-Dist: rich; extra == "all"
Requires-Dist: schedule; extra == "all"
Requires-Dist: selenium; extra == "all"
Requires-Dist: streamlit; extra == "all"
Requires-Dist: tiktoken; extra == "all"
Requires-Dist: tqdm; extra == "all"
Requires-Dist: uvicorn; extra == "all"
Provides-Extra: dev
Requires-Dist: pytest>=8; extra == "dev"
Requires-Dist: pytest-asyncio; extra == "dev"
Requires-Dist: build; extra == "dev"
Requires-Dist: twine; extra == "dev"
Dynamic: license-file

# adipro

One import for the whole toolbox.

```python
import adipro as ap

df   = ap.pd.read_csv("rows.csv")
soup = ap.BeautifulSoup(ap.requests.get(url).text, "lxml")
doc  = ap.Document()
ap.load_dotenv()
```

No import block at the top of every script, and one `pip install` on a new
machine instead of forty.

## Install

```bash
pip install adipro
```

That installs everything — all 50 packages, every group below. On a machine
where you only need a slice of it:

```bash
pip install adipro[scraping]   # bs4, lxml, cloudscraper, curl_cffi, ddgs, ...
pip install adipro[llm]        # openai, groq, anthropic, langgraph, tiktoken, ...
pip install adipro[docs]       # python-docx, python-pptx, openpyxl, pdf
pip install adipro[browser]    # playwright, selenium
pip install adipro[media]      # gTTS, edge-tts, pillow, lameenc
pip install adipro[data]       # gspread, pyodbc
pip install adipro[cloud]      # boto3
pip install adipro[app]        # fastapi, streamlit, gradio, pydantic, ...
```

Development install:

```bash
git clone <this repo> && cd adipro
pip install -e ".[dev]"
pytest
```

## Nothing loads until you touch it

`import adipro` takes about 4 ms whether you have 5 packages installed or 50.
Aliases resolve on first attribute access and are cached afterwards, so
`ap.pd` imports pandas once and every later `ap.pd` is a dict lookup.

Two things follow from that:

- **A missing package only breaks the line that needs it.** If `playwright`
  failed to build on this machine, `ap.pd` still works fine.
- **You get told how to fix it**, not a bare traceback:

  ```
  MissingPackage: adipro.sync_playwright needs 'playwright', which is not installed.

      pip install adipro[browser]   # the whole browser group
      pip install playwright        # just this one
  ```

## Finding things

```python
ap.search("pdf")     # {'PdfReader': 'pypdf:PdfReader', 'open_pdf': ..., ...}
ap.doctor()          # what is installed, what is missing, how to fix it
ap.loaded()          # aliases resolved so far this process
dir(ap)              # every alias — tab-completion works in Jupyter
```

From the shell:

```bash
python -m adipro          # health report
python -m adipro pdf      # search aliases
```

## Import styles

| Style | Lazy? | Use it? |
|---|---|---|
| `import adipro as ap` then `ap.pd` | yes | **preferred** |
| `from adipro import pd, requests` | yes | fine |
| `from adipro import *` | no | stdlib + core only, on purpose |

`from adipro import *` is deliberately limited to the stdlib and core aliases —
the ones a base install guarantees are present. Star-importing the heavy groups
would have to load all of them eagerly and would die if any single one were
missing, so `__all__` leaves them out. Reach for them through `ap.`.

## What is in it

| Group | Packages |
|---|---|
| `stdlib` | `Path`, `json`, `re`, `os`, `dt`, `defaultdict`, `dataclass`, `ThreadPoolExecutor`, `sha256`, `urljoin`, … — no install needed |
| `core` | pandas, numpy, requests, httpx, python-dotenv, rich, tqdm |
| `scraping` | beautifulsoup4, lxml, cloudscraper, curl_cffi, ddgs, feedparser, readability-lxml, ftfy, dateparser, rapidfuzz, pycryptodome |
| `browser` | playwright, selenium |
| `llm` | openai, groq, anthropic, google-generativeai, langgraph, langchain-google-genai, langchain-groq, langchain-text-splitters, tiktoken |
| `docs` | python-docx, python-pptx, openpyxl, pdfplumber, pypdf |
| `data` | gspread, pyodbc |
| `media` | gTTS, edge-tts, pillow, lameenc |
| `cloud` | boto3 |
| `app` | fastapi, uvicorn, pydantic, streamlit, gradio, schedule, aiohttp, nest-asyncio |

Run `python -m adipro` for the live list with install status.

## Adding a package

Two edits, in this order:

1. Add it to the right group in `src/adipro/_registry.py` — its import root and
   pip name under `packages`, and the aliases you want under `aliases`.
2. Add the pip name to that extra **and** to `dependencies` and `all` in
   `pyproject.toml`.

`tests/test_adipro.py::test_registry_matches_pyproject` fails if you do one and
forget the other, and `test_every_installed_alias_resolves` fails if an alias
points at a module path or attribute that does not exist.

## Notes

- **Versions are loose on purpose.** Only a few floors are pinned. Hard pins
  here would fight the pins in projects you install alongside this, so
  installing adipro will not drag your other venvs sideways.
- **`google-generativeai` is end-of-life upstream.** It still works and is
  still in the `llm` group because it is what is installed, but Google has
  stopped updating it in favour of `google-genai` (`from google import genai`).
  Worth migrating when convenient; the alias is `ap.genai`.
- **Two aliases are renamed to avoid a clash.** readability-lxml's `Document`
  is `ap.ReadabilityDoc`, because python-docx already owns `ap.Document`.

## Licence

MIT
