lib-layered-config 1.0.0__py3-none-any.whl

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.

Potentially problematic release.


This version of lib-layered-config might be problematic. Click here for more details.

Files changed (39) hide show
  1. lib_layered_config/__init__.py +60 -0
  2. lib_layered_config/__main__.py +19 -0
  3. lib_layered_config/_layers.py +457 -0
  4. lib_layered_config/_platform.py +200 -0
  5. lib_layered_config/adapters/__init__.py +13 -0
  6. lib_layered_config/adapters/dotenv/__init__.py +1 -0
  7. lib_layered_config/adapters/dotenv/default.py +438 -0
  8. lib_layered_config/adapters/env/__init__.py +5 -0
  9. lib_layered_config/adapters/env/default.py +509 -0
  10. lib_layered_config/adapters/file_loaders/__init__.py +1 -0
  11. lib_layered_config/adapters/file_loaders/structured.py +410 -0
  12. lib_layered_config/adapters/path_resolvers/__init__.py +1 -0
  13. lib_layered_config/adapters/path_resolvers/default.py +727 -0
  14. lib_layered_config/application/__init__.py +12 -0
  15. lib_layered_config/application/merge.py +442 -0
  16. lib_layered_config/application/ports.py +109 -0
  17. lib_layered_config/cli/__init__.py +162 -0
  18. lib_layered_config/cli/common.py +232 -0
  19. lib_layered_config/cli/constants.py +12 -0
  20. lib_layered_config/cli/deploy.py +70 -0
  21. lib_layered_config/cli/fail.py +21 -0
  22. lib_layered_config/cli/generate.py +60 -0
  23. lib_layered_config/cli/info.py +31 -0
  24. lib_layered_config/cli/read.py +117 -0
  25. lib_layered_config/core.py +384 -0
  26. lib_layered_config/domain/__init__.py +7 -0
  27. lib_layered_config/domain/config.py +490 -0
  28. lib_layered_config/domain/errors.py +65 -0
  29. lib_layered_config/examples/__init__.py +29 -0
  30. lib_layered_config/examples/deploy.py +305 -0
  31. lib_layered_config/examples/generate.py +537 -0
  32. lib_layered_config/observability.py +306 -0
  33. lib_layered_config/py.typed +0 -0
  34. lib_layered_config/testing.py +55 -0
  35. lib_layered_config-1.0.0.dist-info/METADATA +366 -0
  36. lib_layered_config-1.0.0.dist-info/RECORD +39 -0
  37. lib_layered_config-1.0.0.dist-info/WHEEL +4 -0
  38. lib_layered_config-1.0.0.dist-info/entry_points.txt +3 -0
  39. lib_layered_config-1.0.0.dist-info/licenses/LICENSE +22 -0
