Skip to content

Commit

Permalink
Make runSubmit more explicit
Browse files Browse the repository at this point in the history
Remove submit type and move methods to submitCmdContext
  • Loading branch information
jdsutherland committed Jan 2, 2019
1 parent 23afc48 commit 3491328
Showing 1 changed file with 37 additions and 72 deletions.
109 changes: 37 additions & 72 deletions cmd/submit.go
Original file line number Diff line number Diff line change
Expand Up @@ -55,56 +55,44 @@ func runSubmit(cfg config.Config, flags *pflag.FlagSet, args []string) error {
return err
}

ctx, err := newSubmitCmdContext(cfg.UserViperConfig, flags, args)
if err != nil {
return err
}

if err := ctx.submit(cfg.UserViperConfig); err != nil {
return err
}

ctx.printResult()
return nil
}

// submitCmdContext represents the context for the submit cmd.
type submitCmdContext struct {
usrCfg *viper.Viper
flags *pflag.FlagSet
submission
}

// newSubmitCmdContext sets up a context to initiate a submission.
func newSubmitCmdContext(usrCfg *viper.Viper, flags *pflag.FlagSet, args []string) (*submitCmdContext, error) {
ctx := &submitCmdContext{usrCfg: usrCfg, flags: flags}
ctx := &submitCmdContext{usrCfg: cfg.UserViperConfig, flags: flags}

filepaths, err := ctx.sanitizeArgs(args)
if err != nil {
return nil, err
return err
}

exercise, err := ctx.exercise(filepaths)
if err != nil {
return nil, err
return err
}

if err = ctx.migrateLegacyMetadata(exercise); err != nil {
return nil, err
return err
}

documents, err := ctx._documents(filepaths, exercise)
documents, err := ctx.documents(filepaths, exercise)
if err != nil {
return nil, err
return err
}

metadata, err := ctx._metadata(exercise)
metadata, err := ctx.metadata(exercise)
if err != nil {
return nil, err
return err
}

if err := ctx.submit(metadata, documents); err != nil {
return err
}

ctx.submission = submission{documents: documents, metadata: metadata}
return ctx, nil
ctx.printResult(metadata)
return nil
}

// submitCmdContext represents the context for the submit cmd.
type submitCmdContext struct {
usrCfg *viper.Viper
flags *pflag.FlagSet
}

// sanitizeArgs validates args and swaps with evaluated symlink paths.
Expand Down Expand Up @@ -195,7 +183,7 @@ func (s *submitCmdContext) migrateLegacyMetadata(exercise workspace.Exercise) er
return nil
}

func (s *submitCmdContext) _metadata(exercise workspace.Exercise) (*workspace.ExerciseMetadata, error) {
func (s *submitCmdContext) metadata(exercise workspace.Exercise) (*workspace.ExerciseMetadata, error) {
metadata, err := workspace.NewExerciseMetadata(exercise.Filepath())
if err != nil {
return nil, err
Expand Down Expand Up @@ -230,7 +218,7 @@ func (s *submitCmdContext) _metadata(exercise workspace.Exercise) (*workspace.Ex
return metadata, nil
}

func (s *submitCmdContext) _documents(filepaths []string, exercise workspace.Exercise) ([]workspace.Document, error) {
func (s *submitCmdContext) documents(filepaths []string, exercise workspace.Exercise) ([]workspace.Document, error) {
docs := make([]workspace.Document, 0, len(filepaths))
for _, file := range filepaths {
// Don't submit empty files
Expand Down Expand Up @@ -276,36 +264,12 @@ func (s *submitCmdContext) _documents(filepaths []string, exercise workspace.Exe
return docs, nil
}

func (s *submitCmdContext) printResult() {
msg := `
Your solution has been submitted successfully.
%s
`
suffix := "View it at:\n\n "
if s.metadata.AutoApprove && s.metadata.Team == "" {
suffix = "You can complete the exercise and unlock the next core exercise at:\n"
}
fmt.Fprintf(Err, msg, suffix)
fmt.Fprintf(Out, " %s\n\n", s.metadata.URL)
}

// submission is a submission to the Excercism API.
type submission struct {
documents []workspace.Document
metadata *workspace.ExerciseMetadata
}

// submit submits the documents to the Exercism API.
func (s *submission) submit(usrCfg *viper.Viper) error {
if err := s.validate(); err != nil {
return err
}

func (s *submitCmdContext) submit(metadata *workspace.ExerciseMetadata, docs []workspace.Document) error {
body := &bytes.Buffer{}
writer := multipart.NewWriter(body)

for _, doc := range s.documents {
for _, doc := range docs {
file, err := os.Open(doc.Filepath())
if err != nil {
return err
Expand All @@ -325,11 +289,11 @@ func (s *submission) submit(usrCfg *viper.Viper) error {
return err
}

client, err := api.NewClient(usrCfg.GetString("token"), usrCfg.GetString("apibaseurl"))
client, err := api.NewClient(s.usrCfg.GetString("token"), s.usrCfg.GetString("apibaseurl"))
if err != nil {
return err
}
url := fmt.Sprintf("%s/solutions/%s", usrCfg.GetString("apibaseurl"), s.metadata.ID)
url := fmt.Sprintf("%s/solutions/%s", s.usrCfg.GetString("apibaseurl"), metadata.ID)
req, err := client.NewRequest("PATCH", url, body)
if err != nil {
return err
Expand Down Expand Up @@ -359,17 +323,18 @@ func (s *submission) submit(usrCfg *viper.Viper) error {
return nil
}

func (s *submission) validate() error {
if s == nil {
return errors.New("submission is empty")
}
if s.metadata.ID == "" {
return errors.New("id is empty")
}
if len(s.documents) == 0 {
return errors.New("documents is empty")
func (s *submitCmdContext) printResult(metadata *workspace.ExerciseMetadata) {
msg := `
Your solution has been submitted successfully.
%s
`
suffix := "View it at:\n\n "
if metadata.AutoApprove && metadata.Team == "" {
suffix = "You can complete the exercise and unlock the next core exercise at:\n"
}
return nil
fmt.Fprintf(Err, msg, suffix)
fmt.Fprintf(Out, " %s\n\n", metadata.URL)
}

func init() {
Expand Down

0 comments on commit 3491328

Please sign in to comment.