latitudesh-python-sdk 1.0.0__py3-none-any.whl → 1.1.0__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.

Potentially problematic release.


This version of latitudesh-python-sdk might be problematic. Click here for more details.

Files changed (35) hide show
  1. latitudesh_python_sdk/_version.py +3 -3
  2. latitudesh_python_sdk/events_sdk.py +84 -5
  3. latitudesh_python_sdk/firewalls_sdk.py +130 -9
  4. latitudesh_python_sdk/ipaddresses_sdk.py +78 -5
  5. latitudesh_python_sdk/models/__init__.py +94 -5
  6. latitudesh_python_sdk/models/billing_usage.py +3 -0
  7. latitudesh_python_sdk/models/get_bandwidth_plansop.py +30 -1
  8. latitudesh_python_sdk/models/get_eventsop.py +29 -1
  9. latitudesh_python_sdk/models/get_firewall_assignmentsop.py +37 -2
  10. latitudesh_python_sdk/models/get_ipsop.py +30 -1
  11. latitudesh_python_sdk/models/get_plans_operating_systemop.py +37 -2
  12. latitudesh_python_sdk/models/get_projectsop.py +30 -1
  13. latitudesh_python_sdk/models/get_regionsop.py +42 -0
  14. latitudesh_python_sdk/models/get_rolesop.py +37 -2
  15. latitudesh_python_sdk/models/get_serversop.py +30 -1
  16. latitudesh_python_sdk/models/get_team_membersop.py +42 -0
  17. latitudesh_python_sdk/models/get_virtual_networks_assignmentsop.py +33 -1
  18. latitudesh_python_sdk/models/get_virtual_networksop.py +30 -1
  19. latitudesh_python_sdk/models/list_firewallsop.py +30 -1
  20. latitudesh_python_sdk/models/virtual_network.py +0 -1
  21. latitudesh_python_sdk/operatingsystems_sdk.py +76 -9
  22. latitudesh_python_sdk/plans.py +68 -5
  23. latitudesh_python_sdk/privatenetworks.py +142 -9
  24. latitudesh_python_sdk/projects_sdk.py +78 -5
  25. latitudesh_python_sdk/regions_sdk.py +74 -7
  26. latitudesh_python_sdk/roles.py +74 -7
  27. latitudesh_python_sdk/servers_sdk.py +94 -5
  28. latitudesh_python_sdk/teamsmembers.py +74 -7
  29. latitudesh_python_sdk/utils/__init__.py +1 -0
  30. latitudesh_python_sdk/utils/datetimes.py +23 -0
  31. latitudesh_python_sdk/utils/serializers.py +32 -3
  32. {latitudesh_python_sdk-1.0.0.dist-info → latitudesh_python_sdk-1.1.0.dist-info}/METADATA +30 -4
  33. {latitudesh_python_sdk-1.0.0.dist-info → latitudesh_python_sdk-1.1.0.dist-info}/RECORD +35 -32
  34. {latitudesh_python_sdk-1.0.0.dist-info → latitudesh_python_sdk-1.1.0.dist-info}/LICENSE +0 -0
  35. {latitudesh_python_sdk-1.0.0.dist-info → latitudesh_python_sdk-1.1.0.dist-info}/WHEEL +0 -0
@@ -1,27 +1,32 @@
1
1
  """Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT."""
2
2
 
3
3
  from .basesdk import BaseSDK
4
+ from jsonpath import JSONPath
4
5
  from latitudesh_python_sdk import models, utils
5
6
  from latitudesh_python_sdk._hooks import HookContext
6
7
  from latitudesh_python_sdk.types import OptionalNullable, UNSET
7
8
  from latitudesh_python_sdk.utils import get_security_from_env
8
- from typing import Any, Mapping, Optional
9
+ from typing import Any, Dict, List, Mapping, Optional, Union
9
10
 
10
11
 
11
12
  class Roles(BaseSDK):
