diff --git a/CHANGELOG.md b/CHANGELOG.md index c3b3e0f..2855efa 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,12 @@ # 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 - ✨ Move CLI commands to cli/ package for extensibility diff --git a/Makefile b/Makefile index aaf684f..47de223 100644 --- a/Makefile +++ b/Makefile @@ -24,6 +24,13 @@ clean: ## Removes temporary and build files fmt: $(SOURCES) ## Runs go fmt go fmt ./... +.PHONY: fix ## Run go fix + go fix ./... + +.PHONY: vet ## Runs go vet +vet: fmt fix + go vet ./... + .PHONY: test test: ## Test application and generate coverage report $(MAKE) clean diff --git a/cli/drop.go b/cli/drop.go index c319f93..c7d1d5f 100644 --- a/cli/drop.go +++ b/cli/drop.go @@ -58,8 +58,8 @@ var DropCmd = &cobra.Command{ for k, v := range fields { ms.AppendTo(k, tools.ParseString(v)) } - e := models.Entry{title, d.t, *ms} - l := models.Log{log, []models.Entry{e}} + e := models.Entry{Title: title, Date: d.Time(), Fields: *ms} + l := models.Log{Name: log, Entries: []models.Entry{e}} err := files.Append(l) if err != nil { return err @@ -126,3 +126,7 @@ func (d *Date) Set(in string) (err error) { func (d *Date) Type() string { return "datetime" } + +func (d Date) Time() time.Time { + return d.t +} diff --git a/files/append_test.go b/files/append_test.go index 4916888..890207a 100644 --- a/files/append_test.go +++ b/files/append_test.go @@ -49,8 +49,8 @@ func appendTestSingle(t *testing.T) { Title: "Jimmy", Date: when, Fields: []models.Meta{ - {"foo", 42}, - {"bar", true}, + {Key: "foo", Value: 42}, + {Key: "bar", Value: true}, }, } l := models.Log{ @@ -93,7 +93,7 @@ func appendTestAddNewLine(t *testing.T) { when := time.Now().Local() whens := when.Format(models.DateFormat) 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{ Name: "test", @@ -112,7 +112,7 @@ func appendTestDontAddNewLine(t *testing.T) { when := time.Now().Local() whens := when.Format(models.DateFormat) 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{ Name: "test", diff --git a/formatters/json_test.go b/formatters/json_test.go index 8139369..b6a5668 100644 --- a/formatters/json_test.go +++ b/formatters/json_test.go @@ -17,7 +17,7 @@ func TestJsonName(t *testing.T) { func TestJsonMeta(t *testing.T) { f, _ := New("json") - m := models.Meta{"foo", 42} + m := models.Meta{Key: "foo", Value: 42} exp := `{"foo":42}` o, err := f.Meta(m) be.Err(t, err, nil) @@ -27,7 +27,7 @@ func TestJsonMeta(t *testing.T) { func TestJsonEntry(t *testing.T) { when := time.Now() f, _ := New("json") - m := models.Meta{"foo", 42} + m := models.Meta{Key: "foo", Value: 42} e := models.Entry{ Title: "Homer", Date: when, @@ -42,13 +42,13 @@ func TestJsonEntry(t *testing.T) { func TestJsonLog(t *testing.T) { when := time.Now() f, _ := New("json") - m := models.Meta{"foo", 42} + m := models.Meta{Key: "foo", Value: 42} e := models.Entry{ Title: "Homer", Date: when, 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)) o, err := f.Log(l) be.Err(t, err, nil) @@ -65,7 +65,7 @@ func TestJsonNoLogs(t *testing.T) { func TestJsonErr(t *testing.T) { 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 be.Err(t, err) be.Equal(t, o, exp) @@ -73,7 +73,7 @@ func TestJsonErr(t *testing.T) { func TestJsonPretty(t *testing.T) { f := Json{true} - o, err := f.Meta(models.Meta{"foo", 42}) + o, err := f.Meta(models.Meta{Key: "foo", Value: 42}) exp := `{ "foo": 42 }` diff --git a/formatters/null_test.go b/formatters/null_test.go index 587b4e5..ba34618 100644 --- a/formatters/null_test.go +++ b/formatters/null_test.go @@ -18,28 +18,28 @@ func TestNullName(t *testing.T) { func TestNullMeta(t *testing.T) { 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.Equal(t, o, empty) } func TestNullEntry(t *testing.T) { 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.Equal(t, o, empty) } func TestNullLog(t *testing.T) { 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.Equal(t, o, empty) } func TestNullLogs(t *testing.T) { 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.Equal(t, o, empty) } diff --git a/formatters/plain_test.go b/formatters/plain_test.go index 4967553..bacc0a4 100644 --- a/formatters/plain_test.go +++ b/formatters/plain_test.go @@ -14,19 +14,19 @@ import ( func TestPlainLogs(t *testing.T) { m := []models.Meta{ - {"foo", "bar"}, - {"baz", 42}, + {Key: "foo", Value: "bar"}, + {Key: "baz", Value: 42}, } e := []models.Entry{ {Title: "one", Date: time.Now(), Fields: m}, {Title: "small", Date: time.Now()}, } - l := models.Log{"stuff", e} + l := models.Log{Name: "stuff", Entries: e} e2 := models.Entry{ Title: "three", 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} f, err := New("plain") @@ -115,14 +115,14 @@ func TestPlainLogNoEntries(t *testing.T) { func TestPlainMetaEmpty(t *testing.T) { 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.Equal(t, len(out), 0) } func TestPlainMetaError(t *testing.T) { 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.Equal(t, len(out), 0) } diff --git a/models/entry.go b/models/entry.go index 502db78..efd58b6 100644 --- a/models/entry.go +++ b/models/entry.go @@ -6,6 +6,7 @@ import ( "encoding/json" "errors" "fmt" + "maps" "os" "regexp" "strings" @@ -34,7 +35,7 @@ func (e Entry) getFieldMarshalChan() chan metaRes { ch := make(chan metaRes, size) var wg sync.WaitGroup - for i := 0; i < size; i++ { + for i := range size { wg.Add(1) go func(m Meta) { defer wg.Done() @@ -139,8 +140,8 @@ func scanEntry(data []byte, atEOF bool) (advance int, token []byte, err error) { if atEOF { end := []byte{32, 64, 101, 110, 100} token = data - if i := bytes.Index(data, end); i >= 0 { - token = data[0:i] + if before, _, ok := bytes.Cut(data, end); ok { + token = before } return len(data), token, nil } @@ -198,9 +199,7 @@ func (e Entry) MarshalJSON() ([]byte, error) { out := map[string]any{} out["title"] = e.Title out["date"] = e.Date.Format(time.RFC3339) - for k, v := range e.Fields.Map() { - out[k] = v - } + maps.Copy(out, e.Fields.Map()) return json.Marshal(out) } diff --git a/tools/write_buffer.go b/tools/write_buffer.go index b9626bc..3fdc3d0 100644 --- a/tools/write_buffer.go +++ b/tools/write_buffer.go @@ -28,8 +28,8 @@ func WriteValue(buff *bytes.Buffer, val any) (n int, err error) { return buff.Write(o) } case string: - if strings.HasPrefix(v, "!") { - return buff.WriteString(strings.TrimPrefix(v, "!")) + if after, ok := strings.CutPrefix(v, "!"); ok { + return buff.WriteString(after) } return buff.WriteString(v) case int: