Skip to content

Commit

Permalink
imager: improve tui output when creating a new image
Browse files Browse the repository at this point in the history
  • Loading branch information
jsec committed Nov 24, 2024
1 parent 5fa2080 commit 2eb1b5f
Show file tree
Hide file tree
Showing 16 changed files with 167 additions and 56 deletions.
6 changes: 6 additions & 0 deletions Taskfile.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -36,14 +36,17 @@ tasks:
db:push:
cmds:
- cmd: docker commit -a "Jarrod Seccombe <[email protected]>" $(docker ps -aqf "name=f1db-seed") ghcr.io/jsec/f1db
silent: true
- cmd: echo $CR_PAT | docker login ghcr.io -u jsec --password-stdin
silent: true
- cmd: docker push ghcr.io/jsec/f1db:latest
silent: true

db:up:
dir: "{{.TASKFILE_DIR}}/docker"
cmds:
- cmd: docker compose -f compose-dev.yaml up --wait
silent: true

db:update:
cmds:
Expand All @@ -61,6 +64,7 @@ tasks:
- cmd: docker compose -f compose-seed.yaml up --wait
silent: true
- task: db:migrate
silent: true

image:down:
dir: "{{.TASKFILE_DIR}}/docker"
Expand All @@ -70,6 +74,8 @@ tasks:

image:new:
cmds:
- cmd: rm -r data
silent: true
- task: image:up
- cmd: go run ./cmd/imager
silent: true
Expand Down
4 changes: 3 additions & 1 deletion go.mod
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,9 @@ require (
)

