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.
- {ynab_cli-0.7.2 → ynab_cli-0.8.0}/.github/.copilot-instructions.md +7 -5
- {ynab_cli-0.7.2 → ynab_cli-0.8.0}/.github/dependabot.yml +1 -0
- {ynab_cli-0.7.2 → ynab_cli-0.8.0}/CHANGELOG.md +16 -0
- {ynab_cli-0.7.2 → ynab_cli-0.8.0}/PKG-INFO +11 -11
- {ynab_cli-0.7.2 → ynab_cli-0.8.0}/pyproject.toml +16 -16
- {ynab_cli-0.7.2 → ynab_cli-0.8.0}/src/ynab_cli/adapters/ynab/api/accounts/create_account.py +32 -29
- {ynab_cli-0.7.2 → ynab_cli-0.8.0}/src/ynab_cli/adapters/ynab/api/accounts/get_account_by_id.py +40 -33
- {ynab_cli-0.7.2 → ynab_cli-0.8.0}/src/ynab_cli/adapters/ynab/api/accounts/get_accounts.py +48 -42
- ynab_cli-0.8.0/src/ynab_cli/adapters/ynab/api/categories/create_category.py +190 -0
- ynab_cli-0.8.0/src/ynab_cli/adapters/ynab/api/categories/create_category_group.py +190 -0
- {ynab_cli-0.7.2 → ynab_cli-0.8.0}/src/ynab_cli/adapters/ynab/api/categories/get_categories.py +56 -50
- {ynab_cli-0.7.2 → ynab_cli-0.8.0}/src/ynab_cli/adapters/ynab/api/categories/get_category_by_id.py +48 -41
- {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
- {ynab_cli-0.7.2 → ynab_cli-0.8.0}/src/ynab_cli/adapters/ynab/api/categories/update_category.py +29 -25
- ynab_cli-0.8.0/src/ynab_cli/adapters/ynab/api/categories/update_category_group.py +204 -0
- {ynab_cli-0.7.2 → ynab_cli-0.8.0}/src/ynab_cli/adapters/ynab/api/categories/update_month_category.py +34 -29
- ynab_cli-0.8.0/src/ynab_cli/adapters/ynab/api/money_movements/get_money_movement_groups.py +169 -0
- ynab_cli-0.8.0/src/ynab_cli/adapters/ynab/api/money_movements/get_money_movement_groups_by_month.py +184 -0
- ynab_cli-0.8.0/src/ynab_cli/adapters/ynab/api/money_movements/get_money_movements.py +169 -0
- ynab_cli-0.8.0/src/ynab_cli/adapters/ynab/api/money_movements/get_money_movements_by_month.py +184 -0
- 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
- 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
- {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
- {ynab_cli-0.7.2 → ynab_cli-0.8.0}/src/ynab_cli/adapters/ynab/api/payee_locations/get_payee_locations.py +39 -33
- {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
- ynab_cli-0.8.0/src/ynab_cli/adapters/ynab/api/payees/create_payee.py +190 -0
- {ynab_cli-0.7.2 → ynab_cli-0.8.0}/src/ynab_cli/adapters/ynab/api/payees/get_payee_by_id.py +41 -32
- {ynab_cli-0.7.2 → ynab_cli-0.8.0}/src/ynab_cli/adapters/ynab/api/payees/get_payees.py +48 -42
- {ynab_cli-0.7.2 → ynab_cli-0.8.0}/src/ynab_cli/adapters/ynab/api/payees/update_payee.py +29 -25
- 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
- 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
- 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
- {ynab_cli-0.7.2 → ynab_cli-0.8.0}/src/ynab_cli/adapters/ynab/api/scheduled_transactions/create_scheduled_transaction.py +32 -29
- {ynab_cli-0.7.2 → ynab_cli-0.8.0}/src/ynab_cli/adapters/ynab/api/scheduled_transactions/delete_scheduled_transaction.py +34 -29
- {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
- {ynab_cli-0.7.2 → ynab_cli-0.8.0}/src/ynab_cli/adapters/ynab/api/scheduled_transactions/get_scheduled_transactions.py +48 -42
- {ynab_cli-0.7.2 → ynab_cli-0.8.0}/src/ynab_cli/adapters/ynab/api/scheduled_transactions/update_scheduled_transaction.py +33 -29
- {ynab_cli-0.7.2 → ynab_cli-0.8.0}/src/ynab_cli/adapters/ynab/api/transactions/create_transaction.py +28 -25
- {ynab_cli-0.7.2 → ynab_cli-0.8.0}/src/ynab_cli/adapters/ynab/api/transactions/delete_transaction.py +34 -29
- {ynab_cli-0.7.2 → ynab_cli-0.8.0}/src/ynab_cli/adapters/ynab/api/transactions/get_transaction_by_id.py +40 -33
- {ynab_cli-0.7.2 → ynab_cli-0.8.0}/src/ynab_cli/adapters/ynab/api/transactions/get_transactions.py +84 -62
- {ynab_cli-0.7.2 → ynab_cli-0.8.0}/src/ynab_cli/adapters/ynab/api/transactions/get_transactions_by_account.py +87 -62
- {ynab_cli-0.7.2 → ynab_cli-0.8.0}/src/ynab_cli/adapters/ynab/api/transactions/get_transactions_by_category.py +91 -66
- ynab_cli-0.8.0/src/ynab_cli/adapters/ynab/api/transactions/get_transactions_by_month.py +261 -0
- {ynab_cli-0.7.2 → ynab_cli-0.8.0}/src/ynab_cli/adapters/ynab/api/transactions/get_transactions_by_payee.py +91 -66
- {ynab_cli-0.7.2 → ynab_cli-0.8.0}/src/ynab_cli/adapters/ynab/api/transactions/import_transactions.py +45 -41
- {ynab_cli-0.7.2 → ynab_cli-0.8.0}/src/ynab_cli/adapters/ynab/api/transactions/update_transaction.py +33 -29
- {ynab_cli-0.7.2 → ynab_cli-0.8.0}/src/ynab_cli/adapters/ynab/api/transactions/update_transactions.py +31 -28
- ynab_cli-0.8.0/src/ynab_cli/adapters/ynab/api/user/__init__.py +1 -0
- {ynab_cli-0.7.2 → ynab_cli-0.8.0}/src/ynab_cli/adapters/ynab/api/user/get_user.py +25 -25
- {ynab_cli-0.7.2 → ynab_cli-0.8.0}/src/ynab_cli/adapters/ynab/client.py +79 -58
- {ynab_cli-0.7.2 → ynab_cli-0.8.0}/src/ynab_cli/adapters/ynab/models/__init__.py +90 -32
- ynab_cli-0.8.0/src/ynab_cli/adapters/ynab/models/account.py +404 -0
- 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
- {ynab_cli-0.7.2 → ynab_cli-0.8.0}/src/ynab_cli/adapters/ynab/models/account_response.py +5 -3
- {ynab_cli-0.7.2 → ynab_cli-0.8.0}/src/ynab_cli/adapters/ynab/models/account_response_data.py +5 -3
- {ynab_cli-0.7.2 → ynab_cli-0.8.0}/src/ynab_cli/adapters/ynab/models/account_type.py +2 -2
- {ynab_cli-0.7.2 → ynab_cli-0.8.0}/src/ynab_cli/adapters/ynab/models/accounts_response.py +5 -3
- {ynab_cli-0.7.2 → ynab_cli-0.8.0}/src/ynab_cli/adapters/ynab/models/accounts_response_data.py +6 -4
- {ynab_cli-0.7.2 → ynab_cli-0.8.0}/src/ynab_cli/adapters/ynab/models/bulk_response.py +5 -3
- {ynab_cli-0.7.2 → ynab_cli-0.8.0}/src/ynab_cli/adapters/ynab/models/bulk_response_data.py +5 -3
- {ynab_cli-0.7.2 → ynab_cli-0.8.0}/src/ynab_cli/adapters/ynab/models/bulk_response_data_bulk.py +4 -2
- {ynab_cli-0.7.2 → ynab_cli-0.8.0}/src/ynab_cli/adapters/ynab/models/bulk_transactions.py +6 -4
- {ynab_cli-0.7.2 → ynab_cli-0.8.0}/src/ynab_cli/adapters/ynab/models/categories_response.py +5 -3
- {ynab_cli-0.7.2 → ynab_cli-0.8.0}/src/ynab_cli/adapters/ynab/models/categories_response_data.py +6 -4
- ynab_cli-0.8.0/src/ynab_cli/adapters/ynab/models/category.py +816 -0
- 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
- 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
- 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
- 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
- {ynab_cli-0.7.2 → ynab_cli-0.8.0}/src/ynab_cli/adapters/ynab/models/category_group.py +12 -2
- {ynab_cli-0.7.2 → ynab_cli-0.8.0}/src/ynab_cli/adapters/ynab/models/category_group_with_categories.py +15 -5
- {ynab_cli-0.7.2 → ynab_cli-0.8.0}/src/ynab_cli/adapters/ynab/models/category_response.py +5 -3
- {ynab_cli-0.7.2 → ynab_cli-0.8.0}/src/ynab_cli/adapters/ynab/models/category_response_data.py +5 -3
- {ynab_cli-0.7.2 → ynab_cli-0.8.0}/src/ynab_cli/adapters/ynab/models/currency_format_type_0.py +5 -3
- {ynab_cli-0.7.2 → ynab_cli-0.8.0}/src/ynab_cli/adapters/ynab/models/date_format_type_0.py +7 -6
- {ynab_cli-0.7.2 → ynab_cli-0.8.0}/src/ynab_cli/adapters/ynab/models/error_detail.py +4 -2
- {ynab_cli-0.7.2 → ynab_cli-0.8.0}/src/ynab_cli/adapters/ynab/models/error_response.py +5 -3
- ynab_cli-0.8.0/src/ynab_cli/adapters/ynab/models/existing_category.py +207 -0
- {ynab_cli-0.7.2 → ynab_cli-0.8.0}/src/ynab_cli/adapters/ynab/models/existing_transaction.py +77 -74
- {ynab_cli-0.7.2 → ynab_cli-0.8.0}/src/ynab_cli/adapters/ynab/models/get_transactions_by_account_type.py +2 -2
- {ynab_cli-0.7.2 → ynab_cli-0.8.0}/src/ynab_cli/adapters/ynab/models/get_transactions_by_category_type.py +2 -2
- {ynab_cli-0.7.2 → ynab_cli-0.8.0}/src/ynab_cli/adapters/ynab/models/get_transactions_by_month_type.py +2 -2
- {ynab_cli-0.7.2 → ynab_cli-0.8.0}/src/ynab_cli/adapters/ynab/models/get_transactions_by_payee_type.py +2 -2
- {ynab_cli-0.7.2 → ynab_cli-0.8.0}/src/ynab_cli/adapters/ynab/models/get_transactions_type.py +2 -2
- {ynab_cli-0.7.2 → ynab_cli-0.8.0}/src/ynab_cli/adapters/ynab/models/hybrid_transaction.py +142 -122
- {ynab_cli-0.7.2 → ynab_cli-0.8.0}/src/ynab_cli/adapters/ynab/models/hybrid_transaction_type.py +2 -2
- {ynab_cli-0.7.2 → ynab_cli-0.8.0}/src/ynab_cli/adapters/ynab/models/hybrid_transactions_response.py +5 -3
- {ynab_cli-0.7.2 → ynab_cli-0.8.0}/src/ynab_cli/adapters/ynab/models/hybrid_transactions_response_data.py +8 -6
- {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
- ynab_cli-0.8.0/src/ynab_cli/adapters/ynab/models/money_movement.py +292 -0
- ynab_cli-0.8.0/src/ynab_cli/adapters/ynab/models/money_movement_base.py +274 -0
- ynab_cli-0.8.0/src/ynab_cli/adapters/ynab/models/money_movement_group.py +131 -0
- ynab_cli-0.8.0/src/ynab_cli/adapters/ynab/models/money_movement_groups_response.py +67 -0
- ynab_cli-0.8.0/src/ynab_cli/adapters/ynab/models/money_movement_groups_response_data.py +83 -0
- 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
- ynab_cli-0.8.0/src/ynab_cli/adapters/ynab/models/money_movements_response_data.py +83 -0
- ynab_cli-0.8.0/src/ynab_cli/adapters/ynab/models/month_detail.py +242 -0
- 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
- {ynab_cli-0.7.2 → ynab_cli-0.8.0}/src/ynab_cli/adapters/ynab/models/month_detail_response.py +5 -3
- {ynab_cli-0.7.2 → ynab_cli-0.8.0}/src/ynab_cli/adapters/ynab/models/month_detail_response_data.py +5 -3
- {ynab_cli-0.7.2 → ynab_cli-0.8.0}/src/ynab_cli/adapters/ynab/models/month_summaries_response.py +5 -3
- {ynab_cli-0.7.2 → ynab_cli-0.8.0}/src/ynab_cli/adapters/ynab/models/month_summaries_response_data.py +6 -4
- ynab_cli-0.8.0/src/ynab_cli/adapters/ynab/models/month_summary.py +219 -0
- 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
- ynab_cli-0.8.0/src/ynab_cli/adapters/ynab/models/new_category.py +196 -0
- {ynab_cli-0.7.2 → ynab_cli-0.8.0}/src/ynab_cli/adapters/ynab/models/new_transaction.py +84 -81
- ynab_cli-0.8.0/src/ynab_cli/adapters/ynab/models/patch_category_group_wrapper.py +67 -0
- {ynab_cli-0.7.2 → ynab_cli-0.8.0}/src/ynab_cli/adapters/ynab/models/patch_category_wrapper.py +9 -7
- {ynab_cli-0.7.2 → ynab_cli-0.8.0}/src/ynab_cli/adapters/ynab/models/patch_month_category_wrapper.py +5 -3
- {ynab_cli-0.7.2 → ynab_cli-0.8.0}/src/ynab_cli/adapters/ynab/models/patch_payee_wrapper.py +5 -3
- {ynab_cli-0.7.2 → ynab_cli-0.8.0}/src/ynab_cli/adapters/ynab/models/patch_transactions_wrapper.py +6 -4
- {ynab_cli-0.7.2 → ynab_cli-0.8.0}/src/ynab_cli/adapters/ynab/models/payee.py +9 -8
- {ynab_cli-0.7.2 → ynab_cli-0.8.0}/src/ynab_cli/adapters/ynab/models/payee_location.py +4 -2
- {ynab_cli-0.7.2 → ynab_cli-0.8.0}/src/ynab_cli/adapters/ynab/models/payee_location_response.py +5 -3
- {ynab_cli-0.7.2 → ynab_cli-0.8.0}/src/ynab_cli/adapters/ynab/models/payee_location_response_data.py +5 -3
- {ynab_cli-0.7.2 → ynab_cli-0.8.0}/src/ynab_cli/adapters/ynab/models/payee_locations_response.py +5 -3
- {ynab_cli-0.7.2 → ynab_cli-0.8.0}/src/ynab_cli/adapters/ynab/models/payee_locations_response_data.py +6 -4
- {ynab_cli-0.7.2 → ynab_cli-0.8.0}/src/ynab_cli/adapters/ynab/models/payee_response.py +5 -3
- {ynab_cli-0.7.2 → ynab_cli-0.8.0}/src/ynab_cli/adapters/ynab/models/payee_response_data.py +5 -3
- {ynab_cli-0.7.2 → ynab_cli-0.8.0}/src/ynab_cli/adapters/ynab/models/payees_response.py +5 -3
- {ynab_cli-0.7.2 → ynab_cli-0.8.0}/src/ynab_cli/adapters/ynab/models/payees_response_data.py +6 -4
- 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
- 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
- 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
- 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
- ynab_cli-0.8.0/src/ynab_cli/adapters/ynab/models/plan_settings_response.py +67 -0
- 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
- 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
- ynab_cli-0.8.0/src/ynab_cli/adapters/ynab/models/plan_summary_response.py +67 -0
- ynab_cli-0.8.0/src/ynab_cli/adapters/ynab/models/plan_summary_response_data.py +109 -0
- {ynab_cli-0.7.2 → ynab_cli-0.8.0}/src/ynab_cli/adapters/ynab/models/post_account_wrapper.py +5 -3
- ynab_cli-0.8.0/src/ynab_cli/adapters/ynab/models/post_category_group_wrapper.py +67 -0
- ynab_cli-0.8.0/src/ynab_cli/adapters/ynab/models/post_category_wrapper.py +67 -0
- ynab_cli-0.8.0/src/ynab_cli/adapters/ynab/models/post_payee.py +61 -0
- ynab_cli-0.8.0/src/ynab_cli/adapters/ynab/models/post_payee_wrapper.py +67 -0
- {ynab_cli-0.7.2 → ynab_cli-0.8.0}/src/ynab_cli/adapters/ynab/models/post_scheduled_transaction_wrapper.py +5 -3
- {ynab_cli-0.7.2 → ynab_cli-0.8.0}/src/ynab_cli/adapters/ynab/models/post_transactions_wrapper.py +17 -13
- {ynab_cli-0.7.2 → ynab_cli-0.8.0}/src/ynab_cli/adapters/ynab/models/put_scheduled_transaction_wrapper.py +5 -3
- {ynab_cli-0.7.2 → ynab_cli-0.8.0}/src/ynab_cli/adapters/ynab/models/put_transaction_wrapper.py +5 -3
- {ynab_cli-0.7.2 → ynab_cli-0.8.0}/src/ynab_cli/adapters/ynab/models/save_account.py +8 -6
- ynab_cli-0.8.0/src/ynab_cli/adapters/ynab/models/save_account_type.py +16 -0
- ynab_cli-0.8.0/src/ynab_cli/adapters/ynab/models/save_category.py +207 -0
- ynab_cli-0.8.0/src/ynab_cli/adapters/ynab/models/save_category_goal_frequency.py +13 -0
- ynab_cli-0.8.0/src/ynab_cli/adapters/ynab/models/save_category_group.py +61 -0
- ynab_cli-0.8.0/src/ynab_cli/adapters/ynab/models/save_category_group_response.py +67 -0
- ynab_cli-0.8.0/src/ynab_cli/adapters/ynab/models/save_category_group_response_data.py +75 -0
- {ynab_cli-0.7.2 → ynab_cli-0.8.0}/src/ynab_cli/adapters/ynab/models/save_category_response.py +5 -3
- {ynab_cli-0.7.2 → ynab_cli-0.8.0}/src/ynab_cli/adapters/ynab/models/save_category_response_data.py +5 -3
- {ynab_cli-0.7.2 → ynab_cli-0.8.0}/src/ynab_cli/adapters/ynab/models/save_month_category.py +5 -3
- {ynab_cli-0.7.2 → ynab_cli-0.8.0}/src/ynab_cli/adapters/ynab/models/save_payee.py +6 -4
- {ynab_cli-0.7.2 → ynab_cli-0.8.0}/src/ynab_cli/adapters/ynab/models/save_payee_response.py +5 -3
- {ynab_cli-0.7.2 → ynab_cli-0.8.0}/src/ynab_cli/adapters/ynab/models/save_payee_response_data.py +5 -3
- {ynab_cli-0.7.2 → ynab_cli-0.8.0}/src/ynab_cli/adapters/ynab/models/save_scheduled_transaction.py +50 -51
- {ynab_cli-0.7.2 → ynab_cli-0.8.0}/src/ynab_cli/adapters/ynab/models/save_sub_transaction.py +30 -28
- {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
- {ynab_cli-0.7.2 → ynab_cli-0.8.0}/src/ynab_cli/adapters/ynab/models/save_transaction_with_optional_fields.py +77 -74
- {ynab_cli-0.7.2 → ynab_cli-0.8.0}/src/ynab_cli/adapters/ynab/models/save_transactions_response.py +5 -3
- {ynab_cli-0.7.2 → ynab_cli-0.8.0}/src/ynab_cli/adapters/ynab/models/save_transactions_response_data.py +22 -18
- ynab_cli-0.8.0/src/ynab_cli/adapters/ynab/models/scheduled_sub_transaction.py +258 -0
- 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
- {ynab_cli-0.7.2 → ynab_cli-0.8.0}/src/ynab_cli/adapters/ynab/models/scheduled_transaction_detail.py +85 -66
- {ynab_cli-0.7.2 → ynab_cli-0.8.0}/src/ynab_cli/adapters/ynab/models/scheduled_transaction_frequency.py +2 -2
- {ynab_cli-0.7.2 → ynab_cli-0.8.0}/src/ynab_cli/adapters/ynab/models/scheduled_transaction_response.py +5 -3
- {ynab_cli-0.7.2 → ynab_cli-0.8.0}/src/ynab_cli/adapters/ynab/models/scheduled_transaction_response_data.py +5 -3
- ynab_cli-0.8.0/src/ynab_cli/adapters/ynab/models/scheduled_transaction_summary.py +329 -0
- 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
- 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
- {ynab_cli-0.7.2 → ynab_cli-0.8.0}/src/ynab_cli/adapters/ynab/models/scheduled_transactions_response.py +5 -3
- {ynab_cli-0.7.2 → ynab_cli-0.8.0}/src/ynab_cli/adapters/ynab/models/scheduled_transactions_response_data.py +6 -4
- ynab_cli-0.8.0/src/ynab_cli/adapters/ynab/models/sub_transaction.py +278 -0
- 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
- {ynab_cli-0.7.2 → ynab_cli-0.8.0}/src/ynab_cli/adapters/ynab/models/transaction_cleared_status.py +2 -2
- {ynab_cli-0.7.2 → ynab_cli-0.8.0}/src/ynab_cli/adapters/ynab/models/transaction_detail.py +141 -122
- {ynab_cli-0.7.2 → ynab_cli-0.8.0}/src/ynab_cli/adapters/ynab/models/transaction_flag_color_type_1.py +2 -2
- {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
- {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
- {ynab_cli-0.7.2 → ynab_cli-0.8.0}/src/ynab_cli/adapters/ynab/models/transaction_response.py +5 -3
- {ynab_cli-0.7.2 → ynab_cli-0.8.0}/src/ynab_cli/adapters/ynab/models/transaction_response_data.py +5 -3
- ynab_cli-0.8.0/src/ynab_cli/adapters/ynab/models/transaction_summary.py +519 -0
- 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
- 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
- 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
- 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
- {ynab_cli-0.7.2 → ynab_cli-0.8.0}/src/ynab_cli/adapters/ynab/models/transactions_import_response.py +5 -3
- {ynab_cli-0.7.2 → ynab_cli-0.8.0}/src/ynab_cli/adapters/ynab/models/transactions_import_response_data.py +4 -2
- {ynab_cli-0.7.2 → ynab_cli-0.8.0}/src/ynab_cli/adapters/ynab/models/transactions_response.py +5 -3
- {ynab_cli-0.7.2 → ynab_cli-0.8.0}/src/ynab_cli/adapters/ynab/models/transactions_response_data.py +6 -4
- {ynab_cli-0.7.2 → ynab_cli-0.8.0}/src/ynab_cli/adapters/ynab/models/user.py +4 -2
- {ynab_cli-0.7.2 → ynab_cli-0.8.0}/src/ynab_cli/adapters/ynab/models/user_response.py +5 -3
- {ynab_cli-0.7.2 → ynab_cli-0.8.0}/src/ynab_cli/adapters/ynab/models/user_response_data.py +5 -3
- {ynab_cli-0.7.2 → ynab_cli-0.8.0}/src/ynab_cli/adapters/ynab/types.py +2 -3
- {ynab_cli-0.7.2 → ynab_cli-0.8.0}/src/ynab_cli/adapters/ynab/util.py +2 -2
- {ynab_cli-0.7.2 → ynab_cli-0.8.0}/src/ynab_cli/domain/use_cases/budgets.py +5 -5
- {ynab_cli-0.7.2 → ynab_cli-0.8.0}/src/ynab_cli/domain/use_cases/categories.py +3 -5
- {ynab_cli-0.7.2 → ynab_cli-0.8.0}/src/ynab_cli/domain/use_cases/payees.py +9 -12
- {ynab_cli-0.7.2 → ynab_cli-0.8.0}/src/ynab_cli/domain/use_cases/transactions.py +11 -11
- {ynab_cli-0.7.2 → ynab_cli-0.8.0}/src/ynab_cli/host/textual/widgets/common/command_widget.py +0 -2
- {ynab_cli-0.7.2 → ynab_cli-0.8.0}/src/ynab_cli/host/textual/widgets/transactions/apply_rules.py +1 -1
- {ynab_cli-0.7.2 → ynab_cli-0.8.0}/src/ynab_cli/host/textual/widgets/transactions/tabs.py +4 -6
- {ynab_cli-0.7.2 → ynab_cli-0.8.0}/tests/unit/domain/use_cases/test_budgets.py +7 -7
- {ynab_cli-0.7.2 → ynab_cli-0.8.0}/tests/unit/domain/use_cases/test_categories.py +32 -12
- {ynab_cli-0.7.2 → ynab_cli-0.8.0}/tests/unit/domain/use_cases/test_transactions.py +1 -3
- {ynab_cli-0.7.2 → ynab_cli-0.8.0}/tests/unit/host/click/commands/test_budgets.py +2 -2
- {ynab_cli-0.7.2 → ynab_cli-0.8.0}/tests/unit/host/click/commands/test_categories.py +4 -2
- ynab_cli-0.8.0/uv.lock +2601 -0
- ynab_cli-0.7.2/src/ynab_cli/adapters/ynab/api/transactions/get_transactions_by_month.py +0 -236
- ynab_cli-0.7.2/src/ynab_cli/adapters/ynab/models/budget_summary_response.py +0 -65
- ynab_cli-0.7.2/src/ynab_cli/adapters/ynab/models/budget_summary_response_data.py +0 -91
- ynab_cli-0.7.2/src/ynab_cli/adapters/ynab/models/save_category.py +0 -129
- ynab_cli-0.7.2/uv.lock +0 -2263
- {ynab_cli-0.7.2 → ynab_cli-0.8.0}/.env-sample +0 -0
- {ynab_cli-0.7.2 → ynab_cli-0.8.0}/.github/FUNDING.yml +0 -0
- {ynab_cli-0.7.2 → ynab_cli-0.8.0}/.github/workflows/pr.yml +0 -0
- {ynab_cli-0.7.2 → ynab_cli-0.8.0}/.github/workflows/publish-to-pypi.yml +0 -0
- {ynab_cli-0.7.2 → ynab_cli-0.8.0}/.gitignore +0 -0
- {ynab_cli-0.7.2 → ynab_cli-0.8.0}/.python-version +0 -0
- {ynab_cli-0.7.2 → ynab_cli-0.8.0}/LICENSE.md +0 -0
- {ynab_cli-0.7.2 → ynab_cli-0.8.0}/Makefile +0 -0
- {ynab_cli-0.7.2 → ynab_cli-0.8.0}/README.md +0 -0
- {ynab_cli-0.7.2 → ynab_cli-0.8.0}/docs/index.md +0 -0
- {ynab_cli-0.7.2 → ynab_cli-0.8.0}/docs/transaction_rules.md +0 -0
- {ynab_cli-0.7.2 → ynab_cli-0.8.0}/mkdocs.yml +0 -0
- {ynab_cli-0.7.2 → ynab_cli-0.8.0}/src/ynab_cli/__init__.py +0 -0
- {ynab_cli-0.7.2 → ynab_cli-0.8.0}/src/ynab_cli/adapters/__init__.py +0 -0
- {ynab_cli-0.7.2 → ynab_cli-0.8.0}/src/ynab_cli/adapters/rich/__init__.py +0 -0
- {ynab_cli-0.7.2 → ynab_cli-0.8.0}/src/ynab_cli/adapters/rich/io.py +0 -0
- {ynab_cli-0.7.2 → ynab_cli-0.8.0}/src/ynab_cli/adapters/textual/__init__.py +0 -0
- {ynab_cli-0.7.2 → ynab_cli-0.8.0}/src/ynab_cli/adapters/textual/io.py +0 -0
- {ynab_cli-0.7.2 → ynab_cli-0.8.0}/src/ynab_cli/adapters/ynab/__init__.py +0 -0
- {ynab_cli-0.7.2 → ynab_cli-0.8.0}/src/ynab_cli/adapters/ynab/api/__init__.py +0 -0
- {ynab_cli-0.7.2 → ynab_cli-0.8.0}/src/ynab_cli/adapters/ynab/api/accounts/__init__.py +0 -0
- {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
- {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
- {ynab_cli-0.7.2 → ynab_cli-0.8.0}/src/ynab_cli/adapters/ynab/api/months/__init__.py +0 -0
- {ynab_cli-0.7.2 → ynab_cli-0.8.0}/src/ynab_cli/adapters/ynab/api/payee_locations/__init__.py +0 -0
- {ynab_cli-0.7.2 → ynab_cli-0.8.0}/src/ynab_cli/adapters/ynab/api/payees/__init__.py +0 -0
- {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
- {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
- {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
- {ynab_cli-0.7.2 → ynab_cli-0.8.0}/src/ynab_cli/adapters/ynab/errors.py +0 -0
- {ynab_cli-0.7.2 → ynab_cli-0.8.0}/src/ynab_cli/domain/__init__.py +0 -0
- {ynab_cli-0.7.2 → ynab_cli-0.8.0}/src/ynab_cli/domain/constants.py +0 -0
- {ynab_cli-0.7.2 → ynab_cli-0.8.0}/src/ynab_cli/domain/models/__init__.py +0 -0
- {ynab_cli-0.7.2 → ynab_cli-0.8.0}/src/ynab_cli/domain/models/rules.py +0 -0
- {ynab_cli-0.7.2 → ynab_cli-0.8.0}/src/ynab_cli/domain/ports/__init__.py +0 -0
- {ynab_cli-0.7.2 → ynab_cli-0.8.0}/src/ynab_cli/domain/ports/io.py +0 -0
- {ynab_cli-0.7.2 → ynab_cli-0.8.0}/src/ynab_cli/domain/settings.py +0 -0
- {ynab_cli-0.7.2 → ynab_cli-0.8.0}/src/ynab_cli/domain/use_cases/__init__.py +0 -0
- {ynab_cli-0.7.2 → ynab_cli-0.8.0}/src/ynab_cli/host/__init__.py +0 -0
- {ynab_cli-0.7.2 → ynab_cli-0.8.0}/src/ynab_cli/host/cli.py +0 -0
- {ynab_cli-0.7.2 → ynab_cli-0.8.0}/src/ynab_cli/host/click/__init__.py +0 -0
- {ynab_cli-0.7.2 → ynab_cli-0.8.0}/src/ynab_cli/host/click/cli.py +0 -0
- {ynab_cli-0.7.2 → ynab_cli-0.8.0}/src/ynab_cli/host/click/commands/__init__.py +0 -0
- {ynab_cli-0.7.2 → ynab_cli-0.8.0}/src/ynab_cli/host/click/commands/budgets.py +0 -0
- {ynab_cli-0.7.2 → ynab_cli-0.8.0}/src/ynab_cli/host/click/commands/categories.py +0 -0
- {ynab_cli-0.7.2 → ynab_cli-0.8.0}/src/ynab_cli/host/click/commands/payees.py +0 -0
- {ynab_cli-0.7.2 → ynab_cli-0.8.0}/src/ynab_cli/host/click/commands/rich/__init__.py +0 -0
- {ynab_cli-0.7.2 → ynab_cli-0.8.0}/src/ynab_cli/host/click/commands/rich/progress_table.py +0 -0
- {ynab_cli-0.7.2 → ynab_cli-0.8.0}/src/ynab_cli/host/click/commands/transactions.py +0 -0
- {ynab_cli-0.7.2 → ynab_cli-0.8.0}/src/ynab_cli/host/click/container.py +0 -0
- {ynab_cli-0.7.2 → ynab_cli-0.8.0}/src/ynab_cli/host/constants.py +0 -0
- {ynab_cli-0.7.2 → ynab_cli-0.8.0}/src/ynab_cli/host/container.py +0 -0
- {ynab_cli-0.7.2 → ynab_cli-0.8.0}/src/ynab_cli/host/textual/__init__.py +0 -0
- {ynab_cli-0.7.2 → ynab_cli-0.8.0}/src/ynab_cli/host/textual/app.py +0 -0
- {ynab_cli-0.7.2 → ynab_cli-0.8.0}/src/ynab_cli/host/textual/app.tcss +0 -0
- {ynab_cli-0.7.2 → ynab_cli-0.8.0}/src/ynab_cli/host/textual/cli.py +0 -0
- {ynab_cli-0.7.2 → ynab_cli-0.8.0}/src/ynab_cli/host/textual/container.py +0 -0
- {ynab_cli-0.7.2 → ynab_cli-0.8.0}/src/ynab_cli/host/textual/widgets/__init__.py +0 -0
- {ynab_cli-0.7.2 → ynab_cli-0.8.0}/src/ynab_cli/host/textual/widgets/categories/__init__.py +0 -0
- {ynab_cli-0.7.2 → ynab_cli-0.8.0}/src/ynab_cli/host/textual/widgets/categories/list_all.py +0 -0
- {ynab_cli-0.7.2 → ynab_cli-0.8.0}/src/ynab_cli/host/textual/widgets/categories/list_unused.py +0 -0
- {ynab_cli-0.7.2 → ynab_cli-0.8.0}/src/ynab_cli/host/textual/widgets/categories/tabs.py +0 -0
- {ynab_cli-0.7.2 → ynab_cli-0.8.0}/src/ynab_cli/host/textual/widgets/common/__init__.py +0 -0
- {ynab_cli-0.7.2 → ynab_cli-0.8.0}/src/ynab_cli/host/textual/widgets/common/dialogs/__init__.py +0 -0
- {ynab_cli-0.7.2 → ynab_cli-0.8.0}/src/ynab_cli/host/textual/widgets/common/dialogs/dialog.py +0 -0
- {ynab_cli-0.7.2 → ynab_cli-0.8.0}/src/ynab_cli/host/textual/widgets/common/dialogs/form.py +0 -0
- {ynab_cli-0.7.2 → ynab_cli-0.8.0}/src/ynab_cli/host/textual/widgets/common/dialogs/screen.py +0 -0
- {ynab_cli-0.7.2 → ynab_cli-0.8.0}/src/ynab_cli/host/textual/widgets/payees/__init__.py +0 -0
- {ynab_cli-0.7.2 → ynab_cli-0.8.0}/src/ynab_cli/host/textual/widgets/payees/list_all.py +0 -0
- {ynab_cli-0.7.2 → ynab_cli-0.8.0}/src/ynab_cli/host/textual/widgets/payees/list_duplicates.py +0 -0
- {ynab_cli-0.7.2 → ynab_cli-0.8.0}/src/ynab_cli/host/textual/widgets/payees/list_unused.py +0 -0
- {ynab_cli-0.7.2 → ynab_cli-0.8.0}/src/ynab_cli/host/textual/widgets/payees/normalize_names.py +0 -0
- {ynab_cli-0.7.2 → ynab_cli-0.8.0}/src/ynab_cli/host/textual/widgets/payees/tabs.py +0 -0
- {ynab_cli-0.7.2 → ynab_cli-0.8.0}/src/ynab_cli/host/textual/widgets/tabs.py +0 -0
- {ynab_cli-0.7.2 → ynab_cli-0.8.0}/src/ynab_cli/host/textual/widgets/transactions/__init__.py +0 -0
- {ynab_cli-0.7.2 → ynab_cli-0.8.0}/src/ynab_cli/py.typed +0 -0
- {ynab_cli-0.7.2 → ynab_cli-0.8.0}/tests/__init__.py +0 -0
- {ynab_cli-0.7.2 → ynab_cli-0.8.0}/tests/conftest.py +0 -0
- {ynab_cli-0.7.2 → ynab_cli-0.8.0}/tests/factories/__init__.py +0 -0
- {ynab_cli-0.7.2 → ynab_cli-0.8.0}/tests/factories/ynab.py +0 -0
- {ynab_cli-0.7.2 → ynab_cli-0.8.0}/tests/unit/__init__.py +0 -0
- {ynab_cli-0.7.2 → ynab_cli-0.8.0}/tests/unit/adapters/__init__.py +0 -0
- {ynab_cli-0.7.2 → ynab_cli-0.8.0}/tests/unit/adapters/rich/__init__.py +0 -0
- {ynab_cli-0.7.2 → ynab_cli-0.8.0}/tests/unit/adapters/rich/test_io.py +0 -0
- {ynab_cli-0.7.2 → ynab_cli-0.8.0}/tests/unit/adapters/textual/__init__.py +0 -0
- {ynab_cli-0.7.2 → ynab_cli-0.8.0}/tests/unit/adapters/textual/test_io.py +0 -0
- {ynab_cli-0.7.2 → ynab_cli-0.8.0}/tests/unit/conftest.py +0 -0
- {ynab_cli-0.7.2 → ynab_cli-0.8.0}/tests/unit/domain/__init__.py +0 -0
- {ynab_cli-0.7.2 → ynab_cli-0.8.0}/tests/unit/domain/models/__init__.py +0 -0
- {ynab_cli-0.7.2 → ynab_cli-0.8.0}/tests/unit/domain/models/test_rules.py +0 -0
- {ynab_cli-0.7.2 → ynab_cli-0.8.0}/tests/unit/domain/ports/__init__.py +0 -0
- {ynab_cli-0.7.2 → ynab_cli-0.8.0}/tests/unit/domain/ports/test_io.py +0 -0
- {ynab_cli-0.7.2 → ynab_cli-0.8.0}/tests/unit/domain/use_cases/__init__.py +0 -0
- {ynab_cli-0.7.2 → ynab_cli-0.8.0}/tests/unit/domain/use_cases/test_payees.py +0 -0
- {ynab_cli-0.7.2 → ynab_cli-0.8.0}/tests/unit/host/__init__.py +0 -0
- {ynab_cli-0.7.2 → ynab_cli-0.8.0}/tests/unit/host/click/__init__.py +0 -0
- {ynab_cli-0.7.2 → ynab_cli-0.8.0}/tests/unit/host/click/commands/__init__.py +0 -0
- {ynab_cli-0.7.2 → ynab_cli-0.8.0}/tests/unit/host/click/commands/test_payees.py +0 -0
- {ynab_cli-0.7.2 → ynab_cli-0.8.0}/tests/unit/host/click/commands/test_transactions.py +0 -0
- {ynab_cli-0.7.2 → ynab_cli-0.8.0}/tests/unit/host/click/conftest.py +0 -0
- {ynab_cli-0.7.2 → ynab_cli-0.8.0}/tests/unit/host/conftest.py +0 -0
- {ynab_cli-0.7.2 → ynab_cli-0.8.0}/tests/unit/host/test_cli.py +0 -0
- {ynab_cli-0.7.2 → ynab_cli-0.8.0}/tests/unit/host/textual/__init__.py +0 -0
- {ynab_cli-0.7.2 → ynab_cli-0.8.0}/tests/unit/host/textual/conftest.py +0 -0
- {ynab_cli-0.7.2 → ynab_cli-0.8.0}/tests/unit/host/textual/test_app.py +0 -0
- {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 `
|
|
137
|
+
- Use `httpx2` for HTTP client
|
|
136
138
|
|
|
137
139
|
## File Organization
|
|
138
140
|
|
|
@@ -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.
|
|
1
|
+
Metadata-Version: 2.5
|
|
2
2
|
Name: ynab-cli
|
|
3
|
-
Version: 0.
|
|
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.
|
|
23
|
-
Requires-Dist: attrs~=
|
|
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.
|
|
26
|
-
Requires-Dist:
|
|
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~=
|
|
32
|
-
Requires-Dist: rule-engine~=
|
|
33
|
-
Requires-Dist: textual-fspicker~=0
|
|
34
|
-
Requires-Dist: textual~=
|
|
35
|
-
Requires-Dist: typing-extensions~=4.
|
|
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.
|
|
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.
|
|
37
|
-
"attrs~=
|
|
36
|
+
"anyio~=4.15",
|
|
37
|
+
"attrs~=26.1",
|
|
38
38
|
"click-default-group~=1.2",
|
|
39
|
-
"click~=8.
|
|
40
|
-
"
|
|
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~=
|
|
46
|
-
"rule-engine~=
|
|
47
|
-
"textual-fspicker~=0
|
|
48
|
-
"textual~=
|
|
49
|
-
"typing-extensions~=4.
|
|
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.
|
|
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~=
|
|
72
|
-
"pytest-cov~=7.
|
|
71
|
+
"mypy~=2.3",
|
|
72
|
+
"pytest-cov~=7.1",
|
|
73
73
|
"pytest-mock~=3.15",
|
|
74
|
-
"pytest~=9.
|
|
75
|
-
"ruff~=0.
|
|
74
|
+
"pytest~=9.1",
|
|
75
|
+
"ruff~=0.16",
|
|
76
76
|
"textual-dev~=1.8",
|
|
77
|
-
"trio~=0.
|
|
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
|
|
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
|
-
|
|
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":
|
|
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:
|
|
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:
|
|
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
|
-
|
|
68
|
+
plan_id: str,
|
|
66
69
|
*,
|
|
67
70
|
client: AuthenticatedClient | Client,
|
|
68
71
|
body: PostAccountWrapper,
|
|
69
72
|
) -> Response[AccountResponse | ErrorResponse]:
|
|
70
|
-
"""Create
|
|
73
|
+
"""Create an account
|
|
71
74
|
|
|
72
75
|
Creates a new account
|
|
73
76
|
|
|
74
77
|
Args:
|
|
75
|
-
|
|
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
|
-
|
|
83
|
+
httpx2.TimeoutException: If the request takes longer than Client.timeout.
|
|
81
84
|
|
|
82
85
|
Returns:
|
|
83
|
-
Response[
|
|
86
|
+
Response[AccountResponse | ErrorResponse]
|
|
84
87
|
"""
|
|
85
88
|
|
|
86
89
|
kwargs = _get_kwargs(
|
|
87
|
-
|
|
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
|
-
|
|
102
|
+
plan_id: str,
|
|
100
103
|
*,
|
|
101
104
|
client: AuthenticatedClient | Client,
|
|
102
105
|
body: PostAccountWrapper,
|
|
103
106
|
) -> AccountResponse | ErrorResponse | None:
|
|
104
|
-
"""Create
|
|
107
|
+
"""Create an account
|
|
105
108
|
|
|
106
109
|
Creates a new account
|
|
107
110
|
|
|
108
111
|
Args:
|
|
109
|
-
|
|
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
|
-
|
|
117
|
+
httpx2.TimeoutException: If the request takes longer than Client.timeout.
|
|
115
118
|
|
|
116
119
|
Returns:
|
|
117
|
-
|
|
120
|
+
AccountResponse | ErrorResponse
|
|
118
121
|
"""
|
|
119
122
|
|
|
120
123
|
return sync_detailed(
|
|
121
|
-
|
|
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
|
-
|
|
131
|
+
plan_id: str,
|
|
129
132
|
*,
|
|
130
133
|
client: AuthenticatedClient | Client,
|
|
131
134
|
body: PostAccountWrapper,
|
|
132
135
|
) -> Response[AccountResponse | ErrorResponse]:
|
|
133
|
-
"""Create
|
|
136
|
+
"""Create an account
|
|
134
137
|
|
|
135
138
|
Creates a new account
|
|
136
139
|
|
|
137
140
|
Args:
|
|
138
|
-
|
|
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
|
-
|
|
146
|
+
httpx2.TimeoutException: If the request takes longer than Client.timeout.
|
|
144
147
|
|
|
145
148
|
Returns:
|
|
146
|
-
Response[
|
|
149
|
+
Response[AccountResponse | ErrorResponse]
|
|
147
150
|
"""
|
|
148
151
|
|
|
149
152
|
kwargs = _get_kwargs(
|
|
150
|
-
|
|
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
|
-
|
|
163
|
+
plan_id: str,
|
|
161
164
|
*,
|
|
162
165
|
client: AuthenticatedClient | Client,
|
|
163
166
|
body: PostAccountWrapper,
|
|
164
167
|
) -> AccountResponse | ErrorResponse | None:
|
|
165
|
-
"""Create
|
|
168
|
+
"""Create an account
|
|
166
169
|
|
|
167
170
|
Creates a new account
|
|
168
171
|
|
|
169
172
|
Args:
|
|
170
|
-
|
|
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
|
-
|
|
178
|
+
httpx2.TimeoutException: If the request takes longer than Client.timeout.
|
|
176
179
|
|
|
177
180
|
Returns:
|
|
178
|
-
|
|
181
|
+
AccountResponse | ErrorResponse
|
|
179
182
|
"""
|
|
180
183
|
|
|
181
184
|
return (
|
|
182
185
|
await asyncio_detailed(
|
|
183
|
-
|
|
186
|
+
plan_id=plan_id,
|
|
184
187
|
client=client,
|
|
185
188
|
body=body,
|
|
186
189
|
)
|
{ynab_cli-0.7.2 → ynab_cli-0.8.0}/src/ynab_cli/adapters/ynab/api/accounts/get_account_by_id.py
RENAMED
|
@@ -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
|
|
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
|
-
|
|
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":
|
|
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:
|
|
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
|
-
|
|
39
|
-
|
|
40
|
-
|
|
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:
|
|
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
|
-
|
|
62
|
+
plan_id: str,
|
|
56
63
|
account_id: UUID,
|
|
57
64
|
*,
|
|
58
65
|
client: AuthenticatedClient | Client,
|
|
59
66
|
) -> Response[AccountResponse | ErrorResponse]:
|
|
60
|
-
"""
|
|
67
|
+
"""Get an account
|
|
61
68
|
|
|
62
69
|
Returns a single account
|
|
63
70
|
|
|
64
71
|
Args:
|
|
65
|
-
|
|
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
|
-
|
|
77
|
+
httpx2.TimeoutException: If the request takes longer than Client.timeout.
|
|
71
78
|
|
|
72
79
|
Returns:
|
|
73
|
-
Response[
|
|
80
|
+
Response[AccountResponse | ErrorResponse]
|
|
74
81
|
"""
|
|
75
82
|
|
|
76
83
|
kwargs = _get_kwargs(
|
|
77
|
-
|
|
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
|
-
|
|
96
|
+
plan_id: str,
|
|
90
97
|
account_id: UUID,
|
|
91
98
|
*,
|
|
92
99
|
client: AuthenticatedClient | Client,
|
|
93
100
|
) -> AccountResponse | ErrorResponse | None:
|
|
94
|
-
"""
|
|
101
|
+
"""Get an account
|
|
95
102
|
|
|
96
103
|
Returns a single account
|
|
97
104
|
|
|
98
105
|
Args:
|
|
99
|
-
|
|
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
|
-
|
|
111
|
+
httpx2.TimeoutException: If the request takes longer than Client.timeout.
|
|
105
112
|
|
|
106
113
|
Returns:
|
|
107
|
-
|
|
114
|
+
AccountResponse | ErrorResponse
|
|
108
115
|
"""
|
|
109
116
|
|
|
110
117
|
return sync_detailed(
|
|
111
|
-
|
|
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
|
-
|
|
125
|
+
plan_id: str,
|
|
119
126
|
account_id: UUID,
|
|
120
127
|
*,
|
|
121
128
|
client: AuthenticatedClient | Client,
|
|
122
129
|
) -> Response[AccountResponse | ErrorResponse]:
|
|
123
|
-
"""
|
|
130
|
+
"""Get an account
|
|
124
131
|
|
|
125
132
|
Returns a single account
|
|
126
133
|
|
|
127
134
|
Args:
|
|
128
|
-
|
|
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
|
-
|
|
140
|
+
httpx2.TimeoutException: If the request takes longer than Client.timeout.
|
|
134
141
|
|
|
135
142
|
Returns:
|
|
136
|
-
Response[
|
|
143
|
+
Response[AccountResponse | ErrorResponse]
|
|
137
144
|
"""
|
|
138
145
|
|
|
139
146
|
kwargs = _get_kwargs(
|
|
140
|
-
|
|
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
|
-
|
|
157
|
+
plan_id: str,
|
|
151
158
|
account_id: UUID,
|
|
152
159
|
*,
|
|
153
160
|
client: AuthenticatedClient | Client,
|
|
154
161
|
) -> AccountResponse | ErrorResponse | None:
|
|
155
|
-
"""
|
|
162
|
+
"""Get an account
|
|
156
163
|
|
|
157
164
|
Returns a single account
|
|
158
165
|
|
|
159
166
|
Args:
|
|
160
|
-
|
|
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
|
-
|
|
172
|
+
httpx2.TimeoutException: If the request takes longer than Client.timeout.
|
|
166
173
|
|
|
167
174
|
Returns:
|
|
168
|
-
|
|
175
|
+
AccountResponse | ErrorResponse
|
|
169
176
|
"""
|
|
170
177
|
|
|
171
178
|
return (
|
|
172
179
|
await asyncio_detailed(
|
|
173
|
-
|
|
180
|
+
plan_id=plan_id,
|
|
174
181
|
account_id=account_id,
|
|
175
182
|
client=client,
|
|
176
183
|
)
|