{"id":20494725,"url":"https://github.com/fhdsl/itn_course_search","last_synced_at":"2025-10-16T23:55:59.343Z","repository":{"id":233984056,"uuid":"767081271","full_name":"fhdsl/ITN_course_search","owner":"fhdsl","description":"A searchable table for ITN courses","archived":false,"fork":false,"pushed_at":"2024-08-07T19:12:51.000Z","size":13722,"stargazers_count":0,"open_issues_count":1,"forks_count":0,"subscribers_count":2,"default_branch":"main","last_synced_at":"2025-01-16T05:56:22.577Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"R","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/fhdsl.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2024-03-04T17:08:04.000Z","updated_at":"2024-08-07T19:08:44.000Z","dependencies_parsed_at":"2024-04-29T22:46:32.614Z","dependency_job_id":"6d334974-0d69-4022-9048-e3ad88f5cffd","html_url":"https://github.com/fhdsl/ITN_course_search","commit_stats":null,"previous_names":["fhdsl/itn_search","fhdsl/itn_course_search"],"tags_count":0,"template":false,"template_full_name":"jhudsl/OTTR_Template_Website","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/fhdsl%2FITN_course_search","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/fhdsl%2FITN_course_search/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/fhdsl%2FITN_course_search/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/fhdsl%2FITN_course_search/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/fhdsl","download_url":"https://codeload.github.com/fhdsl/ITN_course_search/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":242076403,"owners_count":20068231,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2024-11-15T17:42:49.716Z","updated_at":"2025-10-16T23:55:59.322Z","avatar_url":"https://github.com/fhdsl.png","language":"R","funding_links":[],"categories":[],"sub_categories":[],"readme":"\u003c!-- README.md is generated from README.Rmd. Please edit that file --\u003e\n\n# ITN\\_course\\_search\n\nA auto-generating searchable table for ITN courses. The collection of\ninformation about the courses is programmatically queried from GitHub\nand processed..\n\n## About\n\nITN\\_course\\_search uses the Github API to gather jhudsl and fhdsl\norganization repositories, specifically ITN courses, that we have worked\non. It renders the table in a markdown-readable format. This repo has\nworkflows that trigger collection building and table rendering once a\nweek.\n\nThe table only includes repositories that meet the following\n**required** criteria:\n\n1.  Repository within the `jhudsl` or `fhdsl` organizations\n2.  Public repository\n3.  Have a homepage listed\n4.  Have a description listed\n5.  Have “itn” and “course” as part of the repository tags (e.g.,\n    “itn-course”, or “itn” and “course”) (`str_detect(topics, \"itn\")` \u0026\n    `str_detect(topics, \"course\")`)\n6.  Aren’t template per the tags (`!str_detect(topics, \"template \")` –\n    using a space because we want repos with tags of “templates” if the\n    repo is providing templates, e.g., [the Overleaf/LaTeX\n    Course](https://github.com/fhdsl/Overleaf_and_LaTeX_for_Scientific_Articles))\n7.  Has a repository tag for launch date specified by `launched-monYEAR`\n    (e.g., `launched-aug2025` or `launched-dec2023`)\n\n\u003ca href=\"https://github.com/fhdsl/Overleaf_and_LaTeX_for_Scientific_Articles\" target=\"_blank\"\u003e\u003cimg src=\"man/figures/README-/15e_r5bth-eEp98ruq7c0nNpOU6f0D00003gT8vcrCtw_p.png\" alt=\"Shows the seven required criteria for including a course in the search table using the Overleaf course GitHub page as an example\" width=\"100%\" /\u003e\u003c/a\u003e\n\n## Interested in adding a course to the table?\n\nAt the moment, to add a course to the table, either wait for the repo to\nfetch the collection data, or open a PR with a trivial change. A later\nPR will add a way to manually trigger the workflow but this is not\navailable yet.\n\n- ☐ Make sure the above required criteria (1-7) are met (jhudsl/fhdsl\n  organization, public, homepage, description, itn-course tag, isn’t a\n  template, launch date tag).\n\nMake sure the rest of the information for the table (e.g., title, access\nlinks/available course formats, etc.) is specified (where and how) the\nquery procedure expects (explained below).\n\n### Course title specification\n\nCourse title specification is **within the course material files**,\nusually the `index.Rmd` (or `_quarto.yml` for quarto book) file.\n\n- ☐ Verify that the title is in the `index.Rmd` (or `_quarto.yml` for\n  quarto book) file.\n  - For Rmarkdown courses, need to follow the convention of being listed\n    between `---` with `title:` at the front of the line\n  - [Quarto books just replaces `title:` to extract the\n    title.](https://github.com/fhdsl/ITN_course_search/blob/e389cbd43d2923649e5422c17189d53a812bfb13/scripts/query_collection.R#L149)\n\n\u003ca href=\"https://github.com/fhdsl/Overleaf_and_LaTeX_for_Scientific_Articles/blob/main/index.Rmd\" target=\"_blank\"\u003e\u003cimg src=\"man/figures/README-/15e_r5bth-eEp98ruq7c0nNpOU6f0D00003gT8vcrCtw_g371dc0bfdb3_0_63.png\" alt=\"Rmarkdown courses specify the title in the index.Rmd file in the area between 3 dashes. The code looks for title with a colon at the beginning of the line to distinguish it from the subtitlet\" width=\"100%\" /\u003e\u003c/a\u003e\n\nNote that the query procedure looks for an `index.Rmd` file first, and\nif it doesn’t find one in the repository, it then assumes it could be a\nquarto course and looks for the `_quarto.yml` file next automatically.\n\n\u003ca href=\"https://github.com/fhdsl/Containers_for_Scientists/blob/main/_quarto.yml\" target=\"_blank\"\u003e\u003cimg src=\"man/figures/README-/15e_r5bth-eEp98ruq7c0nNpOU6f0D00003gT8vcrCtw_g371dc0bfdb3_0_69.png\" alt=\"A quarto course will have the title specified in the _quarto.yml file and replaces the title colon and space with nothing to extract the title.\" width=\"100%\" /\u003e\u003c/a\u003e\n\n### Available course formats specification\n\nAvailable course formats specification is **within the course material\nfiles**, usually the `index.Rmd` (or `index.qmd` for quarto book) file.\n\n- ☐ Verify that available course formats are listed in `index.Rmd` (or\n  `index.qmd` for quarto book) file, specifically for Coursera and\n  Leanpub if applicable. (The GitHub source material and GitHub pages\n  homepage information for the course table will be taken from the API\n  call rather than this information, but it’s good practice to have both\n  included within this chunk too)\n\n\u003ca href=\"https://github.com/fhdsl/Overleaf_and_LaTeX_for_Scientific_Articles/blob/main/index.Rmd\" target=\"_blank\"\u003e\u003cimg src=\"man/figures/README-/15e_r5bth-eEp98ruq7c0nNpOU6f0D00003gT8vcrCtw_g371dc0bfdb3_0_86.png\" alt=\"Available Course Formats are listed in the index.Rmd file for the Overleaf course as an example for Rmarkdown courses\" width=\"100%\" /\u003e\u003c/a\u003e\n\nNote that the query procedure looks for an `index.Rmd` file first, and\nif it doesn’t find one in the repository, it then assumes it could be a\nquarto course and looks for the `index.qmd` file next automatically.\n\n\u003ca href=\"https://github.com/fhdsl/Containers_for_Scientists/blob/main/index.qmd\" target=\"_blank\"\u003e\u003cimg src=\"man/figures/README-/15e_r5bth-eEp98ruq7c0nNpOU6f0D00003gT8vcrCtw_g371dc0bfdb3_0_81.png\" alt=\"Available Course Formats are listed in the index.qmd file for the example quarto book from the Containers for Scientists example course\" width=\"100%\" /\u003e\u003c/a\u003e\n\n\u003cdetails\u003e\n\u003csummary\u003e\nWhat the code is looking for exactly\n\u003c/summary\u003e\n\nBecause the `get_linkOI()` function is set up to find line(s) with the\ncourse format “pattern” (e.g., “Coursera” or “Leanpub”), then extract\nall URLs from those lines, and then subset to the relevant URL if needed\n(again using the “pattern”), these available course formats do not need\nto be in an ordered, bulleted, or enumerated list. They could all be\nmentioned in a notice box or paragraph. As long as the line with the\nlink says “Coursera” or “Leanpub”, this process will find and extract\nthe relevant links.\n\n\u003ca href=\"https://github.com/fhdsl/NIH_Data_Sharing/blob/main/index.Rmd\" target=\"_blank\"\u003e\u003cimg src=\"man/figures/README-/15e_r5bth-eEp98ruq7c0nNpOU6f0D00003gT8vcrCtw_g371dc0bfdb3_0_91.png\" alt=\"Available course formats do not need to be listed or enumerated in a bulleted or ordered list in order for the process to extract the information as seen with the NIH for Data Sharing course\" width=\"100%\" /\u003e\u003c/a\u003e\n\n\u003c/details\u003e\n\n### Necessary background information and learning objectives specification\n\nNecessary background information and learning objectives are typically\nspecified as images (Google Slides grabbed with\n`ottrpal::include_slide()` function) **within the course material\nfiles**, usually the `01-intro.Rmd` (or `01-intro.qmd` for quarto book)\nfile. The code blocks where these are specified need to have specific\nidentifiers.\n\n- ☐ Verify that the `01-intro.Rmd` (or `01-intro.qmd` file for quarto\n  courses, [ex: Containers for\n  Scientists](https://github.com/fhdsl/Containers_for_Scientists/blob/main/01-intro.qmd))\n  file has identifiers for code blocks grabbing relevant google slide\n  images.\n  - LOs: `learning_objectives`\n  - Audience: `for_individuals_who`\n  - Topics covered: `topics_covered`\n  - Pre-reqs (if applicable): `prereqs`\n\n\u003cdetails\u003e\n\u003csummary\u003e\nWhat the code is looking for exactly\n\u003c/summary\u003e\n\nThe code in the `get_slide_info()` function within the\n`query_collection.R` file looks for these code block identifiers exactly\n\nNote that the query procedure first checks the course name to make sure\nit’s not part of a special set of courses that don’t follow the usual\nconvention/location for this information. If the course isn’t in that\nlist, the procedure checks for the `01-intro.Rmd` file first and if that\nfile isn’t found it assumes it could be a quarto course and looks for\n`01-intro.qmd` automatically next.\n\n\u003c/details\u003e\n\n\u003ca href=\"https://github.com/fhdsl/Overleaf_and_LaTeX_for_Scientific_Articles/blob/main/01-intro.Rmd\" target=\"_blank\"\u003e\u003cimg src=\"man/figures/README-/15e_r5bth-eEp98ruq7c0nNpOU6f0D00003gT8vcrCtw_g371dc0bfdb3_0_42.png\" alt=\"Example of learning objectives, audience, and topics covered code blocks from the Overleaf Course\" width=\"100%\" /\u003e\u003c/a\u003e\n\n\u003ca href=\"https://github.com/fhdsl/Github_Automation_for_Scientists/blob/main/01-intro.Rmd\" target=\"_blank\"\u003e\u003cimg src=\"man/figures/README-/15e_r5bth-eEp98ruq7c0nNpOU6f0D00003gT8vcrCtw_g371dc0bfdb3_0_54.png\" alt=\"Example of a prereqs code block from the GitHub Automation for Scientists Course\" width=\"100%\" /\u003e\u003c/a\u003e\n\nIf a different file contains the information, you’ll need to edit the\n`get_slide_info()` function within the `query_collection.R` file.\n\n\u003cdetails\u003e\n\u003csummary\u003e\nExamples where these blocks aren’t in the expected files include\n\u003c/summary\u003e\n\n- AI for Efficient Programming: They’re in\n  [index.Rmd](https://github.com/fhdsl/AI_for_Efficient_Programming/blob/main/index.Rmd)\n  instead.\n- NIH for Data Sharing:\n  - LOs are in their own file (and the chunk is commented out, but still\n    accessible to this table building)\n    [Learning\\_objectives.Rmd](https://github.com/fhdsl/NIH_Data_Sharing/blob/main/Learning_objectives.Rmd)\n    instead.\n  - Audience and Topics covered are in\n    [index.Rmd](https://github.com/fhdsl/NIH_Data_Sharing/blob/main/index.Rmd)\n- AI for Decision Makers: They’re in 4 different files on 4 difference\n  branches – one for each sub-course.\n\nIf your course’s introductory material isn’t located within the expected\n`01-intro.Rmd` or `01-intro.qmd` file locations, [add the course name\nhere within\nquery\\_collection.R](https://github.com/fhdsl/ITN_course_search/blob/e389cbd43d2923649e5422c17189d53a812bfb13/scripts/query_collection.R#L245)\nand then [add the checking with the alternative file(s) for your course\nwithin this\n`else`](https://github.com/fhdsl/ITN_course_search/blob/e389cbd43d2923649e5422c17189d53a812bfb13/scripts/query_collection.R#L278),\nfollowing the example of AI for Efficient Programming and NIH for Data\nSharing, unless your course has sub-courses within the main repo (that\naren’t in the table and will need new rows) or information on branches\nin which case, you’ll want to [follow the example used for AI for\nDecision\nMakers](https://github.com/fhdsl/ITN_course_search/blob/e389cbd43d2923649e5422c17189d53a812bfb13/scripts/query_collection.R#L528)\nand use a [similar special\nfunction](https://github.com/fhdsl/ITN_course_search/blob/e389cbd43d2923649e5422c17189d53a812bfb13/scripts/query_collection.R#L383)\n\n\u003c/details\u003e\n\n### Audience specification\n\nAudience specification is **not within the course material files** but\ninstead **is within the repository settings**\n\n- ☐ Add repo tags for audience (at least one of the following):\n  - `audience-software-developers`\n  - `audience-researchers`\n  - `audience-leaders`\n\n\u003ca href=\"https://github.com/fhdsl/Overleaf_and_LaTeX_for_Scientific_Articles\" target=\"_blank\"\u003e\u003cimg src=\"man/figures/README-/15e_r5bth-eEp98ruq7c0nNpOU6f0D00003gT8vcrCtw_g371dc0bfdb3_0_16.png\" alt=\"Audience tags are specified in the repository settings and can be any combination of the choices\" width=\"100%\" /\u003e\u003c/a\u003e\n\n\u003cdetails\u003e\n\u003csummary\u003e\nWhat the code is looking for exactly\n\u003c/summary\u003e\n\n[The code in the `query_collection.R` file that traverses the pages of\nthe GitHub API request results looks for these tags\nexactly.](https://github.com/fhdsl/ITN_course_search/blob/e389cbd43d2923649e5422c17189d53a812bfb13/scripts/query_collection.R#L490-L496)\n\n\u003c/details\u003e\n\n### Category specification\n\nCategory specification is **not within the course material files** but\ninstead **is within the repository settings**.\n\n- ☐ Add repo tags for category (only one of the following):\n  - `category-best-practices`\n  - `category-software-dev`\n  - `category-fundamentals-tools-resources`\n  - `category-hands-on-practice`\n\n\u003ca href=\"https://github.com/fhdsl/Overleaf_and_LaTeX_for_Scientific_Articles\" target=\"_blank\"\u003e\u003cimg src=\"man/figures/README-/15e_r5bth-eEp98ruq7c0nNpOU6f0D00003gT8vcrCtw_g371dc0bfdb3_0_35.png\" alt=\"Category tags are specified in the repository settings and should be only one of the choices. \" width=\"100%\" /\u003e\u003c/a\u003e\n\n\u003cdetails\u003e\n\u003csummary\u003e\nWhat the code is looking for exactly\n\u003c/summary\u003e\n\n[The code in the `query_collection.R` file that traverses the pages of\nthe GitHub API request results either looks for these tags exactly\n(which is the case for `category-software-dev` and\n`category-best-practices`), or it looks for the prefix\n(`category-fundamentals-` rather than the full\n`category-fundamentals-tools-resources` and `category-hands-on-` rather\nthan the full\n`category-hands-on-practice`).](https://github.com/fhdsl/ITN_course_search/blob/8facb2d4ec0a9beca5612a3277457881a2e9bcee/scripts/query_collection.R#L498-L506)\n\n\u003c/details\u003e\n\n### Funding\n\nAll courses with an `itn-course` or just `itn` tag are assumed to be ITN\nfunded. Add a `hutch-course` topic tag to the repo if it was Hutch\nfunded and should include Hutch branding as well.\n\n### Cleaning up topic tags for display in the table\n\nThe `query_collection.R` file does NOT clean the topic tags data. Very\nminimal cleaning is done within the `prep_table()` function within the\n`format-tables.R` script. This minimal cleaning includes (1) inserting a\nline break and a bullet point in place of every semicolon (which\nseparates the topic tags in the collection following querying) and (2)\nreplacing hyphens with a space. Special cases or substitutions of\ncleaning are handled within `index.Rmd` of this ITN\\_course\\_search\nrepo, specifically in the `wrangle_data` code chunk.\n\nWithin that chunk …\n\n1.  Use title case on the concepts with the `str_to_title()` function\n    because the repo topic tags are all lower case.\n2.  Ai –\u0026gt; AI (for the AI for Efficient Programming and AI for\n    Decision Makers courses)\n3.  Ci-Cd –\u0026gt; Continuous Integration/Continuous Deployment (for the\n    Containers for Scientists Course)\n4.  Nih –\u0026gt; NIH (for the Data Management and Sharing for NIH Proposals\n    course)\n5.  Hipaa –\u0026gt; HIPAA (for the Ethical Data Handling for Cancer Research\n    course)\n6.  Llm –\u0026gt; LLM (for the AI for Efficient Programming course)\n7.  Phi –\u0026gt; (PHI) (for the Ethical Data Handling for Cancer Research\n    course)\n8.  Pii –\u0026gt; (PII) (for the Ethical Data Handling for Cancer Research\n    course)\n9.  Arxiv –\u0026gt; ArXiv (for the Overleaf and LaTeX course)\n10. Latex –\u0026gt; LaTeX (for the Overleaf and LaTeX course)\n11. And –\u0026gt; \u0026 (space saving, used for the Choosing Genomics Tools\n    course )\n12. Iv –\u0026gt; IV (for the Containers for Scientists course which we\n    called Reproducibility Series IV)\n13. Iii –\u0026gt; III (for the GitHub Automation for Scientists course which\n    we called Reproducibility Series III)\n14. Ii –\u0026gt; II (for the Adv Reproducibility course which we called\n    Reproducibility Series II)\n\nAdd any additional specific changes to the topic tags for cleaning\nwithin that chunk going forward.\n\n### Adding icons\n\nAudience (column is `BroadAudience`), course categories (column is\n`Category`), and funding (column is `Funding`) information adds icons to\nthe data while building the tables. This is done within the\n`prep_table()` function of the `format-tables.R` file. If you are\nediting or adding a category to any of these, you will need to update\nthose `mutate` steps there.\n\n## Important files\n\n- `scripts/query_collection.R`: gathers information (audience, funding,\n  topics, etc.) about ITN courses from their GitHub repos\n- `resources/collection.tsv`: where the collection from\n  `query_collection.R` is stored.\n- `scripts/format-tables.R`: functions to wrangle course data and format\n  course table\n- `index.Rmd`: drives building each course specific html page and the\n  overall course table\n- `chunks/*Rmd` or `chunks/#.md`: chunks that we’ll borrow using\n  `ottrpal::borrow_chapter` (from the `base_ottr:dev` container\n  specified in `config_automation.yml`) and fill in {SPECIFIC INFO} for\n  course (following the example of our cheatsheets repo). Because of\n  this approach, a chunk will only inherit specific information if we\n  pass it as a tag replacement. In other words, not every piece of\n  information in each row/about a specific course will be available to\n  the chunks, only the information we specify as a tag replacement).\n  - about: `aboutCourse.md` with “{COURSE\\_DESCRIPTION}”,\n    “{COURSE\\_CATEGORY}”, and “{COURSE\\_LAUNCH}” to be provided/replaced\n  - audience: `audienceCourse.Rmd` with “{FOR\\_SLIDE\\_LINK}” and\n    “{COURSE\\_AUDIENCE}” to be provided/replaced\n  - format: `formatFullCourse.Rmd` with “{BOOKDOWN\\_LINK}”,\n    “{GITHUB\\_LINK}”, “{COURSERA\\_LINK}”, and “{LEANPUB\\_LINK}” to be\n    filled in\n  - funding: `fundingFullCourse.Rmd` with “{hutch\\_funded}” to be filled\n    in\n  - LOs: `loCourse.Rmd` with “{LO\\_SLIDE\\_LINK}” to be provided/replaced\n  - concepts discussed: `conceptsCourse.Rmd` with\n    “{CONCEPTS\\_SLIDE\\_LINK}” tag to be provided/replaced\n  - pre-requisites: `prereqsCourse.Rmd` with “{PREREQ\\_SLIDE\\_LINK}” and\n    “{GITHUB\\_LINK}” tags to be provided/replaced. If there are\n    pre-requisites for a course, and you want to add a direct link to\n    them, look at or add to the conditionals in this particular `.Rmd`\n- `*_template.Rmd`: the template for driving course specific pages.\n  - `single_course_template.Rmd`: layout for building general course\n    pages\n  - `ai_course_template.Rmd`: layout for AI for Decision Makers course\n    page\n- `*_coursePage.html`: the output course specific html pages\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ffhdsl%2Fitn_course_search","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Ffhdsl%2Fitn_course_search","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ffhdsl%2Fitn_course_search/lists"}