@@ -0,0 +1,366 @@
1
+ Metadata-Version: 2.4
2
+ Name: lib_layered_config
3
+ Version: 1.0.0
4
+ Summary: Cross-platform layered configuration loader for Python
5
+ Project-URL: Homepage, https://github.com/bitranox/lib_layered_config
6
+ Project-URL: Repository, https://github.com/bitranox/lib_layered_config.git
7
+ Project-URL: Issues, https://github.com/bitranox/lib_layered_config/issues
8
+ Author-email: bitranox <bitranox@gmail.com>
9
+ License: MIT
10
+ License-File: LICENSE
11
+ Keywords: configuration,dotenv,env,layered,toml
12
+ Classifier: License :: OSI Approved :: MIT License
13
+ Classifier: Operating System :: OS Independent
14
+ Classifier: Programming Language :: Python :: 3
15
+ Classifier: Programming Language :: Python :: 3 :: Only
16
+ Classifier: Programming Language :: Python :: 3.13
17
+ Classifier: Typing :: Typed
18
+ Requires-Python: >=3.13
19
+ Requires-Dist: lib-cli-exit-tools>=1.5.0
20
+ Requires-Dist: rich-click>=1.9.2
21
+ Provides-Extra: dev
22
+ Requires-Dist: bandit>=1.7.9; extra == 'dev'
23
+ Requires-Dist: build>=1.3; extra == 'dev'
24
+ Requires-Dist: codecov-cli>=0.6; extra == 'dev'
25
+ Requires-Dist: coverage[toml]>=7.10.7; extra == 'dev'
26
+ Requires-Dist: hypothesis>=6.140.3; extra == 'dev'
27
+ Requires-Dist: import-linter>=2.0; extra == 'dev'
28
+ Requires-Dist: pip-audit>=2.7; extra == 'dev'
29
+ Requires-Dist: pyright>=1.1; extra == 'dev'
30
+ Requires-Dist: pytest-asyncio>=0.23; extra == 'dev'
31
+ Requires-Dist: pytest-cov>=7.0; extra == 'dev'
32
+ Requires-Dist: pytest>=8.4; extra == 'dev'
33
+ Requires-Dist: pyyaml>=6.0; extra == 'dev'
34
+ Requires-Dist: ruff>=0.13.3; extra == 'dev'
35
+ Requires-Dist: textual>=6.1.0; extra == 'dev'
36
+ Requires-Dist: twine>=6.2; extra == 'dev'
37
+ Provides-Extra: yaml
38
+ Requires-Dist: pyyaml>=6.0; extra == 'yaml'
39
+ Description-Content-Type: text/markdown
40
+
41
+ # lib_layered_config
42
+
43
+ <!-- Badges -->
44
+ [![CI](https://github.com/bitranox/lib_layered_config/actions/workflows/ci.yml/badge.svg)](https://github.com/bitranox/lib_layered_config/actions/workflows/ci.yml)
45
+ [![CodeQL](https://github.com/bitranox/lib_layered_config/actions/workflows/codeql.yml/badge.svg)](https://github.com/bitranox/lib_layered_config/actions/workflows/codeql.yml)
46
+ [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](LICENSE)
47
+ [![Open in Codespaces](https://img.shields.io/badge/Codespaces-Open-blue?logo=github&logoColor=white&style=flat-square)](https://codespaces.new/bitranox/lib_layered_config?quickstart=1)
48
+ [![PyPI](https://img.shields.io/pypi/v/lib-layered-config.svg)](https://pypi.org/project/lib-layered-config/)
49
+ [![PyPI - Downloads](https://img.shields.io/pypi/dm/lib-layered-config.svg)](https://pypi.org/project/lib-layered-config/)
50
+ [![Code Style: Ruff](https://img.shields.io/badge/Code%20Style-Ruff-46A3FF?logo=ruff&labelColor=000)](https://docs.astral.sh/ruff/)
51
+ [![codecov](https://codecov.io/gh/bitranox/lib_layered_config/graph/badge.svg)](https://codecov.io/gh/bitranox/lib_layered_config)
52
+ [![Maintainability](https://qlty.sh/gh/bitranox/projects/lib_layered_config/maintainability.svg)](https://qlty.sh/gh/bitranox/projects/lib_layered_config)
53
+ [![Known Vulnerabilities](https://snyk.io/test/github/bitranox/lib_layered_config/badge.svg)](https://snyk.io/test/github/bitranox/lib_layered_config)
54
+
55
+ A cross-platform configuration loader that deep-merges application defaults, host overrides, user profiles, `.env` files, and environment variables into a single immutable object. The core follows Clean Architecture boundaries so adapters (filesystem, dotenv, environment) stay isolated from the domain model while the CLI mirrors the same orchestration.
56
+
57
+ ## Table of Contents
58
+
59
+ 1. [Key Features](#key-features)
60
+ 2. [Architecture Overview](#architecture-overview)
61
+ 3. [Installation](#installation)
62
+ 4. [Quick Start](#quick-start)
63
+ 5. [Configuration Sources & Precedence](#configuration-sources--precedence)
64
+ 6. [CLI Usage](#cli-usage)
65
+ 7. [Python API](#python-api)
66
+ 8. [Example Generation & Deployment](#example-generation--deployment)
67
+ 9. [Provenance & Observability](#provenance--observability)
68
+ 10. [Development](#development)
69
+ 11. [License](#license)
70
+
71
+ ## Key Features
72
+
73
+ - **Deterministic layering** — precedence is always `defaults → app → host → user → dotenv → env`.
74
+ - **Immutable value object** — returned `Config` prevents accidental mutation and exposes dotted-path helpers.
75
+ - **Provenance tracking** — every key reports the layer and path that produced it.
76
+ - **Cross-platform path discovery** — Linux (XDG), macOS, and Windows layouts with environment overrides for tests.
77
+ - **Extensible formats** — TOML and JSON are built-in; YAML is available via the optional `yaml` extra.
78
+ - **Automation-friendly CLI** — inspect, deploy, or scaffold configurations without writing Python.
79
+ - **Structured logging** — adapters emit trace-aware events without polluting the domain layer.
80
+
81
+ ## Architecture Overview
82
+
83
+ The project follows a Clean Architecture layout so responsibilities remain easy to reason about and test:
84
+
85
+ - **Domain** — immutable `Config` value object plus error taxonomy.
86
+ - **Application** — merge policy (`LayerSnapshot`, `merge_layers`) and adapter protocols.
87
+ - **Adapters** — filesystem discovery, structured file loaders, dotenv, and environment ingress.
88
+ - **Composition** — `core` and `_layers` wire adapters together and expose the public API.
89
+ - **Presentation & Tooling** — CLI commands, deployment/example helpers, observability utilities, and testing hooks.
90
+
91
+ Consult [`docs/systemdesign/module_reference.md`](docs/systemdesign/module_reference.md) for a per-module catalogue and traceability back to the system design notes.
92
+
93
+ ## Installation
94
+
95
+ ```bash
96
+ pip install lib_layered_config
97
+ # or with optional YAML support
98
+ pip install "lib_layered_config[yaml]"
99
+ ```
100
+
101
+ > **Requires Python 3.13+** — the standard-library `tomllib` handles TOML parsing.
102
+ >
103
+ > Install the optional `yaml` extra only when you actually ship `.yml` files to keep the dependency footprint small.
104
+
105
+ For local development add tooling extras:
106
+
107
+ ```bash
108
+ pip install "lib_layered_config[dev]"
109
+ ```
110
+
111
+ ## Quick Start
112
+
113
+ ```python
114
+ from lib_layered_config import read_config
115
+
116
+ config = read_config(vendor="Acme", app="ConfigKit", slug="config-kit")
117
+ print(config.get("service.timeout", default=30))
118
+ print(config.origin("service.timeout"))
119
+ ```
120
+
121
+ CLI equivalent (human readable by default):
122
+
123
+ ```bash
124
+ lib_layered_config read --vendor Acme --app ConfigKit --slug config-kit
125
+ ```
126
+
127
+ JSON output including provenance:
128
+
129
+ ```bash
130
+ lib_layered_config read --vendor Acme --app ConfigKit --slug config-kit --format json
131
+ # or
132
+ lib_layered_config read-json --vendor Acme --app ConfigKit --slug config-kit
133
+ ```
134
+
135
+ ## Configuration Sources & Precedence
136
+
137
+ Later layers override earlier ones **per key** while leaving unrelated keys untouched.
138
+
139
+ | Precedence | Layer | Description |
140
+ | ---------- | ----------- | ----------- |
141
+ | 0 | `defaults` | Optional baseline file provided via the API/CLI `--default-file` flag |
142
+ | 1 | `app` | System-wide defaults (e.g. `/etc/<slug>/…`) |
143
+ | 2 | `host` | Machine-specific overrides (`hosts/<hostname>.toml`) |
144
+ | 3 | `user` | Per-user settings (XDG, Application Support, AppData) |
145
+ | 4 | `dotenv` | First `.env` found via upward search plus platform extras |
146
+ | 5 | `env` | Process environment with namespacing and `__` nesting |
147
+
148
+ Use the optional defaults layer when you want one explicitly-provided file to seed configuration before host/user overrides apply.
149
+
150
+ Important directories (overridable via environment variables):
151
+
152
+ ### Linux
153
+ - `/etc/<slug>/config.toml`
154
+ - `/etc/<slug>/config.d/*.{toml,json,yaml,yml}`
155
+ - `/etc/<slug>/hosts/<hostname>.toml`
156
+ - `$XDG_CONFIG_HOME/<slug>/config.toml` (the resolver reads `$XDG_CONFIG_HOME`; if it is missing it falls back to `~/.config/<slug>/config.toml`)
157
+ - `.env` search: current directory upwards + `$XDG_CONFIG_HOME/<slug>/.env`
158
+
159
+ ### macOS
160
+ - `/Library/Application Support/<Vendor>/<App>/config.toml`
161
+ - `/Library/Application Support/<Vendor>/<App>/config.d/`
162
+ - `/Library/Application Support/<Vendor>/<App>/hosts/<hostname>.toml`
163
+ - `~/Library/Application Support/<Vendor>/<App>/config.toml`
164
+ - `.env` search: current directory upwards + `~/Library/Application Support/<Vendor>/<App>/.env`
165
+
166
+ ### Windows
167
+ - `%ProgramData%\<Vendor>\<App>\config.toml`
168
+ - `%ProgramData%\<Vendor>\<App>\config.d\*`
169
+ - `%ProgramData%\<Vendor>\<App>\hosts\%COMPUTERNAME%.toml`
170
+ - `%APPDATA%\<Vendor>\<App>\config.toml` (resolver order: `LIB_LAYERED_CONFIG_APPDATA` → `%APPDATA%`; if neither yields an existing directory it tries `LIB_LAYERED_CONFIG_LOCALAPPDATA` → `%LOCALAPPDATA%`)
171
+ - `.env` search: current directory upwards + `%APPDATA%\<Vendor>\<App>\.env`
172
+
173
+ Environment overrides: `LIB_LAYERED_CONFIG_ETC`, `LIB_LAYERED_CONFIG_PROGRAMDATA`, `LIB_LAYERED_CONFIG_APPDATA`, `LIB_LAYERED_CONFIG_LOCALAPPDATA`, `LIB_LAYERED_CONFIG_MAC_APP_ROOT`, `LIB_LAYERED_CONFIG_MAC_HOME_ROOT`. Both the runtime readers and the `deploy` helper honour these variables so generated files land in the same directories that `read_config` inspects.
174
+
175
+ **Fallback note:** Whenever a path is marked as a fallback, the resolver first consults the documented environment overrides (`LIB_LAYERED_CONFIG_*`, `$XDG_CONFIG_HOME`, `%APPDATA%`, etc.). If those variables are unset or the computed directory does not exist, it switches to the stated fallback location (`~/.config`, `%LOCALAPPDATA%`, ...). This keeps local installs working without additional environment configuration while still allowing operators to steer resolution explicitly.
176
+
177
+ ## CLI Usage
178
+
179
+ ### Command Summary
180
+
181
+ | Command | Description |
182
+ |----------------------------------------|-------------------------------------------------------|
183
+ | `lib_layered_config read` | Load configuration (human readable by default) |
184
+ | `lib_layered_config read-json` | Emit config + provenance JSON envelope |
185
+ | `lib_layered_config deploy` | Copy a source file into one or more layer directories |
186
+ | `lib_layered_config generate-examples` | Scaffold example trees (POSIX/Windows layouts) |
187
+ | `lib_layered_config env-prefix` | Compute the canonical environment prefix |
188
+ | `lib_layered_config fail` | Intentionally raise a `RuntimeError` (for testing) |
189
+
190
+ ### `read`
191
+
192
+ ```bash
193
+ lib_layered_config read --vendor Acme --app ConfigKit --slug config-kit --prefer toml --prefer json --start-dir /path/to/project --default-file ./config.defaults.toml --format human # or json
194
+ # --provenance / --no-provenance (defaults to provenance)
195
+ ```
196
+
197
+ - `--format human` prints an annotated prose list (default).
198
+ - `--format json` returns either the Config JSON or, with `--provenance`, a combined `{config, provenance}` document. Pretty-printing is enabled by default; add `--no-indent` for compact output.
199
+ - `--default-file` seeds the merge with a lowest-precedence baseline file.
200
+
201
+ Human output example:
202
+
203
+ ```
204
+ service.timeout: 20
205
+ provenance: layer=env, path=None
206
+ service.endpoint: https://api.example.com
207
+ provenance: layer=user, path=/home/alice/.config/config-kit/config.toml
208
+ ```
209
+
210
+ JSON output example:
211
+
212
+ ```bash
213
+ lib_layered_config read --vendor Acme --app ConfigKit --slug config-kit --format json --indent
214
+ ```
215
+
216
+ ### `deploy`
217
+
218
+ ```bash
219
+ lib_layered_config deploy --source ./config/app.toml --vendor Acme --app ConfigKit --slug config-kit --target app --target user [--platform posix|windows] [--force]
220
+ ```
221
+
222
+ Returns a JSON array of files created or overwritten.
223
+
224
+ ### `generate-examples`
225
+
226
+ ```bash
227
+ lib_layered_config generate-examples --destination ./examples --vendor Acme --app ConfigKit --slug config-kit [--platform posix|windows] [--force]
228
+ ```
229
+
230
+ ### `env-prefix`
231
+
232
+ ```bash
233
+ lib_layered_config env-prefix config-kit
234
+ # -> CONFIG_KIT
235
+ ```
236
+
237
+ ### `read-json`
238
+
239
+ ```bash
240
+ lib_layered_config read-json --vendor Acme --app ConfigKit --slug config-kit --no-indent
241
+ ```
242
+
243
+ ### `fail`
244
+
245
+ ```bash
246
+ lib_layered_config fail
247
+ # raises RuntimeError: i should fail
248
+ ```
249
+
250
+ ## Python API
251
+
252
+ ```python
253
+ from lib_layered_config import (
254
+ Config,
255
+ read_config,
256
+ read_config_json,
257
+ read_config_raw,
258
+ default_env_prefix,
259
+ deploy_config,
260
+ generate_examples,
261
+ i_should_fail,
262
+ )
263
+ ```
264
+
265
+ ### `Config`
266
+
267
+ - `Config.get("service.timeout", default=None)` — dotted-path lookups with optional default.
268
+ - `Config.origin("service.timeout")` — provenance metadata (`{'layer': 'env', 'path': None, 'key': 'service.timeout'}`).
269
+ - `Config.as_dict()` / `Config.to_json(indent=2)` — mutable deep copies for serialization.
270
+ - `Config.with_overrides({"service": {"timeout": 90}})` — shallow overrides without mutating the original.
271
+
272
+ ### `read_config`
273
+
274
+ Immutable `Config` wrapper with provenance metadata. See [Quick Start](#quick-start).
275
+
276
+ ```python
277
+ from pathlib import Path
278
+ from lib_layered_config import read_config
279
+
280
+ defaults = Path("config.defaults.toml")
281
+ config = read_config(vendor="Acme", app="Demo", slug="demo", default_file=defaults)
282
+ print(config.get("service.timeout", default=30))
283
+ ```
284
+
285
+ ### `read_config_json`
286
+
287
+ ```python
288
+ from lib_layered_config import read_config_json
289
+ import json
290
+
291
+ payload = read_config_json(vendor="Acme", app="Demo", slug="demo", indent=2)
292
+ data = json.loads(payload)
293
+ print(data["config"]["service"]["timeout"])
294
+ print(data["provenance"]["service.timeout"])
295
+ ```
296
+
297
+ ### `read_config_raw`
298
+
299
+ Returns primitive `dict` structures `(data, provenance)` for automation or templating.
300
+
301
+ ### Example helpers
302
+
303
+ - `deploy_config(source, vendor=..., app=..., targets=("app", "user"), slug=None, platform=None, force=False)`
304
+ - `generate_examples(destination, slug=..., vendor=..., app=..., platform=None, force=False)`
305
+
306
+ ## Example Generation & Deployment
307
+
308
+ Use the Python helpers or CLI equivalents:
309
+
310
+ ```python
311
+ from pathlib import Path
312
+ from lib_layered_config.examples import deploy_config, generate_examples
313
+
314
+ # copy one file into the system/user layers
315
+ paths = deploy_config("./myapp/config.toml", vendor="Acme", app="ConfigKit", targets=("app", "user"))
316
+
317
+ # scaffold an example tree for documentation
318
+ examples = generate_examples(Path("./examples"), slug="config-kit", vendor="Acme", app="ConfigKit")
319
+ ```
320
+
321
+ ## Provenance & Observability
322
+
323
+ - Every merged key stores metadata (`layer`, `path`, `key`).
324
+ - Structured logging lives in `lib_layered_config.observability` (trace-aware `log_debug`, `log_info`, `log_error`).
325
+ - Use `bind_trace_id("abc123")` to correlate CLI/log events with your own tracing.
326
+
327
+ ## Further documentation
328
+
329
+ - [CHANGELOG](CHANGELOG.md) — user-facing release notes.
330
+ - [CONTRIBUTING](CONTRIBUTING.md) — guidelines for issues, pull requests, and coding style.
331
+ - [DEVELOPMENT](DEVELOPMENT.md) — local tooling, recommended workflow, and release checklist.
332
+ - [Module Reference](docs/systemdesign/module_reference.md) — architecture-aligned responsibilities per module.
333
+ - [LICENSE](LICENSE) — MIT license text.
334
+
335
+
336
+ ## Development
337
+
338
+ ```bash
339
+ pip install "lib_layered_config[dev]"
340
+ make test # lint + type-check + pytest + coverage (fail-under=90%)
341
+ make build # build wheel / sdist artifacts
342
+ make run -- --help # run the CLI via the repo entrypoint
343
+ ```
344
+
345
+ *Formatting gate:* Ruff formatting runs in check mode during `make test`. Run `ruff format .` (or `pre-commit run --all-files`) before pushing and consider `pre-commit install` to keep local edits aligned.
346
+
347
+ *Coverage gate:* the maintained test suite must stay ≥90% (see `pyproject.toml`). Add targeted unit tests if you extend functionality.
348
+
349
+ **Platform notes**
350
+
351
+ - Windows runners install `pipx` and `uv` automatically in CI; locally ensure `pipx` is on your `PATH` before running `make test` so the wheel verification step succeeds.
352
+ - The journald prerequisite step runs only on Linux; macOS/Windows skips it, so there is no extra setup required on those platforms.
353
+
354
+ ### Continuous integration
355
+
356
+ The GitHub Actions workflow executes three jobs:
357
+
358
+ - **Test matrix** (Linux/macOS/Windows, Python 3.13 + latest 3.x) running the same pipeline as `make test`.
359
+ - **pipx / uv verification** to prove the built wheel installs cleanly with the common Python app launchers.
360
+ - **Notebook smoke test** that executes `notebooks/Quickstart.ipynb` to keep the tutorial in sync.
361
+
362
+ Packaging-specific jobs (conda, Nix, Homebrew sync) were retired; the Python packaging metadata in `pyproject.toml` remains the single source of truth.
363
+
364
+ ## License
365
+
366
+ MIT © Robert Nowotny
@@ -0,0 +1,39 @@
1
+ lib_layered_config/__init__.py,sha256=nJZkUMWFr_LhE71vquCUojqIy8miwo_T4WexbRRSA0o,1578
2
+ lib_layered_config/__main__.py,sha256=8zOwFdtTW_y8WBSefP1qYr99x3MWp6JOsTA1E0n-ceY,467
3
+ lib_layered_config/_layers.py,sha256=21a_6pLIM2Hb-N54BAXVQxzbhmnNNXWNnJppKHl6ht4,13334
4
+ lib_layered_config/_platform.py,sha256=eIvp_P8Cn-0meIzkxgZEQpKdgA9yU-fUYYKkp0Af1Qo,5819
5
+ lib_layered_config/core.py,sha256=utjEdWRW8ZjNZ1J32_OlWyJDlIFCGO853fg28vPt5DE,10995
6
+ lib_layered_config/observability.py,sha256=elxCz6pswff5RyC3NoPPVmPJNXCWpPuiN41hYDhjqOg,7500
7
+ lib_layered_config/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
8
+ lib_layered_config/testing.py,sha256=jTp90GKPpb219Ud8AEHsPhIEvDY6NDshjxjvLGi2nwg,1532
9
+ lib_layered_config/adapters/__init__.py,sha256=lWl527Z1HZzu5Chal-TP_VtQZr-HZhH_CnMb7D3dJEA,373
10
+ lib_layered_config/adapters/dotenv/__init__.py,sha256=Ru8fnFZtugqDHjfjOzMWNYkcf-XNZJi26O0gpB7-wzQ,38
11
+ lib_layered_config/adapters/dotenv/default.py,sha256=ghsgSgw99k14aQxPoXXsVk_oE_maeaglj5rtH5L7i9s,12116
12
+ lib_layered_config/adapters/env/__init__.py,sha256=EZY49s8TGhHvPWfEleRCIRc7W2eeAArpZPkaGTxUXX8,110
13
+ lib_layered_config/adapters/env/default.py,sha256=r0SCfn24NxhVgmn5gFX07bPtTFTw-kk9AWtX0-b5rtI,13136
14
+ lib_layered_config/adapters/file_loaders/__init__.py,sha256=V4KQJvY7xKJRMnY0cktkwj7SOILS6hO3eAfVBHP5B1k,45
15
+ lib_layered_config/adapters/file_loaders/structured.py,sha256=sYe6QHZ3uoPUkVa86nz9-bRVdNUWTq5Bct2UsOkZt20,11198
16
+ lib_layered_config/adapters/path_resolvers/__init__.py,sha256=-SEC9-2kwEZcW4hOrVbdfpMqmPKQ9UlI_PgvxLZ9m8I,65
17
+ lib_layered_config/adapters/path_resolvers/default.py,sha256=7JE6xHuiplwqXptsH30m_q5PmqRHZMi7YQ8nuQSU5mk,21358
18
+ lib_layered_config/application/__init__.py,sha256=fGbDqRVtb6tIXhdjYwL22548P1opLgau8BkzmXs_KiA,276
19
+ lib_layered_config/application/merge.py,sha256=ZpRRQoLhFBcmubCXeXpKbOCFse1w_2GljXuCnCR-VTQ,12536
20
+ lib_layered_config/application/ports.py,sha256=8HyqTTVlFxZurhjR805tmEV1D3MdzZdTXbjfUTSuoac,3047
21
+ lib_layered_config/cli/__init__.py,sha256=EEFQRfAcD-cYROns2GRg84MpjEl4X6snpUnIM3ByPKU,5433
22
+ lib_layered_config/cli/common.py,sha256=swjIGqA52jFP15Kd4AzC5QtPj5kndxeTnK8-vsJqQuY,7120
23
+ lib_layered_config/cli/constants.py,sha256=15Cu0OfkP-iOmHTecKEDLK4YShYxgMeSWNKThAZV4DA,467
24
+ lib_layered_config/cli/deploy.py,sha256=ZhxUbMx1rjWLwNTVDx8nfM63H7-6GFp60S6_zl2vGGg,2025
25
+ lib_layered_config/cli/fail.py,sha256=PBuHrTvSdZ1mv-UGlZYbWUF24ii09IzQYnHqN1GR6JE,523
26
+ lib_layered_config/cli/generate.py,sha256=32_DldxLz24usH56EniRDx75-zU6ZJQvlervp5KbkXc,1721
27
+ lib_layered_config/cli/info.py,sha256=fnymBSMoEz_V-iZGBTpP-f8Ks7WhAJO8apnn4eU3AU4,870
28
+ lib_layered_config/cli/read.py,sha256=8FQYV70z7N2Sk0wTd5_wIG5G9ff9Ox_8z54GJlUicGk,3427
29
+ lib_layered_config/domain/__init__.py,sha256=cCPZPT_ba8q-nxrRjkVKvG-2yht7DDX_ZLWxDcx7ays,221
30
+ lib_layered_config/domain/config.py,sha256=j6L9Igxyxi9emW3wlqLDZWhdNhB0R-L06DuGsiica94,13659
31
+ lib_layered_config/domain/errors.py,sha256=811KWV98R8eF142ReSYjKZ2LXCQdys75y3SpKwWAn3E,1929
32
+ lib_layered_config/examples/__init__.py,sha256=1ShHdxvsxIxWzRAYfOxaIeL2m9Je32B2I9bX8MUwXHw,996
33
+ lib_layered_config/examples/deploy.py,sha256=1aHXsIzw9L94dXgi8xr_rTshaDUpezKV_csU81nkx6w,11211
34
+ lib_layered_config/examples/generate.py,sha256=B8RgooeA3nGGXF0Zk7zU1tcmv2dZLSBTJGIHsiLOexQ,13808
35
+ lib_layered_config-1.0.0.dist-info/METADATA,sha256=HtWFNt0ndl2Qe91FmDp9m1XtX9gap_4W2zxJPuK2b2c,16330
36
+ lib_layered_config-1.0.0.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
37
+ lib_layered_config-1.0.0.dist-info/entry_points.txt,sha256=peN9XKyKARqvDRE-DpK4eeZRc1JeiQqPpzx4BGv_EkE,116
38
+ lib_layered_config-1.0.0.dist-info/licenses/LICENSE,sha256=6s9SL2InRrwynPjJYiER7ONHBshbGj_yC5EBzfo7l9I,1072
39
+ lib_layered_config-1.0.0.dist-info/RECORD,,
@@ -0,0 +1,4 @@
1
+ Wheel-Version: 1.0
2
+ Generator: hatchling 1.27.0
3
+ Root-Is-Purelib: true
4
+ Tag: py3-none-any
@@ -0,0 +1,3 @@
1
+ [console_scripts]
2
+ lib-layered-config = lib_layered_config.cli:main
3
+ lib_layered_config = lib_layered_config.cli:main
@@ -0,0 +1,22 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2025 Robert Nowotny
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
22
+