Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Fix #5015: Added CI to oppia-android wiki (check toc) #5382

Merged
Merged
Show file tree
Hide file tree
Changes from 3 commits
Commits
Show all changes
32 commits
Select commit Hold shift + click to select a range
13efcfa
Script to Check the Table of Contents in the Wiki and CI workflow
Rd4dev Apr 10, 2024
d3795b3
Fix Lint Tests by adding new lines after and before ( and )
Rd4dev Apr 10, 2024
1840f60
Fix Lint Tests by properly indenting the error messages
Rd4dev Apr 10, 2024
9fdea36
Merge branch 'develop' of https://github.com/Rd4dev/oppia-android int…
Rd4dev Apr 29, 2024
d113747
Modified id with camel case convention and Revised the name to be mor…
Rd4dev Apr 29, 2024
39f0c2f
Merge branch 'develop' of https://github.com/Rd4dev/oppia-android int…
Rd4dev Jun 4, 2024
d55ddac
Resolve merge conflicts and fixed kdoc styling
Rd4dev Jul 4, 2024
49917c7
Renaming wiki dir variables for better clarity
Rd4dev Jul 5, 2024
94fa4f6
Simplified the wiki table of content check logic with kotlin functions
Rd4dev Jul 5, 2024
3e74a99
Code clean up and replaced exception with error statement
Rd4dev Jul 5, 2024
5a8b4b9
Added test cases for wiki toc checks
Rd4dev Jul 5, 2024
9e4386a
Fix Lint Checks for indentation and missing spaces
Rd4dev Jul 5, 2024
9193d15
Fix Lint check buildifier reformat
Rd4dev Jul 5, 2024
620c3b0
Merge branch 'develop' of https://github.com/Rd4dev/oppia-android int…
Rd4dev Sep 4, 2024
99c0371
Merge branch 'develop' of https://github.com/Rd4dev/oppia-android int…
Rd4dev Sep 5, 2024
72d0a2b
Added missing test cases for no directory found to hit 100% coverage
Rd4dev Sep 5, 2024
b5c9cf3
Upgraded the Bazel version, removed cache env, used Regex to check he…
Rd4dev Oct 2, 2024
fab6c2e
Merge branch 'develop' of https://github.com/Rd4dev/oppia-android int…
Rd4dev Oct 2, 2024
afaf59e
Added pull-request trigger to check on every PR creation, removed deb…
Rd4dev Oct 3, 2024
6dfa3bb
Merge branch 'develop' of https://github.com/Rd4dev/oppia-android int…
Rd4dev Oct 3, 2024
be00151
Trigger only when changes are made to the wiki dir
Rd4dev Oct 3, 2024
c18ac91
Conditional execution of the wiki-deploy to only proceed if the event…
Rd4dev Oct 3, 2024
2dfd045
Removed the test case for checking TOC present as the log statement t…
Rd4dev Oct 3, 2024
c7d0d11
Re-adding the test case to hit coverage but now checking with final r…
Rd4dev Oct 3, 2024
7cbad11
Updating the mis-matched TOC to confirm the TOC check status
Rd4dev Oct 9, 2024
2f15577
Merge branch 'develop' of https://github.com/Rd4dev/oppia-android int…
Rd4dev Oct 9, 2024
e9af4ab
Adding concurrency to wiki actions as it continues to run on subseque…
Rd4dev Oct 9, 2024
7110715
Modified the visibilities and removed private fun Kdocs, also updated…
Rd4dev Oct 9, 2024
0077bd4
Fix ktlint unexpected spacing before (
Rd4dev Oct 9, 2024
1d842fc
Adding confetti emoji to match with the header link
Rd4dev Oct 9, 2024
fa76163
Replaced checking toc end by blank endline with header tags as they a…
Rd4dev Oct 9, 2024
609df11
Fixed ktlint max line exceeded
Rd4dev Oct 9, 2024
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
18 changes: 18 additions & 0 deletions .github/workflows/wiki.yml
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,24 @@ on:
gollum:

jobs:
table_of_contents_check:
name: Wiki Check Table of Contents match Headers
adhiamboperes marked this conversation as resolved.
Show resolved Hide resolved
runs-on: ubuntu-20.04
env:
CACHE_DIRECTORY: ~/.bazel_cache
adhiamboperes marked this conversation as resolved.
Show resolved Hide resolved
steps:
- uses: actions/checkout@v2

- name: Set up Bazel
uses: abhinavsingh/setup-bazel@v3
with:
version: 4.0.0

adhiamboperes marked this conversation as resolved.
Show resolved Hide resolved
- name: Wiki Check Table of Contents
id: wikichecktoc
adhiamboperes marked this conversation as resolved.
Show resolved Hide resolved
run: |
bazel run //scripts:wiki_table_of_contents_check -- ${GITHUB_WORKSPACE}

wiki-deploy:
runs-on: ${{ matrix.os }}
strategy:
Expand Down
7 changes: 7 additions & 0 deletions scripts/BUILD.bazel
Original file line number Diff line number Diff line change
Expand Up @@ -227,6 +227,13 @@ kt_jvm_binary(
],
)

