Skip to content

Commit

Permalink
Added support for text-only exercises
Browse files Browse the repository at this point in the history
  • Loading branch information
roblaszczak committed Apr 11, 2023
1 parent 243512d commit 4df0553
Show file tree
Hide file tree
Showing 9 changed files with 136 additions and 90 deletions.
17 changes: 17 additions & 0 deletions internal/addresses.go
Original file line number Diff line number Diff line change
@@ -1,4 +1,21 @@
package internal

import (
"net/url"
"path"

"github.com/sirupsen/logrus"
)

const DefaultTrainingsServer = "academy-grpc.threedots.tech:443"
const WebsiteAddress = "https://academy.threedots.tech/"

func ExerciseURL(trainingName, exerciseID string) string {
exerciseURL, err := url.Parse(WebsiteAddress)
if err != nil {
logrus.WithError(err).Warn("Can't parse website URL")
}
exerciseURL.Path = path.Join("trainings/" + trainingName + "/exercise/" + exerciseID)

return exerciseURL.String()
}
2 changes: 2 additions & 0 deletions trainings/api/protobuf/server.proto
Original file line number Diff line number Diff line change
Expand Up @@ -52,6 +52,8 @@ message NextExerciseResponse {
string dir = 1;
string exercise_id = 2;
repeated File files_to_create = 3;

bool is_text_only = 5;
}

message NextExercise {
Expand Down
1 change: 1 addition & 0 deletions trainings/config/exercise.go
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@ const exerciseConfigFile = ".tdl-exercise"
type ExerciseConfig struct {
ExerciseID string `toml:"exercise_id"`
Directory string `toml:"directory"`
IsTextOnly bool `toml:"is_text_only"`
}

func (c Config) WriteExerciseConfig(trainingRootFs afero.Fs, cfg ExerciseConfig) error {
Expand Down
158 changes: 84 additions & 74 deletions trainings/genproto/server.pb.go

Large diffs are not rendered by default.

2 changes: 1 addition & 1 deletion trainings/genproto/server_grpc.pb.go

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

18 changes: 5 additions & 13 deletions trainings/info.go
Original file line number Diff line number Diff line change
Expand Up @@ -3,15 +3,11 @@ 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/fatih/color"
"github.com/pkg/errors"
)

func (h *Handlers) Info(ctx context.Context) error {
Expand All @@ -26,12 +22,6 @@ func (h *Handlers) Info(ctx context.Context) error {
trainingConfig := h.config.TrainingConfig(trainingRootFs)
exerciseConfig := h.config.ExerciseConfig(trainingRootFs)

exerciseURL, err := url.Parse(internal.WebsiteAddress)
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))
Expand All @@ -40,7 +30,9 @@ func (h *Handlers) Info(ctx context.Context) error {
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()))

exerciseURL := internal.ExerciseURL(trainingConfig.TrainingName, exerciseConfig.ExerciseID)
fmt.Println("Content:", color.CyanString(exerciseURL))

return nil
}
8 changes: 8 additions & 0 deletions trainings/next.go
Original file line number Diff line number Diff line change
Expand Up @@ -45,6 +45,13 @@ func (h *Handlers) nextExercise(ctx context.Context, currentExerciseID string) (
return false, err
}

if resp.IsTextOnly {
printTextOnlyExerciseInfo(
h.config.TrainingConfig(trainingRootFs).TrainingName,
resp.ExerciseId,
)
}

return false, nil
}

Expand Down Expand Up @@ -87,6 +94,7 @@ func (h *Handlers) writeExerciseFiles(resp *genproto.NextExerciseResponse, train
config.ExerciseConfig{
ExerciseID: resp.ExerciseId,
Directory: resp.Dir,
IsTextOnly: resp.IsTextOnly,
},
)
}
7 changes: 7 additions & 0 deletions trainings/print.go
Original file line number Diff line number Diff line change
Expand Up @@ -25,3 +25,10 @@ func printFinished() {
func printPaymentRequired() {
fmt.Println(color.GreenString("You finished the free part of the training. To continue, please go back to our website."))
}

func printTextOnlyExerciseInfo(trainingName, exerciseID string) {
fmt.Println(
color.GreenString("This lesson is text-only.\nYou can read it in your browser:"),
internal.ExerciseURL(trainingName, exerciseID)+"\n",
)
}
13 changes: 11 additions & 2 deletions trainings/run.go
Original file line number Diff line number Diff line change
Expand Up @@ -130,6 +130,13 @@ func (h *Handlers) interactiveRun(ctx context.Context, trainingRootFs *afero.Bas
return nil
}

// this is refreshed config after nextExercise execution
currentExerciseConfig := h.config.ExerciseConfig(trainingRootFs)

if currentExerciseConfig.IsTextOnly {
continue
}

if !internal.ConfirmPromptDefaultYes("run your solution") {
return nil
}
Expand Down Expand Up @@ -166,7 +173,7 @@ func (h *Handlers) runExercise(ctx context.Context, trainingRootFs *afero.BasePa
return false, err
}

if len(solutionFiles) == 0 {
if len(solutionFiles) == 0 && !exerciseConfig.IsTextOnly {
solutionFilesRealPath, err := trainingRootFs.RealPath(exerciseConfig.Directory)
if err != nil {
logrus.WithField("exercise_dir", exerciseConfig.Directory).Warn("Can't get realpath of solution")
Expand Down Expand Up @@ -216,7 +223,9 @@ func (h *Handlers) runExercise(ctx context.Context, trainingRootFs *afero.BasePa

if response.Successful {
fmt.Println(color.GreenString("SUCCESS"))
fmt.Println("\nYou can now see an example solution on the website.")
if !exerciseConfig.IsTextOnly {
fmt.Println("\nYou can now see an example solution on the website.")
}
successful = true
finished = true
} else {
Expand Down

0 comments on commit 4df0553

Please sign in to comment.