Skip to content

Commit

Permalink
modulegen: generate md file inside internal/mkdocs (testcontainers#1543)
Browse files Browse the repository at this point in the history
Signed-off-by: Matthieu MOREL <[email protected]>
  • Loading branch information
mmorel-35 authored Aug 29, 2023
1 parent 987c6d0 commit 84962a2
Show file tree
Hide file tree
Showing 4 changed files with 38 additions and 74 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -16,13 +16,13 @@ go get github.com/testcontainers/testcontainers-go/{{ ParentDir }}/{{ $lower }}

## Usage example

{{ codeinclude "<!--codeinclude-->" }}
<!--codeinclude-->
[Creating a {{ $title }} container](../../{{ ParentDir }}/{{ $lower }}/{{ $lower }}.go)
{{ codeinclude "<!--/codeinclude-->" }}
<!--/codeinclude-->

{{ codeinclude "<!--codeinclude-->" }}
<!--codeinclude-->
[Test for a {{ $title }} container](../../{{ ParentDir }}/{{ $lower }}/{{ $lower }}_test.go)
{{ codeinclude "<!--/codeinclude-->" }}
<!--/codeinclude-->

## Module reference

Expand Down
17 changes: 17 additions & 0 deletions modulegen/internal/mkdocs/template.go
Original file line number Diff line number Diff line change
@@ -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)
}
72 changes: 2 additions & 70 deletions modulegen/main.go
Original file line number Diff line number Diff line change
Expand Up @@ -3,10 +3,8 @@ package main
import (
"flag"
"fmt"
"html/template"
"os"
"path/filepath"
"strings"

"github.com/testcontainers/testcontainers-go/modulegen/internal/tools"
)
Expand All @@ -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.")
Expand All @@ -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,
Expand Down Expand Up @@ -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
}
Expand Down
15 changes: 15 additions & 0 deletions modulegen/mkdocs.go
Original file line number Diff line number Diff line change
@@ -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)
Expand Down

0 comments on commit 84962a2

Please sign in to comment.