[project]
name = "suno_utils"
version = "0.1.0"
description = ""
authors = [
    {name = "Suno", email = "code@suno.ai"},
]
dependencies = [
    "beautifulsoup4==4.13.3",
    "ctc-segmentation==1.7.4",
    "dagster==1.1.21",
    "dagster-aws==0.17.21",
    "editdistance==0.8.1",
    "encodec==0.1.1",
    "feedparser==6.0.11",
    "ffmpeg-python==0.2.0",
    "gql[all]==3.5.1",
    "hypothesis==6.127.5",
    "funcy==2.0",
    "joblib==1.4.2",
    "numpy==1.26.4",
    "opensearch-py==2.8.0",
    "pandas==2.2.3",
    "portion==2.6.0",
    "pygtrie==2.5.0",
    "python-speech-features==0.6",
    "requests==2.32.3",
    "scipy==1.15.2",
    "sox==1.5.0",
    "tqdm==4.67.1",
    "tinytag==2.1.0",
    "transformers==4.49.0",
    "unidecode==1.3.8",
    "phonemizer==3.3.0",
    "sentencepiece==0.2.0",
    "tiktoken==0.1.2",
    "torch==2.5.1",
    "openai-whisper==20240930",
    "gradio==5.13.2",
    "webrtcvad==2.0.10",
    "jupyterlab==4.3.5",
    "giphy-client==1.0.0",
    "moviepy==2.1.2",
    "pillow==10.4.0",
    "tweepy==4.15.0",
    "pagerduty-api==0.3",
    "descript-audiotools==0.7.2",
    "importlib-resources==5.13.0",
    "frozendict==2.4.6",
    "fasttext-wheel==0.9.2",
    "openai==1.65.2",
    "speechbrain==0.5.16",
    "wordfreq==3.1.1",
    "ddtrace==2.21.1",
    "rpyc==6.0.1",
    "datadog==0.51.0",
    "statsig-python-core==0.10.1",
    "structlog==25.4.0",
    "aiohttp>=3.13.0",  # transitive dep; constrained to avoid yanked 3.11.13 (regression)  
]
requires-python = ">=3.10.12,<3.11"
readme = "README.md"
license = {text = "UNLICENSED"}
[project.optional-dependencies]
worker = [
    "modal==1.1.4",
    "redis==5.2.1",
]

[tool.uv]
dev-dependencies = [
    "black==25.1.0",
    "ruff==0.7.1",  # no real reason to pin this except to avoid a massive reformatting diff, feel free to unpin...
    "pytest==8.3.5",
    "pyright==1.1.396",
    "modal==1.1.4",
    "redis==5.2.1",
    "setuptools==75.8.2",
    "python-dotenv",
    "pip-licenses>=5.0.0",
    "fal-client==0.8.1",  # For type checking/IDE support only, also installed in Modal image
]

[tool.ruff]
line-length = 105

exclude = [
"suno_utils/worker/assets",  # contains a bunch of .py files that aren't actually python
"*.json.py",  # contains a bunch of .py files that aren't actually python
"*.txt.py",  # contains a bunch of .py files that aren't actually python
]  
lint.ignore-init-module-imports = true

lint.select = [
# "A",  # flake8-builtins
# "B",  # bugbear
# "C",  # complexity
# "D",  # pydocstyle
"E",  # pyflakes errors
"F",  # pyflakes
# "G",  # logging format
# "I",  # imports, fixable
#  "N",  # variable names
# "Q",  # flake quotes
# "S",  # security
# "T",  # print statements
# "W",  # warnings, fixable
# "ANN",  # annotations
# "ARG",  # unused arguments
# "BLE",  # blind exceptions
# "DTZ",  # datetimes
# "EM", # string formatting in execptions, fixable
# "ERA",  # commented code
# "EXE",  # flake8 executables
# "FBT",  # boolean traps
# "ICN",  # import conventions
# "ISC",  # implicit string concatenation
# "NPY",  # numpy specific rules
# "PD",  # pandas rules
# "PGH", # blanket type ignores
# "PIE",  # misc linting
# "PL",  # refactoring
# "PT",  # unittest-style asserts
# "PTH",  # pathlib
# "RET",  # return statements
# "RSE",  # raise statements
# "RUF",  # ruff-specific rules
# "SIM",  # simplifications
# "SLF",  # check for access of private class attributes
# "TCH",  # type-checking
# "TRY",  # try-statement linting
# "UP",  # pyupgrade
# "YTT",  # sys.version lints
]

lint.ignore = [
# these errors need to be fixed eventually
"E402",
"E501",
"E711",
"E722",
"E741",
"F403",
"F811",
"F841",
]

lint.unfixable = [
"F841",  # don't let ruff remove unused variables by default-- results are often very confusing.
]

[tool.black]
line-length = 105

[tool.ruff.format]
exclude = ["suno_utils/scripts/*", "*.json.py", "*.txt.py"]

[tool.pytest.ini_options]
markers = [
    "slow: marks tests as slow (deselect with '-m \"not slow\"')",
    "serial",
]

[tool.pyright]
include = ["suno_utils"]
exclude = ["suno_utils/worker/assets/*"]
