Skip to content

Commit

Permalink
Added training info command
Browse files Browse the repository at this point in the history
  • Loading branch information
roblaszczak committed Jan 16, 2022
1 parent 55f86ab commit 41ac542
Show file tree
Hide file tree
Showing 8 changed files with 102 additions and 37 deletions.
34 changes: 21 additions & 13 deletions tdl/main.go
Original file line number Diff line number Diff line change
Expand Up @@ -97,10 +97,17 @@ var app = &cli.App{
},
},
{
Name: "list",
Usage: "list training",
Name: "init",
ArgsUsage: fmt.Sprintf("[trainingID from %s]", web.Website),
Usage: "initialise training files in your current directory",
Action: func(c *cli.Context) error {
return trainings.NewHandlers().List(c.Context)
trainingID := c.Args().First()

if trainingID == "" {
return missingArgumentError{"Missing trainingID argument"}
}

return trainings.NewHandlers().Init(c.Context, trainingID)
},
},
{
Expand All @@ -120,17 +127,18 @@ var app = &cli.App{
},
},
{
Name: "init",
ArgsUsage: fmt.Sprintf("[trainingID from %s]", web.Website),
Usage: "initialise training files in your current directory",
Name: "info",
Aliases: []string{"i"},
Usage: "print information about current training",
Action: func(c *cli.Context) error {
trainingID := c.Args().First()

if trainingID == "" {
return missingArgumentError{"Missing trainingID argument"}
}

return trainings.NewHandlers().Init(c.Context, trainingID)
return trainings.NewHandlers().Info(c.Context)
},
},
{
Name: "list",
Usage: "list training",
Action: func(c *cli.Context) error {
return trainings.NewHandlers().List(c.Context)
},
},
},
Expand Down
9 changes: 8 additions & 1 deletion trainings/config/training.go
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package config

