kinde-python-sdk 2.0.5__py3-none-any.whl → 2.0.7__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.
@@ -8,6 +8,7 @@ from dotenv import load_dotenv
8
8
  import logging
9
9
  from kinde_sdk.auth.oauth import OAuth
10
10
  from kinde_sdk.auth import claims, feature_flags, permissions, tokens
11
+ from kinde_sdk.management import ManagementClient;
11
12
 
12
13
  logger = logging.getLogger(__name__)
13
14
 
@@ -38,6 +39,35 @@ async def home(request: Request):
38
39
  """
39
40
  if kinde_oauth.is_authenticated():
40
41
  user = kinde_oauth.get_user_info()
42
+
43
+ # Validate environment variables
44
+ domain = os.getenv("KINDE_DOMAIN")
45
+ client_id = os.getenv("KINDE_MANAGEMENT_CLIENT_ID")
46
+ client_secret = os.getenv("KINDE_MANAGEMENT_CLIENT_SECRET")
47
+
48
+ if not all([domain, client_id, client_secret]):
49
+ return """
50
+ <html>
51
+ <body>
52
+ <h1>Configuration Error</h1>
53
+ <p>Missing required environment variables for management client.</p>
54
+ <a href="/logout">Logout</a>
55
+ </body>
56
+ </html>
57
+ """
58
+
59
+ management_client = ManagementClient(
60
+ domain=domain,
61
+ client_id=client_id,
62
+ client_secret=client_secret
63
+ )
64
+ try:
65
+ api_response = management_client.get_users()
66
+ user_count = len(api_response.users) if hasattr(api_response, 'users') else 0
67
+ except Exception as e:
68
+ logger.error(f"Failed to fetch users: {e}")
69
+ user_count = 0
70
+
41
71
  return f"""
42
72
  <html>
43
73
  <body>
@@ -46,6 +76,7 @@ async def home(request: Request):
46
76
  <p>feature flags: {await feature_flags.get_all_flags()}</p>
47
77
  <p>permissions: {await permissions.get_permissions()}</p>
48
78
  <p>tokens: {tokens.get_token_manager().get_access_token()}</p>
79
+ <p>users: {user_count} user(s) found</p>
49
80
  <p>You are logged in.</p>
50
81
  <a href="/logout">Logout</a>
51
82
  </body>
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: kinde-python-sdk
3
- Version: 2.0.5
3
+ Version: 2.0.7
4
4
  Summary: Connect your app to the Kinde platform
5
5
  Author-email: Kinde Engineering <engineering@kinde.com>
6
6
  Project-URL: Homepage, https://github.com/kinde-oss/kinde-python-sdk
@@ -1,5 +1,5 @@
1
1
  kinde_fastapi/__init__.py,sha256=FzB0zDBbzaLLvGZBPrBZN94I6LRZdkT4RSmGUsbh3mA,470
2
- kinde_fastapi/examples/example_app.py,sha256=FmqAhAxkLLEFxNBsRx1eVhGADRskXCZtHc76WwoDsS4,1919
2
+ kinde_fastapi/examples/example_app.py,sha256=OVJDFKzT3Qv_tA4GgizW2DmjoE0hm_9O4H_DKIGYNeQ,3057
3
3
  kinde_fastapi/examples/session.py,sha256=WblGM7TM2JCKdSFsd2OmSP0daexZ7E6ZS1xgTQY_etY,2472
4
4
  kinde_fastapi/framework/__init__.py,sha256=tpTI84q7HCHMlREslMrngIlKwC8CDog9bEMI_ydhCUs,181
5
5
  kinde_fastapi/framework/fastapi_framework.py,sha256=-MiBFddfY3NiB9BE_b8BBYAxfGbhOQKO-RXUsCu4a3U,6767
@@ -13,7 +13,7 @@ kinde_flask/framework/flask_framework.py,sha256=I4dVWmkyd0FBqjAkOyftebm7_qpI9uxk
13
13
  kinde_flask/framework/flask_framework_factory.py,sha256=ALpsj-cHBox3ktRxi-CyZ5Q6EOvacfdu4pvlTYkuviA,802
14
14
  kinde_flask/middleware/framework_middleware.py,sha256=XFK6kgMDuHkrawDJ0_MMgLO7es0YQVjlVDDRDgwlCJ0,1012
15
15
  kinde_flask/storage/flask_storage_factory.py,sha256=MitOUbfCbfvSQFFoUbbnbXLEOL_qajS29Mlsn0TyTsY,2562
16
- kinde_python_sdk-2.0.5.dist-info/licenses/LICENSE,sha256=iT6AIO6NJn_mo0kDD5mpz2zp9GpzH6YdhqOmkCBg-kQ,1385
16
+ kinde_python_sdk-2.0.7.dist-info/licenses/LICENSE,sha256=iT6AIO6NJn_mo0kDD5mpz2zp9GpzH6YdhqOmkCBg-kQ,1385
17
17
  kinde_sdk/__init__.py,sha256=Mh3eVcnJDk-KdQfxVUsF19NgBYexoJCwG5iAbD1LEdQ,1052
18
18
  kinde_sdk/api_client.py,sha256=GEb1BIjvIrUe8mFIr7hppp2PO604BiSlAr0_TYBfuy4,58496
19
19
  kinde_sdk/configuration.py,sha256=oqZGvKEf4kNNURbI1pip2ZVVcDyRTSmmnjXWziH4s80,15765
@@ -140,7 +140,7 @@ kinde_sdk/management/api_client.py,sha256=EOtJwSwec5DpyJ0_Hv8wqb0ZnEPMJDvbMx5dkp
140
140
  kinde_sdk/management/api_response.py,sha256=eMxw1mpmJcoGZ3gs9z6jM4oYoZ10Gjk333s9sKxGv7s,652
141
141
  kinde_sdk/management/configuration.py,sha256=icAfQBYmokmspDa_ELha2Qfeq_IkgAp6COdmw1ZpL2Q,18909
142
142
  kinde_sdk/management/exceptions.py,sha256=I_xzvCXjHszPUrUr4dNsE9Pg-nH58YszF075NvjSRMA,6780
143
- kinde_sdk/management/management_client.py,sha256=gjUIyw0jedoKGyLeFNFcWFEjn9fVW-VzV9OJH-t-LFU,19099
143
+ kinde_sdk/management/management_client.py,sha256=_GErLV96nTbWw58fscCrDe_UOVk25u4Vlx0amFp3g6Y,31467
144
144
  kinde_sdk/management/management_token_manager.py,sha256=uEYQBiN5mNqZujTSYcU2sl2Sk51YwSe9_b-XkDq4uAI,9853
145
145
  kinde_sdk/management/rest.py,sha256=7kMCS7NAOYCI4hrThABWpV-AN0Y-LuCjMnJ404CJdq8,9783
146
146
  kinde_sdk/management/schemas.py,sha256=6tg1tEh8IL-9UuZiWFVe-0Pu-TD-CYW37soeQ6AyspA,97671
@@ -722,7 +722,7 @@ kinde_sdk/test/test_models/test_user_profile_v2.py,sha256=QzYjvjtTGa1ktE5ruyGBm_
722
722
  kinde_sdk/test/test_models/test_users.py,sha256=wJQR5K7dsfHQQsOQp4mrHWQynFPHwL-gDtbgVifNfMs,537
723
723
  kinde_sdk/test/test_models/test_users_response.py,sha256=BCcKxe9GctDrOXOzw0Q7O1ijKy_93Oj3E2wHW00y624,869
724
724
  kinde_sdk/test/test_models/test_webhook.py,sha256=KNfR8sKAK5H2vX_cXYGT5EfgaVP7_egC39uY6-s-4qo,544