require (
github.com/chelnak/ysmrr v0.4.0 // indirect
github.com/dgrijalva/jwt-go v3.2.0+incompatible // indirect
github.com/fatih/color v1.18.0 // indirect
github.com/jackc/pgpassfile v1.0.0 // indirect
github.com/jackc/pgservicefile v0.0.0-20240606120523-5a60cdf6a761 // indirect
github.com/jackc/puddle/v2 v2.2.2 // indirect
Expand All @@ -23,6 +25,6 @@ require (
golang.org/x/crypto v0.27.0 // indirect
golang.org/x/net v0.21.0 // indirect
golang.org/x/sync v0.8.0 // indirect
golang.org/x/sys v0.25.0 // indirect
golang.org/x/sys v0.27.0 // indirect
golang.org/x/text v0.18.0 // indirect
)
6 changes: 6 additions & 0 deletions go.sum
Original file line number Diff line number Diff line change
@@ -1,8 +1,12 @@
github.com/chelnak/ysmrr v0.4.0 h1:WMvLGPlBK0kb6wHf5z9FfNvpM6sB9765jy2ajYc1Sfs=
github.com/chelnak/ysmrr v0.4.0/go.mod h1:8vCna4PJsPCb6eevtoG7Tljzfx3twpsO203Qj2gafLM=
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
github.com/dgrijalva/jwt-go v3.2.0+incompatible h1:7qlOGliEKZXTDg6OTjfoBKDXWrumCAMpl/TFQ4/5kLM=
github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ=
github.com/fatih/color v1.18.0 h1:S8gINlzdQ840/4pfAwic/ZE0djQEH3wM94VfqLTZcOM=
github.com/fatih/color v1.18.0/go.mod h1:4FelSpRwEGDpQ12mAdzqdOukCy4u8WUtOY6lkT/6HfU=
github.com/gocarina/gocsv v0.0.0-20240520201108-78e41c74b4b1 h1:FWNFq4fM1wPfcK40yHE5UO3RUdSNPaBC+j3PokzA6OQ=
github.com/gocarina/gocsv v0.0.0-20240520201108-78e41c74b4b1/go.mod h1:5YoVOkjYAQumqlV356Hj3xeYh4BdZuLE0/nRkf2NKkI=
github.com/jackc/pgpassfile v1.0.0 h1:/6Hmqy13Ss2zCq62VdNG8tM1wchn8zjSGOBJ6icpsIM=
Expand Down Expand Up @@ -47,6 +51,8 @@ golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBc
golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.25.0 h1:r+8e+loiHxRqhXVl6ML1nO3l1+oFoWbnlu2Ehimmi34=
golang.org/x/sys v0.25.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
golang.org/x/sys v0.27.0 h1:wBqf8DvsY9Y/2P8gAfPDEYNuS30J4lPHJxXSb/nJZ+s=
golang.org/x/sys v0.27.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
golang.org/x/text v0.18.0 h1:XvMDiNzPAl0jr17s6W9lcaIhGUfUORdGCNsuLmPG224=
golang.org/x/text v0.18.0/go.mod h1:BuEKDfySbSR4drPmRPG/7iBdf8hvFMuRexcpahXilzY=
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
Expand Down
8 changes: 6 additions & 2 deletions internal/imager/circuit.go
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,9 @@ type circuit struct {
URL string `csv:"url"`
}

func (i Imager) loadCircuits(ctx context.Context, tx pgx.Tx) error {
func (i imager) loadCircuits(ctx context.Context, tx pgx.Tx) error {
spinner := i.spinners.AddSpinner("Seeding circuits")

file, err := os.OpenFile("data/circuits.csv", os.O_RDONLY, 0600)
if err != nil {
return fmt.Errorf("error opening circuits CSV file: %w", err)
Expand All @@ -33,6 +35,7 @@ func (i Imager) loadCircuits(ctx context.Context, tx pgx.Tx) error {
var circuits []*circuit

if err = gocsv.UnmarshalFile(file, &circuits); err != nil {
spinner.Error()
return fmt.Errorf("error marshaling circuits CSV file: %w", err)
}

Expand All @@ -53,9 +56,10 @@ func (i Imager) loadCircuits(ctx context.Context, tx pgx.Tx) error {
}

if err = i.circuitService.SeedCircuits(ctx, tx, records); err != nil {
spinner.Error()
return fmt.Errorf("error saving circuits: %w", err)
}

fmt.Println("[Circuits] seeding complete")
spinner.Complete()
return nil
}
26 changes: 21 additions & 5 deletions internal/imager/constructor.go
Original file line number Diff line number Diff line change
Expand Up @@ -19,16 +19,20 @@ type constructor struct {
URL string `csv:"url"`
}

func (i Imager) loadConstructors(ctx context.Context, tx pgx.Tx) error {
func (i imager) loadConstructors(ctx context.Context, tx pgx.Tx) error {
spinner := i.spinners.AddSpinner("Seeding constructors")

file, err := os.OpenFile("data/constructors.csv", os.O_RDONLY, 0600)
if err != nil {
spinner.Error()
return fmt.Errorf("error opening constructors CSV file: %w", err)
}
defer file.Close()

var constructors []*constructor

if err = gocsv.UnmarshalFile(file, &constructors); err != nil {
spinner.Error()
return fmt.Errorf("error marshaling constructors CSV file: %w", err)
}

Expand All @@ -45,9 +49,11 @@ func (i Imager) loadConstructors(ctx context.Context, tx pgx.Tx) error {
}

if err = i.constructorService.SeedConstructors(ctx, tx, records); err != nil {
spinner.Error()
return fmt.Errorf("error saving constructors: %w", err)
}

spinner.Complete()
return nil
}

Expand All @@ -59,16 +65,20 @@ type constructorResult struct {
Status optionalString `csv:"status"`
}

func (i Imager) loadConstructorResults(ctx context.Context, tx pgx.Tx) error {
func (i imager) loadConstructorResults(ctx context.Context, tx pgx.Tx) error {
spinner := i.spinners.AddSpinner("Seeding constructors")

file, err := os.OpenFile("data/constructor_results.csv", os.O_RDONLY, 0600)
if err != nil {
spinner.Error()
return fmt.Errorf("error opening constructor results CSV file: %w", err)
}
defer file.Close()

var results []*constructorResult

if err = gocsv.UnmarshalFile(file, &results); err != nil {
spinner.Error()
return fmt.Errorf("error marshaling constructor results CSV file: %w", err)
}

Expand All @@ -85,10 +95,11 @@ func (i Imager) loadConstructorResults(ctx context.Context, tx pgx.Tx) error {
}

if err = i.constructorService.SeedConstructorResults(ctx, tx, records); err != nil {
spinner.Error()
return fmt.Errorf("error saving constructor results: %w", err)
}

fmt.Println("[Constructor Results] seeding complete")
spinner.Complete()
return nil
}

Expand All @@ -102,16 +113,20 @@ type constructorStanding struct {
Wins int32 `csv:"wins"`
}

func (i Imager) loadConstructorStandings(ctx context.Context, tx pgx.Tx) error {
func (i imager) loadConstructorStandings(ctx context.Context, tx pgx.Tx) error {
spinner := i.spinners.AddSpinner("Seeding constructor standings")

file, err := os.OpenFile("data/constructor_standings.csv", os.O_RDONLY, 0600)
if err != nil {
spinner.Error()
return fmt.Errorf("error opening constructor standings CSV file: %w", err)
}
defer file.Close()

var standings []*constructorStanding

if err = gocsv.UnmarshalFile(file, &standings); err != nil {
spinner.Error()
return fmt.Errorf("error marshaling constructor standings CSV file: %w", err)
}

Expand All @@ -130,9 +145,10 @@ func (i Imager) loadConstructorStandings(ctx context.Context, tx pgx.Tx) error {
}

if err = i.constructorService.SeedConstructorStandings(ctx, tx, records); err != nil {
spinner.Error()
return fmt.Errorf("error saving constructor standings: %w", err)
}

fmt.Println("[Constructor Standings] seeding complete")
spinner.Complete()
return nil
}
18 changes: 15 additions & 3 deletions internal/imager/download.go
Original file line number Diff line number Diff line change
Expand Up @@ -10,28 +10,40 @@ import (

const zipName = "seed.zip"

func FetchSeedData() error {
func (i imager) downloadData() error {
spinner := i.spinners.AddSpinner("Fetching data from ergast")

out, err := os.Create(zipName)
if err != nil {
spinner.Error()
return fmt.Errorf("error creating seed file: %w", err)
}
defer out.Close()

resp, err := http.Get("http://ergast.com/downloads/f1db_csv.zip")
if err != nil {
spinner.Error()
return fmt.Errorf("error fetching seed data: %w", err)
}
defer resp.Body.Close()

_, err = io.Copy(out, resp.Body)
if err != nil {
spinner.Error()
return fmt.Errorf("error saving seed data: %w", err)
}

return UnzipSeedData()
err = unzipFiles()
if err != nil {
spinner.Error()
return err
}

spinner.Complete()
return nil
}

func UnzipSeedData() error {
func unzipFiles() error {
r, err := zip.OpenReader(zipName)
if err != nil {
return fmt.Errorf("error opening zipfile: %w", err)
Expand Down
11 changes: 8 additions & 3 deletions internal/imager/driver.go
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,7 @@ type driver struct {
URL string `csv:"url"`
}

func (i Imager) loadDrivers(ctx context.Context, tx pgx.Tx) error {
func (i imager) loadDrivers(ctx context.Context, tx pgx.Tx) error {
file, err := os.OpenFile("data/drivers.csv", os.O_RDONLY, 0600)
if err != nil {
return fmt.Errorf("error opening driver CSV file: %w", err)
Expand Down Expand Up @@ -70,16 +70,20 @@ type driverStanding struct {
Wins int32 `csv:"wins"`
}

func (i Imager) loadDriverStandings(ctx context.Context, tx pgx.Tx) error {
func (i imager) loadDriverStandings(ctx context.Context, tx pgx.Tx) error {
spinner := i.spinners.AddSpinner("Seeding drivers")

file, err := os.OpenFile("data/driver_standings.csv", os.O_RDONLY, 0600)
if err != nil {
spinner.Error()
return fmt.Errorf("error opening driver standings CSV file: %w", err)
}
defer file.Close()

var standings []*driverStanding

if err = gocsv.UnmarshalFile(file, &standings); err != nil {
spinner.Error()
return fmt.Errorf("error marshaling driver standings CSV file: %w", err)
}

Expand All @@ -98,9 +102,10 @@ func (i Imager) loadDriverStandings(ctx context.Context, tx pgx.Tx) error {
}

if err = i.driverService.SeedDriverStandings(ctx, tx, records); err != nil {
spinner.Error()
return fmt.Errorf("error saving driver standings: %w", err)
}

fmt.Println("[Driver Standings] seeding complete")
spinner.Complete()
return nil
}
39 changes: 13 additions & 26 deletions internal/imager/imager.go
Original file line number Diff line number Diff line change
Expand Up @@ -2,14 +2,15 @@ package imager

import (
"context"
"fmt"

"github.com/chelnak/ysmrr"
"github.com/jackc/pgx/v5"
"github.com/jsec/f1-data-hub/internal/database"
"github.com/jsec/f1-data-hub/internal/services"
)

type Imager struct {
type imager struct {
spinners ysmrr.SpinnerManager
circuitService services.CircuitService
constructorService services.ConstructorService
driverService services.DriverService
Expand All @@ -22,22 +23,9 @@ type Imager struct {
statusService services.StatusService
}

func Run(ctx context.Context) error {
pool, err := database.Connect(ctx)
if err != nil {
return fmt.Errorf("error acquiring database connection: %w", err)
}
defer pool.Close()

tx, err := pool.Begin(ctx)
if err != nil {
return fmt.Errorf("error acquiring transaction: %w", err)
}
defer tx.Rollback(ctx)

db := database.New(pool)

imager := Imager{
func newImager(db *database.Queries) imager {
return imager{
spinners: ysmrr.NewSpinnerManager(),
circuitService: services.NewCircuitService(db),
constructorService: services.NewConstructorService(db),
driverService: services.NewDriverService(db),
Expand All @@ -49,19 +37,16 @@ func Run(ctx context.Context) error {
seasonService: services.NewSeasonService(db),
statusService: services.NewStatusService(db),
}
}

if err = imager.Seed(ctx, tx); err != nil {
return err
}
func (i imager) seed(ctx context.Context, tx pgx.Tx) error {
i.spinners.Start()

if err = tx.Commit(ctx); err != nil {
if err := i.downloadData(); err != nil {
i.spinners.Stop()
return err
}

return nil
}

func (i Imager) Seed(ctx context.Context, tx pgx.Tx) error {
loaders := []func(ctx context.Context, tx pgx.Tx) error{
i.loadSeasons,
i.loadStatuses,
Expand All @@ -82,9 +67,11 @@ func (i Imager) Seed(ctx context.Context, tx pgx.Tx) error {
for _, loader := range loaders {
err := loader(ctx, tx)
if err != nil {
i.spinners.Stop()
return err
}
}

i.spinners.Stop()
return nil
}
Loading

0 comments on commit 2eb1b5f

Please sign in to comment.