katalon-cli 0.1.7__tar.gz → 0.1.9__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.
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.3
2
2
  Name: katalon-cli
3
- Version: 0.1.7
3
+ Version: 0.1.9
4
4
  Summary: Installer & Updater CLI für Katalon Production-Instanzen
5
5
  Author: Karl Krägelin
6
6
  Author-email: Karl Krägelin <karlkraegelin@gmail.com>
@@ -30,6 +30,7 @@ uv tool install katalon-cli
30
30
  ```bash
31
31
  katalon install # interaktiver Setup-Wizard (Rich-Prompts + Progress)
32
32
  katalon start / stop / status
33
+ katalon check-updates # prüft nur, ob ein neues Release verfügbar ist
33
34
  katalon update # interaktives Update, Backup zuerst immer
34
35
  katalon rollback # letztes Backup einspielen
35
36
  katalon doctor # Docker, Diskspace, Ports prüfen
@@ -65,7 +66,7 @@ uv run pytest
65
66
  ## Architektur
66
67
 
67
68
  - `core/state.py` — `installation.json`, Single Source of Truth für laufende Version.
68
- - `core/release.py` — GitHub-Release-Metadaten (`katalon-release.json` Asset), 1h Cache. Enthält
69
+ - `core/release.py` — GitHub-Release-Metadaten (`katalon-release.json` Asset). Enthält
69
70
  optional `env_vars`/`deprecated_env_vars`: `install`/`update` ergänzen neue Pflichtvariablen
70
71
  automatisch (Secret generieren oder Default übernehmen), fragen bei fehlendem Default interaktiv
71
72
  nach (`--yes` bricht dann ab), tragen neue optionale Variablen auskommentiert in `.env` ein und
@@ -16,6 +16,7 @@ uv tool install katalon-cli
16
16
  ```bash
17
17
  katalon install # interaktiver Setup-Wizard (Rich-Prompts + Progress)
18
18
  katalon start / stop / status
19
+ katalon check-updates # prüft nur, ob ein neues Release verfügbar ist
19
20
  katalon update # interaktives Update, Backup zuerst immer
20
21
  katalon rollback # letztes Backup einspielen
21
22
  katalon doctor # Docker, Diskspace, Ports prüfen
@@ -51,7 +52,7 @@ uv run pytest
51
52
  ## Architektur
52
53
 
53
54
  - `core/state.py` — `installation.json`, Single Source of Truth für laufende Version.
54
- - `core/release.py` — GitHub-Release-Metadaten (`katalon-release.json` Asset), 1h Cache. Enthält
55
+ - `core/release.py` — GitHub-Release-Metadaten (`katalon-release.json` Asset). Enthält
55
56
  optional `env_vars`/`deprecated_env_vars`: `install`/`update` ergänzen neue Pflichtvariablen
56
57
  automatisch (Secret generieren oder Default übernehmen), fragen bei fehlendem Default interaktiv
57
58
  nach (`--yes` bricht dann ab), tragen neue optionale Variablen auskommentiert in `.env` ein und
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "katalon-cli"
3
- version = "0.1.7"
3
+ version = "0.1.9"
4
4
  description = "Installer & Updater CLI für Katalon Production-Instanzen"
5
5
  readme = "README.md"
6
6
  requires-python = ">=3.12"
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "katalon-cli"
3
- version = "0.1.7"
3
+ version = "0.1.9"
4
4
  description = "Installer & Updater CLI für Katalon Production-Instanzen"
5
5
  readme = "README.md"
6
6
  authors = [
@@ -2,16 +2,10 @@
2
2
 
3
3
  from __future__ import annotations
4
4
 
5
- import json
6
- import time
7
- from pathlib import Path
8
-
9
5
  import httpx
10
6
  from pydantic import BaseModel, Field
11
7
 
12
8
  GITHUB_REPO = "katalon-collections/katalon"
13
- CACHE_TTL_SECONDS = 3600
14
- CACHE_PATH = Path.home() / ".cache" / "katalon-cli" / "releases.json"
15
9
 
16
10
 
17
11
  class ReleaseRequirements(BaseModel):
@@ -69,6 +63,16 @@ def _fetch_release_asset(tag: str | None) -> dict:
69
63
  asset_resp.raise_for_status()
70
64
  return asset_resp.json()
71
65
 
66
+ def get_release_notes(tag: str) -> str:
67
+ """Lädt den Changelog-Text (Release-Body) für einen Tag."""
68
+ with httpx.Client(timeout=15) as client:
69
+ release = client.get(
70
+ f"https://api.github.com/repos/{GITHUB_REPO}/releases/tags/{tag}"
71
+ )
72
+ release.raise_for_status()
73
+ return release.json().get("body") or ""
74
+
75
+
72
76
  def _fetch_releases() -> list[dict]:
73
77
  """Lädt alle veröffentlichten Katalon-Releases."""
74
78
  releases: list[dict] = []
@@ -119,15 +123,8 @@ def get_releases_between(installed_version: str, target_version: str) -> list[Re
119
123
  ]
120
124
 
121
125
 
122
- def get_latest_release(*, use_cache: bool = True) -> ReleaseMetadata:
123
- if use_cache and CACHE_PATH.exists():
124
- age = time.time() - CACHE_PATH.stat().st_mtime
125
- if age < CACHE_TTL_SECONDS:
126
- return ReleaseMetadata.model_validate_json(CACHE_PATH.read_text())
127
-
126
+ def get_latest_release() -> ReleaseMetadata:
128
127
  payload = _fetch_release_asset(tag=None)
129
- CACHE_PATH.parent.mkdir(parents=True, exist_ok=True)
130
- CACHE_PATH.write_text(json.dumps(payload))
131
128
  return ReleaseMetadata.model_validate(payload)
132
129
 
133
130
 
@@ -481,6 +481,23 @@ def doctor(dir: Path = typer.Option(DEFAULT_DIR, "--dir")):
481
481
  )
482
482
  docker.compose(dir, "ps")
483
483
 
484
+ @app.command()
485
+ def check_updates(dir: Path = typer.Option(DEFAULT_DIR, "--dir")):
486
+ """Prüft, ob eine neue Katalon-Version verfügbar ist."""
487
+ instance_dir_or_raise(dir)
488
+ state = InstallationState.load(dir)
489
+ try:
490
+ meta = release.get_latest_release()
491
+ except Exception as exc:
492
+ console.print(f"[red]✖ Release-Metadaten konnten nicht geladen werden: {exc}[/]")
493
+ raise typer.Exit(1) from exc
494
+
495
+ if meta.version == state.version:
496
+ console.print(f"[green]✔[/] Bereits auf aktueller Version {meta.version}.")
497
+ return
498
+ console.print(f"Update verfügbar: [bold]{state.version}[/] → [bold]{meta.version}[/]")
499
+
500
+
484
501
  @app.command()
485
502
  def update(
486
503
  dir: Path = typer.Option(DEFAULT_DIR, "--dir"),
@@ -576,6 +593,15 @@ def update(
576
593
  state.record(meta.version, meta.compose_revision, "update")
577
594
  state.save(dir)
578
595
  console.print(f"[green]✔[/] Update auf {meta.version} abgeschlossen.")
596
+
597
+ try:
598
+ notes = release.get_release_notes(f"v{meta.version}")
599
+ except Exception:
600
+ notes = ""
601
+ if notes:
602
+ console.rule("Changelog")
603
+ console.print(notes)
604
+
579
605
  _print_next_steps(dir, state.base_url)
580
606
 
581
607