[tool:pytest] # Note: The first file of settings found is used, there is no combining, so # this file is only used for tests that don't find a pytest.ini file first. # Details at https://docs.pytest.org/en/latest/reference/customize.html DJANGO_SETTINGS_MODULE = lms.envs.test addopts = --nomigrations --reuse-db --durations=20 --json-report --json-report-omit keywords streams collectors log traceback tests --json-report-file=none # Enable default handling for all warnings, including those that are ignored by default; # but hide rate-limit warnings (because we deliberately don't throttle test user logins) # and field_data deprecation warnings (because fixing them requires a major low-priority refactoring) filterwarnings = default ignore:No request passed to the backend, unable to rate-limit:UserWarning ignore::xblock.exceptions.FieldDataDeprecationWarning # Remove default_app_config warning after updating Django to 4.2 ignore:.*You can remove default_app_config.*:PendingDeprecationWarning ignore:Instead access HTTPResponse.headers directly.*:DeprecationWarning:elasticsearch # ABC deprecation Warning comes from libsass ignore:Using or importing the ABCs from 'collections' instead of from 'collections.abc' is deprecated.*:DeprecationWarning:sass ignore:'etree' is deprecated. Use 'xml.etree.ElementTree' instead.:DeprecationWarning:wiki junit_family = xunit2 norecursedirs = .* *.egg build conf dist node_modules test_root cms/envs lms/envs openedx/envs python_classes = python_files = tests.py test_*.py tests_*.py *_tests.py __init__.py [pycodestyle] # error codes: https://pycodestyle.readthedocs.io/en/latest/intro.html#error-codes # E501: line too long # E265: block comment should start with '# ' # We ignore this because pep8 used to erroneously lump E266 into it also. # We should probably fix these now. # E266: too many leading '#' for block comment # We have lots of comments that look like "##### HEADING #####" which violate # this rule, because they don't have a space after the first #. However, # they're still perfectly reasonable comments, so we disable this rule. # W602: deprecated form of raising exception # We do this in a few places to modify the exception message while preserving # the traceback. See this blog post for more info: # http://nedbatchelder.com/blog/200711/rethrowing_exceptions_in_python.html # It's a little unusual, but we have good reasons for doing so, so we disable # this rule. # E203: whitespace before ':' # We ignore this because of black formatter defaults # E305,E402,E722,E731,E741,E743,W503,W504: errors and warnings added since pep8/pycodestyle # 1.5.7 that we haven't cleaned up yet ignore=E203,E265,E266,E305,E402,E501,E722,E731,E741,E743,W503,W504,W602 exclude=migrations,.git,.pycharm_helpers,.tox,test_root/staticfiles,node_modules [isort] indent=' ' line_length=120 multi_line_output=3 skip= envs migrations [importlinter] root_packages = lms cms openedx openedx_learning include_external_packages = True contract_types = # Our custom contract which checks that we're only importing from 'api.py' # for participating packages. isolated_apps: openedx.testing.importlinter.isolated_apps_contract.IsolatedAppsContract [importlinter:contract:1] name = lms and cms are independent type = independence modules = lms cms ignore_imports = ############################################################################ # lms side imports that we are ignoring for now lms.djangoapps.course_home_api.outline.tests.test_view -> cms.djangoapps.contentstore.outlines lms.djangoapps.course_home_api.tests.utils -> cms.djangoapps.contentstore.outlines # lms.djangoapps.instructor.tests.test_api & lms.djangoapps.instructor.tests.test_tools # -> openedx.core.djangoapps.course_date_signals.handlers # -> cms.djangoapps.contentstore.config.waffle openedx.core.djangoapps.course_date_signals.handlers -> cms.djangoapps.contentstore.config.waffle ############################################################################ # cms side imports that we are ignoring for now cms.djangoapps.contentstore.views.tests.test_block -> lms.djangoapps.lms_xblock.mixin cms.djangoapps.contentstore.signals.handlers -> lms.djangoapps.grades.api cms.djangoapps.contentstore.course_group_config -> lms.lib.utils cms.djangoapps.contentstore.views.preview -> lms.djangoapps.lms_xblock.field_data # cms.envs.common # -> openedx.envs.common # -> lms.djangoapps.lms_xblock.mixin openedx.envs.common -> lms.djangoapps.lms_xblock.mixin # cms.djangoapps.contentstore.views.tests.test_group_configurations # -> openedx.features.content_type_gating.helpers # -> lms.djangoapps.courseware.masquerade openedx.features.content_type_gating.helpers -> lms.djangoapps.courseware.masquerade # cms.djangoapps.contentstore.utils # -> openedx.core.djangoapps.django_comment_common.models # -> openedx.core.djangoapps.course_groups.cohorts # -> lms.djangoapps.courseware.courses openedx.core.djangoapps.course_groups.cohorts -> lms.djangoapps.courseware.courses # cms.djangoapps.contentstore.[various] # -> openedx.features.content_type_gating.partitions # -> lms.djangoapps.commerce.utils openedx.features.content_type_gating.partitions -> lms.djangoapps.commerce.utils # cms.djangoapps.contentstore.course_group_config # -> openedx.core.djangoapps.course_groups.partition_scheme # -> lms.djangoapps.courseware.masquerade openedx.core.djangoapps.course_groups.partition_scheme -> lms.djangoapps.courseware.masquerade # cms.djangoapps.export_course_metadata.tasks # -> openedx.core.djangoapps.schedules.content_highlights # -> lms.djangoapps.courseware.block_render & lms.djangoapps.courseware.model_data openedx.core.djangoapps.content_libraries.* -> lms.djangoapps.*.* # cms.djangoapps.contentstore.tasks -> openedx.core.djangoapps.content_libraries.[various] # -> lms.djangoapps.grades.api openedx.core.djangoapps.xblock.*.* -> lms.djangoapps.*.* # cms.djangoapps.contentstore.tasks -> openedx.core.djangoapps.content_libraries.[various] -> openedx.core.djangoapps.xblock.[various] # -> lms.djangoapps.courseware & lms.djangoapps.courseware.grades openedx.core.djangoapps.schedules.content_highlights -> lms.djangoapps.courseware.* # cms.djangoapps.contentstore.[various] # -> openedx.core.lib.gating.api # -> lms.djangoapps.course_blocks.api & lms.djangoapps.courseware.access & lms.djangoapps.grades.api openedx.core.lib.gating.api -> lms.djangoapps.*.* # cms.djangoapps.contentstore.[various] # -> openedx.features.content_type_gating.partitions # -> openedx.features.discounts.utils # -> lms.djangoapps.courseware.utils & lms.djangoapps.experiments.models openedx.features.discounts.utils -> lms.djangoapps.courseware.utils openedx.features.discounts.utils -> lms.djangoapps.experiments.models # cms.djangoapps.contentstore.signals.handlers # -> openedx.core.djangoapps.discussions.tasks # -> openedx.core.djangoapps.discussions.utils # -> lms.djangoapps.courseware.access openedx.core.djangoapps.discussions.utils -> lms.djangoapps.courseware.access # cms.djangoapps.contentstore.[various] # -> openedx.features.content_type_gating.partitions # -> openedx.features.discounts.utils # -> openedx.features.discounts.applicability # -> lms.djangoapps.courseware.toggles # & lms.djangoapps.courseware.utils # & lms.djangoapps.experiments.models # & lms.djangoapps.experiments.stable_bucketing openedx.features.discounts.applicability -> lms.djangoapps.courseware.* openedx.features.discounts.applicability -> lms.djangoapps.experiments.* # cms.djangoapps.contentstore.[various] # -> openedx.core.djangoapps.content.learning_sequences.api # -> openedx.core.djangoapps.content.learning_sequences.api.outlines # -> openedx.core.djangoapps.content.learning_sequences.api.permissions # -> lms.djangoapps.courseware.access openedx.core.djangoapps.content.learning_sequences.api.permissions -> lms.djangoapps.courseware.access # cms.djangoapps.contentstore.[various] # -> openedx.features.content_type_gating.partitions # -> openedx.features.discounts.utils # -> openedx.features.discounts.applicability # -> openedx.features.enterprise_support.utils openedx.features.enterprise_support.utils -> lms.djangoapps.branding.api cms.djangoapps.contentstore.rest_api.v1.views.settings -> lms.djangoapps.certificates.api # We are ignoring this existing import until we can refactor contenstore/helpers. # https://github.com/openedx/edx-platform/issues/37637 openedx.core.djangoapps.content_libraries.api.libraries -> cms.djangoapps.contentstore.helpers openedx.core.djangoapps.content_libraries.api.blocks -> cms.djangoapps.contentstore.helpers openedx.core.djangoapps.content_staging.serializers -> cms.djangoapps.contentstore.helpers # These imports will become OK once we move content_libraries into CMS # https://github.com/openedx/edx-platform/issues/33428 openedx.core.djangoapps.content_libraries.permissions -> cms.djangoapps.course_creators.views openedx.core.djangoapps.content_libraries.tasks -> cms.djangoapps.contentstore.storage # Outstanding arch issue: course_overviews is tangled up with LMS # https://github.com/openedx/edx-platform/issues/37658 openedx.core.djangoapps.content.course_overviews.models -> lms.djangoapps.** # Outstanding arch issue: content_highlights uses courseware block_render # https://github.com/openedx/edx-platform/issues/37659 openedx.core.djangoapps.schedules.content_highlights -> lms.djangoapps.courseware.block_render [importlinter:contract:2] name = Do not depend on non-public API of isolated apps. type = isolated_apps isolated_apps = cms.djangoapps.modulestore_migrator openedx.core.djangoapps.agreements openedx.core.djangoapps.bookmarks openedx.core.djangoapps.content_libraries openedx.core.djangoapps.content_staging openedx.core.djangoapps.olx_rest_api openedx.core.djangoapps.xblock openedx.core.lib.xblock_serializer allowed_modules = # Only imports from api.py and data.py are allowed elsewhere in the code # See https://open-edx-proposals.readthedocs.io/en/latest/best-practices/oep-0049-django-app-patterns.html#api-py api data tests [importlinter:contract:3] name = Do not import apps from openedx-learning (only import from openedx_learning.api.* and openedx_learning.lib.*). type = forbidden source_modules = cms lms openedx forbidden_modules = openedx_learning.apps allow_indirect_imports = True [importlinter:contract:4] name = Low-level apps should not depend on high-level apps type = layers layers = # Layers from high-level to low-level. Imports should only occur from higher to lower. cms.lib.xblock.upstream_sync | openedx.core.djangoapps.content.search | openedx.core.djangoapps.olx_rest_api openedx.core.djangoapps.content_libraries openedx.core.djangoapps.content_staging openedx.core.djangoapps.xblock openedx.core.lib.xblock_serializer openedx.core.djangoapps.content_tagging ignore_imports = # Test code can break these layering rules **.tests.** -> ** # FIXME: the exceptions below are from before we added this import linting rule. Should refactor to eliminate them. # In particular, the contentstore.helpers module is too big and has too many imports # See https://github.com/openedx/edx-platform/issues/37637 # The CSV export hard-codes support for courses and libraries. Refactor to do something like learning_context.get_children() openedx.core.djangoapps.content_tagging.helpers.objecttag_export_helpers -> openedx.core.djangoapps.content_libraries.api # The permissions checking code for tagging requires libraries model data to get all the orgs that a user is using: openedx.core.djangoapps.content_tagging.utils -> openedx.core.djangoapps.content_libraries.api # Content staging POST to clipboard API uses libraries APIs. We're working on moving this code to content_libraries openedx.core.djangoapps.content_staging.views -> openedx.core.djangoapps.content_libraries.api # content_staging.serializers imports contentstore.helpers which imports contentstore.utils which imports the libraries API. openedx.core.djangoapps.content_staging.serializers -> cms.djangoapps.contentstore.helpers # content_libraries.rest_api.libraries imports cms.djangoapps.contentstore.views.course which imports # contentstore.toggles which imports djangoapps.content.search.api openedx.core.djangoapps.content_libraries.rest_api.libraries -> cms.djangoapps.contentstore.views.course # Content libraries imports contentstore.helpers which imports upstream_sync openedx.core.djangoapps.content_libraries.api.blocks -> cms.djangoapps.contentstore.helpers openedx.core.djangoapps.content_libraries.api.libraries -> cms.djangoapps.contentstore.helpers # Outstanding arch issue: course_overviews is tangled up with LMS # https://github.com/openedx/edx-platform/issues/37658 openedx.core.djangoapps.content.course_overviews.models -> lms.djangoapps.** # Outstanding arch issue: content_highlights uses courseware block_render # https://github.com/openedx/edx-platform/issues/37659 openedx.core.djangoapps.schedules.content_highlights -> lms.djangoapps.courseware.block_render # This import happens only because grading signals are defined in LMS rather than openedx-events # https://github.com/openedx/edx-platform/issues/37660 openedx.core.djangoapps.xblock.runtime.runtime -> lms.djangoapps.grades.api # These imports will become OK once we worked on the following issue: # https://github.com/openedx/edx-platform/issues/33428 openedx.core.djangoapps.video_config.services -> openedx.core.djangoapps.content_libraries.api