ynab-cli 0.3.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 (206) hide show
  1. ynab_cli/__init__.py +0 -0
  2. ynab_cli/adapters/__init__.py +0 -0
  3. ynab_cli/adapters/rich/__init__.py +0 -0
  4. ynab_cli/adapters/rich/io.py +38 -0
  5. ynab_cli/adapters/textual/__init__.py +0 -0
  6. ynab_cli/adapters/textual/io.py +62 -0
  7. ynab_cli/adapters/ynab/__init__.py +8 -0
  8. ynab_cli/adapters/ynab/api/__init__.py +1 -0
  9. ynab_cli/adapters/ynab/api/accounts/__init__.py +1 -0
  10. ynab_cli/adapters/ynab/api/accounts/create_account.py +186 -0
  11. ynab_cli/adapters/ynab/api/accounts/get_account_by_id.py +177 -0
  12. ynab_cli/adapters/ynab/api/accounts/get_accounts.py +184 -0
  13. ynab_cli/adapters/ynab/api/budgets/__init__.py +1 -0
  14. ynab_cli/adapters/ynab/api/budgets/get_budget_by_id.py +188 -0
  15. ynab_cli/adapters/ynab/api/budgets/get_budget_settings_by_id.py +163 -0
  16. ynab_cli/adapters/ynab/api/budgets/get_budgets.py +171 -0
  17. ynab_cli/adapters/ynab/api/categories/__init__.py +1 -0
  18. ynab_cli/adapters/ynab/api/categories/get_categories.py +188 -0
  19. ynab_cli/adapters/ynab/api/categories/get_category_by_id.py +180 -0
  20. ynab_cli/adapters/ynab/api/categories/get_month_category_by_id.py +194 -0
  21. ynab_cli/adapters/ynab/api/categories/update_category.py +199 -0
  22. ynab_cli/adapters/ynab/api/categories/update_month_category.py +213 -0
  23. ynab_cli/adapters/ynab/api/months/__init__.py +1 -0
  24. ynab_cli/adapters/ynab/api/months/get_budget_month.py +177 -0
  25. ynab_cli/adapters/ynab/api/months/get_budget_months.py +184 -0
  26. ynab_cli/adapters/ynab/api/payee_locations/__init__.py +1 -0
  27. ynab_cli/adapters/ynab/api/payee_locations/get_payee_location_by_id.py +176 -0
  28. ynab_cli/adapters/ynab/api/payee_locations/get_payee_locations.py +163 -0
  29. ynab_cli/adapters/ynab/api/payee_locations/get_payee_locations_by_payee.py +176 -0
  30. ynab_cli/adapters/ynab/api/payees/__init__.py +1 -0
  31. ynab_cli/adapters/ynab/api/payees/get_payee_by_id.py +176 -0
  32. ynab_cli/adapters/ynab/api/payees/get_payees.py +184 -0
  33. ynab_cli/adapters/ynab/api/payees/update_payee.py +199 -0
  34. ynab_cli/adapters/ynab/api/scheduled_transactions/__init__.py +1 -0
  35. ynab_cli/adapters/ynab/api/scheduled_transactions/create_scheduled_transaction.py +186 -0
  36. ynab_cli/adapters/ynab/api/scheduled_transactions/delete_scheduled_transaction.py +176 -0
  37. ynab_cli/adapters/ynab/api/scheduled_transactions/get_scheduled_transaction_by_id.py +176 -0
  38. ynab_cli/adapters/ynab/api/scheduled_transactions/get_scheduled_transactions.py +184 -0
  39. ynab_cli/adapters/ynab/api/scheduled_transactions/update_scheduled_transaction.py +199 -0
  40. ynab_cli/adapters/ynab/api/transactions/__init__.py +1 -0
  41. ynab_cli/adapters/ynab/api/transactions/create_transaction.py +202 -0
  42. ynab_cli/adapters/ynab/api/transactions/delete_transaction.py +176 -0
  43. ynab_cli/adapters/ynab/api/transactions/get_transaction_by_id.py +176 -0
  44. ynab_cli/adapters/ynab/api/transactions/get_transactions.py +227 -0
  45. ynab_cli/adapters/ynab/api/transactions/get_transactions_by_account.py +236 -0
  46. ynab_cli/adapters/ynab/api/transactions/get_transactions_by_category.py +236 -0
  47. ynab_cli/adapters/ynab/api/transactions/get_transactions_by_month.py +236 -0
  48. ynab_cli/adapters/ynab/api/transactions/get_transactions_by_payee.py +236 -0
  49. ynab_cli/adapters/ynab/api/transactions/import_transactions.py +183 -0
  50. ynab_cli/adapters/ynab/api/transactions/update_transaction.py +199 -0
  51. ynab_cli/adapters/ynab/api/transactions/update_transactions.py +177 -0
  52. ynab_cli/adapters/ynab/api/user/__init__.py +1 -0
  53. ynab_cli/adapters/ynab/api/user/get_user.py +130 -0
  54. ynab_cli/adapters/ynab/client.py +268 -0
  55. ynab_cli/adapters/ynab/errors.py +16 -0
  56. ynab_cli/adapters/ynab/models/__init__.py +229 -0
  57. ynab_cli/adapters/ynab/models/account.py +345 -0
  58. ynab_cli/adapters/ynab/models/account_response.py +65 -0
  59. ynab_cli/adapters/ynab/models/account_response_data.py +65 -0
  60. ynab_cli/adapters/ynab/models/account_type.py +23 -0
  61. ynab_cli/adapters/ynab/models/accounts_response.py +65 -0
  62. ynab_cli/adapters/ynab/models/accounts_response_data.py +81 -0
  63. ynab_cli/adapters/ynab/models/budget_detail.py +405 -0
  64. ynab_cli/adapters/ynab/models/budget_detail_response.py +65 -0
  65. ynab_cli/adapters/ynab/models/budget_detail_response_data.py +73 -0
  66. ynab_cli/adapters/ynab/models/budget_settings.py +115 -0
  67. ynab_cli/adapters/ynab/models/budget_settings_response.py +65 -0
  68. ynab_cli/adapters/ynab/models/budget_settings_response_data.py +65 -0
  69. ynab_cli/adapters/ynab/models/budget_summary.py +216 -0
  70. ynab_cli/adapters/ynab/models/budget_summary_response.py +65 -0
  71. ynab_cli/adapters/ynab/models/budget_summary_response_data.py +91 -0
  72. ynab_cli/adapters/ynab/models/bulk_response.py +65 -0
  73. ynab_cli/adapters/ynab/models/bulk_response_data.py +65 -0
  74. ynab_cli/adapters/ynab/models/bulk_response_data_bulk.py +68 -0
  75. ynab_cli/adapters/ynab/models/bulk_transactions.py +75 -0
  76. ynab_cli/adapters/ynab/models/categories_response.py +65 -0
  77. ynab_cli/adapters/ynab/models/categories_response_data.py +81 -0
  78. ynab_cli/adapters/ynab/models/category.py +519 -0
  79. ynab_cli/adapters/ynab/models/category_goal_type_type_1.py +15 -0
  80. ynab_cli/adapters/ynab/models/category_goal_type_type_2_type_1.py +15 -0
  81. ynab_cli/adapters/ynab/models/category_goal_type_type_3_type_1.py +15 -0
  82. ynab_cli/adapters/ynab/models/category_group.py +85 -0
  83. ynab_cli/adapters/ynab/models/category_group_with_categories.py +108 -0
  84. ynab_cli/adapters/ynab/models/category_response.py +65 -0
  85. ynab_cli/adapters/ynab/models/category_response_data.py +65 -0
  86. ynab_cli/adapters/ynab/models/currency_format_type_0.py +117 -0
  87. ynab_cli/adapters/ynab/models/date_format_type_0.py +61 -0
  88. ynab_cli/adapters/ynab/models/error_detail.py +75 -0
  89. ynab_cli/adapters/ynab/models/error_response.py +65 -0
  90. ynab_cli/adapters/ynab/models/existing_transaction.py +322 -0
  91. ynab_cli/adapters/ynab/models/get_transactions_by_account_type.py +12 -0
  92. ynab_cli/adapters/ynab/models/get_transactions_by_category_type.py +12 -0
  93. ynab_cli/adapters/ynab/models/get_transactions_by_month_type.py +12 -0
  94. ynab_cli/adapters/ynab/models/get_transactions_by_payee_type.py +12 -0
  95. ynab_cli/adapters/ynab/models/get_transactions_type.py +12 -0
  96. ynab_cli/adapters/ynab/models/hybrid_transaction.py +567 -0
  97. ynab_cli/adapters/ynab/models/hybrid_transaction_type.py +12 -0
  98. ynab_cli/adapters/ynab/models/hybrid_transactions_response.py +65 -0
  99. ynab_cli/adapters/ynab/models/hybrid_transactions_response_data.py +84 -0
  100. ynab_cli/adapters/ynab/models/loan_account_periodic_value_type_0.py +44 -0
  101. ynab_cli/adapters/ynab/models/month_detail.py +168 -0
  102. ynab_cli/adapters/ynab/models/month_detail_response.py +65 -0
  103. ynab_cli/adapters/ynab/models/month_detail_response_data.py +65 -0
  104. ynab_cli/adapters/ynab/models/month_summaries_response.py +65 -0
  105. ynab_cli/adapters/ynab/models/month_summaries_response_data.py +81 -0
  106. ynab_cli/adapters/ynab/models/month_summary.py +145 -0
  107. ynab_cli/adapters/ynab/models/new_transaction.py +352 -0
  108. ynab_cli/adapters/ynab/models/patch_category_wrapper.py +65 -0
  109. ynab_cli/adapters/ynab/models/patch_month_category_wrapper.py +65 -0
  110. ynab_cli/adapters/ynab/models/patch_payee_wrapper.py +65 -0
  111. ynab_cli/adapters/ynab/models/patch_transactions_wrapper.py +73 -0
  112. ynab_cli/adapters/ynab/models/payee.py +100 -0
  113. ynab_cli/adapters/ynab/models/payee_location.py +93 -0
  114. ynab_cli/adapters/ynab/models/payee_location_response.py +65 -0
  115. ynab_cli/adapters/ynab/models/payee_location_response_data.py +65 -0
  116. ynab_cli/adapters/ynab/models/payee_locations_response.py +65 -0
  117. ynab_cli/adapters/ynab/models/payee_locations_response_data.py +73 -0
  118. ynab_cli/adapters/ynab/models/payee_response.py +65 -0
  119. ynab_cli/adapters/ynab/models/payee_response_data.py +65 -0
  120. ynab_cli/adapters/ynab/models/payees_response.py +65 -0
  121. ynab_cli/adapters/ynab/models/payees_response_data.py +81 -0
  122. ynab_cli/adapters/ynab/models/post_account_wrapper.py +65 -0
  123. ynab_cli/adapters/ynab/models/post_scheduled_transaction_wrapper.py +65 -0
  124. ynab_cli/adapters/ynab/models/post_transactions_wrapper.py +91 -0
  125. ynab_cli/adapters/ynab/models/put_scheduled_transaction_wrapper.py +65 -0
  126. ynab_cli/adapters/ynab/models/put_transaction_wrapper.py +65 -0
  127. ynab_cli/adapters/ynab/models/save_account.py +77 -0
  128. ynab_cli/adapters/ynab/models/save_category.py +129 -0
  129. ynab_cli/adapters/ynab/models/save_category_response.py +65 -0
  130. ynab_cli/adapters/ynab/models/save_category_response_data.py +73 -0
  131. ynab_cli/adapters/ynab/models/save_month_category.py +59 -0
  132. ynab_cli/adapters/ynab/models/save_payee.py +59 -0
  133. ynab_cli/adapters/ynab/models/save_payee_response.py +65 -0
  134. ynab_cli/adapters/ynab/models/save_payee_response_data.py +73 -0
  135. ynab_cli/adapters/ynab/models/save_scheduled_transaction.py +269 -0
  136. ynab_cli/adapters/ynab/models/save_sub_transaction.py +166 -0
  137. ynab_cli/adapters/ynab/models/save_transaction_with_id_or_import_id.py +366 -0
  138. ynab_cli/adapters/ynab/models/save_transaction_with_optional_fields.py +322 -0
  139. ynab_cli/adapters/ynab/models/save_transactions_response.py +65 -0
  140. ynab_cli/adapters/ynab/models/save_transactions_response_data.py +123 -0
  141. ynab_cli/adapters/ynab/models/scheduled_sub_transaction.py +238 -0
  142. ynab_cli/adapters/ynab/models/scheduled_transaction_detail.py +381 -0
  143. ynab_cli/adapters/ynab/models/scheduled_transaction_frequency.py +23 -0
  144. ynab_cli/adapters/ynab/models/scheduled_transaction_response.py +65 -0
  145. ynab_cli/adapters/ynab/models/scheduled_transaction_response_data.py +65 -0
  146. ynab_cli/adapters/ynab/models/scheduled_transaction_summary.py +310 -0
  147. ynab_cli/adapters/ynab/models/scheduled_transaction_summary_frequency.py +23 -0
  148. ynab_cli/adapters/ynab/models/scheduled_transactions_response.py +65 -0
  149. ynab_cli/adapters/ynab/models/scheduled_transactions_response_data.py +81 -0
  150. ynab_cli/adapters/ynab/models/sub_transaction.py +259 -0
  151. ynab_cli/adapters/ynab/models/transaction_cleared_status.py +13 -0
  152. ynab_cli/adapters/ynab/models/transaction_detail.py +570 -0
  153. ynab_cli/adapters/ynab/models/transaction_flag_color_type_1.py +16 -0
  154. ynab_cli/adapters/ynab/models/transaction_flag_color_type_2_type_1.py +16 -0
  155. ynab_cli/adapters/ynab/models/transaction_flag_color_type_3_type_1.py +16 -0
  156. ynab_cli/adapters/ynab/models/transaction_response.py +65 -0
  157. ynab_cli/adapters/ynab/models/transaction_response_data.py +65 -0
  158. ynab_cli/adapters/ynab/models/transaction_summary.py +499 -0
  159. ynab_cli/adapters/ynab/models/transaction_summary_debt_transaction_type_type_1.py +18 -0
  160. ynab_cli/adapters/ynab/models/transaction_summary_debt_transaction_type_type_2_type_1.py +18 -0
  161. ynab_cli/adapters/ynab/models/transaction_summary_debt_transaction_type_type_3_type_1.py +18 -0
  162. ynab_cli/adapters/ynab/models/transactions_import_response.py +65 -0
  163. ynab_cli/adapters/ynab/models/transactions_import_response_data.py +59 -0
  164. ynab_cli/adapters/ynab/models/transactions_response.py +65 -0
  165. ynab_cli/adapters/ynab/models/transactions_response_data.py +81 -0
  166. ynab_cli/adapters/ynab/models/user.py +60 -0
  167. ynab_cli/adapters/ynab/models/user_response.py +65 -0
  168. ynab_cli/adapters/ynab/models/user_response_data.py +65 -0
  169. ynab_cli/adapters/ynab/types.py +46 -0
  170. ynab_cli/adapters/ynab/util.py +78 -0
  171. ynab_cli/domain/__init__.py +0 -0
  172. ynab_cli/domain/constants.py +3 -0
  173. ynab_cli/domain/models/__init__.py +0 -0
  174. ynab_cli/domain/models/rules.py +37 -0
  175. ynab_cli/domain/ports/__init__.py +5 -0
  176. ynab_cli/domain/ports/io.py +63 -0
  177. ynab_cli/domain/settings.py +16 -0
  178. ynab_cli/domain/use_cases/__init__.py +0 -0
  179. ynab_cli/domain/use_cases/categories.py +105 -0
  180. ynab_cli/domain/use_cases/payees.py +232 -0
  181. ynab_cli/domain/use_cases/transactions.py +93 -0
  182. ynab_cli/host/__init__.py +14 -0
  183. ynab_cli/host/cli.py +37 -0
  184. ynab_cli/host/click/__init__.py +0 -0
  185. ynab_cli/host/click/cli.py +44 -0
  186. ynab_cli/host/click/commands/__init__.py +0 -0
  187. ynab_cli/host/click/commands/categories.py +92 -0
  188. ynab_cli/host/click/commands/payees.py +157 -0
  189. ynab_cli/host/click/commands/rich/__init__.py +0 -0
  190. ynab_cli/host/click/commands/rich/progress_table.py +37 -0
  191. ynab_cli/host/click/commands/transactions.py +76 -0
  192. ynab_cli/host/constants.py +3 -0
  193. ynab_cli/host/textual/__init__.py +0 -0
  194. ynab_cli/host/textual/app.py +98 -0
  195. ynab_cli/host/textual/app.tcss +47 -0
  196. ynab_cli/host/textual/cli.py +42 -0
  197. ynab_cli/host/textual/widgets/__init__.py +58 -0
  198. ynab_cli/host/textual/widgets/categories.py +90 -0
  199. ynab_cli/host/textual/widgets/payees.py +154 -0
  200. ynab_cli/host/textual/widgets/transactions.py +89 -0
  201. ynab_cli/py.typed +0 -0
  202. ynab_cli-0.3.0.dist-info/METADATA +102 -0
  203. ynab_cli-0.3.0.dist-info/RECORD +206 -0
  204. ynab_cli-0.3.0.dist-info/WHEEL +4 -0
  205. ynab_cli-0.3.0.dist-info/entry_points.txt +2 -0
  206. ynab_cli-0.3.0.dist-info/licenses/LICENSE.md +21 -0
@@ -0,0 +1,176 @@
1
+ from http import HTTPStatus
2
+ from typing import Any
3
+
4
+ import httpx
5
+
6
+ from ynab_cli.adapters.ynab import errors
7
+ from ynab_cli.adapters.ynab.client import AuthenticatedClient, Client
8
+ from ynab_cli.adapters.ynab.models.error_response import ErrorResponse
9
+ from ynab_cli.adapters.ynab.models.payee_location_response import PayeeLocationResponse
10
+ from ynab_cli.adapters.ynab.types import Response
11
+
12
+
13
+ def _get_kwargs(
14
+ budget_id: str,
15
+ payee_location_id: str,
16
+ ) -> dict[str, Any]:
17
+ _kwargs: dict[str, Any] = {
18
+ "method": "get",
19
+ "url": f"/budgets/{budget_id}/payee_locations/{payee_location_id}",
20
+ }
21
+
22
+ return _kwargs
23
+
24
+
25
+ def _parse_response(
26
+ *, client: AuthenticatedClient | Client, response: httpx.Response
27
+ ) -> ErrorResponse | PayeeLocationResponse | None:
28
+ if response.status_code == 200:
29
+ response_200 = PayeeLocationResponse.from_dict(response.json())
30
+
31
+ return response_200
32
+ if response.status_code == 404:
33
+ response_404 = ErrorResponse.from_dict(response.json())
34
+
35
+ return response_404
36
+ if client.raise_on_unexpected_status:
37
+ raise errors.UnexpectedStatusError(response.status_code, response.content)
38
+ else:
39
+ return None
40
+
41
+
42
+ def _build_response(
43
+ *, client: AuthenticatedClient | Client, response: httpx.Response
44
+ ) -> Response[ErrorResponse | PayeeLocationResponse]:
45
+ return Response(
46
+ status_code=HTTPStatus(response.status_code),
47
+ content=response.content,
48
+ headers=response.headers,
49
+ parsed=_parse_response(client=client, response=response),
50
+ )
51
+
52
+
53
+ def sync_detailed(
54
+ budget_id: str,
55
+ payee_location_id: str,
56
+ *,
57
+ client: AuthenticatedClient | Client,
58
+ ) -> Response[ErrorResponse | PayeeLocationResponse]:
59
+ """Single payee location
60
+
61
+ Returns a single payee location
62
+
63
+ Args:
64
+ budget_id (str):
65
+ payee_location_id (str):
66
+
67
+ Raises:
68
+ errors.UnexpectedStatusError: If the server returns an undocumented status code and Client.raise_on_unexpected_status is True.
69
+ httpx.TimeoutException: If the request takes longer than Client.timeout.
70
+
71
+ Returns:
72
+ Response[Union[ErrorResponse, PayeeLocationResponse]]
73
+ """
74
+
75
+ kwargs = _get_kwargs(
76
+ budget_id=budget_id,
77
+ payee_location_id=payee_location_id,
78
+ )
79
+
80
+ response = client.get_httpx_client().request(
81
+ **kwargs,
82
+ )
83
+
84
+ return _build_response(client=client, response=response)
85
+
86
+
87
+ def sync(
88
+ budget_id: str,
89
+ payee_location_id: str,
90
+ *,
91
+ client: AuthenticatedClient | Client,
92
+ ) -> ErrorResponse | PayeeLocationResponse | None:
93
+ """Single payee location
94
+
95
+ Returns a single payee location
96
+
97
+ Args:
98
+ budget_id (str):
99
+ payee_location_id (str):
100
+
101
+ Raises:
102
+ errors.UnexpectedStatusError: If the server returns an undocumented status code and Client.raise_on_unexpected_status is True.
103
+ httpx.TimeoutException: If the request takes longer than Client.timeout.
104
+
105
+ Returns:
106
+ Union[ErrorResponse, PayeeLocationResponse]
107
+ """
108
+
109
+ return sync_detailed(
110
+ budget_id=budget_id,
111
+ payee_location_id=payee_location_id,
112
+ client=client,
113
+ ).parsed
114
+
115
+
116
+ async def asyncio_detailed(
117
+ budget_id: str,
118
+ payee_location_id: str,
119
+ *,
120
+ client: AuthenticatedClient | Client,
121
+ ) -> Response[ErrorResponse | PayeeLocationResponse]:
122
+ """Single payee location
123
+
124
+ Returns a single payee location
125
+
126
+ Args:
127
+ budget_id (str):
128
+ payee_location_id (str):
129
+
130
+ Raises:
131
+ errors.UnexpectedStatusError: If the server returns an undocumented status code and Client.raise_on_unexpected_status is True.
132
+ httpx.TimeoutException: If the request takes longer than Client.timeout.
133
+
134
+ Returns:
135
+ Response[Union[ErrorResponse, PayeeLocationResponse]]
136
+ """
137
+
138
+ kwargs = _get_kwargs(
139
+ budget_id=budget_id,
140
+ payee_location_id=payee_location_id,
141
+ )
142
+
143
+ response = await client.get_async_httpx_client().request(**kwargs)
144
+
145
+ return _build_response(client=client, response=response)
146
+
147
+
148
+ async def asyncio(
149
+ budget_id: str,
150
+ payee_location_id: str,
151
+ *,
152
+ client: AuthenticatedClient | Client,
153
+ ) -> ErrorResponse | PayeeLocationResponse | None:
154
+ """Single payee location
155
+
156
+ Returns a single payee location
157
+
158
+ Args:
159
+ budget_id (str):
160
+ payee_location_id (str):
161
+
162
+ Raises:
163
+ errors.UnexpectedStatusError: If the server returns an undocumented status code and Client.raise_on_unexpected_status is True.
164
+ httpx.TimeoutException: If the request takes longer than Client.timeout.
165
+
166
+ Returns:
167
+ Union[ErrorResponse, PayeeLocationResponse]
168
+ """
169
+
170
+ return (
171
+ await asyncio_detailed(
172
+ budget_id=budget_id,
173
+ payee_location_id=payee_location_id,
174
+ client=client,
175
+ )
176
+ ).parsed
@@ -0,0 +1,163 @@
1
+ from http import HTTPStatus
2
+ from typing import Any
3
+
4
+ import httpx
5
+
6
+ from ynab_cli.adapters.ynab import errors
7
+ from ynab_cli.adapters.ynab.client import AuthenticatedClient, Client
8
+ from ynab_cli.adapters.ynab.models.error_response import ErrorResponse
9
+ from ynab_cli.adapters.ynab.models.payee_locations_response import PayeeLocationsResponse
10
+ from ynab_cli.adapters.ynab.types import Response
11
+
12
+
13
+ def _get_kwargs(
14
+ budget_id: str,
15
+ ) -> dict[str, Any]:
16
+ _kwargs: dict[str, Any] = {
17
+ "method": "get",
18
+ "url": f"/budgets/{budget_id}/payee_locations",
19
+ }
20
+
21
+ return _kwargs
22
+
23
+
24
+ def _parse_response(
25
+ *, client: AuthenticatedClient | Client, response: httpx.Response
26
+ ) -> ErrorResponse | PayeeLocationsResponse | None:
27
+ if response.status_code == 200:
28
+ response_200 = PayeeLocationsResponse.from_dict(response.json())
29
+
30
+ return response_200
31
+ if response.status_code == 404:
32
+ response_404 = ErrorResponse.from_dict(response.json())
33
+
34
+ return response_404
35
+ if client.raise_on_unexpected_status:
36
+ raise errors.UnexpectedStatusError(response.status_code, response.content)
37
+ else:
38
+ return None
39
+
40
+
41
+ def _build_response(
42
+ *, client: AuthenticatedClient | Client, response: httpx.Response
43
+ ) -> Response[ErrorResponse | PayeeLocationsResponse]:
44
+ return Response(
45
+ status_code=HTTPStatus(response.status_code),
46
+ content=response.content,
47
+ headers=response.headers,
48
+ parsed=_parse_response(client=client, response=response),
49
+ )
50
+
51
+
52
+ def sync_detailed(
53
+ budget_id: str,
54
+ *,
55
+ client: AuthenticatedClient | Client,
56
+ ) -> Response[ErrorResponse | PayeeLocationsResponse]:
57
+ """List payee locations
58
+
59
+ Returns all payee locations
60
+
61
+ Args:
62
+ budget_id (str):
63
+
64
+ Raises:
65
+ errors.UnexpectedStatusError: If the server returns an undocumented status code and Client.raise_on_unexpected_status is True.
66
+ httpx.TimeoutException: If the request takes longer than Client.timeout.
67
+
68
+ Returns:
69
+ Response[Union[ErrorResponse, PayeeLocationsResponse]]
70
+ """
71
+
72
+ kwargs = _get_kwargs(
73
+ budget_id=budget_id,
74
+ )
75
+
76
+ response = client.get_httpx_client().request(
77
+ **kwargs,
78
+ )
79
+
80
+ return _build_response(client=client, response=response)
81
+
82
+
83
+ def sync(
84
+ budget_id: str,
85
+ *,
86
+ client: AuthenticatedClient | Client,
87
+ ) -> ErrorResponse | PayeeLocationsResponse | None:
88
+ """List payee locations
89
+
90
+ Returns all payee locations
91
+
92
+ Args:
93
+ budget_id (str):
94
+
95
+ Raises:
96
+ errors.UnexpectedStatusError: If the server returns an undocumented status code and Client.raise_on_unexpected_status is True.
97
+ httpx.TimeoutException: If the request takes longer than Client.timeout.
98
+
99
+ Returns:
100
+ Union[ErrorResponse, PayeeLocationsResponse]
101
+ """
102
+
103
+ return sync_detailed(
104
+ budget_id=budget_id,
105
+ client=client,
106
+ ).parsed
107
+
108
+
109
+ async def asyncio_detailed(
110
+ budget_id: str,
111
+ *,
112
+ client: AuthenticatedClient | Client,
113
+ ) -> Response[ErrorResponse | PayeeLocationsResponse]:
114
+ """List payee locations
115
+
116
+ Returns all payee locations
117
+
118
+ Args:
119
+ budget_id (str):
120
+
121
+ Raises:
122
+ errors.UnexpectedStatusError: If the server returns an undocumented status code and Client.raise_on_unexpected_status is True.
123
+ httpx.TimeoutException: If the request takes longer than Client.timeout.
124
+
125
+ Returns:
126
+ Response[Union[ErrorResponse, PayeeLocationsResponse]]
127
+ """
128
+
129
+ kwargs = _get_kwargs(
130
+ budget_id=budget_id,
131
+ )
132
+
133
+ response = await client.get_async_httpx_client().request(**kwargs)
134
+
135
+ return _build_response(client=client, response=response)
136
+
137
+
138
+ async def asyncio(
139
+ budget_id: str,
140
+ *,
141
+ client: AuthenticatedClient | Client,
142
+ ) -> ErrorResponse | PayeeLocationsResponse | None:
143
+ """List payee locations
144
+
145
+ Returns all payee locations
146
+
147
+ Args:
148
+ budget_id (str):
149
+
150
+ Raises:
151
+ errors.UnexpectedStatusError: If the server returns an undocumented status code and Client.raise_on_unexpected_status is True.
152
+ httpx.TimeoutException: If the request takes longer than Client.timeout.
153
+
154
+ Returns:
155
+ Union[ErrorResponse, PayeeLocationsResponse]
156
+ """
157
+
158
+ return (
159
+ await asyncio_detailed(
160
+ budget_id=budget_id,
161
+ client=client,
162
+ )
163
+ ).parsed
@@ -0,0 +1,176 @@
1
+ from http import HTTPStatus
2
+ from typing import Any
3
+
4
+ import httpx
5
+
6
+ from ynab_cli.adapters.ynab import errors
7
+ from ynab_cli.adapters.ynab.client import AuthenticatedClient, Client
8
+ from ynab_cli.adapters.ynab.models.error_response import ErrorResponse
9
+ from ynab_cli.adapters.ynab.models.payee_locations_response import PayeeLocationsResponse
10
+ from ynab_cli.adapters.ynab.types import Response
11
+
12
+
13
+ def _get_kwargs(
14
+ budget_id: str,
15
+ payee_id: str,
16
+ ) -> dict[str, Any]:
17
+ _kwargs: dict[str, Any] = {
18
+ "method": "get",
19
+ "url": f"/budgets/{budget_id}/payees/{payee_id}/payee_locations",
20
+ }
21
+
22
+ return _kwargs
23
+
24
+
25
+ def _parse_response(
26
+ *, client: AuthenticatedClient | Client, response: httpx.Response
27
+ ) -> ErrorResponse | PayeeLocationsResponse | None:
28
+ if response.status_code == 200:
29
+ response_200 = PayeeLocationsResponse.from_dict(response.json())
30
+
31
+ return response_200
32
+ if response.status_code == 404:
33
+ response_404 = ErrorResponse.from_dict(response.json())
34
+
35
+ return response_404
36
+ if client.raise_on_unexpected_status:
37
+ raise errors.UnexpectedStatusError(response.status_code, response.content)
38
+ else:
39
+ return None
40
+
41
+
42
+ def _build_response(
43
+ *, client: AuthenticatedClient | Client, response: httpx.Response
44
+ ) -> Response[ErrorResponse | PayeeLocationsResponse]:
45
+ return Response(
46
+ status_code=HTTPStatus(response.status_code),
47
+ content=response.content,
48
+ headers=response.headers,
49
+ parsed=_parse_response(client=client, response=response),
50
+ )
51
+
52
+
53
+ def sync_detailed(
54
+ budget_id: str,
55
+ payee_id: str,
56
+ *,
57
+ client: AuthenticatedClient | Client,
58
+ ) -> Response[ErrorResponse | PayeeLocationsResponse]:
59
+ """List locations for a payee
60
+
61
+ Returns all payee locations for a specified payee
62
+
63
+ Args:
64
+ budget_id (str):
65
+ payee_id (str):
66
+
67
+ Raises:
68
+ errors.UnexpectedStatusError: If the server returns an undocumented status code and Client.raise_on_unexpected_status is True.
69
+ httpx.TimeoutException: If the request takes longer than Client.timeout.
70
+
71
+ Returns:
72
+ Response[Union[ErrorResponse, PayeeLocationsResponse]]
73
+ """
74
+
75
+ kwargs = _get_kwargs(
76
+ budget_id=budget_id,
77
+ payee_id=payee_id,
78
+ )
79
+
80
+ response = client.get_httpx_client().request(
81
+ **kwargs,
82
+ )
83
+
84
+ return _build_response(client=client, response=response)
85
+
86
+
87
+ def sync(
88
+ budget_id: str,
89
+ payee_id: str,
90
+ *,
91
+ client: AuthenticatedClient | Client,
92
+ ) -> ErrorResponse | PayeeLocationsResponse | None:
93
+ """List locations for a payee
94
+
95
+ Returns all payee locations for a specified payee
96
+
97
+ Args:
98
+ budget_id (str):
99
+ payee_id (str):
100
+
101
+ Raises:
102
+ errors.UnexpectedStatusError: If the server returns an undocumented status code and Client.raise_on_unexpected_status is True.
103
+ httpx.TimeoutException: If the request takes longer than Client.timeout.
104
+
105
+ Returns:
106
+ Union[ErrorResponse, PayeeLocationsResponse]
107
+ """
108
+
109
+ return sync_detailed(
110
+ budget_id=budget_id,
111
+ payee_id=payee_id,
112
+ client=client,
113
+ ).parsed
114
+
115
+
116
+ async def asyncio_detailed(
117
+ budget_id: str,
118
+ payee_id: str,
119
+ *,
120
+ client: AuthenticatedClient | Client,
121
+ ) -> Response[ErrorResponse | PayeeLocationsResponse]:
122
+ """List locations for a payee
123
+
124
+ Returns all payee locations for a specified payee
125
+
126
+ Args:
127
+ budget_id (str):
128
+ payee_id (str):
129
+
130
+ Raises:
131
+ errors.UnexpectedStatusError: If the server returns an undocumented status code and Client.raise_on_unexpected_status is True.
132
+ httpx.TimeoutException: If the request takes longer than Client.timeout.
133
+
134
+ Returns:
135
+ Response[Union[ErrorResponse, PayeeLocationsResponse]]
136
+ """
137
+
138
+ kwargs = _get_kwargs(
139
+ budget_id=budget_id,
140
+ payee_id=payee_id,
141
+ )
142
+
143
+ response = await client.get_async_httpx_client().request(**kwargs)
144
+
145
+ return _build_response(client=client, response=response)
146
+
147
+
148
+ async def asyncio(
149
+ budget_id: str,
150
+ payee_id: str,
151
+ *,
152
+ client: AuthenticatedClient | Client,
153
+ ) -> ErrorResponse | PayeeLocationsResponse | None:
154
+ """List locations for a payee
155
+
156
+ Returns all payee locations for a specified payee
157
+
158
+ Args:
159
+ budget_id (str):
160
+ payee_id (str):
161
+
162
+ Raises:
163
+ errors.UnexpectedStatusError: If the server returns an undocumented status code and Client.raise_on_unexpected_status is True.
164
+ httpx.TimeoutException: If the request takes longer than Client.timeout.
165
+
166
+ Returns:
167
+ Union[ErrorResponse, PayeeLocationsResponse]
168
+ """
169
+
170
+ return (
171
+ await asyncio_detailed(
172
+ budget_id=budget_id,
173
+ payee_id=payee_id,
174
+ client=client,
175
+ )
176
+ ).parsed
@@ -0,0 +1 @@
1
+ """Contains endpoint functions for accessing the API"""
@@ -0,0 +1,176 @@
1
+ from http import HTTPStatus
2
+ from typing import Any
3
+
4
+ import httpx
5
+
6
+ from ynab_cli.adapters.ynab import errors
7
+ from ynab_cli.adapters.ynab.client import AuthenticatedClient, Client
8
+ from ynab_cli.adapters.ynab.models.error_response import ErrorResponse
9
+ from ynab_cli.adapters.ynab.models.payee_response import PayeeResponse
10
+ from ynab_cli.adapters.ynab.types import Response
11
+
12
+
13
+ def _get_kwargs(
14
+ budget_id: str,
15
+ payee_id: str,
16
+ ) -> dict[str, Any]:
17
+ _kwargs: dict[str, Any] = {
18
+ "method": "get",
19
+ "url": f"/budgets/{budget_id}/payees/{payee_id}",
20
+ }
21
+
22
+ return _kwargs
23
+
24
+
25
+ def _parse_response(
26
+ *, client: AuthenticatedClient | Client, response: httpx.Response
27
+ ) -> ErrorResponse | PayeeResponse | None:
28
+ if response.status_code == 200:
29
+ response_200 = PayeeResponse.from_dict(response.json())
30
+
31
+ return response_200
32
+ if response.status_code == 404:
33
+ response_404 = ErrorResponse.from_dict(response.json())
34
+
35
+ return response_404
36
+ if client.raise_on_unexpected_status:
37
+ raise errors.UnexpectedStatusError(response.status_code, response.content)
38
+ else:
39
+ return None
40
+
41
+
42
+ def _build_response(
43
+ *, client: AuthenticatedClient | Client, response: httpx.Response
44
+ ) -> Response[ErrorResponse | PayeeResponse]:
45
+ return Response(
46
+ status_code=HTTPStatus(response.status_code),
47
+ content=response.content,
48
+ headers=response.headers,
49
+ parsed=_parse_response(client=client, response=response),
50
+ )
51
+
52
+
53
+ def sync_detailed(
54
+ budget_id: str,
55
+ payee_id: str,
56
+ *,
57
+ client: AuthenticatedClient | Client,
58
+ ) -> Response[ErrorResponse | PayeeResponse]:
59
+ """Single payee
60
+
61
+ Returns a single payee
62
+
63
+ Args:
64
+ budget_id (str):
65
+ payee_id (str):
66
+
67
+ Raises:
68
+ errors.UnexpectedStatusError: If the server returns an undocumented status code and Client.raise_on_unexpected_status is True.
69
+ httpx.TimeoutException: If the request takes longer than Client.timeout.
70
+
71
+ Returns:
72
+ Response[Union[ErrorResponse, PayeeResponse]]
73
+ """
74
+
75
+ kwargs = _get_kwargs(
76
+ budget_id=budget_id,
77
+ payee_id=payee_id,
78
+ )
79
+
80
+ response = client.get_httpx_client().request(
81
+ **kwargs,
82
+ )
83
+
84
+ return _build_response(client=client, response=response)
85
+
86
+
87
+ def sync(
88
+ budget_id: str,
89
+ payee_id: str,
90
+ *,
91
+ client: AuthenticatedClient | Client,
92
+ ) -> ErrorResponse | PayeeResponse | None:
93
+ """Single payee
94
+
95
+ Returns a single payee
96
+
97
+ Args:
98
+ budget_id (str):
99
+ payee_id (str):
100
+
101
+ Raises:
102
+ errors.UnexpectedStatusError: If the server returns an undocumented status code and Client.raise_on_unexpected_status is True.
103
+ httpx.TimeoutException: If the request takes longer than Client.timeout.
104
+
105
+ Returns:
106
+ Union[ErrorResponse, PayeeResponse]
107
+ """
108
+
109
+ return sync_detailed(
110
+ budget_id=budget_id,
111
+ payee_id=payee_id,
112
+ client=client,
113
+ ).parsed
114
+
115
+
116
+ async def asyncio_detailed(
117
+ budget_id: str,
118
+ payee_id: str,
119
+ *,
120
+ client: AuthenticatedClient | Client,
121
+ ) -> Response[ErrorResponse | PayeeResponse]:
122
+ """Single payee
123
+
124
+ Returns a single payee
125
+
126
+ Args:
127
+ budget_id (str):
128
+ payee_id (str):
129
+
130
+ Raises:
131
+ errors.UnexpectedStatusError: If the server returns an undocumented status code and Client.raise_on_unexpected_status is True.
132
+ httpx.TimeoutException: If the request takes longer than Client.timeout.
133
+
134
+ Returns:
135
+ Response[Union[ErrorResponse, PayeeResponse]]
136
+ """
137
+
138
+ kwargs = _get_kwargs(
139
+ budget_id=budget_id,
140
+ payee_id=payee_id,
141
+ )
142
+
143
+ response = await client.get_async_httpx_client().request(**kwargs)
144
+
145
+ return _build_response(client=client, response=response)
146
+
147
+
148
+ async def asyncio(
149
+ budget_id: str,
150
+ payee_id: str,
151
+ *,
152
+ client: AuthenticatedClient | Client,
153
+ ) -> ErrorResponse | PayeeResponse | None:
154
+ """Single payee
155
+
156
+ Returns a single payee
157
+
158
+ Args:
159
+ budget_id (str):
160
+ payee_id (str):
161
+
162
+ Raises:
163
+ errors.UnexpectedStatusError: If the server returns an undocumented status code and Client.raise_on_unexpected_status is True.
164
+ httpx.TimeoutException: If the request takes longer than Client.timeout.
165
+
166
+ Returns:
167
+ Union[ErrorResponse, PayeeResponse]
168
+ """
169
+
170
+ return (
171
+ await asyncio_detailed(
172
+ budget_id=budget_id,
173
+ payee_id=payee_id,
174
+ client=client,
175
+ )
176
+ ).parsed