Skip to content
pyproject.toml 6.65 KiB
Newer Older
Josh Asplund's avatar
Josh Asplund committed
[build-system]

# Works around a setuptools 50 issue
# AK, 2020-12-11
# taken from https://github.com/AnalogJ/lexicon/pull/629/files
requires = [
    "setuptools!=50",
    "poetry>=0.12",
]
Josh Asplund's avatar
Josh Asplund committed
build-backend = "poetry.masonry.api"

[tool.poetry]
name = "relate-courseware"
version = "2024.1"
Josh Asplund's avatar
Josh Asplund committed
description = "RELATE courseware"
readme = "README.rst"
repository = "https://github.com/inducer/relate"
documentation = "https://documen.tician.de/relate/"
authors = ["Andreas Kloeckner <inform@tiker.net>"]
license = "MIT"
packages = [
    { include = "course" },
    { include = "accounts" },
    { include = "relate" },
    # { include = "bin" },
[tool.poetry.scripts]
relate = "relate.bin.relate:main"

Josh Asplund's avatar
Josh Asplund committed
[tool.poetry.dependencies]
# keep consistent with ruff target version below
python = ">=3.10,<4"
Andreas Klöckner's avatar
Andreas Klöckner committed
django = "^5.1"
Josh Asplund's avatar
Josh Asplund committed
# Automatically renders Django forms in a pretty, Bootstrap-compatible way.
Andreas Klöckner's avatar
Andreas Klöckner committed
django-crispy-forms = ">=1.13.0"

# 0.6 has broken checkbox rendering
# https://github.com/django-crispy-forms/crispy-bootstrap5/commit/8bccd516aa9ce336a1069b6c9346e0c4c9e8270f
crispy-bootstrap5 = "^0.7"
Andreas Klöckner's avatar
Andreas Klöckner committed

Josh Asplund's avatar
Josh Asplund committed
# Page data, answer data, ... all represented in JSON. This makes that editable in the Django admin.
jsonfield = ">=1.4.0"
# /!\ Upstream is dead, using branch for Django 3.0 support
django-yamlfield = {git = "https://github.com/bakatrouble/django-yamlfield.git", rev = "c92d0373d12a02d1e52fb09b44010f156111d7ea"}
# For easy content formatting:
markdown = "^2.6.3"
minijinja= "^1.0.16"
Josh Asplund's avatar
Josh Asplund committed
# For math/symbolic questions
pymbolic = "*"
sympy = "*"
Josh Asplund's avatar
Josh Asplund committed
# Course content is stored in YAML.
pyyaml = "*"
# Dulwich git integration
# https://github.com/poezio/slixmpp/commit/53dc9847e2a4110be85ad16af9b427f9a280aaee#commitcomment-69121492
slixmpp = "^1.8.3"
Josh Asplund's avatar
Josh Asplund committed
# To manage web dependencies
django-npm = "^1.0.0"
# For code isolation in code questions
# 7.1 bumps the minimum API version to 1.24, which is unsupported by podman
docker = "^7.1.0"
Josh Asplund's avatar
Josh Asplund committed
# For code highlighting, required via the CodeHilite extension to Python-Markdown
pygments = "^2.6.1"
# For grade export
unicodecsv = "^0.14.1"
# To support network matching for facility recognition
ipaddress = "^1.0.23"
Josh Asplund's avatar
Josh Asplund committed
# {{{ For interoperation with SAML2/Shibboleth
pysaml2 = "^7.4.2"
djangosaml2 = "^v1.7.0"
Josh Asplund's avatar
Josh Asplund committed
# Try to avoid https://github.com/Julian/jsonschema/issues/449
attrs = ">=19"
python-memcached = "^1.59"
Josh Asplund's avatar
Josh Asplund committed
# A task queue, used to execute long-running tasks
celery = "^5.2.2"
kombu = "*"
# Avoid 2.3.0 because of https://github.com/celery/django-celery-results/issues/293
django-celery-results = "^2.4.0"
Josh Asplund's avatar
Josh Asplund committed
# For searchable select widgets
# To sanitize HTML generated by user code
# bleach is based on html5lib, but they vendor it. I don't think we should fish the
# vendored bits out of bleach, so we'll introduce our own dependency for data-URI
# sanitization.
html5lib = "^1.1"

Josh Asplund's avatar
Josh Asplund committed
# For query lexing
pytools = ">=2024.1.8"
Josh Asplund's avatar
Josh Asplund committed
# For relate script
colorama = "*"

# not a direct dependency
# version constraint is here because of CVE-2020-25659
social-auth-app-django = "^5.4.1"
psycopg2 = { version = "^2.9.3", optional = true }

pylibmc = { version = "^1.6.0", optional = true }

# urllib3 2.x seems incompatible with dulwich?
# "urllib3.exceptions.LocationValueError: No host specified."
urllib3 = "^1.26.19"
Josh Asplund's avatar
Josh Asplund committed
[tool.poetry.dev-dependencies]
factory_boy = "^2.12.0"
ruff = "^0.5.1"
Josh Asplund's avatar
Josh Asplund committed
pep8-naming = "^0.10.0"
Andreas Klöckner's avatar
Andreas Klöckner committed
pytest-django = "^4.5.2"
pytest-factoryboy = "^2.6.0"
Andreas Klöckner's avatar
Andreas Klöckner committed
pytest-pudb = "^0.7"
sphinx = "^7.2.6"
furo = "^2023.9.10"
sphinx-copybutton = "^0.5.2"
django-upgrade = "^1.12.0"
pyright = "^1"
types-bleach = "^0.1.2"
types-Jinja2 = "^0.1.3"
types-paramiko = "^0.1.3"
types-Markdown = "^0.1.2"
types-PyYAML = "^0.1.5"

# tests for code questions use question code that has numpy
numpy = "^1.26"
yamllint = "^1.32.0"

# enable with "-E postgres"
[tool.poetry.extras]
postgres = ["psycopg2"]
memcache = ["pylibmc"]
[tool.ruff]
preview = true
target-version = "py310"

[tool.ruff.lint]
extend-select = [
    "B",   # flake8-bugbear
    "C",   # flake8-comprehensions
    "E",   # pycodestyle
    "F",   # pyflakes
    "I",   # flake8-isort
    "N",   # pep8-naming
    "NPY", # numpy
    "Q",   # flake8-quotes
    "W",   # pycodestyle
Andreas Klöckner's avatar
Andreas Klöckner committed
    "RUF",
    # "DJ",
]

extend-ignore = [
    "C90",  # McCabe complexity
    "E221", # multiple spaces before operator
    "E226", # missing whitespace around arithmetic operator
    "E241", # multiple spaces after comma
    "E242", # tab after comma
    "E402", # module level import not at the top of file
    "N818", # error suffix in exception names

    # TODO
    "B904", # raise in except needs from
    "B028", # stacklevel
Andreas Klöckner's avatar
Andreas Klöckner committed
    "RUF012", # mutable class atttributes
]
allowed-confusables = ["‐", "–"]

[tool.ruff.lint.flake8-quotes]
docstring-quotes = "double"
inline-quotes = "double"
multiline-quotes = "double"

[tool.ruff.lint.per-file-ignores]
"course/mdx_mathjax.py" = ["N802"]

# config file, no type annotations, avoid scaring users
"local_settings_example.py" = ["I002"]

# copy-pasted from elsewhere, not our problem
"saml-config/attribute-maps/*.py" = ["Q", "E231", "W292", "W291", "E501", "I002"]
"course/migrations/*.py" = ["Q", "E501", "RUF012", "F401", "I002", "UP"]
"accounts/migrations/*.py" = [
        "Q", "E501", "RUF012", "F401", "E303", "B023", "E731", "N806", "F841",
        "I002"]
Andreas Klöckner's avatar
Andreas Klöckner committed
"tests/**/*.py" = ["F841", "RUF012"]

[tool.ruff.lint.isort]
combine-as-imports = true
lines-after-imports = 2
required-imports = ["from __future__ import annotations"]
[tool.mypy]
strict_optional = true
ignore_missing_imports = true
disallow_untyped_calls = "true"
# wishful thinking :)
# disallow_untyped_defs= "true"
show_error_codes = true
untyped_calls_exclude = [
    "dulwich",
]

[[tool.mypy.overrides]]
module = [
    "course.migrations.*",
]
ignore_errors = true

Andreas Klöckner's avatar
Andreas Klöckner committed
[tool.pytest.ini_options]
DJANGO_SETTINGS_MODULE = "relate.settings"
python_files = [
    "tests.py",
    "test_*.py",
    "*_tests.py",
]


markers = [
    "slow: marks tests as slow (run with '--slow')",
    "postgres: mark test as postgres specific",
]

[tool.typos.default]
extend-ignore-re = [
  "(?Rm)^.*(#|//)\\s*spellchecker:\\s*disable-line"
]

[tool.typos.default.extend-words]
# opps as in 'grading opportunities'
opps = "opps"
# fre, short for flow rule exception
fre = "fre"
# short for 'stipulation'
stip = "stip"
# as in documen.tician.de
documen = "documen"
# like sur_name in SAML
sur = "sur"

[tool.typos.files]
extend-exclude = [
"locale/**/*.po",
# migrations reflect the past, don't attempt to alter them.
"*/migrations/**/*.py",
# not ours
"saml-config/**/*.py",
]