clappia-api-tools 2.0.3__tar.gz → 2.0.7__tar.gz

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.
Files changed (71) hide show
  1. {clappia_api_tools-2.0.3 → clappia_api_tools-2.0.7}/PKG-INFO +1 -1
  2. clappia_api_tools-2.0.7/clappia_api_tools/__init__.py +35 -0
  3. clappia_api_tools-2.0.7/clappia_api_tools/client/__init__.py +27 -0
  4. {clappia_api_tools-2.0.3 → clappia_api_tools-2.0.7}/clappia_api_tools/client/analytics_client.py +50 -3
  5. {clappia_api_tools-2.0.3 → clappia_api_tools-2.0.7}/clappia_api_tools/client/app_definition_client.py +56 -7
  6. clappia_api_tools-2.0.7/clappia_api_tools/client/base_client.py +75 -0
  7. {clappia_api_tools-2.0.3 → clappia_api_tools-2.0.7}/clappia_api_tools/client/submission_client.py +83 -2
  8. {clappia_api_tools-2.0.3 → clappia_api_tools-2.0.7}/clappia_api_tools/client/workflow_definition_client.py +53 -3
  9. {clappia_api_tools-2.0.3 → clappia_api_tools-2.0.7}/clappia_api_tools/client/workplace_client.py +49 -2
  10. {clappia_api_tools-2.0.3 → clappia_api_tools-2.0.7}/clappia_api_tools/models/request/submission_requests.py +5 -0
  11. clappia_api_tools-2.0.7/clappia_api_tools/utils/__init__.py +4 -0
  12. {clappia_api_tools-2.0.3 → clappia_api_tools-2.0.7}/clappia_api_tools/utils/api_utils.py +96 -19
  13. {clappia_api_tools-2.0.3 → clappia_api_tools-2.0.7}/clappia_api_tools.egg-info/PKG-INFO +1 -1
  14. {clappia_api_tools-2.0.3 → clappia_api_tools-2.0.7}/pyproject.toml +1 -1
  15. clappia_api_tools-2.0.3/clappia_api_tools/__init__.py +0 -27
  16. clappia_api_tools-2.0.3/clappia_api_tools/client/__init__.py +0 -11
  17. clappia_api_tools-2.0.3/clappia_api_tools/client/base_client.py +0 -25
  18. clappia_api_tools-2.0.3/clappia_api_tools/utils/__init__.py +0 -4
  19. {clappia_api_tools-2.0.3 → clappia_api_tools-2.0.7}/LICENSE +0 -0
  20. {clappia_api_tools-2.0.3 → clappia_api_tools-2.0.7}/README.md +0 -0
  21. {clappia_api_tools-2.0.3 → clappia_api_tools-2.0.7}/clappia_api_tools/enums/__init__.py +0 -0
  22. {clappia_api_tools-2.0.3 → clappia_api_tools-2.0.7}/clappia_api_tools/enums/enums.py +0 -0
  23. {clappia_api_tools-2.0.3 → clappia_api_tools-2.0.7}/clappia_api_tools/models/__init__.py +0 -0
  24. {clappia_api_tools-2.0.3 → clappia_api_tools-2.0.7}/clappia_api_tools/models/json_serialized.py +0 -0
  25. {clappia_api_tools-2.0.3 → clappia_api_tools-2.0.7}/clappia_api_tools/models/permissions.py +0 -0
  26. {clappia_api_tools-2.0.3 → clappia_api_tools-2.0.7}/clappia_api_tools/models/request/__init__.py +0 -0
  27. {clappia_api_tools-2.0.3 → clappia_api_tools-2.0.7}/clappia_api_tools/models/request/analytics/__init__.py +0 -0
  28. {clappia_api_tools-2.0.3 → clappia_api_tools-2.0.7}/clappia_api_tools/models/request/analytics/base.py +0 -0
  29. {clappia_api_tools-2.0.3 → clappia_api_tools-2.0.7}/clappia_api_tools/models/request/analytics/chart/__init__.py +0 -0
  30. {clappia_api_tools-2.0.3 → clappia_api_tools-2.0.7}/clappia_api_tools/models/request/analytics/chart/request.py +0 -0
  31. {clappia_api_tools-2.0.3 → clappia_api_tools-2.0.7}/clappia_api_tools/models/request/analytics/model.py +0 -0
  32. {clappia_api_tools-2.0.3 → clappia_api_tools-2.0.7}/clappia_api_tools/models/request/app_definition/__init__.py +0 -0
  33. {clappia_api_tools-2.0.3 → clappia_api_tools-2.0.7}/clappia_api_tools/models/request/app_definition/app_metadata/__init__.py +0 -0
  34. {clappia_api_tools-2.0.3 → clappia_api_tools-2.0.7}/clappia_api_tools/models/request/app_definition/app_metadata/request.py +0 -0
  35. {clappia_api_tools-2.0.3 → clappia_api_tools-2.0.7}/clappia_api_tools/models/request/app_definition/base.py +0 -0
  36. {clappia_api_tools-2.0.3 → clappia_api_tools-2.0.7}/clappia_api_tools/models/request/app_definition/definition/__init__.py +0 -0
  37. {clappia_api_tools-2.0.3 → clappia_api_tools-2.0.7}/clappia_api_tools/models/request/app_definition/definition/request.py +0 -0
  38. {clappia_api_tools-2.0.3 → clappia_api_tools-2.0.7}/clappia_api_tools/models/request/app_definition/field/__init__.py +0 -0
  39. {clappia_api_tools-2.0.3 → clappia_api_tools-2.0.7}/clappia_api_tools/models/request/app_definition/field/request.py +0 -0
  40. {clappia_api_tools-2.0.3 → clappia_api_tools-2.0.7}/clappia_api_tools/models/request/app_definition/model.py +0 -0
  41. {clappia_api_tools-2.0.3 → clappia_api_tools-2.0.7}/clappia_api_tools/models/request/app_definition/page/__init__.py +0 -0
  42. {clappia_api_tools-2.0.3 → clappia_api_tools-2.0.7}/clappia_api_tools/models/request/app_definition/page/request.py +0 -0
  43. {clappia_api_tools-2.0.3 → clappia_api_tools-2.0.7}/clappia_api_tools/models/request/app_definition/section/__init__.py +0 -0
  44. {clappia_api_tools-2.0.3 → clappia_api_tools-2.0.7}/clappia_api_tools/models/request/app_definition/section/request.py +0 -0
  45. {clappia_api_tools-2.0.3 → clappia_api_tools-2.0.7}/clappia_api_tools/models/request/workflow_definition/__init__.py +0 -0
  46. {clappia_api_tools-2.0.3 → clappia_api_tools-2.0.7}/clappia_api_tools/models/request/workflow_definition/base.py +0 -0
  47. {clappia_api_tools-2.0.3 → clappia_api_tools-2.0.7}/clappia_api_tools/models/request/workflow_definition/step/__init__.py +0 -0
  48. {clappia_api_tools-2.0.3 → clappia_api_tools-2.0.7}/clappia_api_tools/models/request/workflow_definition/step/request.py +0 -0
  49. {clappia_api_tools-2.0.3 → clappia_api_tools-2.0.7}/clappia_api_tools/models/request/workplace_requests.py +0 -0
  50. {clappia_api_tools-2.0.3 → clappia_api_tools-2.0.7}/clappia_api_tools/models/response/__init__.py +0 -0
  51. {clappia_api_tools-2.0.3 → clappia_api_tools-2.0.7}/clappia_api_tools/models/response/analytics_responses.py +0 -0
  52. {clappia_api_tools-2.0.3 → clappia_api_tools-2.0.7}/clappia_api_tools/models/response/app_definition_responses.py +0 -0
  53. {clappia_api_tools-2.0.3 → clappia_api_tools-2.0.7}/clappia_api_tools/models/response/base_response.py +0 -0
  54. {clappia_api_tools-2.0.3 → clappia_api_tools-2.0.7}/clappia_api_tools/models/response/submission_responses.py +0 -0
  55. {clappia_api_tools-2.0.3 → clappia_api_tools-2.0.7}/clappia_api_tools/models/response/workflow_responses.py +0 -0
  56. {clappia_api_tools-2.0.3 → clappia_api_tools-2.0.7}/clappia_api_tools/models/response/workplace_responses.py +0 -0
  57. {clappia_api_tools-2.0.3 → clappia_api_tools-2.0.7}/clappia_api_tools/models/submission.py +0 -0
  58. {clappia_api_tools-2.0.3 → clappia_api_tools-2.0.7}/clappia_api_tools/models/workplace_user.py +0 -0
  59. {clappia_api_tools-2.0.3 → clappia_api_tools-2.0.7}/clappia_api_tools/tests/integration/__init__.py +0 -0
  60. {clappia_api_tools-2.0.3 → clappia_api_tools-2.0.7}/clappia_api_tools/tests/integration/definition/test_tools_definition.py +0 -0
  61. {clappia_api_tools-2.0.3 → clappia_api_tools-2.0.7}/clappia_api_tools/tests/integration/submission/test_tools_submission.py +0 -0
  62. {clappia_api_tools-2.0.3 → clappia_api_tools-2.0.7}/clappia_api_tools/tests/integration/workplace/test_tools_workplace.py +0 -0
  63. {clappia_api_tools-2.0.3 → clappia_api_tools-2.0.7}/clappia_api_tools/tests/unit/client/test_analytics_client.py +0 -0
  64. {clappia_api_tools-2.0.3 → clappia_api_tools-2.0.7}/clappia_api_tools/tests/unit/client/test_client.py +0 -0
  65. {clappia_api_tools-2.0.3 → clappia_api_tools-2.0.7}/clappia_api_tools/utils/logging_utils.py +0 -0
  66. {clappia_api_tools-2.0.3 → clappia_api_tools-2.0.7}/clappia_api_tools/utils/utils.py +0 -0
  67. {clappia_api_tools-2.0.3 → clappia_api_tools-2.0.7}/clappia_api_tools.egg-info/SOURCES.txt +0 -0
  68. {clappia_api_tools-2.0.3 → clappia_api_tools-2.0.7}/clappia_api_tools.egg-info/dependency_links.txt +0 -0
  69. {clappia_api_tools-2.0.3 → clappia_api_tools-2.0.7}/clappia_api_tools.egg-info/requires.txt +0 -0
  70. {clappia_api_tools-2.0.3 → clappia_api_tools-2.0.7}/clappia_api_tools.egg-info/top_level.txt +0 -0
  71. {clappia_api_tools-2.0.3 → clappia_api_tools-2.0.7}/setup.cfg +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: clappia-api-tools