725
- kinde_python_sdk-2.0.5.dist-info/METADATA,sha256=hfh8vBYUX8OZzHjJux5hGqfUG-HgXzn8owhlAL1LG8E,23482
726
- kinde_python_sdk-2.0.5.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
727
- kinde_python_sdk-2.0.5.dist-info/top_level.txt,sha256=TUU3EVjV6O4brF-mooQr6pnTk-jXJphmIWRHCIdyIgI,36
728
- kinde_python_sdk-2.0.5.dist-info/RECORD,,
725
+ kinde_python_sdk-2.0.7.dist-info/METADATA,sha256=hfaFwDNTTOdeJhG8N1f_T2cwvtq9UP_5pee2R_VZXvw,23482
726
+ kinde_python_sdk-2.0.7.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
727
+ kinde_python_sdk-2.0.7.dist-info/top_level.txt,sha256=TUU3EVjV6O4brF-mooQr6pnTk-jXJphmIWRHCIdyIgI,36
728
+ kinde_python_sdk-2.0.7.dist-info/RECORD,,
@@ -43,6 +43,28 @@ class ManagementClient:
43
43
  'delete': ('DELETE', '/api/v1/organizations/{org_code}'),
44
44
  },
45
45
 
46
+ # Organization Users API
47
+ 'organization_users': {
48
+ 'list': ('GET', '/api/v1/organizations/{org_code}/users'),
49
+ 'add': ('POST', '/api/v1/organizations/{org_code}/users'),
50
+ 'update': ('PATCH', '/api/v1/organizations/{org_code}/users'),
51
+ 'remove': ('DELETE', '/api/v1/organizations/{org_code}/users/{user_id}'),
52
+ },
53
+
54
+ # Organization User Roles API
55
+ 'organization_user_roles': {
56
+ 'list': ('GET', '/api/v1/organizations/{org_code}/users/{user_id}/roles'),
57
+ 'add': ('POST', '/api/v1/organizations/{org_code}/users/{user_id}/roles'),
58
+ 'remove': ('DELETE', '/api/v1/organizations/{org_code}/users/{user_id}/roles/{role_id}'),
59
+ },
60
+
61
+ # Organization User Permissions API
62
+ 'organization_user_permissions': {
63
+ 'list': ('GET', '/api/v1/organizations/{org_code}/users/{user_id}/permissions'),
64
+ 'add': ('POST', '/api/v1/organizations/{org_code}/users/{user_id}/permissions'),
65
+ 'remove': ('DELETE', '/api/v1/organizations/{org_code}/users/{user_id}/permissions/{permission_id}'),
66
+ },
67
+
46
68
  # Roles API
