├── .gitignore ├── Makefile ├── README.md ├── VERSION ├── farble.go ├── farble_test.go ├── glide.lock ├── glide.yaml ├── main.go ├── main_test.go ├── mocks └── Countable.go └── test_helper_test.go /.gitignore: -------------------------------------------------------------------------------- 1 | vendor/ 2 | go-cli-starter 3 | dist/ 4 | go-carpet-coverage-out* 5 | release/ 6 | -------------------------------------------------------------------------------- /Makefile: -------------------------------------------------------------------------------- 1 | 2 | VERSION := $(shell cat VERSION) 3 | ARCHS := "linux/amd64 linux/arm linux/arm64 darwin/amd64" 4 | GLIDE := $(shell command -v glide 2> /dev/null) 5 | CARPET := $(shell command -v go-carpet 2> /dev/null) 6 | MT := $(shell command -v multitail 2> /dev/null) 7 | PWD := $(shell cd .. && pwd) 8 | 9 | default: build 10 | 11 | setup: 12 | @echo installing gox, metalinter, reflex and mockery... 13 | @go get github.com/mitchellh/gox 14 | @go get github.com/alecthomas/gometalinter 15 | @go get github.com/cespare/reflex/... 16 | @go get github.com/vektra/mockery/... 17 | @echo installing carpet and glide... 18 | ifndef CARPET 19 | @brew tap msoap/tools 20 | @brew install go-carpet 21 | endif 22 | ifndef GLIDE 23 | @brew install glide 24 | endif 25 | ifndef MT 26 | @brew install multitail 27 | endif 28 | 29 | mocks: 30 | @mockery -name Countable 31 | 32 | install: 33 | @glide install 34 | 35 | watch: 36 | @multitail -cT ANSI -l "reflex -r '\.go' make test" \ 37 | -cT ANSI -l "reflex -r '\.go' make lint" \ 38 | 39 | lint: 40 | @gometalinter --deadline=15s 41 | 42 | test: 43 | @go test -cover 44 | 45 | bench: 46 | @go test -check.b -check.bmem 47 | 48 | coverage: 49 | @go-carpet 50 | 51 | build: 52 | @go build 53 | 54 | release: 55 | @LDFLAGS='-X main.VERSION=${VERSION}' gox -osarch=${ARCHS} -output=build/{{.Dir}}_v${VERSION}_{{.OS}}_{{.Arch}}/{{.Dir}} 56 | @cd build && find . -type d -mindepth 1 -exec tar czf {}.tar.gz {} \; 57 | @rm -rf release 58 | @mkdir release 59 | @mv build/*.tar.gz release/ 60 | @rm -rf build 61 | ls -la release 62 | 63 | brew_sha: 64 | @ls release | grep darwin | xargs -I{} shasum -a 256 release/{} 65 | 66 | eject: 67 | @echo Ejecting will remove traces of go-cli-starter and 68 | @echo use your own project name. 69 | @echo 70 | @echo We will *reset the git history* for this repo. 71 | @echo 72 | @echo If you committed changes, you have done so for 73 | @echo the original go-cli-stater. 74 | @echo If so, feel free to bail out now with Ctrl-C and fix it. 75 | @echo 76 | @read -p "Project name (Ctrl-C to abort): " name; \ 77 | echo ejecting into $$name; \ 78 | sed -E -i '' "s/go-cli-starter/$$name/" *.go; \ 79 | rm -rf .git; git init .; git add .; git commit -am "initial import";\ 80 | cd ..; mv go-cli-starter $$name; \ 81 | echo; echo Done. please reset your shell with:;\ 82 | echo \ 83 | ;echo cd ..\ 84 | ;echo cd $$name 85 | 86 | .PHONY: test build release setup install watch lint mocks coverage eject bench brew_sha 87 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Go CLI Starter 2 | 3 | This is a Go based command line interface starter app (CLI). 4 | 5 | Included: 6 | 7 | * Dependency management: Glide 8 | * Testing/Mocking: `gocheck`, `testify/mock`, `mockery` for generation. 9 | * CLI Opts: `flag` (stdlib) or `kingpin` for POSIX. 10 | * Packaging: cross-compilation and release packaging 11 | 12 | Tools: 13 | 14 | * Lint with `metalinter` 15 | * Coverage with `go-carpet` 16 | 17 | ## Quick Start 18 | 19 | Clone this project: 20 | 21 | ```bash 22 | $ git clone https://github.com/jondot/go-cli-starter 23 | $ cd go-cli-starter 24 | ``` 25 | 26 | Setup: 27 | 28 | ```bash 29 | $ make setup 30 | $ make install 31 | ``` 32 | 33 | Explore: 34 | 35 | ``` 36 | $ make lint 37 | $ make test 38 | $ make coverage 39 | $ make mocks 40 | $ make watch 41 | ``` 42 | 43 | Make it your own: 44 | 45 | ``` 46 | $ make eject 47 | ``` 48 | 49 | 50 | # Contributing 51 | 52 | Fork, implement, add tests, pull request, get my everlasting thanks and a respectable place here :). 53 | 54 | 55 | # Copyright 56 | 57 | Copyright (c) 2014 [Dotan Nahum](http://gplus.to/dotan) [@jondot](http://twitter.com/jondot). See MIT-LICENSE for further details. 58 | 59 | 60 | 61 | -------------------------------------------------------------------------------- /VERSION: -------------------------------------------------------------------------------- 1 | 0.0.1 2 | -------------------------------------------------------------------------------- /farble.go: -------------------------------------------------------------------------------- 1 | package main 2 | 3 | import ( 4 | "fmt" 5 | ) 6 | 7 | //Countable fixme 8 | type Countable interface { 9 | Inc() int 10 | } 11 | 12 | //Counter fixme 13 | type Counter struct { 14 | count int 15 | } 16 | 17 | //Inc fixme 18 | func (c *Counter) Inc() int { 19 | c.count = c.count + 1 20 | return c.count 21 | } 22 | 23 | //Farble fixme 24 | type Farble struct { 25 | Froop int 26 | Metric Countable 27 | } 28 | 29 | //NewFarble fixme 30 | func NewFarble(c Countable) *Farble { 31 | return &Farble{Metric: c} 32 | } 33 | 34 | //Bumple fixme 35 | func (f *Farble) Bumple() { 36 | fmt.Printf("Cool numbers: %v, Froop: %v", f.Metric.Inc(), f.Froop) 37 | } 38 | -------------------------------------------------------------------------------- /farble_test.go: -------------------------------------------------------------------------------- 1 | package main 2 | 3 | import ( 4 | "github.com/jondot/go-cli-starter/mocks" 5 | . "gopkg.in/check.v1" 6 | ) 7 | 8 | // benchmarks 9 | func (s *CLISuite) BenchmarkIface(c *C) { 10 | for i := 0; i < c.N; i++ { 11 | f := NewFarble(&Counter{}) 12 | f.Metric.Inc() 13 | } 14 | } 15 | 16 | // tests 17 | func (s *CLISuite) TestFarble(c *C) { 18 | f := NewFarble(&Counter{}) 19 | c.Check(f.Metric.Inc(), Equals, 1) 20 | } 21 | 22 | func (s *CLISuite) TestFarbleWithMock(c *C) { 23 | m := new(mocks.Countable) 24 | m.On("Inc").Return(42) 25 | f := NewFarble(m) 26 | c.Check(f.Metric.Inc(), Equals, 42) 27 | } 28 | -------------------------------------------------------------------------------- /glide.lock: -------------------------------------------------------------------------------- 1 | hash: 81c21dc218d8f3ac1b05dc972e62a18d361e7dd096d1d86501ec43c353e31e87 2 | updated: 2018-09-21T11:04:27.548341+03:00 3 | imports: 4 | - name: github.com/alecthomas/template 5 | version: a0175ee3bccc567396460bf5acd36800cb10c49c 6 | subpackages: 7 | - parse 8 | - name: github.com/alecthomas/units 9 | version: 2efee857e7cfd4f3d0138cc3cbb1b4966962b93a 10 | - name: github.com/davecgh/go-spew 11 | version: 2df174808ee097f90d259e432cc04442cf60be21 12 | subpackages: 13 | - spew 14 | - name: github.com/pmezard/go-difflib 15 | version: d8ed2627bdf02c080bf22230dbb337003b7aba2d 16 | subpackages: 17 | - difflib 18 | - name: github.com/stretchr/objx 19 | version: cbeaeb16a013161a98496fad62933b1d21786672 20 | - name: github.com/stretchr/testify 21 | version: f390dcf405f7b83c997eac1b06768bb9f44dec18 22 | subpackages: 23 | - assert 24 | - mock 25 | - name: gopkg.in/alecthomas/kingpin.v2 26 | version: 947dcec5ba9c011838740e680966fd7087a71d0d 27 | testImports: 28 | - name: github.com/jondot/go-cli-starter 29 | version: c273436aa331891c9fd1c6bebc9006b16de0a27b 30 | subpackages: 31 | - mocks 32 | - name: gopkg.in/check.v1 33 | version: 4f90aeace3a26ad7021961c297b22c42160c7b25 34 | -------------------------------------------------------------------------------- /glide.yaml: -------------------------------------------------------------------------------- 1 | package: . 2 | import: 3 | - package: gopkg.in/alecthomas/kingpin.v2 4 | version: ~2.2.2 5 | testImport: 6 | - package: gopkg.in/check.v1 7 | - package: github.com/stretchr/testify 8 | subpackages: 9 | - mock 10 | -------------------------------------------------------------------------------- /main.go: -------------------------------------------------------------------------------- 1 | package main 2 | 3 | import ( 4 | "flag" 5 | "gopkg.in/alecthomas/kingpin.v2" 6 | ) 7 | 8 | // or kingpin for nicer CLI 9 | 10 | // VERSION gets overwritten by release target 11 | var VERSION = "dev" 12 | var _ = VERSION 13 | 14 | var ip = flag.Int("flagname", 1234, "help message for flagname") 15 | var debug = kingpin.Flag("debug", "Enable debug mode.").Bool() 16 | 17 | func main() { 18 | flag.Parse() 19 | app := kingpin.New("completion", "My application with bash completion.") 20 | 21 | f := NewFarble(&Counter{}) 22 | 23 | f.Bumple() 24 | 25 | //kingpin.Parse() 26 | println(*ip) 27 | 28 | } 29 | -------------------------------------------------------------------------------- /main_test.go: -------------------------------------------------------------------------------- 1 | package main 2 | 3 | import ( 4 | . "gopkg.in/check.v1" 5 | ) 6 | 7 | type CLISuite struct{} 8 | 9 | var _ = Suite(&CLISuite{}) 10 | 11 | func (s *CLISuite) TestFoobar(c *C) { 12 | //should fail - fix me! 13 | c.Check(42, Equals, 42) 14 | } 15 | -------------------------------------------------------------------------------- /mocks/Countable.go: -------------------------------------------------------------------------------- 1 | package mocks 2 | 3 | import "github.com/stretchr/testify/mock" 4 | 5 | // Countable is an autogenerated mock type for the Countable type 6 | type Countable struct { 7 | mock.Mock 8 | } 9 | 10 | // Inc provides a mock function with given fields: 11 | func (_m *Countable) Inc() int { 12 | ret := _m.Called() 13 | 14 | var r0 int 15 | if rf, ok := ret.Get(0).(func() int); ok { 16 | r0 = rf() 17 | } else { 18 | r0 = ret.Get(0).(int) 19 | } 20 | 21 | return r0 22 | } 23 | -------------------------------------------------------------------------------- /test_helper_test.go: -------------------------------------------------------------------------------- 1 | package main 2 | import ( 3 | "testing" 4 | . "gopkg.in/check.v1" 5 | ) 6 | 7 | func Test(t *testing.T){ TestingT(t) } 8 | 9 | 10 | 11 | --------------------------------------------------------------------------------