Skip to content
pyproject.toml 6.17 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]
python = ">=3.9,<3.13"
django = "^4.2.11"
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 = "*"
Andreas Klöckner's avatar
Andreas Klöckner committed

pytz_deprecation_shim = "^0.1.0"

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 comfortable code entry
django-codemirror-widget = ">=0.5"
# For code isolation in code questions
docker-py = "^1.10.6"
# 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 = "*"

# https://github.com/jupyter/nbconvert/issues/1725
ipython_genutils = "^0.2.0"

# 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-pytz = "^0.1.0"
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"]
Andreas Klöckner's avatar
Andreas Klöckner committed
[tool.isort]
profile = "django"
line_length = 85
lines_after_imports = 2
src_paths = ["relate", "course", "accounts", "test"]

[tool.ruff]
preview = true

[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
    "UP031", # format
    "UP032" # f-string
]
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"]

# copy-pasted from elsewhere, not our problem
"saml-config/attribute-maps/*.py" = ["Q", "E231", "W292", "W291", "E501"]

# mostly generated
"course/migrations/*.py" = ["Q", "E501", "RUF012", "F401"]
"accounts/migrations/*.py" = [
        "Q", "E501", "RUF012", "F401", "E303", "B023", "E731", "N806", "F841"]

# TODO
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

[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",
]