47
69
  'roles': {
48
70
  'list': ('GET', '/api/v1/roles'),
@@ -103,6 +125,94 @@ class ManagementClient:
103
125
  'industries': {
104
126
  'list': ('GET', '/api/v1/industries'),
105
127
  },
128
+
129
+ # Properties API
130
+ 'properties': {
131
+ 'list': ('GET', '/api/v1/properties'),
132
+ 'get': ('GET', '/api/v1/properties/{property_id}'),
133
+ 'create': ('POST', '/api/v1/properties'),
134
+ 'update': ('PATCH', '/api/v1/properties/{property_id}'),
135
+ 'delete': ('DELETE', '/api/v1/properties/{property_id}'),
136
+ },
137
+
138
+ # User Properties API
139
+ 'user_properties': {
140
+ 'list': ('GET', '/api/v1/users/{user_id}/properties'),
141
+ 'get': ('GET', '/api/v1/users/{user_id}/properties/{property_key}'),
142
+ 'update': ('PUT', '/api/v1/users/{user_id}/properties/{property_key}'),
143
+ },
144
+
145
+ # Organization Properties API
146
+ 'organization_properties': {
147
+ 'list': ('GET', '/api/v1/organizations/{org_code}/properties'),
148
+ 'get': ('GET', '/api/v1/organizations/{org_code}/properties/{property_key}'),
149
+ 'update': ('PUT', '/api/v1/organizations/{org_code}/properties/{property_key}'),
150
+ },
151
+
152
+ # Webhooks API
153
+ 'webhooks': {
154
+ 'list': ('GET', '/api/v1/webhooks'),
155
+ 'get': ('GET', '/api/v1/webhooks/{webhook_id}'),
156
+ 'create': ('POST', '/api/v1/webhooks'),
157
+ 'update': ('PATCH', '/api/v1/webhooks/{webhook_id}'),
158
+ 'delete': ('DELETE', '/api/v1/webhooks/{webhook_id}'),
159
+ },
160
+
161
+ # Events API
162
+ 'events': {
163
+ 'get': ('GET', '/api/v1/events/{event_id}'),
164
+ },
165
+
166
+ # Event Types API
167
+ 'event_types': {
168
+ 'list': ('GET', '/api/v1/event_types'),
169
+ },
170
+
171
+ # Connections API
172
+ 'connections': {
173
+ 'list': ('GET', '/api/v1/connections'),
174
+ 'get': ('GET', '/api/v1/connections/{connection_id}'),
175
+ 'create': ('POST', '/api/v1/connections'),
176
+ 'update': ('PATCH', '/api/v1/connections/{connection_id}'),
177
+ 'delete': ('DELETE', '/api/v1/connections/{connection_id}'),
178
+ },
179
+
180
+ # Business API
181
+ 'business': {
182
+ 'get': ('GET', '/api/v1/business'),
183
+ },
184
+
185
+ # Environment Feature Flags API
186
+ 'environment_feature_flags': {
187
+ 'list': ('GET', '/api/v1/environment/feature_flags'),
188
+ 'get': ('GET', '/api/v1/environment/feature_flags/{feature_flag_key}'),
189
+ 'update': ('PATCH', '/api/v1/environment/feature_flags/{feature_flag_key}'),
190
+ 'delete': ('DELETE', '/api/v1/environment/feature_flags/{feature_flag_key}'),
191
+ },
192
+
193
+ # Organization Feature Flags API
194
+ 'organization_feature_flags': {
195
+ 'list': ('GET', '/api/v1/organizations/{org_code}/feature_flags'),
196
+ 'get': ('GET', '/api/v1/organizations/{org_code}/feature_flags/{feature_flag_key}'),
197
+ 'update': ('PATCH', '/api/v1/organizations/{org_code}/feature_flags/{feature_flag_key}'),
198
+ 'delete': ('DELETE', '/api/v1/organizations/{org_code}/feature_flags/{feature_flag_key}'),
199
+ },
200
+
201
+ # User Feature Flags API
202
+ 'user_feature_flags': {
203
+ 'get': ('GET', '/api/v1/users/{user_id}/feature_flags/{feature_flag_key}'),
204
+ 'update': ('PATCH', '/api/v1/users/{user_id}/feature_flags/{feature_flag_key}'),
205
+ },
206
+
207
+ # User Password API
208
+ 'user_password': {
209
+ 'update': ('PUT', '/api/v1/users/{user_id}/password'),
210
+ },
211
+
212
+ # User Refresh Claims API
213
+ 'user_refresh_claims': {
214
+ 'refresh': ('POST', '/api/v1/users/{user_id}/refresh_claims'),
215
+ },
106
216
  }
107
217
 
108
218
  # Define response types for each endpoint
@@ -121,6 +231,22 @@ class ManagementClient:
121
231
  'update': {'200': 'SuccessResponse', '400': 'ErrorResponse', '403': 'ErrorResponse', '404': 'ErrorResponse', '429': 'ErrorResponse'},
