Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
73 commits
Select commit Hold shift + click to select a range
725bd05
Add Sans-I/O design documentation
tobixen Jan 18, 2026
a17be8a
Add Sans-I/O protocol layer
tobixen Jan 18, 2026
75d7c08
Add Sans-I/O operations layer
tobixen Jan 18, 2026
b904d93
Add unified test server framework
tobixen Jan 18, 2026
025b0ee
Add async client implementation
tobixen Jan 18, 2026
19e315c
Add dual-mode domain objects and client consolidation
tobixen Jan 18, 2026
4b02042
Add CI improvements and bug fixes
tobixen Jan 18, 2026
218a4b6
Update CHANGELOG for v3.0
tobixen Jan 18, 2026
deae9c0
Address review feedback: Python 3.10 minimum and HTTP library docs
tobixen Jan 18, 2026
625146c
tweaked the doc a bit. Skipped the optional httpx dependency.
tobixen Jan 18, 2026
6bf74fd
Make protocol and operations layer functions private
tobixen Jan 18, 2026
df8f530
Fix broken link to http-libraries docs
tobixen Jan 18, 2026
6b1ce54
Remove obsolete Python 3.9 version checks and update tests
tobixen Jan 18, 2026
c587c8b
Update docs and examples to import get_davclient from caldav
tobixen Jan 18, 2026
a70a6e4
Remove outdated pre-Sans-I/O design documents
tobixen Jan 18, 2026
2d4deaa
Suppress deprecation warnings in legacy date_search tests
tobixen Jan 19, 2026
469af33
Add capability check aliases for API consistency
tobixen Jan 19, 2026
b2e2ade
Document API naming conventions and update docstrings
tobixen Jan 19, 2026
0d9088b
Move name parameter from DAVObject to Calendar class
tobixen Jan 19, 2026
78a74dc
Fix style issues and add h2 to deptry ignore list
tobixen Jan 19, 2026
14287a1
Add code flow documentation for common CalDAV operations
tobixen Jan 19, 2026
356a06d
Add v3.0 code review findings document
tobixen Jan 19, 2026
03451f6
Update CHANGELOG with missing v3.0 entries
tobixen Jan 19, 2026
a042021
Consolidate duplicated code between sync and async clients
tobixen Jan 19, 2026
4bd4cfa
Update code review document to reflect consolidation
tobixen Jan 19, 2026
04981e1
Add get_calendars() and get_calendar() functions
tobixen Jan 19, 2026
a6c63c8
Add get_calendars() docs, examples, and simplify tests/conf.py
tobixen Jan 19, 2026
4feef03
Move client() helper from tests/conf.py to test_caldav.py
tobixen Jan 19, 2026
b18fe28
Remove legacy tests/conf.py in favor of test_servers framework
tobixen Jan 19, 2026
7ea4ed0
Update CHANGELOG.md for v3.0 release
tobixen Jan 19, 2026
f364f36
Add search_principals() and complete async client API
tobixen Jan 19, 2026
c3cdb8c
Use internal _find_objects_and_props() in library code
tobixen Jan 19, 2026
ec11c26
Fix TestGetDAVClient tests and update CHANGELOG example
tobixen Jan 19, 2026
b851e94
Fix TestGetDAVClient to properly test get_davclient()
tobixen Jan 19, 2026
5cb6f65
Fix test failures: Cyrus testWrongPassword and test_examples
tobixen Jan 20, 2026
043a4f4
Fix CI failures: style issues and None value in env var
tobixen Jan 20, 2026
cda396b
Fix test_docs.py to use test_servers framework
tobixen Jan 20, 2026
77cecdb
Add client_context helper to test_servers framework
tobixen Jan 20, 2026
85e2851
Don't restart Docker servers that are already running
tobixen Jan 20, 2026
f251198
Add investigative test for same-UID different-URL save behavior
tobixen Jan 20, 2026
3b6fe86
Mark duplicate UID creation as xfail in testSaveSameUidDifferentUrl
tobixen Jan 20, 2026
c32f089
Rename save_* to add_* as canonical method names
tobixen Jan 20, 2026
92e1a8f
Expand save_* aliases into wrapper methods with docstrings
tobixen Jan 20, 2026
0ec4b09
Rename *_by_uid to get_*_by_uid per naming conventions
tobixen Jan 20, 2026
dad0816
Rename data retrieval methods to use get_* prefix
tobixen Jan 20, 2026
20aaa6e
Fix Docker server reuse: don't stop externally-started servers
tobixen Jan 20, 2026
669ff6a
Revert _started_by_us changes for embedded servers
tobixen Jan 20, 2026
32ea10b
Fix Xandikos server shutdown and restart lifecycle
tobixen Jan 20, 2026
b20c6ed
Add design doc for data representation API (issue #613)
tobixen Jan 21, 2026
0f82c10
Update data representation design with borrowing pattern
tobixen Jan 21, 2026
127f2bf
Fix code style: black formatting and import ordering
tobixen Jan 21, 2026
055cb93
Fix CI: use correct test filter for sync-requests job
tobixen Jan 21, 2026
a5a36e2
Add data properties usage overview document
tobixen Jan 22, 2026
b2997c7
fix for https://github.com/python-caldav/caldav/issues/614
tobixen Jan 22, 2026
f49b2b3
test warnings ignore list updated
tobixen Jan 23, 2026
c9df86f
Wrap deprecated date_search and expand_rrule calls with pytest.deprec…
tobixen Jan 23, 2026
7b2414e
we should do more research on warnings
tobixen Jan 23, 2026
5e6cf4d
Implement new data representation API (issue #613)
tobixen Jan 23, 2026
dec2408
Configure pytest to treat warnings as errors
tobixen Jan 23, 2026
84e3df7
Add cheap internal accessors to DataState (issue #613)
tobixen Jan 23, 2026
f85c754
Optimize has_component() to avoid data conversion (issue #613)
tobixen Jan 23, 2026
9665432
Fix pytest filterwarnings configuration for Radicale
tobixen Jan 23, 2026
89c0188
Update pytest warning filters with upstream Radicale issue reference
tobixen Jan 23, 2026
87654ac
Update DATA_REPRESENTATION_DESIGN.md status to Implemented
tobixen Jan 23, 2026
92b6875
Implement issue #613: new data representation API with documentation
tobixen Jan 25, 2026
7cea2f2
Implement issue #515: make CalendarObjectResource.id a property
tobixen Jan 25, 2026
aa59d43
Implement calendar.searcher() API for advanced searches (issue #590)
tobixen Jan 24, 2026
8edf4f0
fixup 19e315c6586f57ff419f50eb8dcb7c6dc014021a
tobixen Jan 28, 2026
6d96d76
style fixup
tobixen Jan 28, 2026
2b6e242
Fix import error: move cdav import outside TYPE_CHECKING
tobixen Jan 28, 2026
61021bf
Replace black with ruff for entire codebase
tobixen Jan 28, 2026
a6dc36c
Add feature-complete CalDAV library roadmap
tobixen Jan 28, 2026
85720ff
Fix CI failures: lychee rev format and Radicale deprecation warning
tobixen Jan 28, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
18 changes: 18 additions & 0 deletions .github/workflows/linkcheck.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
name: Link check

on: [push, pull_request]

jobs:
linkcheck:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Check links with Lychee
uses: lycheeverse/lychee-action@v2
with:
fail: true
args: >-
--timeout 10
--max-retries 2
'**/*.md'
'**/*.rst'
51 changes: 49 additions & 2 deletions .github/workflows/tests.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@ jobs:
strategy:
fail-fast: false
matrix:
python: ${{ github.event_name == 'pull_request' && fromJSON('["3.9", "3.14"]') || fromJSON('["3.9", "3.10", "3.11", "3.12", "3.13", "3.14"]') }}
python: ${{ github.event_name == 'pull_request' && fromJSON('["3.10", "3.14"]') || fromJSON('["3.10", "3.11", "3.12", "3.13", "3.14"]') }}
services:
baikal:
image: ckulka/baikal:nginx
Expand Down Expand Up @@ -144,7 +144,7 @@ jobs:
docker exec ${{ job.services.nextcloud.id }} php occ app:disable password_policy || true

# Create test user
docker exec -e OC_PASS="TestPassword123!" ${{ job.services.nextcloud.id }} php occ user:add --password-from-env --display-name="Test User" testuser || echo "User may already exist"
docker exec -e OC_PASS="testpass" ${{ job.services.nextcloud.id }} php occ user:add --password-from-env --display-name="Test User" testuser || echo "User may already exist"

# Enable calendar and contacts apps
docker exec ${{ job.services.nextcloud.id }} php occ app:enable calendar || true
Expand Down Expand Up @@ -326,3 +326,50 @@ jobs:
key: pip|${{ hashFiles('setup.py') }}|${{ hashFiles('tox.ini') }}
- run: pip install tox
- run: tox -e deptry
async-niquests:
# Test that async code works with niquests when httpx is not installed
name: async (niquests fallback)
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions/setup-python@v5
with:
python-version: "3.12"
- name: Install dependencies without httpx
run: |
pip install --editable .[test]
pip uninstall -y httpx
- name: Verify niquests is used
run: |
python -c "
from caldav.async_davclient import _USE_HTTPX, _USE_NIQUESTS
assert not _USE_HTTPX, 'httpx should not be available'
assert _USE_NIQUESTS, 'niquests should be used'
print('✓ Using niquests for async HTTP')
"
- name: Run async tests with niquests
run: pytest tests/test_async_davclient.py -v
sync-requests:
# Test that sync code works with requests when niquests is not installed
name: sync (requests fallback)
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions/setup-python@v5
with:
python-version: "3.12"
- name: Install dependencies with requests instead of niquests
run: |
pip install --editable .[test]
pip uninstall -y niquests
pip install requests
- name: Verify requests is used
run: |
python -c "
from caldav.davclient import _USE_REQUESTS, _USE_NIQUESTS
assert _USE_REQUESTS, 'requests should be available'
assert not _USE_NIQUESTS, 'niquests should not be available'
print('✓ Using requests for sync HTTP')
"
- name: Run sync tests with requests
run: pytest tests/test_caldav.py -v -k "Radicale" --ignore=tests/test_async_integration.py
20 changes: 20 additions & 0 deletions .lycheeignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
# Example domains that don't resolve
https?://your\.server\.example\.com/.*
https?://.*\.example\.com/.*

# Localhost URLs for test servers (not accessible in CI)
http://localhost:\d+/.*

# CalDAV endpoints that require authentication (401/403 expected)
https://caldav\.fastmail\.com/.*
https://caldav\.gmx\.net/.*
https://caldav\.icloud\.com/.*
https://p\d+-caldav\.icloud\.com/.*
https://posteo\.de:\d+/.*
https://purelymail\.com/.*
https://webmail\.all-inkl\.com/.*
https://www\.google\.com/calendar/dav/.*
https://caldav-jp\.larksuite\.com/.*

# Apple namespace URL (returns 404 but is a valid XML namespace reference)
http://apple\.com/ns/ical/
23 changes: 15 additions & 8 deletions .pre-commit-config.yaml
Original file line number Diff line number Diff line change
@@ -1,16 +1,23 @@
---
repos:
- repo: https://github.com/asottile/reorder_python_imports
rev: v3.12.0
- repo: https://github.com/astral-sh/ruff-pre-commit
rev: v0.9.4
hooks:
- id: reorder-python-imports
- repo: https://github.com/psf/black
rev: 23.12.0
hooks:
- id: black
- id: ruff
args: [--fix]
- id: ruff-format

- repo: https://github.com/pre-commit/pre-commit-hooks
rev: v4.5.0
rev: v5.0.0
hooks:
- id: check-byte-order-marker
- id: trailing-whitespace
- id: end-of-file-fixer

- repo: https://github.com/lycheeverse/lychee
rev: lychee-v0.22.0
hooks:
- id: lychee
args: ["--no-progress", "--timeout", "10"]
types: [markdown, rst]
stages: [manual] # Run with: pre-commit run lychee --hook-stage manual
9 changes: 4 additions & 5 deletions AI_POLICY.md → AI-POLICY.md
Original file line number Diff line number Diff line change
Expand Up @@ -63,11 +63,10 @@ experiences is that the AI performs best when being "supervised" and
<noreply@anthropic.com>` when it's doing commits, that's also OK.

* **YOU** should be ready to follow up and respond to feedback and
questions on the contribution. If all you do is to relay it to the
AI and relaying the AI output back to the pull request, then
you're not adding value to the project and you're not transparent
and honest. You should at least do a quick QA on the AI-answer and
acknowledge that it was generated by the AI.
questions on the contribution. If you're letting the AI do this for
you, then you're neither honest nor adding value to the project.
You should at least do a quick QA on the AI-answer and acknowledge
that it was generated by the AI.

* The Contributors Guidelines aren't strongly enforced on this project
as of 2025-12, and I can hardly see cases where the AI would break
Expand Down
Loading
Loading