diff --git a/.github/workflows/test.yaml b/.github/workflows/test.yaml new file mode 100644 index 0000000..a1b5b19 --- /dev/null +++ b/.github/workflows/test.yaml @@ -0,0 +1,69 @@ +--- +name: Test + +on: + push: + branches: + - main + pull_request: + branches: + - main + +permissions: + pull-requests: write + contents: read + +jobs: + tests: + runs-on: ubuntu-latest + timeout-minutes: 5 + + steps: + - name: Checkout + uses: actions/checkout@v4 + with: + fetch-depth: 0 + lfs: true + + - name: Fetch and checkout LFS objects + run: | + git lfs fetch --all + git lfs checkout + + - uses: jdx/mise-action@v3 + with: + install: true + + - name: Install deps + run: mise run install + + - name: Run post-commit + run: mise run post-commit + + - name: Unit tests + run: mise run test_unit + + - name: End to end tests + run: mise run test_e2e + + - name: Create coverage artifact + run: mise run coverage + + - name: Generate code coverage report + uses: irongut/CodeCoverageSummary@v1.3.0 + with: + filename: coverage.xml + badge: false + fail_below_min: false + format: markdown + hide_branch_rate: false + hide_complexity: true + indicators: true + output: both + + - name: Add Coverage PR Comment + uses: marocchino/sticky-pull-request-comment@v2 + if: github.event_name == 'pull_request' + with: + recreate: true + path: code-coverage-results.md diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index bdd3f1f..c4effa2 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -17,12 +17,26 @@ repos: rev: 0.2.1 hooks: - id: yamlfmt - - repo: https://github.com/tekwizely/pre-commit-golang - rev: v1.0.0-rc.2 - hooks: - - id: go-fmt - - id: golangci-lint-repo-mod - repo: https://github.com/crate-ci/typos rev: v1.35.6 hooks: - id: typos + - repo: https://github.com/ComPWA/taplo-pre-commit + rev: v0.9.3 + hooks: + - id: taplo-format + - id: taplo-lint + - repo: local + hooks: + - id: mise-lint + name: mise lint + entry: mise + args: [run, lint] + language: system + pass_filenames: false + - id: mise-fmt + name: mise format + entry: mise + args: [run, fmt] + language: system + pass_filenames: false diff --git a/go.mod b/go.mod index 66e997d..6a2cec9 100644 --- a/go.mod +++ b/go.mod @@ -27,21 +27,25 @@ require ( github.com/fatih/color v1.18.0 // indirect github.com/fsnotify/fsnotify v1.9.0 // indirect github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510 // indirect + github.com/kr/pretty v0.3.1 // indirect github.com/lucasb-eyer/go-colorful v1.3.0 // indirect - github.com/mattn/go-colorable v0.1.13 // indirect + github.com/mattn/go-colorable v0.1.14 // indirect github.com/mattn/go-isatty v0.0.20 // indirect github.com/mattn/go-runewidth v0.0.19 // indirect github.com/muesli/cancelreader v0.2.2 // indirect github.com/pmezard/go-difflib v1.0.0 // indirect github.com/rivo/uniseg v0.4.7 // indirect + github.com/rogpeppe/go-internal v1.14.1 // indirect github.com/t-yuki/gocover-cobertura v0.0.0-20180217150009-aaee18c8195c // indirect github.com/wadey/gocovmerge v0.0.0-20160331181800-b5bfa59ec0ad // indirect github.com/xo/terminfo v0.0.0-20220910002029-abceb7e1c41e // indirect + golang.org/x/exp v0.0.0-20240909161429-701f63a606c0 // indirect golang.org/x/mod v0.27.0 // indirect golang.org/x/sync v0.17.0 // indirect golang.org/x/term v0.35.0 // indirect - golang.org/x/text v0.17.0 // indirect + golang.org/x/text v0.22.0 // indirect golang.org/x/tools v0.36.0 // indirect + gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c // indirect gopkg.in/yaml.v3 v3.0.1 // indirect gotest.tools/gotestsum v1.13.0 // indirect ) diff --git a/go.sum b/go.sum index 2dd56e2..61aee65 100644 --- a/go.sum +++ b/go.sum @@ -24,6 +24,7 @@ github.com/charmbracelet/x/xpty v0.1.3 h1:eGSitii4suhzrISYH50ZfufV3v085BXQwIytcO github.com/charmbracelet/x/xpty v0.1.3/go.mod h1:poPYpWuLDBFCKmKLDnhBp51ATa0ooD8FhypRwEFtH3Y= github.com/clipperhouse/uax29/v2 v2.2.0 h1:ChwIKnQN3kcZteTXMgb1wztSgaU+ZemkgWdohwgs8tY= github.com/clipperhouse/uax29/v2 v2.2.0/go.mod h1:EFJ2TJMRUaplDxHKj1qAEhCtQPW2tJSwu5BF98AuoVM= +github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= github.com/creack/pty v1.1.24 h1:bJrF4RRfyJnbTJqzRLHzcGaZK1NeM5kTC9jGgovnR1s= github.com/creack/pty v1.1.24/go.mod h1:08sCNb52WyoAwi2QDyzUCTgcvVFhUzewun7wtTfvcwE= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= @@ -38,23 +39,31 @@ github.com/google/go-cmp v0.7.0 h1:wk8382ETsv4JYUZwIsn6YpYiWiBsYLSJiTsyBybVuN8= github.com/google/go-cmp v0.7.0/go.mod h1:pXiqmnSA92OHEEa9HXL2W4E7lf9JzCmGVUdgjX3N/iU= github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510 h1:El6M4kTTCOh6aBiKaUGG7oYTSPP8MxqL4YI3kZKwcP4= github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510/go.mod h1:pupxD2MaaD3pAXIBCelhxNneeOaAeabZDe5s4K6zSpQ= +github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= +github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= +github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= +github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= +github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= +github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= +github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= github.com/lucasb-eyer/go-colorful v1.3.0 h1:2/yBRLdWBZKrf7gB40FoiKfAWYQ0lqNcbuQwVHXptag= github.com/lucasb-eyer/go-colorful v1.3.0/go.mod h1:R4dSotOR9KMtayYi1e77YzuveK+i7ruzyGqttikkLy0= -github.com/mattn/go-colorable v0.1.13 h1:fFA4WZxdEF4tXPZVKMLwD8oUnCTTo08duU7wxecdEvA= -github.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovkB8vQcUbaXHg= -github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM= +github.com/mattn/go-colorable v0.1.14 h1:9A9LHSqF/7dyVVX6g0U9cwm9pG3kP9gSzcuIPHPsaIE= +github.com/mattn/go-colorable v0.1.14/go.mod h1:6LmQG8QLFO4G5z1gPvYEzlUgJ2wF+stgPZH1UqBm1s8= github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY= github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= github.com/mattn/go-runewidth v0.0.19 h1:v++JhqYnZuu5jSKrk9RbgF5v4CGUjqRfBm05byFGLdw= github.com/mattn/go-runewidth v0.0.19/go.mod h1:XBkDxAl56ILZc9knddidhrOlY5R/pDhgLpndooCuJAs= github.com/muesli/cancelreader v0.2.2 h1:3I4Kt4BQjOR54NavqnDogx/MIoWBFa0StPA8ELUXHmA= github.com/muesli/cancelreader v0.2.2/go.mod h1:3XuTXfFS2VjM+HTLZY9Ak0l6eUKfijIfMUZ4EgX0QYo= +github.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e/go.mod h1:pJLUxLENpZxwdsKMEsNbx1VGcRFpLqf3715MtcvvzbA= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/rivo/uniseg v0.4.7 h1:WUdvkW8uEhrYfLC4ZzdpI2ztxP1I582+49Oc5Mq64VQ= github.com/rivo/uniseg v0.4.7/go.mod h1:FN3SvrM+Zdj16jyLfmOkMNblXMcoc8DfTHruCPUcx88= -github.com/rogpeppe/go-internal v1.11.0 h1:cWPaGQEPrBb5/AsnsZesgZZ9yb1OQ+GOISoDNXVBh4M= -github.com/rogpeppe/go-internal v1.11.0/go.mod h1:ddIwULY96R17DhadqLgMfk9H9tvdUzkipdSkR5nkCZA= +github.com/rogpeppe/go-internal v1.9.0/go.mod h1:WtVeX8xhTBvf0smdhujwtBcq4Qrzq/fJaraNFVN+nFs= +github.com/rogpeppe/go-internal v1.14.1 h1:UQB4HGPB6osV0SQTLymcB4TgvyWu6ZyliaW0tI/otEQ= +github.com/rogpeppe/go-internal v1.14.1/go.mod h1:MaRKkUm5W0goXpeCfT7UZI6fk/L7L7so1lCWt35ZSgc= github.com/stretchr/testify v1.11.1 h1:7s2iGBzp5EwR7/aIZr8ao5+dra3wiQyKjjFuvgVKu7U= github.com/stretchr/testify v1.11.1/go.mod h1:wZwfW3scLgRK+23gO65QZefKpKQRnfz6sD981Nm4B6U= github.com/t-yuki/gocover-cobertura v0.0.0-20180217150009-aaee18c8195c h1:+aPplBwWcHBo6q9xrfWdMrT9o4kltkmmvpemgIjep/8= @@ -63,24 +72,24 @@ github.com/wadey/gocovmerge v0.0.0-20160331181800-b5bfa59ec0ad h1:W0LEBv82YCGEtc github.com/wadey/gocovmerge v0.0.0-20160331181800-b5bfa59ec0ad/go.mod h1:Hy8o65+MXnS6EwGElrSRjUzQDLXreJlzYLlWiHtt8hM= github.com/xo/terminfo v0.0.0-20220910002029-abceb7e1c41e h1:JVG44RsyaB9T2KIHavMF/ppJZNG9ZpyihvCd0w101no= github.com/xo/terminfo v0.0.0-20220910002029-abceb7e1c41e/go.mod h1:RbqR21r5mrJuqunuUZ/Dhy/avygyECGrLceyNeo4LiM= -golang.org/x/exp v0.0.0-20231006140011-7918f672742d h1:jtJma62tbqLibJ5sFQz8bKtEM8rJBtfilJ2qTU199MI= -golang.org/x/exp v0.0.0-20231006140011-7918f672742d/go.mod h1:ldy0pHrwJyGW56pPQzzkH36rKxoZW1tw7ZJpeKx+hdo= +golang.org/x/exp v0.0.0-20240909161429-701f63a606c0 h1:e66Fs6Z+fZTbFBAxKfP3PALWBtpfqks2bwGcexMxgtk= +golang.org/x/exp v0.0.0-20240909161429-701f63a606c0/go.mod h1:2TbTHSBQa924w8M6Xs1QcRcFwyucIwBGpK1p2f1YFFY= golang.org/x/mod v0.27.0 h1:kb+q2PyFnEADO2IEF935ehFUXlWiNjJWtRNgBLSfbxQ= golang.org/x/mod v0.27.0/go.mod h1:rWI627Fq0DEoudcK+MBkNkCe0EetEaDSwJJkCcjpazc= golang.org/x/sync v0.17.0 h1:l60nONMj9l5drqw6jlhIELNv9I0A4OFgRsG9k2oT9Ug= golang.org/x/sync v0.17.0/go.mod h1:9KTHXmSnoGruLpwFjVSX0lNNA75CykiMECbovNTZqGI= -golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.36.0 h1:KVRy2GtZBrk1cBYA7MKu5bEZFxQk4NIDV6RLVcC8o0k= golang.org/x/sys v0.36.0/go.mod h1:OgkHotnGiDImocRcuBABYBEXf8A9a87e/uXjp9XT3ks= golang.org/x/term v0.35.0 h1:bZBVKBudEyhRcajGcNc3jIfWPqV4y/Kt2XcoigOWtDQ= golang.org/x/term v0.35.0/go.mod h1:TPGtkTLesOwf2DE8CgVYiZinHAOuy5AYUYT1lENIZnA= -golang.org/x/text v0.17.0 h1:XtiM5bkSOt+ewxlOE/aE/AKEHibwj/6gvWMl9Rsh0Qc= -golang.org/x/text v0.17.0/go.mod h1:BuEKDfySbSR4drPmRPG/7iBdf8hvFMuRexcpahXilzY= +golang.org/x/text v0.22.0 h1:bofq7m3/HAFvbF51jz3Q9wLg3jkvSPuiZu/pD1XwgtM= +golang.org/x/text v0.22.0/go.mod h1:YRoo4H8PVmsu+E3Ou7cqLVH8oXWIHVoX0jqUWALQhfY= golang.org/x/tools v0.36.0 h1:kWS0uv/zsvHEle1LbV5LE8QujrxB3wfQyxHfhOk0Qkg= golang.org/x/tools v0.36.0/go.mod h1:WBDiHKJK8YgLHlcQPYQzNCkUxUypCaa5ZegCVutKm+s= -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/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= +gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gotest.tools/gotestsum v1.13.0 h1:+Lh454O9mu9AMG1APV4o0y7oDYKyik/3kBOiCqiEpRo= diff --git a/mise-tasks/test_e2e b/mise-tasks/test_e2e index 6db22b8..d17b22c 100755 --- a/mise-tasks/test_e2e +++ b/mise-tasks/test_e2e @@ -1,7 +1,7 @@ #!/usr/bin/env bash #MISE description="Run go e2e tests" #MISE outputs="integration.txt" -#MISE depends="bin" +#MISE depends=["bin"] set -euo pipefail if [ "${GITHUB_ACTIONS:-}" = "true" ]; then @@ -10,4 +10,4 @@ else GOTESTSUM="gotestsum --format=pkgname-and-test-fails" fi -exec go tool ${GOTESTSUM} --rerun-fails=2 --packages="./test/..." -- -v ./test/... --count=1 -coverprofile=integration.txt -covermode count +exec go tool ${GOTESTSUM} --rerun-fails=2 --packages="./test/..." -- -v ./test/... --count=1 -coverprofile=integration.txt -covermode count -coverpkg=./... diff --git a/mise.toml b/mise.toml index a96e0ec..f9e005c 100644 --- a/mise.toml +++ b/mise.toml @@ -1,12 +1,17 @@ - [env] _.path = ['{{config_root}}/node_modules/.bin'] -_.python.venv = { path = "venv", create = true } + +[settings] +python.compile = false +experimental = true + +[hooks] +postinstall = "mise run install" [tools] go = "1.25.3" node = "24.6.0" -python = "3.9.0" +python = "3.9.14" golangci-lint = "2.4.0" [tasks."init"] @@ -30,57 +35,55 @@ sources = ["requirements.txt"] [tasks."install:go"] description = "Install golang dependencies" -run = "go mod download" +run = "go mod download all" sources = ["go.mod", "go.sum"] [tasks."install"] depends = ["install:*"] +run = ["python -m pre_commit install --install-hooks"] [tasks."commit-msg"] description = "Run commit-msg hooks" -run = [ - "npx commitlint --edit $1", -] +run = ["npx commitlint --edit $1"] [tasks."pre-commit"] description = "Run pre-commit tasks" -run = "pre-commit" +run = "python -m pre_commit" + +[tasks."post-commit"] +description = "Run post-commit tasks" +run = "{{config_root}}/scripts/post-commit" [tasks."lint"] -run = [ - "golangci-lint run", -] +run = ["golangci-lint run"] [tasks."fmt"] run = [ - "go mod tidy", - "env GOFUMPT_SPLIT_LONG_LINES=on golangci-lint fmt ./...", + "go mod tidy", + "env GOFUMPT_SPLIT_LONG_LINES=on golangci-lint fmt ./...", + "git diff --exit-code || (echo 'Code is not formatted, run mise run fmt locally' && exit 1)", ] [tasks."prepush"] depends = ["fmt", "lint", "test"] [tasks."test:config"] -run = [ - "golangci-lint config verify", -] +run = ["golangci-lint config verify"] [tasks."regenerate:e2e"] -run = [ - "go tool gotestsum -- -v ./test/... --count=1 -update", -] +run = ["go tool gotestsum -- -v ./test/... --count=1 -update"] [tasks."test"] depends = ["test:*", "test_unit", "test_e2e"] [tasks."coverage"] run = [ - "go tool gocovmerge integration.txt unit.txt > coverage.txt", - "go tool cover -html=coverage.txt -o coverage.html", - "go tool gocover-cobertura coverage.xml" + "go tool gocovmerge integration.txt unit.txt > coverage.txt", + "go tool cover -html=coverage.txt -o coverage.html", + "go tool gocover-cobertura coverage.xml", ] -sources = [ "integration.txt", "unit.txt"] +sources = ["integration.txt", "unit.txt"] outputs = ["coverage.html", "coverage.xml"] [tasks.bin-package] @@ -88,16 +91,17 @@ description = "Build bubbletea example package" run = [ "cd bin/${PACKAGE} && go build -o ./dist/${PACKAGE}", "mkdir -p ./dist", - "cp bin/${PACKAGE}/dist/${PACKAGE} ./dist/${PACKAGE}" + "cp bin/${PACKAGE}/dist/${PACKAGE} ./dist/${PACKAGE}", ] -outputs = [ "dist/${PACKAGE}" ] -sources = [ "bin/${PACKAGE}/**" ] +outputs = ["dist/${PACKAGE}"] +sources = ["bin/${PACKAGE}/**"] [tasks.bin] description = "Build all bubbletea example packages" run = [ + "mkdir -p ./dist/", "PACKAGE=editors mise run bin-package", - "PACKAGE=list mise run bin-package" + "PACKAGE=list mise run bin-package", ] outputs = ["dist/editors", "dist/list"] sources = ["bin/**"] diff --git a/scripts/post-commit b/scripts/post-commit new file mode 100755 index 0000000..aef1625 --- /dev/null +++ b/scripts/post-commit @@ -0,0 +1,15 @@ +#!/usr/bin/env bash +set -e + +FROM_REF=${CI_MERGE_REQUEST_TARGET_BRANCH_NAME:-HEAD~1} +TO_REF=HEAD + +if git rev-parse --verify "$FROM_REF" >/dev/null 2>&1; then + echo "Running pre-commit between $FROM_REF and $TO_REF" +else + echo "Fetching origin/$FROM_REF..." + git fetch origin "$FROM_REF" + FROM_REF="origin/$FROM_REF" +fi + +pre-commit run --from-ref "$FROM_REF" --to-ref "$TO_REF"