ynab-cli 0.7.2__tar.gz → 0.8.0__tar.gz

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 (317) hide show
  1. {ynab_cli-0.7.2 → ynab_cli-0.8.0}/.github/.copilot-instructions.md +7 -5
  2. {ynab_cli-0.7.2 → ynab_cli-0.8.0}/.github/dependabot.yml +1 -0
  3. {ynab_cli-0.7.2 → ynab_cli-0.8.0}/CHANGELOG.md +16 -0
  4. {ynab_cli-0.7.2 → ynab_cli-0.8.0}/PKG-INFO +11 -11
  5. {ynab_cli-0.7.2 → ynab_cli-0.8.0}/pyproject.toml +16 -16
  6. {ynab_cli-0.7.2 → ynab_cli-0.8.0}/src/ynab_cli/adapters/ynab/api/accounts/create_account.py +32 -29
  7. {ynab_cli-0.7.2 → ynab_cli-0.8.0}/src/ynab_cli/adapters/ynab/api/accounts/get_account_by_id.py +40 -33
  8. {ynab_cli-0.7.2 → ynab_cli-0.8.0}/src/ynab_cli/adapters/ynab/api/accounts/get_accounts.py +48 -42
  9. ynab_cli-0.8.0/src/ynab_cli/adapters/ynab/api/categories/create_category.py +190 -0
  10. ynab_cli-0.8.0/src/ynab_cli/adapters/ynab/api/categories/create_category_group.py +190 -0
  11. {ynab_cli-0.7.2 → ynab_cli-0.8.0}/src/ynab_cli/adapters/ynab/api/categories/get_categories.py +56 -50
  12. {ynab_cli-0.7.2 → ynab_cli-0.8.0}/src/ynab_cli/adapters/ynab/api/categories/get_category_by_id.py +48 -41
  13. {ynab_cli-0.7.2 → ynab_cli-0.8.0}/src/ynab_cli/adapters/ynab/api/categories/get_month_category_by_id.py +49 -41
  14. {ynab_cli-0.7.2 → ynab_cli-0.8.0}/src/ynab_cli/adapters/ynab/api/categories/update_category.py +29 -25
  15. ynab_cli-0.8.0/src/ynab_cli/adapters/ynab/api/categories/update_category_group.py +204 -0
  16. {ynab_cli-0.7.2 → ynab_cli-0.8.0}/src/ynab_cli/adapters/ynab/api/categories/update_month_category.py +34 -29
  17. ynab_cli-0.8.0/src/ynab_cli/adapters/ynab/api/money_movements/get_money_movement_groups.py +169 -0
  18. ynab_cli-0.8.0/src/ynab_cli/adapters/ynab/api/money_movements/get_money_movement_groups_by_month.py +184 -0
  19. ynab_cli-0.8.0/src/ynab_cli/adapters/ynab/api/money_movements/get_money_movements.py +169 -0
  20. ynab_cli-0.8.0/src/ynab_cli/adapters/ynab/api/money_movements/get_money_movements_by_month.py +184 -0
  21. ynab_cli-0.7.2/src/ynab_cli/adapters/ynab/api/months/get_budget_month.py → ynab_cli-0.8.0/src/ynab_cli/adapters/ynab/api/months/get_plan_month.py +44 -37
  22. ynab_cli-0.7.2/src/ynab_cli/adapters/ynab/api/months/get_budget_months.py → ynab_cli-0.8.0/src/ynab_cli/adapters/ynab/api/months/get_plan_months.py +52 -46
  23. {ynab_cli-0.7.2 → ynab_cli-0.8.0}/src/ynab_cli/adapters/ynab/api/payee_locations/get_payee_location_by_id.py +40 -33
  24. {ynab_cli-0.7.2 → ynab_cli-0.8.0}/src/ynab_cli/adapters/ynab/api/payee_locations/get_payee_locations.py +39 -33
  25. {ynab_cli-0.7.2 → ynab_cli-0.8.0}/src/ynab_cli/adapters/ynab/api/payee_locations/get_payee_locations_by_payee.py +40 -33
  26. ynab_cli-0.8.0/src/ynab_cli/adapters/ynab/api/payees/create_payee.py +190 -0
  27. {ynab_cli-0.7.2 → ynab_cli-0.8.0}/src/ynab_cli/adapters/ynab/api/payees/get_payee_by_id.py +41 -32
  28. {ynab_cli-0.7.2 → ynab_cli-0.8.0}/src/ynab_cli/adapters/ynab/api/payees/get_payees.py +48 -42
  29. {ynab_cli-0.7.2 → ynab_cli-0.8.0}/src/ynab_cli/adapters/ynab/api/payees/update_payee.py +29 -25
  30. ynab_cli-0.7.2/src/ynab_cli/adapters/ynab/api/budgets/get_budget_by_id.py → ynab_cli-0.8.0/src/ynab_cli/adapters/ynab/api/plans/get_plan_by_id.py +59 -57
  31. ynab_cli-0.7.2/src/ynab_cli/adapters/ynab/api/budgets/get_budget_settings_by_id.py → ynab_cli-0.8.0/src/ynab_cli/adapters/ynab/api/plans/get_plan_settings_by_id.py +50 -44
  32. ynab_cli-0.7.2/src/ynab_cli/adapters/ynab/api/budgets/get_budgets.py → ynab_cli-0.8.0/src/ynab_cli/adapters/ynab/api/plans/get_plans.py +43 -40
  33. {ynab_cli-0.7.2 → ynab_cli-0.8.0}/src/ynab_cli/adapters/ynab/api/scheduled_transactions/create_scheduled_transaction.py +32 -29
  34. {ynab_cli-0.7.2 → ynab_cli-0.8.0}/src/ynab_cli/adapters/ynab/api/scheduled_transactions/delete_scheduled_transaction.py +34 -29
  35. {ynab_cli-0.7.2 → ynab_cli-0.8.0}/src/ynab_cli/adapters/ynab/api/scheduled_transactions/get_scheduled_transaction_by_id.py +40 -33
  36. {ynab_cli-0.7.2 → ynab_cli-0.8.0}/src/ynab_cli/adapters/ynab/api/scheduled_transactions/get_scheduled_transactions.py +48 -42
  37. {ynab_cli-0.7.2 → ynab_cli-0.8.0}/src/ynab_cli/adapters/ynab/api/scheduled_transactions/update_scheduled_transaction.py +33 -29
  38. {ynab_cli-0.7.2 → ynab_cli-0.8.0}/src/ynab_cli/adapters/ynab/api/transactions/create_transaction.py +28 -25
  39. {ynab_cli-0.7.2 → ynab_cli-0.8.0}/src/ynab_cli/adapters/ynab/api/transactions/delete_transaction.py +34 -29
  40. {ynab_cli-0.7.2 → ynab_cli-0.8.0}/src/ynab_cli/adapters/ynab/api/transactions/get_transaction_by_id.py +40 -33
  41. {ynab_cli-0.7.2 → ynab_cli-0.8.0}/src/ynab_cli/adapters/ynab/api/transactions/get_transactions.py +84 -62
  42. {ynab_cli-0.7.2 → ynab_cli-0.8.0}/src/ynab_cli/adapters/ynab/api/transactions/get_transactions_by_account.py +87 -62
  43. {ynab_cli-0.7.2 → ynab_cli-0.8.0}/src/ynab_cli/adapters/ynab/api/transactions/get_transactions_by_category.py +91 -66
  44. ynab_cli-0.8.0/src/ynab_cli/adapters/ynab/api/transactions/get_transactions_by_month.py +261 -0
  45. {ynab_cli-0.7.2 → ynab_cli-0.8.0}/src/ynab_cli/adapters/ynab/api/transactions/get_transactions_by_payee.py +91 -66
  46. {ynab_cli-0.7.2 → ynab_cli-0.8.0}/src/ynab_cli/adapters/ynab/api/transactions/import_transactions.py +45 -41
  47. {ynab_cli-0.7.2 → ynab_cli-0.8.0}/src/ynab_cli/adapters/ynab/api/transactions/update_transaction.py +33 -29
  48. {ynab_cli-0.7.2 → ynab_cli-0.8.0}/src/ynab_cli/adapters/ynab/api/transactions/update_transactions.py +31 -28
  49. ynab_cli-0.8.0/src/ynab_cli/adapters/ynab/api/user/__init__.py +1 -0
  50. {ynab_cli-0.7.2 → ynab_cli-0.8.0}/src/ynab_cli/adapters/ynab/api/user/get_user.py +25 -25
  51. {ynab_cli-0.7.2 → ynab_cli-0.8.0}/src/ynab_cli/adapters/ynab/client.py +79 -58
  52. {ynab_cli-0.7.2 → ynab_cli-0.8.0}/src/ynab_cli/adapters/ynab/models/__init__.py +90 -32
  53. ynab_cli-0.8.0/src/ynab_cli/adapters/ynab/models/account.py +404 -0
  54. ynab_cli-0.7.2/src/ynab_cli/adapters/ynab/models/account.py → ynab_cli-0.8.0/src/ynab_cli/adapters/ynab/models/account_base.py +56 -55
  55. {ynab_cli-0.7.2 → ynab_cli-0.8.0}/src/ynab_cli/adapters/ynab/models/account_response.py +5 -3
  56. {ynab_cli-0.7.2 → ynab_cli-0.8.0}/src/ynab_cli/adapters/ynab/models/account_response_data.py +5 -3
  57. {ynab_cli-0.7.2 → ynab_cli-0.8.0}/src/ynab_cli/adapters/ynab/models/account_type.py +2 -2
  58. {ynab_cli-0.7.2 → ynab_cli-0.8.0}/src/ynab_cli/adapters/ynab/models/accounts_response.py +5 -3
  59. {ynab_cli-0.7.2 → ynab_cli-0.8.0}/src/ynab_cli/adapters/ynab/models/accounts_response_data.py +6 -4
  60. {ynab_cli-0.7.2 → ynab_cli-0.8.0}/src/ynab_cli/adapters/ynab/models/bulk_response.py +5 -3
  61. {ynab_cli-0.7.2 → ynab_cli-0.8.0}/src/ynab_cli/adapters/ynab/models/bulk_response_data.py +5 -3
  62. {ynab_cli-0.7.2 → ynab_cli-0.8.0}/src/ynab_cli/adapters/ynab/models/bulk_response_data_bulk.py +4 -2
  63. {ynab_cli-0.7.2 → ynab_cli-0.8.0}/src/ynab_cli/adapters/ynab/models/bulk_transactions.py +6 -4
  64. {ynab_cli-0.7.2 → ynab_cli-0.8.0}/src/ynab_cli/adapters/ynab/models/categories_response.py +5 -3
  65. {ynab_cli-0.7.2 → ynab_cli-0.8.0}/src/ynab_cli/adapters/ynab/models/categories_response_data.py +6 -4
  66. ynab_cli-0.8.0/src/ynab_cli/adapters/ynab/models/category.py +816 -0
  67. ynab_cli-0.7.2/src/ynab_cli/adapters/ynab/models/category.py → ynab_cli-0.8.0/src/ynab_cli/adapters/ynab/models/category_base.py +166 -122
  68. ynab_cli-0.7.2/src/ynab_cli/adapters/ynab/models/category_goal_type_type_3_type_1.py → ynab_cli-0.8.0/src/ynab_cli/adapters/ynab/models/category_base_goal_type_type_1.py +2 -2
  69. ynab_cli-0.7.2/src/ynab_cli/adapters/ynab/models/category_goal_type_type_1.py → ynab_cli-0.8.0/src/ynab_cli/adapters/ynab/models/category_base_goal_type_type_2_type_1.py +2 -2
  70. ynab_cli-0.7.2/src/ynab_cli/adapters/ynab/models/category_goal_type_type_2_type_1.py → ynab_cli-0.8.0/src/ynab_cli/adapters/ynab/models/category_base_goal_type_type_3_type_1.py +2 -2
  71. {ynab_cli-0.7.2 → ynab_cli-0.8.0}/src/ynab_cli/adapters/ynab/models/category_group.py +12 -2
  72. {ynab_cli-0.7.2 → ynab_cli-0.8.0}/src/ynab_cli/adapters/ynab/models/category_group_with_categories.py +15 -5
  73. {ynab_cli-0.7.2 → ynab_cli-0.8.0}/src/ynab_cli/adapters/ynab/models/category_response.py +5 -3
  74. {ynab_cli-0.7.2 → ynab_cli-0.8.0}/src/ynab_cli/adapters/ynab/models/category_response_data.py +5 -3
  75. {ynab_cli-0.7.2 → ynab_cli-0.8.0}/src/ynab_cli/adapters/ynab/models/currency_format_type_0.py +5 -3
  76. {ynab_cli-0.7.2 → ynab_cli-0.8.0}/src/ynab_cli/adapters/ynab/models/date_format_type_0.py +7 -6
  77. {ynab_cli-0.7.2 → ynab_cli-0.8.0}/src/ynab_cli/adapters/ynab/models/error_detail.py +4 -2
  78. {ynab_cli-0.7.2 → ynab_cli-0.8.0}/src/ynab_cli/adapters/ynab/models/error_response.py +5 -3
  79. ynab_cli-0.8.0/src/ynab_cli/adapters/ynab/models/existing_category.py +207 -0
  80. {ynab_cli-0.7.2 → ynab_cli-0.8.0}/src/ynab_cli/adapters/ynab/models/existing_transaction.py +77 -74
  81. {ynab_cli-0.7.2 → ynab_cli-0.8.0}/src/ynab_cli/adapters/ynab/models/get_transactions_by_account_type.py +2 -2
  82. {ynab_cli-0.7.2 → ynab_cli-0.8.0}/src/ynab_cli/adapters/ynab/models/get_transactions_by_category_type.py +2 -2
  83. {ynab_cli-0.7.2 → ynab_cli-0.8.0}/src/ynab_cli/adapters/ynab/models/get_transactions_by_month_type.py +2 -2
  84. {ynab_cli-0.7.2 → ynab_cli-0.8.0}/src/ynab_cli/adapters/ynab/models/get_transactions_by_payee_type.py +2 -2
  85. {ynab_cli-0.7.2 → ynab_cli-0.8.0}/src/ynab_cli/adapters/ynab/models/get_transactions_type.py +2 -2
  86. {ynab_cli-0.7.2 → ynab_cli-0.8.0}/src/ynab_cli/adapters/ynab/models/hybrid_transaction.py +142 -122
  87. {ynab_cli-0.7.2 → ynab_cli-0.8.0}/src/ynab_cli/adapters/ynab/models/hybrid_transaction_type.py +2 -2
  88. {ynab_cli-0.7.2 → ynab_cli-0.8.0}/src/ynab_cli/adapters/ynab/models/hybrid_transactions_response.py +5 -3
  89. {ynab_cli-0.7.2 → ynab_cli-0.8.0}/src/ynab_cli/adapters/ynab/models/hybrid_transactions_response_data.py +8 -6
  90. {ynab_cli-0.7.2 → ynab_cli-0.8.0}/src/ynab_cli/adapters/ynab/models/loan_account_periodic_value_type_0.py +5 -4
  91. ynab_cli-0.8.0/src/ynab_cli/adapters/ynab/models/money_movement.py +292 -0
  92. ynab_cli-0.8.0/src/ynab_cli/adapters/ynab/models/money_movement_base.py +274 -0
  93. ynab_cli-0.8.0/src/ynab_cli/adapters/ynab/models/money_movement_group.py +131 -0
  94. ynab_cli-0.8.0/src/ynab_cli/adapters/ynab/models/money_movement_groups_response.py +67 -0
  95. ynab_cli-0.8.0/src/ynab_cli/adapters/ynab/models/money_movement_groups_response_data.py +83 -0
  96. ynab_cli-0.7.2/src/ynab_cli/adapters/ynab/models/budget_settings_response.py → ynab_cli-0.8.0/src/ynab_cli/adapters/ynab/models/money_movements_response.py +14 -12
  97. ynab_cli-0.8.0/src/ynab_cli/adapters/ynab/models/money_movements_response_data.py +83 -0
  98. ynab_cli-0.8.0/src/ynab_cli/adapters/ynab/models/month_detail.py +242 -0
  99. ynab_cli-0.7.2/src/ynab_cli/adapters/ynab/models/month_detail.py → ynab_cli-0.8.0/src/ynab_cli/adapters/ynab/models/month_detail_base.py +26 -25
  100. {ynab_cli-0.7.2 → ynab_cli-0.8.0}/src/ynab_cli/adapters/ynab/models/month_detail_response.py +5 -3
  101. {ynab_cli-0.7.2 → ynab_cli-0.8.0}/src/ynab_cli/adapters/ynab/models/month_detail_response_data.py +5 -3
  102. {ynab_cli-0.7.2 → ynab_cli-0.8.0}/src/ynab_cli/adapters/ynab/models/month_summaries_response.py +5 -3
  103. {ynab_cli-0.7.2 → ynab_cli-0.8.0}/src/ynab_cli/adapters/ynab/models/month_summaries_response_data.py +6 -4
  104. ynab_cli-0.8.0/src/ynab_cli/adapters/ynab/models/month_summary.py +219 -0
  105. ynab_cli-0.7.2/src/ynab_cli/adapters/ynab/models/month_summary.py → ynab_cli-0.8.0/src/ynab_cli/adapters/ynab/models/month_summary_base.py +21 -20
  106. ynab_cli-0.8.0/src/ynab_cli/adapters/ynab/models/new_category.py +196 -0
  107. {ynab_cli-0.7.2 → ynab_cli-0.8.0}/src/ynab_cli/adapters/ynab/models/new_transaction.py +84 -81
  108. ynab_cli-0.8.0/src/ynab_cli/adapters/ynab/models/patch_category_group_wrapper.py +67 -0
  109. {ynab_cli-0.7.2 → ynab_cli-0.8.0}/src/ynab_cli/adapters/ynab/models/patch_category_wrapper.py +9 -7
  110. {ynab_cli-0.7.2 → ynab_cli-0.8.0}/src/ynab_cli/adapters/ynab/models/patch_month_category_wrapper.py +5 -3
  111. {ynab_cli-0.7.2 → ynab_cli-0.8.0}/src/ynab_cli/adapters/ynab/models/patch_payee_wrapper.py +5 -3
  112. {ynab_cli-0.7.2 → ynab_cli-0.8.0}/src/ynab_cli/adapters/ynab/models/patch_transactions_wrapper.py +6 -4
  113. {ynab_cli-0.7.2 → ynab_cli-0.8.0}/src/ynab_cli/adapters/ynab/models/payee.py +9 -8
  114. {ynab_cli-0.7.2 → ynab_cli-0.8.0}/src/ynab_cli/adapters/ynab/models/payee_location.py +4 -2
  115. {ynab_cli-0.7.2 → ynab_cli-0.8.0}/src/ynab_cli/adapters/ynab/models/payee_location_response.py +5 -3
  116. {ynab_cli-0.7.2 → ynab_cli-0.8.0}/src/ynab_cli/adapters/ynab/models/payee_location_response_data.py +5 -3
  117. {ynab_cli-0.7.2 → ynab_cli-0.8.0}/src/ynab_cli/adapters/ynab/models/payee_locations_response.py +5 -3
  118. {ynab_cli-0.7.2 → ynab_cli-0.8.0}/src/ynab_cli/adapters/ynab/models/payee_locations_response_data.py +6 -4
  119. {ynab_cli-0.7.2 → ynab_cli-0.8.0}/src/ynab_cli/adapters/ynab/models/payee_response.py +5 -3
  120. {ynab_cli-0.7.2 → ynab_cli-0.8.0}/src/ynab_cli/adapters/ynab/models/payee_response_data.py +5 -3
  121. {ynab_cli-0.7.2 → ynab_cli-0.8.0}/src/ynab_cli/adapters/ynab/models/payees_response.py +5 -3
  122. {ynab_cli-0.7.2 → ynab_cli-0.8.0}/src/ynab_cli/adapters/ynab/models/payees_response_data.py +6 -4
  123. ynab_cli-0.7.2/src/ynab_cli/adapters/ynab/models/budget_detail.py → ynab_cli-0.8.0/src/ynab_cli/adapters/ynab/models/plan_detail.py +146 -121
  124. ynab_cli-0.7.2/src/ynab_cli/adapters/ynab/models/budget_detail_response.py → ynab_cli-0.8.0/src/ynab_cli/adapters/ynab/models/plan_detail_response.py +14 -12
  125. ynab_cli-0.7.2/src/ynab_cli/adapters/ynab/models/budget_detail_response_data.py → ynab_cli-0.8.0/src/ynab_cli/adapters/ynab/models/plan_detail_response_data.py +17 -15
  126. ynab_cli-0.7.2/src/ynab_cli/adapters/ynab/models/budget_settings.py → ynab_cli-0.8.0/src/ynab_cli/adapters/ynab/models/plan_settings.py +23 -21
  127. ynab_cli-0.8.0/src/ynab_cli/adapters/ynab/models/plan_settings_response.py +67 -0
  128. ynab_cli-0.7.2/src/ynab_cli/adapters/ynab/models/budget_settings_response_data.py → ynab_cli-0.8.0/src/ynab_cli/adapters/ynab/models/plan_settings_response_data.py +14 -12
  129. ynab_cli-0.7.2/src/ynab_cli/adapters/ynab/models/budget_summary.py → ynab_cli-0.8.0/src/ynab_cli/adapters/ynab/models/plan_summary.py +49 -46
  130. ynab_cli-0.8.0/src/ynab_cli/adapters/ynab/models/plan_summary_response.py +67 -0
  131. ynab_cli-0.8.0/src/ynab_cli/adapters/ynab/models/plan_summary_response_data.py +109 -0
  132. {ynab_cli-0.7.2 → ynab_cli-0.8.0}/src/ynab_cli/adapters/ynab/models/post_account_wrapper.py +5 -3
  133. ynab_cli-0.8.0/src/ynab_cli/adapters/ynab/models/post_category_group_wrapper.py +67 -0
  134. ynab_cli-0.8.0/src/ynab_cli/adapters/ynab/models/post_category_wrapper.py +67 -0
  135. ynab_cli-0.8.0/src/ynab_cli/adapters/ynab/models/post_payee.py +61 -0
  136. ynab_cli-0.8.0/src/ynab_cli/adapters/ynab/models/post_payee_wrapper.py +67 -0
  137. {ynab_cli-0.7.2 → ynab_cli-0.8.0}/src/ynab_cli/adapters/ynab/models/post_scheduled_transaction_wrapper.py +5 -3
  138. {ynab_cli-0.7.2 → ynab_cli-0.8.0}/src/ynab_cli/adapters/ynab/models/post_transactions_wrapper.py +17 -13
  139. {ynab_cli-0.7.2 → ynab_cli-0.8.0}/src/ynab_cli/adapters/ynab/models/put_scheduled_transaction_wrapper.py +5 -3
  140. {ynab_cli-0.7.2 → ynab_cli-0.8.0}/src/ynab_cli/adapters/ynab/models/put_transaction_wrapper.py +5 -3
  141. {ynab_cli-0.7.2 → ynab_cli-0.8.0}/src/ynab_cli/adapters/ynab/models/save_account.py +8 -6
  142. ynab_cli-0.8.0/src/ynab_cli/adapters/ynab/models/save_account_type.py +16 -0
  143. ynab_cli-0.8.0/src/ynab_cli/adapters/ynab/models/save_category.py +207 -0
  144. ynab_cli-0.8.0/src/ynab_cli/adapters/ynab/models/save_category_goal_frequency.py +13 -0
  145. ynab_cli-0.8.0/src/ynab_cli/adapters/ynab/models/save_category_group.py +61 -0
  146. ynab_cli-0.8.0/src/ynab_cli/adapters/ynab/models/save_category_group_response.py +67 -0
  147. ynab_cli-0.8.0/src/ynab_cli/adapters/ynab/models/save_category_group_response_data.py +75 -0
  148. {ynab_cli-0.7.2 → ynab_cli-0.8.0}/src/ynab_cli/adapters/ynab/models/save_category_response.py +5 -3
  149. {ynab_cli-0.7.2 → ynab_cli-0.8.0}/src/ynab_cli/adapters/ynab/models/save_category_response_data.py +5 -3
  150. {ynab_cli-0.7.2 → ynab_cli-0.8.0}/src/ynab_cli/adapters/ynab/models/save_month_category.py +5 -3
  151. {ynab_cli-0.7.2 → ynab_cli-0.8.0}/src/ynab_cli/adapters/ynab/models/save_payee.py +6 -4
  152. {ynab_cli-0.7.2 → ynab_cli-0.8.0}/src/ynab_cli/adapters/ynab/models/save_payee_response.py +5 -3
  153. {ynab_cli-0.7.2 → ynab_cli-0.8.0}/src/ynab_cli/adapters/ynab/models/save_payee_response_data.py +5 -3
  154. {ynab_cli-0.7.2 → ynab_cli-0.8.0}/src/ynab_cli/adapters/ynab/models/save_scheduled_transaction.py +50 -51
  155. {ynab_cli-0.7.2 → ynab_cli-0.8.0}/src/ynab_cli/adapters/ynab/models/save_sub_transaction.py +30 -28
  156. {ynab_cli-0.7.2 → ynab_cli-0.8.0}/src/ynab_cli/adapters/ynab/models/save_transaction_with_id_or_import_id.py +90 -88
  157. {ynab_cli-0.7.2 → ynab_cli-0.8.0}/src/ynab_cli/adapters/ynab/models/save_transaction_with_optional_fields.py +77 -74
  158. {ynab_cli-0.7.2 → ynab_cli-0.8.0}/src/ynab_cli/adapters/ynab/models/save_transactions_response.py +5 -3
  159. {ynab_cli-0.7.2 → ynab_cli-0.8.0}/src/ynab_cli/adapters/ynab/models/save_transactions_response_data.py +22 -18
  160. ynab_cli-0.8.0/src/ynab_cli/adapters/ynab/models/scheduled_sub_transaction.py +258 -0
  161. ynab_cli-0.7.2/src/ynab_cli/adapters/ynab/models/scheduled_sub_transaction.py → ynab_cli-0.8.0/src/ynab_cli/adapters/ynab/models/scheduled_sub_transaction_base.py +42 -40
  162. {ynab_cli-0.7.2 → ynab_cli-0.8.0}/src/ynab_cli/adapters/ynab/models/scheduled_transaction_detail.py +85 -66
  163. {ynab_cli-0.7.2 → ynab_cli-0.8.0}/src/ynab_cli/adapters/ynab/models/scheduled_transaction_frequency.py +2 -2
  164. {ynab_cli-0.7.2 → ynab_cli-0.8.0}/src/ynab_cli/adapters/ynab/models/scheduled_transaction_response.py +5 -3
  165. {ynab_cli-0.7.2 → ynab_cli-0.8.0}/src/ynab_cli/adapters/ynab/models/scheduled_transaction_response_data.py +5 -3
  166. ynab_cli-0.8.0/src/ynab_cli/adapters/ynab/models/scheduled_transaction_summary.py +329 -0
  167. ynab_cli-0.7.2/src/ynab_cli/adapters/ynab/models/scheduled_transaction_summary.py → ynab_cli-0.8.0/src/ynab_cli/adapters/ynab/models/scheduled_transaction_summary_base.py +59 -58
  168. ynab_cli-0.7.2/src/ynab_cli/adapters/ynab/models/scheduled_transaction_summary_frequency.py → ynab_cli-0.8.0/src/ynab_cli/adapters/ynab/models/scheduled_transaction_summary_base_frequency.py +2 -2
  169. {ynab_cli-0.7.2 → ynab_cli-0.8.0}/src/ynab_cli/adapters/ynab/models/scheduled_transactions_response.py +5 -3
  170. {ynab_cli-0.7.2 → ynab_cli-0.8.0}/src/ynab_cli/adapters/ynab/models/scheduled_transactions_response_data.py +6 -4
  171. ynab_cli-0.8.0/src/ynab_cli/adapters/ynab/models/sub_transaction.py +278 -0
  172. ynab_cli-0.7.2/src/ynab_cli/adapters/ynab/models/sub_transaction.py → ynab_cli-0.8.0/src/ynab_cli/adapters/ynab/models/sub_transaction_base.py +47 -46
  173. {ynab_cli-0.7.2 → ynab_cli-0.8.0}/src/ynab_cli/adapters/ynab/models/transaction_cleared_status.py +2 -2
  174. {ynab_cli-0.7.2 → ynab_cli-0.8.0}/src/ynab_cli/adapters/ynab/models/transaction_detail.py +141 -122
  175. {ynab_cli-0.7.2 → ynab_cli-0.8.0}/src/ynab_cli/adapters/ynab/models/transaction_flag_color_type_1.py +2 -2
  176. {ynab_cli-0.7.2 → ynab_cli-0.8.0}/src/ynab_cli/adapters/ynab/models/transaction_flag_color_type_2_type_1.py +2 -2
  177. {ynab_cli-0.7.2 → ynab_cli-0.8.0}/src/ynab_cli/adapters/ynab/models/transaction_flag_color_type_3_type_1.py +2 -2
  178. {ynab_cli-0.7.2 → ynab_cli-0.8.0}/src/ynab_cli/adapters/ynab/models/transaction_response.py +5 -3
  179. {ynab_cli-0.7.2 → ynab_cli-0.8.0}/src/ynab_cli/adapters/ynab/models/transaction_response_data.py +5 -3
  180. ynab_cli-0.8.0/src/ynab_cli/adapters/ynab/models/transaction_summary.py +519 -0
  181. ynab_cli-0.7.2/src/ynab_cli/adapters/ynab/models/transaction_summary.py → ynab_cli-0.8.0/src/ynab_cli/adapters/ynab/models/transaction_summary_base.py +116 -114
  182. ynab_cli-0.7.2/src/ynab_cli/adapters/ynab/models/transaction_summary_debt_transaction_type_type_1.py → ynab_cli-0.8.0/src/ynab_cli/adapters/ynab/models/transaction_summary_base_debt_transaction_type_type_1.py +2 -2
  183. ynab_cli-0.7.2/src/ynab_cli/adapters/ynab/models/transaction_summary_debt_transaction_type_type_2_type_1.py → ynab_cli-0.8.0/src/ynab_cli/adapters/ynab/models/transaction_summary_base_debt_transaction_type_type_2_type_1.py +2 -2
  184. ynab_cli-0.7.2/src/ynab_cli/adapters/ynab/models/transaction_summary_debt_transaction_type_type_3_type_1.py → ynab_cli-0.8.0/src/ynab_cli/adapters/ynab/models/transaction_summary_base_debt_transaction_type_type_3_type_1.py +2 -2
  185. {ynab_cli-0.7.2 → ynab_cli-0.8.0}/src/ynab_cli/adapters/ynab/models/transactions_import_response.py +5 -3
  186. {ynab_cli-0.7.2 → ynab_cli-0.8.0}/src/ynab_cli/adapters/ynab/models/transactions_import_response_data.py +4 -2
  187. {ynab_cli-0.7.2 → ynab_cli-0.8.0}/src/ynab_cli/adapters/ynab/models/transactions_response.py +5 -3
  188. {ynab_cli-0.7.2 → ynab_cli-0.8.0}/src/ynab_cli/adapters/ynab/models/transactions_response_data.py +6 -4
  189. {ynab_cli-0.7.2 → ynab_cli-0.8.0}/src/ynab_cli/adapters/ynab/models/user.py +4 -2
  190. {ynab_cli-0.7.2 → ynab_cli-0.8.0}/src/ynab_cli/adapters/ynab/models/user_response.py +5 -3
  191. {ynab_cli-0.7.2 → ynab_cli-0.8.0}/src/ynab_cli/adapters/ynab/models/user_response_data.py +5 -3
  192. {ynab_cli-0.7.2 → ynab_cli-0.8.0}/src/ynab_cli/adapters/ynab/types.py +2 -3
  193. {ynab_cli-0.7.2 → ynab_cli-0.8.0}/src/ynab_cli/adapters/ynab/util.py +2 -2
  194. {ynab_cli-0.7.2 → ynab_cli-0.8.0}/src/ynab_cli/domain/use_cases/budgets.py +5 -5
  195. {ynab_cli-0.7.2 → ynab_cli-0.8.0}/src/ynab_cli/domain/use_cases/categories.py +3 -5
  196. {ynab_cli-0.7.2 → ynab_cli-0.8.0}/src/ynab_cli/domain/use_cases/payees.py +9 -12
  197. {ynab_cli-0.7.2 → ynab_cli-0.8.0}/src/ynab_cli/domain/use_cases/transactions.py +11 -11
  198. {ynab_cli-0.7.2 → ynab_cli-0.8.0}/src/ynab_cli/host/textual/widgets/common/command_widget.py +0 -2
  199. {ynab_cli-0.7.2 → ynab_cli-0.8.0}/src/ynab_cli/host/textual/widgets/transactions/apply_rules.py +1 -1
  200. {ynab_cli-0.7.2 → ynab_cli-0.8.0}/src/ynab_cli/host/textual/widgets/transactions/tabs.py +4 -6
  201. {ynab_cli-0.7.2 → ynab_cli-0.8.0}/tests/unit/domain/use_cases/test_budgets.py +7 -7
  202. {ynab_cli-0.7.2 → ynab_cli-0.8.0}/tests/unit/domain/use_cases/test_categories.py +32 -12
  203. {ynab_cli-0.7.2 → ynab_cli-0.8.0}/tests/unit/domain/use_cases/test_transactions.py +1 -3
  204. {ynab_cli-0.7.2 → ynab_cli-0.8.0}/tests/unit/host/click/commands/test_budgets.py +2 -2
  205. {ynab_cli-0.7.2 → ynab_cli-0.8.0}/tests/unit/host/click/commands/test_categories.py +4 -2
  206. ynab_cli-0.8.0/uv.lock +2601 -0
  207. ynab_cli-0.7.2/src/ynab_cli/adapters/ynab/api/transactions/get_transactions_by_month.py +0 -236
  208. ynab_cli-0.7.2/src/ynab_cli/adapters/ynab/models/budget_summary_response.py +0 -65
  209. ynab_cli-0.7.2/src/ynab_cli/adapters/ynab/models/budget_summary_response_data.py +0 -91
  210. ynab_cli-0.7.2/src/ynab_cli/adapters/ynab/models/save_category.py +0 -129
  211. ynab_cli-0.7.2/uv.lock +0 -2263
  212. {ynab_cli-0.7.2 → ynab_cli-0.8.0}/.env-sample +0 -0
  213. {ynab_cli-0.7.2 → ynab_cli-0.8.0}/.github/FUNDING.yml +0 -0
  214. {ynab_cli-0.7.2 → ynab_cli-0.8.0}/.github/workflows/pr.yml +0 -0
  215. {ynab_cli-0.7.2 → ynab_cli-0.8.0}/.github/workflows/publish-to-pypi.yml +0 -0
  216. {ynab_cli-0.7.2 → ynab_cli-0.8.0}/.gitignore +0 -0
  217. {ynab_cli-0.7.2 → ynab_cli-0.8.0}/.python-version +0 -0
  218. {ynab_cli-0.7.2 → ynab_cli-0.8.0}/LICENSE.md +0 -0
  219. {ynab_cli-0.7.2 → ynab_cli-0.8.0}/Makefile +0 -0
  220. {ynab_cli-0.7.2 → ynab_cli-0.8.0}/README.md +0 -0
  221. {ynab_cli-0.7.2 → ynab_cli-0.8.0}/docs/index.md +0 -0
  222. {ynab_cli-0.7.2 → ynab_cli-0.8.0}/docs/transaction_rules.md +0 -0
  223. {ynab_cli-0.7.2 → ynab_cli-0.8.0}/mkdocs.yml +0 -0
  224. {ynab_cli-0.7.2 → ynab_cli-0.8.0}/src/ynab_cli/__init__.py +0 -0
  225. {ynab_cli-0.7.2 → ynab_cli-0.8.0}/src/ynab_cli/adapters/__init__.py +0 -0
  226. {ynab_cli-0.7.2 → ynab_cli-0.8.0}/src/ynab_cli/adapters/rich/__init__.py +0 -0
  227. {ynab_cli-0.7.2 → ynab_cli-0.8.0}/src/ynab_cli/adapters/rich/io.py +0 -0
  228. {ynab_cli-0.7.2 → ynab_cli-0.8.0}/src/ynab_cli/adapters/textual/__init__.py +0 -0
  229. {ynab_cli-0.7.2 → ynab_cli-0.8.0}/src/ynab_cli/adapters/textual/io.py +0 -0
  230. {ynab_cli-0.7.2 → ynab_cli-0.8.0}/src/ynab_cli/adapters/ynab/__init__.py +0 -0
  231. {ynab_cli-0.7.2 → ynab_cli-0.8.0}/src/ynab_cli/adapters/ynab/api/__init__.py +0 -0
  232. {ynab_cli-0.7.2 → ynab_cli-0.8.0}/src/ynab_cli/adapters/ynab/api/accounts/__init__.py +0 -0
  233. {ynab_cli-0.7.2/src/ynab_cli/adapters/ynab/api/budgets → ynab_cli-0.8.0/src/ynab_cli/adapters/ynab/api/categories}/__init__.py +0 -0
  234. {ynab_cli-0.7.2/src/ynab_cli/adapters/ynab/api/categories → ynab_cli-0.8.0/src/ynab_cli/adapters/ynab/api/money_movements}/__init__.py +0 -0
  235. {ynab_cli-0.7.2 → ynab_cli-0.8.0}/src/ynab_cli/adapters/ynab/api/months/__init__.py +0 -0
  236. {ynab_cli-0.7.2 → ynab_cli-0.8.0}/src/ynab_cli/adapters/ynab/api/payee_locations/__init__.py +0 -0
  237. {ynab_cli-0.7.2 → ynab_cli-0.8.0}/src/ynab_cli/adapters/ynab/api/payees/__init__.py +0 -0
  238. {ynab_cli-0.7.2/src/ynab_cli/adapters/ynab/api/scheduled_transactions → ynab_cli-0.8.0/src/ynab_cli/adapters/ynab/api/plans}/__init__.py +0 -0
  239. {ynab_cli-0.7.2/src/ynab_cli/adapters/ynab/api/transactions → ynab_cli-0.8.0/src/ynab_cli/adapters/ynab/api/scheduled_transactions}/__init__.py +0 -0
  240. {ynab_cli-0.7.2/src/ynab_cli/adapters/ynab/api/user → ynab_cli-0.8.0/src/ynab_cli/adapters/ynab/api/transactions}/__init__.py +0 -0
  241. {ynab_cli-0.7.2 → ynab_cli-0.8.0}/src/ynab_cli/adapters/ynab/errors.py +0 -0
  242. {ynab_cli-0.7.2 → ynab_cli-0.8.0}/src/ynab_cli/domain/__init__.py +0 -0
  243. {ynab_cli-0.7.2 → ynab_cli-0.8.0}/src/ynab_cli/domain/constants.py +0 -0
  244. {ynab_cli-0.7.2 → ynab_cli-0.8.0}/src/ynab_cli/domain/models/__init__.py +0 -0
  245. {ynab_cli-0.7.2 → ynab_cli-0.8.0}/src/ynab_cli/domain/models/rules.py +0 -0
  246. {ynab_cli-0.7.2 → ynab_cli-0.8.0}/src/ynab_cli/domain/ports/__init__.py +0 -0
  247. {ynab_cli-0.7.2 → ynab_cli-0.8.0}/src/ynab_cli/domain/ports/io.py +0 -0
  248. {ynab_cli-0.7.2 → ynab_cli-0.8.0}/src/ynab_cli/domain/settings.py +0 -0
  249. {ynab_cli-0.7.2 → ynab_cli-0.8.0}/src/ynab_cli/domain/use_cases/__init__.py +0 -0
  250. {ynab_cli-0.7.2 → ynab_cli-0.8.0}/src/ynab_cli/host/__init__.py +0 -0
  251. {ynab_cli-0.7.2 → ynab_cli-0.8.0}/src/ynab_cli/host/cli.py +0 -0
  252. {ynab_cli-0.7.2 → ynab_cli-0.8.0}/src/ynab_cli/host/click/__init__.py +0 -0
  253. {ynab_cli-0.7.2 → ynab_cli-0.8.0}/src/ynab_cli/host/click/cli.py +0 -0
  254. {ynab_cli-0.7.2 → ynab_cli-0.8.0}/src/ynab_cli/host/click/commands/__init__.py +0 -0
  255. {ynab_cli-0.7.2 → ynab_cli-0.8.0}/src/ynab_cli/host/click/commands/budgets.py +0 -0
  256. {ynab_cli-0.7.2 → ynab_cli-0.8.0}/src/ynab_cli/host/click/commands/categories.py +0 -0
  257. {ynab_cli-0.7.2 → ynab_cli-0.8.0}/src/ynab_cli/host/click/commands/payees.py +0 -0
  258. {ynab_cli-0.7.2 → ynab_cli-0.8.0}/src/ynab_cli/host/click/commands/rich/__init__.py +0 -0
  259. {ynab_cli-0.7.2 → ynab_cli-0.8.0}/src/ynab_cli/host/click/commands/rich/progress_table.py +0 -0
  260. {ynab_cli-0.7.2 → ynab_cli-0.8.0}/src/ynab_cli/host/click/commands/transactions.py +0 -0
  261. {ynab_cli-0.7.2 → ynab_cli-0.8.0}/src/ynab_cli/host/click/container.py +0 -0
  262. {ynab_cli-0.7.2 → ynab_cli-0.8.0}/src/ynab_cli/host/constants.py +0 -0
  263. {ynab_cli-0.7.2 → ynab_cli-0.8.0}/src/ynab_cli/host/container.py +0 -0
  264. {ynab_cli-0.7.2 → ynab_cli-0.8.0}/src/ynab_cli/host/textual/__init__.py +0 -0
  265. {ynab_cli-0.7.2 → ynab_cli-0.8.0}/src/ynab_cli/host/textual/app.py +0 -0
  266. {ynab_cli-0.7.2 → ynab_cli-0.8.0}/src/ynab_cli/host/textual/app.tcss +0 -0
  267. {ynab_cli-0.7.2 → ynab_cli-0.8.0}/src/ynab_cli/host/textual/cli.py +0 -0
  268. {ynab_cli-0.7.2 → ynab_cli-0.8.0}/src/ynab_cli/host/textual/container.py +0 -0
  269. {ynab_cli-0.7.2 → ynab_cli-0.8.0}/src/ynab_cli/host/textual/widgets/__init__.py +0 -0
  270. {ynab_cli-0.7.2 → ynab_cli-0.8.0}/src/ynab_cli/host/textual/widgets/categories/__init__.py +0 -0
  271. {ynab_cli-0.7.2 → ynab_cli-0.8.0}/src/ynab_cli/host/textual/widgets/categories/list_all.py +0 -0
  272. {ynab_cli-0.7.2 → ynab_cli-0.8.0}/src/ynab_cli/host/textual/widgets/categories/list_unused.py +0 -0
  273. {ynab_cli-0.7.2 → ynab_cli-0.8.0}/src/ynab_cli/host/textual/widgets/categories/tabs.py +0 -0
  274. {ynab_cli-0.7.2 → ynab_cli-0.8.0}/src/ynab_cli/host/textual/widgets/common/__init__.py +0 -0
  275. {ynab_cli-0.7.2 → ynab_cli-0.8.0}/src/ynab_cli/host/textual/widgets/common/dialogs/__init__.py +0 -0
  276. {ynab_cli-0.7.2 → ynab_cli-0.8.0}/src/ynab_cli/host/textual/widgets/common/dialogs/dialog.py +0 -0
  277. {ynab_cli-0.7.2 → ynab_cli-0.8.0}/src/ynab_cli/host/textual/widgets/common/dialogs/form.py +0 -0
  278. {ynab_cli-0.7.2 → ynab_cli-0.8.0}/src/ynab_cli/host/textual/widgets/common/dialogs/screen.py +0 -0
  279. {ynab_cli-0.7.2 → ynab_cli-0.8.0}/src/ynab_cli/host/textual/widgets/payees/__init__.py +0 -0
  280. {ynab_cli-0.7.2 → ynab_cli-0.8.0}/src/ynab_cli/host/textual/widgets/payees/list_all.py +0 -0
  281. {ynab_cli-0.7.2 → ynab_cli-0.8.0}/src/ynab_cli/host/textual/widgets/payees/list_duplicates.py +0 -0
  282. {ynab_cli-0.7.2 → ynab_cli-0.8.0}/src/ynab_cli/host/textual/widgets/payees/list_unused.py +0 -0
  283. {ynab_cli-0.7.2 → ynab_cli-0.8.0}/src/ynab_cli/host/textual/widgets/payees/normalize_names.py +0 -0
  284. {ynab_cli-0.7.2 → ynab_cli-0.8.0}/src/ynab_cli/host/textual/widgets/payees/tabs.py +0 -0
  285. {ynab_cli-0.7.2 → ynab_cli-0.8.0}/src/ynab_cli/host/textual/widgets/tabs.py +0 -0
  286. {ynab_cli-0.7.2 → ynab_cli-0.8.0}/src/ynab_cli/host/textual/widgets/transactions/__init__.py +0 -0
  287. {ynab_cli-0.7.2 → ynab_cli-0.8.0}/src/ynab_cli/py.typed +0 -0
  288. {ynab_cli-0.7.2 → ynab_cli-0.8.0}/tests/__init__.py +0 -0
  289. {ynab_cli-0.7.2 → ynab_cli-0.8.0}/tests/conftest.py +0 -0
  290. {ynab_cli-0.7.2 → ynab_cli-0.8.0}/tests/factories/__init__.py +0 -0
  291. {ynab_cli-0.7.2 → ynab_cli-0.8.0}/tests/factories/ynab.py +0 -0
  292. {ynab_cli-0.7.2 → ynab_cli-0.8.0}/tests/unit/__init__.py +0 -0
  293. {ynab_cli-0.7.2 → ynab_cli-0.8.0}/tests/unit/adapters/__init__.py +0 -0
  294. {ynab_cli-0.7.2 → ynab_cli-0.8.0}/tests/unit/adapters/rich/__init__.py +0 -0
  295. {ynab_cli-0.7.2 → ynab_cli-0.8.0}/tests/unit/adapters/rich/test_io.py +0 -0
  296. {ynab_cli-0.7.2 → ynab_cli-0.8.0}/tests/unit/adapters/textual/__init__.py +0 -0
  297. {ynab_cli-0.7.2 → ynab_cli-0.8.0}/tests/unit/adapters/textual/test_io.py +0 -0
  298. {ynab_cli-0.7.2 → ynab_cli-0.8.0}/tests/unit/conftest.py +0 -0
  299. {ynab_cli-0.7.2 → ynab_cli-0.8.0}/tests/unit/domain/__init__.py +0 -0
  300. {ynab_cli-0.7.2 → ynab_cli-0.8.0}/tests/unit/domain/models/__init__.py +0 -0
  301. {ynab_cli-0.7.2 → ynab_cli-0.8.0}/tests/unit/domain/models/test_rules.py +0 -0
  302. {ynab_cli-0.7.2 → ynab_cli-0.8.0}/tests/unit/domain/ports/__init__.py +0 -0
  303. {ynab_cli-0.7.2 → ynab_cli-0.8.0}/tests/unit/domain/ports/test_io.py +0 -0
  304. {ynab_cli-0.7.2 → ynab_cli-0.8.0}/tests/unit/domain/use_cases/__init__.py +0 -0
  305. {ynab_cli-0.7.2 → ynab_cli-0.8.0}/tests/unit/domain/use_cases/test_payees.py +0 -0
  306. {ynab_cli-0.7.2 → ynab_cli-0.8.0}/tests/unit/host/__init__.py +0 -0
  307. {ynab_cli-0.7.2 → ynab_cli-0.8.0}/tests/unit/host/click/__init__.py +0 -0
  308. {ynab_cli-0.7.2 → ynab_cli-0.8.0}/tests/unit/host/click/commands/__init__.py +0 -0
  309. {ynab_cli-0.7.2 → ynab_cli-0.8.0}/tests/unit/host/click/commands/test_payees.py +0 -0
  310. {ynab_cli-0.7.2 → ynab_cli-0.8.0}/tests/unit/host/click/commands/test_transactions.py +0 -0
  311. {ynab_cli-0.7.2 → ynab_cli-0.8.0}/tests/unit/host/click/conftest.py +0 -0
  312. {ynab_cli-0.7.2 → ynab_cli-0.8.0}/tests/unit/host/conftest.py +0 -0
  313. {ynab_cli-0.7.2 → ynab_cli-0.8.0}/tests/unit/host/test_cli.py +0 -0
  314. {ynab_cli-0.7.2 → ynab_cli-0.8.0}/tests/unit/host/textual/__init__.py +0 -0
  315. {ynab_cli-0.7.2 → ynab_cli-0.8.0}/tests/unit/host/textual/conftest.py +0 -0
  316. {ynab_cli-0.7.2 → ynab_cli-0.8.0}/tests/unit/host/textual/test_app.py +0 -0
  317. {ynab_cli-0.7.2 → ynab_cli-0.8.0}/tests/unit/host/textual/test_cli.py +0 -0
