Пример
github.com/sirupsen/logrus v1.10.2: Fields
Проверенный пример — golang github.com/sirupsen/logrus v1.10.2: Fields. Контракт выполнен на go 1.26 · linux debian/x64 · docker и пройден.
sha256:a7630787524ea035afec300a53917db2b9bf2d48cfc2f5d57207c0bd6dc331f1
Эта сеть предлагает одно: образец, который собирается. Она запустила его в песочнице и сохранила подписанную квитанцию. Она ничего не оценивает и ничего не гарантирует — собирается ли тот же код у вас, она не измеряла.
Сколько различных ключей подписи подали пройденную квитанцию контракта. Один — только автор; больше одного — значит, кто-то ещё тоже собрал. Ключ создаётся сам и не имеет зарегистрированной личности, поэтому считаются ключи, а не люди.
MIT-0
Свидетельства выполнения
Заявленное окружение и подписанные запуски разделены, чтобы вы точно видели, что этот образец запускал и где.
- Основа свидетельства
- Подписанный контракт пройден
- Квитанции проверки
- 1
- Ключи подписи, собравшие его
- 1
Заявленная среда
linux 24 · ubuntu · glibc 2.39 x64 go
Среды запусков проверки
| Окружение | Контракт | Этапы | Запуск |
|---|---|---|---|
| go 1.26 · linux debian/x64 · docker ed25519:c1973797be207ac4 | PASS | compile:SKIPPED · contract:PASS · load:PASS · resolve:PASS CONTAINER_RUN · golang@1golang:1.26@sha256:e30143be198a… |
2026-10-10 |
Кейс
HOW- Цель
- verify github.com/sirupsen/logrus.Fields in pkg:golang/github.com/sirupsen/logrus@v1.10.2
- Символы
-
- github.com/sirupsen/logrus.Fields
- Создан
- 2026-10-10T14:59:13Z
Контракт
- Fields map sets structured contextual fields on a log Entry via WithFields
- WithFields chains incrementally merging subsequent Fields and overwriting existing keys
- Entry Data property preserves all key-value pairs assigned through Fields
- JSONFormatter encodes all Fields into key-value JSON properties in log output
Файлы
- PROMPT.md
- csx.json
- fields.go
- go.mod
- go.sum
- spec.json
- test/contract.go
Исходный код
Clean-room public code sample — generation instructions
Write a brand-new, minimal, self-contained code sample in this clean-room directory.
Do not copy, paraphrase, or reference any existing project source. Work only from this spec.
A csx.json manifest scaffold already exists. Do not recreate it from memory. Preserve its case.goal, packages and symbols; fill its empty case.contract with exact assertions and correct its environment, commands and verifierAdapter for the files you generate.
Goal: verify github.com/sirupsen/logrus.Fields in pkg:golang/github.com/sirupsen/logrus@v1.10.2
Kind: HOW
Use EXACTLY these public packages and versions:
- pkg:golang/github.com/sirupsen/logrus@v1.10.2
Demonstrate these symbols/APIs:
- github.com/sirupsen/logrus.Fields
Rules:
- One focused purpose; the smallest project that proves the goal.
- Include a contract test (test/contract.*) that runs OFFLINE and exits 0 exactly when the goal behavior works.
- Pin every dependency with a lockfile so resolution is reproducible.
- No secrets, credentials, or tokens. No real URLs (only example.com or localhost). No absolute paths.
- No personal names, emails, company names, or project identifiers of any kind.
- No binaries and no generated output (node_modules, dist, target, venv, .git, .env).
- Keep it under 200 files and 256KB packed.
{"case":{"caseId":"case:sha256:ba3ae4b022b810c48fc1af2cad61887eaba99b6295fb41484d0a3149b8fe9c62","contract":["Fields map sets structured contextual fields on a log Entry via WithFields","WithFields chains incrementally merging subsequent Fields and overwriting existing keys","Entry Data property preserves all key-value pairs assigned through Fields","JSONFormatter encodes all Fields into key-value JSON properties in log output"],"goal":"verify github.com/sirupsen/logrus.Fields in pkg:golang/github.com/sirupsen/logrus@v1.10.2","kind":"HOW","packages":["pkg:golang/github.com/sirupsen/logrus@v1.10.2"],"schemaVersion":1,"symbols":["github.com/sirupsen/logrus.Fields"]},"contractCommand":["go","run","./test"],"environment":{"arch":"x64","distro":"ubuntu","ecosystem":"golang","libc":"glibc","libcVersion":"2.39","os":"linux","osVersionBucket":"24","packageManager":"go","schemaVersion":1},"license":"MIT-0","packages":["pkg:golang/github.com/sirupsen/logrus@v1.10.2"],"schemaVersion":1,"subject":"pkg:golang/github.com/sirupsen/logrus@v1.10.2","symbols":["github.com/sirupsen/logrus.Fields"],"verifierAdapter":"golang@1"}
package sample
import (
"bytes"
"github.com/sirupsen/logrus"
)
// LogWithFields creates a log entry with the provided Fields and returns it.
func LogWithFields(logger *logrus.Logger, fields logrus.Fields) *logrus.Entry {
if logger == nil {
logger = logrus.New()
}
return logger.WithFields(fields)
}
// MergeFields chains additional fields into an existing Entry.
func MergeFields(entry *logrus.Entry, extra logrus.Fields) *logrus.Entry {
return entry.WithFields(extra)
}
// FormatJSON writes log output formatted with JSONFormatter into a buffer.
func FormatJSON(fields logrus.Fields, msg string) (string, error) {
var buf bytes.Buffer
logger := logrus.New()
logger.SetOutput(&buf)
logger.SetFormatter(&logrus.JSONFormatter{})
logger.WithFields(fields).Info(msg)
return buf.String(), nil
}
module sample
go 1.26.6
require github.com/sirupsen/logrus v1.10.2
require golang.org/x/sys v0.13.0 // indirect
github.com/sirupsen/logrus v1.10.2 h1:G2SED73/qrAu6YwbdxOD6peLkCBI3z7L+ykJFTXJBBo=
github.com/sirupsen/logrus v1.10.2/go.mod h1:SLEg8TqYulVKKfIGHldVp2K2aYz2DKSVBq4g/H5bR7Q=
github.com/stretchr/testify v1.12.1 h1:EuwCh5fleGS7H32xRwO3wRGT7DxrDhLAT6FF8MpWDWE=
github.com/stretchr/testify v1.12.1/go.mod h1:MDEgiDPPsNp5cuIrHPPCyornHKgEVbtFUmoNlxoYthg=
go.yaml.in/yaml/v3 v3.0.5 h1:N6y/pJk8buWs9NY5ERU2HSMfm+IuD/OtfdAnq6kESPw=
go.yaml.in/yaml/v3 v3.0.5/go.mod h1:HVTZu1O7/Vkt2N+BFy8Zza+lnLsABggaTM2ZpNIGuKg=
golang.org/x/sys v0.13.0 h1:Af8nKPmuFypiUBjVoU9V20FiaFXOcuZI21p0ycVYYGE=
golang.org/x/sys v0.13.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
{
"schemaVersion": 1,
"goal": "verify github.com/sirupsen/logrus.Fields in pkg:golang/github.com/sirupsen/logrus@v1.10.2",
"kind": "HOW",
"packages": [
"pkg:golang/github.com/sirupsen/logrus@v1.10.2"
],
"symbols": [
"github.com/sirupsen/logrus.Fields"
]
}
package main
import (
"bytes"
"encoding/json"
"fmt"
"os"
"github.com/sirupsen/logrus"
"sample"
)
func main() {
fmt.Println("Running contract tests for github.com/sirupsen/logrus.Fields...")
// Assertion 1: Fields map sets structured contextual fields on a log Entry via WithFields
{
f := logrus.Fields{
"app": "test-service",
"attempt": 1,
"active": true,
}
logger := logrus.New()
var buf bytes.Buffer
logger.SetOutput(&buf)
entry := sample.LogWithFields(logger, f)
if entry == nil {
fmt.Fprintf(os.Stderr, "Assertion 1 failed: entry is nil\n")
os.Exit(1)
}
if entry.Data["app"] != "test-service" || entry.Data["attempt"] != 1 || entry.Data["active"] != true {
fmt.Fprintf(os.Stderr, "Assertion 1 failed: entry.Data mismatch: %v\n", entry.Data)
os.Exit(1)
}
fmt.Println(" ✓ Assertion 1 passed: Fields sets structured contextual fields via WithFields")
}
// Assertion 2: WithFields chains incrementally merging subsequent Fields and overwriting existing keys
{
logger := logrus.New()
var buf bytes.Buffer
logger.SetOutput(&buf)
baseFields := logrus.Fields{
"service": "auth",
"status": "pending",
"count": 10,
}
entry1 := logger.WithFields(baseFields)
overrideFields := logrus.Fields{
"status": "completed", // overwrites pending
"worker": 4, // new field
}
entry2 := sample.MergeFields(entry1, overrideFields)
if entry2.Data["service"] != "auth" {
fmt.Fprintf(os.Stderr, "Assertion 2 failed: service field lost\n")
os.Exit(1)
}
if entry2.Data["status"] != "completed" {
fmt.Fprintf(os.Stderr, "Assertion 2 failed: status field not overwritten: %v\n", entry2.Data["status"])
os.Exit(1)
}
if entry2.Data["worker"] != 4 {
fmt.Fprintf(os.Stderr, "Assertion 2 failed: worker field missing\n")
os.Exit(1)
}
if entry2.Data["count"] != 10 {
fmt.Fprintf(os.Stderr, "Assertion 2 failed: count field lost\n")
os.Exit(1)
}
// Ensure entry1 was not mutated (immutability of entry data chaining)
if entry1.Data["status"] != "pending" {
fmt.Fprintf(os.Stderr, "Assertion 2 failed: entry1 mutated\n")
os.Exit(1)
}
fmt.Println(" ✓ Assertion 2 passed: WithFields chains and merges subsequent Fields with overwrite")
}
// Assertion 3: Entry Data property preserves all key-value pairs assigned through Fields
{
complexFields := logrus.Fields{
"string_val": "hello",
"int_val": 42,
"float_val": 3.14,
"bool_val": false,
"slice_val": []string{"a", "b", "c"},
}
entry := logrus.WithFields(complexFields)
if entry.Data["string_val"] != "hello" {
fmt.Fprintf(os.Stderr, "Assertion 3 failed: string_val mismatch\n")
os.Exit(1)
}
if entry.Data["int_val"] != 42 {
fmt.Fprintf(os.Stderr, "Assertion 3 failed: int_val mismatch\n")
os.Exit(1)
}
if entry.Data["float_val"] != 3.14 {
fmt.Fprintf(os.Stderr, "Assertion 3 failed: float_val mismatch\n")
os.Exit(1)
}
if entry.Data["bool_val"] != false {
fmt.Fprintf(os.Stderr, "Assertion 3 failed: bool_val mismatch\n")
os.Exit(1)
}
sliceVal, ok := entry.Data["slice_val"].([]string)
if !ok || len(sliceVal) != 3 || sliceVal[0] != "a" {
fmt.Fprintf(os.Stderr, "Assertion 3 failed: slice_val mismatch\n")
os.Exit(1)
}
fmt.Println(" ✓ Assertion 3 passed: Entry Data property preserves all types assigned through Fields")
}
// Assertion 4: JSONFormatter encodes all Fields into key-value JSON properties in log output
{
testFields := logrus.Fields{
"component": "database",
"latency_ms": 150,
"successful": true,
}
out, err := sample.FormatJSON(testFields, "query executed")
if err != nil {
fmt.Fprintf(os.Stderr, "Assertion 4 failed: %v\n", err)
os.Exit(1)
}
var parsed map[string]interface{}
if err := json.Unmarshal([]byte(out), &parsed); err != nil {
fmt.Fprintf(os.Stderr, "Assertion 4 failed to parse JSON output: %v\nOutput: %s\n", err, out)
os.Exit(1)
}
if parsed["component"] != "database" {
fmt.Fprintf(os.Stderr, "Assertion 4 failed: JSON missing component field\n")
os.Exit(1)
}
if parsed["latency_ms"] != float64(150) {
fmt.Fprintf(os.Stderr, "Assertion 4 failed: JSON latency_ms mismatch: %v\n", parsed["latency_ms"])
os.Exit(1)
}
if parsed["successful"] != true {
fmt.Fprintf(os.Stderr, "Assertion 4 failed: JSON successful field mismatch\n")
os.Exit(1)
}
if parsed["msg"] != "query executed" {
fmt.Fprintf(os.Stderr, "Assertion 4 failed: JSON msg mismatch\n")
os.Exit(1)
}
fmt.Println(" ✓ Assertion 4 passed: JSONFormatter encodes Fields into structured JSON output")
}
fmt.Println("All contract assertions passed successfully.")
}
Исходный сидер
аноним