Skip to content

Commit 93f04f4

Browse files
authored
Merge pull request #36 from smekcio/fix/optional-cli-bootstrap
fix(cli): bootstrap optional CLI dependencies
2 parents 9216daf + 74a3b85 commit 93f04f4

34 files changed

Lines changed: 358 additions & 35 deletions

.github/workflows/publish-pypi.yml

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,10 @@ jobs:
6060
run: |
6161
python -m pytest --cov=ksef_client --cov-report=term-missing --cov-fail-under=100
6262
63+
- name: Check CLI packaging
64+
run: |
65+
python tools/check_cli_packaging.py
66+
6367
- name: Build
6468
run: |
6569
python -m build

.github/workflows/python-application.yml

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -60,11 +60,16 @@ jobs:
6060
run: |
6161
python -m pip install --upgrade pip
6262
python -m pip install -r requirements-dev.txt
63+
python -m pip install build
6364
6465
- name: Run tests
6566
run: |
6667
python -m pytest --cov=ksef_client --cov-fail-under=100 --cov-report=term-missing --cov-report=xml --cov-report=html
6768
69+
- name: Check CLI packaging
70+
run: |
71+
python tools/check_cli_packaging.py
72+
6873
- name: Upload coverage artifact
6974
uses: actions/upload-artifact@v4
7075
with:

README.md

Lines changed: 21 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,7 @@ Aktualna kompatybilność: **KSeF API `v2.3.0`** ([api-changelog.md](https://git
3939

4040
Wymagania: Python `>= 3.10`.
4141

42-
Podstawowe SDK:
42+
Podstawowe SDK (bez zależności CLI):
4343

4444
```bash
4545
pip install ksef-client
@@ -61,10 +61,19 @@ pip install "ksef-client[xml,qr,cli]"
6161
- `qr` - generowanie PNG z kodami QR przez `qrcode` i `pillow`
6262
- `cli` - interfejs wiersza poleceń oparty o `typer`, `rich`, `keyring`
6363

64+
Po podstawowej instalacji `pip install ksef-client` pakiet SDK jest gotowy do użycia, ale komenda `ksef`
65+
zwróci kontrolowany komunikat o brakujących zależnościach CLI. Aby uruchamiać CLI, doinstaluj extra `cli`.
66+
6467
## 🚀 Szybki start: CLI
6568

6669
CLI `ksef` zostało zaprojektowane tak, aby skrócić wejście w SDK do minimum.
6770

71+
Najpierw zainstaluj zależności CLI:
72+
73+
```bash
74+
pip install "ksef-client[cli]"
75+
```
76+
6877
1. Utwórz i aktywuj profil:
6978

7079
```bash
@@ -104,6 +113,17 @@ Najważniejsze grupy komend:
104113

105114
Pełna specyfikacja CLI: [`docs/cli/README.md`](docs/cli/README.md)
106115

116+
## 🛠️ Troubleshooting CLI
117+
118+
Jeśli po `pip install ksef-client` uruchomisz `ksef`, komenda nie zakończy się tracebackiem, tylko czytelną
119+
instrukcją doinstalowania CLI:
120+
121+
```text
122+
Install CLI dependencies with: pip install "ksef-client[cli]"
123+
```
124+
125+
To zachowanie jest celowe: bazowa instalacja obejmuje SDK, a CLI pozostaje opcjonalne.
126+
107127
## 🧩 Szybki start: SDK
108128

109129
Minimalny przebieg integracji:

docs/README.md

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,12 +22,16 @@ pip install -e .
2222
Opcjonalne dodatki (extras):
2323

2424
```bash
25-
pip install -e .[xml,qr]
25+
pip install -e .[cli,xml,qr]
2626
```
2727

28+
- `cli` – komenda `ksef` i zależności CLI (`typer`, `rich`, `keyring`)
2829
- `xml` – podpis XAdES (`lxml`, `xmlsec`)
2930
- `qr` – generowanie PNG z kodami QR (`qrcode`, `pillow`)
3031

32+
Jeżeli pracujesz tylko z API Pythona, `pip install -e .` wystarcza. Do pracy z CLI użyj `pip install -e .[cli]`
33+
albo pełnego zestawu extras.
34+
3135
## Struktura SDK
3236

3337
Biblioteka udostępnia dwa poziomy użycia:

docs/cli/README.md

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,7 @@ CLI ma skracac droge od instalacji do pierwszej realnej operacji KSeF:
3838
1. Instalacja:
3939

4040
```bash
41-
pip install -e .
41+
pip install -e .[cli]
4242
```
4343

4444
2. Inicjalizacja profilu:
@@ -63,6 +63,17 @@ ksef send online --invoice ./fa.xml --wait-upo --save-upo ./out/upo-online.xml
6363
ksef invoice download --ksef-number <KSEF_NUMBER> --out ./out/
6464
```
6565

66+
## Troubleshooting
67+
68+
Bazowa instalacja `pip install -e .` albo `pip install ksef-client` nie instaluje zależności CLI.
69+
W takim przypadku uruchomienie `ksef` kończy się kontrolowanym komunikatem:
70+
71+
```text
72+
Install CLI dependencies with: pip install "ksef-client[cli]"
73+
```
74+
75+
To zachowanie jest poprawne. Aby korzystać z CLI, doinstaluj extra `cli`.
76+
6677
## Drzewo komend
6778

6879
```text

pyproject.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,7 @@ Documentation = "https://github.com/smekcio/ksef-client-python/blob/main/docs/RE
4343
Issues = "https://github.com/smekcio/ksef-client-python/issues"
4444

4545
[project.scripts]
46-
ksef = "ksef_client.cli.app:app_entrypoint"
46+
ksef = "ksef_client.cli.bootstrap:app_entrypoint"
4747

4848
[tool.setuptools]
4949
package-dir = {"" = "src"}

requirements-dev.txt

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,7 @@
11
-r requirements.txt
2+
typer>=0.12.0
3+
rich>=13.7.0
4+
keyring>=25.0.0
25
pytest>=8.0.0
36
pytest-cov>=5.0.0
47
ruff>=0.6.0

requirements.txt

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,2 @@
11
httpx>=0.27.0
22
cryptography>=42.0.0
3-
typer>=0.12.0
4-
rich>=13.7.0
5-
keyring>=25.0.0

src/ksef_client/cli/__init__.py

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,15 @@
11
"""CLI package for ksef-client."""
22

3-
from .app import app, app_entrypoint
4-
53
__all__ = ["app", "app_entrypoint"]
4+
5+
6+
def __getattr__(name: str):
7+
if name == "app":
8+
from .bootstrap import get_app
9+
10+
return get_app()
11+
if name == "app_entrypoint":
12+
from .bootstrap import app_entrypoint
13+
14+
return app_entrypoint
15+
raise AttributeError(f"module {__name__!r} has no attribute {name!r}")

src/ksef_client/cli/__main__.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
from __future__ import annotations
22

3-
from .app import app_entrypoint
3+
from .bootstrap import app_entrypoint
44

55
if __name__ == "__main__":
66
app_entrypoint()

0 commit comments

Comments
 (0)