import (
"os"
"path/filepath"

"github.com/BurntSushi/toml"
Expand Down Expand Up @@ -42,7 +43,13 @@ func (c Config) TrainingConfig(trainingRootFs afero.Fs) TrainingConfig {
// todo - check if it's printing properly
var TrainingRootNotFoundError = errors.Errorf("training root not found, did you run %s?", internal.SprintCommand("tdl trainings init"))

func (c Config) FindTrainingRoot(dir string) (string, error) {
func (c Config) FindTrainingRoot() (string, error) {
wd, err := os.Getwd()
if err != nil {
return "", errors.WithStack(err)
}

dir := wd
for {
if c.dirOrFileExists(c.osFs, filepath.Join(dir, trainingConfigFile)) {
return dir, nil
Expand Down
5 changes: 3 additions & 2 deletions trainings/genproto/server.pb.go

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

1 change: 1 addition & 0 deletions trainings/genproto/server_grpc.pb.go

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

48 changes: 48 additions & 0 deletions trainings/info.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,48 @@
package trainings

import (
"context"
"fmt"
"net/url"
"path"

"github.com/fatih/color"
"github.com/pkg/errors"
"github.com/sirupsen/logrus"

"github.com/ThreeDotsLabs/cli/internal"
"github.com/ThreeDotsLabs/cli/trainings/config"
"github.com/ThreeDotsLabs/cli/trainings/web"
)

func (h *Handlers) Info(ctx context.Context) error {
trainingRoot, err := h.config.FindTrainingRoot()
if errors.Is(err, config.TrainingRootNotFoundError) {
fmt.Println("You are not in a training directory. If you already started the training, please go to the exercise directory.")
fmt.Printf("Please run %s if you didn't start training yet.\n", internal.SprintCommand("tdl training init"))
return nil
}

trainingRootFs := newTrainingRootFs(trainingRoot)

trainingConfig := h.config.TrainingConfig(trainingRootFs)
exerciseConfig := h.config.ExerciseConfig(trainingRootFs)

exerciseURL, err := url.Parse(web.Website)
if err != nil {
logrus.WithError(err).Warn("Can't parse website URL")
}
exerciseURL.Path = path.Join("trainings/" + trainingConfig.TrainingName + "/exercise/" + exerciseConfig.ExerciseID)

fmt.Println("### Training")
fmt.Println("Name:", color.CyanString(trainingConfig.TrainingName))
fmt.Println("Root dir:", color.CyanString(trainingRoot))
fmt.Println()

fmt.Println("### Current exercise")
fmt.Println("ID:", color.CyanString(exerciseConfig.ExerciseID))
fmt.Println("Files:", color.CyanString(h.generateRunTerminalPath(trainingRootFs)))
fmt.Println("Content:", color.CyanString(exerciseURL.String()))

return nil
}
23 changes: 13 additions & 10 deletions trainings/init.go
Original file line number Diff line number Diff line change
Expand Up @@ -16,31 +16,27 @@ import (
)

func (h *Handlers) Init(ctx context.Context, trainingName string) error {
wd, err := os.Getwd()
if err != nil {
return errors.WithStack(err)
}

logrus.WithFields(logrus.Fields{
"training_name": trainingName,
"dir": wd,
}).Debug("Starting training")

if err := h.startTraining(ctx, trainingName, wd); errors.Is(err, ErrInterrupted) {
if err := h.startTraining(ctx, trainingName); errors.Is(err, ErrInterrupted) {
fmt.Println("Interrupted")
return nil
} else if err != nil {
return err
}

// todo - handle situation when training was started but something failed here and someone is starting excersise again (because he have no local files)
return h.nextExercise(ctx, "", wd)
return h.nextExercise(ctx, "")
}

var ErrInterrupted = errors.New("interrupted")

func (h *Handlers) startTraining(ctx context.Context, trainingName string, trainingRoot string) error {
alreadyExistingTrainingRoot, err := h.config.FindTrainingRoot(trainingRoot)
func (h *Handlers) startTraining(ctx context.Context, trainingName string) error {
var trainingRoot string

alreadyExistingTrainingRoot, err := h.config.FindTrainingRoot()
if err == nil {
fmt.Println(color.BlueString("Training was already initialised. Training root:" + alreadyExistingTrainingRoot))
trainingRoot = alreadyExistingTrainingRoot
Expand All @@ -51,6 +47,13 @@ func (h *Handlers) startTraining(ctx context.Context, trainingName string, train
return err
}

wd, err := os.Getwd()
if err != nil {
return errors.WithStack(err)
}

// we will create training root in current working directory
trainingRoot = wd
logrus.Debug("No training root yet")
}

Expand Down
4 changes: 2 additions & 2 deletions trainings/next.go
Original file line number Diff line number Diff line change
Expand Up @@ -18,8 +18,8 @@ import (
"github.com/ThreeDotsLabs/cli/trainings/genproto"
)

func (h *Handlers) nextExercise(ctx context.Context, currentExerciseID string, dir string) error {
trainingRoot, err := h.config.FindTrainingRoot(dir)
func (h *Handlers) nextExercise(ctx context.Context, currentExerciseID string) error {
trainingRoot, err := h.config.FindTrainingRoot()
if err != nil {
return err
}
Expand Down
15 changes: 6 additions & 9 deletions trainings/run.go
Original file line number Diff line number Diff line change
Expand Up @@ -22,12 +22,7 @@ import (
)

func (h *Handlers) Run(ctx context.Context) (bool, error) {
wd, err := os.Getwd()
if err != nil {
return false, errors.WithStack(err)
}

trainingRoot, err := h.config.FindTrainingRoot(wd)
trainingRoot, err := h.config.FindTrainingRoot()
if errors.Is(err, config.TrainingRootNotFoundError) {
fmt.Println("You are not in a training directory. If you already started the training, please go to the exercise directory.")
fmt.Printf("Please run %s if you didn't start training yet.\n", internal.SprintCommand("tdl training init"))
Expand All @@ -48,7 +43,7 @@ func (h *Handlers) Run(ctx context.Context) (bool, error) {
}

// todo - is this assumption always valid about training dir?
return success, h.nextExercise(ctx, h.config.ExerciseConfig(trainingRootFs).ExerciseID, wd)
return success, h.nextExercise(ctx, h.config.ExerciseConfig(trainingRootFs).ExerciseID)
}

func (h *Handlers) runExercise(ctx context.Context, trainingRootFs *afero.BasePathFs) (bool, error) {
Expand All @@ -59,7 +54,7 @@ func (h *Handlers) runExercise(ctx context.Context, trainingRootFs *afero.BasePa
return false, err
}

terminalPath := h.generateRunTerminalPath(trainingRootFs, exerciseConfig)
terminalPath := h.generateRunTerminalPath(trainingRootFs)

req := &genproto.VerifyExerciseRequest{
ExerciseId: exerciseConfig.ExerciseID,
Expand Down Expand Up @@ -135,7 +130,9 @@ func (h *Handlers) runExercise(ctx context.Context, trainingRootFs *afero.BasePa
}
}

func (h *Handlers) generateRunTerminalPath(trainingRootFs *afero.BasePathFs, exerciseConfig config.ExerciseConfig) string {
func (h *Handlers) generateRunTerminalPath(trainingRootFs *afero.BasePathFs) string {
exerciseConfig := h.config.ExerciseConfig(trainingRootFs)

wd, err := syscall.Getwd()
if err != nil {
logrus.WithError(err).Warn("Can't get wd")
Expand Down

0 comments on commit 41ac542

Please sign in to comment.