Native structured logging with a loguru-style Python API
Project description
structguru
A native structured logging library with a loguru-style API.
Combines a loguru-style API — brace formatting, bind, contextualize, opt, sink management — with a native Rust renderer for maximum performance. Since v1.0, the Rust extension is the default (and only) rendering path; structlog and orjson are no longer dependencies.
Features
- Loguru-style API —
logger.info("User {id} logged in", id=123) - Structured JSON output in production (rendered natively in Rust for speed)
- Pretty colored console output in development
- Context management —
bind()for persistent context,contextualize()for request-scoped context - Sentry integration — redacted breadcrumbs/events with raw exceptions preserved for capture
- stdlib interop —
logger.add()sinks can also receive third-partyloggingrecords - RFC 5424 severity codes included in every log record
- Native Rust runtime — rendering and output run through the bundled abi3 extension
- Fully typed — PEP 561 compliant with strict mypy
Native processing:
- Redaction — mask sensitive fields (passwords, tokens) by key name or regex
- Sampling — probabilistic and rate-limited log suppression
- Metrics — extract counters/histograms from log events via callbacks
- Exception formatting — render
exc_infoas text or a structured frame dictionary - Off-thread logging — native Rust writer with a bounded queue and backpressure
- OpenTelemetry — automatic
trace_id/span_idinjection from current span
Framework integrations (optional dependencies):
- ASGI (FastAPI, Starlette) — request ID, timing, context binding middleware
- Celery — task context binding and cross-worker context propagation via headers
- Flask — before/after request hooks with request ID tracking
- Django — logging dict config builder and request middleware
- SQLAlchemy — slow query detection and logging
- gRPC — server interceptor with per-RPC context binding
- Sentry — forward log events as breadcrumbs/events with configurable severity
Installation
pip install structguru
With optional integrations:
pip install structguru[celery,flask,sentry] # pick what you need
pip install structguru[all] # everything
Available extras: otel, celery, flask, django, sqlalchemy, grpc,
sentry, httpx, requests, all.
Quick start
from structguru import configure, logger
# Configure once at startup
configure(service="myapp", level="DEBUG", format="json")
# Use anywhere
logger.info("Hello {name}", name="world")
# → {"logger":"...","level":"INFO","severity":6,"timestamp":"...","service":"myapp","message":"Hello world"}
Usage
Log levels
logger.debug("Debug message")
logger.info("Info message")
logger.warning("Warning message")
logger.error("Error message")
logger.critical("Critical message")
# Aliases
logger.trace("Maps to DEBUG")
logger.success("Maps to INFO")
logger.warn("Alias for warning")
logger.fatal("Alias for critical")
Brace formatting
Arguments used in str.format placeholders are consumed by formatting (matching loguru behaviour). Extra kwargs that are not in any placeholder are forwarded as structured fields:
logger.info("User {user_id} logged in", user_id=42, ip="10.0.0.1")
# message: "User 42 logged in"
# ip: "10.0.0.1" (extra kwarg kept as structured field)
# user_id is consumed by formatting and not duplicated
Bound context
log = logger.bind(request_id="abc-123", user="alice")
log.info("Processing request") # includes request_id and user
log.info("Request complete") # same context carried through
Request-scoped context
with logger.contextualize(request_id="abc-123"):
logger.info("Handling request") # includes request_id
do_work() # any logging inside also gets request_id
# request_id removed automatically
Exception logging
try:
risky_operation()
except Exception:
logger.exception("Operation failed") # logs with exc_info at ERROR level
# Or with opt():
logger.opt(exception=True).error("Something went wrong")
Sink management
# Add a file sink
handler_id = logger.add("/var/log/app.log", level="ERROR")
# Add a callable sink
logger.add(lambda msg: send_to_monitoring(msg), level="CRITICAL")
# Remove a specific sink
logger.remove(handler_id)
# Remove all added sinks
logger.remove()
On Unix, new files created by either logger.add(path) or the native rotating
file sink are owner-only (0600). Existing files retain their permissions.
All sink forms receive structguru records. They are also registered with the stdlib root logger for third-party records, which arrive raw (unrendered) on that path. Install the stdlib bridge to receive them rendered and redacted instead — while it is installed the raw delivery is suspended, so a sink never sees the same record twice.
Native delivery uses the bounded callable queue and is drained on
reconfiguration, shutdown(), fork, and interpreter exit. Call
structguru.flush() when you need to block until buffered records have actually
been written:
import structguru
logger.info("checkpoint")
structguru.flush() # returns once the line has reached its sink
Console vs JSON output
format= selects the renderer: "json" (default, production) or "console"
(colored, human-readable development output).
# JSON (production)
configure(service="myapp", format="json")
# → {"timestamp": "...", "service": "myapp", "level": "INFO", "message": "..."}
# Console (development) — colored, human-readable
configure(service="myapp", format="console")
# → 2025-01-15 12:00:00 [info ] Hello world
Native processing
Redaction
Mask sensitive fields automatically:
from structguru import configure
configure(
sensitive_keys=["password", "token", "ssn"],
sensitive_patterns=[r"\b\d{3}-\d{2}-\d{4}\b"],
pattern_replacement="***",
)
Patterns run on Rust's linear-time regex engine (no ReDoS), which rejects
look-around and backreferences at configure() time. Most look-behinds rewrite
as capture groups — (?<=password=)\S+ becomes password=(\S+) with
pattern_replacement="$1[REDACTED]". For patterns that can't be rewritten,
allow_backtracking_patterns=True opts them into a bounded backtracking
engine: look-around and backreferences then work as written, at the cost of
the linear-time guarantee for those patterns. If a value ever exceeds the
backtrack limit, it is redacted entirely (fail-closed) rather than emitted
unchecked.
configure(
sensitive_patterns=[r"(?<=password=)\S+"],
allow_backtracking_patterns=True,
)
Sampling & rate limiting
Suppress noisy logs:
from structguru import configure
configure(sample_rate=0.1, rate_limit_max=5, rate_limit_period=60)
Metric extraction
Derive metrics from log events:
from structguru import MetricProcessor, configure
metrics = MetricProcessor()
metrics.counter("user.login", lambda ed: login_counter.inc())
metrics.histogram("db.query", "duration_ms", lambda v, ed: query_hist.observe(v))
configure(metric_processor=metrics)
Exception formatting
Render exceptions as JSON-serializable dictionaries:
from structguru import configure
configure(structured_exceptions=True, exception_max_frames=20)
exception_max_frames=0 omits traceback frames entirely. Negative frame and
local-representation limits are rejected during configuration.
OpenTelemetry correlation
Inject trace context into every log event:
from structguru import configure
configure(otel=True) # no-op injection when opentelemetry-api is absent
Non-blocking logging
Since v1.0, log I/O is offloaded to a background thread by default. The native
Rust writer uses a bounded 8192-record queue with lossless backpressure. Set
overflow="drop" to favor caller latency, or explicitly pass maxsize=0 only
when an unbounded queue is acceptable.
Native runtime
structguru ships a required Rust extension that renders and enqueues logging
natively, off-thread. It is auto-enabled at import time. The runtime does not depend on orjson;
exotic values (datetime, UUID, Enum, dataclasses) are converted natively
in Rust.
import structguru
# Native mode is already on. Logger calls route through the Rust renderer.
structguru.logger.info("order {id} accepted", id=987)
# → JSON line written to stdout by a background writer thread
No configuration is required for the default JSON-to-stdout behavior. Call
configure(...) to customize the renderer, filtering, or sinks.
import structguru
structguru.configure(service="myapp", level="INFO", file_path="/var/log/app.log")
structguru.logger.bind(request_id="abc").info("order {id} accepted", id=987)
# → JSON line written to /var/log/app.log by a background writer thread
The default import-time configuration also honors environment variables:
LOG_LEVEL=INFO STRUCTGURU_SERVICE=myapp python -m myapp
Invalid native environment values fail import with an actionable exception. This prevents a deployment from starting while the native-only logging path is disabled.
Public API:
| Symbol | Purpose |
|---|---|
configure(...) |
Configure rendering, filtering, redaction, and output sinks. See the API reference for the complete signature. |
shutdown() |
Stop the writer; logging is disabled until configure() is called. |
set_level(level) |
Adjust the level threshold at runtime. |
writer_metrics() |
Writer counters (enqueued/written/dropped/depth/...) plus filter counters (sampled/rate_limited) when active. |
is_available() |
Whether the compiled extension is importable. |
Behavior notes:
- Overflow: the default
maxsize=8192usesoverflow="block"for bounded, lossless backpressure. Useoverflow="drop"for drop-newest behavior with metrics and rate-limited warnings.maxsize=0explicitly opts into an unbounded queue. - Redaction, level filtering, exceptions, and OpenTelemetry injection are supported natively; redaction covers the message and all structured string values before rendering or Sentry export.
sensitive_keysoverrides the default redaction keys. Rust's linear-time regex engine rejects backreferences and look-around withValueErrorat configuration time. - Sampling & rate limiting (
sample_rate,rate_limit_max,rate_limit_period) are applied as native pre-render filters — dropped records cost zero rendering.sampledandrate_limitedcounters are distinct from the transportdroppedcounter.sample_max_levelrestricts sampling to records at or below that level; more severe records always pass. - Metric hooks (
metric_processor=...) invoke a structlog-style processor (e.g.MetricProcessor) for every kept record on the caller's thread, with(None, method, {"event": message, **fields}). Dropped records (level/sampling/rate-limit) never reach it; hook errors are swallowed. - Fork/shutdown safe — the writer is flushed on exit and respawned in forked children (gunicorn/celery prefork). Rotating-file writers sharing a path coordinate through an owner-only
.locksidecar; distributed hosts should still prefer stdout and an external collector. - Structured exceptions (
structured_exceptions=True) rendertype,message,module, and frames as a dictionary, with optional redacted/truncated locals controlled by theexception_*options. stack_infois supported natively: the stack is captured in Python and rendered in the same position asStackInfoRenderer(stackbetweenserviceandmessage). Unlike the standard path, the stack ends at the user's calling frame (structguru-internal frames are skipped, the way structlog skips its own).- Console mode (
format="console"): renders colored, human-readable lines instead of JSON — structguru's own stable dev format (<timestamp> [<LEVEL>] <message> k=v), with ANSI colors by default on a TTY. Override withcolors=True/False. - File sinks (
file_path=...): write to a rotating file natively. Defaults mirrorRotatingFileHandler(50 MB, 5 backups); configure viafile_max_bytes/file_backup_count. Setalso_stdout=Trueto mirror output to both file and stdout (e.g. container + persistent log). - Callable sinks (
callable_sinks=[fn, ...]): use a bounded queue (callable_queue_maxsize=1024).overflow="block"provides lossless backpressure;overflow="drop"reportscallable_droppedmetrics. Flush and lifecycle operations drain queued calls. - Sentry integration (
sentry_processor=SentryProcessor(...)): receives the already-redacted event and rawexc_infoonly for exception capture. - Scope: the native renderer covers JSON and console rendering, file/stdout/callable sinks, redaction, sampling/rate limiting, metrics, exceptions, and stack information.
logger.add()sinks receive native and stdlib records.
Framework integrations
ASGI (FastAPI / Starlette)
from structguru.integrations.asgi import StructguruMiddleware
app = FastAPI()
app.add_middleware(StructguruMiddleware, request_id_header="X-Request-ID")
Celery
from structguru.integrations.celery import setup_celery_logging
setup_celery_logging(propagate_context=True, context_keys=["request_id"])
# Binds task_id/task_name to context, propagates selected keys via headers
Flask
from structguru.integrations.flask import setup_flask_logging
app = Flask(__name__)
setup_flask_logging(app, request_id_header="X-Request-ID")
Django
# settings.py
from structguru.integrations.django import build_logging_config, StructguruMiddleware
LOGGING = build_logging_config(service="myapp", level="INFO", json_logs=True)
MIDDLEWARE = ["structguru.integrations.django.StructguruMiddleware", ...]
SQLAlchemy
from structguru.integrations.sqlalchemy import setup_query_logging
setup_query_logging(engine, slow_threshold_ms=100, log_all=False)
gRPC
from structguru.integrations.grpc import StructguruInterceptor
server = grpc.server(
futures.ThreadPoolExecutor(),
interceptors=[StructguruInterceptor()],
)
Sentry
import logging
from structguru import configure
from structguru.integrations.sentry import SentryProcessor
sentry = SentryProcessor(event_level=logging.ERROR, tag_keys=frozenset({"service"}))
configure(sentry_processor=sentry)
Stdlib bridge
Third-party libraries log through the standard logging module. Installing the
bridge re-emits those records through structguru, so they share the same JSON /
console formatting, redaction, and output stream as your own logs:
from structguru.integrations.stdlib import install_stdlib_bridge
bridge = install_stdlib_bridge(level="INFO", suppress_loggers=("urllib3", "botocore"))
import logging
logging.getLogger("sqlalchemy.engine").info("SELECT 1")
# → {"logger":"sqlalchemy.engine","level":"INFO",...,"message":"SELECT 1"}
While the bridge is installed, logger.add() sinks receive third-party records
only through it — rendered once, never also raw. Pass the returned handler to
uninstall_stdlib_bridge() to restore the previous behavior.
Requirements
- Python 3.11+
- The compiled Rust extension (shipped as abi3 wheels for Linux/macOS/Windows)
Documentation & Examples
- Integrations Guide — Detailed instructions for setting up frameworks.
- Full-stack Example — FastAPI + Celery + SQLAlchemy in action.
Development
uv sync --all-extras
uv run pytest
make bench
uv run ruff check .
uv run mypy src/
License
MIT — Copyright (c) 2025 Aleksandr Pavlov
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 Distributions
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 structguru-1.0.5.tar.gz.
File metadata
- Download URL: structguru-1.0.5.tar.gz
- Upload date:
- Size: 74.3 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.13
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
c313b0eeac70d7f02f0710b7eb61413ad3d429ddef9fc6f68fed773bb8ce4d0f
|
|
| MD5 |
378b92504c938a82424e061a0116a842
|
|
| BLAKE2b-256 |
dec355031a218f8a0e77cd8a718be89bdc89572aa076744a7f69ac969043bf84
|
Provenance
The following attestation bundles were made for structguru-1.0.5.tar.gz:
Publisher:
wheels.yml on kidoz/structguru
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
structguru-1.0.5.tar.gz -
Subject digest:
c313b0eeac70d7f02f0710b7eb61413ad3d429ddef9fc6f68fed773bb8ce4d0f - Sigstore transparency entry: 2251271074
- Sigstore integration time:
-
Permalink:
kidoz/structguru@147ce2f0d9b951abe2c02957039ada0868494ff3 -
Branch / Tag:
refs/tags/v1.0.5 - Owner: https://github.com/kidoz
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
wheels.yml@147ce2f0d9b951abe2c02957039ada0868494ff3 -
Trigger Event:
push
-
Statement type:
File details
Details for the file structguru-1.0.5-cp311-abi3-win_amd64.whl.
File metadata
- Download URL: structguru-1.0.5-cp311-abi3-win_amd64.whl
- Upload date:
- Size: 894.5 kB
- Tags: CPython 3.11+, Windows x86-64
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.13
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
f376624ce32f0c82e50b268998725a5737f3cb86485a4268a3361fc56a0e4047
|
|
| MD5 |
c94fd6f594fb94d9d15bb1d7944b440c
|
|
| BLAKE2b-256 |
93bd25b8d180e6f3bcd33bc878ae358c2b5f3c8904c8fea558857ecf4f0d1cca
|
Provenance
The following attestation bundles were made for structguru-1.0.5-cp311-abi3-win_amd64.whl:
Publisher:
wheels.yml on kidoz/structguru
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
structguru-1.0.5-cp311-abi3-win_amd64.whl -
Subject digest:
f376624ce32f0c82e50b268998725a5737f3cb86485a4268a3361fc56a0e4047 - Sigstore transparency entry: 2251273815
- Sigstore integration time:
-
Permalink:
kidoz/structguru@147ce2f0d9b951abe2c02957039ada0868494ff3 -
Branch / Tag:
refs/tags/v1.0.5 - Owner: https://github.com/kidoz
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
wheels.yml@147ce2f0d9b951abe2c02957039ada0868494ff3 -
Trigger Event:
push
-
Statement type:
File details
Details for the file structguru-1.0.5-cp311-abi3-musllinux_1_2_x86_64.whl.
File metadata
- Download URL: structguru-1.0.5-cp311-abi3-musllinux_1_2_x86_64.whl
- Upload date:
- Size: 1.2 MB
- Tags: CPython 3.11+, musllinux: musl 1.2+ x86-64
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.13
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
e9805b066883e39e5134e151b931e0414cab8cf528b1cfdccce8a93f103f29df
|
|
| MD5 |
552982a1f8e0a71ea11aa20145fb6a9e
|
|
| BLAKE2b-256 |
1734d93d37689a809985c36785fab762a8bb9703e23a9f07f2d4635a69e3ca2e
|
Provenance
The following attestation bundles were made for structguru-1.0.5-cp311-abi3-musllinux_1_2_x86_64.whl:
Publisher:
wheels.yml on kidoz/structguru
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
structguru-1.0.5-cp311-abi3-musllinux_1_2_x86_64.whl -
Subject digest:
e9805b066883e39e5134e151b931e0414cab8cf528b1cfdccce8a93f103f29df - Sigstore transparency entry: 2251271900
- Sigstore integration time:
-
Permalink:
kidoz/structguru@147ce2f0d9b951abe2c02957039ada0868494ff3 -
Branch / Tag:
refs/tags/v1.0.5 - Owner: https://github.com/kidoz
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
wheels.yml@147ce2f0d9b951abe2c02957039ada0868494ff3 -
Trigger Event:
push
-
Statement type:
File details
Details for the file structguru-1.0.5-cp311-abi3-musllinux_1_2_aarch64.whl.
File metadata
- Download URL: structguru-1.0.5-cp311-abi3-musllinux_1_2_aarch64.whl
- Upload date:
- Size: 1.1 MB
- Tags: CPython 3.11+, musllinux: musl 1.2+ ARM64
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.13
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
ebd3b5efe48f7e6d5e79dce777a48e3509da1369e5ff7e4201a21a224a0a0bce
|
|
| MD5 |
6adeb1bd6f48d786a832f64ad321fc36
|
|
| BLAKE2b-256 |
4a8fe2a4472d058e6b361b4b0ff4d824d964ced798c85df4441ff867845008c4
|
Provenance
The following attestation bundles were made for structguru-1.0.5-cp311-abi3-musllinux_1_2_aarch64.whl:
Publisher:
wheels.yml on kidoz/structguru
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
structguru-1.0.5-cp311-abi3-musllinux_1_2_aarch64.whl -
Subject digest:
ebd3b5efe48f7e6d5e79dce777a48e3509da1369e5ff7e4201a21a224a0a0bce - Sigstore transparency entry: 2251272767
- Sigstore integration time:
-
Permalink:
kidoz/structguru@147ce2f0d9b951abe2c02957039ada0868494ff3 -
Branch / Tag:
refs/tags/v1.0.5 - Owner: https://github.com/kidoz
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
wheels.yml@147ce2f0d9b951abe2c02957039ada0868494ff3 -
Trigger Event:
push
-
Statement type:
File details
Details for the file structguru-1.0.5-cp311-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.
File metadata
- Download URL: structguru-1.0.5-cp311-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
- Upload date:
- Size: 953.3 kB
- Tags: CPython 3.11+, manylinux: glibc 2.17+ x86-64
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.13
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
f5e904215f1e07c0c10291d724d6f31718aa0430656663b47c67be2bb0212d66
|
|
| MD5 |
aae851ff1e83522b6aa77182fb3209b6
|
|
| BLAKE2b-256 |
939ca127dcde7944c140f334aa4c1ee004a96bec874dff6eb03f68f12ee3db6b
|
Provenance
The following attestation bundles were made for structguru-1.0.5-cp311-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl:
Publisher:
wheels.yml on kidoz/structguru
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
structguru-1.0.5-cp311-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl -
Subject digest:
f5e904215f1e07c0c10291d724d6f31718aa0430656663b47c67be2bb0212d66 - Sigstore transparency entry: 2251273323
- Sigstore integration time:
-
Permalink:
kidoz/structguru@147ce2f0d9b951abe2c02957039ada0868494ff3 -
Branch / Tag:
refs/tags/v1.0.5 - Owner: https://github.com/kidoz
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
wheels.yml@147ce2f0d9b951abe2c02957039ada0868494ff3 -
Trigger Event:
push
-
Statement type:
File details
Details for the file structguru-1.0.5-cp311-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl.
File metadata
- Download URL: structguru-1.0.5-cp311-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
- Upload date:
- Size: 914.6 kB
- Tags: CPython 3.11+, manylinux: glibc 2.17+ ARM64
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.13
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
3a998a8d6055ec52f7c21065238cab989a26b2dbed0a29ecd42082598f9140ae
|
|
| MD5 |
a0a9f5ec96045f4a7cef2a8ff075dc44
|
|
| BLAKE2b-256 |
dfdaf24d8c012c95d51c56521bf7475c2c6891566314f4238b10bfa500d418bb
|
Provenance
The following attestation bundles were made for structguru-1.0.5-cp311-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl:
Publisher:
wheels.yml on kidoz/structguru
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
structguru-1.0.5-cp311-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl -
Subject digest:
3a998a8d6055ec52f7c21065238cab989a26b2dbed0a29ecd42082598f9140ae - Sigstore transparency entry: 2251275218
- Sigstore integration time:
-
Permalink:
kidoz/structguru@147ce2f0d9b951abe2c02957039ada0868494ff3 -
Branch / Tag:
refs/tags/v1.0.5 - Owner: https://github.com/kidoz
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
wheels.yml@147ce2f0d9b951abe2c02957039ada0868494ff3 -
Trigger Event:
push
-
Statement type:
File details
Details for the file structguru-1.0.5-cp311-abi3-macosx_11_0_arm64.whl.
File metadata
- Download URL: structguru-1.0.5-cp311-abi3-macosx_11_0_arm64.whl
- Upload date:
- Size: 874.4 kB
- Tags: CPython 3.11+, macOS 11.0+ ARM64
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.13
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
37a4c64c344d078fe92b6c05c66a209c24a06bf704cd5e487020aa0de91811e3
|
|
| MD5 |
461c679ce661ae185dbdae4a7a409e85
|
|
| BLAKE2b-256 |
b87d5881ed5b51f87a3c0fab9e275c0696e81eb20e30d5ac89089c1e3e69642b
|
Provenance
The following attestation bundles were made for structguru-1.0.5-cp311-abi3-macosx_11_0_arm64.whl:
Publisher:
wheels.yml on kidoz/structguru
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
structguru-1.0.5-cp311-abi3-macosx_11_0_arm64.whl -
Subject digest:
37a4c64c344d078fe92b6c05c66a209c24a06bf704cd5e487020aa0de91811e3 - Sigstore transparency entry: 2251274320
- Sigstore integration time:
-
Permalink:
kidoz/structguru@147ce2f0d9b951abe2c02957039ada0868494ff3 -
Branch / Tag:
refs/tags/v1.0.5 - Owner: https://github.com/kidoz
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
wheels.yml@147ce2f0d9b951abe2c02957039ada0868494ff3 -
Trigger Event:
push
-
Statement type:
File details
Details for the file structguru-1.0.5-cp311-abi3-macosx_10_12_x86_64.whl.
File metadata
- Download URL: structguru-1.0.5-cp311-abi3-macosx_10_12_x86_64.whl
- Upload date:
- Size: 906.0 kB
- Tags: CPython 3.11+, macOS 10.12+ x86-64
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.13
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
af62c93e34523f825572a2d1d5d993b942b9650c8788fa48c6cd06cba0cbce94
|
|
| MD5 |
8444d1ca57be7a51e1b19ed8d830094d
|
|
| BLAKE2b-256 |
b214b7aa427571cebc4a63773140ecf0fccfa4186ed0e79020d6115aa3cd7ed3
|
Provenance
The following attestation bundles were made for structguru-1.0.5-cp311-abi3-macosx_10_12_x86_64.whl:
Publisher:
wheels.yml on kidoz/structguru
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
structguru-1.0.5-cp311-abi3-macosx_10_12_x86_64.whl -
Subject digest:
af62c93e34523f825572a2d1d5d993b942b9650c8788fa48c6cd06cba0cbce94 - Sigstore transparency entry: 2251274807
- Sigstore integration time:
-
Permalink:
kidoz/structguru@147ce2f0d9b951abe2c02957039ada0868494ff3 -
Branch / Tag:
refs/tags/v1.0.5 - Owner: https://github.com/kidoz
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
wheels.yml@147ce2f0d9b951abe2c02957039ada0868494ff3 -
Trigger Event:
push
-
Statement type: