ynab-api-cli 0.1.0__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.
Files changed (225) hide show
  1. ynab_api_cli/__init__.py +3 -0
  2. ynab_api_cli/__main__.py +266 -0
  3. ynab_api_cli/cli.py +171 -0
  4. ynab_api_cli/compat.py +120 -0
  5. ynab_api_cli/config.py +110 -0
  6. ynab_api_cli/contract.py +197 -0
  7. ynab_api_cli/contract_testing.py +141 -0
  8. ynab_api_cli/development.py +269 -0
  9. ynab_api_cli/distribution.py +123 -0
  10. ynab_api_cli/exceptions.py +7 -0
  11. ynab_api_cli/generated/__init__.py +3 -0
  12. ynab_api_cli/generated/api/__init__.py +3 -0
  13. ynab_api_cli/generated/api/accounts/__init__.py +3 -0
  14. ynab_api_cli/generated/api/accounts/create_account.py +54 -0
  15. ynab_api_cli/generated/api/accounts/get_account_by_id.py +53 -0
  16. ynab_api_cli/generated/api/accounts/get_accounts.py +57 -0
  17. ynab_api_cli/generated/api/categories/__init__.py +3 -0
  18. ynab_api_cli/generated/api/categories/create_category.py +54 -0
  19. ynab_api_cli/generated/api/categories/create_category_group.py +58 -0
  20. ynab_api_cli/generated/api/categories/get_categories.py +57 -0
  21. ynab_api_cli/generated/api/categories/get_category_by_id.py +52 -0
  22. ynab_api_cli/generated/api/categories/get_month_category_by_id.py +58 -0
  23. ynab_api_cli/generated/api/categories/update_category.py +57 -0
  24. ynab_api_cli/generated/api/categories/update_category_group.py +63 -0
  25. ynab_api_cli/generated/api/categories/update_month_category.py +65 -0
  26. ynab_api_cli/generated/api/money_movements/__init__.py +3 -0
  27. ynab_api_cli/generated/api/money_movements/get_money_movement_groups.py +51 -0
  28. ynab_api_cli/generated/api/money_movements/get_money_movement_groups_by_month.py +57 -0
  29. ynab_api_cli/generated/api/money_movements/get_money_movements.py +51 -0
  30. ynab_api_cli/generated/api/money_movements/get_money_movements_by_month.py +57 -0
  31. ynab_api_cli/generated/api/months/__init__.py +3 -0
  32. ynab_api_cli/generated/api/months/get_plan_month.py +55 -0
  33. ynab_api_cli/generated/api/months/get_plan_months.py +59 -0
  34. ynab_api_cli/generated/api/payee_locations/__init__.py +3 -0
  35. ynab_api_cli/generated/api/payee_locations/get_payee_location_by_id.py +54 -0
  36. ynab_api_cli/generated/api/payee_locations/get_payee_locations.py +51 -0
  37. ynab_api_cli/generated/api/payee_locations/get_payee_locations_by_payee.py +54 -0
  38. ynab_api_cli/generated/api/payees/__init__.py +3 -0
  39. ynab_api_cli/generated/api/payees/create_payee.py +54 -0
  40. ynab_api_cli/generated/api/payees/get_payee_by_id.py +52 -0
  41. ynab_api_cli/generated/api/payees/get_payees.py +57 -0
  42. ynab_api_cli/generated/api/payees/update_payee.py +57 -0
  43. ynab_api_cli/generated/api/plans/__init__.py +3 -0
  44. ynab_api_cli/generated/api/plans/get_plan_by_id.py +57 -0
  45. ynab_api_cli/generated/api/plans/get_plan_settings_by_id.py +49 -0
  46. ynab_api_cli/generated/api/plans/get_plans.py +51 -0
  47. ynab_api_cli/generated/api/scheduled_transactions/__init__.py +3 -0
  48. ynab_api_cli/generated/api/scheduled_transactions/create_scheduled_transaction.py +58 -0
  49. ynab_api_cli/generated/api/scheduled_transactions/delete_scheduled_transaction.py +56 -0
  50. ynab_api_cli/generated/api/scheduled_transactions/get_scheduled_transaction_by_id.py +56 -0
  51. ynab_api_cli/generated/api/scheduled_transactions/get_scheduled_transactions.py +59 -0
  52. ynab_api_cli/generated/api/scheduled_transactions/update_scheduled_transaction.py +63 -0
  53. ynab_api_cli/generated/api/transactions/__init__.py +3 -0
  54. ynab_api_cli/generated/api/transactions/create_transaction.py +58 -0
  55. ynab_api_cli/generated/api/transactions/delete_transaction.py +54 -0
  56. ynab_api_cli/generated/api/transactions/get_transaction_by_id.py +54 -0
  57. ynab_api_cli/generated/api/transactions/get_transactions.py +80 -0
  58. ynab_api_cli/generated/api/transactions/get_transactions_by_account.py +87 -0
  59. ynab_api_cli/generated/api/transactions/get_transactions_by_category.py +89 -0
  60. ynab_api_cli/generated/api/transactions/get_transactions_by_month.py +87 -0
  61. ynab_api_cli/generated/api/transactions/get_transactions_by_payee.py +89 -0
  62. ynab_api_cli/generated/api/transactions/import_transactions.py +54 -0
  63. ynab_api_cli/generated/api/transactions/update_transaction.py +59 -0
  64. ynab_api_cli/generated/api/transactions/update_transactions.py +58 -0
  65. ynab_api_cli/generated/api/user/__init__.py +3 -0
  66. ynab_api_cli/generated/api/user/get_user.py +42 -0
  67. ynab_api_cli/generated/bindings.py +141 -0
  68. ynab_api_cli/generated/models/__init__.py +416 -0
  69. ynab_api_cli/generated/models/account.py +71 -0
  70. ynab_api_cli/generated/models/account_base.py +57 -0
  71. ynab_api_cli/generated/models/account_response.py +19 -0
  72. ynab_api_cli/generated/models/account_response_data.py +19 -0
  73. ynab_api_cli/generated/models/account_type.py +23 -0
  74. ynab_api_cli/generated/models/accounts_response.py +21 -0
  75. ynab_api_cli/generated/models/accounts_response_data.py +20 -0
  76. ynab_api_cli/generated/models/bulk_response.py +19 -0
  77. ynab_api_cli/generated/models/bulk_response_data.py +21 -0
  78. ynab_api_cli/generated/models/bulk_response_data_bulk.py +15 -0
  79. ynab_api_cli/generated/models/bulk_transactions.py +21 -0
  80. ynab_api_cli/generated/models/categories_response.py +21 -0
  81. ynab_api_cli/generated/models/categories_response_data.py +22 -0
  82. ynab_api_cli/generated/models/category.py +104 -0
  83. ynab_api_cli/generated/models/category_base.py +74 -0
  84. ynab_api_cli/generated/models/category_group.py +20 -0
  85. ynab_api_cli/generated/models/category_group_with_categories.py +25 -0
  86. ynab_api_cli/generated/models/category_response.py +21 -0
  87. ynab_api_cli/generated/models/category_response_data.py +19 -0
  88. ynab_api_cli/generated/models/currency_format_type_0.py +21 -0
  89. ynab_api_cli/generated/models/date_format_type_0.py +14 -0
  90. ynab_api_cli/generated/models/debt_1.py +18 -0
  91. ynab_api_cli/generated/models/debt_2.py +18 -0
  92. ynab_api_cli/generated/models/debt_3.py +18 -0
  93. ynab_api_cli/generated/models/error_detail.py +16 -0
  94. ynab_api_cli/generated/models/error_response.py +19 -0
  95. ynab_api_cli/generated/models/existing_category.py +34 -0
  96. ynab_api_cli/generated/models/existing_transaction.py +43 -0
  97. ynab_api_cli/generated/models/flag_1.py +17 -0
  98. ynab_api_cli/generated/models/flag_2.py +17 -0
  99. ynab_api_cli/generated/models/flag_3.py +17 -0
  100. ynab_api_cli/generated/models/get_transactions_by_account_type.py +12 -0
  101. ynab_api_cli/generated/models/get_transactions_by_category_type.py +12 -0
  102. ynab_api_cli/generated/models/get_transactions_by_month_type.py +12 -0
  103. ynab_api_cli/generated/models/get_transactions_by_payee_type.py +12 -0
  104. ynab_api_cli/generated/models/get_transactions_type.py +12 -0
  105. ynab_api_cli/generated/models/goal_1.py +15 -0
  106. ynab_api_cli/generated/models/goal_2.py +15 -0
  107. ynab_api_cli/generated/models/goal_3.py +15 -0
  108. ynab_api_cli/generated/models/hybrid_transaction.py +70 -0
  109. ynab_api_cli/generated/models/hybrid_transaction_type.py +12 -0
  110. ynab_api_cli/generated/models/hybrid_transactions_response.py +21 -0
  111. ynab_api_cli/generated/models/hybrid_transactions_response_data.py +22 -0
  112. ynab_api_cli/generated/models/loan_account_periodic_value_type_0.py +33 -0
  113. ynab_api_cli/generated/models/money_movement.py +35 -0
  114. ynab_api_cli/generated/models/money_movement_base.py +33 -0
  115. ynab_api_cli/generated/models/money_movement_group.py +25 -0
  116. ynab_api_cli/generated/models/money_movement_groups_response.py +21 -0
  117. ynab_api_cli/generated/models/money_movement_groups_response_data.py +22 -0
  118. ynab_api_cli/generated/models/money_movements_response.py +21 -0
  119. ynab_api_cli/generated/models/money_movements_response_data.py +20 -0
  120. ynab_api_cli/generated/models/month_detail.py +42 -0
  121. ynab_api_cli/generated/models/month_detail_base.py +30 -0
  122. ynab_api_cli/generated/models/month_detail_response.py +21 -0
  123. ynab_api_cli/generated/models/month_detail_response_data.py +19 -0
  124. ynab_api_cli/generated/models/month_summaries_response.py +21 -0
  125. ynab_api_cli/generated/models/month_summaries_response_data.py +20 -0
  126. ynab_api_cli/generated/models/month_summary.py +37 -0
  127. ynab_api_cli/generated/models/month_summary_base.py +25 -0
  128. ynab_api_cli/generated/models/new_category.py +34 -0
  129. ynab_api_cli/generated/models/new_transaction.py +44 -0
  130. ynab_api_cli/generated/models/patch_category_group_wrapper.py +19 -0
  131. ynab_api_cli/generated/models/patch_category_wrapper.py +19 -0
  132. ynab_api_cli/generated/models/patch_month_category_wrapper.py +19 -0
  133. ynab_api_cli/generated/models/patch_payee_wrapper.py +19 -0
  134. ynab_api_cli/generated/models/patch_transactions_wrapper.py +21 -0
  135. ynab_api_cli/generated/models/payee.py +23 -0
  136. ynab_api_cli/generated/models/payee_location.py +20 -0
  137. ynab_api_cli/generated/models/payee_location_response.py +21 -0
  138. ynab_api_cli/generated/models/payee_location_response_data.py +19 -0
  139. ynab_api_cli/generated/models/payee_locations_response.py +21 -0
  140. ynab_api_cli/generated/models/payee_locations_response_data.py +19 -0
  141. ynab_api_cli/generated/models/payee_response.py +19 -0
  142. ynab_api_cli/generated/models/payee_response_data.py +19 -0
  143. ynab_api_cli/generated/models/payees_response.py +19 -0
  144. ynab_api_cli/generated/models/payees_response_data.py +20 -0
  145. ynab_api_cli/generated/models/plan_detail.py +74 -0
  146. ynab_api_cli/generated/models/plan_detail_response.py +21 -0
  147. ynab_api_cli/generated/models/plan_detail_response_data.py +20 -0
  148. ynab_api_cli/generated/models/plan_settings.py +21 -0
  149. ynab_api_cli/generated/models/plan_settings_response.py +21 -0
  150. ynab_api_cli/generated/models/plan_settings_response_data.py +19 -0
  151. ynab_api_cli/generated/models/plan_summary.py +38 -0
  152. ynab_api_cli/generated/models/plan_summary_response.py +21 -0
  153. ynab_api_cli/generated/models/plan_summary_response_data.py +24 -0
  154. ynab_api_cli/generated/models/post_account_wrapper.py +19 -0
  155. ynab_api_cli/generated/models/post_category_group_wrapper.py +19 -0
  156. ynab_api_cli/generated/models/post_category_wrapper.py +19 -0
  157. ynab_api_cli/generated/models/post_payee.py +14 -0
  158. ynab_api_cli/generated/models/post_payee_wrapper.py +19 -0
  159. ynab_api_cli/generated/models/post_scheduled_transaction_wrapper.py +23 -0
  160. ynab_api_cli/generated/models/post_transactions_wrapper.py +24 -0
  161. ynab_api_cli/generated/models/put_scheduled_transaction_wrapper.py +23 -0
  162. ynab_api_cli/generated/models/put_transaction_wrapper.py +19 -0
  163. ynab_api_cli/generated/models/save_account.py +18 -0
  164. ynab_api_cli/generated/models/save_account_type.py +16 -0
  165. ynab_api_cli/generated/models/save_category.py +34 -0
  166. ynab_api_cli/generated/models/save_category_goal_frequency.py +13 -0
  167. ynab_api_cli/generated/models/save_category_group.py +14 -0
  168. ynab_api_cli/generated/models/save_category_group_response.py +21 -0
  169. ynab_api_cli/generated/models/save_category_group_response_data.py +20 -0
  170. ynab_api_cli/generated/models/save_category_response.py +21 -0
  171. ynab_api_cli/generated/models/save_category_response_data.py +20 -0
  172. ynab_api_cli/generated/models/save_month_category.py +14 -0
  173. ynab_api_cli/generated/models/save_payee.py +16 -0
  174. ynab_api_cli/generated/models/save_payee_response.py +21 -0
  175. ynab_api_cli/generated/models/save_payee_response_data.py +20 -0
  176. ynab_api_cli/generated/models/save_scheduled_transaction.py +37 -0
  177. ynab_api_cli/generated/models/save_sub_transaction.py +22 -0
  178. ynab_api_cli/generated/models/save_transaction_with_id_or_import_id.py +45 -0
  179. ynab_api_cli/generated/models/save_transaction_with_optional_fields.py +43 -0
  180. ynab_api_cli/generated/models/save_transactions_response.py +21 -0
  181. ynab_api_cli/generated/models/save_transactions_response_data.py +29 -0
  182. ynab_api_cli/generated/models/scheduled_sub_transaction.py +31 -0
  183. ynab_api_cli/generated/models/scheduled_sub_transaction_base.py +29 -0
  184. ynab_api_cli/generated/models/scheduled_transaction_detail.py +53 -0
  185. ynab_api_cli/generated/models/scheduled_transaction_frequency.py +23 -0
  186. ynab_api_cli/generated/models/scheduled_transaction_response.py +21 -0
  187. ynab_api_cli/generated/models/scheduled_transaction_response_data.py +23 -0
  188. ynab_api_cli/generated/models/scheduled_transaction_summary.py +43 -0
  189. ynab_api_cli/generated/models/scheduled_transaction_summary_base.py +41 -0
  190. ynab_api_cli/generated/models/scheduled_transaction_summary_base_frequency.py +23 -0
  191. ynab_api_cli/generated/models/scheduled_transactions_response.py +21 -0
  192. ynab_api_cli/generated/models/scheduled_transactions_response_data.py +24 -0
  193. ynab_api_cli/generated/models/sub_transaction.py +34 -0
  194. ynab_api_cli/generated/models/sub_transaction_base.py +32 -0
  195. ynab_api_cli/generated/models/transaction_cleared_status.py +13 -0
  196. ynab_api_cli/generated/models/transaction_detail.py +70 -0
  197. ynab_api_cli/generated/models/transaction_response.py +21 -0
  198. ynab_api_cli/generated/models/transaction_response_data.py +20 -0
  199. ynab_api_cli/generated/models/transaction_summary.py +62 -0
  200. ynab_api_cli/generated/models/transaction_summary_base.py +60 -0
  201. ynab_api_cli/generated/models/transactions_import_response.py +21 -0
  202. ynab_api_cli/generated/models/transactions_import_response_data.py +14 -0
  203. ynab_api_cli/generated/models/transactions_response.py +21 -0
  204. ynab_api_cli/generated/models/transactions_response_data.py +20 -0
  205. ynab_api_cli/generated/models/user.py +16 -0
  206. ynab_api_cli/generated/models/user_response.py +19 -0
  207. ynab_api_cli/generated/models/user_response_data.py +19 -0
  208. ynab_api_cli/live.py +449 -0
  209. ynab_api_cli/py.typed +0 -0
  210. ynab_api_cli/resources/__init__.py +3 -0
  211. ynab_api_cli/resources/catalog.json +178 -0
  212. ynab_api_cli/resources/openapi.yaml +4035 -0
  213. ynab_api_cli/resources/provenance.json +9 -0
  214. ynab_api_cli/resources/schema_features.json +913 -0
  215. ynab_api_cli/resources/skill/SKILL.md +21 -0
  216. ynab_api_cli/resources/skill/references/operations.md +36 -0
  217. ynab_api_cli/resources/skill/references/setup.md +32 -0
  218. ynab_api_cli/security.py +83 -0
  219. ynab_api_cli/transport.py +133 -0
  220. ynab_api_cli/types.py +110 -0
  221. ynab_api_cli/verification.py +167 -0
  222. ynab_api_cli-0.1.0.dist-info/METADATA +90 -0
  223. ynab_api_cli-0.1.0.dist-info/RECORD +225 -0
  224. ynab_api_cli-0.1.0.dist-info/WHEEL +4 -0
  225. ynab_api_cli-0.1.0.dist-info/entry_points.txt +3 -0
