chore: add avatars for each contributor (#117)
## Changes made - Added avatars for each contributor - Updated validation steps to account for avatars, if the avatar field exists - Went ahead and made some slog changes, ahead of @cstyan's refactor PR
This commit is contained in:
parent
a8d92df7d5
commit
d004200d93
@ -16,15 +16,13 @@ import (
|
|||||||
var validContributorStatuses = []string{"official", "partner", "community"}
|
var validContributorStatuses = []string{"official", "partner", "community"}
|
||||||
|
|
||||||
type contributorProfileFrontmatter struct {
|
type contributorProfileFrontmatter struct {
|
||||||
DisplayName string `yaml:"display_name"`
|
DisplayName string `yaml:"display_name"`
|
||||||
Bio string `yaml:"bio"`
|
Bio string `yaml:"bio"`
|
||||||
ContributorStatus string `yaml:"status"`
|
ContributorStatus string `yaml:"status"`
|
||||||
// Script assumes that if avatar URL is nil, the Registry site build step
|
AvatarURL *string `yaml:"avatar"`
|
||||||
// will backfill the value with the user's GitHub avatar URL
|
LinkedinURL *string `yaml:"linkedin"`
|
||||||
AvatarURL *string `yaml:"avatar"`
|
WebsiteURL *string `yaml:"website"`
|
||||||
LinkedinURL *string `yaml:"linkedin"`
|
SupportEmail *string `yaml:"support_email"`
|
||||||
WebsiteURL *string `yaml:"website"`
|
|
||||||
SupportEmail *string `yaml:"support_email"`
|
|
||||||
}
|
}
|
||||||
|
|
||||||
type contributorProfileReadme struct {
|
type contributorProfileReadme struct {
|
||||||
@ -275,11 +273,8 @@ func aggregateContributorReadmeFiles() ([]readme, error) {
|
|||||||
func validateContributorRelativeUrls(contributors map[string]contributorProfileReadme) error {
|
func validateContributorRelativeUrls(contributors map[string]contributorProfileReadme) 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
|
||||||
errs := []error{}
|
var errs []error
|
||||||
|
|
||||||
for _, con := range contributors {
|
for _, con := range contributors {
|
||||||
// If the avatar URL is missing, we'll just assume that the Registry
|
|
||||||
// site build step will take care of filling in the data properly
|
|
||||||
if con.frontmatter.AvatarURL == nil {
|
if con.frontmatter.AvatarURL == nil {
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
@ -290,16 +285,18 @@ func validateContributorRelativeUrls(contributors map[string]contributorProfileR
|
|||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
|
|
||||||
if strings.HasPrefix(*con.frontmatter.AvatarURL, "..") {
|
isAvatarInApprovedSpot := strings.HasPrefix(*con.frontmatter.AvatarURL, "./.images/") ||
|
||||||
|
strings.HasPrefix(*con.frontmatter.AvatarURL, ".images/")
|
||||||
|
if !isAvatarInApprovedSpot {
|
||||||
errs = append(errs, fmt.Errorf("%q: relative avatar URLs cannot be placed outside a user's namespaced directory", con.filePath))
|
errs = append(errs, fmt.Errorf("%q: relative avatar URLs cannot be placed outside a user's namespaced directory", con.filePath))
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
|
|
||||||
absolutePath := strings.TrimSuffix(con.filePath, "README.md") +
|
absolutePath := strings.TrimSuffix(con.filePath, "README.md") +
|
||||||
*con.frontmatter.AvatarURL
|
*con.frontmatter.AvatarURL
|
||||||
_, err := os.ReadFile(absolutePath)
|
_, err := os.Stat(absolutePath)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
errs = append(errs, fmt.Errorf("%q: relative avatar path %q does not point to image in file system", con.filePath, *con.frontmatter.AvatarURL))
|
errs = append(errs, fmt.Errorf("%q: path %q does not point to image in file system", con.filePath, absolutePath))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -6,25 +6,30 @@
|
|||||||
package main
|
package main
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"fmt"
|
"context"
|
||||||
"log"
|
"log"
|
||||||
"os"
|
"os"
|
||||||
|
|
||||||
|
"cdr.dev/slog"
|
||||||
|
"cdr.dev/slog/sloggers/sloghuman"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
var logger = slog.Make(sloghuman.Sink(os.Stdout))
|
||||||
|
|
||||||
func main() {
|
func main() {
|
||||||
log.Println("Starting README validation")
|
logger.Info(context.Background(), "Starting README validation")
|
||||||
|
|
||||||
// If there are fundamental problems with how the repo is structured, we
|
// If there are fundamental problems with how the repo is structured, we
|
||||||
// can't make any guarantees that any further validations will be relevant
|
// can't make any guarantees that any further validations will be relevant
|
||||||
// or accurate
|
// or accurate
|
||||||
repoErr := validateRepoStructure()
|
err := validateRepoStructure()
|
||||||
if repoErr != nil {
|
if err != nil {
|
||||||
log.Println(repoErr)
|
log.Println(err)
|
||||||
os.Exit(1)
|
os.Exit(1)
|
||||||
}
|
}
|
||||||
|
|
||||||
var errs []error
|
var errs []error
|
||||||
err := validateAllContributorFiles()
|
err = validateAllContributorFiles()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
errs = append(errs, err)
|
errs = append(errs, err)
|
||||||
}
|
}
|
||||||
@ -34,11 +39,11 @@ func main() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if len(errs) == 0 {
|
if len(errs) == 0 {
|
||||||
log.Printf("Processed all READMEs in the %q directory\n", rootRegistryPath)
|
logger.Info(context.Background(), "Processed all READMEs in directory", "dir", rootRegistryPath)
|
||||||
os.Exit(0)
|
os.Exit(0)
|
||||||
}
|
}
|
||||||
for _, err := range errs {
|
for _, err := range errs {
|
||||||
fmt.Println(err)
|
logger.Error(context.Background(), err.Error())
|
||||||
}
|
}
|
||||||
os.Exit(1)
|
os.Exit(1)
|
||||||
}
|
}
|
||||||
|
|||||||
22
go.mod
22
go.mod
@ -2,4 +2,24 @@ module coder.com/coder-registry
|
|||||||
|
|
||||||
go 1.23.2
|
go 1.23.2
|
||||||
|
|
||||||
require gopkg.in/yaml.v3 v3.0.1
|
require (
|
||||||
|
cdr.dev/slog v1.6.1
|
||||||
|
gopkg.in/yaml.v3 v3.0.1
|
||||||
|
)
|
||||||
|
|
||||||
|
require (
|
||||||
|
github.com/aymanbagabas/go-osc52/v2 v2.0.1 // indirect
|
||||||
|
github.com/charmbracelet/lipgloss v0.7.1 // indirect
|
||||||
|
github.com/lucasb-eyer/go-colorful v1.2.0 // indirect
|
||||||
|
github.com/mattn/go-isatty v0.0.19 // indirect
|
||||||
|
github.com/mattn/go-runewidth v0.0.15 // indirect
|
||||||
|
github.com/muesli/reflow v0.3.0 // indirect
|
||||||
|
github.com/muesli/termenv v0.15.2 // indirect
|
||||||
|
github.com/rivo/uniseg v0.4.4 // indirect
|
||||||
|
go.opentelemetry.io/otel v1.16.0 // indirect
|
||||||
|
go.opentelemetry.io/otel/trace v1.16.0 // indirect
|
||||||
|
golang.org/x/crypto v0.11.0 // indirect
|
||||||
|
golang.org/x/sys v0.10.0 // indirect
|
||||||
|
golang.org/x/term v0.10.0 // indirect
|
||||||
|
golang.org/x/xerrors v0.0.0-20220907171357-04be3eba64a2 // indirect
|
||||||
|
)
|
||||||
|
|||||||
34
go.sum
34
go.sum
@ -1,3 +1,37 @@
|
|||||||
|
cdr.dev/slog v1.6.1 h1:IQjWZD0x6//sfv5n+qEhbu3wBkmtBQY5DILXNvMaIv4=
|
||||||
|
cdr.dev/slog v1.6.1/go.mod h1:eHEYQLaZvxnIAXC+XdTSNLb/kgA/X2RVSF72v5wsxEI=
|
||||||
|
github.com/aymanbagabas/go-osc52/v2 v2.0.1 h1:HwpRHbFMcZLEVr42D4p7XBqjyuxQH5SMiErDT4WkJ2k=
|
||||||
|
github.com/aymanbagabas/go-osc52/v2 v2.0.1/go.mod h1:uYgXzlJ7ZpABp8OJ+exZzJJhRNQ2ASbcXHWsFqH8hp8=
|
||||||
|
github.com/charmbracelet/lipgloss v0.7.1 h1:17WMwi7N1b1rVWOjMT+rCh7sQkvDU75B2hbZpc5Kc1E=
|
||||||
|
github.com/charmbracelet/lipgloss v0.7.1/go.mod h1:yG0k3giv8Qj8edTCbbg6AlQ5e8KNWpFujkNawKNhE2c=
|
||||||
|
github.com/lucasb-eyer/go-colorful v1.2.0 h1:1nnpGOrhyZZuNyfu1QjKiUICQ74+3FNCN69Aj6K7nkY=
|
||||||
|
github.com/lucasb-eyer/go-colorful v1.2.0/go.mod h1:R4dSotOR9KMtayYi1e77YzuveK+i7ruzyGqttikkLy0=
|
||||||
|
github.com/mattn/go-isatty v0.0.19 h1:JITubQf0MOLdlGRuRq+jtsDlekdYPia9ZFsB8h/APPA=
|
||||||
|
github.com/mattn/go-isatty v0.0.19/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y=
|
||||||
|
github.com/mattn/go-runewidth v0.0.12/go.mod h1:RAqKPSqVFrSLVXbA8x7dzmKdmGzieGRCM46jaSJTDAk=
|
||||||
|
github.com/mattn/go-runewidth v0.0.15 h1:UNAjwbU9l54TA3KzvqLGxwWjHmMgBUVhBiTjelZgg3U=
|
||||||
|
github.com/mattn/go-runewidth v0.0.15/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w=
|
||||||
|
github.com/muesli/reflow v0.3.0 h1:IFsN6K9NfGtjeggFP+68I4chLZV2yIKsXJFNZ+eWh6s=
|
||||||
|
github.com/muesli/reflow v0.3.0/go.mod h1:pbwTDkVPibjO2kyvBQRBxTWEEGDGq0FlB1BIKtnHY/8=
|
||||||
|
github.com/muesli/termenv v0.15.2 h1:GohcuySI0QmI3wN8Ok9PtKGkgkFIk7y6Vpb5PvrY+Wo=
|
||||||
|
github.com/muesli/termenv v0.15.2/go.mod h1:Epx+iuz8sNs7mNKhxzH4fWXGNpZwUaJKRS1noLXviQ8=
|
||||||
|
github.com/rivo/uniseg v0.1.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc=
|
||||||
|
github.com/rivo/uniseg v0.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc=
|
||||||
|
github.com/rivo/uniseg v0.4.4 h1:8TfxU8dW6PdqD27gjM8MVNuicgxIjxpm4K7x4jp8sis=
|
||||||
|
github.com/rivo/uniseg v0.4.4/go.mod h1:FN3SvrM+Zdj16jyLfmOkMNblXMcoc8DfTHruCPUcx88=
|
||||||
|
go.opentelemetry.io/otel v1.16.0 h1:Z7GVAX/UkAXPKsy94IU+i6thsQS4nb7LviLpnaNeW8s=
|
||||||
|
go.opentelemetry.io/otel v1.16.0/go.mod h1:vl0h9NUa1D5s1nv3A5vZOYWn8av4K8Ml6JDeHrT/bx4=
|
||||||
|
go.opentelemetry.io/otel/trace v1.16.0 h1:8JRpaObFoW0pxuVPapkgH8UhHQj+bJW8jJsCZEu5MQs=
|
||||||
|
go.opentelemetry.io/otel/trace v1.16.0/go.mod h1:Yt9vYq1SdNz3xdjZZK7wcXv1qv2pwLkqr2QVwea0ef0=
|
||||||
|
golang.org/x/crypto v0.11.0 h1:6Ewdq3tDic1mg5xRO4milcWCfMVQhI4NkqWWvqejpuA=
|
||||||
|
golang.org/x/crypto v0.11.0/go.mod h1:xgJhtzW8F9jGdVFWZESrid1U1bjeNy4zgy5cRr/CIio=
|
||||||
|
golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||||
|
golang.org/x/sys v0.10.0 h1:SqMFp9UcQJZa+pmYuAKjd9xq1f0j5rLcDIk0mj4qAsA=
|
||||||
|
golang.org/x/sys v0.10.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||||
|
golang.org/x/term v0.10.0 h1:3R7pNqamzBraeqj/Tj8qt1aQ2HpmlC+Cx/qL/7hn4/c=
|
||||||
|
golang.org/x/term v0.10.0/go.mod h1:lpqdcUyK/oCiQxvxVrppt5ggO2KCZ5QblwqPnfZ6d5o=
|
||||||
|
golang.org/x/xerrors v0.0.0-20220907171357-04be3eba64a2 h1:H2TDz8ibqkAF6YGhCdN3jS9O0/s90v0rJh3X/OLHEUk=
|
||||||
|
golang.org/x/xerrors v0.0.0-20220907171357-04be3eba64a2/go.mod h1:K8+ghG5WaK9qNqU5K3HdILfMLy1f3aNYFI/wnl100a8=
|
||||||
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405 h1:yhCVgyC4o1eVCa2tZl7eS0r+SDo693bJlVdllGtEeKM=
|
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405 h1:yhCVgyC4o1eVCa2tZl7eS0r+SDo693bJlVdllGtEeKM=
|
||||||
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
|
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
|
||||||
gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=
|
gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=
|
||||||
|
|||||||
BIN
registry/coder/.images/avatar.png
Normal file
BIN
registry/coder/.images/avatar.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 22 KiB |
@ -2,6 +2,7 @@
|
|||||||
display_name: Coder
|
display_name: Coder
|
||||||
bio: Coder provisions cloud development environments via Terraform, supporting Linux, macOS, Windows, X86, ARM, Kubernetes and more.
|
bio: Coder provisions cloud development environments via Terraform, supporting Linux, macOS, Windows, X86, ARM, Kubernetes and more.
|
||||||
github: coder
|
github: coder
|
||||||
|
avatar: ./.images/avatar.png
|
||||||
linkedin: https://www.linkedin.com/company/coderhq
|
linkedin: https://www.linkedin.com/company/coderhq
|
||||||
website: https://www.coder.com
|
website: https://www.coder.com
|
||||||
status: official
|
status: official
|
||||||
|
|||||||
BIN
registry/nataindata/.images/avatar.png
Normal file
BIN
registry/nataindata/.images/avatar.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 121 KiB |
@ -2,6 +2,7 @@
|
|||||||
display_name: Nataindata
|
display_name: Nataindata
|
||||||
bio: Data engineer
|
bio: Data engineer
|
||||||
github: nataindata
|
github: nataindata
|
||||||
|
avatar: ./.images/avatar.png
|
||||||
website: https://www.nataindata.com
|
website: https://www.nataindata.com
|
||||||
status: community
|
status: community
|
||||||
---
|
---
|
||||||
|
|||||||
BIN
registry/thezoker/.images/avatar.jpeg
Normal file
BIN
registry/thezoker/.images/avatar.jpeg
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 21 KiB |
@ -1,7 +1,8 @@
|
|||||||
---
|
---
|
||||||
display_name: TheZoker
|
display_name: TheZoker
|
||||||
bio: I'm a master computer science student at the TU munich and a webdesigner.
|
bio: I'm a master computer science student at the TU munich and a web designer.
|
||||||
github: TheZoker
|
github: TheZoker
|
||||||
|
avatar: ./.images/avatar.jpeg
|
||||||
website: https://gareis.io/
|
website: https://gareis.io/
|
||||||
status: community
|
status: community
|
||||||
---
|
---
|
||||||
|
|||||||
BIN
registry/whizus/.images/avatar.png
Normal file
BIN
registry/whizus/.images/avatar.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 22 KiB |
@ -1,6 +1,7 @@
|
|||||||
---
|
---
|
||||||
display_name: WhizUs
|
display_name: WhizUs
|
||||||
bio: WhizUs is your premier choice for DevOps, Kubernetes, and Cloud Native consulting. Based in Vienna we combine our expert solutions with a strong commitment to the community. Explore automation, scalability and drive success through collaboration.
|
bio: WhizUs is your premier choice for DevOps, Kubernetes, and Cloud Native consulting. Based in Vienna we combine our expert solutions with a strong commitment to the community. Explore automation, scalability and drive success through collaboration.
|
||||||
|
avatar: ./.images/avatar.png
|
||||||
github: WhizUs
|
github: WhizUs
|
||||||
linkedin: https://www.linkedin.com/company/whizus
|
linkedin: https://www.linkedin.com/company/whizus
|
||||||
website: https://www.whizus.com/
|
website: https://www.whizus.com/
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user