syncengine backend for file synchronization
Project description
syncengine
A flexible, bidirectional file synchronization engine for Python that supports multiple sync modes and conflict resolution strategies.
What is syncengine?
syncengine is a powerful file synchronization library that enables you to keep files synchronized between two locations (source and destination). Unlike simple copy operations, syncengine intelligently tracks file state, detects changes, handles conflicts, and provides multiple synchronization modes to fit different use cases.
Why is syncengine useful?
Real-world Use Cases
-
Cloud Storage Synchronization
- Sync local files with cloud storage (Dropbox, Google Drive, S3, etc.)
- Implement custom cloud backup solutions
- Build your own sync client with fine-grained control
-
Backup Management
- Create one-way backup systems (never delete backed-up files)
- Implement versioned backup strategies
- Maintain disaster recovery copies
-
Development Workflows
- Sync code between local development and remote servers
- Mirror files to multiple deployment targets
- Keep test environments synchronized with production data
-
Content Distribution
- Distribute files from a master source to multiple destinations
- Keep documentation or assets synchronized across systems
- Manage multi-site content updates
Key Features
-
Multiple Sync Modes: Choose the behavior that fits your needs
TWO_WAY: Bidirectional sync with conflict detectionSOURCE_TO_DESTINATION: Mirror source to destination (typical one-way sync)SOURCE_BACKUP: Protect source from deletions (upload-only backup)DESTINATION_TO_SOURCE: Mirror destination to source (cloud download)DESTINATION_BACKUP: Protect local backup from remote changes
-
Intelligent Change Detection
- Tracks file modifications via timestamps and sizes
- Detects renames and moves
- Identifies conflicts when both sides change
-
Flexible Conflict Resolution
- Newest file wins
- Source always wins
- Destination always wins
- Manual conflict handling
-
State Management
- Persistent state tracking across sync sessions
- Resume interrupted syncs
- Detect changes since last sync
-
Pattern-based Filtering
- Gitignore-style ignore patterns
- Include/exclude specific files or directories
- Control what gets synchronized
-
Progress Tracking ✨ ENHANCED
- Real-time file-level progress events for uploads and downloads
- Byte-level transfer progress with speed and ETA
- Per-folder statistics
- Thread-safe for parallel operations
- Rich progress bar support
- Supports both
sync_pair()anddownload_folder()methods
-
Force Upload/Download ✨ NEW
- Force re-upload/re-download files even when they match
- Bypass hash/size comparison for replace operations
- Perfect for duplicate handling and refresh scenarios
- Works with all sync modes
-
Protocol Agnostic
- Works with any storage backend (local, S3, FTP, custom protocols)
- Pluggable storage interface
- Easy to extend for new storage types
Quick Example
from syncengine import SyncEngine, SyncMode, LocalStorageClient, SyncPair
# Create storage clients
source = LocalStorageClient("/path/to/source")
destination = LocalStorageClient("/path/to/destination")
# Create sync engine
engine = SyncEngine(mode=SyncMode.TWO_WAY)
# Create sync pair
pair = SyncPair(
source_root="/path/to/source",
destination_root="/path/to/destination",
source_client=source,
destination_client=destination
)
# Perform sync
stats = engine.sync_pair(pair)
print(f"Uploaded: {stats['uploads']}, Downloaded: {stats['downloads']}")
Progress Tracking Example
Track upload and download progress in real-time:
from syncengine import SyncProgressTracker, SyncProgressEvent
from pathlib import Path
def progress_callback(info):
# Track uploads
if info.event == SyncProgressEvent.UPLOAD_FILE_START:
print(f"⬆️ Uploading: {info.file_path}")
elif info.event == SyncProgressEvent.UPLOAD_FILE_COMPLETE:
print(f"✓ Uploaded: {info.file_path}")
# Track downloads
elif info.event == SyncProgressEvent.DOWNLOAD_FILE_START:
print(f"⬇️ Downloading: {info.file_path}")
elif info.event == SyncProgressEvent.DOWNLOAD_FILE_COMPLETE:
print(f"✓ Downloaded: {info.file_path}")
tracker = SyncProgressTracker(callback=progress_callback)
# Use with sync operations
stats = engine.sync_pair(pair, sync_progress_tracker=tracker)
# Use with folder downloads
stats = engine.download_folder(
destination_path="/remote/folder",
local_path=Path("/local/downloads"),
sync_progress_tracker=tracker
)
When to Use Each Sync Mode
| Mode | Use Case | Source Changes | Destination Changes | Deletions |
|---|---|---|---|---|
TWO_WAY |
Keep both sides in sync | Upload | Download | Propagated both ways |
SOURCE_TO_DESTINATION |
Mirror source to destination | Upload | Ignored (deleted) | Propagated to destination |
SOURCE_BACKUP |
Backup source, never delete | Upload | Download | Never delete source |
DESTINATION_TO_SOURCE |
Mirror destination to source | Ignored (deleted) | Download | Propagated to source |
DESTINATION_BACKUP |
Backup from destination | Ignored | Download | Never delete local backup |
Installation
pip install syncengine
Or for development:
git clone https://github.com/holgern/syncengine
cd syncengine
pip install -e .
Benchmarks
The project includes comprehensive benchmarks that test all sync modes with various scenarios. See benchmarks/README.md for details.
Run benchmarks:
python benchmarks/run_benchmarks.py
Documentation
Full documentation is available at Read the Docs:
- Quickstart Guide - Get started in minutes
- API Reference - Complete API documentation
- Examples - Real-world usage examples
- Sync Modes - Understanding sync strategies
- Changelog - Version history and updates
Key Modules
syncengine/engine.py- Main sync engine with force upload/download supportsyncengine/modes.py- Sync mode definitionssyncengine/progress.py- Progress tracking API with upload/download event supportsyncengine/comparator.py- Change detection and force comparison logicsyncengine/protocols.py- Storage protocol interfacessyncengine/config.py- Configuration options
Contributing
Contributions are welcome! Please ensure:
- Tests pass:
pytest tests/ - Benchmarks pass:
python benchmarks/run_benchmarks.py - Code follows project style
License
See LICENSE file for details.
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file syncengine-0.2.3.tar.gz.
File metadata
- Download URL: syncengine-0.2.3.tar.gz
- Upload date:
- Size: 166.5 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.9.25
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
1361820fdbf6a2e86b4c1305211ba7f462aae889ccef8e207941664e46e9689b
|
|
| MD5 |
aa2d893657b2c1b833fa1568ceb56ec0
|
|
| BLAKE2b-256 |
75561a3b1bae00d5d5e788f2198c70924ca13c633df150e6d9c311a75f455b76
|
File details
Details for the file syncengine-0.2.3-py3-none-any.whl.
File metadata
- Download URL: syncengine-0.2.3-py3-none-any.whl
- Upload date:
- Size: 73.2 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.9.25
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
917746145a51e32b06a7bb9d5140a8fafcd68d0d73c3c2fb7827a867a2537e87
|
|
| MD5 |
46c0cf693da4860fad2a18db3eda9c88
|
|
| BLAKE2b-256 |
3e5149a070112c82187398a4da4b2ddd9165e5d08192827fdb1545b0db1ddf06
|