12
13
  def list(
13
14
  self,
14
15
  *,
16
+ page_size: Optional[int] = 20,
17
+ page_number: Optional[int] = 1,
15
18
  retries: OptionalNullable[utils.RetryConfig] = UNSET,
16
19
  server_url: Optional[str] = None,
17
20
  timeout_ms: Optional[int] = None,
18
21
  http_headers: Optional[Mapping[str, str]] = None,
19
- ) -> models.GetRolesResponseBody:
22
+ ) -> Optional[models.GetRolesResponse]:
20
23
  r"""List all Roles
21
24
 
22
25
  Returns a list of all roles that can be assigned to users
23
26
 
24
27
 
28
+ :param page_size: Number of items to return per page
29
+ :param page_number: Page number to return (starts at 1)
25
30
  :param retries: Override the default retry configuration for this method
26
31
  :param server_url: Override the default server URL for this method
27
32
  :param timeout_ms: Override the default request timeout configuration for this method in milliseconds
@@ -36,12 +41,18 @@ class Roles(BaseSDK):
36
41
  base_url = server_url
37
42
  else:
38
43
  base_url = self._get_url(base_url, url_variables)
44
+
45
+ request = models.GetRolesRequest(
46
+ page_size=page_size,
47
+ page_number=page_number,
48
+ )
49
+
39
50
  req = self._build_request(
40
51
  method="GET",
41
52
  path="/roles",
42
53
  base_url=base_url,
43
54
  url_variables=url_variables,
44
- request=None,
55
+ request=request,
45
56
  request_body_required=False,
46
57
  request_has_path_params=False,
47
58
  request_has_query_params=True,
@@ -74,8 +85,31 @@ class Roles(BaseSDK):
74
85
  retry_config=retry_config,
75
86
  )
76
87
 
88
+ def next_func() -> Optional[models.GetRolesResponse]:
89
+ body = utils.unmarshal_json(http_res.text, Union[Dict[Any, Any], List[Any]])
90
+ page = request.page_number if not request.page_number is None else 1
91
+ next_page = page + 1
92
+
93
+ if not http_res.text:
94
+ return None
95
+ results = JSONPath("$.data").parse(body)
96
+ if len(results) == 0 or len(results[0]) == 0:
97
+ return None
98
+ limit = request.page_size if not request.page_size is None else 20
99
+ if len(results[0]) < limit:
100
+ return None
101
+
102
+ return self.list(
103
+ page_size=page_size,
104
+ page_number=next_page,
105
+ retries=retries,
106
+ )
107
+
77
108
  if utils.match_response(http_res, "200", "application/vnd.api+json"):
78
- return utils.unmarshal_json(http_res.text, models.GetRolesResponseBody)
109
+ return models.GetRolesResponse(
110
+ result=utils.unmarshal_json(http_res.text, models.GetRolesResponseBody),
111
+ next=next_func,
112
+ )
79
113
  if utils.match_response(http_res, "4XX", "*"):
80
114
  http_res_text = utils.stream_to_text(http_res)
81
115
  raise models.APIError(
@@ -99,16 +133,20 @@ class Roles(BaseSDK):
99
133
  async def list_async(
100
134
  self,
101
135
  *,
136
+ page_size: Optional[int] = 20,
137
+ page_number: Optional[int] = 1,
102
138
  retries: OptionalNullable[utils.RetryConfig] = UNSET,
103
139
  server_url: Optional[str] = None,
104
140
  timeout_ms: Optional[int] = None,
105
141
  http_headers: Optional[Mapping[str, str]] = None,
106
- ) -> models.GetRolesResponseBody:
142
+ ) -> Optional[models.GetRolesResponse]:
107
143
  r"""List all Roles
108
144
 
109
145
  Returns a list of all roles that can be assigned to users
110
146
 
111
147
 
148
+ :param page_size: Number of items to return per page
149
+ :param page_number: Page number to return (starts at 1)
112
150
  :param retries: Override the default retry configuration for this method
113
151
  :param server_url: Override the default server URL for this method
114
152
  :param timeout_ms: Override the default request timeout configuration for this method in milliseconds
@@ -123,12 +161,18 @@ class Roles(BaseSDK):
123
161
  base_url = server_url
124
162
  else:
125
163
  base_url = self._get_url(base_url, url_variables)
164
+
165
+ request = models.GetRolesRequest(
166
+ page_size=page_size,
167
+ page_number=page_number,
168
+ )
169
+
126
170
  req = self._build_request_async(
127
171
  method="GET",
128
172
  path="/roles",
129
173
  base_url=base_url,
130
174
  url_variables=url_variables,
131
- request=None,
175
+ request=request,
132
176
  request_body_required=False,
133
177
  request_has_path_params=False,
134
178
  request_has_query_params=True,
@@ -161,8 +205,31 @@ class Roles(BaseSDK):
161
205
  retry_config=retry_config,
162
206
  )
163
207
 
208
+ def next_func() -> Optional[models.GetRolesResponse]:
209
+ body = utils.unmarshal_json(http_res.text, Union[Dict[Any, Any], List[Any]])
210
+ page = request.page_number if not request.page_number is None else 1
211
+ next_page = page + 1
212
+
213
+ if not http_res.text:
214
+ return None
215
+ results = JSONPath("$.data").parse(body)
216
+ if len(results) == 0 or len(results[0]) == 0:
217
+ return None
218
+ limit = request.page_size if not request.page_size is None else 20
219
+ if len(results[0]) < limit:
220
+ return None
221
+
222
+ return self.list(
223
+ page_size=page_size,
224
+ page_number=next_page,
225
+ retries=retries,
226
+ )
227
+
164
228
  if utils.match_response(http_res, "200", "application/vnd.api+json"):
165
- return utils.unmarshal_json(http_res.text, models.GetRolesResponseBody)
229
+ return models.GetRolesResponse(
230
+ result=utils.unmarshal_json(http_res.text, models.GetRolesResponseBody),
231
+ next=next_func,
232
+ )
166
233
  if utils.match_response(http_res, "4XX", "*"):
167
234
  http_res_text = await utils.stream_to_text_async(http_res)
