payi 0.1.0a5__py3-none-any.whl → 0.1.0a7__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 payi might be problematic. Click here for more details.

payi/_utils/__init__.py CHANGED
@@ -49,4 +49,7 @@ from ._transform import (
49
49
  maybe_transform as maybe_transform,
50
50
  async_maybe_transform as async_maybe_transform,
51
51
  )
52
- from ._reflection import function_has_argument as function_has_argument
52
+ from ._reflection import (
53
+ function_has_argument as function_has_argument,
54
+ assert_signatures_in_sync as assert_signatures_in_sync,
55
+ )
@@ -1,3 +1,5 @@
1
+ from __future__ import annotations
2
+
1
3
  import inspect
2
4
  from typing import Any, Callable
3
5
 
@@ -6,3 +8,35 @@ def function_has_argument(func: Callable[..., Any], arg_name: str) -> bool:
6
8
  """Returns whether or not the given function has a specific parameter"""
7
9
  sig = inspect.signature(func)
8
10
  return arg_name in sig.parameters
11
+
12
+
13
+ def assert_signatures_in_sync(
14
+ source_func: Callable[..., Any],
15
+ check_func: Callable[..., Any],
16
+ *,
17
+ exclude_params: set[str] = set(),
18
+ ) -> None:
19
+ """Ensure that the signature of the second function matches the first."""
20
+
21
+ check_sig = inspect.signature(check_func)
22
+ source_sig = inspect.signature(source_func)
23
+
24
+ errors: list[str] = []
25
+
26
+ for name, source_param in source_sig.parameters.items():
27
+ if name in exclude_params:
28
+ continue
29
+
30
+ custom_param = check_sig.parameters.get(name)
31
+ if not custom_param:
32
+ errors.append(f"the `{name}` param is missing")
33
+ continue
34
+
35
+ if custom_param.annotation != source_param.annotation:
36
+ errors.append(
37
+ f"types for the `{name}` param are do not match; source={repr(source_param.annotation)} checking={repr(source_param.annotation)}"
38
+ )
39
+ continue
40
+
41
+ if errors:
42
+ raise AssertionError(f"{len(errors)} errors encountered when comparing signatures:\n\n" + "\n\n".join(errors))
payi/_version.py CHANGED
@@ -1,4 +1,4 @@
1
1
  # File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
2
2
 
3
3
  __title__ = "payi"
4
- __version__ = "0.1.0-alpha.5" # x-release-please-version
4
+ __version__ = "0.1.0-alpha.7" # x-release-please-version
payi/lib/helpers.py ADDED
@@ -0,0 +1,32 @@
1
+ # Step 1: Define the new methods outside of the Payi class definition
2
+ from typing import Dict, List, Union
3
+
4
+
5
+ def create_budget_header_from_ids(budget_ids: List[str]) -> Dict[str, str]:
6
+ if not isinstance(budget_ids, list): # type: ignore
7
+ raise TypeError("budget_ids must be a list")
8
+
9
+ valid_ids = [id.strip() for id in budget_ids if isinstance(id, str) and id.strip()] # type: ignore
10
+
11
+ return {"xProxy-Budget-IDs": ",".join(valid_ids)} if valid_ids else {}
12
+
13
+ def create_request_header_from_tags(request_tags: List[str]) -> Dict[str, str]:
14
+ if not isinstance(request_tags, list): # type: ignore
15
+ raise TypeError("request_tags must be a list")
16
+
17
+ valid_tags = [tag.strip() for tag in request_tags if isinstance(tag, str) and tag.strip()] # type: ignore
18
+
19
+ return {"xProxy-Request-Tags": ",".join(valid_tags)} if valid_tags else {}
20
+
21
+ def create_headers(
22
+ budget_ids: Union[List[str], None] = None,
23
+ request_tags: Union[List[str], None] = None
24
+ ) -> Dict[str, str]:
25
+ headers: Dict[str, str] = {}
26
+
27
+ if budget_ids:
28
+ headers.update(create_budget_header_from_ids(budget_ids))
29
+ if request_tags:
30
+ headers.update(create_request_header_from_tags(request_tags))
31
+
32
+ return headers
payi/resources/ingest.py CHANGED
@@ -22,7 +22,7 @@ from .._response import (
22
22
  from .._base_client import (
23
23
  make_request_options,
24
24
  )
25
- from ..types.successful_proxy_result import SuccessfulProxyResult
25
+ from ..types.proxy_result import ProxyResult
26
26
 
27
27
  __all__ = ["IngestResource", "AsyncIngestResource"]
28
28
 
@@ -51,7 +51,7 @@ class IngestResource(SyncAPIResource):
51
51
  extra_query: Query | None = None,
52
52
  extra_body: Body | None = None,
53
53
  timeout: float | httpx.Timeout | None | NotGiven = NOT_GIVEN,
54
- ) -> SuccessfulProxyResult:
54
+ ) -> ProxyResult:
55
55
  """
56
56
  Ingest a request
57
57
 
@@ -103,7 +103,7 @@ class IngestResource(SyncAPIResource):
103
103
  options=make_request_options(
104
104
  extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout
105
105
  ),
106
- cast_to=SuccessfulProxyResult,
106
+ cast_to=ProxyResult,
107
107
  )
108
108
 
109
109
 
@@ -131,7 +131,7 @@ class AsyncIngestResource(AsyncAPIResource):
131
131
  extra_query: Query | None = None,
132
132
  extra_body: Body | None = None,
133
133
  timeout: float | httpx.Timeout | None | NotGiven = NOT_GIVEN,
134
- ) -> SuccessfulProxyResult:
134
+ ) -> ProxyResult:
135
135
  """
