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