Skip to content

Commit 65edb6e

Browse files
committed
chore: add postgres utilities and migration CLI
1 parent b100082 commit 65edb6e

File tree

10 files changed

+482
-15
lines changed

10 files changed

+482
-15
lines changed

cmd/migrate/down-to.go

Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
package main
2+
3+
import (
4+
"context"
5+
"fmt"
6+
7+
"github.com/pressly/goose/v3"
8+
"github.com/spf13/cobra"
9+
)
10+
11+
func newDownToCommand(ctx context.Context, dsn, dir *string) *cobra.Command {
12+
cmd := &cobra.Command{
13+
Use: "down-to",
14+
Short: "Migrate down to a specific version",
15+
Args: cobra.NoArgs,
16+
RunE: func(cmd *cobra.Command, args []string) error {
17+
db, err := goose.OpenDBWithDriver("pgx", *dsn)
18+
if err != nil {
19+
return err
20+
}
21+
22+
defer func() {
23+
_ = db.Close()
24+
}()
25+
26+
version, err := cmd.Flags().GetInt64("version")
27+
if err != nil {
28+
return err
29+
}
30+
31+
if version <= 0 {
32+
return fmt.Errorf("version must be positive")
33+
}
34+
35+
if err = goose.SetDialect("pgx"); err != nil {
36+
return err
37+
}
38+
39+
return goose.DownToContext(ctx, db, *dir, version)
40+
},
41+
}
42+
43+
cmd.Flags().Int64P("version", "v", 0, "version to migrate down to")
44+
_ = cmd.MarkFlagRequired("version")
45+
46+
return cmd
47+
}

cmd/migrate/down.go

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
package main
2+
3+
import (
4+
"context"
5+
6+
_ "github.com/jackc/pgx/v5/stdlib"
7+
"github.com/pressly/goose/v3"
8+
"github.com/spf13/cobra"
9+
)
10+
11+
func newDownCommand(ctx context.Context, dsn, dir *string) *cobra.Command {
12+
cmd := &cobra.Command{
13+
Use: "down",
14+
Short: "Migrate down",
15+
Args: cobra.NoArgs,
16+
RunE: func(cmd *cobra.Command, args []string) error {
17+
db, err := goose.OpenDBWithDriver("pgx", *dsn)
18+
if err != nil {
19+
return err
20+
}
21+
22+
defer func() {
23+
_ = db.Close()
24+
}()
25+
26+
if err = goose.SetDialect("pgx"); err != nil {
27+
return err
28+
}
29+
30+
return goose.DownContext(ctx, db, *dir)
31+
},
32+
}
33+
34+
return cmd
35+
}

cmd/migrate/main.go

Lines changed: 57 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,62 @@
11
package main
22

33
import (
4-
_ "github.com/pressly/goose/v3"
4+
"context"
5+
"fmt"
6+
"os"
7+
"os/signal"
8+
"syscall"
9+
10+
"github.com/joho/godotenv"
11+
"github.com/spf13/cobra"
12+
13+
"github.com/pixel365/pulse/internal/db/postgres"
14+
)
15+
16+
var (
17+
dsn string
18+
migrationsDir string
519
)
620

7-
func main() {}
21+
func rootCommand(ctx context.Context) *cobra.Command {
22+
cmd := &cobra.Command{
23+
Use: "migrate",
24+
Short: "Migrate database",
25+
PersistentPreRunE: func(cmd *cobra.Command, args []string) error {
26+
migrationsDir = os.Getenv("POSTGRES_MIGRATIONS_DIR")
27+
if migrationsDir == "" {
28+
return fmt.Errorf("POSTGRES_MIGRATIONS_DIR not set")
29+
}
30+
31+
pgConfig := postgres.NewConfigFromEnv()
32+
if err := pgConfig.Validate(); err != nil {
33+
return err
34+
}
35+
36+
dsn = pgConfig.DSN()
37+
38+
return nil
39+
},
40+
}
41+
42+
cmd.AddCommand(
43+
newUpCommand(ctx, &dsn, &migrationsDir),
44+
newUpToCommand(ctx, &dsn, &migrationsDir),
45+
newDownCommand(ctx, &dsn, &migrationsDir),
46+
newDownToCommand(ctx, &dsn, &migrationsDir),
47+
)
48+
49+
return cmd
50+
}
51+
52+
func main() {
53+
ctx, stop := signal.NotifyContext(context.Background(), os.Interrupt, syscall.SIGTERM)
54+
defer stop()
55+
56+
_ = godotenv.Load()
57+
58+
if err := rootCommand(ctx).Execute(); err != nil {
59+
stop()
60+
os.Exit(1)
61+
}
62+
}

