refactor: add support for mage and golangci-lint

This commit is contained in:
Dan Anglin 2021-09-19 05:57:46 +01:00
parent 611da8f3e3
commit 7d7cfc376c
Signed by: dananglin
GPG key ID: 0C1D44CFBEE68638
6 changed files with 119 additions and 8 deletions

29
.golangci.yaml Normal file
View file

@ -0,0 +1,29 @@
---
run:
concurrency: 2
timeout: 1m
issues-exit-code: 1
tests: true
output:
format: colored-line-number
print-issues-lines: true
print-linter-name: true
uniq-by-line: true
sort-results: true
linters:
enable-all: true
# disable:
fast: false
linters-settings:
lll:
line-length: 140
issues:
exclude-rules:
- path: greet_test.go
linters:
- ifshort
- testpackage

2
go.mod
View file

@ -1,3 +1,5 @@
module forge.dananglin.me.uk/code/dananglin/greet
go 1.17
require github.com/magefile/mage v1.11.0

2
go.sum Normal file
View file

@ -0,0 +1,2 @@
github.com/magefile/mage v1.11.0 h1:C/55Ywp9BpgVVclD3lRnSYCwXTYxmSppIgLeDYlNuls=
github.com/magefile/mage v1.11.0/go.mod h1:z5UZb/iS3GoOSn0JgWuiw7dxlurVYTu+/jHXqQg881A=

View file

@ -2,15 +2,24 @@ package main
import (
"fmt"
"os"
"io"
"log"
"os"
)
type numberOfArgumentError struct {
length int
}
func (e numberOfArgumentError) Error() string {
return fmt.Sprintf("unexpected number of arguments passed to the greeter: want 0 or 1 argument, got %d", e.length)
}
func main() {
osArgs := os.Args[1:]
if err := greet(os.Stdout, osArgs); err != nil {
fmt.Printf("ERROR: %s.\n", err)
log.Fatalf("ERROR: %s.\n", err)
}
}
@ -18,8 +27,10 @@ func greet(w io.Writer, n []string) error {
var name string
if len(n) > 1 {
return fmt.Errorf("unexpected number of arguments passed to the greeter: want 0 or 1 argument, got %d", len(n))
} else if len(n) == 0 {
return numberOfArgumentError{length: len(n)}
}
if len(n) == 0 {
name = "World"
} else {
name = n[0]

View file

@ -7,14 +7,17 @@ import (
// TestGreetNoArguments tests the greeter's response when given no names.
func TestGreetNoArguments(t *testing.T) {
t.Parallel()
buffer := new(bytes.Buffer)
args := make([]string, 0)
if err := greet(buffer, args); err != nil {
t.Fatalf("an error occured while running greet(): %s", err)
t.Fatalf("an error occurred while running greet(): %s", err)
}
want := "Hello, World!\n"
got := buffer.String()
if want != got {
@ -26,14 +29,17 @@ func TestGreetNoArguments(t *testing.T) {
// TestGreetOneArgument tests the greeter's response when given one name.
func TestGreetOneArgument(t *testing.T) {
t.Parallel()
buffer := new(bytes.Buffer)
args := []string{"Sarah"}
if err := greet(buffer, args); err != nil {
t.Fatalf("an error occured while running greet(): %s", err)
t.Fatalf("an error occurred while running greet(): %s", err)
}
want := "Hello, Sarah!\n"
got := buffer.String()
if want != got {
@ -45,17 +51,19 @@ func TestGreetOneArgument(t *testing.T) {
// TestGreetTwoArguments tests the greeter's response when given two names.
func TestGreetTwoArguments(t *testing.T) {
t.Parallel()
buffer := new(bytes.Buffer)
args := []string{"Bob", "John"}
want := "unexpected number of arguments passed to the greeter: want 0 or 1 argument, got 2"
err := greet(buffer, args)
if err == nil {
t.Error("unexpected nil error returned.")
}
want := "unexpected number of arguments passed to the greeter: want 0 or 1 argument, got 2"
got := err.Error()
if want != got {

59
magefile.go Normal file
View file

@ -0,0 +1,59 @@
//go:build mage
// +build mage
package main
import (
"os"
"github.com/magefile/mage/sh"
)
const (
binary = "greet"
)
var Default = Build
// Test run the go tests
// To enable verbose mode set PELICAN_TEST_VERBOSE=1.
// To enable coverage mode set PELICAN_TEST_COVER=1.
func Test() error {
goTest := sh.RunCmd("go", "test")
args := []string{"."}
if os.Getenv("GO_TEST_VERBOSE") == "1" {
args = append(args, "-v")
}
if os.Getenv("GO_TEST_COVER") == "1" {
args = append(args, "-cover")
}
return goTest(args...)
}
// Lint runs golangci-lint against the code.
func Lint() error {
return sh.RunV("golangci-lint", "run", "--color", "always")
}
// Build build the executable
func Build() error {
main := "greet.go"
return sh.Run("go", "build", "-o", binary, main)
}
// Clean clean the workspace
func Clean() error {
if err := sh.Rm(binary); err != nil {
return err
}
if err := sh.Run("go", "clean", "."); err != nil {
return err
}
return nil
}