From 136b7680ec671fb209a825c6856b44fa8fb37b1d Mon Sep 17 00:00:00 2001
From: cansavvy
Date: Tue, 17 Sep 2024 20:00:02 +0000
Subject: [PATCH 1/8] =?UTF-8?q?=F0=9F=94=84=20Synced=20local=20'.github/wo?=
=?UTF-8?q?rkflows/'=20with=20remote=20'.github/workflows/'?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
release-
---
.github/workflows/check-url.yml | 107 +++++++
.github/workflows/delete-preview.yml | 16 +-
.github/workflows/docker-build-test.yml | 97 ------
.github/workflows/pull_request.yml | 238 +++++++++++++++
.github/workflows/render-all.yml | 279 ++++++++++++++++++
.github/workflows/render-bookdown.yml | 97 ------
.github/workflows/render-preview.yml | 84 ------
.github/workflows/style-and-sp-check.yml | 62 ----
.github/workflows/transfer-rendered-files.yml | 128 ++++----
.github/workflows/url-checker.yml | 36 ---
10 files changed, 687 insertions(+), 457 deletions(-)
create mode 100644 .github/workflows/check-url.yml
delete mode 100644 .github/workflows/docker-build-test.yml
create mode 100644 .github/workflows/pull_request.yml
create mode 100644 .github/workflows/render-all.yml
delete mode 100644 .github/workflows/render-bookdown.yml
delete mode 100644 .github/workflows/render-preview.yml
delete mode 100644 .github/workflows/style-and-sp-check.yml
delete mode 100644 .github/workflows/url-checker.yml
diff --git a/.github/workflows/check-url.yml b/.github/workflows/check-url.yml
new file mode 100644
index 0000000..a437049
--- /dev/null
+++ b/.github/workflows/check-url.yml
@@ -0,0 +1,107 @@
+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 }}
+
+ - 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 419d2f4..faa83cc 100644
--- a/.github/workflows/delete-preview.yml
+++ b/.github/workflows/delete-preview.yml
@@ -7,17 +7,21 @@ on:
types: [closed]
jobs:
- build-all:
+ delete-preview:
runs-on: ubuntu-latest
steps:
+
# This is because if a PR is closed before a render finishes it won't find it.
- name: Sleep for 5 minutes
run: sleep 300s
shell: bash
- # Delete the branch!
- - name: Delete branch
- uses: dawidd6/action-delete-branch@v3
+ # Check out current repository
+ - name: checkout
+ uses: actions/checkout@v4
with:
- github_token: ${{ secrets.GH_PAT }}
- branches: preview-${{ github.event.pull_request.number }}
+ fetch-depth: 0
+
+ # Delete the branch!
+ - name: Delete branch locally and remotely
+ run: git push origin --delete preview-${{ github.event.pull_request.number }} || echo "No branch to delete"
diff --git a/.github/workflows/docker-build-test.yml b/.github/workflows/docker-build-test.yml
deleted file mode 100644
index 84fc0a1..0000000
--- a/.github/workflows/docker-build-test.yml
+++ /dev/null
@@ -1,97 +0,0 @@
-# This code was originally written by Josh Shapiro
-# 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
-
-name: Test build of Dockerfile
-
-# Controls when the action will run. Triggers the workflow for a pull request for
-# master
-on:
- release:
- types:
- - created
- pull_request:
- branches:
- - 'main'
- paths: [ docker/Dockerfile, docker/github_package_list.tsv ]
- workflow_dispatch:
- inputs:
- dockerhubpush:
- description: 'Push to Dockerhub?'
- required: true
- default: 'false'
-
-# A workflow run is made up of one or more jobs that can run sequentially or in parallel
-jobs:
- # This workflow contains a single job called "build"
- build:
- # The type of runner that the job will run on
- runs-on: ubuntu-latest
-
- # Steps represent a sequence of tasks that will be executed as part of the job
- steps:
- # Checks-out your repository under $GITHUB_WORKSPACE, so your job can access it
- - uses: actions/checkout@v2
-
- - name: Don't re-test if this is a sync branch
- if: ${{ github.head_ref == 'repo-sync/DaSL_Course_Template_Bookdown/default' }}
- run: |
- echo This was tested on DaSL_Course_Template_Bookdown no need to re-run
- exit 1
-
- # Set up Docker build
- - name: Set up Docker Buildx
- uses: docker/setup-buildx-action@v1
-
- # Setup layer cache
- - name: Cache Docker layers
- uses: actions/cache@v2
- with:
- path: /tmp/.buildx-cache
- key: ${{ runner.os }}-buildx-${{ github.sha }}
- restore-keys: |
- ${{ runner.os }}-buildx-
-
- # Set up Docker build
- - name: Set up Docker Build
- uses: docker/setup-buildx-action@v1
-
- - name: Get token
- run: echo ${{ secrets.GH_PAT }} > docker/git_token.txt
-
- # Build docker image
- - name: Build Docker image
- uses: docker/build-push-action@v2
- with:
- push: false
- load: true
- context: docker
- file: docker/Dockerfile
- tags: jhudsl/course_template
-
- # Login to Dockerhub
- - name: Login to DockerHub
- if: ${{ github.event.inputs.dockerhubpush != 'false' }}
- uses: docker/login-action@v1
- with:
- username: ${{ secrets.DOCKERHUB_USERNAME }}
- password: ${{ secrets.DOCKERHUB_TOKEN }}
-
- # Push the Docker image if set to true from a manual trigger
- - name: Push Docker image if manual trigger set to true
- if: ${{ github.event.inputs.dockerhubpush != 'false' }}
- run: docker push jhudsl/course_template
-
- - name: Get the version
- id: get_version
- run: |
- echo ::set-output name=version::$(echo $GITHUB_REF | cut -d / -f 3)
-
- # Push the Docker image if it is a release
- - name: Push Docker image if release
- if: ${{ github.event_name == 'release' }}
- run: |
- docker tag jhudsl/course_template jhudsl/course_template:${{ steps.get_version.outputs.version }}
- docker push jhudsl/course_template:1.0
diff --git a/.github/workflows/pull_request.yml b/.github/workflows/pull_request.yml
new file mode 100644
index 0000000..5cd835e
--- /dev/null
+++ b/.github/workflows/pull_request.yml
@@ -0,0 +1,238 @@
+# Candace Savonen 2021
+# Updated May 2024
+
+name: Pull Request
+
+on:
+ pull_request:
+ branches: [ main, staging ]
+
+jobs:
+
+ yaml-check:
+ name: Load user automation choices
+ runs-on: ubuntu-latest
+ steps:
+ - name: Checkout
+ uses: actions/checkout@v4
+ with:
+ fetch-depth: 0
+ token: ${{ secrets.GH_PAT }}
+
+ # 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.
+
+ # Delete the branch if this has been run before
+ - name: Delete branch locally and remotely
+ run: git push origin --delete preview-${{ github.event.pull_request.number }} || 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'
+
+ 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 || 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_render_preview: "${{ env.RENDER_PREVIEW }}"
+ rendering_docker_image: "${{ env.RENDERING_DOCKER_IMAGE }}"
+
+########################## Make the error reports ##############################
+ spell-check:
+ name: Check spelling
+ needs: yaml-check
+ if: ${{needs.yaml-check.outputs.toggle_spell_check == 'yes'}}
+ uses: jhudsl/ottr-reports/.github/workflows/report-maker.yml@main
+ with:
+ check_type: spelling
+ error_min: 3
+ gh_pat: secrets.GH_PAT
+ branch_name: ${GITHUB_HEAD_REF}
+
+ url-check:
+ name: Check URLs
+ needs: yaml-check
+ if: ${{needs.yaml-check.outputs.toggle_url_check == 'yes'}}
+ uses: jhudsl/ottr-reports/.github/workflows/report-maker.yml@main
+ with:
+ check_type: urls
+ error_min: 0
+ gh_pat: secrets.GH_PAT
+ branch_name: ${GITHUB_HEAD_REF}
+
+ quiz-check:
+ name: Check quiz formatting
+ if: ${{needs.yaml-check.outputs.toggle_quiz_check == 'yes'}}
+ needs: yaml-check
+ uses: jhudsl/ottr-reports/.github/workflows/report-maker.yml@main
+ with:
+ check_type: quiz_format
+ error_min: 0
+ gh_pat: secrets.GH_PAT
+ branch_name: ${GITHUB_HEAD_REF}
+
+############################# Style the code ###################################
+ style-code:
+ name: Style code
+ needs: yaml-check
+ runs-on: ubuntu-latest
+ if: ${{needs.yaml-check.outputs.toggle_style_code == 'yes'}}
+ container:
+ image: jhudsl/base_ottr:main
+
+ steps:
+ - name: Checkout files
+ uses: actions/checkout@v4
+ with:
+ fetch-depth: 0
+
+ - name: Run styler
+ 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 \*md
+ git commit -m 'Style *mds' || echo "No changes to commit"
+ git push origin || echo "No changes to commit"
+
+############################# Render Preview ###################################
+
+ render-preview:
+ name: Render preview
+ needs: yaml-check
+ runs-on: ubuntu-latest
+ container:
+ image: ${{needs.yaml-check.outputs.rendering_docker_image}}
+ if: ${{needs.yaml-check.outputs.toggle_render_preview == 'yes'}}
+
+ steps:
+ - name: Checkout files
+ uses: actions/checkout@v4
+ with:
+ fetch-depth: 0
+
+ # Set up git checkout
+ - name: Set up git checkout
+ 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'
+
+ branch_name='preview-${{ github.event.pull_request.number }}'
+ git fetch --all
+ git checkout $branch_name
+ git merge -s recursive --strategy-option=theirs origin/${{ github.head_ref }} --allow-unrelated-histories
+ shell: bash
+
+ # 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('.')"
+
+ # 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 Rmd render steps
+ if: ${{needs.yaml-check.outputs.toggle_website == 'rmd' }}
+ run: |
+ echo Bookdown status ${{steps.bookdown.outcome}}
+ 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
+ id: commit
+ run: |
+ branch_name='preview-${{ github.event.pull_request.number }}'
+ git diff origin/main -- docs >/dev/null && changes=true || changes=false
+ echo "changes=$changes" >> $GITHUB_OUTPUT
+ git add . --force
+ git commit -m 'Render preview' || echo "No changes to commit"
+ git pull --rebase --set-upstream origin $branch_name --allow-unrelated-histories --strategy-option=ours
+ git push --force || echo "No changes to commit"
+ shell: bash
+
+ - name: Find Comment
+ uses: peter-evans/find-comment@v2
+ id: fc
+ with:
+ issue-number: ${{ github.event.pull_request.number }}
+ comment-author: 'github-actions[bot]'
+ body-includes: latest commit
+
+ - name: Build components of the comment
+ id: build-components
+ run: |
+ course_name=$(head -n 1 _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")
+ docx_link=$(echo "https://github.com/$GITHUB_REPOSITORY/raw/preview-${{ github.event.pull_request.number }}/docs/$course_name.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 "docx_link=$docx_link" >> $GITHUB_OUTPUT
+ echo "time=$(date +'%Y-%m-%d')" >> $GITHUB_OUTPUT
+ echo "commit_id=$GITHUB_SHA" >> $GITHUB_OUTPUT
+ echo ${{steps.commit.outputs.changes}}
+
+ - name: Create or update comment
+ if: steps.commit.outputs.changes == 'true'
+ uses: peter-evans/create-or-update-comment@v2
+ with:
+ comment-id: ${{ steps.fc.outputs.comment-id }}
+ issue-number: ${{ github.event.pull_request.number }}
+ body: |
+ Re-rendered previews from the latest commit:
+ - :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 [.docx file](${{ steps.build-components.outputs.docx_link }})
+
+ \* 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
+ if: steps.commit.outputs.changes == 'false'
+ uses: peter-evans/create-or-update-comment@v2
+ with:
+ comment-id: ${{ steps.fc.outputs.comment-id }}
+ issue-number: ${{ github.event.pull_request.number }}
+ body: |
+ The latest commit did not produce rendering changes.
+
+ _Updated at ${{ steps.build-components.outputs.time }} with changes from ${{ steps.build-components.outputs.commit_id }}_
+ edit-mode: replace
diff --git a/.github/workflows/render-all.yml b/.github/workflows/render-all.yml
new file mode 100644
index 0000000..b2e39b2
--- /dev/null
+++ b/.github/workflows/render-all.yml
@@ -0,0 +1,279 @@
+# Candace Savonen 2021
+# Updated May 2024
+
+name: Render all output courses
+
+on:
+ workflow_dispatch:
+ push:
+ branches: [ main, staging ]
+ paths:
+ - '**md$'
+ - assets/*
+ - quizzes/*
+
+jobs:
+
+ yaml-check:
+ name: Load user automation choices
+ runs-on: ubuntu-latest
+ steps:
+ - name: Checkout
+ uses: actions/checkout@v4
+
+ # 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_website: "${{ env.RENDER_WEBSITE }}"
+ toggle_coursera: "${{ env.RENDER_COURSERA }}"
+ toggle_leanpub: "${{ env.RENDER_LEANPUB }}"
+ make_book_txt: "${{ env.MAKE_BOOK_TXT }}"
+ rendering_docker_image: "${{ env.RENDERING_DOCKER_IMAGE }}"
+ toggle_quiz_check: "${{ env.CHECK_QUIZZES }}"
+
+ render-course:
+ name: Render course preview
+ needs: yaml-check
+ runs-on: ubuntu-latest
+ container:
+ image: ${{needs.yaml-check.outputs.rendering_docker_image}}
+
+ steps:
+ - name: checkout
+ uses: actions/checkout@v4
+ with:
+ fetch-depth: 0
+ token: ${{ secrets.GH_PAT }}
+
+ - name: Login as github actions bot
+ 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'
+
+ # We want a fresh run of the renders each time
+ - name: Delete old 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
+
+ # 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('.')"
+
+ # 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 Rmd render steps
+ if: ${{needs.yaml-check.outputs.toggle_website == 'rmd' }}
+ run: |
+ echo Bookdown status ${{steps.bookdown.outcome}}
+ 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 course files
+ - name: Commit rendered course files
+ env:
+ GH_PAT: ${{ secrets.GH_PAT }}
+ run: |
+ git add --force docs/*
+ git commit -m 'Render course' || echo "No changes to commit"
+ git status docs/*
+ git push -u origin main || echo "No changes to push"
+
+ render-tocless:
+ name: Render TOC-less version for Leanpub or Coursera
+ needs: [yaml-check, render-course]
+ runs-on: ubuntu-latest
+ container:
+ image: ${{needs.yaml-check.outputs.rendering_docker_image}}
+ if: ${{needs.yaml-check.outputs.toggle_coursera == 'yes' || needs.yaml-check.outputs.toggle_leanpub == 'yes'}}
+
+ steps:
+ - name: checkout
+ uses: actions/checkout@v4
+ with:
+ fetch-depth: 0
+ token: ${{ secrets.GH_PAT }}
+
+ - name: Login as github-actions bot
+ 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'
+ 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 -- 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 add --force docs/no_toc*
+ git commit -m 'Render toc-less' || echo "No changes to commit"
+ git status docs/no_toc*
+ git push -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
+ if: ${{needs.yaml-check.outputs.toggle_leanpub == 'yes'}}
+
+ steps:
+ - name: checkout
+ uses: actions/checkout@v4
+ with:
+ fetch-depth: 0
+ token: ${{ secrets.GH_PAT }}
+
+ - name: Login as github actions bot
+ 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'
+ 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
+ run: |
+ # Remove old folder
+ rm -rf resources/chapt_screen_images
+
+ # Make new screenshots
+ 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)
+
+ # We want a fresh run of the renders each time
+ - 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'}}
+ 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 = 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'}}
+ run: |
+ Rscript -e "ottrpal::bookdown_to_embed_leanpub(
+ render = FALSE, \
+ chapt_img_key = 'resources/chapt_screen_images/chapter_urls.tsv', \
+ make_book_txt = as.logical('${{needs.yaml-check.outputs.make_book_txt == 'yes'}}'))"
+
+ # Commit the rendered Leanpub files
+ - name: Commit rendered Leanpub files
+ env:
+ GH_PAT: ${{ secrets.GH_PAT }}
+ run: |
+ mkdir -p manuscript
+ git add --force manuscript/*
+ git add --force resources/*
+ git add --force docs/*
+ git commit -m 'Render Leanpub' || echo "No changes to commit"
+ 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
+ needs: [yaml-check, render-tocless]
+ runs-on: ubuntu-latest
+ container:
+ image: ${{needs.yaml-check.outputs.rendering_docker_image}}
+ if: ${{needs.yaml-check.outputs.toggle_coursera == 'yes'}}
+
+ steps:
+ - name: checkout
+ uses: actions/checkout@v4
+ with:
+ fetch-depth: 0
+ token: ${{ secrets.GH_PAT }}
+
+ - name: Login as github action
+ 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'
+ 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
+ if: needs.yaml-check.outputs.toggle_leanpub == 'yes' && needs.yaml-check.outputs.toggle_quiz_check == 'yes'
+ id: coursera
+ run: Rscript -e "ottrpal::convert_coursera_quizzes()"
+
+ # 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: |
+ 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 status
+ git push -u origin main || echo "No changes to push"
diff --git a/.github/workflows/render-bookdown.yml b/.github/workflows/render-bookdown.yml
deleted file mode 100644
index 61dd531..0000000
--- a/.github/workflows/render-bookdown.yml
+++ /dev/null
@@ -1,97 +0,0 @@
-
-# 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
-
-name: Render Bookdown and Coursera
-
-# Controls when the action will run. Triggers the workflow on push
-# events only for the master branch
-on:
- workflow_dispatch:
- push:
- branches: [ main ]
- paths:
- - '**.Rmd'
- - docker/Dockerfile
- - assets/*
-jobs:
- # This workflow contains a single job called "build-all"
- build-all:
- # The type of runner that the job will run on
- runs-on: ubuntu-latest
- # Steps represent a sequence of tasks that will be executed as part of the job
- steps:
- # Checks-out your repository under $GITHUB_WORKSPACE, so your job can access it
- - name: checkout
- uses: actions/checkout@v2
- with:
- # get the full repo
- fetch-depth: 0
- # use github PAT
- token: ${{ secrets.GH_PAT }}
-
-###### If you will be making changes to the Docker image to make specific to the
-###### course, then highlight this chunk and uncomment it. #####################
-###### Recommend using short cut -- Command and / works for some editors.#######
-###### START OF DOCKER UPDATE CHUNK
- # # Login to Dockerhub
- # - name: Login to DockerHub
- # uses: docker/login-action@v1
- # with:
- # username: ${{ secrets.DOCKERHUB_USERNAME }}
- # password: ${{ secrets.DOCKERHUB_TOKEN }}
- #
- # # Set up Docker build
- # - name: Set up Docker Build
- # uses: docker/setup-buildx-action@v1
- #
- # - name: Get Token
- # run: echo ${{ secrets.GH_PAT }} > docker/git_token.txt
- #
- # # Build docker image
- # - name: Build Docker image
- # uses: docker/build-push-action@v2
- # with:
- # push: false
- # load: true
- # context: docker
- # file: docker/Dockerfile
- # tags: jhudsl/course_template
- #
- # # Push the Docker image
- # - name: Push Docker image
- # run: docker push jhudsl/course_template
-
-###### END OF DOCKER UPDATE CHUNK ##############################################
-
- # Run bookdown rendering
- - name: Run bookdown render
- run: |
- docker run \
- --mount type=bind,target=/home/rstudio,source=$PWD \
- jhudsl/course_template \
- Rscript -e "bookdown::render_book('index.Rmd')"
-
-##### If you do not wish to host your course on Coursera, you can delete this section #####
- # Run Coursera version
- - name: Run Coursera version of render
- run: |
- docker run \
- --mount type=bind,target=/home/rstudio,source=$PWD \
- jhudsl/course_template \
- Rscript -e "leanbuild::render_coursera()"
-
-##### End of Coursera rendering section ########################################
-
- # Commit the rendered bookdown files
- - name: Commit rendered bookdown files
- run: |
- git config --local user.email "actions@github.com"
- git config --local user.name "GitHub Actions"
- git add -A
- git add --force docs/*
- git commit -m 'Render bookdown' || echo "No changes to commit"
- git push origin main || echo "No changes to push"
diff --git a/.github/workflows/render-preview.yml b/.github/workflows/render-preview.yml
deleted file mode 100644
index bdd65fb..0000000
--- a/.github/workflows/render-preview.yml
+++ /dev/null
@@ -1,84 +0,0 @@
-# Candace Savonen Apr 2021
-
-name: Render Preview
-
-# Controls when the action will run. Triggers the workflow on pull request to main branch
-on:
- pull_request:
- branches: [ main ]
-
-jobs:
- # This workflow contains a single job called "build-all"
- build-all:
- # The type of runner that the job will run on
- runs-on: ubuntu-latest
- # Steps represent a sequence of tasks that will be executed as part of the job
- steps:
- # Checks-out your repository under $GITHUB_WORKSPACE, so your job can access it
- - name: checkout
- uses: actions/checkout@v2
- with:
- # get the full repo
- fetch-depth: 0
- # use github PAT
- token: ${{ secrets.GH_PAT }}
-
- # Run bookdown rendering
- - name: Run bookdown render
- run: |
- docker run \
- --mount type=bind,target=/home/rstudio,source=$PWD \
- jhudsl/course_template \
- Rscript -e "bookdown::render_book('index.Rmd')"
-
-##### If you do not wish to host your course on Coursera, you can delete this section #####
- # Run Coursera version
- - name: Run Coursera version of render
- run: |
- docker run \
- --mount type=bind,target=/home/rstudio,source=$PWD \
- jhudsl/course_template \
- Rscript -e "leanbuild::render_coursera()"
-
-##### End of Coursera rendering section ########################################
-
- # Commit the rendered bookdown files
- - name: Commit rendered bookdown files to development branch
- run: |
- git checkout -b "preview-${{ github.event.pull_request.number }}"
- git config --local user.email "actions@github.com"
- git config --local user.name "GitHub Actions"
- git add -A
- git commit -m 'Render bookdown preview' || echo "No changes to commit"
- git push --force origin "preview-${{ github.event.pull_request.number }}" || echo "No changes to push"
-
- - name: Find Comment
- uses: peter-evans/find-comment@v1
- id: fc
- with:
- issue-number: ${{ github.event.pull_request.number }}
- comment-author: 'github-actions[bot]'
- body-includes: Re-rendered
-
- - name: Build components of the comment
- id: build-components
- run: |
- bookdown_link=$(echo "https://htmlpreview.github.io/?https://raw.githubusercontent.com/$GITHUB_REPOSITORY/preview-${{ github.event.pull_request.number }}/docs/index.html")
- coursera_link=$(echo "https://htmlpreview.github.io/?https://raw.githubusercontent.com/$GITHUB_REPOSITORY/preview-${{ github.event.pull_request.number }}/docs/coursera/index.html")
- echo ::set-output name=bookdown_link::$bookdown_link
- echo ::set-output name=coursera_link::$coursera_link
- echo ::set-output name=time::$(date +'%Y-%m-%d')
- echo ::set-output name=commit_id::$GITHUB_SHA
-
- - name: Create or update comment
- uses: peter-evans/create-or-update-comment@v1
- with:
- comment-id: ${{ steps.fc.outputs.comment-id }}
- 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 version here](${{ steps.build-components.outputs.coursera_link }})
-
- _Updated at ${{ steps.build-components.outputs.time }} with changes from ${{ steps.build-components.outputs.commit_id }}_
- edit-mode: replace
diff --git a/.github/workflows/style-and-sp-check.yml b/.github/workflows/style-and-sp-check.yml
deleted file mode 100644
index 11ac002..0000000
--- a/.github/workflows/style-and-sp-check.yml
+++ /dev/null
@@ -1,62 +0,0 @@
-
-# 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
-
-name: Style and spell check R markdowns
-
-# Controls when the action will run. Triggers the workflow on push or pull request
-# events but only for the main branch
-on:
- workflow_dispatch:
- pull_request:
- branches: [ main ]
-
-# A workflow run is made up of one or more jobs that can run sequentially or in parallel
-jobs:
- # This workflow contains a single job called "style and check"
- style-n-check:
- runs-on: ubuntu-latest
- container:
- image: rocker/tidyverse:4.0.2
-
- # Steps represent a sequence of tasks that will be executed as part of the job
- steps:
- - uses: actions/checkout@v2
- # What branch to commit to: the one from the pull request
- with:
- ref: ${{ github.event.pull_request.head.ref }}
-
- - name: Install packages
- run: Rscript -e "install.packages(c('styler', 'spelling'))"
-
- - name: Run spell check
- id: spell_check_run
- run: |
- results=$(Rscript "scripts/spell-check.R")
- echo "::set-output name=sp_chk_results::$results"
- cat spell_check_results.tsv
-
- - name: Archive spelling errors
- uses: actions/upload-artifact@v2
- with:
- name: spell-check-results
- path: spell_check_results.tsv
-
- # If there are too many spelling errors, this will stop the workflow
- - name: Check spell check results - fail if too many errors
- if: ${{ steps.spell_check_run.outputs.sp_chk_results > 3 }}
- run: exit 1
-
- - name: Run styler
- run: Rscript -e "styler::style_file(list.files(pattern = 'Rmd$', recursive = TRUE, full.names = TRUE));warnings()"
-
- - name: Commit
- run: |
- git config --local user.email "actions@github.com"
- git config --local user.name "GitHub Actions"
- git add \*.Rmd
- git commit -m 'Style Rmds' || echo "No changes to commit"
- git push origin || echo "No changes to commit"
diff --git a/.github/workflows/transfer-rendered-files.yml b/.github/workflows/transfer-rendered-files.yml
index 6557a1c..dae4141 100644
--- a/.github/workflows/transfer-rendered-files.yml
+++ b/.github/workflows/transfer-rendered-files.yml
@@ -4,52 +4,72 @@
# Adapted for this jhudsl repository by Candace Savonen Apr 2021
-name: Bookdown to Leanpub repo copy over
-# Copy rendered notebooks to Leanpub repo
+name: Copy over from main template to _Quizzes repo
-# This workflow will run when there are changes to docs/ files in THIS repo
on:
workflow_dispatch:
- # Only run after the render finishes running
workflow_run:
- workflows: [ "Build, Render, and Push" ]
- branches: [ main ]
+ workflows: [ "Render all output courses" ]
+ branches: [ main, staging ]
types:
- completed
jobs:
- file-bookdown-pr:
- # The type of runner that the job will run on
+
+ yaml-check:
+ name: Load user automation choices
runs-on: ubuntu-latest
+ steps:
+ - name: Checkout
+ uses: actions/checkout@v4
+
+ # 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_coursera: "${{ env.RENDER_COURSERA }}"
+ toggle_leanpub: "${{ env.RENDER_LEANPUB }}"
+
+
+ file-quizzes-pr:
+ name: File _Quizzes Transfer PR
+ runs-on: ubuntu-latest
+ container:
+ image: jhudsl/ottrpal:main
+ needs: [yaml-check]
+ if: ${{needs.yaml-check.outputs.toggle_coursera == 'yes' || needs.yaml-check.outputs.toggle_leanpub == 'yes'}}
- # Get repository name by dropping Bookdown if it exists but always append _Leanpub
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
- sudo Rscript -e "install.packages('optparse')"
-
- # What's the LEANPUB repository's name?
- LEANPUB_REPO=$(echo ${GITHUB_REPOSITORY} | sed "s/_Bookdown/ /g" | awk '{print $1"_Leanpub"}')
- echo $LEANPUB_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
+ # 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
# 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 $LEANPUB_REPO exists: $results
+ echo $QUIZ_REPO exists: $results
- echo "::set-output name=git_results::$results"
- echo "::set-output name=leanpub_repo::$LEANPUB_REPO"
+ echo "git_results=$results" >> $GITHUB_OUTPUT
+ echo "leanpub_repo=$QUIZ_REPO" >> $GITHUB_OUTPUT
- name: Checkout code from Leanpub repo
if: ${{ steps.git_repo_check.outputs.git_results == 'TRUE' }}
- uses: actions/checkout@v2
+ uses: actions/checkout@v4
with:
+ path: quizzes
repository: ${{ steps.git_repo_check.outputs.leanpub_repo }}
token: ${{ secrets.GH_PAT }}
@@ -59,74 +79,32 @@ jobs:
env:
GH_PAT: ${{ secrets.GH_PAT }}
run: |
- sudo apt install r-base
- sudo Rscript -e "install.packages('yaml')"
-
- if [ -d "docs/" ]
- then
- # remove old docs/ files and folder
- rm -r docs/*
- fi
- # Copy over docs folder
- svn export --force https://github.com/${GITHUB_REPOSITORY}.git/branches/${GITHUB_REF#refs/heads/}/docs
-
- if [ -d "docs/coursera" ]
- then
- rm -r docs/coursera/*
- fi
-
- # Copy over book.bib file
- svn export --force https://github.com/${GITHUB_REPOSITORY}.git/branches/${GITHUB_REF#refs/heads/}/book.bib
-
- # Get assets folder
- svn export --force https://github.com/${GITHUB_REPOSITORY}.git/branches/${GITHUB_REF#refs/heads/}/assets
-
- # Copy over _bookdown.yml
- svn export --force https://github.com/${GITHUB_REPOSITORY}.git/branches/${GITHUB_REF#refs/heads/}/_bookdown.yml
-
- # Copy over _output.ymls
- svn export --force https://github.com/${GITHUB_REPOSITORY}.git/branches/${GITHUB_REF#refs/heads/}/_output.yml
-
- # Copy over images folder
- svn export --force https://github.com/${GITHUB_REPOSITORY}.git/branches/${GITHUB_REF#refs/heads/}/resources/ resources/
-
- # Get list of Rmds needing to copy
- Rscript --vanilla scripts/get_rmd_filenames.R
-
- # the url from this repo where files will be downloaded from
- base_url=https://${GH_PAT}@raw.githubusercontent.com/${GITHUB_REPOSITORY}/${GITHUB_REF#refs/heads/}
-
- # remove old Rmd files
- rm $(find . -name '*.Rmd' | grep '.Rmd' )
+ # 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
- input="resources/rmd_list.txt"
- while IFS= read -r line
- do
- echo "$line"
- curl --fail -s ${base_url}/${line} > ${line}
- done < "$input"
+ # Copy over _bookdown.yml (from bookdown to quizzes repo)
+ cp bookdown/_bookdown.yml quizzes/_bookdown.yml
- - name: Create PR with rendered docs files
+ - 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
branch: auto_copy_rendered_files
delete-branch: true
- title: 'GHA: Automated transfer of leanbuild-needed files from Bookdown repository'
+ title: 'GHA: Automated transfer of ottrpal-needed files from Bookdown repository'
body: |
### Description:
This PR was initiated by transfer-rendered.yml in the Bookdown repository.
- It copies over the leanbuild-needed files from Bookdown repository:
- - Rmds listed in the _bookdoown.yml
+ It copies over the ottrpal-needed folder (for the `bookdown_to_embed_leanpub(render = FALSE)` function
+ to run properly.
+ - resources/chapt_screen_images/*
- _bookdown.yml
- - docs/*
- - book.bib
- - resources/*
- - _output.yml
labels: |
automated
reviewers: $GITHUB_ACTOR
diff --git a/.github/workflows/url-checker.yml b/.github/workflows/url-checker.yml
deleted file mode 100644
index 2d03a40..0000000
--- a/.github/workflows/url-checker.yml
+++ /dev/null
@@ -1,36 +0,0 @@
-# Adapted from https://github.com/marketplace/actions/url-checker by Candace Savonen
-
-# This github actions tests URLs in the Rmd files, README, and CONTRIBUTING.md
-name: Check URLs
-
-# This will be run upon PRs to main
-on:
- workflow_dispatch:
- pull_request:
- branches: [ main ]
-
-# Here's the main action of checking URLs
-jobs:
- build:
- runs-on: ubuntu-latest
-
- steps:
- - uses: actions/checkout@v2
-
- - name: URLs-checker
- uses: urlstechie/urlchecker-action@master
- with:
- # Delete the cloned repository after running URLchecked (default is false)
- cleanup: true
-
- # A comma-separated list of file types to cover in the URL checks
- file_types: .Rmd
-
- # Choose whether to include file with no URLs in the prints.
- print_all: false
-
- # A comma separated links to exclude during URL checks
- exclude_urls: https://jhudatascience.org/{Course_Name}}
-
- # choose if the force pass or not
- force_pass : true
From cdf4b0ac74f52f036f8cabfd8a184498c38bf672 Mon Sep 17 00:00:00 2001
From: cansavvy
Date: Tue, 17 Sep 2024 20:00:02 +0000
Subject: [PATCH 2/8] =?UTF-8?q?=F0=9F=94=84=20Synced=20local=20'.github/IS?=
=?UTF-8?q?SUE=5FTEMPLATE/course-problem-report.md'=20with=20remote=20'.gi?=
=?UTF-8?q?thub/ISSUE=5FTEMPLATE/course-problem-report.md'?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
release-
---
.../ISSUE_TEMPLATE/course-problem-report.md | 25 ++++++++++---------
1 file changed, 13 insertions(+), 12 deletions(-)
diff --git a/.github/ISSUE_TEMPLATE/course-problem-report.md b/.github/ISSUE_TEMPLATE/course-problem-report.md
index 7d5b83f..26f6f36 100644
--- a/.github/ISSUE_TEMPLATE/course-problem-report.md
+++ b/.github/ISSUE_TEMPLATE/course-problem-report.md
@@ -1,27 +1,28 @@
---
name: Course Problem Report
about: Create a report to help improve the course
-title: problem
+title: [Problem]
labels: bug
-assignees: cansavvy
+assignees:
---
-**Describe what is not working with the course**
-A clear and concise description of what the bug is.
+## Describe what is not working with the course
+
-**To Reproduce**
-Steps to reproduce the behavior:
+## Steps to Reproduce
+
-**Expected behavior**
-A clear and concise description of what you expected to happen.
+## Expected behavior
+
-**Screenshots**
-If applicable, add screenshots to help explain your problem.
+## Screenshots
+
-**Additional context**
-Add any other context about the problem here.
+## Additional context
+
From a7b3cc3d458d24e0fa60d5768b8ef69017c17db6 Mon Sep 17 00:00:00 2001
From: cansavvy
Date: Tue, 17 Sep 2024 20:00:02 +0000
Subject: [PATCH 3/8] =?UTF-8?q?=F0=9F=94=84=20Synced=20local=20'.github/IS?=
=?UTF-8?q?SUE=5FTEMPLATE/course-content-add.md'=20with=20remote=20'.githu?=
=?UTF-8?q?b/ISSUE=5FTEMPLATE/course-content-add.md'?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
release-
---
.github/ISSUE_TEMPLATE/course-content-add.md | 14 +++++++-------
1 file changed, 7 insertions(+), 7 deletions(-)
diff --git a/.github/ISSUE_TEMPLATE/course-content-add.md b/.github/ISSUE_TEMPLATE/course-content-add.md
index 71213d8..1a5f795 100644
--- a/.github/ISSUE_TEMPLATE/course-content-add.md
+++ b/.github/ISSUE_TEMPLATE/course-content-add.md
@@ -3,15 +3,15 @@ name: New content idea
about: Suggest an idea for the course
title: ''
labels: ''
-assignees: cansavvy
+assignees:
---
-**Describe the your scope of your content idea**
-What will this cover and how does it relate to the current course material?
+## Describe the your scope of your content idea
+
-**Describe the learning objectives for your content idea**
-What will users learn from this new content?
+## Describe the learning objectives for your content idea
+
-**Additional context or resources**
-Add any other context or related resources we should know about?
+## Additional context or resources
+
From 186a877d58839dedacf36f04db55da459e67d80d Mon Sep 17 00:00:00 2001
From: cansavvy
Date: Tue, 17 Sep 2024 20:00:02 +0000
Subject: [PATCH 4/8] =?UTF-8?q?=F0=9F=94=84=20Created=20local=20'.github/I?=
=?UTF-8?q?SSUE=5FTEMPLATE/url-error.md'=20from=20remote=20'.github/ISSUE?=
=?UTF-8?q?=5FTEMPLATE/url-error.md'?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
release-
---
.github/ISSUE_TEMPLATE/url-error.md | 8 ++++++++
1 file changed, 8 insertions(+)
create mode 100644 .github/ISSUE_TEMPLATE/url-error.md
diff --git a/.github/ISSUE_TEMPLATE/url-error.md b/.github/ISSUE_TEMPLATE/url-error.md
new file mode 100644
index 0000000..fe13196
--- /dev/null
+++ b/.github/ISSUE_TEMPLATE/url-error.md
@@ -0,0 +1,8 @@
+---
+title: Broken URLs found in the course!
+labels: url-error
+---
+URL's in this course were just checked and some broken URLs were found.
+
+**Number of errors:** {{ env.ERROR_NUM }}
+**File where errors are:** [url checks file here]({{ env.FILE_URL }})
From 2a5701a08748dec2c040c986b75e19e7c50942de Mon Sep 17 00:00:00 2001
From: cansavvy
Date: Tue, 17 Sep 2024 20:00:02 +0000
Subject: [PATCH 5/8] =?UTF-8?q?=F0=9F=94=84=20Created=20local=20'style-set?=
=?UTF-8?q?s'=20from=20remote=20'style-sets'?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
release-
---
style-sets/data-trail/_output.yml | 18 +
.../data-trail/copy-to-assets/DataTrail.jpg | Bin 0 -> 147490 bytes
.../copy-to-assets/DataTrail_favicon.ico | Bin 0 -> 15406 bytes
.../copy-to-assets/DataTrail_logo.jpg | Bin 0 -> 29102 bytes
.../copy-to-assets/big-image-DataTrail.html | 12 +
.../copy-to-assets/style_DataTrail.css | 546 ++++++++++++++++
style-sets/data-trail/index.Rmd | 38 ++
style-sets/fhdasl/_output.yml | 18 +
.../copy_to_assets/big-dasl-stacked.png | Bin 0 -> 461918 bytes
style-sets/fhdasl/copy_to_assets/big-dasl.png | Bin 0 -> 15384 bytes
.../fhdasl/copy_to_assets/big-image.html | 12 +
.../copy_to_assets/big-image_fhdasl.html | 12 +
.../fhdasl/copy_to_assets/box_images/data.png | Bin 0 -> 8991 bytes
.../copy_to_assets/box_images/dictionary.png | Bin 0 -> 1051 bytes
.../copy_to_assets/box_images/github.png | Bin 0 -> 2782 bytes
.../copy_to_assets/box_images/justice.png | Bin 0 -> 7755 bytes
.../copy_to_assets/box_images/money.png | Bin 0 -> 7497 bytes
.../copy_to_assets/box_images/motivations.png | Bin 0 -> 31614 bytes
.../fhdasl/copy_to_assets/box_images/note.png | Bin 0 -> 2771 bytes
.../fhdasl/copy_to_assets/box_images/plan.png | Bin 0 -> 5552 bytes
.../copy_to_assets/box_images/question.png | Bin 0 -> 6563 bytes
.../box_images/question_box.png | Bin 0 -> 7345 bytes
.../copy_to_assets/box_images/submit.png | Bin 0 -> 7863 bytes
.../box_images/thinking_face.png | Bin 0 -> 47033 bytes
.../copy_to_assets/box_images/warning.png | Bin 0 -> 3216 bytes
style-sets/fhdasl/copy_to_assets/brothers.png | Bin 0 -> 171418 bytes
.../copy_to_assets/dasl_thin_main_image.png | Bin 0 -> 11240 bytes
style-sets/fhdasl/copy_to_assets/favicon.ico | Bin 0 -> 25216 bytes
style-sets/fhdasl/copy_to_assets/footer.html | 9 +
.../fhdasl/copy_to_assets/hideOutput.js | 57 ++
.../fhdasl/copy_to_assets/itcr_arrow.png | Bin 0 -> 6355 bytes
style-sets/fhdasl/copy_to_assets/style.css | 587 ++++++++++++++++++
.../fhdasl/copy_to_assets/toc_close.css | 21 +
style-sets/fhdasl/index.Rmd | 21 +
style-sets/itcr/_output.yml | 18 +
.../itcr/copy-to-assets/ITN_favicon.ico | Bin 0 -> 15406 bytes
style-sets/itcr/copy-to-assets/ITN_logo.png | Bin 0 -> 30719 bytes
.../itcr/copy-to-assets/big-image-itcr.html | 12 +
.../itcr/copy-to-assets/itcr_main_image.png | Bin 0 -> 5949 bytes
style-sets/itcr/copy-to-assets/style_ITN.css | 551 ++++++++++++++++
style-sets/itcr/index.Rmd | 23 +
41 files changed, 1955 insertions(+)
create mode 100644 style-sets/data-trail/_output.yml
create mode 100644 style-sets/data-trail/copy-to-assets/DataTrail.jpg
create mode 100755 style-sets/data-trail/copy-to-assets/DataTrail_favicon.ico
create mode 100644 style-sets/data-trail/copy-to-assets/DataTrail_logo.jpg
create mode 100644 style-sets/data-trail/copy-to-assets/big-image-DataTrail.html
create mode 100644 style-sets/data-trail/copy-to-assets/style_DataTrail.css
create mode 100644 style-sets/data-trail/index.Rmd
create mode 100644 style-sets/fhdasl/_output.yml
create mode 100644 style-sets/fhdasl/copy_to_assets/big-dasl-stacked.png
create mode 100755 style-sets/fhdasl/copy_to_assets/big-dasl.png
create mode 100755 style-sets/fhdasl/copy_to_assets/big-image.html
create mode 100644 style-sets/fhdasl/copy_to_assets/big-image_fhdasl.html
create mode 100644 style-sets/fhdasl/copy_to_assets/box_images/data.png
create mode 100644 style-sets/fhdasl/copy_to_assets/box_images/dictionary.png
create mode 100644 style-sets/fhdasl/copy_to_assets/box_images/github.png
create mode 100644 style-sets/fhdasl/copy_to_assets/box_images/justice.png
create mode 100644 style-sets/fhdasl/copy_to_assets/box_images/money.png
create mode 100644 style-sets/fhdasl/copy_to_assets/box_images/motivations.png
create mode 100644 style-sets/fhdasl/copy_to_assets/box_images/note.png
create mode 100644 style-sets/fhdasl/copy_to_assets/box_images/plan.png
create mode 100644 style-sets/fhdasl/copy_to_assets/box_images/question.png
create mode 100644 style-sets/fhdasl/copy_to_assets/box_images/question_box.png
create mode 100644 style-sets/fhdasl/copy_to_assets/box_images/submit.png
create mode 100644 style-sets/fhdasl/copy_to_assets/box_images/thinking_face.png
create mode 100644 style-sets/fhdasl/copy_to_assets/box_images/warning.png
create mode 100644 style-sets/fhdasl/copy_to_assets/brothers.png
create mode 100644 style-sets/fhdasl/copy_to_assets/dasl_thin_main_image.png
create mode 100644 style-sets/fhdasl/copy_to_assets/favicon.ico
create mode 100755 style-sets/fhdasl/copy_to_assets/footer.html
create mode 100755 style-sets/fhdasl/copy_to_assets/hideOutput.js
create mode 100755 style-sets/fhdasl/copy_to_assets/itcr_arrow.png
create mode 100644 style-sets/fhdasl/copy_to_assets/style.css
create mode 100755 style-sets/fhdasl/copy_to_assets/toc_close.css
create mode 100644 style-sets/fhdasl/index.Rmd
create mode 100644 style-sets/itcr/_output.yml
create mode 100755 style-sets/itcr/copy-to-assets/ITN_favicon.ico
create mode 100644 style-sets/itcr/copy-to-assets/ITN_logo.png
create mode 100644 style-sets/itcr/copy-to-assets/big-image-itcr.html
create mode 100644 style-sets/itcr/copy-to-assets/itcr_main_image.png
create mode 100644 style-sets/itcr/copy-to-assets/style_ITN.css
create mode 100644 style-sets/itcr/index.Rmd
diff --git a/style-sets/data-trail/_output.yml b/style-sets/data-trail/_output.yml
new file mode 100644
index 0000000..571771a
--- /dev/null
+++ b/style-sets/data-trail/_output.yml
@@ -0,0 +1,18 @@
+bookdown::gitbook:
+ css: assets/style_DataTrail.css
+ includes:
+ before_body: assets/big-image-DataTrail.html
+ after_body: assets/footer.html
+ highlight: tango
+ config:
+ toc:
+ collapse: section
+ before: |
+
+ after: |
+ This content was published with bookdown using
+ The OTTR Template by:
+ The Johns Hopkins Data Science Lab
+
+ Style adapted from: rstudio4edu-book (CC-BY 2.0)
+
diff --git a/style-sets/data-trail/copy-to-assets/DataTrail.jpg b/style-sets/data-trail/copy-to-assets/DataTrail.jpg
new file mode 100644
index 0000000000000000000000000000000000000000..f1902a356b6ff3702ff35c01e21b3a22283ceee3
GIT binary patch
literal 147490
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