Skip to content

Commit

Permalink
reduced number of files
Browse files Browse the repository at this point in the history
Signed-off-by: roee88 <roee88@gmail.com>
  • Loading branch information
roee88 committed Dec 30, 2020
1 parent a1f2d64 commit 62d6617
Show file tree
Hide file tree
Showing 6 changed files with 65 additions and 111 deletions.
2 changes: 1 addition & 1 deletion go.mod
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
2 changes: 0 additions & 2 deletions go.sum
Original file line number Diff line number Diff line change
Expand Up @@ -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=
Expand Down
87 changes: 60 additions & 27 deletions pkg/builder/builder.go
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,8 @@ import (
"fmt"
"os"
"path"
"regexp"
"sort"
"strings"
"text/template"

Expand All @@ -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)
Expand All @@ -32,15 +35,14 @@ 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 {
group := crd.Spec.Group
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 {
Expand All @@ -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)
Expand All @@ -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
Expand Down Expand Up @@ -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)

Expand Down Expand Up @@ -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
}
Expand All @@ -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
}
6 changes: 4 additions & 2 deletions pkg/builder/loader.go
Original file line number Diff line number Diff line change
Expand Up @@ -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 != "" {
Expand All @@ -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 {
Expand All @@ -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
}
Expand Down Expand Up @@ -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)
Expand Down
48 changes: 0 additions & 48 deletions pkg/builder/properties.go

This file was deleted.

31 changes: 0 additions & 31 deletions pkg/builder/utils.go

This file was deleted.

0 comments on commit 62d6617

Please sign in to comment.