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,345 @@
1
+ import datetime
2
+ from collections.abc import Mapping
3
+ from typing import TYPE_CHECKING, Any, TypeVar, Union, 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.account_type import AccountType
11
+ from ynab_cli.adapters.ynab.types import UNSET, Unset
12
+
13
+ if TYPE_CHECKING:
14
+ from ynab_cli.adapters.ynab.models.loan_account_periodic_value_type_0 import LoanAccountPeriodicValueType0
15
+
16
+
17
+ T = TypeVar("T", bound="Account")
18
+
19
+
20
+ @_attrs_define
21
+ class Account:
22
+ """
23
+ Attributes:
24
+ id (UUID):
25
+ name (str):
26
+ type_ (AccountType): The type of account
27
+ on_budget (bool): Whether this account is on budget or not
28
+ closed (bool): Whether this account is closed or not
29
+ balance (int): The current balance of the account in milliunits format
30
+ cleared_balance (int): The current cleared balance of the account in milliunits format
31
+ uncleared_balance (int): The current uncleared balance of the account in milliunits format
32
+ transfer_payee_id (Union[None, UUID]): The payee id which should be used when transferring to this account
33
+ deleted (bool): Whether or not the account has been deleted. Deleted accounts will only be included in delta
34
+ requests.
35
+ note (Union[None, Unset, str]):
36
+ direct_import_linked (Union[Unset, bool]): Whether or not the account is linked to a financial institution for
37
+ automatic transaction import.
38
+ direct_import_in_error (Union[Unset, bool]): If an account linked to a financial institution
39
+ (direct_import_linked=true) and the linked connection is not in a healthy state, this will be true.
40
+ last_reconciled_at (Union[None, Unset, datetime.datetime]): A date/time specifying when the account was last
41
+ reconciled.
42
+ debt_original_balance (Union[None, Unset, int]): The original debt/loan account balance, specified in milliunits
43
+ format.
44
+ debt_interest_rates (Union['LoanAccountPeriodicValueType0', None, Unset]):
45
+ debt_minimum_payments (Union['LoanAccountPeriodicValueType0', None, Unset]):
46
+ debt_escrow_amounts (Union['LoanAccountPeriodicValueType0', None, Unset]):
47
+ """
48
+
49
+ id: UUID
50
+ name: str
51
+ type_: AccountType
52
+ on_budget: bool
53
+ closed: bool
54
+ balance: int
55
+ cleared_balance: int
56
+ uncleared_balance: int
57
+ transfer_payee_id: None | UUID
58
+ deleted: bool
59
+ note: None | Unset | str = UNSET
60
+ direct_import_linked: Unset | bool = UNSET
61
+ direct_import_in_error: Unset | bool = UNSET
62
+ last_reconciled_at: None | Unset | datetime.datetime = UNSET
63
+ debt_original_balance: None | Unset | int = UNSET
64
+ debt_interest_rates: Union["LoanAccountPeriodicValueType0", None, Unset] = UNSET
65
+ debt_minimum_payments: Union["LoanAccountPeriodicValueType0", None, Unset] = UNSET
66
+ debt_escrow_amounts: Union["LoanAccountPeriodicValueType0", None, Unset] = UNSET
67
+ additional_properties: dict[str, Any] = _attrs_field(init=False, factory=dict)
68
+
69
+ def to_dict(self) -> dict[str, Any]:
70
+ from ynab_cli.adapters.ynab.models.loan_account_periodic_value_type_0 import LoanAccountPeriodicValueType0
71
+
72
+ id = str(self.id)
73
+
74
+ name = self.name
75
+
76
+ type_ = self.type_.value
77
+
78
+ on_budget = self.on_budget
79
+
80
+ closed = self.closed
81
+
82
+ balance = self.balance
83
+
84
+ cleared_balance = self.cleared_balance
85
+
86
+ uncleared_balance = self.uncleared_balance
87
+
88
+ transfer_payee_id: None | str
89
+ if isinstance(self.transfer_payee_id, UUID):
90
+ transfer_payee_id = str(self.transfer_payee_id)
91
+ else:
92
+ transfer_payee_id = self.transfer_payee_id
93
+
94
+ deleted = self.deleted
95
+
96
+ note: None | Unset | str
97
+ if isinstance(self.note, Unset):
98
+ note = UNSET
99
+ else:
100
+ note = self.note
101
+
102
+ direct_import_linked = self.direct_import_linked
103
+
104
+ direct_import_in_error = self.direct_import_in_error
105
+
106
+ last_reconciled_at: None | Unset | str
107
+ if isinstance(self.last_reconciled_at, Unset):
108
+ last_reconciled_at = UNSET
109
+ elif isinstance(self.last_reconciled_at, datetime.datetime):
110
+ last_reconciled_at = self.last_reconciled_at.isoformat()
111
+ else:
112
+ last_reconciled_at = self.last_reconciled_at
113
+
114
+ debt_original_balance: None | Unset | int
115
+ if isinstance(self.debt_original_balance, Unset):
116
+ debt_original_balance = UNSET
117
+ else:
118
+ debt_original_balance = self.debt_original_balance
119
+
120
+ debt_interest_rates: None | Unset | dict[str, Any]
121
+ if isinstance(self.debt_interest_rates, Unset):
122
+ debt_interest_rates = UNSET
123
+ elif isinstance(self.debt_interest_rates, LoanAccountPeriodicValueType0):
124
+ debt_interest_rates = self.debt_interest_rates.to_dict()
125
+ else:
126
+ debt_interest_rates = self.debt_interest_rates
127
+
128
+ debt_minimum_payments: None | Unset | dict[str, Any]
129
+ if isinstance(self.debt_minimum_payments, Unset):
130
+ debt_minimum_payments = UNSET
131
+ elif isinstance(self.debt_minimum_payments, LoanAccountPeriodicValueType0):
132
+ debt_minimum_payments = self.debt_minimum_payments.to_dict()
133
+ else:
134
+ debt_minimum_payments = self.debt_minimum_payments
135
+
136
+ debt_escrow_amounts: None | Unset | dict[str, Any]
137
+ if isinstance(self.debt_escrow_amounts, Unset):
138
+ debt_escrow_amounts = UNSET
139
+ elif isinstance(self.debt_escrow_amounts, LoanAccountPeriodicValueType0):
140
+ debt_escrow_amounts = self.debt_escrow_amounts.to_dict()
141
+ else:
142
+ debt_escrow_amounts = self.debt_escrow_amounts
143
+
144
+ field_dict: dict[str, Any] = {}
145
+ field_dict.update(self.additional_properties)
146
+ field_dict.update(
147
+ {
148
+ "id": id,
149
+ "name": name,
150
+ "type": type_,
151
+ "on_budget": on_budget,
152
+ "closed": closed,
153
+ "balance": balance,
154
+ "cleared_balance": cleared_balance,
155
+ "uncleared_balance": uncleared_balance,
156
+ "transfer_payee_id": transfer_payee_id,
157
+ "deleted": deleted,
158
+ }
159
+ )
160
+ if note is not UNSET:
161
+ field_dict["note"] = note
162
+ if direct_import_linked is not UNSET:
163
+ field_dict["direct_import_linked"] = direct_import_linked
164
+ if direct_import_in_error is not UNSET:
165
+ field_dict["direct_import_in_error"] = direct_import_in_error
166
+ if last_reconciled_at is not UNSET:
167
+ field_dict["last_reconciled_at"] = last_reconciled_at
168
+ if debt_original_balance is not UNSET:
169
+ field_dict["debt_original_balance"] = debt_original_balance
170
+ if debt_interest_rates is not UNSET:
171
+ field_dict["debt_interest_rates"] = debt_interest_rates
172
+ if debt_minimum_payments is not UNSET:
173
+ field_dict["debt_minimum_payments"] = debt_minimum_payments
174
+ if debt_escrow_amounts is not UNSET:
175
+ field_dict["debt_escrow_amounts"] = debt_escrow_amounts
176
+
177
+ return field_dict
178
+
179
+ @classmethod
180
+ def from_dict(cls: type[T], src_dict: Mapping[str, Any]) -> T:
181
+ from ynab_cli.adapters.ynab.models.loan_account_periodic_value_type_0 import LoanAccountPeriodicValueType0
182
+
183
+ d = dict(src_dict)
184
+ id = UUID(d.pop("id"))
185
+
186
+ name = d.pop("name")
187
+
188
+ type_ = AccountType(d.pop("type"))
189
+
190
+ on_budget = d.pop("on_budget")
191
+
192
+ closed = d.pop("closed")
193
+
194
+ balance = d.pop("balance")
195
+
196
+ cleared_balance = d.pop("cleared_balance")
197
+
198
+ uncleared_balance = d.pop("uncleared_balance")
199
+
200
+ def _parse_transfer_payee_id(data: object) -> None | UUID:
201
+ if data is None:
202
+ return data
203
+ try:
204
+ if not isinstance(data, str):
205
+ raise TypeError()
206
+ transfer_payee_id_type_0 = UUID(data)
207
+
208
+ return transfer_payee_id_type_0
209
+ except: # noqa: E722
210
+ pass
211
+ return cast(None | UUID, data)
212
+
213
+ transfer_payee_id = _parse_transfer_payee_id(d.pop("transfer_payee_id"))
214
+
215
+ deleted = d.pop("deleted")
216
+
217
+ def _parse_note(data: object) -> None | Unset | str:
218
+ if data is None:
219
+ return data
220
+ if isinstance(data, Unset):
221
+ return data
222
+ return cast(None | Unset | str, data)
223
+
224
+ note = _parse_note(d.pop("note", UNSET))
225
+
226
+ direct_import_linked = d.pop("direct_import_linked", UNSET)
227
+
228
+ direct_import_in_error = d.pop("direct_import_in_error", UNSET)
229
+
230
+ def _parse_last_reconciled_at(data: object) -> None | Unset | datetime.datetime:
231
+ if data is None:
232
+ return data
233
+ if isinstance(data, Unset):
234
+ return data
235
+ try:
236
+ if not isinstance(data, str):
237
+ raise TypeError()
238
+ last_reconciled_at_type_0 = isoparse(data)
239
+
240
+ return last_reconciled_at_type_0
241
+ except: # noqa: E722
242
+ pass
243
+ return cast(None | Unset | datetime.datetime, data)
244
+
245
+ last_reconciled_at = _parse_last_reconciled_at(d.pop("last_reconciled_at", UNSET))
246
+
247
+ def _parse_debt_original_balance(data: object) -> None | Unset | int:
248
+ if data is None:
249
+ return data
250
+ if isinstance(data, Unset):
251
+ return data
252
+ return cast(None | Unset | int, data)
253
+
254
+ debt_original_balance = _parse_debt_original_balance(d.pop("debt_original_balance", UNSET))
255
+
256
+ def _parse_debt_interest_rates(data: object) -> Union["LoanAccountPeriodicValueType0", None, Unset]:
257
+ if data is None:
258
+ return data
259
+ if isinstance(data, Unset):
260
+ return data
261
+ try:
262
+ if not isinstance(data, dict):
263
+ raise TypeError()
264
+ componentsschemas_loan_account_periodic_value_type_0 = LoanAccountPeriodicValueType0.from_dict(data)
265
+
266
+ return componentsschemas_loan_account_periodic_value_type_0
267
+ except: # noqa: E722
268
+ pass
269
+ return cast(Union["LoanAccountPeriodicValueType0", None, Unset], data)
270
+
271
+ debt_interest_rates = _parse_debt_interest_rates(d.pop("debt_interest_rates", UNSET))
272
+
273
+ def _parse_debt_minimum_payments(data: object) -> Union["LoanAccountPeriodicValueType0", None, Unset]:
274
+ if data is None:
275
+ return data
276
+ if isinstance(data, Unset):
277
+ return data
278
+ try:
279
+ if not isinstance(data, dict):
280
+ raise TypeError()
281
+ componentsschemas_loan_account_periodic_value_type_0 = LoanAccountPeriodicValueType0.from_dict(data)
282
+
283
+ return componentsschemas_loan_account_periodic_value_type_0
284
+ except: # noqa: E722
285
+ pass
286
+ return cast(Union["LoanAccountPeriodicValueType0", None, Unset], data)
287
+
288
+ debt_minimum_payments = _parse_debt_minimum_payments(d.pop("debt_minimum_payments", UNSET))
289
+
290
+ def _parse_debt_escrow_amounts(data: object) -> Union["LoanAccountPeriodicValueType0", None, Unset]:
291
+ if data is None:
292
+ return data
293
+ if isinstance(data, Unset):
294
+ return data
295
+ try:
296
+ if not isinstance(data, dict):
297
+ raise TypeError()
298
+ componentsschemas_loan_account_periodic_value_type_0 = LoanAccountPeriodicValueType0.from_dict(data)
299
+
300
+ return componentsschemas_loan_account_periodic_value_type_0
301
+ except: # noqa: E722
302
+ pass
303
+ return cast(Union["LoanAccountPeriodicValueType0", None, Unset], data)
304
+
305
+ debt_escrow_amounts = _parse_debt_escrow_amounts(d.pop("debt_escrow_amounts", UNSET))
306
+
307
+ account = cls(
308
+ id=id,
309
+ name=name,
310
+ type_=type_,
311
+ on_budget=on_budget,
312
+ closed=closed,
313
+ balance=balance,
314
+ cleared_balance=cleared_balance,
315
+ uncleared_balance=uncleared_balance,
316
+ transfer_payee_id=transfer_payee_id,
317
+ deleted=deleted,
318
+ note=note,
319
+ direct_import_linked=direct_import_linked,
320
+ direct_import_in_error=direct_import_in_error,
321
+ last_reconciled_at=last_reconciled_at,
322
+ debt_original_balance=debt_original_balance,
323
+ debt_interest_rates=debt_interest_rates,
324
+ debt_minimum_payments=debt_minimum_payments,
325
+ debt_escrow_amounts=debt_escrow_amounts,
326
+ )
327
+
328
+ account.additional_properties = d
329
+ return account
330
+
331
+ @property
332
+ def additional_keys(self) -> list[str]:
333
+ return list(self.additional_properties.keys())
334
+
335
+ def __getitem__(self, key: str) -> Any:
336
+ return self.additional_properties[key]
337
+
338
+ def __setitem__(self, key: str, value: Any) -> None:
339
+ self.additional_properties[key] = value
340
+
341
+ def __delitem__(self, key: str) -> None:
342
+ del self.additional_properties[key]
343
+
344
+ def __contains__(self, key: str) -> bool:
345
+ return key in self.additional_properties
@@ -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.account_response_data import AccountResponseData
9
+
10
+
11
+ T = TypeVar("T", bound="AccountResponse")
12
+
13
+
14
+ @_attrs_define
15
+ class AccountResponse:
16
+ """
17
+ Attributes:
18
+ data (AccountResponseData):
19
+ """
20
+
21
+ data: "AccountResponseData"
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.account_response_data import AccountResponseData
40
+
41
+ d = dict(src_dict)
42
+ data = AccountResponseData.from_dict(d.pop("data"))
43
+
44
+ account_response = cls(
45
+ data=data,
46
+ )
47
+
48
+ account_response.additional_properties = d
49
+ return account_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
@@ -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.account import Account
9
+
10
+
11
+ T = TypeVar("T", bound="AccountResponseData")
12
+
13
+
14
+ @_attrs_define
15
+ class AccountResponseData:
16
+ """
17
+ Attributes:
18
+ account (Account):
19
+ """
20
+
21
+ account: "Account"
22
+ additional_properties: dict[str, Any] = _attrs_field(init=False, factory=dict)
23
+
24
+ def to_dict(self) -> dict[str, Any]:
25
+ account = self.account.to_dict()
26
+
27
+ field_dict: dict[str, Any] = {}
28
+ field_dict.update(self.additional_properties)
29
+ field_dict.update(
30
+ {
31
+ "account": account,
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.account import Account
40
+
41
+ d = dict(src_dict)
42
+ account = Account.from_dict(d.pop("account"))
43
+
44
+ account_response_data = cls(
45
+ account=account,
46
+ )
47
+
48
+ account_response_data.additional_properties = d
49
+ return account_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,23 @@
1
+ from enum import Enum
2
+
3
+ from typing_extensions import override
4
+
5
+
6
+ class AccountType(str, Enum):
7
+ AUTOLOAN = "autoLoan"
8
+ CASH = "cash"
9
+ CHECKING = "checking"
10
+ CREDITCARD = "creditCard"
11
+ LINEOFCREDIT = "lineOfCredit"
12
+ MEDICALDEBT = "medicalDebt"
13
+ MORTGAGE = "mortgage"
14
+ OTHERASSET = "otherAsset"
15
+ OTHERDEBT = "otherDebt"
16
+ OTHERLIABILITY = "otherLiability"
17
+ PERSONALLOAN = "personalLoan"
18
+ SAVINGS = "savings"
19
+ STUDENTLOAN = "studentLoan"
20
+
21
+ @override
22
+ def __str__(self) -> str:
23
+ 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.accounts_response_data import AccountsResponseData
9
+
10
+
11
+ T = TypeVar("T", bound="AccountsResponse")
12
+
13
+
14
+ @_attrs_define
15
+ class AccountsResponse:
16
+ """
17
+ Attributes:
18
+ data (AccountsResponseData):
19
+ """
20
+
21
+ data: "AccountsResponseData"
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.accounts_response_data import AccountsResponseData
40
+
41
+ d = dict(src_dict)
42
+ data = AccountsResponseData.from_dict(d.pop("data"))
43
+
44
+ accounts_response = cls(
45
+ data=data,
46
+ )
47
+
48
+ accounts_response.additional_properties = d
49
+ return accounts_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
@@ -0,0 +1,81 @@
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.account import Account
9
+
10
+
11
+ T = TypeVar("T", bound="AccountsResponseData")
12
+
13
+
14
+ @_attrs_define
15
+ class AccountsResponseData:
16
+ """
17
+ Attributes:
18
+ accounts (list['Account']):
19
+ server_knowledge (int): The knowledge of the server
20
+ """
21
+
22
+ accounts: list["Account"]
23
+ server_knowledge: int
24
+ additional_properties: dict[str, Any] = _attrs_field(init=False, factory=dict)
25
+
26
+ def to_dict(self) -> dict[str, Any]:
27
+ accounts = []
28
+ for accounts_item_data in self.accounts:
29
+ accounts_item = accounts_item_data.to_dict()
30
+ accounts.append(accounts_item)
31
+
32
+ server_knowledge = self.server_knowledge
33
+
34
+ field_dict: dict[str, Any] = {}
35
+ field_dict.update(self.additional_properties)
36
+ field_dict.update(
37
+ {
38
+ "accounts": accounts,
39
+ "server_knowledge": server_knowledge,
40
+ }
41
+ )
42
+
43
+ return field_dict
44
+
45
+ @classmethod
46
+ def from_dict(cls: type[T], src_dict: Mapping[str, Any]) -> T:
47
+ from ynab_cli.adapters.ynab.models.account import Account
48
+
49
+ d = dict(src_dict)
50
+ accounts = []
51
+ _accounts = d.pop("accounts")
52
+ for accounts_item_data in _accounts:
53
+ accounts_item = Account.from_dict(accounts_item_data)
54
+
55
+ accounts.append(accounts_item)
56
+
57
+ server_knowledge = d.pop("server_knowledge")
58
+
59
+ accounts_response_data = cls(
60
+ accounts=accounts,
61
+ server_knowledge=server_knowledge,
62
+ )
63
+
64
+ accounts_response_data.additional_properties = d
65
+ return accounts_response_data
66
+
67
+ @property
68
+ def additional_keys(self) -> list[str]:
69
+ return list(self.additional_properties.keys())
70
+
71
+ def __getitem__(self, key: str) -> Any:
72
+ return self.additional_properties[key]
73
+
74
+ def __setitem__(self, key: str, value: Any) -> None:
75
+ self.additional_properties[key] = value
76
+
77
+ def __delitem__(self, key: str) -> None:
78
+ del self.additional_properties[key]
79
+
80
+ def __contains__(self, key: str) -> bool:
81
+ return key in self.additional_properties