Ecosyste.ms: Awesome
An open API service indexing awesome lists of open source software.
https://github.com/dougthor42/subscriptable-path
A subclass of python's pathlib.PurePath that allows subscripting (`p[2]` returns 2nd item in the path).
https://github.com/dougthor42/subscriptable-path
Last synced: 6 days ago
JSON representation
A subclass of python's pathlib.PurePath that allows subscripting (`p[2]` returns 2nd item in the path).
- Host: GitHub
- URL: https://github.com/dougthor42/subscriptable-path
- Owner: dougthor42
- License: mit
- Created: 2022-07-27T21:48:15.000Z (over 2 years ago)
- Default Branch: master
- Last Pushed: 2022-07-30T20:49:55.000Z (over 2 years ago)
- Last Synced: 2024-03-15T12:11:20.984Z (10 months ago)
- Language: Python
- Size: 24.4 KB
- Stars: 1
- Watchers: 2
- Forks: 0
- Open Issues: 0
-
Metadata Files:
- Readme: README.md
- Changelog: CHANGELOG.md
- License: LICENSE
Awesome Lists containing this project
README
# Subscriptable Path
A subclass of Python's pathlib objects that allow subscripting/indexing.
I was recently working with some `pathlib.Path` stuff and found that I
wanted to get the `n`th folder in a deep path. Naively, I tried:```pycon
>>> from pathlib import Path
>>> a = Path("/foo/bar/baz/a/b/c/d.txt")
>>> a[4]
Traceback (most recent call last):
File "", line 1, in
TypeError: 'PosixPath' object is not subscriptable
```Harrumph.
This project aims to make such a thing possible. See [Usage](#usage) for details.
## Installation
This is a pure python package with no dependencies. Installing is easy:
```
pip install subscriptable_path
```## Usage
> **Note:** Initial versions modify `pathlib.PurePath` directly, as those classes
> are a bit of a pain to subclass (because of tricks with `__new__`). This means
> that importing this module will affect every usage of `pathlib.PurePath`.
> Future work will adjust this API so that you can use `pathlib.PurePath` and
> `SubscriptablePath` simultaneously.
>
> The goal is to create a SubscriptablePath object that can be imported and
> replace the `pathlib.Path` object or can be used alongside. Eg:
>
> ```python
> from subscribtable_path import SubscriptablePath as Path # drop-in replacement
> from subscriptable_path import SubscriptablePath as SPath # use alongside
> ```It's easiest to show usage with examples:
```pycon
>>> from subscriptable_path import Path# Instantiate a Path object, just like `pathlib.Path`:
>>> path = Path("/mnt/foo/bar/1/2/3")# Get a component of the path:
>>> path[2]
"foo"
>>> path[0]
"/"
>>> path[-1]
"3"# Slices are also supported for __getitem__
>>> path[1:3]
"mnt/foo"# Check the path length:
>>> len(path)
7# Adjust a particular component, modifying the object
>>> path[2] = "hello"
>>> path
Path("/mnt/hello/bar/1/2/3")# Delete a part of the path, modifying the object
>>> del path[2]
>>> path
Path("/mnt/bar/1/2/3")# loop through the items in the path
>>> for name in path:
... print(name)
...
"/"
"mnt"
"bar"
"1"
"2"
"3"# Reverse the path:
# Note that if the path is absolute, the root is kept.
>>> reversed(path)
>>> path
Path("/3/2/1/bar/mnt")>>> rel_path = Path("1/2/3")
>>> reversed(rel_path)
>>> rel_path
Path("3/2/1")# And check if an item is in the path:
>>> "foo" in path
False
>>> "bar" in path
True
>>> "ba" in path
False
```## Development
1. Clone the repo: `git clone https://github.com/dougthor42/subscriptable-path`
2. Move into that dir: `cd subscriptable-path`
3. Create a virtual environment: `python -m venv .venv`
4. Activate it: `. .venv/bin/activate`
5. Install python packages:
1. `pip install -U pip setuptools wheel`
2. `pip install -r requirements-dev.txt`
3. `pip install -e .`
6. Run tests to verify: `pytest`
7. Install pre-commit hooks: `pre-commit install`
7. Ready to develop### Deployment
> TODO: Move to fully automated deployment with GitHub Actions.
1. Update the version in `pyproject.toml`
2. Create a new git tag: `git tag v`.
3. `python -m build`
4. pip install twine
5. twine upload dist/*## Changelog
See [CHANGELOG.md](./CHANGELOG.md).