cmd/migrate/up-to.go

Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
package main
2+
3+
import (
4+
"context"
5+
"fmt"
6+
7+
"github.com/pressly/goose/v3"
8+
"github.com/spf13/cobra"
9+
)
10+
11+
func newUpToCommand(ctx context.Context, dsn, dir *string) *cobra.Command {
12+
cmd := &cobra.Command{
13+
Use: "up-to",
14+
Short: "Migrate up to a specific version",
15+
Args: cobra.NoArgs,
16+
RunE: func(cmd *cobra.Command, args []string) error {
17+
db, err := goose.OpenDBWithDriver("pgx", *dsn)
18+
if err != nil {
19+
return err
20+
}
21+
22+
defer func() {
23+
_ = db.Close()
24+
}()
25+
26+
version, err := cmd.Flags().GetInt64("version")
27+
if err != nil {
28+
return err
29+
}
30+
31+
if version <= 0 {
32+
return fmt.Errorf("version must be positive")
33+
}
34+
35+
if err = goose.SetDialect("pgx"); err != nil {
36+
return err
37+
}
38+
39+
return goose.UpToContext(ctx, db, *dir, version)
40+
},
41+
}
42+
43+
cmd.Flags().Int64P("version", "v", 0, "version to migrate to")
44+
_ = cmd.MarkFlagRequired("version")
45+
46+
return cmd
47+
}

cmd/migrate/up.go

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
package main
2+
3+
import (
4+
"context"
5+
6+
_ "github.com/jackc/pgx/v5/stdlib"
7+
"github.com/pressly/goose/v3"
8+
"github.com/spf13/cobra"
9+
)
10+
11+
func newUpCommand(ctx context.Context, dsn, dir *string) *cobra.Command {
12+
cmd := &cobra.Command{
13+
Use: "up",
14+
Short: "Migrate up",
15+
Args: cobra.NoArgs,
16+
RunE: func(cmd *cobra.Command, args []string) error {
17+
db, err := goose.OpenDBWithDriver("pgx", *dsn)
18+
if err != nil {
19+
return err
20+
}
21+
22+
defer func() {
23+
_ = db.Close()
24+
}()
25+
26+
if err = goose.SetDialect("pgx"); err != nil {
27+
return err
28+
}
29+
30+
return goose.UpContext(ctx, db, *dir)
31+
},
32+
}
33+
34+
return cmd
35+
}

go.mod

Lines changed: 18 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,30 +3,47 @@ module github.com/pixel365/pulse
33
go 1.26.1
44

55
require (
6+
github.com/exaring/otelpgx v0.10.0
67
github.com/go-playground/validator/v10 v10.30.2
78
github.com/goccy/go-yaml v1.19.2
89
github.com/google/uuid v1.6.0
10+
github.com/jackc/pgx/v5 v5.9.1
911
github.com/joho/godotenv v1.5.1
1012
github.com/miekg/dns v1.1.72
1113
github.com/pressly/goose/v3 v3.27.0
14+
github.com/spf13/cobra v1.10.2
1215
golang.org/x/sync v0.20.0
1316
google.golang.org/grpc v1.79.3
1417
)
1518

