From 0af5f37a48055345f748c4c860423fa5f86d51a4 Mon Sep 17 00:00:00 2001 From: Ashar Fuadi Date: Sat, 28 Oct 2023 11:52:16 +0700 Subject: [PATCH] WIP test pending --- .github/workflows/ci.yml | 141 +----------------- deployment/scripts/build_judgels_client.sh | 2 +- deployment/scripts/build_judgels_server.sh | 2 +- deployment/scripts/deploy_judgels_client.sh | 2 +- deployment/scripts/deploy_judgels_server.sh | 2 +- .../programming/SubmissionResource.java | 5 +- .../programming/SubmissionClient.java | 18 +-- .../Programming/SubmissionDetails.jsx | 22 ++- .../Programming/SubmissionDetails.scss | 4 + .../chapterProblemSubmissionActions.js | 12 +- .../ChapterProblemSubmissionPage.jsx | 51 +++++-- 11 files changed, 90 insertions(+), 171 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 9e5e6be76..5738519de 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -3,92 +3,13 @@ name: ci on: push: branches: - - '*' + - "*" pull_request: branches: - master jobs: - test: - runs-on: ubuntu-22.04 - services: - rabbitmq: - image: rabbitmq - ports: - - 5672:5672 - steps: - - uses: actions/checkout@v3 - with: - fetch-depth: 50 - - - id: changed-files - name: Check changed files - run: python3 ci/check-changed-files.py | bash - - - name: Set up JDK - if: steps.changed-files.outputs.gradle == '1' - uses: actions/setup-java@v3 - with: - distribution: 'zulu' - java-version: '11' - cache: 'gradle' - - - name: Test judgels-commons - if: steps.changed-files.outputs.judgels-commons == '1' - run: ./judgels-backends/gradlew -p judgels-backends/judgels-commons check - - - name: Test judgels-grader-api - if: steps.changed-files.outputs.judgels-grader == '1' - run: ./judgels-backends/gradlew -p judgels-backends/judgels-grader-api check - - - name: Test judgels-grader-engines - if: steps.changed-files.outputs.judgels-grader == '1' - run: ./judgels-backends/gradlew -p judgels-backends/judgels-grader-engines check - - - name: Test judgels-grader-app - if: steps.changed-files.outputs.judgels-grader == '1' - run: ./judgels-backends/gradlew -p judgels-backends/judgels-grader-app check - - - name: Test judgels-server-api - if: steps.changed-files.outputs.judgels-server == '1' - run: ./judgels-backends/gradlew -p judgels-backends/judgels-server-api check - - - name: Test judgels-server-app - if: steps.changed-files.outputs.judgels-server == '1' - run: ./judgels-backends/gradlew -p judgels-backends/judgels-server-app check - - - name: Set up node - if: steps.changed-files.outputs.yarn == '1' - uses: actions/setup-node@v3 - with: - node-version: '16' - - - name: Get yarn cache directory path - if: steps.changed-files.outputs.yarn == '1' - id: yarn-cache-dir-path - run: echo "dir=$(yarn cache dir)" >> $GITHUB_OUTPUT - - - name: Use yarn cache - if: steps.changed-files.outputs.yarn == '1' - uses: actions/cache@v3 - id: yarn-cache - with: - path: ${{ steps.yarn-cache-dir-path.outputs.dir }} - key: ${{ runner.os }}-yarn-${{ hashFiles('**/yarn.lock') }} - restore-keys: | - ${{ runner.os }}-yarn- - - - name: Test judgels-client - if: steps.changed-files.outputs.judgels-client == '1' - run: | - cd judgels-client - export NODE_OPTIONS="--max-old-space-size=4096" - yarn install - yarn ci - build: - needs: test - if: github.ref == 'refs/heads/master' && github.repository_owner == 'ia-toki' runs-on: ubuntu-22.04 env: CONTAINER_REGISTRY_USERNAME: ${{ secrets.CONTAINER_REGISTRY_USERNAME }} @@ -111,15 +32,15 @@ jobs: if: steps.changed-files.outputs.gradle == '1' uses: actions/setup-java@v3 with: - distribution: 'zulu' - java-version: '11' - cache: 'gradle' + distribution: "zulu" + java-version: "11" + cache: "gradle" - name: Set up node if: steps.changed-files.outputs.yarn == '1' uses: actions/setup-node@v3 with: - node-version: '16' + node-version: "16" - name: Get yarn cache directory path if: steps.changed-files.outputs.yarn == '1' @@ -144,53 +65,8 @@ jobs: if: steps.changed-files.outputs.judgels-client == '1' run: ./deployment/scripts/build_judgels_client.sh - - name: Build judgels-grader - if: steps.changed-files.outputs.judgels-grader == '1' - run: ./deployment/scripts/build_judgels_grader.sh - - deploy-web: - if: github.ref == 'refs/heads/master' && github.repository_owner == 'ia-toki' - runs-on: ubuntu-22.04 - env: - WEB_HOST: ${{ secrets.WEB_HOST }} - WEB_KNOWN_HOSTS: ${{ secrets.WEB_KNOWN_HOSTS }} - steps: - - name: Checkout - uses: actions/checkout@v3 - with: - fetch-depth: 50 - - - id: changed-files - name: Check changed files - run: python3 ci/check-changed-files.py | bash - - - name: Set up node - if: steps.changed-files.outputs.web == '1' - uses: actions/setup-node@v3 - with: - node-version: '16' - - - name: Build web - if: steps.changed-files.outputs.web == '1' - run: | - cd web - yarn install - yarn build - - - name: Install SSH key - if: steps.changed-files.outputs.web == '1' - uses: shimataro/ssh-key-action@v2 - with: - key: ${{ secrets.WEB_PRIVATE_KEY }} - known_hosts: ${{ secrets.WEB_KNOWN_HOSTS }} - - - name: Rsync web - if: steps.changed-files.outputs.web == '1' - run: rsync -avzh web/build/ root@${WEB_HOST}:/var/www/html/judgels --delete - deploy-tlx-staging: needs: build - if: github.ref == 'refs/heads/master' && github.repository_owner == 'ia-toki' runs-on: ubuntu-22.04 steps: - uses: actions/checkout@v3 @@ -224,10 +100,3 @@ jobs: eval "$(ssh-agent -s)" ssh-add deployment/ansible/env/deployment_rsa ./deployment/scripts/deploy_judgels_client.sh - - - name: Deploy judgels-grader - if: steps.changed-files.outputs.judgels-grader == '1' - run: | - eval "$(ssh-agent -s)" - ssh-add deployment/ansible/env/deployment_rsa - ./deployment/scripts/deploy_judgels_grader.sh diff --git a/deployment/scripts/build_judgels_client.sh b/deployment/scripts/build_judgels_client.sh index 7bc8a931a..7a5d63f42 100755 --- a/deployment/scripts/build_judgels_client.sh +++ b/deployment/scripts/build_judgels_client.sh @@ -12,4 +12,4 @@ rm -rf dist/build && mv build dist/ cd ../deployment/ansible ansible --version 0 1; @@ -146,6 +148,13 @@ export function SubmissionDetails({ )); }; + const renderLoader = () => { + if (showLoaderWhenPending && latestGrading.verdict.code === VerdictCode.PND) { + return ; + } + return null; + }; + const renderSampleTestDataResults = () => { const details = latestGrading.details; if (details.testDataResults.length < 1) { @@ -302,9 +311,11 @@ export function SubmissionDetails({ const sourceFiles = Object.keys(submissionFiles).map(key => ( -
- {key === DEFAULT_SOURCE_KEY ? '' : key + ': '} {submissionFiles[key].name} -
+ {!hideSourceFilename && ( +
+ {key === DEFAULT_SOURCE_KEY ? '' : key + ': '} {submissionFiles[key].name} +
+ )} {decodeBase64(submissionFiles[key].content)} @@ -343,7 +354,7 @@ export function SubmissionDetails({ const renderSourceFilesHeading = () => { if (!onDownload) { - return

Source Files

; + return null; } return (
@@ -359,6 +370,7 @@ export function SubmissionDetails({ return (
{renderGeneralInfo()} + {renderLoader()} {renderDetails()} {renderSourceFiles()}
diff --git a/judgels-client/src/components/SubmissionDetails/Programming/SubmissionDetails.scss b/judgels-client/src/components/SubmissionDetails/Programming/SubmissionDetails.scss index bdb446728..b5da5b6fb 100644 --- a/judgels-client/src/components/SubmissionDetails/Programming/SubmissionDetails.scss +++ b/judgels-client/src/components/SubmissionDetails/Programming/SubmissionDetails.scss @@ -58,6 +58,10 @@ float: left; } + .pending-loader { + margin-bottom: 15px; + } + .submission-details-image { overflow: auto; } diff --git a/judgels-client/src/routes/courses/courses/single/chapters/single/problems/single/Programming/submissions/modules/chapterProblemSubmissionActions.js b/judgels-client/src/routes/courses/courses/single/chapters/single/problems/single/Programming/submissions/modules/chapterProblemSubmissionActions.js index 9a281d540..c0bfde420 100644 --- a/judgels-client/src/routes/courses/courses/single/chapters/single/problems/single/Programming/submissions/modules/chapterProblemSubmissionActions.js +++ b/judgels-client/src/routes/courses/courses/single/chapters/single/problems/single/Programming/submissions/modules/chapterProblemSubmissionActions.js @@ -34,12 +34,20 @@ export function createSubmission(courseSlug, chapterJid, chapterAlias, problemJi sourceFiles['sourceFiles.' + key] = data.sourceFiles[key]; }); - await submissionProgrammingAPI.createSubmission(token, chapterJid, problemJid, data.gradingLanguage, sourceFiles); + const submission = await submissionProgrammingAPI.createSubmission( + token, + chapterJid, + problemJid, + data.gradingLanguage, + sourceFiles + ); toastActions.showSuccessToast('Solution submitted.'); window.scrollTo(0, 0); - dispatch(push(`/courses/${courseSlug}/chapters/${chapterAlias}/problems/${problemAlias}/submissions`)); + dispatch( + push(`/courses/${courseSlug}/chapters/${chapterAlias}/problems/${problemAlias}/submissions/${submission.id}`) + ); }; } diff --git a/judgels-client/src/routes/courses/courses/single/chapters/single/problems/single/Programming/submissions/single/ChapterProblemSubmissionPage/ChapterProblemSubmissionPage.jsx b/judgels-client/src/routes/courses/courses/single/chapters/single/problems/single/Programming/submissions/single/ChapterProblemSubmissionPage/ChapterProblemSubmissionPage.jsx index 4a86382ec..c0e3b1573 100644 --- a/judgels-client/src/routes/courses/courses/single/chapters/single/problems/single/Programming/submissions/single/ChapterProblemSubmissionPage/ChapterProblemSubmissionPage.jsx +++ b/judgels-client/src/routes/courses/courses/single/chapters/single/problems/single/Programming/submissions/single/ChapterProblemSubmissionPage/ChapterProblemSubmissionPage.jsx @@ -12,6 +12,7 @@ import { selectCourse } from '../../../../../../../../../modules/courseSelectors import { selectCourseChapter } from '../../../../../../../modules/courseChapterSelectors'; import * as breadcrumbsActions from '../../../../../../../../../../../../modules/breadcrumbs/breadcrumbsActions'; import * as chapterProblemSubmissionActions from '../../modules/chapterProblemSubmissionActions'; +import { VerdictCode } from '../../../../../../../../../../../../modules/api/gabriel/verdict'; export class ChapterProblemSubmissionPage extends Component { state = { @@ -22,20 +23,10 @@ export class ChapterProblemSubmissionPage extends Component { containerName: undefined, }; - async componentDidMount() { - const { data, profile, problemName, containerName } = await this.props.onGetSubmissionWithSource( - +this.props.match.params.submissionId, - this.props.statementLanguage - ); - const sourceImageUrl = data.source ? undefined : await this.props.onGetSubmissionSourceImage(data.submission.jid); - this.props.onPushBreadcrumb(this.props.match.url, '#' + data.submission.id); - this.setState({ - submissionWithSource: data, - sourceImageUrl, - profile, - problemName, - containerName, - }); + currentTimeout; + + componentDidMount() { + this.refreshSubmission(); } async componentWillUnmount() { @@ -63,6 +54,36 @@ export class ChapterProblemSubmissionPage extends Component { ); } + refreshSubmission = async () => { + const { data, profile, problemName, containerName } = await this.props.onGetSubmissionWithSource( + +this.props.match.params.submissionId, + this.props.statementLanguage + ); + const sourceImageUrl = data.source ? undefined : await this.props.onGetSubmissionSourceImage(data.submission.jid); + this.props.onPushBreadcrumb(this.props.match.url, '#' + data.submission.id); + this.setState({ + submissionWithSource: data, + sourceImageUrl, + profile, + problemName, + containerName, + }); + + if (sourceImageUrl) { + return; + } + + const verdictCode = data.submission.latestGrading && data.submission.latestGrading.verdict.code; + + if (verdictCode === VerdictCode.PND) { + this.currentTimeout = setTimeout(this.refreshSubmission, 2000); + } else if (verdictCode === VerdictCode.AC) { + if (this.currentTimeout) { + window.location.reload(); + } + } + }; + renderSubmission = () => { const { submissionWithSource, profile, sourceImageUrl } = this.state; const { course, chapter } = this.props; @@ -79,6 +100,8 @@ export class ChapterProblemSubmissionPage extends Component { sourceImageUrl={sourceImageUrl} profile={profile} problemUrl={`/courses/${course.slug}/chapters/${chapter.alias}/problems/${problemAlias}`} + hideSourceFilename + showLoaderWhenPending /> ); };