diff --git a/.github/AnVIL_Feedback_Script.sh b/.github/AnVIL_Feedback_Script.sh new file mode 100644 index 0000000..5269b76 --- /dev/null +++ b/.github/AnVIL_Feedback_Script.sh @@ -0,0 +1,19 @@ +#!/bin/bash + +# Extract the title from the YAML front matter of index.Rmd +title=$(awk '/^title:/{gsub(/^title: /,""); print}' "index.Rmd" | grep -v '^$') + +# Remove the outside quotation marks +title=$(sed -e 's/^"//' -e 's/"$//' <<< "$title") + +# Replace spaces with '+' +title=${title// /+} + +# Base url for the AnVIL Google Form +url_base="https://docs.google.com/forms/d/e/1FAIpQLScrDVb_utm55pmb_SHx-RgELTEbCCWdLea0T3IzS0Oj00GE4w/viewform?usp=pp_url&entry.1565230805=" + +# Replace the url inside _output.yml +perl -i -pe 's|https://docs.google.com/forms/d/e/1FAIpQLScrDVb_utm55pmb_SHx-RgELTEbCCWdLea0T3IzS0Oj00GE4w/viewform\?usp=pp_url&entry\.1565230805=.*"> Click|'${url_base}${title}'"> Click|g' _output.yml + +# Print for Github actions +echo "The feedback link is: ${url_base}${title}" \ No newline at end of file diff --git a/.github/workflows/check-url.yml b/.github/workflows/check-url.yml new file mode 100644 index 0000000..090f12f --- /dev/null +++ b/.github/workflows/check-url.yml @@ -0,0 +1,117 @@ +name: Periodic URL Check + +on: + workflow_dispatch: + schedule: + - cron: '0 0 1 * *' + +jobs: + set-up: + name: Load user automation choices + runs-on: ubuntu-latest + steps: + - name: Checkout + uses: actions/checkout@v3 + with: + fetch-depth: 0 + + # Use the yaml-env-action action. + - name: Load environment from YAML + uses: doughepi/yaml-env-action@v1.0.0 + with: + files: config_automation.yml # Pass a space-separated list of configuration files. Rightmost files take precedence. + outputs: + toggle_url_check_periodically: "${{ env.URL_CHECK_PERIODICALLY }}" + + url-check: + name: Check URLs + needs: set-up + if: ${{needs.set-up.outputs.toggle_url_check_periodically == 'yes'}} + runs-on: ubuntu-latest + container: + image: jhudsl/base_ottr:main + + steps: + - name: Checkout + uses: actions/checkout@v3 + with: + fetch-depth: 0 + + # Delete the branch if this has been run before + - name: Delete branch locally and remotely + run: git push origin --delete preview-spell-error || echo "No branch to delete" + + # Make the branch fresh + - name: Make the branch fresh + run: | + git config --global --add safe.directory $GITHUB_WORKSPACE + git config --global user.name 'github-actions[bot]' + git config --global user.email 'github-actions[bot]@users.noreply.github.com' + + echo branch doesnt exist + git checkout -b preview-spell-error || echo branch exists + git push --set-upstream origin preview-spell-error || echo echo branch exists remotely + shell: bash + + - name: Run the check + uses: jhudsl/ottr-reports@main + id: check_results + continue-on-error: true + with: + check_type: urls + error_min: 1 + + - name: Declare file path and time + id: check-report + run: | + error_num=$(cat check_reports/url_checks.tsv | wc -l) + error_num="$((error_num-1))" + echo "error_num=$error_num" >> $GITHUB_OUTPUT + echo "error_url=https://github.com/${GITHUB_REPOSITORY}/blob/preview-spell-error/check_reports/url_checks.tsv" >> $GITHUB_OUTPUT + shell: bash + + - name: Stop if failure + if: steps.check_results.outcome == 'failure' + run: exit 1 + + - name: Print out error variables + run: | + echo ${{ steps.check-report.outputs.error_url }} + echo ${{ steps.check-report.outputs.error_num }} + + # Commit file + - name: Commit tocless bookdown files + if: ${{ steps.check-report.outputs.error_num >= 1 }} + env: + GH_PAT: ${{ secrets.GH_PAT }} + run: | + git add --force check_reports/url_checks.tsv + git commit -m 'Add spell check file' || echo "No changes to commit" + git push --set-upstream origin preview-spell-error || echo echo branch exists remotely + + - name: Find issues + id: find-issue + env: + GH_PAT: ${{ secrets.GH_PAT }} + run: | + echo "$GITHUB_REPOSITORY" + curl -o find_issue.R https://raw.githubusercontent.com/jhudsl/ottr-reports/main/scripts/find_issue.R + issue_exists=$(Rscript --vanilla find_issue.R --repo $GITHUB_REPOSITORY --git_pat $GH_PAT) + echo URL issue exists: $issue_exists + echo "issue_existence=$issue_exists" >> $GITHUB_OUTPUT + + - name: If too many URL errors, then make an issue + if: ${{ steps.check-report.outputs.error_num >= 1 && steps.find-issue.outputs.issue_existence == 0}} + uses: JasonEtco/create-an-issue@v2 + with: + filename: .github/ISSUE_TEMPLATE/url-error.md + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + FILE_URL: ${{ steps.check-report.outputs.error_url }} + ERROR_NUM: ${{ steps.check-report.outputs.error_num }} + + - name: If no URL errors than delete the branch we made + if: ${{ steps.check-report.outputs.error_num < 1 }} + run: | + git config --system --add safe.directory "$GITHUB_WORKSPACE" + git push origin --delete preview-spell-error || echo "No branch to delete" diff --git a/.github/workflows/delete-preview.yml b/.github/workflows/delete-preview.yml index afd658a..faa83cc 100644 --- a/.github/workflows/delete-preview.yml +++ b/.github/workflows/delete-preview.yml @@ -18,7 +18,7 @@ jobs: # Check out current repository - name: checkout - uses: actions/checkout@v3 + uses: actions/checkout@v4 with: fetch-depth: 0 diff --git a/.github/workflows/pull_request.yml b/.github/workflows/pull_request.yml index b9bb17a..de76459 100644 --- a/.github/workflows/pull_request.yml +++ b/.github/workflows/pull_request.yml @@ -1,5 +1,5 @@ # Candace Savonen 2021 -# Updated Jan 2023 +# Updated May 2024 name: Pull Request @@ -14,7 +14,7 @@ jobs: runs-on: ubuntu-latest steps: - name: Checkout - uses: actions/checkout@v3 + uses: actions/checkout@v4 with: fetch-depth: 0 @@ -31,23 +31,29 @@ jobs: # Make the branch fresh - name: Make the branch fresh run: | - git config --local user.email "itcrtrainingnetwork@gmail.com" - git config --local user.name "jhudsl-robot" + git config --global --add safe.directory $GITHUB_WORKSPACE + git config --global user.name 'github-actions[bot]' + git config --global user.email 'github-actions[bot]@users.noreply.github.com' branch_name='preview-${{ github.event.pull_request.number }}' echo branch doesnt exist git checkout -b $branch_name || echo branch exists - git push --set-upstream origin $branch_name + git push --set-upstream origin $branch_name || echo branch exists remotely shell: bash + outputs: + toggle_website: "${{ env.RENDER_WEBSITE }}" toggle_spell_check: "${{ env.SPELL_CHECK }}" toggle_style_code: "${{ env.STYLE_CODE }}" toggle_url_check: "${{ env.URL_CHECKER }}" toggle_quiz_check: "${{ env.CHECK_QUIZZES }}" + toggle_feedback_link: "${{ env.FEEDBACK_LINK }}" + toggle_md_linter: "${{ env.MARKDOWN_LINTER }}" + toggle_readability: "${{ env.READABILITY_REPORT }}" toggle_render_preview: "${{ env.RENDER_PREVIEW }}" + toggle_student_guide: "${{ env.RENDER_STUDENT_GUIDE }}" rendering_docker_image: "${{ env.RENDERING_DOCKER_IMAGE }}" - render_student_guide: "${{ env.RENDER_STUDENT_GUIDE }}" ########################## Make the error reports ############################## spell-check: @@ -58,7 +64,9 @@ jobs: with: check_type: spelling error_min: 3 - gh_pat: secrets.GH_PAT + branch_name: ${GITHUB_HEAD_REF} + secrets: + gh_pat: ${{ secrets.GH_PAT }} url-check: name: Check URLs @@ -68,7 +76,9 @@ jobs: with: check_type: urls error_min: 0 - gh_pat: secrets.GH_PAT + branch_name: ${GITHUB_HEAD_REF} + secrets: + gh_pat: ${{ secrets.GH_PAT }} quiz-check: name: Check quiz formatting @@ -78,7 +88,9 @@ jobs: with: check_type: quiz_format error_min: 0 - gh_pat: secrets.GH_PAT + branch_name: ${GITHUB_HEAD_REF} + secrets: + gh_pat: ${{ secrets.GH_PAT }} ############################# Style the code ################################### style-code: @@ -91,20 +103,40 @@ jobs: steps: - name: Checkout files - uses: actions/checkout@v3 + uses: actions/checkout@v4 with: fetch-depth: 0 - name: Run styler - run: Rscript -e "styler::style_file(list.files(pattern = 'Rmd$', recursive = TRUE, full.names = TRUE));warnings()" + run: Rscript -e "styler::style_file(list.files(pattern = '(R|q)md$', recursive = FALSE, full.names = TRUE));warnings()" - name: Commit styled files run: | git config --system --add safe.directory "$GITHUB_WORKSPACE" - git add \*.Rmd - git commit -m 'Style Rmds' || echo "No changes to commit" + git add \*md + git commit -m 'Style *mds' || echo "No changes to commit" git push origin || echo "No changes to commit" +############################# Readability Report ################################### + + readability-report: + name: Readability report + needs: yaml-check + runs-on: ubuntu-latest + if: ${{needs.yaml-check.outputs.toggle_readability == 'yes'}} + + steps: + - name: Checkout repo + uses: actions/checkout@v4 + with: + fetch-depth: 0 + + - name: Readability report + uses: Rebilly/lexi@v2 + with: + github-token: ${{ secrets.GH_PAT }} + glob: '**/*.md' + ############################# Render Preview ################################### render-preview: @@ -117,16 +149,16 @@ jobs: steps: - name: Checkout files - uses: actions/checkout@v3 + uses: actions/checkout@v4 with: fetch-depth: 0 # Set up git checkout - name: Set up git checkout run: | - git config --system --add safe.directory "$GITHUB_WORKSPACE" - git config --local user.email "itcrtrainingnetwork@gmail.com" - git config --local user.name "jhudsl-robot" + git config --global --add safe.directory $GITHUB_WORKSPACE + git config --global user.name 'github-actions[bot]' + git config --global user.email 'github-actions[bot]@users.noreply.github.com' branch_name='preview-${{ github.event.pull_request.number }}' git fetch --all @@ -134,16 +166,32 @@ jobs: git merge -s recursive --strategy-option=theirs origin/${{ github.head_ref }} --allow-unrelated-histories shell: bash + # Make sure the link for AnVIL feedback is prepopulated for the specific course + - name: Set up feedback link + id: feedback + if: ${{needs.yaml-check.outputs.toggle_feedback_link == 'yes'}} + run: | + bash .github/AnVIL_Feedback_Script.sh + git add _output.yml + git commit -m 'Set up feedback link' || echo "No changes to commit" + # Run bookdown rendering - name: Run bookdown render id: bookdown + if: ${{needs.yaml-check.outputs.toggle_website == 'rmd' }} run: Rscript -e "bookdown::render_book('index.Rmd', output_format = 'all')" - + + # Run quarto rendering + - name: Render quarto version + id: quarto + if: ${{needs.yaml-check.outputs.toggle_website == 'quarto' }} + run: Rscript -e "quarto::quarto_render('.')" + # Render a student guide if specified. This is a bit clunky because # Bookdown does not work well if the files aren't named as such in the # root directory - name: Run student guide render - if: ${{needs.yaml-check.outputs.render_student_guide == 'yes'}} + if: ${{needs.yaml-check.outputs.toggle_student_guide == 'yes'}} id: student_guide run: | mkdir tmp1 @@ -153,22 +201,29 @@ jobs: mv _bookdown.yml _output.yml student-guide mv tmp1/_bookdown.yml tmp1/_output.yml . rm -r tmp1 - - # Run TOC-less version - # Rendered content for Leanpub and Coursera is very similar. - # This job creates a shared scaffold for both. - - name: Run TOC-less version of render - id: tocless - run: Rscript -e "ottrpal::render_without_toc()" + git add student-guide/* + git commit -m 'Create student guide' || echo "No changes to commit" # This checks on the steps before it and makes sure that they completed. # If the renders didn't complete we don't want to commit the file changes - - name: Check on render steps - if: steps.bookdown.outcome != 'success' || steps.tocless.outcome != 'success' + - name: Check on Rmd render steps + if: ${{needs.yaml-check.outputs.toggle_website == 'rmd' }} run: | echo Bookdown status ${{steps.bookdown.outcome}} - echo Toc-less status ${{steps.tocless.outcome}} - exit 1 + if [${{steps.bookdown.outcome}} != 'success']; then + exit 1 + fi + + - name: Check on quarto render steps + if: ${{needs.yaml-check.outputs.toggle_website == 'quarto' }} + run: | + echo Quarto status ${{steps.quarto.outcome}} + if [${{steps.quarto.outcome}} != 'success']; then + exit 1 + fi + + - name: Website preview for download + run: zip website-preview.zip docs/* -r # Commit the rendered bookdown files - name: Commit rendered bookdown files to preview branch @@ -179,7 +234,7 @@ jobs: echo "changes=$changes" >> $GITHUB_OUTPUT git add . --force git commit -m 'Render preview' || echo "No changes to commit" - git pull --set-upstream origin $branch_name --allow-unrelated-histories --strategy-option=ours + git pull --rebase --set-upstream origin $branch_name --allow-unrelated-histories --strategy-option=ours git push --force || echo "No changes to commit" shell: bash @@ -196,11 +251,11 @@ jobs: run: | course_name=$(head -n 1 student-guide/_bookdown.yml | cut -d'"' -f 2| tr " " "-") bookdown_link=$(echo "https://htmlpreview.github.io/?https://raw.githubusercontent.com/$GITHUB_REPOSITORY/preview-${{ github.event.pull_request.number }}/docs/index.html") - tocless_link=$(echo "https://htmlpreview.github.io/?https://raw.githubusercontent.com/$GITHUB_REPOSITORY/preview-${{ github.event.pull_request.number }}/docs/no_toc/index.html") - student_docx_link=$(echo "https://github.com/$GITHUB_REPOSITORY/raw/preview-${{ github.event.pull_request.number }}/student-guide/$course_name.docx") + student_guide=$(echo "https://github.com/$GITHUB_REPOSITORY/raw/preview-${{ github.event.pull_request.number }}/student-guide/Student_Guide.docx") + zip_link=$(echo "https://github.com/$GITHUB_REPOSITORY/raw/preview-${{ github.event.pull_request.number }}/website-preview.zip") + echo "zip_link=$zip_link" >> $GITHUB_OUTPUT echo "bookdown_link=$bookdown_link" >> $GITHUB_OUTPUT - echo "tocless_link=$tocless_link" >> $GITHUB_OUTPUT - echo "student_docx_link=$student_docx_link" >> $GITHUB_OUTPUT + echo "student_guide=$student_guide" >> $GITHUB_OUTPUT echo "time=$(date +'%Y-%m-%d')" >> $GITHUB_OUTPUT echo "commit_id=$GITHUB_SHA" >> $GITHUB_OUTPUT echo ${{steps.commit.outputs.changes}} @@ -213,11 +268,13 @@ jobs: issue-number: ${{ github.event.pull_request.number }} body: | Re-rendered previews from the latest commit: - - See [preview of Bookdown here](${{ steps.build-components.outputs.bookdown_link }}) - - See [preview of Coursera/Leanpub version here](${{ steps.build-components.outputs.tocless_link }}) - - Download the [preview of the Student Guide .docx file](${{ steps.build-components.outputs.student_docx_link }}) + - :eyes: Quick [preview of course website here](${{ steps.build-components.outputs.bookdown_link }}) \* + - :microscope: Comprehensive [download of the course website here](${{ steps.build-components.outputs.zip_link }}) + - Download the Student Guide [.docx file](${{ steps.build-components.outputs.student_guide }}) - _Updated at ${{ steps.build-components.outputs.time }} with changes from ${{ steps.build-components.outputs.commit_id }}_ + \* note not all html features will be properly displayed in the "quick preview" but it will give you a rough idea. + + _Updated at ${{ steps.build-components.outputs.time }} with changes from the latest commit ${{ steps.build-components.outputs.commit_id }}_ edit-mode: replace - name: Comment if no changes diff --git a/.github/workflows/render-all.yml b/.github/workflows/render-all.yml index 4ebcbdc..177b4a9 100644 --- a/.github/workflows/render-all.yml +++ b/.github/workflows/render-all.yml @@ -1,5 +1,5 @@ - -# Candace Savonen Apr 2021 +# Candace Savonen 2021 +# Updated May 2024 name: Render all output courses @@ -8,8 +8,10 @@ on: push: branches: [ main, staging ] paths: - - '**.Rmd' + - '*.qmd' + - '*.Rmd' - assets/* + - quizzes/* jobs: @@ -18,7 +20,7 @@ jobs: runs-on: ubuntu-latest steps: - name: Checkout - uses: actions/checkout@v3 + uses: actions/checkout@v4 # Use the yaml-env-action action. - name: Load environment from YAML @@ -26,49 +28,68 @@ jobs: with: files: config_automation.yml # Pass a space-separated list of configuration files. Rightmost files take precedence. outputs: - toggle_bookdown: "${{ env.RENDER_BOOKDOWN }}" + toggle_website: "${{ env.RENDER_WEBSITE }}" toggle_coursera: "${{ env.RENDER_COURSERA }}" toggle_leanpub: "${{ env.RENDER_LEANPUB }}" + toggle_feedback_link: "${{ env.FEEDBACK_LINK }}" + toggle_student_guide: "${{ env.RENDER_STUDENT_GUIDE }}" rendering_docker_image: "${{ env.RENDERING_DOCKER_IMAGE }}" toggle_quiz_check: "${{ env.CHECK_QUIZZES }}" - render-bookdown: - name: Render bookdown + render-course: + name: Render course preview needs: yaml-check runs-on: ubuntu-latest container: image: ${{needs.yaml-check.outputs.rendering_docker_image}} - if: ${{needs.yaml-check.outputs.toggle_bookdown == 'yes'}} steps: - name: checkout - uses: actions/checkout@v3 + uses: actions/checkout@v4 with: fetch-depth: 0 token: ${{ secrets.GH_PAT }} - - name: Login as jhudsl-robot + - name: Login as github actions bot run: | - git config --system --add safe.directory "$GITHUB_WORKSPACE" - git config --local user.email "itcrtrainingnetwork@gmail.com" - git config --local user.name "jhudsl-robot" + git config --global --add safe.directory $GITHUB_WORKSPACE + git config --global user.name 'github-actions[bot]' + git config --global user.email 'github-actions[bot]@users.noreply.github.com' # We want a fresh run of the renders each time - name: Delete old docs/* - run: rm -rf docs/* + run: | + git remote set-url origin https://${GH_PAT}@github.com/${GITHUB_REPOSITORY} + git fetch origin + git pull --rebase --allow-unrelated-histories --strategy-option=ours + + # Make sure the link for AnVIL feedback is prepopulated for the specific course + - name: Set up feedback link + if: ${{needs.yaml-check.outputs.toggle_feedback_link == 'yes'}} + run: | + bash .github/AnVIL_Feedback_Script.sh + git add _output.yml + git commit -m 'Set up feedback link' || echo "No changes to commit" - # Run bookdown rendering + # Run Rmd rendering - name: Run bookdown render id: bookdown + if: ${{needs.yaml-check.outputs.toggle_website == 'rmd' }} run: | + rm -rf docs/* Rscript -e "bookdown::render_book('index.Rmd', output_format = 'all'); file.copy(from = 'assets', to = 'docs/assets', overwrite = TRUE)" + + - name: Render quarto version + id: quarto + if: ${{needs.yaml-check.outputs.toggle_website == 'quarto' }} + run: Rscript -e "quarto::quarto_render('.')" # Render a student guide if specified. This is a bit clunky because # Bookdown does not work well if the files aren't named as such in the # root directory - name: Run student guide render - if: ${{needs.yaml-check.outputs.render_student_guide == 'yes'}} + if: ${{needs.yaml-check.outputs.toggle_student_guide == 'yes'}} id: student_guide run: | mkdir tmp1 @@ -78,29 +99,40 @@ jobs: mv _bookdown.yml _output.yml student-guide mv tmp1/_bookdown.yml tmp1/_output.yml . rm -r tmp1 + git add student-guide/* + git commit -m 'Create student guide' || echo "No changes to commit" # This checks on the steps before it and makes sure that they completed. # If the renders didn't complete we don't want to commit the file changes - - name: Check on render step - if: steps.bookdown.outcome != 'success' + - name: Check on Rmd render steps + if: ${{needs.yaml-check.outputs.toggle_website == 'rmd' }} run: | echo Bookdown status ${{steps.bookdown.outcome}} - exit 1 + if [${{steps.bookdown.outcome}} != 'success']; then + exit 1 + fi + + - name: Check on quarto render steps + if: ${{needs.yaml-check.outputs.toggle_website == 'quarto' }} + run: | + echo Quarto status ${{steps.quarto.outcome}} + if [${{steps.quarto.outcome}} != 'success']; then + exit 1 + fi - # Commit the rendered bookdown files - - name: Commit rendered bookdown files + # Commit the rendered course files + - name: Commit rendered course files env: GH_PAT: ${{ secrets.GH_PAT }} run: | - git remote set-url origin https://${GH_PAT}@github.com/${GITHUB_REPOSITORY} git add --force docs/* - git commit -m 'Render bookdown' || echo "No changes to commit" - git pull --allow-unrelated-histories --strategy-option=ours - git push origin main || echo "No changes to push" + git commit -m 'Render course' || echo "No changes to commit" + git status docs/* + git push --force -u origin main || echo "No changes to push" render-tocless: name: Render TOC-less version for Leanpub or Coursera - needs: [yaml-check] + needs: [yaml-check, render-course] runs-on: ubuntu-latest container: image: ${{needs.yaml-check.outputs.rendering_docker_image}} @@ -108,54 +140,68 @@ jobs: steps: - name: checkout - uses: actions/checkout@v3 + uses: actions/checkout@v4 with: fetch-depth: 0 token: ${{ secrets.GH_PAT }} - - name: Login as jhudsl-robot + - name: Login as github-actions bot run: | - git config --system --add safe.directory "$GITHUB_WORKSPACE" - git config --local user.email "itcrtrainingnetwork@gmail.com" - git config --local user.name "jhudsl-robot" + git config --global --add safe.directory $GITHUB_WORKSPACE + git config --global user.name 'github-actions[bot]' + git config --global user.email 'github-actions[bot]@users.noreply.github.com' + git remote set-url origin https://${GH_PAT}@github.com/${GITHUB_REPOSITORY} + git fetch origin + git pull --rebase --allow-unrelated-histories --strategy-option=ours # Rendered content for Leanpub and Coursera is very similar. # This job creates a shared scaffold for both. - - name: Run TOC-less version of render - id: tocless + - name: Run TOC-less version of render -- Rmd version + if: ${{needs.yaml-check.outputs.toggle_website == 'rmd' }} + id: tocless_rmd run: Rscript -e "ottrpal::render_without_toc()" + - name: Run TOC-less version of render -- quarto version + id: tocless_quarto + if: ${{needs.yaml-check.outputs.toggle_website == 'quarto' }} + run: | + Rscript -e "quarto::quarto_render('.', metadata = list(sidebar = F, toc = F), + quarto_args = c('--output-dir', 'docs/no_toc/'))" + # Commit the TOC-less version files - name: Commit tocless bookdown files env: GH_PAT: ${{ secrets.GH_PAT }} run: | - git remote set-url origin https://${GH_PAT}@github.com/${GITHUB_REPOSITORY} git add --force docs/no_toc* git commit -m 'Render toc-less' || echo "No changes to commit" - git pull --allow-unrelated-histories --strategy-option=ours - git push origin main || echo "No changes to push" + git status docs/no_toc* + git push --force -u origin main || echo "No changes to push" render-leanpub: name: Finish Leanpub prep needs: [yaml-check, render-tocless] runs-on: ubuntu-latest container: - image: jhudsl/ottrpal:main + image: jhudsl/ottrpal if: ${{needs.yaml-check.outputs.toggle_leanpub == 'yes'}} steps: - name: checkout - uses: actions/checkout@v3 + uses: actions/checkout@v4 with: fetch-depth: 0 token: ${{ secrets.GH_PAT }} - - name: Login as jhudsl-robot + - name: Login as github actions bot run: | - git config --system --add safe.directory "$GITHUB_WORKSPACE" - git config --local user.email "itcrtrainingnetwork@gmail.com" - git config --local user.name "jhudsl-robot" + git config --global --add safe.directory $GITHUB_WORKSPACE + git config --global user.name 'github-actions[bot]' + git config --global user.email 'github-actions[bot]@users.noreply.github.com' + git remote set-url origin https://${GH_PAT}@github.com/${GITHUB_REPOSITORY} + git fetch origin + git pull --rebase --allow-unrelated-histories --strategy-option=ours + ls docs/no_toc # Create screenshots - name: Run the screenshot creation @@ -164,31 +210,41 @@ jobs: rm -rf resources/chapt_screen_images # Make new screenshots - chapt_urls=$(Rscript --vanilla scripts/make_screenshots.R \ + curl -o make_screenshots.R https://raw.githubusercontent.com/jhudsl/ottr-reports/main/scripts/make_screenshots.R + chapt_urls=$(Rscript --vanilla make_screenshots.R \ --git_pat ${{ secrets.GH_PAT }} \ --repo $GITHUB_REPOSITORY \ --output_dir resources/chapt_screen_images) + rm make_screenshots.R # We want a fresh run of the renders each time - - name: Delete old manuscript/ - run: rm -rf manuscript/ + - name: Delete manuscript/ + env: + GH_PAT: ${{ secrets.GH_PAT }} + run: | + rm -rf manuscript/ + git add . + git commit -m 'Delete manuscript folder' || echo "No changes to commit" + git push -u origin main || echo "No changes to push" - name: Run ottrpal::bookdown_to_embed_leanpub - if: needs.yaml-check.outputs.toggle_quiz_check == 'no' + if: ${{ needs.yaml-check.outputs.toggle_quiz_check == 'no'}} run: | + echo needs.yaml-check.outputs.toggle_make_book_txt == 'yes' + echo needs.yaml-check.outputs.toggle_make_book_txt Rscript -e "ottrpal::bookdown_to_embed_leanpub( render = FALSE, \ chapt_img_key = 'resources/chapt_screen_images/chapter_urls.tsv', \ - make_book_txt = TRUE, \ + make_book_txt = as.logical('${{needs.yaml-check.outputs.make_book_txt == 'yes'}}'), \ quiz_dir = NULL)" - name: Run ottrpal::bookdown_to_embed_leanpub - if: needs.yaml-check.outputs.toggle_quiz_check == 'yes' + if: ${{ needs.yaml-check.outputs.toggle_quiz_check == 'yes'}} run: | Rscript -e "ottrpal::bookdown_to_embed_leanpub( render = FALSE, \ chapt_img_key = 'resources/chapt_screen_images/chapter_urls.tsv', \ - make_book_txt = TRUE)" + make_book_txt = as.logical('${{needs.yaml-check.outputs.make_book_txt == 'yes'}}'))" # Commit the rendered Leanpub files - name: Commit rendered Leanpub files @@ -196,13 +252,13 @@ jobs: GH_PAT: ${{ secrets.GH_PAT }} run: | mkdir -p manuscript - git remote set-url origin https://${GH_PAT}@github.com/${GITHUB_REPOSITORY} git add --force manuscript/* git add --force resources/* git add --force docs/* git commit -m 'Render Leanpub' || echo "No changes to commit" - git pull --allow-unrelated-histories --strategy-option=ours - git push origin main || echo "No changes to push" + git status docs/* + git pull --rebase --allow-unrelated-histories --strategy-option=ours --autostash + git push --force --set-upstream origin main || echo "No changes to push" render-coursera: name: Finish Coursera prep @@ -214,16 +270,19 @@ jobs: steps: - name: checkout - uses: actions/checkout@v3 + uses: actions/checkout@v4 with: fetch-depth: 0 token: ${{ secrets.GH_PAT }} - - name: Login as jhudsl-robot + - name: Login as github action run: | - git config --system --add safe.directory "$GITHUB_WORKSPACE" - git config --local user.email "itcrtrainingnetwork@gmail.com" - git config --local user.name "jhudsl-robot" + git config --global --add safe.directory $GITHUB_WORKSPACE + git config --global user.name 'github-actions[bot]' + git config --global user.email 'github-actions[bot]@users.noreply.github.com' + git remote set-url origin https://${GH_PAT}@github.com/${GITHUB_REPOSITORY} + git fetch origin + git pull --rebase --allow-unrelated-histories --strategy-option=ours # Run Coursera version - name: Convert Leanpub quizzes to Coursera @@ -231,15 +290,18 @@ jobs: id: coursera run: Rscript -e "ottrpal::convert_coursera_quizzes()" - # Commit the rendered bookdown files + # Commit the rendered files + # Only commit coursera quizzes if the directory is present - name: Commit rendered Coursera files env: GH_PAT: ${{ secrets.GH_PAT }} run: | - git remote set-url origin https://${GH_PAT}@github.com/${GITHUB_REPOSITORY} + if [ -d 'coursera_quizzes' ]; then + git add --force coursera_quizzes/* + fi git add --force manuscript/* git add --force resources/* git add --force docs/* git commit -m 'Render Coursera quizzes' || echo "No changes to commit" - git pull --allow-unrelated-histories --strategy-option=ours - git push origin main || echo "No changes to push" + git status + git push --force -u origin main || echo "No changes to push" diff --git a/.github/workflows/transfer-rendered-files.yml b/.github/workflows/transfer-rendered-files.yml index 3c3577e..dae4141 100644 --- a/.github/workflows/transfer-rendered-files.yml +++ b/.github/workflows/transfer-rendered-files.yml @@ -21,7 +21,7 @@ jobs: runs-on: ubuntu-latest steps: - name: Checkout - uses: actions/checkout@v3 + uses: actions/checkout@v4 # Use the yaml-env-action action. - name: Load environment from YAML @@ -42,21 +42,23 @@ jobs: if: ${{needs.yaml-check.outputs.toggle_coursera == 'yes' || needs.yaml-check.outputs.toggle_leanpub == 'yes'}} steps: + - name: Checkout from Bookdown Repo + uses: actions/checkout@v4 + with: + path: bookdown + token: ${{ secrets.GH_PAT }} + - name: Run git repo check id: git_repo_check env: GH_PAT: ${{ secrets.GH_PAT }} run: | - sudo apt-get install subversion - # What's the Quizzes repository's name? QUIZ_REPO=$(echo ${GITHUB_REPOSITORY} | sed "s/_Bookdown/ /g" | sed "s/_Template/ /g" | awk '{print $1"_Quizzes"}') echo $QUIZ_REPO - # Get repo check script - svn export --force https://github.com/${GITHUB_REPOSITORY}.git/branches/${GITHUB_REF#refs/heads/}/scripts/git_repo_check.R git_repo_check.R - # Run repo check script + curl -o git_repo_check.R https://raw.githubusercontent.com/jhudsl/ottr-reports/main/scripts/git_repo_check.R results=$(Rscript --vanilla git_repo_check.R --repo "$GITHUB_REPOSITORY" --git_pat "$GH_PAT") echo $QUIZ_REPO exists: $results @@ -65,8 +67,9 @@ jobs: - name: Checkout code from Leanpub repo if: ${{ steps.git_repo_check.outputs.git_results == 'TRUE' }} - uses: actions/checkout@v3 + uses: actions/checkout@v4 with: + path: quizzes repository: ${{ steps.git_repo_check.outputs.leanpub_repo }} token: ${{ secrets.GH_PAT }} @@ -76,17 +79,19 @@ jobs: env: GH_PAT: ${{ secrets.GH_PAT }} run: | - # Copy over images folder - svn export --force https://github.com/${GITHUB_REPOSITORY}.git/branches/${GITHUB_REF#refs/heads/}/resources/chapt_screen_images resources/chapt_screen_images + # Copy over images folder (from bookdown to quizzes repo) + mkdir -p quizzes/resources/chapt_screen_images + cp bookdown/resources/chapt_screen_images/* quizzes/resources/chapt_screen_images - # Copy over _bookdown.yml - svn export --force https://github.com/${GITHUB_REPOSITORY}.git/branches/${GITHUB_REF#refs/heads/}/_bookdown.yml _bookdown.yml + # Copy over _bookdown.yml (from bookdown to quizzes repo) + cp bookdown/_bookdown.yml quizzes/_bookdown.yml - name: Create PR with resources files if: ${{ steps.git_repo_check.outputs.git_results == 'TRUE' }} uses: peter-evans/create-pull-request@v3 id: cpr with: + path: quizzes # Must create the PR in the Quizzes Repo token: ${{ secrets.GH_PAT }} commit-message: Copy files from Bookdown repository signoff: false diff --git a/_output.yml b/_output.yml index 37feea5..d97f446 100644 --- a/_output.yml +++ b/_output.yml @@ -16,5 +16,6 @@ bookdown::gitbook: <p style="text-align:center;"> <a href="http://jhudatascience.org/"> The Johns Hopkins Data Science Lab </a></p> <a href="http://jhudatascience.org/"><img src="https://jhudatascience.org/images/dasl.png" style=" width: 80%; padding-left: 40px; padding-top: 8px; vertical-align: top "</a> <p style="text-align:center; font-size: 12px;"> <a href="https://github.com/rstudio4edu/rstudio4edu-book/"> Style adapted from: rstudio4edu-book </a> <a href ="https://creativecommons.org/licenses/by/2.0/"> (CC-BY 2.0) </a></p> - <p style="padding-left: 40px;"><div class="trapezoid" style = "padding-left: 40px;"><span> <a href="https://forms.gle/AK12iVXTjsB7yCUUA"> Click here to provide feedback</a> <img src="assets/itcr_arrow.png" style=" width: 10%" ></span></div></p> - + <p style="padding-left: 40px;"><div class="trapezoid" style = "padding-left: 40px;"><span><a href="https://docs.google.com/forms/d/e/1FAIpQLScrDVb_utm55pmb_SHx-RgELTEbCCWdLea0T3IzS0Oj00GE4w/viewform?usp=pp_url&entry.1565230805=your+course"> Click here to provide feedback</a> <img src="assets/itcr_arrow.png" style=" width: 10%" ></span></div></p> + +# Note: Do not edit the feedback link in this file. This is automatically edited through the render-preview and render-bookdown workflows. diff --git a/assets/AnVIL_style/logo-anvil-img.png b/assets/AnVIL_style/logo-anvil-img.png new file mode 100644 index 0000000..b5e3c39 Binary files /dev/null and b/assets/AnVIL_style/logo-anvil-img.png differ diff --git a/assets/GDSCN_style/logo_BioDIGS_final.png b/assets/GDSCN_style/logo_BioDIGS_final.png new file mode 100644 index 0000000..8bbc378 Binary files /dev/null and b/assets/GDSCN_style/logo_BioDIGS_final.png differ diff --git a/assets/GDSCN_style/powered-by-anvil.png b/assets/GDSCN_style/powered-by-anvil.png new file mode 100644 index 0000000..c6d5f09 Binary files /dev/null and b/assets/GDSCN_style/powered-by-anvil.png differ diff --git a/assets/box_images/under_construction.png b/assets/box_images/under_construction.png new file mode 100644 index 0000000..a67bd5c Binary files /dev/null and b/assets/box_images/under_construction.png differ diff --git a/assets/style.css b/assets/style.css index 21ed0c6..748acad 100755 --- a/assets/style.css +++ b/assets/style.css @@ -250,7 +250,7 @@ li.appendix span, li.part span { /* for TOC part names */ /* Sidebar formating --------------------------------------------*/ /* from r-pkgs.org*/ -div.notice, div.warning, div.github, div.dictionary, div.reflection { +div.notice, div.warning, div.github, div.dictionary, div.reflection, div.wip { padding: 1em; margin: 1em 0; padding-left: 100px; @@ -304,6 +304,14 @@ div.reflection{ background-image: url("../assets/box_images/thinking_face.png"); } +div.wip{ + border: 4px #000000; + border-style: solid; + background-size: 70px; + background-position: 15px center; + background-color: #f4d03f; + background-image: url("../assets/box_images/under_construction.png"); +} /* .book .book-body .page-wrapper .page-inner section.normal is needed to override the styles produced by gitbook, which are ridiculously diff --git a/config_automation.yml b/config_automation.yml index b0499a8..54dcf03 100644 --- a/config_automation.yml +++ b/config_automation.yml @@ -3,22 +3,34 @@ # Check quiz formatting check-quizzes: no # Check that urls in the content are not broken -url-checker: no +url-checker: yes # Render preview of content with changes (Rmd's and md's are checked) render-preview: yes # Spell check Rmds and quizzes spell-check: yes # Style any R code style-code: yes +# Would you like your markdown files to be checked for formatting +markdown-linter: yes +# Would you like a readability report on your markdowns? +readability-report: yes # Test build the docker image if any docker-relevant files have been changed docker-test: no +# Should URLs be tested periodically? +url-check-periodically: yes ##### Renderings run upon merge to main branch ##### # Rendering each platform's content -render-bookdown: yes +render-website: rmd render-leanpub: no render-coursera: no +##### Rendering of student guide (if applicable) +render-student-guide: no + +##### Auto-generate a feedback link for the AnVIL Feedback Form: https://docs.google.com/forms/d/e/1FAIpQLScrDVb_utm55pmb_SHx-RgELTEbCCWdLea0T3IzS0Oj00GE4w/viewform +feedback-link: yes + # What docker image should be used for rendering? -# The default is jhudsl/course_template:main +# The default is jhudsl/base_ottr:main rendering-docker-image: 'jhudsl/stats-for-genomics:main' diff --git a/index.Rmd b/index.Rmd index 0661988..f4faf68 100644 --- a/index.Rmd +++ b/index.Rmd @@ -30,4 +30,3 @@ _Programming skills_ This exercise is part of a collection of teaching resources developed through the *Genomic Data Science Community Network* (GDSCN). GDSCN works towards a vision where researchers, educators, and students from diverse backgrounds are able to fully participate in genomic data science research. Learn more about GDSCN by visiting https://www.gdscn.org/home or reading the [article in Genome Research](https://doi.org/10.1101/gr.276496.121). Please check out our full collection of AnVIL and related resources: https://hutchdatascience.org/AnVIL_Collection/ - diff --git a/resources/exclude_files.txt b/resources/exclude_files.txt new file mode 100644 index 0000000..5525a40 --- /dev/null +++ b/resources/exclude_files.txt @@ -0,0 +1,8 @@ +About.Rmd +docs/* +style-sets/* +manuscript/* +CONTRIBUTING.md +LICENSE.md +code_of_conduct.md +README.md diff --git a/scripts/anvil_repo_check.R b/scripts/anvil_repo_check.R deleted file mode 100644 index b39fd56..0000000 --- a/scripts/anvil_repo_check.R +++ /dev/null @@ -1,97 +0,0 @@ -#!/usr/bin/env Rscript - -library(optparse) -library(httr) -library(jsonlite) -library(dplyr) -library(readr) -library(tidyr) -library(stringr) - -option_list <- list( - optparse::make_option( - c("--git_pat"), - type = "character", - default = NULL, - help = "GitHub personal access token", - ) -) - -# Read the GH_PAT argument -opt_parser <- optparse::OptionParser(option_list = option_list) -opt <- optparse::parse_args(opt_parser) -git_pat <- opt$git_pat - -# --------- Set url and token --------- - -message(paste("Querying Github API...")) - -# Request search results specific to jhudsl + fhdsl + DataTrail organizations -# Also allows us to pull in repos forked into these organizations -url <- "https://api.github.com/search/repositories?q=user:jhudsl+user:fhdsl+fork:true&per_page=50" - -# Provide the appropriate GH token & Make the request -req <- GET(url = url, config = add_headers(Authorization = paste("token", git_pat))) - -if (!(httr::http_error(req))) { - message(paste("API request successful!")) -} else { - stop("API request failed!") -} - -# --------- Traverse pages --------- - -# Pull out the last page number of the request -last <- str_extract(req$headers$link, pattern = '.(?=>; rel=\"last\")') - -full_repo_df <- tibble() -for (page in 1:last){ - - url <- paste0("https://api.github.com/search/repositories?q=user:jhudsl+user:fhdsl+fork:true&per_page=50&page=", page) - message(paste("Gathering results from:", url)) - req <- GET(url = url, config = add_headers(Authorization = paste("token", git_pat))) - repo_dat <- - jsonlite::fromJSON(httr::content(req, as = "text"), flatten = TRUE) - message(paste("... Gathered", nrow(repo_dat$items), "repositories.")) - - repo_df <- - tibble(repo_dat$items) %>% - select(full_name, homepage, html_url, description, private) %>% - separate(full_name, into = c("org", "name"), sep = "/") %>% - - # Collapse topics so they can be printed - bind_cols(tibble(topics = unlist( - lapply(repo_dat$items$topics, paste, collapse = ", ") - ))) %>% - - # Drop private repos and remove org column - filter(!(private)) %>% - select(!c(private, org)) %>% - - # # Rearrange columns - relocate(description, .before = topics) %>% - - # Keep only those with homepages and descriptions - filter(!(is.na(homepage)), homepage != "",!(is.na(description))) %>% - - # Keep only AnVIL related content - mutate(is_anvil = str_detect(topics, "anvil")) %>% - filter(is_anvil) %>% - select(!(is_anvil)) - - full_repo_df <- rbind(full_repo_df, repo_df) %>% - dplyr::arrange(name) -} - -# --------- Save the collection --------- - -# Create an artifact file containing the repos, else write an empty file -if (!dir.exists("resources")) { - dir.create("resources") -} -if (nrow(full_repo_df) > 0) { - readr::write_tsv(full_repo_df, file.path('resources', 'AnVIL_repos.tsv')) -} else { - readr::write_tsv(tibble(), file.path('resources', 'AnVIL_repos.tsv')) -} - diff --git a/scripts/anvil_repo_table.R b/scripts/anvil_repo_table.R deleted file mode 100644 index ac4b8c6..0000000 --- a/scripts/anvil_repo_table.R +++ /dev/null @@ -1,45 +0,0 @@ -library(dplyr) -library(stringr) - -make_anvil_repo_table <- function(exclude = NULL) { - # Read in AnVIL repos found by GHA - df <- tryCatch( - # Check for the file created by GHA - expr = { - df <- - readr::read_tsv("resources/AnVIL_repos.tsv") - - # Filter out any user specified repos (could be some that are in progress, - # templates, etc) - df <- - df %>% - filter(!(name %in% exclude)) - - # Do some cleaning of strings - df$name <- - df$name %>% - stringr::str_replace_all("_Book_", ": ") %>% - stringr::str_replace_all("_", " ") - - # Concatenate columns to create links - df <- - df %>% - mutate(`Book Name` = paste0("[", name, "](", homepage, ") ([github](", html_url, "))")) %>% - arrange(`Book Name`) %>% - rename(Description = description, Topics = topics) %>% - select(`Book Name`, Description, Topics) - - message("Colnames are: \n", paste(colnames(df), collapse='\n')) - - return(df) - }, - # Will error out if file doesn't exist - provides a blank tibble instead - error = function(e) { - df <- tibble(name = "none", html_url = "none") - - message("Rendering table of AnVIL collection failed. Please try rerunning the workflow or if needed, create an issue in the AnVIL_Template repository at https://github.com/jhudsl/AnVIL_Template.") - - return(df) - } - ) -} diff --git a/scripts/git_repo_check.R b/scripts/git_repo_check.R deleted file mode 100644 index fd4b8f5..0000000 --- a/scripts/git_repo_check.R +++ /dev/null @@ -1,97 +0,0 @@ -#!/usr/bin/env Rscript - -# Written by Candace Savonen Sept 2021 - -if (!("optparse" %in% installed.packages())){ - install.packages("optparse") -} - -library(optparse) - -option_list <- list( - optparse::make_option( - c("--repo"), - type = "character", - default = NULL, - help = "GitHub repository name, e.g. jhudsl/OTTR_Template", - ), - optparse::make_option( - c("--git_pat"), - type = "character", - default = NULL, - help = "GitHub personal access token", - ) -) - -# Read the arguments passed -opt_parser <- optparse::OptionParser(option_list = option_list) -opt <- optparse::parse_args(opt_parser) - -repo <- opt$repo -git_pat <- opt$git_pat - -if (!is.character(repo)) { - repo <- as.character(repo) -} - -check_git_repo <- function(repo, git_pat = NULL, silent = TRUE, return_repo = FALSE) { - # Given a repository name, check with git ls-remote whether the repository - # exists and return a TRUE/FALSE - - # Inputs: - # repo: the name of the repository, e.g. jhudsl/OTTR_Template - # git_pat: A personal access token from GitHub. Only necessary if the repository being - # checked is a private repository. - # silent: TRUE/FALSE of whether the warning from the git ls-remote command - # should be echoed back if it does fail. - # return_repo: TRUE/FALSE of whether or not the output from git ls-remote - # should be saved to a file (if the repo exists) - - # Returns: - # A TRUE/FALSE whether or not the repository exists. - # Optionally the output from git ls-remote if return_repo = TRUE. - - message(paste("Checking for remote git repository:", repo)) - - # If silent = TRUE don't print out the warning message from the 'try' - report <- ifelse(silent, suppressWarnings, message) - - if (!is.null(git_pat)) { - # If git_pat is supplied, use it - test_repo <- report( - try(system(paste0("git ls-remote https://", git_pat, "@github.com/", repo), - intern = TRUE, ignore.stderr = TRUE - )) - ) - } else { - - # Try to git ls-remote the repo given - test_repo <- report( - try(system(paste0("git ls-remote https://github.com/", repo), - intern = TRUE, ignore.stderr = TRUE - )) - ) - } - # If 128 is returned as a status attribute it means it failed - exists <- ifelse(is.null(attr(test_repo, "status")), TRUE, FALSE) - - if (return_repo && exists) { - # Make file name - output_file <- paste0("git_ls_remote_", gsub("/", "_", repo)) - - # Tell the user the file was saved - message(paste("Saving output from git ls-remote to file:", output_file)) - - # Write to file - writeLines(exists, file.path(output_file)) - } - - return(exists) -} - -# Change repo name to its Leanpub equivalent: -repo <- gsub("_Template", "", repo) -repo <- paste0(repo, "_Quizzes") - -# Print out the result -write(check_git_repo(repo, git_pat = git_pat), stdout()) diff --git a/scripts/make_screenshots.R b/scripts/make_screenshots.R deleted file mode 100644 index c57a182..0000000 --- a/scripts/make_screenshots.R +++ /dev/null @@ -1,74 +0,0 @@ -#!/usr/bin/env Rscript -# Written by Candace Savonen Jan 2022 - -if (!('devtools' %in% installed.packages())) { - # install.packages("remotes", repos = "http://cran.us.r-project.org") -} - -if (!('optparse' %in% installed.packages())) { - # install.packages("optparse", repos = "http://cran.us.r-project.org") -} - -webshot::install_phantomjs() - -library(optparse) -library(magrittr) - -option_list <- list( - optparse::make_option( - c("--repo"), - type = "character", - default = NULL, - help = "GitHub repository name, e.g. jhudsl/OTTR_Template", - ), - optparse::make_option( - c("--git_pat"), - type = "character", - default = NULL, - help = "GitHub personal access token", - ), - optparse::make_option( - c("--output_dir"), - type = "character", - default = "resources/chapt_screen_images", - help = "Output directory where the chapter's screen images should be stored", - ), - optparse::make_option( - c("--base_url"), - type = "character", - default = NULL, - help = "Output directory where the chapter's screen images should be stored", - ) -) - -# Read the arguments passed -opt_parser <- optparse::OptionParser(option_list = option_list) -opt <- optparse::parse_args(opt_parser) - -output_folder <- file.path(opt$output_dir) -if (!dir.exists(output_folder)) { - dir.create(output_folder, recursive = TRUE) -} - -if (is.null(opt$base_url)) { - base_url <- cow::get_pages_url(repo_name = opt$repo, git_pat = opt$git_pat) - base_url <- gsub("/$", "", base_url) -} - -chapt_df <- ottrpal::get_chapters(base_url = file.path(base_url, "no_toc/")) - -file_names <- lapply(chapt_df$url, function(url) { - file_name <- gsub(".html", ".png", file.path(output_folder, basename(url))) - # Get rid of special characters - webshot::webshot(url, file_name) - file_name <- gsub(":|?|!|\\'", "", file_name) - message(paste("Screenshot saved:", file_name)) - return(file_name) -}) - -# Save file of chapter urls and file_names -chapt_df %>% - dplyr::mutate(img_path = unlist(file_names)) %>% - readr::write_tsv(file.path(output_folder, "chapter_urls.tsv")) - -message(paste("Image Chapter key written to: ", file.path(output_folder, "chapter_urls.tsv"))) diff --git a/scripts/ottr-fy.R b/scripts/ottr-fy.R deleted file mode 100644 index aa079ce..0000000 --- a/scripts/ottr-fy.R +++ /dev/null @@ -1,67 +0,0 @@ -#!/usr/bin/env Rscript - -# This script downloads all the files and sets up the folders you need to -# OTTR-fy a repository that has markdown or R Markdown files - -system("git checkout -b 'robot/ottr-fy'") - -if (!('optparse' %in% installed.packages())) { - install.packages("optparse") -} -library(optparse) -library(magrittr) - -option_list <- list( - optparse::make_option( - c("--bookdown"), - action = "store_true", - help = "Is this a bookdown repository already? If used, means bookdown repo.", - ) -) - -# Read the arguments passed -opt_parser <- optparse::OptionParser(option_list = option_list) -opt <- optparse::parse_args(opt_parser) - -# Find .git root directory -root_dir <- rprojroot::find_root(rprojroot::has_dir(".git")) - -base_url <- "https://raw.githubusercontent.com/jhudsl/OTTR_Template/main/" - -needed_files <- c( - ".github/workflows/pull_request.yml", - ".github/workflows/render-all.yml", - ".github/workflows/delete-preview.yml", - "scripts/git_repo_check.R", - "scripts/make_screenshots.R", - "_bookdown.yml", - "_output.yml", - "book.bib", - "config_automation.yml", - "assets/big-image.html", - "assets/footer.html" - ) - -# If this is bookdown, we don't want to copy over the bookdown.yml or output.yml files -if (opt$bookdown) { - needed_files <- setdiff(needed_files, - c("_bookdown.yml", "_output.yml", "assets/big-image.html", "assets/footer.html", "book.bib")) -} - -# Set up a file list with the destination locations as the names -url_to_files <- paste0(base_url, needed_files) -names(url_to_files) <- file.path(root_dir, needed_files) - -# Download the file in the respective place -for (index in 1:length(url_to_files)) { - dest_folder <- dirname(names(url_to_files)[index]) - if (!dir.exists(dest_folder)){ - dir.create(dest_folder, recursive = TRUE) - } - download.file(url = url_to_files[index], destfile = names(url_to_files)[index]) -} - -system("git add .") -system("git config commit.gpgsign false") -system("git commit -m 'Add ottr-fying files'") -system("git push --set-upstream origin robot/ottr-fy") diff --git a/scripts/quiz-check.R b/scripts/quiz-check.R deleted file mode 100644 index 9c10ee9..0000000 --- a/scripts/quiz-check.R +++ /dev/null @@ -1,39 +0,0 @@ -#!/usr/bin/env Rscript - -# Adapted for this jhudsl repository by Candace Savonen Mar 2022 - -# Run spell check and save results - -library(magrittr) - -# Find .git root directory -root_dir <- rprojroot::find_root(rprojroot::has_dir(".git")) - -output_file <- file.path(root_dir, 'check_reports', 'question_error_report.tsv') - -if (!dir.exists('check_reports')) { - dir.create('check_reports') -} - -ottrpal::check_quizzes(quiz_dir = file.path(root_dir, 'quizzes'), write_report = TRUE, verbose = TRUE) - -if (file.exists("question_error_report.tsv")) { - quiz_errors <- readr::read_tsv("question_error_report.tsv") - - file.copy('question_error_report.tsv', file.path(root_dir, 'check_reports')) - file.remove('question_error_report.tsv') - - # Print out how many quiz check errors - write(nrow(quiz_errors), stdout()) - -} else { - quiz_errors <- data.frame(errors = NA) - - # Print out how many quiz check errors - write("1", stdout()) -} - -# Save question errors to file -readr::write_tsv(quiz_errors, output_file) - -message(paste0("Saved to: ", output_file)) diff --git a/scripts/spell-check.R b/scripts/spell-check.R deleted file mode 100644 index 58f1b17..0000000 --- a/scripts/spell-check.R +++ /dev/null @@ -1,67 +0,0 @@ -#!/usr/bin/env Rscript - -# This code was originally written by Josh Shapiro and Candace Savonen -# for the Childhood Cancer Data Lab an initiative of Alexs Lemonade Stand Foundation. -# https://github.com/AlexsLemonade/refinebio-examples/blob/33cdeff66d57f9fe8ee4fcb5156aea4ac2dce07f/.github/workflows/style-and-sp-check.yml#L1 - -# Adapted for this jhudsl repository by Candace Savonen Apr 2021 - -# Run spell check and save results - -library(magrittr) - -if (!("spelling" %in% installed.packages())){ - install.packages("spelling") -} -# Find .git root directory -root_dir <- rprojroot::find_root(rprojroot::has_dir(".git")) - -# Set up output file directory -output_file <- file.path(root_dir, 'check_reports', 'spell_check_results.tsv') - -if (!dir.exists('check_reports')) { - dir.create('check_reports') -} - -dictionary_file <- file.path(root_dir, 'resources', 'dictionary.txt') - -if (!file.exists(dictionary_file)) { - message(paste("No dictionary text file found at:", dictionary_file, "downloading one from the main OTTR Template repo")) - download.file("https://raw.githubusercontent.com/jhudsl/OTTR_Template/main/resources/dictionary.txt", - destfile = dictionary_file) -} - -# Read in dictionary -dictionary <- readLines(dictionary_file) - -# Only declare `.Rmd` files but not the ones in the style-sets directory -files <- list.files(pattern = 'Rmd$', recursive = TRUE, full.names = TRUE) - -# Get quiz file names -quiz_files <- list.files(file.path(root_dir, "quizzes"), pattern = '\\.md$', full.names = TRUE) - -# Put into one list -files <- c(files, quiz_files) - -files <- grep("About.Rmd", files, ignore.case = TRUE, invert = TRUE, value = TRUE) -files <- grep("style-sets", files, ignore.case = TRUE, invert = TRUE, value = TRUE) - -# Run spell check -sp_errors <- spelling::spell_check_files(files, ignore = dictionary) - -if (nrow(sp_errors) > 0) { - sp_errors <- sp_errors %>% - data.frame() %>% - tidyr::unnest(cols = found) %>% - tidyr::separate(found, into = c("file", "lines"), sep = ":") -} else { - sp_errors <- data.frame(errors = NA) -} - -# Print out how many spell check errors -write(nrow(sp_errors), stdout()) - -# Save spell errors to file temporarily -readr::write_tsv(sp_errors, output_file) - -message(paste0("Saved to: ", output_file)) diff --git a/scripts/url-check.R b/scripts/url-check.R deleted file mode 100644 index 4928ea0..0000000 --- a/scripts/url-check.R +++ /dev/null @@ -1,75 +0,0 @@ -#!/usr/bin/env Rscript - -# Adapted for this jhudsl repository by Candace Savonen Mar 2022 - -# Summarize url checks - -library(magrittr) - -# Find .git root directory -root_dir <- rprojroot::find_root(rprojroot::has_dir(".git")) - -ignore_urls_file <- file.path(root_dir, "resources", "ignore-urls.txt") - -if (!file.exists(ignore_urls_file)) { - message(paste("No ignore URLs text file found at:", ignore_urls_file, "downloading one from the main OTTR Template repo")) - download.file("https://raw.githubusercontent.com/jhudsl/OTTR_Template/main/resources/ignore-urls.txt", - destfile = ignore_urls_file) -} -ignore_urls <- readLines(ignore_urls_file) - -output_file <- file.path(root_dir, 'check_reports', 'url_checks.tsv') - -if (!dir.exists('check_reports')) { - dir.create('check_reports') -} - -# Only declare `.Rmd` files but not the ones in the style-sets directory -files <- list.files(path = root_dir, pattern = 'md$', full.names = TRUE) - -test_url <- function(url) { - message(paste0("Testing: ", url)) - url_status <- try(httr::GET(url), silent = TRUE) - status <- ifelse(suppressMessages(grepl("Could not resolve host", url_status)), "failed", "success") - return(status) -} - -get_urls <- function(file) { - # Read in a file and return the urls from it - content <- readLines(file) - content <- grep("http[s]?://", content, value = TRUE) - url_pattern <- "http[s]?://.+?[\"|\\)| |,|}]" - urls <- stringr::str_extract(content, url_pattern) - urls <- urls[!is.na(urls)] - if (length(urls) > 0 ){ - urls <- gsub("\\)$|\"|)$", "", urls) - urls_status <- sapply(urls, test_url) - url_df <- data.frame(urls, urls_status, file) - return(url_df) - } -} - -# Run this for all Rmds -all_urls <- lapply(files, get_urls) - -# Write the file -all_urls_df <- dplyr::bind_rows(all_urls) %>% - dplyr::filter(!is.na(urls)) - -if (nrow(all_urls_df) > 0) { - failed_urls_df <- all_urls_df %>% - dplyr::filter(urls_status == "failed") -} else { - failed_urls_df <- data.frame(errors = NA) -} - -failed_urls_df <- failed_urls_df %>% - dplyr::filter(!(urls %in% ignore_urls)) - -# Save spell errors to file temporarily -readr::write_tsv(failed_urls_df, output_file) - -message(paste0("Saved to: ", output_file)) - -# Print out how many spell check errors -write(nrow(failed_urls_df), stdout()) diff --git a/student-guide/_bookdown.yml b/student-guide/_bookdown.yml new file mode 100644 index 0000000..5c247d7 --- /dev/null +++ b/student-guide/_bookdown.yml @@ -0,0 +1,13 @@ +book_filename: "Student_Guide" +chapter_name: "Chapter " +repo: https://github.com/jhudsl/AnVIL_Template/ +rmd_files: ["index.Rmd", + "09-student_guide.Rmd", + "References.Rmd"] +new_session: yes +bibliography: [book.bib] +delete_merged_file: true +language: + ui: + chapter_name: "Chapter" +output_dir: "student-guide" diff --git a/style-sets/AnVIL/_output.yml b/style-sets/AnVIL/_output.yml index 9b76c2c..f1d6e6a 100644 --- a/style-sets/AnVIL/_output.yml +++ b/style-sets/AnVIL/_output.yml @@ -2,6 +2,7 @@ bookdown::gitbook: # When using multiple css files, the default file path will be the first one # css: [assets/style.css, assets/AnVIL_style/anvil.css] includes: + in_header: GA_Script.html before_body: assets/AnVIL_style/big-image_anvil.html after_body: assets/AnVIL_style/footer.html highlight: tango @@ -15,4 +16,6 @@ bookdown::gitbook: <p style="text-align:center;"> <a href="https://hutchdatascience.org/"> The Fred Hutch Data Science Lab </a></p> <a href="https://hutchdatascience.org/" target="_blank"><img src="https://raw.githubusercontent.com/jhudsl/OTTR_Template/main/style-sets/fhdasl/copy_to_assets/big-dasl-stacked.png" style="width: 80%; padding-left: 34px; padding-top: 8px;"</a> <p style="text-align:center; font-size: 12px;"> <a href="https://github.com/rstudio4edu/rstudio4edu-book/"> Style adapted from: rstudio4edu-book </a> <a href ="https://creativecommons.org/licenses/by/2.0/"> (CC-BY 2.0) </a></p> - <p style="padding-left: 40px;"><div class="trapezoid" style = "padding-left: 40px;"><span> <a href="https://forms.gle/AK12iVXTjsB7yCUUA"> Click here to provide feedback</a> <img src="assets/itcr_arrow.png" style=" width: 10%" ></span></div></p> + <p style="padding-left: 40px;"><div class="trapezoid" style = "padding-left: 40px;"><span><a href="https://docs.google.com/forms/d/e/1FAIpQLScrDVb_utm55pmb_SHx-RgELTEbCCWdLea0T3IzS0Oj00GE4w/viewform?usp=pp_url&entry.1565230805=AnVIL+Book+Name"> Click here to provide feedback</a> <img src="assets/itcr_arrow.png" style=" width: 10%" ></span></div></p> + +# Note: Do not edit the feedback link in this file. This is automatically edited through the render-preview and render-bookdown workflows. You can deactivate this behavior in config_automation.yml. \ No newline at end of file diff --git a/style-sets/AnVIL/index.Rmd b/style-sets/AnVIL/index.Rmd index 0ae4626..d204825 100644 --- a/style-sets/AnVIL/index.Rmd +++ b/style-sets/AnVIL/index.Rmd @@ -38,3 +38,4 @@ Please check out our full collection of AnVIL and related resources: https://hut <!-- - Objective 3 --> <!-- Please also see the Bioinformatics core competencies for undergraduate life sciences education from NIBLSE: https://journals.plos.org/plosone/article/figure?id=10.1371/journal.pone.0196878.t002 --> + diff --git a/style-sets/AnVIL_FH/_output.yml b/style-sets/AnVIL_FH/_output.yml index 9b76c2c..7cba311 100644 --- a/style-sets/AnVIL_FH/_output.yml +++ b/style-sets/AnVIL_FH/_output.yml @@ -15,4 +15,6 @@ bookdown::gitbook: <p style="text-align:center;"> <a href="https://hutchdatascience.org/"> The Fred Hutch Data Science Lab </a></p> <a href="https://hutchdatascience.org/" target="_blank"><img src="https://raw.githubusercontent.com/jhudsl/OTTR_Template/main/style-sets/fhdasl/copy_to_assets/big-dasl-stacked.png" style="width: 80%; padding-left: 34px; padding-top: 8px;"</a> <p style="text-align:center; font-size: 12px;"> <a href="https://github.com/rstudio4edu/rstudio4edu-book/"> Style adapted from: rstudio4edu-book </a> <a href ="https://creativecommons.org/licenses/by/2.0/"> (CC-BY 2.0) </a></p> - <p style="padding-left: 40px;"><div class="trapezoid" style = "padding-left: 40px;"><span> <a href="https://forms.gle/AK12iVXTjsB7yCUUA"> Click here to provide feedback</a> <img src="assets/itcr_arrow.png" style=" width: 10%" ></span></div></p> + <p style="padding-left: 40px;"><div class="trapezoid" style = "padding-left: 40px;"><span><a href="https://docs.google.com/forms/d/e/1FAIpQLScrDVb_utm55pmb_SHx-RgELTEbCCWdLea0T3IzS0Oj00GE4w/viewform?usp=pp_url&entry.1565230805=your+course"> Click here to provide feedback</a> <img src="assets/itcr_arrow.png" style=" width: 10%" ></span></div></p> + +# Note: Do not edit the feedback link in this file. This is automatically edited through the render-preview and render-bookdown workflows. \ No newline at end of file diff --git a/style-sets/AnVIL_JHU/_output.yml b/style-sets/AnVIL_JHU/_output.yml index ba187ea..a3a7145 100644 --- a/style-sets/AnVIL_JHU/_output.yml +++ b/style-sets/AnVIL_JHU/_output.yml @@ -15,5 +15,6 @@ bookdown::gitbook: <p style="text-align:center;"> <a href="http://jhudatascience.org/"> The Johns Hopkins Data Science Lab </a></p> <a href="http://jhudatascience.org/"><img src="https://jhudatascience.org/images/dasl.png" style=" width: 80%; padding-left: 40px; padding-top: 8px; vertical-align: top "</a> <p style="text-align:center; font-size: 12px;"> <a href="https://github.com/rstudio4edu/rstudio4edu-book/"> Style adapted from: rstudio4edu-book </a> <a href ="https://creativecommons.org/licenses/by/2.0/"> (CC-BY 2.0) </a></p> - <p style="padding-left: 40px;"><div class="trapezoid" style = "padding-left: 40px;"><span> <a href="https://forms.gle/AK12iVXTjsB7yCUUA"> Click here to provide feedback</a> <img src="assets/itcr_arrow.png" style=" width: 10%" ></span></div></p> - \ No newline at end of file + <p style="padding-left: 40px;"><div class="trapezoid" style = "padding-left: 40px;"><span><a href="https://docs.google.com/forms/d/e/1FAIpQLScrDVb_utm55pmb_SHx-RgELTEbCCWdLea0T3IzS0Oj00GE4w/viewform?usp=pp_url&entry.1565230805=your+course"> Click here to provide feedback</a> <img src="assets/itcr_arrow.png" style=" width: 10%" ></span></div></p> + +# Note: Do not edit the feedback link in this file. This is automatically edited through the render-preview and render-bookdown workflows. \ No newline at end of file diff --git a/style-sets/GDSCN/_output.yml b/style-sets/GDSCN/_output.yml index 338cd83..4156fd7 100644 --- a/style-sets/GDSCN/_output.yml +++ b/style-sets/GDSCN/_output.yml @@ -15,5 +15,6 @@ bookdown::gitbook: <p style="text-align:center;"> <a href="https://hutchdatascience.org/"> The Fred Hutch Data Science Lab </a></p> <a href="https://hutchdatascience.org/" target="_blank"><img src="https://raw.githubusercontent.com/jhudsl/OTTR_Template/main/style-sets/fhdasl/copy_to_assets/big-dasl-stacked.png" style="width: 80%; padding-left: 34px; padding-top: 8px;"</a> <p style="text-align:center; font-size: 12px;"> <a href="https://github.com/rstudio4edu/rstudio4edu-book/"> Style adapted from: rstudio4edu-book </a> <a href ="https://creativecommons.org/licenses/by/2.0/"> (CC-BY 2.0) </a></p> - <p style="padding-left: 40px;"><div class="trapezoid" style = "padding-left: 40px;"><span> <a href="https://forms.gle/AK12iVXTjsB7yCUUA"> Click here to provide feedback</a> <img src="assets/itcr_arrow.png" style=" width: 10%" ></span></div></p> - \ No newline at end of file + <p style="padding-left: 40px;"><div class="trapezoid" style = "padding-left: 40px;"><span><a href="https://docs.google.com/forms/d/e/1FAIpQLScrDVb_utm55pmb_SHx-RgELTEbCCWdLea0T3IzS0Oj00GE4w/viewform?usp=pp_url&entry.1565230805=your+course"> Click here to provide feedback</a> <img src="assets/itcr_arrow.png" style=" width: 10%" ></span></div></p> + +# Note: Do not edit the feedback link in this file. This is automatically edited through the render-preview and render-bookdown workflows. \ No newline at end of file diff --git a/style-sets/GDSCN_JHU/_output.yml b/style-sets/GDSCN_JHU/_output.yml index cb0d27f..2bbb202 100644 --- a/style-sets/GDSCN_JHU/_output.yml +++ b/style-sets/GDSCN_JHU/_output.yml @@ -15,5 +15,6 @@ bookdown::gitbook: <p style="text-align:center;"> <a href="http://jhudatascience.org/"> The Johns Hopkins Data Science Lab </a></p> <a href="http://jhudatascience.org/"><img src="https://jhudatascience.org/images/dasl.png" style=" width: 80%; padding-left: 40px; padding-top: 8px; vertical-align: top "</a> <p style="text-align:center; font-size: 12px;"> <a href="https://github.com/rstudio4edu/rstudio4edu-book/"> Style adapted from: rstudio4edu-book </a> <a href ="https://creativecommons.org/licenses/by/2.0/"> (CC-BY 2.0) </a></p> - <p style="padding-left: 40px;"><div class="trapezoid" style = "padding-left: 40px;"><span> <a href="https://forms.gle/AK12iVXTjsB7yCUUA"> Click here to provide feedback</a> <img src="assets/itcr_arrow.png" style=" width: 10%" ></span></div></p> - \ No newline at end of file + <p style="padding-left: 40px;"><div class="trapezoid" style = "padding-left: 40px;"><span><a href="https://docs.google.com/forms/d/e/1FAIpQLScrDVb_utm55pmb_SHx-RgELTEbCCWdLea0T3IzS0Oj00GE4w/viewform?usp=pp_url&entry.1565230805=your+course"> Click here to provide feedback</a> <img src="assets/itcr_arrow.png" style=" width: 10%" ></span></div></p> + +# Note: Do not edit the feedback link in this file. This is automatically edited through the render-preview and render-bookdown workflows. \ No newline at end of file diff --git a/style-sets/fhdasl/_output.yml b/style-sets/fhdasl/_output.yml index d00716f..0a86496 100644 --- a/style-sets/fhdasl/_output.yml +++ b/style-sets/fhdasl/_output.yml @@ -11,7 +11,8 @@ bookdown::gitbook: before: | <a href="https://hutchdatascience.org/" target="_blank"><img src="assets/big-dasl-stacked.png" style="width: 80%; padding-left: 34px; padding-top: 8px;"</a> after: | - <p style="text-align:center;"> <a href="https://github.com/jhudsl/OTTR_Template" target="blank" > This content was published with</a> <a href="https://bookdown.org/" target="blank"> bookdown by: </a> </p> + <p style="text-align:center;"> <a href="https://www.ottrproject.org/" target="blank" > This content was published with</a> <a href="https://bookdown.org/" target="blank"> bookdown using</a> </p> + <p style="text-align:center;"> <a href="https://github.com/jhudsl/OTTR_Template"> The OTTR Template by:</a></p> <p style="text-align:center;"> <a href="https://hutchdatascience.org/"> The Fred Hutch Data Science Lab </a></p> <p style="text-align:center; font-size: 12px;"> <a href="https://github.com/rstudio4edu/rstudio4edu-book/"> Style adapted from: rstudio4edu-book </a> <a href ="https://creativecommons.org/licenses/by/2.0/"> (CC-BY 2.0) </a></p> <p style="padding-left: 40px;"><div class="trapezoid" style = "padding-left: 40px;"><span> <a href="https://forms.gle/W6Mg4rzuMK6Yk3Am8"> Click here to provide feedback</a> <img src="assets/itcr_arrow.png" style=" width: 10%" ></span></div></p>