latitudesh-python-sdk 1.1.0__py3-none-any.whl → 2.0.1__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 (93) hide show
  1. latitudesh_python_sdk/_hooks/types.py +7 -0
  2. latitudesh_python_sdk/_version.py +6 -4
  3. latitudesh_python_sdk/apikeys.py +73 -156
  4. latitudesh_python_sdk/basesdk.py +16 -24
  5. latitudesh_python_sdk/billing.py +13 -32
  6. latitudesh_python_sdk/events_sdk.py +11 -34
  7. latitudesh_python_sdk/firewalls_sdk.py +105 -264
  8. latitudesh_python_sdk/httpclient.py +6 -16
  9. latitudesh_python_sdk/ipaddresses_sdk.py +29 -68
  10. latitudesh_python_sdk/models/__init__.py +2586 -1126
  11. latitudesh_python_sdk/models/apierror.py +30 -14
  12. latitudesh_python_sdk/models/assign_server_virtual_networkop.py +2 -2
  13. latitudesh_python_sdk/models/{bandwidth_plan.py → bandwidth_plan_data.py} +9 -9
  14. latitudesh_python_sdk/models/bandwidth_plans.py +14 -3
  15. latitudesh_python_sdk/models/custom_tag.py +15 -0
  16. latitudesh_python_sdk/models/custom_tag_data.py +54 -0
  17. latitudesh_python_sdk/models/custom_tags.py +26 -0
  18. latitudesh_python_sdk/models/delete_ssh_keyop.py +16 -0
  19. latitudesh_python_sdk/models/delete_user_dataop.py +16 -0
  20. latitudesh_python_sdk/models/deploy_config.py +11 -6
  21. latitudesh_python_sdk/models/error_object.py +11 -6
  22. latitudesh_python_sdk/models/event_data.py +98 -0
  23. latitudesh_python_sdk/models/events.py +16 -1
  24. latitudesh_python_sdk/models/filesystem_data.py +4 -0
  25. latitudesh_python_sdk/models/firewall.py +15 -0
  26. latitudesh_python_sdk/models/firewall_assignment_data.py +50 -0
  27. latitudesh_python_sdk/models/firewall_assignments.py +29 -0
  28. latitudesh_python_sdk/models/firewall_data.py +71 -0
  29. latitudesh_python_sdk/models/firewall_server.py +4 -1
  30. latitudesh_python_sdk/models/firewalls.py +7 -7
  31. latitudesh_python_sdk/models/get_firewall_assignmentsop.py +3 -3
  32. latitudesh_python_sdk/models/get_ssh_keyop.py +30 -0
  33. latitudesh_python_sdk/models/get_ssh_keysop.py +22 -0
  34. latitudesh_python_sdk/models/get_traffic_consumptionop.py +8 -4
  35. latitudesh_python_sdk/models/get_user_dataop.py +31 -0
  36. latitudesh_python_sdk/models/get_users_dataop.py +35 -0
  37. latitudesh_python_sdk/models/latitudesherror.py +26 -0
  38. latitudesh_python_sdk/models/no_response_error.py +13 -0
  39. latitudesh_python_sdk/models/operating_system_data.py +65 -0
  40. latitudesh_python_sdk/models/operating_systems.py +15 -0
  41. latitudesh_python_sdk/models/out_of_band_connection.py +4 -4
  42. latitudesh_python_sdk/models/patch_user_dataop.py +69 -0
  43. latitudesh_python_sdk/models/post_ssh_keyop.py +58 -0
  44. latitudesh_python_sdk/models/post_user_dataop.py +45 -0
  45. latitudesh_python_sdk/models/project_include.py +3 -0
  46. latitudesh_python_sdk/models/put_ssh_keyop.py +80 -0
  47. latitudesh_python_sdk/models/region_resource_data.py +4 -4
  48. latitudesh_python_sdk/models/responsevalidationerror.py +25 -0
  49. latitudesh_python_sdk/models/role.py +11 -0
  50. latitudesh_python_sdk/models/server.py +11 -6
  51. latitudesh_python_sdk/models/server_data.py +14 -3
  52. latitudesh_python_sdk/models/server_region_resource_data.py +40 -0
  53. latitudesh_python_sdk/models/{ssh_key.py → ssh_keys.py} +13 -2
  54. latitudesh_python_sdk/models/storage_plan_data.py +47 -0
  55. latitudesh_python_sdk/models/storage_plans.py +14 -3
  56. latitudesh_python_sdk/models/update_serverop.py +58 -10
  57. latitudesh_python_sdk/models/user_data.py +11 -0
  58. latitudesh_python_sdk/models/virtual_network.py +30 -6
  59. latitudesh_python_sdk/models/virtual_network1.py +15 -0
  60. latitudesh_python_sdk/models/virtual_network_assignment.py +41 -0
  61. latitudesh_python_sdk/models/virtual_network_assignment_data.py +68 -0
  62. latitudesh_python_sdk/models/virtual_network_assignments.py +5 -5
  63. latitudesh_python_sdk/models/virtual_network_data.py +88 -0
  64. latitudesh_python_sdk/models/virtual_networks.py +3 -3
  65. latitudesh_python_sdk/operatingsystems_sdk.py +13 -32
  66. latitudesh_python_sdk/plans.py +99 -214
  67. latitudesh_python_sdk/privatenetworks.py +131 -290
  68. latitudesh_python_sdk/projects_sdk.py +79 -158
  69. latitudesh_python_sdk/regions_sdk.py +25 -66
  70. latitudesh_python_sdk/roles.py +25 -64
  71. latitudesh_python_sdk/sdk.py +110 -73
  72. latitudesh_python_sdk/sdkconfiguration.py +0 -7
  73. latitudesh_python_sdk/servers_sdk.py +305 -646
  74. latitudesh_python_sdk/sshkeys_sdk.py +1856 -0
  75. latitudesh_python_sdk/storage.py +41 -120
  76. latitudesh_python_sdk/tags.py +67 -146
  77. latitudesh_python_sdk/teams_sdk.py +41 -100
  78. latitudesh_python_sdk/teamsmembers.py +37 -96
  79. latitudesh_python_sdk/traffic_sdk.py +37 -76
  80. latitudesh_python_sdk/userdata_sdk.py +959 -149
  81. latitudesh_python_sdk/userprofile.py +37 -100
  82. latitudesh_python_sdk/utils/__init__.py +131 -46
  83. latitudesh_python_sdk/utils/forms.py +49 -28
  84. latitudesh_python_sdk/utils/serializers.py +3 -2
  85. latitudesh_python_sdk/utils/unmarshal_json_response.py +24 -0
  86. latitudesh_python_sdk/virtualmachines.py +71 -140
  87. latitudesh_python_sdk/vpnsessions.py +93 -172
  88. {latitudesh_python_sdk-1.1.0.dist-info → latitudesh_python_sdk-2.0.1.dist-info}/METADATA +76 -43
  89. {latitudesh_python_sdk-1.1.0.dist-info → latitudesh_python_sdk-2.0.1.dist-info}/RECORD +91 -67
  90. {latitudesh_python_sdk-1.1.0.dist-info → latitudesh_python_sdk-2.0.1.dist-info}/WHEEL +1 -1
  91. latitudesh_python_sdk/models/storage_plan.py +0 -36
  92. latitudesh_python_sdk/sshkeys.py +0 -1050
  93. {latitudesh_python_sdk-1.1.0.dist-info → latitudesh_python_sdk-2.0.1.dist-info}/LICENSE +0 -0
