Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
69 commits
Select commit Hold shift + click to select a range
102ea47
minor bugfix
tobixen Dec 17, 2025
14973cb
Export get_davclient from caldav package
tobixen Jan 18, 2026
d0a3543
Add Sans-I/O design documentation
tobixen Jan 18, 2026
39b081d
Add Sans-I/O protocol layer
tobixen Jan 18, 2026
e6cc25d
Add Sans-I/O operations layer
tobixen Jan 18, 2026
69c4858
Add unified test server framework
tobixen Jan 18, 2026
adaa7ab
Add async client implementation
tobixen Jan 18, 2026
cce0d96
Add dual-mode domain objects and client consolidation
tobixen Jan 18, 2026
11829a5
Add CI improvements and bug fixes
tobixen Jan 18, 2026
342b5df
Update CHANGELOG for v3.0
tobixen Jan 18, 2026
1a65ff7
Address review feedback: Python 3.10 minimum and HTTP library docs
tobixen Jan 18, 2026
8981b3d
tweaked the doc a bit. Skipped the optional httpx dependency.
tobixen Jan 18, 2026
6c787e9
Make protocol and operations layer functions private
tobixen Jan 18, 2026
ed634a3
Fix broken link to http-libraries docs
tobixen Jan 18, 2026
a0b98c2
Remove obsolete Python 3.9 version checks and update tests
tobixen Jan 18, 2026
d4eb5f3
Update docs and examples to import get_davclient from caldav
tobixen Jan 18, 2026
1d10855
Remove outdated pre-Sans-I/O design documents
tobixen Jan 18, 2026
ea2f669
Suppress deprecation warnings in legacy date_search tests
tobixen Jan 19, 2026
2b53aee
Add capability check aliases for API consistency
tobixen Jan 19, 2026
0d73800
Document API naming conventions and update docstrings
tobixen Jan 19, 2026
9841be4
Move name parameter from DAVObject to Calendar class
tobixen Jan 19, 2026
a83be11
Fix style issues and add h2 to deptry ignore list
tobixen Jan 19, 2026
2b0b5a0
Add code flow documentation for common CalDAV operations
tobixen Jan 19, 2026
3888330
Add v3.0 code review findings document
tobixen Jan 19, 2026
1616fec
Update CHANGELOG with missing v3.0 entries
tobixen Jan 19, 2026
a97a61e
Consolidate duplicated code between sync and async clients
tobixen Jan 19, 2026
7a56d41
Update code review document to reflect consolidation
tobixen Jan 19, 2026
eee7a38
Add get_calendars() and get_calendar() functions
tobixen Jan 19, 2026
4e6ca9b
Add get_calendars() docs, examples, and simplify tests/conf.py
tobixen Jan 19, 2026
5697295
Move client() helper from tests/conf.py to test_caldav.py
tobixen Jan 19, 2026
11871cf
Remove legacy tests/conf.py in favor of test_servers framework
tobixen Jan 19, 2026
d7bfd59
Update CHANGELOG.md for v3.0 release
tobixen Jan 19, 2026
8e13d4f
Add search_principals() and complete async client API
tobixen Jan 19, 2026
fe609bb
Use internal _find_objects_and_props() in library code
tobixen Jan 19, 2026
28cb693
Fix TestGetDAVClient tests and update CHANGELOG example
tobixen Jan 19, 2026
3797fe4
Fix TestGetDAVClient to properly test get_davclient()
tobixen Jan 19, 2026
fec7713
Fix test failures: Cyrus testWrongPassword and test_examples
tobixen Jan 20, 2026
6930436
Fix CI failures: style issues and None value in env var
tobixen Jan 20, 2026
86f366c
Fix test_docs.py to use test_servers framework
tobixen Jan 20, 2026
53a6654
Add client_context helper to test_servers framework
tobixen Jan 20, 2026
eee8c56
Don't restart Docker servers that are already running
tobixen Jan 20, 2026
ae412ac
Add investigative test for same-UID different-URL save behavior
tobixen Jan 20, 2026
e0fa7a0
Mark duplicate UID creation as xfail in testSaveSameUidDifferentUrl
tobixen Jan 20, 2026
3f0ca22
Rename save_* to add_* as canonical method names
tobixen Jan 20, 2026
4c51829
Expand save_* aliases into wrapper methods with docstrings
tobixen Jan 20, 2026
30ca128
Rename *_by_uid to get_*_by_uid per naming conventions
tobixen Jan 20, 2026
2fa424d
Rename data retrieval methods to use get_* prefix
tobixen Jan 20, 2026
9c49c87
Fix Docker server reuse: don't stop externally-started servers
tobixen Jan 20, 2026
3b5619f
Revert _started_by_us changes for embedded servers
tobixen Jan 20, 2026
444c8af
Fix Xandikos server shutdown and restart lifecycle
tobixen Jan 20, 2026
46da2c3
Add design doc for data representation API (issue #613)
tobixen Jan 21, 2026
0f9a908
Update data representation design with borrowing pattern
tobixen Jan 21, 2026
e76c413
Fix code style: black formatting and import ordering
tobixen Jan 21, 2026
50e3ede
Fix CI: use correct test filter for sync-requests job
tobixen Jan 21, 2026
bcb2051
Add data properties usage overview document
tobixen Jan 22, 2026
04b31b7
fix for https://github.com/python-caldav/caldav/issues/614
tobixen Jan 22, 2026
88277cb
test warnings ignore list updated
tobixen Jan 23, 2026
23d8904
Wrap deprecated date_search and expand_rrule calls with pytest.deprec…
tobixen Jan 23, 2026
25196f4
we should do more research on warnings
tobixen Jan 23, 2026
282c583
Implement new data representation API (issue #613)
tobixen Jan 23, 2026
de21cc7
Configure pytest to treat warnings as errors
tobixen Jan 23, 2026
9361f76
Add cheap internal accessors to DataState (issue #613)
tobixen Jan 23, 2026
528103d
Optimize has_component() to avoid data conversion (issue #613)
tobixen Jan 23, 2026
491f219
Fix pytest filterwarnings configuration for Radicale
tobixen Jan 23, 2026
4564397
Update pytest warning filters with upstream Radicale issue reference
tobixen Jan 23, 2026
ff310f5
Update DATA_REPRESENTATION_DESIGN.md status to Implemented
tobixen Jan 23, 2026
4d00c83
Implement issue #613: new data representation API with documentation
tobixen Jan 25, 2026
e39dd00
Implement issue #515: make CalendarObjectResource.id a property
tobixen Jan 25, 2026
3d1b79b
Implement calendar.searcher() API for advanced searches (issue #590)
tobixen Jan 24, 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/
6 changes: 6 additions & 0 deletions .pre-commit-config.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -14,3 +14,9 @@ repos:
- 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-docker
args: ["--no-progress", "--timeout", "10"]
types: [markdown, rst]
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