sysnet-pyutils 1.7.12__tar.gz → 1.8.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.
- {sysnet_pyutils-1.7.12/sysnet_pyutils.egg-info → sysnet_pyutils-1.8.0}/PKG-INFO +34 -5
- {sysnet_pyutils-1.7.12 → sysnet_pyutils-1.8.0}/README.md +33 -4
- {sysnet_pyutils-1.7.12 → sysnet_pyutils-1.8.0}/pyproject.toml +1 -1
- {sysnet_pyutils-1.7.12 → sysnet_pyutils-1.8.0}/sysnet_pyutils/__init__.py +2 -0
- {sysnet_pyutils-1.7.12 → sysnet_pyutils-1.8.0}/sysnet_pyutils/utils.py +564 -13
- {sysnet_pyutils-1.7.12 → sysnet_pyutils-1.8.0/sysnet_pyutils.egg-info}/PKG-INFO +34 -5
- {sysnet_pyutils-1.7.12 → sysnet_pyutils-1.8.0}/sysnet_pyutils.egg-info/SOURCES.txt +2 -0
- sysnet_pyutils-1.8.0/tests/test_config_secrets.py +282 -0
- sysnet_pyutils-1.8.0/tests/test_config_store.py +834 -0
- {sysnet_pyutils-1.7.12 → sysnet_pyutils-1.8.0}/tests/test_utils_missing_branches.py +3 -3
- {sysnet_pyutils-1.7.12 → sysnet_pyutils-1.8.0}/LICENSE +0 -0
- {sysnet_pyutils-1.7.12 → sysnet_pyutils-1.8.0}/setup.cfg +0 -0
- {sysnet_pyutils-1.7.12 → sysnet_pyutils-1.8.0}/sysnet_pyutils/barcode.py +0 -0
- {sysnet_pyutils-1.7.12 → sysnet_pyutils-1.8.0}/sysnet_pyutils/constants.py +0 -0
- {sysnet_pyutils-1.7.12 → sysnet_pyutils-1.8.0}/sysnet_pyutils/cron_utils/__init__.py +0 -0
- {sysnet_pyutils-1.7.12 → sysnet_pyutils-1.8.0}/sysnet_pyutils/cron_utils/validation.py +0 -0
- {sysnet_pyutils-1.7.12 → sysnet_pyutils-1.8.0}/sysnet_pyutils/data_utils.py +0 -0
- {sysnet_pyutils-1.7.12 → sysnet_pyutils-1.8.0}/sysnet_pyutils/domino.py +0 -0
- {sysnet_pyutils-1.7.12 → sysnet_pyutils-1.8.0}/sysnet_pyutils/geo.py +0 -0
- {sysnet_pyutils-1.7.12 → sysnet_pyutils-1.8.0}/sysnet_pyutils/globalmodel/__init__.py +0 -0
- {sysnet_pyutils-1.7.12 → sysnet_pyutils-1.8.0}/sysnet_pyutils/globalmodel/global_model.py +0 -0
- {sysnet_pyutils-1.7.12 → sysnet_pyutils-1.8.0}/sysnet_pyutils/globalmodel/models.py +0 -0
- {sysnet_pyutils-1.7.12 → sysnet_pyutils-1.8.0}/sysnet_pyutils/globalmodel/timeutils.py +0 -0
- {sysnet_pyutils-1.7.12 → sysnet_pyutils-1.8.0}/sysnet_pyutils/ident.py +0 -0
- {sysnet_pyutils-1.7.12 → sysnet_pyutils-1.8.0}/sysnet_pyutils/log.py +0 -0
- {sysnet_pyutils-1.7.12 → sysnet_pyutils-1.8.0}/sysnet_pyutils/models/__init__.py +0 -0
- {sysnet_pyutils-1.7.12 → sysnet_pyutils-1.8.0}/sysnet_pyutils/models/general.py +0 -0
- {sysnet_pyutils-1.7.12 → sysnet_pyutils-1.8.0}/sysnet_pyutils/ses.py +0 -0
- {sysnet_pyutils-1.7.12 → sysnet_pyutils-1.8.0}/sysnet_pyutils/syslog/__init__.py +0 -0
- {sysnet_pyutils-1.7.12 → sysnet_pyutils-1.8.0}/sysnet_pyutils/syslog/factory.py +0 -0
- {sysnet_pyutils-1.7.12 → sysnet_pyutils-1.8.0}/sysnet_pyutils/tools.py +0 -0
- {sysnet_pyutils-1.7.12 → sysnet_pyutils-1.8.0}/sysnet_pyutils.egg-info/dependency_links.txt +0 -0
- {sysnet_pyutils-1.7.12 → sysnet_pyutils-1.8.0}/sysnet_pyutils.egg-info/not-zip-safe +0 -0
- {sysnet_pyutils-1.7.12 → sysnet_pyutils-1.8.0}/sysnet_pyutils.egg-info/requires.txt +0 -0
- {sysnet_pyutils-1.7.12 → sysnet_pyutils-1.8.0}/sysnet_pyutils.egg-info/top_level.txt +0 -0
- {sysnet_pyutils-1.7.12 → sysnet_pyutils-1.8.0}/tests/test_cron_utils.py +0 -0
- {sysnet_pyutils-1.7.12 → sysnet_pyutils-1.8.0}/tests/test_cron_validation_edge.py +0 -0
- {sysnet_pyutils-1.7.12 → sysnet_pyutils-1.8.0}/tests/test_data_utils.py +0 -0
- {sysnet_pyutils-1.7.12 → sysnet_pyutils-1.8.0}/tests/test_data_utils_datetime.py +0 -0
- {sysnet_pyutils-1.7.12 → sysnet_pyutils-1.8.0}/tests/test_data_utils_edge.py +0 -0
- {sysnet_pyutils-1.7.12 → sysnet_pyutils-1.8.0}/tests/test_data_utils_missing_branches.py +0 -0
- {sysnet_pyutils-1.7.12 → sysnet_pyutils-1.8.0}/tests/test_domino.py +0 -0
- {sysnet_pyutils-1.7.12 → sysnet_pyutils-1.8.0}/tests/test_domino_edge.py +0 -0
- {sysnet_pyutils-1.7.12 → sysnet_pyutils-1.8.0}/tests/test_geo.py +0 -0
- {sysnet_pyutils-1.7.12 → sysnet_pyutils-1.8.0}/tests/test_global_model_recursive.py +0 -0
- {sysnet_pyutils-1.7.12 → sysnet_pyutils-1.8.0}/tests/test_global_model_timezone.py +0 -0
- {sysnet_pyutils-1.7.12 → sysnet_pyutils-1.8.0}/tests/test_ident_barcode.py +0 -0
- {sysnet_pyutils-1.7.12 → sysnet_pyutils-1.8.0}/tests/test_log_importerror_branch.py +0 -0
- {sysnet_pyutils-1.7.12 → sysnet_pyutils-1.8.0}/tests/test_log_mongo.py +0 -0
- {sysnet_pyutils-1.7.12 → sysnet_pyutils-1.8.0}/tests/test_models_contact.py +0 -0
- {sysnet_pyutils-1.7.12 → sysnet_pyutils-1.8.0}/tests/test_models_general.py +0 -0
- {sysnet_pyutils-1.7.12 → sysnet_pyutils-1.8.0}/tests/test_models_general_edge.py +0 -0
- {sysnet_pyutils-1.7.12 → sysnet_pyutils-1.8.0}/tests/test_package_init_version.py +0 -0
- {sysnet_pyutils-1.7.12 → sysnet_pyutils-1.8.0}/tests/test_recursive_update.py +0 -0
- {sysnet_pyutils-1.7.12 → sysnet_pyutils-1.8.0}/tests/test_ses.py +0 -0
- {sysnet_pyutils-1.7.12 → sysnet_pyutils-1.8.0}/tests/test_ses_importerror_branch.py +0 -0
- {sysnet_pyutils-1.7.12 → sysnet_pyutils-1.8.0}/tests/test_syslog_factory.py +0 -0
- {sysnet_pyutils-1.7.12 → sysnet_pyutils-1.8.0}/tests/test_tools.py +0 -0
- {sysnet_pyutils-1.7.12 → sysnet_pyutils-1.8.0}/tests/test_utils.py +0 -0
- {sysnet_pyutils-1.7.12 → sysnet_pyutils-1.8.0}/tests/test_utils_edge.py +0 -0
- {sysnet_pyutils-1.7.12 → sysnet_pyutils-1.8.0}/tests/test_utils_log_base64.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: sysnet-pyutils
|
|
3
|
-
Version: 1.
|
|
3
|
+
Version: 1.8.0
|
|
4
4
|
Summary: SYSNET Python Utilities - kompletní sada nástrojů pro Python aplikace
|
|
5
5
|
Author-email: Data Developer <info@sysnet.cz>
|
|
6
6
|
Maintainer-email: SYSNET Development Team <info@sysnet.cz>
|
|
@@ -729,7 +729,7 @@ Knihovna obsahuje základní, v aplikacích hojně používané, utility pro Pyt
|
|
|
729
729
|
|
|
730
730
|
[](https://www.python.org/downloads/)
|
|
731
731
|
[](LICENSE)
|
|
732
|
-
[](https://pypi.org/project/sysnet-pyutils/1.8.0/)
|
|
733
733
|
[](https://github.com/SYSNET-CZ/pyutils/actions/workflows/ci.yml)
|
|
734
734
|
[](tests/)
|
|
735
735
|
|
|
@@ -866,6 +866,26 @@ if config.loaded:
|
|
|
866
866
|
db_url = config.config['database']
|
|
867
867
|
```
|
|
868
868
|
|
|
869
|
+
Chování `Config`:
|
|
870
|
+
|
|
871
|
+
- **Soubor:** ukládá se atomicky (dočasný soubor + přejmenování), čitelně (diakritika bez `\u` escape) a v pořadí klíčů z paměti. Nový soubor má práva 600 a chybějící adresáře
|
|
872
|
+
se vytvoří s právy 700; práva existujícího souboru se nemění a volnější než 600 se při načtení zalogují jako varování.
|
|
873
|
+
- **Výchozí cesta:** nezadáte-li `config_path`, použije se proměnná prostředí `PYUTILS_CONFIG_PATH`. Bez ní platí dosavadní
|
|
874
|
+
umístění `conf/config.yml` vedle modulu (s varováním); není-li zapisovatelné, vyhodí se `ConfigError` s radou.
|
|
875
|
+
- **Chyby:** poškozený YAML vyhodí `ConfigParseError` (podtřída `ConfigError` i `yaml.YAMLError`) s cestou, popisem a
|
|
876
|
+
řádkem, nikdy s obsahem souboru; soubor zůstane nepřepsaný.
|
|
877
|
+
- **Nové výchozí hodnoty:** s existujícím souborem se `config_dict` ignoruje. Chcete-li po upgradu aplikace doplnit chybějící
|
|
878
|
+
klíče, použijte `Config(config_path=..., config_dict=..., merge_defaults=True)`: doplní se jen to, co v souboru chybí
|
|
879
|
+
(vnořené slovníky do hloubky, seznamy ne) a hodnoty ze souboru se nikdy nepřepíšou.
|
|
880
|
+
- **Secrets:** hodnotu v YAML lze zadat odkazem `${env:NAZEV}` nebo `${file:/absolutni/cesta}` (i uvnitř textu, např.
|
|
881
|
+
`mongodb://u:${env:MONGO_PASSWORD}@h`); rozliší se při načtení na `Secret` (podtřída `str`, `repr` a log maskované,
|
|
882
|
+
`reveal()` vrací čistý `str`). Chybějící zdroj je `ConfigError`, nikdy tichý prázdný řetězec. `store()` zapisuje
|
|
883
|
+
zpět odkaz, nikdy hodnotu. `config.redacted()` vrací kopii pro health a debug, `config.audit()` cesty k heslům
|
|
884
|
+
v otevřené podobě. Doslovné `${` zapište jako `$${`. Viz `docs/adr/0001-config-secrets.md`.
|
|
885
|
+
- **Vstup:** `config_dict` se při inicializaci zkopíruje; pozdější změny `config` neovlivní slovník volajícího a naopak.
|
|
886
|
+
- **Opakované volání:** `Config(...)` vrací stále tutéž instanci; odlišná cesta nebo `config_dict` se ignoruje a zaloguje
|
|
887
|
+
se varování.
|
|
888
|
+
|
|
869
889
|
#### Context a autentizace
|
|
870
890
|
|
|
871
891
|
```python
|
|
@@ -1355,12 +1375,12 @@ token nepatří do zdrojového kódu.
|
|
|
1355
1375
|
|
|
1356
1376
|
#### Vydání nové verze
|
|
1357
1377
|
|
|
1358
|
-
1. Změňte `version` v `pyproject.toml` (například na `1.
|
|
1378
|
+
1. Změňte `version` v `pyproject.toml` (například na `1.8.0`) a aktualizujte dokumentaci včetně changelogu a badge.
|
|
1359
1379
|
2. Commitněte změny a dostaňte je na `main`; před vytvořením tagu ověřte úspěšné CI a správný release commit.
|
|
1360
1380
|
3. Na tomto commitu vytvořte a odešlete odpovídající tag:
|
|
1361
1381
|
|
|
1362
1382
|
```bash
|
|
1363
|
-
git tag v1.
|
|
1383
|
+
git tag v1.8.0 && git push origin v1.8.0
|
|
1364
1384
|
```
|
|
1365
1385
|
|
|
1366
1386
|
4. GitHub Actions automaticky provedou kontroly, build a publikaci.
|
|
@@ -1389,6 +1409,15 @@ při běžném vydání již lokálně nic nenahrávejte na PyPI.
|
|
|
1389
1409
|
|
|
1390
1410
|
Podrobnosti nových změn jsou v [CHANGELOG.md](CHANGELOG.md).
|
|
1391
1411
|
|
|
1412
|
+
### Verze 1.8.0 (2026-10-27)
|
|
1413
|
+
|
|
1414
|
+
- 🔐 `Config`: ochrana secrets. Hodnotu v YAML lze zadat odkazem `${env:NAZEV}` nebo `${file:/absolutni/cesta}`; rozlišuje se při načtení na nový typ `Secret` (maskovaný `repr`, `str` a log), `store()` zapisuje zpět odkaz, nikdy hodnotu. Nově `Config.redacted()` a `Config.audit()`. Viz `docs/adr/0001-config-secrets.md`.
|
|
1415
|
+
- 💾 `Config.store()` a `replace()` zapisují atomicky (dočasný soubor + přejmenování); nový soubor má práva 600, chybějící adresáře se vytvoří s právy 700.
|
|
1416
|
+
- ⚠️ `Config` bez `config_dict` má `config == {}` místo `None` a nezapisuje `null`; `config_dict` se při inicializaci kopíruje; YAML se ukládá čitelně (diakritika) a v pořadí klíčů z paměti. První `store()` po upgradu přepíše soubor v novém formátu.
|
|
1417
|
+
- ✅ `ConfigParseError` pro poškozený YAML (i `yaml.YAMLError`), výchozí cesta z `PYUTILS_CONFIG_PATH`, opt-in `merge_defaults=True`, varování při ignorovaných parametrech opakovaného `Config(...)`.
|
|
1418
|
+
|
|
1419
|
+
Podrobnosti a dopady na stávající aplikace jsou v [CHANGELOG.md](CHANGELOG.md).
|
|
1420
|
+
|
|
1392
1421
|
### Verze 1.7.12 (2026-10-27)
|
|
1393
1422
|
|
|
1394
1423
|
- ✅ GitHub Actions CI/CD: kontrola syntaxe, pytest a ruff při push/PR na `main`; ověření verze, testy, build a publikace na PyPI při tagu `v*`.
|
|
@@ -1526,6 +1555,6 @@ Tento projekt je licencován pod MIT licencí — viz [LICENSE](LICENSE) soubor.
|
|
|
1526
1555
|
|
|
1527
1556
|
**Vytvořeno s ❤️ týmem SYSNET**
|
|
1528
1557
|
|
|
1529
|
-
*Verze: 1.
|
|
1558
|
+
*Verze: 1.8.0*
|
|
1530
1559
|
|
|
1531
1560
|
*Datum: 2026-10-27*
|
|
@@ -6,7 +6,7 @@ Knihovna obsahuje základní, v aplikacích hojně používané, utility pro Pyt
|
|
|
6
6
|
|
|
7
7
|
[](https://www.python.org/downloads/)
|
|
8
8
|
[](LICENSE)
|
|
9
|
-
[](https://pypi.org/project/sysnet-pyutils/1.8.0/)
|
|
10
10
|
[](https://github.com/SYSNET-CZ/pyutils/actions/workflows/ci.yml)
|
|
11
11
|
[](tests/)
|
|
12
12
|
|
|
@@ -143,6 +143,26 @@ if config.loaded:
|
|
|
143
143
|
db_url = config.config['database']
|
|
144
144
|
```
|
|
145
145
|
|
|
146
|
+
Chování `Config`:
|
|
147
|
+
|
|
148
|
+
- **Soubor:** ukládá se atomicky (dočasný soubor + přejmenování), čitelně (diakritika bez `\u` escape) a v pořadí klíčů z paměti. Nový soubor má práva 600 a chybějící adresáře
|
|
149
|
+
se vytvoří s právy 700; práva existujícího souboru se nemění a volnější než 600 se při načtení zalogují jako varování.
|
|
150
|
+
- **Výchozí cesta:** nezadáte-li `config_path`, použije se proměnná prostředí `PYUTILS_CONFIG_PATH`. Bez ní platí dosavadní
|
|
151
|
+
umístění `conf/config.yml` vedle modulu (s varováním); není-li zapisovatelné, vyhodí se `ConfigError` s radou.
|
|
152
|
+
- **Chyby:** poškozený YAML vyhodí `ConfigParseError` (podtřída `ConfigError` i `yaml.YAMLError`) s cestou, popisem a
|
|
153
|
+
řádkem, nikdy s obsahem souboru; soubor zůstane nepřepsaný.
|
|
154
|
+
- **Nové výchozí hodnoty:** s existujícím souborem se `config_dict` ignoruje. Chcete-li po upgradu aplikace doplnit chybějící
|
|
155
|
+
klíče, použijte `Config(config_path=..., config_dict=..., merge_defaults=True)`: doplní se jen to, co v souboru chybí
|
|
156
|
+
(vnořené slovníky do hloubky, seznamy ne) a hodnoty ze souboru se nikdy nepřepíšou.
|
|
157
|
+
- **Secrets:** hodnotu v YAML lze zadat odkazem `${env:NAZEV}` nebo `${file:/absolutni/cesta}` (i uvnitř textu, např.
|
|
158
|
+
`mongodb://u:${env:MONGO_PASSWORD}@h`); rozliší se při načtení na `Secret` (podtřída `str`, `repr` a log maskované,
|
|
159
|
+
`reveal()` vrací čistý `str`). Chybějící zdroj je `ConfigError`, nikdy tichý prázdný řetězec. `store()` zapisuje
|
|
160
|
+
zpět odkaz, nikdy hodnotu. `config.redacted()` vrací kopii pro health a debug, `config.audit()` cesty k heslům
|
|
161
|
+
v otevřené podobě. Doslovné `${` zapište jako `$${`. Viz `docs/adr/0001-config-secrets.md`.
|
|
162
|
+
- **Vstup:** `config_dict` se při inicializaci zkopíruje; pozdější změny `config` neovlivní slovník volajícího a naopak.
|
|
163
|
+
- **Opakované volání:** `Config(...)` vrací stále tutéž instanci; odlišná cesta nebo `config_dict` se ignoruje a zaloguje
|
|
164
|
+
se varování.
|
|
165
|
+
|
|
146
166
|
#### Context a autentizace
|
|
147
167
|
|
|
148
168
|
```python
|
|
@@ -632,12 +652,12 @@ token nepatří do zdrojového kódu.
|
|
|
632
652
|
|
|
633
653
|
#### Vydání nové verze
|
|
634
654
|
|
|
635
|
-
1. Změňte `version` v `pyproject.toml` (například na `1.
|
|
655
|
+
1. Změňte `version` v `pyproject.toml` (například na `1.8.0`) a aktualizujte dokumentaci včetně changelogu a badge.
|
|
636
656
|
2. Commitněte změny a dostaňte je na `main`; před vytvořením tagu ověřte úspěšné CI a správný release commit.
|
|
637
657
|
3. Na tomto commitu vytvořte a odešlete odpovídající tag:
|
|
638
658
|
|
|
639
659
|
```bash
|
|
640
|
-
git tag v1.
|
|
660
|
+
git tag v1.8.0 && git push origin v1.8.0
|
|
641
661
|
```
|
|
642
662
|
|
|
643
663
|
4. GitHub Actions automaticky provedou kontroly, build a publikaci.
|
|
@@ -666,6 +686,15 @@ při běžném vydání již lokálně nic nenahrávejte na PyPI.
|
|
|
666
686
|
|
|
667
687
|
Podrobnosti nových změn jsou v [CHANGELOG.md](CHANGELOG.md).
|
|
668
688
|
|
|
689
|
+
### Verze 1.8.0 (2026-10-27)
|
|
690
|
+
|
|
691
|
+
- 🔐 `Config`: ochrana secrets. Hodnotu v YAML lze zadat odkazem `${env:NAZEV}` nebo `${file:/absolutni/cesta}`; rozlišuje se při načtení na nový typ `Secret` (maskovaný `repr`, `str` a log), `store()` zapisuje zpět odkaz, nikdy hodnotu. Nově `Config.redacted()` a `Config.audit()`. Viz `docs/adr/0001-config-secrets.md`.
|
|
692
|
+
- 💾 `Config.store()` a `replace()` zapisují atomicky (dočasný soubor + přejmenování); nový soubor má práva 600, chybějící adresáře se vytvoří s právy 700.
|
|
693
|
+
- ⚠️ `Config` bez `config_dict` má `config == {}` místo `None` a nezapisuje `null`; `config_dict` se při inicializaci kopíruje; YAML se ukládá čitelně (diakritika) a v pořadí klíčů z paměti. První `store()` po upgradu přepíše soubor v novém formátu.
|
|
694
|
+
- ✅ `ConfigParseError` pro poškozený YAML (i `yaml.YAMLError`), výchozí cesta z `PYUTILS_CONFIG_PATH`, opt-in `merge_defaults=True`, varování při ignorovaných parametrech opakovaného `Config(...)`.
|
|
695
|
+
|
|
696
|
+
Podrobnosti a dopady na stávající aplikace jsou v [CHANGELOG.md](CHANGELOG.md).
|
|
697
|
+
|
|
669
698
|
### Verze 1.7.12 (2026-10-27)
|
|
670
699
|
|
|
671
700
|
- ✅ GitHub Actions CI/CD: kontrola syntaxe, pytest a ruff při push/PR na `main`; ověření verze, testy, build a publikace na PyPI při tagu `v*`.
|
|
@@ -803,6 +832,6 @@ Tento projekt je licencován pod MIT licencí — viz [LICENSE](LICENSE) soubor.
|
|
|
803
832
|
|
|
804
833
|
**Vytvořeno s ❤️ týmem SYSNET**
|
|
805
834
|
|
|
806
|
-
*Verze: 1.
|
|
835
|
+
*Verze: 1.8.0*
|
|
807
836
|
|
|
808
837
|
*Datum: 2026-10-27*
|
|
@@ -123,9 +123,11 @@ from sysnet_pyutils.utils import ( # API klíče; Konverze; Hashe; Base64; Vali
|
|
|
123
123
|
Config,
|
|
124
124
|
ConfigError,
|
|
125
125
|
ConfigFlag,
|
|
126
|
+
ConfigParseError,
|
|
126
127
|
Context,
|
|
127
128
|
Log,
|
|
128
129
|
LoggedObject,
|
|
130
|
+
Secret,
|
|
129
131
|
Singleton,
|
|
130
132
|
api_key_generate,
|
|
131
133
|
api_key_next,
|