Metadata-Version: 2.4
Name: aniket-rate-limiter
Version: 0.1.1
Summary: A simple, easy-to-use rate limiter package for Python projects
Author: Aniket
License: MIT
Keywords: rate-limiter,rate limiting,api,python
Classifier: Programming Language :: Python :: 3
Classifier: License :: OSI Approved :: MIT License
Classifier: Operating System :: OS Independent
Requires-Python: >=3.9
Description-Content-Type: text/markdown

# rate-limiter

A simple, easy-to-use rate limiter package for Python projects.

## Features

- Fixed window limiter
- Sliding window log limiter
- Sliding window counter limiter
- Leaky bucket limiter
- Token bucket limiter
- In-memory storage
- Optional Redis storage
- Basic metrics collector
- Docker-based local monitoring setup with Prometheus and Grafana

## Installation

Install from the current directory:

```bash
pip install .
```

Install directly from GitHub:

```bash
pip install git+https://github.com/Aniket281004/rate-limiter.git
```

## Quick start

```python
from rate_limiter import RateLimitConfig, create_rate_limiter

config = RateLimitConfig(limit=100, window=60)
limiter = create_rate_limiter(config)

result = limiter.allow("user-123")
if result.allowed:
    print("Request allowed")
else:
    print("Rate limit exceeded")
```

## Available algorithms

### Fixed window

```python
from rate_limiter import FixedWindowRateLimiter, RateLimitConfig

limiter = FixedWindowRateLimiter(RateLimitConfig(limit=10, window=60))
```

### Sliding window log

```python
from rate_limiter import SlidingWindowLogRateLimiter, RateLimitConfig

limiter = SlidingWindowLogRateLimiter(RateLimitConfig(limit=10, window=60))
```

### Sliding window counter

```python
from rate_limiter import SlidingWindowCounterRateLimiter, RateLimitConfig

limiter = SlidingWindowCounterRateLimiter(RateLimitConfig(limit=10, window=60))
```

### Leaky bucket

```python
from rate_limiter import LeakyBucketRateLimiter, RateLimitConfig

limiter = LeakyBucketRateLimiter(RateLimitConfig(limit=10, window=60))
```

### Token bucket

```python
from rate_limiter import TokenBucketRateLimiter, RateLimitConfig

limiter = TokenBucketRateLimiter(RateLimitConfig(limit=10, window=60))
```

## Redis storage

Install the Redis client:

```bash
pip install redis
```

Example:

```python
from rate_limiter import RateLimitConfig, SlidingWindowLogRateLimiter
from rate_limiter.storage import RedisStorage

storage = RedisStorage(host="localhost", port=6379, db=0)
limiter = SlidingWindowLogRateLimiter(RateLimitConfig(limit=10, window=60), storage=storage)
```

## Metrics

The package includes a simple collector that tracks allowed and denied requests:

```python
from rate_limiter.metrics.collector import MetricsCollector

collector = MetricsCollector()
collector.record_request(allowed=True)
collector.record_request(allowed=False)
print(collector.snapshot())
```

## Docker and monitoring

Run the local monitoring stack:

```bash
docker compose up --build -d
```

This starts:
- the app on port 8000
- Prometheus on port 9090
- Grafana on port 3000

## Testing

Run the test suite:

```bash
pytest -q
```

The current test suite covers:
- fixed window behavior
- sliding window log behavior
- sliding window counter behavior
- leaky bucket behavior
- token bucket behavior
- metrics collection

