From fa1475416870cb378aaab2343a9296e8256533f7 Mon Sep 17 00:00:00 2001 From: mrustl Date: Sat, 23 May 2026 11:10:12 +0100 Subject: [PATCH] Fix install, modernize CI, add Claude integration Resolves "input string 416 is invalid" error from remotes::install_github("kwb-r/qsimVis@dev") on Windows by replacing non-ASCII (umlaut) filenames in inst/extdata/verknet/ with ASCII equivalents (Oe/Ue/Ae/oe/ue). qsimVis_ID columns in impetus mapping tables updated to match new filenames; model_IDs left unchanged to preserve compatibility with external simulation output. Workflows aligned to KWB-R/kwb.pkgbuild style: actions/checkout@v5, r-lib/actions/setup-r-dependencies@v2, codecov-action@v5, JamesIves/github-pages-deploy-action@v4.7.3. Adds claude.yaml and claude-code-review.yaml from kwb.pkgbuild (requires CLAUDE_CODE_OAUTH_TOKEN secret to be set in repo settings). Co-Authored-By: Claude Opus 4.7 (1M context) --- .Rbuildignore | 2 + .github/workflows/R-CMD-check.yaml | 57 +++++------------- .github/workflows/claude-code-review.yaml | 40 +++++++++++++ .github/workflows/claude.yaml | 38 ++++++++++++ .github/workflows/pkgdown.yaml | 59 +++++++++---------- .github/workflows/test-coverage.yaml | 55 ++++++++++------- .gitignore | 1 + .../impetus/BelinWaterModel_id_table.csv | 2 +- .../scripts/impetus/river_id_table.csv | 2 +- .../extdata/verknet/FOeH.csv | 0 .../extdata/verknet/KueK.csv | 0 .../extdata/verknet/Loe.csv | 0 .../extdata/verknet/Lue.csv | 0 .../extdata/verknet/MUeR.csv | 0 .../extdata/verknet/NAeW.csv | 0 .../extdata/verknet/Nkoe.csv | 0 .../extdata/verknet/RueG.csv | 0 .../extdata/verknet/Wue.csv | 0 18 files changed, 160 insertions(+), 96 deletions(-) create mode 100644 .github/workflows/claude-code-review.yaml create mode 100644 .github/workflows/claude.yaml rename "inst/extdata/verknet/F\303\226H.csv" => inst/extdata/verknet/FOeH.csv (100%) rename "inst/extdata/verknet/K\303\274K.csv" => inst/extdata/verknet/KueK.csv (100%) rename "inst/extdata/verknet/L\303\266.csv" => inst/extdata/verknet/Loe.csv (100%) rename "inst/extdata/verknet/L\303\274.csv" => inst/extdata/verknet/Lue.csv (100%) rename "inst/extdata/verknet/M\303\234R.csv" => inst/extdata/verknet/MUeR.csv (100%) rename "inst/extdata/verknet/N\303\204W.csv" => inst/extdata/verknet/NAeW.csv (100%) rename "inst/extdata/verknet/Nk\303\266.csv" => inst/extdata/verknet/Nkoe.csv (100%) rename "inst/extdata/verknet/R\303\274G.csv" => inst/extdata/verknet/RueG.csv (100%) rename "inst/extdata/verknet/W\303\274.csv" => inst/extdata/verknet/Wue.csv (100%) diff --git a/.Rbuildignore b/.Rbuildignore index 525a4f0..ea7fb24 100644 --- a/.Rbuildignore +++ b/.Rbuildignore @@ -9,3 +9,5 @@ ^README\.md$ ^.*\.Rproj$ ^\.Rproj\.user$ +^\.positai$ +^\.claude$ diff --git a/.github/workflows/R-CMD-check.yaml b/.github/workflows/R-CMD-check.yaml index 20bd49a..01f9c16 100644 --- a/.github/workflows/R-CMD-check.yaml +++ b/.github/workflows/R-CMD-check.yaml @@ -22,62 +22,33 @@ jobs: fail-fast: false matrix: config: - - {os: macOS-latest, r: 'release'} - - {os: ubuntu-20.04, r: 'release', rspm: "https://packagemanager.rstudio.com/cran/__linux__/focal/latest"} + - {os: macos-latest, r: 'release'} + - {os: ubuntu-latest, r: 'release'} - {os: windows-latest, r: 'devel'} - - {os: windows-latest, r: 'oldrel'} + - {os: windows-latest, r: 'oldrel-1'} - {os: windows-latest, r: 'release'} env: GITHUB_PAT: ${{ secrets.GITHUB_TOKEN }} - R_REMOTES_NO_ERRORS_FROM_WARNINGS: true - RSPM: ${{ matrix.config.rspm }} + R_KEEP_PKG_SOURCE: yes steps: - - uses: actions/checkout@v2 + - uses: actions/checkout@v5 + + - uses: r-lib/actions/setup-pandoc@v2 - uses: r-lib/actions/setup-r@v2 with: r-version: ${{ matrix.config.r }} + http-user-agent: ${{ matrix.config.http-user-agent }} use-public-rspm: true - - uses: r-lib/actions/setup-pandoc@v2 - - - name: Query dependencies - run: | - install.packages('remotes') - saveRDS(remotes::dev_package_deps(dependencies = TRUE), "depends.Rds", version = 2) - shell: Rscript {0} - - - name: Cache R packages - if: runner.os != 'Windows' - uses: actions/cache@v1 + - uses: r-lib/actions/setup-r-dependencies@v2 with: - path: ${{ env.R_LIBS_USER }} - key: ${{ runner.os }}-r-${{ matrix.config.r }}-3-${{ hashFiles('depends.Rds') }} - restore-keys: ${{ runner.os }}-r-${{ matrix.config.r }}-3- - - - name: Install system dependencies - if: runner.os == 'Linux' - env: - RHUB_PLATFORM: linux-x86_64-ubuntu-gcc - run: | - Rscript -e "remotes::install_github('r-hub/sysreqs')" - sysreqs=$(Rscript -e "cat(sysreqs::sysreq_commands('DESCRIPTION'))") - sudo -s eval "$sysreqs" - - name: Install dependencies - run: | - remotes::install_deps(dependencies = TRUE) - remotes::install_cran("rcmdcheck") - shell: Rscript {0} - - - name: Check - run: rcmdcheck::rcmdcheck(args = "--no-manual", error_on = "warning", check_dir = "check") - shell: Rscript {0} + extra-packages: any::rcmdcheck + needs: check - - name: Upload check results - if: failure() - uses: actions/upload-artifact@main + - uses: r-lib/actions/check-r-package@v2 with: - name: ${{ runner.os }}-r${{ matrix.config.r }}-results - path: check + upload-snapshots: true + args: 'c("--no-manual", "--as-cran")' diff --git a/.github/workflows/claude-code-review.yaml b/.github/workflows/claude-code-review.yaml new file mode 100644 index 0000000..9d02933 --- /dev/null +++ b/.github/workflows/claude-code-review.yaml @@ -0,0 +1,40 @@ +name: Claude Code Review + +on: + pull_request: + types: [opened, synchronize] + +jobs: + claude-review: + runs-on: ubuntu-latest + permissions: + contents: read + pull-requests: read + issues: read + id-token: write + + steps: + - name: Checkout repository + uses: actions/checkout@v5 + with: + fetch-depth: 1 + + - name: Run Claude Code Review + id: claude-review + uses: anthropics/claude-code-action@v1 + with: + claude_code_oauth_token: ${{ secrets.CLAUDE_CODE_OAUTH_TOKEN }} + prompt: | + REPO: ${{ github.repository }} + PR NUMBER: ${{ github.event.pull_request.number }} + + Please review this pull request and think hard about correctness, + edge cases, and consistency with the rest of the codebase. Use the + repository's CLAUDE.md for guidance if available. + Focus on: + - Code quality and R package best practices + - Potential bugs or logic issues + - Test coverage + - Documentation (roxygen2) completeness + - Consistency with the existing codebase + claude_args: '--model claude-opus-4-7 --allowed-tools "mcp__github_inline_comment__create_inline_comment,Bash(gh issue view:*),Bash(gh search:*),Bash(gh issue list:*),Bash(gh pr comment:*),Bash(gh pr diff:*),Bash(gh pr view:*),Bash(gh pr list:*)"' diff --git a/.github/workflows/claude.yaml b/.github/workflows/claude.yaml new file mode 100644 index 0000000..2da55d5 --- /dev/null +++ b/.github/workflows/claude.yaml @@ -0,0 +1,38 @@ +name: Claude Code + +on: + issue_comment: + types: [created] + pull_request_review_comment: + types: [created] + issues: + types: [opened, assigned] + pull_request_review: + types: [submitted] + +jobs: + claude: + if: | + (github.event_name == 'issue_comment' && contains(github.event.comment.body, '@claude')) || + (github.event_name == 'pull_request_review_comment' && contains(github.event.comment.body, '@claude')) || + (github.event_name == 'pull_request_review' && contains(github.event.review.body, '@claude')) || + (github.event_name == 'issues' && (contains(github.event.issue.body, '@claude') || contains(github.event.issue.title, '@claude'))) + runs-on: ubuntu-latest + permissions: + contents: read + pull-requests: read + issues: read + id-token: write + actions: read + steps: + - name: Checkout repository + uses: actions/checkout@v5 + with: + fetch-depth: 1 + + - name: Run Claude Code + id: claude + uses: anthropics/claude-code-action@v1 + with: + claude_code_oauth_token: ${{ secrets.CLAUDE_CODE_OAUTH_TOKEN }} + claude_args: '--model claude-opus-4-7' diff --git a/.github/workflows/pkgdown.yaml b/.github/workflows/pkgdown.yaml index ac3ba07..0f43b34 100644 --- a/.github/workflows/pkgdown.yaml +++ b/.github/workflows/pkgdown.yaml @@ -4,50 +4,49 @@ on: - main - master - dev + pull_request: + branches: + - main + - master + - dev + release: + types: [published] + workflow_dispatch: name: pkgdown jobs: pkgdown: - runs-on: windows-latest + runs-on: ubuntu-latest + # Only restrict concurrency for non-PR jobs + concurrency: + group: pkgdown-${{ github.event_name != 'pull_request' || github.run_id }} env: - CURL_SSL_BACKEND: "openssl" GITHUB_PAT: ${{ secrets.GITHUB_TOKEN }} + permissions: + contents: write steps: - - uses: actions/checkout@v2 + - uses: actions/checkout@v5 + + - uses: r-lib/actions/setup-pandoc@v2 - uses: r-lib/actions/setup-r@v2 with: use-public-rspm: true - - uses: r-lib/actions/setup-pandoc@v2 - - - name: Query dependencies - run: | - install.packages('remotes') - saveRDS(remotes::dev_package_deps(dependencies = TRUE), ".github/depends.Rds", version = 2) - writeLines(sprintf("R-%i.%i", getRversion()$major, getRversion()$minor), ".github/R-version") - shell: Rscript {0} - - - name: Cache R packages - uses: actions/cache@v2 + - uses: r-lib/actions/setup-r-dependencies@v2 with: - path: ${{ env.R_LIBS_USER }} - key: ${{ runner.os }}-${{ hashFiles('.github/R-version') }}-1-${{ hashFiles('.github/depends.Rds') }} - restore-keys: ${{ runner.os }}-${{ hashFiles('.github/R-version') }}-1- + extra-packages: any::pkgdown, local::. + needs: website - - name: Install dependencies - run: | - remotes::install_deps(dependencies = TRUE) - install.packages("pkgdown", type = "binary") + - name: Build site + run: pkgdown::build_site_github_pages(new_process = FALSE, install = FALSE) shell: Rscript {0} - - name: Install package - run: R CMD INSTALL . - shell: cmd - - - name: Deploy package - run: | - git config --local user.email "actions@github.com" - git config --local user.name "GitHub Actions" - Rscript -e 'pkgdown::deploy_to_branch(new_process = FALSE)' + - name: Deploy to GitHub pages + if: github.event_name != 'pull_request' + uses: JamesIves/github-pages-deploy-action@v4.7.3 + with: + clean: false + branch: gh-pages + folder: docs diff --git a/.github/workflows/test-coverage.yaml b/.github/workflows/test-coverage.yaml index 0f014df..c47c4b9 100644 --- a/.github/workflows/test-coverage.yaml +++ b/.github/workflows/test-coverage.yaml @@ -12,37 +12,50 @@ name: test-coverage jobs: test-coverage: - runs-on: windows-latest + runs-on: ubuntu-latest env: GITHUB_PAT: ${{ secrets.GITHUB_TOKEN }} + steps: - - uses: actions/checkout@v2 + - uses: actions/checkout@v5 - uses: r-lib/actions/setup-r@v2 + with: + use-public-rspm: true - - uses: r-lib/actions/setup-pandoc@v2 + - uses: r-lib/actions/setup-r-dependencies@v2 + with: + extra-packages: any::covr, any::xml2 + needs: coverage - - name: Query dependencies + - name: Test coverage run: | - install.packages('remotes') - saveRDS(remotes::dev_package_deps(dependencies = TRUE), ".github/depends.Rds", version = 2) - writeLines(sprintf("R-%i.%i", getRversion()$major, getRversion()$minor), ".github/R-version") + cov <- covr::package_coverage( + quiet = FALSE, + clean = FALSE, + install_path = file.path(normalizePath(Sys.getenv("RUNNER_TEMP"), winslash = "/"), "package") + ) + covr::to_cobertura(cov) shell: Rscript {0} - - name: Cache R packages - uses: actions/cache@v1 + - uses: codecov/codecov-action@v5 with: - path: ${{ env.R_LIBS_USER }} - key: ${{ runner.os }}-${{ hashFiles('.github/R-version') }}-1-${{ hashFiles('.github/depends.Rds') }} - restore-keys: ${{ runner.os }}-${{ hashFiles('.github/R-version') }}-1- - - - name: Install dependencies + fail_ci_if_error: ${{ github.event_name != 'pull_request' && true || false }} + file: ./cobertura.xml + plugin: noop + disable_search: true + token: ${{ secrets.CODECOV_TOKEN }} + + - name: Show testthat output + if: always() run: | - install.packages(c("remotes")) - remotes::install_deps(dependencies = TRUE) - remotes::install_cran("covr") - shell: Rscript {0} + ## -------------------------------------------------------------------- + find '${{ runner.temp }}/package' -name 'testthat.Rout*' -exec cat '{}' \; || true + shell: bash - - name: Test coverage - run: covr::codecov() - shell: Rscript {0} + - name: Upload test results + if: failure() + uses: actions/upload-artifact@v4 + with: + name: coverage-test-failures + path: ${{ runner.temp }}/package diff --git a/.gitignore b/.gitignore index 513025f..ddeb07d 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1,3 @@ .Rproj.user docs +.positai diff --git a/inst/extdata/scripts/impetus/BelinWaterModel_id_table.csv b/inst/extdata/scripts/impetus/BelinWaterModel_id_table.csv index 2eac9a8..eabb4ad 100644 --- a/inst/extdata/scripts/impetus/BelinWaterModel_id_table.csv +++ b/inst/extdata/scripts/impetus/BelinWaterModel_id_table.csv @@ -6,7 +6,7 @@ "WdS";"5524";"Wernsdorfer Seenkette";"WdS";1 "HOW";"5801";"Havel-Oder-Wasserstraße";"HOW";1 "TgS";"5809";"Tegeler See";"TgS";1 -"RüG";"6301";"Rüdersdorfer Gewässer";"RüG";1 +"RueG";"6301";"Rüdersdorfer Gewässer";"RüG";1 "SOW";"6501";"Spree-Oder-Wasserstraße";"SOW";1 "LWK";"6504";"Landwehrkanal";"LWK";1 "RmS";"6510";"Rummelsburger See";"RmS";1 diff --git a/inst/extdata/scripts/impetus/river_id_table.csv b/inst/extdata/scripts/impetus/river_id_table.csv index 539beb2..2451309 100644 --- a/inst/extdata/scripts/impetus/river_id_table.csv +++ b/inst/extdata/scripts/impetus/river_id_table.csv @@ -6,7 +6,7 @@ "WdS";"5524";"Wernsdorfer Seenkette";"Kro" "HOW";"5801";"Havel-Oder-Wasserstraße";"HOW" "TgS";"5809";"Tegeler See";"TeS" -"RüG";"6301";"Rüdersdorfer Gewässer";"RueG" +"RueG";"6301";"Rüdersdorfer Gewässer";"RueG" "SOW";"6501";"Spree-Oder-Wasserstraße";"OSK,SOW,SedS" "LWK";"6504";"Landwehrkanal";"Lwk,LwK" "RmS";"6510";"Rummelsburger See";"RuS" diff --git "a/inst/extdata/verknet/F\303\226H.csv" b/inst/extdata/verknet/FOeH.csv similarity index 100% rename from "inst/extdata/verknet/F\303\226H.csv" rename to inst/extdata/verknet/FOeH.csv diff --git "a/inst/extdata/verknet/K\303\274K.csv" b/inst/extdata/verknet/KueK.csv similarity index 100% rename from "inst/extdata/verknet/K\303\274K.csv" rename to inst/extdata/verknet/KueK.csv diff --git "a/inst/extdata/verknet/L\303\266.csv" b/inst/extdata/verknet/Loe.csv similarity index 100% rename from "inst/extdata/verknet/L\303\266.csv" rename to inst/extdata/verknet/Loe.csv diff --git "a/inst/extdata/verknet/L\303\274.csv" b/inst/extdata/verknet/Lue.csv similarity index 100% rename from "inst/extdata/verknet/L\303\274.csv" rename to inst/extdata/verknet/Lue.csv diff --git "a/inst/extdata/verknet/M\303\234R.csv" b/inst/extdata/verknet/MUeR.csv similarity index 100% rename from "inst/extdata/verknet/M\303\234R.csv" rename to inst/extdata/verknet/MUeR.csv diff --git "a/inst/extdata/verknet/N\303\204W.csv" b/inst/extdata/verknet/NAeW.csv similarity index 100% rename from "inst/extdata/verknet/N\303\204W.csv" rename to inst/extdata/verknet/NAeW.csv diff --git "a/inst/extdata/verknet/Nk\303\266.csv" b/inst/extdata/verknet/Nkoe.csv similarity index 100% rename from "inst/extdata/verknet/Nk\303\266.csv" rename to inst/extdata/verknet/Nkoe.csv diff --git "a/inst/extdata/verknet/R\303\274G.csv" b/inst/extdata/verknet/RueG.csv similarity index 100% rename from "inst/extdata/verknet/R\303\274G.csv" rename to inst/extdata/verknet/RueG.csv diff --git "a/inst/extdata/verknet/W\303\274.csv" b/inst/extdata/verknet/Wue.csv similarity index 100% rename from "inst/extdata/verknet/W\303\274.csv" rename to inst/extdata/verknet/Wue.csv