Compare commits
5 commits
572d868c24
...
aa5ea0ad70
| Author | SHA1 | Date | |
|---|---|---|---|
| aa5ea0ad70 | |||
| 84c144711a | |||
| c9ca5effcc | |||
| 30a5786adf | |||
| a96b765794 |
9 changed files with 47 additions and 30 deletions
|
|
@ -1,5 +1,12 @@
|
||||||
# Changelog
|
# Changelog
|
||||||
|
|
||||||
|
## [0.1.1] - 2026-03-01
|
||||||
|
|
||||||
|
- Add Time method to Date struct for accessing internal timestamp
|
||||||
|
- Add Makefile targets for go vet and go fix
|
||||||
|
- Use named struct fields in tests
|
||||||
|
- Apply go fix improvements (use maps.Copy, strings.CutPrefix, bytes.Cut, range over int)
|
||||||
|
|
||||||
## [0.1.0] - 2026-02-28
|
## [0.1.0] - 2026-02-28
|
||||||
|
|
||||||
- ✨ Move CLI commands to cli/ package for extensibility
|
- ✨ Move CLI commands to cli/ package for extensibility
|
||||||
|
|
|
||||||
7
Makefile
7
Makefile
|
|
@ -24,6 +24,13 @@ clean: ## Removes temporary and build files
|
||||||
fmt: $(SOURCES) ## Runs go fmt
|
fmt: $(SOURCES) ## Runs go fmt
|
||||||
go fmt ./...
|
go fmt ./...
|
||||||
|
|
||||||
|
.PHONY: fix ## Run go fix
|
||||||
|
go fix ./...
|
||||||
|
|
||||||
|
.PHONY: vet ## Runs go vet
|
||||||
|
vet: fmt fix
|
||||||
|
go vet ./...
|
||||||
|
|
||||||
.PHONY: test
|
.PHONY: test
|
||||||
test: ## Test application and generate coverage report
|
test: ## Test application and generate coverage report
|
||||||
$(MAKE) clean
|
$(MAKE) clean
|
||||||
|
|
|
||||||
|
|
@ -58,8 +58,8 @@ var DropCmd = &cobra.Command{
|
||||||
for k, v := range fields {
|
for k, v := range fields {
|
||||||
ms.AppendTo(k, tools.ParseString(v))
|
ms.AppendTo(k, tools.ParseString(v))
|
||||||
}
|
}
|
||||||
e := models.Entry{title, d.t, *ms}
|
e := models.Entry{Title: title, Date: d.Time(), Fields: *ms}
|
||||||
l := models.Log{log, []models.Entry{e}}
|
l := models.Log{Name: log, Entries: []models.Entry{e}}
|
||||||
err := files.Append(l)
|
err := files.Append(l)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
|
|
@ -126,3 +126,7 @@ func (d *Date) Set(in string) (err error) {
|
||||||
func (d *Date) Type() string {
|
func (d *Date) Type() string {
|
||||||
return "datetime"
|
return "datetime"
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (d Date) Time() time.Time {
|
||||||
|
return d.t
|
||||||
|
}
|
||||||
|
|
|
||||||
|
|
@ -49,8 +49,8 @@ func appendTestSingle(t *testing.T) {
|
||||||
Title: "Jimmy",
|
Title: "Jimmy",
|
||||||
Date: when,
|
Date: when,
|
||||||
Fields: []models.Meta{
|
Fields: []models.Meta{
|
||||||
{"foo", 42},
|
{Key: "foo", Value: 42},
|
||||||
{"bar", true},
|
{Key: "bar", Value: true},
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
l := models.Log{
|
l := models.Log{
|
||||||
|
|
@ -93,7 +93,7 @@ func appendTestAddNewLine(t *testing.T) {
|
||||||
when := time.Now().Local()
|
when := time.Now().Local()
|
||||||
whens := when.Format(models.DateFormat)
|
whens := when.Format(models.DateFormat)
|
||||||
e := []models.Entry{
|
e := []models.Entry{
|
||||||
{Title: "one", Date: when, Fields: models.Metas{{"id", "jimmy"}}},
|
{Title: "one", Date: when, Fields: models.Metas{{Key: "id", Value: "jimmy"}}},
|
||||||
}
|
}
|
||||||
l := models.Log{
|
l := models.Log{
|
||||||
Name: "test",
|
Name: "test",
|
||||||
|
|
@ -112,7 +112,7 @@ func appendTestDontAddNewLine(t *testing.T) {
|
||||||
when := time.Now().Local()
|
when := time.Now().Local()
|
||||||
whens := when.Format(models.DateFormat)
|
whens := when.Format(models.DateFormat)
|
||||||
e := []models.Entry{
|
e := []models.Entry{
|
||||||
{Title: "one", Date: when, Fields: models.Metas{{"id", "jimmy"}}},
|
{Title: "one", Date: when, Fields: models.Metas{{Key: "id", Value: "jimmy"}}},
|
||||||
}
|
}
|
||||||
l := models.Log{
|
l := models.Log{
|
||||||
Name: "test",
|
Name: "test",
|
||||||
|
|
|
||||||
|
|
@ -17,7 +17,7 @@ func TestJsonName(t *testing.T) {
|
||||||
|
|
||||||
func TestJsonMeta(t *testing.T) {
|
func TestJsonMeta(t *testing.T) {
|
||||||
f, _ := New("json")
|
f, _ := New("json")
|
||||||
m := models.Meta{"foo", 42}
|
m := models.Meta{Key: "foo", Value: 42}
|
||||||
exp := `{"foo":42}`
|
exp := `{"foo":42}`
|
||||||
o, err := f.Meta(m)
|
o, err := f.Meta(m)
|
||||||
be.Err(t, err, nil)
|
be.Err(t, err, nil)
|
||||||
|
|
@ -27,7 +27,7 @@ func TestJsonMeta(t *testing.T) {
|
||||||
func TestJsonEntry(t *testing.T) {
|
func TestJsonEntry(t *testing.T) {
|
||||||
when := time.Now()
|
when := time.Now()
|
||||||
f, _ := New("json")
|
f, _ := New("json")
|
||||||
m := models.Meta{"foo", 42}
|
m := models.Meta{Key: "foo", Value: 42}
|
||||||
e := models.Entry{
|
e := models.Entry{
|
||||||
Title: "Homer",
|
Title: "Homer",
|
||||||
Date: when,
|
Date: when,
|
||||||
|
|
@ -42,13 +42,13 @@ func TestJsonEntry(t *testing.T) {
|
||||||
func TestJsonLog(t *testing.T) {
|
func TestJsonLog(t *testing.T) {
|
||||||
when := time.Now()
|
when := time.Now()
|
||||||
f, _ := New("json")
|
f, _ := New("json")
|
||||||
m := models.Meta{"foo", 42}
|
m := models.Meta{Key: "foo", Value: 42}
|
||||||
e := models.Entry{
|
e := models.Entry{
|
||||||
Title: "Homer",
|
Title: "Homer",
|
||||||
Date: when,
|
Date: when,
|
||||||
Fields: []models.Meta{m},
|
Fields: []models.Meta{m},
|
||||||
}
|
}
|
||||||
l := models.Log{"stuff", []models.Entry{e}}
|
l := models.Log{Name: "stuff", Entries: []models.Entry{e}}
|
||||||
exp := fmt.Sprintf(`{"%s":[{"title":"%s","date":"%s","foo":42}]}`, l.Name, e.Title, when.Format(time.RFC3339))
|
exp := fmt.Sprintf(`{"%s":[{"title":"%s","date":"%s","foo":42}]}`, l.Name, e.Title, when.Format(time.RFC3339))
|
||||||
o, err := f.Log(l)
|
o, err := f.Log(l)
|
||||||
be.Err(t, err, nil)
|
be.Err(t, err, nil)
|
||||||
|
|
@ -65,7 +65,7 @@ func TestJsonNoLogs(t *testing.T) {
|
||||||
|
|
||||||
func TestJsonErr(t *testing.T) {
|
func TestJsonErr(t *testing.T) {
|
||||||
f, _ := New("json")
|
f, _ := New("json")
|
||||||
o, err := f.Meta(models.Meta{"foo", make(chan bool)})
|
o, err := f.Meta(models.Meta{Key: "foo", Value: make(chan bool)})
|
||||||
var exp []byte
|
var exp []byte
|
||||||
be.Err(t, err)
|
be.Err(t, err)
|
||||||
be.Equal(t, o, exp)
|
be.Equal(t, o, exp)
|
||||||
|
|
@ -73,7 +73,7 @@ func TestJsonErr(t *testing.T) {
|
||||||
|
|
||||||
func TestJsonPretty(t *testing.T) {
|
func TestJsonPretty(t *testing.T) {
|
||||||
f := Json{true}
|
f := Json{true}
|
||||||
o, err := f.Meta(models.Meta{"foo", 42})
|
o, err := f.Meta(models.Meta{Key: "foo", Value: 42})
|
||||||
exp := `{
|
exp := `{
|
||||||
"foo": 42
|
"foo": 42
|
||||||
}`
|
}`
|
||||||
|
|
|
||||||
|
|
@ -18,28 +18,28 @@ func TestNullName(t *testing.T) {
|
||||||
|
|
||||||
func TestNullMeta(t *testing.T) {
|
func TestNullMeta(t *testing.T) {
|
||||||
f, _ := New("zero")
|
f, _ := New("zero")
|
||||||
o, err := f.Meta(models.Meta{"foo", 42})
|
o, err := f.Meta(models.Meta{Key: "foo", Value: 42})
|
||||||
be.Err(t, err, nil)
|
be.Err(t, err, nil)
|
||||||
be.Equal(t, o, empty)
|
be.Equal(t, o, empty)
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestNullEntry(t *testing.T) {
|
func TestNullEntry(t *testing.T) {
|
||||||
f, _ := New("zero")
|
f, _ := New("zero")
|
||||||
o, err := f.Entry(models.Entry{"title", time.Now(), models.Metas{}})
|
o, err := f.Entry(models.Entry{Title: "title", Date: time.Now()})
|
||||||
be.Err(t, err, nil)
|
be.Err(t, err, nil)
|
||||||
be.Equal(t, o, empty)
|
be.Equal(t, o, empty)
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestNullLog(t *testing.T) {
|
func TestNullLog(t *testing.T) {
|
||||||
f, _ := New("zero")
|
f, _ := New("zero")
|
||||||
o, err := f.Log(models.Log{"jim", []models.Entry{{"title", time.Now(), models.Metas{}}}})
|
o, err := f.Log(models.Log{Name: "jim", Entries: []models.Entry{{Title: "title", Date: time.Now()}}})
|
||||||
be.Err(t, err, nil)
|
be.Err(t, err, nil)
|
||||||
be.Equal(t, o, empty)
|
be.Equal(t, o, empty)
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestNullLogs(t *testing.T) {
|
func TestNullLogs(t *testing.T) {
|
||||||
f, _ := New("zero")
|
f, _ := New("zero")
|
||||||
o, err := f.Logs([]models.Log{{"jim", []models.Entry{{"title", time.Now(), models.Metas{}}}}})
|
o, err := f.Logs([]models.Log{{Name: "jim", Entries: []models.Entry{{Title: "title", Date: time.Now()}}}})
|
||||||
be.Err(t, err, nil)
|
be.Err(t, err, nil)
|
||||||
be.Equal(t, o, empty)
|
be.Equal(t, o, empty)
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -14,19 +14,19 @@ import (
|
||||||
|
|
||||||
func TestPlainLogs(t *testing.T) {
|
func TestPlainLogs(t *testing.T) {
|
||||||
m := []models.Meta{
|
m := []models.Meta{
|
||||||
{"foo", "bar"},
|
{Key: "foo", Value: "bar"},
|
||||||
{"baz", 42},
|
{Key: "baz", Value: 42},
|
||||||
}
|
}
|
||||||
e := []models.Entry{
|
e := []models.Entry{
|
||||||
{Title: "one", Date: time.Now(), Fields: m},
|
{Title: "one", Date: time.Now(), Fields: m},
|
||||||
{Title: "small", Date: time.Now()},
|
{Title: "small", Date: time.Now()},
|
||||||
}
|
}
|
||||||
l := models.Log{"stuff", e}
|
l := models.Log{Name: "stuff", Entries: e}
|
||||||
e2 := models.Entry{
|
e2 := models.Entry{
|
||||||
Title: "three",
|
Title: "three",
|
||||||
Date: time.Now(),
|
Date: time.Now(),
|
||||||
}
|
}
|
||||||
l2 := models.Log{"more-stuff", []models.Entry{e2}}
|
l2 := models.Log{Name: "more-stuff", Entries: []models.Entry{e2}}
|
||||||
logs := []models.Log{l, l2}
|
logs := []models.Log{l, l2}
|
||||||
|
|
||||||
f, err := New("plain")
|
f, err := New("plain")
|
||||||
|
|
@ -115,14 +115,14 @@ func TestPlainLogNoEntries(t *testing.T) {
|
||||||
|
|
||||||
func TestPlainMetaEmpty(t *testing.T) {
|
func TestPlainMetaEmpty(t *testing.T) {
|
||||||
f, _ := New("plain")
|
f, _ := New("plain")
|
||||||
out, err := f.Meta(models.Meta{"foo", ""})
|
out, err := f.Meta(models.Meta{Key: "foo", Value: ""})
|
||||||
be.Err(t, err, nil)
|
be.Err(t, err, nil)
|
||||||
be.Equal(t, len(out), 0)
|
be.Equal(t, len(out), 0)
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestPlainMetaError(t *testing.T) {
|
func TestPlainMetaError(t *testing.T) {
|
||||||
f, _ := New("plain")
|
f, _ := New("plain")
|
||||||
out, err := f.Meta(models.Meta{"foo", make(chan bool)})
|
out, err := f.Meta(models.Meta{Key: "foo", Value: make(chan bool)})
|
||||||
be.Err(t, err)
|
be.Err(t, err)
|
||||||
be.Equal(t, len(out), 0)
|
be.Equal(t, len(out), 0)
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -6,6 +6,7 @@ import (
|
||||||
"encoding/json"
|
"encoding/json"
|
||||||
"errors"
|
"errors"
|
||||||
"fmt"
|
"fmt"
|
||||||
|
"maps"
|
||||||
"os"
|
"os"
|
||||||
"regexp"
|
"regexp"
|
||||||
"strings"
|
"strings"
|
||||||
|
|
@ -34,7 +35,7 @@ func (e Entry) getFieldMarshalChan() chan metaRes {
|
||||||
ch := make(chan metaRes, size)
|
ch := make(chan metaRes, size)
|
||||||
var wg sync.WaitGroup
|
var wg sync.WaitGroup
|
||||||
|
|
||||||
for i := 0; i < size; i++ {
|
for i := range size {
|
||||||
wg.Add(1)
|
wg.Add(1)
|
||||||
go func(m Meta) {
|
go func(m Meta) {
|
||||||
defer wg.Done()
|
defer wg.Done()
|
||||||
|
|
@ -139,8 +140,8 @@ func scanEntry(data []byte, atEOF bool) (advance int, token []byte, err error) {
|
||||||
if atEOF {
|
if atEOF {
|
||||||
end := []byte{32, 64, 101, 110, 100}
|
end := []byte{32, 64, 101, 110, 100}
|
||||||
token = data
|
token = data
|
||||||
if i := bytes.Index(data, end); i >= 0 {
|
if before, _, ok := bytes.Cut(data, end); ok {
|
||||||
token = data[0:i]
|
token = before
|
||||||
}
|
}
|
||||||
return len(data), token, nil
|
return len(data), token, nil
|
||||||
}
|
}
|
||||||
|
|
@ -198,9 +199,7 @@ func (e Entry) MarshalJSON() ([]byte, error) {
|
||||||
out := map[string]any{}
|
out := map[string]any{}
|
||||||
out["title"] = e.Title
|
out["title"] = e.Title
|
||||||
out["date"] = e.Date.Format(time.RFC3339)
|
out["date"] = e.Date.Format(time.RFC3339)
|
||||||
for k, v := range e.Fields.Map() {
|
maps.Copy(out, e.Fields.Map())
|
||||||
out[k] = v
|
|
||||||
}
|
|
||||||
return json.Marshal(out)
|
return json.Marshal(out)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -28,8 +28,8 @@ func WriteValue(buff *bytes.Buffer, val any) (n int, err error) {
|
||||||
return buff.Write(o)
|
return buff.Write(o)
|
||||||
}
|
}
|
||||||
case string:
|
case string:
|
||||||
if strings.HasPrefix(v, "!") {
|
if after, ok := strings.CutPrefix(v, "!"); ok {
|
||||||
return buff.WriteString(strings.TrimPrefix(v, "!"))
|
return buff.WriteString(after)
|
||||||
}
|
}
|
||||||
return buff.WriteString(v)
|
return buff.WriteString(v)
|
||||||
case int:
|
case int:
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue