diff --git a/pyproject.toml b/pyproject.toml index 70c2c78..2d822a0 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -2,7 +2,9 @@ name = "quantflow" version = "0.9.0" description = "quantitative analysis" -authors = [ { name = "Luca Sbardella", email = "luca@quantmind.com" } ] +authors = [ + { name = "Luca Sbardella", email = "luca@quantmind.com" }, +] license = "BSD-3-Clause" classifiers = [ "Development Status :: 4 - Beta", @@ -62,7 +64,9 @@ book = [ "plotly>=6.2.0", "sympy>=1.12", ] -data = [ "aio-fluid[http]>=1.2.1" ] +data = [ + "aio-fluid[http]>=2.2.6", +] dev = [ "black>=26.3.1", "ghp-import>=2.0.2", @@ -74,6 +78,7 @@ dev = [ "types-python-dateutil>=2.9.0.20251115", ] docs = [ + "aio-fluid[http,log,k8s]>=2.2.6", "fastapi>=0.129.0", "griffe-pydantic>=1.1.0", "griffe-typingdoc>=0.2.7", @@ -92,11 +97,15 @@ ml = [ qf-mcp = "quantflow.ai.server:main" [build-system] -requires = [ "hatchling" ] +requires = [ + "hatchling", +] build-backend = "hatchling.build" [tool.uv.workspace] -members = [ "packages/*" ] +members = [ + "packages/*", +] [tool.uv.sources] torch = { index = "pytorch" } @@ -114,7 +123,9 @@ theme = "dark" [tool.pytest.ini_options] asyncio_mode = "auto" -testpaths = [ "quantflow_tests" ] +testpaths = [ + "quantflow_tests", +] [tool.coverage.report] exclude_also = [ @@ -123,14 +134,21 @@ exclude_also = [ [tool.isort] profile = "black" -skip_glob = [ "app/frontend/*" ] +skip_glob = [ + "app/frontend/*", +] [tool.black] extend-exclude = "/app/frontend/" [tool.ruff] -exclude = [ "app/frontend" ] -lint.select = [ "E", "F" ] +exclude = [ + "app/frontend", +] +lint.select = [ + "E", + "F", +] line-length = 88 [tool.hatch.version] @@ -140,9 +158,13 @@ path = "quantflow/__init__.py" # strict = true disallow_untyped_calls = true disallow_untyped_defs = true -exclude = [ "^app/frontend/" ] +exclude = [ + "^app/frontend/", +] warn_no_return = true -disable_error_code = [ "prop-decorator" ] +disable_error_code = [ + "prop-decorator", +] [[tool.mypy.overrides]] module = [ diff --git a/taplo.toml b/taplo.toml index cbb5a42..4081e3e 100644 --- a/taplo.toml +++ b/taplo.toml @@ -1,16 +1,22 @@ -include = [ "pyproject.toml", "taplo.toml" ] +include = [ + "pyproject.toml", + "taplo.toml", +] [formatting] allowed_blank_lines = 1 array_auto_collapse = false array_auto_expand = true +column_width = 1 compact_arrays = false indent_string = " " trailing_newline = true [[rule]] formatting = { reorder_arrays = true, reorder_keys = true } -include = [ "pyproject.toml" ] +include = [ + "pyproject.toml", +] keys = [ "project.optional-dependencies", "project.optional-dependencies.ai", diff --git a/uv.lock b/uv.lock index f8120fb..02607ef 100644 --- a/uv.lock +++ b/uv.lock @@ -38,6 +38,14 @@ http = [ { name = "prometheus-client" }, { name = "python-slugify" }, ] +k8s = [ + { name = "kubernetes" }, + { name = "kubernetes-asyncio" }, + { name = "python-slugify" }, +] +log = [ + { name = "python-json-logger" }, +] [[package]] name = "aiohappyeyeballs" @@ -874,6 +882,15 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/07/5d/8f1899b8bef291caf953992fcd6c24df9f29387a35645e58c2504a5ca473/duckdb-1.5.3-cp314-cp314-win_arm64.whl", hash = "sha256:746433e49bbc667b4df283153415fbe37e9083e0eff6c3cd6e54de7536869cd4", size = 14411554, upload-time = "2026-05-20T11:55:29.037Z" }, ] +[[package]] +name = "durationpy" +version = "0.10" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/9d/a4/e44218c2b394e31a6dd0d6b095c4e1f32d0be54c2a4b250032d717647bab/durationpy-0.10.tar.gz", hash = "sha256:1fa6893409a6e739c9c72334fc65cca1f355dbdd93405d30f726deb5bde42fba", size = 3335, upload-time = "2025-05-17T13:52:37.26Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/b0/0d/9feae160378a3553fa9a339b0e9c1a048e147a4127210e286ef18b730f03/durationpy-0.10-py3-none-any.whl", hash = "sha256:3b41e1b601234296b4fb368338fdcd3e13e0b4fb5b67345948f4f2bf9868b286", size = 3922, upload-time = "2025-05-17T13:52:36.463Z" }, +] + [[package]] name = "fastapi" version = "0.136.1" @@ -1473,6 +1490,44 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/9e/b9/a6d8bb7d228940f01885bd9f327ab7f9d366a9be775c4bf366bf9d9477ae/kaleido-1.3.0-py3-none-any.whl", hash = "sha256:52714dfd38e8f2a114831826200c40bb10d0ca0c11d4272f3f48ad499cd8f8ea", size = 55580, upload-time = "2026-05-04T19:45:27.483Z" }, ] +[[package]] +name = "kubernetes" +version = "36.0.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "aiohttp" }, + { name = "certifi" }, + { name = "durationpy" }, + { name = "python-dateutil" }, + { name = "pyyaml" }, + { name = "requests" }, + { name = "requests-oauthlib" }, + { name = "six" }, + { name = "urllib3" }, + { name = "websocket-client" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/bf/59/dc635e4e9afb3884bc5c57f14fe23783e4c04601aa20b835ac75c41d1625/kubernetes-36.0.0.tar.gz", hash = "sha256:027b606bb8032e6c6464a53236bdd9bd9a94c237e1063bc45a303c25b304ced9", size = 2346728, upload-time = "2026-05-20T20:44:24.28Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/cd/d2/6f99ca9c7eb961dfdd45b9643101399a8ee20922c662c362c91e9cc7e832/kubernetes-36.0.0-py2.py3-none-any.whl", hash = "sha256:a766433357ec9f90db7565cccf52e28e7fca40b0ef366c80a6022adbc0ac0425", size = 4660469, upload-time = "2026-05-20T20:44:20.893Z" }, +] + +[[package]] +name = "kubernetes-asyncio" +version = "35.0.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "aiohttp" }, + { name = "certifi" }, + { name = "python-dateutil" }, + { name = "pyyaml" }, + { name = "six" }, + { name = "urllib3" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/67/b9/f3b9fb2d3ef4550918b83c328dc720a58f65bc66732d9438e06469573ad1/kubernetes_asyncio-35.0.1.tar.gz", hash = "sha256:975870e3097b647c265a59b9175ab0841f0de06cd2162268273ca210b1fa672e", size = 1320250, upload-time = "2026-02-25T20:40:42.87Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/36/b3/a8917d253763095fb8dcaaefc6a135ed31abbd13f681e78752e226e252fe/kubernetes_asyncio-35.0.1-py3-none-any.whl", hash = "sha256:244ef45943e89c5c5104276a646bfcbf1a9dc3d060876c2094aa601e932f1c03", size = 2868606, upload-time = "2026-02-25T20:40:41.191Z" }, +] + [[package]] name = "librt" version = "0.11.0" @@ -2469,6 +2524,15 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/9e/4e/0d0c945463719429b7bd21dece907ad0bde437a2ff12b9b12fee94722ab0/nvidia_nvtx_cu12-12.6.77-py3-none-manylinux2014_x86_64.whl", hash = "sha256:6574241a3ec5fdc9334353ab8c479fe75841dbe8f4532a8fc97ce63503330ba1", size = 89265, upload-time = "2024-10-01T17:00:38.172Z" }, ] +[[package]] +name = "oauthlib" +version = "3.3.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/0b/5f/19930f824ffeb0ad4372da4812c50edbd1434f678c90c2733e1188edfc63/oauthlib-3.3.1.tar.gz", hash = "sha256:0f0f8aa759826a193cf66c12ea1af1637f87b9b4622d46e866952bb022e538c9", size = 185918, upload-time = "2025-06-19T22:48:08.269Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/be/9c/92789c596b8df838baa98fa71844d84283302f7604ed565dafe5a6b5041a/oauthlib-3.3.1-py3-none-any.whl", hash = "sha256:88119c938d2b8fb88561af5f6ee0eec8cc8d552b7bb1f712743136eb7523b7a1", size = 160065, upload-time = "2025-06-19T22:48:06.508Z" }, +] + [[package]] name = "openai" version = "2.38.0" @@ -3268,6 +3332,15 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/0b/d7/1959b9648791274998a9c3526f6d0ec8fd2233e4d4acce81bbae76b44b2a/python_dotenv-1.2.2-py3-none-any.whl", hash = "sha256:1d8214789a24de455a8b8bd8ae6fe3c6b69a5e3d64aa8a8e5d68e694bbcb285a", size = 22101, upload-time = "2026-03-01T16:00:25.09Z" }, ] +[[package]] +name = "python-json-logger" +version = "4.1.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/f7/ff/3cc9165fd44106973cd7ac9facb674a65ed853494592541d339bdc9a30eb/python_json_logger-4.1.0.tar.gz", hash = "sha256:b396b9e3ed782b09ff9d6e4f1683d46c83ad0d35d2e407c09a9ebbf038f88195", size = 17573, upload-time = "2026-03-29T04:39:56.805Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/27/be/0631a861af4d1c875f096c07d34e9a63639560a717130e7a87cbc82b7e3f/python_json_logger-4.1.0-py3-none-any.whl", hash = "sha256:132994765cf75bf44554be9aa49b06ef2345d23661a96720262716438141b6b2", size = 15021, upload-time = "2026-03-29T04:39:55.266Z" }, +] + [[package]] name = "python-multipart" version = "0.0.29" @@ -3512,6 +3585,7 @@ dev = [ { name = "types-python-dateutil" }, ] docs = [ + { name = "aio-fluid", extra = ["http", "k8s", "log"] }, { name = "fastapi" }, { name = "griffe-pydantic" }, { name = "griffe-typingdoc" }, @@ -3533,7 +3607,8 @@ dev = [ [package.metadata] requires-dist = [ - { name = "aio-fluid", extras = ["http"], marker = "extra == 'data'", specifier = ">=1.2.1" }, + { name = "aio-fluid", extras = ["http"], marker = "extra == 'data'", specifier = ">=2.2.6" }, + { name = "aio-fluid", extras = ["http", "log", "k8s"], marker = "extra == 'docs'", specifier = ">=2.2.6" }, { name = "altair", marker = "extra == 'book'", specifier = ">=6.0.0" }, { name = "asciichartpy", marker = "extra == 'ai'", specifier = ">=1.5.25" }, { name = "autodocsumm", marker = "extra == 'book'", specifier = ">=0.2.14" }, @@ -3623,6 +3698,19 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/a0/f4/c67b0b3f1b9245e8d266f0f112c500d50e5b4e83cb6f3b71b6528104182a/requests-2.34.2-py3-none-any.whl", hash = "sha256:2a0d60c172f83ac6ab31e4554906c0f3b3588d37b5cb939b1c061f4907e278e0", size = 73075, upload-time = "2026-05-14T19:25:26.443Z" }, ] +[[package]] +name = "requests-oauthlib" +version = "2.0.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "oauthlib" }, + { name = "requests" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/42/f2/05f29bc3913aea15eb670be136045bf5c5bbf4b99ecb839da9b422bb2c85/requests-oauthlib-2.0.0.tar.gz", hash = "sha256:b3dffaebd884d8cd778494369603a9e7b58d29111bf6b41bdc2dcd87203af4e9", size = 55650, upload-time = "2024-03-22T20:32:29.939Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/3b/5d/63d4ae3b9daea098d5d6f5da83984853c1bbacd5dc826764b249fe119d24/requests_oauthlib-2.0.0-py2.py3-none-any.whl", hash = "sha256:7dd8a5c40426b779b0868c404bdef9768deccf22749cde15852df527e6269b36", size = 24179, upload-time = "2024-03-22T20:32:28.055Z" }, +] + [[package]] name = "rich" version = "15.0.0" @@ -4420,6 +4508,15 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/33/e8/e40370e6d74ddba47f002a32919d91310d6074130fe4e17dabcafc15cbf1/watchdog-6.0.0-py3-none-win_ia64.whl", hash = "sha256:a1914259fa9e1454315171103c6a30961236f508b9b623eae470268bbcc6a22f", size = 79067, upload-time = "2024-11-01T14:07:11.845Z" }, ] +[[package]] +name = "websocket-client" +version = "1.9.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/2c/41/aa4bf9664e4cda14c3b39865b12251e8e7d239f4cd0e3cc1b6c2ccde25c1/websocket_client-1.9.0.tar.gz", hash = "sha256:9e813624b6eb619999a97dc7958469217c3176312b3a16a4bd1bc7e08a46ec98", size = 70576, upload-time = "2025-10-07T21:16:36.495Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/34/db/b10e48aa8fff7407e67470363eac595018441cf32d5e1001567a7aeba5d2/websocket_client-1.9.0-py3-none-any.whl", hash = "sha256:af248a825037ef591efbf6ed20cc5faa03d3b47b9e5a2230a529eeee1c1fc3ef", size = 82616, upload-time = "2025-10-07T21:16:34.951Z" }, +] + [[package]] name = "websockets" version = "16.0"