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.
Files changed (61) hide show
  1. {sysnet_pyutils-1.7.12/sysnet_pyutils.egg-info → sysnet_pyutils-1.8.0}/PKG-INFO +34 -5
  2. {sysnet_pyutils-1.7.12 → sysnet_pyutils-1.8.0}/README.md +33 -4
  3. {sysnet_pyutils-1.7.12 → sysnet_pyutils-1.8.0}/pyproject.toml +1 -1
  4. {sysnet_pyutils-1.7.12 → sysnet_pyutils-1.8.0}/sysnet_pyutils/__init__.py +2 -0
  5. {sysnet_pyutils-1.7.12 → sysnet_pyutils-1.8.0}/sysnet_pyutils/utils.py +564 -13
  6. {sysnet_pyutils-1.7.12 → sysnet_pyutils-1.8.0/sysnet_pyutils.egg-info}/PKG-INFO +34 -5
  7. {sysnet_pyutils-1.7.12 → sysnet_pyutils-1.8.0}/sysnet_pyutils.egg-info/SOURCES.txt +2 -0
  8. sysnet_pyutils-1.8.0/tests/test_config_secrets.py +282 -0
  9. sysnet_pyutils-1.8.0/tests/test_config_store.py +834 -0
  10. {sysnet_pyutils-1.7.12 → sysnet_pyutils-1.8.0}/tests/test_utils_missing_branches.py +3 -3
  11. {sysnet_pyutils-1.7.12 → sysnet_pyutils-1.8.0}/LICENSE +0 -0
  12. {sysnet_pyutils-1.7.12 → sysnet_pyutils-1.8.0}/setup.cfg +0 -0
  13. {sysnet_pyutils-1.7.12 → sysnet_pyutils-1.8.0}/sysnet_pyutils/barcode.py +0 -0
  14. {sysnet_pyutils-1.7.12 → sysnet_pyutils-1.8.0}/sysnet_pyutils/constants.py +0 -0
  15. {sysnet_pyutils-1.7.12 → sysnet_pyutils-1.8.0}/sysnet_pyutils/cron_utils/__init__.py +0 -0
  16. {sysnet_pyutils-1.7.12 → sysnet_pyutils-1.8.0}/sysnet_pyutils/cron_utils/validation.py +0 -0
  17. {sysnet_pyutils-1.7.12 → sysnet_pyutils-1.8.0}/sysnet_pyutils/data_utils.py +0 -0
  18. {sysnet_pyutils-1.7.12 → sysnet_pyutils-1.8.0}/sysnet_pyutils/domino.py +0 -0
  19. {sysnet_pyutils-1.7.12 → sysnet_pyutils-1.8.0}/sysnet_pyutils/geo.py +0 -0
  20. {sysnet_pyutils-1.7.12 → sysnet_pyutils-1.8.0}/sysnet_pyutils/globalmodel/__init__.py +0 -0
  21. {sysnet_pyutils-1.7.12 → sysnet_pyutils-1.8.0}/sysnet_pyutils/globalmodel/global_model.py +0 -0
  22. {sysnet_pyutils-1.7.12 → sysnet_pyutils-1.8.0}/sysnet_pyutils/globalmodel/models.py +0 -0
  23. {sysnet_pyutils-1.7.12 → sysnet_pyutils-1.8.0}/sysnet_pyutils/globalmodel/timeutils.py +0 -0
  24. {sysnet_pyutils-1.7.12 → sysnet_pyutils-1.8.0}/sysnet_pyutils/ident.py +0 -0
  25. {sysnet_pyutils-1.7.12 → sysnet_pyutils-1.8.0}/sysnet_pyutils/log.py +0 -0
  26. {sysnet_pyutils-1.7.12 → sysnet_pyutils-1.8.0}/sysnet_pyutils/models/__init__.py +0 -0
  27. {sysnet_pyutils-1.7.12 → sysnet_pyutils-1.8.0}/sysnet_pyutils/models/general.py +0 -0
  28. {sysnet_pyutils-1.7.12 → sysnet_pyutils-1.8.0}/sysnet_pyutils/ses.py +0 -0
  29. {sysnet_pyutils-1.7.12 → sysnet_pyutils-1.8.0}/sysnet_pyutils/syslog/__init__.py +0 -0
  30. {sysnet_pyutils-1.7.12 → sysnet_pyutils-1.8.0}/sysnet_pyutils/syslog/factory.py +0 -0
  31. {sysnet_pyutils-1.7.12 → sysnet_pyutils-1.8.0}/sysnet_pyutils/tools.py +0 -0
  32. {sysnet_pyutils-1.7.12 → sysnet_pyutils-1.8.0}/sysnet_pyutils.egg-info/dependency_links.txt +0 -0
  33. {sysnet_pyutils-1.7.12 → sysnet_pyutils-1.8.0}/sysnet_pyutils.egg-info/not-zip-safe +0 -0
  34. {sysnet_pyutils-1.7.12 → sysnet_pyutils-1.8.0}/sysnet_pyutils.egg-info/requires.txt +0 -0
  35. {sysnet_pyutils-1.7.12 → sysnet_pyutils-1.8.0}/sysnet_pyutils.egg-info/top_level.txt +0 -0
  36. {sysnet_pyutils-1.7.12 → sysnet_pyutils-1.8.0}/tests/test_cron_utils.py +0 -0
  37. {sysnet_pyutils-1.7.12 → sysnet_pyutils-1.8.0}/tests/test_cron_validation_edge.py +0 -0
  38. {sysnet_pyutils-1.7.12 → sysnet_pyutils-1.8.0}/tests/test_data_utils.py +0 -0
  39. {sysnet_pyutils-1.7.12 → sysnet_pyutils-1.8.0}/tests/test_data_utils_datetime.py +0 -0
  40. {sysnet_pyutils-1.7.12 → sysnet_pyutils-1.8.0}/tests/test_data_utils_edge.py +0 -0
  41. {sysnet_pyutils-1.7.12 → sysnet_pyutils-1.8.0}/tests/test_data_utils_missing_branches.py +0 -0
  42. {sysnet_pyutils-1.7.12 → sysnet_pyutils-1.8.0}/tests/test_domino.py +0 -0
  43. {sysnet_pyutils-1.7.12 → sysnet_pyutils-1.8.0}/tests/test_domino_edge.py +0 -0
  44. {sysnet_pyutils-1.7.12 → sysnet_pyutils-1.8.0}/tests/test_geo.py +0 -0
  45. {sysnet_pyutils-1.7.12 → sysnet_pyutils-1.8.0}/tests/test_global_model_recursive.py +0 -0
  46. {sysnet_pyutils-1.7.12 → sysnet_pyutils-1.8.0}/tests/test_global_model_timezone.py +0 -0
  47. {sysnet_pyutils-1.7.12 → sysnet_pyutils-1.8.0}/tests/test_ident_barcode.py +0 -0
  48. {sysnet_pyutils-1.7.12 → sysnet_pyutils-1.8.0}/tests/test_log_importerror_branch.py +0 -0
  49. {sysnet_pyutils-1.7.12 → sysnet_pyutils-1.8.0}/tests/test_log_mongo.py +0 -0
  50. {sysnet_pyutils-1.7.12 → sysnet_pyutils-1.8.0}/tests/test_models_contact.py +0 -0
  51. {sysnet_pyutils-1.7.12 → sysnet_pyutils-1.8.0}/tests/test_models_general.py +0 -0
  52. {sysnet_pyutils-1.7.12 → sysnet_pyutils-1.8.0}/tests/test_models_general_edge.py +0 -0
  53. {sysnet_pyutils-1.7.12 → sysnet_pyutils-1.8.0}/tests/test_package_init_version.py +0 -0
  54. {sysnet_pyutils-1.7.12 → sysnet_pyutils-1.8.0}/tests/test_recursive_update.py +0 -0
  55. {sysnet_pyutils-1.7.12 → sysnet_pyutils-1.8.0}/tests/test_ses.py +0 -0
  56. {sysnet_pyutils-1.7.12 → sysnet_pyutils-1.8.0}/tests/test_ses_importerror_branch.py +0 -0
  57. {sysnet_pyutils-1.7.12 → sysnet_pyutils-1.8.0}/tests/test_syslog_factory.py +0 -0
  58. {sysnet_pyutils-1.7.12 → sysnet_pyutils-1.8.0}/tests/test_tools.py +0 -0
  59. {sysnet_pyutils-1.7.12 → sysnet_pyutils-1.8.0}/tests/test_utils.py +0 -0
  60. {sysnet_pyutils-1.7.12 → sysnet_pyutils-1.8.0}/tests/test_utils_edge.py +0 -0
  61. {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.7.12
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
  [![Python](https://img.shields.io/badge/python-3.10+-blue.svg)](https://www.python.org/downloads/)
731
731
  [![License](https://img.shields.io/badge/license-MIT-green.svg)](LICENSE)
732
- [![Verze](https://img.shields.io/badge/version-1.7.12-blue.svg)](https://pypi.org/project/sysnet-pyutils/1.7.12/)
732
+ [![Verze](https://img.shields.io/badge/version-1.8.0-blue.svg)](https://pypi.org/project/sysnet-pyutils/1.8.0/)
733
733
  [![Tests](https://github.com/SYSNET-CZ/pyutils/actions/workflows/ci.yml/badge.svg)](https://github.com/SYSNET-CZ/pyutils/actions/workflows/ci.yml)
734
734
  [![Coverage](https://img.shields.io/badge/coverage-90%25-brightgreen.svg)](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.7.12`) a aktualizujte dokumentaci včetně changelogu a badge.
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.7.12 && git push origin v1.7.12
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.7.12*
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
  [![Python](https://img.shields.io/badge/python-3.10+-blue.svg)](https://www.python.org/downloads/)
8
8
  [![License](https://img.shields.io/badge/license-MIT-green.svg)](LICENSE)
9
- [![Verze](https://img.shields.io/badge/version-1.7.12-blue.svg)](https://pypi.org/project/sysnet-pyutils/1.7.12/)
9
+ [![Verze](https://img.shields.io/badge/version-1.8.0-blue.svg)](https://pypi.org/project/sysnet-pyutils/1.8.0/)
10
10
  [![Tests](https://github.com/SYSNET-CZ/pyutils/actions/workflows/ci.yml/badge.svg)](https://github.com/SYSNET-CZ/pyutils/actions/workflows/ci.yml)
11
11
  [![Coverage](https://img.shields.io/badge/coverage-90%25-brightgreen.svg)](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.7.12`) a aktualizujte dokumentaci včetně changelogu a badge.
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.7.12 && git push origin v1.7.12
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.7.12*
835
+ *Verze: 1.8.0*
807
836
 
808
837
  *Datum: 2026-10-27*
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "sysnet-pyutils"
7
- version = "1.7.12"
7
+ version = "1.8.0"
8
8
  description = "SYSNET Python Utilities - kompletní sada nástrojů pro Python aplikace"
9
9
  readme = "README.md"
10
10
  license = { file = "LICENSE" }
@@ -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,