168
235
  raise models.APIError(
@@ -1,11 +1,12 @@
1
1
  """Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT."""
2
2
 
3
3
  from .basesdk import BaseSDK
4
+ from jsonpath import JSONPath
4
5
  from latitudesh_python_sdk import models, utils
5
6
  from latitudesh_python_sdk._hooks import HookContext
6
7
  from latitudesh_python_sdk.types import BaseModel, OptionalNullable, UNSET
7
8
  from latitudesh_python_sdk.utils import get_security_from_env
8
- from typing import Any, Mapping, Optional, Union, cast
9
+ from typing import Any, Dict, List, Mapping, Optional, Union, cast
9
10
 
10
11
 
11
12
  class ServersSDK(BaseSDK):
@@ -27,11 +28,13 @@ class ServersSDK(BaseSDK):
27
28
  filter_disk: Optional[int] = None,
28
29
  filter_tags: Optional[str] = None,
29
30
  extra_fields_servers: Optional[str] = None,
31
+ page_size: Optional[int] = 20,
32
+ page_number: Optional[int] = 1,
30
33
  retries: OptionalNullable[utils.RetryConfig] = UNSET,
31
34
  server_url: Optional[str] = None,
32
35
  timeout_ms: Optional[int] = None,
33
36
  http_headers: Optional[Mapping[str, str]] = None,
34
- ) -> models.Servers:
37
+ ) -> Optional[models.GetServersResponse]:
35
38
  r"""List all Servers
36
39
 
37
40
  Returns a list of all servers belonging to the team.
@@ -52,6 +55,8 @@ class ServersSDK(BaseSDK):
52
55
  :param filter_disk: The disk size in Gigabytes to filter by, should be used with the following options: [eql] to filter for values equal to the provided value. [gte] to filter for values greater or equal to the provided value. [lte] to filter by values lower or equal to the provided value.
53
56
  :param filter_tags: The tags ids to filter by, separated by comma, e.g. `filter[tags]=tag_1,tag_2`will return servers with `tag_1` AND `tag_2`
54
57
  :param extra_fields_servers: The `credentials` are provided as extra attributes that is lazy loaded. To request it, just set `extra_fields[servers]=credentials` in the query string.
58
+ :param page_size: Number of items to return per page
59
+ :param page_number: Page number to return (starts at 1)
55
60
  :param retries: Override the default retry configuration for this method
56
61
  :param server_url: Override the default server URL for this method
57
62
  :param timeout_ms: Override the default request timeout configuration for this method in milliseconds
@@ -83,6 +88,8 @@ class ServersSDK(BaseSDK):
83
88
  filter_disk=filter_disk,
84
89
  filter_tags=filter_tags,
85
90
  extra_fields_servers=extra_fields_servers,
91
+ page_size=page_size,
92
+ page_number=page_number,
86
93
  )
87
94
 
88
95
  req = self._build_request(
@@ -123,8 +130,46 @@ class ServersSDK(BaseSDK):
123
130
  retry_config=retry_config,
124
131
  )
125
132
 
133
+ def next_func() -> Optional[models.GetServersResponse]:
134
+ body = utils.unmarshal_json(http_res.text, Union[Dict[Any, Any], List[Any]])
135
+ page = request.page_number if not request.page_number is None else 1
136
+ next_page = page + 1
137
+
138
+ if not http_res.text:
139
+ return None
140
+ results = JSONPath("$.data").parse(body)
141
+ if len(results) == 0 or len(results[0]) == 0:
142
+ return None
143
+ limit = request.page_size if not request.page_size is None else 20
144
+ if len(results[0]) < limit:
145
+ return None
146
+
147
+ return self.list(
148
+ filter_project=filter_project,
149
+ filter_region=filter_region,
150
+ filter_hostname=filter_hostname,
151
+ filter_created_at_gte=filter_created_at_gte,
152
+ filter_created_at_lte=filter_created_at_lte,
153
+ filter_label=filter_label,
154
+ filter_status=filter_status,
155
+ filter_plan=filter_plan,
156
+ filter_gpu=filter_gpu,
157
+ filter_ram_eql=filter_ram_eql,
158
+ filter_ram_gte=filter_ram_gte,
159
+ filter_ram_lte=filter_ram_lte,
160
+ filter_disk=filter_disk,
161
+ filter_tags=filter_tags,
162
+ extra_fields_servers=extra_fields_servers,
163
+ page_size=page_size,
164
+ page_number=next_page,
165
+ retries=retries,
166
+ )
167
+
126
168
  if utils.match_response(http_res, "200", "application/vnd.api+json"):
127
- return utils.unmarshal_json(http_res.text, models.Servers)
169
+ return models.GetServersResponse(
170
+ result=utils.unmarshal_json(http_res.text, models.Servers),
171
+ next=next_func,
172
+ )
128
173
  if utils.match_response(http_res, "4XX", "*"):
129
174
  http_res_text = utils.stream_to_text(http_res)
130
175
  raise models.APIError(
@@ -163,11 +208,13 @@ class ServersSDK(BaseSDK):
163
208
  filter_disk: Optional[int] = None,
164
209
  filter_tags: Optional[str] = None,
165
210
  extra_fields_servers: Optional[str] = None,
211
+ page_size: Optional[int] = 20,
212
+ page_number: Optional[int] = 1,
166
213
  retries: OptionalNullable[utils.RetryConfig] = UNSET,
167
214
  server_url: Optional[str] = None,
168
215
  timeout_ms: Optional[int] = None,
169
216
  http_headers: Optional[Mapping[str, str]] = None,
170
- ) -> models.Servers:
217
+ ) -> Optional[models.GetServersResponse]:
171
218
  r"""List all Servers
172
219
 
173
220
  Returns a list of all servers belonging to the team.
@@ -188,6 +235,8 @@ class ServersSDK(BaseSDK):
188
235
  :param filter_disk: The disk size in Gigabytes to filter by, should be used with the following options: [eql] to filter for values equal to the provided value. [gte] to filter for values greater or equal to the provided value. [lte] to filter by values lower or equal to the provided value.
189
236
  :param filter_tags: The tags ids to filter by, separated by comma, e.g. `filter[tags]=tag_1,tag_2`will return servers with `tag_1` AND `tag_2`
190
237
  :param extra_fields_servers: The `credentials` are provided as extra attributes that is lazy loaded. To request it, just set `extra_fields[servers]=credentials` in the query string.