@@ -63,16 +63,17 @@ from typing import Any
63
63
  from unittest.mock import MagicMock, Mock
64
64
  import pytest
65
65
 
66
+
66
67
  class TestMyClass:
67
68
  def test_method_name_success_scenario(self) -> None:
68
69
  """Test description of what is being tested."""
69
70
  # Arrange
70
71
  mock_dependency = Mock()
71
72
  instance = MyClass(mock_dependency)
72
-
73
+
73
74
  # Act
74
75
  result = instance.method_name()
75
-
76
+
76
77
  # Assert
77
78
  assert result == expected_value
78
79
  mock_dependency.some_method.assert_called_once()
@@ -89,14 +90,15 @@ class TestMyClass:
89
90
  from typing import Any, Self
90
91
  from attrs import define
91
92
 
93
+
92
94
  @define
93
95
  class MyModel:
94
96
  field: str
95
97
  optional_field: int | None = None
96
-
98
+
97
99
  def to_dict(self) -> dict[str, Any]:
98
100
  return {"field": self.field, "optional_field": self.optional_field}
99
-
101
+
100
102
  @classmethod
101
103
  def from_dict(cls, data: dict[str, Any]) -> Self:
102
104
  return cls(field=data["field"], optional_field=data.get("optional_field"))
@@ -132,7 +134,7 @@ class MyModel:
132
134
  - All API models should be in `adapters/ynab/models/`
133
135
  - Use proper error handling for HTTP requests
134
136
  - Implement rate limiting if needed
135
- - Use `httpx` for HTTP client
137
+ - Use `httpx2` for HTTP client
136
138
 
137
139
  ## File Organization
138
140
 
@@ -7,6 +7,7 @@ version: 2
7
7
  updates:
8
8
  - package-ecosystem: "uv"
9
9
  directory: "/"
10
+ target-branch: "main"
10
11
  schedule:
11
12
  interval: "weekly"
12
13
  commit-message:
@@ -5,6 +5,22 @@ All notable changes to this project will be documented in this file.
5
5
  The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),
6
6
  and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
7
7
 
8
+ ## v0.8.0 (2026-09-04)
9
+
10
+ ### Feat
11
+
12
+ - update ynab sdk to latest
13
+
14
+ ### Fix
15
+
16
+ - update deps and replace httpx with httpx2
17
+
18
+ ## v0.7.3 (2026-05-29)
19
+
20
+ ### Refactor
21
+
22
+ - fix some lint issues and update deps
23
+
8
24
  ## v0.7.2 (2026-01-27)
9
25
 
10
26
  ### Fix
@@ -1,6 +1,6 @@
1
- Metadata-Version: 2.4
1
+ Metadata-Version: 2.5
2
2
  Name: ynab-cli
3
- Version: 0.7.2
3
+ Version: 0.8.0
4
4
  Summary: YNAB Command Line Interface
5
5
  Project-URL: Changelog, https://github.com/jeffsawatzky/ynab-cli/blob/main/CHANGELOG.md
6
6
  Project-URL: Documentation, https://jeffsawatzky.github.io/ynab-cli/
@@ -19,20 +19,20 @@ Classifier: Programming Language :: Python :: 3.13
19
19
  Classifier: Topic :: Office/Business :: Financial
20
20
  Classifier: Topic :: Utilities
21
21
  Requires-Python: <4.0.0,>=3.11
22
- Requires-Dist: anyio~=4.12
23
- Requires-Dist: attrs~=25.4
22
+ Requires-Dist: anyio~=4.15
23
+ Requires-Dist: attrs~=26.1
24
24
  Requires-Dist: click-default-group~=1.2
25
- Requires-Dist: click~=8.3
26
- Requires-Dist: httpx~=0.28
25
+ Requires-Dist: click~=8.5
26
+ Requires-Dist: httpx2>=2.12
27
27
  Requires-Dist: lagom~=2.7
28
28
  Requires-Dist: python-dateutil~=2.9
29
29
  Requires-Dist: python-dotenv~=1.2
30
30
  Requires-Dist: rapidfuzz~=3.14
31
- Requires-Dist: rich~=14.3
32
- Requires-Dist: rule-engine~=4.5
33
- Requires-Dist: textual-fspicker~=0.6
34
- Requires-Dist: textual~=7.4
35
- Requires-Dist: typing-extensions~=4.15
31
+ Requires-Dist: rich~=15.0
32
+ Requires-Dist: rule-engine~=5.0
33
+ Requires-Dist: textual-fspicker~=1.0
34
+ Requires-Dist: textual~=8.2
35
+ Requires-Dist: typing-extensions~=4.16
36
36
  Requires-Dist: uvloop~=0.22
37
37
  Description-Content-Type: text/markdown
38
38
 
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "ynab-cli"
3
- version = "0.7.2"
3
+ version = "0.8.0"
4
4
  description = "YNAB Command Line Interface"
5
5
  readme = "README.md"
6
6
  requires-python = ">=3.11,<4.0.0"
@@ -33,20 +33,20 @@ classifiers = [
33
33
  ]
34
34
 
35
35
  dependencies = [
36
- "anyio~=4.12",
37
- "attrs~=25.4",
36
+ "anyio~=4.15",
37
+ "attrs~=26.1",
38
38
  "click-default-group~=1.2",
39
- "click~=8.3",
40
- "httpx~=0.28",
39
+ "click~=8.5",
40
+ "httpx2>=2.12",
41
41
  "lagom~=2.7",
42
42
  "python-dateutil~=2.9",
43
43
  "python-dotenv~=1.2",
44
44
  "rapidfuzz~=3.14",
45
- "rich~=14.3",
46
- "rule-engine~=4.5",
47
- "textual-fspicker~=0.6",
48
- "textual~=7.4",
49
- "typing-extensions~=4.15",
45
+ "rich~=15.0",
46
+ "rule-engine~=5.0",
47
+ "textual-fspicker~=1.0",
48
+ "textual~=8.2",
49
+ "typing-extensions~=4.16",
50
50
  "uvloop~=0.22",
51
51
  ]
52
52
 
@@ -63,18 +63,18 @@ ynab-cli = "ynab_cli.host.cli:main"
63
63
 
64
64
  [dependency-groups]
65
65
  dev = [
66
- "commitizen~=4.12",
66
+ "commitizen~=4.18",
67
67
  "factory-boy~=3.3",
68
68
  "mkdocs-click~=0.9",
69
69
  "mkdocs-material~=9.7",
70
70
  "mkdocs~=1.6",
71
- "mypy~=1.19",
72
- "pytest-cov~=7.0",
71
+ "mypy~=2.3",
72
+ "pytest-cov~=7.1",
73
73
  "pytest-mock~=3.15",
74
- "pytest~=9.0",
75
- "ruff~=0.14",
74
+ "pytest~=9.1",
75
+ "ruff~=0.16",
76
76
  "textual-dev~=1.8",
77
- "trio~=0.32",
77
+ "trio~=0.34",
78
78
  "types-python-dateutil~=2.9",
79
79
  ]
80
80
 
@@ -1,7 +1,8 @@
1
1
  from http import HTTPStatus
2
2
  from typing import Any
3
+ from urllib.parse import quote
3
4
 
4
- import httpx
5
+ import httpx2
5
6
 
6
7
  from ynab_cli.adapters.ynab import errors
7
8
  from ynab_cli.adapters.ynab.client import AuthenticatedClient, Client
@@ -12,7 +13,7 @@ from ynab_cli.adapters.ynab.types import Response
12
13
 
13
14
 
14
15
  def _get_kwargs(
15
- budget_id: str,
16
+ plan_id: str,
16
17
  *,
17
18
  body: PostAccountWrapper,
18
19
  ) -> dict[str, Any]:
@@ -20,7 +21,9 @@ def _get_kwargs(
20
21
 
21
22
  _kwargs: dict[str, Any] = {
22
23
  "method": "post",
23
- "url": f"/budgets/{budget_id}/accounts",
24
+ "url": "/plans/{plan_id}/accounts".format(
25
+ plan_id=quote(str(plan_id), safe=""),
26
+ ),
24
27
  }
25
28
 
26
29
  _kwargs["json"] = body.to_dict()
@@ -32,7 +35,7 @@ def _get_kwargs(
32
35
 
33
36
 
34
37
  def _parse_response(
35
- *, client: AuthenticatedClient | Client, response: httpx.Response
38
+ *, client: AuthenticatedClient | Client, response: httpx2.Response
36
39
  ) -> AccountResponse | ErrorResponse | None:
37
40
  if response.status_code == 201:
38
41
  response_201 = AccountResponse.from_dict(response.json())
@@ -51,7 +54,7 @@ def _parse_response(
51
54
 
52
55
 
53
56
  def _build_response(
54
- *, client: AuthenticatedClient | Client, response: httpx.Response
57
+ *, client: AuthenticatedClient | Client, response: httpx2.Response
55
58
  ) -> Response[AccountResponse | ErrorResponse]:
56
59
  return Response(
57
60
  status_code=HTTPStatus(response.status_code),
@@ -62,29 +65,29 @@ def _build_response(
62
65
 
63
66
 
64
67
  def sync_detailed(
65
- budget_id: str,
68
+ plan_id: str,
66
69
  *,
67
70
  client: AuthenticatedClient | Client,
68
71
  body: PostAccountWrapper,
69
72
  ) -> Response[AccountResponse | ErrorResponse]:
70
- """Create a new account
73
+ """Create an account
71
74
 
72
75
  Creates a new account
73
76
 
74
77
  Args:
75
- budget_id (str):
78
+ plan_id (str):
76
79
  body (PostAccountWrapper):
77
80
 
78
81
  Raises:
79
82
  errors.UnexpectedStatusError: If the server returns an undocumented status code and Client.raise_on_unexpected_status is True.
80
- httpx.TimeoutException: If the request takes longer than Client.timeout.
83
+ httpx2.TimeoutException: If the request takes longer than Client.timeout.
81
84
 
82
85
  Returns:
83
- Response[Union[AccountResponse, ErrorResponse]]
86
+ Response[AccountResponse | ErrorResponse]
84
87
  """
85
88
 
86
89
  kwargs = _get_kwargs(
87
- budget_id=budget_id,
90
+ plan_id=plan_id,
88
91
  body=body,
89
92
  )
90
93
 
@@ -96,58 +99,58 @@ def sync_detailed(
96
99
 
97
100
 
98
101
  def sync(
99
- budget_id: str,
102
+ plan_id: str,
100
103
  *,
101
104
  client: AuthenticatedClient | Client,
102
105
  body: PostAccountWrapper,
103
106
  ) -> AccountResponse | ErrorResponse | None:
104
- """Create a new account
107
+ """Create an account
105
108
 
106
109
  Creates a new account
107
110
 
108
111
  Args:
109
- budget_id (str):
112
+ plan_id (str):
110
113
  body (PostAccountWrapper):
111
114
 
112
115
  Raises:
113
116
  errors.UnexpectedStatusError: If the server returns an undocumented status code and Client.raise_on_unexpected_status is True.
114
- httpx.TimeoutException: If the request takes longer than Client.timeout.
117
+ httpx2.TimeoutException: If the request takes longer than Client.timeout.
115
118
 
116
119
  Returns:
117
- Union[AccountResponse, ErrorResponse]
120
+ AccountResponse | ErrorResponse
118
121
  """
119
122
 
120
123
  return sync_detailed(
121
- budget_id=budget_id,
124
+ plan_id=plan_id,
122
125
  client=client,
123
126
  body=body,
124
127
  ).parsed
125
128
 
126
129
 
127
130
  async def asyncio_detailed(
128
- budget_id: str,
131
+ plan_id: str,
129
132
  *,
130
133
  client: AuthenticatedClient | Client,
131
134
  body: PostAccountWrapper,
132
135
  ) -> Response[AccountResponse | ErrorResponse]:
133
- """Create a new account
136
+ """Create an account
134
137
 
135
138
  Creates a new account
136
139
 
137
140
  Args:
138
- budget_id (str):
141
+ plan_id (str):
139
142
  body (PostAccountWrapper):
140
143
 
141
144
  Raises:
142
145
  errors.UnexpectedStatusError: If the server returns an undocumented status code and Client.raise_on_unexpected_status is True.
143
- httpx.TimeoutException: If the request takes longer than Client.timeout.
146
+ httpx2.TimeoutException: If the request takes longer than Client.timeout.
144
147
 
145
148
  Returns:
146
- Response[Union[AccountResponse, ErrorResponse]]
149
+ Response[AccountResponse | ErrorResponse]
147
150
  """
148
151
 
149
152
  kwargs = _get_kwargs(
150
- budget_id=budget_id,
153
+ plan_id=plan_id,
151
154
  body=body,
152
155
  )
153
156
 
@@ -157,30 +160,30 @@ async def asyncio_detailed(
157
160
 
158
161
 
159
162
  async def asyncio(
160
- budget_id: str,
163
+ plan_id: str,
161
164
  *,
162
165
  client: AuthenticatedClient | Client,
163
166
  body: PostAccountWrapper,
164
167
  ) -> AccountResponse | ErrorResponse | None:
165
- """Create a new account
168
+ """Create an account
166
169
 
167
170
  Creates a new account
168
171
 
169
172
  Args:
170
- budget_id (str):
173
+ plan_id (str):
171
174
  body (PostAccountWrapper):
172
175
 
173
176
  Raises:
174
177
  errors.UnexpectedStatusError: If the server returns an undocumented status code and Client.raise_on_unexpected_status is True.
175
- httpx.TimeoutException: If the request takes longer than Client.timeout.
178
+ httpx2.TimeoutException: If the request takes longer than Client.timeout.
176
179
 
177
180
  Returns:
178
- Union[AccountResponse, ErrorResponse]
181
+ AccountResponse | ErrorResponse
179
182
  """
180
183
 
181
184
  return (
182
185
  await asyncio_detailed(
183
- budget_id=budget_id,
186
+ plan_id=plan_id,
184
187
  client=client,
185
188
  body=body,
186
189
  )
@@ -1,9 +1,11 @@
1
1
  from http import HTTPStatus
2
2
  from typing import Any
3
+ from urllib.parse import quote
3
4
  from uuid import UUID
4
5
 
5
- import httpx
6
+ import httpx2
6
7
 
8
+ from ynab_cli.adapters.ynab import errors
7
9
  from ynab_cli.adapters.ynab.client import AuthenticatedClient, Client
8
10
  from ynab_cli.adapters.ynab.models.account_response import AccountResponse
9
11
  from ynab_cli.adapters.ynab.models.error_response import ErrorResponse
@@ -11,20 +13,24 @@ from ynab_cli.adapters.ynab.types import Response
11
13
 
12
14
 
13
15
  def _get_kwargs(
14
- budget_id: str,
16
+ plan_id: str,
15
17
  account_id: UUID,
16
18
  ) -> dict[str, Any]:
19
+
17
20
  _kwargs: dict[str, Any] = {
18
21
  "method": "get",
19
- "url": f"/budgets/{budget_id}/accounts/{account_id}",
22
+ "url": "/plans/{plan_id}/accounts/{account_id}".format(
23
+ plan_id=quote(str(plan_id), safe=""),
24
+ account_id=quote(str(account_id), safe=""),
25
+ ),
20
26
  }
21
27
 
22
28
  return _kwargs
23
29
 
24
30
 
25
31
  def _parse_response(
26
- *, client: AuthenticatedClient | Client, response: httpx.Response
27
- ) -> AccountResponse | ErrorResponse:
32
+ *, client: AuthenticatedClient | Client, response: httpx2.Response
33
+ ) -> AccountResponse | ErrorResponse | None:
28
34
  if response.status_code == 200:
29
35
  response_200 = AccountResponse.from_dict(response.json())
30
36
 
@@ -35,13 +41,14 @@ def _parse_response(
35
41
 
36
42
  return response_404
37
43
 
38
- response_default = ErrorResponse.from_dict(response.json())
39
-
40
- return response_default
44
+ if client.raise_on_unexpected_status:
45
+ raise errors.UnexpectedStatusError(response.status_code, response.content)
46
+ else:
47
+ return None
41
48
 
42
49
 
43
50
  def _build_response(
44
- *, client: AuthenticatedClient | Client, response: httpx.Response
51
+ *, client: AuthenticatedClient | Client, response: httpx2.Response
45
52
  ) -> Response[AccountResponse | ErrorResponse]:
46
53
  return Response(
47
54
  status_code=HTTPStatus(response.status_code),
@@ -52,29 +59,29 @@ def _build_response(
52
59
 
53
60
 
54
61
  def sync_detailed(
55
- budget_id: str,
62
+ plan_id: str,
56
63
  account_id: UUID,
57
64
  *,
58
65
  client: AuthenticatedClient | Client,
59
66
  ) -> Response[AccountResponse | ErrorResponse]:
60
- """Single account
67
+ """Get an account
61
68
 
62
69
  Returns a single account
63
70
 
64
71
  Args:
65
- budget_id (str):
72
+ plan_id (str):
66
73
  account_id (UUID):
67
74
 
68
75
  Raises:
69
76
  errors.UnexpectedStatusError: If the server returns an undocumented status code and Client.raise_on_unexpected_status is True.
70
- httpx.TimeoutException: If the request takes longer than Client.timeout.
77
+ httpx2.TimeoutException: If the request takes longer than Client.timeout.
71
78
 
72
79
  Returns:
73
- Response[Union[AccountResponse, ErrorResponse]]
80
+ Response[AccountResponse | ErrorResponse]
74
81
  """
75
82
 
76
83
  kwargs = _get_kwargs(
77
- budget_id=budget_id,
84
+ plan_id=plan_id,
78
85
  account_id=account_id,
79
86
  )
80
87
 
@@ -86,58 +93,58 @@ def sync_detailed(
86
93
 
87
94
 
88
95
  def sync(
89
- budget_id: str,
96
+ plan_id: str,
90
97
  account_id: UUID,
91
98
  *,
92
99
  client: AuthenticatedClient | Client,
93
100
  ) -> AccountResponse | ErrorResponse | None:
94
- """Single account
101
+ """Get an account
95
102
 
96
103
  Returns a single account
97
104
 
98
105
  Args:
99
- budget_id (str):
106
+ plan_id (str):
100
107
  account_id (UUID):
101
108
 
102
109
  Raises:
103
110
  errors.UnexpectedStatusError: If the server returns an undocumented status code and Client.raise_on_unexpected_status is True.
104
- httpx.TimeoutException: If the request takes longer than Client.timeout.
111
+ httpx2.TimeoutException: If the request takes longer than Client.timeout.
105
112
 
106
113
  Returns:
107
- Union[AccountResponse, ErrorResponse]
114
+ AccountResponse | ErrorResponse
108
115
  """
109
116
 
110
117
  return sync_detailed(
111
- budget_id=budget_id,
118
+ plan_id=plan_id,
112
119
  account_id=account_id,
113
120
  client=client,
114
121
  ).parsed
115
122
 
116
123
 
117
124
  async def asyncio_detailed(
118
- budget_id: str,
125
+ plan_id: str,
119
126
  account_id: UUID,
120
127
  *,
121
128
  client: AuthenticatedClient | Client,
122
129
  ) -> Response[AccountResponse | ErrorResponse]:
123
- """Single account
130
+ """Get an account
124
131
 
125
132
  Returns a single account
126
133
 
127
134
  Args:
128
- budget_id (str):
135
+ plan_id (str):
129
136
  account_id (UUID):
130
137
 
131
138
  Raises:
132
139
  errors.UnexpectedStatusError: If the server returns an undocumented status code and Client.raise_on_unexpected_status is True.
133
- httpx.TimeoutException: If the request takes longer than Client.timeout.
140
+ httpx2.TimeoutException: If the request takes longer than Client.timeout.
134
141
 
135
142
  Returns:
136
- Response[Union[AccountResponse, ErrorResponse]]
143
+ Response[AccountResponse | ErrorResponse]
137
144
  """
138
145
 
139
146
  kwargs = _get_kwargs(
140
- budget_id=budget_id,
147
+ plan_id=plan_id,
141
148
  account_id=account_id,
142
149
  )
143
150
 
@@ -147,30 +154,30 @@ async def asyncio_detailed(
147
154
 
148
155
 
149
156
  async def asyncio(
150
- budget_id: str,
157
+ plan_id: str,
151
158
  account_id: UUID,
152
159
  *,
153
160
  client: AuthenticatedClient | Client,
154
161
  ) -> AccountResponse | ErrorResponse | None:
155
- """Single account
162
+ """Get an account
156
163
 
157
164
  Returns a single account
158
165
 
159
166
  Args:
160
- budget_id (str):
167
+ plan_id (str):
161
168
  account_id (UUID):
162
169
 
163
170
  Raises:
164
171
  errors.UnexpectedStatusError: If the server returns an undocumented status code and Client.raise_on_unexpected_status is True.
165
- httpx.TimeoutException: If the request takes longer than Client.timeout.
172
+ httpx2.TimeoutException: If the request takes longer than Client.timeout.
166
173
 
167
174
  Returns:
168
- Union[AccountResponse, ErrorResponse]
175
+ AccountResponse | ErrorResponse
169
176
  """
170
177
 
171
178
  return (
172
179
  await asyncio_detailed(
173
- budget_id=budget_id,
180
+ plan_id=plan_id,
174
181
  account_id=account_id,
175
182
  client=client,
176
183
  )