136
136
  Ingest a request
137
137
 
@@ -183,7 +183,7 @@ class AsyncIngestResource(AsyncAPIResource):
183
183
  options=make_request_options(
184
184
  extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout
185
185
  ),
186
- cast_to=SuccessfulProxyResult,
186
+ cast_to=ProxyResult,
187
187
  )
188
188
 
189
189
 
payi/types/__init__.py CHANGED
@@ -2,6 +2,7 @@
2
2
 
3
3
  from __future__ import annotations
4
4
 
5
+ from .proxy_result import ProxyResult as ProxyResult
5
6
  from .budget_response import BudgetResponse as BudgetResponse
6
7
  from .default_response import DefaultResponse as DefaultResponse
7
8
  from .paged_budget_list import PagedBudgetList as PagedBudgetList
@@ -10,4 +11,3 @@ from .ingest_units_params import IngestUnitsParams as IngestUnitsParams
10
11
  from .budget_create_params import BudgetCreateParams as BudgetCreateParams
11
12
  from .budget_update_params import BudgetUpdateParams as BudgetUpdateParams
12
13
  from .budget_history_response import BudgetHistoryResponse as BudgetHistoryResponse
13
- from .successful_proxy_result import SuccessfulProxyResult as SuccessfulProxyResult
@@ -2,6 +2,7 @@
2
2
 
3
3
  from __future__ import annotations
4
4
 
5
+ from .budget_tags import BudgetTags as BudgetTags
5
6
  from .tag_create_params import TagCreateParams as TagCreateParams
6
7
  from .tag_list_response import TagListResponse as TagListResponse
7
8
  from .tag_remove_params import TagRemoveParams as TagRemoveParams
@@ -10,4 +11,3 @@ from .tag_create_response import TagCreateResponse as TagCreateResponse
10
11
  from .tag_delete_response import TagDeleteResponse as TagDeleteResponse
11
12
  from .tag_remove_response import TagRemoveResponse as TagRemoveResponse
12
13
  from .tag_update_response import TagUpdateResponse as TagUpdateResponse
13
- from .budget_tags_response import BudgetTagsResponse as BudgetTagsResponse
@@ -0,0 +1,16 @@
1
+ # File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
2
+
3
+ from typing import Optional
4
+ from datetime import datetime
5
+
6
+ from ..._models import BaseModel
7
+
8
+ __all__ = ["BudgetTags"]
9
+
10
+
11
+ class BudgetTags(BaseModel):
12
+ created_on: Optional[datetime] = None
13
+
14
+ tag_id: Optional[int] = None
15
+
16
+ tag_name: Optional[str] = None
@@ -2,8 +2,8 @@
2
2
 
3
3
  from typing import List
4
4
 
5
- from .budget_tags_response import BudgetTagsResponse
5
+ from .budget_tags import BudgetTags
6
6
 
7
7
  __all__ = ["TagCreateResponse"]
8
8
 
9
- TagCreateResponse = List[BudgetTagsResponse]
9
+ TagCreateResponse = List[BudgetTags]
@@ -2,8 +2,8 @@
2
2
 
3
3
  from typing import List
4
4
 
5
- from .budget_tags_response import BudgetTagsResponse
5
+ from .budget_tags import BudgetTags
6
6
 
7
7
  __all__ = ["TagDeleteResponse"]