3
- Version: 2.0.3
3
+ Version: 2.0.7
4
4
  Summary: Python client for Clappia API integration
5
5
  Author-email: Rishabh Verma <rishabh.v@clappia.com>
6
6
  License: MIT
@@ -0,0 +1,35 @@
1
+ """
2
+ Clappia Tools - LangChain integration for Clappia API
3
+
4
+ This package provides a unified client for interacting with Clappia APIs.
5
+ """
6
+
7
+ from .client.app_definition_client import AppDefinitionClient, AppDefinitionAPIKeyClient, AppDefinitionAuthTokenClient
8
+ from .client.submission_client import SubmissionClient, SubmissionAPIKeyClient, SubmissionAuthTokenClient
9
+ from .client.workflow_definition_client import WorkflowDefinitionClient, WorkflowDefinitionAPIKeyClient, WorkflowDefinitionAuthTokenClient
10
+ from .client.analytics_client import AnalyticsClient, AnalyticsAPIKeyClient, AnalyticsAuthTokenClient
11
+ from .client.workplace_client import WorkplaceClient, WorkplaceAPIKeyClient, WorkplaceAuthTokenClient
12
+ from .client.base_client import BaseClappiaClient
13
+
14
+
15
+ __version__ = "1.0.2"
16
+ __all__ = [
17
+ "AppDefinitionClient",
18
+ "AppDefinitionAPIKeyClient",
19
+ "AppDefinitionAuthTokenClient",
20
+ "SubmissionClient",
21
+ "SubmissionAPIKeyClient",
22
+ "SubmissionAuthTokenClient",
23
+ "WorkflowDefinitionClient",
24
+ "WorkflowDefinitionAPIKeyClient",
25
+ "WorkflowDefinitionAuthTokenClient",
26
+ "AnalyticsClient",
27
+ "WorkplaceClient",
28
+ "WorkplaceAPIKeyClient",
29
+ "WorkplaceAuthTokenClient",
30
+ "BaseClappiaClient",
31
+ ]
32
+
33
+
34
+ def __dir__():
35
+ return __all__
@@ -0,0 +1,27 @@
1
+ from .base_client import BaseClappiaClient, BaseAPIKeyClient, BaseAuthTokenClient
2
+ from .submission_client import SubmissionClient, SubmissionAPIKeyClient, SubmissionAuthTokenClient
3
+ from .app_definition_client import AppDefinitionClient, AppDefinitionAPIKeyClient, AppDefinitionAuthTokenClient
4
+ from .workflow_definition_client import WorkflowDefinitionClient, WorkflowDefinitionAPIKeyClient, WorkflowDefinitionAuthTokenClient
5
+ from .analytics_client import AnalyticsClient, AnalyticsAPIKeyClient, AnalyticsAuthTokenClient
6
+ from .workplace_client import WorkplaceClient, WorkplaceAPIKeyClient, WorkplaceAuthTokenClient
7
+
8
+ __all__ = [
9
+ "BaseClappiaClient",
10
+ "BaseAPIKeyClient",
11
+ "BaseAuthTokenClient",
12
+ "SubmissionClient",
13
+ "SubmissionAPIKeyClient",
14
+ "SubmissionAuthTokenClient",
15
+ "AppDefinitionClient",
16
+ "AppDefinitionAPIKeyClient",
17
+ "AppDefinitionAuthTokenClient",
18
+ "WorkflowDefinitionClient",
19
+ "WorkflowDefinitionAPIKeyClient",
20
+ "WorkflowDefinitionAuthTokenClient",
21
+ "AnalyticsClient",
22
+ "AnalyticsAPIKeyClient",
23
+ "AnalyticsAuthTokenClient",
24
+ "WorkplaceClient",
25
+ "WorkplaceAPIKeyClient",
26
+ "WorkplaceAuthTokenClient",
27
+ ]
@@ -1,5 +1,6 @@
1
+ from abc import ABC
1
2
  from typing import Dict, Any, Optional
2
- from .base_client import BaseClappiaClient
3
+ from .base_client import BaseClappiaClient, BaseAPIKeyClient, BaseAuthTokenClient
3
4
  from clappia_api_tools.utils.logging_utils import get_logger
4
5
  from clappia_api_tools.models.request import (
5
6
  UpsertSummaryChartDefinitionRequest,
@@ -34,8 +35,8 @@ ChartDefinitionResponseUnion = Union[
34
35
  logger = get_logger(__name__)
35
36
 
36
37
 
37
- class AnalyticsClient(BaseClappiaClient):
38
- """Client for managing Clappia analytics and charts.
38
+ class AnalyticsClient(BaseClappiaClient, ABC):
39
+ """Abstract client for managing Clappia analytics and charts.
39
40
 
40
41
  This client handles retrieving and managing analytics configurations, including
41
42
  adding charts, removing charts, updating charts, and reordering charts.
@@ -1162,3 +1163,49 @@ class AnalyticsClient(BaseClappiaClient):
1162
1163
  operation="get_charts",
1163
1164
  data=response_data,
1164
1165
  )
1166
+
1167
+
1168
+ class AnalyticsAPIKeyClient(BaseAPIKeyClient, AnalyticsClient):
1169
+ """Client for managing Clappia analytics and charts with API key authentication.
1170
+
1171
+ This client combines API key authentication with all analytics business logic.
1172
+ """
1173
+
1174
+ def __init__(
1175
+ self,
1176
+ api_key: str,
1177
+ base_url: Optional[str] = None,
1178
+ timeout: int = 30,
1179
+ ):
1180
+ """Initialize analytics client with API key.
1181
+
1182
+ Args:
1183
+ api_key: Clappia API key.
1184
+ base_url: API base URL.
1185
+ timeout: Request timeout in seconds.
1186
+ """
1187
+ BaseAPIKeyClient.__init__(self, api_key, base_url, timeout)
1188
+
1189
+
1190
+ class AnalyticsAuthTokenClient(BaseAuthTokenClient, AnalyticsClient):
1191
+ """Client for managing Clappia analytics and charts with auth token authentication.
1192
+
1193
+ This client combines auth token authentication with all analytics business logic.
1194
+ """
1195
+
1196
+ def __init__(
1197
+ self,
1198
+ auth_token: str,
1199
+ workplace_id: str,
1200
+ base_url: Optional[str] = None,
1201
+ timeout: int = 30,
1202
+ ):
1203
+ """Initialize analytics client with auth token.
1204
+
1205
+ Args:
1206
+ auth_token: Clappia Auth token.
1207
+ workplace_id: Clappia Workplace ID.
1208
+ base_url: API base URL.
1209
+ timeout: Request timeout in seconds.
1210
+ """
1211
+ BaseAuthTokenClient.__init__(self, auth_token, workplace_id, base_url, timeout)
@@ -1,5 +1,6 @@
1
1
  import json
2
- from .base_client import BaseClappiaClient
2
+ from abc import ABC
3
+ from .base_client import BaseClappiaClient, BaseAPIKeyClient, BaseAuthTokenClient
3
4
  from clappia_api_tools.utils.logging_utils import get_logger
4
5
  from typing import List, Dict, Any, Optional, Union
5
6
  from clappia_api_tools.models.request import (
@@ -120,13 +121,17 @@ FieldRequestUnion = Union[
120
121
  logger = get_logger(__name__)
121
122
 
122
123
 
123
- class AppDefinitionClient(BaseClappiaClient):
124
- """Client for managing Clappia app definitions.
124
+ class AppDefinitionClient(BaseClappiaClient, ABC):
125
+ """Abstract client for managing Clappia app definitions.
125
126
 
126
127
  This client handles retrieving and managing app definitions, including
127
128
  getting app definitions, creating apps, adding fields, and updating fields.
129
+
130
+ Note: This is an abstract base class that contains business logic but no authentication.
131
+ Use AppDefinitionAPIKeyClient or AppDefinitionAuthTokenClient for actual usage.
128
132
  """
129
133
 
134
+
130
135
  def create_app(self, request: CreateAppRequest) -> AppCreationResponse:
131
136
  """Create a new app."""
132
137
  env_valid, env_error = self.api_utils.validate_environment()
@@ -151,7 +156,7 @@ class AppDefinitionClient(BaseClappiaClient):
151
156
  success=True, message="Successfully created app", data=response_data
152
157
  )
153
158
 
154
- def get_definition(self, app_id: str, extra_headers: Optional[Dict[str, str]] = None) -> AppDefinitionResponse:
159
+ def get_definition(self, app_id: str) -> AppDefinitionResponse:
155
160
  """Retrieve the complete definition for a specific app."""
156
161
  params = {"appId": app_id}
157
162
 
@@ -159,9 +164,8 @@ class AppDefinitionClient(BaseClappiaClient):
159
164
 
160
165
  success, error_message, response_data = self.api_utils.make_request(
161
166
  method="GET",
162
- endpoint="/internal/getAppDefinition",
163
- params=params,
164
- extra_headers=extra_headers,
167
+ endpoint="/getAppDefinition",
168
+ params=params
165
169
  )
166
170
 
167
171
  if not success:
@@ -5800,4 +5804,49 @@ class AppDefinitionClient(BaseClappiaClient):
5800
5804
  operation="update_app_metadata",
5801
5805
  data=response_data,
5802
5806
  )
5807
+
5808
+ class AppDefinitionAPIKeyClient(BaseAPIKeyClient, AppDefinitionClient):
5809
+ """Client for managing Clappia app definitions with API key authentication.
5810
+ This client combines API key authentication with all app definition business logic.
5811
+ """
5812
+
5813
+ def __init__(
5814
+ self,
5815
+ api_key: str,
5816
+ base_url: Optional[str] = None,
5817
+ timeout: int = 30,
5818
+ ):
5819
+ """Initialize app definition client with API key.
5820
+
5821
+ Args:
5822
+ api_key: Clappia API key.
5823
+ base_url: API base URL.
5824
+ timeout: Request timeout in seconds.
5825
+ """
5826
+ BaseAPIKeyClient.__init__(self, api_key, base_url, timeout)
5827
+
5828
+ class AppDefinitionAuthTokenClient(BaseAuthTokenClient, AppDefinitionClient):
5829
+ """Client for managing Clappia app definitions with auth token authentication.
5830
+
5831
+ This client combines auth token authentication with all app definition business logic.
5832
+ """
5833
+
5834
+ def __init__(
5835
+ self,
5836
+ auth_token: str,
5837
+ workplace_id: str,
5838
+ base_url: Optional[str] = None,
5839
+ timeout: int = 30,
5840
+ ):
5841
+ """Initialize app definition client with auth token.
5842
+
5843
+ Args:
5844
+ auth_token: Clappia Auth token.
5845
+ workplace_id: Clappia Workplace ID.
5846
+ base_url: API base URL.
5847
+ timeout: Request timeout in seconds.
5848
+ """
5849
+ BaseAuthTokenClient.__init__(self, auth_token, workplace_id, base_url, timeout)
5850
+
5851
+
5803
5852
 
@@ -0,0 +1,75 @@
1
+ from abc import ABC
2
+ from typing import Optional
3
+ from clappia_api_tools.utils.api_utils import ClappiaAPIKeyUtils, ClappiaAuthTokenUtils
4
+
5
+
6
+ class BaseClappiaClient(ABC):
7
+ """Base client with shared functionality for all Clappia clients.
8
+
9
+ This class provides the common initialization and shared utilities
10
+ that all specialized Clappia clients will inherit from.
11
+ """
12
+
13
+ def __init__(
14
+ self,
15
+ base_url: Optional[str] = None,
16
+ timeout: int = 30,
17
+ ):
18
+ """Initialize base Clappia client.
19
+ Args:
20
+ base_url: API base URL.
21
+ timeout: Request timeout in seconds.
22
+ """
23
+ self.base_url = base_url
24
+ self.timeout = timeout
25
+
26
+ class BaseAPIKeyClient(BaseClappiaClient):
27
+ """Base client for API key authentication.
28
+
29
+ This class provides the common initialization and shared utilities
30
+ for clients that use API key authentication.
31
+ """
32
+
33
+ def __init__(
34
+ self,
35
+ api_key: Optional[str] = None,
36
+ base_url: Optional[str] = None,
37
+ timeout: int = 30,
38
+ ):
39
+ """Initialize base API key client.
40
+
41
+ Args:
42
+ api_key: Clappia API key.
43
+ base_url: API base URL.
44
+ timeout: Request timeout in seconds.
45
+ """
46
+ super().__init__(base_url, timeout)
47
+ self.api_utils = ClappiaAPIKeyUtils(api_key, base_url, timeout)
48
+
49
+
50
+ class BaseAuthTokenClient(BaseClappiaClient):
51
+ """Base client for auth token authentication.
52
+
53
+ This class provides the common initialization and shared utilities
54
+ for clients that use auth token and workplace ID authentication.
55
+ """
56
+
57
+ def __init__(
58
+ self,
59
+ auth_token: Optional[str] = None,
60
+ workplace_id: Optional[str] = None,
61
+ base_url: Optional[str] = None,
62
+ timeout: int = 30,
63
+ ):
64
+ """Initialize base auth token client.
65
+
66
+ Args:
67
+ auth_token: Clappia Auth token.
68
+ workplace_id: Clappia Workplace ID.
69
+ base_url: API base URL.
70
+ timeout: Request timeout in seconds.
71
+ """
72
+ super().__init__(base_url, timeout)
73
+ self.api_utils = ClappiaAuthTokenUtils(auth_token, workplace_id, base_url, timeout)
74
+
75
+
@@ -1,5 +1,6 @@
1
+ from abc import ABC
1
2
  from typing import Dict, Any, List, Optional
2
- from .base_client import BaseClappiaClient
3
+ from .base_client import BaseClappiaClient, BaseAPIKeyClient, BaseAuthTokenClient
3
4
  from clappia_api_tools.utils.logging_utils import get_logger
4
5
  from clappia_api_tools.models.request import (
5
6
  GetSubmissionsRequest,
@@ -27,7 +28,7 @@ from clappia_api_tools.models.response import (
27
28
  logger = get_logger(__name__)
28
29
 
29
30
 
30
- class SubmissionClient(BaseClappiaClient):
31
+ class SubmissionClient(BaseClappiaClient, ABC):
31
32
  """Client for managing Clappia submissions.
32
33
 
33
34
  This client handles retrieving and managing submissions, including
@@ -35,6 +36,7 @@ class SubmissionClient(BaseClappiaClient):
35
36
  editing submissions, updating submission status, updating submission owners.
36
37
  """
37
38
 
39
+
38
40
  def get_submissions(
39
41
  self,
40
42
  app_id: str,
@@ -43,6 +45,7 @@ class SubmissionClient(BaseClappiaClient):
43
45
  forward: bool = True,
44
46
  filters: Optional[SubmissionFilters] = None,
45
47
  last_submission_id: Optional[str] = None,
48
+ requesting_user_email_address: Optional[str] = None,
46
49
  ) -> SubmissionsResponse:
47
50
  try:
48
51
  request = GetSubmissionsRequest(
@@ -52,6 +55,7 @@ class SubmissionClient(BaseClappiaClient):
52
55
  filters=filters,
53
56
  last_submission_id=last_submission_id,
54
57
  fields=fields,
58
+ requesting_user_email_address=requesting_user_email_address,
55
59
  )
56
60
  except Exception as e:
57
61
  return SubmissionsResponse(success=False, message=str(e), app_id=app_id)
@@ -61,9 +65,11 @@ class SubmissionClient(BaseClappiaClient):
61
65
  return SubmissionsResponse(success=False, message=env_error, app_id=app_id)
62
66
 
63
67
  payload = {
68
+ "workplaceId": self.workplace_id,
64
69
  "appId": request.app_id,
65
70
  "pageSize": request.page_size,
66
71
  "forward": request.forward,
72
+ "requestingUserEmailAddress": request.requesting_user_email_address,
67
73
  }
68
74
 
69
75
  if request.filters:
@@ -104,6 +110,7 @@ class SubmissionClient(BaseClappiaClient):
104
110
  forward: bool = True,
105
111
  page_size: int = 1000,
106
112
  filters: Optional[SubmissionFilters] = None,
113
+ requesting_user_email_address: Optional[str] = None,
107
114
  ) -> SubmissionsAggregationResponse:
108
115
  try:
109
116
  request = GetSubmissionsAggregationRequest(
@@ -114,6 +121,7 @@ class SubmissionClient(BaseClappiaClient):
114
121
  forward=forward,
115
122
  page_size=page_size,
116
123
  filters=filters,
124
+ requesting_user_email_address=requesting_user_email_address,
117
125
  )
118
126
  except Exception as e:
119
127
  return SubmissionsAggregationResponse(
@@ -134,10 +142,12 @@ class SubmissionClient(BaseClappiaClient):
134
142
  )
135
143
 
136
144
  payload = {
145
+ "workplaceId": self.workplace_id,
137
146
  "appId": request.app_id,
138
147
  "forward": request.forward,
139
148
  "pageSize": request.page_size,
140
149
  "xAxisLabels": request.x_axis_labels or [],
150
+ "requestingUserEmailAddress": request.requesting_user_email_address,
141
151
  }
142
152
 
143
153
  if request.dimensions:
@@ -176,11 +186,13 @@ class SubmissionClient(BaseClappiaClient):
176
186
  self,
177
187
  app_id: str,
178
188
  data: Dict[str, Any],
189
+ requesting_user_email_address: Optional[str] = None,
179
190
  ) -> SubmissionResponse:
180
191
  try:
181
192
  request = CreateSubmissionRequest(
182
193
  app_id=app_id,
183
194
  data=data,
195
+ requesting_user_email_address=requesting_user_email_address,
184
196
  )
185
197
  except Exception as e:
186
198
  return SubmissionResponse(
@@ -208,8 +220,10 @@ class SubmissionClient(BaseClappiaClient):
208
220
  )
209
221
 
210
222
  payload = {
223
+ "workplaceId": self.workplace_id,
211
224
  "appId": request.app_id,
212
225
  "data": request.data,
226
+ "requestingUserEmailAddress": request.requesting_user_email_address,
213
227
  }
214
228
 
215
229
  logger.info(f"Creating submission for app_id: {app_id} with data: {data}")
@@ -243,12 +257,14 @@ class SubmissionClient(BaseClappiaClient):
243
257
  app_id: str,
244
258
  submission_id: str,
245
259
  data: Dict[str, Any],
260
+ requesting_user_email_address: Optional[str] = None,
246
261
  ) -> SubmissionResponse:
247
262
  try:
248
263
  request = EditSubmissionRequest(
249
264
  app_id=app_id,
250
265
  submission_id=submission_id,
251
266
  data=data,
267
+ requesting_user_email_address=requesting_user_email_address,
252
268
  )
253
269
  except Exception as e:
254
270
  return SubmissionResponse(
@@ -279,9 +295,11 @@ class SubmissionClient(BaseClappiaClient):
279
295
  )
280
296
 
281
297
  payload = {
298
+ "workplaceId": self.workplace_id,
282
299
  "appId": request.app_id,
283
300
  "submissionId": request.submission_id,
284
301
  "data": request.data,
302
+ "requestingUserEmailAddress": request.requesting_user_email_address,
285
303
  }
286
304
 
287
305
  logger.info(
@@ -317,6 +335,7 @@ class SubmissionClient(BaseClappiaClient):
317
335
  submission_id: str,
318
336
  status_name: str,
319
337
  comments: Optional[str] = None,
338
+ requesting_user_email_address: Optional[str] = None,
320
339
  ) -> SubmissionResponse:
321
340
  try:
322
341
  request = UpdateSubmissionStatusRequest(
@@ -324,6 +343,7 @@ class SubmissionClient(BaseClappiaClient):
324
343
  submission_id=submission_id,
325
344
  status_name=status_name,
326
345
  comments=comments,
346
+ requesting_user_email_address=requesting_user_email_address,
327
347
  )
328
348
  except Exception as e:
329
349
  return SubmissionResponse(
@@ -350,9 +370,11 @@ class SubmissionClient(BaseClappiaClient):
350
370
  }
351
371
 
352
372
  payload = {
373
+ "workplaceId": self.workplace_id,
353
374
  "appId": request.app_id,
354
375
  "submissionId": request.submission_id,
355
376
  "status": status,
377
+ "requestingUserEmailAddress": request.requesting_user_email_address,
356
378
  }
357
379
 
358
380
  logger.info(f"Updating status for submission {submission_id} to {status_name}")
@@ -386,6 +408,7 @@ class SubmissionClient(BaseClappiaClient):
386
408
  submission_id: str,
387
409
  email_ids: List[str],
388
410
  phone_numbers: Optional[List[str]] = None,
411
+ requesting_user_email_address: Optional[str] = None,
389
412
  ) -> SubmissionResponse:
390
413
  try:
391
414
  request = UpdateSubmissionOwnersRequest(
@@ -393,6 +416,7 @@ class SubmissionClient(BaseClappiaClient):
393
416
  submission_id=submission_id,
394
417
  email_ids=email_ids,
395
418
  phone_numbers=phone_numbers,
419
+ requesting_user_email_address=requesting_user_email_address,
396
420
  )
397
421
  except Exception as e:
398
422
  return SubmissionResponse(
@@ -414,9 +438,11 @@ class SubmissionClient(BaseClappiaClient):
414
438
  )
415
439
 
416
440
  payload = {
441
+ "workplaceId": self.workplace_id,
417
442
  "appId": request.app_id,
418
443
  "submissionId": request.submission_id,
419
444
  "emailIds": [str(email) for email in request.email_ids],
445
+ "requestingUserEmailAddress": request.requesting_user_email_address,
420
446
  }
421
447
 
422
448
  logger.info(f"Updating owners for submission {submission_id}")
@@ -472,6 +498,7 @@ class SubmissionClient(BaseClappiaClient):
472
498
  )
473
499
 
474
500
  payload = {
501
+ "workplaceId": self.workplace_id,
475
502
  "appId": request.app_id,
476
503
  "requestingUserEmailAddress": str(request.requesting_user_email_address),
477
504
  "format": request.format,
@@ -518,11 +545,13 @@ class SubmissionClient(BaseClappiaClient):
518
545
  self,
519
546
  app_id: str,
520
547
  filters: Optional[SubmissionFilters] = None,
548
+ requesting_user_email_address: Optional[str] = None,
521
549
  ) -> SubmissionsCountResponse:
522
550
  try:
523
551
  request = GetSubmissionsCountRequest(
524
552
  app_id=app_id,
525
553
  filters=filters,
554
+ requesting_user_email_address=requesting_user_email_address,
526
555
  )
527
556
  except Exception as e:
528
557
  return SubmissionsCountResponse(
@@ -536,7 +565,9 @@ class SubmissionClient(BaseClappiaClient):
536
565
  )
537
566
 
538
567
  payload = {
568
+ "workplaceId": self.workplace_id,
539
569
  "appId": request.app_id,
570
+ "requestingUserEmailAddress": request.requesting_user_email_address,
540
571
  }
541
572
 
542
573
  if request.filters:
@@ -561,3 +592,53 @@ class SubmissionClient(BaseClappiaClient):
561
592
  total_count=response_data.get("totalCount"),
562
593
  filtered_count=response_data.get("filteredCount"),
563
594
  )
595
+
596
+
597
+ class SubmissionAPIKeyClient(BaseAPIKeyClient, SubmissionClient):
598
+ """Client for managing Clappia submissions with API key authentication.
599
+
600
+ This client combines API key authentication with all submission business logic.
601
+ """
602
+
603
+ def __init__(
604
+ self,
605
+ api_key: str,
606
+ workplace_id: str,
607
+ base_url: Optional[str] = None,
608
+ timeout: int = 30,
609
+ ):
610
+ """Initialize submission client with API key.
611
+
612
+ Args:
613
+ api_key: Clappia API key.
614
+ workplace_id: Clappia Workplace ID #TODO: remove this parameter once ClappiaExternalService/v4 is live in all stages
615
+ base_url: API base URL.
616
+ timeout: Request timeout in seconds.
617
+ """
618
+ BaseAPIKeyClient.__init__(self, api_key, base_url, timeout)
619
+ self.workplace_id = workplace_id
620
+
621
+
622
+ class SubmissionAuthTokenClient(BaseAuthTokenClient, SubmissionClient):
623
+ """Client for managing Clappia submissions with auth token authentication.
624
+
625
+ This client combines auth token authentication with all submission business logic.
626
+ """
627
+
628
+ def __init__(
629
+ self,
630
+ auth_token: str,
631
+ workplace_id: str,
632
+ base_url: Optional[str] = None,
633
+ timeout: int = 30,
634
+ ):
635
+ """Initialize submission client with auth token.
636
+
637
+ Args:
638
+ auth_token: Clappia Auth token.
639
+ workplace_id: Clappia Workplace ID.
640
+ base_url: API base URL.
641
+ timeout: Request timeout in seconds.
642
+ """
643
+ BaseAuthTokenClient.__init__(self, auth_token, workplace_id, base_url, timeout)
644
+ self.workplace_id = workplace_id
@@ -1,5 +1,6 @@
1
+ from abc import ABC
1
2
  from typing import Optional, Union
2
- from .base_client import BaseClappiaClient
3
+ from .base_client import BaseClappiaClient, BaseAPIKeyClient, BaseAuthTokenClient
3
4
  from clappia_api_tools.utils.logging_utils import get_logger
4
5
 
5
6
  from clappia_api_tools.models.request import (
@@ -50,14 +51,18 @@ WorkflowStepRequestUnion = Union[
50
51
  logger = get_logger(__name__)
51
52
 
52
53
 
53
- class WorkflowDefinitionClient(BaseClappiaClient):
54
- """Client for managing Clappia workflow definitions.
54
+ class WorkflowDefinitionClient(BaseClappiaClient, ABC):
55
+ """Abstract client for managing Clappia workflow definitions.
55
56
 
56
57
  This client handles retrieving and managing workflow definitions, including
57
58
  getting workflows, adding workflow steps, removing workflow steps,
58
59
  updating workflow steps, and reordering workflow steps.
60
+
61
+ Note: This is an abstract base class that contains business logic but no authentication.
62
+ Use WorkflowDefinitionAPIKeyClient or WorkflowDefinitionAuthTokenClient for actual usage.
59
63
  """
60
64
 
65
+
61
66
  def get_workflow(self, app_id: str, trigger_type: str) -> WorkflowResponse:
62
67
  """Get a workflow definition for a specific app and trigger type"""
63
68
 
@@ -2612,3 +2617,48 @@ class WorkflowDefinitionClient(BaseClappiaClient):
2612
2617
  step_variable_name=step_variable_name,
2613
2618
  data=response_data,
2614
2619
  )
2620
+
2621
+ class WorkflowDefinitionAPIKeyClient(BaseAPIKeyClient, WorkflowDefinitionClient):
2622
+ """Client for managing Clappia workflow definitions with API key authentication.
2623
+
2624
+ This client combines API key authentication with all workflow definition business logic.
2625
+ """
2626
+
2627
+ def __init__(
2628
+ self,
2629
+ api_key: str,
2630
+ base_url: Optional[str] = None,
2631
+ timeout: int = 30,
2632
+ ):
2633
+ """Initialize workflow definition client with API key.
2634
+
2635
+ Args:
2636
+ api_key: Clappia API key.
2637
+ base_url: API base URL.
2638
+ timeout: Request timeout in seconds.
2639
+ """
2640
+ BaseAPIKeyClient.__init__(self, api_key, base_url, timeout)
2641
+
2642
+
2643
+ class WorkflowDefinitionAuthTokenClient(BaseAuthTokenClient, WorkflowDefinitionClient):
2644
+ """Client for managing Clappia workflow definitions with auth token authentication.
2645
+
2646
+ This client combines auth token authentication with all workflow definition business logic.
2647
+ """
2648
+
2649
+ def __init__(
2650
+ self,
2651
+ auth_token: str,
2652
+ workplace_id: str,
2653
+ base_url: Optional[str] = None,
2654
+ timeout: int = 30,
2655
+ ):
2656
+ """Initialize workflow definition client with auth token.
2657
+
2658
+ Args:
2659
+ auth_token: Clappia Auth token.
2660
+ workplace_id: Clappia Workplace ID.
2661
+ base_url: API base URL.
2662
+ timeout: Request timeout in seconds.
2663
+ """
2664
+ BaseAuthTokenClient.__init__(self, auth_token, workplace_id, base_url, timeout)
@@ -1,5 +1,6 @@
1
+ from abc import ABC
1
2
  from typing import Dict, Any, List, Optional
2
- from .base_client import BaseClappiaClient
3
+ from .base_client import BaseClappiaClient, BaseAPIKeyClient, BaseAuthTokenClient
3
4
  from clappia_api_tools.utils.logging_utils import get_logger
4
5
  from clappia_api_tools.models.request import (
5
6
  AddUserToWorkplaceRequest,
@@ -29,7 +30,7 @@ from clappia_api_tools.models.permissions import Permission
29
30
  logger = get_logger(__name__)
30
31
 
31
32
 
32
- class WorkplaceClient(BaseClappiaClient):
33
+ class WorkplaceClient(BaseClappiaClient, ABC):
33
34
  """Client for managing Clappia workplace users.
34
35
 
35
36
  This client handles workplace user management operations including
@@ -752,3 +753,49 @@ class WorkplaceClient(BaseClappiaClient):
752
753
  operation="get_workplace_users",
753
754
  data=response_data,
754
755
  )
756
+
757
+
758
+ class WorkplaceAPIKeyClient(BaseAPIKeyClient, WorkplaceClient):
759
+ """Client for managing Clappia workplace users with API key authentication.
760
+
761
+ This client combines API key authentication with all workplace business logic.
762
+ """
763
+
764
+ def __init__(
765
+ self,
766
+ api_key: str,
767
+ base_url: Optional[str] = None,
768
+ timeout: int = 30,
769
+ ):
770
+ """Initialize workplace client with API key.
771
+
772
+ Args:
773
+ api_key: Clappia API key.
774
+ base_url: API base URL.
775
+ timeout: Request timeout in seconds.
776
+ """
777
+ BaseAPIKeyClient.__init__(self, api_key, base_url, timeout)
778
+
779
+
780
+ class WorkplaceAuthTokenClient(BaseAuthTokenClient, WorkplaceClient):
781
+ """Client for managing Clappia workplace users with auth token authentication.
782
+
783
+ This client combines auth token authentication with all workplace business logic.
784
+ """
785
+
786
+ def __init__(
787
+ self,
788
+ auth_token: str,
789
+ workplace_id: str,
790
+ base_url: Optional[str] = None,
791
+ timeout: int = 30,
792
+ ):
793
+ """Initialize workplace client with auth token.
794
+
795
+ Args:
796
+ auth_token: Clappia Auth token.
797
+ workplace_id: Clappia Workplace ID.
798
+ base_url: API base URL.
799
+ timeout: Request timeout in seconds.
800
+ """
801
+ BaseAuthTokenClient.__init__(self, auth_token, workplace_id, base_url, timeout)
@@ -11,6 +11,11 @@ from ..submission import (
11
11
 
12
12
  class BaseSubmissionRequest(BaseModel):
13
13
  app_id: str = Field(description="App Id")
14
+ # TODO: Remove this field once ClappiaExternalService/v4 is live in all stages
15
+ requesting_user_email_address: Optional[EmailStr] = Field(
16
+ None, description="Email of requesting user"
17
+ )
18
+
14
19
 
15
20
  @field_validator("app_id")
16
21
  def validate_app_id(cls, v: str) -> str:
@@ -0,0 +1,4 @@
1
+ from .logging_utils import get_logger, set_level
2
+ from .api_utils import ClappiaAPIKeyUtils, ClappiaAuthTokenUtils
3
+
4
+ __all__ = ["get_logger", "set_level", "ClappiaAPIKeyUtils", "ClappiaAuthTokenUtils"]
@@ -1,18 +1,18 @@
1
1
  import os
2
2
  import json
3
3
  import requests
4
+ from abc import ABC, abstractmethod
4
5
  from typing import Optional, Dict, Any, Tuple
5
6
  from clappia_api_tools.utils.logging_utils import get_logger
6
7
 
7
8
  logger = get_logger(__name__)
8
9
 
9
10
 
10
- class ClappiaAPIUtils:
11
- """Utilities for Clappia API interactions"""
11
+ class ClappiaAPIUtils(ABC):
12
+ """Abstract base API utilities with common functionality for all Clappia API interactions"""
12
13
 
13
14
  def __init__(
14
15
  self,
15
- api_key: str,
16
16
  base_url: str,
17
17
  timeout: int = 30,
18
18
  ):
@@ -20,21 +20,14 @@ class ClappiaAPIUtils:
20
20
  Initialize API utilities with configurable parameters
21
21
 
22
22
  Args:
23
- api_key: Clappia API key
24
23
  base_url: API base URL
25
24
  timeout: Request timeout in seconds
26
25
  """
27
- self.api_key = api_key
28
26
  self.base_url = base_url
29
27
  self.timeout = timeout
30
28
 
31
29
  def validate_environment(self) -> Tuple[bool, str]:
32
30
  """Validate that required configuration is available"""
33
- if not self.api_key:
34
- return (
35
- False,
36
- "API key is not configured",
37
- )
38
31
  if not self.base_url:
39
32
  return (
40
33
  False,
@@ -42,11 +35,9 @@ class ClappiaAPIUtils:
42
35
  )
43
36
  return True, ""
44
37
 
45
- def get_headers(self) -> Dict[str, str]:
38
+ def get_headers(self, data: Optional[Dict[str, Any]] = None) -> Dict[str, str]:
46
39
  """Get standard headers for API requests"""
47
40
  return {
48
- "x-api-key": self.api_key,
49
- "Authorization": self.api_key,
50
41
  "Content-Type": "application/json"
51
42
  }
52
43
 
@@ -85,8 +76,7 @@ class ClappiaAPIUtils:
85
76
  method: str,
86
77
  endpoint: str,
87
78
  data: Optional[Dict[str, Any]] = None,
88
- params: Optional[Dict[str, Any]] = None,
89
- extra_headers: Optional[Dict[str, Any]] = None,
79
+ params: Optional[Dict[str, Any]] = None
90
80
  ) -> Tuple[bool, Optional[str], Optional[Dict[str, Any]]]:
91
81
  """
92
82
  Make HTTP request to Clappia API
@@ -105,12 +95,10 @@ class ClappiaAPIUtils:
105
95
  return False, f"Configuration error: {env_error}", None
106
96
 
107
97
  url = f"{self.base_url.rstrip('/')}/{endpoint.lstrip('/')}"
108
- headers = self.get_headers()
109
- if extra_headers:
110
- headers.update(extra_headers)
98
+ headers = self.get_headers(data)
111
99
 
112
100
  try:
113
- logger.info(f"Making {method} request to {url}")
101
+ logger.info(f"Making {method} request to {url}, headers: {headers}, data: {data}, params: {params}")
114
102
  if data:
115
103
  logger.debug(f"Request data: {json.dumps(data, indent=2)}")
116
104
 
@@ -134,3 +122,92 @@ class ClappiaAPIUtils:
134
122
  return False, "Connection error - unable to reach Clappia API", None
135
123
  except Exception as e:
136
124
  return False, f"Unexpected error: {str(e)}", None
125
+
126
+ class ClappiaAPIKeyUtils(ClappiaAPIUtils):
127
+ """API utilities for Clappia API key authentication"""
128
+
129
+ def __init__(
130
+ self,
131
+ api_key: str,
132
+ base_url: str,
133
+ timeout: int = 30,
134
+ ):
135
+ """
136
+ Initialize API utilities with configurable parameters
137
+
138
+ Args:
139
+ api_key: Clappia API key
140
+ base_url: API base URL
141
+ timeout: Request timeout in seconds
142
+ """
143
+ super().__init__(base_url, timeout)
144
+ self.api_key = api_key
145
+
146
+ def validate_environment(self) -> Tuple[bool, str]:
147
+ """Validate that required configuration is available"""
148
+ if not self.api_key:
149
+ return (
150
+ False,
151
+ "API key is not configured",
152
+ )
153
+ return super().validate_environment()
154
+
155
+ def get_headers(self, data: Optional[Dict[str, Any]] = None) -> Dict[str, str]:
156
+ """Get standard headers for API requests"""
157
+ headers = super().get_headers(data)
158
+ headers["x-api-key"] = self.api_key
159
+ return headers
160
+
161
+
162
+ class ClappiaAuthTokenUtils(ClappiaAPIUtils):
163
+ """API utilities for Clappia auth token authentication with workplace ID support"""
164
+
165
+ def __init__(
166
+ self,
167
+ auth_token: str,
168
+ workplace_id: str,
169
+ base_url: str,
170
+ timeout: int = 30,
171
+ ):
172
+ """
173
+ Initialize API utilities with auth token and workplace ID
174
+
175
+ Args:
176
+ auth_token: Clappia Auth token
177
+ workplace_id: Clappia Workplace ID
178
+ base_url: API base URL
179
+ timeout: Request timeout in seconds
180
+ """
181
+ super().__init__(base_url, timeout)
182
+ self.auth_token = auth_token
183
+ self.workplace_id = workplace_id
184
+
185
+ def validate_environment(self) -> Tuple[bool, str]:
186
+ """Validate that required configuration is available"""
187
+ if not self.auth_token:
188
+ return (
189
+ False,
190
+ "Auth token is not configured",
191
+ )
192
+ if not self.workplace_id:
193
+ return (
194
+ False,
195
+ "Workplace ID is not configured",
196
+ )
197
+ return super().validate_environment()
198
+
199
+ def get_headers(self, data: Optional[Dict[str, Any]] = None) -> Dict[str, str]:
200
+ """Get standard headers for API requests with auth token and optional app_id"""
201
+ headers = super().get_headers(data)
202
+ headers["Authorization"] = self.auth_token
203
+ headers["workplaceId"] = self.workplace_id
204
+
205
+ # Add appId header if present in request data or params
206
+ if params and "appId" in params:
207
+ headers["appId"] = params["appId"]
208
+ elif data and "appId" in data:
209
+ headers["appId"] = data["appId"]
210
+
211
+ return headers
212
+
213
+
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: clappia-api-tools
3
- Version: 2.0.3
3
+ Version: 2.0.7
4
4
  Summary: Python client for Clappia API integration
5
5
  Author-email: Rishabh Verma <rishabh.v@clappia.com>
6
6
  License: MIT
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "clappia-api-tools"
7
- version = "2.0.3"
7
+ version = "2.0.7"
8
8
  description = "Python client for Clappia API integration"
9
9
  readme = "README.md"
10
10
  requires-python = ">=3.10"
@@ -1,27 +0,0 @@
1
- """
2
- Clappia Tools - LangChain integration for Clappia API
3
-
4
- This package provides a unified client for interacting with Clappia APIs.
5
- """
6
-
7
- from .client.app_definition_client import AppDefinitionClient
8
- from .client.submission_client import SubmissionClient
9
- from .client.workflow_definition_client import WorkflowDefinitionClient
10
- from .client.analytics_client import AnalyticsClient
11
- from .client.workplace_client import WorkplaceClient
12
- from .client.base_client import BaseClappiaClient
13
-
14
-
15
- __version__ = "1.0.2"
16
- __all__ = [
17
- "AppDefinitionClient",
18
- "SubmissionClient",
19
- "WorkflowDefinitionClient",
20
- "AnalyticsClient",
21
- "WorkplaceClient",
22
- "BaseClappiaClient",
23
- ]
24
-
25
-
26
- def __dir__():
27
- return __all__
@@ -1,11 +0,0 @@
1
- from .base_client import BaseClappiaClient
2
- from .submission_client import SubmissionClient
3
- from .app_definition_client import AppDefinitionClient
4
- from .workplace_client import WorkplaceClient
5
-
6
- __all__ = [
7
- "BaseClappiaClient",
8
- "SubmissionClient",
9
- "AppDefinitionClient",
10
- "WorkplaceClient",
11
- ]
@@ -1,25 +0,0 @@
1
- from typing import Optional
2
- from clappia_api_tools.utils.api_utils import ClappiaAPIUtils
3
-
4
-
5
- class BaseClappiaClient:
6
- """Base client with shared functionality for all Clappia clients.
7
-
8
- This class provides the common initialization and shared utilities
9
- that all specialized Clappia clients will inherit from.
10
- """
11
-
12
- def __init__(
13
- self,
14
- api_key: Optional[str] = None,
15
- base_url: Optional[str] = None,
16
- timeout: int = 30,
17
- ):
18
- """Initialize base Clappia client.
19
-
20
- Args:
21
- api_key: Clappia API key.
22
- base_url: API base URL.
23
- timeout: Request timeout in seconds.
24
- """
25
- self.api_utils = ClappiaAPIUtils(api_key, base_url, timeout)
@@ -1,4 +0,0 @@
1
- from .logging_utils import get_logger, set_level
2
- from .api_utils import ClappiaAPIUtils
3
-
4
- __all__ = ["get_logger", "set_level", "ClappiaAPIUtils"]