1619
require (
20+
github.com/cespare/xxhash/v2 v2.3.0 // indirect
1721
github.com/gabriel-vasile/mimetype v1.4.13 // indirect
22+
github.com/go-logr/logr v1.4.3 // indirect
23+
github.com/go-logr/stdr v1.2.2 // indirect
1824
github.com/go-playground/locales v0.14.1 // indirect
1925
github.com/go-playground/universal-translator v0.18.1 // indirect
26+
github.com/inconshreveable/mousetrap v1.1.0 // indirect
27+
github.com/jackc/pgpassfile v1.0.0 // indirect
28+
github.com/jackc/pgservicefile v0.0.0-20240606120523-5a60cdf6a761 // indirect
29+
github.com/jackc/puddle/v2 v2.2.2 // indirect
2030
github.com/leodido/go-urn v1.4.0 // indirect
2131
github.com/mfridman/interpolate v0.0.2 // indirect
2232
github.com/sethvargo/go-retry v0.3.0 // indirect
33+
github.com/spf13/pflag v1.0.10 // indirect
34+
go.opentelemetry.io/auto/sdk v1.2.1 // indirect
35+
go.opentelemetry.io/otel v1.42.0 // indirect
36+
go.opentelemetry.io/otel/metric v1.42.0 // indirect
37+
go.opentelemetry.io/otel/sdk v1.42.0 // indirect
38+
go.opentelemetry.io/otel/sdk/metric v1.42.0 // indirect
39+
go.opentelemetry.io/otel/trace v1.42.0 // indirect
2340
go.uber.org/multierr v1.11.0 // indirect
2441
golang.org/x/crypto v0.49.0 // indirect
2542
golang.org/x/mod v0.33.0 // indirect
2643
golang.org/x/net v0.51.0 // indirect
2744
golang.org/x/sys v0.42.0 // indirect
2845
golang.org/x/text v0.35.0 // indirect
2946
golang.org/x/tools v0.42.0 // indirect
30-
google.golang.org/genproto/googleapis/rpc v0.0.0-20260217215200-42d3e9bedb6d // indirect
47+
google.golang.org/genproto/googleapis/rpc v0.0.0-20260226221140-a57be14db171 // indirect
3148
google.golang.org/protobuf v1.36.11 // indirect
3249
)

go.sum

