You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@camel.apache.org by dj...@apache.org on 2021/12/23 22:51:43 UTC

[camel-kamelets] 03/08: simplify generator to only generate nav file. Still much too complicated

This is an automated email from the ASF dual-hosted git repository.

djencks pushed a commit to branch 0.6.x
in repository https://gitbox.apache.org/repos/asf/camel-kamelets.git

commit 7cb109024ed4b27b6eac1cd17f6ff9a566d13b50
Author: David Jencks <dj...@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)