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

mlange-42 / ark-tools / 13944569950

19 Mar 2025 10:41AM CUT coverage: 98.445%. Remained the same
13944569950

push

github

web-flow
Upgrade to Ark v0.4.0 (#9)

633 of 643 relevant lines covered (98.44%)

140.44 hits per line

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

86.49
/reporter/csv.go
1
package reporter
2

3
import (
4
        "fmt"
5
        "os"
6
        "path/filepath"
7
        "strconv"
8
        "strings"
9

10
        "github.com/mlange-42/ark-tools/observer"
11
        "github.com/mlange-42/ark/ecs"
12
)
13

14
// CSV reporter.
15
//
16
// Writes one row to a CSV file per step.
17
type CSV struct {
18
        Observer       observer.Row // Observer to get data from.
19
        File           string       // Path to the output file.
20
        Sep            string       // Column separator. Default ",".
21
        UpdateInterval int          // Update interval in model ticks.
22
        file           *os.File
23
        header         []string
24
        builder        strings.Builder
25
        step           int64
26
}
27

28
// Initialize the system
29
func (s *CSV) Initialize(w *ecs.World) {
1✔
30
        s.Observer.Initialize(w)
1✔
31
        s.header = s.Observer.Header()
1✔
32
        if s.UpdateInterval == 0 {
2✔
33
                s.UpdateInterval = 1
1✔
34
        }
1✔
35
        if s.Sep == "" {
2✔
36
                s.Sep = ","
1✔
37
        }
1✔
38

39
        err := os.MkdirAll(filepath.Dir(s.File), os.ModePerm)
1✔
40
        if err != nil {
1✔
41
                panic(err)
×
42
        }
43

44
        s.file, err = os.Create(s.File)
1✔
45
        if err != nil {
1✔
46
                panic(err)
×
47
        }
48
        _, err = fmt.Fprintf(s.file, "t%s%s\n", s.Sep, strings.Join(s.header, s.Sep))
1✔
49
        if err != nil {
1✔
50
                panic(err)
×
51
        }
52

53
        s.step = 0
1✔
54
}
55

56
// Update the system
57
func (s *CSV) Update(w *ecs.World) {
100✔
58
        s.Observer.Update(w)
100✔
59
        if s.UpdateInterval == 0 || s.step%int64(s.UpdateInterval) == 0 {
200✔
60
                values := s.Observer.Values(w)
100✔
61
                s.builder.Reset()
100✔
62
                fmt.Fprintf(&s.builder, "%d%s", s.step, s.Sep)
100✔
63
                for i, v := range values {
400✔
64
                        fmt.Fprint(&s.builder, strconv.FormatFloat(v, 'f', -1, 64))
300✔
65
                        if i < len(values)-1 {
500✔
66
                                fmt.Fprint(&s.builder, s.Sep)
200✔
67
                        }
200✔
68
                }
69
                _, err := fmt.Fprintf(s.file, "%s\n", s.builder.String())
100✔
70
                if err != nil {
100✔
71
                        panic(err)
×
72
                }
73
        }
74
        s.step++
100✔
75
}
76

77
// Finalize the system
78
func (s *CSV) Finalize(w *ecs.World) {
1✔
79
        if err := s.file.Close(); err != nil {
1✔
80
                panic(err)
×
81
        }
82
}
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