[build-system] requires = ["setuptools >= 64.0.0", "wheel"] build-backend = "setuptools.build_meta" [project] name = "freqtrade" dynamic = ["version", "dependencies", "optional-dependencies"] authors = [ {name = "Freqtrade Team"}, {name = "Freqtrade Team", email = "freqtrade@protonmail.com"}, ] description = "Freqtrade - Crypto Trading Bot" readme = "README.md" requires-python = ">=3.10" license = {text = "GPLv3"} classifiers = [ "Environment :: Console", "Intended Audience :: Science/Research", "License :: OSI Approved :: GNU General Public License v3 (GPLv3)", "Programming Language :: Python :: 3.10", "Programming Language :: Python :: 3.11", "Programming Language :: Python :: 3.12", "Operating System :: MacOS", "Operating System :: Unix", "Topic :: Office/Business :: Financial :: Investment", ] [project.urls] Homepage = "https://github.com/freqtrade/freqtrade" Documentation = "https://freqtrade.io" "Bug Tracker" = "https://github.com/freqtrade/freqtrade/issues" [project.scripts] freqtrade = "freqtrade.main:main" [tool.setuptools] include-package-data = true zip-safe = false [tool.setuptools.packages.find] where = ["."] include = ["freqtrade*"] exclude = ["tests", "tests.*", "user_data", "user_data*"] namespaces = true [tool.setuptools.dynamic] version = {attr = "freqtrade.__version__"} [tool.black] line-length = 100 exclude = ''' ( /( \.eggs # exclude a few common directories in the | \.git # root of the project | \.hg | \.mypy_cache | \.tox | \.venv | _build | buck-out | build | dist )/ # Exclude vendor directory | vendor ) ''' [tool.isort] line_length = 100 profile = "black" # multi_line_output=3 lines_after_imports=2 skip_glob = ["**/.env*", "**/env/*", "**/.venv/*", "**/docs/*", "**/user_data/*"] known_first_party = ["freqtrade_client"] [tool.pytest.ini_options] log_format = "%(asctime)s %(levelname)s %(message)s" log_date_format = "%Y-%m-%d %H:%M:%S" asyncio_mode = "auto" asyncio_default_fixture_loop_scope = "function" addopts = "--dist loadscope" [tool.mypy] ignore_missing_imports = true namespace_packages = false warn_unused_ignores = true exclude = [ '^build_helpers\.py$', '^ft_client/build/.*$', ] plugins = [ "sqlalchemy.ext.mypy.plugin" ] [[tool.mypy.overrides]] module = "tests.*" ignore_errors = true [[tool.mypy.overrides]] # Telegram does not use implicit_optional = false in the current version. module = "telegram.*" implicit_optional = true [tool.pyright] include = ["freqtrade"] exclude = [ "**/__pycache__", "build_helpers/*.py", ] ignore = ["freqtrade/vendor/**"] [tool.ruff] line-length = 100 extend-exclude = [".env", ".venv"] target-version = "py38" [tool.ruff.lint] extend-select = [ "C90", # mccabe "B", # bugbear # "N", # pep8-naming "F", # pyflakes "E", # pycodestyle "W", # pycodestyle "UP", # pyupgrade "I", # isort "A", # flake8-builtins "TID", # flake8-tidy-imports # "EXE", # flake8-executable # "C4", # flake8-comprehensions "YTT", # flake8-2020 "S", # flake8-bandit # "DTZ", # flake8-datetimez # "RSE", # flake8-raise # "TCH", # flake8-type-checking "PTH", # flake8-use-pathlib # "RUF", # ruff "ASYNC", # flake8-async "NPY", # numpy ] extend-ignore = [ "E241", # Multiple spaces after comma "E272", # Multiple spaces before keyword "E221", # Multiple spaces before operator "B007", # Loop control variable not used "B904", # BugBear - except raise from "S603", # `subprocess` call: check for execution of untrusted input "S607", # Starting a process with a partial executable path "S608", # Possible SQL injection vector through string-based query construction "NPY002", # Numpy legacy random generator ] [tool.ruff.lint.mccabe] max-complexity = 12 [tool.ruff.lint.per-file-ignores] "freqtrade/freqai/**/*.py" = [ "S311", # Standard pseudo-random generators are not suitable for cryptographic purposes "B006", # Bugbear - mutable default argument "B008", # bugbear - Do not perform function calls in argument defaults ] "tests/**/*.py" = [ "S101", # allow assert in tests "S104", # Possible binding to all interfaces "S311", # Standard pseudo-random generators are not suitable for cryptographic purposes "S105", # Possible hardcoded password assigned to: "secret" "S106", # Possible hardcoded password assigned to argument: "token_type" "S110", # `try`-`except`-`pass` detected, consider logging the exception ] "ft_client/test_client/**/*.py" = [ "S101", # allow assert in tests ] [tool.ruff.lint.flake8-bugbear] # Allow default arguments like, e.g., `data: List[str] = fastapi.Query(None)`. extend-immutable-calls = ["fastapi.Depends", "fastapi.Query"] [tool.ruff.lint.isort] lines-after-imports = 2 known-first-party = ["freqtrade_client"] [tool.flake8] # Default from https://flake8.pycqa.org/en/latest/user/options.html#cmdoption-flake8-ignore # minus E226 ignore = ["E121","E123","E126","E24", "E203","E704","W503","W504"] max-line-length = 100 max-complexity = 12 exclude = [ ".git", "__pycache__", ".eggs", "user_data", ".venv", ".env", ] [tool.codespell] ignore-words-list = "coo,fo,strat,zar,selectin" skip="*.svg,./user_data,freqtrade/rpc/api_server/ui/installed,freqtrade/exchange/*.json"