ynab-cli 0.3.0__tar.gz → 0.4.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.3.0 → ynab_cli-0.4.0}/CHANGELOG.md +6 -0
- {ynab_cli-0.3.0 → ynab_cli-0.4.0}/PKG-INFO +1 -1
- {ynab_cli-0.3.0 → ynab_cli-0.4.0}/docs/index.md +15 -14
- {ynab_cli-0.3.0 → ynab_cli-0.4.0}/pyproject.toml +1 -1
- {ynab_cli-0.3.0 → ynab_cli-0.4.0}/src/ynab_cli/adapters/ynab/models/budget_summary_response_data.py +1 -1
- ynab_cli-0.4.0/src/ynab_cli/domain/use_cases/budgets.py +33 -0
- {ynab_cli-0.3.0 → ynab_cli-0.4.0}/src/ynab_cli/host/click/cli.py +5 -6
- ynab_cli-0.4.0/src/ynab_cli/host/click/commands/budgets.py +54 -0
- {ynab_cli-0.3.0 → ynab_cli-0.4.0}/src/ynab_cli/host/click/commands/categories.py +7 -3
- {ynab_cli-0.3.0 → ynab_cli-0.4.0}/src/ynab_cli/host/click/commands/payees.py +8 -4
- {ynab_cli-0.3.0 → ynab_cli-0.4.0}/src/ynab_cli/host/click/commands/transactions.py +6 -2
- {ynab_cli-0.3.0 → ynab_cli-0.4.0}/uv.lock +1 -1
- {ynab_cli-0.3.0 → ynab_cli-0.4.0}/.env-sample +0 -0
- {ynab_cli-0.3.0 → ynab_cli-0.4.0}/.github/FUNDING.yml +0 -0
- {ynab_cli-0.3.0 → ynab_cli-0.4.0}/.github/workflows/pr.yml +0 -0
- {ynab_cli-0.3.0 → ynab_cli-0.4.0}/.github/workflows/publish-to-pypi.yml +0 -0
- {ynab_cli-0.3.0 → ynab_cli-0.4.0}/.gitignore +0 -0
- {ynab_cli-0.3.0 → ynab_cli-0.4.0}/.python-version +0 -0
- {ynab_cli-0.3.0 → ynab_cli-0.4.0}/LICENSE.md +0 -0
- {ynab_cli-0.3.0 → ynab_cli-0.4.0}/Makefile +0 -0
- {ynab_cli-0.3.0 → ynab_cli-0.4.0}/README.md +0 -0
- {ynab_cli-0.3.0 → ynab_cli-0.4.0}/docs/transaction_rules.md +0 -0
- {ynab_cli-0.3.0 → ynab_cli-0.4.0}/mkdocs.yml +0 -0
- {ynab_cli-0.3.0 → ynab_cli-0.4.0}/src/ynab_cli/__init__.py +0 -0
- {ynab_cli-0.3.0 → ynab_cli-0.4.0}/src/ynab_cli/adapters/__init__.py +0 -0
- {ynab_cli-0.3.0 → ynab_cli-0.4.0}/src/ynab_cli/adapters/rich/__init__.py +0 -0
- {ynab_cli-0.3.0 → ynab_cli-0.4.0}/src/ynab_cli/adapters/rich/io.py +0 -0
- {ynab_cli-0.3.0 → ynab_cli-0.4.0}/src/ynab_cli/adapters/textual/__init__.py +0 -0
- {ynab_cli-0.3.0 → ynab_cli-0.4.0}/src/ynab_cli/adapters/textual/io.py +0 -0
- {ynab_cli-0.3.0 → ynab_cli-0.4.0}/src/ynab_cli/adapters/ynab/__init__.py +0 -0
- {ynab_cli-0.3.0 → ynab_cli-0.4.0}/src/ynab_cli/adapters/ynab/api/__init__.py +0 -0
- {ynab_cli-0.3.0 → ynab_cli-0.4.0}/src/ynab_cli/adapters/ynab/api/accounts/__init__.py +0 -0
- {ynab_cli-0.3.0 → ynab_cli-0.4.0}/src/ynab_cli/adapters/ynab/api/accounts/create_account.py +0 -0
- {ynab_cli-0.3.0 → ynab_cli-0.4.0}/src/ynab_cli/adapters/ynab/api/accounts/get_account_by_id.py +0 -0
- {ynab_cli-0.3.0 → ynab_cli-0.4.0}/src/ynab_cli/adapters/ynab/api/accounts/get_accounts.py +0 -0
- {ynab_cli-0.3.0 → ynab_cli-0.4.0}/src/ynab_cli/adapters/ynab/api/budgets/__init__.py +0 -0
- {ynab_cli-0.3.0 → ynab_cli-0.4.0}/src/ynab_cli/adapters/ynab/api/budgets/get_budget_by_id.py +0 -0
- {ynab_cli-0.3.0 → ynab_cli-0.4.0}/src/ynab_cli/adapters/ynab/api/budgets/get_budget_settings_by_id.py +0 -0
- {ynab_cli-0.3.0 → ynab_cli-0.4.0}/src/ynab_cli/adapters/ynab/api/budgets/get_budgets.py +0 -0
- {ynab_cli-0.3.0 → ynab_cli-0.4.0}/src/ynab_cli/adapters/ynab/api/categories/__init__.py +0 -0
- {ynab_cli-0.3.0 → ynab_cli-0.4.0}/src/ynab_cli/adapters/ynab/api/categories/get_categories.py +0 -0
- {ynab_cli-0.3.0 → ynab_cli-0.4.0}/src/ynab_cli/adapters/ynab/api/categories/get_category_by_id.py +0 -0
- {ynab_cli-0.3.0 → ynab_cli-0.4.0}/src/ynab_cli/adapters/ynab/api/categories/get_month_category_by_id.py +0 -0
- {ynab_cli-0.3.0 → ynab_cli-0.4.0}/src/ynab_cli/adapters/ynab/api/categories/update_category.py +0 -0
- {ynab_cli-0.3.0 → ynab_cli-0.4.0}/src/ynab_cli/adapters/ynab/api/categories/update_month_category.py +0 -0
- {ynab_cli-0.3.0 → ynab_cli-0.4.0}/src/ynab_cli/adapters/ynab/api/months/__init__.py +0 -0
- {ynab_cli-0.3.0 → ynab_cli-0.4.0}/src/ynab_cli/adapters/ynab/api/months/get_budget_month.py +0 -0
- {ynab_cli-0.3.0 → ynab_cli-0.4.0}/src/ynab_cli/adapters/ynab/api/months/get_budget_months.py +0 -0
- {ynab_cli-0.3.0 → ynab_cli-0.4.0}/src/ynab_cli/adapters/ynab/api/payee_locations/__init__.py +0 -0
- {ynab_cli-0.3.0 → ynab_cli-0.4.0}/src/ynab_cli/adapters/ynab/api/payee_locations/get_payee_location_by_id.py +0 -0
- {ynab_cli-0.3.0 → ynab_cli-0.4.0}/src/ynab_cli/adapters/ynab/api/payee_locations/get_payee_locations.py +0 -0
- {ynab_cli-0.3.0 → ynab_cli-0.4.0}/src/ynab_cli/adapters/ynab/api/payee_locations/get_payee_locations_by_payee.py +0 -0
- {ynab_cli-0.3.0 → ynab_cli-0.4.0}/src/ynab_cli/adapters/ynab/api/payees/__init__.py +0 -0
- {ynab_cli-0.3.0 → ynab_cli-0.4.0}/src/ynab_cli/adapters/ynab/api/payees/get_payee_by_id.py +0 -0
- {ynab_cli-0.3.0 → ynab_cli-0.4.0}/src/ynab_cli/adapters/ynab/api/payees/get_payees.py +0 -0
- {ynab_cli-0.3.0 → ynab_cli-0.4.0}/src/ynab_cli/adapters/ynab/api/payees/update_payee.py +0 -0
- {ynab_cli-0.3.0 → ynab_cli-0.4.0}/src/ynab_cli/adapters/ynab/api/scheduled_transactions/__init__.py +0 -0
- {ynab_cli-0.3.0 → ynab_cli-0.4.0}/src/ynab_cli/adapters/ynab/api/scheduled_transactions/create_scheduled_transaction.py +0 -0
- {ynab_cli-0.3.0 → ynab_cli-0.4.0}/src/ynab_cli/adapters/ynab/api/scheduled_transactions/delete_scheduled_transaction.py +0 -0
- {ynab_cli-0.3.0 → ynab_cli-0.4.0}/src/ynab_cli/adapters/ynab/api/scheduled_transactions/get_scheduled_transaction_by_id.py +0 -0
- {ynab_cli-0.3.0 → ynab_cli-0.4.0}/src/ynab_cli/adapters/ynab/api/scheduled_transactions/get_scheduled_transactions.py +0 -0
- {ynab_cli-0.3.0 → ynab_cli-0.4.0}/src/ynab_cli/adapters/ynab/api/scheduled_transactions/update_scheduled_transaction.py +0 -0
- {ynab_cli-0.3.0 → ynab_cli-0.4.0}/src/ynab_cli/adapters/ynab/api/transactions/__init__.py +0 -0
- {ynab_cli-0.3.0 → ynab_cli-0.4.0}/src/ynab_cli/adapters/ynab/api/transactions/create_transaction.py +0 -0
- {ynab_cli-0.3.0 → ynab_cli-0.4.0}/src/ynab_cli/adapters/ynab/api/transactions/delete_transaction.py +0 -0
- {ynab_cli-0.3.0 → ynab_cli-0.4.0}/src/ynab_cli/adapters/ynab/api/transactions/get_transaction_by_id.py +0 -0
- {ynab_cli-0.3.0 → ynab_cli-0.4.0}/src/ynab_cli/adapters/ynab/api/transactions/get_transactions.py +0 -0
- {ynab_cli-0.3.0 → ynab_cli-0.4.0}/src/ynab_cli/adapters/ynab/api/transactions/get_transactions_by_account.py +0 -0
- {ynab_cli-0.3.0 → ynab_cli-0.4.0}/src/ynab_cli/adapters/ynab/api/transactions/get_transactions_by_category.py +0 -0
- {ynab_cli-0.3.0 → ynab_cli-0.4.0}/src/ynab_cli/adapters/ynab/api/transactions/get_transactions_by_month.py +0 -0
- {ynab_cli-0.3.0 → ynab_cli-0.4.0}/src/ynab_cli/adapters/ynab/api/transactions/get_transactions_by_payee.py +0 -0
- {ynab_cli-0.3.0 → ynab_cli-0.4.0}/src/ynab_cli/adapters/ynab/api/transactions/import_transactions.py +0 -0
- {ynab_cli-0.3.0 → ynab_cli-0.4.0}/src/ynab_cli/adapters/ynab/api/transactions/update_transaction.py +0 -0
- {ynab_cli-0.3.0 → ynab_cli-0.4.0}/src/ynab_cli/adapters/ynab/api/transactions/update_transactions.py +0 -0
- {ynab_cli-0.3.0 → ynab_cli-0.4.0}/src/ynab_cli/adapters/ynab/api/user/__init__.py +0 -0
- {ynab_cli-0.3.0 → ynab_cli-0.4.0}/src/ynab_cli/adapters/ynab/api/user/get_user.py +0 -0
- {ynab_cli-0.3.0 → ynab_cli-0.4.0}/src/ynab_cli/adapters/ynab/client.py +0 -0
- {ynab_cli-0.3.0 → ynab_cli-0.4.0}/src/ynab_cli/adapters/ynab/errors.py +0 -0
- {ynab_cli-0.3.0 → ynab_cli-0.4.0}/src/ynab_cli/adapters/ynab/models/__init__.py +0 -0
- {ynab_cli-0.3.0 → ynab_cli-0.4.0}/src/ynab_cli/adapters/ynab/models/account.py +0 -0
- {ynab_cli-0.3.0 → ynab_cli-0.4.0}/src/ynab_cli/adapters/ynab/models/account_response.py +0 -0
- {ynab_cli-0.3.0 → ynab_cli-0.4.0}/src/ynab_cli/adapters/ynab/models/account_response_data.py +0 -0
- {ynab_cli-0.3.0 → ynab_cli-0.4.0}/src/ynab_cli/adapters/ynab/models/account_type.py +0 -0
- {ynab_cli-0.3.0 → ynab_cli-0.4.0}/src/ynab_cli/adapters/ynab/models/accounts_response.py +0 -0
- {ynab_cli-0.3.0 → ynab_cli-0.4.0}/src/ynab_cli/adapters/ynab/models/accounts_response_data.py +0 -0
- {ynab_cli-0.3.0 → ynab_cli-0.4.0}/src/ynab_cli/adapters/ynab/models/budget_detail.py +0 -0
- {ynab_cli-0.3.0 → ynab_cli-0.4.0}/src/ynab_cli/adapters/ynab/models/budget_detail_response.py +0 -0
- {ynab_cli-0.3.0 → ynab_cli-0.4.0}/src/ynab_cli/adapters/ynab/models/budget_detail_response_data.py +0 -0
- {ynab_cli-0.3.0 → ynab_cli-0.4.0}/src/ynab_cli/adapters/ynab/models/budget_settings.py +0 -0
- {ynab_cli-0.3.0 → ynab_cli-0.4.0}/src/ynab_cli/adapters/ynab/models/budget_settings_response.py +0 -0
- {ynab_cli-0.3.0 → ynab_cli-0.4.0}/src/ynab_cli/adapters/ynab/models/budget_settings_response_data.py +0 -0
- {ynab_cli-0.3.0 → ynab_cli-0.4.0}/src/ynab_cli/adapters/ynab/models/budget_summary.py +0 -0
- {ynab_cli-0.3.0 → ynab_cli-0.4.0}/src/ynab_cli/adapters/ynab/models/budget_summary_response.py +0 -0
- {ynab_cli-0.3.0 → ynab_cli-0.4.0}/src/ynab_cli/adapters/ynab/models/bulk_response.py +0 -0
- {ynab_cli-0.3.0 → ynab_cli-0.4.0}/src/ynab_cli/adapters/ynab/models/bulk_response_data.py +0 -0
- {ynab_cli-0.3.0 → ynab_cli-0.4.0}/src/ynab_cli/adapters/ynab/models/bulk_response_data_bulk.py +0 -0
- {ynab_cli-0.3.0 → ynab_cli-0.4.0}/src/ynab_cli/adapters/ynab/models/bulk_transactions.py +0 -0
- {ynab_cli-0.3.0 → ynab_cli-0.4.0}/src/ynab_cli/adapters/ynab/models/categories_response.py +0 -0
- {ynab_cli-0.3.0 → ynab_cli-0.4.0}/src/ynab_cli/adapters/ynab/models/categories_response_data.py +0 -0
- {ynab_cli-0.3.0 → ynab_cli-0.4.0}/src/ynab_cli/adapters/ynab/models/category.py +0 -0
- {ynab_cli-0.3.0 → ynab_cli-0.4.0}/src/ynab_cli/adapters/ynab/models/category_goal_type_type_1.py +0 -0
- {ynab_cli-0.3.0 → ynab_cli-0.4.0}/src/ynab_cli/adapters/ynab/models/category_goal_type_type_2_type_1.py +0 -0
- {ynab_cli-0.3.0 → ynab_cli-0.4.0}/src/ynab_cli/adapters/ynab/models/category_goal_type_type_3_type_1.py +0 -0
- {ynab_cli-0.3.0 → ynab_cli-0.4.0}/src/ynab_cli/adapters/ynab/models/category_group.py +0 -0
- {ynab_cli-0.3.0 → ynab_cli-0.4.0}/src/ynab_cli/adapters/ynab/models/category_group_with_categories.py +0 -0
- {ynab_cli-0.3.0 → ynab_cli-0.4.0}/src/ynab_cli/adapters/ynab/models/category_response.py +0 -0
- {ynab_cli-0.3.0 → ynab_cli-0.4.0}/src/ynab_cli/adapters/ynab/models/category_response_data.py +0 -0
- {ynab_cli-0.3.0 → ynab_cli-0.4.0}/src/ynab_cli/adapters/ynab/models/currency_format_type_0.py +0 -0
- {ynab_cli-0.3.0 → ynab_cli-0.4.0}/src/ynab_cli/adapters/ynab/models/date_format_type_0.py +0 -0
- {ynab_cli-0.3.0 → ynab_cli-0.4.0}/src/ynab_cli/adapters/ynab/models/error_detail.py +0 -0
- {ynab_cli-0.3.0 → ynab_cli-0.4.0}/src/ynab_cli/adapters/ynab/models/error_response.py +0 -0
- {ynab_cli-0.3.0 → ynab_cli-0.4.0}/src/ynab_cli/adapters/ynab/models/existing_transaction.py +0 -0
- {ynab_cli-0.3.0 → ynab_cli-0.4.0}/src/ynab_cli/adapters/ynab/models/get_transactions_by_account_type.py +0 -0
- {ynab_cli-0.3.0 → ynab_cli-0.4.0}/src/ynab_cli/adapters/ynab/models/get_transactions_by_category_type.py +0 -0
- {ynab_cli-0.3.0 → ynab_cli-0.4.0}/src/ynab_cli/adapters/ynab/models/get_transactions_by_month_type.py +0 -0
- {ynab_cli-0.3.0 → ynab_cli-0.4.0}/src/ynab_cli/adapters/ynab/models/get_transactions_by_payee_type.py +0 -0
- {ynab_cli-0.3.0 → ynab_cli-0.4.0}/src/ynab_cli/adapters/ynab/models/get_transactions_type.py +0 -0
- {ynab_cli-0.3.0 → ynab_cli-0.4.0}/src/ynab_cli/adapters/ynab/models/hybrid_transaction.py +0 -0
- {ynab_cli-0.3.0 → ynab_cli-0.4.0}/src/ynab_cli/adapters/ynab/models/hybrid_transaction_type.py +0 -0
- {ynab_cli-0.3.0 → ynab_cli-0.4.0}/src/ynab_cli/adapters/ynab/models/hybrid_transactions_response.py +0 -0
- {ynab_cli-0.3.0 → ynab_cli-0.4.0}/src/ynab_cli/adapters/ynab/models/hybrid_transactions_response_data.py +0 -0
- {ynab_cli-0.3.0 → ynab_cli-0.4.0}/src/ynab_cli/adapters/ynab/models/loan_account_periodic_value_type_0.py +0 -0
- {ynab_cli-0.3.0 → ynab_cli-0.4.0}/src/ynab_cli/adapters/ynab/models/month_detail.py +0 -0
- {ynab_cli-0.3.0 → ynab_cli-0.4.0}/src/ynab_cli/adapters/ynab/models/month_detail_response.py +0 -0
- {ynab_cli-0.3.0 → ynab_cli-0.4.0}/src/ynab_cli/adapters/ynab/models/month_detail_response_data.py +0 -0
- {ynab_cli-0.3.0 → ynab_cli-0.4.0}/src/ynab_cli/adapters/ynab/models/month_summaries_response.py +0 -0
- {ynab_cli-0.3.0 → ynab_cli-0.4.0}/src/ynab_cli/adapters/ynab/models/month_summaries_response_data.py +0 -0
- {ynab_cli-0.3.0 → ynab_cli-0.4.0}/src/ynab_cli/adapters/ynab/models/month_summary.py +0 -0
- {ynab_cli-0.3.0 → ynab_cli-0.4.0}/src/ynab_cli/adapters/ynab/models/new_transaction.py +0 -0
- {ynab_cli-0.3.0 → ynab_cli-0.4.0}/src/ynab_cli/adapters/ynab/models/patch_category_wrapper.py +0 -0
- {ynab_cli-0.3.0 → ynab_cli-0.4.0}/src/ynab_cli/adapters/ynab/models/patch_month_category_wrapper.py +0 -0
- {ynab_cli-0.3.0 → ynab_cli-0.4.0}/src/ynab_cli/adapters/ynab/models/patch_payee_wrapper.py +0 -0
- {ynab_cli-0.3.0 → ynab_cli-0.4.0}/src/ynab_cli/adapters/ynab/models/patch_transactions_wrapper.py +0 -0
- {ynab_cli-0.3.0 → ynab_cli-0.4.0}/src/ynab_cli/adapters/ynab/models/payee.py +0 -0
- {ynab_cli-0.3.0 → ynab_cli-0.4.0}/src/ynab_cli/adapters/ynab/models/payee_location.py +0 -0
- {ynab_cli-0.3.0 → ynab_cli-0.4.0}/src/ynab_cli/adapters/ynab/models/payee_location_response.py +0 -0
- {ynab_cli-0.3.0 → ynab_cli-0.4.0}/src/ynab_cli/adapters/ynab/models/payee_location_response_data.py +0 -0
- {ynab_cli-0.3.0 → ynab_cli-0.4.0}/src/ynab_cli/adapters/ynab/models/payee_locations_response.py +0 -0
- {ynab_cli-0.3.0 → ynab_cli-0.4.0}/src/ynab_cli/adapters/ynab/models/payee_locations_response_data.py +0 -0
- {ynab_cli-0.3.0 → ynab_cli-0.4.0}/src/ynab_cli/adapters/ynab/models/payee_response.py +0 -0
- {ynab_cli-0.3.0 → ynab_cli-0.4.0}/src/ynab_cli/adapters/ynab/models/payee_response_data.py +0 -0
- {ynab_cli-0.3.0 → ynab_cli-0.4.0}/src/ynab_cli/adapters/ynab/models/payees_response.py +0 -0
- {ynab_cli-0.3.0 → ynab_cli-0.4.0}/src/ynab_cli/adapters/ynab/models/payees_response_data.py +0 -0
- {ynab_cli-0.3.0 → ynab_cli-0.4.0}/src/ynab_cli/adapters/ynab/models/post_account_wrapper.py +0 -0
- {ynab_cli-0.3.0 → ynab_cli-0.4.0}/src/ynab_cli/adapters/ynab/models/post_scheduled_transaction_wrapper.py +0 -0
- {ynab_cli-0.3.0 → ynab_cli-0.4.0}/src/ynab_cli/adapters/ynab/models/post_transactions_wrapper.py +0 -0
- {ynab_cli-0.3.0 → ynab_cli-0.4.0}/src/ynab_cli/adapters/ynab/models/put_scheduled_transaction_wrapper.py +0 -0
- {ynab_cli-0.3.0 → ynab_cli-0.4.0}/src/ynab_cli/adapters/ynab/models/put_transaction_wrapper.py +0 -0
- {ynab_cli-0.3.0 → ynab_cli-0.4.0}/src/ynab_cli/adapters/ynab/models/save_account.py +0 -0
- {ynab_cli-0.3.0 → ynab_cli-0.4.0}/src/ynab_cli/adapters/ynab/models/save_category.py +0 -0
- {ynab_cli-0.3.0 → ynab_cli-0.4.0}/src/ynab_cli/adapters/ynab/models/save_category_response.py +0 -0
- {ynab_cli-0.3.0 → ynab_cli-0.4.0}/src/ynab_cli/adapters/ynab/models/save_category_response_data.py +0 -0
- {ynab_cli-0.3.0 → ynab_cli-0.4.0}/src/ynab_cli/adapters/ynab/models/save_month_category.py +0 -0
- {ynab_cli-0.3.0 → ynab_cli-0.4.0}/src/ynab_cli/adapters/ynab/models/save_payee.py +0 -0
- {ynab_cli-0.3.0 → ynab_cli-0.4.0}/src/ynab_cli/adapters/ynab/models/save_payee_response.py +0 -0
- {ynab_cli-0.3.0 → ynab_cli-0.4.0}/src/ynab_cli/adapters/ynab/models/save_payee_response_data.py +0 -0
- {ynab_cli-0.3.0 → ynab_cli-0.4.0}/src/ynab_cli/adapters/ynab/models/save_scheduled_transaction.py +0 -0
- {ynab_cli-0.3.0 → ynab_cli-0.4.0}/src/ynab_cli/adapters/ynab/models/save_sub_transaction.py +0 -0
- {ynab_cli-0.3.0 → ynab_cli-0.4.0}/src/ynab_cli/adapters/ynab/models/save_transaction_with_id_or_import_id.py +0 -0
- {ynab_cli-0.3.0 → ynab_cli-0.4.0}/src/ynab_cli/adapters/ynab/models/save_transaction_with_optional_fields.py +0 -0
- {ynab_cli-0.3.0 → ynab_cli-0.4.0}/src/ynab_cli/adapters/ynab/models/save_transactions_response.py +0 -0
- {ynab_cli-0.3.0 → ynab_cli-0.4.0}/src/ynab_cli/adapters/ynab/models/save_transactions_response_data.py +0 -0
- {ynab_cli-0.3.0 → ynab_cli-0.4.0}/src/ynab_cli/adapters/ynab/models/scheduled_sub_transaction.py +0 -0
- {ynab_cli-0.3.0 → ynab_cli-0.4.0}/src/ynab_cli/adapters/ynab/models/scheduled_transaction_detail.py +0 -0
- {ynab_cli-0.3.0 → ynab_cli-0.4.0}/src/ynab_cli/adapters/ynab/models/scheduled_transaction_frequency.py +0 -0
- {ynab_cli-0.3.0 → ynab_cli-0.4.0}/src/ynab_cli/adapters/ynab/models/scheduled_transaction_response.py +0 -0
- {ynab_cli-0.3.0 → ynab_cli-0.4.0}/src/ynab_cli/adapters/ynab/models/scheduled_transaction_response_data.py +0 -0
- {ynab_cli-0.3.0 → ynab_cli-0.4.0}/src/ynab_cli/adapters/ynab/models/scheduled_transaction_summary.py +0 -0
- {ynab_cli-0.3.0 → ynab_cli-0.4.0}/src/ynab_cli/adapters/ynab/models/scheduled_transaction_summary_frequency.py +0 -0
- {ynab_cli-0.3.0 → ynab_cli-0.4.0}/src/ynab_cli/adapters/ynab/models/scheduled_transactions_response.py +0 -0
- {ynab_cli-0.3.0 → ynab_cli-0.4.0}/src/ynab_cli/adapters/ynab/models/scheduled_transactions_response_data.py +0 -0
- {ynab_cli-0.3.0 → ynab_cli-0.4.0}/src/ynab_cli/adapters/ynab/models/sub_transaction.py +0 -0
- {ynab_cli-0.3.0 → ynab_cli-0.4.0}/src/ynab_cli/adapters/ynab/models/transaction_cleared_status.py +0 -0
- {ynab_cli-0.3.0 → ynab_cli-0.4.0}/src/ynab_cli/adapters/ynab/models/transaction_detail.py +0 -0
- {ynab_cli-0.3.0 → ynab_cli-0.4.0}/src/ynab_cli/adapters/ynab/models/transaction_flag_color_type_1.py +0 -0
- {ynab_cli-0.3.0 → ynab_cli-0.4.0}/src/ynab_cli/adapters/ynab/models/transaction_flag_color_type_2_type_1.py +0 -0
- {ynab_cli-0.3.0 → ynab_cli-0.4.0}/src/ynab_cli/adapters/ynab/models/transaction_flag_color_type_3_type_1.py +0 -0
- {ynab_cli-0.3.0 → ynab_cli-0.4.0}/src/ynab_cli/adapters/ynab/models/transaction_response.py +0 -0
- {ynab_cli-0.3.0 → ynab_cli-0.4.0}/src/ynab_cli/adapters/ynab/models/transaction_response_data.py +0 -0
- {ynab_cli-0.3.0 → ynab_cli-0.4.0}/src/ynab_cli/adapters/ynab/models/transaction_summary.py +0 -0
- {ynab_cli-0.3.0 → ynab_cli-0.4.0}/src/ynab_cli/adapters/ynab/models/transaction_summary_debt_transaction_type_type_1.py +0 -0
- {ynab_cli-0.3.0 → ynab_cli-0.4.0}/src/ynab_cli/adapters/ynab/models/transaction_summary_debt_transaction_type_type_2_type_1.py +0 -0
- {ynab_cli-0.3.0 → ynab_cli-0.4.0}/src/ynab_cli/adapters/ynab/models/transaction_summary_debt_transaction_type_type_3_type_1.py +0 -0
- {ynab_cli-0.3.0 → ynab_cli-0.4.0}/src/ynab_cli/adapters/ynab/models/transactions_import_response.py +0 -0
- {ynab_cli-0.3.0 → ynab_cli-0.4.0}/src/ynab_cli/adapters/ynab/models/transactions_import_response_data.py +0 -0
- {ynab_cli-0.3.0 → ynab_cli-0.4.0}/src/ynab_cli/adapters/ynab/models/transactions_response.py +0 -0
- {ynab_cli-0.3.0 → ynab_cli-0.4.0}/src/ynab_cli/adapters/ynab/models/transactions_response_data.py +0 -0
- {ynab_cli-0.3.0 → ynab_cli-0.4.0}/src/ynab_cli/adapters/ynab/models/user.py +0 -0
- {ynab_cli-0.3.0 → ynab_cli-0.4.0}/src/ynab_cli/adapters/ynab/models/user_response.py +0 -0
- {ynab_cli-0.3.0 → ynab_cli-0.4.0}/src/ynab_cli/adapters/ynab/models/user_response_data.py +0 -0
- {ynab_cli-0.3.0 → ynab_cli-0.4.0}/src/ynab_cli/adapters/ynab/types.py +0 -0
- {ynab_cli-0.3.0 → ynab_cli-0.4.0}/src/ynab_cli/adapters/ynab/util.py +0 -0
- {ynab_cli-0.3.0 → ynab_cli-0.4.0}/src/ynab_cli/domain/__init__.py +0 -0
- {ynab_cli-0.3.0 → ynab_cli-0.4.0}/src/ynab_cli/domain/constants.py +0 -0
- {ynab_cli-0.3.0 → ynab_cli-0.4.0}/src/ynab_cli/domain/models/__init__.py +0 -0
- {ynab_cli-0.3.0 → ynab_cli-0.4.0}/src/ynab_cli/domain/models/rules.py +0 -0
- {ynab_cli-0.3.0 → ynab_cli-0.4.0}/src/ynab_cli/domain/ports/__init__.py +0 -0
- {ynab_cli-0.3.0 → ynab_cli-0.4.0}/src/ynab_cli/domain/ports/io.py +0 -0
- {ynab_cli-0.3.0 → ynab_cli-0.4.0}/src/ynab_cli/domain/settings.py +0 -0
- {ynab_cli-0.3.0 → ynab_cli-0.4.0}/src/ynab_cli/domain/use_cases/__init__.py +0 -0
- {ynab_cli-0.3.0 → ynab_cli-0.4.0}/src/ynab_cli/domain/use_cases/categories.py +0 -0
- {ynab_cli-0.3.0 → ynab_cli-0.4.0}/src/ynab_cli/domain/use_cases/payees.py +0 -0
- {ynab_cli-0.3.0 → ynab_cli-0.4.0}/src/ynab_cli/domain/use_cases/transactions.py +0 -0
- {ynab_cli-0.3.0 → ynab_cli-0.4.0}/src/ynab_cli/host/__init__.py +0 -0
- {ynab_cli-0.3.0 → ynab_cli-0.4.0}/src/ynab_cli/host/cli.py +0 -0
- {ynab_cli-0.3.0 → ynab_cli-0.4.0}/src/ynab_cli/host/click/__init__.py +0 -0
- {ynab_cli-0.3.0 → ynab_cli-0.4.0}/src/ynab_cli/host/click/commands/__init__.py +0 -0
- {ynab_cli-0.3.0 → ynab_cli-0.4.0}/src/ynab_cli/host/click/commands/rich/__init__.py +0 -0
- {ynab_cli-0.3.0 → ynab_cli-0.4.0}/src/ynab_cli/host/click/commands/rich/progress_table.py +0 -0
- {ynab_cli-0.3.0 → ynab_cli-0.4.0}/src/ynab_cli/host/constants.py +0 -0
- {ynab_cli-0.3.0 → ynab_cli-0.4.0}/src/ynab_cli/host/textual/__init__.py +0 -0
- {ynab_cli-0.3.0 → ynab_cli-0.4.0}/src/ynab_cli/host/textual/app.py +0 -0
- {ynab_cli-0.3.0 → ynab_cli-0.4.0}/src/ynab_cli/host/textual/app.tcss +0 -0
- {ynab_cli-0.3.0 → ynab_cli-0.4.0}/src/ynab_cli/host/textual/cli.py +0 -0
- {ynab_cli-0.3.0 → ynab_cli-0.4.0}/src/ynab_cli/host/textual/widgets/__init__.py +0 -0
- {ynab_cli-0.3.0 → ynab_cli-0.4.0}/src/ynab_cli/host/textual/widgets/categories.py +0 -0
- {ynab_cli-0.3.0 → ynab_cli-0.4.0}/src/ynab_cli/host/textual/widgets/payees.py +0 -0
- {ynab_cli-0.3.0 → ynab_cli-0.4.0}/src/ynab_cli/host/textual/widgets/transactions.py +0 -0
- {ynab_cli-0.3.0 → ynab_cli-0.4.0}/src/ynab_cli/py.typed +0 -0
- {ynab_cli-0.3.0 → ynab_cli-0.4.0}/tests/__init__.py +0 -0
- {ynab_cli-0.3.0 → ynab_cli-0.4.0}/tests/factories/__init__.py +0 -0
- {ynab_cli-0.3.0 → ynab_cli-0.4.0}/tests/factories/ynab.py +0 -0
- {ynab_cli-0.3.0 → ynab_cli-0.4.0}/tests/unit/__init__.py +0 -0
- {ynab_cli-0.3.0 → ynab_cli-0.4.0}/tests/unit/conftest.py +0 -0
- {ynab_cli-0.3.0 → ynab_cli-0.4.0}/tests/unit/domain/__init__.py +0 -0
- {ynab_cli-0.3.0 → ynab_cli-0.4.0}/tests/unit/domain/use_cases/__init__.py +0 -0
- {ynab_cli-0.3.0 → ynab_cli-0.4.0}/tests/unit/domain/use_cases/test_categories.py +0 -0
- {ynab_cli-0.3.0 → ynab_cli-0.4.0}/tests/unit/domain/use_cases/test_payees.py +0 -0
- {ynab_cli-0.3.0 → ynab_cli-0.4.0}/tests/unit/domain/use_cases/test_transactions.py +0 -0
|
@@ -4,33 +4,34 @@ This is a simple cli/tui application written in python to help manage your YNAB
|
|
|
4
4
|
|
|
5
5
|
## Requirements
|
|
6
6
|
|
|
7
|
-
-
|
|
8
|
-
- [
|
|
9
|
-
- Your [YNAB developer access token](https://api.ynab.com/#personal-access-tokens)
|
|
10
|
-
- Your YNAB budget ID. You can get this from your browser URL while you have your budget open. For example, if the URL looks like `https://app.ynab.com/aaaaaaaa-1111-bbbb-2222-ddddddd` then the budget ID is `aaaaaaaa-1111-bbbb-2222-ddddddd`.
|
|
7
|
+
- [uv](https://docs.astral.sh/uv/getting-started/installation/) which allows you to easily run python applications.
|
|
8
|
+
- Your [YNAB developer access token](https://api.ynab.com/#personal-access-tokens).
|
|
11
9
|
|
|
12
|
-
|
|
10
|
+
!!! warning
|
|
11
|
+
Developer access tokens are rate limited to 200 requests per hour. Some of the commands below will provide you an opportunity to enter a new developer access token when the current one has exceeded it's limit. It also seems like there is a limit to how many developer access tokens you can create from the developer settings UI.
|
|
12
|
+
|
|
13
|
+
- Your YNAB budget ID. Once you have `uv` and your `access token` you can list your budgets by running:
|
|
13
14
|
```sh
|
|
14
|
-
$
|
|
15
|
-
$ cd ynab-cli
|
|
16
|
-
$ uv sync
|
|
15
|
+
$ uvx ynab-cli run --access-token your_access_token budgets list-all
|
|
17
16
|
```
|
|
18
17
|
|
|
19
18
|
## Usage
|
|
20
19
|
|
|
21
|
-
!!! warning
|
|
22
|
-
Developer access tokens are rate limited to 200 requests per hour. Some of the commands below will provide you an opportunity to enter a new developer access token when the current one has exceeded it's limit. It also seems like there is a limit to how many developer access tokens you can create from the developer settings UI.
|
|
23
|
-
|
|
24
20
|
!!! note
|
|
25
|
-
YNAB CLI supports environment variables and dotenv (`.env`) files for specifying options. See the `.env-sample` file for some examples.
|
|
21
|
+
YNAB CLI supports environment variables and dotenv (`.env`) files for specifying options. See the `.env-sample` file for some examples. YNAB CLI looks for the `.env` file in current working directory. If you create a `.env` file with the following information you won't need to keep entering it on the command line.
|
|
22
|
+
|
|
23
|
+
``` title=".env"
|
|
24
|
+
YNAB_CLI_ACCESS_TOKEN=your_access_token
|
|
25
|
+
YNAB_CLI_BUDGET_ID=your_budget_id
|
|
26
|
+
```
|
|
26
27
|
|
|
27
28
|
To run the text ui, execute the following command:
|
|
28
29
|
|
|
29
30
|
```sh
|
|
30
|
-
$
|
|
31
|
+
$ uvx ynab-cli
|
|
31
32
|
```
|
|
32
33
|
|
|
33
|
-
Full command line usage is below.
|
|
34
|
+
The individual CLI commands can be similarily run using `uvx`. Full command line usage is below.
|
|
34
35
|
|
|
35
36
|
::: mkdocs-click
|
|
36
37
|
:module: ynab_cli.host.cli
|
{ynab_cli-0.3.0 → ynab_cli-0.4.0}/src/ynab_cli/adapters/ynab/models/budget_summary_response_data.py
RENAMED
|
@@ -61,7 +61,7 @@ class BudgetSummaryResponseData:
|
|
|
61
61
|
|
|
62
62
|
_default_budget = d.pop("default_budget", UNSET)
|
|
63
63
|
default_budget: Unset | BudgetSummary
|
|
64
|
-
if isinstance(_default_budget, Unset):
|
|
64
|
+
if not _default_budget or isinstance(_default_budget, Unset):
|
|
65
65
|
default_budget = UNSET
|
|
66
66
|
else:
|
|
67
67
|
default_budget = BudgetSummary.from_dict(_default_budget)
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
from collections.abc import AsyncIterator
|
|
2
|
+
from typing import TypedDict
|
|
3
|
+
|
|
4
|
+
from ynab_cli.adapters import ynab
|
|
5
|
+
from ynab_cli.adapters.ynab import models, util
|
|
6
|
+
from ynab_cli.adapters.ynab.api.budgets import get_budgets
|
|
7
|
+
from ynab_cli.domain import ports
|
|
8
|
+
from ynab_cli.domain.constants import YNAB_API_URL
|
|
9
|
+
from ynab_cli.domain.settings import Settings
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
class ListAllParams(TypedDict):
|
|
13
|
+
pass
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
async def list_all(settings: Settings, io: ports.IO, params: ListAllParams) -> AsyncIterator[models.BudgetSummary]:
|
|
17
|
+
async with ynab.AuthenticatedClient(base_url=YNAB_API_URL, token=settings.ynab.access_token) as client:
|
|
18
|
+
try:
|
|
19
|
+
budgets = (
|
|
20
|
+
await util.get_asyncio_detailed(io, get_budgets.asyncio_detailed, include_accounts=True, client=client)
|
|
21
|
+
).data.budgets
|
|
22
|
+
budgets.sort(key=lambda b: b.name)
|
|
23
|
+
|
|
24
|
+
progress_total = len(budgets)
|
|
25
|
+
for budget in budgets:
|
|
26
|
+
await io.progress.update(total=progress_total, advance=1)
|
|
27
|
+
yield budget
|
|
28
|
+
|
|
29
|
+
except util.ApiError as e:
|
|
30
|
+
if e.status_code == 429:
|
|
31
|
+
await io.print("API rate limit exceeded. Try again later, or get a new access token.")
|
|
32
|
+
else:
|
|
33
|
+
await io.print(f"Exception when calling YNAB: {e}\n")
|
|
@@ -3,8 +3,8 @@ import logging
|
|
|
3
3
|
import click
|
|
4
4
|
from rich.logging import RichHandler
|
|
5
5
|
|
|
6
|
-
from ynab_cli.domain.settings import Settings
|
|
7
|
-
from ynab_cli.host.click.commands import categories, payees, transactions
|
|
6
|
+
from ynab_cli.domain.settings import Settings
|
|
7
|
+
from ynab_cli.host.click.commands import budgets, categories, payees, transactions
|
|
8
8
|
from ynab_cli.host.constants import CONTEXT_KEY_SETTINGS, ENV_PREFIX
|
|
9
9
|
|
|
10
10
|
|
|
@@ -17,18 +17,16 @@ from ynab_cli.host.constants import CONTEXT_KEY_SETTINGS, ENV_PREFIX
|
|
|
17
17
|
show_envvar=True,
|
|
18
18
|
help="YNAB API access token.",
|
|
19
19
|
)
|
|
20
|
-
@click.option("--budget-id", prompt=True, envvar=f"{ENV_PREFIX}_BUDGET_ID", show_envvar=True, help="YNAB budget ID.")
|
|
21
20
|
@click.pass_context
|
|
22
21
|
def run(
|
|
23
22
|
ctx: click.Context,
|
|
24
23
|
access_token: str,
|
|
25
|
-
budget_id: str,
|
|
26
24
|
) -> None:
|
|
27
25
|
"""Main entrypoint for YNAB CLI commands."""
|
|
28
26
|
|
|
29
27
|
ctx.ensure_object(dict)
|
|
30
28
|
settings: Settings = ctx.obj.get(CONTEXT_KEY_SETTINGS, Settings())
|
|
31
|
-
settings.ynab =
|
|
29
|
+
settings.ynab.access_token = access_token
|
|
32
30
|
ctx.obj[CONTEXT_KEY_SETTINGS] = settings
|
|
33
31
|
|
|
34
32
|
logging.basicConfig(
|
|
@@ -39,6 +37,7 @@ def run(
|
|
|
39
37
|
)
|
|
40
38
|
|
|
41
39
|
|
|
42
|
-
run.add_command(
|
|
40
|
+
run.add_command(budgets.budgets)
|
|
43
41
|
run.add_command(categories.categories)
|
|
42
|
+
run.add_command(payees.payees)
|
|
44
43
|
run.add_command(transactions.transactions)
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
import asyncio
|
|
2
|
+
|
|
3
|
+
import click
|
|
4
|
+
from rich.table import Table
|
|
5
|
+
|
|
6
|
+
from ynab_cli.adapters.rich import io
|
|
7
|
+
from ynab_cli.domain.settings import Settings
|
|
8
|
+
from ynab_cli.domain.use_cases import budgets as use_cases
|
|
9
|
+
from ynab_cli.host.click.commands.rich.progress_table import ProgressTable
|
|
10
|
+
from ynab_cli.host.constants import CONTEXT_KEY_SETTINGS
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
async def _list_all(settings: Settings) -> None:
|
|
14
|
+
params: use_cases.ListAllParams = {}
|
|
15
|
+
|
|
16
|
+
table = Table(title="All Budgets")
|
|
17
|
+
table.add_column("Budget ID")
|
|
18
|
+
table.add_column("Budget Name")
|
|
19
|
+
|
|
20
|
+
console = None
|
|
21
|
+
with ProgressTable(table) as progress:
|
|
22
|
+
console = progress.console
|
|
23
|
+
|
|
24
|
+
task_id = progress.add_task("Loading all budgets...")
|
|
25
|
+
async for budget in use_cases.list_all(settings, io.RichIO((progress, task_id)), params):
|
|
26
|
+
table.add_row(
|
|
27
|
+
str(budget.id),
|
|
28
|
+
str(budget.name),
|
|
29
|
+
)
|
|
30
|
+
|
|
31
|
+
if console:
|
|
32
|
+
console.print(table)
|
|
33
|
+
|
|
34
|
+
|
|
35
|
+
@click.command()
|
|
36
|
+
@click.pass_context
|
|
37
|
+
def list_all(ctx: click.Context) -> None:
|
|
38
|
+
"""List all budgets in YNAB."""
|
|
39
|
+
|
|
40
|
+
ctx.ensure_object(dict)
|
|
41
|
+
asyncio.run(_list_all(ctx.obj.get(CONTEXT_KEY_SETTINGS, Settings())))
|
|
42
|
+
|
|
43
|
+
|
|
44
|
+
@click.group()
|
|
45
|
+
@click.pass_context
|
|
46
|
+
def budgets(ctx: click.Context) -> None:
|
|
47
|
+
"""Manage YNAB budgets in YNAB."""
|
|
48
|
+
|
|
49
|
+
ctx.ensure_object(dict)
|
|
50
|
+
settings: Settings = ctx.obj.get(CONTEXT_KEY_SETTINGS, Settings())
|
|
51
|
+
ctx.obj[CONTEXT_KEY_SETTINGS] = settings
|
|
52
|
+
|
|
53
|
+
|
|
54
|
+
budgets.add_command(list_all)
|
|
@@ -7,7 +7,7 @@ from ynab_cli.adapters.rich import io
|
|
|
7
7
|
from ynab_cli.domain.settings import Settings
|
|
8
8
|
from ynab_cli.domain.use_cases import categories as use_cases
|
|
9
9
|
from ynab_cli.host.click.commands.rich.progress_table import ProgressTable
|
|
10
|
-
from ynab_cli.host.constants import CONTEXT_KEY_SETTINGS
|
|
10
|
+
from ynab_cli.host.constants import CONTEXT_KEY_SETTINGS, ENV_PREFIX
|
|
11
11
|
|
|
12
12
|
|
|
13
13
|
async def _list_unused(settings: Settings) -> None:
|
|
@@ -81,12 +81,16 @@ def list_all(ctx: click.Context) -> None:
|
|
|
81
81
|
|
|
82
82
|
|
|
83
83
|
@click.group()
|
|
84
|
+
@click.option("--budget-id", prompt=True, envvar=f"{ENV_PREFIX}_BUDGET_ID", show_envvar=True, help="YNAB budget ID.")
|
|
84
85
|
@click.pass_context
|
|
85
|
-
def categories(ctx: click.Context) -> None:
|
|
86
|
+
def categories(ctx: click.Context, budget_id: str) -> None:
|
|
86
87
|
"""Manage YNAB categories in the YNAB budget."""
|
|
87
88
|
|
|
88
89
|
ctx.ensure_object(dict)
|
|
90
|
+
settings: Settings = ctx.obj.get(CONTEXT_KEY_SETTINGS, Settings())
|
|
91
|
+
settings.ynab.budget_id = budget_id
|
|
92
|
+
ctx.obj[CONTEXT_KEY_SETTINGS] = settings
|
|
89
93
|
|
|
90
94
|
|
|
91
|
-
categories.add_command(list_unused)
|
|
92
95
|
categories.add_command(list_all)
|
|
96
|
+
categories.add_command(list_unused)
|
|
@@ -7,7 +7,7 @@ from ynab_cli.adapters.rich import io
|
|
|
7
7
|
from ynab_cli.domain.settings import Settings
|
|
8
8
|
from ynab_cli.domain.use_cases import payees as use_cases
|
|
9
9
|
from ynab_cli.host.click.commands.rich.progress_table import ProgressTable
|
|
10
|
-
from ynab_cli.host.constants import CONTEXT_KEY_SETTINGS
|
|
10
|
+
from ynab_cli.host.constants import CONTEXT_KEY_SETTINGS, ENV_PREFIX
|
|
11
11
|
|
|
12
12
|
|
|
13
13
|
async def _normalize_names(settings: Settings) -> None:
|
|
@@ -144,14 +144,18 @@ def list_all(ctx: click.Context) -> None:
|
|
|
144
144
|
|
|
145
145
|
|
|
146
146
|
@click.group()
|
|
147
|
+
@click.option("--budget-id", prompt=True, envvar=f"{ENV_PREFIX}_BUDGET_ID", show_envvar=True, help="YNAB budget ID.")
|
|
147
148
|
@click.pass_context
|
|
148
|
-
def payees(ctx: click.Context) -> None:
|
|
149
|
+
def payees(ctx: click.Context, budget_id: str) -> None:
|
|
149
150
|
"""Manage payees in the YNAB budget."""
|
|
150
151
|
|
|
151
152
|
ctx.ensure_object(dict)
|
|
153
|
+
settings: Settings = ctx.obj.get(CONTEXT_KEY_SETTINGS, Settings())
|
|
154
|
+
settings.ynab.budget_id = budget_id
|
|
155
|
+
ctx.obj[CONTEXT_KEY_SETTINGS] = settings
|
|
152
156
|
|
|
153
157
|
|
|
154
|
-
payees.add_command(
|
|
158
|
+
payees.add_command(list_all)
|
|
155
159
|
payees.add_command(list_duplicates)
|
|
156
160
|
payees.add_command(list_unused)
|
|
157
|
-
payees.add_command(
|
|
161
|
+
payees.add_command(normalize_names)
|
|
@@ -10,7 +10,7 @@ from ynab_cli.domain.models import rules
|
|
|
10
10
|
from ynab_cli.domain.settings import Settings
|
|
11
11
|
from ynab_cli.domain.use_cases import transactions as use_cases
|
|
12
12
|
from ynab_cli.host.click.commands.rich.progress_table import ProgressTable
|
|
13
|
-
from ynab_cli.host.constants import CONTEXT_KEY_SETTINGS
|
|
13
|
+
from ynab_cli.host.constants import CONTEXT_KEY_SETTINGS, ENV_PREFIX
|
|
14
14
|
|
|
15
15
|
|
|
16
16
|
async def _apply_rules(settings: Settings, transaction_rules: rules.TransactionRules) -> None:
|
|
@@ -66,11 +66,15 @@ def apply_rules(ctx: click.Context, rules_file: IO[Any]) -> None:
|
|
|
66
66
|
|
|
67
67
|
|
|
68
68
|
@click.group()
|
|
69
|
+
@click.option("--budget-id", prompt=True, envvar=f"{ENV_PREFIX}_BUDGET_ID", show_envvar=True, help="YNAB budget ID.")
|
|
69
70
|
@click.pass_context
|
|
70
|
-
def transactions(ctx: click.Context) -> None:
|
|
71
|
+
def transactions(ctx: click.Context, budget_id: str) -> None:
|
|
71
72
|
"""Manage transactions in the YNAB budget."""
|
|
72
73
|
|
|
73
74
|
ctx.ensure_object(dict)
|
|
75
|
+
settings: Settings = ctx.obj.get(CONTEXT_KEY_SETTINGS, Settings())
|
|
76
|
+
settings.ynab.budget_id = budget_id
|
|
77
|
+
ctx.obj[CONTEXT_KEY_SETTINGS] = settings
|
|
74
78
|
|
|
75
79
|
|
|
76
80
|
transactions.add_command(apply_rules)
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{ynab_cli-0.3.0 → ynab_cli-0.4.0}/src/ynab_cli/adapters/ynab/api/accounts/get_account_by_id.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{ynab_cli-0.3.0 → ynab_cli-0.4.0}/src/ynab_cli/adapters/ynab/api/budgets/get_budget_by_id.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{ynab_cli-0.3.0 → ynab_cli-0.4.0}/src/ynab_cli/adapters/ynab/api/categories/get_categories.py
RENAMED
|
File without changes
|
{ynab_cli-0.3.0 → ynab_cli-0.4.0}/src/ynab_cli/adapters/ynab/api/categories/get_category_by_id.py
RENAMED
|
File without changes
|
|
File without changes
|
{ynab_cli-0.3.0 → ynab_cli-0.4.0}/src/ynab_cli/adapters/ynab/api/categories/update_category.py
RENAMED
|
File without changes
|
{ynab_cli-0.3.0 → ynab_cli-0.4.0}/src/ynab_cli/adapters/ynab/api/categories/update_month_category.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{ynab_cli-0.3.0 → ynab_cli-0.4.0}/src/ynab_cli/adapters/ynab/api/months/get_budget_months.py
RENAMED
|
File without changes
|
{ynab_cli-0.3.0 → ynab_cli-0.4.0}/src/ynab_cli/adapters/ynab/api/payee_locations/__init__.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{ynab_cli-0.3.0 → ynab_cli-0.4.0}/src/ynab_cli/adapters/ynab/api/scheduled_transactions/__init__.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{ynab_cli-0.3.0 → ynab_cli-0.4.0}/src/ynab_cli/adapters/ynab/api/transactions/create_transaction.py
RENAMED
|
File without changes
|
{ynab_cli-0.3.0 → ynab_cli-0.4.0}/src/ynab_cli/adapters/ynab/api/transactions/delete_transaction.py
RENAMED
|
File without changes
|
|
File without changes
|
{ynab_cli-0.3.0 → ynab_cli-0.4.0}/src/ynab_cli/adapters/ynab/api/transactions/get_transactions.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{ynab_cli-0.3.0 → ynab_cli-0.4.0}/src/ynab_cli/adapters/ynab/api/transactions/import_transactions.py
RENAMED
|
File without changes
|
{ynab_cli-0.3.0 → ynab_cli-0.4.0}/src/ynab_cli/adapters/ynab/api/transactions/update_transaction.py
RENAMED
|
File without changes
|
{ynab_cli-0.3.0 → ynab_cli-0.4.0}/src/ynab_cli/adapters/ynab/api/transactions/update_transactions.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{ynab_cli-0.3.0 → ynab_cli-0.4.0}/src/ynab_cli/adapters/ynab/models/account_response_data.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{ynab_cli-0.3.0 → ynab_cli-0.4.0}/src/ynab_cli/adapters/ynab/models/accounts_response_data.py
RENAMED
|
File without changes
|
|
File without changes
|
{ynab_cli-0.3.0 → ynab_cli-0.4.0}/src/ynab_cli/adapters/ynab/models/budget_detail_response.py
RENAMED
|
File without changes
|
{ynab_cli-0.3.0 → ynab_cli-0.4.0}/src/ynab_cli/adapters/ynab/models/budget_detail_response_data.py
RENAMED
|
File without changes
|
|
File without changes
|
{ynab_cli-0.3.0 → ynab_cli-0.4.0}/src/ynab_cli/adapters/ynab/models/budget_settings_response.py
RENAMED
|
File without changes
|
{ynab_cli-0.3.0 → ynab_cli-0.4.0}/src/ynab_cli/adapters/ynab/models/budget_settings_response_data.py
RENAMED
|
File without changes
|
|
File without changes
|
{ynab_cli-0.3.0 → ynab_cli-0.4.0}/src/ynab_cli/adapters/ynab/models/budget_summary_response.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{ynab_cli-0.3.0 → ynab_cli-0.4.0}/src/ynab_cli/adapters/ynab/models/bulk_response_data_bulk.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{ynab_cli-0.3.0 → ynab_cli-0.4.0}/src/ynab_cli/adapters/ynab/models/categories_response_data.py
RENAMED
|
File without changes
|
|
File without changes
|
{ynab_cli-0.3.0 → ynab_cli-0.4.0}/src/ynab_cli/adapters/ynab/models/category_goal_type_type_1.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{ynab_cli-0.3.0 → ynab_cli-0.4.0}/src/ynab_cli/adapters/ynab/models/category_response_data.py
RENAMED
|
File without changes
|
{ynab_cli-0.3.0 → ynab_cli-0.4.0}/src/ynab_cli/adapters/ynab/models/currency_format_type_0.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{ynab_cli-0.3.0 → ynab_cli-0.4.0}/src/ynab_cli/adapters/ynab/models/get_transactions_type.py
RENAMED
|
File without changes
|
|
File without changes
|
{ynab_cli-0.3.0 → ynab_cli-0.4.0}/src/ynab_cli/adapters/ynab/models/hybrid_transaction_type.py
RENAMED
|
File without changes
|
{ynab_cli-0.3.0 → ynab_cli-0.4.0}/src/ynab_cli/adapters/ynab/models/hybrid_transactions_response.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{ynab_cli-0.3.0 → ynab_cli-0.4.0}/src/ynab_cli/adapters/ynab/models/month_detail_response.py
RENAMED
|
File without changes
|
{ynab_cli-0.3.0 → ynab_cli-0.4.0}/src/ynab_cli/adapters/ynab/models/month_detail_response_data.py
RENAMED
|
File without changes
|
{ynab_cli-0.3.0 → ynab_cli-0.4.0}/src/ynab_cli/adapters/ynab/models/month_summaries_response.py
RENAMED
|
File without changes
|
{ynab_cli-0.3.0 → ynab_cli-0.4.0}/src/ynab_cli/adapters/ynab/models/month_summaries_response_data.py
RENAMED
|
File without changes
|