[project] name = "redash" version = "26.11.0-dev" description = "Make Your Company Data Driven. Connect to any data source, easily visualize, dashboard and share your data." authors = [ { name = "Arik Fraimovich", email = "" } ] # to be added to/removed from the mailing list, please reach out to Arik via the above email or Discord maintainers = [ { name = "Redash maintainers and contributors", email = "" } ] readme = "README.md" requires-python = ">=3.13,<3.14" dependencies = [ "aniso8601==10.0.1", "authlib==1.8.0", "backoff==2.2.1", "blinker==1.9.0", "click==8.5.0", "cryptography==50.0.1", "disposable-email-domains>=0.0.52", "email-validator==2.3.0", "flask==3.1.3", "flask-limiter==4.1.1", "flask-login==0.6.3", "flask-mail==0.10.0", "flask-migrate==4.1.0", "flask-restful==0.3.10", "flask-sqlalchemy==3.1.1", "flask-talisman==1.1.0", "flask-wtf==1.3.0", "funcy==2.1", "gevent==26.9.0", "greenlet==3.5.6", "gunicorn==26.2.0", "ifaddr==0.2.0", "itsdangerous==2.2.0", "jinja2==3.1.6", "jsonschema==4.26.0", "markupsafe==3.0.3", "maxminddb-geolite2==2018.703", "parsedatetime==2.6", "passlib==1.7.4", "psycopg2-binary==2.9.13", "pyjwt==2.15.0", "pyopenssl==26.4.0", "pypd==1.1.0", "pysaml2==7.5.5", "pystache==0.6.8", "python-dateutil==2.9.0.post0", "python-dotenv==1.2.3", "pytz>=2019.3", "pyyaml==6.0.3", "redis==7.4.1", "regex==2026.9.10", "requests==2.34.2", "restrictedpython==8.5", "rq==2.12.0", "pyasynchat==1.0.5", "rq-scheduler==0.14.0", "semver==3.1.0", "sentry-sdk==2.70.0", "sqlalchemy==2.0.54", "sqlalchemy-searchable==2.2.0", "sqlalchemy-utils==0.42.1", "sqlparse==0.6.0", "sshtunnel==0.4.0", "statsd==4.0.1", "supervisor==4.3.0", "supervisor-checks==0.8.1", "ua-parser==1.0.2", "urllib3==2.8.0", "user-agents==2.2.0", "werkzeug==3.1.8", "wtforms==3.2.2", "xlsxwriter==3.2.9", "tzlocal==5.4.4", "pyodbc==5.3.0", "debugpy>=1.8.9,<2.0.0", "paramiko==3.5.1", "oracledb==26.0.1", "ibm-db>=3.2.7,<4.0.0; platform_machine == 'x86_64' or platform_machine == 'AMD64'", ] [tool.black] target-version = ['py38'] line-length = 119 force-exclude = ''' /( migrations )/ ''' [dependency-groups] all_ds = [ "atsd-client==3.0.6", "azure-core>=1.38.0", "azure-kusto-data==6.0.4", "boto3==1.43.103", "botocore==1.43.103", "cassandra-driver==3.30.1", "certifi>=2019.9.11", "cmem-cmempy==25.5.0", "databend-py==0.4.6", "databend-sqlalchemy==0.2.4", "databricks-sql-connector>=4.0.0,<5", "duckdb==1.5.5", "google-api-python-client==2.200.0", "grpcio>=1.80.0,<2", "gspread==6.2.1", "h11>=0.16.0", "httpcore>=1.0.9", "impyla==0.24.0", "influxdb==5.3.2", "influxdb-client==1.50.0", "marshmallow>=3.26.2", "memsql==3.2.0", "mysqlclient==2.3.0", "numpy==2.5.3", "nzpy>=1.15", "openpyxl==3.1.5", "pandas==3.0.6", "phoenixdb==1.2.2", "pinotdb>=0.4.5", "protobuf==6.33.5", "pyathena==3.36.0", "pydgraph==25.2.0", "pydruid==0.6.9", "pyexasol==2.4.1", "pyhive==0.7.0", "pyignite==0.6.1", "pymongo==4.18.2", "pymssql>=2.3.1,<3.0.0", "pyodbc==5.3.0", "python-arango==8.3.5", "python-rapidjson==1.25", "requests-aws-sign==0.1.6", "sasl>=0.4a1", "simple-salesforce==1.12.10", "snowflake-connector-python==4.7.5", "td-client==1.7.0", "thrift>=0.8.0", "thrift-sasl>=0.1.0", "trino>=0.305,<1.0", "vertica-python==1.4.0", "xlrd==2.0.2", "e6data-python-connector==3.0.0", ] ldap3 = [ "ldap3==2.9.1", ] dev = [ "pytest==9.1.1", "coverage==7.16.1", "freezegun==1.5.5", "jwcrypto==1.6.1", "mock==5.2.0", "pre-commit==4.6.2", "ptpython==3.0.32", "pytest-cov==7.1.0", "watchdog==6.0.0", "ruff==0.16.9", ] [tool.uv] package = false default-groups = [] [tool.ruff] exclude = [".git", "viz-lib", "node_modules", "migrations"] [tool.ruff.lint] ignore = ["E501"] select = ["C9", "E", "F", "W", "I001", "UP004"] [tool.ruff.lint.mccabe] max-complexity = 15 [tool.ruff.lint.per-file-ignores] "__init__.py" = ["F401"]