Metadata-Version: 2.3
Name: brown-paper-packages
Version: 0.2.0.20260907
Summary: Brown paper packages (tied up with strings) - Collection of 'a few of my favourite things' -i.e. PyPI packages- in order to stop repeating myself.
Keywords: packages,DRY
Author: Dutcho
License: MIT License
         
         Copyright (c) 2026 Dutcho
         
         Permission is hereby granted, free of charge, to any person obtaining a copy
         of this software and associated documentation files (the "Software"), to deal
         in the Software without restriction, including without limitation the rights
         to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
         copies of the Software, and to permit persons to whom the Software is
         furnished to do so, subject to the following conditions:
         
         The above copyright notice and this permission notice shall be included in all
         copies or substantial portions of the Software.
         
         THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
         IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
         FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
         AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
         LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
         OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
         SOFTWARE.
Classifier: Development Status :: 3 - Alpha
Classifier: Operating System :: OS Independent
Classifier: Programming Language :: Python
Classifier: Programming Language :: Python :: 3
Classifier: Programming Language :: Python :: 3 :: Only
Classifier: Programming Language :: Python :: 3.12
Classifier: Programming Language :: Python :: 3.13
Classifier: Programming Language :: Python :: 3.14
Classifier: Programming Language :: Python :: 3.15
Classifier: Typing :: Typed
Requires-Dist: brown-paper-packages[default]
Requires-Dist: brown-paper-packages[default,excel,data,web,dev] ; extra == 'all'
Requires-Dist: polars[pandas,numpy,excel,pyarrow] ; extra == 'data'
Requires-Dist: duckdb ; extra == 'data'
Requires-Dist: fsspec ; extra == 'data'
Requires-Dist: brown-paper-packages[utils,typing] ; extra == 'default'
Requires-Dist: mypy ; extra == 'dev'
Requires-Dist: ty ; extra == 'dev'
Requires-Dist: openpyxl ; extra == 'excel'
Requires-Dist: pyxlsb ; extra == 'excel'
Requires-Dist: lxml ; extra == 'excel'
Requires-Dist: defusedxml ; extra == 'excel'
Requires-Dist: types-openpyxl ; extra == 'excel'
Requires-Dist: types-lxml ; extra == 'excel'
Requires-Dist: types-defusedxml ; extra == 'excel'
Requires-Dist: typing-extensions ; extra == 'typing'
Requires-Dist: useful-types ; extra == 'typing'
Requires-Dist: annotated-types ; extra == 'typing'
Requires-Dist: annotated-doc ; extra == 'typing'
Requires-Dist: more-itertools ; extra == 'utils'
Requires-Dist: sortedcontainers ; extra == 'utils'
Requires-Dist: orderedsets ; extra == 'utils'
Requires-Dist: python-dotenv[cli] ; extra == 'utils'
Requires-Dist: platformdirs ; extra == 'utils'
Requires-Dist: sortedcontainers-stubs ; extra == 'utils'
Requires-Dist: requests ; extra == 'web'
Requires-Dist: beautifulsoup4 ; extra == 'web'
Requires-Dist: html5lib ; extra == 'web'
Requires-Dist: flask ; extra == 'web'
Requires-Dist: fastapi[standard] ; extra == 'web'
Requires-Dist: lxml ; extra == 'web'
Requires-Dist: defusedxml ; extra == 'web'
Requires-Dist: types-requests ; extra == 'web'
Requires-Dist: types-beautifulsoup4 ; extra == 'web'
Requires-Dist: types-html5lib ; extra == 'web'
Requires-Dist: types-lxml ; extra == 'web'
Requires-Dist: types-defusedxml ; extra == 'web'
Requires-Python: >=3.12
Project-URL: Homepage, https://github.com/Dutcho/brown-paper-packages
Project-URL: Repository, https://github.com/Dutcho/brown-paper-packages
Project-URL: Documentation, https://github.com/Dutcho/brown-paper-packages/blob/main/README.md
Provides-Extra: all
Provides-Extra: data
Provides-Extra: default
Provides-Extra: dev
Provides-Extra: excel
Provides-Extra: typing
Provides-Extra: utils
Provides-Extra: web
Description-Content-Type: text/markdown

# Brown paper packages
Collection of PyPI **packages** to stop repeating myself.

