codemie-sdk-python 0.1.603__tar.gz → 0.1.604__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 (72) hide show
  1. {codemie_sdk_python-0.1.603 → codemie_sdk_python-0.1.604}/PKG-INFO +1 -1
  2. {codemie_sdk_python-0.1.603 → codemie_sdk_python-0.1.604}/pyproject.toml +1 -1
  3. {codemie_sdk_python-0.1.603 → codemie_sdk_python-0.1.604}/src/codemie_sdk/client/client.py +4 -0
  4. codemie_sdk_python-0.1.604/src/codemie_sdk/services/project_budget_groups.py +158 -0
  5. {codemie_sdk_python-0.1.603 → codemie_sdk_python-0.1.604}/README.md +0 -0
  6. {codemie_sdk_python-0.1.603 → codemie_sdk_python-0.1.604}/src/codemie_sdk/__init__.py +0 -0
  7. {codemie_sdk_python-0.1.603 → codemie_sdk_python-0.1.604}/src/codemie_sdk/auth/__init__.py +0 -0
  8. {codemie_sdk_python-0.1.603 → codemie_sdk_python-0.1.604}/src/codemie_sdk/auth/credentials.py +0 -0
  9. {codemie_sdk_python-0.1.603 → codemie_sdk_python-0.1.604}/src/codemie_sdk/client/__init__.py +0 -0
  10. {codemie_sdk_python-0.1.603 → codemie_sdk_python-0.1.604}/src/codemie_sdk/exceptions.py +0 -0
  11. {codemie_sdk_python-0.1.603 → codemie_sdk_python-0.1.604}/src/codemie_sdk/models/__init__.py +0 -0
  12. {codemie_sdk_python-0.1.603 → codemie_sdk_python-0.1.604}/src/codemie_sdk/models/activity_event.py +0 -0
  13. {codemie_sdk_python-0.1.603 → codemie_sdk_python-0.1.604}/src/codemie_sdk/models/admin.py +0 -0
  14. {codemie_sdk_python-0.1.603 → codemie_sdk_python-0.1.604}/src/codemie_sdk/models/analytics.py +0 -0
  15. {codemie_sdk_python-0.1.603 → codemie_sdk_python-0.1.604}/src/codemie_sdk/models/assistant.py +0 -0
  16. {codemie_sdk_python-0.1.603 → codemie_sdk_python-0.1.604}/src/codemie_sdk/models/categories.py +0 -0
  17. {codemie_sdk_python-0.1.603 → codemie_sdk_python-0.1.604}/src/codemie_sdk/models/common.py +0 -0
  18. {codemie_sdk_python-0.1.603 → codemie_sdk_python-0.1.604}/src/codemie_sdk/models/conversation.py +0 -0
  19. {codemie_sdk_python-0.1.603 → codemie_sdk_python-0.1.604}/src/codemie_sdk/models/cost_center.py +0 -0
  20. {codemie_sdk_python-0.1.603 → codemie_sdk_python-0.1.604}/src/codemie_sdk/models/datasource.py +0 -0
  21. {codemie_sdk_python-0.1.603 → codemie_sdk_python-0.1.604}/src/codemie_sdk/models/errors.py +0 -0
  22. {codemie_sdk_python-0.1.603 → codemie_sdk_python-0.1.604}/src/codemie_sdk/models/file_operation.py +0 -0
  23. {codemie_sdk_python-0.1.603 → codemie_sdk_python-0.1.604}/src/codemie_sdk/models/guardrails.py +0 -0
  24. {codemie_sdk_python-0.1.603 → codemie_sdk_python-0.1.604}/src/codemie_sdk/models/integration.py +0 -0
  25. {codemie_sdk_python-0.1.603 → codemie_sdk_python-0.1.604}/src/codemie_sdk/models/llm.py +0 -0
  26. {codemie_sdk_python-0.1.603 → codemie_sdk_python-0.1.604}/src/codemie_sdk/models/mcp_config.py +0 -0
  27. {codemie_sdk_python-0.1.603 → codemie_sdk_python-0.1.604}/src/codemie_sdk/models/mermaid.py +0 -0
  28. {codemie_sdk_python-0.1.603 → codemie_sdk_python-0.1.604}/src/codemie_sdk/models/project.py +0 -0
  29. {codemie_sdk_python-0.1.603 → codemie_sdk_python-0.1.604}/src/codemie_sdk/models/skill.py +0 -0
  30. {codemie_sdk_python-0.1.603 → codemie_sdk_python-0.1.604}/src/codemie_sdk/models/task.py +0 -0
  31. {codemie_sdk_python-0.1.603 → codemie_sdk_python-0.1.604}/src/codemie_sdk/models/user.py +0 -0
  32. {codemie_sdk_python-0.1.603 → codemie_sdk_python-0.1.604}/src/codemie_sdk/models/vendor_assistant.py +0 -0
  33. {codemie_sdk_python-0.1.603 → codemie_sdk_python-0.1.604}/src/codemie_sdk/models/vendor_guardrail.py +0 -0
  34. {codemie_sdk_python-0.1.603 → codemie_sdk_python-0.1.604}/src/codemie_sdk/models/vendor_knowledgebase.py +0 -0
  35. {codemie_sdk_python-0.1.603 → codemie_sdk_python-0.1.604}/src/codemie_sdk/models/vendor_runtime.py +0 -0
  36. {codemie_sdk_python-0.1.603 → codemie_sdk_python-0.1.604}/src/codemie_sdk/models/vendor_workflow.py +0 -0
  37. {codemie_sdk_python-0.1.603 → codemie_sdk_python-0.1.604}/src/codemie_sdk/models/workflow.py +0 -0
  38. {codemie_sdk_python-0.1.603 → codemie_sdk_python-0.1.604}/src/codemie_sdk/models/workflow_execution_payload.py +0 -0
  39. {codemie_sdk_python-0.1.603 → codemie_sdk_python-0.1.604}/src/codemie_sdk/models/workflow_state.py +0 -0
  40. {codemie_sdk_python-0.1.603 → codemie_sdk_python-0.1.604}/src/codemie_sdk/models/workflow_thoughts.py +0 -0
  41. {codemie_sdk_python-0.1.603 → codemie_sdk_python-0.1.604}/src/codemie_sdk/models/workflow_transition.py +0 -0
  42. {codemie_sdk_python-0.1.603 → codemie_sdk_python-0.1.604}/src/codemie_sdk/services/activity_event.py +0 -0
  43. {codemie_sdk_python-0.1.603 → codemie_sdk_python-0.1.604}/src/codemie_sdk/services/admin.py +0 -0
  44. {codemie_sdk_python-0.1.603 → codemie_sdk_python-0.1.604}/src/codemie_sdk/services/analytics.py +0 -0
  45. {codemie_sdk_python-0.1.603 → codemie_sdk_python-0.1.604}/src/codemie_sdk/services/assistant.py +0 -0
  46. {codemie_sdk_python-0.1.603 → codemie_sdk_python-0.1.604}/src/codemie_sdk/services/categories.py +0 -0
  47. {codemie_sdk_python-0.1.603 → codemie_sdk_python-0.1.604}/src/codemie_sdk/services/codemie_guardrails.py +0 -0
  48. {codemie_sdk_python-0.1.603 → codemie_sdk_python-0.1.604}/src/codemie_sdk/services/conversation.py +0 -0
  49. {codemie_sdk_python-0.1.603 → codemie_sdk_python-0.1.604}/src/codemie_sdk/services/cost_center.py +0 -0
  50. {codemie_sdk_python-0.1.603 → codemie_sdk_python-0.1.604}/src/codemie_sdk/services/customer_config_service.py +0 -0
  51. {codemie_sdk_python-0.1.603 → codemie_sdk_python-0.1.604}/src/codemie_sdk/services/datasource.py +0 -0
  52. {codemie_sdk_python-0.1.603 → codemie_sdk_python-0.1.604}/src/codemie_sdk/services/dynamic_config.py +0 -0
  53. {codemie_sdk_python-0.1.603 → codemie_sdk_python-0.1.604}/src/codemie_sdk/services/files.py +0 -0
  54. {codemie_sdk_python-0.1.603 → codemie_sdk_python-0.1.604}/src/codemie_sdk/services/integration.py +0 -0
  55. {codemie_sdk_python-0.1.603 → codemie_sdk_python-0.1.604}/src/codemie_sdk/services/llm.py +0 -0
  56. {codemie_sdk_python-0.1.603 → codemie_sdk_python-0.1.604}/src/codemie_sdk/services/mcp_configs.py +0 -0
  57. {codemie_sdk_python-0.1.603 → codemie_sdk_python-0.1.604}/src/codemie_sdk/services/mermaid.py +0 -0
  58. {codemie_sdk_python-0.1.603 → codemie_sdk_python-0.1.604}/src/codemie_sdk/services/project.py +0 -0
  59. {codemie_sdk_python-0.1.603 → codemie_sdk_python-0.1.604}/src/codemie_sdk/services/skill.py +0 -0
  60. {codemie_sdk_python-0.1.603 → codemie_sdk_python-0.1.604}/src/codemie_sdk/services/task.py +0 -0
  61. {codemie_sdk_python-0.1.603 → codemie_sdk_python-0.1.604}/src/codemie_sdk/services/user.py +0 -0
  62. {codemie_sdk_python-0.1.603 → codemie_sdk_python-0.1.604}/src/codemie_sdk/services/vendor_assistant.py +0 -0
  63. {codemie_sdk_python-0.1.603 → codemie_sdk_python-0.1.604}/src/codemie_sdk/services/vendor_guardrail.py +0 -0
  64. {codemie_sdk_python-0.1.603 → codemie_sdk_python-0.1.604}/src/codemie_sdk/services/vendor_knowledgebase.py +0 -0
  65. {codemie_sdk_python-0.1.603 → codemie_sdk_python-0.1.604}/src/codemie_sdk/services/vendor_runtime.py +0 -0
  66. {codemie_sdk_python-0.1.603 → codemie_sdk_python-0.1.604}/src/codemie_sdk/services/vendor_workflow.py +0 -0
  67. {codemie_sdk_python-0.1.603 → codemie_sdk_python-0.1.604}/src/codemie_sdk/services/webhook.py +0 -0
  68. {codemie_sdk_python-0.1.603 → codemie_sdk_python-0.1.604}/src/codemie_sdk/services/workflow.py +0 -0
  69. {codemie_sdk_python-0.1.603 → codemie_sdk_python-0.1.604}/src/codemie_sdk/services/workflow_execution.py +0 -0
  70. {codemie_sdk_python-0.1.603 → codemie_sdk_python-0.1.604}/src/codemie_sdk/services/workflow_execution_state.py +0 -0
  71. {codemie_sdk_python-0.1.603 → codemie_sdk_python-0.1.604}/src/codemie_sdk/utils/__init__.py +0 -0
  72. {codemie_sdk_python-0.1.603 → codemie_sdk_python-0.1.604}/src/codemie_sdk/utils/http.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: codemie-sdk-python
