Skip to content

Conversation

@tobixen
Copy link
Member

@tobixen tobixen commented Jan 18, 2026

I've been "vibing" with Claude Code in a "playground" branch for a long time now, but the end result starts looking like something it's possible to continue with.

I still have a TODO-list before I can make a release candidate for 3.0, so this is still a draft PR.

@tobixen
Copy link
Member Author

tobixen commented Jan 28, 2026

@tevepiercy - quite a lot of API changes have been done in this pull request / git branch. I've asked the AI to update the docs and examples, but with one exception I haven't done any QA of the doc updates done in this branch.

The exception is the "tutorial", the AI destroyed the whole "tutorial"-concept and spewed lots of irrelevant information to it. Definitively the documentation needs some human hands to become useful for human consumption. (I've particularly seen that the Claude AI seem to have no concepts of what is important for the end user and what is not - it's just dumping down whatever it has in its current "context")

Please have a look and see if you can work with some of this. The docs and examples are lliving under examples/ and docs/source. The docs/design-folder may be ignored (it's mostly meant for internal usage, possibly the whole folder will be removed before release).

@tobixen tobixen force-pushed the v3.0-dev branch 3 times, most recently from 4093832 to 85720ff Compare January 28, 2026 15:45
tobixen and others added 3 commits January 29, 2026 11:31
Introduce a complete architectural refactoring that enables both synchronous
and asynchronous CalDAV operations using the same domain objects.

Architecture:
- Protocol layer (caldav/protocol/): Pure functions for XML building/parsing
- Operations layer (caldav/operations/): High-level CalDAV operations
- Dual-mode domain objects: Calendar, Event, Todo, etc. work with both clients

New async API:
  from caldav.async_davclient import get_davclient

  async with await get_davclient(url, username, password) as client:
      principal = await client.get_principal()
      calendars = await client.get_calendars()

Key changes:
- Minimum Python version: 3.10+ (was 3.8+)
- niquests is the default HTTP library (httpx also supported for async)
- Sync client shares common code with async via BaseDAVClient
- Added search_principals() and capability check aliases
- Documentation updated for new get_davclient() factory method

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Test Framework:
- New tests/test_servers/ module with YAML-based configuration
- Support for embedded servers (Radicale, Xandikos)
- Support for Docker-based servers (Nextcloud, Baikal, etc.)
- Automatic server lifecycle management
- client_context helper for test fixtures
- Removed legacy tests/conf.py (conf_private.py will be ignored)

Data State:
- New caldav/datastate.py for managing calendar object data representations
- Efficient caching between raw/vobject/icalendar formats
- Lazy conversion on first access

Closes #613

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
CI/Tooling:
- Add linkcheck workflow with lychee
- Update pre-commit to use ruff (format + lint)
- Configure pytest-asyncio and warning filters
- Add deptry for dependency verification

Search API (closes #590):
- Add calendar.searcher() for advanced search queries
- Fix duplicate dictionary keys in compatibility_hints.py

Documentation:
- Update examples to use get_davclient() factory
- Add get_calendars_example.py
- Update tutorial and howtos for v3.0 API

Dependencies:
- Add httpx, pytest-asyncio as dependencies
- Update minimum Python to 3.10

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants