ynab-api-cli 0.1.0__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- ynab_api_cli/__init__.py +3 -0
- ynab_api_cli/__main__.py +266 -0
- ynab_api_cli/cli.py +171 -0
- ynab_api_cli/compat.py +120 -0
- ynab_api_cli/config.py +110 -0
- ynab_api_cli/contract.py +197 -0
- ynab_api_cli/contract_testing.py +141 -0
- ynab_api_cli/development.py +269 -0
- ynab_api_cli/distribution.py +123 -0
- ynab_api_cli/exceptions.py +7 -0
- ynab_api_cli/generated/__init__.py +3 -0
- ynab_api_cli/generated/api/__init__.py +3 -0
- ynab_api_cli/generated/api/accounts/__init__.py +3 -0
- ynab_api_cli/generated/api/accounts/create_account.py +54 -0
- ynab_api_cli/generated/api/accounts/get_account_by_id.py +53 -0
- ynab_api_cli/generated/api/accounts/get_accounts.py +57 -0
- ynab_api_cli/generated/api/categories/__init__.py +3 -0
- ynab_api_cli/generated/api/categories/create_category.py +54 -0
- ynab_api_cli/generated/api/categories/create_category_group.py +58 -0
- ynab_api_cli/generated/api/categories/get_categories.py +57 -0
- ynab_api_cli/generated/api/categories/get_category_by_id.py +52 -0
- ynab_api_cli/generated/api/categories/get_month_category_by_id.py +58 -0
- ynab_api_cli/generated/api/categories/update_category.py +57 -0
- ynab_api_cli/generated/api/categories/update_category_group.py +63 -0
- ynab_api_cli/generated/api/categories/update_month_category.py +65 -0
- ynab_api_cli/generated/api/money_movements/__init__.py +3 -0
- ynab_api_cli/generated/api/money_movements/get_money_movement_groups.py +51 -0
- ynab_api_cli/generated/api/money_movements/get_money_movement_groups_by_month.py +57 -0
- ynab_api_cli/generated/api/money_movements/get_money_movements.py +51 -0
- ynab_api_cli/generated/api/money_movements/get_money_movements_by_month.py +57 -0
- ynab_api_cli/generated/api/months/__init__.py +3 -0
- ynab_api_cli/generated/api/months/get_plan_month.py +55 -0
- ynab_api_cli/generated/api/months/get_plan_months.py +59 -0
- ynab_api_cli/generated/api/payee_locations/__init__.py +3 -0
- ynab_api_cli/generated/api/payee_locations/get_payee_location_by_id.py +54 -0
- ynab_api_cli/generated/api/payee_locations/get_payee_locations.py +51 -0
- ynab_api_cli/generated/api/payee_locations/get_payee_locations_by_payee.py +54 -0
- ynab_api_cli/generated/api/payees/__init__.py +3 -0
- ynab_api_cli/generated/api/payees/create_payee.py +54 -0
- ynab_api_cli/generated/api/payees/get_payee_by_id.py +52 -0
- ynab_api_cli/generated/api/payees/get_payees.py +57 -0
- ynab_api_cli/generated/api/payees/update_payee.py +57 -0
- ynab_api_cli/generated/api/plans/__init__.py +3 -0
- ynab_api_cli/generated/api/plans/get_plan_by_id.py +57 -0
- ynab_api_cli/generated/api/plans/get_plan_settings_by_id.py +49 -0
- ynab_api_cli/generated/api/plans/get_plans.py +51 -0
- ynab_api_cli/generated/api/scheduled_transactions/__init__.py +3 -0
- ynab_api_cli/generated/api/scheduled_transactions/create_scheduled_transaction.py +58 -0
- ynab_api_cli/generated/api/scheduled_transactions/delete_scheduled_transaction.py +56 -0
- ynab_api_cli/generated/api/scheduled_transactions/get_scheduled_transaction_by_id.py +56 -0
- ynab_api_cli/generated/api/scheduled_transactions/get_scheduled_transactions.py +59 -0
- ynab_api_cli/generated/api/scheduled_transactions/update_scheduled_transaction.py +63 -0
- ynab_api_cli/generated/api/transactions/__init__.py +3 -0
- ynab_api_cli/generated/api/transactions/create_transaction.py +58 -0
- ynab_api_cli/generated/api/transactions/delete_transaction.py +54 -0
- ynab_api_cli/generated/api/transactions/get_transaction_by_id.py +54 -0
- ynab_api_cli/generated/api/transactions/get_transactions.py +80 -0
- ynab_api_cli/generated/api/transactions/get_transactions_by_account.py +87 -0
- ynab_api_cli/generated/api/transactions/get_transactions_by_category.py +89 -0
- ynab_api_cli/generated/api/transactions/get_transactions_by_month.py +87 -0
- ynab_api_cli/generated/api/transactions/get_transactions_by_payee.py +89 -0
- ynab_api_cli/generated/api/transactions/import_transactions.py +54 -0
- ynab_api_cli/generated/api/transactions/update_transaction.py +59 -0
- ynab_api_cli/generated/api/transactions/update_transactions.py +58 -0
- ynab_api_cli/generated/api/user/__init__.py +3 -0
- ynab_api_cli/generated/api/user/get_user.py +42 -0
- ynab_api_cli/generated/bindings.py +141 -0
- ynab_api_cli/generated/models/__init__.py +416 -0
- ynab_api_cli/generated/models/account.py +71 -0
- ynab_api_cli/generated/models/account_base.py +57 -0
- ynab_api_cli/generated/models/account_response.py +19 -0
- ynab_api_cli/generated/models/account_response_data.py +19 -0
- ynab_api_cli/generated/models/account_type.py +23 -0
- ynab_api_cli/generated/models/accounts_response.py +21 -0
- ynab_api_cli/generated/models/accounts_response_data.py +20 -0
- ynab_api_cli/generated/models/bulk_response.py +19 -0
- ynab_api_cli/generated/models/bulk_response_data.py +21 -0
- ynab_api_cli/generated/models/bulk_response_data_bulk.py +15 -0
- ynab_api_cli/generated/models/bulk_transactions.py +21 -0
- ynab_api_cli/generated/models/categories_response.py +21 -0
- ynab_api_cli/generated/models/categories_response_data.py +22 -0
- ynab_api_cli/generated/models/category.py +104 -0
- ynab_api_cli/generated/models/category_base.py +74 -0
- ynab_api_cli/generated/models/category_group.py +20 -0
- ynab_api_cli/generated/models/category_group_with_categories.py +25 -0
- ynab_api_cli/generated/models/category_response.py +21 -0
- ynab_api_cli/generated/models/category_response_data.py +19 -0
- ynab_api_cli/generated/models/currency_format_type_0.py +21 -0
- ynab_api_cli/generated/models/date_format_type_0.py +14 -0
- ynab_api_cli/generated/models/debt_1.py +18 -0
- ynab_api_cli/generated/models/debt_2.py +18 -0
- ynab_api_cli/generated/models/debt_3.py +18 -0
- ynab_api_cli/generated/models/error_detail.py +16 -0
- ynab_api_cli/generated/models/error_response.py +19 -0
- ynab_api_cli/generated/models/existing_category.py +34 -0
- ynab_api_cli/generated/models/existing_transaction.py +43 -0
- ynab_api_cli/generated/models/flag_1.py +17 -0
- ynab_api_cli/generated/models/flag_2.py +17 -0
- ynab_api_cli/generated/models/flag_3.py +17 -0
- ynab_api_cli/generated/models/get_transactions_by_account_type.py +12 -0
- ynab_api_cli/generated/models/get_transactions_by_category_type.py +12 -0
- ynab_api_cli/generated/models/get_transactions_by_month_type.py +12 -0
- ynab_api_cli/generated/models/get_transactions_by_payee_type.py +12 -0
- ynab_api_cli/generated/models/get_transactions_type.py +12 -0
- ynab_api_cli/generated/models/goal_1.py +15 -0
- ynab_api_cli/generated/models/goal_2.py +15 -0
- ynab_api_cli/generated/models/goal_3.py +15 -0
- ynab_api_cli/generated/models/hybrid_transaction.py +70 -0
- ynab_api_cli/generated/models/hybrid_transaction_type.py +12 -0
- ynab_api_cli/generated/models/hybrid_transactions_response.py +21 -0
- ynab_api_cli/generated/models/hybrid_transactions_response_data.py +22 -0
- ynab_api_cli/generated/models/loan_account_periodic_value_type_0.py +33 -0
- ynab_api_cli/generated/models/money_movement.py +35 -0
- ynab_api_cli/generated/models/money_movement_base.py +33 -0
- ynab_api_cli/generated/models/money_movement_group.py +25 -0
- ynab_api_cli/generated/models/money_movement_groups_response.py +21 -0
- ynab_api_cli/generated/models/money_movement_groups_response_data.py +22 -0
- ynab_api_cli/generated/models/money_movements_response.py +21 -0
- ynab_api_cli/generated/models/money_movements_response_data.py +20 -0
- ynab_api_cli/generated/models/month_detail.py +42 -0
- ynab_api_cli/generated/models/month_detail_base.py +30 -0
- ynab_api_cli/generated/models/month_detail_response.py +21 -0
- ynab_api_cli/generated/models/month_detail_response_data.py +19 -0
- ynab_api_cli/generated/models/month_summaries_response.py +21 -0
- ynab_api_cli/generated/models/month_summaries_response_data.py +20 -0
- ynab_api_cli/generated/models/month_summary.py +37 -0
- ynab_api_cli/generated/models/month_summary_base.py +25 -0
- ynab_api_cli/generated/models/new_category.py +34 -0
- ynab_api_cli/generated/models/new_transaction.py +44 -0
- ynab_api_cli/generated/models/patch_category_group_wrapper.py +19 -0
- ynab_api_cli/generated/models/patch_category_wrapper.py +19 -0
- ynab_api_cli/generated/models/patch_month_category_wrapper.py +19 -0
- ynab_api_cli/generated/models/patch_payee_wrapper.py +19 -0
- ynab_api_cli/generated/models/patch_transactions_wrapper.py +21 -0
- ynab_api_cli/generated/models/payee.py +23 -0
- ynab_api_cli/generated/models/payee_location.py +20 -0
- ynab_api_cli/generated/models/payee_location_response.py +21 -0
- ynab_api_cli/generated/models/payee_location_response_data.py +19 -0
- ynab_api_cli/generated/models/payee_locations_response.py +21 -0
- ynab_api_cli/generated/models/payee_locations_response_data.py +19 -0
- ynab_api_cli/generated/models/payee_response.py +19 -0
- ynab_api_cli/generated/models/payee_response_data.py +19 -0
- ynab_api_cli/generated/models/payees_response.py +19 -0
- ynab_api_cli/generated/models/payees_response_data.py +20 -0
- ynab_api_cli/generated/models/plan_detail.py +74 -0
- ynab_api_cli/generated/models/plan_detail_response.py +21 -0
- ynab_api_cli/generated/models/plan_detail_response_data.py +20 -0
- ynab_api_cli/generated/models/plan_settings.py +21 -0
- ynab_api_cli/generated/models/plan_settings_response.py +21 -0
- ynab_api_cli/generated/models/plan_settings_response_data.py +19 -0
- ynab_api_cli/generated/models/plan_summary.py +38 -0
- ynab_api_cli/generated/models/plan_summary_response.py +21 -0
- ynab_api_cli/generated/models/plan_summary_response_data.py +24 -0
- ynab_api_cli/generated/models/post_account_wrapper.py +19 -0
- ynab_api_cli/generated/models/post_category_group_wrapper.py +19 -0
- ynab_api_cli/generated/models/post_category_wrapper.py +19 -0
- ynab_api_cli/generated/models/post_payee.py +14 -0
- ynab_api_cli/generated/models/post_payee_wrapper.py +19 -0
- ynab_api_cli/generated/models/post_scheduled_transaction_wrapper.py +23 -0
- ynab_api_cli/generated/models/post_transactions_wrapper.py +24 -0
- ynab_api_cli/generated/models/put_scheduled_transaction_wrapper.py +23 -0
- ynab_api_cli/generated/models/put_transaction_wrapper.py +19 -0
- ynab_api_cli/generated/models/save_account.py +18 -0
- ynab_api_cli/generated/models/save_account_type.py +16 -0
- ynab_api_cli/generated/models/save_category.py +34 -0
- ynab_api_cli/generated/models/save_category_goal_frequency.py +13 -0
- ynab_api_cli/generated/models/save_category_group.py +14 -0
- ynab_api_cli/generated/models/save_category_group_response.py +21 -0
- ynab_api_cli/generated/models/save_category_group_response_data.py +20 -0
- ynab_api_cli/generated/models/save_category_response.py +21 -0
- ynab_api_cli/generated/models/save_category_response_data.py +20 -0
- ynab_api_cli/generated/models/save_month_category.py +14 -0
- ynab_api_cli/generated/models/save_payee.py +16 -0
- ynab_api_cli/generated/models/save_payee_response.py +21 -0
- ynab_api_cli/generated/models/save_payee_response_data.py +20 -0
- ynab_api_cli/generated/models/save_scheduled_transaction.py +37 -0
- ynab_api_cli/generated/models/save_sub_transaction.py +22 -0
- ynab_api_cli/generated/models/save_transaction_with_id_or_import_id.py +45 -0
- ynab_api_cli/generated/models/save_transaction_with_optional_fields.py +43 -0
- ynab_api_cli/generated/models/save_transactions_response.py +21 -0
- ynab_api_cli/generated/models/save_transactions_response_data.py +29 -0
- ynab_api_cli/generated/models/scheduled_sub_transaction.py +31 -0
- ynab_api_cli/generated/models/scheduled_sub_transaction_base.py +29 -0
- ynab_api_cli/generated/models/scheduled_transaction_detail.py +53 -0
- ynab_api_cli/generated/models/scheduled_transaction_frequency.py +23 -0
- ynab_api_cli/generated/models/scheduled_transaction_response.py +21 -0
- ynab_api_cli/generated/models/scheduled_transaction_response_data.py +23 -0
- ynab_api_cli/generated/models/scheduled_transaction_summary.py +43 -0
- ynab_api_cli/generated/models/scheduled_transaction_summary_base.py +41 -0
- ynab_api_cli/generated/models/scheduled_transaction_summary_base_frequency.py +23 -0
- ynab_api_cli/generated/models/scheduled_transactions_response.py +21 -0
- ynab_api_cli/generated/models/scheduled_transactions_response_data.py +24 -0
- ynab_api_cli/generated/models/sub_transaction.py +34 -0
- ynab_api_cli/generated/models/sub_transaction_base.py +32 -0
- ynab_api_cli/generated/models/transaction_cleared_status.py +13 -0
- ynab_api_cli/generated/models/transaction_detail.py +70 -0
- ynab_api_cli/generated/models/transaction_response.py +21 -0
- ynab_api_cli/generated/models/transaction_response_data.py +20 -0
- ynab_api_cli/generated/models/transaction_summary.py +62 -0
- ynab_api_cli/generated/models/transaction_summary_base.py +60 -0
- ynab_api_cli/generated/models/transactions_import_response.py +21 -0
- ynab_api_cli/generated/models/transactions_import_response_data.py +14 -0
- ynab_api_cli/generated/models/transactions_response.py +21 -0
- ynab_api_cli/generated/models/transactions_response_data.py +20 -0
- ynab_api_cli/generated/models/user.py +16 -0
- ynab_api_cli/generated/models/user_response.py +19 -0
- ynab_api_cli/generated/models/user_response_data.py +19 -0
- ynab_api_cli/live.py +449 -0
- ynab_api_cli/py.typed +0 -0
- ynab_api_cli/resources/__init__.py +3 -0
- ynab_api_cli/resources/catalog.json +178 -0
- ynab_api_cli/resources/openapi.yaml +4035 -0
- ynab_api_cli/resources/provenance.json +9 -0
- ynab_api_cli/resources/schema_features.json +913 -0
- ynab_api_cli/resources/skill/SKILL.md +21 -0
- ynab_api_cli/resources/skill/references/operations.md +36 -0
- ynab_api_cli/resources/skill/references/setup.md +32 -0
- ynab_api_cli/security.py +83 -0
- ynab_api_cli/transport.py +133 -0
- ynab_api_cli/types.py +110 -0
- ynab_api_cli/verification.py +167 -0
- ynab_api_cli-0.1.0.dist-info/METADATA +90 -0
- ynab_api_cli-0.1.0.dist-info/RECORD +225 -0
- ynab_api_cli-0.1.0.dist-info/WHEEL +4 -0
- ynab_api_cli-0.1.0.dist-info/entry_points.txt +3 -0
|
@@ -0,0 +1,123 @@
|
|
|
1
|
+
"""Build archive checks and isolated installation smoke verification."""
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
5
|
+
import json
|
|
6
|
+
import os
|
|
7
|
+
import shutil
|
|
8
|
+
import subprocess
|
|
9
|
+
import sys
|
|
10
|
+
import tarfile
|
|
11
|
+
import tempfile
|
|
12
|
+
import zipfile
|
|
13
|
+
from pathlib import Path
|
|
14
|
+
|
|
15
|
+
from ynab_api_cli.config import ConfigStore
|
|
16
|
+
from ynab_api_cli.contract import Contract
|
|
17
|
+
from ynab_api_cli.exceptions import AppError
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
class DistributionCheck:
|
|
21
|
+
"""Verify wheels, source archives, and a clean uv tool installation."""
|
|
22
|
+
|
|
23
|
+
@classmethod
|
|
24
|
+
def main(cls) -> None:
|
|
25
|
+
"""Run the release check from the project root."""
|
|
26
|
+
cls().run(Path(__file__).resolve().parents[2])
|
|
27
|
+
|
|
28
|
+
def run(self, root: Path) -> None:
|
|
29
|
+
"""Inspect built artifacts and exercise the independently installed CLI."""
|
|
30
|
+
wheel = next((root / "dist").glob("*.whl"))
|
|
31
|
+
source = next((root / "dist").glob("*.tar.gz"))
|
|
32
|
+
with zipfile.ZipFile(wheel) as archive:
|
|
33
|
+
names = archive.namelist()
|
|
34
|
+
required = {
|
|
35
|
+
"ynab_api_cli/resources/openapi.yaml",
|
|
36
|
+
"ynab_api_cli/resources/catalog.json",
|
|
37
|
+
"ynab_api_cli/resources/skill/SKILL.md",
|
|
38
|
+
"ynab_api_cli/py.typed",
|
|
39
|
+
}
|
|
40
|
+
if not required <= set(names):
|
|
41
|
+
raise AppError("Wheel is missing required contract or skill resources.")
|
|
42
|
+
with tarfile.open(source) as archive:
|
|
43
|
+
if not any(
|
|
44
|
+
name.endswith("/skills/ynab-api-cli/SKILL.md")
|
|
45
|
+
for name in archive.getnames()
|
|
46
|
+
):
|
|
47
|
+
raise AppError("Source archive is missing the supplementary skill.")
|
|
48
|
+
uv = shutil.which("uv")
|
|
49
|
+
if uv is None:
|
|
50
|
+
raise AppError("uv is required for clean installation verification.")
|
|
51
|
+
with tempfile.TemporaryDirectory() as temporary:
|
|
52
|
+
workspace = Path(temporary)
|
|
53
|
+
environment = dict(os.environ)
|
|
54
|
+
environment.update(
|
|
55
|
+
{
|
|
56
|
+
"UV_TOOL_DIR": str(workspace / "tools"),
|
|
57
|
+
"UV_TOOL_BIN_DIR": str(workspace / "bin"),
|
|
58
|
+
"XDG_CONFIG_HOME": str(workspace / "config"),
|
|
59
|
+
}
|
|
60
|
+
)
|
|
61
|
+
subprocess.run( # noqa: S603 - resolved uv and local wheel, no shell.
|
|
62
|
+
[
|
|
63
|
+
uv,
|
|
64
|
+
"tool",
|
|
65
|
+
"install",
|
|
66
|
+
"--python",
|
|
67
|
+
sys.executable,
|
|
68
|
+
"--no-managed-python",
|
|
69
|
+
str(wheel),
|
|
70
|
+
],
|
|
71
|
+
env=environment,
|
|
72
|
+
cwd=workspace,
|
|
73
|
+
check=True,
|
|
74
|
+
)
|
|
75
|
+
executable = (
|
|
76
|
+
workspace
|
|
77
|
+
/ "bin"
|
|
78
|
+
/ ("ynab-api-cli.exe" if os.name == "nt" else "ynab-api-cli")
|
|
79
|
+
)
|
|
80
|
+
store = ConfigStore(workspace / "config/ynab-api-cli")
|
|
81
|
+
store.configure("synthetic-install-test")
|
|
82
|
+
for argv in (
|
|
83
|
+
["--help"],
|
|
84
|
+
["discover"],
|
|
85
|
+
["inspect", "getUser"],
|
|
86
|
+
["doctor", "--offline"],
|
|
87
|
+
["skill", "export", str(workspace / "exported-skill")],
|
|
88
|
+
):
|
|
89
|
+
result = subprocess.run( # noqa: S603 - fixed installed CLI smoke commands.
|
|
90
|
+
[str(executable), *argv],
|
|
91
|
+
env=environment,
|
|
92
|
+
cwd=workspace,
|
|
93
|
+
capture_output=True,
|
|
94
|
+
text=True,
|
|
95
|
+
check=True,
|
|
96
|
+
)
|
|
97
|
+
if argv[0] == "discover" and len(
|
|
98
|
+
json.loads(result.stdout)["operations"]
|
|
99
|
+
) != len(Contract().catalog):
|
|
100
|
+
raise AppError("Installed CLI operation inventory mismatch.")
|
|
101
|
+
release = root / "dist" / (wheel.name.split("-py3-")[0] + "-release.zip")
|
|
102
|
+
with zipfile.ZipFile(release, "w", compression=zipfile.ZIP_DEFLATED) as archive:
|
|
103
|
+
for artifact in (wheel, source, root / "README.md"):
|
|
104
|
+
archive.write(artifact, artifact.name)
|
|
105
|
+
for directory in ("skills", "docs"):
|
|
106
|
+
for path in (root / directory).rglob("*"):
|
|
107
|
+
if path.is_file():
|
|
108
|
+
archive.write(path, str(path.relative_to(root)))
|
|
109
|
+
sys.stdout.write(
|
|
110
|
+
json.dumps(
|
|
111
|
+
{
|
|
112
|
+
"wheel": wheel.name,
|
|
113
|
+
"source": source.name,
|
|
114
|
+
"release": release.name,
|
|
115
|
+
"clean_install": "passed",
|
|
116
|
+
}
|
|
117
|
+
)
|
|
118
|
+
+ "\n"
|
|
119
|
+
)
|
|
120
|
+
|
|
121
|
+
|
|
122
|
+
if __name__ == "__main__":
|
|
123
|
+
DistributionCheck.main()
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
"""Generated typed REST endpoint; regenerate rather than editing."""
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
5
|
+
from http import HTTPStatus
|
|
6
|
+
|
|
7
|
+
from pydantic import TypeAdapter
|
|
8
|
+
|
|
9
|
+
from ynab_api_cli.generated.models.account_response import AccountResponse
|
|
10
|
+
from ynab_api_cli.generated.models.error_response import ErrorResponse
|
|
11
|
+
from ynab_api_cli.generated.models.post_account_wrapper import PostAccountWrapper
|
|
12
|
+
from ynab_api_cli.transport import Transport
|
|
13
|
+
from ynab_api_cli.types import RequestValues, Response
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
class Endpoint:
|
|
17
|
+
"""Typed createAccount operation."""
|
|
18
|
+
|
|
19
|
+
@classmethod
|
|
20
|
+
def execute(
|
|
21
|
+
cls,
|
|
22
|
+
*,
|
|
23
|
+
transport: Transport,
|
|
24
|
+
plan_id: str,
|
|
25
|
+
body: PostAccountWrapper,
|
|
26
|
+
) -> Response[AccountResponse | ErrorResponse]:
|
|
27
|
+
"""Execute the typed request and retain its original response JSON."""
|
|
28
|
+
raw = transport.send(
|
|
29
|
+
"createAccount",
|
|
30
|
+
RequestValues(
|
|
31
|
+
path={
|
|
32
|
+
"plan_id": plan_id,
|
|
33
|
+
},
|
|
34
|
+
query={},
|
|
35
|
+
body=body,
|
|
36
|
+
),
|
|
37
|
+
)
|
|
38
|
+
if raw.status == HTTPStatus.CREATED:
|
|
39
|
+
parsed = AccountResponse.model_validate(raw.raw)
|
|
40
|
+
return Response(raw.status, raw.raw, raw.headers, parsed)
|
|
41
|
+
raise ValueError("Validated response has no generated success binding.")
|
|
42
|
+
|
|
43
|
+
@classmethod
|
|
44
|
+
def dispatch(
|
|
45
|
+
cls, transport: Transport, request: RequestValues
|
|
46
|
+
) -> Response[AccountResponse | ErrorResponse]:
|
|
47
|
+
"""Convert validated CLI inputs and call the explicitly typed method."""
|
|
48
|
+
return cls.execute(
|
|
49
|
+
transport=transport,
|
|
50
|
+
plan_id=request.value("path", "plan_id", TypeAdapter[str](str)),
|
|
51
|
+
body=TypeAdapter[PostAccountWrapper](PostAccountWrapper).validate_python(
|
|
52
|
+
request.body
|
|
53
|
+
),
|
|
54
|
+
)
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
"""Generated typed REST endpoint; regenerate rather than editing."""
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
5
|
+
from http import HTTPStatus
|
|
6
|
+
from uuid import UUID
|
|
7
|
+
|
|
8
|
+
from pydantic import TypeAdapter
|
|
9
|
+
|
|
10
|
+
from ynab_api_cli.generated.models.account_response import AccountResponse
|
|
11
|
+
from ynab_api_cli.generated.models.error_response import ErrorResponse
|
|
12
|
+
from ynab_api_cli.transport import Transport
|
|
13
|
+
from ynab_api_cli.types import UNSET, RequestValues, Response
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
class Endpoint:
|
|
17
|
+
"""Typed getAccountById operation."""
|
|
18
|
+
|
|
19
|
+
@classmethod
|
|
20
|
+
def execute(
|
|
21
|
+
cls,
|
|
22
|
+
*,
|
|
23
|
+
transport: Transport,
|
|
24
|
+
plan_id: str,
|
|
25
|
+
account_id: UUID,
|
|
26
|
+
) -> Response[AccountResponse | ErrorResponse]:
|
|
27
|
+
"""Execute the typed request and retain its original response JSON."""
|
|
28
|
+
raw = transport.send(
|
|
29
|
+
"getAccountById",
|
|
30
|
+
RequestValues(
|
|
31
|
+
path={
|
|
32
|
+
"plan_id": plan_id,
|
|
33
|
+
"account_id": account_id,
|
|
34
|
+
},
|
|
35
|
+
query={},
|
|
36
|
+
body=UNSET,
|
|
37
|
+
),
|
|
38
|
+
)
|
|
39
|
+
if raw.status == HTTPStatus.OK:
|
|
40
|
+
parsed = AccountResponse.model_validate(raw.raw)
|
|
41
|
+
return Response(raw.status, raw.raw, raw.headers, parsed)
|
|
42
|
+
raise ValueError("Validated response has no generated success binding.")
|
|
43
|
+
|
|
44
|
+
@classmethod
|
|
45
|
+
def dispatch(
|
|
46
|
+
cls, transport: Transport, request: RequestValues
|
|
47
|
+
) -> Response[AccountResponse | ErrorResponse]:
|
|
48
|
+
"""Convert validated CLI inputs and call the explicitly typed method."""
|
|
49
|
+
return cls.execute(
|
|
50
|
+
transport=transport,
|
|
51
|
+
plan_id=request.value("path", "plan_id", TypeAdapter[str](str)),
|
|
52
|
+
account_id=request.value("path", "account_id", TypeAdapter[UUID](UUID)),
|
|
53
|
+
)
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
"""Generated typed REST endpoint; regenerate rather than editing."""
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
5
|
+
from http import HTTPStatus
|
|
6
|
+
|
|
7
|
+
from pydantic import TypeAdapter
|
|
8
|
+
|
|
9
|
+
from ynab_api_cli.generated.models.accounts_response import AccountsResponse
|
|
10
|
+
from ynab_api_cli.generated.models.error_response import ErrorResponse
|
|
11
|
+
from ynab_api_cli.transport import Transport
|
|
12
|
+
from ynab_api_cli.types import UNSET, RequestValues, Response, Unset
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
class Endpoint:
|
|
16
|
+
"""Typed getAccounts operation."""
|
|
17
|
+
|
|
18
|
+
@classmethod
|
|
19
|
+
def execute(
|
|
20
|
+
cls,
|
|
21
|
+
*,
|
|
22
|
+
transport: Transport,
|
|
23
|
+
plan_id: str,
|
|
24
|
+
last_knowledge_of_server: int | Unset = UNSET,
|
|
25
|
+
) -> Response[AccountsResponse | ErrorResponse]:
|
|
26
|
+
"""Execute the typed request and retain its original response JSON."""
|
|
27
|
+
raw = transport.send(
|
|
28
|
+
"getAccounts",
|
|
29
|
+
RequestValues(
|
|
30
|
+
path={
|
|
31
|
+
"plan_id": plan_id,
|
|
32
|
+
},
|
|
33
|
+
query={
|
|
34
|
+
"last_knowledge_of_server": last_knowledge_of_server,
|
|
35
|
+
},
|
|
36
|
+
body=UNSET,
|
|
37
|
+
),
|
|
38
|
+
)
|
|
39
|
+
if raw.status == HTTPStatus.OK:
|
|
40
|
+
parsed = AccountsResponse.model_validate(raw.raw)
|
|
41
|
+
return Response(raw.status, raw.raw, raw.headers, parsed)
|
|
42
|
+
raise ValueError("Validated response has no generated success binding.")
|
|
43
|
+
|
|
44
|
+
@classmethod
|
|
45
|
+
def dispatch(
|
|
46
|
+
cls, transport: Transport, request: RequestValues
|
|
47
|
+
) -> Response[AccountsResponse | ErrorResponse]:
|
|
48
|
+
"""Convert validated CLI inputs and call the explicitly typed method."""
|
|
49
|
+
return cls.execute(
|
|
50
|
+
transport=transport,
|
|
51
|
+
plan_id=request.value("path", "plan_id", TypeAdapter[str](str)),
|
|
52
|
+
last_knowledge_of_server=request.value(
|
|
53
|
+
"query",
|
|
54
|
+
"last_knowledge_of_server",
|
|
55
|
+
TypeAdapter[int | Unset](int | Unset),
|
|
56
|
+
),
|
|
57
|
+
)
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
"""Generated typed REST endpoint; regenerate rather than editing."""
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
5
|
+
from http import HTTPStatus
|
|
6
|
+
|
|
7
|
+
from pydantic import TypeAdapter
|
|
8
|
+
|
|
9
|
+
from ynab_api_cli.generated.models.error_response import ErrorResponse
|
|
10
|
+
from ynab_api_cli.generated.models.post_category_wrapper import PostCategoryWrapper
|
|
11
|
+
from ynab_api_cli.generated.models.save_category_response import SaveCategoryResponse
|
|
12
|
+
from ynab_api_cli.transport import Transport
|
|
13
|
+
from ynab_api_cli.types import RequestValues, Response
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
class Endpoint:
|
|
17
|
+
"""Typed createCategory operation."""
|
|
18
|
+
|
|
19
|
+
@classmethod
|
|
20
|
+
def execute(
|
|
21
|
+
cls,
|
|
22
|
+
*,
|
|
23
|
+
transport: Transport,
|
|
24
|
+
plan_id: str,
|
|
25
|
+
body: PostCategoryWrapper,
|
|
26
|
+
) -> Response[ErrorResponse | SaveCategoryResponse]:
|
|
27
|
+
"""Execute the typed request and retain its original response JSON."""
|
|
28
|
+
raw = transport.send(
|
|
29
|
+
"createCategory",
|
|
30
|
+
RequestValues(
|
|
31
|
+
path={
|
|
32
|
+
"plan_id": plan_id,
|
|
33
|
+
},
|
|
34
|
+
query={},
|
|
35
|
+
body=body,
|
|
36
|
+
),
|
|
37
|
+
)
|
|
38
|
+
if raw.status == HTTPStatus.CREATED:
|
|
39
|
+
parsed = SaveCategoryResponse.model_validate(raw.raw)
|
|
40
|
+
return Response(raw.status, raw.raw, raw.headers, parsed)
|
|
41
|
+
raise ValueError("Validated response has no generated success binding.")
|
|
42
|
+
|
|
43
|
+
@classmethod
|
|
44
|
+
def dispatch(
|
|
45
|
+
cls, transport: Transport, request: RequestValues
|
|
46
|
+
) -> Response[ErrorResponse | SaveCategoryResponse]:
|
|
47
|
+
"""Convert validated CLI inputs and call the explicitly typed method."""
|
|
48
|
+
return cls.execute(
|
|
49
|
+
transport=transport,
|
|
50
|
+
plan_id=request.value("path", "plan_id", TypeAdapter[str](str)),
|
|
51
|
+
body=TypeAdapter[PostCategoryWrapper](PostCategoryWrapper).validate_python(
|
|
52
|
+
request.body
|
|
53
|
+
),
|
|
54
|
+
)
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
"""Generated typed REST endpoint; regenerate rather than editing."""
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
5
|
+
from http import HTTPStatus
|
|
6
|
+
|
|
7
|
+
from pydantic import TypeAdapter
|
|
8
|
+
|
|
9
|
+
from ynab_api_cli.generated.models.error_response import ErrorResponse
|
|
10
|
+
from ynab_api_cli.generated.models.post_category_group_wrapper import (
|
|
11
|
+
PostCategoryGroupWrapper,
|
|
12
|
+
)
|
|
13
|
+
from ynab_api_cli.generated.models.save_category_group_response import (
|
|
14
|
+
SaveCategoryGroupResponse,
|
|
15
|
+
)
|
|
16
|
+
from ynab_api_cli.transport import Transport
|
|
17
|
+
from ynab_api_cli.types import RequestValues, Response
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
class Endpoint:
|
|
21
|
+
"""Typed createCategoryGroup operation."""
|
|
22
|
+
|
|
23
|
+
@classmethod
|
|
24
|
+
def execute(
|
|
25
|
+
cls,
|
|
26
|
+
*,
|
|
27
|
+
transport: Transport,
|
|
28
|
+
plan_id: str,
|
|
29
|
+
body: PostCategoryGroupWrapper,
|
|
30
|
+
) -> Response[ErrorResponse | SaveCategoryGroupResponse]:
|
|
31
|
+
"""Execute the typed request and retain its original response JSON."""
|
|
32
|
+
raw = transport.send(
|
|
33
|
+
"createCategoryGroup",
|
|
34
|
+
RequestValues(
|
|
35
|
+
path={
|
|
36
|
+
"plan_id": plan_id,
|
|
37
|
+
},
|
|
38
|
+
query={},
|
|
39
|
+
body=body,
|
|
40
|
+
),
|
|
41
|
+
)
|
|
42
|
+
if raw.status == HTTPStatus.CREATED:
|
|
43
|
+
parsed = SaveCategoryGroupResponse.model_validate(raw.raw)
|
|
44
|
+
return Response(raw.status, raw.raw, raw.headers, parsed)
|
|
45
|
+
raise ValueError("Validated response has no generated success binding.")
|
|
46
|
+
|
|
47
|
+
@classmethod
|
|
48
|
+
def dispatch(
|
|
49
|
+
cls, transport: Transport, request: RequestValues
|
|
50
|
+
) -> Response[ErrorResponse | SaveCategoryGroupResponse]:
|
|
51
|
+
"""Convert validated CLI inputs and call the explicitly typed method."""
|
|
52
|
+
return cls.execute(
|
|
53
|
+
transport=transport,
|
|
54
|
+
plan_id=request.value("path", "plan_id", TypeAdapter[str](str)),
|
|
55
|
+
body=TypeAdapter[PostCategoryGroupWrapper](
|
|
56
|
+
PostCategoryGroupWrapper
|
|
57
|
+
).validate_python(request.body),
|
|
58
|
+
)
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
"""Generated typed REST endpoint; regenerate rather than editing."""
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
5
|
+
from http import HTTPStatus
|
|
6
|
+
|
|
7
|
+
from pydantic import TypeAdapter
|
|
8
|
+
|
|
9
|
+
from ynab_api_cli.generated.models.categories_response import CategoriesResponse
|
|
10
|
+
from ynab_api_cli.generated.models.error_response import ErrorResponse
|
|
11
|
+
from ynab_api_cli.transport import Transport
|
|
12
|
+
from ynab_api_cli.types import UNSET, RequestValues, Response, Unset
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
class Endpoint:
|
|
16
|
+
"""Typed getCategories operation."""
|
|
17
|
+
|
|
18
|
+
@classmethod
|
|
19
|
+
def execute(
|
|
20
|
+
cls,
|
|
21
|
+
*,
|
|
22
|
+
transport: Transport,
|
|
23
|
+
plan_id: str,
|
|
24
|
+
last_knowledge_of_server: int | Unset = UNSET,
|
|
25
|
+
) -> Response[CategoriesResponse | ErrorResponse]:
|
|
26
|
+
"""Execute the typed request and retain its original response JSON."""
|
|
27
|
+
raw = transport.send(
|
|
28
|
+
"getCategories",
|
|
29
|
+
RequestValues(
|
|
30
|
+
path={
|
|
31
|
+
"plan_id": plan_id,
|
|
32
|
+
},
|
|
33
|
+
query={
|
|
34
|
+
"last_knowledge_of_server": last_knowledge_of_server,
|
|
35
|
+
},
|
|
36
|
+
body=UNSET,
|
|
37
|
+
),
|
|
38
|
+
)
|
|
39
|
+
if raw.status == HTTPStatus.OK:
|
|
40
|
+
parsed = CategoriesResponse.model_validate(raw.raw)
|
|
41
|
+
return Response(raw.status, raw.raw, raw.headers, parsed)
|
|
42
|
+
raise ValueError("Validated response has no generated success binding.")
|
|
43
|
+
|
|
44
|
+
@classmethod
|
|
45
|
+
def dispatch(
|
|
46
|
+
cls, transport: Transport, request: RequestValues
|
|
47
|
+
) -> Response[CategoriesResponse | ErrorResponse]:
|
|
48
|
+
"""Convert validated CLI inputs and call the explicitly typed method."""
|
|
49
|
+
return cls.execute(
|
|
50
|
+
transport=transport,
|
|
51
|
+
plan_id=request.value("path", "plan_id", TypeAdapter[str](str)),
|
|
52
|
+
last_knowledge_of_server=request.value(
|
|
53
|
+
"query",
|
|
54
|
+
"last_knowledge_of_server",
|
|
55
|
+
TypeAdapter[int | Unset](int | Unset),
|
|
56
|
+
),
|
|
57
|
+
)
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
"""Generated typed REST endpoint; regenerate rather than editing."""
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
5
|
+
from http import HTTPStatus
|
|
6
|
+
|
|
7
|
+
from pydantic import TypeAdapter
|
|
8
|
+
|
|
9
|
+
from ynab_api_cli.generated.models.category_response import CategoryResponse
|
|
10
|
+
from ynab_api_cli.generated.models.error_response import ErrorResponse
|
|
11
|
+
from ynab_api_cli.transport import Transport
|
|
12
|
+
from ynab_api_cli.types import UNSET, RequestValues, Response
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
class Endpoint:
|
|
16
|
+
"""Typed getCategoryById operation."""
|
|
17
|
+
|
|
18
|
+
@classmethod
|
|
19
|
+
def execute(
|
|
20
|
+
cls,
|
|
21
|
+
*,
|
|
22
|
+
transport: Transport,
|
|
23
|
+
plan_id: str,
|
|
24
|
+
category_id: str,
|
|
25
|
+
) -> Response[CategoryResponse | ErrorResponse]:
|
|
26
|
+
"""Execute the typed request and retain its original response JSON."""
|
|
27
|
+
raw = transport.send(
|
|
28
|
+
"getCategoryById",
|
|
29
|
+
RequestValues(
|
|
30
|
+
path={
|
|
31
|
+
"plan_id": plan_id,
|
|
32
|
+
"category_id": category_id,
|
|
33
|
+
},
|
|
34
|
+
query={},
|
|
35
|
+
body=UNSET,
|
|
36
|
+
),
|
|
37
|
+
)
|
|
38
|
+
if raw.status == HTTPStatus.OK:
|
|
39
|
+
parsed = CategoryResponse.model_validate(raw.raw)
|
|
40
|
+
return Response(raw.status, raw.raw, raw.headers, parsed)
|
|
41
|
+
raise ValueError("Validated response has no generated success binding.")
|
|
42
|
+
|
|
43
|
+
@classmethod
|
|
44
|
+
def dispatch(
|
|
45
|
+
cls, transport: Transport, request: RequestValues
|
|
46
|
+
) -> Response[CategoryResponse | ErrorResponse]:
|
|
47
|
+
"""Convert validated CLI inputs and call the explicitly typed method."""
|
|
48
|
+
return cls.execute(
|
|
49
|
+
transport=transport,
|
|
50
|
+
plan_id=request.value("path", "plan_id", TypeAdapter[str](str)),
|
|
51
|
+
category_id=request.value("path", "category_id", TypeAdapter[str](str)),
|
|
52
|
+
)
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
"""Generated typed REST endpoint; regenerate rather than editing."""
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
5
|
+
import datetime
|
|
6
|
+
from http import HTTPStatus
|
|
7
|
+
|
|
8
|
+
from pydantic import TypeAdapter
|
|
9
|
+
|
|
10
|
+
from ynab_api_cli.generated.models.category_response import CategoryResponse
|
|
11
|
+
from ynab_api_cli.generated.models.error_response import ErrorResponse
|
|
12
|
+
from ynab_api_cli.transport import Transport
|
|
13
|
+
from ynab_api_cli.types import UNSET, RequestValues, Response
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
class Endpoint:
|
|
17
|
+
"""Typed getMonthCategoryById operation."""
|
|
18
|
+
|
|
19
|
+
@classmethod
|
|
20
|
+
def execute(
|
|
21
|
+
cls,
|
|
22
|
+
*,
|
|
23
|
+
transport: Transport,
|
|
24
|
+
plan_id: str,
|
|
25
|
+
month: datetime.date,
|
|
26
|
+
category_id: str,
|
|
27
|
+
) -> Response[CategoryResponse | ErrorResponse]:
|
|
28
|
+
"""Execute the typed request and retain its original response JSON."""
|
|
29
|
+
raw = transport.send(
|
|
30
|
+
"getMonthCategoryById",
|
|
31
|
+
RequestValues(
|
|
32
|
+
path={
|
|
33
|
+
"plan_id": plan_id,
|
|
34
|
+
"month": month,
|
|
35
|
+
"category_id": category_id,
|
|
36
|
+
},
|
|
37
|
+
query={},
|
|
38
|
+
body=UNSET,
|
|
39
|
+
),
|
|
40
|
+
)
|
|
41
|
+
if raw.status == HTTPStatus.OK:
|
|
42
|
+
parsed = CategoryResponse.model_validate(raw.raw)
|
|
43
|
+
return Response(raw.status, raw.raw, raw.headers, parsed)
|
|
44
|
+
raise ValueError("Validated response has no generated success binding.")
|
|
45
|
+
|
|
46
|
+
@classmethod
|
|
47
|
+
def dispatch(
|
|
48
|
+
cls, transport: Transport, request: RequestValues
|
|
49
|
+
) -> Response[CategoryResponse | ErrorResponse]:
|
|
50
|
+
"""Convert validated CLI inputs and call the explicitly typed method."""
|
|
51
|
+
return cls.execute(
|
|
52
|
+
transport=transport,
|
|
53
|
+
plan_id=request.value("path", "plan_id", TypeAdapter[str](str)),
|
|
54
|
+
month=request.value(
|
|
55
|
+
"path", "month", TypeAdapter[datetime.date](datetime.date)
|
|
56
|
+
),
|
|
57
|
+
category_id=request.value("path", "category_id", TypeAdapter[str](str)),
|
|
58
|
+
)
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
"""Generated typed REST endpoint; regenerate rather than editing."""
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
5
|
+
from http import HTTPStatus
|
|
6
|
+
|
|
7
|
+
from pydantic import TypeAdapter
|
|
8
|
+
|
|
9
|
+
from ynab_api_cli.generated.models.error_response import ErrorResponse
|
|
10
|
+
from ynab_api_cli.generated.models.patch_category_wrapper import PatchCategoryWrapper
|
|
11
|
+
from ynab_api_cli.generated.models.save_category_response import SaveCategoryResponse
|
|
12
|
+
from ynab_api_cli.transport import Transport
|
|
13
|
+
from ynab_api_cli.types import RequestValues, Response
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
class Endpoint:
|
|
17
|
+
"""Typed updateCategory operation."""
|
|
18
|
+
|
|
19
|
+
@classmethod
|
|
20
|
+
def execute(
|
|
21
|
+
cls,
|
|
22
|
+
*,
|
|
23
|
+
transport: Transport,
|
|
24
|
+
plan_id: str,
|
|
25
|
+
category_id: str,
|
|
26
|
+
body: PatchCategoryWrapper,
|
|
27
|
+
) -> Response[ErrorResponse | SaveCategoryResponse]:
|
|
28
|
+
"""Execute the typed request and retain its original response JSON."""
|
|
29
|
+
raw = transport.send(
|
|
30
|
+
"updateCategory",
|
|
31
|
+
RequestValues(
|
|
32
|
+
path={
|
|
33
|
+
"plan_id": plan_id,
|
|
34
|
+
"category_id": category_id,
|
|
35
|
+
},
|
|
36
|
+
query={},
|
|
37
|
+
body=body,
|
|
38
|
+
),
|
|
39
|
+
)
|
|
40
|
+
if raw.status == HTTPStatus.OK:
|
|
41
|
+
parsed = SaveCategoryResponse.model_validate(raw.raw)
|
|
42
|
+
return Response(raw.status, raw.raw, raw.headers, parsed)
|
|
43
|
+
raise ValueError("Validated response has no generated success binding.")
|
|
44
|
+
|
|
45
|
+
@classmethod
|
|
46
|
+
def dispatch(
|
|
47
|
+
cls, transport: Transport, request: RequestValues
|
|
48
|
+
) -> Response[ErrorResponse | SaveCategoryResponse]:
|
|
49
|
+
"""Convert validated CLI inputs and call the explicitly typed method."""
|
|
50
|
+
return cls.execute(
|
|
51
|
+
transport=transport,
|
|
52
|
+
plan_id=request.value("path", "plan_id", TypeAdapter[str](str)),
|
|
53
|
+
category_id=request.value("path", "category_id", TypeAdapter[str](str)),
|
|
54
|
+
body=TypeAdapter[PatchCategoryWrapper](
|
|
55
|
+
PatchCategoryWrapper
|
|
56
|
+
).validate_python(request.body),
|
|
57
|
+
)
|