This is an automated email from the ASF dual-hosted git repository. djencks pushed a commit to branch main in repository https://gitbox.apache.org/repos/asf/camel-kamelets.git
commit 46819c114c00a34ce2af19653217dd734ed6ca82 Author: David Jencks <djen...@apache.org> AuthorDate: Tue Dec 21 13:48:32 2021 -0800 simplify generator to only generate nav file. Still much too complicated --- script/generator/README.md | 4 +- script/generator/generator.go | 355 +----------------------------------------- 2 files changed, 5 insertions(+), 354 deletions(-) diff --git a/script/generator/README.md b/script/generator/README.md index a4f3fa8..61853fd 100644 --- a/script/generator/README.md +++ b/script/generator/README.md @@ -1,6 +1,6 @@ -# Website Generator +# Website nav file Generator -To generate the adoc and svg files for the website (you need `go`): +To generate the nav file for the website (you need `go`): ``` # From the script/generator directory diff --git a/script/generator/generator.go b/script/generator/generator.go index 8cb80d3..b594172 100644 --- a/script/generator/generator.go +++ b/script/generator/generator.go @@ -1,20 +1,14 @@ package main import ( - "bytes" - "encoding/base64" - "errors" "fmt" "io/ioutil" "os" - "path" "path/filepath" "sort" "strings" - "text/template" camel "github.com/apache/camel-k/pkg/apis/camel/v1alpha1" - "github.com/iancoleman/strcase" "k8s.io/apimachinery/pkg/runtime" "k8s.io/apimachinery/pkg/runtime/schema" "k8s.io/apimachinery/pkg/runtime/serializer" @@ -30,307 +24,18 @@ func main() { projectBaseDir := os.Args[1] docBaseDir := os.Args[2] - funcMap := template.FuncMap{ - "ToCamel": strcase.ToCamel, - } - - templateFile := path.Join(docBaseDir, "kamelet.adoc.tmpl") - kameletBindingFile := path.Join(docBaseDir, "kamelet-binding-sink-source.tmpl") - propertiesListFile := path.Join(docBaseDir, "properties-list.tmpl") - - - - docTemplate, err := template.New("kamelet.adoc.tmpl").Funcs(funcMap).ParseFiles(templateFile, kameletBindingFile, propertiesListFile) - handleGeneralError(fmt.Sprintf("cannot load template file from %s", templateFile), err) - - camelKYamlBindingsBaseDir := filepath.Join(projectBaseDir, "../templates", "bindings", "camel-k") - yamlTemplateFile := path.Join(camelKYamlBindingsBaseDir, "kamelet.yaml.tmpl") - - yamlTemplate, err := template.New("kamelet.yaml.tmpl").Funcs(funcMap).ParseFiles(yamlTemplateFile, kameletBindingFile, propertiesListFile) - handleGeneralError(fmt.Sprintf("cannot load template file from %s", templateFile), err) - - coreYamlBindingsBaseDir := filepath.Join(projectBaseDir, "../templates", "bindings", "core") - coreYamlTemplateFile := path.Join(coreYamlBindingsBaseDir, "kamelet-core-binding.yaml.tmpl") - parameterListFile := path.Join(coreYamlBindingsBaseDir, "parameter-list.tmpl") - - coreYamlTemplate, err := template.New("kamelet-core-binding.yaml.tmpl").Funcs(funcMap).ParseFiles(coreYamlTemplateFile, kameletBindingFile, parameterListFile) - handleGeneralError(fmt.Sprintf("cannot load template file from %s", templateFile), err) - kamelets := listKamelets(projectBaseDir) links := make([]string, 0) for _, k := range kamelets { - img := saveImage(k, docBaseDir) - - ctx := NewTemplateContext(k, img) - - processDocTemplate(k, docBaseDir, err, docTemplate, &ctx) - links = updateImageLink(k, img, links) - - processYamlTemplate(k, projectBaseDir, err, yamlTemplate, &ctx) - processCoreYamlTemplate(k, projectBaseDir, err, coreYamlTemplate, &ctx) - + links = updateImageLink(k, links) } saveNav(links, docBaseDir) } -func processDocTemplate(k camel.Kamelet, baseDir string, err error, docTemplate *template.Template, ctx *TemplateContext) { - buffer := new(bytes.Buffer) - err = docTemplate.Execute(buffer, &ctx) - handleGeneralError("cannot process documentation template", err) - - produceDocFile(k, baseDir, buffer.String()) -} - -func processYamlTemplate(k camel.Kamelet, baseDir string, err error, yamlTemplate *template.Template, ctx *TemplateContext) { - buffer := new(bytes.Buffer) - err = yamlTemplate.Execute(buffer, ctx) - handleGeneralError("cannot process yaml binding template", err) - - produceBindingFile(k, baseDir, "camel-k", buffer.String()) -} - -func processCoreYamlTemplate(k camel.Kamelet, baseDir string, err error, yamlTemplate *template.Template, ctx *TemplateContext) { - buffer := new(bytes.Buffer) - err = yamlTemplate.Execute(buffer, ctx) - handleGeneralError("cannot process yaml binding template", err) - - produceBindingFile(k, baseDir, "core", buffer.String()) -} - -func updateImageLink(k camel.Kamelet, img string, links []string) []string { - return append(links, fmt.Sprintf("* xref:ROOT:%s.adoc[%s %s]", k.Name, img, k.Spec.Definition.Title)) -} - -type TemplateContext struct { - Kamelet camel.Kamelet - Image string - TemplateProperties map[string]string -} - -func NewTemplateContext(kamelet camel.Kamelet, image string) TemplateContext { - return TemplateContext{ - Kamelet: kamelet, - Image: image, - TemplateProperties: map[string]string{}, - } -} - -type Prop struct { - Name string - Title string - Required bool - Default *string - Example *string -} - -func (p Prop) GetSampleValue() string { - if p.Default != nil { - return *p.Default - } - if p.Example != nil { - return *p.Example - } - return fmt.Sprintf(`"The %s"`, p.Title) -} - -func getSortedProps(k camel.Kamelet) []Prop { - required := make(map[string]bool) - props := make([]Prop, 0, len(k.Spec.Definition.Properties)) - for _, r := range k.Spec.Definition.Required { - required[r] = true - } - for key := range k.Spec.Definition.Properties { - prop := k.Spec.Definition.Properties[key] - var def *string - if prop.Default != nil { - b, err := prop.Default.MarshalJSON() - handleGeneralError(fmt.Sprintf("cannot marshal property %q default value in Kamelet %s", key, k.Name), err) - defVal := string(b) - def = &defVal - } - var ex *string - if prop.Example != nil { - b, err := prop.Example.MarshalJSON() - handleGeneralError(fmt.Sprintf("cannot marshal property %q example value in Kamelet %s", key, k.Name), err) - exVal := string(b) - ex = &exVal - } - props = append(props, Prop{Name: key, Title: prop.Title, Required: required[key], Default: def, Example: ex}) - } - sort.Slice(props, func(i, j int) bool { - ri := props[i].Required - rj := props[j].Required - if ri && !rj { - return true - } else if !ri && rj { - return false - } - return props[i].Name < props[j].Name - }) - return props -} - -func (ctx *TemplateContext) HasProperties() bool { - return len(ctx.Kamelet.Spec.Definition.Properties) > 0 -} - -func (ctx *TemplateContext) HasRequiredProperties() bool { - propDefs := getSortedProps(ctx.Kamelet) - - for _, propDef := range propDefs { - if propDef.Required { - return true - } - } - - return false -} - -func (ctx *TemplateContext) PropertyList() string { - propDefs := getSortedProps(ctx.Kamelet) - - sampleConfig := make([]string, 0) - for _, propDef := range propDefs { - if !propDef.Required { - continue - } - key := propDef.Name - if propDef.Default == nil { - ex := propDef.GetSampleValue() - sampleConfig = append(sampleConfig, fmt.Sprintf("%s: %s", key, ex)) - } - } - - /* - Creates the properties list in the YAML format. - */ - props := "" - if len(sampleConfig) > 0 { - props = fmt.Sprintf("\n %s:\n %s", "properties", strings.Join(sampleConfig, "\n ")) - } - - return props -} - -func (ctx *TemplateContext) ParameterList() string { - tp := ctx.Kamelet.ObjectMeta.Labels["camel.apache.org/kamelet.type"] - propDefs := getSortedProps(ctx.Kamelet) - - sampleConfig := make([]string, 0) - for _, propDef := range propDefs { - if !propDef.Required { - continue - } - key := propDef.Name - if propDef.Default == nil { - ex := propDef.GetSampleValue() - sampleConfig = append(sampleConfig, fmt.Sprintf("%s: %s", key, ex)) - } - } - - props := "" - - if len(sampleConfig) > 0 { - paddingSpace := "" - switch tp { - case "sink": - props = fmt.Sprintf("\n%10s%s:\n%12s%s", "", "parameters", - "", strings.Join(sampleConfig, fmt.Sprintf("\n%12s", ""))) - case "source": - props = fmt.Sprintf("\n%6s%s:\n%8s%s", "", "parameters", - "", strings.Join(sampleConfig, fmt.Sprintf("\n%8s", ""))) - case "action": - props = fmt.Sprintf("\n%10s%s:\n%12s%s", paddingSpace, "parameters", - "", strings.Join(sampleConfig, fmt.Sprintf("\n%8s", ""))) - } - } - - return props -} - -func (ctx *TemplateContext) SetVal(key, val string) string { - ctx.TemplateProperties[key] = val - return "" -} - -func (ctx *TemplateContext) GetVal(key string) string { - return ctx.TemplateProperties[key] -} - -func (ctx *TemplateContext) Properties() string { - content := "" - if len(ctx.Kamelet.Spec.Definition.Properties) > 0 { - props := getSortedProps(ctx.Kamelet) - content += `[width="100%",cols="2,^2,3,^2,^2,^3",options="header"]` + "\n" - content += "|===\n" - content += tableLine("Property", "Name", "Description", "Type", "Default", "Example") - - for _, propDef := range props { - key := propDef.Name - prop := ctx.Kamelet.Spec.Definition.Properties[key] - name := key - if propDef.Required { - name = "*" + name + " {empty}* *" - } - var def string - if propDef.Default != nil { - def = "`" + strings.ReplaceAll(*propDef.Default, "`", "'") + "`" - } - var ex string - if propDef.Example != nil { - ex = "`" + strings.ReplaceAll(*propDef.Example, "`", "'") + "`" - } - content += tableLine(name, prop.Title, prop.Description, prop.Type, def, ex) - } - - content += "|===\n" - - } - return content -} - -func (ctx *TemplateContext) ExampleKamelBindCommand(ref string) string { - tp := ctx.Kamelet.ObjectMeta.Labels["camel.apache.org/kamelet.type"] - var prefix string - switch tp { - case "source": - prefix = "source." - case "sink": - prefix = "sink." - case "action": - prefix = "step-0." - default: - handleGeneralError("unknown kamelet type", errors.New(tp)) - } - - cmd := "kamel bind " - timer := "timer-source?message=Hello" - kamelet := ctx.Kamelet.Name - propDefs := getSortedProps(ctx.Kamelet) - for _, p := range propDefs { - if p.Required && p.Default == nil { - val := p.GetSampleValue() - if strings.HasPrefix(val, `"`) { - kamelet += fmt.Sprintf(` -p "%s%s=%s`, prefix, p.Name, val[1:]) - } else { - kamelet += fmt.Sprintf(" -p %s%s=%s", prefix, p.Name, val) - } - } - } - - switch tp { - case "source": - return cmd + kamelet + " " + ref - case "sink": - return cmd + ref + " " + kamelet - case "action": - return cmd + timer + " --step " + kamelet + " " + ref - default: - handleGeneralError("unknown kamelet type", errors.New(tp)) - } - return "" +func updateImageLink(k camel.Kamelet, links []string) []string { + return append(links, fmt.Sprintf("* xref:%s.adoc[]", k.Name)) } func saveNav(links []string, out string) { @@ -349,60 +54,6 @@ func saveNav(links []string, out string) { fmt.Printf("%q written\n", dest) } -func saveImage(k camel.Kamelet, out string) string { - if ic, ok := k.ObjectMeta.Annotations["camel.apache.org/kamelet.icon"]; ok { - svgb64Prefix := "data:image/svg+xml;base64," - if strings.HasPrefix(ic, svgb64Prefix) { - data := ic[len(svgb64Prefix):] - decoder := base64.NewDecoder(base64.StdEncoding, strings.NewReader(data)) - iconContent, err := ioutil.ReadAll(decoder) - handleGeneralError(fmt.Sprintf("cannot decode icon from Kamelet %s", k.Name), err) - dest := filepath.Join(out, "assets", "images", "kamelets", fmt.Sprintf("%s.svg", k.Name)) - if _, err := os.Stat(dest); err == nil { - err = os.Remove(dest) - handleGeneralError(fmt.Sprintf("cannot remove file %q", dest), err) - } - err = ioutil.WriteFile(dest, iconContent, 0666) - handleGeneralError(fmt.Sprintf("cannot write file %q", dest), err) - fmt.Printf("%q written\n", dest) - return fmt.Sprintf("image:kamelets/%s.svg[]", k.Name) - } - } - return "" -} - -func produceDocFile(k camel.Kamelet, baseDir string, content string) { - outputDir := filepath.Join(baseDir, "pages") - - produceOutputFile(k, outputDir, content,".adoc") -} - -func produceBindingFile(k camel.Kamelet, baseDir string, projectName string, content string) { - camelKOutputDir := filepath.Join(baseDir, "../templates", "bindings", projectName) - - produceOutputFile(k, camelKOutputDir, content,"-binding.yaml") -} - -func produceOutputFile(k camel.Kamelet, outputDir string, content string, extension string) { - outputFile := filepath.Join(outputDir, k.Name + extension) - if _, err := os.Stat(outputFile); err == nil { - err = os.Remove(outputFile) - handleGeneralError(fmt.Sprintf("cannot remove file %q", outputFile), err) - } - err := ioutil.WriteFile(outputFile, []byte(content), 0666) - handleGeneralError(fmt.Sprintf("cannot write to file %q", outputFile), err) - fmt.Printf("%q written\n", outputFile) -} - -func tableLine(val ...string) string { - res := "" - for _, s := range val { - clean := strings.ReplaceAll(s, "|", "\\|") - res += "| " + clean - } - return res + "\n" -} - func listKamelets(dir string) []camel.Kamelet { scheme := runtime.NewScheme() err := camel.AddToScheme(scheme)