122
232
  'delete': {'200': 'SuccessResponse', '400': 'ErrorResponse', '403': 'ErrorResponse', '404': 'ErrorResponse', '429': 'ErrorResponse'},
123
233
  },
234
+ 'organization_users': {
235
+ 'list': {'200': 'GetOrganizationUsersResponse', '400': 'ErrorResponse', '403': 'ErrorResponse', '429': 'ErrorResponse'},
236
+ 'add': {'201': 'AddOrganizationUsersResponse', '400': 'ErrorResponse', '403': 'ErrorResponse', '429': 'ErrorResponse'},
237
+ 'update': {'200': 'UpdateOrganizationUsersResponse', '400': 'ErrorResponse', '403': 'ErrorResponse', '429': 'ErrorResponse'},
238
+ 'remove': {'200': 'SuccessResponse', '400': 'ErrorResponse', '403': 'ErrorResponse', '404': 'ErrorResponse', '429': 'ErrorResponse'},
239
+ },
240
+ 'organization_user_roles': {
241
+ 'list': {'200': 'GetOrganizationsUserRolesResponse', '400': 'ErrorResponse', '403': 'ErrorResponse', '429': 'ErrorResponse'},
242
+ 'add': {'201': 'SuccessResponse', '400': 'ErrorResponse', '403': 'ErrorResponse', '429': 'ErrorResponse'},
243
+ 'remove': {'200': 'SuccessResponse', '400': 'ErrorResponse', '403': 'ErrorResponse', '404': 'ErrorResponse', '429': 'ErrorResponse'},
244
+ },
245
+ 'organization_user_permissions': {
246
+ 'list': {'200': 'GetOrganizationsUserPermissionsResponse', '400': 'ErrorResponse', '403': 'ErrorResponse', '429': 'ErrorResponse'},
247
+ 'add': {'201': 'SuccessResponse', '400': 'ErrorResponse', '403': 'ErrorResponse', '429': 'ErrorResponse'},
248
+ 'remove': {'200': 'SuccessResponse', '400': 'ErrorResponse', '403': 'ErrorResponse', '404': 'ErrorResponse', '429': 'ErrorResponse'},
249
+ },
124
250
  'roles': {
125
251
  'list': {'200': 'GetRolesResponse', '400': 'ErrorResponse', '403': 'ErrorResponse', '429': 'ErrorResponse'},
126
252
  'get': {'200': 'GetRoleResponse', '400': 'ErrorResponse', '403': 'ErrorResponse', '404': 'ErrorResponse', '429': 'ErrorResponse'},
@@ -166,6 +292,68 @@ class ManagementClient:
166
292
  'industries': {
167
293
  'list': {'200': 'GetIndustriesResponse', '400': 'ErrorResponse', '403': 'ErrorResponse', '429': 'ErrorResponse'},
168
294
  },
295
+ 'properties': {
296
+ 'list': {'200': 'GetPropertiesResponse', '400': 'ErrorResponse', '403': 'ErrorResponse', '429': 'ErrorResponse'},
297
+ 'get': {'200': 'GetPropertyResponse', '400': 'ErrorResponse', '403': 'ErrorResponse', '404': 'ErrorResponse', '429': 'ErrorResponse'},
298
+ 'create': {'201': 'CreatePropertyResponse', '400': 'ErrorResponse', '403': 'ErrorResponse', '429': 'ErrorResponse'},
299
+ 'update': {'200': 'SuccessResponse', '400': 'ErrorResponse', '403': 'ErrorResponse', '404': 'ErrorResponse', '429': 'ErrorResponse'},
300
+ 'delete': {'200': 'SuccessResponse', '400': 'ErrorResponse', '403': 'ErrorResponse', '404': 'ErrorResponse', '429': 'ErrorResponse'},
301
+ },
302
+ 'user_properties': {
303
+ 'list': {'200': 'GetUserPropertiesResponse', '400': 'ErrorResponse', '403': 'ErrorResponse', '429': 'ErrorResponse'},
304
+ 'get': {'200': 'GetUserPropertyResponse', '400': 'ErrorResponse', '403': 'ErrorResponse', '404': 'ErrorResponse', '429': 'ErrorResponse'},
305
+ 'update': {'200': 'SuccessResponse', '400': 'ErrorResponse', '403': 'ErrorResponse', '404': 'ErrorResponse', '429': 'ErrorResponse'},
306
+ },
307
+ 'organization_properties': {
308
+ 'list': {'200': 'GetOrganizationPropertiesResponse', '400': 'ErrorResponse', '403': 'ErrorResponse', '429': 'ErrorResponse'},
309
+ 'get': {'200': 'GetOrganizationPropertyResponse', '400': 'ErrorResponse', '403': 'ErrorResponse', '404': 'ErrorResponse', '429': 'ErrorResponse'},
310
+ 'update': {'200': 'SuccessResponse', '400': 'ErrorResponse', '403': 'ErrorResponse', '404': 'ErrorResponse', '429': 'ErrorResponse'},
311
+ },
312
+ 'webhooks': {
313
+ 'list': {'200': 'GetWebhooksResponse', '400': 'ErrorResponse', '403': 'ErrorResponse', '429': 'ErrorResponse'},
314
+ 'get': {'200': 'GetWebhookResponse', '400': 'ErrorResponse', '403': 'ErrorResponse', '404': 'ErrorResponse', '429': 'ErrorResponse'},
315
+ 'create': {'201': 'CreateWebhookResponse', '400': 'ErrorResponse', '403': 'ErrorResponse', '429': 'ErrorResponse'},
316
+ 'update': {'200': 'SuccessResponse', '400': 'ErrorResponse', '403': 'ErrorResponse', '404': 'ErrorResponse', '429': 'ErrorResponse'},
317
+ 'delete': {'200': 'SuccessResponse', '400': 'ErrorResponse', '403': 'ErrorResponse', '404': 'ErrorResponse', '429': 'ErrorResponse'},
318
+ },
319
+ 'events': {
320
+ 'get': {'200': 'GetEventResponse', '400': 'ErrorResponse', '403': 'ErrorResponse', '404': 'ErrorResponse', '429': 'ErrorResponse'},
321
+ },
322
+ 'event_types': {
323
+ 'list': {'200': 'GetEventTypesResponse', '400': 'ErrorResponse', '403': 'ErrorResponse', '429': 'ErrorResponse'},
324
+ },
325
+ 'connections': {
326
+ 'list': {'200': 'GetConnectionsResponse', '400': 'ErrorResponse', '403': 'ErrorResponse', '429': 'ErrorResponse'},
327
+ 'get': {'200': 'GetConnectionResponse', '400': 'ErrorResponse', '403': 'ErrorResponse', '404': 'ErrorResponse', '429': 'ErrorResponse'},
328
+ 'create': {'201': 'CreateConnectionResponse', '400': 'ErrorResponse', '403': 'ErrorResponse', '429': 'ErrorResponse'},
329
+ 'update': {'200': 'SuccessResponse', '400': 'ErrorResponse', '403': 'ErrorResponse', '404': 'ErrorResponse', '429': 'ErrorResponse'},
330
+ 'delete': {'200': 'SuccessResponse', '400': 'ErrorResponse', '403': 'ErrorResponse', '404': 'ErrorResponse', '429': 'ErrorResponse'},
331
+ },
332
+ 'business': {
333
+ 'get': {'200': 'GetBusinessResponse', '400': 'ErrorResponse', '403': 'ErrorResponse', '429': 'ErrorResponse'},
334
+ },
335
+ 'environment_feature_flags': {
336
+ 'list': {'200': 'GetEnvironmentFeatureFlagsResponse', '400': 'ErrorResponse', '403': 'ErrorResponse', '429': 'ErrorResponse'},
337
+ 'get': {'200': 'GetEnvironmentFeatureFlagsResponseDataFeatureFlagsInner', '400': 'ErrorResponse', '403': 'ErrorResponse', '404': 'ErrorResponse', '429': 'ErrorResponse'},
338
+ 'update': {'200': 'SuccessResponse', '400': 'ErrorResponse', '403': 'ErrorResponse', '404': 'ErrorResponse', '429': 'ErrorResponse'},
339
+ 'delete': {'200': 'SuccessResponse', '400': 'ErrorResponse', '403': 'ErrorResponse', '404': 'ErrorResponse', '429': 'ErrorResponse'},
340
+ },
341
+ 'organization_feature_flags': {
342
+ 'list': {'200': 'GetOrganizationFeatureFlagsResponse', '400': 'ErrorResponse', '403': 'ErrorResponse', '429': 'ErrorResponse'},
343
+ 'get': {'200': 'GetOrganizationFeatureFlagsResponseDataFeatureFlagsInner', '400': 'ErrorResponse', '403': 'ErrorResponse', '404': 'ErrorResponse', '429': 'ErrorResponse'},
344
+ 'update': {'200': 'SuccessResponse', '400': 'ErrorResponse', '403': 'ErrorResponse', '404': 'ErrorResponse', '429': 'ErrorResponse'},
345
+ 'delete': {'200': 'SuccessResponse', '400': 'ErrorResponse', '403': 'ErrorResponse', '404': 'ErrorResponse', '429': 'ErrorResponse'},
346
+ },
347
+ 'user_feature_flags': {
348
+ 'get': {'200': 'GetUserFeatureFlagsResponse', '400': 'ErrorResponse', '403': 'ErrorResponse', '404': 'ErrorResponse', '429': 'ErrorResponse'},
349
+ 'update': {'200': 'SuccessResponse', '400': 'ErrorResponse', '403': 'ErrorResponse', '404': 'ErrorResponse', '429': 'ErrorResponse'},
350
+ },
351
+ 'user_password': {
352
+ 'update': {'200': 'SuccessResponse', '400': 'ErrorResponse', '403': 'ErrorResponse', '404': 'ErrorResponse', '429': 'ErrorResponse'},
353
+ },
354
+ 'user_refresh_claims': {
355
+ 'refresh': {'200': 'SuccessResponse', '400': 'ErrorResponse', '403': 'ErrorResponse', '404': 'ErrorResponse', '429': 'ErrorResponse'},
356
+ },
169
357
  }