@@ -6,6 +6,7 @@ from latitudesh_python_sdk import models, utils
6
6
  from latitudesh_python_sdk._hooks import HookContext
7
7
  from latitudesh_python_sdk.types import OptionalNullable, UNSET
8
8
  from latitudesh_python_sdk.utils import get_security_from_env
9
+ from latitudesh_python_sdk.utils.unmarshal_json_response import unmarshal_json_response
9
10
  from typing import Any, Dict, List, Mapping, Optional, Union
10
11
 
11
12
 
@@ -73,6 +74,7 @@ class Roles(BaseSDK):
73
74
 
74
75
  http_res = self.do_request(
75
76
  hook_ctx=HookContext(
77
+ config=self.sdk_configuration,
76
78
  base_url=base_url or "",
77
79
  operation_id="get-roles",
78
80
  oauth2_scopes=[],
@@ -107,28 +109,17 @@ class Roles(BaseSDK):
107
109
 
108
110
  if utils.match_response(http_res, "200", "application/vnd.api+json"):
109
111
  return models.GetRolesResponse(
110
- result=utils.unmarshal_json(http_res.text, models.GetRolesResponseBody),
112
+ result=unmarshal_json_response(models.GetRolesResponseBody, http_res),
111
113
  next=next_func,
112
114
  )
113
115
  if utils.match_response(http_res, "4XX", "*"):
114
116
  http_res_text = utils.stream_to_text(http_res)
115
- raise models.APIError(
116
- "API error occurred", http_res.status_code, http_res_text, http_res
117
- )
117
+ raise models.APIError("API error occurred", http_res, http_res_text)
118
118
  if utils.match_response(http_res, "5XX", "*"):
119
119
  http_res_text = utils.stream_to_text(http_res)
120
- raise models.APIError(
121
- "API error occurred", http_res.status_code, http_res_text, http_res
122
- )
120
+ raise models.APIError("API error occurred", http_res, http_res_text)
123
121
 
124
- content_type = http_res.headers.get("Content-Type")
125
- http_res_text = utils.stream_to_text(http_res)
126
- raise models.APIError(
127
- f"Unexpected response received (code: {http_res.status_code}, type: {content_type})",
128
- http_res.status_code,
129
- http_res_text,
130
- http_res,
131
- )
122
+ raise models.APIError("Unexpected response received", http_res)
132
123
 
133
124
  async def list_async(
134
125
  self,
@@ -193,6 +184,7 @@ class Roles(BaseSDK):
193
184
 
194
185
  http_res = await self.do_request_async(
195
186
  hook_ctx=HookContext(
187
+ config=self.sdk_configuration,
196
188
  base_url=base_url or "",
197
189
  operation_id="get-roles",
198
190
  oauth2_scopes=[],
@@ -227,28 +219,17 @@ class Roles(BaseSDK):
227
219
 
228
220
  if utils.match_response(http_res, "200", "application/vnd.api+json"):
229
221
  return models.GetRolesResponse(
230
- result=utils.unmarshal_json(http_res.text, models.GetRolesResponseBody),
222
+ result=unmarshal_json_response(models.GetRolesResponseBody, http_res),
231
223
  next=next_func,
232
224
  )
233
225
  if utils.match_response(http_res, "4XX", "*"):
234
226
  http_res_text = await utils.stream_to_text_async(http_res)
235
- raise models.APIError(
236
- "API error occurred", http_res.status_code, http_res_text, http_res
237
- )
227
+ raise models.APIError("API error occurred", http_res, http_res_text)
238
228
  if utils.match_response(http_res, "5XX", "*"):
239
229
  http_res_text = await utils.stream_to_text_async(http_res)
240
- raise models.APIError(
241
- "API error occurred", http_res.status_code, http_res_text, http_res
242
- )
230
+ raise models.APIError("API error occurred", http_res, http_res_text)
243
231
 
244
- content_type = http_res.headers.get("Content-Type")
245
- http_res_text = await utils.stream_to_text_async(http_res)
246
- raise models.APIError(
247
- f"Unexpected response received (code: {http_res.status_code}, type: {content_type})",
248
- http_res.status_code,
249
- http_res_text,
250
- http_res,
251
- )
232
+ raise models.APIError("Unexpected response received", http_res)
252
233
 
253
234
  def get(
254
235
  self,
@@ -307,6 +288,7 @@ class Roles(BaseSDK):
307
288
 
308
289
  http_res = self.do_request(
309
290
  hook_ctx=HookContext(
291
+ config=self.sdk_configuration,
310
292
  base_url=base_url or "",
311
293
  operation_id="get-role-id",
312
294
  oauth2_scopes=[],
@@ -321,29 +303,18 @@ class Roles(BaseSDK):
321
303
 
322
304
  response_data: Any = None
323
305
  if utils.match_response(http_res, "200", "application/vnd.api+json"):
324
- return utils.unmarshal_json(http_res.text, models.Role)
306
+ return unmarshal_json_response(models.Role, http_res)
325
307
  if utils.match_response(http_res, "404", "application/vnd.api+json"):
326
- response_data = utils.unmarshal_json(http_res.text, models.ErrorObjectData)
327
- raise models.ErrorObject(data=response_data)
308
+ response_data = unmarshal_json_response(models.ErrorObjectData, http_res)
309
+ raise models.ErrorObject(response_data, http_res)
328
310
  if utils.match_response(http_res, "4XX", "*"):
329
311
  http_res_text = utils.stream_to_text(http_res)
330
- raise models.APIError(
331
- "API error occurred", http_res.status_code, http_res_text, http_res
332
- )
312
+ raise models.APIError("API error occurred", http_res, http_res_text)
333
313
  if utils.match_response(http_res, "5XX", "*"):
334
314
  http_res_text = utils.stream_to_text(http_res)
335
- raise models.APIError(
336
- "API error occurred", http_res.status_code, http_res_text, http_res
337
- )
315
+ raise models.APIError("API error occurred", http_res, http_res_text)
338
316
 
339
- content_type = http_res.headers.get("Content-Type")
340
- http_res_text = utils.stream_to_text(http_res)
341
- raise models.APIError(
342
- f"Unexpected response received (code: {http_res.status_code}, type: {content_type})",
343
- http_res.status_code,
344
- http_res_text,
345
- http_res,
346
- )
317
+ raise models.APIError("Unexpected response received", http_res)
347
318
 
348
319
  async def get_async(
349
320
  self,
@@ -402,6 +373,7 @@ class Roles(BaseSDK):
402
373
 
403
374
  http_res = await self.do_request_async(
404
375
  hook_ctx=HookContext(
376
+ config=self.sdk_configuration,
405
377
  base_url=base_url or "",
406
378
  operation_id="get-role-id",
407
379
  oauth2_scopes=[],
@@ -416,26 +388,15 @@ class Roles(BaseSDK):
416
388
 
417
389
  response_data: Any = None
418
390
  if utils.match_response(http_res, "200", "application/vnd.api+json"):
419
- return utils.unmarshal_json(http_res.text, models.Role)
391
+ return unmarshal_json_response(models.Role, http_res)
420
392
  if utils.match_response(http_res, "404", "application/vnd.api+json"):
421
- response_data = utils.unmarshal_json(http_res.text, models.ErrorObjectData)
422
- raise models.ErrorObject(data=response_data)
393
+ response_data = unmarshal_json_response(models.ErrorObjectData, http_res)
394
+ raise models.ErrorObject(response_data, http_res)
423
395
  if utils.match_response(http_res, "4XX", "*"):
424
396
  http_res_text = await utils.stream_to_text_async(http_res)
425
- raise models.APIError(
426
- "API error occurred", http_res.status_code, http_res_text, http_res
427
- )
397
+ raise models.APIError("API error occurred", http_res, http_res_text)
428
398
  if utils.match_response(http_res, "5XX", "*"):
429
399
  http_res_text = await utils.stream_to_text_async(http_res)
430
- raise models.APIError(
431
- "API error occurred", http_res.status_code, http_res_text, http_res
432
- )
400
+ raise models.APIError("API error occurred", http_res, http_res_text)
433
401
 
434
- content_type = http_res.headers.get("Content-Type")
435
- http_res_text = await utils.stream_to_text_async(http_res)
436
- raise models.APIError(
437
- f"Unexpected response received (code: {http_res.status_code}, type: {content_type})",
438
- http_res.status_code,
439
- http_res_text,
440
- http_res,
441
- )
402
+ raise models.APIError("Unexpected response received", http_res)
@@ -6,60 +6,96 @@ from .sdkconfiguration import SDKConfiguration
6
6
  from .utils.logger import Logger, get_default_logger
7
7
  from .utils.retries import RetryConfig
8
8
  import httpx
9
+ import importlib
9
10
  from latitudesh_python_sdk import models, utils
10
11
  from latitudesh_python_sdk._hooks import SDKHooks
11
- from latitudesh_python_sdk.apikeys import APIKeys
12
- from latitudesh_python_sdk.billing import Billing
13
- from latitudesh_python_sdk.events_sdk import EventsSDK
14
- from latitudesh_python_sdk.firewalls_sdk import FirewallsSDK
15
- from latitudesh_python_sdk.ipaddresses_sdk import IPAddressesSDK
16
- from latitudesh_python_sdk.operatingsystems_sdk import OperatingSystemsSDK
17
- from latitudesh_python_sdk.plans import Plans
18
- from latitudesh_python_sdk.privatenetworks import PrivateNetworks
19
- from latitudesh_python_sdk.projects_sdk import ProjectsSDK
20
- from latitudesh_python_sdk.regions_sdk import RegionsSDK
21
- from latitudesh_python_sdk.roles import Roles
22
- from latitudesh_python_sdk.servers_sdk import ServersSDK
23
- from latitudesh_python_sdk.sshkeys import SSHKeys
24
- from latitudesh_python_sdk.storage import Storage
25
- from latitudesh_python_sdk.tags import Tags
26
- from latitudesh_python_sdk.teams_sdk import TeamsSDK
27
- from latitudesh_python_sdk.teamsmembers import TeamsMembers
28
- from latitudesh_python_sdk.traffic_sdk import TrafficSDK
29
12
  from latitudesh_python_sdk.types import OptionalNullable, UNSET
30
- from latitudesh_python_sdk.userdata_sdk import UserDataSDK
31
- from latitudesh_python_sdk.userprofile import UserProfile
32
- from latitudesh_python_sdk.virtualmachines import VirtualMachines
33
- from latitudesh_python_sdk.vpnsessions import VpnSessions
34
- from typing import Any, Callable, Dict, List, Optional, Union, cast
13
+ from typing import Any, Callable, Dict, List, Optional, TYPE_CHECKING, Union, cast
35
14
  import weakref
36
15
 
16
+ if TYPE_CHECKING:
17
+ from latitudesh_python_sdk.apikeys import APIKeys
18
+ from latitudesh_python_sdk.billing import Billing
19
+ from latitudesh_python_sdk.events_sdk import EventsSDK
20
+ from latitudesh_python_sdk.firewalls_sdk import FirewallsSDK
21
+ from latitudesh_python_sdk.ipaddresses_sdk import IPAddressesSDK
22
+ from latitudesh_python_sdk.operatingsystems_sdk import OperatingSystemsSDK
23
+ from latitudesh_python_sdk.plans import Plans
24
+ from latitudesh_python_sdk.privatenetworks import PrivateNetworks
25
+ from latitudesh_python_sdk.projects_sdk import ProjectsSDK
26
+ from latitudesh_python_sdk.regions_sdk import RegionsSDK
27
+ from latitudesh_python_sdk.roles import Roles
28
+ from latitudesh_python_sdk.servers_sdk import ServersSDK
29
+ from latitudesh_python_sdk.sshkeys_sdk import SSHKeysSDK
30
+ from latitudesh_python_sdk.storage import Storage
31
+ from latitudesh_python_sdk.tags import Tags
32
+ from latitudesh_python_sdk.teams_sdk import TeamsSDK
33
+ from latitudesh_python_sdk.teamsmembers import TeamsMembers
34
+ from latitudesh_python_sdk.traffic_sdk import TrafficSDK
35
+ from latitudesh_python_sdk.userdata_sdk import UserDataSDK
36
+ from latitudesh_python_sdk.userprofile import UserProfile
37
+ from latitudesh_python_sdk.virtualmachines import VirtualMachines
38
+ from latitudesh_python_sdk.vpnsessions import VpnSessions
39
+
37
40
 
38
41
  class Latitudesh(BaseSDK):
39
42
  r"""Latitude.sh API: The Latitude.sh API is a RESTful API to manage your Latitude.sh account. It allows you to perform the same actions as the Latitude.sh dashboard."""
40
43
 
41
- api_keys: APIKeys
42
- billing: Billing
43
- events: EventsSDK
44
- firewalls: FirewallsSDK
45
- ip_addresses: IPAddressesSDK
46
- teams_members: TeamsMembers
47
- operating_systems: OperatingSystemsSDK
48
- plans: Plans
49
- projects: ProjectsSDK
50
- regions: RegionsSDK
51
- roles: Roles
52
- servers: ServersSDK
53
- ssh_keys: SSHKeys
54
- storage: Storage
55
- tags: Tags
56
- teams: TeamsSDK
57
- traffic: TrafficSDK
58
- user_data: UserDataSDK
59
- user_profile: UserProfile
60
- virtual_machines: VirtualMachines
61
- private_networks: PrivateNetworks
62
- vpn_sessions: VpnSessions
44
+ api_keys: "APIKeys"
45
+ billing: "Billing"
46
+ events: "EventsSDK"
47
+ firewalls: "FirewallsSDK"
48
+ ip_addresses: "IPAddressesSDK"
49
+ teams_members: "TeamsMembers"
50
+ operating_systems: "OperatingSystemsSDK"
51
+ plans: "Plans"
52
+ projects: "ProjectsSDK"
53
+ regions: "RegionsSDK"
54
+ roles: "Roles"
55
+ servers: "ServersSDK"
56
+ ssh_keys: "SSHKeysSDK"
57
+ storage: "Storage"
58
+ tags: "Tags"
59
+ teams: "TeamsSDK"
60
+ traffic: "TrafficSDK"
61
+ user_data: "UserDataSDK"
62
+ user_profile: "UserProfile"
63
+ virtual_machines: "VirtualMachines"
64
+ private_networks: "PrivateNetworks"
65
+ vpn_sessions: "VpnSessions"
66
+ _sub_sdk_map = {
67
+ "api_keys": ("latitudesh_python_sdk.apikeys", "APIKeys"),
68
+ "billing": ("latitudesh_python_sdk.billing", "Billing"),
69
+ "events": ("latitudesh_python_sdk.events_sdk", "EventsSDK"),
70
+ "firewalls": ("latitudesh_python_sdk.firewalls_sdk", "FirewallsSDK"),
71
+ "ip_addresses": ("latitudesh_python_sdk.ipaddresses_sdk", "IPAddressesSDK"),
72
+ "teams_members": ("latitudesh_python_sdk.teamsmembers", "TeamsMembers"),
73
+ "operating_systems": (
74
+ "latitudesh_python_sdk.operatingsystems_sdk",
75
+ "OperatingSystemsSDK",
76
+ ),
77
+ "plans": ("latitudesh_python_sdk.plans", "Plans"),
78
+ "projects": ("latitudesh_python_sdk.projects_sdk", "ProjectsSDK"),
79
+ "regions": ("latitudesh_python_sdk.regions_sdk", "RegionsSDK"),
80
+ "roles": ("latitudesh_python_sdk.roles", "Roles"),
81
+ "servers": ("latitudesh_python_sdk.servers_sdk", "ServersSDK"),
82
+ "ssh_keys": ("latitudesh_python_sdk.sshkeys_sdk", "SSHKeysSDK"),
83
+ "storage": ("latitudesh_python_sdk.storage", "Storage"),
84
+ "tags": ("latitudesh_python_sdk.tags", "Tags"),
85
+ "teams": ("latitudesh_python_sdk.teams_sdk", "TeamsSDK"),
86
+ "traffic": ("latitudesh_python_sdk.traffic_sdk", "TrafficSDK"),
87
+ "user_data": ("latitudesh_python_sdk.userdata_sdk", "UserDataSDK"),
88
+ "user_profile": ("latitudesh_python_sdk.userprofile", "UserProfile"),
89
+ "virtual_machines": (
90
+ "latitudesh_python_sdk.virtualmachines",
91
+ "VirtualMachines",
92
+ ),
93
+ "private_networks": (
94
+ "latitudesh_python_sdk.privatenetworks",
95
+ "PrivateNetworks",
96
+ ),
97
+ "vpn_sessions": ("latitudesh_python_sdk.vpnsessions", "VpnSessions"),
98
+ }
63
99
 
64
100
  def __init__(
65
101
  self,
@@ -145,6 +181,9 @@ class Latitudesh(BaseSDK):
145
181
 
146
182
  hooks = SDKHooks()
147
183
 
184
+ # pylint: disable=protected-access
185
+ self.sdk_configuration.__dict__["_hooks"] = hooks
186
+
148
187
  current_server_url, *_ = self.sdk_configuration.get_server_details()
149
188
  server_url, self.sdk_configuration.client = hooks.sdk_init(
150
189
  current_server_url, client
@@ -152,9 +191,6 @@ class Latitudesh(BaseSDK):
152
191
  if current_server_url != server_url:
153
192
  self.sdk_configuration.server_url = server_url
154
193
 
155
- # pylint: disable=protected-access
156
- self.sdk_configuration.__dict__["_hooks"] = hooks
157
-
158
194
  weakref.finalize(
159
195
  self,
160
196
  close_clients,
@@ -165,31 +201,32 @@ class Latitudesh(BaseSDK):
165
201
  self.sdk_configuration.async_client_supplied,
166
202
  )
167
203
 
168
- self._init_sdks()
169
-
170
- def _init_sdks(self):
171
- self.api_keys = APIKeys(self.sdk_configuration)
172
- self.billing = Billing(self.sdk_configuration)
173
- self.events = EventsSDK(self.sdk_configuration)
174
- self.firewalls = FirewallsSDK(self.sdk_configuration)
175
- self.ip_addresses = IPAddressesSDK(self.sdk_configuration)
176
- self.teams_members = TeamsMembers(self.sdk_configuration)
177
- self.operating_systems = OperatingSystemsSDK(self.sdk_configuration)
178
- self.plans = Plans(self.sdk_configuration)
179
- self.projects = ProjectsSDK(self.sdk_configuration)
180
- self.regions = RegionsSDK(self.sdk_configuration)
181
- self.roles = Roles(self.sdk_configuration)
182
- self.servers = ServersSDK(self.sdk_configuration)
183
- self.ssh_keys = SSHKeys(self.sdk_configuration)
184
- self.storage = Storage(self.sdk_configuration)
185
- self.tags = Tags(self.sdk_configuration)
186
- self.teams = TeamsSDK(self.sdk_configuration)
187
- self.traffic = TrafficSDK(self.sdk_configuration)
188
- self.user_data = UserDataSDK(self.sdk_configuration)
189
- self.user_profile = UserProfile(self.sdk_configuration)
190
- self.virtual_machines = VirtualMachines(self.sdk_configuration)
191
- self.private_networks = PrivateNetworks(self.sdk_configuration)
192
- self.vpn_sessions = VpnSessions(self.sdk_configuration)
204
+ def __getattr__(self, name: str):
205
+ if name in self._sub_sdk_map:
206
+ module_path, class_name = self._sub_sdk_map[name]
207
+ try:
208
+ module = importlib.import_module(module_path)
209
+ klass = getattr(module, class_name)
210
+ instance = klass(self.sdk_configuration)
211
+ setattr(self, name, instance)
212
+ return instance
213
+ except ImportError as e:
214
+ raise AttributeError(
215
+ f"Failed to import module {module_path} for attribute {name}: {e}"
216
+ ) from e
217
+ except AttributeError as e:
218
+ raise AttributeError(
219
+ f"Failed to find class {class_name} in module {module_path} for attribute {name}: {e}"
220
+ ) from e
221
+
222
+ raise AttributeError(
223
+ f"'{type(self).__name__}' object has no attribute '{name}'"
224
+ )
225
+
226
+ def __dir__(self):
227
+ default_attrs = list(super().__dir__())
228
+ lazy_attrs = list(self._sub_sdk_map.keys())
229
+ return sorted(list(set(default_attrs + lazy_attrs)))
193
230
 
194
231
  def __enter__(self):
195
232
  return self
@@ -1,6 +1,5 @@
1
1
  """Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT."""
2
2
 
3
- from ._hooks import SDKHooks
4
3
  from ._version import (
5
4
  __gen_version__,
6
5
  __openapi_doc_version__,
@@ -42,9 +41,6 @@ class SDKConfiguration:
42
41
  retry_config: OptionalNullable[RetryConfig] = Field(default_factory=lambda: UNSET)
43
42
  timeout_ms: Optional[int] = None
44
43
 
45
- def __post_init__(self):
46
- self._hooks = SDKHooks()
47
-
48
44
  def get_server_details(self) -> Tuple[str, Dict[str, str]]:
49
45
  if self.server_url is not None and self.server_url:
50
46
  return remove_suffix(self.server_url, "/"), {}
@@ -52,6 +48,3 @@ class SDKConfiguration:
52
48
  self.server_idx = 0
53
49
 
54
50
  return SERVERS[self.server_idx], self.server_defaults[self.server_idx]
55
-
56
- def get_hooks(self) -> SDKHooks:
57
- return self._hooks