Repository navigation
Lint against imports of openedx_catalog internals in openedx-core #860
Copy link
Copy link
Closed
Description
Description
Add an import-linter contract to openedx-core that only lets other apps import openedx_catalog's public modules (api, models_api, data, tests), matching the rule openedx-platform already enforces. That way an import of openedx_catalog's internals fails CI in openedx-core instead of surfacing later, when openedx-platform installs a new openedx-core release.
Context
- fix: match openedx-platform's SIMPLE_HISTORY_DATE_INDEX in test settings #853 fixed an import of
openedx_catalog.modelsin CBE code. openedx-platform's import linter caught it during bump openedx-core 1.4.0 → 1.10.0 openedx-platform#39199, the PR bumping openedx-core's version there; openedx-core's own linter had no rule against it. - @ormsbee asked for this contract in his review of fix: match openedx-platform's SIMPLE_HISTORY_DATE_INDEX in test settings #853 and agreed it should be a separate follow-up PR so the version bump wasn't held up.
- Only
openedx_catalogis in scope. Other apps, such asopenedx_tagging, have nomodels_api.pyyet, so adding them would need a separate design decision.
Acceptance Criteria
-
.importlinterhas a contract that treatsopenedx_catalogas an isolated app: code outsideopenedx_catalogmay import only itsapi,models_api,data, andtestsmodules. -
lint-importspasses onmainwith the new contract. Today the only import ofopenedx_catalogfrom another app isfrom openedx_catalog.models_api import CourseRunincriteria.py, which is allowed. - The PR description shows that the contract catches a real violation: temporarily changing that
criteria.pyline back tofrom openedx_catalog.models import CourseRunmakeslint-importsfail and name that line. -
openedx_taggingand the other apps are not added to the contract.
Technical Details
This is a suggested approach, not the source of truth. The User Story, Description, and Acceptance Criteria define what must be true when the work is done.
Approach
- Copy openedx-platform's
IsolatedAppsContract(openedx/testing/importlinter/isolated_apps_contract.py, about 60 lines) into openedx-core. It has to be a copy because openedx-core must never import from openedx-platform. Put it in the root-leveltest_utilspackage (for exampletest_utils/importlinter.py) rather than undersrc/, so the published package doesn't ship lint tooling. - Register it in
.importlinterwithcontract_types = isolated_apps: test_utils.importlinter.IsolatedAppsContractin the[importlinter]section, then add a contract withisolated_apps = openedx_catalogandallowed_modules = api, models_api, data, tests, matching openedx-platform's contract so the two repos enforce the same rule. - Add a short comment above the new contract explaining why it exists: openedx-platform enforces the same rule, so a violation here would otherwise only surface when openedx-platform installs a new openedx-core release.
lint-imports already runs in CI through tox -e quality, so no workflow change is needed.
Additional context
- openedx-platform's contract definition: the
isolated_appsblock in openedx-platform'spyproject.toml.
Reactions are currently unavailable
Metadata
Metadata
Assignees
Labels
No labels
Type
Projects
- StatusShow more project fieldsDone
- StatusShow more project fieldsDone
Activity
ufedaseyeuconsultant commentedon Oct 9, 2026
PR: #861
fix: trim isolated_apps_contract.py and its config comment per review