Skip to content

Commit b6dcd1d

Browse files
authored
Merge pull request #2 from marcomilon/refactoring-try-again
Adding more tests
2 parents e77db2f + facf536 commit b6dcd1d

File tree

10 files changed

+163
-79
lines changed

10 files changed

+163
-79
lines changed

go.mod

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,4 +2,7 @@ module github.com/marcomilon/gstatic
22

33
go 1.14
44

5-
require gopkg.in/yaml.v2 v2.2.8
5+
require (
6+
golang.org/x/sync v0.4.0
7+
gopkg.in/yaml.v2 v2.4.0
8+
)

go.sum

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,6 @@
1+
golang.org/x/sync v0.4.0 h1:zxkM55ReGkDlKSM+Fu41A+zmbZuaPVbGMzvvdUPznYQ=
2+
golang.org/x/sync v0.4.0/go.mod h1:FU7BRWz2tNW+3quACPkgCx/L+uEAv1htQ0V83Z9Rj+Y=
3+
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405 h1:yhCVgyC4o1eVCa2tZl7eS0r+SDo693bJlVdllGtEeKM=
14
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
2-
gopkg.in/yaml.v2 v2.2.8 h1:obN1ZagJSUGI0Ek/LBmuj4SNLPfIny3KsKFopxRdj10=
3-
gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
5+
gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY=
6+
gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ=

internal/gstatic/executor.go

Lines changed: 0 additions & 42 deletions
This file was deleted.

internal/gstatic/extractor.go

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,6 @@ import (
66
"gopkg.in/yaml.v2"
77
)
88

