rclone-adapter


Namerclone-adapter JSON
Version 0.2.0 PyPI version JSON
download
home_pageNone
SummaryModern async Python wrapper for rclone
upload_time2025-10-19 23:04:55
maintainerNone
docs_urlNone
authorNone
requires_python>=3.10
licenseMIT
keywords rclone cloud storage async s3 backup
VCS
bugtrack_url
requirements No requirements were recorded.
Travis-CI No Travis.
coveralls test coverage No coveralls.
            # rclone-adapter

[![PyPI](https://img.shields.io/pypi/v/rclone-adapter.svg)](https://pypi.org/project/rclone-adapter/)
[![Downloads](https://img.shields.io/pypi/dm/rclone-adapter.svg)](https://pypi.org/project/rclone-adapter/)
[![License](https://img.shields.io/github/license/dirkpetersen/rclone-adapter)](https://raw.githubusercontent.com/dirkpetersen/rclone-adapter/main/LICENSE)
[![Python Version](https://img.shields.io/pypi/pyversions/rclone-adapter.svg)](https://pypi.org/project/rclone-adapter/)
[![Build Status](https://github.com/dirkpetersen/rclone-adapter/workflows/Test/badge.svg)](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[![PyPI](https://img.shields.io/pypi/v/rclone-adapter.svg)](https://pypi.org/project/rclone-adapter/)\n[![Downloads](https://img.shields.io/pypi/dm/rclone-adapter.svg)](https://pypi.org/project/rclone-adapter/)\n[![License](https://img.shields.io/github/license/dirkpetersen/rclone-adapter)](https://raw.githubusercontent.com/dirkpetersen/rclone-adapter/main/LICENSE)\n[![Python Version](https://img.shields.io/pypi/pyversions/rclone-adapter.svg)](https://pypi.org/project/rclone-adapter/)\n[![Build Status](https://github.com/dirkpetersen/rclone-adapter/workflows/Test/badge.svg)](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"
}
        
Elapsed time: 3.18307s