[build-system] requires = ["setuptools>=45", "wheel"] build-backend = "setuptools.build_meta" [project] name = "saas-platform-backend" version = "1.0.0" description = "Multi-tenant SaaS platform for Malaysian SMEs" authors = [ {name = "Development Team", email = "dev@company.com"} ] dependencies = [ "Django==4.2.0", "djangorestframework==3.14.0", "django-tenants==3.5.0", "django-cors-headers==4.2.0", "psycopg2-binary==2.9.7", "redis==4.5.5", "celery==5.3.1", "stripe==5.4.0", "python-dotenv==1.0.0", "pyjwt==2.8.0", "bcrypt==4.0.1", "requests==2.31.0", "Pillow==10.0.0", "django-filter==23.2", "django-extensions==3.2.3", ] [project.optional-dependencies] dev = [ "coverage==7.2.7", "pytest==7.4.0", "pytest-django==4.5.2", "factory-boy==3.3.0", "freezegun==1.2.2", "ruff==0.0.280", "black==23.7.0", "isort==5.12.0", "mypy==1.4.1", ] [tool.ruff] line-length = 88 target-version = "py311" select = [ "E", # pycodestyle errors "W", # pycodestyle warnings "F", # pyflakes "I", # isort "B", # flake8-bugbear "C4", # flake8-comprehensions "UP", # pyupgrade ] ignore = [ "E501", # line too long, handled by black "B008", # do not perform function calls in argument defaults "W191", # indentation contains tabs "B904", # Allow raising exceptions without from e, for HTTPException ] [tool.ruff.per-file-ignores] "__init__.py" = ["F401"] [tool.black] line-length = 88 target-version = ['py311'] include = '\.pyi?$' extend-exclude = ''' /( # directories \.eggs | \.git | \.hg | \.mypy_cache | \.tox | \.venv | build | dist )/ ''' [tool.isort] profile = "black" multi_line_output = 3 line_length = 88 known_first_party = ["core", "modules"]