8
8
 
9
- TagDeleteResponse = List[BudgetTagsResponse]
9
+ TagDeleteResponse = List[BudgetTags]
@@ -2,8 +2,8 @@
2
2
 
3
3
  from typing import List
4
4
 
5
- from .budget_tags_response import BudgetTagsResponse
5
+ from .budget_tags import BudgetTags
6
6
 
7
7
  __all__ = ["TagListResponse"]
8
8
 
9
- TagListResponse = List[BudgetTagsResponse]
9
+ TagListResponse = List[BudgetTags]
@@ -2,8 +2,8 @@
2
2
 
3
3
  from typing import List
4
4
 
5
- from .budget_tags_response import BudgetTagsResponse
5
+ from .budget_tags import BudgetTags
6
6
 
7
7
  __all__ = ["TagRemoveResponse"]
8
8
 
9
- TagRemoveResponse = List[BudgetTagsResponse]
9
+ TagRemoveResponse = List[BudgetTags]
@@ -2,8 +2,8 @@
2
2
 
3
3
  from typing import List
4
4
 
5
- from .budget_tags_response import BudgetTagsResponse
5
+ from .budget_tags import BudgetTags
6
6
 
7
7
  __all__ = ["TagUpdateResponse"]
8
8
 
9
- TagUpdateResponse = List[BudgetTagsResponse]
9
+ TagUpdateResponse = List[BudgetTags]
@@ -4,7 +4,7 @@ from typing import Dict, List, Optional
4
4
 
5
5
  from .._models import BaseModel
6
6
 
7
- __all__ = ["SuccessfulProxyResult", "Budgets", "Cost", "CostInput", "CostOutput", "CostTotal"]
7
+ __all__ = ["ProxyResult", "Budgets", "Cost", "CostInput", "CostOutput", "CostTotal"]
8
8
 
9
9
 
10
10
  class Budgets(BaseModel):
@@ -33,7 +33,7 @@ class Cost(BaseModel):
33
33
  total: Optional[CostTotal] = None
34
34
 
35
35
 
36
- class SuccessfulProxyResult(BaseModel):
36
+ class ProxyResult(BaseModel):
37
37
  budgets: Optional[Dict[str, Budgets]] = None
38
38
 
39
39
  cost: Optional[Cost] = None
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.3
2
2
  Name: payi
3
- Version: 0.1.0a5
3
+ Version: 0.1.0a7
4
4
  Summary: The official Python library for the payi API
5
5
  Project-URL: Homepage, https://github.com/Pay-i/pay-i-python
6
6
  Project-URL: Repository, https://github.com/Pay-i/pay-i-python
@@ -11,24 +11,25 @@ payi/_resource.py,sha256=j2jIkTr8OIC8sU6-05nxSaCyj4MaFlbZrwlyg4_xJos,1088
11
11
  payi/_response.py,sha256=W6pADUzbnMFGnVzGY4M3FkX9uvw8AFSMTPZKPgQ_TV4,28363
12
12
  payi/_streaming.py,sha256=Z_wIyo206T6Jqh2rolFg2VXZgX24PahLmpURp0-NssU,10092
13
13
  payi/_types.py,sha256=04q-KHD-qZ1xlfwEb_muyIHWmD-nZ-KxnRxA_QEjqNk,6125
14
- payi/_version.py,sha256=3mM6E715PZrcQHeMazvg0NDPTx5QFmYESDWiJMLk_UQ,164
14
+ payi/_version.py,sha256=-vmo3fywvo5AGfodfzLGcUWjnejIqRqvWr3CvKlqw38,164
15
15
  payi/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
16
- payi/_utils/__init__.py,sha256=q5QC6ZmVNli9QaCqTlp9VrbQyjIU9EzmCn044UhHSIk,1919
16
+ payi/_utils/__init__.py,sha256=Uzq1-FIih_VUjzdNVWXks0sdC39KBKLMrZoz-_JOjJ4,1988
17
17
  payi/_utils/_logs.py,sha256=fmnf5D9TOgkgZKfgYmSa3PiUc3SZgkchn6CzJUeo0SQ,768
18
18
  payi/_utils/_proxy.py,sha256=DjcB-BBIRagSbMut2pF_jZavjda9sPvmQCKtVXBhs0I,1910
19
- payi/_utils/_reflection.py,sha256=Xloc_oanCC3gmAVBRhlMYtvYeLNZGi46gGWhDt9FtKI,275
19
+ payi/_utils/_reflection.py,sha256=k20KwLejVHcQCvu4mT2S61NDvbmuXF7KsMDapiocYS0,1364
20
20
  payi/_utils/_streams.py,sha256=SMC90diFFecpEg_zgDRVbdR3hSEIgVVij4taD-noMLM,289