3
- Version: 0.1.603
3
+ Version: 0.1.604
4
4
  Summary: CodeMie SDK for Python
5
5
  Author: Vadym Vlasenko
6
6
  Author-email: vadym_vlasenko@epam.com
@@ -1,6 +1,6 @@
1
1
  [tool.poetry]
2
2
  name = "codemie-sdk-python"
3
- version = "0.1.603"
3
+ version = "0.1.604"
4
4
  description = "CodeMie SDK for Python"
5
5
  authors = [
6
6
  "Vadym Vlasenko <vadym_vlasenko@epam.com>",
@@ -30,6 +30,7 @@ from ..services.dynamic_config import DynamicConfigService
30
30
  from ..services.mcp_configs import MCPConfigsService
31
31
  from ..services.cost_center import CostCenterService
32
32
  from ..services.customer_config_service import CustomerConfigService
33
+ from ..services.project_budget_groups import ProjectBudgetGroupsService
33
34
 
34
35
 
35
36
  class CodeMieClient:
@@ -177,6 +178,9 @@ class CodeMieClient:
177
178
  self.cost_centers = CostCenterService(
178
179
  self._api_domain, _token_source, verify_ssl=self._verify_ssl
179
180
  )
181
+ self.project_budget_groups = ProjectBudgetGroupsService(
182
+ self._api_domain, _token_source, verify_ssl=self._verify_ssl
183
+ )
180
184
 
181
185
  @property
182
186
  def token(self) -> str:
@@ -0,0 +1,158 @@
1
+ """Project budget groups service for the CodeMie SDK."""
2
+
3
+ from ..utils import ApiRequestHandler, TokenSource
4
+
5
+
6
+ class ProjectBudgetGroupsService:
7
+ """Service for managing project budget group distributions."""
8
+
9
+ def __init__(self, api_domain: str, token: TokenSource, verify_ssl: bool = True):
10
+ """Initialize the project budget groups service.
11
+
12
+ Args:
13
+ api_domain: Base URL for the CodeMie API
14
+ token: Authentication token
15
+ verify_ssl: Whether to verify SSL certificates
16
+ """
17
+ self._api = ApiRequestHandler(api_domain, token, verify_ssl)
18
+
19
+ def list_by_project(self, project_name: str) -> dict:
20
+ """List project budget groups for a given project.
21
+
22
+ Args:
23
+ project_name: The project name to filter by.
24
+
25
+ Returns:
26
+ Response dict containing ``items`` list and ``total``.
27
+ """
28
+ if not project_name:
29
+ raise ValueError("project_name must be a non-empty string")
30
+ return self._api.get(
31
+ "/v1/admin/project-budget-groups",
32
+ dict,
33
+ params={"project_name": project_name},
34
+ wrap_response=False,
35
+ )
36
+
37
+ def get(self, group_id: str) -> dict:
38
+ """Get a project budget group by ID.
39
+
40
+ Args:
41
+ group_id: The budget group identifier
42
+
43
+ Returns:
44
+ Budget group data as dict
45
+ """
46
+ if not group_id:
47
+ raise ValueError("group_id must be a non-empty string")
48
+ return self._api.get(
49
+ f"/v1/admin/project-budget-groups/{group_id}",
50
+ dict,
51
+ wrap_response=False,
52
+ )
53
+
54
+ def update(self, group_id: str, categories: dict) -> dict:
55
+ """Update spend bucket distribution for a project budget group.
56
+
57
+ Only the ``categories`` field may be updated via this method.
58
+ Non-maintainer callers (project admins) may ONLY change categories;
59
+ passing any other field will raise HTTP 403.
60
+
61
+ Args:
62
+ group_id: The budget group identifier
63
+ categories: Mapping of category name to percentage, e.g.
64
+ ``{"platform": 60.0, "cli": 40.0}``
65
+
66
+ Returns:
67
+ Updated budget group data as dict
68
+ """
69
+ if not group_id:
70
+ raise ValueError("group_id must be a non-empty string")
71
+ if not categories:
72
+ raise ValueError("categories must be a non-empty dict")
73
+ payload = {"categories": {cat: {"pct": pct} for cat, pct in categories.items()}}
74
+ return self._api.put(
75
+ f"/v1/admin/project-budget-groups/{group_id}",
76
+ dict,
77
+ json_data=payload,
78
+ wrap_response=False,
79
+ )
80
+
81
+ def _update_raw(self, group_id: str, body: dict) -> dict:
82
+ """Update a project budget group with an arbitrary request body.
83
+
84
+ Internal helper used by test utilities to verify field-level
85
+ restrictions — pass any fields to check that non-allowed fields are
86
+ rejected with HTTP 403. Not part of the intended public API contract.
87
+
88
+ Args:
89
+ group_id: The budget group identifier
90
+ body: Arbitrary JSON body for the PUT request
91
+
92
+ Returns:
93
+ Updated budget group data as dict
94
+ """
95
+ if not group_id:
96
+ raise ValueError("group_id must be a non-empty string")
97
+ return self._api.put(
98
+ f"/v1/admin/project-budget-groups/{group_id}",
99
+ dict,
100
+ json_data=body,
101
+ wrap_response=False,
102
+ )
103
+
104
+ def create(
105
+ self,
106
+ project_name: str,
107
+ name: str,
108
+ total_amount: float,
109
+ budget_duration: str,
110
+ categories: dict,
111
+ ) -> dict:
112
+ """Create a new project budget group.
113
+
114
+ Args:
115
+ project_name: The project this group belongs to.
116
+ name: Human-readable name for the budget group.
117
+ total_amount: Total budget amount (hard limit).
118
+ budget_duration: Budget period, e.g. ``"30d"``.
119
+ categories: Flat mapping of category name to percentage,
120
+ e.g. ``{"platform": 100.0}``. Auto-wrapped to the
121
+ ``{"platform": {"pct": 100.0}}`` format the API expects.
122
+
123
+ Returns:
124
+ Created budget group data as dict (includes ``group_id`` UUID).
125
+ """
126
+ if not project_name:
127
+ raise ValueError("project_name must be a non-empty string")
128
+ if not categories:
129
+ raise ValueError("categories must be a non-empty dict")
130
+ payload = {
131
+ "project_name": project_name,
132
+ "name": name,
133
+ "total_amount": total_amount,
134
+ "budget_duration": budget_duration,
135
+ "categories": {cat: {"pct": pct} for cat, pct in categories.items()},
136
+ }
137
+ return self._api.post(
138
+ "/v1/admin/project-budget-groups",
139
+ dict,
140
+ json_data=payload,
141
+ wrap_response=False,
142
+ )
143
+
144
+ def delete(self, group_id: str) -> None:
145
+ """Delete a project budget group by its UUID.
146
+
147
+ The server returns 204 No Content on success.
148
+
149
+ Args:
150
+ group_id: The UUID of the budget group to delete.
151
+ """
152
+ if not group_id:
153
+ raise ValueError("group_id must be a non-empty string")
154
+ self._api.delete(
155
+ f"/v1/admin/project-budget-groups/{group_id}",
156
+ dict,
157
+ wrap_response=False,
158
+ )