calendaring-sync/
├── src/
│ └── calendaring_sync/
│ ├── __init__.py
│ ├── state.py -- state store (ETag, sync-token, JMAP State)
│ ├── cache.py -- local cache of calendar objects
│ ├── conflict.py -- conflict detection and classification
│ ├── adapters/
│ │ ├── __init__.py
│ │ ├── caldav.py -- CalDAV adapter (optional dep: python-caldav)
│ │ └── jmap.py -- JMAP adapter (optional dep: calendaring-jmap)
│ └── storage/
│ ├── __init__.py
│ ├── base.py -- abstract StorageBackend
│ ├── sqlite.py -- default SQLite backend
│ └── memory.py -- in-memory backend for tests
├── tests/
│ ├── test_state.py
│ ├── test_cache.py
│ ├── test_conflict.py
│ └── adapters/
│ ├── test_caldav.py
│ └── test_jmap.py
├── docs/
├── pyproject.toml
└── .gitignore
pyproject.toml:
- hatchling build, version from hatch-vcs
- core deps: none (stdlib only for state.py, cache.py, conflict.py)
- optional: caldav = ["python-caldav>=3.0"], jmap = ["calendaring-jmap>=1.0"]
- dev: pytest, ruff, coverage, python-caldav, calendaring-jmap
- ruff line length 100
The core has no hard dependencies. A user who only needs the CalDAV adapter should not be forced to install calendaring-jmap.
See pycalendar/icalendar-anonymizer#12.
pyproject.toml:
The core has no hard dependencies. A user who only needs the CalDAV adapter should not be forced to install calendaring-jmap.
See pycalendar/icalendar-anonymizer#12.