Pure-function helpers for redacting structured payloads.
Project description
payload-redactor
Pure-function helpers for redacting sensitive data in structured payloads. Designed as a small, composable core rather than a framework-centric solution.
Install
Install from source:
git clone <repo-url>
cd <repo-name>
python -m venv .venv
. .venv/bin/activate
python -m pip install -U pip
python -m pip install .
Usage
from payload_redactor import make_redactor, redact_sensitive_info, redact_with
payload = {"password": "secret", "user": "alice"}
print(redact_sensitive_info(payload))
print(redact_with(payload, replacement="<hidden>"))
redactor = make_redactor(replacement="***")
print(redactor(payload))
Output:
{'password': '[REDACTED]', 'user': 'alice'}
{'password': '<hidden>', 'user': 'alice'}
{'password': '***', 'user': 'alice'}
Custom replacement per key:
from payload_redactor import redact_sensitive_info
payload = {"password": "secret", "token": "abc"}
redacted = redact_sensitive_info(
payload,
replacement="<hidden>",
key_replacements={"password": "***"},
)
Output:
{'password': '***', 'token': '<hidden>'}
Structlog adapter (optional)
Install with the extra:
python -m pip install .[structlog]
import logging
import logging.config
import structlog
from payload_redactor import redact_event_dict
shared_processors = [
structlog.stdlib.add_logger_name,
structlog.stdlib.add_log_level,
structlog.processors.TimeStamper(fmt="iso"),
structlog.processors.UnicodeDecoder(),
]
logging.config.dictConfig(
{
"version": 1,
"disable_existing_loggers": False,
"formatters": {
"console": {
"()": structlog.stdlib.ProcessorFormatter,
"processor": structlog.dev.ConsoleRenderer(colors=True),
"foreign_pre_chain": shared_processors,
},
"json": {
"()": structlog.stdlib.ProcessorFormatter,
"processor": structlog.processors.JSONRenderer(sort_keys=True),
"foreign_pre_chain": shared_processors,
},
},
"handlers": {
"default": {
"level": "DEBUG",
"class": "logging.StreamHandler",
"formatter": "json",
}
},
"loggers": {"": {"handlers": ["default"], "level": "INFO"}},
}
)
structlog.configure(
processors=[
redact_event_dict,
*shared_processors,
structlog.stdlib.ProcessorFormatter.wrap_for_formatter, # type: ignore
],
logger_factory=structlog.stdlib.LoggerFactory(),
cache_logger_on_first_use=True,
)
logger = structlog.get_logger("app")
logger.info("user login", user_id=123, password="secret")
Output (JSON formatter):
{"event": "user login", "level": "info", "logger": "app", "password": "[REDACTED]", "timestamp": "2024-01-01T12:00:00Z", "user_id": 123}
Development
python -m venv .venv
. .venv/bin/activate
python -m pip install -U pip
python -m pip install -e ".[dev]"
pytest
Project details
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file payload_redactor-0.1.0.tar.gz.
File metadata
- Download URL: payload_redactor-0.1.0.tar.gz
- Upload date:
- Size: 5.3 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.13.9
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
149ef697c875561b493a5378d7d65b86861e058f69a3435e490be5581e654386
|
|
| MD5 |
8a6c3e07eb38d6c7593f1b44944abb87
|
|
| BLAKE2b-256 |
4765f2240da4dd3e9e7f35a9fc03b897eeacc4afaf5acfdeb1135c9d696bc709
|
File details
Details for the file payload_redactor-0.1.0-py3-none-any.whl.
File metadata
- Download URL: payload_redactor-0.1.0-py3-none-any.whl
- Upload date:
- Size: 5.7 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.13.9
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
ff441af98bd525c2d463abf555b9d54a98322c07944e668a1171505c95952edb
|
|
| MD5 |
a4fc5f26a34ca159711903ee23d0e23a
|
|
| BLAKE2b-256 |
072d2e0b361d5faa2f1ada281f07f374ed4044f4f18367656833facd78bf5103
|