Name | gensay JSON |
Version |
0.1.1
JSON |
| download |
home_page | None |
Summary | Multi-provider TTS tool compatible with macOS say command |
upload_time | 2025-08-01 02:20:16 |
maintainer | None |
docs_url | None |
author | Anthony Wu |
requires_python | >=3.11 |
license | None |
keywords |
|
VCS |
 |
bugtrack_url |
|
requirements |
No requirements were recorded.
|
Travis-CI |
No Travis.
|
coveralls test coverage |
No coveralls.
|
# gensay
[](https://pypi.org/project/gensay)
[](https://pypi.org/project/gensay)
A multi-provider text-to-speech (TTS) tool that implements the Apple macOS `/usr/bin/say` command interface while supporting multiple TTS backends including Chatterbox (local AI), OpenAI, ElevenLabs, and Amazon Polly.
## Features
- **macOS `say` Compatible**: Drop-in replacement for the macOS `say` command with identical CLI interface
- **Multiple TTS Providers**: Extensible provider system with support for:
- macOS native `say` command (default on macOS)
- Chatterbox (local AI TTS, default on other platforms)
- ElevenLabs (implemented with API support)
- OpenAI TTS (stub)
- Amazon Polly (stub)
- Mock provider for testing
- **Smart Text Chunking**: Intelligently splits long text for optimal TTS processing
- **Audio Caching**: Automatic caching with LRU eviction to speed up repeated synthesis
- **Progress Tracking**: Built-in progress bars with tqdm and customizable callbacks
- **Multiple Audio Formats**: Support for AIFF, WAV, M4A, MP3, CAF, FLAC, AAC, OGG
- **Background Pre-caching**: Queue and cache audio chunks in the background (Chatterbox only)
## Table of Contents
- [Installation](#installation)
- [Quick Start](#quick-start)
- [Command Line Usage](#command-line-usage)
- [Python API](#python-api)
- [Advanced Features](#advanced-features)
- [Development](#development)
- [License](#license)
## Installation
It's 2025, use [uv](https://github.com/astral-sh/uv)
`gensay` is intended to be used as a CLI tool that is a drop-in replacement to the macOS `say` CLI.
```console
# Install as a tool
uv tool install gensay
# Or add to your project
uv add gensay
# From source
git clone https://github.com/anthonywu/gensay
cd gensay
uv pip install -e .
```
## Quick Start
```bash
# Basic usage - speaks the text
gensay "Hello, world!"
# Use specific voice
gensay -v Samantha "Hello from Samantha"
# Save to audio file
gensay -o greeting.m4a "Welcome to gensay"
# List available voices (two ways)
gensay -v '?'
gensay --list-voices
```
## Command Line Usage
### Basic Options
```bash
# Speak text
gensay "Hello, world!"
# Read from file
gensay -f document.txt
# Read from stdin
echo "Hello from pipe" | gensay -f -
# Specify voice
gensay -v Alex "Hello from Alex"
# Adjust speech rate (words per minute)
gensay -r 200 "Speaking faster"
# Save to file
gensay -o output.m4a "Save this speech"
# Specify audio format
gensay -o output.wav --format wav "Different format"
```
### Provider Selection
```bash
# Use macOS native say command
gensay --provider macos "Using system TTS"
# List voices for specific provider
gensay --provider macos --list-voices
gensay --provider mock --list-voices
# Use mock provider for testing
gensay --provider mock "Testing without real TTS"
# Use Chatterbox explicitly
gensay --provider chatterbox "Local AI voice"
# Default provider depends on platform
gensay "Hello" # Uses 'macos' on macOS, 'chatterbox' on other platforms
```
### Advanced Options
```bash
# Show progress bar
gensay --progress "Long text with progress tracking"
# Pre-cache audio chunks in background
gensay --provider chatterbox --cache-ahead "Pre-process this text"
# Adjust chunk size
gensay --chunk-size 1000 "Process in larger chunks"
# Cache management
gensay --cache-stats # Show cache statistics
gensay --clear-cache # Clear all cached audio
gensay --no-cache "Text" # Disable cache for this run
```
## Python API
### Basic Usage
```python
from gensay import ChatterboxProvider, TTSConfig, AudioFormat
# Create provider
provider = ChatterboxProvider()
# Speak text
provider.speak("Hello from Python")
# Save to file
provider.save_to_file("Save this", "output.m4a")
# List voices
voices = provider.list_voices()
for voice in voices:
print(f"{voice['id']}: {voice['name']}")
```
### Advanced Configuration
```python
from gensay import ChatterboxProvider, TTSConfig, AudioFormat
# Configure TTS
config = TTSConfig(
voice="default",
rate=150,
format=AudioFormat.M4A,
cache_enabled=True,
extra={
'show_progress': True,
'chunk_size': 500
}
)
# Create provider with config
provider = ChatterboxProvider(config)
# Add progress callback
def on_progress(progress: float, message: str):
print(f"Progress: {progress:.0%} - {message}")
config.progress_callback = on_progress
# Use the configured provider
provider.speak("Text with all options configured")
```
### Text Chunking
```python
from gensay import chunk_text_for_tts, TextChunker
# Simple chunking
chunks = chunk_text_for_tts(long_text, max_chunk_size=500)
# Advanced chunking with custom strategy
chunker = TextChunker(
max_chunk_size=1000,
strategy="paragraph", # or "sentence", "word", "character"
overlap_size=50
)
chunks = chunker.chunk_text(document)
```
### ElevenLabs Provider
To use the ElevenLabs provider, you need:
1. An API key from [ElevenLabs](https://elevenlabs.io)
2. Set the environment variable: `export ELEVENLABS_API_KEY="your-api-key"`
```bash
# List ElevenLabs voices
gensay --provider elevenlabs --list-voices
# Use a specific ElevenLabs voice
gensay --provider elevenlabs -v Rachel "Hello from ElevenLabs"
# Save to file with high quality
gensay --provider elevenlabs -o speech.mp3 "High quality AI speech"
```
For Nix users with custom portaudio installation:
```bash
# Use the provided setup script
source setup_portaudio.sh
# Then install/reinstall gensay
pip install -e .
```
## Advanced Features
### Caching System
The caching system automatically stores generated audio to speed up repeated synthesis:
```python
from gensay import TTSCache
# Create cache instance
cache = TTSCache(
enabled=True,
max_size_mb=500,
max_items=1000
)
# Get cache statistics
stats = cache.get_stats()
print(f"Cache size: {stats['size_mb']:.2f} MB")
print(f"Cached items: {stats['items']}")
# Clear cache
cache.clear()
```
### Creating Custom Providers
```python
from gensay.providers import TTSProvider, TTSConfig, AudioFormat
from typing import Optional, Union, Any
from pathlib import Path
class MyCustomProvider(TTSProvider):
def speak(self, text: str, voice: Optional[str] = None,
rate: Optional[int] = None) -> None:
# Your implementation
self.update_progress(0.5, "Halfway done")
# ... generate and play audio ...
self.update_progress(1.0, "Complete")
def save_to_file(self, text: str, output_path: Union[str, Path],
voice: Optional[str] = None, rate: Optional[int] = None,
format: Optional[AudioFormat] = None) -> Path:
# Your implementation
return Path(output_path)
def list_voices(self) -> list[dict[str, Any]]:
return [
{'id': 'voice1', 'name': 'Voice One', 'language': 'en-US'}
]
def get_supported_formats(self) -> list[AudioFormat]:
return [AudioFormat.WAV, AudioFormat.MP3]
```
### Async Support
All providers support async operations:
```python
import asyncio
from gensay import ChatterboxProvider
async def main():
provider = ChatterboxProvider()
# Async speak
await provider.speak_async("Async speech")
# Async save
await provider.save_to_file_async("Async save", "output.m4a")
asyncio.run(main())
```
## Development
This project uses [just](https://just.systems) for common development tasks. First, install just:
```bash
# macOS (using Nix which you already have)
nix-env -iA nixpkgs.just
# Or using Homebrew
brew install just
# Or using cargo
cargo install just
```
### Quick Start
```bash
# Setup development environment
just setup
# Run tests
just test
# Run all quality checks
just check
# See all available commands
just
```
### Common Development Commands
#### Testing
```bash
# Run all tests
just test
# Run tests with coverage
just test-cov
# Run specific test
just test-specific tests/test_providers.py::test_mock_provider_speak
# Watch tests - not available in current justfile
# Install pytest-watch and run: uv run ptw tests -- -v
# Quick test (mock provider only)
just quick-test
```
#### Code Quality
```bash
# Run linter
just lint
# Auto-fix linting issues
just lint-fix
# Format code
just format
# Type checking
just typecheck
# Run all checks (lint, format, typecheck)
just check
# Pre-commit checks (format, lint, test)
just pre-commit
```
#### Running the CLI
```bash
# Run with mock provider
just run-mock "Hello, world!"
just run-mock -v '?'
# Run with macOS provider
just run-macos "Hello from macOS"
# Cache management
just cache-stats
just cache-clear
```
#### Development Utilities
```bash
# Run example script
just demo
# Create a new provider stub - not available in current justfile
# Clean build artifacts
just clean
# Build package
just build
```
### Manual Setup (without just)
If you prefer not to use just, here are the equivalent commands:
```bash
# Setup
uv venv
uv pip install -e ".[dev]"
# Testing
uv run pytest -v
uv run pytest --cov=gensay --cov-report=term-missing
# Linting and formatting
uv run ruff check src tests
uv run ruff format src tests
# Type checking
uvx ty check src
```
### Project Structure
```
gensay/
├── src/gensay/
│ ├── __init__.py
│ ├── main.py # CLI entry point
│ ├── providers/ # TTS provider implementations
│ │ ├── base.py # Abstract base provider
│ │ ├── chatterbox.py # Chatterbox provider
│ │ ├── macos_say.py # macOS say wrapper
│ │ └── ... # Other providers
│ ├── cache.py # Caching system
│ └── text_chunker.py # Text chunking logic
├── tests/ # Test suite
├── examples/ # Example scripts
├── justfile # Development commands
└── README.md
```
### Adding a New Provider
1. Use the just command to create a stub:
```bash
# The 'new-provider' command is not available in current justfile
```
2. This creates `src/gensay/providers/myprovider.py` with a template
3. Add the provider to `src/gensay/providers/__init__.py`:
```python
from .myprovider import MyProviderProvider
```
4. Register it in `src/gensay/main.py`:
```python
PROVIDERS = {
# ... existing providers ...
'myprovider': MyProviderProvider,
}
```
5. Implement the required methods in your provider class
### Code Style Guide
- Python 3.11+ with type hints
- Follow PEP8 and Google Python Style Guide
- Use `ruff` for linting and formatting
- Keep docstrings concise but informative
- Prefer `pathlib.Path` over `os.path`
- Use `pytest` for testing
## License
`gensay` is distributed under the terms of the [MIT](https://spdx.org/licenses/MIT.html) license.
Raw data
{
"_id": null,
"home_page": null,
"name": "gensay",
"maintainer": null,
"docs_url": null,
"requires_python": ">=3.11",
"maintainer_email": null,
"keywords": null,
"author": "Anthony Wu",
"author_email": "Anthony Wu <pls-file-gh-issue@users.noreply.github.com>",
"download_url": "https://files.pythonhosted.org/packages/c7/fd/881a987947023eacd2b83d29e9befdcf6c92b98dc63919ca3aa0ed1b7495/gensay-0.1.1.tar.gz",
"platform": null,
"description": "# gensay\n\n[](https://pypi.org/project/gensay)\n[](https://pypi.org/project/gensay)\n\nA multi-provider text-to-speech (TTS) tool that implements the Apple macOS `/usr/bin/say` command interface while supporting multiple TTS backends including Chatterbox (local AI), OpenAI, ElevenLabs, and Amazon Polly.\n\n## Features\n\n- **macOS `say` Compatible**: Drop-in replacement for the macOS `say` command with identical CLI interface\n- **Multiple TTS Providers**: Extensible provider system with support for:\n - macOS native `say` command (default on macOS)\n - Chatterbox (local AI TTS, default on other platforms)\n - ElevenLabs (implemented with API support)\n - OpenAI TTS (stub)\n - Amazon Polly (stub)\n - Mock provider for testing\n- **Smart Text Chunking**: Intelligently splits long text for optimal TTS processing\n- **Audio Caching**: Automatic caching with LRU eviction to speed up repeated synthesis\n- **Progress Tracking**: Built-in progress bars with tqdm and customizable callbacks\n- **Multiple Audio Formats**: Support for AIFF, WAV, M4A, MP3, CAF, FLAC, AAC, OGG\n- **Background Pre-caching**: Queue and cache audio chunks in the background (Chatterbox only)\n\n## Table of Contents\n\n- [Installation](#installation)\n- [Quick Start](#quick-start)\n- [Command Line Usage](#command-line-usage)\n- [Python API](#python-api)\n- [Advanced Features](#advanced-features)\n- [Development](#development)\n- [License](#license)\n\n## Installation\n\nIt's 2025, use [uv](https://github.com/astral-sh/uv)\n\n`gensay` is intended to be used as a CLI tool that is a drop-in replacement to the macOS `say` CLI.\n\n```console\n# Install as a tool\nuv tool install gensay\n\n# Or add to your project\nuv add gensay\n\n# From source\ngit clone https://github.com/anthonywu/gensay\ncd gensay\nuv pip install -e .\n```\n\n## Quick Start\n\n```bash\n# Basic usage - speaks the text\ngensay \"Hello, world!\"\n\n# Use specific voice\ngensay -v Samantha \"Hello from Samantha\"\n\n# Save to audio file\ngensay -o greeting.m4a \"Welcome to gensay\"\n\n# List available voices (two ways)\ngensay -v '?'\ngensay --list-voices\n```\n\n## Command Line Usage\n\n### Basic Options\n\n```bash\n# Speak text\ngensay \"Hello, world!\"\n\n# Read from file\ngensay -f document.txt\n\n# Read from stdin\necho \"Hello from pipe\" | gensay -f -\n\n# Specify voice\ngensay -v Alex \"Hello from Alex\"\n\n# Adjust speech rate (words per minute)\ngensay -r 200 \"Speaking faster\"\n\n# Save to file\ngensay -o output.m4a \"Save this speech\"\n\n# Specify audio format\ngensay -o output.wav --format wav \"Different format\"\n```\n\n### Provider Selection\n\n```bash\n# Use macOS native say command\ngensay --provider macos \"Using system TTS\"\n\n# List voices for specific provider\ngensay --provider macos --list-voices\ngensay --provider mock --list-voices\n\n# Use mock provider for testing\ngensay --provider mock \"Testing without real TTS\"\n\n# Use Chatterbox explicitly\ngensay --provider chatterbox \"Local AI voice\"\n\n# Default provider depends on platform\ngensay \"Hello\" # Uses 'macos' on macOS, 'chatterbox' on other platforms\n```\n\n### Advanced Options\n\n```bash\n# Show progress bar\ngensay --progress \"Long text with progress tracking\"\n\n# Pre-cache audio chunks in background\ngensay --provider chatterbox --cache-ahead \"Pre-process this text\"\n\n# Adjust chunk size\ngensay --chunk-size 1000 \"Process in larger chunks\"\n\n# Cache management\ngensay --cache-stats # Show cache statistics\ngensay --clear-cache # Clear all cached audio\ngensay --no-cache \"Text\" # Disable cache for this run\n```\n\n## Python API\n\n### Basic Usage\n\n```python\nfrom gensay import ChatterboxProvider, TTSConfig, AudioFormat\n\n# Create provider\nprovider = ChatterboxProvider()\n\n# Speak text\nprovider.speak(\"Hello from Python\")\n\n# Save to file\nprovider.save_to_file(\"Save this\", \"output.m4a\")\n\n# List voices\nvoices = provider.list_voices()\nfor voice in voices:\n print(f\"{voice['id']}: {voice['name']}\")\n```\n\n### Advanced Configuration\n\n```python\nfrom gensay import ChatterboxProvider, TTSConfig, AudioFormat\n\n# Configure TTS\nconfig = TTSConfig(\n voice=\"default\",\n rate=150,\n format=AudioFormat.M4A,\n cache_enabled=True,\n extra={\n 'show_progress': True,\n 'chunk_size': 500\n }\n)\n\n# Create provider with config\nprovider = ChatterboxProvider(config)\n\n# Add progress callback\ndef on_progress(progress: float, message: str):\n print(f\"Progress: {progress:.0%} - {message}\")\n\nconfig.progress_callback = on_progress\n\n# Use the configured provider\nprovider.speak(\"Text with all options configured\")\n```\n\n### Text Chunking\n\n```python\nfrom gensay import chunk_text_for_tts, TextChunker\n\n# Simple chunking\nchunks = chunk_text_for_tts(long_text, max_chunk_size=500)\n\n# Advanced chunking with custom strategy\nchunker = TextChunker(\n max_chunk_size=1000,\n strategy=\"paragraph\", # or \"sentence\", \"word\", \"character\"\n overlap_size=50\n)\nchunks = chunker.chunk_text(document)\n```\n\n### ElevenLabs Provider\n\nTo use the ElevenLabs provider, you need:\n\n1. An API key from [ElevenLabs](https://elevenlabs.io)\n2. Set the environment variable: `export ELEVENLABS_API_KEY=\"your-api-key\"`\n\n```bash\n# List ElevenLabs voices\ngensay --provider elevenlabs --list-voices\n\n# Use a specific ElevenLabs voice\ngensay --provider elevenlabs -v Rachel \"Hello from ElevenLabs\"\n\n# Save to file with high quality\ngensay --provider elevenlabs -o speech.mp3 \"High quality AI speech\"\n```\n\nFor Nix users with custom portaudio installation:\n```bash\n# Use the provided setup script\nsource setup_portaudio.sh\n\n# Then install/reinstall gensay\npip install -e .\n```\n\n## Advanced Features\n\n### Caching System\n\nThe caching system automatically stores generated audio to speed up repeated synthesis:\n\n```python\nfrom gensay import TTSCache\n\n# Create cache instance\ncache = TTSCache(\n enabled=True,\n max_size_mb=500,\n max_items=1000\n)\n\n# Get cache statistics\nstats = cache.get_stats()\nprint(f\"Cache size: {stats['size_mb']:.2f} MB\")\nprint(f\"Cached items: {stats['items']}\")\n\n# Clear cache\ncache.clear()\n```\n\n### Creating Custom Providers\n\n```python\nfrom gensay.providers import TTSProvider, TTSConfig, AudioFormat\nfrom typing import Optional, Union, Any\nfrom pathlib import Path\n\nclass MyCustomProvider(TTSProvider):\n def speak(self, text: str, voice: Optional[str] = None,\n rate: Optional[int] = None) -> None:\n # Your implementation\n self.update_progress(0.5, \"Halfway done\")\n # ... generate and play audio ...\n self.update_progress(1.0, \"Complete\")\n\n def save_to_file(self, text: str, output_path: Union[str, Path],\n voice: Optional[str] = None, rate: Optional[int] = None,\n format: Optional[AudioFormat] = None) -> Path:\n # Your implementation\n return Path(output_path)\n\n def list_voices(self) -> list[dict[str, Any]]:\n return [\n {'id': 'voice1', 'name': 'Voice One', 'language': 'en-US'}\n ]\n\n def get_supported_formats(self) -> list[AudioFormat]:\n return [AudioFormat.WAV, AudioFormat.MP3]\n```\n\n### Async Support\n\nAll providers support async operations:\n\n```python\nimport asyncio\nfrom gensay import ChatterboxProvider\n\nasync def main():\n provider = ChatterboxProvider()\n\n # Async speak\n await provider.speak_async(\"Async speech\")\n\n # Async save\n await provider.save_to_file_async(\"Async save\", \"output.m4a\")\n\nasyncio.run(main())\n```\n\n## Development\n\nThis project uses [just](https://just.systems) for common development tasks. First, install just:\n\n```bash\n# macOS (using Nix which you already have)\nnix-env -iA nixpkgs.just\n\n# Or using Homebrew\nbrew install just\n\n# Or using cargo\ncargo install just\n```\n\n### Quick Start\n\n```bash\n# Setup development environment\njust setup\n\n# Run tests\njust test\n\n# Run all quality checks\njust check\n\n# See all available commands\njust\n```\n\n### Common Development Commands\n\n#### Testing\n```bash\n# Run all tests\njust test\n\n# Run tests with coverage\njust test-cov\n\n# Run specific test\njust test-specific tests/test_providers.py::test_mock_provider_speak\n\n# Watch tests - not available in current justfile\n# Install pytest-watch and run: uv run ptw tests -- -v\n\n# Quick test (mock provider only)\njust quick-test\n```\n\n#### Code Quality\n```bash\n# Run linter\njust lint\n\n# Auto-fix linting issues\njust lint-fix\n\n# Format code\njust format\n\n# Type checking\njust typecheck\n\n# Run all checks (lint, format, typecheck)\njust check\n\n# Pre-commit checks (format, lint, test)\njust pre-commit\n```\n\n#### Running the CLI\n```bash\n# Run with mock provider\njust run-mock \"Hello, world!\"\njust run-mock -v '?'\n\n# Run with macOS provider\njust run-macos \"Hello from macOS\"\n\n# Cache management\njust cache-stats\njust cache-clear\n```\n\n#### Development Utilities\n```bash\n# Run example script\njust demo\n\n# Create a new provider stub - not available in current justfile\n\n# Clean build artifacts\njust clean\n\n# Build package\njust build\n```\n\n### Manual Setup (without just)\n\nIf you prefer not to use just, here are the equivalent commands:\n\n```bash\n# Setup\nuv venv\nuv pip install -e \".[dev]\"\n\n# Testing\nuv run pytest -v\nuv run pytest --cov=gensay --cov-report=term-missing\n\n# Linting and formatting\nuv run ruff check src tests\nuv run ruff format src tests\n\n# Type checking\nuvx ty check src\n```\n\n### Project Structure\n\n```\ngensay/\n\u251c\u2500\u2500 src/gensay/\n\u2502 \u251c\u2500\u2500 __init__.py\n\u2502 \u251c\u2500\u2500 main.py # CLI entry point\n\u2502 \u251c\u2500\u2500 providers/ # TTS provider implementations\n\u2502 \u2502 \u251c\u2500\u2500 base.py # Abstract base provider\n\u2502 \u2502 \u251c\u2500\u2500 chatterbox.py # Chatterbox provider\n\u2502 \u2502 \u251c\u2500\u2500 macos_say.py # macOS say wrapper\n\u2502 \u2502 \u2514\u2500\u2500 ... # Other providers\n\u2502 \u251c\u2500\u2500 cache.py # Caching system\n\u2502 \u2514\u2500\u2500 text_chunker.py # Text chunking logic\n\u251c\u2500\u2500 tests/ # Test suite\n\u251c\u2500\u2500 examples/ # Example scripts\n\u251c\u2500\u2500 justfile # Development commands\n\u2514\u2500\u2500 README.md\n```\n\n### Adding a New Provider\n\n1. Use the just command to create a stub:\n ```bash\n # The 'new-provider' command is not available in current justfile\n ```\n\n2. This creates `src/gensay/providers/myprovider.py` with a template\n\n3. Add the provider to `src/gensay/providers/__init__.py`:\n ```python\n from .myprovider import MyProviderProvider\n ```\n\n4. Register it in `src/gensay/main.py`:\n ```python\n PROVIDERS = {\n # ... existing providers ...\n 'myprovider': MyProviderProvider,\n }\n ```\n\n5. Implement the required methods in your provider class\n\n### Code Style Guide\n\n- Python 3.11+ with type hints\n- Follow PEP8 and Google Python Style Guide\n- Use `ruff` for linting and formatting\n- Keep docstrings concise but informative\n- Prefer `pathlib.Path` over `os.path`\n- Use `pytest` for testing\n\n## License\n\n`gensay` is distributed under the terms of the [MIT](https://spdx.org/licenses/MIT.html) license.\n",
"bugtrack_url": null,
"license": null,
"summary": "Multi-provider TTS tool compatible with macOS say command",
"version": "0.1.1",
"project_urls": {
"Documentation": "https://github.com/anthonywu/gensay#readme",
"Issues": "https://github.com/anthonywu/gensay/issues",
"Source": "https://github.com/anthonywu/gensay"
},
"split_keywords": [],
"urls": [
{
"comment_text": null,
"digests": {
"blake2b_256": "7c1b72f04ede915dce86e3eb21e84dd7f1144231526cee83319fc6e0ff5f01c2",
"md5": "285b48316889a9fadffc90728bff3ed7",
"sha256": "427046812f5eae64ec7222f06865ac57cf8c096417c2d91bc63d832c7e70b6e7"
},
"downloads": -1,
"filename": "gensay-0.1.1-py3-none-any.whl",
"has_sig": false,
"md5_digest": "285b48316889a9fadffc90728bff3ed7",
"packagetype": "bdist_wheel",
"python_version": "py3",
"requires_python": ">=3.11",
"size": 26638,
"upload_time": "2025-08-01T02:20:14",
"upload_time_iso_8601": "2025-08-01T02:20:14.343321Z",
"url": "https://files.pythonhosted.org/packages/7c/1b/72f04ede915dce86e3eb21e84dd7f1144231526cee83319fc6e0ff5f01c2/gensay-0.1.1-py3-none-any.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "c7fd881a987947023eacd2b83d29e9befdcf6c92b98dc63919ca3aa0ed1b7495",
"md5": "cfedcf6b2a3f9c19944971d07897a63f",
"sha256": "ce4f6482cbb3530e59cb10b25e7b8a39a3f03f0081bbc6f78b18b226b10d2489"
},
"downloads": -1,
"filename": "gensay-0.1.1.tar.gz",
"has_sig": false,
"md5_digest": "cfedcf6b2a3f9c19944971d07897a63f",
"packagetype": "sdist",
"python_version": "source",
"requires_python": ">=3.11",
"size": 20916,
"upload_time": "2025-08-01T02:20:16",
"upload_time_iso_8601": "2025-08-01T02:20:16.687998Z",
"url": "https://files.pythonhosted.org/packages/c7/fd/881a987947023eacd2b83d29e9befdcf6c92b98dc63919ca3aa0ed1b7495/gensay-0.1.1.tar.gz",
"yanked": false,
"yanked_reason": null
}
],
"upload_time": "2025-08-01 02:20:16",
"github": true,
"gitlab": false,
"bitbucket": false,
"codeberg": false,
"github_user": "anthonywu",
"github_project": "gensay#readme",
"travis_ci": false,
"coveralls": false,
"github_actions": false,
"lcname": "gensay"
}