9-
// getVarsForTpl is a implementation for VarReader. This implementatin will get variables from a Yaml file
109
func getVarsForTpl(r io.Reader) (map[interface{}]interface{}, error) {
1110

1211
data, err := io.ReadAll(r)

internal/gstatic/generator.go

Lines changed: 52 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,8 @@ import (
66
"path/filepath"
77
"strings"
88
"sync"
9+
10+
"golang.org/x/sync/errgroup"
911
)
1012

1113
type generator struct {
@@ -19,26 +21,24 @@ type task struct {
1921
targetPath string
2022
}
2123

22-
type copyFileWorker task
23-
type layoutRenderWorker task
24-
type simpleRenderWorker task
25-
26-
func (copyFileWorker copyFileWorker) execute() error {
27-
targetAssetname := getTargetDirname(copyFileWorker.generator.sourcePath, copyFileWorker.targetPath)
28-
targetFile := filepath.Join(copyFileWorker.generator.targetPath, targetAssetname)
24+
func copyFileWorker(t task) error {
25+
targetAssetname := getTargetDirname(t.generator.sourcePath, t.targetPath)
26+
targetFile := filepath.Join(t.generator.targetPath, targetAssetname)
2927

30-
return copyFile(copyFileWorker.targetPath, targetFile)
28+
return copyFile(t.targetPath, targetFile)
3129
}
3230

33-
func (layoutRenderWorker layoutRenderWorker) execute() error {
34-
targetAssetname := getTargetDirname(layoutRenderWorker.generator.sourcePath, layoutRenderWorker.targetPath)
35-
targetFile := filepath.Join(layoutRenderWorker.generator.targetPath, targetAssetname)
36-
tpl := gstaticLayoutTpl{layoutRenderWorker.generator.layoutPath, layoutRenderWorker.targetPath, targetFile}
31+
func layoutRenderWorker(t task) error {
32+
targetAssetname := getTargetDirname(t.generator.sourcePath, t.targetPath)
33+
targetFile := filepath.Join(t.generator.targetPath, targetAssetname)
34+
tpl := gstaticLayoutTpl{t.generator.layoutPath, t.targetPath, targetFile}
3735
return tpl.render()
3836
}
3937

40-
func (simpleRenderWorker simpleRenderWorker) execute() error {
41-
tpl := gstaticSimpleTpl{simpleRenderWorker.generator.sourcePath, simpleRenderWorker.generator.targetPath}
38+
func simpleRenderWorker(t task) error {
39+
targetAssetname := getTargetDirname(t.generator.sourcePath, t.targetPath)
40+
targetFile := filepath.Join(t.generator.targetPath, targetAssetname)
41+
tpl := gstaticSimpleTpl{t.targetPath, targetFile}
4242
return tpl.render()
4343
}
4444

@@ -61,31 +61,37 @@ func findLayout(sourcePath string) (string, error) {
6161
func Generate(srcFolder string, targetFolder string) error {
6262

6363
var wg sync.WaitGroup
64+
eg := errgroup.Group{}
6465

6566
layoutFile, err := findLayout(srcFolder)
6667
if err != nil {
67-
return fmt.Errorf("[%s] %v", "generate", err)
68+
return fmt.Errorf("%v", err)
6869
}
6970

7071
generator := generator{layoutFile, srcFolder, targetFolder}
7172

72-
resolver := resolver(generator, &wg)
73+
resolver := resolver(generator, &wg, &eg)
7374

7475
err = filepath.Walk(srcFolder, resolver)
7576
wg.Wait()
7677

78+
errGroup := eg.Wait()
79+
if errGroup != nil {
80+
return errGroup
81+
}
82+
7783
return err
7884

7985
}
8086

81-
func resolver(generator generator, wg *sync.WaitGroup) filepath.WalkFunc {
87+
func resolver(generator generator, wg *sync.WaitGroup, eg *errgroup.Group) filepath.WalkFunc {
8288

8389
useLayout := generator.layoutPath != ""
8490

8591
return func(path string, info os.FileInfo, err error) error {
8692

8793
if err != nil {
88-
return fmt.Errorf("[%s] %v", "resolver", err)
94+
return fmt.Errorf("%v", err)
8995
}
9096

9197
if path == generator.layoutPath {
@@ -114,37 +120,45 @@ func resolver(generator generator, wg *sync.WaitGroup) filepath.WalkFunc {
114120
return nil
115121
}
116122

123+
task := task{generator, path}
124+
117125
if ext == ".html" {
118126

119-
if useLayout {
127+
if isTplPlainHtml(path) {
120128

129+
wg.Add(1)
121130
go func() {
122131
defer wg.Done()
123-
wg.Add(1)
124-
identifier := fmt.Sprintf("layoutRenderWorker: %s", path)
125-
executor(identifier, layoutRenderWorker{generator, path}, false)
132+
copyFileWorker(task)
126133
}()
127134

128135
return nil
129136

130137
}
131138

132-
go func() {
133-
defer wg.Done()
139+
if useLayout {
134140
wg.Add(1)
135-
identifier := fmt.Sprintf("simpleRenderWorker: %s", path)
136-
executor(identifier, simpleRenderWorker{generator, path}, false)
137-
}()
141+
go func() {
142+
defer wg.Done()
143+
layoutRenderWorker(task)
144+
}()
145+
146+
return nil
147+
148+
}
149+
150+
eg.Go(func() error {
151+
return simpleRenderWorker(task)
152+
})
138153

139154
return nil
140155

141156
}
142157

158+
wg.Add(1)
143159
go func() {
144160
defer wg.Done()
145-
wg.Add(1)
146-
identifier := fmt.Sprintf("copyFileWorker: %s", path)
147-
executor(identifier, copyFileWorker{generator, path}, false)
161+
copyFileWorker(task)
148162
}()
149163

150164
return nil
@@ -153,6 +167,14 @@ func resolver(generator generator, wg *sync.WaitGroup) filepath.WalkFunc {
153167

154168
}
155169

170+
func isTplPlainHtml(sourceFile string) bool {
171+
s := strings.Replace(sourceFile, ".html", "", 1)
172+
sourceFile = s + ".yaml"
173+
_, err := os.Stat(sourceFile)
174+
return os.IsNotExist(err)
175+
176+
}
177+
156178
func getTargetDirname(srcFolder, path string) string {
157179
s := strings.Replace(path, srcFolder, "", 1)
158180
return strings.TrimLeft(s, "/")

internal/gstatic/generator_test.go

Lines changed: 77 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,64 @@
11
package gstatic
22

3-
import "testing"
3+
import (
4+
"io"
5+
"log"
6+
"os"
7+
"path/filepath"
8+
"testing"
9+
)
10+
11+
var generatorTestTargetFolder string = os.TempDir() + "gstatictest"
12+
13+
func TestGenerateSimple(t *testing.T) {
14+
15+
generatorTemplateTest(t)
16+
17+
sourcePath := "testdata/simpletpl"
18+
targetPath := generatorTestTargetFolder
19+
20+
err := Generate(sourcePath, targetPath)
21+
if err != nil {
22+
t.Errorf("expected %v; got %v", nil, err)
23+
}
24+
25+
targetFile := filepath.Join(generatorTestTargetFolder, "about.html")
26+
_, err = os.Stat(targetFile)
27+
if err != nil {
28+
t.Errorf("expected %v; got %v", nil, err)
29+
}
30+
31+
}
32+
33+
func TestGenerateLayout(t *testing.T) {
34+
35+
generatorTemplateTest(t)
36+
37+
sourcePath := "testdata/layouttpl"
38+
targetPath := generatorTestTargetFolder
39+
40+
err := Generate(sourcePath, targetPath)
41+
if err != nil {
42+
t.Errorf("expected %v; got %v", nil, err)
43+
}
44+
45+
}
46+
47+
func TestIsTplPlainHtml(t *testing.T) {
48+
49+
sourceFile := "testdata/simpletpl/index.html"
50+
hasSource := isTplPlainHtml(sourceFile)
51+
if hasSource {
52+
t.Errorf("expected %v; got %v", false, hasSource)
53+
}
54+
55+
sourceFile2 := "testdata/simpletpl/about.html"
56+
hasSource2 := isTplPlainHtml(sourceFile2)
57+
if !hasSource2 {
58+
t.Errorf("expected %v; got %v", true, hasSource)
59+
}
60+
61+
}
462

563
func TestFindLayout(t *testing.T) {
664

@@ -31,3 +89,21 @@ func TestFindLayout(t *testing.T) {
3189
}
3290

3391
}
92+
93+
func generatorTemplateTest(t *testing.T) {
94+
log.SetOutput(io.Discard)
95+
files, err := filepath.Glob(filepath.Join(generatorTestTargetFolder, "*"))
96+
if err != nil {
97+
t.Fatal("Unable to setup test")
98+
}
99+
for _, file := range files {
100+
err = os.RemoveAll(file)
101+
if err != nil {
102+
t.Fatal("Unable to setup test")
103+
}
104+
}
105+
106+
os.Remove(generatorTestTargetFolder)
107+
108+
os.MkdirAll(generatorTestTargetFolder, 0755)
109+
}
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
<p>About</p>
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
.red {
2+
color: red;
3+
}
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
<p>About</p>

main.go

Lines changed: 20 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,10 +4,17 @@ import (
44
"flag"
55
"fmt"
66
"os"
7+
"time"
78

89
"github.com/marcomilon/gstatic/internal/gstatic"
910
)
1011

12+
type elapsedTime struct {
13+
identifier string
14+
start time.Time
15+
end time.Time
16+
}
17+
1118
func main() {
1219

1320
if len(os.Args) < 3 {
@@ -18,13 +25,24 @@ func main() {
1825
srcFolder := argsWithoutProg[0]
1926
targetFolder := argsWithoutProg[1]
2027

21-
elapsedTime := gstatic.StartTimer("gstatic")
28+
elapsedTime := startTimer("gstatic")
2229
err := gstatic.Generate(srcFolder, targetFolder)
2330
if err != nil {
2431
fmt.Fprintf(os.Stderr, "Something went wrong: %v\n", err.Error())
2532
os.Exit(1)
2633
}
27-
gstatic.EndTimer(elapsedTime)
34+
endTimer(elapsedTime)
35+
36+
}
37+
38+
func startTimer(identifier string) elapsedTime {
39+
return elapsedTime{identifier, time.Now(), time.Time{}}
40+
}
41+
42+
func endTimer(elapsedTime elapsedTime) {
43+
elapsedTime.end = time.Now()
44+
elapsed := elapsedTime.end.Sub(elapsedTime.start)
45+
fmt.Printf("[%s]: %v\n", elapsedTime.identifier, elapsed)
2846
}
2947

3048
func usage() {

0 commit comments

Comments
 (0)