diff --git a/.circleci/config.yml b/.circleci/config.yml deleted file mode 100644 index 19dd4d9889c5..000000000000 --- a/.circleci/config.yml +++ /dev/null @@ -1,79 +0,0 @@ -version: 2.1 - -workflows: - circleci_tests: - # Note: all end-to-end tests have now been moved off CircleCI. - - jobs: - - setup_and_typescript_tests - -var_for_docker_image: &docker_image circleci/python:3.7.10-browsers - -anchor_for_job_defaults: &job_defaults - working_directory: /home/circleci/oppia - docker: - - image: *docker_image - -commands: - merge_target_branch: - description: "Merge to target branch" - steps: - - run: - name: Merge to target branch - command: | - if [[ -n ${CIRCLE_PULL_REQUEST} ]] - then - - git config --global user.email "$( git log --format='%ae' $CIRCLE_SHA1^! )" - git config --global user.name "$( git log --format='%an' $CIRCLE_SHA1^! )" - - regexp="[[:digit:]]\+$" - PR_NUMBER=`echo $CIRCLE_PULL_REQUEST | grep -o $regexp` - - curl -L "https://github.com/stedolan/jq/releases/download/jq-1.5/jq-linux64" -o jq - chmod +x jq - - url="https://api.github.com/repos/$CIRCLE_PROJECT_USERNAME/$CIRCLE_PROJECT_REPONAME/pulls/$PR_NUMBER?access_token=$GITHUB_TOKEN" - - target_branch=$( - curl "$url" | ./jq '.base.ref' | tr -d '"' - ) - - rm jq - if [[ "$target_branch" == null ]] - then - git pull git@github.com:oppia/oppia.git develop --no-edit - else - git pull origin $target_branch --no-edit - fi - fi - -jobs: - setup_and_typescript_tests: - <<: *job_defaults - steps: - - checkout - - merge_target_branch - - run: - name: Setup python by installing wheel - command: pip install wheel==0.35.0 - - run: - name: Install dependencies - command: python -m scripts.install_third_party_libs - - run: - name: Check that all e2e test files are captured in protractor.conf.js - command: python -m scripts.check_e2e_tests_are_captured_in_ci - - run: - name: Run typescript tests - command: | - python -m scripts.typescript_checks - - run: - name: Run typescript tests in strict mode - command: | - python -m scripts.typescript_checks --strict_checks - -notify: - webhooks: - # A list of hook hashes, containing the url field - # gitter hook - - url: https://webhooks.gitter.im/e/71ac71505d1d45161035 diff --git a/.coveragerc b/.coveragerc index cd049ad6c344..dd3a59767db8 100644 --- a/.coveragerc +++ b/.coveragerc @@ -8,6 +8,13 @@ omit = *core/tests/* *scripts/linters/test_files/* *__init__.py - # TODO(#13935): Remove python_utils from the list once the codebase is - # run under Python 3. - core/python_utils.py + +# The 'exclude_lines' is used to skip a particular clause in coverage. +# We exclude any line with a comment of “pragma: no cover” as this is the default option +# provided by the coverage library. +# We also exclude @overload, because it is used for defining multiple MyPy definitions +# of a function and cannot be tested by Python tests. +[report] +exclude_lines = + pragma: no cover + @overload diff --git a/.eslintignore b/.eslintignore index e27c1600bbef..f9eedf97ce99 100644 --- a/.eslintignore +++ b/.eslintignore @@ -1,10 +1,11 @@ core/templates/expressions/parser.js core/templates/google-analytics.initializer.ts backend_prod_files/* -core/tests/protractor.conf.js integrations/* integrations_dev/* assets/scripts/* third_party/* build/* *.min.js +dump.rdb +.direnv/* diff --git a/.eslintrc b/.eslintrc index 5038142197ad..9c1a1fbd2030 100644 --- a/.eslintrc +++ b/.eslintrc @@ -16,18 +16,21 @@ "overrides": [ { // We exclude test files from dependency injection format checks because - // they are never minified. - "files": ["*Spec.js", "*Spec.ts"], + // they are never minified. Also, we exclude no-loss-of-precision check as + // it is only relevant for non-test files, since when running + // frontend tests there is no loss of precision. + "files": ["*Spec.js", "*Spec.ts", "*.spec.ts"], "rules": { - "angular/di": "off" + "angular/di": "off", + "no-loss-of-precision": "off" } }, { "files": ["*.js", "*.ts"], "excludedFiles": [ - "complete.spec.ts", - "student.spec.ts", - "teacher.spec.ts" + "complete.spec.ts", + "student.spec.ts", + "teacher.spec.ts" ], "rules": { "oppia/no-to-throw": "error" @@ -37,9 +40,9 @@ // We only run the e2e action checks on end-to-end test files, and // we exclude files that we haven't fixed yet. "files": [ - "core/tests/protractor/*.js", - "core/tests/protractor_utils/*.js", - "core/tests/protractor_desktop/*.js" + "core/tests/webdriverio/*.js", + "core/tests/webdriverio_utils/*.js", + "core/tests/webdriverio_desktop/*.js" ], "excludedFiles": [ "ClassroomPage.js", @@ -54,7 +57,6 @@ "LearnerDashboardPage.js", "LibraryPage.js", "ProfilePage.js", - "ProtractorConstants.js", "SkillEditorPage.js", "StoryEditorPage.js", "SubscriptionDashboardPage.js", @@ -110,22 +112,15 @@ } }, { - // We only run the protractor practices checks on protractor end-to-end test files. + // We only run the e2e practices checks on webdriverio + // end-to-end test files. "files": [ - "core/tests/protractor/*.js", - "core/tests/protractor_utils/*.js", - "core/tests/protractor_desktop/*.js" + "core/tests/webdriverio/*.js", + "core/tests/webdriverio_utils/*.js", + "core/tests/webdriverio_desktop/*.js" ], "rules": { - "oppia/protractor-practices": "error" - } - }, - { - "files": [ - "core/tests/protractor_utils/*.js", - ], - "rules": { - "oppia/check-element-selector-at-top": "error" + "oppia/e2e-practices": "error" } }, { @@ -138,12 +133,12 @@ { "files": ["*.js", "*.ts"], "excludedFiles": [ - "Polyfills.ts", - "ck-editor-copy-content.service.spec.ts", - "unit-test-utils.ajs.ts", - "mathjax.directive.ts", - "math-expression-content-editor.component.ts", - "core/tests/*" + "Polyfills.ts", + "ck-editor-copy-content.service.spec.ts", + "unit-test-utils.ajs.ts", + "mathjax.directive.ts", + "math-expression-content-editor.component.ts", + "core/tests/*" ], "rules": { "oppia/no-inner-html": "error" @@ -152,7 +147,7 @@ { "files": ["*.js", "*.ts"], "excludedFiles": [ - "core/tests/**" + "core/tests/**" ], "rules": { "oppia/no-relative-import": "error" @@ -252,7 +247,9 @@ "MemberExpression": 1, "SwitchCase": 1, "ignoredNodes": [ - "ConditionalExpression" + "ConditionalExpression", + // TODO(#14575): Remove once we have linting for class declaration. + "ClassDeclaration" ] } ], @@ -331,11 +328,7 @@ "never" ], "quotes": [ - "error", - "single", - { - "avoidEscape": true - } + "off" ], "quote-props": [ "error", @@ -350,6 +343,7 @@ // The following must be off so that we can enable // "@typescript-eslint/no-extra-semi". "no-extra-semi": "off", + "lines-between-class-members": "off", "semi-spacing": "error", "space-before-blocks": [ "error", @@ -456,6 +450,23 @@ "before": false, "after": true } - ] + ], + "@typescript-eslint/lines-between-class-members": [ + "error", + "always", + { + "exceptAfterSingleLine": true + } + ], + "@typescript-eslint/quotes": [ + "error", + "single", + { + "avoidEscape": true + } + ], + "no-dupe-class-members": "off", + "@typescript-eslint/no-dupe-class-members": ["error"], + "@typescript-eslint/no-namespace": ["error"] } } diff --git a/.gcloudignore b/.gcloudignore index f2b26473618f..258fd0f3f601 100644 --- a/.gcloudignore +++ b/.gcloudignore @@ -1,4 +1,4 @@ -# Various compiled, temporary, and hidden files +# Various compiled, temporary, and hidden files. *~ *.pyc *.pyo @@ -6,17 +6,30 @@ *.swo *.bak .* -# Typescript files in core -core/**.ts -# Typescript output log file -tsc_output_log.txt -# Python test files +__pycache__/ + +# Markdown files. +*.md + +# Typescript files in core and extension they are not needed as +# we compile webpack which contains these files. +core/**/*.ts +extensions/**/*.ts + +# Python test files. *_test.py -# Other folders to ignore -core/tests/ -node_modules/ -scripts/ -third_party/python3_libs/ + +# Other folders to ignore. +/backend_prod_files/webpack_bundles/ +/core/tests/ +/local_compiled_js_for_test/ +/node_modules/ +/scripts/ +/stubs/ +/third_party/python3_libs/ +/third_party/python_libs/ +/typings/ +/webpack_bundles/ # Some third_party static scripts are directly imported, namely: jquery, # jqueryui, angularjs, jqueryui-touch-punch, MathJax, code-mirror, # ui-codemirror, d3js, midi-js, ui-map, guppy, skulpt, math-expressions. @@ -34,11 +47,8 @@ third_party/static/bower-angular-translate-interpolation-messageformat-2.18.1/ third_party/static/bower-angular-translate-loader-partial-2.18.1/ third_party/static/bower-angular-translate-loader-static-files-2.18.1/ third_party/static/bower-angular-translate-storage-cookie-2.18.1/ -third_party/static/bower-material-1.1.19/ -third_party/python_libs/google/appengine/ -third_party/python_libs/google/net/ -third_party/python_libs/google/pyglib/ -third_party/python_libs/grpc/ +third_party/static/bower-material-1.1.19/layouts/ +third_party/static/bower-material-1.1.19/modules/ # CKEditor-4.12.1 plugins in the download from the CKEditor website include # only a11yhelp, about, clipboard, colordialog, copyformatting, dialog, div, # find, flash, forms, iframe, image, link, liststyle, magicline, pagebreak, diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS index e63300e966af..e298b32dc01b 100644 --- a/.github/CODEOWNERS +++ b/.github/CODEOWNERS @@ -33,47 +33,52 @@ # files/folders are created in the following directories, these codeowners would # be superseded by the relevant codeowners mentioned elsewhere in this file. # (Reference: https://docs.github.com/en/github/creating-cloning-and-archiving-repositories/about-code-owners) -/core/controllers/ @aks681 -/core/domain/ @DubeySandeep -/core/templates/components/ @srijanreddy98 -/core/templates/domain/ @kevintab95 -/core/templates/pages/ @srijanreddy98 -/core/templates/services/ @nithusha21 -/extensions/ @vojtechjelinek -/scripts/ @DubeySandeep +/core/controllers/ @oppia/lace-backend-reviewers +/core/domain/ @oppia/data-and-stability-reviewers +/core/templates/components/ @oppia/lace-frontend-reviewers +/core/templates/domain/ @oppia/lace-frontend-reviewers +/core/templates/pages/ @oppia/lace-frontend-reviewers +/core/templates/services/ @oppia/lace-frontend-reviewers +/core/templates/utility/ @oppia/lace-frontend-reviewers +/extensions/ @oppia/data-and-stability-reviewers +/scripts/ @oppia/dev-workflow-reviewers # Angular Migration team -/core/controllers/oppia_root*.py @srijanreddy98 @ashutoshc8101 -/core/templates/components/shared-component.module.ts @srijanreddy98 @ashutoshc8101 -/core/templates/services/loader.service*.ts @srijanreddy98 @ashutoshc8101 -/core/templates/components/code-mirror/ @srijanreddy98 @ashutoshc8101 -/core/templates/components/filter-fields/ @srijanreddy98 @ashutoshc8101 -/core/templates/components/oppia-angular-root.component.* @srijanreddy98 @ashutoshc8101 -/core/templates/modules/ @srijanreddy98 @ashutoshc8101 -/core/templates/pages/common-imports.ts @srijanreddy98 @ashutoshc8101 -/core/templates/pages/mock-ajs.ts @srijanreddy98 @ashutoshc8101 -/core/templates/pages/oppia-root/ @srijanreddy98 @ashutoshc8101 -/core/templates/i18n/ @srijanreddy98 @ashutoshc8101 -/core/templates/base-components/oppia-root.directive.ts @srijanreddy98 @ashutoshc8101 -/core/templates/base-components/oppia-root.directive.html @srijanreddy98 @ashutoshc8101 -/core/templates/services/angular-services.index.ts @srijanreddy98 @ashutoshc8101 -/core/templates/services/contextual/logger.service.ts @srijanreddy98 @ashutoshc8101 -/core/templates/services/contextual/logger.service.spec.ts @srijanreddy98 @ashutoshc8101 -/core/templates/services/page-head.service*.ts @srijanreddy98 @ashutoshc8101 -/core/templates/services/i18n-language-code.service.ts @srijanreddy98 @ashutoshc8101 -/core/templates/services/loader.service*.ts @srijanreddy98 @ashutoshc8101 -/core/templates/services/question-validation.service*.ts @srijanreddy98 @ashutoshc8101 -/core/templates/services/request-interceptor.service*.ts @srijanreddy98 @ashutoshc8101 -/core/templates/services/UpgradedServices.ts @srijanreddy98 @ashutoshc8101 -/core/templates/hybrid-router-module-provider*.ts @srijanreddy98 @ashutoshc8101 - +/core/controllers/oppia_root*.py @oppia/angular-migration-reviewers +/core/templates/components/shared-component.module.ts @oppia/angular-migration-reviewers +/core/templates/services/loader.service*.ts @oppia/angular-migration-reviewers +/core/templates/components/code-mirror/ @oppia/angular-migration-reviewers +/core/templates/components/filter-fields/ @oppia/angular-migration-reviewers +/core/templates/components/oppia-angular-root.component.* @oppia/angular-migration-reviewers +/core/templates/modules/ @oppia/angular-migration-reviewers +/core/templates/pages/common-imports.ts @oppia/angular-migration-reviewers +/core/templates/pages/mock-ajs.ts @oppia/angular-migration-reviewers +/core/templates/pages/oppia-root/ @oppia/angular-migration-reviewers +/core/templates/pages/lightweight-oppia-root/ @oppia/angular-migration-reviewers +/core/templates/i18n/ @oppia/angular-migration-reviewers +/core/templates/base-components/oppia-root.directive.ts @oppia/angular-migration-reviewers +/core/templates/base-components/oppia-root.directive.html @oppia/angular-migration-reviewers +/core/templates/services/angular-services.index.ts @oppia/angular-migration-reviewers +/core/templates/services/contextual/logger.service.ts @oppia/angular-migration-reviewers +/core/templates/services/contextual/logger.service.spec.ts @oppia/angular-migration-reviewers +/core/templates/services/page-head.service*.ts @oppia/angular-migration-reviewers +/core/templates/services/i18n-language-code.service.ts @oppia/angular-migration-reviewers +/core/templates/services/question-validation.service*.ts @oppia/angular-migration-reviewers +/core/templates/services/request-interceptor.service*.ts @oppia/angular-migration-reviewers +/core/templates/services/UpgradedServices.ts @oppia/angular-migration-reviewers +/core/templates/hybrid-router-module-provider*.ts @oppia/angular-migration-reviewers +/core/templates/utility/hashes.ts @oppia/angular-migration-reviewers +/core/templates/utility/string-utility*.ts @oppia/angular-migration-reviewers +/proxy.conf.json @oppia/angular-migration-reviewers +/angular-template-style-url-replacer.webpack-loader.js @oppia/angular-migration-reviewers +/angular.json @oppia/angular-migration-reviewers +/src @oppia/frontend-infrastructure-reviewers # TS typing -/typings/ @vojtechjelinek -/tsconfig.json @vojtechjelinek -/tsconfig-strict.json @vojtechjelinek -/scripts/typescript_checks*.py @vojtechjelinek +/typings/ @oppia/data-and-stability-reviewers +/tsconfig*.json @oppia/data-and-stability-reviewers +/scripts/typescript_checks*.py @oppia/data-and-stability-reviewers # Answer classification team. @@ -88,256 +93,259 @@ # App Feedback Reporting project -# TODO(#14285): Replace @seanlip with @BenHenning for both. -/core/domain/app_feedback_report_*.py @seanlip -/core/controllers/incoming_app_feedback_report*.py @seanlip +/core/domain/app_feedback_report_*.py @oppia/web-android-compatibility-reviewers +/core/controllers/incoming_app_feedback_report*.py @oppia/web-android-compatibility-reviewers # Audio and Translation team. -/core/controllers/voice_artist*.py @DubeySandeep -/core/templates/pages/exploration-editor-page/translation-tab/ @DubeySandeep -/core/templates/services/audio-bar-status.service*.ts @DubeySandeep -/core/templates/services/audio-player.service.ts @DubeySandeep -/core/templates/services/autogenerated-audio-player.service.ts @DubeySandeep -/core/templates/services/generate-content-id.service*.ts @DubeySandeep -/core/templates/services/speech-synthesis-chunker.service*.ts @DubeySandeep -/core/templates/services/assets-backend-api.service*.ts @DubeySandeep +/core/controllers/voice_artist*.py @oppia/lace-backend-reviewers +/core/templates/domain/translation/ @oppia/lace-frontend-reviewers +/core/templates/pages/exploration-editor-page/translation-tab/ @oppia/lace-frontend-reviewers +/core/templates/services/audio-bar-status.service*.ts @oppia/lace-frontend-reviewers +/core/templates/services/audio-player.service.ts @oppia/lace-frontend-reviewers +/core/templates/services/autogenerated-audio-player.service.ts @oppia/lace-frontend-reviewers +/core/templates/services/generate-content-id.service*.ts @oppia/lace-frontend-reviewers +/core/templates/services/speech-synthesis-chunker.service*.ts @oppia/lace-frontend-reviewers +/core/templates/services/assets-backend-api.service*.ts @oppia/lace-frontend-reviewers +/core/templates/services/entity-translations.services.ts @oppia/lace-frontend-reviewers # Blog project -/core/domain/blog*.py @iamprayush @aks681 -/core/controllers/blog_dashboard*.py @aks681 -/core/controllers/blog_homepage*.py @aks681 -/core/templates/domain/blog/ @iamprayush @kevintab95 -/core/templates/pages/blog-dashboard-page/ @aks681 @iamprayush +/core/domain/blog*.py @oppia/lace-backend-reviewers +/core/controllers/blog_dashboard*.py @oppia/lace-backend-reviewers +/core/controllers/blog_homepage*.py @oppia/lace-backend-reviewers +/core/templates/domain/blog/ @oppia/lace-frontend-reviewers +/core/templates/pages/blog-dashboard-page/ @oppia/lace-frontend-reviewers +/core/templates/pages/blog-home-page/ @oppia/lace-frontend-reviewers +/core/templates/pages/blog-post-page/ @oppia/lace-frontend-reviewers +/core/templates/pages/blog-author-profile-page/ @oppia/lace-frontend-reviewers # Collection project. -/core/controllers/collection*.py @aks681 -/core/domain/collection*.py @aks681 -/core/templates/components/entity-creation-services/collection-creation.service*.ts @EricZLou -/core/templates/components/entity-creation-services/collection-creation-backend-api.service*.ts @EricZLou -/core/templates/domain/collection/ @EricZLou -/core/templates/pages/collection-editor-page/ @EricZLou -/core/templates/pages/collection-player-page/ @EricZLou +/core/controllers/collection*.py @oppia/lace-backend-reviewers +/core/domain/collection*.py @oppia/lace-backend-reviewers +/core/templates/components/entity-creation-services/collection-creation.service*.ts @oppia/lace-frontend-reviewers +/core/templates/components/entity-creation-services/collection-creation-backend-api.service*.ts @oppia/lace-frontend-reviewers +/core/templates/domain/collection/ @oppia/lace-frontend-reviewers +/core/templates/pages/collection-editor-page/ @oppia/lace-frontend-reviewers +/core/templates/pages/collection-player-page/ @oppia/lace-frontend-reviewers # Contributor Dashboard project. /core/controllers/contributor_dashboard*.py @oppia/contributor-experience-team /core/domain/opportunity*.py @oppia/contributor-experience-team /core/domain/translation*.py @oppia/contributor-experience-team -/core/domain/voiceover_services*.py @oppia/contributor-experience-team -/core/storage/translation/ @vojtechjelinek /core/templates/domain/opportunity/ @oppia/contributor-experience-team /core/templates/pages/contributor-dashboard-page/ @oppia/contributor-experience-team /core/templates/pages/contributor-dashboard-admin-page/ @oppia/contributor-experience-team +/scripts/contributor_dashboard_debug.py @oppia/contributor-experience-team # Core documentation -# TODO(#14285): Re-add @BenHenning. -/AUTHORS @seanlip -/CHANGELOG @seanlip @vojtechjelinek -# TODO(#14285): Re-add @BenHenning. -/CONTRIBUTORS @seanlip -/LICENSE @seanlip -/NOTICE @seanlip -/core/templates/pages/about-page/ @DubeySandeep -# TODO(#14285): Re-add @BenHenning. -/core/templates/pages/about-page/about-page.constants.ts @seanlip -/core/templates/pages/license-page/ @vojtechjelinek -/core/templates/pages/license-page/license-page.component.html @seanlip -/core/templates/pages/privacy-page/ @DubeySandeep -# TODO(#14285): Re-add @BenHenning. -/core/templates/pages/privacy-page/privacy-page.component.html @seanlip -/core/templates/pages/privacy-page/privacy-page.component.ts @DubeySandeep -/core/templates/pages/terms-page/ @DubeySandeep -# TODO(#14285): Re-add @BenHenning. -/core/templates/pages/terms-page/terms-page.component.html @seanlip +/CHANGELOG @oppia/release-workflow-reviewers +/core/templates/pages/android-page/ @oppia/lace-frontend-reviewers +/core/templates/pages/about-page/ @oppia/lace-frontend-reviewers +/core/templates/pages/about-page/about-page.constants.ts @oppia/angular-migration-reviewers +/core/templates/pages/license-page/ @oppia/angular-migration-reviewers +/core/templates/pages/privacy-page/ @oppia/lace-frontend-reviewers +/core/templates/pages/privacy-page/privacy-page.component.ts @oppia/lace-frontend-reviewers +/core/templates/pages/terms-page/ @oppia/lace-frontend-reviewers # Dashboard pages. -/core/controllers/creator_dashboard*.py @nithusha21 -/core/controllers/email_dashboard*.py @nithusha21 -/core/controllers/learner_dashboard*.py @nithusha21 -/core/controllers/learner_goals*.py @nithusha21 -/core/controllers/learner_playlist*.py @nithusha21 -/core/controllers/subscriptions*.py @nithusha21 -/core/domain/activity*.py @nithusha21 -/core/domain/learner_goals_services*.py @nithusha21 -/core/domain/learner_playlist_services*.py @nithusha21 -/core/domain/learner_progress*.py @nithusha21 -/core/domain/subscription_services*.py @nithusha21 -/core/templates/domain/creator_dashboard/ @nithusha21 -/core/templates/domain/email-dashboard/ @nithusha21 -/core/templates/domain/learner_dashboard/ @nithusha21 -/core/templates/pages/creator-dashboard-page/ @nithusha21 -/core/templates/pages/email-dashboard-pages/ @nithusha21 -/core/templates/pages/learner-dashboard-page/ @nithusha21 +/core/controllers/creator_dashboard*.py @oppia/lace-backend-reviewers +/core/controllers/email_dashboard*.py @oppia/lace-backend-reviewers +/core/controllers/learner_dashboard*.py @oppia/lace-backend-reviewers +/core/controllers/learner_goals*.py @oppia/lace-backend-reviewers +/core/controllers/learner_playlist*.py @oppia/lace-backend-reviewers +/core/controllers/subscriptions*.py @oppia/lace-backend-reviewers +/core/domain/activity*.py @oppia/lace-backend-reviewers +/core/domain/learner_goals_services*.py @oppia/lace-backend-reviewers +/core/domain/learner_playlist_services*.py @oppia/lace-backend-reviewers +/core/domain/learner_progress*.py @oppia/lace-backend-reviewers +/core/domain/subscription_services*.py @oppia/lace-backend-reviewers +/core/templates/domain/creator_dashboard/ @oppia/lace-frontend-reviewers +/core/templates/domain/email-dashboard/ @oppia/lace-frontend-reviewers +/core/templates/domain/learner_dashboard/ @oppia/lace-frontend-reviewers +/core/templates/pages/creator-dashboard-page/ @oppia/lace-frontend-reviewers +/core/templates/pages/email-dashboard-pages/ @oppia/lace-frontend-reviewers +/core/templates/pages/learner-dashboard-page/ @oppia/lace-frontend-reviewers # Dev workflow team. -/.circleci/ @oppia/automated-qa-reviewers -/.eslintignore @Hudda @DubeySandeep -/.eslintrc @Hudda @DubeySandeep -/.htmllintrc @Hudda @DubeySandeep -/.coveragerc @Hudda @DubeySandeep -/.gitattributes @DubeySandeep -/.gitignore @DubeySandeep -/.isort.cfg @Hudda @DubeySandeep -/.pylintrc @Hudda @DubeySandeep -/.stylelintrc @Hudda @DubeySandeep -/.yarnrc @DubeySandeep -/core/templates/css/.stylelintrc @Hudda @DubeySandeep -/tox.ini @Hudda @DubeySandeep -/scripts/*.py @DubeySandeep -/scripts/check_e2e_tests_are_captured_in_ci*.py @DubeySandeep -/scripts/check_frontend_test_coverage*.py @DubeySandeep @nithusha21 -/scripts/create_topological_sort_of_all_services*.py @DubeySandeep -/scripts/install_prerequisites.sh @DubeySandeep -/scripts/linters/ @Hudda @DubeySandeep -/scripts/linters/codeowner_linter*.py @sajalasati @DubeySandeep -/scripts/linters/pylint_extensions*.py @sajalasati @DubeySandeep -/scripts/linters/python_linter*.py @sajalasati @DubeySandeep -/ubuntu_dockerfile @DubeySandeep +/.eslintignore @oppia/dev-workflow-reviewers +/.eslintrc @oppia/dev-workflow-reviewers +/.htmllintrc @oppia/dev-workflow-reviewers +/.coveragerc @oppia/dev-workflow-reviewers +/.gitattributes @oppia/dev-workflow-reviewers +/.gitignore @oppia/dev-workflow-reviewers +/.isort.cfg @oppia/dev-workflow-reviewers +/.pylintrc @oppia/dev-workflow-reviewers +/.stylelintrc @oppia/dev-workflow-reviewers +/.yarnrc @oppia/dev-workflow-reviewers +/tox.ini @oppia/dev-workflow-reviewers +/scripts/*.py @oppia/dev-workflow-reviewers +/scripts/check_e2e_tests_are_captured_in_ci*.py @oppia/automated-qa-reviewers +/scripts/check_frontend_test_coverage*.py @oppia/automated-qa-reviewers +/scripts/create_topological_sort_of_all_services*.py @oppia/dev-workflow-reviewers +/scripts/install_prerequisites.sh @oppia/dev-workflow-reviewers +/scripts/linters/ @oppia/dev-workflow-reviewers +/scripts/linters/codeowner_linter*.py @oppia/dev-workflow-reviewers +/scripts/linters/pylint_extensions*.py @oppia/dev-workflow-reviewers +/scripts/linters/python_linter*.py @oppia/dev-workflow-reviewers +/ubuntu_dockerfile @oppia/dev-workflow-reviewers # Exploration project. -/core/controllers/editor*.py @aks681 -/core/controllers/reader*.py @aks681 -/core/controllers/resources*.py @vojtechjelinek -/core/domain/exp*.py @aks681 -/core/domain/fs*.py @aks681 -/core/domain/param_domain*.py @aks681 -/core/domain/rating_services*.py @aks681 -/core/domain/state_domain*.py @aks681 -/core/domain/summary_services*.py @aks681 -/core/domain/value_generators_domain*.py @vojtechjelinek -/core/templates/components/entity-creation-services/exploration-creation.service*.ts @EricZLou -/core/templates/components/entity-creation-services/exploration-creation-backend-api.service*.ts @EricZLou -/core/templates/components/button-directives/hint-and-solution-buttons.component*.ts @kevintab95 -/core/templates/components/button-directives/hint-and-solution-buttons.component.html @kevintab95 -/core/templates/components/state-directives/ @kevintab95 -/core/templates/components/graph-services/ @kevintab95 -/core/templates/components/on-screen-keyboard/ @aks681 -/core/templates/components/version-diff-visualization/ @aks681 -/core/templates/domain/editor/ @kevintab95 -/core/templates/domain/exploration/ @kevintab95 -/core/templates/domain/recommendations/ @kevintab95 -/core/templates/domain/state/ @kevintab95 -/core/templates/domain/summary/ @kevintab95 -/core/templates/domain/state_card/ @kevintab95 -/core/templates/pages/exploration-editor-page/ @EricZLou -/core/templates/pages/exploration-editor-page/history-tab/ @EricZLou -/core/templates/pages/exploration-editor-page/settings-tab/ @EricZLou -/core/templates/pages/exploration-player-page/ @kevintab95 -/core/templates/components/state-editor/ @EricZLou -/core/templates/services/compute-graph.service.ts @EricZLou -/core/templates/services/context.service*.ts @kevintab95 -/core/templates/services/editability.service*.ts @kevintab95 -/core/templates/services/exploration-features*.ts @kevintab95 -/core/templates/services/exploration-html-formatter.service*.ts @kevintab95 -/core/templates/services/image-upload-helper.service*.ts @kevintab95 -/core/templates/services/validators.service*.ts @EricZLou +/core/controllers/editor*.py @oppia/lace-backend-reviewers +/core/controllers/reader*.py @oppia/lace-backend-reviewers +/core/controllers/resources*.py @oppia/data-and-stability-reviewers +/core/domain/exp*.py @oppia/lace-backend-reviewers +/core/domain/fs*.py @oppia/lace-backend-reviewers +/core/domain/param_domain*.py @oppia/lace-backend-reviewers +/core/domain/rating_services*.py @oppia/lace-backend-reviewers +/core/domain/state_domain*.py @oppia/lace-backend-reviewers +/core/domain/summary_services*.py @oppia/lace-backend-reviewers +/core/domain/value_generators_domain*.py @oppia/data-and-stability-reviewers +/core/templates/components/entity-creation-services/exploration-creation.service*.ts @oppia/lace-frontend-reviewers +/core/templates/components/entity-creation-services/exploration-creation-backend-api.service*.ts @oppia/lace-frontend-reviewers +/core/templates/components/button-directives/hint-and-solution-buttons.component*.ts @oppia/lace-frontend-reviewers +/core/templates/components/button-directives/hint-and-solution-buttons.component.html @oppia/lace-frontend-reviewers +/core/templates/components/checkpoint-celebration-modal/ @oppia/lace-frontend-reviewers +/core/templates/components/state-directives/ @oppia/lace-frontend-reviewers +/core/templates/components/graph-services/ @oppia/lace-frontend-reviewers +/core/templates/components/on-screen-keyboard/ @oppia/lace-backend-reviewers +/core/templates/components/recommendations/ @oppia/lace-frontend-reviewers +/core/templates/components/save-pending-changes/ @oppia/lace-frontend-reviewers +/core/templates/components/stale-tab-info/ @oppia/lace-frontend-reviewers +/core/templates/components/unsaved-changes-status-info/ @oppia/lace-frontend-reviewers +/core/templates/components/version-diff-visualization/ @oppia/lace-frontend-reviewers +/core/templates/domain/editor/ @oppia/lace-frontend-reviewers +/core/templates/domain/entity_editor_browser_tabs_info/ @oppia/lace-frontend-reviewers +/core/templates/domain/exploration/ @oppia/lace-frontend-reviewers +/core/templates/domain/recommendations/ @oppia/lace-frontend-reviewers +/core/templates/domain/state/ @oppia/lace-frontend-reviewers +/core/templates/domain/summary/ @oppia/lace-frontend-reviewers +/core/templates/domain/state_card/ @oppia/lace-frontend-reviewers +/core/templates/pages/exploration-editor-page/ @oppia/lace-frontend-reviewers +/core/templates/pages/exploration-editor-page/history-tab/ @oppia/lace-frontend-reviewers +/core/templates/pages/exploration-editor-page/settings-tab/ @oppia/lace-frontend-reviewers +/core/templates/pages/exploration-player-page/ @oppia/lace-frontend-reviewers +/core/templates/components/state-editor/ @oppia/lace-frontend-reviewers +/core/templates/services/blog-search.service.ts @oppia/lace-frontend-reviewers +/core/templates/services/compute-graph.service.ts @oppia/lace-frontend-reviewers +/core/templates/services/context.service*.ts @oppia/lace-frontend-reviewers +/core/templates/services/editability.service*.ts @oppia/lace-frontend-reviewers +/core/templates/services/exploration-features*.ts @oppia/lace-frontend-reviewers +/core/templates/services/exploration-html-formatter.service*.ts @oppia/lace-frontend-reviewers +/core/templates/services/favicon.service*.ts @oppia/lace-frontend-reviewers +/core/templates/services/image-upload-helper.service*.ts @oppia/lace-frontend-reviewers +/core/templates/services/staleness-detection.service*.ts @oppia/lace-frontend-reviewers +/core/templates/services/validators.service*.ts @oppia/lace-frontend-reviewers +/core/templates/services/yaml.service*.ts @oppia/lace-frontend-reviewers +/core/templates/components/copy-url/ @oppia/lace-frontend-reviewers # Forms pages. -/core/templates/components/forms/ @EricZLou -/core/templates/components/common-layout-directives/common-elements/confirmation-modal.template.html @srijanreddy98 -/core/templates/components/ck-editor-helpers/customize-rte-component-modal.template.html @DubeySandeep -/core/templates/services/schema-default-value.service*.ts @EricZLou -/core/templates/services/schema-form-submitted.service*.ts @EricZLou -/core/templates/services/schema-undefined-last-element.service*.ts @EricZLou +/core/templates/components/forms/ @oppia/lace-frontend-reviewers +/core/templates/components/common-layout-directives/common-elements/confirmation-modal.template.html @oppia/lace-frontend-reviewers +/core/templates/components/ck-editor-helpers/customize-rte-component-modal.template.html @oppia/lace-frontend-reviewers +/core/templates/services/schema-default-value.service*.ts @oppia/lace-frontend-reviewers +/core/templates/services/schema-form-submitted.service*.ts @oppia/lace-frontend-reviewers +/core/templates/services/schema-undefined-last-element.service*.ts @oppia/lace-frontend-reviewers # Google-app-engine configurations -/app_dev.yaml @nithusha21 @vojtechjelinek -/cron.yaml @nithusha21 @vojtechjelinek -/index.yaml @nithusha21 @vojtechjelinek -/queue.yaml @nithusha21 @vojtechjelinek +/app_dev.yaml @oppia/release-workflow-reviewers +/cron.yaml @oppia/release-workflow-reviewers +/index.yaml @oppia/release-workflow-reviewers +/queue.yaml @oppia/release-workflow-reviewers # Global components and filters. -/core/templates/components/angular-html-bind/ @srijanreddy98 -/core/templates/components/button-directives/* @srijanreddy98 -/core/templates/components/common-layout-directives/common-elements/alert-message.component*.ts @srijanreddy98 -/core/templates/components/common-layout-directives/common-elements/attribution-guide.component.html @srijanreddy98 -/core/templates/components/common-layout-directives/common-elements/attribution-guide.component*.ts @srijanreddy98 -/core/templates/components/common-layout-directives/common-elements/background-banner.component*.ts @srijanreddy98 -/core/templates/components/common-layout-directives/common-elements/background-banner.component.html @srijanreddy98 -/core/templates/components/common-layout-directives/common-elements/confirm-or-cancel-modal.controller*.ts @srijanreddy98 -/core/templates/components/common-layout-directives/common-elements/confirm-or-cancel-modal.component*.ts @srijanreddy98 -/core/templates/components/common-layout-directives/common-elements/lazy-loading.component.html @srijanreddy98 -/core/templates/components/common-layout-directives/common-elements/lazy-loading.component.ts @srijanreddy98 -/core/templates/components/common-layout-directives/common-elements/loading-dots.component.ts @srijanreddy98 -/core/templates/components/common-layout-directives/common-elements/loading-dots.component.html @srijanreddy98 -/core/templates/components/common-layout-directives/common-elements/promo-bar.component*.ts @srijanreddy98 -/core/templates/components/common-layout-directives/common-elements/promo-bar.component.html @srijanreddy98 -/core/templates/components/common-layout-directives/common-elements/sharing-links.component.html @srijanreddy98 -/core/templates/components/common-layout-directives/common-elements/sharing-links.component*.ts @srijanreddy98 -/core/templates/components/common-layout-directives/common-elements/common-elements.module.ts @srijanreddy98 -/core/templates/components/profile-link-directives/ @srijanreddy98 -/core/templates/components/summary-tile/ @srijanreddy98 -/core/templates/directives/angular-html-bind.directive*.ts @srijanreddy98 -/core/templates/directives/directives.module.ts @srijanreddy98 -/core/templates/directives/focus-on.directive*.ts @srijanreddy98 -/core/templates/directives/headroom.directive.ts @srijanreddy98 -/core/templates/directives/ng-init.directive.ts @srijanreddy98 -/core/templates/domain/promo_bar/ @srijanreddy98 -/core/templates/filters/ @srijanreddy98 -/core/templates/services/attribution.service*.ts @srijanreddy98 -/core/templates/services/ngb-modal.service.ts @srijanreddy98 +/core/templates/components/interaction-display/ @oppia/angular-migration-reviewers +/core/templates/components/button-directives/* @oppia/angular-migration-reviewers +/core/templates/components/common-layout-directives/common-elements/alert-message.component*.ts @oppia/angular-migration-reviewers +/core/templates/components/common-layout-directives/common-elements/attribution-guide.component.html @oppia/angular-migration-reviewers +/core/templates/components/common-layout-directives/common-elements/attribution-guide.component*.ts @oppia/angular-migration-reviewers +/core/templates/components/common-layout-directives/common-elements/attribution-guide.component*.css @oppia/angular-migration-reviewers +/core/templates/components/common-layout-directives/common-elements/background-banner.*.ts @oppia/angular-migration-reviewers +/core/templates/components/common-layout-directives/common-elements/background-banner.component.html @oppia/angular-migration-reviewers +/core/templates/components/common-layout-directives/common-elements/confirm-or-cancel-modal.controller*.ts @oppia/angular-migration-reviewers +/core/templates/components/common-layout-directives/common-elements/confirm-or-cancel-modal.component*.ts @oppia/angular-migration-reviewers +/core/templates/components/common-layout-directives/common-elements/lazy-loading.component.html @oppia/angular-migration-reviewers +/core/templates/components/common-layout-directives/common-elements/lazy-loading.component.ts @oppia/angular-migration-reviewers +/core/templates/components/common-layout-directives/common-elements/loading-dots.component.ts @oppia/angular-migration-reviewers +/core/templates/components/common-layout-directives/common-elements/loading-dots.component.html @oppia/angular-migration-reviewers +/core/templates/components/common-layout-directives/common-elements/promo-bar.component*.ts @oppia/angular-migration-reviewers +/core/templates/components/common-layout-directives/common-elements/promo-bar.component.html @oppia/angular-migration-reviewers +/core/templates/components/common-layout-directives/common-elements/sharing-links.component.html @oppia/angular-migration-reviewers +/core/templates/components/common-layout-directives/common-elements/sharing-links.component*.ts @oppia/angular-migration-reviewers +/core/templates/components/common-layout-directives/common-elements/common-elements.module.ts @oppia/angular-migration-reviewers +/core/templates/components/profile-link-directives/ @oppia/angular-migration-reviewers +/core/templates/components/summary-tile/ @oppia/angular-migration-reviewers +/core/templates/directives/angular-html-bind.directive*.ts @oppia/angular-migration-reviewers +/core/templates/directives/directives.module.ts @oppia/angular-migration-reviewers +/core/templates/directives/focus-on.directive*.ts @oppia/angular-migration-reviewers +/core/templates/directives/headroom.directive.ts @oppia/angular-migration-reviewers +/core/templates/directives/ng-init.directive.ts @oppia/angular-migration-reviewers +/core/templates/domain/promo_bar/ @oppia/angular-migration-reviewers +/core/templates/filters/ @oppia/angular-migration-reviewers +/core/templates/services/attribution.service*.ts @oppia/angular-migration-reviewers +/core/templates/services/ngb-modal.service.ts @oppia/angular-migration-reviewers # Global frontend services -/core/templates/services/alerts.service*.ts @srijanreddy98 -/core/templates/services/date-time-format.service*.ts @srijanreddy98 -/core/templates/services/debouncer.service*.ts @srijanreddy98 -/core/templates/services/extension-tag-assembler.service*.ts @srijanreddy98 -/core/templates/services/html-escaper.service*.ts @srijanreddy98 -/core/templates/services/id-generation.service*.ts @srijanreddy98 -/core/templates/services/keyboard-shortcut.service*.ts @jimbyo -/core/templates/services/local-storage.service*.ts @srijanreddy98 -/core/templates/services/nested-directives*.ts @srijanreddy98 -/core/templates/services/page-title.service*.ts @srijanreddy98 -/core/templates/services/prevent-page-unload-event.service*.ts @srijanreddy98 -/core/templates/services/promo-bar-backend-api.service*.ts @srijanreddy98 -/core/templates/services/site-analytics.service*.ts @srijanreddy98 -/core/templates/services/utils.service*.ts @srijanreddy98 -/core/templates/services/stateful/background-mask.service*.ts @srijanreddy98 -/core/templates/services/stateful/focus-manager.service*.ts @srijanreddy98 -/core/templates/services/contextual/device-info.service*.ts @srijanreddy98 -/core/templates/services/contextual/url.service*.ts @srijanreddy98 -/core/templates/services/contextual/window-dimensions.service*.ts @srijanreddy98 -/core/templates/services/contextual/window-ref.service*.ts @srijanreddy98 -/core/templates/services/internet-connectivity.service*.ts @srijanreddy98 -/core/templates/services/server-connection-backend-api.service*.ts @srijanreddy98 +/core/templates/services/alerts.service*.ts @oppia/frontend-infrastructure-reviewers +/core/templates/services/date-time-format.service*.ts @oppia/frontend-infrastructure-reviewers +/core/templates/services/debouncer.service*.ts @oppia/frontend-infrastructure-reviewers +/core/templates/services/extension-tag-assembler.service*.ts @oppia/frontend-infrastructure-reviewers +/core/templates/services/html-escaper.service*.ts @oppia/frontend-infrastructure-reviewers +/core/templates/services/id-generation.service*.ts @oppia/frontend-infrastructure-reviewers +/core/templates/services/keyboard-shortcut.service*.ts @oppia/frontend-infrastructure-reviewers +/core/templates/services/local-storage.service*.ts @oppia/frontend-infrastructure-reviewers +/core/templates/services/nested-directives*.ts @oppia/frontend-infrastructure-reviewers +/core/templates/services/page-title.service*.ts @oppia/frontend-infrastructure-reviewers +/core/templates/services/prevent-page-unload-event.service*.ts @oppia/frontend-infrastructure-reviewers +/core/templates/services/promo-bar-backend-api.service*.ts @oppia/frontend-infrastructure-reviewers +/core/templates/services/site-analytics.service*.ts @oppia/frontend-infrastructure-reviewers +/core/templates/services/utils.service*.ts @oppia/frontend-infrastructure-reviewers +/core/templates/services/stateful/background-mask.service*.ts @oppia/frontend-infrastructure-reviewers +/core/templates/services/stateful/focus-manager.service*.ts @oppia/frontend-infrastructure-reviewers +/core/templates/services/contextual/device-info.service*.ts @oppia/frontend-infrastructure-reviewers +/core/templates/services/contextual/url.service*.ts @oppia/frontend-infrastructure-reviewers +/core/templates/services/contextual/window-dimensions.service*.ts @oppia/frontend-infrastructure-reviewers +/core/templates/services/contextual/window-ref.service*.ts @oppia/frontend-infrastructure-reviewers +/core/templates/services/internet-connectivity.service*.ts @oppia/frontend-infrastructure-reviewers +/core/templates/services/server-connection-backend-api.service*.ts @oppia/frontend-infrastructure-reviewers +/core/templates/services/number-conversion.service*.ts @oppia/frontend-infrastructure-reviewers # Global stylesheet. -/core/templates/css/oppia.css @srijanreddy98 -/core/templates/css/oppia-material.css @srijanreddy98 +/core/templates/css/oppia.css @oppia/frontend-infrastructure-reviewers +/core/templates/css/oppia-material.css @oppia/frontend-infrastructure-reviewers # Interaction project. -/core/domain/customization_args_util*.py @iamprayush -/core/domain/expression_parser*.py @iamprayush -/core/domain/interaction_registry*.py @iamprayush -/core/domain/object_registry*.py @iamprayush -/core/domain/rules_registry*.py @aks681 -/core/domain/translatable_object_registry*.py @iamprayush -/core/templates/components/keyboard-shortcut-help/ @iamprayush -/core/templates/domain/objects/ @iamprayush -/core/templates/expressions/ @iamprayush @vojtechjelinek -/core/templates/services/code-normalizer.service*.ts @iamprayush -/core/templates/services/guppy-configuration.service.ts @iamprayush -/core/templates/services/guppy-initialization.service.ts @iamprayush -/core/templates/services/math-interactions.service.ts @iamprayush -/extensions/domain*.py @iamprayush -/extensions/interactions/ @iamprayush @vojtechjelinek -/extensions/objects/ @iamprayush @vojtechjelinek -/extensions/objects/templates/filepath-editor.component*.ts @kevintab95 -/extensions/objects/templates/filepath-editor.component.html @kevintab95 -/extensions/value_generators/ @iamprayush @vojtechjelinek -/extensions/__init__.py @iamprayush @vojtechjelinek +/core/domain/customization_args_util*.py @oppia/lace-frontend-reviewers +/core/domain/expression_parser*.py @oppia/lace-frontend-reviewers +/core/domain/interaction_registry*.py @oppia/lace-frontend-reviewers +/core/domain/object_registry*.py @oppia/lace-frontend-reviewers +/core/domain/rules_registry*.py @oppia/lace-backend-reviewers +/core/domain/translatable_object_registry*.py @oppia/lace-frontend-reviewers +/core/templates/components/keyboard-shortcut-help/ @oppia/lace-backend-reviewers +/core/templates/domain/objects/ @oppia/lace-backend-reviewers +/core/templates/expressions/ @oppia/lace-backend-reviewers +/core/templates/services/code-normalizer.service*.ts @oppia/lace-frontend-reviewers +/core/templates/services/guppy-configuration.service.ts @oppia/lace-frontend-reviewers +/core/templates/services/guppy-initialization.service.ts @oppia/lace-frontend-reviewers +/core/templates/services/math-interactions.service.ts @oppia/lace-frontend-reviewers +/extensions/domain*.py @oppia/lace-frontend-reviewers +/extensions/interactions/ @oppia/lace-backend-reviewers +/extensions/objects/ @oppia/lace-backend-reviewers +/extensions/objects/templates/filepath-editor.component*.ts @oppia/lace-frontend-reviewers +/extensions/objects/templates/filepath-editor.component.html @oppia/lace-frontend-reviewers +/extensions/value_generators/ @oppia/lace-backend-reviewers +/extensions/__init__.py @oppia/lace-frontend-reviewers # Lesson Analytics team. @@ -351,9 +359,8 @@ /core/domain/playthrough_issue_registry*.py @oppia/learner-analytics-reviewers /core/domain/stats*.py @oppia/learner-analytics-reviewers /core/domain/visualization_registry*.py @oppia/learner-analytics-reviewers -/core/templates/components/common-layout-directives/common-elements/answer-content-modal.controller*.ts @oppia/learner-analytics-reviewers -/core/templates/components/common-layout-directives/common-elements/answer-content-modal.template.html @oppia/learner-analytics-reviewers -/core/templates/components/common-layout-directives/common-elements/confirmation-modal.template.html @oppia/learner-analytics-reviewers +/core/templates/components/common-layout-directives/common-elements/answer-content-modal.component*.ts @oppia/learner-analytics-reviewers +/core/templates/components/common-layout-directives/common-elements/answer-content-modal.component.html @oppia/learner-analytics-reviewers /core/templates/components/statistics-directives/ @oppia/learner-analytics-reviewers /core/templates/domain/statistics/ @oppia/learner-analytics-reviewers /core/templates/domain/improvements/ @oppia/learner-analytics-reviewers @@ -376,289 +383,294 @@ # Library page. -/core/controllers/library*.py @aks681 -/core/domain/recommendations*.py @aks681 -/core/domain/search_services*.py @aks681 -/core/templates/pages/library-page/ @kevintab95 -/core/templates/services/construct-translation-ids.service*.ts @kevintab95 -/core/templates/services/search-backend-api.service*.ts @kevintab95 -/core/templates/services/search.service*.ts @kevintab95 +/core/controllers/library*.py @oppia/lace-backend-reviewers +/core/domain/recommendations*.py @oppia/lace-backend-reviewers +/core/domain/search_services*.py @oppia/lace-backend-reviewers +/core/templates/pages/library-page/ @oppia/lace-frontend-reviewers +/core/templates/services/construct-translation-ids.service*.ts @oppia/lace-frontend-reviewers +/core/templates/services/search-backend-api.service*.ts @oppia/lace-frontend-reviewers +/core/templates/services/search.service*.ts @oppia/lace-frontend-reviewers # Navigation bar project. -/core/templates/components/button-directives/create-activity-button.component.ts @nithusha21 -/core/templates/components/button-directives/create-activity-button.component.html @nithusha21 -/core/templates/components/common-layout-directives/navigation-bars/ @nithusha21 -/core/templates/services/bottom-navbar-status.service*.ts @nithusha21 -/core/templates/services/navigation.service*.ts @nithusha21 -/core/templates/services/sidebar-status.service*.ts @nithusha21 +/core/templates/components/button-directives/create-activity-button.component.ts @oppia/lace-frontend-reviewers +/core/templates/components/button-directives/create-activity-button.component.html @oppia/lace-frontend-reviewers +/core/templates/components/common-layout-directives/navigation-bars/ @oppia/lace-frontend-reviewers +/core/templates/services/bottom-navbar-status.service*.ts @oppia/lace-frontend-reviewers +/core/templates/services/navigation.service*.ts @oppia/lace-frontend-reviewers +/core/templates/services/sidebar-status.service*.ts @oppia/lace-frontend-reviewers # New structures team. # Question project. -/core/controllers/practice_sessions*.py @aks681 -/core/controllers/question*.py @aks681 -/core/controllers/review_tests*.py @aks681 -/core/domain/classroom_domain.py @aks681 -/core/domain/classroom_services*.py @aks681 -/core/domain/question*.py @aks681 -/core/domain/rights_domain*.py @aks681 -/core/templates/components/concept-card/ @EricZLou -/core/templates/components/score-ring/ @EricZLou -/core/templates/components/skill-mastery/ @EricZLou -/core/templates/components/skills-mastery-list/ @EricZLou -/core/templates/domain/question/ @EricZLou -/core/templates/domain/review_test/ @kevintab95 -/core/templates/pages/practice-session-page/ @kevintab95 -/core/templates/pages/review-test-page/ @kevintab95 -/core/templates/services/questions-list.service*.ts @kevintab95 -/core/templates/components/question-directives/ @kevintab95 +/core/controllers/practice_sessions*.py @oppia/lace-backend-reviewers +/core/controllers/question*.py @oppia/lace-backend-reviewers +/core/controllers/review_tests*.py @oppia/lace-backend-reviewers +/core/domain/classroom*.py @oppia/lace-backend-reviewers +/core/controllers/diagnostic_test_player*.py @oppia/lace-backend-reviewers +/core/domain/classroom_services*.py @oppia/lace-backend-reviewers +/core/domain/question*.py @oppia/lace-backend-reviewers +/core/domain/rights_domain*.py @oppia/lace-backend-reviewers +/core/templates/components/concept-card/ @oppia/lace-frontend-reviewers +/core/templates/components/score-ring/ @oppia/lace-frontend-reviewers +/core/templates/components/skill-mastery/ @oppia/lace-frontend-reviewers +/core/templates/components/skills-mastery-list/ @oppia/lace-frontend-reviewers +/core/templates/domain/question/ @oppia/lace-frontend-reviewers +/core/templates/domain/review_test/ @oppia/lace-frontend-reviewers +/core/templates/pages/practice-session-page/ @oppia/lace-frontend-reviewers +/core/templates/pages/review-test-page/ @oppia/lace-frontend-reviewers +/core/templates/services/questions-list.service*.ts @oppia/lace-frontend-reviewers +/core/templates/components/question-directives/ @oppia/lace-frontend-reviewers # Readme -/core/README.md @srijanreddy98 -/core/templates/css/README.md @srijanreddy98 -/extensions/README.md @srijanreddy98 -/scripts/README.md @srijanreddy98 +/core/README.md @oppia/data-and-stability-reviewers +/core/templates/css/README.md @oppia/frontend-infrastructure-reviewers +/extensions/README.md @oppia/data-and-stability-reviewers +/scripts/README.md @oppia/data-and-stability-reviewers # Skill project. -/core/controllers/concept_card_viewer*.py @aks681 -/core/controllers/skill*.py @aks681 -/core/domain/skill*.py @aks681 -/core/templates/components/entity-creation-services/skill-creation.service*.ts @kevintab95 -/core/templates/components/question-difficulty-selector/ @aks681 -/core/templates/components/review-material-editor/ @kevintab95 -/core/templates/components/rubrics-editor/ @kevintab95 -/core/templates/components/skill-selector/ @kevintab95 -/core/templates/domain/skill/ @kevintab95 -/core/templates/pages/skill-editor-page/ @kevintab95 +/core/controllers/concept_card_viewer*.py @oppia/lace-backend-reviewers +/core/controllers/skill*.py @oppia/lace-backend-reviewers +/core/domain/skill*.py @oppia/lace-backend-reviewers +/core/templates/components/entity-creation-services/skill-creation.service*.ts @oppia/lace-frontend-reviewers +/core/templates/components/question-difficulty-selector/ @oppia/lace-frontend-reviewers +/core/templates/components/review-material-editor/ @oppia/lace-frontend-reviewers +/core/templates/components/rubrics-editor/ @oppia/lace-frontend-reviewers +/core/templates/components/skill-selector/ @oppia/lace-frontend-reviewers +/core/templates/domain/skill/ @oppia/lace-frontend-reviewers +/core/templates/pages/skill-editor-page/ @oppia/lace-frontend-reviewers # Story project. -/core/controllers/story*.py @aks681 -/core/domain/story*.py @aks681 -/core/templates/components/entity-creation-services/story-creation.service*.ts @EricZLou -/core/templates/domain/story/ @kevintab95 -/core/templates/domain/story_viewer/ @kevintab95 -/core/templates/pages/story-editor-page/ @EricZLou -/core/templates/pages/story-viewer-page/ @kevintab95 +/core/controllers/story*.py @oppia/lace-backend-reviewers +/core/domain/story*.py @oppia/lace-backend-reviewers +/core/templates/components/entity-creation-services/story-creation.service*.ts @oppia/lace-frontend-reviewers +/core/templates/domain/story/ @oppia/lace-frontend-reviewers +/core/templates/domain/story_viewer/ @oppia/lace-frontend-reviewers +/core/templates/pages/story-editor-page/ @oppia/lace-frontend-reviewers +/core/templates/pages/story-viewer-page/ @oppia/lace-frontend-reviewers # Topic project. # Instead of * we have used _* to avoid topics_and_skills_dashboard related files. -/core/controllers/classroom*.py @aks681 -/core/controllers/topic_*.py @aks681 -/core/domain/subtopic_page_domain*.py @aks681 -/core/domain/subtopic_page_services*.py @aks681 -/core/domain/topic*.py @aks681 -/core/templates/components/entity-creation-services/topic-creation.service*.ts @EricZLou -/core/templates/domain/classroom/ @aks681 @kevintab95 -/core/templates/domain/subtopic_viewer/ @aks681 @kevintab95 -/core/templates/domain/topic/ @aks681 @kevintab95 -/core/templates/domain/topic_viewer @aks681 @kevintab95 -/core/templates/pages/classroom-page/ @aks681 @kevintab95 -/core/templates/pages/subtopic-viewer-page/ @aks681 @kevintab95 -/core/templates/pages/topic-editor-page/ @aks681 @kevintab95 -/core/templates/pages/topic-viewer-page/ @aks681 @kevintab95 +/core/controllers/classroom*.py @oppia/lace-backend-reviewers +/core/controllers/topic_*.py @oppia/lace-backend-reviewers +/core/domain/subtopic_page_domain*.py @oppia/lace-backend-reviewers +/core/domain/subtopic_page_services*.py @oppia/lace-backend-reviewers +/core/domain/topic*.py @oppia/lace-backend-reviewers +/core/templates/components/entity-creation-services/topic-creation.service*.ts @oppia/lace-frontend-reviewers +/core/templates/domain/classroom/ @oppia/lace-frontend-reviewers +/core/templates/domain/subtopic_viewer/ @oppia/lace-frontend-reviewers +/core/templates/domain/topic/ @oppia/lace-frontend-reviewers +/core/templates/domain/topic_viewer @oppia/lace-frontend-reviewers +/core/templates/pages/classroom-page/ @oppia/lace-frontend-reviewers +/core/templates/pages/diagnostic-test-player-page @oppia/lace-frontend-reviewers +/core/templates/pages/subtopic-viewer-page/ @oppia/lace-frontend-reviewers +/core/templates/pages/topic-editor-page/ @oppia/lace-frontend-reviewers +/core/templates/pages/topic-viewer-page/ @oppia/lace-frontend-reviewers # Topics and skills dashboard project. -/core/controllers/subtopic_viewer*.py @aks681 -/core/controllers/topics_and_skills_dashboard*.py @aks681 -/core/templates/domain/topics_and_skills_dashboard/ @aks681 @kevintab95 -/core/templates/pages/topics-and-skills-dashboard-page/ @aks681 @kevintab95 - +/core/controllers/subtopic_viewer*.py @oppia/lace-backend-reviewers +/core/controllers/topics_and_skills_dashboard*.py @oppia/lace-backend-reviewers +/core/templates/domain/topics_and_skills_dashboard/ @oppia/lace-frontend-reviewers +/core/templates/pages/topics-and-skills-dashboard-page/ @oppia/lace-frontend-reviewers + +# Learner group project. +/core/controllers/learner_group*.py @oppia/lace-backend-reviewers +/core/domain/learner_group*.py @oppia/lace-backend-reviewers +/core/templates/domain/learner_group/ @oppia/lace-frontend-reviewers +/core/templates/pages/facilitator-dashboard-page/ @oppia/lace-frontend-reviewers +/core/templates/pages/learner-group-pages/ @oppia/lace-frontend-reviewers # Beam jobs -/setup.py @vojtechjelinek @brianrodri -/MANIFEST.in @vojtechjelinek @brianrodri -/core/jobs/ @vojtechjelinek -/core/jobs/transforms @vojtechjelinek -/core/jobs/types @vojtechjelinek -/core/templates/domain/jobs/ @vojtechjelinek -/core/controllers/beam_jobs*.py @brianrodri +/setup*.py @oppia/data-and-stability-reviewers +/MANIFEST.in @oppia/data-and-stability-reviewers +/core/jobs/ @oppia/data-and-stability-reviewers +/core/jobs/transforms @oppia/data-and-stability-reviewers +/core/jobs/types @oppia/data-and-stability-reviewers +/core/templates/domain/jobs/ @oppia/data-and-stability-reviewers +/core/controllers/beam_jobs*.py @oppia/data-and-stability-reviewers +/core/domain/beam_job*.py @oppia/data-and-stability-reviewers # Infrastructure. -/core/controllers/cron*.py @nithusha21 -/core/domain/cron_services*.py @nithusha21 -/main*.py @DubeySandeep @nithusha21 -/core/feconf.py @DubeySandeep @nithusha21 @seanlip -/core/constants*.py @nithusha21 -/assets/constants.ts @nithusha21 -/core/controllers/tasks*.py @aks681 -/core/domain/beam_job*.py @vojtechjelinek -/core/domain/email*.py @aks681 -/core/domain/image_service*.py @DubeySandeep -/core/platform/ @vojtechjelinek -/core/templates/App*.ts @srijanreddy98 -/core/templates/app.constants.ts @srijanreddy98 -/core/templates/app.constants.ajs.ts @srijanreddy98 -/core/templates/combined-tests.spec.ts @srijanreddy98 -/core/templates/pages/interaction-specs.constants.ajs.ts @nithusha21 -/core/templates/pages/interaction-specs.constants.ts @nithusha21 -/core/templates/pages/login-page/ @vojtechjelinek -/core/templates/pages/logout-page/ @vojtechjelinek -/core/templates/app-events/ @srijanreddy98 -/core/templates/services/app.service*.ts @srijanreddy98 -/core/templates/services/contextual/document-attribute-customization.service*.ts @srijanreddy98 -/core/templates/services/contextual/meta-tag-customization.service*.ts @srijanreddy98 -/core/templates/services/interaction-rules-registry.service*.ts @DubeySandeep -/core/templates/services/interaction-specs.service*.ts @DubeySandeep -/core/templates/services/translation-file-hash-loader-backend-api.service.ts @nithusha21 -/redis.conf @seanlip @vojtechjelinek -/.firebase.json @seanlip @vojtechjelinek +/core/controllers/cron*.py @oppia/data-and-stability-reviewers +/core/domain/cron_services*.py @oppia/data-and-stability-reviewers +/main*.py @oppia/data-and-stability-reviewers +/core/feconf*.py @oppia/data-and-stability-reviewers +/core/constants*.py @oppia/data-and-stability-reviewers +/assets/constants.ts @oppia/data-and-stability-reviewers +/core/controllers/tasks*.py @oppia/lace-backend-reviewers +/core/domain/email*.py @oppia/lace-backend-reviewers +/core/domain/image_service*.py @oppia/lace-backend-reviewers +/core/platform/ @oppia/data-and-stability-reviewers +/core/templates/App*.ts @oppia/frontend-infrastructure-reviewers +/core/templates/app.constants.ts @oppia/frontend-infrastructure-reviewers +/core/templates/app.constants.ajs.ts @oppia/frontend-infrastructure-reviewers +/core/templates/combined-tests.spec.ts @oppia/frontend-infrastructure-reviewers +/core/templates/pages/interaction-specs.constants.ajs.ts @oppia/frontend-infrastructure-reviewers +/core/templates/pages/interaction-specs.constants.ts @oppia/frontend-infrastructure-reviewers +/core/templates/pages/login-page/ @oppia/frontend-infrastructure-reviewers +/core/templates/pages/logout-page/ @oppia/frontend-infrastructure-reviewers +/core/templates/app-events/ @oppia/frontend-infrastructure-reviewers +/core/templates/services/app.service*.ts @oppia/frontend-infrastructure-reviewers +/core/templates/services/contextual/document-attribute-customization.service*.ts @oppia/frontend-infrastructure-reviewers +/core/templates/services/contextual/meta-tag-customization.service*.ts @oppia/frontend-infrastructure-reviewers +/core/templates/services/interaction-rules-registry.service*.ts @oppia/lace-frontend-reviewers +/core/templates/services/interaction-specs.service*.ts @oppia/lace-frontend-reviewers +/core/templates/services/translation-file-hash-loader-backend-api.service.ts @oppia/angular-migration-reviewers +/redis.conf @oppia/data-and-stability-reviewers +/.firebase.json @oppia/data-and-stability-reviewers # Miscellaneous. -/__init__.py @nithusha21 -/core/__init__.py @nithusha21 -/core/controllers/__init__.py @nithusha21 -/core/domain/__init__.py @nithusha21 -/core/domain/config*.py @DubeySandeep -/core/domain/change_domain.py @DubeySandeep -/core/templates/tests/ @nithusha21 -/core/templates/domain/utilities/ @DubeySandeep -/core/templates/Polyfills.ts @srijanreddy98 -/extensions/extensions.module.ts @vojtechjelinek -/core/python_utils*.py @DubeySandeep -/core/schema_utils*.py @DubeySandeep -/core/utils*.py @aks681 +/__init__.py @oppia/data-and-stability-reviewers +/core/__init__.py @oppia/data-and-stability-reviewers +/core/controllers/__init__.py @oppia/data-and-stability-reviewers +/core/domain/__init__.py @oppia/data-and-stability-reviewers +/core/domain/config*.py @oppia/lace-backend-reviewers +/core/domain/change_domain*.py @oppia/lace-backend-reviewers +/core/templates/tests/ @oppia/angular-migration-reviewers +/core/templates/domain/utilities/ @oppia/frontend-infrastructure-reviewers +/core/templates/Polyfills.ts @oppia/frontend-infrastructure-reviewers +/extensions/extensions.module.ts @oppia/frontend-infrastructure-reviewers +/core/schema_utils*.py @oppia/data-and-stability-reviewers +/core/utils*.py @oppia/lace-backend-reviewers +/.rtlcssrc @oppia/lace-frontend-reviewers # Python typing -/mypy.ini @hardikkat24 @vojtechjelinek -/mypy_imports.py @hardikkat24 @vojtechjelinek -/mypy_requirements.txt @hardikkat24 @vojtechjelinek +/mypy.ini @oppia/mypy-reviewers +/mypy_imports*.py @oppia/mypy-reviewers +/mypy_requirements.txt @oppia/mypy-reviewers /stubs/ @oppia/mypy-reviewers /scripts/run_mypy_checks*.py @oppia/mypy-reviewers # Restricted pages. -/core/controllers/admin*.py @DubeySandeep @nithusha21 -/core/controllers/blog_admin*.py @DubeySandeep -/core/controllers/moderator*.py @DubeySandeep -/core/controllers/recent_commits*.py @DubeySandeep -/core/domain/moderator_services*.py @DubeySandeep -/core/templates/domain/admin/ @DubeySandeep @nithusha21 -/core/templates/domain/blog-admin/ @DubeySandeep -/core/templates/pages/admin-page/ @DubeySandeep @nithusha21 -/core/templates/pages/moderator-page/ @DubeySandeep @nithusha21 -/core/templates/pages/blog-admin-page/ @DubeySandeep @nithusha21 +/core/controllers/admin*.py @oppia/data-and-stability-reviewers +/core/controllers/blog_admin*.py @oppia/lace-backend-reviewers +/core/controllers/moderator*.py @oppia/data-and-stability-reviewers +/core/controllers/recent_commits*.py @oppia/data-and-stability-reviewers +/core/domain/moderator_services*.py @oppia/data-and-stability-reviewers +/core/templates/domain/admin/ @oppia/lace-frontend-reviewers +/core/templates/domain/blog-admin/ @oppia/lace-frontend-reviewers +/core/templates/pages/admin-page/ @oppia/lace-frontend-reviewers +/core/templates/pages/moderator-page/ @oppia/lace-frontend-reviewers +/core/templates/pages/blog-admin-page/ @oppia/lace-frontend-reviewers +/core/templates/pages/classroom-admin-page/ @oppia/lace-frontend-reviewers # Release team. -/.gcloudignore @nithusha21 @vojtechjelinek -/core/controllers/release_coordinator*.py @nithusha21 @vojtechjelinek -/core/templates/pages/release-coordinator-page/ @nithusha21 @vojtechjelinek -/scripts/release_scripts/ @nithusha21 @vojtechjelinek -/assets/release_constants.json @nithusha21 @vojtechjelinek +/.gcloudignore @oppia/release-workflow-reviewers +/core/controllers/release_coordinator*.py @oppia/release-workflow-reviewers +/core/templates/pages/release-coordinator-page/ @oppia/release-workflow-reviewers +/scripts/release_scripts/ @oppia/release-workflow-reviewers +/assets/release_constants.json @oppia/release-workflow-reviewers # Rich text editor team. -/core/templates/components/ck-editor-helpers/ck-editor-4-rte.component.html @aks681 -/core/templates/components/ck-editor-helpers/ck-editor-4-rte.component.ts @aks681 -/core/templates/components/ck-editor-helpers/ckeditor4.module.ts @aks681 -/core/templates/directives/mathjax-bind.directive.ts @aks681 -/core/templates/directives/mathjax.directive.ts @aks681 -/core/templates/mathjaxConfig.ts @aks681 -/core/templates/components/ck-editor-helpers/ck-editor-4-widgets.initializer.ts @aks681 -/core/templates/components/ck-editor-helpers/ck-editor-copy-content.service*.ts @DubeySandeep @aks681 -/core/templates/components/ck-editor-helpers/ck-editor-copy-toolbar/ck-editor-copy-toolbar.component.html @DubeySandeep @aks681 -/core/templates/components/ck-editor-helpers/ck-editor-copy-toolbar/ck-editor-copy-toolbar.component*.ts @DubeySandeep @aks681 -/core/templates/services/autoplayed-videos.service*.ts @aks681 -/core/templates/services/external-save.service*.ts @srijanreddy98 -/core/templates/services/external-rte-save.service*.ts @srijanreddy98 -/core/templates/services/image-local-storage*.ts @DubeySandeep -/core/templates/services/rte-helper.service*.ts @aks681 -/core/templates/services/rte-helper-modal.controller*.ts @aks681 -/core/domain/image_validation_services*.py @DubeySandeep -/core/domain/rte_component_registry*.py @vojtechjelinek -/extensions/ckeditor_plugins/ @aks681 -/extensions/rich_text_components/ @aks681 -/assets/rich_text_components_definitions.ts @aks681 +/core/templates/components/ck-editor-helpers/ck-editor-4-rte.component.html @oppia/lace-frontend-reviewers +/core/templates/components/ck-editor-helpers/ck-editor-4-rte.component.ts @oppia/lace-frontend-reviewers +/core/templates/components/ck-editor-helpers/ckeditor4.module.ts @oppia/lace-frontend-reviewers +/core/templates/directives/mathjax-bind.directive.ts @oppia/lace-frontend-reviewers +/core/templates/directives/mathjax.directive.ts @oppia/lace-frontend-reviewers +/core/templates/mathjaxConfig.ts @oppia/lace-frontend-reviewers +/core/templates/components/ck-editor-helpers/ck-editor-4-widgets.initializer.ts @oppia/lace-frontend-reviewers +/core/templates/components/ck-editor-helpers/ck-editor-copy-content.service*.ts @oppia/lace-frontend-reviewers +/core/templates/components/ck-editor-helpers/ck-editor-copy-toolbar/ck-editor-copy-toolbar.component.html @oppia/lace-frontend-reviewers +/core/templates/components/ck-editor-helpers/ck-editor-copy-toolbar/ck-editor-copy-toolbar.component*.ts @oppia/lace-frontend-reviewers +/core/templates/components/ck-editor-helpers/ck-editor-copy-toolbar/ck-editor-copy-toolbar.module.ts @oppia/lace-frontend-reviewers +/core/templates/services/autoplayed-videos.service*.ts @oppia/lace-frontend-reviewers +/core/templates/services/external-save.service*.ts @oppia/angular-migration-reviewers +/core/templates/services/external-rte-save.service*.ts @oppia/angular-migration-reviewers +/core/templates/services/oppia-rte-parser.service*.ts @oppia/lace-frontend-reviewers +/core/templates/services/image-local-storage*.ts @oppia/lace-frontend-reviewers +/core/templates/services/rte-helper.service*.ts @oppia/lace-frontend-reviewers +/core/templates/services/rte-helper-modal.controller*.ts @oppia/lace-frontend-reviewers +/core/domain/image_validation_services*.py @oppia/lace-backend-reviewers +/core/domain/rte_component_registry*.py @oppia/lace-frontend-reviewers +/extensions/ckeditor_plugins/ @oppia/lace-backend-reviewers +/extensions/rich_text_components/rte-output-display.component* @oppia/lace-frontend-reviewers +/extensions/rich_text_components/ @oppia/lace-backend-reviewers +/assets/rich_text_components_definitions.ts @oppia/lace-frontend-reviewers # Suggestion and feedback team. # Suggestion project. -/core/controllers/suggestion*.py @nithusha21 -/core/domain/suggestion*.py @nithusha21 -/core/templates/domain/suggestion/ @nithusha21 -/core/templates/services/suggestion-modal.service*.ts @nithusha21 -/core/templates/services/suggestions.service*.ts @nithusha21 +/core/controllers/suggestion*.py @oppia/contributor-experience-team +/core/domain/suggestion*.py @oppia/contributor-experience-team +/core/templates/domain/suggestion/ @oppia/contributor-experience-team +/core/templates/services/suggestion-modal.service*.ts @oppia/contributor-experience-team +/core/templates/services/suggestions.service*.ts @oppia/contributor-experience-team # Feedback project. -/core/controllers/feedback*.py @nithusha21 -/core/domain/feedback*.py @nithusha21 -/core/templates/components/ratings/rating-display/rating-display.component.html @nithusha21 -/core/templates/components/ratings/ @nithusha21 -/core/templates/domain/feedback_message/ @nithusha21 -/core/templates/domain/feedback_thread/ @nithusha21 -/core/templates/pages/exploration-editor-page/feedback-tab/ @nithusha21 +/core/controllers/feedback*.py @oppia/contributor-experience-team +/core/domain/feedback*.py @oppia/contributor-experience-team +/core/templates/components/ratings/rating-display/rating-display.component.html @oppia/lace-frontend-reviewers +/core/templates/components/ratings/ @oppia/lace-frontend-reviewers +/core/templates/domain/feedback_message/ @oppia/contributor-experience-team +/core/templates/domain/feedback_thread/ @oppia/contributor-experience-team +/core/templates/pages/exploration-editor-page/feedback-tab/ @oppia/lace-frontend-reviewers # Simple pages. -/core/controllers/pages*.py @vojtechjelinek -/core/controllers/custom_landing_pages*.py @vojtechjelinek -/core/templates/pages/contact-page/ @vojtechjelinek -/core/templates/pages/delete-account-page/ @vojtechjelinek -/core/templates/pages/donate-page/ @vojtechjelinek -/core/templates/pages/error-pages/ @vojtechjelinek -/core/templates/pages/get-started-page/ @vojtechjelinek -/core/templates/pages/landing-pages/ @vojtechjelinek -/core/templates/pages/maintenance-page/ @vojtechjelinek -/core/templates/pages/partnerships-page/ @vojtechjelinek -/core/templates/pages/pending-account-deletion-page/ @vojtechjelinek -/core/templates/pages/preferences-page/ @vojtechjelinek -/core/templates/pages/signup-page/ @vojtechjelinek -/core/templates/pages/splash-page/ @vojtechjelinek -/core/templates/pages/teach-page/ @vojtechjelinek -/core/templates/pages/thanks-page/ @vojtechjelinek -/core/templates/pages/participation-playbook/ @vojtechjelinek -/core/templates/pages/about-foundation-page/ @vojtechjelinek -/core/templates/pages/volunteer-page/ @vojtechjelinek +/core/controllers/pages*.py @oppia/data-and-stability-reviewers +/core/controllers/custom_landing_pages*.py @oppia/data-and-stability-reviewers +/core/templates/pages/contact-page/ @oppia/angular-migration-reviewers +/core/templates/pages/delete-account-page/ @oppia/angular-migration-reviewers +/core/templates/pages/donate-page/ @oppia/angular-migration-reviewers +/core/templates/pages/error-pages/ @oppia/angular-migration-reviewers +/core/templates/pages/get-started-page/ @oppia/angular-migration-reviewers +/core/templates/pages/landing-pages/ @oppia/angular-migration-reviewers +/core/templates/pages/maintenance-page/ @oppia/angular-migration-reviewers +/core/templates/pages/partnerships-page/ @oppia/angular-migration-reviewers +/core/templates/pages/pending-account-deletion-page/ @oppia/angular-migration-reviewers +/core/templates/pages/preferences-page/ @oppia/angular-migration-reviewers +/core/templates/pages/signup-page/ @oppia/angular-migration-reviewers +/core/templates/pages/splash-page/ @oppia/angular-migration-reviewers +/core/templates/pages/teach-page/ @oppia/angular-migration-reviewers +/core/templates/pages/thanks-page/ @oppia/angular-migration-reviewers +/core/templates/pages/participation-playbook/ @oppia/angular-migration-reviewers +/core/templates/pages/about-foundation-page/ @oppia/angular-migration-reviewers +/core/templates/pages/volunteer-page/ @oppia/angular-migration-reviewers # Speed Improvement team. -/core/templates/google-analytics.initializer.ts @vojtechjelinek -/core/templates/base-components/ @nithusha21 -/core/templates/pages/Base.ts @nithusha21 -/core/templates/pages/footer_js_libs.html @nithusha21 -/core/templates/pages/header_css_libs.html @nithusha21 -/core/templates/pages/header_js_libs.html @nithusha21 -/core/templates/services/csrf-token.service*.ts @nithusha21 -/core/templates/third-party-imports/ @nithusha21 @vojtechjelinek -/.lighthouserc*.js @jimbyo @vojtechjelinek -/puppeteer-login-script.js @jimbyo @vojtechjelinek -/scripts/run_lighthouse_tests.py @vojtechjelinek -/webpack.*.ts @nithusha21 @vojtechjelinek - - -# User Data Takeout. -# TODO(#14285): Replace @seanlip with @BenHenning for both. -/core/domain/takeout_*.py @seanlip @vojtechjelinek -/core/domain/wipeout_*.py @seanlip @vojtechjelinek +/core/templates/google-analytics.initializer.ts @oppia/frontend-infrastructure-reviewers +/core/templates/base-components/ @oppia/frontend-infrastructure-reviewers +/core/templates/pages/Base.ts @oppia/frontend-infrastructure-reviewers +/core/templates/pages/footer_js_libs.html @oppia/frontend-infrastructure-reviewers +/core/templates/pages/header_css_libs.html @oppia/frontend-infrastructure-reviewers +/core/templates/pages/header_js_libs.html @oppia/frontend-infrastructure-reviewers +/core/templates/services/csrf-token.service*.ts @oppia/frontend-infrastructure-reviewers +/core/templates/third-party-imports/ @oppia/frontend-infrastructure-reviewers +/.lighthouserc*.js @oppia/automated-qa-reviewers +/puppeteer-login-script.js @oppia/automated-qa-reviewers +/scripts/run_lighthouse_tests.py @oppia/automated-qa-reviewers +/webpack.*.ts @oppia/data-and-stability-reviewers # User’s profile page. -/core/controllers/profile*.py @vojtechjelinek -/core/templates/domain/user/ @vojtechjelinek -/core/templates/pages/profile-page/ @vojtechjelinek -/core/templates/services/user.service*.ts @vojtechjelinek -/core/templates/services/user-backend-api.service*.ts @vojtechjelinek +/core/controllers/profile*.py @oppia/data-and-stability-reviewers +/core/templates/domain/user/ @oppia/frontend-infrastructure-reviewers +/core/templates/pages/profile-page/ @oppia/frontend-infrastructure-reviewers +/core/templates/services/user.service*.ts @oppia/frontend-infrastructure-reviewers +/core/templates/services/user-backend-api.service*.ts @oppia/frontend-infrastructure-reviewers # Service constants -/core/templates/services/services.constants.ajs.ts @vojtechjelinek -/core/templates/services/services.constants.ts @vojtechjelinek +/core/templates/services/services.constants.ajs.ts @oppia/frontend-infrastructure-reviewers +/core/templates/services/services.constants.ts @oppia/frontend-infrastructure-reviewers # Dynamic Feature Gating project -# TODO(#14285): Replace @seanlip with @BenHenning for all of the patterns in this section. -/core/controllers/platform_feature*.py @seanlip -/core/domain/platform_feature_services*.py @seanlip -/core/domain/platform_parameter*.py @seanlip -/core/platform_feature*.py @seanlip -/core/templates/domain/platform_feature/ @seanlip -/core/templates/pages/admin-page/features-tab/ @seanlip -/core/templates/services/platform-feature*.ts @seanlip +/core/controllers/platform_feature*.py @oppia/web-android-compatibility-reviewers +/core/domain/platform_feature_services*.py @oppia/web-android-compatibility-reviewers +/core/domain/platform_parameter*.py @oppia/web-android-compatibility-reviewers +/core/platform_feature*.py @oppia/web-android-compatibility-reviewers +/core/templates/domain/platform_feature/ @oppia/web-android-compatibility-reviewers +/core/templates/pages/admin-page/features-tab/ @oppia/web-android-compatibility-reviewers +/core/templates/services/platform-feature*.ts @oppia/web-android-compatibility-reviewers # Frontend unit tests @@ -668,40 +680,42 @@ /extensions/**/*Spec.ts @oppia/frontend-test-reviewers # Draft version upgrade. -/core/domain/draft_upgrade_services*.py @DubeySandeep +/core/domain/draft_upgrade_services*.py @oppia/lace-backend-reviewers +# Mailing List +/core/templates/domain/mailing-list/mailing-list-backend-api.service*.ts @oppia/lace-frontend-reviewers # Data stability. -/core/controllers/domain_objects_validator*.py @vojtechjelinek -/core/controllers/payload_validator*.py @vojtechjelinek -/core/handler_schema_constants.py @vojtechjelinek +/core/controllers/domain_objects_validator*.py @oppia/data-and-stability-reviewers +/core/controllers/payload_validator*.py @oppia/data-and-stability-reviewers +/core/handler_schema_constants*.py @oppia/data-and-stability-reviewers # QA team. -/core/tests/ @nithusha21 -/assets/ @nithusha21 -/data/ @nithusha21 -/core/templates/karma.module.ts @vojtechjelinek -/core/tests/protractor_utils/ @oppia/automated-qa-reviewers -/core/tests/protractor_desktop/ @oppia/automated-qa-reviewers -/core/tests/protractor/ @oppia/automated-qa-reviewers -/core/tests/protractor.conf.js @oppia/automated-qa-reviewers -/extensions/interactions/*/protractor.js @oppia/automated-qa-reviewers -/extensions/interactions/protractor.js @oppia/automated-qa-reviewers -/extensions/rich_text_components/*/protractor.js @oppia/automated-qa-reviewers -/extensions/rich_text_components/protractor.js @oppia/automated-qa-reviewers -/extensions/objects/protractor.js @oppia/automated-qa-reviewers +/core/tests/ @oppia/automated-qa-reviewers +/assets/ @oppia/data-and-stability-reviewers +/data/ @oppia/data-and-stability-reviewers +/core/templates/karma.module.ts @oppia/lace-frontend-reviewers +/core/tests/webdriverio_utils/ @oppia/automated-qa-reviewers +/core/tests/webdriverio_desktop/ @oppia/automated-qa-reviewers +/core/tests/webdriverio/ @oppia/automated-qa-reviewers +/core/tests/wdio.conf.js @oppia/automated-qa-reviewers +/extensions/interactions/*/webdriverio.js @oppia/automated-qa-reviewers +/extensions/interactions/webdriverio.js @oppia/automated-qa-reviewers +/extensions/rich_text_components/*/webdriverio.js @oppia/automated-qa-reviewers +/extensions/rich_text_components/webdriverio.js @oppia/automated-qa-reviewers +/extensions/objects/webdriverio.js @oppia/automated-qa-reviewers /scripts/backend_test_shards.json @oppia/automated-qa-reviewers /scripts/backend_tests_incomplete_coverage.txt @oppia/automated-qa-reviewers /.github/actions @oppia/automated-qa-reviewers # Python 3 Migration project. -/core/domain/auth*.py @vojtechjelinek -/core/domain/caching*.py @vojtechjelinek -/core/domain/taskqueue*.py @vojtechjelinek -/core/templates/services/auth.service*.ts @vojtechjelinek -/core/templates/services/auth-backend-api.service*.ts @vojtechjelinek +/core/domain/auth*.py @oppia/data-and-stability-reviewers +/core/domain/caching*.py @oppia/data-and-stability-reviewers +/core/domain/taskqueue*.py @oppia/data-and-stability-reviewers +/core/templates/services/auth.service*.ts @oppia/data-and-stability-reviewers +/core/templates/services/auth-backend-api.service*.ts @oppia/data-and-stability-reviewers # Critical files. @@ -714,28 +728,39 @@ # # On modifying this list make sure to keep the CODEOWNER_IMPORTANT_PATHS list # in scripts/linters/codeowner_linter.py in sync with the modifications. -/core/templates/services/svg-sanitizer.service.ts @seanlip -/scripts/linters/warranted_angular_security_bypasses.py @seanlip -/core/controllers/access_validators*.py @seanlip -/core/controllers/acl_decorators*.py @seanlip -/core/controllers/base*.py @seanlip -/core/domain/html*.py @seanlip -/core/domain/rights_manager*.py @seanlip -/core/domain/role_services*.py @seanlip -/core/storage/ @seanlip -/core/domain/user*.py @seanlip -/requirements.txt @vojtechjelinek -/requirements.in @vojtechjelinek -/dependencies.json @vojtechjelinek -/package.json @vojtechjelinek -/yarn.lock @vojtechjelinek -/scripts/install_third_party_libs.py @DubeySandeep -/.github/ @DubeySandeep -/.github/CODEOWNERS @DubeySandeep -/.github/stale.yml @vojtechjelinek -/.github/workflows/ @DubeySandeep @oppia/automated-qa-reviewers +/requirements.txt @oppia/dependency-reviewers +/requirements.in @oppia/dependency-reviewers +/requirements_dev.txt @oppia/dependency-reviewers +/requirements_dev.in @oppia/dependency-reviewers +/dependencies.json @oppia/dependency-reviewers +/package.json @oppia/dependency-reviewers +/yarn.lock @oppia/dependency-reviewers +/scripts/install_third_party_libs.py @oppia/dev-workflow-reviewers +/.github/ @oppia/dev-workflow-reviewers +/.github/CODEOWNERS @oppia/dev-workflow-reviewers +/.github/stale.yml @oppia/dev-workflow-reviewers +/.github/workflows/ @oppia/dev-workflow-reviewers @oppia/automated-qa-reviewers # Files needed by the Android team. -# TODO(#14285): Re-add @BenHenning for the following 3. -/core/controllers/android_e2e_config*.py @seanlip -/core/android_validation_constants*.py @seanlip -/extensions/interactions/rule_templates.json @seanlip +/core/controllers/android_e2e_config*.py @oppia/web-android-compatibility-reviewers +/core/android_validation_constants*.py @oppia/web-android-compatibility-reviewers +/extensions/interactions/rule_templates.json @oppia/web-android-compatibility-reviewers +# Files owned by core reviewers. +/core/templates/services/svg-sanitizer.service.ts @oppia/core-reviewers +/scripts/linters/warranted_angular_security_bypasses.py @oppia/core-reviewers +/core/controllers/access_validators*.py @oppia/core-reviewers +/core/controllers/acl_decorators*.py @oppia/core-reviewers +/core/controllers/base*.py @oppia/core-reviewers +/core/domain/html*.py @oppia/core-reviewers +/core/domain/rights_manager*.py @oppia/core-reviewers +/core/domain/role_services*.py @oppia/core-reviewers +/core/storage/ @oppia/core-reviewers +/core/domain/user*.py @oppia/core-reviewers +/AUTHORS @oppia/core-reviewers +/CONTRIBUTORS @oppia/core-reviewers +/LICENSE @oppia/core-reviewers +/NOTICE @oppia/core-reviewers +/core/templates/pages/terms-page/terms-page.component.html @oppia/core-reviewers +/core/templates/pages/privacy-page/privacy-page.component.html @oppia/core-reviewers +/core/templates/pages/license-page/license-page.component.html @oppia/core-reviewers +/core/domain/takeout_*.py @oppia/core-reviewers +/core/domain/wipeout_*.py @oppia/core-reviewers diff --git a/.github/CONTRIBUTING.md b/.github/CONTRIBUTING.md index a6bd54a4cc36..dc255245dcbb 100644 --- a/.github/CONTRIBUTING.md +++ b/.github/CONTRIBUTING.md @@ -1,6 +1,6 @@ Thanks for your interest in contributing to the Oppia project, and making it easier for students to learn online in an effective and enjoyable way! -There are lots of ways to help out, from joining our team of lesson creators to fixing a bug in the [codebase](https://github.com/oppia/oppia/). Don't worry if you're new to "open source", or if you're still a student -- many of our contributors are, too, and we'd be happy to provide mentorship and support if this is your first time contributing to an open source project. The main thing is that you care deeply about helping people around the world to learn things better, and that you're responsible and reliable. +There are lots of ways to help out and become an Oppia contributor, from joining our team of lesson creators to fixing a bug in the [codebase](https://github.com/oppia/oppia/). Don't worry if you're new to "open source", or if you're still a student -- many of our contributors are, too, and we'd be happy to provide mentorship and support if this is your first time contributing to an open source project. The main thing is that you care deeply about helping people around the world to learn things better, and that you're responsible and reliable. To make it easier to get started, we've catalogued some of the different ways to help out. Please feel free to take a look through them, and see if any interest you: @@ -10,6 +10,8 @@ To make it easier to get started, we've catalogued some of the different ways to * [Voice artists](https://github.com/oppia/oppia/wiki/Instructions-for-voice-artists) * [Designers and artists](https://github.com/oppia/oppia/wiki/Contributing-to-Oppia%27s-design) +If you are interested in working on Oppia's Android app, you should also take a look at the [oppia/oppia-android repository](https://github.com/oppia/oppia-android). + If you run into any problems, you can check out the [user documentation](http://oppia.github.io/) or post to our [developer mailing list](https://groups.google.com/forum/?fromgroups#!forum/oppia-dev). Feel free to drop into our [Gitter chat channel](https://gitter.im/oppia/oppia-chat) to say hello, too :) Finally, if, after reading the above links, you'd like to help, but aren't sure how -- don't worry! The Oppia project is very multi-faceted, and we'd be glad to help you find something to do that matches your interests and skills. Just fill out [this form](https://forms.gle/jEytndtgdsx7BrnV6) to let us know what you'd like to help with, or write to us at [volunteer@oppia.org](mailto:volunteer@oppia.org) and tell us a bit about yourself and what you'd like to do. We'll do our best to help you get started! diff --git a/.github/DISCUSSION_TEMPLATE/gsoc-2023-proposal-reviews.yml b/.github/DISCUSSION_TEMPLATE/gsoc-2023-proposal-reviews.yml new file mode 100644 index 000000000000..a282f7011b89 --- /dev/null +++ b/.github/DISCUSSION_TEMPLATE/gsoc-2023-proposal-reviews.yml @@ -0,0 +1,33 @@ +title: "GSoC’23 Proposal Review | {{Project Name}} ({{Your Name}})" +body: +- type: input + attributes: + label: Google doc link to Proposal + description: "Please paste the google doc link to the proposal here." + validations: + required: true +- type: checkboxes + id: sharing + attributes: + label: I confirm that I set the sharing options of the document to “anyone with the link can comment”. + options: + - label: "Yes" + required: true +- type: dropdown + id: review-section + attributes: + label: Which section should the reviewer take a look at? + options: + - "3.1: WHAT" + - "3.2: HOW" + validations: + required: true +- type: textarea + id: additional + attributes: + label: Additional information + description: | + Add any other information about the proposal here. + Tip: You can attach images or log files by clicking this area to highlight it and then dragging files in. + validations: + required: false diff --git a/.github/DISCUSSION_TEMPLATE/q-a-installation.yml b/.github/DISCUSSION_TEMPLATE/q-a-installation.yml new file mode 100644 index 000000000000..4f2233fcf03a --- /dev/null +++ b/.github/DISCUSSION_TEMPLATE/q-a-installation.yml @@ -0,0 +1,47 @@ +body: +- type: input + attributes: + label: Operating System + description: "What operating system (OS) are you using?" + validations: + required: true +- type: input + attributes: + label: RAM size + description: "How much RAM does your computer have?" + validations: + required: true +- type: textarea + id: steps + attributes: + label: Which step are you stuck on? + description: | + If you encountered this error while following a wiki page, provide a link to the page and specify which step failed. + Otherwise, list what steps caused the error. + These should be detailed enough for someone else to follow them. + validations: + required: true +- type: textarea + id: error + attributes: + label: Error Log + description: "Please copy and paste the error log." + render: bash + validations: + required: true +- type: textarea + id: approaches + attributes: + label: Approaches already used to resolve the issue + description: "What appoaches have you tried to resolve the above issue?" + validations: + required: false +- type: textarea + id: additional + attributes: + label: Additional information + description: | + Add any other context about the problem here. + Tip: You can attach images or log files by clicking this area to highlight it and then dragging files in. + validations: + required: false diff --git a/.github/ISSUE_TEMPLATE/bug_report.md b/.github/ISSUE_TEMPLATE/bug_report.md deleted file mode 100644 index 8106b7ee98a2..000000000000 --- a/.github/ISSUE_TEMPLATE/bug_report.md +++ /dev/null @@ -1,42 +0,0 @@ ---- -name: Bug report -about: Create a report to help us improve ---- - - -**Describe the bug** -A clear and concise description of what the bug is. - -**To Reproduce** -Steps to reproduce the behavior: - 1. Go to '...' - 2. Click on '....' - 3. Scroll down to '....' - 4. See error - -**Observed behavior** -A clear and concise description of what you have observed. - -**Expected behavior** -A clear and concise description of what you expected to happen. - -**Screenshots** -If applicable, add screenshots to help explain your problem. - -**Desktop (please complete the following information; delete this section if the issue does not arise on desktop):** - - OS: [e.g. iOS] - - Browser [e.g. chrome, safari] - - Browser-version [e.g. 22] - -**Smartphone (please complete the following information; delete this section if the issue does not arise on smartphones):** - - Device: [e.g. iPhone6] - - OS: [e.g. iOS8.1] - - Browser [e.g. stock browser, safari] - - Browser-version [e.g. 22] - -**Additional context** -Add any other context about the problem here. diff --git a/.github/ISSUE_TEMPLATE/bug_report_form.yml b/.github/ISSUE_TEMPLATE/bug_report_form.yml new file mode 100644 index 000000000000..96e606821396 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/bug_report_form.yml @@ -0,0 +1,90 @@ +name: Bug report +description: Create a report to help us improve +title: "[BUG]: " +labels: [triage needed, bug] +body: + - type: markdown + attributes: + value: | + Thanks for taking the time to report a bug in the Oppia project. + - type: markdown + attributes: + value: | + Before filing a new issue, **please do a quick search** to check that it hasn't already been filed on the issue tracker. You can do this by going to [this link](https://github.com/oppia/oppia/issues) and typing some words related to the issue in the search box next to the "New issue" button. + - type: textarea + attributes: + label: Describe the bug + description: A concise description of what issue you're experiencing. **Example:** "When I click on the 'Sign in' button, I expect to be redirected to the login page, but instead I get a 404 error." + validations: + required: true + - type: textarea + attributes: + label: Steps To Reproduce + description: Steps to reproduce the behavior. **Example:** "1. Go to the library page. 2. Click on the 'Sign in' button. 3. See error." + validations: + required: false + - type: textarea + attributes: + label: Expected Behavior + description: A clear and concise description of what you expected to happen. **Example:** "I expect to be redirected to the login page." + validations: + required: false + - type: textarea + attributes: + label: Screenshots/Videos + description: | + If applicable, add screenshots or videos to help explain your problem. + + **Tip:** You can attach images or log files by clicking this area to highlight it and then dragging files in. + validations: + required: false + - type: dropdown + attributes: + label: What device are you using? + description: Please select the device you're using. + multiple: true + options: + - Desktop + - Mobile + - type: dropdown + attributes: + label: Operating System + description: Please select the operating system you're using. **Example:** "Windows". If you're using multiple Operating systems, please select all that apply. + multiple: true + options: + - Windows + - MacOS + - Linux + - Android + - IOS + - Other + - type: dropdown + attributes: + label: What browsers are you seeing the problem on? + description: Please select the browser you're using. If you're using multiple browsers, please select all that apply. + multiple: true + options: + - Chrome + - Firefox + - Safari + - Edge + - Opera + - Internet Explorer + - Other + validations: + required: false + - type: input + attributes: + label: Browser version + description: Please enter the version of the browser you're using. **Example:** "90.0.4430.212". You can find this by clicking on the three dots in the top right corner of your browser and selecting "Help" or "About". If you're using multiple browsers, please enter the version for each browser. **Example:** "90.0.4430.212 (Chrome), 88.1.1 (Firefox)" + validations: + required: false + - type: textarea + attributes: + label: Additional context + description: | + Add any other context about the problem here. + + Tip: You can attach images or log files by clicking this area to highlight it and then dragging files in. + validations: + required: false diff --git a/.github/ISSUE_TEMPLATE/config.yml b/.github/ISSUE_TEMPLATE/config.yml new file mode 100644 index 000000000000..23870468a61f --- /dev/null +++ b/.github/ISSUE_TEMPLATE/config.yml @@ -0,0 +1,5 @@ +blank_issues_enabled: true +contact_links: + - name: Oppia Community Support + url: https://github.com/oppia/oppia/discussions + about: Please ask and answer questions here. diff --git a/.github/ISSUE_TEMPLATE/feature_request.md b/.github/ISSUE_TEMPLATE/feature_request.md deleted file mode 100644 index e0c9c7fae6a9..000000000000 --- a/.github/ISSUE_TEMPLATE/feature_request.md +++ /dev/null @@ -1,17 +0,0 @@ ---- -name: Feature request -about: Suggest an idea for this project ---- - -**Is your feature request related to a problem? Please describe.** -A clear and concise description of what the problem is. Ex. I'm always frustrated when [...] -**Describe the solution you'd like** -A clear and concise description of what you want to happen. -**Describe alternatives you've considered** -A clear and concise description of any alternative solutions or features you've considered. -**Additional context** -Add any other context or screenshots about the feature request here. diff --git a/.github/ISSUE_TEMPLATE/feature_request_form.yml b/.github/ISSUE_TEMPLATE/feature_request_form.yml new file mode 100644 index 000000000000..330cbc69252b --- /dev/null +++ b/.github/ISSUE_TEMPLATE/feature_request_form.yml @@ -0,0 +1,44 @@ +name: Feature request +description: Suggest an idea for this project +title: "[Feature Request]: " +labels: ["triage needed", "enhancement"] +body: + - type: markdown + attributes: + value: | + Thanks for taking the time to report a bug in the Oppia project. + - type: markdown + attributes: + value: | + Before filing a new issue, **please do a quick search** to check that it hasn't already been filed on the issue tracker. You can do this by going to [this link](https://github.com/oppia/oppia/issues) and typing some words related to the issue in the search box next to the "New issue" button. + - type: textarea + id: problem + attributes: + label: Is your feature request related to a problem? Please describe. + description: A clear and concise description of what the problem is. **Example:** "I'm always frustrated when [...]" + validations: + required: true + - type: textarea + id: solution + attributes: + label: Describe the solution you'd like + description: A clear and concise description of what you want to happen. **Example:** "I would like to have [...]" + validations: + required: true + - type: textarea + id: alternatives + attributes: + label: Describe alternatives you've considered + description: A clear and concise description of any alternative solutions or features you've considered. **Example:** "I have considered [...]" + validations: + required: false + - type: textarea + id: additional-context + attributes: + label: Additional context + description: | + Add any other context or screenshots about the feature request here. + + Tip: You can attach images or log files by clicking this area to highlight it and then dragging files in. + validations: + required: false diff --git a/.github/ISSUE_TEMPLATE/server_error_template.md b/.github/ISSUE_TEMPLATE/server_error_template.md index 9b9a95a4b3b0..ef89288d22fb 100644 --- a/.github/ISSUE_TEMPLATE/server_error_template.md +++ b/.github/ISSUE_TEMPLATE/server_error_template.md @@ -1,6 +1,7 @@ --- name: Server error about: Report a production bug from the server logs +labels: triage needed, server errors --- + +#### Proof of changes on desktop with slow/throttled network + + + +#### Proof of changes on mobile phone + + + +#### Proof of changes in Arabic language + + ## PR Pointers -- Make sure to follow the [instructions for making a code change](https://github.com/oppia/oppia/wiki/Contributing-code-to-Oppia#instructions-for-making-a-code-change). -- Oppiabot will notify you when you don't add a PR_CHANGELOG label. If you are unable to do so, please @-mention a code owner (who will be in the Reviewers list), or ask on [Gitter](https://gitter.im/oppia/oppia-chat). -- For what code owners will expect, see the [Code Owner's wiki page](https://github.com/oppia/oppia/wiki/Oppia%27s-code-owners-and-checks-to-be-carried-out-by-developers). +- Make sure to follow the [instructions for making a code change](https://github.com/oppia/oppia/wiki/Make-a-pull-request). +- If you need a review or an answer to a question, and don't have permissions to assign people, **leave a comment** like the following: "{{Question/comment}} @{{reviewer_username}} PTAL". Oppiabot will help assign that person for you. +- For what code owners will expect, see the [Code Owner's wiki page](https://github.com/oppia/oppia/wiki/Oppia's-code-owners-and-checks-to-be-carried-out-by-developers). - Make sure your PR follows conventions in the [style guide](https://github.com/oppia/oppia/wiki/Coding-style-guide), otherwise this will lead to review delays. - Never force push. If you do, your PR will be closed. -- Oppiabot can assign anyone for review/help if you leave a comment like the following: "{{Question/comment}} @{{reviewer_username}} PTAL" -- Some of the e2e tests are flaky, and can fail for reasons unrelated to your PR. We are working on fixing this, but in the meantime, if you need to restart the tests, please check the ["If your build fails" wiki page](https://github.com/oppia/oppia/wiki/If-your-build-fails). +- Some of the e2e tests are flaky, and can fail for reasons unrelated to your PR. We are working on fixing this, but in the meantime, if you need to restart the tests, please check the ["If your build fails" wiki page](https://github.com/oppia/oppia/wiki/If-CI-checks-fail-on-your-PR). diff --git a/.github/README.md b/.github/README.md index e9942f1f19c3..e4611f8873b0 100644 --- a/.github/README.md +++ b/.github/README.md @@ -1,4 +1,4 @@ -# [Oppia](https://www.oppia.org) [![Actions](https://github.com/oppia/oppia/workflows/End-to-End%20tests/badge.svg?branch=develop)](https://github.com/oppia/oppia/actions?query=branch%3Adevelop+workflow%3A%22End-to-End+tests%22) [![CircleCI](https://circleci.com/gh/oppia/oppia/tree/develop.svg?style=svg)](https://circleci.com/gh/oppia/oppia/tree/develop) [![Join the chat at https://gitter.im/oppia/oppia-chat](https://badges.gitter.im/Join%20Chat.svg)](https://gitter.im/oppia/oppia-chat?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge) +# [Oppia](https://www.oppia.org) [![Actions](https://github.com/oppia/oppia/workflows/End-to-End%20tests/badge.svg?branch=develop)](https://github.com/oppia/oppia/actions?query=branch%3Adevelop+workflow%3A%22End-to-End+tests%22) Oppia is an online learning tool that enables anyone to easily create and share interactive activities (called 'explorations'). These activities simulate a one-on-one conversation with a tutor, making it possible for students to learn by doing while getting feedback. @@ -9,7 +9,8 @@ Oppia is written using Python and AngularJS, and is built on top of Google App E * [Oppia.org community site](https://www.oppia.org) * [User Documentation](https://oppia.github.io/) * [Contributors' wiki](https://github.com/oppia/oppia/wiki) - * [Developer mailing list](http://groups.google.com/group/oppia-dev) + * [GitHub Discussions](https://github.com/oppia/oppia/discussions) + * [Developer announcements](http://groups.google.com/group/oppia-dev) * [File an issue](https://github.com/oppia/oppia/issues/new/choose)
@@ -45,9 +46,15 @@ The Oppia code is released under the [Apache v2 license](https://github.com/oppi
## Keeping in touch
- * [Blog](https://medium.com/oppia-org)
- * [Discussion forum](http://groups.google.com/group/oppia)
+ * [Discussion forum](https://github.com/oppia/oppia/discussions)
* [Announcements mailing list](http://groups.google.com/group/oppia-announce)
- * Social media: [YouTube](https://www.youtube.com/channel/UC5c1G7BNDCfv1rczcBp9FPw), [FB](https://www.facebook.com/oppiaorg), [Twitter](https://twitter.com/oppiaorg)
-We also have public chat rooms on Gitter: [https://gitter.im/oppia/oppia-chat](https://gitter.im/oppia/oppia-chat). Drop by and say hello!
+## Social Media
+[][twitter] [][LinkedIn] [][Facebook] [][medium] [][oppia-org-youtube] [][dev-youtube]
+
+[twitter]: https://twitter.com/oppiaorg
+[linkedIn]: https://www.linkedin.com/company/oppia-org/
+[medium]: https://medium.com/@oppia.org
+[facebook]: https://www.facebook.com/oppiaorg/
+[oppia-org-youtube]: https://www.youtube.com/channel/UC5c1G7BNDCfv1rczcBp9FPw
+[dev-youtube]: https://www.youtube.com/channel/UCsrAX-oeqm0-NIQzQrdiUkQ
diff --git a/.github/SECURITY.md b/.github/SECURITY.md
new file mode 100644
index 000000000000..54409cfa6148
--- /dev/null
+++ b/.github/SECURITY.md
@@ -0,0 +1,129 @@
+# Oppia Vulnerability Disclosure Process
+
+This vulnerability disclosure process describes how we accept and respond to security vulnerabilities from both Oppia developers and others. Our process follows 4 steps: Report, Investigate, Remediate, and Disclose.
+
+## Report
+
+Reporters should email [security@oppia.org](mailto:security@oppia.org) or open a [GitHub Security Vulnerability Report](https://docs.github.com/en/code-security/security-advisories/guidance-on-reporting-and-writing/privately-reporting-a-security-vulnerability) with:
+
+* A description of the problem.
+* Steps we can follow to reproduce the problem.
+* Affected versions.
+* If known, mitigations for the problem.
+
+We will respond within 3 days of the reporter's submission to acknowledge receipt of their report. Here is a template acknowledgement message:
+
+```
+Hi $REPORTER,
+
+Thank you for reporting this problem to us. We are currently investigating and will reach out sometime in the next 7 days once we have decided how to move forward or if we have any questions.
+
+Thanks,
+
+$OPPIA_SECURITY_TEAM_MEMBER
+```
+
+## Investigate
+
+Immediately upon receiving a report of a security problem, a member of Oppia’s security team (the tech leads for now) will assemble a vulnerability response team (VRT). This team should:
+
+* Include an Oppia tech lead.
+* Include developers (most likely 1-2) with expertise in the part of the app affected by the problem.
+* Include as few developers as possible to avoid premature publication of the problem.
+
+The tech lead will designate one VRT member as the VRT lead responsible for driving our response. The VRT lead will immediately (ideally within 24 hours) investigate the report and classify it as:
+
+* **Won’t fix**: The app is working as intended, the bug is not important enough for us to spend resources fixing, or the requested feature is not something we plan to implement.
+
+* **Bug**: The problem identified is legitimate, but it is not a security issue. It will be resolved through our normal bug-fixing process.
+
+* **Feature request**: The report identifies a new feature that should be implemented. It will be handled through our normal feature-development process.
+
+* **Low-severity vulnerability**: The report identifies a security vulnerability that does not meet the high-severity criteria. It will be resolved through our normal bug-fixing process. A "security vulnerability" is unintended behavior with security implications. This is distinct from a feature request, which refers to cases where the code behaves as intended, but the reporter disagrees with that intention.
+
+ For example, suppose we improperly sanitized user-provided data at the models layer such that user-provided code could be executed, but validation checks at the controller layer prevented an attacker from actually exploiting the vulnerability. This would be a security vulnerability because we do not intend for the models layer to allow user-provided code to execute, but it would be low-severity because the controllers layer would prevent exploitation.
+
+* **High-severity vulnerability**: The report identifies an exploitable security vulnerability that, if exploited, could result in any of the following:
+
+ * (Confidentiality) Unauthorized access to any sensitive data that shouldn't be made public. Here, "sensitive data" generally refers to both private user data, as well as information that could be used to gain access to private user data; if in doubt, consult the data owners.
+ * (Integrity) Unauthorized edits to any data.
+ * (Availability) Degraded system performance of the platform for users.
+
+Note that while the VRT contains multiple individuals, it’s ultimately expected that the VRT lead drives the effort. This should be in collaboration with VRT members, but in cases of urgent vulnerabilities the VRT lead can operate authoritatively to mitigate or remediate the issue (i.e. they do not need VRT consensus or review, but they should leverage VRT team members as a source for information and help).
+
+The VRT lead will notify the reporter of the classification and the reasoning behind the VRT’s decision within 7 days of the acknowledgement message. This notification should include links to any issues that were opened as a result of the report. For problems classified as bugs, feature requests, or low-severity vulnerabilities, issues will be opened and assigned to the relevant team.
+
+The rest of this document describes how we handle high-severity vulnerabilities.
+
+## Remediate
+
+### Create a Coordination Channel
+
+If the problem is confirmed as a high-severity vulnerability, the VRT will open a [GitHub security advisory](https://docs.github.com/en/code-security/repository-security-advisories/about-github-security-advisories-for-repositories) and, if both the VRT and reporter agree, add the reporter to the advisory so we can collaborate on it. We will coordinate work on the vulnerability via:
+
+* **The GitHub security advisory.** These advisories will let us collaborate in private, and they are appropriate in cases where disclosing the vulnerability prior to remediating it could put our users or developers at risk.
+* **(Optionally) An additional GitHub issue and pull request.** This will immediately disclose the vulnerability, and we will take this approach when immediate disclosure poses little risk to our users and developers. For example, when the vulnerability is already publicly known. Unlike security advisories, CI checks can run on these PRs.
+
+Note that we will create a GitHub security advisory even if we choose to collaborate on a fix using an open issue or PR because we’ll want to publish the advisory when disclosing the vulnerability.
+
+### Request a CVE
+
+A CVE should be requested for all security vulnerabilities. Since we create a GitHub Security Advisory, we can [get a CVE from GitHub](https://docs.github.com/en/code-security/repository-security-advisories/about-github-security-advisories-for-repositories#cve-identification-numbers). As a backup, we can [get a CVE from MITRE](https://cveform.mitre.org/).
+
+### Develop a Patch
+
+Regardless of which approach we take, the VRT will prioritize developing a patch to fix (or at least mitigate) the vulnerability. If the vulnerability is easily exploitable, mitigation will take priority over all other work. Mitigation should be completed within 7 days of the report being classified as a high-severity vulnerability. Once mitigated, additional remediation steps can be handled through our usual bug-fixing process.
+
+## Disclose
+
+We generally follow a 90-day disclosure timeframe, meaning that we ask that reporters give us 90 days to fix vulnerabilities before publicly disclosing them. 90 days should be viewed as an upper bound, and we aim to remediate vulnerabilities as quickly as possible. In all cases, the disclosure timeline will be explicitly coordinated with the reporter, and we prefer to publicly disclose the vulnerability simultaneously with the reporter. Our disclosure will include credit for the reporter if they so wish.
+
+In rare cases, it may be appropriate to delay public disclosure even after the patch has been published and deployed. However, since our source code is public, we must assume that attackers will quickly reverse-engineer the vulnerability from our patch, so we will err on the side of disclosing early.
+
+Our public disclosure should take the form of a published GitHub Security Advisory. Here is a template:
+
+```
+# Security advisory for $CVEID
+
+## Summary
+
+
+
+* **CVE**: $CVE-NUMBER
+* **Affected versions**: $VERSIONS
+* **Reporter**: $NAME $AFFILIATION
+
+## Severity
+
+
+## Proof of Concept
+
+
+## Remediation and Mitigation
+
+
+## Further Analysis
+
+
+## Timeline
+
+* Date reported: $REPORT_DATE
+
+* Date fixed: $FIX_DATE
+
+* Date disclosed: $DISCLOSURE_DATE
+```
+
+## References
+
+This document was developed with the help of the [OSS Vulnerability Guide](https://github.com/ossf/oss-vulnerability-guide) and the [Secure Software Development Fundamentals course](https://github.com/ossf/secure-sw-dev-fundamentals/blob/main/secure_software_development_fundamentals.md) by the [Open Source Security Foundation](https://openssf.org/).
diff --git a/.github/actions/check-if-pr-is-low-risk/action.yml b/.github/actions/check-if-pr-is-low-risk/action.yml
deleted file mode 100644
index 826d403fedf4..000000000000
--- a/.github/actions/check-if-pr-is-low-risk/action.yml
+++ /dev/null
@@ -1,14 +0,0 @@
-name: 'Check if PR is low-risk'
-description: 'This action checks whether a PR is low-risk, which means we can skip some CI checks.'
-outputs:
- is-low-risk:
- description: '0 if PR is low risk, 1 otherwise.'
- value: ${{ steps.check-risk.outputs.is-low-risk }}
-runs:
- using: 'composite'
- steps:
- - id: check-risk
- run: |
- python -m scripts.check_if_pr_is_low_risk ${{ github.event.pull_request.html_url }} && true
- echo "::set-output name=is-low-risk::$?"
- shell: bash
diff --git a/.github/actions/install-oppia-dependencies/action.yml b/.github/actions/install-oppia-dependencies/action.yml
index 7dfdcad37d81..5524273b40e6 100644
--- a/.github/actions/install-oppia-dependencies/action.yml
+++ b/.github/actions/install-oppia-dependencies/action.yml
@@ -6,6 +6,11 @@ runs:
- name: Setup python by installing wheel
run: pip install wheel==0.35.0
shell: bash
+ - name: Install python 2 for GAE
+ run: |
+ sudo apt update
+ sudo apt install python2 -y
+ shell: bash
- name: Check Yarn Cache
run: |
# Move outside repository root to ignore the configs in
diff --git a/.github/codeql/codeql-config.yml b/.github/codeql/codeql-config.yml
new file mode 100644
index 000000000000..f2532951ba6a
--- /dev/null
+++ b/.github/codeql/codeql-config.yml
@@ -0,0 +1,22 @@
+name: "CodeQL Security Analysis"
+
+paths-ignore:
+ - core/tests/data
+ # TODO(#16763): The use of SHA-1 in this file causes CodeQL to throw the error
+ # "Use of a broken or weak cryptographic hashing algorithm on sensitive data."
+ # The results of the function using SHA-1 are stored in some places, but the
+ # function is not used for enciphering and preimage attacks are not a big risk
+ # for SHA-1. We can migrate to a stronger cryptographic algorithm, replacing
+ # all SHA-1, but that would require changes to the existing data we have.
+ - core/utils.py
+ - scripts/release_scripts/update_configs.py
+ # TODO(#17117): These files cause an "Incomplete multi-character sanitization"
+ # error to be thrown by CodeQL (cases enumerated in the issue). If we define a
+ # central method for this stripping, we can remove these files.
+ - core/templates/pages/exploration-player-page/services/audio-translation-manager.service.ts
+ - core/templates/pages/exploration-editor-page/changes-in-human-readable-form/changes-in-human-readable-form.component.spec.ts
+ - core/templates/components/ck-editor-helpers/ck-editor-copy-content.service.ts
+ - core/templates/filters/format-rte-preview.pipe.ts
+ - core/templates/domain/objects/NumberWithUnitsObjectFactory.ts
+ - extensions/rich_text_components/rte-output-display.component.spec.ts
+ - core/tests/webdriverio_utils/forms.js
diff --git a/.github/workflows/backend_associated_test_file_check.yml b/.github/workflows/backend_associated_test_file_check.yml
new file mode 100644
index 000000000000..8e96a01ed65f
--- /dev/null
+++ b/.github/workflows/backend_associated_test_file_check.yml
@@ -0,0 +1,47 @@
+name: Backend associated test file check
+on:
+ push:
+ branches:
+ - develop
+ - release-*
+ pull_request:
+ branches:
+ - develop
+ - release-*
+
+jobs:
+ run_tests:
+ name: Run backend associated test file checks
+ runs-on: ${{ matrix.os }}
+ strategy:
+ matrix:
+ os: [ubuntu-22.04]
+ steps:
+ - uses: actions/checkout@v3
+ - uses: actions/setup-python@v3
+ with:
+ python-version: '3.8.15'
+ architecture: 'x64'
+ - uses: ./.github/actions/merge
+ - name: Cache node modules and third_party/static
+ uses: actions/cache@v3
+ env:
+ cache-name: cache-node-modules
+ with:
+ path: |
+ /home/runner/work/oppia/yarn_cache
+ /home/runner/work/oppia/oppia/third_party/static
+ key: ${{ runner.os }}-build-${{ env.cache-name }}-${{ hashFiles('yarn.lock', 'dependencies.json') }}
+ restore-keys: |
+ ${{ runner.os }}-build-${{ env.cache-name }}-
+ ${{ runner.os }}-build-
+ ${{ runner.os }}-
+ - uses: ./.github/actions/install-oppia-dependencies
+ - name: Run backend associated test file check
+ run: PYTHONIOENCODING=utf-8 python -m scripts.check_backend_associated_test_file
+ - name: Report failure if failed on oppia/oppia develop branch
+ if: ${{ failure() && github.event_name == 'push' && github.repository == 'oppia/oppia' && github.ref == 'refs/heads/develop'}}
+ uses: ./.github/actions/send-webhook-notification
+ with:
+ message: "Some backend files lack an associated test file."
+ webhook-url: ${{ secrets.BUILD_FAILURE_ROOM_WEBHOOK_URL }}
diff --git a/.github/workflows/backend_tests.yml b/.github/workflows/backend_tests.yml
index 08466cb3cdb9..c830a9480725 100644
--- a/.github/workflows/backend_tests.yml
+++ b/.github/workflows/backend_tests.yml
@@ -15,21 +15,23 @@ jobs:
runs-on: ${{ matrix.os }}
strategy:
matrix:
- os: [ubuntu-18.04]
- shard: [1, 2, 3, 4]
+ os: [ubuntu-22.04]
+ shard: [1, 2, 3, 4, 5]
steps:
- - uses: actions/checkout@v2
- - uses: actions/setup-python@v2
+ - uses: actions/checkout@v3
+ - uses: actions/setup-python@v3
with:
- python-version: '3.7'
+ python-version: '3.8.15'
architecture: 'x64'
- - name: Cache node modules
- uses: actions/cache@v2
+ - name: Cache node modules and third_party/static
+ uses: actions/cache@v3
env:
cache-name: cache-node-modules
with:
- path: /home/runner/work/oppia/yarn_cache
- key: ${{ runner.os }}-build-${{ env.cache-name }}-${{ hashFiles('yarn.lock') }}
+ path: |
+ /home/runner/work/oppia/yarn_cache
+ /home/runner/work/oppia/oppia/third_party/static
+ key: ${{ runner.os }}-build-${{ env.cache-name }}-${{ hashFiles('yarn.lock', 'dependencies.json') }}
restore-keys: |
${{ runner.os }}-build-${{ env.cache-name }}-
${{ runner.os }}-build-
@@ -38,31 +40,38 @@ jobs:
if: startsWith(github.head_ref, 'update-changelog-for-release') == false
- name: Install packages for optimized coverage
if: startsWith(github.head_ref, 'update-changelog-for-release') == false
- run: sudo apt-get install -y python-dev gcc
+ run: sudo apt-get install -y python-dev-is-python3 gcc
- name: Install coverage and configparser
if: startsWith(github.head_ref, 'update-changelog-for-release') == false
run: pip install coverage configparser
- name: Run backend test shard
if: startsWith(github.head_ref, 'update-changelog-for-release') == false
run: PYTHONIOENCODING=utf-8 python -m scripts.run_backend_tests --generate_coverage_report --ignore_coverage --exclude_load_tests --test_shard ${{ matrix.shard }}
+ - name: Report failure if failed on oppia/oppia develop branch
+ if: ${{ failure() && github.event_name == 'push' && github.repository == 'oppia/oppia' && github.ref == 'refs/heads/develop'}}
+ uses: ./.github/actions/send-webhook-notification
+ with:
+ message: "A backend test failed on the upstream develop branch."
+ webhook-url: ${{ secrets.BUILD_FAILURE_ROOM_WEBHOOK_URL }}
- name: Upload coverage report
if: startsWith(github.head_ref, 'update-changelog-for-release') == false
- uses: actions/upload-artifact@v2
+ uses: actions/upload-artifact@v3
with:
name: ${{ format('backend_test_coverage_shard_{0}', matrix.shard) }}
path: .coverage
+ retention-days: 1
check_combined_coverage:
name: Check combined backend test coverage
needs: run_tests
- runs-on: ubuntu-18.04
+ runs-on: ubuntu-22.04
steps:
- - uses: actions/checkout@v2
- - uses: actions/setup-python@v2
+ - uses: actions/checkout@v3
+ - uses: actions/setup-python@v3
with:
- python-version: '3.7'
+ python-version: '3.8.15'
architecture: 'x64'
- name: Cache node modules
- uses: actions/cache@v2
+ uses: actions/cache@v3
env:
cache-name: cache-node-modules
with:
@@ -80,33 +89,39 @@ jobs:
run: pip install coverage
- name: Download coverage report for shard 1
if: startsWith(github.head_ref, 'update-changelog-for-release') == false
- uses: actions/download-artifact@v2
+ uses: actions/download-artifact@v3
with:
name: backend_test_coverage_shard_1
path: coverage/coverage_1
- name: Download coverage report for shard 2
if: startsWith(github.head_ref, 'update-changelog-for-release') == false
- uses: actions/download-artifact@v2
+ uses: actions/download-artifact@v3
with:
name: backend_test_coverage_shard_2
path: coverage/coverage_2
- name: Download coverage report for shard 3
if: startsWith(github.head_ref, 'update-changelog-for-release') == false
- uses: actions/download-artifact@v2
+ uses: actions/download-artifact@v3
with:
name: backend_test_coverage_shard_3
path: coverage/coverage_3
- name: Download coverage report for shard 4
if: startsWith(github.head_ref, 'update-changelog-for-release') == false
- uses: actions/download-artifact@v2
+ uses: actions/download-artifact@v3
with:
name: backend_test_coverage_shard_4
path: coverage/coverage_4
+ - name: Download coverage report for shard 5
+ if: startsWith(github.head_ref, 'update-changelog-for-release') == false
+ uses: actions/download-artifact@v3
+ with:
+ name: backend_test_coverage_shard_5
+ path: coverage/coverage_5
- name: Move coverage reports from artifact folders to coverage folder
if: startsWith(github.head_ref, 'update-changelog-for-release') == false
shell: bash
run: |
- for i in {1..4}; do cp coverage/coverage_$i/.coverage coverage/.coverage.$i; done
+ for i in {1..5}; do cp coverage/coverage_$i/.coverage coverage/.coverage.$i; done
- name: Combine coverage reports
if: startsWith(github.head_ref, 'update-changelog-for-release') == false
shell: bash
@@ -114,4 +129,10 @@ jobs:
- name: Check coverage
if: startsWith(github.head_ref, 'update-changelog-for-release') == false
shell: bash
- run: coverage report --fail-under 100 -m
+ run: PYTHONIOENCODING=utf-8 python -m scripts.check_overall_backend_test_coverage
+ - name: Report failure if failed on oppia/oppia develop branch
+ if: ${{ failure() && github.event_name == 'push' && github.repository == 'oppia/oppia' && github.ref == 'refs/heads/develop'}}
+ uses: ./.github/actions/send-webhook-notification
+ with:
+ message: "Backend coverage checks failed on the upstream develop branch."
+ webhook-url: ${{ secrets.BUILD_FAILURE_ROOM_WEBHOOK_URL }}
diff --git a/.github/workflows/codeql-analysis.yml b/.github/workflows/codeql-analysis.yml
new file mode 100644
index 000000000000..70d2a9d0d578
--- /dev/null
+++ b/.github/workflows/codeql-analysis.yml
@@ -0,0 +1,40 @@
+# Generated by GitHub.
+name: "CodeQL"
+
+on:
+ push:
+ branches: ["develop"]
+ pull_request:
+ # The branches below must be a subset of the branches above
+ branches: ["develop"]
+ schedule:
+ - cron: "20 13 * * 2"
+
+jobs:
+ analyze:
+ name: Analyze
+ runs-on: ubuntu-latest
+ permissions:
+ actions: read
+ contents: read
+ security-events: write
+
+ strategy:
+ fail-fast: false
+ matrix:
+ language: ["javascript", "python"]
+
+ steps:
+ - name: Checkout repository
+ uses: actions/checkout@v3
+
+ - uses: ./.github/actions/merge
+
+ - name: Initialize CodeQL
+ uses: github/codeql-action/init@v2
+ with:
+ languages: ${{ matrix.language }}
+ config-file: ./.github/codeql/codeql-config.yml
+
+ - name: Perform CodeQL Analysis
+ uses: github/codeql-action/analyze@v2
diff --git a/.github/workflows/develop_commit_notification.yml b/.github/workflows/develop_commit_notification.yml
new file mode 100644
index 000000000000..d7f4da073c41
--- /dev/null
+++ b/.github/workflows/develop_commit_notification.yml
@@ -0,0 +1,25 @@
+name: Broadcast 'push to develop' event to our release-scripts repo
+on:
+ push:
+ branches:
+ - develop
+
+jobs:
+ send_notification:
+ name: Send notification
+ runs-on: ubuntu-22.04
+ if: github.repository == 'oppia/oppia'
+ steps:
+ - name: Generate token
+ id: generate_token
+ uses: tibdex/github-app-token@b62528385c34dbc9f38e5f4225ac829252d1ea92
+ with:
+ app_id: ${{ secrets.NOTIFICATIONS_TOKEN_GENERATOR_GH_APP_ID }}
+ private_key: ${{ secrets.NOTIFICATIONS_TOKEN_GENERATOR_GH_APP_PRIVATE_KEY }}
+ - name: Repository Dispatch
+ uses: peter-evans/repository-dispatch@87c5425cae5ba8b5bc7da27674076c78588babf3
+ with:
+ token: ${{ steps.generate_token.outputs.token }}
+ repository: oppia/release-scripts
+ event-type: develop-commit
+ client-payload: '{"ref": "${{ github.ref }}", "sha": "${{ github.sha }}"}'
diff --git a/.github/workflows/e2e_additional_editor_and_player.yml b/.github/workflows/e2e_additional_editor_and_player.yml
deleted file mode 100644
index 5ed40d94f1aa..000000000000
--- a/.github/workflows/e2e_additional_editor_and_player.yml
+++ /dev/null
@@ -1,69 +0,0 @@
-name: End-to-End tests
-on:
- push:
- branches:
- - develop
- - release-*
- pull_request:
- branches:
- - develop
- - release-*
-
-jobs:
- e2e_additional_editor_and_player:
- runs-on: ${{ matrix.os }}
- strategy:
- matrix:
- os: [ubuntu-18.04]
- steps:
- - uses: actions/checkout@v2
- - uses: actions/setup-python@v2
- with:
- python-version: '3.7'
- architecture: 'x64'
- - uses: ./.github/actions/merge
- - name: Cache node modules
- uses: actions/cache@v2
- env:
- cache-name: cache-node-modules
- with:
- path: /home/runner/work/oppia/yarn_cache
- key: ${{ runner.os }}-build-${{ env.cache-name }}-${{ hashFiles('yarn.lock') }}
- restore-keys: |
- ${{ runner.os }}-build-${{ env.cache-name }}-
- ${{ runner.os }}-build-
- ${{ runner.os }}-
- - uses: ./.github/actions/install-oppia-dependencies
- - id: check-risk
- name: Check if PR is low-risk
- uses: ./.github/actions/check-if-pr-is-low-risk
- - name: Install chrome
- if: ${{ steps.check-risk.outputs.is-low-risk != 0 }}
- run: python -m scripts.install_chrome_for_ci
- - name: Install ffmpeg
- if: ${{ steps.check-risk.outputs.is-low-risk != 0 }}
- run: sudo apt install ffmpeg
- - name: Run Additional Editor E2E Test
- if: ${{ steps.check-risk.outputs.is-low-risk != 0 }}
- run: xvfb-run -a --server-args="-screen 0, 1285x1000x24" python -m scripts.run_e2e_tests --suite="additionalEditorFeatures" --prod_env
- env:
- VIDEO_RECORDING_IS_ENABLED: 0
- - name: Run Additional Editor Modals E2E Test
- if: ${{ steps.check-risk.outputs.is-low-risk != 0 }}
- run: xvfb-run -a --server-args="-screen 0, 1285x1000x24" python -m scripts.run_e2e_tests --skip-build --skip-install --suite="additionalEditorFeaturesModals" --prod_env
- env:
- VIDEO_RECORDING_IS_ENABLED: 0
- - name: Run Additional Player E2E Test
- if: ${{ steps.check-risk.outputs.is-low-risk != 0 }}
- run: xvfb-run -a --server-args="-screen 0, 1285x1000x24" python -m scripts.run_e2e_tests --skip-build --skip-install --suite="additionalPlayerFeatures" --prod_env
- env:
- VIDEO_RECORDING_IS_ENABLED: 0
- - name: Uploading protractor-video as Artifacts
- if: ${{ steps.check-risk.outputs.is-low-risk != 0 && always() }}
- uses: actions/upload-artifact@v2
- with:
- name: protractor-video
- path: /home/runner/work/oppia/protractor-video
- - name: Checking Memory Usage
- if: ${{ always() }}
- run: cat /sys/fs/cgroup/memory/memory.max_usage_in_bytes
diff --git a/.github/workflows/e2e_creator_learner_dashboard_and_editor_tabs.yml b/.github/workflows/e2e_creator_learner_dashboard_and_editor_tabs.yml
deleted file mode 100644
index a21c990bbc19..000000000000
--- a/.github/workflows/e2e_creator_learner_dashboard_and_editor_tabs.yml
+++ /dev/null
@@ -1,74 +0,0 @@
-name: End-to-End tests
-on:
- push:
- branches:
- - develop
- - release-*
- pull_request:
- branches:
- - develop
- - release-*
-
-jobs:
- e2e_creator_learner_dashboard_and_editor_tabs:
- runs-on: ${{ matrix.os }}
- strategy:
- matrix:
- os: [ubuntu-18.04]
- steps:
- - uses: actions/checkout@v2
- - uses: actions/setup-python@v2
- with:
- python-version: '3.7'
- architecture: 'x64'
- - uses: ./.github/actions/merge
- - name: Cache node modules
- uses: actions/cache@v2
- env:
- cache-name: cache-node-modules
- with:
- path: /home/runner/work/oppia/yarn_cache
- key: ${{ runner.os }}-build-${{ env.cache-name }}-${{ hashFiles('yarn.lock') }}
- restore-keys: |
- ${{ runner.os }}-build-${{ env.cache-name }}-
- ${{ runner.os }}-build-
- ${{ runner.os }}-
- - uses: ./.github/actions/install-oppia-dependencies
- - id: check-risk
- name: Check if PR is low-risk
- uses: ./.github/actions/check-if-pr-is-low-risk
- - name: Install chrome
- if: ${{ steps.check-risk.outputs.is-low-risk != 0 }}
- run: python -m scripts.install_chrome_for_ci
- - name: Install ffmpeg
- if: ${{ steps.check-risk.outputs.is-low-risk != 0 }}
- run: sudo apt install ffmpeg
- - name: Run Creator Dashboard E2E Test
- if: ${{ steps.check-risk.outputs.is-low-risk != 0 }}
- run: xvfb-run -a --server-args="-screen 0, 1285x1000x24" python -m scripts.run_e2e_tests --suite="creatorDashboard" --prod_env
- env:
- VIDEO_RECORDING_IS_ENABLED: 0
- - name: Run Improvements Tab E2E Test
- if: ${{ steps.check-risk.outputs.is-low-risk != 0 }}
- run: xvfb-run -a --server-args="-screen 0, 1285x1000x24" python -m scripts.run_e2e_tests --skip-build --skip-install --suite="explorationImprovementsTab" --prod_env
- env:
- VIDEO_RECORDING_IS_ENABLED: 0
- - name: Run Feedback Tab E2E Test
- if: ${{ steps.check-risk.outputs.is-low-risk != 0 }}
- run: xvfb-run -a --server-args="-screen 0, 1285x1000x24" python -m scripts.run_e2e_tests --skip-build --skip-install --suite="explorationFeedbackTab" --prod_env
- env:
- VIDEO_RECORDING_IS_ENABLED: 0
- - name: Run Learner Dashboard E2E Test
- if: ${{ steps.check-risk.outputs.is-low-risk != 0 }}
- run: xvfb-run -a --server-args="-screen 0, 1285x1000x24" python -m scripts.run_e2e_tests --skip-build --skip-install --suite="learnerDashboard" --prod_env
- env:
- VIDEO_RECORDING_IS_ENABLED: 0
- - name: Uploading protractor-video as Artifacts
- if: ${{ steps.check-risk.outputs.is-low-risk != 0 && always() }}
- uses: actions/upload-artifact@v2
- with:
- name: protractor-video
- path: /home/runner/work/oppia/protractor-video
- - name: Checking Memory Usage
- if: ${{ always() }}
- run: cat /sys/fs/cgroup/memory/memory.max_usage_in_bytes
diff --git a/.github/workflows/e2e_history_statistics_tabs_and_extensions.yml b/.github/workflows/e2e_history_statistics_tabs_and_extensions.yml
deleted file mode 100644
index 38a3905dbb81..000000000000
--- a/.github/workflows/e2e_history_statistics_tabs_and_extensions.yml
+++ /dev/null
@@ -1,69 +0,0 @@
-name: End-to-End tests
-on:
- push:
- branches:
- - develop
- - release-*
- pull_request:
- branches:
- - develop
- - release-*
-
-jobs:
- e2e_history_statistics_tabs_and_extensions:
- runs-on: ${{ matrix.os }}
- strategy:
- matrix:
- os: [ubuntu-18.04]
- steps:
- - uses: actions/checkout@v2
- - uses: actions/setup-python@v2
- with:
- python-version: '3.7'
- architecture: 'x64'
- - uses: ./.github/actions/merge
- - name: Cache node modules
- uses: actions/cache@v2
- env:
- cache-name: cache-node-modules
- with:
- path: /home/runner/work/oppia/yarn_cache
- key: ${{ runner.os }}-build-${{ env.cache-name }}-${{ hashFiles('yarn.lock') }}
- restore-keys: |
- ${{ runner.os }}-build-${{ env.cache-name }}-
- ${{ runner.os }}-build-
- ${{ runner.os }}-
- - uses: ./.github/actions/install-oppia-dependencies
- - id: check-risk
- name: Check if PR is low-risk
- uses: ./.github/actions/check-if-pr-is-low-risk
- - name: Install chrome
- if: ${{ steps.check-risk.outputs.is-low-risk != 0 }}
- run: python -m scripts.install_chrome_for_ci
- - name: Install ffmpeg
- if: ${{ steps.check-risk.outputs.is-low-risk != 0 }}
- run: sudo apt install ffmpeg
- - name: Run History Tab E2E Test
- if: ${{ steps.check-risk.outputs.is-low-risk != 0 }}
- run: xvfb-run -a --server-args="-screen 0, 1285x1000x24" python -m scripts.run_e2e_tests --suite="explorationHistoryTab" --prod_env
- env:
- VIDEO_RECORDING_IS_ENABLED: 0
- - name: Run Statistics Tab E2E Test
- if: ${{ steps.check-risk.outputs.is-low-risk != 0 }}
- run: xvfb-run -a --server-args="-screen 0, 1285x1000x24" python -m scripts.run_e2e_tests --skip-build --skip-install --suite="explorationStatisticsTab" --prod_env
- env:
- VIDEO_RECORDING_IS_ENABLED: 0
- - name: Run Extensions E2E Test
- if: ${{ steps.check-risk.outputs.is-low-risk != 0 }}
- run: xvfb-run -a --server-args="-screen 0, 1285x1000x24" python -m scripts.run_e2e_tests --skip-build --skip-install --suite="extensions" --prod_env
- env:
- VIDEO_RECORDING_IS_ENABLED: 0
- - name: Uploading protractor-video as Artifacts
- if: ${{ steps.check-risk.outputs.is-low-risk != 0 && always() }}
- uses: actions/upload-artifact@v2
- with:
- name: protractor-video
- path: /home/runner/work/oppia/protractor-video
- - name: Checking Memory Usage
- if: ${{ always() }}
- run: cat /sys/fs/cgroup/memory/memory.max_usage_in_bytes
diff --git a/.github/workflows/e2e_learner_flow_skill_editor_and_embedding.yml b/.github/workflows/e2e_learner_flow_skill_editor_and_embedding.yml
deleted file mode 100644
index 3b1133aa67b4..000000000000
--- a/.github/workflows/e2e_learner_flow_skill_editor_and_embedding.yml
+++ /dev/null
@@ -1,69 +0,0 @@
-name: End-to-End tests
-on:
- push:
- branches:
- - develop
- - release-*
- pull_request:
- branches:
- - develop
- - release-*
-
-jobs:
- e2e_learner_flow_skill_editor_and_embedding:
- runs-on: ${{ matrix.os }}
- strategy:
- matrix:
- os: [ubuntu-18.04]
- steps:
- - uses: actions/checkout@v2
- - uses: actions/setup-python@v2
- with:
- python-version: '3.7'
- architecture: 'x64'
- - uses: ./.github/actions/merge
- - name: Cache node modules
- uses: actions/cache@v2
- env:
- cache-name: cache-node-modules
- with:
- path: /home/runner/work/oppia/yarn_cache
- key: ${{ runner.os }}-build-${{ env.cache-name }}-${{ hashFiles('yarn.lock') }}
- restore-keys: |
- ${{ runner.os }}-build-${{ env.cache-name }}-
- ${{ runner.os }}-build-
- ${{ runner.os }}-
- - uses: ./.github/actions/install-oppia-dependencies
- - id: check-risk
- name: Check if PR is low-risk
- uses: ./.github/actions/check-if-pr-is-low-risk
- - name: Install chrome
- if: ${{ steps.check-risk.outputs.is-low-risk != 0 }}
- run: python -m scripts.install_chrome_for_ci
- - name: Install ffmpeg
- if: ${{ steps.check-risk.outputs.is-low-risk != 0 }}
- run: sudo apt install ffmpeg
- - name: Run Learner Flow E2E Test
- if: ${{ steps.check-risk.outputs.is-low-risk != 0 }}
- run: xvfb-run -a --server-args="-screen 0, 1285x1000x24" python -m scripts.run_e2e_tests --suite="learner" --prod_env
- env:
- VIDEO_RECORDING_IS_ENABLED: 0
- - name: Run Skill Editor E2E Test
- if: ${{ steps.check-risk.outputs.is-low-risk != 0 }}
- run: xvfb-run -a --server-args="-screen 0, 1285x1000x24" python -m scripts.run_e2e_tests --skip-build --skip-install --suite="skillEditor" --prod_env
- env:
- VIDEO_RECORDING_IS_ENABLED: 0
- - name: Run Embedding E2E Test
- if: ${{ steps.check-risk.outputs.is-low-risk != 0 }}
- run: xvfb-run -a --server-args="-screen 0, 1285x1000x24" python -m scripts.run_e2e_tests --skip-build --skip-install --suite="embedding" --prod_env
- env:
- VIDEO_RECORDING_IS_ENABLED: 0
- - name: Uploading protractor-video as Artifacts
- if: ${{ steps.check-risk.outputs.is-low-risk != 0 && always() }}
- uses: actions/upload-artifact@v2
- with:
- name: protractor-video
- path: /home/runner/work/oppia/protractor-video
- - name: Checking Memory Usage
- if: ${{ always() }}
- run: cat /sys/fs/cgroup/memory/memory.max_usage_in_bytes
diff --git a/.github/workflows/e2e_miscellaneous_tests.yml b/.github/workflows/e2e_miscellaneous_tests.yml
deleted file mode 100644
index 41208b4b9580..000000000000
--- a/.github/workflows/e2e_miscellaneous_tests.yml
+++ /dev/null
@@ -1,89 +0,0 @@
-name: End-to-End tests
-on:
- push:
- branches:
- - develop
- - release-*
- pull_request:
- branches:
- - develop
- - release-*
-
-jobs:
- e2e_miscellaneous_tests:
- runs-on: ${{ matrix.os }}
- strategy:
- matrix:
- os: [ubuntu-18.04]
- steps:
- - uses: actions/checkout@v2
- - uses: actions/setup-python@v2
- with:
- python-version: '3.7'
- architecture: 'x64'
- - uses: ./.github/actions/merge
- - name: Cache node modules
- uses: actions/cache@v2
- env:
- cache-name: cache-node-modules
- with:
- path: /home/runner/work/oppia/yarn_cache
- key: ${{ runner.os }}-build-${{ env.cache-name }}-${{ hashFiles('yarn.lock') }}
- restore-keys: |
- ${{ runner.os }}-build-${{ env.cache-name }}-
- ${{ runner.os }}-build-
- ${{ runner.os }}-
- - uses: ./.github/actions/install-oppia-dependencies
- - id: check-risk
- name: Check if PR is low-risk
- uses: ./.github/actions/check-if-pr-is-low-risk
- - name: Install chrome
- if: ${{ steps.check-risk.outputs.is-low-risk != 0 }}
- run: python -m scripts.install_chrome_for_ci
- - name: Install ffmpeg
- if: ${{ steps.check-risk.outputs.is-low-risk != 0 }}
- run: sudo apt install ffmpeg
- - name: Run e2e File Upload Features Test
- if: ${{ steps.check-risk.outputs.is-low-risk != 0 }}
- run: xvfb-run -a --server-args="-screen 0, 1285x1000x24" python -m scripts.run_e2e_tests --suite="fileUploadFeatures" --prod_env
- env:
- VIDEO_RECORDING_IS_ENABLED: 0
- - name: Run e2e Play Voiceovers Test
- if: ${{ steps.check-risk.outputs.is-low-risk != 0 }}
- run: xvfb-run -a --server-args="-screen 0, 1285x1000x24" python -m scripts.run_e2e_tests --skip-install --skip-build --suite="playVoiceovers" --prod_env
- env:
- VIDEO_RECORDING_IS_ENABLED: 0
- - name: Run e2e File Upload Extensions Test
- if: ${{ steps.check-risk.outputs.is-low-risk != 0 }}
- run: xvfb-run -a --server-args="-screen 0, 1285x1000x24" python -m scripts.run_e2e_tests --skip-install --skip-build --suite="fileUploadExtensions" --prod_env
- env:
- VIDEO_RECORDING_IS_ENABLED: 0
- - name: Run e2e Contributor Dashboard Test
- if: ${{ steps.check-risk.outputs.is-low-risk != 0 }}
- run: xvfb-run -a --server-args="-screen 0, 1285x1000x24" python -m scripts.run_e2e_tests --skip-install --skip-build --suite="contributorDashboard" --prod_env
- env:
- VIDEO_RECORDING_IS_ENABLED: 0
- - name: Run e2e Blog Dashboard Test
- if: ${{ steps.check-risk.outputs.is-low-risk != 0 }}
- run: xvfb-run -a --server-args="-screen 0, 1285x1000x24" python -m scripts.run_e2e_tests --skip-install --skip-build --suite="blogDashboard" --prod_env
- env:
- VIDEO_RECORDING_IS_ENABLED: 0
- - name: Run e2e Publication Test
- if: ${{ steps.check-risk.outputs.is-low-risk != 0 }}
- run: xvfb-run -a --server-args="-screen 0, 1285x1000x24" python -m scripts.run_e2e_tests --suite="publication" --skip-install --skip-build --server_log_level="info" --prod_env
- env:
- VIDEO_RECORDING_IS_ENABLED: 0
- - name: Run e2e Feature Gating Test
- if: ${{ steps.check-risk.outputs.is-low-risk != 0 }}
- run: xvfb-run -a --server-args="-screen 0, 1285x1000x24" python -m scripts.run_e2e_tests --skip-install --suite="featureGating"
- env:
- VIDEO_RECORDING_IS_ENABLED: 0
- - name: Uploading protractor-video as Artifacts
- if: ${{ steps.check-risk.outputs.is-low-risk != 0 && always() }}
- uses: actions/upload-artifact@v2
- with:
- name: protractor-video
- path: /home/runner/work/oppia/protractor-video
- - name: Checking Memory Usage
- if: ${{ always() }}
- run: cat /sys/fs/cgroup/memory/memory.max_usage_in_bytes
diff --git a/.github/workflows/e2e_other_tests.yml b/.github/workflows/e2e_other_tests.yml
deleted file mode 100644
index 0064bb998e3e..000000000000
--- a/.github/workflows/e2e_other_tests.yml
+++ /dev/null
@@ -1,79 +0,0 @@
-name: End-to-End tests
-on:
- push:
- branches:
- - develop
- - release-*
- pull_request:
- branches:
- - develop
- - release-*
-
-jobs:
- e2e_other_tests:
- runs-on: ${{ matrix.os }}
- strategy:
- matrix:
- os: [ubuntu-18.04]
- steps:
- - uses: actions/checkout@v2
- - uses: actions/setup-python@v2
- with:
- python-version: '3.7'
- architecture: 'x64'
- - uses: ./.github/actions/merge
- - name: Cache node modules
- uses: actions/cache@v2
- env:
- cache-name: cache-node-modules
- with:
- path: /home/runner/work/oppia/yarn_cache
- key: ${{ runner.os }}-build-${{ env.cache-name }}-${{ hashFiles('yarn.lock') }}
- restore-keys: |
- ${{ runner.os }}-build-${{ env.cache-name }}-
- ${{ runner.os }}-build-
- ${{ runner.os }}-
- - uses: ./.github/actions/install-oppia-dependencies
- - id: check-risk
- name: Check if PR is low-risk
- uses: ./.github/actions/check-if-pr-is-low-risk
- - name: Install chrome
- if: ${{ steps.check-risk.outputs.is-low-risk != 0 }}
- run: python -m scripts.install_chrome_for_ci
- - name: Install ffmpeg
- if: ${{ steps.check-risk.outputs.is-low-risk != 0 }}
- run: sudo apt install ffmpeg
- - name: Run e2e Collections Test
- if: ${{ steps.check-risk.outputs.is-low-risk != 0 }}
- run: xvfb-run -a --server-args="-screen 0, 1285x1000x24" python -m scripts.run_e2e_tests --suite="collections" --prod_env
- env:
- VIDEO_RECORDING_IS_ENABLED: 0
- - name: Run e2e Accessibility Test
- if: ${{ steps.check-risk.outputs.is-low-risk != 0 }}
- run: xvfb-run -a --server-args="-screen 0, 1285x1000x24" python -m scripts.run_e2e_tests --skip-install --skip-build --suite="accessibility" --prod_env
- env:
- VIDEO_RECORDING_IS_ENABLED: 0
- - name: Run e2e Classroom Page Test
- if: ${{ steps.check-risk.outputs.is-low-risk != 0 }}
- run: xvfb-run -a --server-args="-screen 0, 1285x1000x24" python -m scripts.run_e2e_tests --skip-install --skip-build --suite="classroomPageFileUploadFeatures" --prod_env
- env:
- VIDEO_RECORDING_IS_ENABLED: 0
- - name: Run e2e Navigation Test
- if: ${{ steps.check-risk.outputs.is-low-risk != 0 }}
- run: xvfb-run -a --server-args="-screen 0, 1285x1000x24" python -m scripts.run_e2e_tests --prod_env --skip-install --skip-build --suite="navigation"
- env:
- VIDEO_RECORDING_IS_ENABLED: 0
- - name: Run e2e Admin Page Test
- if: ${{ steps.check-risk.outputs.is-low-risk != 0 }}
- run: xvfb-run -a --server-args="-screen 0, 1285x1000x24" python -m scripts.run_e2e_tests --prod_env --skip-install --skip-build --suite="adminPage"
- env:
- VIDEO_RECORDING_IS_ENABLED: 0
- - name: Uploading protractor-video as Artifacts
- if: ${{ steps.check-risk.outputs.is-low-risk != 0 && always() }}
- uses: actions/upload-artifact@v2
- with:
- name: protractor-video
- path: /home/runner/work/oppia/protractor-video
- - name: Checking Memory Usage
- if: ${{ always() }}
- run: cat /sys/fs/cgroup/memory/memory.max_usage_in_bytes
diff --git a/.github/workflows/e2e_tests.yml b/.github/workflows/e2e_tests.yml
new file mode 100644
index 000000000000..baff22ee80c8
--- /dev/null
+++ b/.github/workflows/e2e_tests.yml
@@ -0,0 +1,190 @@
+name: End-to-End tests
+on:
+ push:
+ branches:
+ - develop
+ - release-*
+ pull_request:
+ branches:
+ - develop
+ - release-*
+
+jobs:
+ build:
+ runs-on: ${{ matrix.os }}
+ strategy:
+ matrix:
+ os: [ubuntu-22.04]
+ steps:
+ - uses: actions/checkout@v3
+ - uses: actions/setup-python@v3
+ with:
+ python-version: '3.8.15'
+ architecture: 'x64'
+ cache: 'pip'
+ cache-dependency-path: |
+ requirements.in
+ requirements.txt
+ requirements_dev.in
+ requirements_dev.txt
+ - uses: ./.github/actions/merge
+ - name: Cache node modules and third_party/static
+ uses: actions/cache@v3
+ env:
+ cache-name: cache-node-modules
+ with:
+ path: |
+ /home/runner/work/oppia/yarn_cache
+ /home/runner/work/oppia/oppia/third_party/static
+ key: ${{ runner.os }}-build-${{ env.cache-name }}-${{ hashFiles('yarn.lock', 'dependencies.json') }}
+ restore-keys: |
+ ${{ runner.os }}-build-${{ env.cache-name }}-
+ ${{ runner.os }}-build-
+ ${{ runner.os }}-
+ - uses: ./.github/actions/install-oppia-dependencies
+ - name: Install chrome
+ run: python -m scripts.install_chrome_for_ci
+ - name: Install ffmpeg
+ run: sudo apt install ffmpeg
+ - name: Build Webpack
+ run: python -m scripts.build --prod_env
+ - name: Zip build files
+ # We avoid using ../ or absolute paths because unzip treats these as
+ # security issues and will refuse to follow them.
+ run: |
+ zip -rqy build_files.zip oppia/third_party oppia_tools oppia/build oppia/webpack_bundles oppia/proto_files oppia/app.yaml oppia/assets/hashes.json oppia/proto_files oppia/extensions/classifiers/proto/* oppia/backend_prod_files oppia/dist
+ working-directory: /home/runner/work/oppia
+ - name: Upload build files artifact
+ uses: actions/upload-artifact@v3
+ with:
+ name: build_files
+ path: /home/runner/work/oppia/build_files.zip
+ retention-days: 1
+ e2e_test:
+ needs: build
+ runs-on: ${{ matrix.os }}
+ strategy:
+ matrix:
+ os: [ubuntu-22.04]
+ suite:
+ - accessibility
+ - additionalEditorFeatures
+ - additionalEditorFeaturesModals
+ - additionalPlayerFeatures
+ - adminPage
+ - blogDashboard
+ - blog
+ - checkpointFeatures
+ - classroomPage
+ - classroomPageFileUploadFeatures
+ - collections
+ - contributorDashboard
+ - coreEditorAndPlayerFeatures
+ - creatorDashboard
+ - diagnosticTestPage
+ - embedding
+ - explorationFeedbackTab
+ - explorationImprovementsTab
+ - explorationHistoryTab
+ - explorationStatisticsTab
+ - explorationTranslationTab
+ - extensions
+ - featureGating
+ - fileUploadExtensions
+ - fileUploadFeatures
+ - learner
+ - learnerDashboard
+ - library
+ - navigation
+ - playVoiceovers
+ - preferences
+ - profileFeatures
+ - profileMenu
+ - publication
+ - skillEditor
+ - subscriptions
+ - topicsAndSkillsDashboard
+ - topicAndStoryEditor
+ - topicAndStoryEditorFileUploadFeatures
+ - topicAndStoryViewer
+ - users
+ - wipeout
+ steps:
+ - uses: actions/checkout@v3
+ - uses: actions/setup-python@v3
+ with:
+ python-version: '3.8.15'
+ architecture: 'x64'
+ cache: 'pip'
+ cache-dependency-path: |
+ requirements.in
+ requirements.txt
+ requirements_dev.in
+ requirements_dev.txt
+ - uses: ./.github/actions/merge
+ - name: Cache node modules
+ uses: actions/cache@v3
+ env:
+ cache-name: cache-node-modules
+ with:
+ path: /home/runner/work/oppia/yarn_cache
+ key: ${{ runner.os }}-build-${{ env.cache-name }}-${{ hashFiles('yarn.lock') }}
+ restore-keys: |
+ ${{ runner.os }}-build-${{ env.cache-name }}-
+ ${{ runner.os }}-build-
+ ${{ runner.os }}-
+ - name: Download build files artifact
+ uses: actions/download-artifact@v3
+ with:
+ name: build_files
+ path: /home/runner/work/oppia/
+ - name: Unzip build files
+ run: |
+ ls -la
+ unzip build_files.zip
+ rm build_files.zip
+ echo "Files in ./:"
+ ls -la .
+ echo "Files in oppia_tools:"
+ ls -la oppia_tools
+ echo "Files in oppia:"
+ ls -la oppia
+ echo "Files in build:"
+ ls -la oppia/build
+ echo "Files in third_party:"
+ ls -la oppia/third_party
+ working-directory: /home/runner/work/oppia
+ shell: bash
+ - uses: ./.github/actions/install-oppia-dependencies
+ - name: Install chrome
+ run: python -m scripts.install_chrome_for_ci
+ - name: Install ffmpeg
+ run: sudo apt install ffmpeg
+ - name: Run E2E Test ${{ matrix.suite }}
+ run: xvfb-run -a --server-args="-screen 0, 1285x1000x24" python -m scripts.run_e2e_tests --skip-install --skip-build --suite=${{ matrix.suite }} --prod_env
+ env:
+ VIDEO_RECORDING_IS_ENABLED: 0
+ - name: Uploading webdriverio-video as Artifacts
+ if: ${{ failure() }}
+ uses: actions/upload-artifact@v3
+ with:
+ name: webdriverio-video
+ path: /home/runner/work/oppia/webdriverio-video
+ - name: Uploading webdriverio screenshots as Artifacts
+ if: ${{ failure() }}
+ uses: actions/upload-artifact@v3
+ with:
+ name: webdriverio-screenshots
+ path: /home/runner/work/oppia/webdriverio-screenshots
+ - name: Uploading webpack bundles as an artifact
+ if: ${{ failure() }}
+ uses: actions/upload-artifact@v3
+ with:
+ name: webpack-bundles
+ path: /home/runner/work/oppia/oppia/build
+ - name: Report failure if failed on oppia/oppia develop branch
+ if: ${{ failure() && github.event_name == 'push' && github.repository == 'oppia/oppia' && github.ref == 'refs/heads/develop'}}
+ uses: ./.github/actions/send-webhook-notification
+ with:
+ message: "An E2E test failed on the upstream develop branch."
+ webhook-url: ${{ secrets.BUILD_FAILURE_ROOM_WEBHOOK_URL }}
diff --git a/.github/workflows/e2e_topic_tests.yml b/.github/workflows/e2e_topic_tests.yml
deleted file mode 100644
index b6c229b111b0..000000000000
--- a/.github/workflows/e2e_topic_tests.yml
+++ /dev/null
@@ -1,74 +0,0 @@
-name: End-to-End tests
-on:
- push:
- branches:
- - develop
- - release-*
- pull_request:
- branches:
- - develop
- - release-*
-
-jobs:
- e2e_topic_tests:
- runs-on: ${{ matrix.os }}
- strategy:
- matrix:
- os: [ubuntu-18.04]
- steps:
- - uses: actions/checkout@v2
- - uses: actions/setup-python@v2
- with:
- python-version: '3.7'
- architecture: 'x64'
- - uses: ./.github/actions/merge
- - name: Cache node modules
- uses: actions/cache@v2
- env:
- cache-name: cache-node-modules
- with:
- path: /home/runner/work/oppia/yarn_cache
- key: ${{ runner.os }}-build-${{ env.cache-name }}-${{ hashFiles('yarn.lock') }}
- restore-keys: |
- ${{ runner.os }}-build-${{ env.cache-name }}-
- ${{ runner.os }}-build-
- ${{ runner.os }}-
- - uses: ./.github/actions/install-oppia-dependencies
- - id: check-risk
- name: Check if PR is low-risk
- uses: ./.github/actions/check-if-pr-is-low-risk
- - name: Install chrome
- if: ${{ steps.check-risk.outputs.is-low-risk != 0 }}
- run: python -m scripts.install_chrome_for_ci
- - name: Install ffmpeg
- if: ${{ steps.check-risk.outputs.is-low-risk != 0 }}
- run: sudo apt install ffmpeg
- - name: Run Topics and Skills Dashboard E2E Test
- if: ${{ steps.check-risk.outputs.is-low-risk != 0 }}
- run: xvfb-run -a --server-args="-screen 0, 1285x1000x24" python -m scripts.run_e2e_tests --suite="topicsAndSkillsDashboard" --prod_env
- env:
- VIDEO_RECORDING_IS_ENABLED: 0
- - name: Run Topic and Story Editor E2E Test
- if: ${{ steps.check-risk.outputs.is-low-risk != 0 }}
- run: xvfb-run -a --server-args="-screen 0, 1285x1000x24" python -m scripts.run_e2e_tests --skip-build --skip-install --suite="topicAndStoryEditor" --prod_env
- env:
- VIDEO_RECORDING_IS_ENABLED: 0
- - name: Run Topic and Story Editor File Upload E2E Test
- if: ${{ steps.check-risk.outputs.is-low-risk != 0 }}
- run: xvfb-run -a --server-args="-screen 0, 1285x1000x24" python -m scripts.run_e2e_tests --skip-build --skip-install --suite="topicAndStoryEditorFileUploadFeatures" --prod_env
- env:
- VIDEO_RECORDING_IS_ENABLED: 0
- - name: Run Topic and Story Viewer E2E Test
- if: ${{ steps.check-risk.outputs.is-low-risk != 0 }}
- run: xvfb-run -a --server-args="-screen 0, 1285x1000x24" python -m scripts.run_e2e_tests --skip-build --skip-install --suite="topicAndStoryViewer" --prod_env
- env:
- VIDEO_RECORDING_IS_ENABLED: 0
- - name: Uploading protractor-video as Artifacts
- if: ${{ steps.check-risk.outputs.is-low-risk != 0 && always() }}
- uses: actions/upload-artifact@v2
- with:
- name: protractor-video
- path: /home/runner/work/oppia/protractor-video
- - name: Checking Memory Usage
- if: ${{ always() }}
- run: cat /sys/fs/cgroup/memory/memory.max_usage_in_bytes
diff --git a/.github/workflows/e2e_translation_classroom_and_core_features.yml b/.github/workflows/e2e_translation_classroom_and_core_features.yml
deleted file mode 100644
index 61333e95fa55..000000000000
--- a/.github/workflows/e2e_translation_classroom_and_core_features.yml
+++ /dev/null
@@ -1,69 +0,0 @@
-name: End-to-End tests
-on:
- push:
- branches:
- - develop
- - release-*
- pull_request:
- branches:
- - develop
- - release-*
-
-jobs:
- e2e_translation_classroom_and_core_features:
- runs-on: ${{ matrix.os }}
- strategy:
- matrix:
- os: [ubuntu-18.04]
- steps:
- - uses: actions/checkout@v2
- - uses: actions/setup-python@v2
- with:
- python-version: '3.7'
- architecture: 'x64'
- - uses: ./.github/actions/merge
- - name: Cache node modules
- uses: actions/cache@v2
- env:
- cache-name: cache-node-modules
- with:
- path: /home/runner/work/oppia/yarn_cache
- key: ${{ runner.os }}-build-${{ env.cache-name }}-${{ hashFiles('yarn.lock') }}
- restore-keys: |
- ${{ runner.os }}-build-${{ env.cache-name }}-
- ${{ runner.os }}-build-
- ${{ runner.os }}-
- - uses: ./.github/actions/install-oppia-dependencies
- - id: check-risk
- name: Check if PR is low-risk
- uses: ./.github/actions/check-if-pr-is-low-risk
- - name: Install chrome
- if: ${{ steps.check-risk.outputs.is-low-risk != 0 }}
- run: python -m scripts.install_chrome_for_ci
- - name: Install ffmpeg
- if: ${{ steps.check-risk.outputs.is-low-risk != 0 }}
- run: sudo apt install ffmpeg
- - name: Run Exploration Translation Tab E2E Test
- if: ${{ steps.check-risk.outputs.is-low-risk != 0 }}
- run: xvfb-run -a --server-args="-screen 0, 1285x1000x24" python -m scripts.run_e2e_tests --suite="explorationTranslationTab" --prod_env
- env:
- VIDEO_RECORDING_IS_ENABLED: 0
- - name: Run Classroom Page E2E Test
- if: ${{ steps.check-risk.outputs.is-low-risk != 0 }}
- run: xvfb-run -a --server-args="-screen 0, 1285x1000x24" python -m scripts.run_e2e_tests --skip-build --skip-install --suite="classroomPage" --prod_env
- env:
- VIDEO_RECORDING_IS_ENABLED: 0
- - name: Run Core Editor And Player E2E Test
- if: ${{ steps.check-risk.outputs.is-low-risk != 0 }}
- run: xvfb-run -a --server-args="-screen 0, 1285x1000x24" python -m scripts.run_e2e_tests --skip-build --skip-install --suite="coreEditorAndPlayerFeatures" --prod_env
- env:
- VIDEO_RECORDING_IS_ENABLED: 0
- - name: Uploading protractor-video as Artifacts
- if: ${{ steps.check-risk.outputs.is-low-risk != 0 && always() }}
- uses: actions/upload-artifact@v2
- with:
- name: protractor-video
- path: /home/runner/work/oppia/protractor-video
- - name: Checking Memory Usage
- if: ${{ always() }}
- run: cat /sys/fs/cgroup/memory/memory.max_usage_in_bytes
diff --git a/.github/workflows/e2e_user_features_and_library.yml b/.github/workflows/e2e_user_features_and_library.yml
deleted file mode 100644
index 11ad0a59ab2b..000000000000
--- a/.github/workflows/e2e_user_features_and_library.yml
+++ /dev/null
@@ -1,74 +0,0 @@
-name: End-to-End tests
-on:
- push:
- branches:
- - develop
- - release-*
- pull_request:
- branches:
- - develop
- - release-*
-
-jobs:
- e2e_user_features_and_library:
- runs-on: ${{ matrix.os }}
- strategy:
- matrix:
- os: [ubuntu-18.04]
- steps:
- - uses: actions/checkout@v2
- - uses: actions/setup-python@v2
- with:
- python-version: '3.7'
- architecture: 'x64'
- - uses: ./.github/actions/merge
- - name: Cache node modules
- uses: actions/cache@v2
- env:
- cache-name: cache-node-modules
- with:
- path: /home/runner/work/oppia/yarn_cache
- key: ${{ runner.os }}-build-${{ env.cache-name }}-${{ hashFiles('yarn.lock') }}
- restore-keys: |
- ${{ runner.os }}-build-${{ env.cache-name }}-
- ${{ runner.os }}-build-
- ${{ runner.os }}-
- - uses: ./.github/actions/install-oppia-dependencies
- - id: check-risk
- name: Check if PR is low-risk
- uses: ./.github/actions/check-if-pr-is-low-risk
- - name: Install chrome
- if: ${{ steps.check-risk.outputs.is-low-risk != 0 }}
- run: python -m scripts.install_chrome_for_ci
- - name: Install ffmpeg
- if: ${{ steps.check-risk.outputs.is-low-risk != 0 }}
- run: sudo apt install ffmpeg
- - name: Run Library E2E Test
- if: ${{ steps.check-risk.outputs.is-low-risk != 0 }}
- run: xvfb-run -a --server-args="-screen 0, 1285x1000x24" python -m scripts.run_e2e_tests --suite="library" --prod_env
- env:
- VIDEO_RECORDING_IS_ENABLED: 0
- - name: Run e2e preferences test
- if: ${{ steps.check-risk.outputs.is-low-risk != 0 }}
- run: xvfb-run -a --server-args="-screen 0, 1285x1000x24" python -m scripts.run_e2e_tests --skip-install --skip-build --suite="preferences" --prod_env
- env:
- VIDEO_RECORDING_IS_ENABLED: 0
- - name: Run e2e subscriptions test
- if: ${{ steps.check-risk.outputs.is-low-risk != 0 }}
- run: xvfb-run -a --server-args="-screen 0, 1285x1000x24" python -m scripts.run_e2e_tests --skip-install --skip-build --suite="subscriptions" --prod_env
- env:
- VIDEO_RECORDING_IS_ENABLED: 0
- - name: Run e2e wipeout test
- if: ${{ steps.check-risk.outputs.is-low-risk != 0 }}
- run: xvfb-run -a --server-args="-screen 0, 1285x1000x24" python -m scripts.run_e2e_tests --skip-install --skip-build --suite="wipeout" --prod_env
- env:
- VIDEO_RECORDING_IS_ENABLED: 0
- - name: Uploading protractor-video as Artifacts
- if: ${{ steps.check-risk.outputs.is-low-risk != 0 && always() }}
- uses: actions/upload-artifact@v2
- with:
- name: protractor-video
- path: /home/runner/work/oppia/protractor-video
- - name: Checking Memory Usage
- if: ${{ always() }}
- run: cat /sys/fs/cgroup/memory/memory.max_usage_in_bytes
diff --git a/.github/workflows/e2e_user_profile.yml b/.github/workflows/e2e_user_profile.yml
deleted file mode 100644
index 72889baddf63..000000000000
--- a/.github/workflows/e2e_user_profile.yml
+++ /dev/null
@@ -1,69 +0,0 @@
-name: End-to-End tests
-on:
- push:
- branches:
- - develop
- - release-*
- pull_request:
- branches:
- - develop
- - release-*
-
-jobs:
- e2e_user_profile:
- runs-on: ${{ matrix.os }}
- strategy:
- matrix:
- os: [ubuntu-18.04]
- steps:
- - uses: actions/checkout@v2
- - uses: actions/setup-python@v2
- with:
- python-version: '3.7'
- architecture: 'x64'
- - uses: ./.github/actions/merge
- - name: Cache node modules
- uses: actions/cache@v2
- env:
- cache-name: cache-node-modules
- with:
- path: /home/runner/work/oppia/yarn_cache
- key: ${{ runner.os }}-build-${{ env.cache-name }}-${{ hashFiles('yarn.lock') }}
- restore-keys: |
- ${{ runner.os }}-build-${{ env.cache-name }}-
- ${{ runner.os }}-build-
- ${{ runner.os }}-
- - uses: ./.github/actions/install-oppia-dependencies
- - id: check-risk
- name: Check if PR is low-risk
- uses: ./.github/actions/check-if-pr-is-low-risk
- - name: Install chrome
- if: ${{ steps.check-risk.outputs.is-low-risk != 0 }}
- run: python -m scripts.install_chrome_for_ci
- - name: Install ffmpeg
- if: ${{ steps.check-risk.outputs.is-low-risk != 0 }}
- run: sudo apt install ffmpeg
- - name: Run e2e users test
- if: ${{ steps.check-risk.outputs.is-low-risk != 0 }}
- run: xvfb-run -a --server-args="-screen 0, 1285x1000x24" python -m scripts.run_e2e_tests --suite="users" --prod_env
- env:
- VIDEO_RECORDING_IS_ENABLED: 0
- - name: Run e2e profileMenu test
- if: ${{ steps.check-risk.outputs.is-low-risk != 0 }}
- run: xvfb-run -a --server-args="-screen 0, 1285x1000x24" python -m scripts.run_e2e_tests --skip-install --skip-build --suite="profileMenu" --prod_env
- env:
- VIDEO_RECORDING_IS_ENABLED: 0
- - name: Run e2e profileFeatures test
- if: ${{ steps.check-risk.outputs.is-low-risk != 0 }}
- run: xvfb-run -a --server-args="-screen 0, 1285x1000x24" python -m scripts.run_e2e_tests --skip-install --skip-build --suite="profileFeatures" --prod_env
- env:
- VIDEO_RECORDING_IS_ENABLED: 0
- - name: Uploading protractor-video as Artifacts
- if: ${{ steps.check-risk.outputs.is-low-risk != 0 && always() }}
- uses: actions/upload-artifact@v2
- with:
- name: protractor-video
- path: /home/runner/work/oppia/protractor-video
- - name: Checking Memory Usage
- if: ${{ always() }}
- run: cat /sys/fs/cgroup/memory/memory.max_usage_in_bytes
diff --git a/.github/workflows/eslint_tests.yml b/.github/workflows/eslint_tests.yml
index 036b5fae5ffe..9c5bffd95aac 100644
--- a/.github/workflows/eslint_tests.yml
+++ b/.github/workflows/eslint_tests.yml
@@ -15,21 +15,23 @@ jobs:
runs-on: ${{ matrix.os }}
strategy:
matrix:
- os: [ubuntu-18.04]
+ os: [ubuntu-22.04]
steps:
- - uses: actions/checkout@v2
- - uses: actions/setup-python@v2
+ - uses: actions/checkout@v3
+ - uses: actions/setup-python@v3
with:
- python-version: '3.7'
+ python-version: '3.8.15'
architecture: 'x64'
- uses: ./.github/actions/merge
- - name: Cache node modules
- uses: actions/cache@v2
+ - name: Cache node modules and third_party/static
+ uses: actions/cache@v3
env:
cache-name: cache-node-modules
with:
- path: /home/runner/work/oppia/yarn_cache
- key: ${{ runner.os }}-build-${{ env.cache-name }}-${{ hashFiles('yarn.lock') }}
+ path: |
+ /home/runner/work/oppia/yarn_cache
+ /home/runner/work/oppia/oppia/third_party/static
+ key: ${{ runner.os }}-build-${{ env.cache-name }}-${{ hashFiles('yarn.lock', 'dependencies.json') }}
restore-keys: |
${{ runner.os }}-build-${{ env.cache-name }}-
${{ runner.os }}-build-
@@ -38,3 +40,9 @@ jobs:
- name: Run ESLint Tests
if: startsWith(github.head_ref, 'update-changelog-for-release') == false
run: PYTHONIOENCODING=utf-8 python -m scripts.run_custom_eslint_tests
+ - name: Report failure if failed on oppia/oppia develop branch
+ if: ${{ failure() && github.event_name == 'push' && github.repository == 'oppia/oppia' && github.ref == 'refs/heads/develop'}}
+ uses: ./.github/actions/send-webhook-notification
+ with:
+ message: "ESLint checks failed on the upstream develop branch."
+ webhook-url: ${{ secrets.BUILD_FAILURE_ROOM_WEBHOOK_URL }}
diff --git a/.github/workflows/frontend_tests.yml b/.github/workflows/frontend_tests.yml
index e8a066a92a45..1408fd3205f2 100644
--- a/.github/workflows/frontend_tests.yml
+++ b/.github/workflows/frontend_tests.yml
@@ -10,25 +10,57 @@ on:
- release-*
jobs:
- frontend:
+ generate-job-strategy-matrix:
+ runs-on: ubuntu-22.04
+ outputs:
+ job-strategy-matrix: ${{ steps.generate.outputs.job-strategy-matrix }}
+ steps:
+ - name: Generate job strategy matrix
+ id: generate
+ env:
+ standard-test-runs: 2
+ flakes-test-runs: 40
+ run: |
+ if ${{ github.event_name == 'push' && github.repository == 'oppia/oppia' && github.ref == 'refs/heads/develop'}}
+ then
+ JOB_STRATEGY_MATRIX=$(node -e "let r=[]; for(let i = 1; i <= ${{ env.flakes-test-runs }}; i++) { r.push(i) }; console.log(JSON.stringify(r));")
+ echo "::set-output name=job-strategy-matrix::$JOB_STRATEGY_MATRIX"
+ else
+ JOB_STRATEGY_MATRIX=$(node -e "let r=[]; for(let i = 1; i <= ${{ env.standard-test-runs }}; i++) { r.push(i) }; console.log(JSON.stringify(r));")
+ echo "::set-output name=job-strategy-matrix::$JOB_STRATEGY_MATRIX"
+ fi
+ frontend-karma-tests:
+ needs: generate-job-strategy-matrix
runs-on: ${{ matrix.os }}
strategy:
+ max-parallel: 25
matrix:
- os: [ubuntu-18.04]
+ os: [ubuntu-22.04]
+ num_runs: ${{ fromJson(needs.generate-job-strategy-matrix.outputs.job-strategy-matrix) }}
+ fail-fast: false
steps:
- - uses: actions/checkout@v2
- - uses: actions/setup-python@v2
+ - uses: actions/checkout@v3
+ - name: Describe filesystem
+ run: |
+ pwd
+ ls /home/runner/work
+ ls /home/runner/work/oppia
+ ls /home/runner/work/oppia/oppia
+ echo $GITHUB_WORKSPACE
+ - uses: actions/setup-python@v3
with:
- python-version: '3.7'
+ python-version: '3.8.15'
architecture: 'x64'
- uses: ./.github/actions/merge
- - name: Cache node modules
- uses: actions/cache@v2
+ - name: Cache node modules and third_party/static
+ uses: actions/cache@v3
env:
cache-name: cache-node-modules
with:
- path: /home/runner/work/oppia/yarn_cache
- key: ${{ runner.os }}-build-${{ env.cache-name }}-${{ hashFiles('yarn.lock') }}
+ path: |
+ /home/runner/work/oppia/yarn_cache
+ /home/runner/work/oppia/oppia/third_party/static
+ key: ${{ runner.os }}-build-${{ env.cache-name }}-${{ hashFiles('yarn.lock', 'dependencies.json') }}
restore-keys: |
${{ runner.os }}-build-${{ env.cache-name }}-
${{ runner.os }}-build-
@@ -36,10 +68,21 @@ jobs:
- uses: ./.github/actions/install-oppia-dependencies
- name: Suppress ENOSPC error from chokidar file watcher. See https://stackoverflow.com/a/32600959.
run: echo fs.inotify.max_user_watches=524288 | sudo tee -a /etc/sysctl.conf && sudo sysctl -p
- - name: Run frontend tests
+ - name: Run frontend tests ${{ matrix.num_runs }}
run: PYTHONIOENCODING=utf-8 python -m scripts.run_frontend_tests --run_minified_tests --skip_install --check_coverage
+ - name: Uploading fronted coverage reports as an artifact
+ if: ${{ failure() }}
+ uses: actions/upload-artifact@v3
+ with:
+ name: frontend-coverage-${{ matrix.num_runs }}
+ path: /home/runner/work/oppia/karma_coverage_reports
+ report-failure:
+ needs: frontend-karma-tests
+ runs-on: ubuntu-22.04
+ if: ${{ failure() && github.event_name == 'push' && github.repository == 'oppia/oppia' && github.ref == 'refs/heads/develop'}}
+ steps:
+ - uses: actions/checkout@v3
- name: Report failure if failed on oppia/oppia develop branch
- if: ${{ failure() && github.event_name == 'push' && github.repository == 'oppia/oppia' && github.ref == 'refs/heads/develop'}}
uses: ./.github/actions/send-webhook-notification
with:
message: "A frontend test failed on the upstream develop branch."
diff --git a/.github/workflows/lighthouse_accessibility.yml b/.github/workflows/lighthouse_accessibility.yml
index f3d771dd9a42..73b0e73ded47 100644
--- a/.github/workflows/lighthouse_accessibility.yml
+++ b/.github/workflows/lighthouse_accessibility.yml
@@ -14,30 +14,58 @@ jobs:
runs-on: ${{ matrix.os }}
strategy:
matrix:
- os: [ubuntu-18.04]
+ os: [ubuntu-22.04]
shard: [1, 2]
steps:
- - uses: actions/checkout@v2
- - uses: actions/setup-python@v1
+ - uses: actions/checkout@v3
+ - uses: actions/setup-python@v3
with:
- python-version: '3.7'
+ python-version: '3.8.15'
architecture: 'x64'
- uses: ./.github/actions/merge
- - name: Cache node modules
- uses: actions/cache@v2
- env:
- cache-name: cache-node-modules
- with:
- path: /home/runner/work/oppia/yarn_cache
- key: ${{ runner.os }}-build-${{ env.cache-name }}-${{ hashFiles('yarn.lock') }}
- restore-keys: |
- ${{ runner.os }}-build-${{ env.cache-name }}-
- ${{ runner.os }}-build-
- ${{ runner.os }}-
+ # Caching is disabled to avoid poisoning our cache with the
+ # changed lighthouse file.
+ #
+ # - name: Cache node modules
+ # uses: actions/cache@v3
+ # env:
+ # cache-name: cache-node-modules
+ # with:
+ # path: /home/runner/work/oppia/yarn_cache
+ # key: ${{ runner.os }}-build-${{ env.cache-name }}-${{ hashFiles('yarn.lock') }}
+ # restore-keys: |
+ # ${{ runner.os }}-build-${{ env.cache-name }}-
+ # ${{ runner.os }}-build-
+ # ${{ runner.os }}-
- uses: ./.github/actions/install-oppia-dependencies
+ - run: |
+ # Replace the 1.5 second timeout in lighthouse for retrieving
+ # sourcemaps with a 10 second timeout. This timeout is not
+ # configurable through Lighthouse's exposed API, so we have
+ # resorted to patching the code instead.
+ set -e
+ FILEPATH=$GITHUB_WORKSPACE/node_modules/lighthouse/lighthouse-core/gather/gatherers/source-maps.js
+ SEARCH_TARGET="1500"
+ REPLACEMENT="10000"
+ occurrences=$(grep -c $SEARCH_TARGET $FILEPATH)
+ echo "Found $occurrences occurrences of '$SEARCH_TARGET'"
+ # Assert that there is only one match for the target string.
+ # If there are ever zero or multiple matches, the lighthouse
+ # code has changed and this logic needs to be reviewed.
+ [[ $occurrences == "1" ]]
+ # Replace the target string with the replacement string.
+ sed -i 's/$SEARCH_TARGET/$REPLACEMENT/' $FILEPATH
+ echo "Replaced '$SEARCH_TARGET' with '$REPLACEMENT' in $FILEPATH"
+ shell: bash
- name: Install chrome
if: startsWith(github.head_ref, 'update-changelog-for-release') == false
run: python -m scripts.install_chrome_for_ci
- name: Run Lighthouse accessibility checks shard
if: startsWith(github.head_ref, 'update-changelog-for-release') == false
run: python -m scripts.run_lighthouse_tests --mode accessibility --shard ${{ matrix.shard }}
+ - name: Report failure if failed on oppia/oppia develop branch
+ if: ${{ failure() && github.event_name == 'push' && github.repository == 'oppia/oppia' && github.ref == 'refs/heads/develop'}}
+ uses: ./.github/actions/send-webhook-notification
+ with:
+ message: "A Lighthouse test failed on the upstream develop branch."
+ webhook-url: ${{ secrets.BUILD_FAILURE_ROOM_WEBHOOK_URL }}
diff --git a/.github/workflows/lighthouse_performance.yml b/.github/workflows/lighthouse_performance.yml
index 262d4d260daa..1d3203c204c0 100644
--- a/.github/workflows/lighthouse_performance.yml
+++ b/.github/workflows/lighthouse_performance.yml
@@ -14,17 +14,17 @@ jobs:
runs-on: ${{ matrix.os }}
strategy:
matrix:
- os: [ubuntu-18.04]
+ os: [ubuntu-22.04]
shard: [1, 2]
steps:
- - uses: actions/checkout@v2
- - uses: actions/setup-python@v1
+ - uses: actions/checkout@v3
+ - uses: actions/setup-python@v3
with:
- python-version: '3.7'
+ python-version: '3.8.15'
architecture: 'x64'
- uses: ./.github/actions/merge
- name: Cache node modules
- uses: actions/cache@v2
+ uses: actions/cache@v3
env:
cache-name: cache-node-modules
with:
@@ -41,3 +41,9 @@ jobs:
- name: Run Lighthouse performance checks shard
if: startsWith(github.head_ref, 'update-changelog-for-release') == false
run: python -m scripts.run_lighthouse_tests --mode performance --shard ${{ matrix.shard }}
+ - name: Report failure if failed on oppia/oppia develop branch
+ if: ${{ failure() && github.event_name == 'push' && github.repository == 'oppia/oppia' && github.ref == 'refs/heads/develop'}}
+ uses: ./.github/actions/send-webhook-notification
+ with:
+ message: "A Lighthouse test failed on the upstream develop branch."
+ webhook-url: ${{ secrets.BUILD_FAILURE_ROOM_WEBHOOK_URL }}
diff --git a/.github/workflows/lint.yml b/.github/workflows/lint.yml
index 899adf9e5904..7ca30d7b04c9 100644
--- a/.github/workflows/lint.yml
+++ b/.github/workflows/lint.yml
@@ -14,22 +14,30 @@ jobs:
runs-on: ${{ matrix.os }}
strategy:
matrix:
- os: [ubuntu-18.04]
- shard: ['1', 'other']
+ os: [ubuntu-22.04]
+ shard: ['other']
steps:
- - uses: actions/checkout@v2
- - uses: actions/setup-python@v2
+ - uses: actions/checkout@v3
+ - uses: actions/setup-python@v3
with:
- python-version: '3.7'
+ python-version: '3.8.15'
architecture: 'x64'
+ cache: 'pip'
+ cache-dependency-path: |
+ requirements.in
+ requirements.txt
+ requirements_dev.in
+ requirements_dev.txt
- uses: ./.github/actions/merge
- - name: Cache node modules
- uses: actions/cache@v2
+ - name: Cache node modules and third_party/static
+ uses: actions/cache@v3
env:
cache-name: cache-node-modules
with:
- path: /home/runner/work/oppia/yarn_cache
- key: ${{ runner.os }}-build-${{ env.cache-name }}-${{ hashFiles('yarn.lock') }}
+ path: |
+ /home/runner/work/oppia/yarn_cache
+ /home/runner/work/oppia/oppia/third_party/static
+ key: ${{ runner.os }}-build-${{ env.cache-name }}-${{ hashFiles('yarn.lock', 'dependencies.json') }}
restore-keys: |
${{ runner.os }}-build-${{ env.cache-name }}-
${{ runner.os }}-build-
@@ -41,3 +49,9 @@ jobs:
- name: Run Lint Checks
if: startsWith(github.head_ref, 'update-changelog-for-release') == false
run: PYTHONIOENCODING=utf-8 python -m scripts.linters.pre_commit_linter --shard ${{ matrix.shard }} --verbose
+ - name: Report failure if failed on oppia/oppia develop branch
+ if: ${{ failure() && github.event_name == 'push' && github.repository == 'oppia/oppia' && github.ref == 'refs/heads/develop'}}
+ uses: ./.github/actions/send-webhook-notification
+ with:
+ message: "Lint checks failed on the upstream develop branch."
+ webhook-url: ${{ secrets.BUILD_FAILURE_ROOM_WEBHOOK_URL }}
diff --git a/.github/workflows/oppiabot.yml b/.github/workflows/oppiabot.yml
index 48745bf96595..cf5e488dcfae 100644
--- a/.github/workflows/oppiabot.yml
+++ b/.github/workflows/oppiabot.yml
@@ -13,7 +13,7 @@ jobs:
oppiabot:
runs-on: ubuntu-latest
steps:
- - uses: actions/checkout@v2
+ - uses: actions/checkout@v3
- uses: ./.github/actions/merge
- name: Github Actions from Oppiabot
uses: oppia/oppiabot@1.4.0
diff --git a/.github/workflows/pending-review-notification.yml b/.github/workflows/pending-review-notification.yml
index 142fd633723f..91e437b94f69 100644
--- a/.github/workflows/pending-review-notification.yml
+++ b/.github/workflows/pending-review-notification.yml
@@ -1,8 +1,8 @@
name: Send pending review notifications to reviewer on github-discussion
on:
schedule:
- # Every Tuesday and Thursday at 00:00 UTC.
- - cron: '0 0 * * 2,5'
+ # Every Tuesday and Thursday at 16:00 UTC.
+ - cron: '0 16 * * 2,4'
# GitHub doesn't provide assurance that the scheduled jobs will run on time
# (see https://github.community/t/no-assurance-on-scheduled-jobs/133753).
# So, we add the workflow_dispatch event here to allow triggering this
@@ -15,12 +15,12 @@ jobs:
runs-on: ${{ matrix.os }}
strategy:
matrix:
- os: [ubuntu-18.04]
+ os: [ubuntu-22.04]
steps:
- - uses: actions/checkout@v2
- - uses: actions/setup-python@v2
+ - uses: actions/checkout@v3
+ - uses: actions/setup-python@v3
with:
- python-version: '3.7'
+ python-version: '3.8.15'
architecture: 'x64'
- uses: DubeySandeep/pending-review-notification@v1
with:
diff --git a/.github/workflows/python_type_checks.yml b/.github/workflows/python_type_checks.yml
index be3d0e702ad0..d7a863a31029 100644
--- a/.github/workflows/python_type_checks.yml
+++ b/.github/workflows/python_type_checks.yml
@@ -15,13 +15,17 @@ jobs:
runs-on: ${{ matrix.os }}
strategy:
matrix:
- os: [ubuntu-18.04]
+ os: [ubuntu-22.04]
steps:
- - uses: actions/checkout@v2
- - uses: actions/setup-python@v2
+ - uses: actions/checkout@v3
+ - uses: actions/setup-python@v3
with:
- python-version: '3.7'
+ python-version: '3.8.15'
architecture: 'x64'
+ - name: Install python 2 for GAE
+ run: |
+ sudo apt update
+ sudo apt install python2 -y
- uses: ./.github/actions/merge
- name: Install Third Party Dependencies
if: startsWith(github.head_ref, 'update-changelog-for-release') == false
@@ -29,3 +33,9 @@ jobs:
- name: Run Mypy type checks
if: startsWith(github.head_ref, 'update-changelog-for-release') == false
run: PYTHONIOENCODING=utf-8 python -m scripts.run_mypy_checks --skip-install --install-globally
+ - name: Report failure if failed on oppia/oppia develop branch
+ if: ${{ failure() && github.event_name == 'push' && github.repository == 'oppia/oppia' && github.ref == 'refs/heads/develop'}}
+ uses: ./.github/actions/send-webhook-notification
+ with:
+ message: "Python type checks failed on the upstream develop branch."
+ webhook-url: ${{ secrets.BUILD_FAILURE_ROOM_WEBHOOK_URL }}
diff --git a/.github/workflows/revert-web-wiki-updates.yml b/.github/workflows/revert-web-wiki-updates.yml
new file mode 100644
index 000000000000..81a08c81eaee
--- /dev/null
+++ b/.github/workflows/revert-web-wiki-updates.yml
@@ -0,0 +1,46 @@
+name: Revert Wiki Changes Made Through the Web Interface
+on:
+ gollum
+
+jobs:
+ revert:
+ runs-on: ubuntu-22.04
+ steps:
+ - name: Retrieve authentication token
+ id: get-token
+ # SHA1 hash of the release-v0.0.1 commit.
+ uses: oppia/get-github-app-token@8c3b19db0cdcd0f7fded7dd71e5e0429bf72df1a
+ with:
+ app_id: ${{ secrets.OPPIA_WIKI_SYNCHRONIZER_APP_ID }}
+ private_key: ${{ secrets.OPPIA_WIKI_SYNCHRONIZER_APP_PRIVATE_KEY }}
+ - uses: actions/checkout@v3
+ with:
+ repository: ${{github.repository_owner}}/oppia.wiki
+ token: ${{ steps.get-token.outputs.token }}
+ fetch-depth: 0
+ - name: Add remote
+ run: git remote add source https://github.com/${{github.repository_owner}}/oppia-web-developer-docs.git
+ - name: Fetch remote
+ run: git fetch source
+ - name: Check for differences
+ id: check-diff
+ run: echo "::set-output name=diff::$(git log source/develop..origin/master)"
+ - name: Revert commits
+ if: ${{ steps.check-diff.outputs.diff != '' }}
+ run: |
+ git config user.name oppia-wiki-synchronizer[bot]
+ # Email has the form id+name@users.noreply.github.com. The ID
+ # can be retrieved from
+ # https://api.github.com/users/oppia-wiki-synchronizer[bot].
+ git config user.email 102317631+oppia-wiki-synchronizer[bot]@users.noreply.github.com
+ git revert --no-commit source/develop..origin/master
+ msg_file=$(mktemp)
+ echo "Reverting the following changes made through the web interface:\n" > $msg_file
+ git log soure/develop..origin/master | while read line; do echo " ${line}"; done >> $msg_file
+ git commit -F $msg_file
+ - name: Push to deployment repository
+ if: ${{ steps.check-diff.outputs.diff != '' }}
+ run: git push source master:develop
+ - name: Push to source repository
+ if: ${{ steps.check-diff.outputs.diff != '' }}
+ run: git push
diff --git a/.github/workflows/typescript_and_e2e_coverage.yml b/.github/workflows/typescript_and_e2e_coverage.yml
new file mode 100644
index 000000000000..2d5585c8c165
--- /dev/null
+++ b/.github/workflows/typescript_and_e2e_coverage.yml
@@ -0,0 +1,52 @@
+name: End-to-End coverage and Typescript test
+on:
+ push:
+ branches:
+ - develop
+ - release-*
+ pull_request:
+ branches:
+ - develop
+ - release-*
+
+jobs:
+ e2e_coverage_and_typescript_tests:
+ runs-on: ${{ matrix.os }}
+ strategy:
+ matrix:
+ os: [ubuntu-22.04]
+ steps:
+ - uses: actions/checkout@v3
+ - uses: actions/setup-python@v3
+ with:
+ python-version: '3.8.15'
+ architecture: 'x64'
+ - uses: ./.github/actions/merge
+ - name: Cache node modules and third_party/static
+ uses: actions/cache@v3
+ env:
+ cache-name: cache-node-modules
+ with:
+ path: |
+ /home/runner/work/oppia/yarn_cache
+ /home/runner/work/oppia/oppia/third_party/static
+ key: ${{ runner.os }}-build-${{ env.cache-name }}-${{ hashFiles('yarn.lock', 'dependencies.json') }}
+ restore-keys: |
+ ${{ runner.os }}-build-${{ env.cache-name }}-
+ ${{ runner.os }}-build-
+ ${{ runner.os }}-
+ - uses: ./.github/actions/install-oppia-dependencies
+ - name: Install chrome
+ run: python -m scripts.install_chrome_for_ci
+ - name: Check that all e2e test files are captured in wdio.conf.js
+ run: python -m scripts.check_e2e_tests_are_captured_in_ci
+ - name: Run typescript tests
+ run: python -m scripts.typescript_checks
+ - name: Run typescript tests in strict mode
+ run: python -m scripts.typescript_checks --strict_checks
+ - name: Report failure if failed on oppia/oppia develop branch
+ if: ${{ failure() && github.event_name == 'push' && github.repository == 'oppia/oppia' && github.ref == 'refs/heads/develop'}}
+ uses: ./.github/actions/send-webhook-notification
+ with:
+ message: "A typescript test failed on the upstream develop branch."
+ webhook-url: ${{ secrets.BUILD_FAILURE_ROOM_WEBHOOK_URL }}
diff --git a/.gitignore b/.gitignore
index 7e08b7a96f79..9e67b269c21d 100644
--- a/.gitignore
+++ b/.gitignore
@@ -22,6 +22,10 @@ core/templates/prod/*
webpack_bundles/*
core/tests/.browserstack.env
node_modules/*
+# .angular is temp folder used by angular to put logs and other artefacts.
+.angular/*
+# dist is our angular build folder output.
+dist/*
.coverage*
!.coveragerc
coverage.xml
@@ -48,6 +52,8 @@ yarn-error.log
.lighthouseci
.direnv/*
.envrc
+portserver.socket
+temp-tsconfig-strict.json
# Oppia uses cache slugs for various resources and we need separate resource
# directories for dev and prod. Resource directories for prod are generated
@@ -63,4 +69,3 @@ dump.rdb
ui-debug.log
firebase-debug.log
debug.log
-.python-version
diff --git a/.isort.cfg b/.isort.cfg
index 6997ecbad861..3c04d0e79abe 100644
--- a/.isort.cfg
+++ b/.isort.cfg
@@ -1,6 +1,6 @@
[settings]
force_single_line=true
-single_line_exclusions=typing
+single_line_exclusions=typing,typing_extensions
force_sort_within_sections=true
ignore_whitespace=true
known_third_party=apache_beam,backports.functools_lru_cache,browsermobproxy,cloudstorage,contextlib2,elasticsearch,firebase_admin,google.api_core,google.appengine,google.cloud,google.protobuf,mapreduce,mock,mutagen,pipeline,pkg_resources,psutil,pylatexenc,pylint,requests,requests_mock,selenium,six,skulpt,typing,webapp2,webapp2_extras,webtest,yaml
diff --git a/.lighthouserc-1.js b/.lighthouserc-1.js
index 85c7c349ba7c..3be1863c499c 100644
--- a/.lighthouserc-1.js
+++ b/.lighthouserc-1.js
@@ -38,7 +38,7 @@ module.exports = {
},
{
'matchingUrlPattern': '^http://127.0.0.1:8181/blog-dashboard$',
- 'assertions': baseConfig['baseAccessibilityAssertions']
+ 'assertions': baseConfig['basePerformanceAssertions']
},
{
'matchingUrlPattern': 'http://[^/]+/about$',
@@ -77,12 +77,15 @@ module.exports = {
'assertions': {
// The YouTube embed on donate page loads images in jpg format, thus
// we need to allow one image.
- 'uses-webp-images': [
+ 'modern-image-formats': [
'error', {'maxLength': 1, 'strategy': 'pessimistic'}
],
// The YouTube embed on donate page uses passive listeners.
'uses-passive-event-listeners': ['error', {'minScore': 0}],
- 'deprecations': ['error', {'minScore': 1}]
+ 'uses-rel-preload': ['error', {'minScore': 1}],
+ 'deprecations': ['error', {'minScore': 1}],
+ 'redirects': ['error', {'minScore': 1}],
+ 'uses-responsive-images': ['error', {'minScore': 0.8}]
}
},
{
diff --git a/.lighthouserc-2.js b/.lighthouserc-2.js
index 6a0cddeac71c..089f028fb8c3 100644
--- a/.lighthouserc-2.js
+++ b/.lighthouserc-2.js
@@ -33,17 +33,18 @@ module.exports = {
{
'matchingUrlPattern': 'http://[^/]+/learner-dashboard$',
'assertions': {
- 'uses-webp-images': [
+ 'modern-image-formats': [
'error', {'maxLength': 0, 'strategy': 'pessimistic'}
],
// We need to use passive event listeners on this page so that
// the page works correctly.
'uses-passive-event-listeners': ['error', {'minScore': 0}],
- // Sign up redirects logged in user to learner dashboard page.
+ // Sign up redirects logged-in user to learner dashboard page.
// Learner dashboard Page cannot be preloaded.
'uses-rel-preload': ['error', {'minScore': 0}],
'deprecations': ['error', {'minScore': 1}],
- 'redirects': ['error', {'minScore': 0}]
+ 'redirects': ['error', {'minScore': 0}],
+ 'uses-responsive-images': ['error', {'minScore': 0.8}]
}
},
{
@@ -86,14 +87,17 @@ module.exports = {
'matchingUrlPattern': 'http://[^/]+/create/.*$',
'assertions': {
// TODO(#13465): Change this maxLength to 0 once images are migrated.
- 'uses-webp-images': [
+ 'modern-image-formats': [
'error', {'maxLength': 3, 'strategy': 'pessimistic'}
],
// We need to use passive event listeners on this page so that
// the page works correctly.
'uses-passive-event-listeners': ['error', {'minScore': 0}],
// MIDI library uses some deprecated API.
- 'deprecations': ['error', {'minScore': 0}]
+ 'deprecations': ['error', {'minScore': 0}],
+ 'uses-rel-preload': ['error', {'minScore': 1}],
+ 'redirects': ['error', {'minScore': 1}],
+ 'uses-responsive-images': ['error', {'minScore': 1}]
}
},
{
diff --git a/.lighthouserc-accessibility-1.js b/.lighthouserc-accessibility-1.js
index c91a1bc03599..7ae1cfb3b82c 100644
--- a/.lighthouserc-accessibility-1.js
+++ b/.lighthouserc-accessibility-1.js
@@ -33,7 +33,9 @@ module.exports = {
},
{
'matchingUrlPattern': '^http://127.0.0.1:8181/about$',
- 'assertions': baseConfig['baseAccessibilityAssertions']
+ 'assertions': {
+ 'categories:accessibility': ['error', {'minScore': 0.98}]
+ }
},
{
'matchingUrlPattern': '^http://127.0.0.1:8181/admin$',
@@ -41,28 +43,38 @@ module.exports = {
},
{
'matchingUrlPattern': '^http://127.0.0.1:8181/blog-dashboard$',
- 'assertions': baseConfig['baseAccessibilityAssertions']
+ 'assertions': {
+ 'categories:accessibility': ['error', {'minScore': 0.98}]
+ }
},
{
'matchingUrlPattern': '^http://127.0.0.1:8181/community-library$',
- 'assertions': baseConfig['baseAccessibilityAssertions']
+ 'assertions': {
+ 'categories:accessibility': ['error', {'minScore': 0.98}]
+ }
},
{
'matchingUrlPattern': '^http://127.0.0.1:8181/contact$',
- 'assertions': baseConfig['baseAccessibilityAssertions']
+ 'assertions': {
+ 'categories:accessibility': ['error', {'minScore': 0.98}]
+ }
},
{
'matchingUrlPattern': '^http://127.0.0.1:8181/contributor-dashboard$',
- 'assertions': baseConfig['baseAccessibilityAssertions']
+ 'assertions': {
+ 'categories:accessibility': ['error', {'minScore': 0.98}]
+ }
},
{
'matchingUrlPattern': '^http://127.0.0.1:8181/creator-dashboard$',
- 'assertions': baseConfig['baseAccessibilityAssertions']
+ 'assertions': {
+ 'categories:accessibility': ['error', {'minScore': 0.98}]
+ }
},
{
'matchingUrlPattern': '^http://127.0.0.1:8181/delete-account$',
'assertions': {
- 'categories:accessibility': ['error', {'minScore': 0.99}]
+ 'categories:accessibility': ['error', {'minScore': 0.98}]
}
},
{
@@ -77,15 +89,21 @@ module.exports = {
},
{
'matchingUrlPattern': '^http://127.0.0.1:8181/get-started$',
- 'assertions': baseConfig['baseAccessibilityAssertions']
+ 'assertions': {
+ 'categories:accessibility': ['error', {'minScore': 0.98}]
+ }
},
{
'matchingUrlPattern': '^http://127.0.0.1:8181/learner-dashboard$',
- 'assertions': baseConfig['baseAccessibilityAssertions']
+ 'assertions': {
+ 'categories:accessibility': ['error', {'minScore': 0.98}]
+ }
},
{
'matchingUrlPattern': '^http://127.0.0.1:8181/moderator$',
- 'assertions': baseConfig['baseAccessibilityAssertions']
+ 'assertions': {
+ 'categories:accessibility': ['error', {'minScore': 0.98}]
+ }
}
]
},
diff --git a/.lighthouserc-accessibility-2.js b/.lighthouserc-accessibility-2.js
index e678bfcd8d3a..166e12202b50 100644
--- a/.lighthouserc-accessibility-2.js
+++ b/.lighthouserc-accessibility-2.js
@@ -35,11 +35,15 @@ module.exports = {
},
{
'matchingUrlPattern': '^http://127.0.0.1:8181/privacy-policy$',
- 'assertions': baseConfig['baseAccessibilityAssertions']
+ 'assertions': {
+ 'categories:accessibility': ['error', {'minScore': 0.98}]
+ }
},
{
'matchingUrlPattern': '^http://127.0.0.1:8181/profile/username1$',
- 'assertions': baseConfig['baseAccessibilityAssertions']
+ 'assertions': {
+ 'categories:accessibility': ['error', {'minScore': 0.98}]
+ }
},
{
'matchingUrlPattern': '^http://127.0.0.1:8181/signup?return_url=%2F$',
@@ -51,11 +55,15 @@ module.exports = {
},
{
'matchingUrlPattern': '^http://127.0.0.1:8181/topics-and-skills-dashboard$',
- 'assertions': baseConfig['baseAccessibilityAssertions']
+ 'assertions': {
+ 'categories:accessibility': ['error', {'minScore': 0.9}]
+ }
},
{
'matchingUrlPattern': '^http://127.0.0.1:8181/terms$',
- 'assertions': baseConfig['baseAccessibilityAssertions']
+ 'assertions': {
+ 'categories:accessibility': ['error', {'minScore': 0.98}]
+ }
},
{
'matchingUrlPattern': '^http://127.0.0.1:8181/thanks$',
@@ -69,7 +77,9 @@ module.exports = {
},
{
'matchingUrlPattern': '^http://127.0.0.1:8181/create/.*$',
- 'assertions': baseConfig['baseAccessibilityAssertions']
+ 'assertions': {
+ 'categories:accessibility': ['error', {'minScore': 0.91}]
+ }
},
{
'matchingUrlPattern': '^http://127.0.0.1:8181/collection_editor/create/.*$',
@@ -80,17 +90,19 @@ module.exports = {
{
'matchingUrlPattern': '^http://127.0.0.1:8181/topic_editor/.*$',
'assertions': {
- 'categories:accessibility': ['error', {'minScore': 0.86}]
+ 'categories:accessibility': ['error', {'minScore': 0.84}]
}
},
{
'matchingUrlPattern': '^http://127.0.0.1:8181/skill_editor/.*$',
- 'assertions': baseConfig['baseAccessibilityAssertions']
+ 'assertions': {
+ 'categories:accessibility': ['error', {'minScore': 0.91}]
+ }
},
{
'matchingUrlPattern': '^http://127.0.0.1:8181/story_editor/.*$',
'assertions': {
- 'categories:accessibility': ['error', {'minScore': 0.86}]
+ 'categories:accessibility': ['error', {'minScore': 0.84}]
}
},
]
diff --git a/.lighthouserc-base.js b/.lighthouserc-base.js
index 0fba8acb5799..25d86ca01037 100644
--- a/.lighthouserc-base.js
+++ b/.lighthouserc-base.js
@@ -62,25 +62,20 @@ module.exports = {
// Performance category.
'first-contentful-paint': [ 'warn', {'maxNumericValue': 1230000}],
'first-meaningful-paint': ['warn', {'maxNumericValue': 1280000}],
- 'first-cpu-idle': ['warn', {'maxNumericValue': 1460000}],
'speed-index': ['warn', {'maxNumericValue': 1230000}],
'interactive': ['warn', {'maxNumericValue': 1540000}],
'max-potential-fid': ['warn', {'maxNumericValue': 130000}],
- 'uses-responsive-images': ['error', {'minScore': 1}],
'uses-optimized-images': ['error', {'minScore': 1}],
'uses-rel-preconnect': ['error', {'minScore': 0.5}],
'efficient-animated-content': ['error',{'minScore': 1}],
'offscreen-images': ['error', {'minScore': 0.45}],
'time-to-first-byte': ['off', {}],
// Best practices category.
- 'appcache-manifest': ['error', {'minScore': 1}],
'errors-in-console': ['error', {'minScore': 1}],
'no-document-write': ['error', {'minScore': 1}],
- 'external-anchors-use-rel-noopener': ['error', {'minScore': 1}],
'geolocation-on-start': ['error', {'minScore': 1}],
'doctype': ['error', {'minScore': 1}],
'no-vulnerable-libraries': ['off', {'minScore': 1}],
- 'js-libraries': ['error', {'minScore': 1}],
'notification-on-start': ['error', {'minScore': 1}],
'password-inputs-can-be-pasted-into': ['error', {'minScore': 1}],
'image-aspect-ratio': ['error', {'minScore': 1}],
@@ -89,13 +84,14 @@ module.exports = {
}
},
basePerformanceAssertions: {
- 'uses-webp-images': [
+ 'modern-image-formats': [
'error', {'maxLength': 0, 'strategy': 'pessimistic'}
],
'uses-passive-event-listeners': ['error', {'minScore': 1}],
'uses-rel-preload': ['error', {'minScore': 1}],
'deprecations': ['error', {'minScore': 1}],
- 'redirects': ['error', {'minScore': 1}]
+ 'redirects': ['error', {'minScore': 1}],
+ 'uses-responsive-images': ['error', {'minScore': 0.8}],
},
baseAccessibilityAssertions: {
'categories:accessibility': ['error', {'minScore': 1}]
diff --git a/.pylintrc b/.pylintrc
index e3f010faa4f6..b5b2e66ac477 100644
--- a/.pylintrc
+++ b/.pylintrc
@@ -2,9 +2,6 @@
#
# pylint core --rcfile=.pylintrc -i y
-[GENERAL]
-init-hook='import sys; sys.path.append("../oppia_tools/google_appengine_1.9.67/google_appengine")'
-
[MASTER]
init-hook='import sys; sys.path.append(".")'
@@ -65,26 +62,58 @@ indent-string=' '
allowed-comment-prefixes=int,str,float,bool,v
forbidden-imports=
- core.controllers:core.platform|core.storage,
- core.domain:core.controllers,
- core.storage:core.domain
+ *core.controllers*:
+ import core.platform*|
+ import core.storage*,
+ *core.domain*:
+ import core.controllers*,
+ *core.storage*:
+ import core.domain*,
+ *core.domain.*_domain:
+ from core.domain* import *_service*|
+ from core.domain* import *_cleaner|
+ from core.domain* import *_registry|
+ from core.domain* import *_fetchers|
+ from core.domain* import *_manager|
+ from core.platform import models
disallowed-functions-and-replacements-str=
- assertEquals=>self.assertEqual,
- now=>datetime.datetime.utcnow,
- beam.CombineValues=>beam.CombinePerKey
+ assertEquals=>self.assertEqual,
+ now=>datetime.datetime.utcnow,
+ beam.CombineValues=>beam.CombinePerKey
disallowed-functions-and-replacements-regex=
- \.put_async\(=>put,
- \.put_multi_async\(=>put_multi
+ \.put_async\(=>put,
+ \.put_multi_async\(=>put_multi
[SIMILARITIES]
+allowed-type-ignore-error-codes=
+ attr-defined,
+ union-attr,
+ call-overload,
+ override,
+ return,
+ assignment,
+ list-item,
+ dict-item,
+ typeddict-item,
+ func-returns-value,
+ misc,
+ arg-type,
+ type-arg,
+ no-untyped-def,
+ no-untyped-call,
+ no-any-return,
+ call-arg,
+ index
+
ignore-imports=yes
[MESSAGES CONTROL]
disable=abstract-method,
+ ungrouped-imports,
arguments-differ,
broad-except,
consider-using-ternary,
@@ -102,6 +131,8 @@ disable=abstract-method,
not-context-manager,
redefined-variable-type,
redundant-returns-doc,
+# TODO(#12912): Python interpreter migration to 3.8.15 causing failing lint check. Fix it later.
+ redundant-u-string-prefix,
too-many-arguments,
too-many-boolean-expressions,
too-many-branches,
@@ -115,23 +146,18 @@ disable=abstract-method,
# TODO(#12912): Remove these after the Python 3 migration.
arg-name-for-non-keyword-arg,
arguments-renamed,
- consider-using-dict-items,
consider-using-with,
- cyclic-import,
- deprecated-method,
import-outside-toplevel,
- missing-raises-doc,
- no-else-break,
- no-else-continue,
- no-else-raise,
non-explicit-keyword-args,
not-an-iterable,
- raise-missing-from,
- super-with-arguments,
unnecessary-pass,
- useless-object-inheritance,
consider-using-f-string,
- consider-using-in
+# TODO(#14322): Reinstate this.
+ missing-type-doc,
+ # Pylint considers imports to be cyclic even when the cycle is
+ # broken by putting imports inside functions so they aren't
+ # executed upon module import.
+ cyclic-import,
[REPORTS]
diff --git a/.rtlcssrc b/.rtlcssrc
new file mode 100644
index 000000000000..24e1f3dfedb8
--- /dev/null
+++ b/.rtlcssrc
@@ -0,0 +1,15 @@
+{
+ "options": {
+ "autoRename": false,
+ "autoRenameStrict": false,
+ "blacklist":{},
+ "clean": true,
+ "greedy": false,
+ "processUrls": false,
+ "stringMap":[],
+ "useCalc": false,
+ "aliases":{}
+ },
+ "plugins": [ ],
+ "map": false
+}
diff --git a/.stylelintrc b/.stylelintrc
index b0bc71f47bcc..a649f2c74de5 100644
--- a/.stylelintrc
+++ b/.stylelintrc
@@ -1,6 +1,5 @@
{
- "extends": "stylelint-config-recommended",
- "processors": ["@mapbox/stylelint-processor-arbitrary-tags"],
+ "extends": ["stylelint-config-recommended", "stylelint-config-html"],
"plugins": [
"stylelint-order"
],
@@ -19,10 +18,22 @@
"block-opening-brace-newline-after": "always-multi-line",
"block-opening-brace-space-after": "always-single-line",
"block-opening-brace-space-before": "always",
+ "color-hex-case": "lower",
"color-hex-length": "short",
"declaration-colon-space-after": "always",
"declaration-colon-space-before": "never",
+ "no-descending-specificity": null,
"order/properties-alphabetical-order": true,
"length-zero-no-unit": true
- }
+ },
+
+ "overrides": [
+ {
+ "files": ["**/*.css"],
+ "rules": {
+ "indentation": 2,
+ "no-descending-specificity": true
+ }
+ }
+ ]
}
diff --git a/.yarnrc b/.yarnrc
index 503a21b7da38..f19f9bd4e3eb 100644
--- a/.yarnrc
+++ b/.yarnrc
@@ -1,2 +1,2 @@
-yarn-path "../oppia_tools/yarn-1.22.10/bin/yarn"
+yarn-path "../oppia_tools/yarn-1.22.15/bin/yarn"
cache-folder "../yarn_cache"
diff --git a/AUTHORS b/AUTHORS
index ac06586421fd..37e1081fc4f5 100644
--- a/AUTHORS
+++ b/AUTHORS
@@ -11,8 +11,10 @@
Aadya Mishra