kt_jvm_binary(
name = "wiki_table_of_contents_check",
testonly = True,
main_class = "org.oppia.android.scripts.wiki.WikiTableOfContentsCheckKt",
runtime_deps = ["//scripts/src/java/org/oppia/android/scripts/wiki:wiki_table_of_contents_check_lib"],
)

# Note that this is intentionally not test-only since it's used by the app build pipeline. Also,
# this apparently needs to be a java_binary to set up runfiles correctly when executed within a
# Starlark rule as a tool.
Expand Down
18 changes: 18 additions & 0 deletions scripts/src/java/org/oppia/android/scripts/wiki/BUILD.bazel
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
"""
Libraries corresponding to scripting tools that help with continuous integration workflows.
"""

load("@io_bazel_rules_kotlin//kotlin:kotlin.bzl", "kt_jvm_library")

kt_jvm_library(
name = "wiki_table_of_contents_check_lib",
testonly = True,
srcs = [
"WikiTableOfContentsCheck.kt",
],
visibility = ["//scripts:oppia_script_binary_visibility"],
deps = [
"//scripts/src/java/org/oppia/android/scripts/common:bazel_client",
"//scripts/src/java/org/oppia/android/scripts/common:git_client",
],
)
Original file line number Diff line number Diff line change
@@ -0,0 +1,95 @@
package org.oppia.android.scripts.wiki

import java.io.File

/**
* Script for ensuring that the table of contents in each wiki page matches with its respective headers.
*
* Usage:
* bazel run //scripts:wiki_sample -- <path_to_default_working_directory>
*
* Arguments:
* - path_to_default_working_directory: The default working directory on the runner for steps, and the default location of repository.
*
* Example:
* bazel run //scripts:wiki_sample -- ${GITHUB_WORKSPACE}
*/
fun main(vararg args: String) {
// Path to the repo's wiki.
val githubWorkspace = "${args[0]}/wiki/"
val wikiDirectory = File(githubWorkspace)

// Check if the wiki directory exists
if (wikiDirectory.exists() && wikiDirectory.isDirectory) {
processWikiDirectory(wikiDirectory)
} else {
println("No contents found in the Wiki directory.")
}
}

/**
* Checks every file in the wiki repo
*
* @param wikiDirectory the default working directory
*/
fun processWikiDirectory(wikiDirectory: File) {
wikiDirectory.listFiles()?.forEach { file ->
processWikiFile(file)
}
}

/**
* Processes the contents of a single wiki file to ensure the accuracy of the Table of Contents.
*
* @param file The wiki file to process.
*/
fun processWikiFile(file: File) {
var inTableOfContents = false
var skipBlankLine = false

file.forEachLine { line ->
when {
// Checking for Table of Contents section
line.trim() == "## Table of Contents" -> {
inTableOfContents = true
skipBlankLine = true
}
// Checking to skip the blank line immediately after the ## Table of Contents
skipBlankLine && line.isBlank() -> skipBlankLine = false
// Validating the contents in the Table of Content
inTableOfContents && line.trimStart().startsWith("- [") && !line.contains("https://") -> {
validateTableOfContents(file, line)
}
// Checking for end of Table of Contents section
inTableOfContents && line.isBlank() -> inTableOfContents = false
}
}
}

/**
* Validates the accuracy of a Table of Contents entry in a wiki file.
*
* @param file The wiki file being validated.
* @param line The line containing the Table of Contents entry.
*/
fun validateTableOfContents(file: File, line: String) {
val titleRegex = "\\[(.*?)\\]".toRegex()
val title = titleRegex.find(line)?.groupValues?.get(1)?.replace('-', ' ')
?.replace(Regex("[?&./:’'*!,(){}\\[\\]+]"), "")
?.trim()

val linkRegex = "\\(#(.*?)\\)".toRegex()
val link = linkRegex.find(line)?.groupValues?.get(1)?.removePrefix("#")?.replace('-', ' ')
?.replace(Regex("[?&./:’'*!,(){}\\[\\]+]"), "")
?.replace("confetti_ball", "")?.trim()
adhiamboperes marked this conversation as resolved.
Show resolved Hide resolved

// Checks if the table of content title matches with the header link text
val matches = title.equals(link, ignoreCase = true)
if (!matches) {
throw Exception(
"\nMismatch of Table of Content with headers in the File: ${file.name}. " +
"\nThe Title: '${titleRegex.find(line)?.groupValues?.get(1)}' " +
"doesn't match with its corresponding Link: '${linkRegex.find(line)?.groupValues?.get(1)}'."
)
}
}
Loading