Skip to content

Commit 28d5af5

Browse files
committed
refactor: get majority of functionality split off
1 parent 7d6dd24 commit 28d5af5

File tree

3 files changed

+98
-42
lines changed

3 files changed

+98
-42
lines changed

cmd/readmevalidation/coderresources.go

Lines changed: 89 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -89,7 +89,7 @@ func validateCoderResourceIconURL(iconURL string) []error {
8989
return []error{xerrors.New("icon URL cannot be empty")}
9090
}
9191

92-
errs := []error{}
92+
var errs []error
9393

9494
// If the URL does not have a relative path.
9595
if !strings.HasPrefix(iconURL, ".") && !strings.HasPrefix(iconURL, "/") {
@@ -120,7 +120,7 @@ func validateCoderResourceTags(tags []string) error {
120120

121121
// All of these tags are used for the module/template filter controls in the Registry site. Need to make sure they
122122
// can all be placed in the browser URL without issue.
123-
invalidTags := []string{}
123+
var invalidTags []string
124124
for _, t := range tags {
125125
if t != url.QueryEscape(t) {
126126
invalidTags = append(invalidTags, t)
@@ -133,7 +133,7 @@ func validateCoderResourceTags(tags []string) error {
133133
return nil
134134
}
135135

136-
func validateCoderResourceReadmeBody(body string) []error {
136+
func validateCoderModuleReadmeBody(body string) []error {
137137
var errs []error
138138

139139
trimmed := strings.TrimSpace(body)
@@ -213,33 +213,88 @@ func validateCoderResourceReadmeBody(body string) []error {
213213
return errs
214214
}
215215

216-
func validateCoderResourceReadme(rm coderResourceReadme) []error {
217-
var errs []error
216+
func validateCoderResourceFrontmatter(resourceType string, filePath string, fm coderResourceFrontmatter) []error {
217+
if !slices.Contains(supportedResourceTypes, resourceType) {
218+
return []error{xerrors.Errorf("cannot process unknown resource type %q", resourceType)}
219+
}
218220

219-
for _, err := range validateCoderResourceReadmeBody(rm.body) {
220-
errs = append(errs, addFilePathToError(rm.filePath, err))
221+
var errs []error
222+
if err := validateCoderResourceDisplayName(fm.DisplayName); err != nil {
223+
errs = append(errs, addFilePathToError(filePath, err))
224+
}
225+
if err := validateCoderResourceDescription(fm.Description); err != nil {
226+
errs = append(errs, addFilePathToError(filePath, err))
227+
}
228+
if err := validateCoderResourceTags(fm.Tags); err != nil {
229+
errs = append(errs, addFilePathToError(filePath, err))
221230
}
222231

223-
if err := validateCoderResourceDisplayName(rm.frontmatter.DisplayName); err != nil {
224-
errs = append(errs, addFilePathToError(rm.filePath, err))
232+
for _, err := range validateCoderResourceIconURL(fm.IconURL) {
233+
errs = append(errs, addFilePathToError(filePath, err))
225234
}
226-
if err := validateCoderResourceDescription(rm.frontmatter.Description); err != nil {
227-
errs = append(errs, addFilePathToError(rm.filePath, err))
235+
for _, err := range validateSupportedOperatingSystems(fm.OperatingSystems) {
236+
errs = append(errs, addFilePathToError(filePath, err))
228237
}
229-
if err := validateCoderResourceTags(rm.frontmatter.Tags); err != nil {
238+
239+
return errs
240+
}
241+
242+
func validateCoderModuleReadme(rm coderResourceReadme) []error {
243+
var errs []error
244+
for _, err := range validateCoderModuleReadmeBody(rm.body) {
230245
errs = append(errs, addFilePathToError(rm.filePath, err))
231246
}
247+
if fmErrs := validateCoderResourceFrontmatter("modules", rm.filePath, rm.frontmatter); len(fmErrs) != 0 {
248+
errs = append(errs, fmErrs...)
249+
}
250+
return errs
251+
}
232252

233-
for _, err := range validateCoderResourceIconURL(rm.frontmatter.IconURL) {
234-
errs = append(errs, addFilePathToError(rm.filePath, err))
253+
func validateAllCoderModuleReadmes(resources []coderResourceReadme) error {
254+
var yamlValidationErrors []error
255+
for _, readme := range resources {
256+
errs := validateCoderModuleReadme(readme)
257+
if len(errs) > 0 {
258+
yamlValidationErrors = append(yamlValidationErrors, errs...)
259+
}
235260
}
236-
for _, err := range validateSupportedOperatingSystems(rm.frontmatter.OperatingSystems) {
237-
errs = append(errs, addFilePathToError(rm.filePath, err))
261+
if len(yamlValidationErrors) != 0 {
262+
return validationPhaseError{
263+
phase: validationPhaseReadme,
264+
errors: yamlValidationErrors,
265+
}
238266
}
267+
return nil
268+
}
239269

270+
func validateCoderTemplateReadme(rm coderResourceReadme) []error {
271+
var errs []error
272+
// for _, err := range validateCoderResourceReadmeBody(rm.body) {
273+
// errs = append(errs, addFilePathToError(rm.filePath, err))
274+
// }
275+
if fmErrs := validateCoderResourceFrontmatter("modules", rm.filePath, rm.frontmatter); len(fmErrs) != 0 {
276+
errs = append(errs, fmErrs...)
277+
}
240278
return errs
241279
}
242280

281+
func validateAllCoderTemplateReadmes(resources []coderResourceReadme) error {
282+
var yamlValidationErrors []error
283+
for _, readme := range resources {
284+
errs := validateCoderTemplateReadme(readme)
285+
if len(errs) > 0 {
286+
yamlValidationErrors = append(yamlValidationErrors, errs...)
287+
}
288+
}
289+
if len(yamlValidationErrors) != 0 {
290+
return validationPhaseError{
291+
phase: validationPhaseReadme,
292+
errors: yamlValidationErrors,
293+
}
294+
}
295+
return nil
296+
}
297+
243298
func parseCoderResourceReadme(resourceType string, rm readme) (coderResourceReadme, []error) {
244299
fm, body, err := separateFrontmatter(rm.rawText)
245300
if err != nil {
@@ -248,7 +303,7 @@ func parseCoderResourceReadme(resourceType string, rm readme) (coderResourceRead
248303

249304
keyErrs := validateFrontmatterYamlKeys(fm, supportedCoderResourceStructKeys)
250305
if len(keyErrs) != 0 {
251-
remapped := []error{}
306+
var remapped []error
252307
for _, e := range keyErrs {
253308
remapped = append(remapped, addFilePathToError(rm.filePath, e))
254309
}
@@ -268,7 +323,7 @@ func parseCoderResourceReadme(resourceType string, rm readme) (coderResourceRead
268323
}, nil
269324
}
270325

271-
func parseCoderResourceReadmeFiles(resourceType string, rms []readme) (map[string]coderResourceReadme, error) {
326+
func parseCoderResourceReadmeFiles(resourceType string, rms []readme) ([]coderResourceReadme, error) {
272327
if !slices.Contains(supportedResourceTypes, resourceType) {
273328
return nil, xerrors.Errorf("cannot process unknown resource type %q", resourceType)
274329
}
@@ -291,26 +346,19 @@ func parseCoderResourceReadmeFiles(resourceType string, rms []readme) (map[strin
291346
}
292347
}
293348

294-
yamlValidationErrors := []error{}
295-
for _, readme := range resources {
296-
errs := validateCoderResourceReadme(readme)
297-
if len(errs) > 0 {
298-
yamlValidationErrors = append(yamlValidationErrors, errs...)
299-
}
300-
}
301-
if len(yamlValidationErrors) != 0 {
302-
return nil, validationPhaseError{
303-
phase: validationPhaseReadme,
304-
errors: yamlValidationErrors,
305-
}
349+
var serialized []coderResourceReadme
350+
for _, r := range resources {
351+
serialized = append(serialized, r)
306352
}
307-
308-
return resources, nil
353+
slices.SortFunc(serialized, func(r1 coderResourceReadme, r2 coderResourceReadme) int {
354+
return strings.Compare(r1.filePath, r2.filePath)
355+
})
356+
return serialized, nil
309357
}
310358

311359
// Todo: Need to beef up this function by grabbing each image/video URL from
312360
// the body's AST.
313-
func validateCoderResourceRelativeURLs(_ map[string]coderResourceReadme) error {
361+
func validateCoderResourceRelativeURLs(_ []coderResourceReadme) error {
314362
return nil
315363
}
316364

@@ -380,6 +428,10 @@ func validateAllCoderModules() error {
380428
if err != nil {
381429
return err
382430
}
431+
err = validateAllCoderModuleReadmes(resources)
432+
if err != nil {
433+
return err
434+
}
383435
logger.Info(context.Background(), "processed README files as valid Coder resources", "resource_type", resourceType, "num_files", len(resources))
384436

385437
if err := validateCoderResourceRelativeURLs(resources); err != nil {
@@ -401,6 +453,10 @@ func validateAllCoderTemplates() error {
401453
if err != nil {
402454
return err
403455
}
456+
err = validateAllCoderTemplateReadmes(resources)
457+
if err != nil {
458+
return err
459+
}
404460
logger.Info(context.Background(), "processed README files as valid Coder resources", "resource_type", resourceType, "num_files", len(resources))
405461

406462
if err := validateCoderResourceRelativeURLs(resources); err != nil {

cmd/readmevalidation/coderresources_test.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ func TestValidateCoderResourceReadmeBody(t *testing.T) {
1414
t.Run("Parses a valid README body with zero issues", func(t *testing.T) {
1515
t.Parallel()
1616

17-
errs := validateCoderResourceReadmeBody(testBody)
17+
errs := validateCoderModuleReadmeBody(testBody)
1818
for _, e := range errs {
1919
t.Error(e)
2020
}

cmd/readmevalidation/contributors.go

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -79,7 +79,7 @@ func validateContributorSupportEmail(email *string) []error {
7979
return nil
8080
}
8181

82-
errs := []error{}
82+
var errs []error
8383

8484
username, server, ok := strings.Cut(*email, "@")
8585
if !ok {
@@ -140,7 +140,7 @@ func validateContributorAvatarURL(avatarURL *string) []error {
140140
return []error{xerrors.New("avatar URL must be omitted or non-empty string")}
141141
}
142142

143-
errs := []error{}
143+
var errs []error
144144
// Have to use .Parse instead of .ParseRequestURI because this is the one field that's allowed to be a relative URL.
145145
if _, err := url.Parse(*avatarURL); err != nil {
146146
errs = append(errs, xerrors.Errorf("URL %q is not a valid relative or absolute URL", *avatarURL))
@@ -166,7 +166,7 @@ func validateContributorAvatarURL(avatarURL *string) []error {
166166
}
167167

168168
func validateContributorReadme(rm contributorProfileReadme) []error {
169-
allErrs := []error{}
169+
var allErrs []error
170170

171171
if err := validateContributorDisplayName(rm.frontmatter.DisplayName); err != nil {
172172
allErrs = append(allErrs, addFilePathToError(rm.filePath, err))
@@ -202,7 +202,7 @@ func parseContributorProfile(rm readme) (contributorProfileReadme, []error) {
202202

203203
keyErrs := validateFrontmatterYamlKeys(fm, supportedContributorProfileStructKeys)
204204
if len(keyErrs) != 0 {
205-
remapped := []error{}
205+
var remapped []error
206206
for _, e := range keyErrs {
207207
remapped = append(remapped, addFilePathToError(rm.filePath, e))
208208
}
@@ -223,7 +223,7 @@ func parseContributorProfile(rm readme) (contributorProfileReadme, []error) {
223223

224224
func parseContributorFiles(readmeEntries []readme) (map[string]contributorProfileReadme, error) {
225225
profilesByNamespace := map[string]contributorProfileReadme{}
226-
yamlParsingErrors := []error{}
226+
var yamlParsingErrors []error
227227
for _, rm := range readmeEntries {
228228
p, errs := parseContributorProfile(rm)
229229
if len(errs) != 0 {
@@ -244,7 +244,7 @@ func parseContributorFiles(readmeEntries []readme) (map[string]contributorProfil
244244
}
245245
}
246246

247-
yamlValidationErrors := []error{}
247+
var yamlValidationErrors []error
248248
for _, p := range profilesByNamespace {
249249
if errors := validateContributorReadme(p); len(errors) > 0 {
250250
yamlValidationErrors = append(yamlValidationErrors, errors...)
@@ -267,8 +267,8 @@ func aggregateContributorReadmeFiles() ([]readme, error) {
267267
return nil, err
268268
}
269269

270-
allReadmeFiles := []readme{}
271-
errs := []error{}
270+
var allReadmeFiles []readme
271+
var errs []error
272272
dirPath := ""
273273
for _, e := range dirEntries {
274274
if !e.IsDir() {

0 commit comments

Comments
 (0)