Skip to content

Commit

Permalink
feat(parser): add flags for latest and specific releases
Browse files Browse the repository at this point in the history
  • Loading branch information
scottmckendry committed Jan 12, 2025
1 parent ec7e25b commit 7da3b83
Show file tree
Hide file tree
Showing 3 changed files with 163 additions and 1 deletion.
18 changes: 18 additions & 0 deletions changelog/changelog.go
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ package changelog

import (
"bufio"
"fmt"
"regexp"
"strings"
"time"
Expand Down Expand Up @@ -32,6 +33,23 @@ func NewParser() *Parser {
}
}

func (p *Parser) GetLatest() (*ChangelogEntry, error) {
if len(p.entries) == 0 {
return nil, fmt.Errorf("no changelog entries found")
}
return &p.entries[0], nil
}

func (p *Parser) GetVersion(version string) (*ChangelogEntry, error) {
for _, entry := range p.entries {
if entry.Version == version {
return &entry, nil
}
}

return nil, fmt.Errorf("version %s not found", version)
}

// Parse the changelog content and return a slice of ChangelogEntry
func (p *Parser) Parse(content string) ([]ChangelogEntry, error) {
scanner := bufio.NewScanner(strings.NewReader(content))
Expand Down
105 changes: 105 additions & 0 deletions changelog/changelog_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -128,6 +128,111 @@ func TestParse(t *testing.T) {
}
}

func TestGetLatest(t *testing.T) {
input := `# Changelog
## [v2.0.0](https://github.com/user/repo/compare/v1.0.0...v2.0.0) (2025-02-01)
### Features
* new feature
## [v1.0.0](https://github.com/user/repo/compare/v0.1.0...v1.0.0) (2025-01-01)
### Features
* basic feature`

p := NewParser()
_, err := p.Parse(input)
if err != nil {
t.Fatalf("Parse failed: %v", err)
}

latest, err := p.GetLatest()
if err != nil {
t.Fatalf("GetLatest failed: %v", err)
}

if latest.Version != "2.0.0" {
t.Errorf("Expected version 2.0.0, got %s", latest.Version)
}
}

func TestGetVersion(t *testing.T) {
input := `# Changelog
## [v2.0.0](https://github.com/user/repo/compare/v1.0.0...v2.0.0) (2025-02-01)
### Features
* new feature
## [v1.0.0](https://github.com/user/repo/compare/v0.1.0...v1.0.0) (2025-01-01)
### Features
* basic feature`

tests := []struct {
name string
version string
want string
wantErr bool
}{
{
name: "existing version",
version: "1.0.0",
want: "1.0.0",
wantErr: false,
},
{
name: "non-existent version",
version: "3.0.0",
want: "",
wantErr: true,
},
}

p := NewParser()
_, err := p.Parse(input)
if err != nil {
t.Fatalf("Parse failed: %v", err)
}

for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
entry, err := p.GetVersion(tt.version)
if tt.wantErr {
if err == nil {
t.Error("Expected error but got none")
}
return
}

if err != nil {
t.Errorf("Unexpected error: %v", err)
return
}

if entry.Version != tt.want {
t.Errorf("Expected version %s, got %s", tt.want, entry.Version)
}
})
}
}

func TestEmptyChangelog(t *testing.T) {
input := "# Changelog\n"
p := NewParser()
_, err := p.Parse(input)
if err != nil {
t.Fatalf("Parse failed: %v", err)
}

_, err = p.GetLatest()
if err == nil {
t.Error("Expected error for empty changelog but got none")
}

_, err = p.GetVersion("1.0.0")
if err == nil {
t.Error("Expected error for non-existent version but got none")
}
}

func mustParseTime(date string) time.Time {
t, err := time.Parse("2006-01-02", date)
if err != nil {
Expand Down
41 changes: 40 additions & 1 deletion cmd/cmd.go
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,8 @@ var cmd = &cobra.Command{
}

ver, _ := cmd.Flags().GetBool("version")
latest, _ := cmd.Flags().GetBool("latest")
release, _ := cmd.Flags().GetString("release")

if ver {
fmt.Printf("cl-parse v%s\n", VERSION)
Expand All @@ -41,12 +43,47 @@ var cmd = &cobra.Command{
os.Exit(1)
}

if latest {
if len(entries) == 0 {
fmt.Println("No changelog entries found")
os.Exit(1)
}
jsonData, err := json.MarshalIndent(entries[0], "", " ")
if err != nil {
fmt.Println(err)
os.Exit(1)
}
fmt.Println(string(jsonData))
return
}

if release != "" {
found := false
for _, entry := range entries {
if entry.Version == release {
jsonData, err := json.MarshalIndent(entry, "", " ")
if err != nil {
fmt.Println(err)
os.Exit(1)
}
fmt.Println(string(jsonData))
found = true
break
}
}
if !found {
fmt.Printf("Version %s not found in changelog\n", release)
os.Exit(1)
}
return
}

// default to printing all entries
jsonData, err := json.MarshalIndent(entries, "", " ")
if err != nil {
fmt.Println(err)
os.Exit(1)
}

fmt.Println(string(jsonData))
},
}
Expand All @@ -60,4 +97,6 @@ func Execute() {

func init() {
cmd.Flags().BoolP("version", "v", false, "display the current version of cl-parse")
cmd.Flags().BoolP("latest", "l", false, "display the most recent version from the changelog")
cmd.Flags().StringP("release", "r", "", "display the changelog entry for a specific release")
}

0 comments on commit 7da3b83

Please sign in to comment.