21
21
  payi/_utils/_sync.py,sha256=9ex9pfOyd8xAF1LxpFx4IkqL8k0vk8srE2Ee-OTMQ0A,2840
22
22
  payi/_utils/_transform.py,sha256=NCz3q9_O-vuj60xVe-qzhEQ8uJWlZWJTsM-GwHDccf8,12958
23
23
  payi/_utils/_typing.py,sha256=tFbktdpdHCQliwzGsWysgn0P5H0JRdagkZdb_LegGkY,3838
24
24
  payi/_utils/_utils.py,sha256=FaZdW0tWil7IERdxUfKt7pVcyXL2aCnR3lo73q66qgI,11447
25
25
  payi/lib/.keep,sha256=wuNrz-5SXo3jJaJOJgz4vFHM41YH_g20F5cRQo0vLes,224
26
+ payi/lib/helpers.py,sha256=IdB_pi8dLtVh9b4DG-zasA1i9Yk-5xAayoUTNWBAFpc,1235
26
27
  payi/resources/__init__.py,sha256=1p8kzMES8NNDQQoK3TEDE-8vVuQ59xxUjyyblZJBTjw,1015
27
- payi/resources/ingest.py,sha256=IByW243qermlbqhlTYB_ZjhJ7Jfck6OREVJWsn2vATc,7692
28
+ payi/resources/ingest.py,sha256=bMWFiUsMbV913HmE61CEGnPcqTydM6OLNQP22Kg1_Eg,7631
28
29
  payi/resources/budgets/__init__.py,sha256=w1UhOdDXtUH4A91ME5Tw2nr9bRvPJyJY1YWiVVy7jj0,989
29
30
  payi/resources/budgets/budgets.py,sha256=aMu39MrRsVTtNfYwQPMeFK329ouwnHuFXM_vK9Ewj0k,24047
30
31
  payi/resources/budgets/tags.py,sha256=jzP0nal287bL2htY1TwDcdFRJyNMm6IdM936O1jCeMo,17850
31
- payi/types/__init__.py,sha256=qMtB76eknPySrqAU23SGwJYEelZBi2PWeqQO5p4dmWo,775
32
+ payi/types/__init__.py,sha256=JMz6gOsVi5Z6cdRl7S-5PTPvRwYaywHJkNYRIZnjrIE,744
32
33
  payi/types/budget_create_params.py,sha256=dDQvPOY8lx5oGuumAYQybAx-jPTRupsipVeezBd0l7I,543
33
34
  payi/types/budget_history_response.py,sha256=SeOabYz6xQvH4YkJSejbk_dUB49LZy7Y2MXZFPvrYMY,2702
34
35
  payi/types/budget_list_params.py,sha256=Win-Spveurf6WarTgCXXsP-yDIxr_HCP7oV_4JbqKOc,674
@@ -37,18 +38,18 @@ payi/types/budget_update_params.py,sha256=TTH7uu1c1zBK5zYhh2SPuRWEwr1XwDX_8bVS_G
37
38
  payi/types/default_response.py,sha256=o617LpRsCIZHCZxAc5nVI2JQ3HPGZo4gCDvSDkxkIJ8,270
38
39
  payi/types/ingest_units_params.py,sha256=NhC7wRF0lpoKikUPQUAgE1OxpU8dqMxtRZNIbiXkYCA,575
39
40
  payi/types/paged_budget_list.py,sha256=HNm834IAAy3eRNz0BjZwcbD9e-I8unWWKWxiSnlijWY,2553
40
- payi/types/successful_proxy_result.py,sha256=j8kQu8LAcfR3XuforqWDsYm1Bx6BQxCrezmE-3GnCWc,893
41
- payi/types/budgets/__init__.py,sha256=8lpRHXZQOc9ADCphhCB0JhQAH96lBIc68LbhlJn5Kys,750
42
- payi/types/budgets/budget_tags_response.py,sha256=o3zaMs9b0gJqKrWuui3ohUVsR2cwNGR0yttBclgXapo,513
41
+ payi/types/proxy_result.py,sha256=qyROzJvfaJDWHZ8UKxCFmf2HyechYri9UzQDwjqdWgc,873
42
+ payi/types/budgets/__init__.py,sha256=5ByVuqOcgSYLHmGzhuj6-HG48mtQhC6oT5U5tNjQtxk,725
43
+ payi/types/budgets/budget_tags.py,sha256=nOYMf7YgRdTZgGdedJw0UbQ2uupCq9MHlevLJoXxWB4,348
43
44
  payi/types/budgets/tag_create_params.py,sha256=_zEYfH2uKF44WenAdedx4TB9Az6RbIoAUMwqW8SAiuc,314
