fathom-python 0.0.36__py3-none-any.whl → 0.0.38__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- fathom_python/_version.py +3 -3
- fathom_python/errors/apierror.py +1 -1
- fathom_python/errors/fathomerror.py +1 -1
- fathom_python/errors/no_response_error.py +1 -1
- fathom_python/errors/responsevalidationerror.py +1 -1
- fathom_python/models/__init__.py +28 -2
- fathom_python/models/listmeetingsop.py +12 -40
- fathom_python/models/listmeetingtypesop.py +34 -0
- fathom_python/models/meeting.py +6 -0
- fathom_python/models/meetingtype.py +34 -0
- fathom_python/models/meetingtypelistresponse.py +52 -0
- fathom_python/sdk.py +274 -20
- fathom_python/types/base64fileinput.py +39 -0
- fathom_python/utils/dynamic_imports.py +54 -0
- fathom_python/utils/retries.py +69 -5
- fathom_python/utils/unmarshal_json_response.py +15 -1
- {fathom_python-0.0.36.dist-info → fathom_python-0.0.38.dist-info}/METADATA +20 -42
- {fathom_python-0.0.36.dist-info → fathom_python-0.0.38.dist-info}/RECORD +19 -14
- {fathom_python-0.0.36.dist-info → fathom_python-0.0.38.dist-info}/WHEEL +1 -1
fathom_python/_version.py
CHANGED
|
@@ -3,10 +3,10 @@
|
|
|
3
3
|
import importlib.metadata
|
|
4
4
|
|
|
5
5
|
__title__: str = "fathom-python"
|
|
6
|
-
__version__: str = "0.0.
|
|
6
|
+
__version__: str = "0.0.38"
|
|
7
7
|
__openapi_doc_version__: str = "1.0.0"
|
|
8
|
-
__gen_version__: str = "2.
|
|
9
|
-
__user_agent__: str = "speakeasy-sdk/python 0.0.
|
|
8
|
+
__gen_version__: str = "2.762.0"
|
|
9
|
+
__user_agent__: str = "speakeasy-sdk/python 0.0.38 2.762.0 1.0.0 fathom-python"
|
|
10
10
|
|
|
11
11
|
try:
|
|
12
12
|
if __package__ is not None:
|
fathom_python/errors/apierror.py
CHANGED
|
@@ -7,7 +7,7 @@ from dataclasses import dataclass
|
|
|
7
7
|
from fathom_python.errors import FathomError
|
|
8
8
|
|
|
9
9
|
|
|
10
|
-
@dataclass(
|
|
10
|
+
@dataclass(unsafe_hash=True)
|
|
11
11
|
class ResponseValidationError(FathomError):
|
|
12
12
|
"""Error raised when there is a type mismatch between the response data and the expected Pydantic model."""
|
|
13
13
|
|
fathom_python/models/__init__.py
CHANGED
|
@@ -43,7 +43,12 @@ if TYPE_CHECKING:
|
|
|
43
43
|
ListMeetingsRequestTypedDict,
|
|
44
44
|
ListMeetingsResponse,
|
|
45
45
|
ListMeetingsResponseTypedDict,
|
|
46
|
-
|
|
46
|
+
)
|
|
47
|
+
from .listmeetingtypesop import (
|
|
48
|
+
ListMeetingTypesRequest,
|
|
49
|
+
ListMeetingTypesRequestTypedDict,
|
|
50
|
+
ListMeetingTypesResponse,
|
|
51
|
+
ListMeetingTypesResponseTypedDict,
|
|
47
52
|
)
|
|
48
53
|
from .listteammembersop import (
|
|
49
54
|
ListTeamMembersRequest,
|
|
@@ -60,6 +65,11 @@ if TYPE_CHECKING:
|
|
|
60
65
|
from .meeting import CalendarInviteesDomainsType, Meeting, MeetingTypedDict
|
|
61
66
|
from .meetinglistresponse import MeetingListResponse, MeetingListResponseTypedDict
|
|
62
67
|
from .meetingsummary import MeetingSummary, MeetingSummaryTypedDict
|
|
68
|
+
from .meetingtype import MeetingType, MeetingTypeTypedDict, Status
|
|
69
|
+
from .meetingtypelistresponse import (
|
|
70
|
+
MeetingTypeListResponse,
|
|
71
|
+
MeetingTypeListResponseTypedDict,
|
|
72
|
+
)
|
|
63
73
|
from .security import Security, SecurityTypedDict
|
|
64
74
|
from .team import Team, TeamTypedDict
|
|
65
75
|
from .teamlistresponse import TeamListResponse, TeamListResponseTypedDict
|
|
@@ -112,6 +122,10 @@ __all__ = [
|
|
|
112
122
|
"GetRecordingTranscriptResponseTypedDict",
|
|
113
123
|
"Invitee",
|
|
114
124
|
"InviteeTypedDict",
|
|
125
|
+
"ListMeetingTypesRequest",
|
|
126
|
+
"ListMeetingTypesRequestTypedDict",
|
|
127
|
+
"ListMeetingTypesResponse",
|
|
128
|
+
"ListMeetingTypesResponseTypedDict",
|
|
115
129
|
"ListMeetingsCalendarInviteesDomainsType",
|
|
116
130
|
"ListMeetingsRequest",
|
|
117
131
|
"ListMeetingsRequestTypedDict",
|
|
@@ -131,9 +145,13 @@ __all__ = [
|
|
|
131
145
|
"MeetingSummary",
|
|
132
146
|
"MeetingSummaryTypedDict",
|
|
133
147
|
"MeetingType",
|
|
148
|
+
"MeetingTypeListResponse",
|
|
149
|
+
"MeetingTypeListResponseTypedDict",
|
|
150
|
+
"MeetingTypeTypedDict",
|
|
134
151
|
"MeetingTypedDict",
|
|
135
152
|
"Security",
|
|
136
153
|
"SecurityTypedDict",
|
|
154
|
+
"Status",
|
|
137
155
|
"Team",
|
|
138
156
|
"TeamListResponse",
|
|
139
157
|
"TeamListResponseTypedDict",
|
|
@@ -192,7 +210,10 @@ _dynamic_imports: dict[str, str] = {
|
|
|
192
210
|
"ListMeetingsRequestTypedDict": ".listmeetingsop",
|
|
193
211
|
"ListMeetingsResponse": ".listmeetingsop",
|
|
194
212
|
"ListMeetingsResponseTypedDict": ".listmeetingsop",
|
|
195
|
-
"
|
|
213
|
+
"ListMeetingTypesRequest": ".listmeetingtypesop",
|
|
214
|
+
"ListMeetingTypesRequestTypedDict": ".listmeetingtypesop",
|
|
215
|
+
"ListMeetingTypesResponse": ".listmeetingtypesop",
|
|
216
|
+
"ListMeetingTypesResponseTypedDict": ".listmeetingtypesop",
|
|
196
217
|
"ListTeamMembersRequest": ".listteammembersop",
|
|
197
218
|
"ListTeamMembersRequestTypedDict": ".listteammembersop",
|
|
198
219
|
"ListTeamMembersResponse": ".listteammembersop",
|
|
@@ -208,6 +229,11 @@ _dynamic_imports: dict[str, str] = {
|
|
|
208
229
|
"MeetingListResponseTypedDict": ".meetinglistresponse",
|
|
209
230
|
"MeetingSummary": ".meetingsummary",
|
|
210
231
|
"MeetingSummaryTypedDict": ".meetingsummary",
|
|
232
|
+
"MeetingType": ".meetingtype",
|
|
233
|
+
"MeetingTypeTypedDict": ".meetingtype",
|
|
234
|
+
"Status": ".meetingtype",
|
|
235
|
+
"MeetingTypeListResponse": ".meetingtypelistresponse",
|
|
236
|
+
"MeetingTypeListResponseTypedDict": ".meetingtypelistresponse",
|
|
211
237
|
"Security": ".security",
|
|
212
238
|
"SecurityTypedDict": ".security",
|
|
213
239
|
"Team": ".team",
|
|
@@ -18,25 +18,7 @@ class ListMeetingsCalendarInviteesDomainsType(str, Enum):
|
|
|
18
18
|
ONE_OR_MORE_EXTERNAL = "one_or_more_external"
|
|
19
19
|
|
|
20
20
|
|
|
21
|
-
class MeetingType(str, Enum):
|
|
22
|
-
r"""Filter by meeting type."""
|
|
23
|
-
|
|
24
|
-
ALL = "all"
|
|
25
|
-
INTERNAL = "internal"
|
|
26
|
-
EXTERNAL = "external"
|
|
27
|
-
|
|
28
|
-
|
|
29
21
|
class ListMeetingsRequestTypedDict(TypedDict):
|
|
30
|
-
calendar_invitees: NotRequired[List[str]]
|
|
31
|
-
r"""Email address of calendar_invitees to filter by.
|
|
32
|
-
|
|
33
|
-
Pass the parameter once per value, e.g.
|
|
34
|
-
`calendar_invitees[]=cfo@acme.com&calendar_invitees[]=legal@acme.com`.
|
|
35
|
-
|
|
36
|
-
Returns meetings where any of the given email addresses appear
|
|
37
|
-
in the calendar_invitees list.
|
|
38
|
-
|
|
39
|
-
"""
|
|
40
22
|
calendar_invitees_domains: NotRequired[List[str]]
|
|
41
23
|
r"""Domains of the companies to filter by. Exact match.
|
|
42
24
|
|
|
@@ -62,8 +44,12 @@ class ListMeetingsRequestTypedDict(TypedDict):
|
|
|
62
44
|
r"""Include the summary for each meeting. Unavailable for OAuth connected apps (use /recordings instead)."""
|
|
63
45
|
include_transcript: NotRequired[bool]
|
|
64
46
|
r"""Include the transcript for each meeting. Unavailable for OAuth connected apps (use /recordings instead)."""
|
|
65
|
-
meeting_type: NotRequired[
|
|
66
|
-
r"""Filter by meeting type.
|
|
47
|
+
meeting_type: NotRequired[str]
|
|
48
|
+
r"""Filter by meeting type name.
|
|
49
|
+
|
|
50
|
+
Returns only meetings assigned the meeting type with this name. Use /meeting_types to discover valid values. An unknown or non-matching name returns an empty list.
|
|
51
|
+
|
|
52
|
+
"""
|
|
67
53
|
recorded_by: NotRequired[List[str]]
|
|
68
54
|
r"""Email addresses of users who recorded meetings.
|
|
69
55
|
|
|
@@ -85,21 +71,6 @@ class ListMeetingsRequestTypedDict(TypedDict):
|
|
|
85
71
|
|
|
86
72
|
|
|
87
73
|
class ListMeetingsRequest(BaseModel):
|
|
88
|
-
calendar_invitees: Annotated[
|
|
89
|
-
Optional[List[str]],
|
|
90
|
-
pydantic.Field(alias="calendar_invitees[]"),
|
|
91
|
-
FieldMetadata(query=QueryParamMetadata(style="form", explode=True)),
|
|
92
|
-
] = None
|
|
93
|
-
r"""Email address of calendar_invitees to filter by.
|
|
94
|
-
|
|
95
|
-
Pass the parameter once per value, e.g.
|
|
96
|
-
`calendar_invitees[]=cfo@acme.com&calendar_invitees[]=legal@acme.com`.
|
|
97
|
-
|
|
98
|
-
Returns meetings where any of the given email addresses appear
|
|
99
|
-
in the calendar_invitees list.
|
|
100
|
-
|
|
101
|
-
"""
|
|
102
|
-
|
|
103
74
|
calendar_invitees_domains: Annotated[
|
|
104
75
|
Optional[List[str]],
|
|
105
76
|
pydantic.Field(alias="calendar_invitees_domains[]"),
|
|
@@ -163,13 +134,14 @@ class ListMeetingsRequest(BaseModel):
|
|
|
163
134
|
r"""Include the transcript for each meeting. Unavailable for OAuth connected apps (use /recordings instead)."""
|
|
164
135
|
|
|
165
136
|
meeting_type: Annotated[
|
|
166
|
-
Optional[
|
|
167
|
-
pydantic.Field(
|
|
168
|
-
deprecated="warning: ** DEPRECATED ** - This will be removed in a future release, please migrate away from it as soon as possible."
|
|
169
|
-
),
|
|
137
|
+
Optional[str],
|
|
170
138
|
FieldMetadata(query=QueryParamMetadata(style="form", explode=True)),
|
|
171
139
|
] = None
|
|
172
|
-
r"""Filter by meeting type.
|
|
140
|
+
r"""Filter by meeting type name.
|
|
141
|
+
|
|
142
|
+
Returns only meetings assigned the meeting type with this name. Use /meeting_types to discover valid values. An unknown or non-matching name returns an empty list.
|
|
143
|
+
|
|
144
|
+
"""
|
|
173
145
|
|
|
174
146
|
recorded_by: Annotated[
|
|
175
147
|
Optional[List[str]],
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
"""Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT."""
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
from .meetingtypelistresponse import (
|
|
5
|
+
MeetingTypeListResponse,
|
|
6
|
+
MeetingTypeListResponseTypedDict,
|
|
7
|
+
)
|
|
8
|
+
from fathom_python.types import BaseModel
|
|
9
|
+
from fathom_python.utils import FieldMetadata, QueryParamMetadata
|
|
10
|
+
from typing import Callable, Optional
|
|
11
|
+
from typing_extensions import Annotated, NotRequired, TypedDict
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
class ListMeetingTypesRequestTypedDict(TypedDict):
|
|
15
|
+
cursor: NotRequired[str]
|
|
16
|
+
r"""Cursor for pagination."""
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
class ListMeetingTypesRequest(BaseModel):
|
|
20
|
+
cursor: Annotated[
|
|
21
|
+
Optional[str],
|
|
22
|
+
FieldMetadata(query=QueryParamMetadata(style="form", explode=True)),
|
|
23
|
+
] = None
|
|
24
|
+
r"""Cursor for pagination."""
|
|
25
|
+
|
|
26
|
+
|
|
27
|
+
class ListMeetingTypesResponseTypedDict(TypedDict):
|
|
28
|
+
result: MeetingTypeListResponseTypedDict
|
|
29
|
+
|
|
30
|
+
|
|
31
|
+
class ListMeetingTypesResponse(BaseModel):
|
|
32
|
+
next: Callable[[], Optional[ListMeetingTypesResponse]]
|
|
33
|
+
|
|
34
|
+
result: MeetingTypeListResponse
|
fathom_python/models/meeting.py
CHANGED
|
@@ -30,6 +30,8 @@ class MeetingTypedDict(TypedDict):
|
|
|
30
30
|
title: str
|
|
31
31
|
meeting_title: Nullable[str]
|
|
32
32
|
r"""Calendar event title."""
|
|
33
|
+
meeting_type: Nullable[str]
|
|
34
|
+
r"""The name of the meeting type assigned to this meeting, or `null` if none is assigned."""
|
|
33
35
|
recording_id: int
|
|
34
36
|
r"""The ID of the meeting recording."""
|
|
35
37
|
url: str
|
|
@@ -59,6 +61,9 @@ class Meeting(BaseModel):
|
|
|
59
61
|
meeting_title: Nullable[str]
|
|
60
62
|
r"""Calendar event title."""
|
|
61
63
|
|
|
64
|
+
meeting_type: Nullable[str]
|
|
65
|
+
r"""The name of the meeting type assigned to this meeting, or `null` if none is assigned."""
|
|
66
|
+
|
|
62
67
|
recording_id: int
|
|
63
68
|
r"""The ID of the meeting recording."""
|
|
64
69
|
|
|
@@ -106,6 +111,7 @@ class Meeting(BaseModel):
|
|
|
106
111
|
]
|
|
107
112
|
nullable_fields = [
|
|
108
113
|
"meeting_title",
|
|
114
|
+
"meeting_type",
|
|
109
115
|
"transcript",
|
|
110
116
|
"default_summary",
|
|
111
117
|
"action_items",
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
"""Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT."""
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
from datetime import datetime
|
|
5
|
+
from enum import Enum
|
|
6
|
+
from fathom_python.types import BaseModel
|
|
7
|
+
from typing_extensions import TypedDict
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
class Status(str, Enum):
|
|
11
|
+
r"""Whether the meeting type is currently assignable. `active` types can be assigned to meetings going forward; `inactive` types are no longer assigned going forward but may still appear on historical meetings."""
|
|
12
|
+
|
|
13
|
+
ACTIVE = "active"
|
|
14
|
+
INACTIVE = "inactive"
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
class MeetingTypeTypedDict(TypedDict):
|
|
18
|
+
name: str
|
|
19
|
+
status: Status
|
|
20
|
+
r"""Whether the meeting type is currently assignable. `active` types can be assigned to meetings going forward; `inactive` types are no longer assigned going forward but may still appear on historical meetings.
|
|
21
|
+
|
|
22
|
+
"""
|
|
23
|
+
created_at: datetime
|
|
24
|
+
|
|
25
|
+
|
|
26
|
+
class MeetingType(BaseModel):
|
|
27
|
+
name: str
|
|
28
|
+
|
|
29
|
+
status: Status
|
|
30
|
+
r"""Whether the meeting type is currently assignable. `active` types can be assigned to meetings going forward; `inactive` types are no longer assigned going forward but may still appear on historical meetings.
|
|
31
|
+
|
|
32
|
+
"""
|
|
33
|
+
|
|
34
|
+
created_at: datetime
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
"""Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT."""
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
from .meetingtype import MeetingType, MeetingTypeTypedDict
|
|
5
|
+
from fathom_python.types import BaseModel, Nullable, UNSET_SENTINEL
|
|
6
|
+
from pydantic import model_serializer
|
|
7
|
+
from typing import List
|
|
8
|
+
from typing_extensions import TypedDict
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
class MeetingTypeListResponseTypedDict(TypedDict):
|
|
12
|
+
limit: Nullable[int]
|
|
13
|
+
next_cursor: Nullable[str]
|
|
14
|
+
items: List[MeetingTypeTypedDict]
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
class MeetingTypeListResponse(BaseModel):
|
|
18
|
+
limit: Nullable[int]
|
|
19
|
+
|
|
20
|
+
next_cursor: Nullable[str]
|
|
21
|
+
|
|
22
|
+
items: List[MeetingType]
|
|
23
|
+
|
|
24
|
+
@model_serializer(mode="wrap")
|
|
25
|
+
def serialize_model(self, handler):
|
|
26
|
+
optional_fields = []
|
|
27
|
+
nullable_fields = ["limit", "next_cursor"]
|
|
28
|
+
null_default_fields = []
|
|
29
|
+
|
|
30
|
+
serialized = handler(self)
|
|
31
|
+
|
|
32
|
+
m = {}
|
|
33
|
+
|
|
34
|
+
for n, f in type(self).model_fields.items():
|
|
35
|
+
k = f.alias or n
|
|
36
|
+
val = serialized.get(k)
|
|
37
|
+
serialized.pop(k, None)
|
|
38
|
+
|
|
39
|
+
optional_nullable = k in optional_fields and k in nullable_fields
|
|
40
|
+
is_set = (
|
|
41
|
+
self.__pydantic_fields_set__.intersection({n})
|
|
42
|
+
or k in null_default_fields
|
|
43
|
+
) # pylint: disable=no-member
|
|
44
|
+
|
|
45
|
+
if val is not None and val != UNSET_SENTINEL:
|
|
46
|
+
m[k] = val
|
|
47
|
+
elif val != UNSET_SENTINEL and (
|
|
48
|
+
not k in optional_fields or (optional_nullable and is_set)
|
|
49
|
+
):
|
|
50
|
+
m[k] = val
|
|
51
|
+
|
|
52
|
+
return m
|
fathom_python/sdk.py
CHANGED
|
@@ -266,7 +266,6 @@ class Fathom(BaseSDK):
|
|
|
266
266
|
def list_meetings(
|
|
267
267
|
self,
|
|
268
268
|
*,
|
|
269
|
-
calendar_invitees: Optional[List[str]] = None,
|
|
270
269
|
calendar_invitees_domains: Optional[List[str]] = None,
|
|
271
270
|
calendar_invitees_domains_type: Optional[
|
|
272
271
|
models.ListMeetingsCalendarInviteesDomainsType
|
|
@@ -278,7 +277,7 @@ class Fathom(BaseSDK):
|
|
|
278
277
|
include_crm_matches: Optional[bool] = False,
|
|
279
278
|
include_summary: Optional[bool] = False,
|
|
280
279
|
include_transcript: Optional[bool] = False,
|
|
281
|
-
meeting_type: Optional[
|
|
280
|
+
meeting_type: Optional[str] = None,
|
|
282
281
|
recorded_by: Optional[List[str]] = None,
|
|
283
282
|
teams: Optional[List[str]] = None,
|
|
284
283
|
retries: OptionalNullable[utils.RetryConfig] = UNSET,
|
|
@@ -288,8 +287,13 @@ class Fathom(BaseSDK):
|
|
|
288
287
|
) -> Optional[models.ListMeetingsResponse]:
|
|
289
288
|
r"""List meetings
|
|
290
289
|
|
|
291
|
-
:param
|
|
292
|
-
|
|
290
|
+
:param calendar_invitees_domains: Domains of the companies to filter by. Exact match.
|
|
291
|
+
|
|
292
|
+
Pass the parameter once per value, e.g.
|
|
293
|
+
`calendar_invitees_domains[]=acme.com&calendar_invitees_domains[]=client.com`.
|
|
294
|
+
|
|
295
|
+
Returns meetings where any of the given company domains appear in the meeting.
|
|
296
|
+
|
|
293
297
|
:param calendar_invitees_domains_type: Filter by whether calendar invitee list includes external email domains.
|
|
294
298
|
:param created_after: Filter to meetings with created_at after this timestamp, e.g. `created_after=2025-01-01T00:00:00Z`.
|
|
295
299
|
:param created_before: Filter to meetings with created_at before this timestamp, e.g. `created_before=2025-01-01T00:00:00Z`.
|
|
@@ -298,9 +302,24 @@ class Fathom(BaseSDK):
|
|
|
298
302
|
:param include_crm_matches: Include CRM matches for each meeting. Only returns data from your or your team's linked CRM.
|
|
299
303
|
:param include_summary: Include the summary for each meeting. Unavailable for OAuth connected apps (use /recordings instead).
|
|
300
304
|
:param include_transcript: Include the transcript for each meeting. Unavailable for OAuth connected apps (use /recordings instead).
|
|
301
|
-
:param meeting_type: Filter by meeting type.
|
|
302
|
-
|
|
303
|
-
|
|
305
|
+
:param meeting_type: Filter by meeting type name.
|
|
306
|
+
|
|
307
|
+
Returns only meetings assigned the meeting type with this name. Use /meeting_types to discover valid values. An unknown or non-matching name returns an empty list.
|
|
308
|
+
|
|
309
|
+
:param recorded_by: Email addresses of users who recorded meetings.
|
|
310
|
+
|
|
311
|
+
Pass the parameter once per value, e.g.
|
|
312
|
+
`recorded_by[]=ceo@acme.com&recorded_by[]=pm@acme.com`.
|
|
313
|
+
|
|
314
|
+
Returns meetings recorded by any of the specified users.
|
|
315
|
+
|
|
316
|
+
:param teams: Team names to filter by.
|
|
317
|
+
|
|
318
|
+
Pass the parameter once per value, e.g.
|
|
319
|
+
`teams[]=Sales&teams[]=Engineering`.
|
|
320
|
+
|
|
321
|
+
Returns meetings that belong to any of the specified teams.
|
|
322
|
+
|
|
304
323
|
:param retries: Override the default retry configuration for this method
|
|
305
324
|
:param server_url: Override the default server URL for this method
|
|
306
325
|
:param timeout_ms: Override the default request timeout configuration for this method in milliseconds
|
|
@@ -317,7 +336,6 @@ class Fathom(BaseSDK):
|
|
|
317
336
|
base_url = self._get_url(base_url, url_variables)
|
|
318
337
|
|
|
319
338
|
request = models.ListMeetingsRequest(
|
|
320
|
-
calendar_invitees=calendar_invitees,
|
|
321
339
|
calendar_invitees_domains=calendar_invitees_domains,
|
|
322
340
|
calendar_invitees_domains_type=calendar_invitees_domains_type,
|
|
323
341
|
created_after=created_after,
|
|
@@ -383,7 +401,6 @@ class Fathom(BaseSDK):
|
|
|
383
401
|
return None
|
|
384
402
|
|
|
385
403
|
return self.list_meetings(
|
|
386
|
-
calendar_invitees=calendar_invitees,
|
|
387
404
|
calendar_invitees_domains=calendar_invitees_domains,
|
|
388
405
|
calendar_invitees_domains_type=calendar_invitees_domains_type,
|
|
389
406
|
created_after=created_after,
|
|
@@ -416,7 +433,6 @@ class Fathom(BaseSDK):
|
|
|
416
433
|
async def list_meetings_async(
|
|
417
434
|
self,
|
|
418
435
|
*,
|
|
419
|
-
calendar_invitees: Optional[List[str]] = None,
|
|
420
436
|
calendar_invitees_domains: Optional[List[str]] = None,
|
|
421
437
|
calendar_invitees_domains_type: Optional[
|
|
422
438
|
models.ListMeetingsCalendarInviteesDomainsType
|
|
@@ -428,7 +444,7 @@ class Fathom(BaseSDK):
|
|
|
428
444
|
include_crm_matches: Optional[bool] = False,
|
|
429
445
|
include_summary: Optional[bool] = False,
|
|
430
446
|
include_transcript: Optional[bool] = False,
|
|
431
|
-
meeting_type: Optional[
|
|
447
|
+
meeting_type: Optional[str] = None,
|
|
432
448
|
recorded_by: Optional[List[str]] = None,
|
|
433
449
|
teams: Optional[List[str]] = None,
|
|
434
450
|
retries: OptionalNullable[utils.RetryConfig] = UNSET,
|
|
@@ -438,8 +454,13 @@ class Fathom(BaseSDK):
|
|
|
438
454
|
) -> Optional[models.ListMeetingsResponse]:
|
|
439
455
|
r"""List meetings
|
|
440
456
|
|
|
441
|
-
:param
|
|
442
|
-
|
|
457
|
+
:param calendar_invitees_domains: Domains of the companies to filter by. Exact match.
|
|
458
|
+
|
|
459
|
+
Pass the parameter once per value, e.g.
|
|
460
|
+
`calendar_invitees_domains[]=acme.com&calendar_invitees_domains[]=client.com`.
|
|
461
|
+
|
|
462
|
+
Returns meetings where any of the given company domains appear in the meeting.
|
|
463
|
+
|
|
443
464
|
:param calendar_invitees_domains_type: Filter by whether calendar invitee list includes external email domains.
|
|
444
465
|
:param created_after: Filter to meetings with created_at after this timestamp, e.g. `created_after=2025-01-01T00:00:00Z`.
|
|
445
466
|
:param created_before: Filter to meetings with created_at before this timestamp, e.g. `created_before=2025-01-01T00:00:00Z`.
|
|
@@ -448,9 +469,24 @@ class Fathom(BaseSDK):
|
|
|
448
469
|
:param include_crm_matches: Include CRM matches for each meeting. Only returns data from your or your team's linked CRM.
|
|
449
470
|
:param include_summary: Include the summary for each meeting. Unavailable for OAuth connected apps (use /recordings instead).
|
|
450
471
|
:param include_transcript: Include the transcript for each meeting. Unavailable for OAuth connected apps (use /recordings instead).
|
|
451
|
-
:param meeting_type: Filter by meeting type.
|
|
452
|
-
|
|
453
|
-
|
|
472
|
+
:param meeting_type: Filter by meeting type name.
|
|
473
|
+
|
|
474
|
+
Returns only meetings assigned the meeting type with this name. Use /meeting_types to discover valid values. An unknown or non-matching name returns an empty list.
|
|
475
|
+
|
|
476
|
+
:param recorded_by: Email addresses of users who recorded meetings.
|
|
477
|
+
|
|
478
|
+
Pass the parameter once per value, e.g.
|
|
479
|
+
`recorded_by[]=ceo@acme.com&recorded_by[]=pm@acme.com`.
|
|
480
|
+
|
|
481
|
+
Returns meetings recorded by any of the specified users.
|
|
482
|
+
|
|
483
|
+
:param teams: Team names to filter by.
|
|
484
|
+
|
|
485
|
+
Pass the parameter once per value, e.g.
|
|
486
|
+
`teams[]=Sales&teams[]=Engineering`.
|
|
487
|
+
|
|
488
|
+
Returns meetings that belong to any of the specified teams.
|
|
489
|
+
|
|
454
490
|
:param retries: Override the default retry configuration for this method
|
|
455
491
|
:param server_url: Override the default server URL for this method
|
|
456
492
|
:param timeout_ms: Override the default request timeout configuration for this method in milliseconds
|
|
@@ -467,7 +503,6 @@ class Fathom(BaseSDK):
|
|
|
467
503
|
base_url = self._get_url(base_url, url_variables)
|
|
468
504
|
|
|
469
505
|
request = models.ListMeetingsRequest(
|
|
470
|
-
calendar_invitees=calendar_invitees,
|
|
471
506
|
calendar_invitees_domains=calendar_invitees_domains,
|
|
472
507
|
calendar_invitees_domains_type=calendar_invitees_domains_type,
|
|
473
508
|
created_after=created_after,
|
|
@@ -533,7 +568,6 @@ class Fathom(BaseSDK):
|
|
|
533
568
|
return None
|
|
534
569
|
|
|
535
570
|
return self.list_meetings(
|
|
536
|
-
calendar_invitees=calendar_invitees,
|
|
537
571
|
calendar_invitees_domains=calendar_invitees_domains,
|
|
538
572
|
calendar_invitees_domains_type=calendar_invitees_domains_type,
|
|
539
573
|
created_after=created_after,
|
|
@@ -1331,6 +1365,216 @@ class Fathom(BaseSDK):
|
|
|
1331
1365
|
|
|
1332
1366
|
raise errors.APIError("Unexpected response received", http_res)
|
|
1333
1367
|
|
|
1368
|
+
def list_meeting_types(
|
|
1369
|
+
self,
|
|
1370
|
+
*,
|
|
1371
|
+
cursor: Optional[str] = None,
|
|
1372
|
+
retries: OptionalNullable[utils.RetryConfig] = UNSET,
|
|
1373
|
+
server_url: Optional[str] = None,
|
|
1374
|
+
timeout_ms: Optional[int] = None,
|
|
1375
|
+
http_headers: Optional[Mapping[str, str]] = None,
|
|
1376
|
+
) -> Optional[models.ListMeetingTypesResponse]:
|
|
1377
|
+
r"""List meeting types
|
|
1378
|
+
|
|
1379
|
+
List your team's published meeting types (both `active` and `inactive`). Draft meeting types, which are not yet fully created and never appear on meetings, are excluded. Use the returned `name` values to filter /meetings via its meeting_type parameter.
|
|
1380
|
+
|
|
1381
|
+
|
|
1382
|
+
:param cursor: Cursor for pagination.
|
|
1383
|
+
:param retries: Override the default retry configuration for this method
|
|
1384
|
+
:param server_url: Override the default server URL for this method
|
|
1385
|
+
:param timeout_ms: Override the default request timeout configuration for this method in milliseconds
|
|
1386
|
+
:param http_headers: Additional headers to set or replace on requests.
|
|
1387
|
+
"""
|
|
1388
|
+
base_url = None
|
|
1389
|
+
url_variables = None
|
|
1390
|
+
if timeout_ms is None:
|
|
1391
|
+
timeout_ms = self.sdk_configuration.timeout_ms
|
|
1392
|
+
|
|
1393
|
+
if server_url is not None:
|
|
1394
|
+
base_url = server_url
|
|
1395
|
+
else:
|
|
1396
|
+
base_url = self._get_url(base_url, url_variables)
|
|
1397
|
+
|
|
1398
|
+
request = models.ListMeetingTypesRequest(
|
|
1399
|
+
cursor=cursor,
|
|
1400
|
+
)
|
|
1401
|
+
|
|
1402
|
+
req = self._build_request(
|
|
1403
|
+
method="GET",
|
|
1404
|
+
path="/meeting_types",
|
|
1405
|
+
base_url=base_url,
|
|
1406
|
+
url_variables=url_variables,
|
|
1407
|
+
request=request,
|
|
1408
|
+
request_body_required=False,
|
|
1409
|
+
request_has_path_params=False,
|
|
1410
|
+
request_has_query_params=True,
|
|
1411
|
+
user_agent_header="user-agent",
|
|
1412
|
+
accept_header_value="application/json",
|
|
1413
|
+
http_headers=http_headers,
|
|
1414
|
+
security=self.sdk_configuration.security,
|
|
1415
|
+
timeout_ms=timeout_ms,
|
|
1416
|
+
)
|
|
1417
|
+
|
|
1418
|
+
if retries == UNSET:
|
|
1419
|
+
if self.sdk_configuration.retry_config is not UNSET:
|
|
1420
|
+
retries = self.sdk_configuration.retry_config
|
|
1421
|
+
|
|
1422
|
+
retry_config = None
|
|
1423
|
+
if isinstance(retries, utils.RetryConfig):
|
|
1424
|
+
retry_config = (retries, ["429", "500", "502", "503", "504"])
|
|
1425
|
+
|
|
1426
|
+
http_res = self.do_request(
|
|
1427
|
+
hook_ctx=HookContext(
|
|
1428
|
+
config=self.sdk_configuration,
|
|
1429
|
+
base_url=base_url or "",
|
|
1430
|
+
operation_id="listMeetingTypes",
|
|
1431
|
+
oauth2_scopes=None,
|
|
1432
|
+
security_source=get_security_from_env(
|
|
1433
|
+
self.sdk_configuration.security, models.Security
|
|
1434
|
+
),
|
|
1435
|
+
),
|
|
1436
|
+
request=req,
|
|
1437
|
+
error_status_codes=["400", "401", "429", "4XX", "5XX"],
|
|
1438
|
+
retry_config=retry_config,
|
|
1439
|
+
)
|
|
1440
|
+
|
|
1441
|
+
def next_func() -> Optional[models.ListMeetingTypesResponse]:
|
|
1442
|
+
body = utils.unmarshal_json(http_res.text, Union[Dict[Any, Any], List[Any]])
|
|
1443
|
+
next_cursor = JSONPath("$.next_cursor").parse(body)
|
|
1444
|
+
|
|
1445
|
+
if len(next_cursor) == 0:
|
|
1446
|
+
return None
|
|
1447
|
+
|
|
1448
|
+
next_cursor = next_cursor[0]
|
|
1449
|
+
if next_cursor is None or str(next_cursor).strip() == "":
|
|
1450
|
+
return None
|
|
1451
|
+
|
|
1452
|
+
return self.list_meeting_types(
|
|
1453
|
+
cursor=next_cursor,
|
|
1454
|
+
retries=retries,
|
|
1455
|
+
)
|
|
1456
|
+
|
|
1457
|
+
if utils.match_response(http_res, "200", "application/json"):
|
|
1458
|
+
return models.ListMeetingTypesResponse(
|
|
1459
|
+
result=unmarshal_json_response(
|
|
1460
|
+
models.MeetingTypeListResponse, http_res
|
|
1461
|
+
),
|
|
1462
|
+
next=next_func,
|
|
1463
|
+
)
|
|
1464
|
+
if utils.match_response(http_res, ["400", "401", "429", "4XX"], "*"):
|
|
1465
|
+
http_res_text = utils.stream_to_text(http_res)
|
|
1466
|
+
raise errors.APIError("API error occurred", http_res, http_res_text)
|
|
1467
|
+
if utils.match_response(http_res, "5XX", "*"):
|
|
1468
|
+
http_res_text = utils.stream_to_text(http_res)
|
|
1469
|
+
raise errors.APIError("API error occurred", http_res, http_res_text)
|
|
1470
|
+
|
|
1471
|
+
raise errors.APIError("Unexpected response received", http_res)
|
|
1472
|
+
|
|
1473
|
+
async def list_meeting_types_async(
|
|
1474
|
+
self,
|
|
1475
|
+
*,
|
|
1476
|
+
cursor: Optional[str] = None,
|
|
1477
|
+
retries: OptionalNullable[utils.RetryConfig] = UNSET,
|
|
1478
|
+
server_url: Optional[str] = None,
|
|
1479
|
+
timeout_ms: Optional[int] = None,
|
|
1480
|
+
http_headers: Optional[Mapping[str, str]] = None,
|
|
1481
|
+
) -> Optional[models.ListMeetingTypesResponse]:
|
|
1482
|
+
r"""List meeting types
|
|
1483
|
+
|
|
1484
|
+
List your team's published meeting types (both `active` and `inactive`). Draft meeting types, which are not yet fully created and never appear on meetings, are excluded. Use the returned `name` values to filter /meetings via its meeting_type parameter.
|
|
1485
|
+
|
|
1486
|
+
|
|
1487
|
+
:param cursor: Cursor for pagination.
|
|
1488
|
+
:param retries: Override the default retry configuration for this method
|
|
1489
|
+
:param server_url: Override the default server URL for this method
|
|
1490
|
+
:param timeout_ms: Override the default request timeout configuration for this method in milliseconds
|
|
1491
|
+
:param http_headers: Additional headers to set or replace on requests.
|
|
1492
|
+
"""
|
|
1493
|
+
base_url = None
|
|
1494
|
+
url_variables = None
|
|
1495
|
+
if timeout_ms is None:
|
|
1496
|
+
timeout_ms = self.sdk_configuration.timeout_ms
|
|
1497
|
+
|
|
1498
|
+
if server_url is not None:
|
|
1499
|
+
base_url = server_url
|
|
1500
|
+
else:
|
|
1501
|
+
base_url = self._get_url(base_url, url_variables)
|
|
1502
|
+
|
|
1503
|
+
request = models.ListMeetingTypesRequest(
|
|
1504
|
+
cursor=cursor,
|
|
1505
|
+
)
|
|
1506
|
+
|
|
1507
|
+
req = self._build_request_async(
|
|
1508
|
+
method="GET",
|
|
1509
|
+
path="/meeting_types",
|
|
1510
|
+
base_url=base_url,
|
|
1511
|
+
url_variables=url_variables,
|
|
1512
|
+
request=request,
|
|
1513
|
+
request_body_required=False,
|
|
1514
|
+
request_has_path_params=False,
|
|
1515
|
+
request_has_query_params=True,
|
|
1516
|
+
user_agent_header="user-agent",
|
|
1517
|
+
accept_header_value="application/json",
|
|
1518
|
+
http_headers=http_headers,
|
|
1519
|
+
security=self.sdk_configuration.security,
|
|
1520
|
+
timeout_ms=timeout_ms,
|
|
1521
|
+
)
|
|
1522
|
+
|
|
1523
|
+
if retries == UNSET:
|
|
1524
|
+
if self.sdk_configuration.retry_config is not UNSET:
|
|
1525
|
+
retries = self.sdk_configuration.retry_config
|
|
1526
|
+
|
|
1527
|
+
retry_config = None
|
|
1528
|
+
if isinstance(retries, utils.RetryConfig):
|
|
1529
|
+
retry_config = (retries, ["429", "500", "502", "503", "504"])
|
|
1530
|
+
|
|
1531
|
+
http_res = await self.do_request_async(
|
|
1532
|
+
hook_ctx=HookContext(
|
|
1533
|
+
config=self.sdk_configuration,
|
|
1534
|
+
base_url=base_url or "",
|
|
1535
|
+
operation_id="listMeetingTypes",
|
|
1536
|
+
oauth2_scopes=None,
|
|
1537
|
+
security_source=get_security_from_env(
|
|
1538
|
+
self.sdk_configuration.security, models.Security
|
|
1539
|
+
),
|
|
1540
|
+
),
|
|
1541
|
+
request=req,
|
|
1542
|
+
error_status_codes=["400", "401", "429", "4XX", "5XX"],
|
|
1543
|
+
retry_config=retry_config,
|
|
1544
|
+
)
|
|
1545
|
+
|
|
1546
|
+
def next_func() -> Optional[models.ListMeetingTypesResponse]:
|
|
1547
|
+
body = utils.unmarshal_json(http_res.text, Union[Dict[Any, Any], List[Any]])
|
|
1548
|
+
next_cursor = JSONPath("$.next_cursor").parse(body)
|
|
1549
|
+
|
|
1550
|
+
if len(next_cursor) == 0:
|
|
1551
|
+
return None
|
|
1552
|
+
|
|
1553
|
+
next_cursor = next_cursor[0]
|
|
1554
|
+
if next_cursor is None or str(next_cursor).strip() == "":
|
|
1555
|
+
return None
|
|
1556
|
+
|
|
1557
|
+
return self.list_meeting_types(
|
|
1558
|
+
cursor=next_cursor,
|
|
1559
|
+
retries=retries,
|
|
1560
|
+
)
|
|
1561
|
+
|
|
1562
|
+
if utils.match_response(http_res, "200", "application/json"):
|
|
1563
|
+
return models.ListMeetingTypesResponse(
|
|
1564
|
+
result=unmarshal_json_response(
|
|
1565
|
+
models.MeetingTypeListResponse, http_res
|
|
1566
|
+
),
|
|
1567
|
+
next=next_func,
|
|
1568
|
+
)
|
|
1569
|
+
if utils.match_response(http_res, ["400", "401", "429", "4XX"], "*"):
|
|
1570
|
+
http_res_text = await utils.stream_to_text_async(http_res)
|
|
1571
|
+
raise errors.APIError("API error occurred", http_res, http_res_text)
|
|
1572
|
+
if utils.match_response(http_res, "5XX", "*"):
|
|
1573
|
+
http_res_text = await utils.stream_to_text_async(http_res)
|
|
1574
|
+
raise errors.APIError("API error occurred", http_res, http_res_text)
|
|
1575
|
+
|
|
1576
|
+
raise errors.APIError("Unexpected response received", http_res)
|
|
1577
|
+
|
|
1334
1578
|
def create_webhook(
|
|
1335
1579
|
self,
|
|
1336
1580
|
*,
|
|
@@ -1352,7 +1596,12 @@ class Fathom(BaseSDK):
|
|
|
1352
1596
|
|
|
1353
1597
|
|
|
1354
1598
|
:param destination_url: The URL to send the webhook to.
|
|
1355
|
-
:param triggered_for: You must send at least one of the following types of recordings to trigger on.
|
|
1599
|
+
:param triggered_for: You must send at least one of the following types of recordings to trigger on.
|
|
1600
|
+
- `my_recordings`: Your private recordings, as well as those you've shared with individuals. (On Team Plans, this excludes recordings you've shared with any teams.)
|
|
1601
|
+
- `shared_external_recordings`: Recordings shared with you by other users. (For Team Plans, this does not include recordings shared by other users on your Team Plan.)
|
|
1602
|
+
- `my_shared_with_team_recordings`: (Team Plans only). All recordings that you have shared with other teams (e.g. Marketing or Sales). Recordings you've shared with individuals but not with teams are not included.
|
|
1603
|
+
- `shared_team_recordings`: (Team Plans only) All recordings you can access from other users on your Team Plan, whether shared with you individually or with your team.
|
|
1604
|
+
|
|
1356
1605
|
:param include_action_items: Include the action items for each meeting.
|
|
1357
1606
|
:param include_crm_matches: Include CRM matches for each meeting. Only returns data from your or your team's linked CRM.
|
|
1358
1607
|
:param include_summary: Include the summary for each meeting.
|
|
@@ -1455,7 +1704,12 @@ class Fathom(BaseSDK):
|
|
|
1455
1704
|
|
|
1456
1705
|
|
|
1457
1706
|
:param destination_url: The URL to send the webhook to.
|
|
1458
|
-
:param triggered_for: You must send at least one of the following types of recordings to trigger on.
|
|
1707
|
+
:param triggered_for: You must send at least one of the following types of recordings to trigger on.
|
|
1708
|
+
- `my_recordings`: Your private recordings, as well as those you've shared with individuals. (On Team Plans, this excludes recordings you've shared with any teams.)
|
|
1709
|
+
- `shared_external_recordings`: Recordings shared with you by other users. (For Team Plans, this does not include recordings shared by other users on your Team Plan.)
|
|
1710
|
+
- `my_shared_with_team_recordings`: (Team Plans only). All recordings that you have shared with other teams (e.g. Marketing or Sales). Recordings you've shared with individuals but not with teams are not included.
|
|
1711
|
+
- `shared_team_recordings`: (Team Plans only) All recordings you can access from other users on your Team Plan, whether shared with you individually or with your team.
|
|
1712
|
+
|
|
1459
1713
|
:param include_action_items: Include the action items for each meeting.
|
|
1460
1714
|
:param include_crm_matches: Include CRM matches for each meeting. Only returns data from your or your team's linked CRM.
|
|
1461
1715
|
:param include_summary: Include the summary for each meeting.
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
"""Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT."""
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
5
|
+
import base64
|
|
6
|
+
import io
|
|
7
|
+
from os import PathLike
|
|
8
|
+
from typing import IO, Any, Union
|
|
9
|
+
|
|
10
|
+
from pydantic.functional_validators import BeforeValidator
|
|
11
|
+
from typing_extensions import Annotated
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
Base64FileInput = Union[IO[bytes], PathLike[str]]
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
def encode_base64_file_input(value: Any) -> Any:
|
|
18
|
+
"""Convert PathLike or IO[bytes] inputs to a base64 string. All standard binary streams
|
|
19
|
+
that inherit from io.IOBase are handled. Other values pass through.
|
|
20
|
+
"""
|
|
21
|
+
if isinstance(value, (PathLike, io.IOBase)):
|
|
22
|
+
if isinstance(value, PathLike):
|
|
23
|
+
with open(value, "rb") as fh:
|
|
24
|
+
binary = fh.read()
|
|
25
|
+
else:
|
|
26
|
+
binary = value.read()
|
|
27
|
+
if isinstance(binary, str):
|
|
28
|
+
binary = binary.encode()
|
|
29
|
+
if not isinstance(binary, (bytes, bytearray)):
|
|
30
|
+
raise TypeError(
|
|
31
|
+
f"Base64FileInput expected binary IO returning bytes; got {type(binary).__name__}"
|
|
32
|
+
)
|
|
33
|
+
return base64.b64encode(binary).decode("ascii")
|
|
34
|
+
return value
|
|
35
|
+
|
|
36
|
+
|
|
37
|
+
# Non-str inputs are converted to base64 by the BeforeValidator at construction time.
|
|
38
|
+
# Callers can also pass a pre-encoded base64 str.
|
|
39
|
+
Base64EncodedString = Annotated[str, BeforeValidator(encode_base64_file_input)]
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
"""Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT."""
|
|
2
|
+
|
|
3
|
+
from importlib import import_module
|
|
4
|
+
import builtins
|
|
5
|
+
import sys
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
def dynamic_import(package, modname, retries=3):
|
|
9
|
+
"""Import a module relative to package, retrying on KeyError from half-initialized modules."""
|
|
10
|
+
for attempt in range(retries):
|
|
11
|
+
try:
|
|
12
|
+
return import_module(modname, package)
|
|
13
|
+
except KeyError:
|
|
14
|
+
sys.modules.pop(modname, None)
|
|
15
|
+
if attempt == retries - 1:
|
|
16
|
+
break
|
|
17
|
+
raise KeyError(f"Failed to import module '{modname}' after {retries} attempts")
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
def lazy_getattr(attr_name, *, package, dynamic_imports, sub_packages=None):
|
|
21
|
+
"""Module-level __getattr__ that lazily loads from a dynamic_imports mapping.
|
|
22
|
+
|
|
23
|
+
Args:
|
|
24
|
+
attr_name: The attribute being looked up.
|
|
25
|
+
package: The caller's __package__ (for relative imports).
|
|
26
|
+
dynamic_imports: Dict mapping attribute names to relative module paths.
|
|
27
|
+
sub_packages: Optional list of subpackage names to lazy-load.
|
|
28
|
+
"""
|
|
29
|
+
module_name = dynamic_imports.get(attr_name)
|
|
30
|
+
if module_name is not None:
|
|
31
|
+
try:
|
|
32
|
+
module = dynamic_import(package, module_name)
|
|
33
|
+
return getattr(module, attr_name)
|
|
34
|
+
except ImportError as e:
|
|
35
|
+
raise ImportError(
|
|
36
|
+
f"Failed to import {attr_name} from {module_name}: {e}"
|
|
37
|
+
) from e
|
|
38
|
+
except AttributeError as e:
|
|
39
|
+
raise AttributeError(
|
|
40
|
+
f"Failed to get {attr_name} from {module_name}: {e}"
|
|
41
|
+
) from e
|
|
42
|
+
|
|
43
|
+
if sub_packages and attr_name in sub_packages:
|
|
44
|
+
return import_module(f".{attr_name}", package)
|
|
45
|
+
|
|
46
|
+
raise AttributeError(f"module '{package}' has no attribute '{attr_name}'")
|
|
47
|
+
|
|
48
|
+
|
|
49
|
+
def lazy_dir(*, dynamic_imports, sub_packages=None):
|
|
50
|
+
"""Module-level __dir__ that lists lazily-loadable attributes."""
|
|
51
|
+
lazy_attrs = builtins.list(dynamic_imports.keys())
|
|
52
|
+
if sub_packages:
|
|
53
|
+
lazy_attrs.extend(sub_packages)
|
|
54
|
+
return builtins.sorted(lazy_attrs)
|
fathom_python/utils/retries.py
CHANGED
|
@@ -3,7 +3,9 @@
|
|
|
3
3
|
import asyncio
|
|
4
4
|
import random
|
|
5
5
|
import time
|
|
6
|
-
from
|
|
6
|
+
from datetime import datetime
|
|
7
|
+
from email.utils import parsedate_to_datetime
|
|
8
|
+
from typing import List, Optional
|
|
7
9
|
|
|
8
10
|
import httpx
|
|
9
11
|
|
|
@@ -51,9 +53,11 @@ class Retries:
|
|
|
51
53
|
|
|
52
54
|
class TemporaryError(Exception):
|
|
53
55
|
response: httpx.Response
|
|
56
|
+
retry_after: Optional[int]
|
|
54
57
|
|
|
55
58
|
def __init__(self, response: httpx.Response):
|
|
56
59
|
self.response = response
|
|
60
|
+
self.retry_after = _parse_retry_after_header(response)
|
|
57
61
|
|
|
58
62
|
|
|
59
63
|
class PermanentError(Exception):
|
|
@@ -63,6 +67,62 @@ class PermanentError(Exception):
|
|
|
63
67
|
self.inner = inner
|
|
64
68
|
|
|
65
69
|
|
|
70
|
+
def _parse_retry_after_header(response: httpx.Response) -> Optional[int]:
|
|
71
|
+
"""Parse Retry-After header from response.
|
|
72
|
+
|
|
73
|
+
Returns:
|
|
74
|
+
Retry interval in milliseconds, or None if header is missing or invalid.
|
|
75
|
+
"""
|
|
76
|
+
retry_after_header = response.headers.get("retry-after")
|
|
77
|
+
if not retry_after_header:
|
|
78
|
+
return None
|
|
79
|
+
|
|
80
|
+
try:
|
|
81
|
+
seconds = float(retry_after_header)
|
|
82
|
+
return round(seconds * 1000)
|
|
83
|
+
except ValueError:
|
|
84
|
+
pass
|
|
85
|
+
|
|
86
|
+
try:
|
|
87
|
+
retry_date = parsedate_to_datetime(retry_after_header)
|
|
88
|
+
delta = (retry_date - datetime.now(retry_date.tzinfo)).total_seconds()
|
|
89
|
+
return round(max(0, delta) * 1000)
|
|
90
|
+
except (ValueError, TypeError):
|
|
91
|
+
pass
|
|
92
|
+
|
|
93
|
+
return None
|
|
94
|
+
|
|
95
|
+
|
|
96
|
+
def _get_sleep_interval(
|
|
97
|
+
exception: Exception,
|
|
98
|
+
initial_interval: int,
|
|
99
|
+
max_interval: int,
|
|
100
|
+
exponent: float,
|
|
101
|
+
retries: int,
|
|
102
|
+
) -> float:
|
|
103
|
+
"""Get sleep interval for retry with exponential backoff.
|
|
104
|
+
|
|
105
|
+
Args:
|
|
106
|
+
exception: The exception that triggered the retry.
|
|
107
|
+
initial_interval: Initial retry interval in milliseconds.
|
|
108
|
+
max_interval: Maximum retry interval in milliseconds.
|
|
109
|
+
exponent: Base for exponential backoff calculation.
|
|
110
|
+
retries: Current retry attempt count.
|
|
111
|
+
|
|
112
|
+
Returns:
|
|
113
|
+
Sleep interval in seconds.
|
|
114
|
+
"""
|
|
115
|
+
if (
|
|
116
|
+
isinstance(exception, TemporaryError)
|
|
117
|
+
and exception.retry_after is not None
|
|
118
|
+
and exception.retry_after > 0
|
|
119
|
+
):
|
|
120
|
+
return exception.retry_after / 1000
|
|
121
|
+
|
|
122
|
+
sleep = (initial_interval / 1000) * exponent**retries + random.uniform(0, 1)
|
|
123
|
+
return min(sleep, max_interval / 1000)
|
|
124
|
+
|
|
125
|
+
|
|
66
126
|
def retry(func, retries: Retries):
|
|
67
127
|
if retries.config.strategy == "backoff":
|
|
68
128
|
|
|
@@ -183,8 +243,10 @@ def retry_with_backoff(
|
|
|
183
243
|
return exception.response
|
|
184
244
|
|
|
185
245
|
raise
|
|
186
|
-
|
|
187
|
-
sleep =
|
|
246
|
+
|
|
247
|
+
sleep = _get_sleep_interval(
|
|
248
|
+
exception, initial_interval, max_interval, exponent, retries
|
|
249
|
+
)
|
|
188
250
|
time.sleep(sleep)
|
|
189
251
|
retries += 1
|
|
190
252
|
|
|
@@ -211,7 +273,9 @@ async def retry_with_backoff_async(
|
|
|
211
273
|
return exception.response
|
|
212
274
|
|
|
213
275
|
raise
|
|
214
|
-
|
|
215
|
-
sleep =
|
|
276
|
+
|
|
277
|
+
sleep = _get_sleep_interval(
|
|
278
|
+
exception, initial_interval, max_interval, exponent, retries
|
|
279
|
+
)
|
|
216
280
|
await asyncio.sleep(sleep)
|
|
217
281
|
retries += 1
|
|
@@ -1,12 +1,26 @@
|
|
|
1
1
|
"""Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT."""
|
|
2
2
|
|
|
3
|
-
from typing import Any, Optional
|
|
3
|
+
from typing import Any, Optional, Type, TypeVar, overload
|
|
4
4
|
|
|
5
5
|
import httpx
|
|
6
6
|
|
|
7
7
|
from .serializers import unmarshal_json
|
|
8
8
|
from fathom_python import errors
|
|
9
9
|
|
|
10
|
+
T = TypeVar("T")
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
@overload
|
|
14
|
+
def unmarshal_json_response(
|
|
15
|
+
typ: Type[T], http_res: httpx.Response, body: Optional[str] = None
|
|
16
|
+
) -> T: ...
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
@overload
|
|
20
|
+
def unmarshal_json_response(
|
|
21
|
+
typ: Any, http_res: httpx.Response, body: Optional[str] = None
|
|
22
|
+
) -> Any: ...
|
|
23
|
+
|
|
10
24
|
|
|
11
25
|
def unmarshal_json_response(
|
|
12
26
|
typ: Any, http_res: httpx.Response, body: Optional[str] = None
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
Metadata-Version: 2.
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
2
|
Name: fathom-python
|
|
3
|
-
Version: 0.0.
|
|
3
|
+
Version: 0.0.38
|
|
4
4
|
Summary: Fathom's official Python SDK.
|
|
5
5
|
Author: Speakeasy
|
|
6
6
|
Requires-Python: >=3.9.2
|
|
@@ -9,6 +9,7 @@ Classifier: Programming Language :: Python :: 3.10
|
|
|
9
9
|
Classifier: Programming Language :: Python :: 3.11
|
|
10
10
|
Classifier: Programming Language :: Python :: 3.12
|
|
11
11
|
Classifier: Programming Language :: Python :: 3.13
|
|
12
|
+
Classifier: Programming Language :: Python :: 3.14
|
|
12
13
|
Requires-Dist: httpcore (>=1.0.9)
|
|
13
14
|
Requires-Dist: httpx (>=0.28.1)
|
|
14
15
|
Requires-Dist: jsonpath-python (>=1.0.6)
|
|
@@ -120,13 +121,10 @@ with Fathom(
|
|
|
120
121
|
),
|
|
121
122
|
) as fathom:
|
|
122
123
|
|
|
123
|
-
res = fathom.list_meetings(
|
|
124
|
-
"cfo@acme.com",
|
|
125
|
-
"legal@acme.com",
|
|
126
|
-
], calendar_invitees_domains=[
|
|
124
|
+
res = fathom.list_meetings(calendar_invitees_domains=[
|
|
127
125
|
"acme.com",
|
|
128
126
|
"client.com",
|
|
129
|
-
], calendar_invitees_domains_type=models.ListMeetingsCalendarInviteesDomainsType.ALL, include_action_items=False, include_crm_matches=False, include_summary=False, include_transcript=False, meeting_type=
|
|
127
|
+
], calendar_invitees_domains_type=models.ListMeetingsCalendarInviteesDomainsType.ALL, include_action_items=False, include_crm_matches=False, include_summary=False, include_transcript=False, meeting_type="Quarterly Business Review", recorded_by=[
|
|
130
128
|
"ceo@acme.com",
|
|
131
129
|
"pm@acme.com",
|
|
132
130
|
], teams=[
|
|
@@ -158,13 +156,10 @@ async def main():
|
|
|
158
156
|
),
|
|
159
157
|
) as fathom:
|
|
160
158
|
|
|
161
|
-
res = await fathom.list_meetings_async(
|
|
162
|
-
"cfo@acme.com",
|
|
163
|
-
"legal@acme.com",
|
|
164
|
-
], calendar_invitees_domains=[
|
|
159
|
+
res = await fathom.list_meetings_async(calendar_invitees_domains=[
|
|
165
160
|
"acme.com",
|
|
166
161
|
"client.com",
|
|
167
|
-
], calendar_invitees_domains_type=models.ListMeetingsCalendarInviteesDomainsType.ALL, include_action_items=False, include_crm_matches=False, include_summary=False, include_transcript=False, meeting_type=
|
|
162
|
+
], calendar_invitees_domains_type=models.ListMeetingsCalendarInviteesDomainsType.ALL, include_action_items=False, include_crm_matches=False, include_summary=False, include_transcript=False, meeting_type="Quarterly Business Review", recorded_by=[
|
|
168
163
|
"ceo@acme.com",
|
|
169
164
|
"pm@acme.com",
|
|
170
165
|
], teams=[
|
|
@@ -205,13 +200,10 @@ with Fathom(
|
|
|
205
200
|
),
|
|
206
201
|
) as fathom:
|
|
207
202
|
|
|
208
|
-
res = fathom.list_meetings(
|
|
209
|
-
"cfo@acme.com",
|
|
210
|
-
"legal@acme.com",
|
|
211
|
-
], calendar_invitees_domains=[
|
|
203
|
+
res = fathom.list_meetings(calendar_invitees_domains=[
|
|
212
204
|
"acme.com",
|
|
213
205
|
"client.com",
|
|
214
|
-
], calendar_invitees_domains_type=models.ListMeetingsCalendarInviteesDomainsType.ALL, include_action_items=False, include_crm_matches=False, include_summary=False, include_transcript=False, meeting_type=
|
|
206
|
+
], calendar_invitees_domains_type=models.ListMeetingsCalendarInviteesDomainsType.ALL, include_action_items=False, include_crm_matches=False, include_summary=False, include_transcript=False, meeting_type="Quarterly Business Review", recorded_by=[
|
|
215
207
|
"ceo@acme.com",
|
|
216
208
|
"pm@acme.com",
|
|
217
209
|
], teams=[
|
|
@@ -240,6 +232,7 @@ with Fathom(
|
|
|
240
232
|
* [get_recording_transcript](docs/sdks/fathom/README.md#get_recording_transcript) - Get transcript
|
|
241
233
|
* [list_teams](docs/sdks/fathom/README.md#list_teams) - List teams
|
|
242
234
|
* [list_team_members](docs/sdks/fathom/README.md#list_team_members) - List team members
|
|
235
|
+
* [list_meeting_types](docs/sdks/fathom/README.md#list_meeting_types) - List meeting types
|
|
243
236
|
* [create_webhook](docs/sdks/fathom/README.md#create_webhook) - Create a webhook
|
|
244
237
|
* [delete_webhook](docs/sdks/fathom/README.md#delete_webhook) - Delete a webhook
|
|
245
238
|
|
|
@@ -265,13 +258,10 @@ with Fathom(
|
|
|
265
258
|
),
|
|
266
259
|
) as fathom:
|
|
267
260
|
|
|
268
|
-
res = fathom.list_meetings(
|
|
269
|
-
"cfo@acme.com",
|
|
270
|
-
"legal@acme.com",
|
|
271
|
-
], calendar_invitees_domains=[
|
|
261
|
+
res = fathom.list_meetings(calendar_invitees_domains=[
|
|
272
262
|
"acme.com",
|
|
273
263
|
"client.com",
|
|
274
|
-
], calendar_invitees_domains_type=models.ListMeetingsCalendarInviteesDomainsType.ALL, include_action_items=False, include_crm_matches=False, include_summary=False, include_transcript=False, meeting_type=
|
|
264
|
+
], calendar_invitees_domains_type=models.ListMeetingsCalendarInviteesDomainsType.ALL, include_action_items=False, include_crm_matches=False, include_summary=False, include_transcript=False, meeting_type="Quarterly Business Review", recorded_by=[
|
|
275
265
|
"ceo@acme.com",
|
|
276
266
|
"pm@acme.com",
|
|
277
267
|
], teams=[
|
|
@@ -305,13 +295,10 @@ with Fathom(
|
|
|
305
295
|
),
|
|
306
296
|
) as fathom:
|
|
307
297
|
|
|
308
|
-
res = fathom.list_meetings(
|
|
309
|
-
"cfo@acme.com",
|
|
310
|
-
"legal@acme.com",
|
|
311
|
-
], calendar_invitees_domains=[
|
|
298
|
+
res = fathom.list_meetings(calendar_invitees_domains=[
|
|
312
299
|
"acme.com",
|
|
313
300
|
"client.com",
|
|
314
|
-
], calendar_invitees_domains_type=models.ListMeetingsCalendarInviteesDomainsType.ALL, include_action_items=False, include_crm_matches=False, include_summary=False, include_transcript=False, meeting_type=
|
|
301
|
+
], calendar_invitees_domains_type=models.ListMeetingsCalendarInviteesDomainsType.ALL, include_action_items=False, include_crm_matches=False, include_summary=False, include_transcript=False, meeting_type="Quarterly Business Review", recorded_by=[
|
|
315
302
|
"ceo@acme.com",
|
|
316
303
|
"pm@acme.com",
|
|
317
304
|
], teams=[
|
|
@@ -341,13 +328,10 @@ with Fathom(
|
|
|
341
328
|
),
|
|
342
329
|
) as fathom:
|
|
343
330
|
|
|
344
|
-
res = fathom.list_meetings(
|
|
345
|
-
"cfo@acme.com",
|
|
346
|
-
"legal@acme.com",
|
|
347
|
-
], calendar_invitees_domains=[
|
|
331
|
+
res = fathom.list_meetings(calendar_invitees_domains=[
|
|
348
332
|
"acme.com",
|
|
349
333
|
"client.com",
|
|
350
|
-
], calendar_invitees_domains_type=models.ListMeetingsCalendarInviteesDomainsType.ALL, include_action_items=False, include_crm_matches=False, include_summary=False, include_transcript=False, meeting_type=
|
|
334
|
+
], calendar_invitees_domains_type=models.ListMeetingsCalendarInviteesDomainsType.ALL, include_action_items=False, include_crm_matches=False, include_summary=False, include_transcript=False, meeting_type="Quarterly Business Review", recorded_by=[
|
|
351
335
|
"ceo@acme.com",
|
|
352
336
|
"pm@acme.com",
|
|
353
337
|
], teams=[
|
|
@@ -390,13 +374,10 @@ with Fathom(
|
|
|
390
374
|
res = None
|
|
391
375
|
try:
|
|
392
376
|
|
|
393
|
-
res = fathom.list_meetings(
|
|
394
|
-
"cfo@acme.com",
|
|
395
|
-
"legal@acme.com",
|
|
396
|
-
], calendar_invitees_domains=[
|
|
377
|
+
res = fathom.list_meetings(calendar_invitees_domains=[
|
|
397
378
|
"acme.com",
|
|
398
379
|
"client.com",
|
|
399
|
-
], calendar_invitees_domains_type=models.ListMeetingsCalendarInviteesDomainsType.ALL, include_action_items=False, include_crm_matches=False, include_summary=False, include_transcript=False, meeting_type=
|
|
380
|
+
], calendar_invitees_domains_type=models.ListMeetingsCalendarInviteesDomainsType.ALL, include_action_items=False, include_crm_matches=False, include_summary=False, include_transcript=False, meeting_type="Quarterly Business Review", recorded_by=[
|
|
400
381
|
"ceo@acme.com",
|
|
401
382
|
"pm@acme.com",
|
|
402
383
|
], teams=[
|
|
@@ -458,13 +439,10 @@ with Fathom(
|
|
|
458
439
|
),
|
|
459
440
|
) as fathom:
|
|
460
441
|
|
|
461
|
-
res = fathom.list_meetings(
|
|
462
|
-
"cfo@acme.com",
|
|
463
|
-
"legal@acme.com",
|
|
464
|
-
], calendar_invitees_domains=[
|
|
442
|
+
res = fathom.list_meetings(calendar_invitees_domains=[
|
|
465
443
|
"acme.com",
|
|
466
444
|
"client.com",
|
|
467
|
-
], calendar_invitees_domains_type=models.ListMeetingsCalendarInviteesDomainsType.ALL, include_action_items=False, include_crm_matches=False, include_summary=False, include_transcript=False, meeting_type=
|
|
445
|
+
], calendar_invitees_domains_type=models.ListMeetingsCalendarInviteesDomainsType.ALL, include_action_items=False, include_crm_matches=False, include_summary=False, include_transcript=False, meeting_type="Quarterly Business Review", recorded_by=[
|
|
468
446
|
"ceo@acme.com",
|
|
469
447
|
"pm@acme.com",
|
|
470
448
|
], teams=[
|
|
@@ -3,15 +3,15 @@ fathom_python/_hooks/__init__.py,sha256=9_7W5jAYw8rcO8Kfc-Ty-lB82BHfksAJJpVFb_Ue
|
|
|
3
3
|
fathom_python/_hooks/registration.py,sha256=1QZB41w6If7I9dXiOSQx6dhSc6BPWrnI5Q5bMOr4iVA,624
|
|
4
4
|
fathom_python/_hooks/sdkhooks.py,sha256=SyxWCUZakr1ZlORVhbgZJ-xM5W4QvTTS4Mymtte2LrI,2530
|
|
5
5
|
fathom_python/_hooks/types.py,sha256=OOkf6lkat8zumtftMupq5qK6pigExGTdcBF38RyT_gU,2992
|
|
6
|
-
fathom_python/_version.py,sha256=
|
|
6
|
+
fathom_python/_version.py,sha256=z831HgGuEk-FCD3LiK58GZpK3OKi2JBvSXThexNwwnE,470
|
|
7
7
|
fathom_python/basesdk.py,sha256=HzY3rWonhPH0RZoEfNyWHy9q_eIvEfsVaf1jIMUGHhQ,12214
|
|
8
8
|
fathom_python/errors/__init__.py,sha256=4aL9LIze2oNNs_l3aHDAu2HvD8EB0sMFfA9ikL53Lk4,1818
|
|
9
|
-
fathom_python/errors/apierror.py,sha256=
|
|
10
|
-
fathom_python/errors/fathomerror.py,sha256=
|
|
11
|
-
fathom_python/errors/no_response_error.py,sha256=
|
|
12
|
-
fathom_python/errors/responsevalidationerror.py,sha256=
|
|
9
|
+
fathom_python/errors/apierror.py,sha256=OzB0d0_nV_nRc6ZvE01b-BEAm0pjuNPck0PF1BTjGfg,1288
|
|
10
|
+
fathom_python/errors/fathomerror.py,sha256=Y43URqKlm_y9uOPRiSFI8PA8V9TL4Zb7xz9oSbJ0ORQ,955
|
|
11
|
+
fathom_python/errors/no_response_error.py,sha256=DaZukP5ManflzAN-11MtmBitfTIct37sRvfszvfM13o,467
|
|
12
|
+
fathom_python/errors/responsevalidationerror.py,sha256=uhcnWCmoKmMTDq92osd_9feW54yrjijwkveLT_uKXlA,755
|
|
13
13
|
fathom_python/httpclient.py,sha256=dqTPONDBpRn4ktXfcetQiRXnG93f0pJkFhqsYFhLUac,3945
|
|
14
|
-
fathom_python/models/__init__.py,sha256=
|
|
14
|
+
fathom_python/models/__init__.py,sha256=dijGPL7ESv-wpD-amGHLE0ANd-NF6eGQC_ZosbuFdyM,11103
|
|
15
15
|
fathom_python/models/actionitem.py,sha256=Ab36zDi8torOZAMXyTfVlcbayc-m1114XDLVBMJSljE,849
|
|
16
16
|
fathom_python/models/assignee.py,sha256=q7FZ4ai6dKZPBTP9cEVoYgwHyCWLkxjaTSy-9lu617U,1384
|
|
17
17
|
fathom_python/models/callbackresponse.py,sha256=n-PmMM8JE8CJEqgW4AVt14gjGVZxS7tW4okZh-ZBqwc,323
|
|
@@ -25,12 +25,15 @@ fathom_python/models/fathomuser.py,sha256=qwGGC5H-Dp2rmOa6THVcVfykXWABrFpn2oYDTY
|
|
|
25
25
|
fathom_python/models/getrecordingsummaryop.py,sha256=buQ5qW4BRCU2buQ92rWqeiJ7ETNXOIsHyf8vMEiJMY4,3018
|
|
26
26
|
fathom_python/models/getrecordingtranscriptop.py,sha256=JVv9N40odOPlw25prIgncqfkrpCQj7TerZ4yXry5oKY,2043
|
|
27
27
|
fathom_python/models/invitee.py,sha256=DwyAGSStoB4VEgg8MtTHQyGeRr7mgGyJT0-aHrZoN9Q,1829
|
|
28
|
-
fathom_python/models/listmeetingsop.py,sha256=
|
|
28
|
+
fathom_python/models/listmeetingsop.py,sha256=HqQIroFQnVHxflChU6zHSuL21XY3k-xLBn03JQcz5ek,6832
|
|
29
|
+
fathom_python/models/listmeetingtypesop.py,sha256=W3fpm1Kdo9iP6T_WeP-ylueptxk03GJz3CI_RlmDYsA,996
|
|
29
30
|
fathom_python/models/listteammembersop.py,sha256=Rtatvg_ZZZuAo95s7I6blWn_DEKXKug5-le7EyxKgVc,1218
|
|
30
31
|
fathom_python/models/listteamsop.py,sha256=fjGGOkZed83n-MK6S7eYSinqUyeFNZ5dnJ7Tj-wY3nA,913
|
|
31
|
-
fathom_python/models/meeting.py,sha256=
|
|
32
|
+
fathom_python/models/meeting.py,sha256=TEpNeR4Pp-sSirMoLJ-r5JuViRHgLFnU5JRVEe_PZUI,4302
|
|
32
33
|
fathom_python/models/meetinglistresponse.py,sha256=DWgl0mQn76jXk91xK9syGFaxw_g-7zUOUBGscLQSXNg,1501
|
|
33
34
|
fathom_python/models/meetingsummary.py,sha256=AKmIdH7fci9FSEyHFEIoA0HnVvwhLURXNR2ZjexA1BY,1485
|
|
35
|
+
fathom_python/models/meetingtype.py,sha256=t0Lhjabyj9XPiVzEA8LbLxjOHOrv34wXLW2U_xVejhU,1175
|
|
36
|
+
fathom_python/models/meetingtypelistresponse.py,sha256=OzGxgWu4qxRon75aO8Oogu3pvws__aOP0YV1m96vEV0,1529
|
|
34
37
|
fathom_python/models/security.py,sha256=hcxt1Cf-Bg5WplpU91H68EyvsxiMISup1sCJgilsjxQ,1032
|
|
35
38
|
fathom_python/models/team.py,sha256=-bOFAH_rcYvRQU10bd9KUJSbV_3V3VrFQCIwrXH6o9U,358
|
|
36
39
|
fathom_python/models/teamlistresponse.py,sha256=7Sxs2CgfkOY1ROji1mJ6Wzpro54pL0arNoxo0ClqYvk,1451
|
|
@@ -40,13 +43,15 @@ fathom_python/models/transcriptitem.py,sha256=pGg4S32z86vBu0eaSLK1Tf1TvvvTZj10nJ
|
|
|
40
43
|
fathom_python/models/transcriptitemspeaker.py,sha256=F4SH35bRpNLHZSGvWvWMlvG_WdfiNY9q0Lc01JjJCZU,1608
|
|
41
44
|
fathom_python/models/webhook.py,sha256=ekDvnrsaSU-AvUDA8tFz1SPi18Za6NbWcMTQP2k5wPI,1300
|
|
42
45
|
fathom_python/py.typed,sha256=zrp19r0G21lr2yRiMC0f8MFkQFGj9wMpSbboePMg8KM,59
|
|
43
|
-
fathom_python/sdk.py,sha256=
|
|
46
|
+
fathom_python/sdk.py,sha256=wS2Orc3Rq-zdY2t32DAjnxRef9RJlsyt3Zvqh6OJ8TQ,80748
|
|
44
47
|
fathom_python/sdkconfiguration.py,sha256=s06HLCZA48IdYWZd8E9q8AK7WazaxybG7ZdqoWF-e7s,1586
|
|
45
48
|
fathom_python/types/__init__.py,sha256=RArOwSgeeTIva6h-4ttjXwMUeCkz10nAFBL9D-QljI4,377
|
|
49
|
+
fathom_python/types/base64fileinput.py,sha256=iAPobCSY5JGbROj19BQynXEsN7Rg1EV1QOM-6PsqVWs,1352
|
|
46
50
|
fathom_python/types/basemodel.py,sha256=L79WXvTECbSqaJzs8D3ud_KdIWkU7Cx2wbohDAktE9E,1127
|
|
47
51
|
fathom_python/utils/__init__.py,sha256=CAG0O76aEToGKXpT6Ft87Vd-iiQTh4XdBrQ37BVbsiM,5861
|
|
48
52
|
fathom_python/utils/annotations.py,sha256=FvfvVTUj8TUclm4HbGgY5yi2Ap7EzGmu2UPFU4FwC1w,2755
|
|
49
53
|
fathom_python/utils/datetimes.py,sha256=oppAA5e3V35pQov1-FNLKxAaNF1_XWi-bQtyjjql3H8,855
|
|
54
|
+
fathom_python/utils/dynamic_imports.py,sha256=XSNKuw7x_kWcaXQ8ALQB7UCMlH8T-wYtz-5LS4nhj2A,2026
|
|
50
55
|
fathom_python/utils/enums.py,sha256=REU6ydF8gsVL3xaeGX4sMNyiL3q5P9h29-f6Sa6luAE,2633
|
|
51
56
|
fathom_python/utils/eventstreaming.py,sha256=SgFqMcUOYKlrTQ4gAp_dNcKLvDXukeiEMNU3DP8mXk8,6692
|
|
52
57
|
fathom_python/utils/forms.py,sha256=EJdnrfIkuwpDtekyHutla0HjI_FypTYcmYNyPKEu_W0,6874
|
|
@@ -55,12 +60,12 @@ fathom_python/utils/logger.py,sha256=CrS1hPx092pSNkAjzB3nnWoaiB0VyH_0L_H3dpLiFJ4
|
|
|
55
60
|
fathom_python/utils/metadata.py,sha256=Per2KFXXOqOtoUWXrlIfjrSrBg199KrRW0nKQDgHIBU,3136
|
|
56
61
|
fathom_python/utils/queryparams.py,sha256=MTK6inMS1_WwjmMJEJmAn67tSHHJyarpdGRlorRHEtI,5899
|
|
57
62
|
fathom_python/utils/requestbodies.py,sha256=ySjEyjcLi731LNUahWvLOrES2HihuA8VrOJx4eQ7Qzg,2101
|
|
58
|
-
fathom_python/utils/retries.py,sha256=
|
|
63
|
+
fathom_python/utils/retries.py,sha256=stPJEFtmK8gOM6aT0DpEJp9Z39oXX1-8I69jpa2n3Ww,8130
|
|
59
64
|
fathom_python/utils/security.py,sha256=ObqK8V4EbMaHb9Gc3MpVs8mEY3F8I6H5Y_EsQf7lS0k,6133
|
|
60
65
|
fathom_python/utils/serializers.py,sha256=Hndks5M_rJXVub_N5lu0gKZQUoEmWrn6PN7R-0HwvOE,5999
|
|
61
|
-
fathom_python/utils/unmarshal_json_response.py,sha256=
|
|
66
|
+
fathom_python/utils/unmarshal_json_response.py,sha256=n9xJiaI-is4GG3a_ls5n4sJc8KIeA6JU4mnZ9cbsPy4,878
|
|
62
67
|
fathom_python/utils/url.py,sha256=BgGPgcTA6MRK4bF8fjP2dUopN3NzEzxWMXPBVg8NQUA,5254
|
|
63
68
|
fathom_python/utils/values.py,sha256=CcaCXEa3xHhkUDROyXZocN8f0bdITftv9Y0P9lTf0YM,3517
|
|
64
|
-
fathom_python-0.0.
|
|
65
|
-
fathom_python-0.0.
|
|
66
|
-
fathom_python-0.0.
|
|
69
|
+
fathom_python-0.0.38.dist-info/METADATA,sha256=1czMB9fOrHpXfIRc-F8egJI9dLsRnIV00F-fz8LOU5g,20246
|
|
70
|
+
fathom_python-0.0.38.dist-info/WHEEL,sha256=EGEvSphFYqXKs23-kQBeyNoJP1nrT8ZJKQoi5p5DYL8,88
|
|
71
|
+
fathom_python-0.0.38.dist-info/RECORD,,
|