semvec/pypi-packages huggingface dataset:
gitwhodid 0.1.1
Who did that? A CLI to reveal Git history by file.
Requires Python: >=3.13

# gitwhodid

> Who did that? A CLI to reveal Git history by file.

![demo](assets/demo.png)

## Overview

`gitwhodid` helps you find out who contributed to a specific file in your Git repo - how much, how recently, and with what kind of commits. (it's a fun weekend project)

## Features

- Shows top contributors to a file with percentage breakdown
- Last seen info for each contributor
- Notable commit messages from each contributor
- Friendly, colorful output powered by [`Rich`](https://github.com/Textualize/rich)

## Installation

```bash
pipx install gitwhodid
```

Or clone the repo and run directly:

```bash
git clone https://github.com/stabldev/gitwhodid
cd gitwhodid
uv sync
uv run gitwhodid <file>
```

### Git Integration (Optional)

Add this alias to your Git config to run `gitwhodid` as a Git subcommand:

```bash
git config --global alias.whodid '!gitwhodid'
# now you can use it like
git whodid <file>
```

## License

[MIT](https://github.com/stabldev/gitwhodid/blob/main/LICENSE) Copyright (c) [stabldev](https://github.com/stabldev)
opoint 0.1.2
Client library for Opoint products
Requires Python: >=3.12

# Opoint Python Client

The is a client library for interacting with Opoint products.

Initially supports Safefeed.

## Installation

Choose at least one of the web request backends, asyncio or requests

```
pip install opoint[aio]
# OR
pip install opoint[requests]
# OR
pip install opoint[aio,requests]
```

## Safefeed

The Safefeed client comes in two versions, one using `asyncio` and `aiohttp`, and one using `requests`.

Asyncio example:

```python
from opoint.safefeed.aio import SafefeedClient

# Using as an iterator
async with SafefeedClient("your-token-here") as client:
    async for batch in client:
        my_process_batch(batch)

# "Manual" usage
async with SafefeedClient("your-token-here") as client:
    while True:
        batch = await client.get_articles()
        my_process_batch(batch)

```

Requests example:
```python
from opoint.safefeed.sync import SafefeedClient

client = SafefeedClient("your-token-here")
for batch in client:
    my_process_batch(batch)
```

By default, the safefeed client will attempt to make smart decisions about how often to poll the feed and how many articles to ask for based on observed rate of new articles.

If you have any additional requirements, you can customise the parameters `interval`, `num_art`, and `expected_rate`. Unset parameters are adjusted based on observations and the specified parameters. If you set all three of these, all adaptive behaviour will cease. Don't do this unless you are confident in your parameters.

The interval setting sets the actual interval from the start of one request to the start of the next. The program sleeps the remaining time once the next iteration is called.

It is recommended that the batch processing is short, preferably no more than a few seconds even for a full feed, otherwise the interval might be missed. This means you likely want to simply hand the batch off to a thread, put in in a queue, or otherwise do the actual processing either in a different thread or a different program, such that it does not block the feed. For sparse feeds that are called more rarely and have fewer hits this is not a concern.