# rclone-adapter
[](https://pypi.org/project/rclone-adapter/)
[](https://pypi.org/project/rclone-adapter/)
[](https://raw.githubusercontent.com/dirkpetersen/rclone-adapter/main/LICENSE)
[](https://pypi.org/project/rclone-adapter/)
[](https://github.com/dirkpetersen/rclone-adapter/actions)
A modern, async-first Python wrapper for [rclone](https://rclone.org/) with comprehensive type hints, progress tracking, and structured logging.
## Overview
**rclone-adapter** provides a Pythonic, async-first interface to rclone for cloud storage operations. Instead of running shell commands, you can use intuitive Python methods and async/await patterns to interact with cloud storage providers.
### Key Features
- **🚀 Async-First Design**: Full async/await support with AsyncIterator for streaming progress
- **📦 Bundled rclone**: Latest rclone binary included in wheels for all platforms
- **🎯 Type Safe**: Comprehensive type hints for IDE autocomplete and type checking
- **📊 Progress Tracking**: Real-time progress events with adaptive interval throttling
- **🔧 Full Command Support**: All 54 rclone subcommands with auto-generated type-safe options
- **📝 Structured Logging**: Built-in structured logging with structlog
- **🌈 Pretty Output**: Terminal-friendly progress bars and formatted output with rich
- **⚙️ Flexible Configuration**: Support for environment variables and rclone config files
- **🎓 Well Documented**: Comprehensive CLAUDE.md guide for developers
## Installation
```bash
pip install rclone-adapter
```
### Platform-Specific Details
**Linux (x86_64, ARM64)**:
- Wheels include bundled rclone binaries - no separate installation needed
- `pip install rclone-adapter` is all you need!
**macOS, Windows**:
- Source distribution (`sdist`) available, but no pre-built wheels yet
- Install rclone separately: https://rclone.org/install/
- Then: `pip install rclone-adapter`
**Using system rclone (any platform)**:
- If you prefer your system's rclone installation, it will be used automatically
- The bundled binary is used as a fallback if system rclone is not found
## Supported Python Versions
- Python 3.10, 3.11, 3.12, 3.13, 3.14+
## Quick Start
### Async Usage (Recommended)
```python
import asyncio
from rclone import RClone, RCloneConfig
async def main():
# Create config (uses bundled rclone binary automatically)
config = RCloneConfig(
env_vars={
"RCLONE_S3_PROVIDER": "AWS",
"RCLONE_S3_REGION": "us-west-2",
}
)
# Initialize client
rc = RClone(config)
# Simple API - returns only final result
result = await rc.sync(source="/local/path", dest="s3:mybucket/path")
print(f"Transferred: {result.files_transferred} files ({result.bytes_transferred} bytes)")
# Streaming API - get real-time progress events
async for event in rc.sync_stream(source="/local", dest="s3:mybucket/"):
if hasattr(event, 'progress'):
print(f"Progress: {event.progress:.1%}")
elif hasattr(event, 'message'):
print(f"Info: {event.message}")
asyncio.run(main())
```
### Sync Usage
```python
from rclone import RClone
# For non-async code
rc = RClone()
# Blocking wrapper
result = rc.sync_blocking(
source="/local/path",
dest="s3:mybucket/path"
)
if result.success:
print(f"✓ Success! Transferred {result.files_transferred} files")
else:
print(f"✗ Failed with {len(result.errors)} errors")
```
## Usage Examples
### Copy with Progress Tracking
```python
import asyncio
from rclone import RClone, ProgressEvent, ErrorEvent
async def copy_with_progress():
rc = RClone()
async for event in rc.copy_stream(
source="/source/path",
dest="/dest/path"
):
if isinstance(event, ProgressEvent):
print(f"Progress: {event.bytes_transferred:,} / {event.total_bytes:,} bytes")
elif isinstance(event, ErrorEvent):
print(f"Error: {event.message}")
asyncio.run(copy_with_progress())
```
### Using Environment Variables
```python
from rclone import RClone, RCloneConfig
config = RCloneConfig(
env_vars={
"RCLONE_S3_PROVIDER": "AWS",
"RCLONE_S3_ACCESS_KEY_ID": "your-key",
"RCLONE_S3_SECRET_ACCESS_KEY": "your-secret",
}
)
rc = RClone(config)
result = await rc.sync(source="s3:bucket1/", dest="s3:bucket2/")
```
### Using rclone Config File
```python
from pathlib import Path
from rclone import RClone, RCloneConfig
config = RCloneConfig(
config_file=Path("~/.config/rclone/rclone.conf")
)
rc = RClone(config)
result = await rc.sync(source="gdrive:/", dest="/local/backup/")
```
## Architecture
### Core Design
- **Async-First**: All main operations are async-first with sync wrappers available
- **Event Streaming**: Operations yield events for progress, errors, and completion
- **Type Safe**: Pydantic v2 for configuration validation, dataclass models for results
- **Modular**: Separate modules for client, models, process management, and parsing
### Bundled Binary
The wheels include platform-specific rclone binaries:
- Linux x86_64, ARM64
- macOS Intel, Apple Silicon
- Windows x86_64
The `find_rclone_binary()` utility automatically selects the correct binary for your platform.
### Generated Command Options
All 54 rclone subcommands are supported with auto-generated Pydantic models:
- `SyncOptions`, `CopyOptions`, `MoveOptions` - File transfer operations
- `LsOptions`, `LsdOptions`, `LsjsonOptions` - Listing operations
- `CheckOptions`, `ChecksumOptions` - Verification operations
- And more!
## Development
### Setting Up Development Environment
```bash
# Clone and install in editable mode
git clone https://github.com/dirkpetersen/rclone-adapter.git
cd rclone-adapter
# Install with development dependencies
pip install -e ".[dev]"
# Run tests
pytest tests/ -v
# Run linting
ruff check rclone/ tests/
mypy rclone/ --strict
```
### Project Structure
```
rclone-adapter/
├── rclone/
│ ├── __init__.py # Main package exports
│ ├── client.py # RClone async client
│ ├── models.py # Pydantic models (config, events, results)
│ ├── process.py # Subprocess management
│ ├── parser.py # rclone log parsing
│ ├── util.py # Utility functions
│ ├── exceptions.py # Exception hierarchy
│ ├── py.typed # PEP 561 marker for type hints
│ ├── bin/ # Platform-specific rclone binaries
│ └── _generated/ # Auto-generated command options
├── tests/ # Test suite
├── examples/ # Usage examples
├── CLAUDE.md # Developer guide
└── README.md # This file
```
### Running Tests
```bash
# All tests
pytest tests/
# Unit tests only (no integration tests)
pytest tests/ -m "not integration"
# With coverage
pytest tests/ --cov=rclone --cov-report=html
# Specific test file
pytest tests/test_client.py -v
```
## API Reference
### RClone Client
Main async client for rclone operations.
```python
class RClone:
async def sync(
source: str,
dest: str,
options: SyncOptions | None = None
) -> SyncResult
async def sync_stream(
source: str,
dest: str,
options: SyncOptions | None = None
) -> AsyncIterator[ProgressEvent | ErrorEvent | SyncResult]
def sync_blocking(
source: str,
dest: str,
options: SyncOptions | None = None
) -> SyncResult
# Similar methods for: copy, move, ls, lsd, check, etc.
```
### RCloneConfig
Configuration for the client with validation.
```python
config = RCloneConfig(
config_file=Path("~/.config/rclone/rclone.conf"), # Optional
env_vars={ # Optional
"RCLONE_S3_PROVIDER": "AWS",
"RCLONE_S3_REGION": "us-west-2",
},
rclone_path="/usr/bin/rclone", # Optional, auto-detected
log_level="INFO", # Optional
)
```
### Events
Operations yield typed events for progress and errors:
```python
class ProgressEvent:
bytes_transferred: int
total_bytes: int
progress: float # 0.0 to 1.0
transfer_rate: int # bytes/sec
eta_seconds: Optional[int]
current_file: Optional[str]
class ErrorEvent:
message: str
file: Optional[str]
error_category: str # "network", "permission", "not_found", etc.
is_retryable: bool
```
### Results
Operations return typed result objects:
```python
class SyncResult:
success: bool
return_code: int
bytes_transferred: int
files_transferred: int
errors: list[ErrorEvent]
duration_seconds: float
stats: dict # Full rclone stats
```
## Contributing
Contributions are welcome! Please:
1. Fork the repository
2. Create a feature branch (`git checkout -b feature/amazing-feature`)
3. Make your changes with tests
4. Run linting and type checking:
```bash
ruff check --fix rclone/ tests/
mypy rclone/ --strict
pytest tests/
```
5. Commit your changes (`git commit -m 'Add amazing feature'`)
6. Push to your branch (`git push origin feature/amazing-feature`)
7. Open a Pull Request
See [CLAUDE.md](CLAUDE.md) for detailed development guidance.
## License
MIT License - see [LICENSE](LICENSE) file for details.
## Support
- **Issues**: [GitHub Issues](https://github.com/dirkpetersen/rclone-adapter/issues)
- **Discussions**: [GitHub Discussions](https://github.com/dirkpetersen/rclone-adapter/discussions)
- **rclone Documentation**: [rclone.org](https://rclone.org/)
## Related Projects
- [rclone](https://github.com/rclone/rclone) - The main rclone project
- [python-pwalk](https://github.com/dirkpetersen/python-pwalk) - Modern Python packaging template
- [froster](https://github.com/dirkpetersen/froster) - Previous rclone wrapper (being replaced)
## Changelog
See [CHANGELOG.md](CHANGELOG.md) for release history and version changes.
---
**Status**: Alpha (0.1.0) - API is stable but may receive enhancements before 1.0 release.
**Latest Release**: [v0.1.0](https://github.com/dirkpetersen/rclone-adapter/releases/tag/v0.1.0) (2025-10-19)
- Initial public release on PyPI
- Full async/await support
- All 54 rclone subcommands
- Linux wheels with bundled rclone binaries
- Comprehensive test suite and CI/CD
Raw data
{
"_id": null,
"home_page": null,
"name": "rclone-adapter",
"maintainer": null,
"docs_url": null,
"requires_python": ">=3.10",
"maintainer_email": null,
"keywords": "rclone, cloud, storage, async, s3, backup",
"author": null,
"author_email": "Dirk Petersen <dp@nowhere.com>",
"download_url": "https://files.pythonhosted.org/packages/66/5b/41eb6130a7b7a96604030c3031cea0a89c91e91ff9f1367b9ffaa5c805ed/rclone_adapter-0.2.0.tar.gz",
"platform": null,
"description": "# rclone-adapter\n\n[](https://pypi.org/project/rclone-adapter/)\n[](https://pypi.org/project/rclone-adapter/)\n[](https://raw.githubusercontent.com/dirkpetersen/rclone-adapter/main/LICENSE)\n[](https://pypi.org/project/rclone-adapter/)\n[](https://github.com/dirkpetersen/rclone-adapter/actions)\n\nA modern, async-first Python wrapper for [rclone](https://rclone.org/) with comprehensive type hints, progress tracking, and structured logging.\n\n## Overview\n\n**rclone-adapter** provides a Pythonic, async-first interface to rclone for cloud storage operations. Instead of running shell commands, you can use intuitive Python methods and async/await patterns to interact with cloud storage providers.\n\n### Key Features\n\n- **\ud83d\ude80 Async-First Design**: Full async/await support with AsyncIterator for streaming progress\n- **\ud83d\udce6 Bundled rclone**: Latest rclone binary included in wheels for all platforms\n- **\ud83c\udfaf Type Safe**: Comprehensive type hints for IDE autocomplete and type checking\n- **\ud83d\udcca Progress Tracking**: Real-time progress events with adaptive interval throttling\n- **\ud83d\udd27 Full Command Support**: All 54 rclone subcommands with auto-generated type-safe options\n- **\ud83d\udcdd Structured Logging**: Built-in structured logging with structlog\n- **\ud83c\udf08 Pretty Output**: Terminal-friendly progress bars and formatted output with rich\n- **\u2699\ufe0f Flexible Configuration**: Support for environment variables and rclone config files\n- **\ud83c\udf93 Well Documented**: Comprehensive CLAUDE.md guide for developers\n\n## Installation\n\n```bash\npip install rclone-adapter\n```\n\n### Platform-Specific Details\n\n**Linux (x86_64, ARM64)**:\n- Wheels include bundled rclone binaries - no separate installation needed\n- `pip install rclone-adapter` is all you need!\n\n**macOS, Windows**:\n- Source distribution (`sdist`) available, but no pre-built wheels yet\n- Install rclone separately: https://rclone.org/install/\n- Then: `pip install rclone-adapter`\n\n**Using system rclone (any platform)**:\n- If you prefer your system's rclone installation, it will be used automatically\n- The bundled binary is used as a fallback if system rclone is not found\n\n## Supported Python Versions\n\n- Python 3.10, 3.11, 3.12, 3.13, 3.14+\n\n## Quick Start\n\n### Async Usage (Recommended)\n\n```python\nimport asyncio\nfrom rclone import RClone, RCloneConfig\n\nasync def main():\n # Create config (uses bundled rclone binary automatically)\n config = RCloneConfig(\n env_vars={\n \"RCLONE_S3_PROVIDER\": \"AWS\",\n \"RCLONE_S3_REGION\": \"us-west-2\",\n }\n )\n\n # Initialize client\n rc = RClone(config)\n\n # Simple API - returns only final result\n result = await rc.sync(source=\"/local/path\", dest=\"s3:mybucket/path\")\n print(f\"Transferred: {result.files_transferred} files ({result.bytes_transferred} bytes)\")\n\n # Streaming API - get real-time progress events\n async for event in rc.sync_stream(source=\"/local\", dest=\"s3:mybucket/\"):\n if hasattr(event, 'progress'):\n print(f\"Progress: {event.progress:.1%}\")\n elif hasattr(event, 'message'):\n print(f\"Info: {event.message}\")\n\nasyncio.run(main())\n```\n\n### Sync Usage\n\n```python\nfrom rclone import RClone\n\n# For non-async code\nrc = RClone()\n\n# Blocking wrapper\nresult = rc.sync_blocking(\n source=\"/local/path\",\n dest=\"s3:mybucket/path\"\n)\n\nif result.success:\n print(f\"\u2713 Success! Transferred {result.files_transferred} files\")\nelse:\n print(f\"\u2717 Failed with {len(result.errors)} errors\")\n```\n\n## Usage Examples\n\n### Copy with Progress Tracking\n\n```python\nimport asyncio\nfrom rclone import RClone, ProgressEvent, ErrorEvent\n\nasync def copy_with_progress():\n rc = RClone()\n\n async for event in rc.copy_stream(\n source=\"/source/path\",\n dest=\"/dest/path\"\n ):\n if isinstance(event, ProgressEvent):\n print(f\"Progress: {event.bytes_transferred:,} / {event.total_bytes:,} bytes\")\n elif isinstance(event, ErrorEvent):\n print(f\"Error: {event.message}\")\n\nasyncio.run(copy_with_progress())\n```\n\n### Using Environment Variables\n\n```python\nfrom rclone import RClone, RCloneConfig\n\nconfig = RCloneConfig(\n env_vars={\n \"RCLONE_S3_PROVIDER\": \"AWS\",\n \"RCLONE_S3_ACCESS_KEY_ID\": \"your-key\",\n \"RCLONE_S3_SECRET_ACCESS_KEY\": \"your-secret\",\n }\n)\n\nrc = RClone(config)\nresult = await rc.sync(source=\"s3:bucket1/\", dest=\"s3:bucket2/\")\n```\n\n### Using rclone Config File\n\n```python\nfrom pathlib import Path\nfrom rclone import RClone, RCloneConfig\n\nconfig = RCloneConfig(\n config_file=Path(\"~/.config/rclone/rclone.conf\")\n)\n\nrc = RClone(config)\nresult = await rc.sync(source=\"gdrive:/\", dest=\"/local/backup/\")\n```\n\n## Architecture\n\n### Core Design\n\n- **Async-First**: All main operations are async-first with sync wrappers available\n- **Event Streaming**: Operations yield events for progress, errors, and completion\n- **Type Safe**: Pydantic v2 for configuration validation, dataclass models for results\n- **Modular**: Separate modules for client, models, process management, and parsing\n\n### Bundled Binary\n\nThe wheels include platform-specific rclone binaries:\n- Linux x86_64, ARM64\n- macOS Intel, Apple Silicon\n- Windows x86_64\n\nThe `find_rclone_binary()` utility automatically selects the correct binary for your platform.\n\n### Generated Command Options\n\nAll 54 rclone subcommands are supported with auto-generated Pydantic models:\n- `SyncOptions`, `CopyOptions`, `MoveOptions` - File transfer operations\n- `LsOptions`, `LsdOptions`, `LsjsonOptions` - Listing operations\n- `CheckOptions`, `ChecksumOptions` - Verification operations\n- And more!\n\n## Development\n\n### Setting Up Development Environment\n\n```bash\n# Clone and install in editable mode\ngit clone https://github.com/dirkpetersen/rclone-adapter.git\ncd rclone-adapter\n\n# Install with development dependencies\npip install -e \".[dev]\"\n\n# Run tests\npytest tests/ -v\n\n# Run linting\nruff check rclone/ tests/\nmypy rclone/ --strict\n```\n\n### Project Structure\n\n```\nrclone-adapter/\n\u251c\u2500\u2500 rclone/\n\u2502 \u251c\u2500\u2500 __init__.py # Main package exports\n\u2502 \u251c\u2500\u2500 client.py # RClone async client\n\u2502 \u251c\u2500\u2500 models.py # Pydantic models (config, events, results)\n\u2502 \u251c\u2500\u2500 process.py # Subprocess management\n\u2502 \u251c\u2500\u2500 parser.py # rclone log parsing\n\u2502 \u251c\u2500\u2500 util.py # Utility functions\n\u2502 \u251c\u2500\u2500 exceptions.py # Exception hierarchy\n\u2502 \u251c\u2500\u2500 py.typed # PEP 561 marker for type hints\n\u2502 \u251c\u2500\u2500 bin/ # Platform-specific rclone binaries\n\u2502 \u2514\u2500\u2500 _generated/ # Auto-generated command options\n\u251c\u2500\u2500 tests/ # Test suite\n\u251c\u2500\u2500 examples/ # Usage examples\n\u251c\u2500\u2500 CLAUDE.md # Developer guide\n\u2514\u2500\u2500 README.md # This file\n```\n\n### Running Tests\n\n```bash\n# All tests\npytest tests/\n\n# Unit tests only (no integration tests)\npytest tests/ -m \"not integration\"\n\n# With coverage\npytest tests/ --cov=rclone --cov-report=html\n\n# Specific test file\npytest tests/test_client.py -v\n```\n\n## API Reference\n\n### RClone Client\n\nMain async client for rclone operations.\n\n```python\nclass RClone:\n async def sync(\n source: str,\n dest: str,\n options: SyncOptions | None = None\n ) -> SyncResult\n\n async def sync_stream(\n source: str,\n dest: str,\n options: SyncOptions | None = None\n ) -> AsyncIterator[ProgressEvent | ErrorEvent | SyncResult]\n\n def sync_blocking(\n source: str,\n dest: str,\n options: SyncOptions | None = None\n ) -> SyncResult\n\n # Similar methods for: copy, move, ls, lsd, check, etc.\n```\n\n### RCloneConfig\n\nConfiguration for the client with validation.\n\n```python\nconfig = RCloneConfig(\n config_file=Path(\"~/.config/rclone/rclone.conf\"), # Optional\n env_vars={ # Optional\n \"RCLONE_S3_PROVIDER\": \"AWS\",\n \"RCLONE_S3_REGION\": \"us-west-2\",\n },\n rclone_path=\"/usr/bin/rclone\", # Optional, auto-detected\n log_level=\"INFO\", # Optional\n)\n```\n\n### Events\n\nOperations yield typed events for progress and errors:\n\n```python\nclass ProgressEvent:\n bytes_transferred: int\n total_bytes: int\n progress: float # 0.0 to 1.0\n transfer_rate: int # bytes/sec\n eta_seconds: Optional[int]\n current_file: Optional[str]\n\nclass ErrorEvent:\n message: str\n file: Optional[str]\n error_category: str # \"network\", \"permission\", \"not_found\", etc.\n is_retryable: bool\n```\n\n### Results\n\nOperations return typed result objects:\n\n```python\nclass SyncResult:\n success: bool\n return_code: int\n bytes_transferred: int\n files_transferred: int\n errors: list[ErrorEvent]\n duration_seconds: float\n stats: dict # Full rclone stats\n```\n\n## Contributing\n\nContributions are welcome! Please:\n\n1. Fork the repository\n2. Create a feature branch (`git checkout -b feature/amazing-feature`)\n3. Make your changes with tests\n4. Run linting and type checking:\n ```bash\n ruff check --fix rclone/ tests/\n mypy rclone/ --strict\n pytest tests/\n ```\n5. Commit your changes (`git commit -m 'Add amazing feature'`)\n6. Push to your branch (`git push origin feature/amazing-feature`)\n7. Open a Pull Request\n\nSee [CLAUDE.md](CLAUDE.md) for detailed development guidance.\n\n## License\n\nMIT License - see [LICENSE](LICENSE) file for details.\n\n## Support\n\n- **Issues**: [GitHub Issues](https://github.com/dirkpetersen/rclone-adapter/issues)\n- **Discussions**: [GitHub Discussions](https://github.com/dirkpetersen/rclone-adapter/discussions)\n- **rclone Documentation**: [rclone.org](https://rclone.org/)\n\n## Related Projects\n\n- [rclone](https://github.com/rclone/rclone) - The main rclone project\n- [python-pwalk](https://github.com/dirkpetersen/python-pwalk) - Modern Python packaging template\n- [froster](https://github.com/dirkpetersen/froster) - Previous rclone wrapper (being replaced)\n\n## Changelog\n\nSee [CHANGELOG.md](CHANGELOG.md) for release history and version changes.\n\n---\n\n**Status**: Alpha (0.1.0) - API is stable but may receive enhancements before 1.0 release.\n\n**Latest Release**: [v0.1.0](https://github.com/dirkpetersen/rclone-adapter/releases/tag/v0.1.0) (2025-10-19)\n- Initial public release on PyPI\n- Full async/await support\n- All 54 rclone subcommands\n- Linux wheels with bundled rclone binaries\n- Comprehensive test suite and CI/CD\n",
"bugtrack_url": null,
"license": "MIT",
"summary": "Modern async Python wrapper for rclone",
"version": "0.2.0",
"project_urls": {
"Documentation": "https://github.com/dirkpetersen/rclone-adapter/blob/main/README.md",
"Homepage": "https://github.com/dirkpetersen/rclone-adapter",
"Issues": "https://github.com/dirkpetersen/rclone-adapter/issues",
"Repository": "https://github.com/dirkpetersen/rclone-adapter"
},
"split_keywords": [
"rclone",
" cloud",
" storage",
" async",
" s3",
" backup"
],
"urls": [
{
"comment_text": null,
"digests": {
"blake2b_256": "6bbceebd03e25188540a3e03197438204ac522c80a3d012e47d3d234fc1f5210",
"md5": "40a2f33c23581d8e1e129220ad9afc01",
"sha256": "dd6efd116a17180916feebc0526c274fd0cf5191e403afab6497d48e4258136c"
},
"downloads": -1,
"filename": "rclone_adapter-0.2.0-py3-none-any.whl",
"has_sig": false,
"md5_digest": "40a2f33c23581d8e1e129220ad9afc01",
"packagetype": "bdist_wheel",
"python_version": "py3",
"requires_python": ">=3.10",
"size": 23308090,
"upload_time": "2025-10-19T23:04:52",
"upload_time_iso_8601": "2025-10-19T23:04:52.857167Z",
"url": "https://files.pythonhosted.org/packages/6b/bc/eebd03e25188540a3e03197438204ac522c80a3d012e47d3d234fc1f5210/rclone_adapter-0.2.0-py3-none-any.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "665b41eb6130a7b7a96604030c3031cea0a89c91e91ff9f1367b9ffaa5c805ed",
"md5": "6911cfe25fabdd69d1ec0a67f09b9380",
"sha256": "45f7df9b9019ed46f7e29fd29a3997194a57a5d50b0a23859cd591138bd181d9"
},
"downloads": -1,
"filename": "rclone_adapter-0.2.0.tar.gz",
"has_sig": false,
"md5_digest": "6911cfe25fabdd69d1ec0a67f09b9380",
"packagetype": "sdist",
"python_version": "source",
"requires_python": ">=3.10",
"size": 23238428,
"upload_time": "2025-10-19T23:04:55",
"upload_time_iso_8601": "2025-10-19T23:04:55.682282Z",
"url": "https://files.pythonhosted.org/packages/66/5b/41eb6130a7b7a96604030c3031cea0a89c91e91ff9f1367b9ffaa5c805ed/rclone_adapter-0.2.0.tar.gz",
"yanked": false,
"yanked_reason": null
}
],
"upload_time": "2025-10-19 23:04:55",
"github": true,
"gitlab": false,
"bitbucket": false,
"codeberg": false,
"github_user": "dirkpetersen",
"github_project": "rclone-adapter",
"travis_ci": false,
"coveralls": false,
"github_actions": true,
"lcname": "rclone-adapter"
}