Skip to content

Lint against imports of openedx_catalog internals in openedx-core #860

Closed

Description

@mgwozdz-unicon

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

Acceptance Criteria

  • .importlinter has a contract that treats openedx_catalog as an isolated app: code outside openedx_catalog may import only its api, models_api, data, and tests modules.
  • lint-imports passes on main with the new contract. Today the only import of openedx_catalog from another app is from openedx_catalog.models_api import CourseRun in criteria.py, which is allowed.
  • The PR description shows that the contract catches a real violation: temporarily changing that criteria.py line back to from openedx_catalog.models import CourseRun makes lint-imports fail and name that line.
  • openedx_tagging and 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

  1. 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-level test_utils package (for example test_utils/importlinter.py) rather than under src/, so the published package doesn't ship lint tooling.
  2. Register it in .importlinter with contract_types = isolated_apps: test_utils.importlinter.IsolatedAppsContract in the [importlinter] section, then add a contract with isolated_apps = openedx_catalog and allowed_modules = api, models_api, data, tests, matching openedx-platform's contract so the two repos enforce the same rule.
  3. 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_apps block in openedx-platform's pyproject.toml.

Metadata

Metadata

Labels

No labels
No labels

Type

No type

Projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions