kctl-api 0.5.4__tar.gz → 0.6.0__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (77) hide show
  1. {kctl_api-0.5.4 → kctl_api-0.6.0}/PKG-INFO +1 -1
  2. {kctl_api-0.5.4 → kctl_api-0.6.0}/pyproject.toml +1 -1
  3. {kctl_api-0.5.4 → kctl_api-0.6.0}/src/kctl_api/__init__.py +1 -1
  4. {kctl_api-0.5.4 → kctl_api-0.6.0}/src/kctl_api/cli.py +5 -1
  5. kctl_api-0.6.0/tests/test_standard.py +98 -0
  6. {kctl_api-0.5.4 → kctl_api-0.6.0}/.gitignore +0 -0
  7. {kctl_api-0.5.4 → kctl_api-0.6.0}/README.md +0 -0
  8. {kctl_api-0.5.4 → kctl_api-0.6.0}/skills/api-admin/SKILL.md +0 -0
  9. {kctl_api-0.5.4 → kctl_api-0.6.0}/src/kctl_api/__main__.py +0 -0
  10. {kctl_api-0.5.4 → kctl_api-0.6.0}/src/kctl_api/commands/__init__.py +0 -0
  11. {kctl_api-0.5.4 → kctl_api-0.6.0}/src/kctl_api/commands/ai.py +0 -0
  12. {kctl_api-0.5.4 → kctl_api-0.6.0}/src/kctl_api/commands/aliases.py +0 -0
  13. {kctl_api-0.5.4 → kctl_api-0.6.0}/src/kctl_api/commands/apps.py +0 -0
  14. {kctl_api-0.5.4 → kctl_api-0.6.0}/src/kctl_api/commands/auth.py +0 -0
  15. {kctl_api-0.5.4 → kctl_api-0.6.0}/src/kctl_api/commands/automation.py +0 -0
  16. {kctl_api-0.5.4 → kctl_api-0.6.0}/src/kctl_api/commands/build_cmd.py +0 -0
  17. {kctl_api-0.5.4 → kctl_api-0.6.0}/src/kctl_api/commands/clean.py +0 -0
  18. {kctl_api-0.5.4 → kctl_api-0.6.0}/src/kctl_api/commands/config_cmd.py +0 -0
  19. {kctl_api-0.5.4 → kctl_api-0.6.0}/src/kctl_api/commands/dashboard.py +0 -0
  20. {kctl_api-0.5.4 → kctl_api-0.6.0}/src/kctl_api/commands/db.py +0 -0
  21. {kctl_api-0.5.4 → kctl_api-0.6.0}/src/kctl_api/commands/deploy.py +0 -0
  22. {kctl_api-0.5.4 → kctl_api-0.6.0}/src/kctl_api/commands/deps.py +0 -0
  23. {kctl_api-0.5.4 → kctl_api-0.6.0}/src/kctl_api/commands/dev.py +0 -0
  24. {kctl_api-0.5.4 → kctl_api-0.6.0}/src/kctl_api/commands/docker_cmd.py +0 -0
  25. {kctl_api-0.5.4 → kctl_api-0.6.0}/src/kctl_api/commands/doctor_cmd.py +0 -0
  26. {kctl_api-0.5.4 → kctl_api-0.6.0}/src/kctl_api/commands/env.py +0 -0
  27. {kctl_api-0.5.4 → kctl_api-0.6.0}/src/kctl_api/commands/files.py +0 -0
  28. {kctl_api-0.5.4 → kctl_api-0.6.0}/src/kctl_api/commands/fmt_cmd.py +0 -0
  29. {kctl_api-0.5.4 → kctl_api-0.6.0}/src/kctl_api/commands/health.py +0 -0
  30. {kctl_api-0.5.4 → kctl_api-0.6.0}/src/kctl_api/commands/jobs.py +0 -0
  31. {kctl_api-0.5.4 → kctl_api-0.6.0}/src/kctl_api/commands/lint_cmd.py +0 -0
  32. {kctl_api-0.5.4 → kctl_api-0.6.0}/src/kctl_api/commands/logs.py +0 -0
  33. {kctl_api-0.5.4 → kctl_api-0.6.0}/src/kctl_api/commands/marketplace.py +0 -0
  34. {kctl_api-0.5.4 → kctl_api-0.6.0}/src/kctl_api/commands/monitor_cmd.py +0 -0
  35. {kctl_api-0.5.4 → kctl_api-0.6.0}/src/kctl_api/commands/notifications.py +0 -0
  36. {kctl_api-0.5.4 → kctl_api-0.6.0}/src/kctl_api/commands/odoo_proxy.py +0 -0
  37. {kctl_api-0.5.4 → kctl_api-0.6.0}/src/kctl_api/commands/openapi.py +0 -0
  38. {kctl_api-0.5.4 → kctl_api-0.6.0}/src/kctl_api/commands/perf.py +0 -0
  39. {kctl_api-0.5.4 → kctl_api-0.6.0}/src/kctl_api/commands/rate_limit.py +0 -0
  40. {kctl_api-0.5.4 → kctl_api-0.6.0}/src/kctl_api/commands/realtime.py +0 -0
  41. {kctl_api-0.5.4 → kctl_api-0.6.0}/src/kctl_api/commands/redis_cmd.py +0 -0
  42. {kctl_api-0.5.4 → kctl_api-0.6.0}/src/kctl_api/commands/routes_cmd.py +0 -0
  43. {kctl_api-0.5.4 → kctl_api-0.6.0}/src/kctl_api/commands/saas.py +0 -0
  44. {kctl_api-0.5.4 → kctl_api-0.6.0}/src/kctl_api/commands/scaffold.py +0 -0
  45. {kctl_api-0.5.4 → kctl_api-0.6.0}/src/kctl_api/commands/security_cmd.py +0 -0
  46. {kctl_api-0.5.4 → kctl_api-0.6.0}/src/kctl_api/commands/services.py +0 -0
  47. {kctl_api-0.5.4 → kctl_api-0.6.0}/src/kctl_api/commands/shell.py +0 -0
  48. {kctl_api-0.5.4 → kctl_api-0.6.0}/src/kctl_api/commands/skill_cmd.py +0 -0
  49. {kctl_api-0.5.4 → kctl_api-0.6.0}/src/kctl_api/commands/streams.py +0 -0
  50. {kctl_api-0.5.4 → kctl_api-0.6.0}/src/kctl_api/commands/stripe_cmd.py +0 -0
  51. {kctl_api-0.5.4 → kctl_api-0.6.0}/src/kctl_api/commands/tenant_ai.py +0 -0
  52. {kctl_api-0.5.4 → kctl_api-0.6.0}/src/kctl_api/commands/test_cmd.py +0 -0
  53. {kctl_api-0.5.4 → kctl_api-0.6.0}/src/kctl_api/commands/users.py +0 -0
  54. {kctl_api-0.5.4 → kctl_api-0.6.0}/src/kctl_api/commands/webhooks.py +0 -0
  55. {kctl_api-0.5.4 → kctl_api-0.6.0}/src/kctl_api/commands/workflows.py +0 -0
  56. {kctl_api-0.5.4 → kctl_api-0.6.0}/src/kctl_api/commands/ws.py +0 -0
  57. {kctl_api-0.5.4 → kctl_api-0.6.0}/src/kctl_api/core/__init__.py +0 -0
  58. {kctl_api-0.5.4 → kctl_api-0.6.0}/src/kctl_api/core/async_client.py +0 -0
  59. {kctl_api-0.5.4 → kctl_api-0.6.0}/src/kctl_api/core/callbacks.py +0 -0
  60. {kctl_api-0.5.4 → kctl_api-0.6.0}/src/kctl_api/core/client.py +0 -0
  61. {kctl_api-0.5.4 → kctl_api-0.6.0}/src/kctl_api/core/config.py +0 -0
  62. {kctl_api-0.5.4 → kctl_api-0.6.0}/src/kctl_api/core/db.py +0 -0
  63. {kctl_api-0.5.4 → kctl_api-0.6.0}/src/kctl_api/core/exceptions.py +0 -0
  64. {kctl_api-0.5.4 → kctl_api-0.6.0}/src/kctl_api/core/output.py +0 -0
  65. {kctl_api-0.5.4 → kctl_api-0.6.0}/src/kctl_api/core/plugins.py +0 -0
  66. {kctl_api-0.5.4 → kctl_api-0.6.0}/src/kctl_api/core/redis.py +0 -0
  67. {kctl_api-0.5.4 → kctl_api-0.6.0}/src/kctl_api/core/resolve.py +0 -0
  68. {kctl_api-0.5.4 → kctl_api-0.6.0}/src/kctl_api/core/utils.py +0 -0
  69. {kctl_api-0.5.4 → kctl_api-0.6.0}/tests/conftest.py +0 -0
  70. {kctl_api-0.5.4 → kctl_api-0.6.0}/tests/test_auth.py +0 -0
  71. {kctl_api-0.5.4 → kctl_api-0.6.0}/tests/test_cli.py +0 -0
  72. {kctl_api-0.5.4 → kctl_api-0.6.0}/tests/test_config_cmd.py +0 -0
  73. {kctl_api-0.5.4 → kctl_api-0.6.0}/tests/test_core.py +0 -0
  74. {kctl_api-0.5.4 → kctl_api-0.6.0}/tests/test_deploy.py +0 -0
  75. {kctl_api-0.5.4 → kctl_api-0.6.0}/tests/test_logs.py +0 -0
  76. {kctl_api-0.5.4 → kctl_api-0.6.0}/tests/test_smoke.py +0 -0
  77. {kctl_api-0.5.4 → kctl_api-0.6.0}/tests/test_users.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: kctl-api
3
- Version: 0.5.4
3
+ Version: 0.6.0
4
4
  Summary: Kodemeio API CLI - manage your FastAPI platform
5
5
  Author-email: Kodemeio <dev@kodeme.io>
6
6
  License-Expression: MIT
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
4
4
 
5
5
  [project]
6
6
  name = "kctl-api"
7
- version = "0.5.4"
7
+ version = "0.6.0"
8
8
  description = "Kodemeio API CLI - manage your FastAPI platform"
9
9
  license = "MIT"
10
10
  requires-python = ">=3.12"
@@ -1,3 +1,3 @@
1
1
  """kctl-api: Kodemeio API CLI."""
2
2
 
3
- __version__ = "0.5.4"
3
+ __version__ = "0.6.0"
@@ -5,7 +5,7 @@ from __future__ import annotations
5
5
  from typing import Annotated
6
6
 
7
7
  import typer
8
- from kctl_lib import KctlError, handle_cli_error
8
+ from kctl_lib import KctlError, cli_entrypoint, handle_cli_error, register_introspection_commands
9
9
  from kctl_lib.self_update import notify_if_outdated
10
10
  from kctl_lib.tui import add_tui_command
11
11
 
@@ -229,6 +229,10 @@ def completions(
229
229
  typer.echo(script)
230
230
 
231
231
 
232
+ # Wrap app so KctlError subclasses surface as clean user-facing messages.
233
+ app = cli_entrypoint(app)
234
+ register_introspection_commands(app)
235
+
232
236
  def _run() -> None:
233
237
  """Entry point with error handling."""
234
238
  try:
@@ -0,0 +1,98 @@
1
+ """Standard CLI smoke/config/completions tests for kctl-api."""
2
+
3
+ from __future__ import annotations
4
+
5
+ import pytest
6
+ from typer.testing import CliRunner
7
+
8
+ from kctl_api.cli import app
9
+
10
+ runner = CliRunner()
11
+
12
+
13
+ @pytest.fixture(autouse=True)
14
+ def _isolate(tmp_path, monkeypatch):
15
+ config_dir = tmp_path / "config"
16
+ config_dir.mkdir()
17
+ config_file = config_dir / "config.yaml"
18
+ monkeypatch.setattr("kctl_lib.config.CONFIG_DIR", config_dir, raising=False)
19
+ monkeypatch.setattr("kctl_lib.config.CONFIG_FILE", config_file, raising=False)
20
+
21
+
22
+ class TestVersion:
23
+ def test_version_long(self) -> None:
24
+ result = runner.invoke(app, ["--version"])
25
+ assert result.exit_code == 0
26
+
27
+
28
+ class TestHelp:
29
+ def test_top_level_help(self) -> None:
30
+ result = runner.invoke(app, ["--help"])
31
+ assert result.exit_code == 0
32
+ assert "Usage:" in result.output
33
+
34
+ @pytest.mark.parametrize(
35
+ "group",
36
+ [
37
+ "ai",
38
+ "apps",
39
+ "auth",
40
+ "automation",
41
+ "build",
42
+ "config",
43
+ "dashboard",
44
+ "db",
45
+ "deploy",
46
+ "deps",
47
+ "dev",
48
+ "docker",
49
+ "doctor",
50
+ "env",
51
+ "files",
52
+ "health",
53
+ "jobs",
54
+ "logs",
55
+ "marketplace",
56
+ "monitor",
57
+ "notifications",
58
+ "odoo",
59
+ "openapi",
60
+ "perf",
61
+ "rate-limit",
62
+ "realtime",
63
+ "redis",
64
+ "routes",
65
+ "saas",
66
+ "scaffold",
67
+ "security",
68
+ "services",
69
+ "streams",
70
+ "stripe",
71
+ "tenant-ai",
72
+ "test",
73
+ "users",
74
+ "webhooks",
75
+ "workflows",
76
+ "ws",
77
+ ],
78
+ )
79
+ def test_group_help(self, group: str) -> None:
80
+ result = runner.invoke(app, [group, "--help"])
81
+ assert result.exit_code == 0, result.output
82
+
83
+
84
+ class TestConfigSubcommands:
85
+ def test_config_help(self) -> None:
86
+ result = runner.invoke(app, ["config", "--help"])
87
+ assert result.exit_code == 0
88
+
89
+ def test_config_show(self) -> None:
90
+ result = runner.invoke(app, ["config", "show"])
91
+ assert result.exit_code in (0, 1, 2)
92
+
93
+
94
+ class TestCompletions:
95
+ @pytest.mark.parametrize("shell", ["bash", "zsh", "fish"])
96
+ def test_completions(self, shell: str) -> None:
97
+ result = runner.invoke(app, ["completions", shell])
98
+ assert result.exit_code == 0, result.output
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