Lines changed: 39 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,16 @@
11
github.com/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UFvs=
22
github.com/cespare/xxhash/v2 v2.3.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=
3+
github.com/cpuguy83/go-md2man/v2 v2.0.6/go.mod h1:oOW0eioCTA6cOiMLiUPZOpcVxMig6NIQQ7OS05n1F4g=
4+
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
35
github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
46
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
57
github.com/dustin/go-humanize v1.0.1 h1:GzkhY7T5VNhEkwH0PVJgjz+fX1rhBrR7pRT3mDkpeCY=
68
github.com/dustin/go-humanize v1.0.1/go.mod h1:Mu1zIs6XwVuF/gI1OepvI0qD18qycQx+mFykh5fBlto=
9+
github.com/exaring/otelpgx v0.10.0 h1:NGGegdoBQM3jNZDKG8ENhigUcgBN7d7943L0YlcIpZc=
10+
github.com/exaring/otelpgx v0.10.0/go.mod h1:R5/M5LWsPPBZc1SrRE5e0DiU48bI78C1/GPTWs6I66U=
711
github.com/gabriel-vasile/mimetype v1.4.13 h1:46nXokslUBsAJE/wMsp5gtO500a4F3Nkz9Ufpk2AcUM=
812
github.com/gabriel-vasile/mimetype v1.4.13/go.mod h1:d+9Oxyo1wTzWdyVUPMmXFvp4F9tea18J8ufA774AB3s=
13+
github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A=
914
github.com/go-logr/logr v1.4.3 h1:CjnDlHq8ikf6E492q6eKboGOC0T8CDaOvkHCIg8idEI=
1015
github.com/go-logr/logr v1.4.3/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY=
1116
github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag=
@@ -26,6 +31,16 @@ github.com/google/go-cmp v0.7.0 h1:wk8382ETsv4JYUZwIsn6YpYiWiBsYLSJiTsyBybVuN8=
2631
github.com/google/go-cmp v0.7.0/go.mod h1:pXiqmnSA92OHEEa9HXL2W4E7lf9JzCmGVUdgjX3N/iU=
2732
github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0=
2833
github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
34+
github.com/inconshreveable/mousetrap v1.1.0 h1:wN+x4NVGpMsO7ErUn/mUI3vEoE6Jt13X2s0bqwp9tc8=
35+
github.com/inconshreveable/mousetrap v1.1.0/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw=
36+
github.com/jackc/pgpassfile v1.0.0 h1:/6Hmqy13Ss2zCq62VdNG8tM1wchn8zjSGOBJ6icpsIM=
37+
github.com/jackc/pgpassfile v1.0.0/go.mod h1:CEx0iS5ambNFdcRtxPj5JhEz+xB6uRky5eyVu/W2HEg=
38+
github.com/jackc/pgservicefile v0.0.0-20240606120523-5a60cdf6a761 h1:iCEnooe7UlwOQYpKFhBabPMi4aNAfoODPEFNiAnClxo=
39+
github.com/jackc/pgservicefile v0.0.0-20240606120523-5a60cdf6a761/go.mod h1:5TJZWKEWniPve33vlWYSoGYefn3gLQRzjfDlhSJ9ZKM=
40+
github.com/jackc/pgx/v5 v5.9.1 h1:uwrxJXBnx76nyISkhr33kQLlUqjv7et7b9FjCen/tdc=
41+
github.com/jackc/pgx/v5 v5.9.1/go.mod h1:mal1tBGAFfLHvZzaYh77YS/eC6IX9OWbRV1QIIM0Jn4=
42+
github.com/jackc/puddle/v2 v2.2.2 h1:PR8nw+E/1w0GLuRFSmiioY6UooMp6KJv0/61nB7icHo=
43+
github.com/jackc/puddle/v2 v2.2.2/go.mod h1:vriiEXHvEE654aYKXXjOvZM39qJ0q+azkZFrfEOc3H4=
2944
github.com/joho/godotenv v1.5.1 h1:7eLL/+HRGLY0ldzfGMeQkb7vMd0as4CfYvUVzLqw0N0=
3045
github.com/joho/godotenv v1.5.1/go.mod h1:f4LDr5Voq0i2e/R5DDNOoa2zzDfwtkZa6DnEwAbqwq4=
3146
github.com/leodido/go-urn v1.4.0 h1:WT9HwE9SGECu3lg4d/dIA+jxlljEa1/ffXKmRjqdmIQ=
@@ -44,24 +59,34 @@ github.com/pressly/goose/v3 v3.27.0 h1:/D30gVTuQhu0WsNZYbJi4DMOsx1lNq+6SkLe+Wp59
4459
github.com/pressly/goose/v3 v3.27.0/go.mod h1:3ZBeCXqzkgIRvrEMDkYh1guvtoJTU5oMMuDdkutoM78=
4560
github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec h1:W09IVJc94icq4NjY3clb7Lk8O1qJ8BdBEF8z0ibU0rE=
4661
github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec/go.mod h1:qqbHyh8v60DhA7CoWK5oRCqLrMHRGoxYCSS9EjAz6Eo=
62+
github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM=
4763
github.com/sethvargo/go-retry v0.3.0 h1:EEt31A35QhrcRZtrYFDTBg91cqZVnFL2navjDrah2SE=
4864
github.com/sethvargo/go-retry v0.3.0/go.mod h1:mNX17F0C/HguQMyMyJxcnU471gOZGxCLyYaFyAZraas=
65+
github.com/spf13/cobra v1.10.2 h1:DMTTonx5m65Ic0GOoRY2c16WCbHxOOw6xxezuLaBpcU=
66+
github.com/spf13/cobra v1.10.2/go.mod h1:7C1pvHqHw5A4vrJfjNwvOdzYu0Gml16OCs2GRiTUUS4=
67+
github.com/spf13/pflag v1.0.9/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg=
68+
github.com/spf13/pflag v1.0.10 h1:4EBh2KAYBwaONj6b2Ye1GiHfwjqyROoF4RwYO+vPwFk=
69+
github.com/spf13/pflag v1.0.10/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg=
70+
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
71+
github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=
72+
github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
4973
github.com/stretchr/testify v1.11.1 h1:7s2iGBzp5EwR7/aIZr8ao5+dra3wiQyKjjFuvgVKu7U=
5074
github.com/stretchr/testify v1.11.1/go.mod h1:wZwfW3scLgRK+23gO65QZefKpKQRnfz6sD981Nm4B6U=
5175
go.opentelemetry.io/auto/sdk v1.2.1 h1:jXsnJ4Lmnqd11kwkBV2LgLoFMZKizbCi5fNZ/ipaZ64=
5276
go.opentelemetry.io/auto/sdk v1.2.1/go.mod h1:KRTj+aOaElaLi+wW1kO/DZRXwkF4C5xPbEe3ZiIhN7Y=
53-
go.opentelemetry.io/otel v1.40.0 h1:oA5YeOcpRTXq6NN7frwmwFR0Cn3RhTVZvXsP4duvCms=
54-
go.opentelemetry.io/otel v1.40.0/go.mod h1:IMb+uXZUKkMXdPddhwAHm6UfOwJyh4ct1ybIlV14J0g=
55-
go.opentelemetry.io/otel/metric v1.40.0 h1:rcZe317KPftE2rstWIBitCdVp89A2HqjkxR3c11+p9g=
56-
go.opentelemetry.io/otel/metric v1.40.0/go.mod h1:ib/crwQH7N3r5kfiBZQbwrTge743UDc7DTFVZrrXnqc=
57-
go.opentelemetry.io/otel/sdk v1.39.0 h1:nMLYcjVsvdui1B/4FRkwjzoRVsMK8uL/cj0OyhKzt18=
58-
go.opentelemetry.io/otel/sdk v1.39.0/go.mod h1:vDojkC4/jsTJsE+kh+LXYQlbL8CgrEcwmt1ENZszdJE=
59-
go.opentelemetry.io/otel/sdk/metric v1.39.0 h1:cXMVVFVgsIf2YL6QkRF4Urbr/aMInf+2WKg+sEJTtB8=
60-
go.opentelemetry.io/otel/sdk/metric v1.39.0/go.mod h1:xq9HEVH7qeX69/JnwEfp6fVq5wosJsY1mt4lLfYdVew=
61-
go.opentelemetry.io/otel/trace v1.40.0 h1:WA4etStDttCSYuhwvEa8OP8I5EWu24lkOzp+ZYblVjw=
62-
go.opentelemetry.io/otel/trace v1.40.0/go.mod h1:zeAhriXecNGP/s2SEG3+Y8X9ujcJOTqQ5RgdEJcawiA=
77+
go.opentelemetry.io/otel v1.42.0 h1:lSQGzTgVR3+sgJDAU/7/ZMjN9Z+vUip7leaqBKy4sho=
78+
go.opentelemetry.io/otel v1.42.0/go.mod h1:lJNsdRMxCUIWuMlVJWzecSMuNjE7dOYyWlqOXWkdqCc=
79+
go.opentelemetry.io/otel/metric v1.42.0 h1:2jXG+3oZLNXEPfNmnpxKDeZsFI5o4J+nz6xUlaFdF/4=
80+
go.opentelemetry.io/otel/metric v1.42.0/go.mod h1:RlUN/7vTU7Ao/diDkEpQpnz3/92J9ko05BIwxYa2SSI=
81+
go.opentelemetry.io/otel/sdk v1.42.0 h1:LyC8+jqk6UJwdrI/8VydAq/hvkFKNHZVIWuslJXYsDo=
82+
go.opentelemetry.io/otel/sdk v1.42.0/go.mod h1:rGHCAxd9DAph0joO4W6OPwxjNTYWghRWmkHuGbayMts=
83+
go.opentelemetry.io/otel/sdk/metric v1.42.0 h1:D/1QR46Clz6ajyZ3G8SgNlTJKBdGp84q9RKCAZ3YGuA=
84+
go.opentelemetry.io/otel/sdk/metric v1.42.0/go.mod h1:Ua6AAlDKdZ7tdvaQKfSmnFTdHx37+J4ba8MwVCYM5hc=
85+
go.opentelemetry.io/otel/trace v1.42.0 h1:OUCgIPt+mzOnaUTpOQcBiM/PLQ/Op7oq6g4LenLmOYY=
86+
go.opentelemetry.io/otel/trace v1.42.0/go.mod h1:f3K9S+IFqnumBkKhRJMeaZeNk9epyhnCmQh/EysQCdc=
6387
go.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0=
6488
go.uber.org/multierr v1.11.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y=
89+
go.yaml.in/yaml/v3 v3.0.4/go.mod h1:DhzuOOF2ATzADvBadXxruRBLzYTpT36CKvDb3+aBEFg=
6590
golang.org/x/crypto v0.49.0 h1:+Ng2ULVvLHnJ/ZFEq4KdcDd/cfjrrjjNSXNzxg0Y4U4=
6691
golang.org/x/crypto v0.49.0/go.mod h1:ErX4dUh2UM+CFYiXZRTcMpEcN8b/1gxEuv3nODoYtCA=
6792
golang.org/x/exp v0.0.0-20260218203240-3dfff04db8fa h1:Zt3DZoOFFYkKhDT3v7Lm9FDMEV06GpzjG2jrqW+QTE0=
@@ -80,12 +105,14 @@ golang.org/x/tools v0.42.0 h1:uNgphsn75Tdz5Ji2q36v/nsFSfR/9BRFvqhGBaJGd5k=
80105
golang.org/x/tools v0.42.0/go.mod h1:Ma6lCIwGZvHK6XtgbswSoWroEkhugApmsXyrUmBhfr0=
81106
gonum.org/v1/gonum v0.16.0 h1:5+ul4Swaf3ESvrOnidPp4GZbzf0mxVQpDCYUQE7OJfk=
82107
gonum.org/v1/gonum v0.16.0/go.mod h1:fef3am4MQ93R2HHpKnLk4/Tbh/s0+wqD5nfa6Pnwy4E=
83-
google.golang.org/genproto/googleapis/rpc v0.0.0-20260217215200-42d3e9bedb6d h1:t/LOSXPJ9R0B6fnZNyALBRfZBH0Uy0gT+uR+SJ6syqQ=
84-
google.golang.org/genproto/googleapis/rpc v0.0.0-20260217215200-42d3e9bedb6d/go.mod h1:4Hqkh8ycfw05ld/3BWL7rJOSfebL2Q+DVDeRgYgxUU8=
108+
google.golang.org/genproto/googleapis/rpc v0.0.0-20260226221140-a57be14db171 h1:ggcbiqK8WWh6l1dnltU4BgWGIGo+EVYxCaAPih/zQXQ=
109+
google.golang.org/genproto/googleapis/rpc v0.0.0-20260226221140-a57be14db171/go.mod h1:4Hqkh8ycfw05ld/3BWL7rJOSfebL2Q+DVDeRgYgxUU8=
85110
google.golang.org/grpc v1.79.3 h1:sybAEdRIEtvcD68Gx7dmnwjZKlyfuc61Dyo9pGXXkKE=
86111
google.golang.org/grpc v1.79.3/go.mod h1:KmT0Kjez+0dde/v2j9vzwoAScgEPx/Bw1CYChhHLrHQ=
87112
google.golang.org/protobuf v1.36.11 h1:fV6ZwhNocDyBLK0dj+fg8ektcVegBBuEolpbTQyBNVE=
88113
google.golang.org/protobuf v1.36.11/go.mod h1:HTf+CrKn2C3g5S8VImy6tdcUvCska2kB7j23XfzDpco=
114+
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
115+
gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
89116
gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=
90117
gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
91118
modernc.org/libc v1.68.0 h1:PJ5ikFOV5pwpW+VqCK1hKJuEWsonkIJhhIXyuF/91pQ=

0 commit comments

Comments
 (0)