238
+ :param page_size: Number of items to return per page
239
+ :param page_number: Page number to return (starts at 1)
191
240
  :param retries: Override the default retry configuration for this method
192
241
  :param server_url: Override the default server URL for this method
193
242
  :param timeout_ms: Override the default request timeout configuration for this method in milliseconds
@@ -219,6 +268,8 @@ class ServersSDK(BaseSDK):
219
268
  filter_disk=filter_disk,
220
269
  filter_tags=filter_tags,
221
270
  extra_fields_servers=extra_fields_servers,
271
+ page_size=page_size,
272
+ page_number=page_number,
222
273
  )
223
274
 
224
275
  req = self._build_request_async(
@@ -259,8 +310,46 @@ class ServersSDK(BaseSDK):
259
310
  retry_config=retry_config,
260
311
  )
261
312
 
313
+ def next_func() -> Optional[models.GetServersResponse]:
314
+ body = utils.unmarshal_json(http_res.text, Union[Dict[Any, Any], List[Any]])
315
+ page = request.page_number if not request.page_number is None else 1
316
+ next_page = page + 1
317
+
318
+ if not http_res.text:
319
+ return None
320
+ results = JSONPath("$.data").parse(body)
321
+ if len(results) == 0 or len(results[0]) == 0:
322
+ return None
323
+ limit = request.page_size if not request.page_size is None else 20
324
+ if len(results[0]) < limit:
325
+ return None
326
+
327
+ return self.list(
328
+ filter_project=filter_project,
329
+ filter_region=filter_region,
330
+ filter_hostname=filter_hostname,
331
+ filter_created_at_gte=filter_created_at_gte,
332
+ filter_created_at_lte=filter_created_at_lte,
333
+ filter_label=filter_label,
334
+ filter_status=filter_status,
335
+ filter_plan=filter_plan,
336
+ filter_gpu=filter_gpu,
337
+ filter_ram_eql=filter_ram_eql,
338
+ filter_ram_gte=filter_ram_gte,
339
+ filter_ram_lte=filter_ram_lte,
340
+ filter_disk=filter_disk,
341
+ filter_tags=filter_tags,
342
+ extra_fields_servers=extra_fields_servers,
343
+ page_size=page_size,
344
+ page_number=next_page,
345
+ retries=retries,
346
+ )
347
+
262
348
  if utils.match_response(http_res, "200", "application/vnd.api+json"):
263
- return utils.unmarshal_json(http_res.text, models.Servers)
349
+ return models.GetServersResponse(
350
+ result=utils.unmarshal_json(http_res.text, models.Servers),
351
+ next=next_func,
352
+ )
264
353
  if utils.match_response(http_res, "4XX", "*"):
265
354
  http_res_text = await utils.stream_to_text_async(http_res)