44
- payi/types/budgets/tag_create_response.py,sha256=2SWGig_rx8J5fEN0XUX2t6tZLnS5OQ1PcD5Bxc46rdY,244
45
- payi/types/budgets/tag_delete_response.py,sha256=JuXfffM_poGX_K1lLWCkW8yUdUiod1XNc8s-iN-RYdY,244
46
- payi/types/budgets/tag_list_response.py,sha256=9PUbi3clybFPD7Xo4Op6GmSjFet2gw7P2Kyx7IJg0_s,240
45
+ payi/types/budgets/tag_create_response.py,sha256=ybpccmzfOnLrgzRNYj_dDQF6NVFwBM7HdakqAU0nQpQ,219
46
+ payi/types/budgets/tag_delete_response.py,sha256=z7LQaTsdjQ3ilWsaKKHr5VLAsqa80tdFmDkEkQC96Ok,219
47
+ payi/types/budgets/tag_list_response.py,sha256=yfdMEFy4Cy0-7EPbaedjBJXwiLnAjmSuFt0PdRIL1ok,215
47
48
  payi/types/budgets/tag_remove_params.py,sha256=fNiHex1U11o_B0bfJDkpGARkEf99J-bd-wbzKkZ9mVM,314
48
- payi/types/budgets/tag_remove_response.py,sha256=Gc_eBGGSx6Afa51g-S5AkXqwmRcGMjshiNSBsthDZJc,244
49
+ payi/types/budgets/tag_remove_response.py,sha256=Wt4KwC76y3qxdEqKhXzFkYu2iECYePgXcpidXkuheWQ,219
49
50
  payi/types/budgets/tag_update_params.py,sha256=bWWeDqfySt7CZ6HDsZzENREOWGWGWFgnAtyleNMwUsE,314
50
- payi/types/budgets/tag_update_response.py,sha256=5Q16vkLUMLkyzgCWRcz7aDVA0KTCHQd_eAKnx2-VoWQ,244
51
- payi-0.1.0a5.dist-info/METADATA,sha256=UO6iAhZQ0DZpRyi0xAQY7T-bekMrtPNIUFxPmZKkfeg,11872
52
- payi-0.1.0a5.dist-info/WHEEL,sha256=1yFddiXMmvYK7QYTqtRNtX66WJ0Mz8PYEiEUoOUUxRY,87
53
- payi-0.1.0a5.dist-info/licenses/LICENSE,sha256=8vX1pjh3esb6D5DvXAf6NxiBcVyon8aHWNJCxmmHXeY,11334
54
- payi-0.1.0a5.dist-info/RECORD,,
51
+ payi/types/budgets/tag_update_response.py,sha256=Vlf-zxLZzvmhUodhzF7hiqWcxyjrb7Ri_lSajg8vOPM,219
52
+ payi-0.1.0a7.dist-info/METADATA,sha256=INYWWYKrbqUJ33Qxv3DwK0rYSCXa_GqFLDLQS1wLARM,11872
53
+ payi-0.1.0a7.dist-info/WHEEL,sha256=1yFddiXMmvYK7QYTqtRNtX66WJ0Mz8PYEiEUoOUUxRY,87
54
+ payi-0.1.0a7.dist-info/licenses/LICENSE,sha256=8vX1pjh3esb6D5DvXAf6NxiBcVyon8aHWNJCxmmHXeY,11334
55
+ payi-0.1.0a7.dist-info/RECORD,,
@@ -1,18 +0,0 @@
1
- # File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
2
-
3
- from typing import Optional
4
- from datetime import datetime
5
-
6
- from pydantic import Field as FieldInfo
7
-
8
- from ..._models import BaseModel
9
-
10
- __all__ = ["BudgetTagsResponse"]
11
-
12
-
13
- class BudgetTagsResponse(BaseModel):
14
- created_on: Optional[datetime] = FieldInfo(alias="createdOn", default=None)
15
-
16
- tag_id: Optional[int] = FieldInfo(alias="tagId", default=None)
17
-
18
- tag_name: Optional[str] = FieldInfo(alias="tagName", default=None)
File without changes