From af4b3e81014a059f9df6e4115af89e74a168544b Mon Sep 17 00:00:00 2001 From: Paul Wheeler Date: Thu, 17 Oct 2024 16:30:44 -1000 Subject: [PATCH] Updated Parser to support reading reports from a Reader * Parser now only requires a CoverageMode at construction time * The Parse function takes a path * Added a ParseReader function that takes an io.Reader --- coverage.go | 53 +++++++++++++++++++----------------------------- coverage_test.go | 12 +++++------ 2 files changed, 27 insertions(+), 38 deletions(-) diff --git a/coverage.go b/coverage.go index 3ba7477..8e2571a 100644 --- a/coverage.go +++ b/coverage.go @@ -5,41 +5,42 @@ import ( "encoding/xml" "fmt" "io" - "io/ioutil" "os" "strconv" "strings" ) // New creates a new lcov parser -func New(filePath string, mode CoverageMode) Parser { +func New(mode CoverageMode) Parser { return Parser{ - path: filePath, mode: mode, } } // Parse parses the lcov file -func (l Parser) Parse() (Report, error) { +func (l Parser) Parse(path string) (Report, error) { + reader, err := os.Open(path) + if err != nil { + return Report{}, fmt.Errorf("coverage.Parse> Unable to open file: %v", err) + } + defer reader.Close() + return l.ParseReader(reader) +} + +func (l Parser) ParseReader(reader io.Reader) (Report, error) { switch l.mode { case LCOV: - return l.processLcov() + return l.processLcov(reader) case COBERTURA: - return l.processCobertura() + return l.processCobertura(reader) case CLOVER: - return l.processClover() + return l.processClover(reader) } - return Report{}, fmt.Errorf("coverage.parse> Unknown mode %s", l.mode) + return Report{}, fmt.Errorf("coverage.Parse> Unknown mode %s", l.mode) } -func (l Parser) processClover() (Report, error) { - file, errF := os.Open(l.path) - if errF != nil { - return Report{}, fmt.Errorf("coverage.processClover> Unable to open file: %v", errF) - } - defer file.Close() - - b, errR := ioutil.ReadAll(file) +func (l Parser) processClover(reader io.Reader) (Report, error) { + b, errR := io.ReadAll(reader) if errR != nil { return Report{}, fmt.Errorf("coverage.processClover> Unable to read file: %v", errR) } @@ -77,14 +78,8 @@ func (l Parser) processClover() (Report, error) { } -func (l Parser) processCobertura() (Report, error) { - file, errF := os.Open(l.path) - if errF != nil { - return Report{}, fmt.Errorf("coverage.processCobertura> Unable to open file: %v", errF) - } - defer file.Close() - - b, errR := ioutil.ReadAll(file) +func (l Parser) processCobertura(reader io.Reader) (Report, error) { + b, errR := io.ReadAll(reader) if errR != nil { return Report{}, fmt.Errorf("coverage.processCobertura> Unable to read file: %v", errR) } @@ -103,14 +98,8 @@ func (l Parser) processCobertura() (Report, error) { return report, nil } -func (l Parser) processLcov() (Report, error) { - file, errF := os.Open(l.path) - if errF != nil { - return Report{}, fmt.Errorf("coverage.processLcov> Unable to open lcov file: %v", errF) - } - defer file.Close() - - r := bufio.NewReader(file) +func (l Parser) processLcov(reader io.Reader) (Report, error) { + r := bufio.NewReader(reader) report := Report{ Files: make([]FileReport, 0), diff --git a/coverage_test.go b/coverage_test.go index 49ee42c..4ef57f0 100644 --- a/coverage_test.go +++ b/coverage_test.go @@ -7,8 +7,8 @@ import ( ) func TestLCOV(t *testing.T) { - lcovParser := New("./test/lcov.info", LCOV) - report, err := lcovParser.Parse() + lcovParser := New(LCOV) + report, err := lcovParser.Parse("./test/lcov.info") assert.NoError(t, err) assert.Equal(t, 67, report.CoveredBranches) @@ -20,8 +20,8 @@ func TestLCOV(t *testing.T) { } func TestCobertura(t *testing.T) { - coberturaParser := New("./test/coverage.xml", COBERTURA) - report, err := coberturaParser.Parse() + coberturaParser := New(COBERTURA) + report, err := coberturaParser.Parse("./test/coverage.xml") assert.NoError(t, err) assert.Equal(t, 8, report.TotalLines) @@ -31,8 +31,8 @@ func TestCobertura(t *testing.T) { } func TestClover(t *testing.T) { - cloverParser := New("./test/clover.xml", CLOVER) - report, err := cloverParser.Parse() + cloverParser := New(CLOVER) + report, err := cloverParser.Parse("./test/clover.xml") assert.NoError(t, err) assert.Equal(t, 20672, report.TotalLines)