170
358
 
171
359
  def __init__(self, domain: str, client_id: str, client_secret: str):
@@ -199,7 +387,11 @@ class ManagementClient:
199
387
  def _generate_methods(self):
200
388
  """Generate dynamic methods for each API endpoint."""
201
389
  for resource, endpoints in self.API_ENDPOINTS.items():
202
- resource_singular = resource[:-1] if resource.endswith('s') else resource
390
+ # Handle special cases for singularization
391
+ if resource == 'business':
392
+ resource_singular = 'business' # Don't remove 's' from 'business'
393
+ else:
394
+ resource_singular = resource[:-1] if resource.endswith('s') else resource
203
395
 
204
396
  for action, (method, path) in endpoints.items():
205
397
  # Create method name based on action and resource
@@ -229,7 +421,11 @@ class ManagementClient:
229
421
  Returns:
230
422
  A callable method that makes the API request
231
423
  """
232
- resource_singular = resource[:-1] if resource.endswith('s') else resource
424
+ # Handle special cases for singularization
425
+ if resource == 'business':
426
+ resource_singular = 'business' # Don't remove 's' from 'business'
427
+ else:
428
+ resource_singular = resource[:-1] if resource.endswith('s') else resource
233
429
 
234
430
  def api_method(*args, **kwargs) -> Dict[str, Any]:
235
431
  # Format path with any path parameters from args