mirror of
https://github.com/romdo/go-conver.git
synced 2026-02-19 08:16:40 +00:00
wip: start of commit package
This commit is contained in:
16
pkg/commit/commit.go
Normal file
16
pkg/commit/commit.go
Normal file
@@ -0,0 +1,16 @@
|
||||
// Package commit allows parsing commit messages that follow the conventional
|
||||
// commits format.
|
||||
package commit
|
||||
|
||||
type Commit struct {
|
||||
Type string
|
||||
Scope string
|
||||
Description string
|
||||
Body string
|
||||
Footers []Footer
|
||||
}
|
||||
|
||||
type Footer struct {
|
||||
Name string
|
||||
Body string
|
||||
}
|
||||
21
pkg/commit/parser.go
Normal file
21
pkg/commit/parser.go
Normal file
@@ -0,0 +1,21 @@
|
||||
package commit
|
||||
|
||||
import "bytes"
|
||||
|
||||
const (
|
||||
cr = 13
|
||||
lf = 10
|
||||
)
|
||||
|
||||
func paragraphs(input []byte) [][]byte {
|
||||
cln := bytes.ReplaceAll(input, []byte{cr, lf}, []byte{lf})
|
||||
cln = bytes.ReplaceAll(cln, []byte{cr}, []byte{lf})
|
||||
|
||||
ps := bytes.Split(cln, []byte{lf, lf})
|
||||
|
||||
for i, p := range ps {
|
||||
ps[i] = bytes.Trim(p, "\r\n")
|
||||
}
|
||||
|
||||
return ps
|
||||
}
|
||||
117
pkg/commit/parser_test.go
Normal file
117
pkg/commit/parser_test.go
Normal file
@@ -0,0 +1,117 @@
|
||||
package commit
|
||||
|
||||
import (
|
||||
"testing"
|
||||
|
||||
"github.com/stretchr/testify/assert"
|
||||
)
|
||||
|
||||
func Test_paragraph(t *testing.T) {
|
||||
type args struct {
|
||||
input []byte
|
||||
}
|
||||
tests := []struct {
|
||||
name string
|
||||
args args
|
||||
want [][]byte
|
||||
}{
|
||||
{
|
||||
name: "single line string",
|
||||
args: args{input: []byte("hello world\n")},
|
||||
want: [][]byte{[]byte("hello world")},
|
||||
},
|
||||
{
|
||||
name: "multi-line line string",
|
||||
args: args{input: []byte("hello world\nthe brown fox\n")},
|
||||
want: [][]byte{[]byte("hello world\nthe brown fox")},
|
||||
},
|
||||
{
|
||||
name: "multiple paragraphs",
|
||||
args: args{input: []byte(
|
||||
"Lorem ipsum dolor sit amet, consectetur adipiscing elit.\n" +
|
||||
"Praesent eleifend lorem non purus finibus, interdum\n" +
|
||||
"hendrerit sem bibendum.\n" +
|
||||
"\n" +
|
||||
"Etiam porttitor mollis nulla, egestas facilisis nisi\n" +
|
||||
"molestie ut. Quisque mi mi, commodo ut mattis a,\n" +
|
||||
"scelerisque eu elit.\n" +
|
||||
"\n" +
|
||||
"Duis id nulla eget velit maximus varius et egestas\n" +
|
||||
"sem. Ut mi risus, pretium quis cursus quis,\n" +
|
||||
"porttitor in ipsum.\n",
|
||||
)},
|
||||
want: [][]byte{
|
||||
[]byte(
|
||||
"Lorem ipsum dolor sit amet, consectetur adipiscing elit.\n" +
|
||||
"Praesent eleifend lorem non purus finibus, interdum\n" +
|
||||
"hendrerit sem bibendum.",
|
||||
),
|
||||
[]byte(
|
||||
"Etiam porttitor mollis nulla, egestas facilisis nisi\n" +
|
||||
"molestie ut. Quisque mi mi, commodo ut mattis a,\n" +
|
||||
"scelerisque eu elit.",
|
||||
),
|
||||
[]byte(
|
||||
"Duis id nulla eget velit maximus varius et egestas\n" +
|
||||
"sem. Ut mi risus, pretium quis cursus quis,\n" +
|
||||
"porttitor in ipsum.",
|
||||
),
|
||||
},
|
||||
},
|
||||
{
|
||||
name: "CRLF line separator",
|
||||
args: args{input: []byte(
|
||||
"Lorem ipsum dolor sit amet, consectetur adipiscing elit.\r\n" +
|
||||
"Praesent eleifend lorem non purus finibus, interdum\r\n" +
|
||||
"hendrerit sem bibendum.\r\n" +
|
||||
"\r\n" +
|
||||
"Etiam porttitor mollis nulla, egestas facilisis nisi\r\n" +
|
||||
"molestie ut. Quisque mi mi, commodo ut mattis a,\r\n" +
|
||||
"scelerisque eu elit.\r\n",
|
||||
)},
|
||||
want: [][]byte{
|
||||
[]byte(
|
||||
"Lorem ipsum dolor sit amet, consectetur adipiscing elit.\n" +
|
||||
"Praesent eleifend lorem non purus finibus, interdum\n" +
|
||||
"hendrerit sem bibendum.",
|
||||
),
|
||||
[]byte(
|
||||
"Etiam porttitor mollis nulla, egestas facilisis nisi\n" +
|
||||
"molestie ut. Quisque mi mi, commodo ut mattis a,\n" +
|
||||
"scelerisque eu elit.",
|
||||
),
|
||||
},
|
||||
},
|
||||
{
|
||||
name: "CR line separator",
|
||||
args: args{input: []byte(
|
||||
"Lorem ipsum dolor sit amet, consectetur adipiscing elit.\r" +
|
||||
"Praesent eleifend lorem non purus finibus, interdum\r" +
|
||||
"hendrerit sem bibendum.\r" +
|
||||
"\r" +
|
||||
"Etiam porttitor mollis nulla, egestas facilisis nisi\r" +
|
||||
"molestie ut. Quisque mi mi, commodo ut mattis a,\r" +
|
||||
"scelerisque eu elit.\r",
|
||||
)},
|
||||
want: [][]byte{
|
||||
[]byte(
|
||||
"Lorem ipsum dolor sit amet, consectetur adipiscing elit.\n" +
|
||||
"Praesent eleifend lorem non purus finibus, interdum\n" +
|
||||
"hendrerit sem bibendum.",
|
||||
),
|
||||
[]byte(
|
||||
"Etiam porttitor mollis nulla, egestas facilisis nisi\n" +
|
||||
"molestie ut. Quisque mi mi, commodo ut mattis a,\n" +
|
||||
"scelerisque eu elit.",
|
||||
),
|
||||
},
|
||||
},
|
||||
}
|
||||
for _, tt := range tests {
|
||||
t.Run(tt.name, func(t *testing.T) {
|
||||
got := paragraphs(tt.args.input)
|
||||
|
||||
assert.Equal(t, tt.want, got)
|
||||
})
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user