@@ -0,0 +1,123 @@
1
+ """Build archive checks and isolated installation smoke verification."""
2
+
3
+ from __future__ import annotations
4
+
5
+ import json
6
+ import os
7
+ import shutil
8
+ import subprocess
9
+ import sys
10
+ import tarfile
11
+ import tempfile
12
+ import zipfile
13
+ from pathlib import Path
14
+
15
+ from ynab_api_cli.config import ConfigStore
16
+ from ynab_api_cli.contract import Contract
17
+ from ynab_api_cli.exceptions import AppError
18
+
19
+
20
+ class DistributionCheck:
21
+ """Verify wheels, source archives, and a clean uv tool installation."""
22
+
23
+ @classmethod
24
+ def main(cls) -> None:
25
+ """Run the release check from the project root."""
26
+ cls().run(Path(__file__).resolve().parents[2])
27
+
28
+ def run(self, root: Path) -> None:
29
+ """Inspect built artifacts and exercise the independently installed CLI."""
30
+ wheel = next((root / "dist").glob("*.whl"))
31
+ source = next((root / "dist").glob("*.tar.gz"))
32
+ with zipfile.ZipFile(wheel) as archive:
33
+ names = archive.namelist()
34
+ required = {
35
+ "ynab_api_cli/resources/openapi.yaml",
36
+ "ynab_api_cli/resources/catalog.json",
37
+ "ynab_api_cli/resources/skill/SKILL.md",
38
+ "ynab_api_cli/py.typed",
39
+ }
40
+ if not required <= set(names):
41
+ raise AppError("Wheel is missing required contract or skill resources.")
42
+ with tarfile.open(source) as archive:
43
+ if not any(
44
+ name.endswith("/skills/ynab-api-cli/SKILL.md")
45
+ for name in archive.getnames()
46
+ ):
47
+ raise AppError("Source archive is missing the supplementary skill.")
48
+ uv = shutil.which("uv")
49
+ if uv is None:
50
+ raise AppError("uv is required for clean installation verification.")
51
+ with tempfile.TemporaryDirectory() as temporary:
52
+ workspace = Path(temporary)
53
+ environment = dict(os.environ)
54
+ environment.update(
55
+ {
56
+ "UV_TOOL_DIR": str(workspace / "tools"),
57
+ "UV_TOOL_BIN_DIR": str(workspace / "bin"),
58
+ "XDG_CONFIG_HOME": str(workspace / "config"),
59
+ }
60
+ )
61
+ subprocess.run( # noqa: S603 - resolved uv and local wheel, no shell.
62
+ [
63
+ uv,
64
+ "tool",
65
+ "install",
66
+ "--python",
67
+ sys.executable,
68
+ "--no-managed-python",
69
+ str(wheel),
70
+ ],
71
+ env=environment,
72
+ cwd=workspace,
73
+ check=True,
74
+ )
75
+ executable = (
76
+ workspace
77
+ / "bin"
78
+ / ("ynab-api-cli.exe" if os.name == "nt" else "ynab-api-cli")
79
+ )
80
+ store = ConfigStore(workspace / "config/ynab-api-cli")
81
+ store.configure("synthetic-install-test")
82
+ for argv in (
83
+ ["--help"],
84
+ ["discover"],
85
+ ["inspect", "getUser"],
86
+ ["doctor", "--offline"],
87
+ ["skill", "export", str(workspace / "exported-skill")],
88
+ ):
89
+ result = subprocess.run( # noqa: S603 - fixed installed CLI smoke commands.
90
+ [str(executable), *argv],
91
+ env=environment,
92
+ cwd=workspace,
93
+ capture_output=True,
94
+ text=True,
95
+ check=True,
96
+ )
97
+ if argv[0] == "discover" and len(
98
+ json.loads(result.stdout)["operations"]
99
+ ) != len(Contract().catalog):
100
+ raise AppError("Installed CLI operation inventory mismatch.")
101
+ release = root / "dist" / (wheel.name.split("-py3-")[0] + "-release.zip")
102
+ with zipfile.ZipFile(release, "w", compression=zipfile.ZIP_DEFLATED) as archive:
103
+ for artifact in (wheel, source, root / "README.md"):
104
+ archive.write(artifact, artifact.name)
105
+ for directory in ("skills", "docs"):
106
+ for path in (root / directory).rglob("*"):
107
+ if path.is_file():
108
+ archive.write(path, str(path.relative_to(root)))
109
+ sys.stdout.write(
110
+ json.dumps(
111
+ {
112
+ "wheel": wheel.name,
113
+ "source": source.name,
114
+ "release": release.name,
115
+ "clean_install": "passed",
116
+ }
117
+ )
118
+ + "\n"
119
+ )
120
+
121
+
122
+ if __name__ == "__main__":
123
+ DistributionCheck.main()
@@ -0,0 +1,7 @@
1
+ """Safe application failures whose messages never contain credentials."""
2
+
3
+ from __future__ import annotations
4
+
5
+
6
+ class AppError(Exception):
7
+ """Expected configuration, validation, or HTTP failure."""
@@ -0,0 +1,3 @@
1
+ """Generated REST client declarations."""
2
+
3
+ from __future__ import annotations
@@ -0,0 +1,3 @@
1
+ """Generated endpoint declarations."""
2
+
3
+ from __future__ import annotations
@@ -0,0 +1,3 @@
1
+ """Generated endpoint declarations."""
2
+
3
+ from __future__ import annotations
@@ -0,0 +1,54 @@
1
+ """Generated typed REST endpoint; regenerate rather than editing."""
2
+
3
+ from __future__ import annotations
4
+
5
+ from http import HTTPStatus
6
+
7
+ from pydantic import TypeAdapter
8
+
9
+ from ynab_api_cli.generated.models.account_response import AccountResponse
10
+ from ynab_api_cli.generated.models.error_response import ErrorResponse
11
+ from ynab_api_cli.generated.models.post_account_wrapper import PostAccountWrapper
12
+ from ynab_api_cli.transport import Transport
13
+ from ynab_api_cli.types import RequestValues, Response
14
+
15
+
16
+ class Endpoint:
17
+ """Typed createAccount operation."""
18
+
19
+ @classmethod
20
+ def execute(
21
+ cls,
22
+ *,
23
+ transport: Transport,
24
+ plan_id: str,
25
+ body: PostAccountWrapper,
26
+ ) -> Response[AccountResponse | ErrorResponse]:
27
+ """Execute the typed request and retain its original response JSON."""
28
+ raw = transport.send(
29
+ "createAccount",
30
+ RequestValues(
31
+ path={
32
+ "plan_id": plan_id,
33
+ },
34
+ query={},
35
+ body=body,
36
+ ),
37
+ )
38
+ if raw.status == HTTPStatus.CREATED:
39
+ parsed = AccountResponse.model_validate(raw.raw)
40
+ return Response(raw.status, raw.raw, raw.headers, parsed)
41
+ raise ValueError("Validated response has no generated success binding.")
42
+
43
+ @classmethod
44
+ def dispatch(
45
+ cls, transport: Transport, request: RequestValues
46
+ ) -> Response[AccountResponse | ErrorResponse]:
47
+ """Convert validated CLI inputs and call the explicitly typed method."""
48
+ return cls.execute(
49
+ transport=transport,
50
+ plan_id=request.value("path", "plan_id", TypeAdapter[str](str)),
51
+ body=TypeAdapter[PostAccountWrapper](PostAccountWrapper).validate_python(
52
+ request.body
53
+ ),
54
+ )
@@ -0,0 +1,53 @@
1
+ """Generated typed REST endpoint; regenerate rather than editing."""
2
+
3
+ from __future__ import annotations
4
+
5
+ from http import HTTPStatus
6
+ from uuid import UUID
7
+
8
+ from pydantic import TypeAdapter
9
+
10
+ from ynab_api_cli.generated.models.account_response import AccountResponse
11
+ from ynab_api_cli.generated.models.error_response import ErrorResponse
12
+ from ynab_api_cli.transport import Transport
13
+ from ynab_api_cli.types import UNSET, RequestValues, Response
14
+
15
+
16
+ class Endpoint:
17
+ """Typed getAccountById operation."""
18
+
19
+ @classmethod
20
+ def execute(
21
+ cls,
22
+ *,
23
+ transport: Transport,
24
+ plan_id: str,
25
+ account_id: UUID,
26
+ ) -> Response[AccountResponse | ErrorResponse]:
27
+ """Execute the typed request and retain its original response JSON."""
28
+ raw = transport.send(
29
+ "getAccountById",
30
+ RequestValues(
31
+ path={
32
+ "plan_id": plan_id,
33
+ "account_id": account_id,
34
+ },
35
+ query={},
36
+ body=UNSET,
37
+ ),
38
+ )
39
+ if raw.status == HTTPStatus.OK:
40
+ parsed = AccountResponse.model_validate(raw.raw)
41
+ return Response(raw.status, raw.raw, raw.headers, parsed)
42
+ raise ValueError("Validated response has no generated success binding.")
43
+
44
+ @classmethod
45
+ def dispatch(
46
+ cls, transport: Transport, request: RequestValues
47
+ ) -> Response[AccountResponse | ErrorResponse]:
48
+ """Convert validated CLI inputs and call the explicitly typed method."""
49
+ return cls.execute(
50
+ transport=transport,
51
+ plan_id=request.value("path", "plan_id", TypeAdapter[str](str)),
52
+ account_id=request.value("path", "account_id", TypeAdapter[UUID](UUID)),
53
+ )
@@ -0,0 +1,57 @@
1
+ """Generated typed REST endpoint; regenerate rather than editing."""
2
+
3
+ from __future__ import annotations
4
+
5
+ from http import HTTPStatus
6
+
7
+ from pydantic import TypeAdapter
8
+
9
+ from ynab_api_cli.generated.models.accounts_response import AccountsResponse
10
+ from ynab_api_cli.generated.models.error_response import ErrorResponse
11
+ from ynab_api_cli.transport import Transport
12
+ from ynab_api_cli.types import UNSET, RequestValues, Response, Unset
13
+
14
+
15
+ class Endpoint:
16
+ """Typed getAccounts operation."""
17
+
18
+ @classmethod
19
+ def execute(
20
+ cls,
21
+ *,
22
+ transport: Transport,
23
+ plan_id: str,
24
+ last_knowledge_of_server: int | Unset = UNSET,
25
+ ) -> Response[AccountsResponse | ErrorResponse]:
26
+ """Execute the typed request and retain its original response JSON."""
27
+ raw = transport.send(
28
+ "getAccounts",
29
+ RequestValues(
30
+ path={
31
+ "plan_id": plan_id,
32
+ },
33
+ query={
34
+ "last_knowledge_of_server": last_knowledge_of_server,
35
+ },
36
+ body=UNSET,
37
+ ),
38
+ )
39
+ if raw.status == HTTPStatus.OK:
40
+ parsed = AccountsResponse.model_validate(raw.raw)
41
+ return Response(raw.status, raw.raw, raw.headers, parsed)
42
+ raise ValueError("Validated response has no generated success binding.")
43
+
44
+ @classmethod
45
+ def dispatch(
46
+ cls, transport: Transport, request: RequestValues
47
+ ) -> Response[AccountsResponse | ErrorResponse]:
48
+ """Convert validated CLI inputs and call the explicitly typed method."""
49
+ return cls.execute(
50
+ transport=transport,
51
+ plan_id=request.value("path", "plan_id", TypeAdapter[str](str)),
52
+ last_knowledge_of_server=request.value(
53
+ "query",
54
+ "last_knowledge_of_server",
55
+ TypeAdapter[int | Unset](int | Unset),
56
+ ),
57
+ )
@@ -0,0 +1,3 @@
1
+ """Generated endpoint declarations."""
2
+
3
+ from __future__ import annotations
@@ -0,0 +1,54 @@
1
+ """Generated typed REST endpoint; regenerate rather than editing."""
2
+
3
+ from __future__ import annotations
4
+
5
+ from http import HTTPStatus
6
+
7
+ from pydantic import TypeAdapter
8
+
9
+ from ynab_api_cli.generated.models.error_response import ErrorResponse
10
+ from ynab_api_cli.generated.models.post_category_wrapper import PostCategoryWrapper
11
+ from ynab_api_cli.generated.models.save_category_response import SaveCategoryResponse
12
+ from ynab_api_cli.transport import Transport
13
+ from ynab_api_cli.types import RequestValues, Response
14
+
15
+
16
+ class Endpoint:
17
+ """Typed createCategory operation."""
18
+
19
+ @classmethod
20
+ def execute(
21
+ cls,
22
+ *,
23
+ transport: Transport,
24
+ plan_id: str,
25
+ body: PostCategoryWrapper,
26
+ ) -> Response[ErrorResponse | SaveCategoryResponse]:
27
+ """Execute the typed request and retain its original response JSON."""
28
+ raw = transport.send(
29
+ "createCategory",
30
+ RequestValues(
31
+ path={
32
+ "plan_id": plan_id,
33
+ },
34
+ query={},
35
+ body=body,
36
+ ),
37
+ )
38
+ if raw.status == HTTPStatus.CREATED:
39
+ parsed = SaveCategoryResponse.model_validate(raw.raw)
40
+ return Response(raw.status, raw.raw, raw.headers, parsed)
41
+ raise ValueError("Validated response has no generated success binding.")
42
+
43
+ @classmethod
44
+ def dispatch(
45
+ cls, transport: Transport, request: RequestValues
46
+ ) -> Response[ErrorResponse | SaveCategoryResponse]:
47
+ """Convert validated CLI inputs and call the explicitly typed method."""
48
+ return cls.execute(
49
+ transport=transport,
50
+ plan_id=request.value("path", "plan_id", TypeAdapter[str](str)),
51
+ body=TypeAdapter[PostCategoryWrapper](PostCategoryWrapper).validate_python(
52
+ request.body
53
+ ),
54
+ )
@@ -0,0 +1,58 @@
1
+ """Generated typed REST endpoint; regenerate rather than editing."""
2
+
3
+ from __future__ import annotations
4
+
5
+ from http import HTTPStatus
6
+
7
+ from pydantic import TypeAdapter
8
+
9
+ from ynab_api_cli.generated.models.error_response import ErrorResponse
10
+ from ynab_api_cli.generated.models.post_category_group_wrapper import (
11
+ PostCategoryGroupWrapper,
12
+ )
13
+ from ynab_api_cli.generated.models.save_category_group_response import (
14
+ SaveCategoryGroupResponse,
15
+ )
16
+ from ynab_api_cli.transport import Transport
17
+ from ynab_api_cli.types import RequestValues, Response
18
+
19
+
20
+ class Endpoint:
21
+ """Typed createCategoryGroup operation."""
22
+
23
+ @classmethod
24
+ def execute(
25
+ cls,
26
+ *,
27
+ transport: Transport,
28
+ plan_id: str,
29
+ body: PostCategoryGroupWrapper,
30
+ ) -> Response[ErrorResponse | SaveCategoryGroupResponse]:
31
+ """Execute the typed request and retain its original response JSON."""
32
+ raw = transport.send(
33
+ "createCategoryGroup",
34
+ RequestValues(
35
+ path={
36
+ "plan_id": plan_id,
37
+ },
38
+ query={},
39
+ body=body,
40
+ ),
41
+ )
42
+ if raw.status == HTTPStatus.CREATED:
43
+ parsed = SaveCategoryGroupResponse.model_validate(raw.raw)
44
+ return Response(raw.status, raw.raw, raw.headers, parsed)
45
+ raise ValueError("Validated response has no generated success binding.")
46
+
47
+ @classmethod
48
+ def dispatch(
49
+ cls, transport: Transport, request: RequestValues
50
+ ) -> Response[ErrorResponse | SaveCategoryGroupResponse]:
51
+ """Convert validated CLI inputs and call the explicitly typed method."""
52
+ return cls.execute(
53
+ transport=transport,
54
+ plan_id=request.value("path", "plan_id", TypeAdapter[str](str)),
55
+ body=TypeAdapter[PostCategoryGroupWrapper](
56
+ PostCategoryGroupWrapper
57
+ ).validate_python(request.body),
58
+ )
@@ -0,0 +1,57 @@
1
+ """Generated typed REST endpoint; regenerate rather than editing."""
2
+
3
+ from __future__ import annotations
4
+
5
+ from http import HTTPStatus
6
+
7
+ from pydantic import TypeAdapter
8
+
9
+ from ynab_api_cli.generated.models.categories_response import CategoriesResponse
10
+ from ynab_api_cli.generated.models.error_response import ErrorResponse
11
+ from ynab_api_cli.transport import Transport
12
+ from ynab_api_cli.types import UNSET, RequestValues, Response, Unset
13
+
14
+
15
+ class Endpoint:
16
+ """Typed getCategories operation."""
17
+
18
+ @classmethod
19
+ def execute(
20
+ cls,
21
+ *,
22
+ transport: Transport,
23
+ plan_id: str,
24
+ last_knowledge_of_server: int | Unset = UNSET,
25
+ ) -> Response[CategoriesResponse | ErrorResponse]:
26
+ """Execute the typed request and retain its original response JSON."""
27
+ raw = transport.send(
28
+ "getCategories",
29
+ RequestValues(
30
+ path={
31
+ "plan_id": plan_id,
32
+ },
33
+ query={
34
+ "last_knowledge_of_server": last_knowledge_of_server,
35
+ },
36
+ body=UNSET,
37
+ ),
38
+ )
39
+ if raw.status == HTTPStatus.OK:
40
+ parsed = CategoriesResponse.model_validate(raw.raw)
41
+ return Response(raw.status, raw.raw, raw.headers, parsed)
42
+ raise ValueError("Validated response has no generated success binding.")
43
+
44
+ @classmethod
45
+ def dispatch(
46
+ cls, transport: Transport, request: RequestValues
47
+ ) -> Response[CategoriesResponse | ErrorResponse]:
48
+ """Convert validated CLI inputs and call the explicitly typed method."""
49
+ return cls.execute(
50
+ transport=transport,
51
+ plan_id=request.value("path", "plan_id", TypeAdapter[str](str)),
52
+ last_knowledge_of_server=request.value(
53
+ "query",
54
+ "last_knowledge_of_server",
55
+ TypeAdapter[int | Unset](int | Unset),
56
+ ),
57
+ )
@@ -0,0 +1,52 @@
1
+ """Generated typed REST endpoint; regenerate rather than editing."""
2
+
3
+ from __future__ import annotations
4
+
5
+ from http import HTTPStatus
6
+
7
+ from pydantic import TypeAdapter
8
+
9
+ from ynab_api_cli.generated.models.category_response import CategoryResponse
10
+ from ynab_api_cli.generated.models.error_response import ErrorResponse
11
+ from ynab_api_cli.transport import Transport
12
+ from ynab_api_cli.types import UNSET, RequestValues, Response
13
+
14
+
15
+ class Endpoint:
16
+ """Typed getCategoryById operation."""
17
+
18
+ @classmethod
19
+ def execute(
20
+ cls,
21
+ *,
22
+ transport: Transport,
23
+ plan_id: str,
24
+ category_id: str,
25
+ ) -> Response[CategoryResponse | ErrorResponse]:
26
+ """Execute the typed request and retain its original response JSON."""
27
+ raw = transport.send(
28
+ "getCategoryById",
29
+ RequestValues(
30
+ path={
31
+ "plan_id": plan_id,
32
+ "category_id": category_id,
33
+ },
34
+ query={},
35
+ body=UNSET,
36
+ ),
37
+ )
38
+ if raw.status == HTTPStatus.OK:
39
+ parsed = CategoryResponse.model_validate(raw.raw)
40
+ return Response(raw.status, raw.raw, raw.headers, parsed)
41
+ raise ValueError("Validated response has no generated success binding.")
42
+
43
+ @classmethod
44
+ def dispatch(
45
+ cls, transport: Transport, request: RequestValues
46
+ ) -> Response[CategoryResponse | ErrorResponse]:
47
+ """Convert validated CLI inputs and call the explicitly typed method."""
48
+ return cls.execute(
49
+ transport=transport,
50
+ plan_id=request.value("path", "plan_id", TypeAdapter[str](str)),
51
+ category_id=request.value("path", "category_id", TypeAdapter[str](str)),
52
+ )
@@ -0,0 +1,58 @@
1
+ """Generated typed REST endpoint; regenerate rather than editing."""
2
+
3
+ from __future__ import annotations
4
+
5
+ import datetime
6
+ from http import HTTPStatus
7
+
8
+ from pydantic import TypeAdapter
9
+
10
+ from ynab_api_cli.generated.models.category_response import CategoryResponse
11
+ from ynab_api_cli.generated.models.error_response import ErrorResponse
12
+ from ynab_api_cli.transport import Transport
13
+ from ynab_api_cli.types import UNSET, RequestValues, Response
14
+
15
+
16
+ class Endpoint:
17
+ """Typed getMonthCategoryById operation."""
18
+
19
+ @classmethod
20
+ def execute(
21
+ cls,
22
+ *,
23
+ transport: Transport,
24
+ plan_id: str,
25
+ month: datetime.date,
26
+ category_id: str,
27
+ ) -> Response[CategoryResponse | ErrorResponse]:
28
+ """Execute the typed request and retain its original response JSON."""
29
+ raw = transport.send(
30
+ "getMonthCategoryById",
31
+ RequestValues(
32
+ path={
33
+ "plan_id": plan_id,
34
+ "month": month,
35
+ "category_id": category_id,
36
+ },
37
+ query={},
38
+ body=UNSET,
39
+ ),
40
+ )
41
+ if raw.status == HTTPStatus.OK:
42
+ parsed = CategoryResponse.model_validate(raw.raw)
43
+ return Response(raw.status, raw.raw, raw.headers, parsed)
44
+ raise ValueError("Validated response has no generated success binding.")
45
+
46
+ @classmethod
47
+ def dispatch(
48
+ cls, transport: Transport, request: RequestValues
49
+ ) -> Response[CategoryResponse | ErrorResponse]:
50
+ """Convert validated CLI inputs and call the explicitly typed method."""
51
+ return cls.execute(
52
+ transport=transport,
53
+ plan_id=request.value("path", "plan_id", TypeAdapter[str](str)),
54
+ month=request.value(
55
+ "path", "month", TypeAdapter[datetime.date](datetime.date)
56
+ ),
57
+ category_id=request.value("path", "category_id", TypeAdapter[str](str)),
58
+ )
@@ -0,0 +1,57 @@
1
+ """Generated typed REST endpoint; regenerate rather than editing."""
2
+
3
+ from __future__ import annotations
4
+
5
+ from http import HTTPStatus
6
+
7
+ from pydantic import TypeAdapter
8
+
9
+ from ynab_api_cli.generated.models.error_response import ErrorResponse
10
+ from ynab_api_cli.generated.models.patch_category_wrapper import PatchCategoryWrapper
11
+ from ynab_api_cli.generated.models.save_category_response import SaveCategoryResponse
12
+ from ynab_api_cli.transport import Transport
13
+ from ynab_api_cli.types import RequestValues, Response
14
+
15
+
16
+ class Endpoint:
17
+ """Typed updateCategory operation."""
18
+
19
+ @classmethod
20
+ def execute(
21
+ cls,
22
+ *,
23
+ transport: Transport,
24
+ plan_id: str,
25
+ category_id: str,
26
+ body: PatchCategoryWrapper,
27
+ ) -> Response[ErrorResponse | SaveCategoryResponse]:
28
+ """Execute the typed request and retain its original response JSON."""
29
+ raw = transport.send(
30
+ "updateCategory",
31
+ RequestValues(
32
+ path={
33
+ "plan_id": plan_id,
34
+ "category_id": category_id,
35
+ },
36
+ query={},
37
+ body=body,
38
+ ),
39
+ )
40
+ if raw.status == HTTPStatus.OK:
41
+ parsed = SaveCategoryResponse.model_validate(raw.raw)
42
+ return Response(raw.status, raw.raw, raw.headers, parsed)
43
+ raise ValueError("Validated response has no generated success binding.")
44
+
45
+ @classmethod
46
+ def dispatch(
47
+ cls, transport: Transport, request: RequestValues
48
+ ) -> Response[ErrorResponse | SaveCategoryResponse]:
49
+ """Convert validated CLI inputs and call the explicitly typed method."""
50
+ return cls.execute(
51
+ transport=transport,
52
+ plan_id=request.value("path", "plan_id", TypeAdapter[str](str)),
53
+ category_id=request.value("path", "category_id", TypeAdapter[str](str)),
54
+ body=TypeAdapter[PatchCategoryWrapper](
55
+ PatchCategoryWrapper
56
+ ).validate_python(request.body),
57
+ )