Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
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
1 change: 1 addition & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -906,6 +906,7 @@ The inbox is a special project that cannot be deleted. Get its ID via `await cli
| `TICKTICK_REDIRECT_URI` | No | OAuth2 redirect URI (default: `http://127.0.0.1:8080/callback`) |
| `TICKTICK_TIMEOUT` | No | Request timeout in seconds (default: `30`) |
| `TICKTICK_DEVICE_ID` | No | Device ID for V2 API (auto-generated) |
| `TICKTICK_DOMAIN` | No | TickTick domain to use (default: `ticktick.com`, alternative: `dida365.com`) |

---

Expand Down
11 changes: 8 additions & 3 deletions src/ticktick_sdk/constants.py
Original file line number Diff line number Diff line change
Expand Up @@ -9,16 +9,21 @@

from enum import IntEnum, StrEnum
from typing import Literal
import os


# =============================================================================
# API Configuration
# =============================================================================
def _get_ticktick_domain():
"""Get the TickTick domain from environment or default."""
domain = os.environ.get("TICKTICK_DOMAIN")
return domain if domain else "ticktick.com"

# Base URLs
TICKTICK_API_BASE_V1 = "https://api.ticktick.com/open/v1"
TICKTICK_API_BASE_V2 = "https://api.ticktick.com/api/v2"
TICKTICK_OAUTH_BASE = "https://ticktick.com/oauth"
TICKTICK_API_BASE_V1 = f"https://api.{_get_ticktick_domain()}/open/v1"
TICKTICK_API_BASE_V2 = f"https://api.{_get_ticktick_domain()}/api/v2"
TICKTICK_OAUTH_BASE = f"https://{_get_ticktick_domain()}/oauth"

# Default timeout in seconds
DEFAULT_TIMEOUT = 30.0
Expand Down
32 changes: 32 additions & 0 deletions tests/test_constants.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
"""
Tests for environment variable support in constants module.
"""

import os
from unittest.mock import patch


def test_constants_default_domain():
"""Test that constants use default domain when no env var is set."""
with patch.dict(os.environ, {}, clear=True):
from importlib import reload
import ticktick_sdk.constants as constants

reload(constants)

assert "ticktick.com" in constants.TICKTICK_API_BASE_V1
assert "ticktick.com" in constants.TICKTICK_API_BASE_V2
assert "ticktick.com" in constants.TICKTICK_OAUTH_BASE


def test_constants_use_custom_domain():
"""Test that constants are updated when domain is changed."""
with patch.dict(os.environ, {"TICKTICK_DOMAIN": "dida365.com"}):
from importlib import reload
import ticktick_sdk.constants as constants

reload(constants)

assert "dida365.com" in constants.TICKTICK_API_BASE_V1
assert "dida365.com" in constants.TICKTICK_API_BASE_V2
assert "dida365.com" in constants.TICKTICK_OAUTH_BASE