Skip to content

Commit 8e73ec3

Browse files
Submit without specifying files (#1044)
1 parent fbd552b commit 8e73ec3

2 files changed

Lines changed: 64 additions & 1 deletion

File tree

cmd/submit.go

Lines changed: 25 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,6 @@ var submitCmd = &cobra.Command{
2626
2727
Call the command with the list of files you want to submit.
2828
`,
29-
Args: cobra.MinimumNArgs(1),
3029
RunE: func(cmd *cobra.Command, args []string) error {
3130
cfg := config.NewConfig()
3231

@@ -45,6 +44,14 @@ var submitCmd = &cobra.Command{
4544
// Ignore error. If the file doesn't exist, that is fine.
4645
_ = v.ReadInConfig()
4746

47+
if len(args) == 0 {
48+
files, err := getExerciseSolutionFiles(".")
49+
if err != nil {
50+
return err
51+
}
52+
args = files
53+
}
54+
4855
return runSubmit(cfg, cmd.Flags(), args)
4956
},
5057
}
@@ -114,6 +121,23 @@ func runSubmit(cfg config.Config, flags *pflag.FlagSet, args []string) error {
114121
return nil
115122
}
116123

124+
func getExerciseSolutionFiles(baseDir string) ([]string, error) {
125+
v := viper.New()
126+
v.AddConfigPath(filepath.Join(baseDir, ".exercism"))
127+
v.SetConfigName("config")
128+
v.SetConfigType("json")
129+
err := v.ReadInConfig()
130+
if err != nil {
131+
return nil, errors.New("no files to submit")
132+
}
133+
solutionFiles := v.GetStringSlice("files.solution")
134+
if len(solutionFiles) == 0 {
135+
return nil, errors.New("no files to submit")
136+
}
137+
138+
return solutionFiles, nil
139+
}
140+
117141
type submitCmdContext struct {
118142
usrCfg *viper.Viper
119143
flags *pflag.FlagSet

cmd/submit_test.go

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -108,6 +108,45 @@ func TestSubmitExerciseWithoutMetadataFile(t *testing.T) {
108108
}
109109
}
110110

111+
func TestGetExerciseSolutionFiles(t *testing.T) {
112+
113+
tmpDir, err := ioutil.TempDir("", "dir-with-no-metadata")
114+
defer os.RemoveAll(tmpDir)
115+
assert.NoError(t, err)
116+
117+
_, err = getExerciseSolutionFiles(tmpDir)
118+
if assert.Error(t, err) {
119+
assert.Regexp(t, "no files to submit", err.Error())
120+
}
121+
122+
validTmpDir, err := ioutil.TempDir("", "dir-with-valid-metadata")
123+
defer os.RemoveAll(validTmpDir)
124+
assert.NoError(t, err)
125+
126+
metadataDir := filepath.Join(validTmpDir, ".exercism")
127+
err = os.MkdirAll(metadataDir, os.FileMode(0755))
128+
assert.NoError(t, err)
129+
130+
err = ioutil.WriteFile(
131+
filepath.Join(metadataDir, "config.json"),
132+
[]byte(`
133+
{
134+
"files": {
135+
"solution": [
136+
"expenses.go"
137+
]
138+
}
139+
}
140+
`), os.FileMode(0755))
141+
assert.NoError(t, err)
142+
143+
files, err := getExerciseSolutionFiles(validTmpDir)
144+
assert.NoError(t, err)
145+
if assert.Equal(t, len(files), 1) {
146+
assert.Equal(t, files[0], "expenses.go")
147+
}
148+
}
149+
111150
func TestSubmitFilesAndDir(t *testing.T) {
112151
tmpDir, err := ioutil.TempDir("", "submit-no-such-file")
113152
defer os.RemoveAll(tmpDir)

0 commit comments

Comments
 (0)