refactor: remove unnecessary intermediary data types
This commit is contained in:
parent
e20e679e08
commit
df2e47e51e
126
.github/scripts/validate-profile-readmes/main.go
vendored
126
.github/scripts/validate-profile-readmes/main.go
vendored
@ -38,41 +38,6 @@ type contributorFrontmatterWithFilepath struct {
|
|||||||
FilePath string
|
FilePath string
|
||||||
}
|
}
|
||||||
|
|
||||||
type contributorProfileStatus int
|
|
||||||
|
|
||||||
const (
|
|
||||||
// Community should always be the first value defined via iota; it should be
|
|
||||||
// treated as the zero value of the type in the event that a more specific
|
|
||||||
// status wasn't defined
|
|
||||||
profileStatusCommunity contributorProfileStatus = iota
|
|
||||||
profileStatusPartner
|
|
||||||
profileStatusOfficial
|
|
||||||
)
|
|
||||||
|
|
||||||
func (status contributorProfileStatus) String() string {
|
|
||||||
switch status {
|
|
||||||
case profileStatusOfficial:
|
|
||||||
return "official"
|
|
||||||
case profileStatusPartner:
|
|
||||||
return "partner"
|
|
||||||
default:
|
|
||||||
return "community"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
type contributorProfile struct {
|
|
||||||
EmployeeGithubUsernames []string
|
|
||||||
GithubUsername string
|
|
||||||
FilePath string
|
|
||||||
DisplayName string
|
|
||||||
Bio string
|
|
||||||
AvatarUrl *string
|
|
||||||
WebsiteURL *string
|
|
||||||
LinkedinURL *string
|
|
||||||
SupportEmail *string
|
|
||||||
Status contributorProfileStatus
|
|
||||||
}
|
|
||||||
|
|
||||||
var _ error = workflowPhaseError{}
|
var _ error = workflowPhaseError{}
|
||||||
|
|
||||||
type workflowPhaseError struct {
|
type workflowPhaseError struct {
|
||||||
@ -399,57 +364,16 @@ func validateContributorYaml(yml contributorFrontmatterWithFilepath) []error {
|
|||||||
return problems
|
return problems
|
||||||
}
|
}
|
||||||
|
|
||||||
func remapContributorProfile(
|
|
||||||
frontmatter contributorFrontmatterWithFilepath,
|
|
||||||
employeeGitHubNames []string,
|
|
||||||
) contributorProfile {
|
|
||||||
// Function assumes that (1) fields are previously validated and are safe to
|
|
||||||
// copy over verbatim when appropriate, and (2) any missing avatar URLs will
|
|
||||||
// be backfilled during the main Registry site build step
|
|
||||||
remapped := contributorProfile{
|
|
||||||
FilePath: frontmatter.FilePath,
|
|
||||||
DisplayName: frontmatter.DisplayName,
|
|
||||||
GithubUsername: frontmatter.GithubUsername,
|
|
||||||
Bio: frontmatter.Bio,
|
|
||||||
LinkedinURL: frontmatter.LinkedinURL,
|
|
||||||
SupportEmail: frontmatter.SupportEmail,
|
|
||||||
WebsiteURL: frontmatter.WebsiteURL,
|
|
||||||
AvatarUrl: frontmatter.AvatarUrl,
|
|
||||||
}
|
|
||||||
|
|
||||||
if frontmatter.ContributorStatus != nil {
|
|
||||||
switch *frontmatter.ContributorStatus {
|
|
||||||
case "partner":
|
|
||||||
remapped.Status = profileStatusPartner
|
|
||||||
case "official":
|
|
||||||
remapped.Status = profileStatusOfficial
|
|
||||||
default:
|
|
||||||
remapped.Status = profileStatusCommunity
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if employeeGitHubNames != nil {
|
|
||||||
remapped.EmployeeGithubUsernames = employeeGitHubNames[:]
|
|
||||||
slices.SortFunc(
|
|
||||||
remapped.EmployeeGithubUsernames,
|
|
||||||
func(name1 string, name2 string) int {
|
|
||||||
return strings.Compare(name1, name2)
|
|
||||||
},
|
|
||||||
)
|
|
||||||
}
|
|
||||||
|
|
||||||
return remapped
|
|
||||||
}
|
|
||||||
|
|
||||||
func parseContributorFiles(readmeEntries []directoryReadme) (
|
func parseContributorFiles(readmeEntries []directoryReadme) (
|
||||||
map[string]contributorProfile,
|
map[string]contributorFrontmatterWithFilepath,
|
||||||
error,
|
error,
|
||||||
) {
|
) {
|
||||||
frontmatterByGithub := map[string]contributorFrontmatterWithFilepath{}
|
frontmatterByUsername := map[string]contributorFrontmatterWithFilepath{}
|
||||||
yamlParsingErrors := workflowPhaseError{
|
yamlParsingErrors := workflowPhaseError{
|
||||||
Phase: "YAML parsing",
|
Phase: "YAML parsing",
|
||||||
}
|
}
|
||||||
for _, rm := range readmeEntries {
|
for _, rm := range readmeEntries {
|
||||||
fmText, err := extractFrontmatter(rm.RawText)
|
fm, err := extractFrontmatter(rm.RawText)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
yamlParsingErrors.Errors = append(
|
yamlParsingErrors.Errors = append(
|
||||||
yamlParsingErrors.Errors,
|
yamlParsingErrors.Errors,
|
||||||
@ -459,33 +383,32 @@ func parseContributorFiles(readmeEntries []directoryReadme) (
|
|||||||
}
|
}
|
||||||
|
|
||||||
yml := rawContributorProfileFrontmatter{}
|
yml := rawContributorProfileFrontmatter{}
|
||||||
if err := yaml.Unmarshal([]byte(fmText), &yml); err != nil {
|
if err := yaml.Unmarshal([]byte(fm), &yml); err != nil {
|
||||||
yamlParsingErrors.Errors = append(
|
yamlParsingErrors.Errors = append(
|
||||||
yamlParsingErrors.Errors,
|
yamlParsingErrors.Errors,
|
||||||
fmt.Errorf("failed to parse %q: %v", rm.FilePath, err),
|
fmt.Errorf("failed to parse %q: %v", rm.FilePath, err),
|
||||||
)
|
)
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
|
processed := contributorFrontmatterWithFilepath{
|
||||||
trackable := contributorFrontmatterWithFilepath{
|
|
||||||
FilePath: rm.FilePath,
|
FilePath: rm.FilePath,
|
||||||
rawContributorProfileFrontmatter: yml,
|
rawContributorProfileFrontmatter: yml,
|
||||||
}
|
}
|
||||||
|
|
||||||
if prev, conflict := frontmatterByGithub[trackable.GithubUsername]; conflict {
|
if prev, conflict := frontmatterByUsername[processed.GithubUsername]; conflict {
|
||||||
yamlParsingErrors.Errors = append(
|
yamlParsingErrors.Errors = append(
|
||||||
yamlParsingErrors.Errors,
|
yamlParsingErrors.Errors,
|
||||||
fmt.Errorf(
|
fmt.Errorf(
|
||||||
"GitHub name conflict for %q for files %q and %q",
|
"GitHub name conflict for %q for files %q and %q",
|
||||||
trackable.GithubUsername,
|
processed.GithubUsername,
|
||||||
prev.FilePath,
|
prev.FilePath,
|
||||||
trackable.FilePath,
|
processed.FilePath,
|
||||||
),
|
),
|
||||||
)
|
)
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
|
|
||||||
frontmatterByGithub[trackable.GithubUsername] = trackable
|
frontmatterByUsername[processed.GithubUsername] = processed
|
||||||
}
|
}
|
||||||
if len(yamlParsingErrors.Errors) != 0 {
|
if len(yamlParsingErrors.Errors) != 0 {
|
||||||
return nil, yamlParsingErrors
|
return nil, yamlParsingErrors
|
||||||
@ -495,7 +418,7 @@ func parseContributorFiles(readmeEntries []directoryReadme) (
|
|||||||
yamlValidationErrors := workflowPhaseError{
|
yamlValidationErrors := workflowPhaseError{
|
||||||
Phase: "Raw YAML Validation",
|
Phase: "Raw YAML Validation",
|
||||||
}
|
}
|
||||||
for _, yml := range frontmatterByGithub {
|
for _, yml := range frontmatterByUsername {
|
||||||
errors := validateContributorYaml(yml)
|
errors := validateContributorYaml(yml)
|
||||||
if len(errors) > 0 {
|
if len(errors) > 0 {
|
||||||
yamlValidationErrors.Errors = append(
|
yamlValidationErrors.Errors = append(
|
||||||
@ -512,25 +435,12 @@ func parseContributorFiles(readmeEntries []directoryReadme) (
|
|||||||
)
|
)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if len(yamlValidationErrors.Errors) != 0 {
|
|
||||||
return nil, yamlValidationErrors
|
|
||||||
}
|
|
||||||
|
|
||||||
contributorError := workflowPhaseError{
|
|
||||||
Phase: "Contributor struct remapping",
|
|
||||||
}
|
|
||||||
structured := map[string]contributorProfile{}
|
|
||||||
for _, yml := range frontmatterByGithub {
|
|
||||||
group := employeeGithubGroups[yml.GithubUsername]
|
|
||||||
remapped := remapContributorProfile(yml, group)
|
|
||||||
structured[yml.GithubUsername] = remapped
|
|
||||||
}
|
|
||||||
for companyName, group := range employeeGithubGroups {
|
for companyName, group := range employeeGithubGroups {
|
||||||
if _, found := structured[companyName]; found {
|
if _, found := frontmatterByUsername[companyName]; found {
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
contributorError.Errors = append(
|
yamlValidationErrors.Errors = append(
|
||||||
contributorError.Errors,
|
yamlValidationErrors.Errors,
|
||||||
fmt.Errorf(
|
fmt.Errorf(
|
||||||
"company %q does not exist in %q directory but is referenced by these profiles: [%s]",
|
"company %q does not exist in %q directory but is referenced by these profiles: [%s]",
|
||||||
companyName,
|
companyName,
|
||||||
@ -539,11 +449,11 @@ func parseContributorFiles(readmeEntries []directoryReadme) (
|
|||||||
),
|
),
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
if len(contributorError.Errors) != 0 {
|
if len(yamlValidationErrors.Errors) != 0 {
|
||||||
return nil, contributorError
|
return nil, yamlValidationErrors
|
||||||
}
|
}
|
||||||
|
|
||||||
return structured, nil
|
return frontmatterByUsername, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func aggregateReadmeFiles() ([]directoryReadme, error) {
|
func aggregateReadmeFiles() ([]directoryReadme, error) {
|
||||||
@ -590,7 +500,7 @@ func aggregateReadmeFiles() ([]directoryReadme, error) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func validateRelativeUrls(
|
func validateRelativeUrls(
|
||||||
contributors map[string]contributorProfile,
|
contributors map[string]contributorFrontmatterWithFilepath,
|
||||||
) error {
|
) error {
|
||||||
// This function only validates relative avatar URLs for now, but it can be
|
// This function only validates relative avatar URLs for now, but it can be
|
||||||
// beefed up to validate more in the future
|
// beefed up to validate more in the future
|
||||||
@ -639,7 +549,7 @@ func main() {
|
|||||||
if err != nil {
|
if err != nil {
|
||||||
log.Panic(err)
|
log.Panic(err)
|
||||||
}
|
}
|
||||||
log.Println("all relative URLs for READMEs are valid")
|
log.Println("All relative URLs for READMEs are valid")
|
||||||
|
|
||||||
log.Printf(
|
log.Printf(
|
||||||
"Processed all READMEs in the %q directory\n",
|
"Processed all READMEs in the %q directory\n",
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user