• Home
  • Features
  • Pricing
  • Docs
  • Announcements
  • Sign In

mlange-42 / modo / 12969829563

26 Jan 2025 12:39AM CUT coverage: 60.763% (-0.8%) from 61.534%
12969829563

Pull #118

github

web-flow
Merge 1f680c59c into 3f25a97de
Pull Request #118: Allow a folder as input, to process recursively

11 of 41 new or added lines in 5 files covered. (26.83%)

3 existing lines in 3 files now uncovered.

988 of 1626 relevant lines covered (60.76%)

28.99 hits per line

Source File
Press 'n' to go to next uncovered line, 'b' for previous

48.66
/document/render.go
1
package document
2

3
import (
4
        "fmt"
5
        "io/fs"
6
        "os"
7
        "path"
8
        "path/filepath"
9
        "strings"
10
        "text/template"
11

12
        "github.com/mlange-42/modo/assets"
13
)
14

15
func Render(docs *Docs, config *Config, form Formatter, subdir string) error {
2✔
16
        t, err := loadTemplates(form, config.TemplateDirs...)
2✔
17
        if err != nil {
2✔
18
                return err
×
19
        }
×
20
        if !config.DryRun {
3✔
21
                proc := NewProcessor(docs, form, t, config)
1✔
22
                return renderWith(config, proc, subdir)
1✔
23
        }
1✔
24

25
        files := []string{}
1✔
26
        proc := NewProcessorWithWriter(docs, form, t, config, func(file, text string) error {
10✔
27
                files = append(files, file)
9✔
28
                return nil
9✔
29
        })
9✔
30
        err = renderWith(config, proc, subdir)
1✔
31
        if err != nil {
1✔
32
                return err
×
33
        }
×
34

35
        fmt.Println("Dry-run. Would write these files:")
1✔
36
        for _, f := range files {
10✔
37
                fmt.Println(f)
9✔
38
        }
9✔
39
        return nil
1✔
40
}
41

NEW
42
func ExtractTests(docs *Docs, config *Config, form Formatter, subdir string) error {
×
43
        caseSensitiveSystem = !config.CaseInsensitive
×
44
        t, err := loadTemplates(form, config.TemplateDirs...)
×
45
        if err != nil {
×
46
                return err
×
47
        }
×
48
        var proc *Processor
×
49
        if config.DryRun {
×
50
                proc = NewProcessorWithWriter(docs, form, t, config, func(file, text string) error {
×
51
                        return nil
×
52
                })
×
53
        } else {
×
54
                proc = NewProcessor(docs, form, t, config)
×
55
        }
×
NEW
56
        return proc.ExtractTests(subdir)
×
57
}
58

59
func renderWith(config *Config, proc *Processor, subdir string) error {
6✔
60
        caseSensitiveSystem = !config.CaseInsensitive
6✔
61
        if err := proc.PrepareDocs(subdir); err != nil {
6✔
62
                return err
×
63
        }
×
64
        outPath := path.Join(config.OutputDir, subdir)
6✔
65
        if err := renderPackage(proc.ExportDocs.Decl, []string{outPath}, proc); err != nil {
6✔
66
                return err
×
67
        }
×
68
        if err := proc.Formatter.WriteAuxiliary(proc.ExportDocs.Decl, outPath, proc); err != nil {
6✔
69
                return err
×
70
        }
×
71
        return nil
6✔
72
}
73

74
func renderElement(data interface {
75
        Named
76
        Kinded
77
}, proc *Processor) (string, error) {
35✔
78
        b := strings.Builder{}
35✔
79
        err := proc.Template.ExecuteTemplate(&b, data.GetKind()+".md", data)
35✔
80
        if err != nil {
35✔
81
                return "", err
×
82
        }
×
83
        return proc.Formatter.ProcessMarkdown(data, b.String(), proc)
35✔
84
}
85

86
func renderPackage(p *Package, dir []string, proc *Processor) error {
8✔
87
        newDir := appendNew(dir, p.GetFileName())
8✔
88
        pkgPath := path.Join(newDir...)
8✔
89
        if err := proc.mkDirs(pkgPath); err != nil {
8✔
90
                return err
×
91
        }
×
92

93
        for _, pkg := range p.Packages {
10✔
94
                if err := renderPackage(pkg, newDir, proc); err != nil {
2✔
95
                        return err
×
96
                }
×
97
        }
98

99
        for _, mod := range p.Modules {
16✔
100
                if err := renderModule(mod, newDir, proc); err != nil {
8✔
101
                        return err
×
102
                }
×
103
        }
104

105
        if err := renderList(p.Structs, newDir, proc); err != nil {
8✔
106
                return err
×
107
        }
×
108
        if err := renderList(p.Traits, newDir, proc); err != nil {
8✔
109
                return err
×
110
        }
×
111
        if err := renderList(p.Functions, newDir, proc); err != nil {
8✔
112
                return err
×
113
        }
×
114

115
        text, err := renderElement(p, proc)
8✔
116
        if err != nil {
8✔
117
                return err
×
118
        }
×
119
        if err := linkAndWrite(text, newDir, len(newDir), "package", proc); err != nil {
8✔
120
                return err
×
121
        }
×
122

123
        return nil
8✔
124
}
125

126
func renderModule(mod *Module, dir []string, proc *Processor) error {
8✔
127
        newDir := appendNew(dir, mod.GetFileName())
8✔
128
        if err := proc.mkDirs(path.Join(newDir...)); err != nil {
8✔
129
                return err
×
130
        }
×
131

132
        if err := renderList(mod.Structs, newDir, proc); err != nil {
8✔
133
                return err
×
134
        }
×
135
        if err := renderList(mod.Traits, newDir, proc); err != nil {
8✔
136
                return err
×
137
        }
×
138
        if err := renderList(mod.Functions, newDir, proc); err != nil {
8✔
139
                return err
×
140
        }
×
141

142
        text, err := renderElement(mod, proc)
8✔
143
        if err != nil {
8✔
144
                return err
×
145
        }
×
146
        if err := linkAndWrite(text, newDir, len(newDir), "module", proc); err != nil {
8✔
147
                return err
×
148
        }
×
149

150
        return nil
8✔
151
}
152

153
func renderList[T interface {
154
        Named
155
        Kinded
156
}](list []T, dir []string, proc *Processor) error {
48✔
157
        for _, elem := range list {
65✔
158
                newDir := appendNew(dir, elem.GetFileName())
17✔
159
                text, err := renderElement(elem, proc)
17✔
160
                if err != nil {
17✔
161
                        return err
×
162
                }
×
163
                if err := linkAndWrite(text, newDir, len(dir), elem.GetKind(), proc); err != nil {
17✔
164
                        return err
×
165
                }
×
166
        }
167
        return nil
48✔
168
}
169

170
func loadTemplates(f Formatter, additional ...string) (*template.Template, error) {
8✔
171
        allTemplates, err := findTemplatesFS()
8✔
172
        if err != nil {
8✔
173
                return nil, err
×
174
        }
×
175
        templ := template.New("all")
8✔
176
        templ = templ.Funcs(template.FuncMap{
8✔
177
                "toLink": f.ToLinkPath,
8✔
178
        })
8✔
179
        templ, err = templ.ParseFS(assets.Templates, allTemplates...)
8✔
180
        if err != nil {
8✔
181
                return nil, err
×
182
        }
×
183

184
        for _, dir := range additional {
8✔
185
                if dir == "" {
×
186
                        continue
×
187
                }
188
                moreTemplates, err := findTemplates(dir)
×
189
                if err != nil {
×
190
                        return nil, err
×
191
                }
×
192
                templ, err = templ.ParseFiles(moreTemplates...)
×
193
                if err != nil {
×
194
                        return nil, err
×
195
                }
×
196
        }
197
        return templ, nil
8✔
198
}
199

200
func findTemplatesFS() ([]string, error) {
8✔
201
        allTemplates := []string{}
8✔
202
        err := fs.WalkDir(assets.Templates, ".",
8✔
203
                func(path string, info os.DirEntry, err error) error {
264✔
204
                        if err != nil {
256✔
205
                                return err
×
206
                        }
×
207
                        if !info.IsDir() {
472✔
208
                                allTemplates = append(allTemplates, path)
216✔
209
                        }
216✔
210
                        return nil
256✔
211
                })
212
        if err != nil {
8✔
213
                return nil, err
×
214
        }
×
215
        return allTemplates, nil
8✔
216
}
217

218
func findTemplates(dir string) ([]string, error) {
×
219
        allTemplates := []string{}
×
220
        err := filepath.WalkDir(dir,
×
221
                func(path string, info os.DirEntry, err error) error {
×
222
                        if err != nil {
×
223
                                return err
×
224
                        }
×
225
                        if !info.IsDir() {
×
226
                                allTemplates = append(allTemplates, path)
×
227
                        }
×
228
                        return nil
×
229
                })
230
        if err != nil {
×
231
                return nil, err
×
232
        }
×
233
        return allTemplates, nil
×
234
}
235

236
func linkAndWrite(text string, dir []string, modElems int, kind string, proc *Processor) error {
33✔
237
        text, err := proc.ReplacePlaceholders(text, dir[1:], modElems-1)
33✔
238
        if err != nil {
33✔
239
                return err
×
240
        }
×
241
        outFile, err := proc.Formatter.ToFilePath(path.Join(dir...), kind)
33✔
242
        if err != nil {
33✔
243
                return err
×
244
        }
×
245
        return proc.WriteFile(outFile, text)
33✔
246
}
STATUS · Troubleshooting · Open an Issue · Sales · Support · CAREERS · ENTERPRISE · START FREE · SCHEDULE DEMO
ANNOUNCEMENTS · TWITTER · TOS & SLA · Supported CI Services · What's a CI service? · Automated Testing

© 2025 Coveralls, Inc