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,65 @@
1
+ from collections.abc import Mapping
2
+ from typing import TYPE_CHECKING, Any, TypeVar
3
+
4
+ from attrs import define as _attrs_define
5
+ from attrs import field as _attrs_field
6
+
7
+ if TYPE_CHECKING:
8
+ from ynab_cli.adapters.ynab.models.transaction_detail import TransactionDetail
9
+
10
+
11
+ T = TypeVar("T", bound="TransactionResponseData")
12
+
13
+
14
+ @_attrs_define
15
+ class TransactionResponseData:
16
+ """
17
+ Attributes:
18
+ transaction (TransactionDetail):
19
+ """
20
+
21
+ transaction: "TransactionDetail"
22
+ additional_properties: dict[str, Any] = _attrs_field(init=False, factory=dict)
23
+
24
+ def to_dict(self) -> dict[str, Any]:
25
+ transaction = self.transaction.to_dict()
26
+
27
+ field_dict: dict[str, Any] = {}
28
+ field_dict.update(self.additional_properties)
29
+ field_dict.update(
30
+ {
31
+ "transaction": transaction,
32
+ }
33
+ )
34
+
35
+ return field_dict
36
+
37
+ @classmethod
38
+ def from_dict(cls: type[T], src_dict: Mapping[str, Any]) -> T:
39
+ from ynab_cli.adapters.ynab.models.transaction_detail import TransactionDetail
40
+
41
+ d = dict(src_dict)
42
+ transaction = TransactionDetail.from_dict(d.pop("transaction"))
43
+
44
+ transaction_response_data = cls(
45
+ transaction=transaction,
46
+ )
47
+
48
+ transaction_response_data.additional_properties = d
49
+ return transaction_response_data
50
+
51
+ @property
52
+ def additional_keys(self) -> list[str]:
53
+ return list(self.additional_properties.keys())
54
+
55
+ def __getitem__(self, key: str) -> Any:
56
+ return self.additional_properties[key]
57
+
58
+ def __setitem__(self, key: str, value: Any) -> None:
59
+ self.additional_properties[key] = value
60
+
61
+ def __delitem__(self, key: str) -> None:
62
+ del self.additional_properties[key]
63
+
64
+ def __contains__(self, key: str) -> bool:
65
+ return key in self.additional_properties
@@ -0,0 +1,499 @@
1
+ import datetime
2
+ from collections.abc import Mapping
3
+ from typing import Any, TypeVar, cast
4
+ from uuid import UUID
5
+
6
+ from attrs import define as _attrs_define
7
+ from attrs import field as _attrs_field
8
+ from dateutil.parser import isoparse
9
+
10
+ from ynab_cli.adapters.ynab.models.transaction_cleared_status import TransactionClearedStatus
11
+ from ynab_cli.adapters.ynab.models.transaction_flag_color_type_1 import TransactionFlagColorType1
12
+ from ynab_cli.adapters.ynab.models.transaction_flag_color_type_2_type_1 import TransactionFlagColorType2Type1
13
+ from ynab_cli.adapters.ynab.models.transaction_flag_color_type_3_type_1 import TransactionFlagColorType3Type1
14
+ from ynab_cli.adapters.ynab.models.transaction_summary_debt_transaction_type_type_1 import (
15
+ TransactionSummaryDebtTransactionTypeType1,
16
+ )
17
+ from ynab_cli.adapters.ynab.models.transaction_summary_debt_transaction_type_type_2_type_1 import (
18
+ TransactionSummaryDebtTransactionTypeType2Type1,
19
+ )
20
+ from ynab_cli.adapters.ynab.models.transaction_summary_debt_transaction_type_type_3_type_1 import (
21
+ TransactionSummaryDebtTransactionTypeType3Type1,
22
+ )
23
+ from ynab_cli.adapters.ynab.types import UNSET, Unset
24
+
25
+ T = TypeVar("T", bound="TransactionSummary")
26
+
27
+
28
+ @_attrs_define
29
+ class TransactionSummary:
30
+ """
31
+ Attributes:
32
+ id (str):
33
+ date (datetime.date): The transaction date in ISO format (e.g. 2016-12-01)
34
+ amount (int): The transaction amount in milliunits format
35
+ cleared (TransactionClearedStatus): The cleared status of the transaction
36
+ approved (bool): Whether or not the transaction is approved
37
+ account_id (UUID):
38
+ deleted (bool): Whether or not the transaction has been deleted. Deleted transactions will only be included in
39
+ delta requests.
40
+ memo (Union[None, Unset, str]):
41
+ flag_color (Union[None, TransactionFlagColorType1, TransactionFlagColorType2Type1,
42
+ TransactionFlagColorType3Type1, Unset]): The transaction flag
43
+ flag_name (Union[None, Unset, str]): The customized name of a transaction flag
44
+ payee_id (Union[None, UUID, Unset]):
45
+ category_id (Union[None, UUID, Unset]):
46
+ transfer_account_id (Union[None, UUID, Unset]): If a transfer transaction, the account to which it transfers
47
+ transfer_transaction_id (Union[None, Unset, str]): If a transfer transaction, the id of transaction on the other
48
+ side of the transfer
49
+ matched_transaction_id (Union[None, Unset, str]): If transaction is matched, the id of the matched transaction
50
+ import_id (Union[None, Unset, str]): If the transaction was imported, this field is a unique (by account) import
51
+ identifier. If this transaction was imported through File Based Import or Direct Import and not through the
52
+ API, the import_id will have the format: 'YNAB:[milliunit_amount]:[iso_date]:[occurrence]'. For example, a
53
+ transaction dated 2015-12-30 in the amount of -$294.23 USD would have an import_id of
54
+ 'YNAB:-294230:2015-12-30:1'. If a second transaction on the same account was imported and had the same date and
55
+ same amount, its import_id would be 'YNAB:-294230:2015-12-30:2'.
56
+ import_payee_name (Union[None, Unset, str]): If the transaction was imported, the payee name that was used when
57
+ importing and before applying any payee rename rules
58
+ import_payee_name_original (Union[None, Unset, str]): If the transaction was imported, the original payee name
59
+ as it appeared on the statement
60
+ debt_transaction_type (Union[None, TransactionSummaryDebtTransactionTypeType1,
61
+ TransactionSummaryDebtTransactionTypeType2Type1, TransactionSummaryDebtTransactionTypeType3Type1, Unset]): If
62
+ the transaction is a debt/loan account transaction, the type of transaction
63
+ """
64
+
65
+ id: str
66
+ date: datetime.date
67
+ amount: int
68
+ cleared: TransactionClearedStatus
69
+ approved: bool
70
+ account_id: UUID
71
+ deleted: bool
72
+ memo: None | Unset | str = UNSET
73
+ flag_color: (
74
+ None | TransactionFlagColorType1 | TransactionFlagColorType2Type1 | TransactionFlagColorType3Type1 | Unset
75
+ ) = UNSET
76
+ flag_name: None | Unset | str = UNSET
77
+ payee_id: None | UUID | Unset = UNSET
78
+ category_id: None | UUID | Unset = UNSET
79
+ transfer_account_id: None | UUID | Unset = UNSET
80
+ transfer_transaction_id: None | Unset | str = UNSET
81
+ matched_transaction_id: None | Unset | str = UNSET
82
+ import_id: None | Unset | str = UNSET
83
+ import_payee_name: None | Unset | str = UNSET
84
+ import_payee_name_original: None | Unset | str = UNSET
85
+ debt_transaction_type: (
86
+ None
87
+ | TransactionSummaryDebtTransactionTypeType1
88
+ | TransactionSummaryDebtTransactionTypeType2Type1
89
+ | TransactionSummaryDebtTransactionTypeType3Type1
90
+ | Unset
91
+ ) = UNSET
92
+ additional_properties: dict[str, Any] = _attrs_field(init=False, factory=dict)
93
+
94
+ def to_dict(self) -> dict[str, Any]:
95
+ id = self.id
96
+
97
+ date = self.date.isoformat()
98
+
99
+ amount = self.amount
100
+
101
+ cleared = self.cleared.value
102
+
103
+ approved = self.approved
104
+
105
+ account_id = str(self.account_id)
106
+
107
+ deleted = self.deleted
108
+
109
+ memo: None | Unset | str
110
+ if isinstance(self.memo, Unset):
111
+ memo = UNSET
112
+ else:
113
+ memo = self.memo
114
+
115
+ flag_color: None | Unset | str
116
+ if isinstance(self.flag_color, Unset):
117
+ flag_color = UNSET
118
+ elif isinstance(self.flag_color, TransactionFlagColorType1):
119
+ flag_color = self.flag_color.value
120
+ elif isinstance(self.flag_color, TransactionFlagColorType2Type1):
121
+ flag_color = self.flag_color.value
122
+ elif isinstance(self.flag_color, TransactionFlagColorType3Type1):
123
+ flag_color = self.flag_color.value
124
+ else:
125
+ flag_color = self.flag_color
126
+
127
+ flag_name: None | Unset | str
128
+ if isinstance(self.flag_name, Unset):
129
+ flag_name = UNSET
130
+ else:
131
+ flag_name = self.flag_name
132
+
133
+ payee_id: None | Unset | str
134
+ if isinstance(self.payee_id, Unset):
135
+ payee_id = UNSET
136
+ elif isinstance(self.payee_id, UUID):
137
+ payee_id = str(self.payee_id)
138
+ else:
139
+ payee_id = self.payee_id
140
+
141
+ category_id: None | Unset | str
142
+ if isinstance(self.category_id, Unset):
143
+ category_id = UNSET
144
+ elif isinstance(self.category_id, UUID):
145
+ category_id = str(self.category_id)
146
+ else:
147
+ category_id = self.category_id
148
+
149
+ transfer_account_id: None | Unset | str
150
+ if isinstance(self.transfer_account_id, Unset):
151
+ transfer_account_id = UNSET
152
+ elif isinstance(self.transfer_account_id, UUID):
153
+ transfer_account_id = str(self.transfer_account_id)
154
+ else:
155
+ transfer_account_id = self.transfer_account_id
156
+
157
+ transfer_transaction_id: None | Unset | str
158
+ if isinstance(self.transfer_transaction_id, Unset):
159
+ transfer_transaction_id = UNSET
160
+ else:
161
+ transfer_transaction_id = self.transfer_transaction_id
162
+
163
+ matched_transaction_id: None | Unset | str
164
+ if isinstance(self.matched_transaction_id, Unset):
165
+ matched_transaction_id = UNSET
166
+ else:
167
+ matched_transaction_id = self.matched_transaction_id
168
+
169
+ import_id: None | Unset | str
170
+ if isinstance(self.import_id, Unset):
171
+ import_id = UNSET
172
+ else:
173
+ import_id = self.import_id
174
+
175
+ import_payee_name: None | Unset | str
176
+ if isinstance(self.import_payee_name, Unset):
177
+ import_payee_name = UNSET
178
+ else:
179
+ import_payee_name = self.import_payee_name
180
+
181
+ import_payee_name_original: None | Unset | str
182
+ if isinstance(self.import_payee_name_original, Unset):
183
+ import_payee_name_original = UNSET
184
+ else:
185
+ import_payee_name_original = self.import_payee_name_original
186
+
187
+ debt_transaction_type: None | Unset | str
188
+ if isinstance(self.debt_transaction_type, Unset):
189
+ debt_transaction_type = UNSET
190
+ elif isinstance(self.debt_transaction_type, TransactionSummaryDebtTransactionTypeType1):
191
+ debt_transaction_type = self.debt_transaction_type.value
192
+ elif isinstance(self.debt_transaction_type, TransactionSummaryDebtTransactionTypeType2Type1):
193
+ debt_transaction_type = self.debt_transaction_type.value
194
+ elif isinstance(self.debt_transaction_type, TransactionSummaryDebtTransactionTypeType3Type1):
195
+ debt_transaction_type = self.debt_transaction_type.value
196
+ else:
197
+ debt_transaction_type = self.debt_transaction_type
198
+
199
+ field_dict: dict[str, Any] = {}
200
+ field_dict.update(self.additional_properties)
201
+ field_dict.update(
202
+ {
203
+ "id": id,
204
+ "date": date,
205
+ "amount": amount,
206
+ "cleared": cleared,
207
+ "approved": approved,
208
+ "account_id": account_id,
209
+ "deleted": deleted,
210
+ }
211
+ )
212
+ if memo is not UNSET:
213
+ field_dict["memo"] = memo
214
+ if flag_color is not UNSET:
215
+ field_dict["flag_color"] = flag_color
216
+ if flag_name is not UNSET:
217
+ field_dict["flag_name"] = flag_name
218
+ if payee_id is not UNSET:
219
+ field_dict["payee_id"] = payee_id
220
+ if category_id is not UNSET:
221
+ field_dict["category_id"] = category_id
222
+ if transfer_account_id is not UNSET:
223
+ field_dict["transfer_account_id"] = transfer_account_id
224
+ if transfer_transaction_id is not UNSET:
225
+ field_dict["transfer_transaction_id"] = transfer_transaction_id
226
+ if matched_transaction_id is not UNSET:
227
+ field_dict["matched_transaction_id"] = matched_transaction_id
228
+ if import_id is not UNSET:
229
+ field_dict["import_id"] = import_id
230
+ if import_payee_name is not UNSET:
231
+ field_dict["import_payee_name"] = import_payee_name
232
+ if import_payee_name_original is not UNSET:
233
+ field_dict["import_payee_name_original"] = import_payee_name_original
234
+ if debt_transaction_type is not UNSET:
235
+ field_dict["debt_transaction_type"] = debt_transaction_type
236
+
237
+ return field_dict
238
+
239
+ @classmethod
240
+ def from_dict(cls: type[T], src_dict: Mapping[str, Any]) -> T:
241
+ d = dict(src_dict)
242
+ id = d.pop("id")
243
+
244
+ date = isoparse(d.pop("date")).date()
245
+
246
+ amount = d.pop("amount")
247
+
248
+ cleared = TransactionClearedStatus(d.pop("cleared"))
249
+
250
+ approved = d.pop("approved")
251
+
252
+ account_id = UUID(d.pop("account_id"))
253
+
254
+ deleted = d.pop("deleted")
255
+
256
+ def _parse_memo(data: object) -> None | Unset | str:
257
+ if data is None:
258
+ return data
259
+ if isinstance(data, Unset):
260
+ return data
261
+ return cast(None | Unset | str, data)
262
+
263
+ memo = _parse_memo(d.pop("memo", UNSET))
264
+
265
+ def _parse_flag_color(
266
+ data: object,
267
+ ) -> None | TransactionFlagColorType1 | TransactionFlagColorType2Type1 | TransactionFlagColorType3Type1 | Unset:
268
+ if data is None:
269
+ return data
270
+ if isinstance(data, Unset):
271
+ return data
272
+ try:
273
+ if not isinstance(data, str):
274
+ raise TypeError()
275
+ componentsschemas_transaction_flag_color_type_1 = TransactionFlagColorType1(data)
276
+
277
+ return componentsschemas_transaction_flag_color_type_1
278
+ except: # noqa: E722
279
+ pass
280
+ try:
281
+ if not isinstance(data, str):
282
+ raise TypeError()
283
+ componentsschemas_transaction_flag_color_type_2_type_1 = TransactionFlagColorType2Type1(data)
284
+
285
+ return componentsschemas_transaction_flag_color_type_2_type_1
286
+ except: # noqa: E722
287
+ pass
288
+ try:
289
+ if not isinstance(data, str):
290
+ raise TypeError()
291
+ componentsschemas_transaction_flag_color_type_3_type_1 = TransactionFlagColorType3Type1(data)
292
+
293
+ return componentsschemas_transaction_flag_color_type_3_type_1
294
+ except: # noqa: E722
295
+ pass
296
+ return cast(
297
+ None
298
+ | TransactionFlagColorType1
299
+ | TransactionFlagColorType2Type1
300
+ | TransactionFlagColorType3Type1
301
+ | Unset,
302
+ data,
303
+ )
304
+
305
+ flag_color = _parse_flag_color(d.pop("flag_color", UNSET))
306
+
307
+ def _parse_flag_name(data: object) -> None | Unset | str:
308
+ if data is None:
309
+ return data
310
+ if isinstance(data, Unset):
311
+ return data
312
+ return cast(None | Unset | str, data)
313
+
314
+ flag_name = _parse_flag_name(d.pop("flag_name", UNSET))
315
+
316
+ def _parse_payee_id(data: object) -> None | UUID | Unset:
317
+ if data is None:
318
+ return data
319
+ if isinstance(data, Unset):
320
+ return data
321
+ try:
322
+ if not isinstance(data, str):
323
+ raise TypeError()
324
+ payee_id_type_0 = UUID(data)
325
+
326
+ return payee_id_type_0
327
+ except: # noqa: E722
328
+ pass
329
+ return cast(None | UUID | Unset, data)
330
+
331
+ payee_id = _parse_payee_id(d.pop("payee_id", UNSET))
332
+
333
+ def _parse_category_id(data: object) -> None | UUID | Unset:
334
+ if data is None:
335
+ return data
336
+ if isinstance(data, Unset):
337
+ return data
338
+ try:
339
+ if not isinstance(data, str):
340
+ raise TypeError()
341
+ category_id_type_0 = UUID(data)
342
+
343
+ return category_id_type_0
344
+ except: # noqa: E722
345
+ pass
346
+ return cast(None | UUID | Unset, data)
347
+
348
+ category_id = _parse_category_id(d.pop("category_id", UNSET))
349
+
350
+ def _parse_transfer_account_id(data: object) -> None | UUID | Unset:
351
+ if data is None:
352
+ return data
353
+ if isinstance(data, Unset):
354
+ return data
355
+ try:
356
+ if not isinstance(data, str):
357
+ raise TypeError()
358
+ transfer_account_id_type_0 = UUID(data)
359
+
360
+ return transfer_account_id_type_0
361
+ except: # noqa: E722
362
+ pass
363
+ return cast(None | UUID | Unset, data)
364
+
365
+ transfer_account_id = _parse_transfer_account_id(d.pop("transfer_account_id", UNSET))
366
+
367
+ def _parse_transfer_transaction_id(data: object) -> None | Unset | str:
368
+ if data is None:
369
+ return data
370
+ if isinstance(data, Unset):
371
+ return data
372
+ return cast(None | Unset | str, data)
373
+
374
+ transfer_transaction_id = _parse_transfer_transaction_id(d.pop("transfer_transaction_id", UNSET))
375
+
376
+ def _parse_matched_transaction_id(data: object) -> None | Unset | str:
377
+ if data is None:
378
+ return data
379
+ if isinstance(data, Unset):
380
+ return data
381
+ return cast(None | Unset | str, data)
382
+
383
+ matched_transaction_id = _parse_matched_transaction_id(d.pop("matched_transaction_id", UNSET))
384
+
385
+ def _parse_import_id(data: object) -> None | Unset | str:
386
+ if data is None:
387
+ return data
388
+ if isinstance(data, Unset):
389
+ return data
390
+ return cast(None | Unset | str, data)
391
+
392
+ import_id = _parse_import_id(d.pop("import_id", UNSET))
393
+
394
+ def _parse_import_payee_name(data: object) -> None | Unset | str:
395
+ if data is None:
396
+ return data
397
+ if isinstance(data, Unset):
398
+ return data
399
+ return cast(None | Unset | str, data)
400
+
401
+ import_payee_name = _parse_import_payee_name(d.pop("import_payee_name", UNSET))
402
+
403
+ def _parse_import_payee_name_original(data: object) -> None | Unset | str:
404
+ if data is None:
405
+ return data
406
+ if isinstance(data, Unset):
407
+ return data
408
+ return cast(None | Unset | str, data)
409
+
410
+ import_payee_name_original = _parse_import_payee_name_original(d.pop("import_payee_name_original", UNSET))
411
+
412
+ def _parse_debt_transaction_type(
413
+ data: object,
414
+ ) -> (
415
+ None
416
+ | TransactionSummaryDebtTransactionTypeType1
417
+ | TransactionSummaryDebtTransactionTypeType2Type1
418
+ | TransactionSummaryDebtTransactionTypeType3Type1
419
+ | Unset
420
+ ):
421
+ if data is None:
422
+ return data
423
+ if isinstance(data, Unset):
424
+ return data
425
+ try:
426
+ if not isinstance(data, str):
427
+ raise TypeError()
428
+ debt_transaction_type_type_1 = TransactionSummaryDebtTransactionTypeType1(data)
429
+
430
+ return debt_transaction_type_type_1
431
+ except: # noqa: E722
432
+ pass
433
+ try:
434
+ if not isinstance(data, str):
435
+ raise TypeError()
436
+ debt_transaction_type_type_2_type_1 = TransactionSummaryDebtTransactionTypeType2Type1(data)
437
+
438
+ return debt_transaction_type_type_2_type_1
439
+ except: # noqa: E722
440
+ pass
441
+ try:
442
+ if not isinstance(data, str):
443
+ raise TypeError()
444
+ debt_transaction_type_type_3_type_1 = TransactionSummaryDebtTransactionTypeType3Type1(data)
445
+
446
+ return debt_transaction_type_type_3_type_1
447
+ except: # noqa: E722
448
+ pass
449
+ return cast(
450
+ None
451
+ | TransactionSummaryDebtTransactionTypeType1
452
+ | TransactionSummaryDebtTransactionTypeType2Type1
453
+ | TransactionSummaryDebtTransactionTypeType3Type1
454
+ | Unset,
455
+ data,
456
+ )
457
+
458
+ debt_transaction_type = _parse_debt_transaction_type(d.pop("debt_transaction_type", UNSET))
459
+
460
+ transaction_summary = cls(
461
+ id=id,
462
+ date=date,
463
+ amount=amount,
464
+ cleared=cleared,
465
+ approved=approved,
466
+ account_id=account_id,
467
+ deleted=deleted,
468
+ memo=memo,
469
+ flag_color=flag_color,
470
+ flag_name=flag_name,
471
+ payee_id=payee_id,
472
+ category_id=category_id,
473
+ transfer_account_id=transfer_account_id,
474
+ transfer_transaction_id=transfer_transaction_id,
475
+ matched_transaction_id=matched_transaction_id,
476
+ import_id=import_id,
477
+ import_payee_name=import_payee_name,
478
+ import_payee_name_original=import_payee_name_original,
479
+ debt_transaction_type=debt_transaction_type,
480
+ )
481
+
482
+ transaction_summary.additional_properties = d
483
+ return transaction_summary
484
+
485
+ @property
486
+ def additional_keys(self) -> list[str]:
487
+ return list(self.additional_properties.keys())
488
+
489
+ def __getitem__(self, key: str) -> Any:
490
+ return self.additional_properties[key]
491
+
492
+ def __setitem__(self, key: str, value: Any) -> None:
493
+ self.additional_properties[key] = value
494
+
495
+ def __delitem__(self, key: str) -> None:
496
+ del self.additional_properties[key]
497
+
498
+ def __contains__(self, key: str) -> bool:
499
+ return key in self.additional_properties
@@ -0,0 +1,18 @@
1
+ from enum import Enum
2
+
3
+ from typing_extensions import override
4
+
5
+
6
+ class TransactionSummaryDebtTransactionTypeType1(str, Enum):
7
+ BALANCEADJUSTMENT = "balanceAdjustment"
8
+ CHARGE = "charge"
9
+ CREDIT = "credit"
10
+ ESCROW = "escrow"
11
+ FEE = "fee"
12
+ INTEREST = "interest"
13
+ PAYMENT = "payment"
14
+ REFUND = "refund"
15
+
16
+ @override
17
+ def __str__(self) -> str:
18
+ return str(self.value)
@@ -0,0 +1,18 @@
1
+ from enum import Enum
2
+
3
+ from typing_extensions import override
4
+
5
+
6
+ class TransactionSummaryDebtTransactionTypeType2Type1(str, Enum):
7
+ BALANCEADJUSTMENT = "balanceAdjustment"
8
+ CHARGE = "charge"
9
+ CREDIT = "credit"
10
+ ESCROW = "escrow"
11
+ FEE = "fee"
12
+ INTEREST = "interest"
13
+ PAYMENT = "payment"
14
+ REFUND = "refund"
15
+
16
+ @override
17
+ def __str__(self) -> str:
18
+ return str(self.value)
@@ -0,0 +1,18 @@
1
+ from enum import Enum
2
+
3
+ from typing_extensions import override
4
+
5
+
6
+ class TransactionSummaryDebtTransactionTypeType3Type1(str, Enum):
7
+ BALANCEADJUSTMENT = "balanceAdjustment"
8
+ CHARGE = "charge"
9
+ CREDIT = "credit"
10
+ ESCROW = "escrow"
11
+ FEE = "fee"
12
+ INTEREST = "interest"
13
+ PAYMENT = "payment"
14
+ REFUND = "refund"
15
+
16
+ @override
17
+ def __str__(self) -> str:
18
+ return str(self.value)
@@ -0,0 +1,65 @@
1
+ from collections.abc import Mapping
2
+ from typing import TYPE_CHECKING, Any, TypeVar
3
+
4
+ from attrs import define as _attrs_define
5
+ from attrs import field as _attrs_field
6
+
7
+ if TYPE_CHECKING:
8
+ from ynab_cli.adapters.ynab.models.transactions_import_response_data import TransactionsImportResponseData
9
+
10
+
11
+ T = TypeVar("T", bound="TransactionsImportResponse")
12
+
13
+
14
+ @_attrs_define
15
+ class TransactionsImportResponse:
16
+ """
17
+ Attributes:
18
+ data (TransactionsImportResponseData):
19
+ """
20
+
21
+ data: "TransactionsImportResponseData"
22
+ additional_properties: dict[str, Any] = _attrs_field(init=False, factory=dict)
23
+
24
+ def to_dict(self) -> dict[str, Any]:
25
+ data = self.data.to_dict()
26
+
27
+ field_dict: dict[str, Any] = {}
28
+ field_dict.update(self.additional_properties)
29
+ field_dict.update(
30
+ {
31
+ "data": data,
32
+ }
33
+ )
34
+
35
+ return field_dict
36
+
37
+ @classmethod
38
+ def from_dict(cls: type[T], src_dict: Mapping[str, Any]) -> T:
39
+ from ynab_cli.adapters.ynab.models.transactions_import_response_data import TransactionsImportResponseData
40
+
41
+ d = dict(src_dict)
42
+ data = TransactionsImportResponseData.from_dict(d.pop("data"))
43
+
44
+ transactions_import_response = cls(
45
+ data=data,
46
+ )
47
+
48
+ transactions_import_response.additional_properties = d
49
+ return transactions_import_response
50
+
51
+ @property
52
+ def additional_keys(self) -> list[str]:
53
+ return list(self.additional_properties.keys())
54
+
55
+ def __getitem__(self, key: str) -> Any:
56
+ return self.additional_properties[key]
57
+
58
+ def __setitem__(self, key: str, value: Any) -> None:
59
+ self.additional_properties[key] = value
60
+
61
+ def __delitem__(self, key: str) -> None:
62
+ del self.additional_properties[key]
63
+
64
+ def __contains__(self, key: str) -> bool:
65
+ return key in self.additional_properties