266
355
  raise models.APIError(
@@ -1,24 +1,29 @@
1
1
  """Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT."""
2
2
 
3
3
  from .basesdk import BaseSDK
4
+ from jsonpath import JSONPath
4
5
  from latitudesh_python_sdk import models, utils
5
6
  from latitudesh_python_sdk._hooks import HookContext
6
7
  from latitudesh_python_sdk.types import OptionalNullable, UNSET
7
8
  from latitudesh_python_sdk.utils import get_security_from_env
8
- from typing import Any, Mapping, Optional, Union
9
+ from typing import Any, Dict, List, Mapping, Optional, Union
9
10
 
10
11
 
11
12
  class TeamsMembers(BaseSDK):
12
13
  def list(
13
14
  self,
14
15
  *,
16
+ page_size: Optional[int] = 20,
17
+ page_number: Optional[int] = 1,
15
18
  retries: OptionalNullable[utils.RetryConfig] = UNSET,
16
19
  server_url: Optional[str] = None,
17
20
  timeout_ms: Optional[int] = None,
18
21
  http_headers: Optional[Mapping[str, str]] = None,
19
- ) -> models.TeamMembers:
22
+ ) -> Optional[models.GetTeamMembersResponse]:
20
23
  r"""List all Team Members
21
24
 
25
+ :param page_size: Number of items to return per page
26
+ :param page_number: Page number to return (starts at 1)
22
27
  :param retries: Override the default retry configuration for this method
23
28
  :param server_url: Override the default server URL for this method
24
29
  :param timeout_ms: Override the default request timeout configuration for this method in milliseconds
@@ -33,12 +38,18 @@ class TeamsMembers(BaseSDK):
33
38
  base_url = server_url
34
39
  else:
35
40
  base_url = self._get_url(base_url, url_variables)
41
+
42
+ request = models.GetTeamMembersRequest(
43
+ page_size=page_size,
44
+ page_number=page_number,
45
+ )
46
+
36
47
  req = self._build_request(
37
48
  method="GET",
38
49
  path="/team/members",
39
50
  base_url=base_url,
40
51
  url_variables=url_variables,
41
- request=None,
52
+ request=request,
42
53
  request_body_required=False,
43
54
  request_has_path_params=False,
44
55
  request_has_query_params=True,
@@ -71,8 +82,31 @@ class TeamsMembers(BaseSDK):
71
82
  retry_config=retry_config,
72
83
  )
73
84
 
85
+ def next_func() -> Optional[models.GetTeamMembersResponse]:
86
+ body = utils.unmarshal_json(http_res.text, Union[Dict[Any, Any], List[Any]])
87
+ page = request.page_number if not request.page_number is None else 1
88
+ next_page = page + 1
89
+
90
+ if not http_res.text:
91
+ return None
92
+ results = JSONPath("$.data").parse(body)
93
+ if len(results) == 0 or len(results[0]) == 0:
94
+ return None
95
+ limit = request.page_size if not request.page_size is None else 20
96
+ if len(results[0]) < limit:
97
+ return None
98
+
99
+ return self.list(
100
+ page_size=page_size,
101
+ page_number=next_page,
102
+ retries=retries,
103
+ )
104
+
74
105
  if utils.match_response(http_res, "200", "application/vnd.api+json"):
75
- return utils.unmarshal_json(http_res.text, models.TeamMembers)
106
+ return models.GetTeamMembersResponse(
107
+ result=utils.unmarshal_json(http_res.text, models.TeamMembers),
108
+ next=next_func,
109
+ )
76
110
  if utils.match_response(http_res, "4XX", "*"):
77
111
  http_res_text = utils.stream_to_text(http_res)
78
112
  raise models.APIError(
@@ -96,13 +130,17 @@ class TeamsMembers(BaseSDK):
96
130
  async def list_async(
97
131
  self,
98
132
  *,
133
+ page_size: Optional[int] = 20,
134
+ page_number: Optional[int] = 1,
99
135
  retries: OptionalNullable[utils.RetryConfig] = UNSET,
100
136
  server_url: Optional[str] = None,
101
137
  timeout_ms: Optional[int] = None,
102
138
  http_headers: Optional[Mapping[str, str]] = None,
103
- ) -> models.TeamMembers:
139
+ ) -> Optional[models.GetTeamMembersResponse]:
104
140
  r"""List all Team Members
105
141
 
142
+ :param page_size: Number of items to return per page
143
+ :param page_number: Page number to return (starts at 1)
106
144
  :param retries: Override the default retry configuration for this method
107
145
  :param server_url: Override the default server URL for this method
108
146
  :param timeout_ms: Override the default request timeout configuration for this method in milliseconds
@@ -117,12 +155,18 @@ class TeamsMembers(BaseSDK):
117
155
  base_url = server_url
118
156
  else:
119
157
  base_url = self._get_url(base_url, url_variables)
158
+
159
+ request = models.GetTeamMembersRequest(
160
+ page_size=page_size,
161
+ page_number=page_number,
162
+ )
163
+
120
164
  req = self._build_request_async(
121
165
  method="GET",
122
166
  path="/team/members",
123
167
  base_url=base_url,
124
168
  url_variables=url_variables,
125
- request=None,
169
+ request=request,
126
170
  request_body_required=False,
127
171
  request_has_path_params=False,
128
172
  request_has_query_params=True,
@@ -155,8 +199,31 @@ class TeamsMembers(BaseSDK):
155
199
  retry_config=retry_config,
156
200
  )
