diff --git a/.github/dependabot.yml b/.github/dependabot.yml new file mode 100644 index 0000000..1649de1 --- /dev/null +++ b/.github/dependabot.yml @@ -0,0 +1,21 @@ +version: 2 +updates: + # Maintain golang dependencies defined in go.mod + # These would open PR, these PR would be tested with the CI + # They will have to be merged manually by a maintainer + - package-ecosystem: "gomod" + directory: "/" + open-pull-requests-limit: 10 # avoid spam, if no one reacts + schedule: + interval: "daily" + time: "11:00" + + # Maintain dependencies for GitHub Actions + # These would open PR, these PR would be tested with the CI + # They will have to be merged manually by a maintainer + - package-ecosystem: "github-actions" + directory: "/" + open-pull-requests-limit: 10 # avoid spam, if no one reacts + schedule: + interval: "daily" + time: "11:00" diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml new file mode 100644 index 0000000..6bea658 --- /dev/null +++ b/.github/workflows/ci.yml @@ -0,0 +1,40 @@ +name: CI + +on: + push: + branches: [ master ] + tags: [ v* ] + pull_request: + types: [opened, synchronize, reopened] + +permissions: + contents: read + # Optional: allow read access to pull request. Use with `only-new-issues` option. + pull-requests: read + # Optional: allow write access to checks to allow the action to annotate code in the PR. + checks: write + +jobs: + test: + strategy: + matrix: + go-version: [stable] + platform: [ubuntu-latest] + runs-on: ${{ matrix.platform }} + steps: + - name: Install Go + uses: actions/setup-go@v5 + with: + go-version: ${{ matrix.go-version }} + + - name: Checkout + uses: actions/checkout@v4 + + - name: Run tests with race detector + run: go test -count=1 -race ./... + + - name: Run golangci-lint + uses: golangci/golangci-lint-action@v6 + with: + only-new-issues: true # this should be removed at some point, but there are too many issues to address + version: latest \ No newline at end of file diff --git a/.github/workflows/spellchecker.yml b/.github/workflows/spellchecker.yml new file mode 100644 index 0000000..002aa26 --- /dev/null +++ b/.github/workflows/spellchecker.yml @@ -0,0 +1,14 @@ +name: spell checking +on: [pull_request] + +jobs: + typos: + name: Spell Check with Typos + runs-on: ubuntu-latest + steps: + - name: Checkout Actions Repository + uses: actions/checkout@v4 + + - name: typos-action + uses: crate-ci/typos@v1.21.0 + diff --git a/.gitignore b/.gitignore index 4303775..971889a 100644 --- a/.gitignore +++ b/.gitignore @@ -26,3 +26,4 @@ go.work # End of https://www.toptal.com/developers/gitignore/api/go pman +coverage.out diff --git a/.golangci.yaml b/.golangci.yaml new file mode 100644 index 0000000..b96f97a --- /dev/null +++ b/.golangci.yaml @@ -0,0 +1,230 @@ +--- +# Options for analysis running. +run: + # Timeout for analysis, e.g. 30s, 5m. + # Default: 1m + timeout: 5m + + # Include test files or not. + # Default: true + tests: true + +issues: + # Maximum issues count per one linter. + # Set to 0 to disable. + # Default: 50 + max-issues-per-linter: 0 + # Maximum count of issues with the same text. + # Set to 0 to disable. + # Default: 3 + max-same-issues: 0 + +linters: + enable: + # check when errors are compared without errors.Is + - errorlint + + # check imports order and makes it always deterministic. + - gci + + # linter to detect errors invalid key values count + - loggercheck + + # Very Basic spell error checker + - misspell + + # Forbid some imports + - depguard + + # simple security check + - gosec + + # Copyloopvar is a linter detects places where loop variables are copied. + # this hack was needed before golang 1.22 + - copyloopvar + + # Fast, configurable, extensible, flexible, and beautiful linter for Go. + # Drop-in replacement of golint. + - revive + + # Finds sending http request without context.Context + - noctx + + # make sure to use t.Helper() when needed + - thelper + + # make sure that error are checked after a rows.Next() + - rowserrcheck + + # Checks that sql.Rows, sql.Stmt, sqlx.NamedStmt, pgx.Query are closed. + - sqlclosecheck + + # ensure that lint exceptions have explanations. Consider the case below: + - nolintlint + + # detect duplicated words in code + - dupword + + # detect the possibility to use variables/constants from the Go standard library. + - usestdlibvars + + # mirror suggests rewrites to avoid unnecessary []byte/string conversion + - mirror + + # testify checks good usage of github.com/stretchr/testify. + - testifylint + + # Check whether the function uses a non-inherited context. + - contextcheck + + # We already identified we don't want these ones + # - gochecknoinit + # - goerr113 # errorlint is better + # - testpackage + +linters-settings: + # configure the golang imports we don't want + depguard: + rules: + # Name of a rule. + main: + # Packages that are not allowed where the value is a suggestion. + deny: + - pkg: "github.com/pkg/errors" + desc: Should be replaced by standard lib errors package + + - pkg: "golang.org/x/net/context" + desc: Should be replaced by standard lib context package + + + loggercheck: # invalid key values count + require-string-key: true + # Require printf-like format specifier (%s, %d for example) not present. + # Default: false + no-printf-like: true + + nolintlint: + # Disable to ensure that all nolint directives actually have an effect. + # Default: false + allow-unused: true + # Enable to require an explanation of nonzero length + # after each nolint directive. + # Default: false + require-explanation: true + # Enable to require nolint directives to mention the specific + # linter being suppressed. + # Default: false + require-specific: true + + # define the import orders + gci: + sections: + # Standard section: captures all standard packages. + - standard + # Default section: catchall that is not standard or custom + - default + # linters that related to local tool, so they should be separated + - localmodule + + staticcheck: + # SAxxxx checks in https://staticcheck.io/docs/configuration/options/#checks + checks: ["all"] + + revive: + enable-all-rules: true + rules: + # we must provide configuration for linter that requires them + # enable-all-rules is OK, but many revive linters expect configuration + # and cannot work without them + + # https://github.com/mgechev/revive/blob/master/RULES_DESCRIPTIONS.md#cognitive-complexity + - name: cognitive-complexity + severity: warning + arguments: [7] + disabled: true # it would require a big refactoring, disabled for now + + # https://github.com/mgechev/revive/blob/master/RULES_DESCRIPTIONS.md#context-as-argument + - name: context-as-argument + arguments: + - allowTypesBefore: "*testing.T" + + # https://github.com/mgechev/revive/blob/master/RULES_DESCRIPTIONS.md#cyclomatic + - name: cyclomatic + arguments: [3] + disabled: true # it would require a big refactoring, disabled for now + + + # https://github.com/mgechev/revive/blob/master/RULES_DESCRIPTIONS.md#exported + - name: exported + arguments: + # enables checking public methods of private types + - "checkPrivateReceivers" + # make error messages clearer + - "sayRepetitiveInsteadOfStutters" + + # this linter completes errcheck linter, it will report method called without handling the error + # https://github.com/mgechev/revive/blob/master/RULES_DESCRIPTIONS.md#unhandled-error + - name: unhandled-error + arguments: # here are the exceptions we don't want to be reported + - "fmt.Print.*" + - "fmt.Fprint.*" + - "bytes.Buffer.Write" + - "bytes.Buffer.WriteByte" + - "bytes.Buffer.WriteString" + - "strings.Builder.WriteString" + - "strings.Builder.WriteRune" + + # boolean parameters that create a control coupling could be useful + # but this one is way too noisy + # https://github.com/mgechev/revive/blob/master/RULES_DESCRIPTIONS.md#flag-parameter + - name: flag-parameter + disabled: true + + # depguard linter is easier to configure and more powerful + # than revive.imports-blocklist + # https://github.com/mgechev/revive/blob/master/RULES_DESCRIPTIONS.md#imports-blocklist + - name: imports-blocklist + disabled: true + + # it's not really a problem for us in term of readability + # https://github.com/mgechev/revive/blob/master/RULES_DESCRIPTIONS.md#nested-structs + - name: nested-structs + disabled: true + + # https://github.com/mgechev/revive/blob/master/RULES_DESCRIPTIONS.md#add-constant + # too noisy + - name: add-constant + disabled: true + + # too many false positive on jqp code + - name: modifies-value-receiver + disabled: true + + # disable everything we don't want + - name: line-length-limit + disabled: true + - name: argument-limit + disabled: true + - name: banned-characters + disabled: true + - name: max-public-structs + disabled: true + - name: function-result-limit + disabled: true + - name: function-length + disabled: true + - name: file-header + disabled: true + - name: empty-lines + disabled: true + + misspell: + locale: "US" # Fix the colour => color, and co + + +output: + # Make issues output unique by line. + # Default: true + # Note: unique in this case means that you can have at most 1 issue per line of code. + # one issue with a given line and we want to see them all at once. + uniq-by-line: false diff --git a/go.mod b/go.mod index 945d5d4..cb0e9c2 100644 --- a/go.mod +++ b/go.mod @@ -4,14 +4,14 @@ go 1.22.2 require ( github.com/charmbracelet/bubbles v0.18.0 - github.com/charmbracelet/bubbletea v0.25.0 + github.com/charmbracelet/bubbletea v0.26.2 github.com/charmbracelet/glamour v0.7.0 github.com/charmbracelet/lipgloss v0.10.0 github.com/spf13/cobra v1.8.0 github.com/stretchr/testify v1.8.1 github.com/thoas/go-funk v0.9.3 - go.etcd.io/bbolt v1.3.9 - golang.org/x/text v0.14.0 + go.etcd.io/bbolt v1.3.10 + golang.org/x/text v0.15.0 ) require ( @@ -19,9 +19,9 @@ require ( github.com/atotto/clipboard v0.1.4 // indirect github.com/aymanbagabas/go-osc52/v2 v2.0.1 // indirect github.com/aymerick/douceur v0.2.0 // indirect - github.com/containerd/console v1.0.4 // indirect github.com/davecgh/go-spew v1.1.1 // indirect github.com/dlclark/regexp2 v1.11.0 // indirect + github.com/erikgeiser/coninput v0.0.0-20211004153227-1c3628e74d0f // indirect github.com/gorilla/css v1.0.1 // indirect github.com/inconshreveable/mousetrap v1.1.0 // indirect github.com/lucasb-eyer/go-colorful v1.2.0 // indirect @@ -42,7 +42,7 @@ require ( github.com/yuin/goldmark-emoji v1.0.2 // indirect golang.org/x/net v0.24.0 // indirect golang.org/x/sync v0.7.0 // indirect - golang.org/x/sys v0.19.0 // indirect - golang.org/x/term v0.19.0 // indirect + golang.org/x/sys v0.20.0 // indirect + golang.org/x/term v0.20.0 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect ) diff --git a/go.sum b/go.sum index 79e3b95..96a1f5f 100644 --- a/go.sum +++ b/go.sum @@ -14,20 +14,20 @@ github.com/aymerick/douceur v0.2.0 h1:Mv+mAeH1Q+n9Fr+oyamOlAkUNPWPlA8PPGR0QAaYuP github.com/aymerick/douceur v0.2.0/go.mod h1:wlT5vV2O3h55X9m7iVYN0TBM0NH/MmbLnd30/FjWUq4= github.com/charmbracelet/bubbles v0.18.0 h1:PYv1A036luoBGroX6VWjQIE9Syf2Wby2oOl/39KLfy0= github.com/charmbracelet/bubbles v0.18.0/go.mod h1:08qhZhtIwzgrtBjAcJnij1t1H0ZRjwHyGsy6AL11PSw= -github.com/charmbracelet/bubbletea v0.25.0 h1:bAfwk7jRz7FKFl9RzlIULPkStffg5k6pNt5dywy4TcM= -github.com/charmbracelet/bubbletea v0.25.0/go.mod h1:EN3QDR1T5ZdWmdfDzYcqOCAps45+QIJbLOBxmVNWNNg= +github.com/charmbracelet/bubbletea v0.26.2 h1:Eeb+n75Om9gQ+I6YpbCXQRKHt5Pn4vMwusQpwLiEgJQ= +github.com/charmbracelet/bubbletea v0.26.2/go.mod h1:6I0nZ3YHUrQj7YHIHlM8RySX4ZIthTliMY+W8X8b+Gs= github.com/charmbracelet/glamour v0.7.0 h1:2BtKGZ4iVJCDfMF229EzbeR1QRKLWztO9dMtjmqZSng= github.com/charmbracelet/glamour v0.7.0/go.mod h1:jUMh5MeihljJPQbJ/wf4ldw2+yBP59+ctV36jASy7ps= github.com/charmbracelet/lipgloss v0.10.0 h1:KWeXFSexGcfahHX+54URiZGkBFazf70JNMtwg/AFW3s= github.com/charmbracelet/lipgloss v0.10.0/go.mod h1:Wig9DSfvANsxqkRsqj6x87irdy123SR4dOXlKa91ciE= -github.com/containerd/console v1.0.4 h1:F2g4+oChYvBTsASRTz8NP6iIAi97J3TtSAsLbIFn4ro= -github.com/containerd/console v1.0.4/go.mod h1:YynlIjWYF8myEu6sdkwKIvGQq+cOckRm6So2avqoYAk= github.com/cpuguy83/go-md2man/v2 v2.0.3/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/dlclark/regexp2 v1.11.0 h1:G/nrcoOa7ZXlpoa/91N3X7mM3r8eIlMBBJZvsz/mxKI= github.com/dlclark/regexp2 v1.11.0/go.mod h1:DHkYz0B9wPfa6wondMfaivmHpzrQ3v9q8cnmRbL6yW8= +github.com/erikgeiser/coninput v0.0.0-20211004153227-1c3628e74d0f h1:Y/CXytFA4m6baUTXGLOoWe4PQhGxaX0KpnayAqC48p4= +github.com/erikgeiser/coninput v0.0.0-20211004153227-1c3628e74d0f/go.mod h1:vw97MGsxSvLiUE2X8qFplwetxpGLQrlU1Q9AUEIzCaM= github.com/gorilla/css v1.0.1 h1:ntNaBIghp6JmvWnxbZKANoLyuXTPZ4cAMlo6RyhlbO8= github.com/gorilla/css v1.0.1/go.mod h1:BvnYkspnSzMmwRK+b8/xgNPLiIuNZr6vbZBTPQ2A3b0= github.com/hexops/gotextdiff v1.0.3 h1:gitA9+qJrrTCsiCl7+kh75nPqQt1cx4ZkudSTLoUqJM= @@ -86,20 +86,20 @@ github.com/yuin/goldmark v1.7.1 h1:3bajkSilaCbjdKVsKdZjZCLBNPL9pYzrCakKaf4U49U= github.com/yuin/goldmark v1.7.1/go.mod h1:uzxRWxtg69N339t3louHJ7+O03ezfj6PlliRlaOzY1E= github.com/yuin/goldmark-emoji v1.0.2 h1:c/RgTShNgHTtc6xdz2KKI74jJr6rWi7FPgnP9GAsO5s= github.com/yuin/goldmark-emoji v1.0.2/go.mod h1:RhP/RWpexdp+KHs7ghKnifRoIs/Bq4nDS7tRbCkOwKY= -go.etcd.io/bbolt v1.3.9 h1:8x7aARPEXiXbHmtUwAIv7eV2fQFHrLLavdiJ3uzJXoI= -go.etcd.io/bbolt v1.3.9/go.mod h1:zaO32+Ti0PK1ivdPtgMESzuzL2VPoIG1PCQNvOdo/dE= +go.etcd.io/bbolt v1.3.10 h1:+BqfJTcCzTItrop8mq/lbzL8wSGtj94UO/3U31shqG0= +go.etcd.io/bbolt v1.3.10/go.mod h1:bK3UQLPJZly7IlNmV7uVHJDxfe5aK9Ll93e/74Y9oEQ= golang.org/x/net v0.24.0 h1:1PcaxkF854Fu3+lvBIx5SYn9wRlBzzcnHZSiaFFAb0w= golang.org/x/net v0.24.0/go.mod h1:2Q7sJY5mzlzWjKtYUEXSlBWCdyaioyXzRB2RtU8KVE8= golang.org/x/sync v0.7.0 h1:YsImfSBoP9QPYL0xyKJPq0gcaJdG3rInoqxTWbfQu9M= golang.org/x/sync v0.7.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= -golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210809222454-d867a43fc93e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.19.0 h1:q5f1RH2jigJ1MoAWp2KTp3gm5zAGFUTarQZ5U386+4o= -golang.org/x/sys v0.19.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= -golang.org/x/term v0.19.0 h1:+ThwsDv+tYfnJFhF4L8jITxu1tdTWRTZpdsWgEgjL6Q= -golang.org/x/term v0.19.0/go.mod h1:2CuTdWZ7KHSQwUzKva0cbMg6q2DMI3Mmxp+gKJbskEk= -golang.org/x/text v0.14.0 h1:ScX5w1eTa3QqT8oi6+ziP7dTV1S2+ALU0bI+0zXKWiQ= -golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= +golang.org/x/sys v0.20.0 h1:Od9JTbYCk261bKm4M/mw7AklTlFYIa0bIp9BgSm1S8Y= +golang.org/x/sys v0.20.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/term v0.20.0 h1:VnkxpohqXaOBYJtBmEppKUG6mXpi+4O6purfc2+sMhw= +golang.org/x/term v0.20.0/go.mod h1:8UkIAJTvZgivsXaD6/pH6U9ecQzZ45awqEOzuCvwpFY= +golang.org/x/text v0.15.0 h1:h1V/4gjBv8v9cjcR6+AR5+/cIYK5N/WAgiv4xlsEtAk= +golang.org/x/text v0.15.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405 h1:yhCVgyC4o1eVCa2tZl7eS0r+SDo693bJlVdllGtEeKM= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=