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