[project] name = "label-studio" version = "1.23.0.dev0" description = "Label Studio annotation tool" authors = [ { name = "HumanSignal", email = "support@humansignal.com" }, ] readme = "README.md" license = "Apache-2.0" classifiers = [ "License :: OSI Approved :: Apache Software License", "Operating System :: OS Independent", "Programming Language :: Python :: 3", ] requires-python = ">=3.10,<4" dependencies = [ "wheel (>=0.38.1,<=0.40.0)", "appdirs (>=1.4.3)", "attr (==0.3.1)", "attrs (>=19.2.0)", "pyyaml (>=6.0.0)", "azure-storage-blob (>=12.6.0)", "boto3 (>=1.28.58,<2.0.0)", "botocore (>=1.39.3,<2.0.0)", "bleach (>=5.0.0,<5.1.0)", "cryptography (>=44.0.1)", "Django (>=5.1.8,<5.2.0)", "django-storages (==1.12.3)", "django-annoying (==0.10.6)", "django-debug-toolbar (==3.2.1)", "django-environ (==0.10.0)", "django-filter (==24.3)", "django-model-utils (==4.1.1)", "django-rq (>=3.1,<3.2)", "django-cors-headers (==4.7.0)", "django-extensions (==3.2.3)", "django-user-agents (==0.4.0)", "django-ranged-fileresponse (>=0.1.2)", "drf-dynamic-fields (==0.3.0)", "djangorestframework (==3.15.2)", "drf-flex-fields (==0.9.5)", "drf-spectacular (==0.28.0)", "drf-generators (==0.3.0)", "lockfile (>=0.12.0)", "lxml[html-clean] (>=4.9.4)", "defusedxml (>=0.7.1)", "numpy (>=2.2.6,<3.0.0)", "ordered-set (==4.0.2)", "pandas (>=2.2.3)", "psycopg[binary] (>=3.2.0,<4.0.0)", "pyarrow (>=22.0.0,<23.0.0)", "pydantic (>=2.9.2)", "python-dateutil (>=2.8.1)", "pytz (>=2022.1,<2023.0)", "requests (>=2.32.3,<2.33.0)", "rq (>=2.6,<2.7)", "rules (==3.4)", "ujson (>=3.0.0)", "ijson (>=3.4.0,<4.0.0)", "xmljson (==0.2.1)", "colorama (>=0.4.4)", "pyboxen (>=1.3.0)", "redis (>=5.2.1,<5.3.0)", "sentry-sdk (>=2.16.0)", "launchdarkly-server-sdk (==8.2.1)", "python-json-logger (==2.0.4)", "google-cloud-storage (>=2.13.0,<3.0.0)", "google-cloud-logging (>=3.10.0,<4.0.0)", "django-csp (==3.7)", "openai (>=1.10.0,<2.0.0)", "django-migration-linter (>=5.1.0,<6.0.0)", "setuptools (>=75.4.0)", "djangorestframework-simplejwt[crypto] (>=5.4.0,<6.0.0)", "tldextract (>=5.1.3)", "uuid-utils (>=0.11.0,<1.0.0)", ## HumanSignal repo dependencies :start "label-studio-sdk @ https://github.com/HumanSignal/label-studio-sdk/archive/b2c86a0694ec387c3b0ce64298d3a793363a805a.zip", ## HumanSignal repo dependencies :end ] [project.urls] Repository = "https://github.com/HumanSignal/label-studio" [project.scripts] label-studio = "label_studio.server:main" [project.optional-dependencies] uwsgi = ['pyuwsgi (==2.0.28.post1)', 'uwsgitop (==0.12)'] [tool.ruff] # Assume Python 3.10 at a minimum target-version = "py310" # Same as Blue. line-length = 119 [tool.ruff.lint] # Enable the pycodestyle (`E`) and Pyflakes (`F`) rules by default. # Unlike Flake8, Ruff doesn't enable pycodestyle warnings (`W`) or # McCabe complexity (`C901`) by default. select = [ # Pyflakes "F", # Pycodestyle "E", # isort "I001" ] ignore = [ "E501", "E402", # ignores: Module level import not at top of file. (isort takes care of this and if not, there is usually a good reason) ] # Allow autofix for all enabled rules (when `--fix`) is provided. fixable = ["ALL"] unfixable = [] # Exclude a variety of commonly ignored directories. exclude = [ ".bzr", ".direnv", ".eggs", ".git", ".git-rewrite", ".hg", ".mypy_cache", ".nox", ".pants.d", ".pytype", ".ruff_cache", ".svn", ".tox", ".venv", "__pypackages__", "_build", "buck-out", "build", "dist", "node_modules", "venv", "**/migrations/*.py", ] # Allow unused variables when underscore-prefixed. dummy-variable-rgx = "^(_+|(_+[a-zA-Z0-9_]*[a-zA-Z0-9]+?))$" [tool.ruff.lint.per-file-ignores] # Ignore deleting imports in __init__.py files as they're actually being used. "__init__.py" = ["F401"] "**/settings/label_studio.py" = ["F405"] "test*.py" = ["F811"] [tool.blue] line-length = 119 include = 'label_studio/.*\.py$' # Exclude a variety of commonly ignored directories, as well as all migrations files. force-exclude = ''' /( \.bzr | \.direnv | \.eggs | \.git | \.github | \.git-rewrite | \.hg | \.mypy_cache | \.nox | \.pants.d | \.pytype | \.ruff_cache | \.svn | \.tox | \.venv | \.hg | _build | buck-out | build | dist | node_modules | migrations | venv | __pycache__ )/ ''' target-version = ['py310'] [tool.poetry] packages = [ { include = "label_studio" }, ] include = [ { path = "web/dist/libs/datamanager/**/*", format = ["sdist", "wheel"] }, { path = "web/dist/libs/editor/**/*", format = ["sdist", "wheel"] }, { path = "web/dist/apps/labelstudio/**/*", format = ["sdist", "wheel"] }, { path = "label_studio/annotation_templates/**/*", format = ["sdist", "wheel"] }, { path = "label_studio/core/static/**/*", format = ["sdist", "wheel"] }, { path = "label_studio/core/static_build/**/*", format = ["sdist", "wheel"] }, { path = "label_studio/core/utils/schema/*.json", format = ["sdist", "wheel"] }, { path = "label_studio/core/templatetags/*.py", format = ["sdist", "wheel"] }, { path = "label_studio/core/version_.py", format = ["sdist", "wheel"] }, { path = "label_studio/core/all_urls.json", format = ["sdist", "wheel"] }, { path = "label_studio/io_storages/**/*.yml", format = ["sdist", "wheel"] }, ] exclude = [ { path = "label_studio/frontend", format = ["sdist", "wheel"] }, ] requires-poetry = '>=2.0.0,<3.0.0' [tool.poetry.dependencies] python = ">=3.10,<4" [tool.poetry.group.test.dependencies] pytest = "7.2.2" pytest-cov = "5.0.0" pytest-django = "4.9.0" pytest-mock = "3.14.0" tavern = "2.3.0" fakeredis = "~=2.26.1" pytest-env = "0.6.2" responses = "0.13.0" pytest-xdist = "3.6.1" psutil = "7.0.0" freezegun = "~=1.5.1" pre-commit = "3.3.3" s3transfer = "0.13.0" mock = ">=5.1.0" moto = ">=4.2.6" requests-mock = "1.12.1" factory-boy = "^3.3.3" [tool.poetry.group.build.dependencies] twine = ">=6.1.0" packaging = ">=24.2" [build-system] requires = ['poetry-core (>=2.0.0,<3.0.0)'] build-backend = "poetry.core.masonry.api"