Lint against imports of openedx_catalog internals in openedx-core
Maintainers usually reply within 1 day
@ufedaseyeuconsultant is already working on this.
Since Oct 9, 2026.
- #861 by @ufedaseyeuconsultant — open
Assessment
This issue has not been assessed yet.
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
- openedx/openedx-core#853 fixed an import of
openedx_catalog.modelsin CBE code. openedx-platform's import linter caught it during openedx/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 #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.
- Dominant language
- Python
- Stars
- 10
- Forks
- 33
- Avg merge
- 2d 13h
- Merged PRs (30d)
- 12
Getting set up
- No Dockerfile or Docker Compose file
- No pull request template
- Read the contributing guide
First steps
- Read the whole issue, then the project's contributing guide.
- Comment on the issue to say you are picking it up — it saves two people doing the same work.
- Fork the repository and make your change on a branch.
- Open a pull request that references the issue number.
More from openedx/openedx-core
-
Difficulty 2/5 1-3 hours Newbie friendliness 75/100
openedx/openedx-core#831 ·
Maintainers usually reply within 1 day
-
Difficulty 2/5 1-3 hours Newbie friendliness 85/100
openedx/openedx-core#827 ·
Maintainers usually reply within 1 day
-
[Bug] The pagination buttons on the Competency Management page sit directly on the top borderPossibly taken @AShatsila claimed this 1 day ago. Open
openedx/openedx-core#859 · 1 assignee ·
Maintainers usually reply within 1 day
-
Tag import: parent_id isn't re-validated when it matches the pre-import parentPossibly taken @ufedaseyeuconsultant claimed this 1 day ago. Open
openedx/openedx-core#858 · 1 assignee ·
Maintainers usually reply within 1 day
-
Difficulty 5/5 Over a week Newbie friendliness 25/100
openedx/openedx-core#855 ·
Maintainers usually reply within 1 day
All issues in openedx/openedx-core
Similar issues
-
namespace operations
Difficulty 1/5 Under an hour Newbie friendliness 72/100
EclipseFdn/open-vsx.org#14043 ·
Maintainers usually reply within 1 day
-
feedback simulation workshop
Difficulty 2/5 1-3 hours Newbie friendliness 73/100
githubnext/gh-aw-workshop#4455 ·
Maintainers usually reply within 1 day
-
Triage 🩺
Difficulty 2/5 1-3 hours Newbie friendliness 76/100
Maintainers usually reply within 1 day
-
[BUG] Container scenario crashes without expected_recovery_time, kube DNS example uses retry_waitOpenneeds-triage
Difficulty 2/5 1-3 hours Newbie friendliness 77/100
krkn-chaos/krkn#1627 · 1 comment ·
Maintainers usually reply within 1 day
-
Difficulty 2/5 1-3 hours Newbie friendliness 72/100
NousResearch/hermes-agent#136483 ·
Maintainers usually reply within 1 day