Skip to content

Commit f9aaf30

Browse files
authored
Merge pull request #261 from ndeloof/validate_project_name
Check an explicit project name is valid
2 parents c9f323e + 79a1c00 commit f9aaf30

File tree

3 files changed

+26
-19
lines changed

3 files changed

+26
-19
lines changed

cli/options.go

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -63,6 +63,9 @@ func NewProjectOptions(configs []string, opts ...ProjectOptionsFn) (*ProjectOpti
6363
// WithName defines ProjectOptions' name
6464
func WithName(name string) ProjectOptionsFn {
6565
return func(o *ProjectOptions) error {
66+
if name != loader.NormalizeProjectName(name) {
67+
return fmt.Errorf("%q is not a valid project name", name)
68+
}
6669
o.Name = name
6770
return nil
6871
}

cli/options_test.go

Lines changed: 20 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -52,47 +52,51 @@ func TestProjectName(t *testing.T) {
5252
})
5353

5454
t.Run("by name start with invalid char '-'", func(t *testing.T) {
55-
opts, err := NewProjectOptions([]string{"testdata/simple/compose.yaml"}, WithName("-my_project"))
56-
assert.NilError(t, err)
57-
p, err := ProjectFromOptions(opts)
58-
assert.NilError(t, err)
59-
assert.Equal(t, p.Name, "my_project")
55+
_, err := NewProjectOptions([]string{"testdata/simple/compose.yaml"}, WithName("-my_project"))
56+
assert.Error(t, err, `"-my_project" is not a valid project name`)
6057

61-
opts, err = NewProjectOptions([]string{"testdata/simple/compose.yaml"}, WithEnv([]string{
58+
opts, err := NewProjectOptions([]string{"testdata/simple/compose.yaml"}, WithEnv([]string{
6259
fmt.Sprintf("%s=%s", consts.ComposeProjectName, "-my_project"),
6360
}))
6461
assert.NilError(t, err)
65-
p, err = ProjectFromOptions(opts)
62+
p, err := ProjectFromOptions(opts)
6663
assert.NilError(t, err)
6764
assert.Equal(t, p.Name, "my_project")
6865
})
6966

7067
t.Run("by name start with invalid char '_'", func(t *testing.T) {
71-
opts, err := NewProjectOptions([]string{"testdata/simple/compose.yaml"}, WithName("_my_project"))
72-
assert.NilError(t, err)
73-
p, err := ProjectFromOptions(opts)
74-
assert.NilError(t, err)
75-
assert.Equal(t, p.Name, "my_project")
68+
_, err := NewProjectOptions([]string{"testdata/simple/compose.yaml"}, WithName("_my_project"))
69+
assert.Error(t, err, `"_my_project" is not a valid project name`)
7670

77-
opts, err = NewProjectOptions([]string{"testdata/simple/compose.yaml"}, WithEnv([]string{
71+
opts, err := NewProjectOptions([]string{"testdata/simple/compose.yaml"}, WithEnv([]string{
7872
fmt.Sprintf("%s=%s", consts.ComposeProjectName, "_my_project"),
7973
}))
8074
assert.NilError(t, err)
81-
p, err = ProjectFromOptions(opts)
75+
p, err := ProjectFromOptions(opts)
8276
assert.NilError(t, err)
8377
assert.Equal(t, p.Name, "my_project")
8478
})
8579

8680
t.Run("by name contains dots", func(t *testing.T) {
87-
opts, err := NewProjectOptions([]string{"testdata/simple/compose.yaml"}, WithName("www.my.project"))
81+
_, err := NewProjectOptions([]string{"testdata/simple/compose.yaml"}, WithName("www.my.project"))
82+
assert.Error(t, err, `"www.my.project" is not a valid project name`)
83+
84+
opts, err := NewProjectOptions([]string{"testdata/simple/compose.yaml"}, WithEnv([]string{
85+
fmt.Sprintf("%s=%s", consts.ComposeProjectName, "www.my.project"),
86+
}))
8887
assert.NilError(t, err)
8988
p, err := ProjectFromOptions(opts)
9089
assert.NilError(t, err)
9190
assert.Equal(t, p.Name, "wwwmyproject")
9291
})
9392

9493
t.Run("by name uppercase", func(t *testing.T) {
95-
opts, err := NewProjectOptions([]string{"testdata/simple/compose.yaml"}, WithName("MY_PROJECT"))
94+
_, err := NewProjectOptions([]string{"testdata/simple/compose.yaml"}, WithName("MY_PROJECT"))
95+
assert.Error(t, err, `"MY_PROJECT" is not a valid project name`)
96+
97+
opts, err := NewProjectOptions([]string{"testdata/simple/compose.yaml"}, WithEnv([]string{
98+
fmt.Sprintf("%s=%s", consts.ComposeProjectName, "_my_project"),
99+
}))
96100
assert.NilError(t, err)
97101
p, err := ProjectFromOptions(opts)
98102
assert.NilError(t, err)

loader/loader.go

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -69,7 +69,7 @@ type Options struct {
6969
}
7070

7171
func (o *Options) SetProjectName(name string, imperativelySet bool) {
72-
o.projectName = normalizeProjectName(name)
72+
o.projectName = NormalizeProjectName(name)
7373
o.projectNameImperativelySet = imperativelySet
7474
}
7575

@@ -208,7 +208,7 @@ func Load(configDetails types.ConfigDetails, options ...func(*Options)) (*types.
208208
}
209209

210210
projectName, projectNameImperativelySet := opts.GetProjectName()
211-
model.Name = normalizeProjectName(model.Name)
211+
model.Name = NormalizeProjectName(model.Name)
212212
if !projectNameImperativelySet && model.Name != "" {
213213
projectName = model.Name
214214
}
@@ -245,7 +245,7 @@ func Load(configDetails types.ConfigDetails, options ...func(*Options)) (*types.
245245
return project, nil
246246
}
247247

248-
func normalizeProjectName(s string) string {
248+
func NormalizeProjectName(s string) string {
249249
r := regexp.MustCompile("[a-z0-9_-]")
250250
s = strings.ToLower(s)
251251
s = strings.Join(r.FindAllString(s, -1), "")

0 commit comments

Comments
 (0)