## Background
### Situation
I noted I came back to repetitively installing the same PyPI packages in various projects.
Sometimes, I couldn't recall their name or extras.
At other times, I forgot importing optional, but important dependencies. That could impact
- safety (e.g. `defusedxml`)
- functionality (e.g. `fsspec`)
- typing and autocomplete (various `types-...`)
- performance (e.g. `lxml`)

Now, I decided to put in the effort to come [DRY](https://en.wikipedia.org/wiki/Don%27t_repeat_yourself).

### Name
Obviously, this package's name comes
from the <cite>[Sound of Music](https://en.wikipedia.org/wiki/The_Sound_of_Music)</cite> 
song <cite>[My Favorite Things](https://en.wikipedia.org/wiki/My_Favorite_Things_(song))</cite>:
<blockquote>
Brown paper packages tied up with strings<br>
These are a few of my favorite things
</blockquote>
<img src="https://live.staticflickr.com/5012/5560753633_5a03c9cdec_b.jpg" alt="Brown paper packages" height="250"/>

Think of _this_ package being the string strapping together the contained packages. 

## Table of Contents
* packages for extra [all](#all-packages)
  * [default](#default)
    * packages for [utils](#utils)
    * packages for [typing](#typing)
  * packages for extra [Excel](#excel)
  * packages for extra [data](#data)
  * packages for extra [web](#web)
  * packages for extra [dev](#dev)

## Installation
### Default
To install default packages in [utils](#utils) and [typing](#typing), use:
```shell
uv add brown-paper-packages
```

### Specific extras
To install default packages in [utils](#utils), [typing](#typing), 
plus packages for _specific_ extras (choose from [Excel](#excel), [data](#data), [web](#web), [dev](#dev)), 
use `[extra,...]`:
```shell
uv add brown-paper-packages[extra,...]
```

### All packages
To install default packages in [utils](#utils), [typing](#typing),
plus packages for _all_ extras [Excel](#excel), [data](#data), [web](#web), [dev](#dev), 
use [extra](#specific-extras) `[all]`:
```shell
uv add brown-paper-packages[all]
```

## Usage
Just use the installed packages directly, e.g.
```python
import more_itertools
```

This package doesn't contain any functionality of its own.
Therefore, there's no need for (lengthy and useless) 
~~`import brown_paper_packages`~~.

For reuse of classes and functions, see companion [PyPI package raindrops-on-roses](https://pypi.org/project/raindrops-on-roses/).

## Contents
See [pyproject.toml file](./pyproject.toml) for details.

### Utils
* Algorithms
  * [more itertools](https://pypi.org/project/more-itertools/)
* Data structures
  * [sorted containers](https://pypi.org/project/sortedcontainers/)
  * [ordered sets](https://pypi.org/project/orderedsets/)
* Platform access
  * [dot .env](https://pypi.org/project/python-dotenv/)
  * [platform dirs](https://pypi.org/project/platformdirs/)

### Typing
* Additional types
  * [typing extensions](https://pypi.org/project/typing-extensions/)
  * [useful types](https://pypi.org/project/useful-types/)
* Annotations
  * [annotated types](https://pypi.org/project/annotated-types/)
  * [annotated doc](https://pypi.org/project/annotated-doc/)

### Excel
* Excel variants
  * [OpenPyXL for .XLSX files](https://pypi.org/project/openpyxl/)
  * [pyxlsb for binary .XLSB files](https://pypi.org/project/pyxlsb/)
* Supporting
  * [lxml](https://pypi.org/project/lxml/)
  * [defused XML](https://pypi.org/project/defusedxml/)

### Data
* Dataframe
  * [Polars](https://pypi.org/project/polars/)
* Database
  * [DuckDB](https://pypi.org/project/duckdb/)
* Supporting
  * [fsspec](https://pypi.org/project/fsspec/)

### Web
* HTTP
  * [requests](https://pypi.org/project/requests/)
  * [Beautiful Soup 4](https://pypi.org/project/beautifulsoup4/)
  * [HTML5lib](https://pypi.org/project/html5lib/)
* Server
  * [Flask](https://pypi.org/project/Flask/)
  * [FastAPI](https://pypi.org/project/fastapi/)
* Supporting
  * [lxml](https://pypi.org/project/lxml/)
  * [defused XML](https://pypi.org/project/defusedxml/)

### Dev
* Type checkers
  * [mypy](https://pypi.org/project/mypy/)
  * [ty](https://pypi.org/project/ty/)
 
  Note installing _within_ projects (`uv add`) ensures discovery within `venv`,
  which global installation (`uv tool install`) doesn't accomplish.