157
201
 
202
+ def next_func() -> Optional[models.GetTeamMembersResponse]:
203
+ body = utils.unmarshal_json(http_res.text, Union[Dict[Any, Any], List[Any]])
204
+ page = request.page_number if not request.page_number is None else 1
205
+ next_page = page + 1
206
+
207
+ if not http_res.text:
208
+ return None
209
+ results = JSONPath("$.data").parse(body)
210
+ if len(results) == 0 or len(results[0]) == 0:
211
+ return None
212
+ limit = request.page_size if not request.page_size is None else 20
213
+ if len(results[0]) < limit:
214
+ return None
215
+
216
+ return self.list(
217
+ page_size=page_size,
218
+ page_number=next_page,
219
+ retries=retries,
220
+ )
221
+
158
222
  if utils.match_response(http_res, "200", "application/vnd.api+json"):
159
- return utils.unmarshal_json(http_res.text, models.TeamMembers)
223
+ return models.GetTeamMembersResponse(
224
+ result=utils.unmarshal_json(http_res.text, models.TeamMembers),
225
+ next=next_func,
226
+ )
160
227
  if utils.match_response(http_res, "4XX", "*"):
161
228
  http_res_text = await utils.stream_to_text_async(http_res)
162
229
  raise models.APIError(
@@ -1,6 +1,7 @@
1
1
  """Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT."""
2
2
 
3
3
  from .annotations import get_discriminator
4
+ from .datetimes import parse_datetime
4
5
  from .enums import OpenEnumMeta
5
6
  from .headers import get_headers, get_response_headers
6
7
  from .metadata import (
@@ -0,0 +1,23 @@
1
+ """Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT."""
2
+
3
+ from datetime import datetime
4
+ import sys
5
+
6
+
7
+ def parse_datetime(datetime_string: str) -> datetime:
8
+ """
9
+ Convert a RFC 3339 / ISO 8601 formatted string into a datetime object.
10
+ Python versions 3.11 and later support parsing RFC 3339 directly with
11
+ datetime.fromisoformat(), but for earlier versions, this function
12
+ encapsulates the necessary extra logic.
13
+ """
14
+ # Python 3.11 and later can parse RFC 3339 directly
15
+ if sys.version_info >= (3, 11):
16
+ return datetime.fromisoformat(datetime_string)
17
+
18
+ # For Python 3.10 and earlier, a common ValueError is trailing 'Z' suffix,
19
+ # so fix that upfront.
20
+ if datetime_string.endswith("Z"):
21
+ datetime_string = datetime_string[:-1] + "+00:00"
22
+
23
+ return datetime.fromisoformat(datetime_string)
@@ -1,13 +1,16 @@
1
1
  """Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT."""
2
2
 
3
3
  from decimal import Decimal
4
+ import functools
4
5
  import json
5
- from typing import Any, Dict, List, Union, get_args
6
- import httpx
6
+ import typing
7
+ from typing import Any, Dict, List, Tuple, Union, get_args
8
+ import typing_extensions
7
9
  from typing_extensions import get_origin
10
+
11
+ import httpx
8
12
  from pydantic import ConfigDict, create_model
9
13
  from pydantic_core import from_json
10
- from typing_inspection.typing_objects import is_union
11
14
 
12
15
  from ..types.basemodel import BaseModel, Nullable, OptionalNullable, Unset
13
16
 
@@ -185,6 +188,13 @@ def is_nullable(field):
185
188
  return False
186
189
 
187
190
 
191
+ def is_union(obj: object) -> bool:
192
+ """
193
+ Returns True if the given object is a typing.Union or typing_extensions.Union.
194
+ """
195
+ return any(obj is typing_obj for typing_obj in _get_typing_objects_by_name_of("Union"))
196
+
197
+
188
198
  def stream_to_text(stream: httpx.Response) -> str:
189
199
  return "".join(stream.iter_text())
190
200
 
@@ -217,3 +227,22 @@ def _contains_pydantic_model(data: Any) -> bool:
217
227
  return any(_contains_pydantic_model(value) for value in data.values())
218
228
 
219
229
  return False
230
+
231
+
232
+ @functools.cache
233
+ def _get_typing_objects_by_name_of(name: str) -> Tuple[Any, ...]:
234
+ """
235
+ Get typing objects by name from typing and typing_extensions.
236
+ Reference: https://typing-extensions.readthedocs.io/en/latest/#runtime-use-of-types
237
+ """
238
+ result = tuple(
239
+ getattr(module, name)
240
+ for module in (typing, typing_extensions)
241
+ if hasattr(module, name)
242
+ )
243
+ if not result:
244
+ raise ValueError(
245
+ f"Neither typing nor typing_extensions has an object called {name!r}"
246
+ )
247
+ return result
248
+
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.3
2
2
  Name: latitudesh-python-sdk
3
- Version: 1.0.0
3
+ Version: 1.1.0
4
4
  Summary: Python Client SDK Generated by Speakeasy.
5
5
  Author: Speakeasy
6
6
  Requires-Python: >=3.9
@@ -10,11 +10,9 @@ Classifier: Programming Language :: Python :: 3.10
10
10
  Classifier: Programming Language :: Python :: 3.11
11
11
  Classifier: Programming Language :: Python :: 3.12
12
12
  Classifier: Programming Language :: Python :: 3.13
13
- Requires-Dist: eval-type-backport (>=0.2.0)
14
13
  Requires-Dist: httpx (>=0.28.1)
14
+ Requires-Dist: jsonpath-python (>=1.0.6)
15
15
  Requires-Dist: pydantic (>=2.11.2)
16
- Requires-Dist: python-dateutil (>=2.8.2)
17
- Requires-Dist: typing-inspection (>=0.4.0)
18
16
  Project-URL: Repository, https://github.com/latitudesh/latitudesh-python-sdk.git
19
17
  Description-Content-Type: text/markdown
20
18
 
@@ -45,6 +43,7 @@ Latitude.sh API: The Latitude.sh API is a RESTful API to manage your Latitude.sh
45
43
  * [SDK Example Usage](https://github.com/latitudesh/latitudesh-python-sdk/blob/master/#sdk-example-usage)
46
44
  * [Authentication](https://github.com/latitudesh/latitudesh-python-sdk/blob/master/#authentication)
47
45
  * [Available Resources and Operations](https://github.com/latitudesh/latitudesh-python-sdk/blob/master/#available-resources-and-operations)
46
+ * [Pagination](https://github.com/latitudesh/latitudesh-python-sdk/blob/master/#pagination)
48
47
  * [Retries](https://github.com/latitudesh/latitudesh-python-sdk/blob/master/#retries)
49
48
  * [Error Handling](https://github.com/latitudesh/latitudesh-python-sdk/blob/master/#error-handling)
50
49
  * [Server Selection](https://github.com/latitudesh/latitudesh-python-sdk/blob/master/#server-selection)
@@ -424,6 +423,33 @@ with Latitudesh(
424
423
  </details>
425
424
  <!-- End Available Resources and Operations [operations] -->
426
425
 
426
+ <!-- Start Pagination [pagination] -->
427
+ ## Pagination
428
+
429
+ Some of the endpoints in this SDK support pagination. To use pagination, you make your SDK calls as usual, but the
430
+ returned response object will have a `Next` method that can be called to pull down the next group of results. If the
431
+ return value of `Next` is `None`, then there are no more pages to be fetched.
432
+
433
+ Here's an example of one such pagination call:
434
+ ```python
435
+ from latitudesh_python_sdk import Latitudesh
436
+ import os
437
+
438
+
439
+ with Latitudesh(
440
+ bearer=os.getenv("LATITUDESH_BEARER", ""),
441
+ ) as latitudesh:
442
+
443
+ res = latitudesh.events.list()
444
+
445
+ while res is not None:
446
+ # Handle items
447
+
448
+ res = res.next()
449
+
450
+ ```
451
+ <!-- End Pagination [pagination] -->
452
+
427
453
  <!-- Start Retries [retries] -->
428
454
  ## Retries
429
455