55import warnings
66from typing import Any
77
8+ import httpx
9+
810from taskbadger ._error_context import capture_error_data
911from taskbadger .context_providers import ContextProvider
1012from taskbadger .exceptions import (
2931 TaskRequest ,
3032)
3133from taskbadger .internal .types import UNSET
32- from taskbadger .mug import Badger , Callback , Session , Settings
34+ from taskbadger .mug import DEFAULT_HTTP_TIMEOUT , Badger , Callback , Session , Settings
3335from taskbadger .systems import System
3436from taskbadger .utils import import_string
3537
@@ -58,6 +60,17 @@ def _parse_token(token):
5860 return None
5961
6062
63+ def _timeout_from_env ():
64+ """Read the request timeout from ``TASKBADGER_HTTP_TIMEOUT``, falling back to the default."""
65+ raw = os .environ .get ("TASKBADGER_HTTP_TIMEOUT" )
66+ if not raw :
67+ return DEFAULT_HTTP_TIMEOUT
68+ try :
69+ return float (raw )
70+ except ValueError as e :
71+ raise ConfigurationError (f"TASKBADGER_HTTP_TIMEOUT must be a number, got { raw !r} " ) from e
72+
73+
6174def init (
6275 organization_slug : str = None ,
6376 project_slug : str = None ,
@@ -66,6 +79,7 @@ def init(
6679 tags : dict [str , str ] = None ,
6780 before_create : Callback = None ,
6881 context_providers : list [ContextProvider ] = None ,
82+ timeout : float | httpx .Timeout = None ,
6983):
7084 """Initialize Task Badger client.
7185
@@ -79,10 +93,13 @@ def init(
7993 Arguments:
8094 context_providers: Providers consulted when a tracked task errors, to attach extra
8195 context (e.g. a Sentry issue link) to the task's `data`. See `taskbadger.context_providers`.
96+ timeout: Timeout (seconds) for API requests. Defaults to the ``TASKBADGER_HTTP_TIMEOUT``
97+ environment variable if set, otherwise 5 seconds. Pass an `httpx.Timeout` for finer
98+ control, or ``httpx.Timeout(None)`` to disable timeouts.
8299
83100 Call this function once per thread.
84101 """
85- _init (_TB_HOST , organization_slug , project_slug , token , systems , tags , before_create , context_providers )
102+ _init (_TB_HOST , organization_slug , project_slug , token , systems , tags , before_create , context_providers , timeout )
86103
87104
88105def _init (
@@ -94,11 +111,14 @@ def _init(
94111 tags : dict [str , str ] = None ,
95112 before_create : Callback = None ,
96113 context_providers : list [ContextProvider ] = None ,
114+ timeout : float | httpx .Timeout = None ,
97115):
98116 host = host or os .environ .get ("TASKBADGER_HOST" , "https://taskbadger.net" )
99117 organization_slug = organization_slug or os .environ .get ("TASKBADGER_ORG" )
100118 project_slug = project_slug or os .environ .get ("TASKBADGER_PROJECT" )
101119 token = token or os .environ .get ("TASKBADGER_API_KEY" )
120+ if timeout is None :
121+ timeout = _timeout_from_env ()
102122
103123 if token :
104124 parsed = _parse_token (token )
@@ -127,6 +147,7 @@ def _init(
127147 systems = {system .identifier : system for system in systems },
128148 before_create = before_create ,
129149 context_providers = context_providers or [],
150+ timeout = timeout ,
130151 )
131152 Badger .current .bind (settings , tags )
132153 else :
0 commit comments