diff --git a/modulegen/_template/docs_example.md.tmpl b/modulegen/_template/example.md.tmpl similarity index 93% rename from modulegen/_template/docs_example.md.tmpl rename to modulegen/_template/example.md.tmpl index 0d774dfa21..c25ae1fe03 100644 --- a/modulegen/_template/docs_example.md.tmpl +++ b/modulegen/_template/example.md.tmpl @@ -16,13 +16,13 @@ go get github.com/testcontainers/testcontainers-go/{{ ParentDir }}/{{ $lower }} ## Usage example -{{ codeinclude "" }} + [Creating a {{ $title }} container](../../{{ ParentDir }}/{{ $lower }}/{{ $lower }}.go) -{{ codeinclude "" }} + -{{ codeinclude "" }} + [Test for a {{ $title }} container](../../{{ ParentDir }}/{{ $lower }}/{{ $lower }}_test.go) -{{ codeinclude "" }} + ## Module reference diff --git a/modulegen/internal/mkdocs/template.go b/modulegen/internal/mkdocs/template.go new file mode 100644 index 0000000000..cb83f239ca --- /dev/null +++ b/modulegen/internal/mkdocs/template.go @@ -0,0 +1,17 @@ +package mkdocs + +import ( + "path/filepath" + "text/template" + + internal_template "github.com/testcontainers/testcontainers-go/modulegen/internal/template" +) + +func GenerateMdFile(filePath string, funcMap template.FuncMap, example any) error { + name := "example.md.tmpl" + t, err := template.New(name).Funcs(funcMap).ParseFiles(filepath.Join("_template", name)) + if err != nil { + return err + } + return internal_template.Generate(t, filePath, name, example) +} diff --git a/modulegen/main.go b/modulegen/main.go index a31c281603..63a9536367 100644 --- a/modulegen/main.go +++ b/modulegen/main.go @@ -3,10 +3,8 @@ package main import ( "flag" "fmt" - "html/template" "os" "path/filepath" - "strings" "github.com/testcontainers/testcontainers-go/modulegen/internal/tools" ) @@ -18,8 +16,6 @@ var ( imageVar string ) -var templates = []string{"docs_example.md"} - func init() { flag.StringVar(&nameVar, "name", "", "Name of the example. Only alphabetical characters are allowed.") flag.StringVar(&nameTitleVar, "title", "", "(Optional) Title of the example name, used to override the name in the case of mixed casing (Mongodb -> MongoDB). Use camel-case when needed. Only alphabetical characters are allowed.") @@ -41,14 +37,12 @@ func main() { } } - currentDir, err := filepath.Abs(filepath.Dir(".")) + ctx, err := getRootContext() if err != nil { fmt.Printf(">> could not get the root dir: %v\n", err) os.Exit(1) } - ctx := NewContext(filepath.Dir(currentDir)) - example := Example{ Image: imageVar, IsModule: asModuleVar, @@ -83,70 +77,8 @@ func generate(example Example, ctx *Context) error { if err := example.Validate(); err != nil { return err } - - outputDir := filepath.Join(ctx.RootDir, example.ParentDir()) - docsOuputDir := filepath.Join(ctx.DocsDir(), example.ParentDir()) - - funcMap := template.FuncMap{ - "Entrypoint": func() string { return example.Entrypoint() }, - "ContainerName": func() string { return example.ContainerName() }, - "ExampleType": func() string { return example.Type() }, - "ParentDir": func() string { return example.ParentDir() }, - "ToLower": func() string { return example.Lower() }, - "Title": func() string { return example.Title() }, - "codeinclude": func(s string) template.HTML { return template.HTML(s) }, // escape HTML comments for codeinclude - } - - exampleLower := example.Lower() - - // create the example dir - err := os.MkdirAll(filepath.Join(outputDir, exampleLower), 0o700) - if err != nil { - return err - } - - for _, tmpl := range templates { - name := tmpl + ".tmpl" - t, err := template.New(name).Funcs(funcMap).ParseFiles(filepath.Join("_template", name)) - if err != nil { - return err - } - - // initialize the data using the example struct, which is the default data to be used while - // doing the interpolation of the data and the template - var data any - - syncDataFn := func() any { - return example - } - - // create a new file - var exampleFilePath string - - if strings.EqualFold(tmpl, "docs_example.md") { - // docs example file will go into the docs directory - exampleFilePath = filepath.Join(docsOuputDir, exampleLower+".md") - } else { - exampleFilePath = filepath.Join(outputDir, exampleLower, strings.ReplaceAll(tmpl, "example", exampleLower)) - } - - err = os.MkdirAll(filepath.Dir(exampleFilePath), 0o777) - if err != nil { - return err - } - - exampleFile, _ := os.Create(exampleFilePath) - defer exampleFile.Close() - - data = syncDataFn() - - err = t.ExecuteTemplate(exampleFile, name, data) - if err != nil { - return err - } - } // creates Makefile for example - err = generateMakefile(ctx, example) + err := generateMakefile(ctx, example) if err != nil { return err } diff --git a/modulegen/mkdocs.go b/modulegen/mkdocs.go index f96e983b0c..cc94a8b626 100644 --- a/modulegen/mkdocs.go +++ b/modulegen/mkdocs.go @@ -1,11 +1,26 @@ package main import ( + "path/filepath" + "text/template" + "github.com/testcontainers/testcontainers-go/modulegen/internal/mkdocs" ) // update examples in mkdocs func generateMkdocs(ctx *Context, example Example) error { + exampleMdFile := filepath.Join(ctx.DocsDir(), example.ParentDir(), example.Lower()+".md") + funcMap := template.FuncMap{ + "Entrypoint": func() string { return example.Entrypoint() }, + "ContainerName": func() string { return example.ContainerName() }, + "ParentDir": func() string { return example.ParentDir() }, + "ToLower": func() string { return example.Lower() }, + "Title": func() string { return example.Title() }, + } + err := mkdocs.GenerateMdFile(exampleMdFile, funcMap, example) + if err != nil { + return err + } exampleMd := example.ParentDir() + "/" + example.Lower() + ".md" indexMd := example.ParentDir() + "/index.md" return mkdocs.UpdateConfig(ctx.MkdocsConfigFile(), example.IsModule, exampleMd, indexMd)