From 62d661746ed25fe8e2dfdfbc8caba8f869ef8ef3 Mon Sep 17 00:00:00 2001 From: roee88 Date: Wed, 30 Dec 2020 15:56:18 +0200 Subject: [PATCH] reduced number of files Signed-off-by: roee88 --- go.mod | 2 +- go.sum | 2 - pkg/builder/builder.go | 87 +++++++++++++++++++++++++++------------ pkg/builder/loader.go | 6 ++- pkg/builder/properties.go | 48 --------------------- pkg/builder/utils.go | 31 -------------- 6 files changed, 65 insertions(+), 111 deletions(-) delete mode 100644 pkg/builder/properties.go delete mode 100644 pkg/builder/utils.go diff --git a/go.mod b/go.mod index 031e428..ad4f6ba 100644 --- a/go.mod +++ b/go.mod @@ -11,7 +11,7 @@ require ( github.com/sirupsen/logrus v1.4.2 github.com/spf13/cobra v1.1.1 github.com/spf13/viper v1.7.1 - github.com/stoewer/go-strcase v1.2.0 + github.com/stretchr/testify v1.5.1 // indirect gopkg.in/yaml.v2 v2.2.8 k8s.io/apiextensions-apiserver v0.17.3 k8s.io/apimachinery v0.17.3 diff --git a/go.sum b/go.sum index b92645f..91ac21b 100644 --- a/go.sum +++ b/go.sum @@ -360,8 +360,6 @@ github.com/spf13/viper v1.3.2/go.mod h1:ZiWeW+zYFKm7srdB9IoDzzZXaJaI5eL9QjNiN/DM github.com/spf13/viper v1.7.0/go.mod h1:8WkrPz2fc9jxqZNCJI/76HCieCp4Q8HaLFoCha5qpdg= github.com/spf13/viper v1.7.1 h1:pM5oEahlgWv/WnHXpgbKz7iLIxRf65tye2Ci+XFK5sk= github.com/spf13/viper v1.7.1/go.mod h1:8WkrPz2fc9jxqZNCJI/76HCieCp4Q8HaLFoCha5qpdg= -github.com/stoewer/go-strcase v1.2.0 h1:Z2iHWqGXH00XYgqDmNgQbIBxf3wrNq0F3feEy0ainaU= -github.com/stoewer/go-strcase v1.2.0/go.mod h1:IBiWB2sKIp3wVVQ3Y035++gc+knqhUQag1KpM8ahLw8= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.2.0/go.mod h1:qt09Ya8vawLte6SNmTgCsAVtYtaKzEcn8ATUoHMkEqE= diff --git a/pkg/builder/builder.go b/pkg/builder/builder.go index 65dc716..375be22 100644 --- a/pkg/builder/builder.go +++ b/pkg/builder/builder.go @@ -4,6 +4,8 @@ import ( "fmt" "os" "path" + "regexp" + "sort" "strings" "text/template" @@ -20,6 +22,7 @@ type ModelBuilder struct { Links map[string]int } +// Write outputs markdown to the output direcory func (b *ModelBuilder) Write() error { filename := path.Join(b.OutputDir, "out.md") f, err := os.Create(filename) @@ -32,6 +35,7 @@ func (b *ModelBuilder) Write() error { return t.Execute(f, *b.Model) } +// Add adds a CustomResourceDefinition to the model func (b *ModelBuilder) Add(crd *apiextensions.CustomResourceDefinition) error { // Add chapter for each version for _, version := range crd.Spec.Versions { @@ -39,8 +43,6 @@ func (b *ModelBuilder) Add(crd *apiextensions.CustomResourceDefinition) error { gv := fmt.Sprintf("%s/%s", group, version.Name) kind := crd.Spec.Names.Kind - log.Info("processing ", gv, kind) - // Find matching group/version groupModel := b.Model.findGroupModel(group, version.Name) if groupModel == nil { @@ -52,15 +54,8 @@ func (b *ModelBuilder) Add(crd *apiextensions.CustomResourceDefinition) error { Group: group, Version: version.Name, } - log.Info("adding group ", groupModel) b.Model.Groups = append(b.Model.Groups, groupModel) } - // if groupModel.Metadata.Title == "" { - // groupModel.Metadata.Title = gv - // } - // if groupModel.Metadata.Description == "" { - // groupModel.Metadata.Description = fmt.Sprintf("API Reference for %s", gv) - // } // Find matching kind kindModel := groupModel.findKindModel(kind) @@ -72,15 +67,8 @@ func (b *ModelBuilder) Add(crd *apiextensions.CustomResourceDefinition) error { kindModel = &KindModel{ Name: kind, } - log.Info("adding kind ", kindModel) groupModel.Kinds = append(groupModel.Kinds, kindModel) } - // if kindModel.Metadata.Title == "" { - // kindModel.Metadata.Title = kind - // } - // if kindModel.Metadata.Description == "" { - // kindModel.Metadata.Description = fmt.Sprintf("API Reference for %s (%s)", kind, gv) - // } // Find schema validation := version.Schema @@ -121,18 +109,15 @@ func (b *ModelBuilder) addTypeModels(groupModel *GroupModel, kindModel *KindMode Description: schema.Description, } kindModel.Types = append(kindModel.Types, typeModel) - // log.Info("adding type ", typeModel) for _, fieldName := range orderedPropertyKeys(schema.Required, schema.Properties, true) { - // log.Info("adding field ", fieldName) property := schema.Properties[fieldName] typename, typekey := getTypeNameAndKey(fieldName, property) fieldModel := &FieldModel{ - Name: fieldName, - Type: typename, - // TypeKey: typekey, // TODO: handle as link + Name: fieldName, + Type: typename, Description: property.Description, - Required: isRequired(fieldName, schema.Required), + Required: isRequiredProperty(fieldName, schema.Required), } typeModel.Fields = append(typeModel.Fields, fieldModel) @@ -174,11 +159,6 @@ func getTypeNameAndKey(fieldName string, s apiextensions.JSONSchemaProps) (strin // Handle complex types if s.Type == "object" && s.Properties != nil { - // TODO(roee88): we don't have type information so we need a reasonable workaround here - // key := fmt.Sprintf("%sSpec", strcase.UpperCamelCase(fieldName)) - // if fieldName == "spec" { - // key = strcase.UpperCamelCase(fieldName) - // } key := "object" return key, &key } @@ -191,3 +171,56 @@ func getTypeNameAndKey(fieldName string, s apiextensions.JSONSchemaProps) (strin return value, nil } + +// headingID returns the ID built by hugo for a given header +func headingID(s string) string { + result := s + result = strings.ToLower(s) + result = strings.TrimSpace(result) + result = regexp.MustCompile(`([^\w\- ]+)`).ReplaceAllString(result, "") + result = regexp.MustCompile(`(\s)`).ReplaceAllString(result, "-") + result = regexp.MustCompile(`(\-+$)`).ReplaceAllString(result, "") + + return result +} + +// orderedPropertyKeys returns the keys of m alphabetically ordered +// keys in required will be placed first +func orderedPropertyKeys(required []string, m map[string]apiextensions.JSONSchemaProps, isResource bool) []string { + sort.Strings(required) + + if isResource { + mkeys := make(map[string]struct{}) + for k := range m { + mkeys[k] = struct{}{} + } + for _, special := range []string{"metadata", "kind", "apiVersion"} { + if !isRequiredProperty(special, required) { + if _, ok := mkeys[special]; ok { + required = append([]string{special}, required...) + } + } + } + } + + keys := make([]string, len(m)-len(required)) + i := 0 + for k := range m { + if !isRequiredProperty(k, required) { + keys[i] = k + i++ + } + } + sort.Strings(keys) + return append(required, keys...) +} + +// isRequired returns true if k is in the required array +func isRequiredProperty(k string, required []string) bool { + for _, r := range required { + if r == k { + return true + } + } + return false +} diff --git a/pkg/builder/loader.go b/pkg/builder/loader.go index 64d1cd6..47d9d13 100644 --- a/pkg/builder/loader.go +++ b/pkg/builder/loader.go @@ -16,6 +16,7 @@ import ( "k8s.io/client-go/kubernetes/scheme" ) +// LoadModel loads a Model from a TOC yaml func LoadModel(filepath string) (*Model, error) { model := &Model{} if filepath != "" { @@ -31,6 +32,7 @@ func LoadModel(filepath string) (*Model, error) { return model, nil } +// LoadCRDs loads all CustomResourceDefinition resources from a directory (glob) func LoadCRDs(dirpath string) ([]*apiextensions.CustomResourceDefinition, error) { files, err := filepath.Glob(path.Join(dirpath, "*")) if err != nil { @@ -53,7 +55,7 @@ func LoadCRDs(dirpath string) ([]*apiextensions.CustomResourceDefinition, error) } for _, document := range fileDocuments { - crd, err := DecodeCRD(document) + crd, err := decodeCRD(document) if err != nil { return nil, err } @@ -88,7 +90,7 @@ func loadYAMLDocuments(filecontent []byte) ([][]byte, error) { return res, nil } -func DecodeCRD(content []byte) (*apiextensions.CustomResourceDefinition, error) { +func decodeCRD(content []byte) (*apiextensions.CustomResourceDefinition, error) { sch := runtime.NewScheme() _ = scheme.AddToScheme(sch) _ = apiextensions.AddToScheme(sch) diff --git a/pkg/builder/properties.go b/pkg/builder/properties.go deleted file mode 100644 index 3972134..0000000 --- a/pkg/builder/properties.go +++ /dev/null @@ -1,48 +0,0 @@ -package builder - -import ( - "sort" - - "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions" -) - -// orderedPropertyKeys returns the keys of m alphabetically ordered -// keys in required will be placed first -func orderedPropertyKeys(required []string, m map[string]apiextensions.JSONSchemaProps, isResource bool) []string { - sort.Strings(required) - - if isResource { - mkeys := make(map[string]struct{}) - for k := range m { - mkeys[k] = struct{}{} - } - for _, special := range []string{"metadata", "kind", "apiVersion"} { - if !isRequired(special, required) { - if _, ok := mkeys[special]; ok { - required = append([]string{special}, required...) - } - } - } - } - - keys := make([]string, len(m)-len(required)) - i := 0 - for k := range m { - if !isRequired(k, required) { - keys[i] = k - i++ - } - } - sort.Strings(keys) - return append(required, keys...) -} - -// isRequired returns true if k is in the required array -func isRequired(k string, required []string) bool { - for _, r := range required { - if r == k { - return true - } - } - return false -} diff --git a/pkg/builder/utils.go b/pkg/builder/utils.go deleted file mode 100644 index f379438..0000000 --- a/pkg/builder/utils.go +++ /dev/null @@ -1,31 +0,0 @@ -package builder - -import ( - "regexp" - "strings" - - "github.com/stoewer/go-strcase" -) - -// escapeName returns a name usable as file name -func escapeName(parts ...string) string { - result := []string{} - for _, s := range parts { - if s != "" { - result = append(result, strcase.KebabCase(s)) - } - } - return strings.Join(result, "-") -} - -// headingID returns the ID built by hugo for a given header -func headingID(s string) string { - result := s - result = strings.ToLower(s) - result = strings.TrimSpace(result) - result = regexp.MustCompile(`([^\w\- ]+)`).ReplaceAllString(result, "") - result = regexp.MustCompile(`(\s)`).ReplaceAllString(result, "-") - result = regexp.MustCompile(`(\-+$)`).ReplaceAllString(result, "") - - return result -}