From 482ad1cc8368cf487ac36adcca1ebf48a9659fea Mon Sep 17 00:00:00 2001 From: Tyler Goodlet Date: Mon, 14 Aug 2023 13:10:23 -0400 Subject: [PATCH 01/39] Add `prompt-toolkit` for full `xonsh` feats --- poetry.lock | 31 ++++++++++++++++++++++++++++--- pyproject.toml | 3 ++- 2 files changed, 30 insertions(+), 4 deletions(-) diff --git a/poetry.lock b/poetry.lock index 93e620164..36d145df1 100644 --- a/poetry.lock +++ b/poetry.lock @@ -50,9 +50,9 @@ files = [ [[package]] name = "asyncvnc" version = "1.1.0" -description = "" +description = "Asynchronous VNC for Python" optional = false -python-versions = ">= 3.7" +python-versions = ">=3.7" files = [] develop = false @@ -853,6 +853,20 @@ timezone = ["backports.zoneinfo", "tzdata"] xlsx2csv = ["xlsx2csv (>=0.8.0)"] xlsxwriter = ["xlsxwriter"] +[[package]] +name = "prompt-toolkit" +version = "3.0.39" +description = "Library for building powerful interactive command lines in Python" +optional = false +python-versions = ">=3.7.0" +files = [ + {file = "prompt_toolkit-3.0.39-py3-none-any.whl", hash = "sha256:9dffbe1d8acf91e3de75f3b544e4842382fc06c6babe903ac9acb74dc6e08d88"}, + {file = "prompt_toolkit-3.0.39.tar.gz", hash = "sha256:04505ade687dc26dc4284b1ad19a83be2f2afe83e7a828ace0c72f3a1df72aac"}, +] + +[package.dependencies] +wcwidth = "*" + [[package]] name = "pycparser" version = "2.21" @@ -1391,6 +1405,17 @@ files = [ {file = "typing_extensions-4.7.1.tar.gz", hash = "sha256:b75ddc264f0ba5615db7ba217daeb99701ad295353c45f9e95963337ceeeffb2"}, ] +[[package]] +name = "wcwidth" +version = "0.2.6" +description = "Measures the displayed width of unicode strings in a terminal" +optional = false +python-versions = "*" +files = [ + {file = "wcwidth-0.2.6-py2.py3-none-any.whl", hash = "sha256:795b138f6875577cd91bba52baf9e445cd5118fd32723b460e30a0af30ea230e"}, + {file = "wcwidth-0.2.6.tar.gz", hash = "sha256:a5220780a404dbe3353789870978e472cfe477761f06ee55077256e509b156d0"}, +] + [[package]] name = "wrapt" version = "1.15.0" @@ -1518,4 +1543,4 @@ test = ["coverage (>=5.3.1)", "prompt-toolkit (>=3.0.29)", "pygments (>=2.2)", " [metadata] lock-version = "2.0" python-versions = "^3.10" -content-hash = "163fcb92fc2eefcb9b0f3ec23312a1f2b3f3de0956fad29e0194b827fc6a749c" +content-hash = "630019c04adab7c83ca2f017d870a61e4e90b6e5fd805814544267b50576d8f4" diff --git a/pyproject.toml b/pyproject.toml index 7fd0f2a80..7250833ab 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -4,7 +4,7 @@ version = "0.1.0.alpha0.dev0" description = "trading gear for hackers" authors = ["Tyler Goodlet "] license = "AGPLv3" -readme = "README.md" +readme = "README.rst" [tool.poetry.dependencies] @@ -41,6 +41,7 @@ tractor = { path = '../tractor/', develop = true } pyqtgraph = { git = 'https://github.com/pikers/pyqtgraph.git' } asyncvnc = { git = 'https://github.com/pikers/asyncvnc.git', branch = 'main' } tomlkit = { git = 'https://github.com/pikers/tomlkit.git', branch = 'piker_pin' } +prompt-toolkit = "^3.0.39" [build-system] From 6b90e2e3ee9879092ab557f707c7b98cc72700e1 Mon Sep 17 00:00:00 2001 From: Tyler Goodlet Date: Tue, 15 Aug 2023 11:39:03 -0400 Subject: [PATCH 02/39] Factor and gen per-dep overrides via "fancy" `.extend()` As per the hot tip from the edgecases.md, https://github.com/nix-community/poetry2nix/blob/master/docs/edgecases.md#modulenotfounderror-no-module-named-packagename Factor all the (mostly `setuptools`) overrides into a `pypkgs-build-requirements` set and `.extend()` in any `preferWheel` additions (`polars`, `pyqt`, etc.) before passing to to `mkPoetryApplication(overrides=)`. Add a buncha todos for improving the poetry2nix pkging including: - adding the override requirements to the json file for all our deps in the `pypkgs-build-requirement` set. - maybe propose docs for the edgecases.md to show how to do the auto-gen set (via func) AND extend with further overrides like `preferWheel`? - task to support `polars` build from src (by copying `cryptography` stuff) instead of only from a wheel? - get pyqt5 building from wheel since it seems to be taking forever from src.. - get pyqt6 working in general - going to require taking stuff from nixpkgs and applying it in the overrides of p2n. --- flake.nix | 119 +++++++++++++++++++++++++++++++++++++++++++----------- 1 file changed, 95 insertions(+), 24 deletions(-) diff --git a/flake.nix b/flake.nix index 26bdcd020..7442781dd 100644 --- a/flake.nix +++ b/flake.nix @@ -4,13 +4,20 @@ # - convert the repo to use poetry using `poetry init`: # https://python-poetry.org/docs/basic-usage/#initialising-a-pre-existing-project # - then manually ensuring all deps are converted over: +# - add this file to the repo and commit it +# - { description = "piker: trading gear for hackers (pkged with poetry2nix)"; inputs.flake-utils.url = "github:numtide/flake-utils"; inputs.nixpkgs.url = "github:NixOS/nixpkgs/nixos-unstable"; + + # see https://github.com/nix-community/poetry2nix/tree/master#api inputs.poetry2nix = { url = "github:nix-community/poetry2nix"; + # url = "github:K900/poetry2nix/qt5-explicit-deps"; + # url = "/home/lord_fomo/repos/poetry2nix"; + inputs.nixpkgs.follows = "nixpkgs"; }; @@ -20,6 +27,7 @@ flake-utils, poetry2nix, }: + # TODO: build cross-OS and use the `${system}` var thingy.. flake-utils.lib.eachDefaultSystem (system: let # use PWD as sources @@ -30,13 +38,52 @@ # TODO: port to 3.11 and support both versions? python = "python3.10"; - # see https://github.com/nix-community/poetry2nix/tree/master#api # for more functions and examples. # inherit # (poetry2nix.legacyPackages.${system}) # mkPoetryApplication; # pkgs = nixpkgs.legacyPackages.${system}; + pkgs = nixpkgs.legacyPackages.x86_64-linux; + lib = pkgs.lib; + p2npkgs = poetry2nix.legacyPackages.x86_64-linux; + + # define all pkg overrides per dep, see edgecases.md: + # https://github.com/nix-community/poetry2nix/blob/master/docs/edgecases.md + # TODO: add these into the json file: + # https://github.com/nix-community/poetry2nix/blob/master/overrides/build-systems.json + pypkgs-build-requirements = { + asyncvnc = [ "setuptools" ]; + eventkit = [ "setuptools" ]; + ib-insync = [ "setuptools" "flake8" ]; + msgspec = [ "setuptools"]; + tabcompleter = [ "setuptools" ]; + pdbp = [ "setuptools" ]; + xonsh = [ "setuptools" ]; + trio-typing = [ "setuptools" ]; + trio-util = [ "setuptools" ]; + tricycle = [ "setuptools" ]; + tractor = [ "setuptools" ]; + pyqt6-sip = [ "setuptools" ]; + + # don't need these right? + # tomlkit = [ "setuptools" ]; + }; + + # auto-generate override entries + p2n-overrides = p2npkgs.defaultPoetryOverrides.extend (self: super: + builtins.mapAttrs (package: build-requirements: + (builtins.getAttr package super).overridePythonAttrs (old: { + buildInputs = ( + old.buildInputs or [ ] + ) ++ ( + builtins.map ( + pkg: if builtins.isString pkg then builtins.getAttr pkg super else pkg + ) build-requirements + ); + }) + ) pypkgs-build-requirements + ); in { @@ -46,38 +93,62 @@ # }; packages = { - piker = poetry2nix.mkPoetryEditablePackage { - # env = poetry2nix.mkPoetryEnv { - - # NOTE: taken from surrounding inputs - # projectDir = projectDir; - editablePackageSources = { piker = ./piker; }; - - # override msgspec to include setuptools as input - # https://github.com/nix-community/poetry2nix/blob/master/docs/edgecases.md#modulenotfounderror-no-module-named-packagenamed - overrides = poetry2nix.defaultPoetryOverrides.extend - (self: super: { - msgspec = super.msgspec.overridePythonAttrs - ( - old: { - buildInputs = (old.buildInputs or [ ]) ++ [ super.setuptools ]; - } - ); - } - ); + # piker = poetry2nix.legacyPackages.x86_64-linux.mkPoetryEditablePackage { + # editablePackageSources = { piker = ./piker; }; + piker = p2npkgs.mkPoetryApplication { + projectDir = projectDir; + # SEE ABOVE for auto-genned input set, override + # buncha deps with extras.. like `setuptools` mostly. + # TODO: maybe propose a patch to p2n to show that you + # can even do this in the edgecases docs? + overrides = p2n-overrides.extend( + final: prev: { + + # TODO: get this workin with p2n and nixpkgs.. + # pyqt6 = prev.pyqt6.override { + # preferWheel = true; + # }; + + # NOTE: this DOESN'T work atm but after a fix + # to poetry2nix, it will and actually this line + # won't be needed - thanks @k900: + # https://github.com/nix-community/poetry2nix/pull/1257 + pyqt5 = prev.pyqt5.override { + withWebkit = false; + preferWheel = true; + }; + + # see PR from @k900: + # https://github.com/nix-community/poetry2nix/pull/1257 + pyqt5-qt5 = prev.pyqt5-qt5.override { + withWebkit = false; + preferWheel = true; + }; + + # TODO: patch in an override for polars to build + # from src! See the details likely needed from + # the cryptography entry: + # https://github.com/nix-community/poetry2nix/blob/master/overrides/default.nix#L426-L435 + polars = prev.polars.override { + preferWheel = true; + }; + } + ); }; }; - - # boot xonsh inside the poetry virtualenv when - # define the custom entry point via an expected # output-attr that `nix-develop` scans for: # https://nixos.org/manual/nix/stable/command-ref/new-cli/nix3-develop.html#flake-output-attributes devShells.default = pkgs.mkShell { # packages = [ poetry2nix.packages.${system}.poetry ]; packages = [ poetry2nix.packages.x86_64-linux.poetry ]; - shellHook = "poetry run xonsh"; + inputsFrom = [ self.packages.x86_64-linux.piker ]; + + # TODO: boot xonsh inside the poetry virtualenv when + # defined via a custom entry point? + # NOTE XXX: apparently DON'T do these..? + # shellHook = "poetry run xonsh"; # shellHook = "poetry shell"; }; } From 84dd0ae4ce07de8882901f23863c78ed31d876ed Mon Sep 17 00:00:00 2001 From: Tyler Goodlet Date: Wed, 16 Aug 2023 08:07:35 -0400 Subject: [PATCH 03/39] Bump `msgspect`, `polars` versions and add CLI script eps --- poetry.lock | 114 ++++++++++++++++++++++++++++--------------------- pyproject.toml | 19 +++++++-- 2 files changed, 81 insertions(+), 52 deletions(-) diff --git a/poetry.lock b/poetry.lock index 36d145df1..5c4031fe0 100644 --- a/poetry.lock +++ b/poetry.lock @@ -607,40 +607,40 @@ files = [ [[package]] name = "msgspec" -version = "0.18.0" +version = "0.18.1" description = "A fast serialization and validation library, with builtin support for JSON, MessagePack, YAML, and TOML." optional = false python-versions = ">=3.8" files = [ - {file = "msgspec-0.18.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:ec4f95f03e9fcaef942f5b76856ad1b6bace5cc4db4555939ff25262faa5ad63"}, - {file = "msgspec-0.18.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:0d28fcd20d07b565f42289bc7791493cf3b602ad41002db3fe5642802bbf137a"}, - {file = "msgspec-0.18.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e7bc1386317796508772e95e3747dbea7e4178a24ebba04f33408dd84b6aea44"}, - {file = "msgspec-0.18.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d814fe2b4641085ed4a2fc917b5f407afe550c3d0c00ab190fc1f6fae1c75dd7"}, - {file = "msgspec-0.18.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:92c0db3f81bfda2be43ced32b043e68fa95daa5c7403f0ced26e49815efe681e"}, - {file = "msgspec-0.18.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:89070b557ae3f057c9357dc7f2f5fe11000808254e3f079663246ae4b43b2b89"}, - {file = "msgspec-0.18.0-cp310-cp310-win_amd64.whl", hash = "sha256:7e0d735205bf9abd7755434233b7ff48db66965ca4d50a59a96421c4425b2507"}, - {file = "msgspec-0.18.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:08c422741e0e1e13404f7497c2b3419999fd1398c095e841f191d78f569361fd"}, - {file = "msgspec-0.18.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:33950a523536baceed2f252cda32780eb3646a4656ca08c4bea6497d4988e341"}, - {file = "msgspec-0.18.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3db21b8e7c71f011c90ba6ed0514cf4a95076ae48e7e85d5fd912f6c8d609990"}, - {file = "msgspec-0.18.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c9b59fff158e5a576d68afe3aed040717d25d7edd2c0653c46733dfa0fbfa1c6"}, - {file = "msgspec-0.18.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:ee81a859b16698d2f43fe6bc56b7141f6dd936a6a80f52ec80da45fafa3d56ea"}, - {file = "msgspec-0.18.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:722032d40b721bfb0771c8aeba11373bed84c5ed8721cc81360207d67ecfb9ca"}, - {file = "msgspec-0.18.0-cp311-cp311-win_amd64.whl", hash = "sha256:2e986f68cbcba50a2198052692f530113507fb566f282f40cfdaafee7ae6a307"}, - {file = "msgspec-0.18.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:3c3d6147f1368c8ccf0869313c23ffdf874abb7e0033002689edf5bfc048f75d"}, - {file = "msgspec-0.18.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:b44ad06f78a4c05860f80bb533893582727777a8cc760573f41e49cfc5cee60c"}, - {file = "msgspec-0.18.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f754b92340188e6e89c51f3fdfab7de0177bcd08919481072c192782ad9ecee5"}, - {file = "msgspec-0.18.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cf10ad5928aecaaeb6b2be82b8aef78df786734020bfc1f281ee78485daa2af7"}, - {file = "msgspec-0.18.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:047b00a7e148c02e64cbb65c59512f93fb8e96b71fc0358f12062e0359bef878"}, - {file = "msgspec-0.18.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:719c8b687a0402d2cd1579753e50d903ab53ef0402bbab91bca96d0e3c2b78d5"}, - {file = "msgspec-0.18.0-cp38-cp38-win_amd64.whl", hash = "sha256:cbd16fae31bb5d2ce06d317e5f2736d58690cad310147c2104ff0a98fa63895c"}, - {file = "msgspec-0.18.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:e409af3aa63df802fbe9f99fee1bfdb895f2b243c96e1ef9a40793f73625b549"}, - {file = "msgspec-0.18.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:005f708354371c2a7c3c598f4a67d23f73315e3789dfefd2a274f4a11097866d"}, - {file = "msgspec-0.18.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5c103a8eb8c01a3594cf3c66fe6d6a4d11e17d52e07bffadff599d87bae4a476"}, - {file = "msgspec-0.18.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c5f9d154ff486426733726de321d3993f4d8aa7bbea3812a8716dedc6b867592"}, - {file = "msgspec-0.18.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:5f78c176e072e5d805be618d62e56cb2d2ca68cb93c0d6bbfeb03418247e529f"}, - {file = "msgspec-0.18.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:ef84977a7f8ced0c369a65ffbcd618c341fe4ba0b30bd1348ce8b6e5dc4096b3"}, - {file = "msgspec-0.18.0-cp39-cp39-win_amd64.whl", hash = "sha256:f907fcc782e5fa6f6bb329004993baa00f068b4e964a971a1421e316b6870012"}, - {file = "msgspec-0.18.0.tar.gz", hash = "sha256:edcdc1bf397f1b06a3323ac61daaa5de9c9c6e8a2349024bdf0a267d0b4d24b5"}, + {file = "msgspec-0.18.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:262e5f1a981644f5e9b28a984d6df238eac0ed2c37d788f40abaf10d380b0424"}, + {file = "msgspec-0.18.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:e3f4a7d5897984f59baf51976682f52f4d2eff88aa64eec8b7f5b80b7a2b6dc5"}, + {file = "msgspec-0.18.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b6d21f0da90d1f3e7f65123d375c2b590bfbe3a014920ea812e1a022027b60d3"}, + {file = "msgspec-0.18.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ebb71f51ca2f62d0d1cf9585f763e3d9fd8a85a0f00d682112916532964692ae"}, + {file = "msgspec-0.18.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:52bb422d2b2e80e86d72439edb1a372ff016c0c5d9f44d277b220511486b3f9a"}, + {file = "msgspec-0.18.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:119ff9d5412eccf53f0d7ab43b587a58f6f806a40ae6b14fd8140173b1cc0285"}, + {file = "msgspec-0.18.1-cp310-cp310-win_amd64.whl", hash = "sha256:36da63a8f64292fff7c814bd3cbbba669f0fa5068c149b4a386dba662ace5621"}, + {file = "msgspec-0.18.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:b132ae2691623b3fbee730604671da3bf57ca97d648f1a46a35ea09c6f490fcf"}, + {file = "msgspec-0.18.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:944af5f9ec66de8e21b30ccafdab3e87be11d757ca9304c01e3b2efc373f3293"}, + {file = "msgspec-0.18.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4e96b71e98728830ea3d20acf65969ba7059dfc9e32581039f05e88b8461d98b"}, + {file = "msgspec-0.18.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:914ab6407fdce1bc795583ba0428f49baf6eedd40df117200ec8fe7666ca2ec4"}, + {file = "msgspec-0.18.1-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:13980627b9ba28fac2e051757ef5edbe0bebfef411d648e58d2100b86c5eca03"}, + {file = "msgspec-0.18.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:a6bd460e2057a6d9ca6d0e2b848a441c6e30977012d1fca43e4bc1702c9abca5"}, + {file = "msgspec-0.18.1-cp311-cp311-win_amd64.whl", hash = "sha256:c63f9dc8c33ca56903d7957ee7a5d0b3ece6b345b8b10f44b226787a4410c8e1"}, + {file = "msgspec-0.18.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:3a88d2fb82eb59de0f0f365a27dcea2020440883770b99353e0a3e0aa8ef552a"}, + {file = "msgspec-0.18.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:f936f6ea351c2e8c0d53875a6a71d9887603e3faadbe380172d22283e011f1b3"}, + {file = "msgspec-0.18.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:597324c72b504f04fb283078b748e664f7f7fc5337bb493e0996511bab895e7e"}, + {file = "msgspec-0.18.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f94eca90ac47a24cb07b3702c863a6b0881830ea02de7ac58a00f778b4b7762b"}, + {file = "msgspec-0.18.1-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:c256b21baa1336d651aa9955d69d3f8d0e971d78e0e75fd28a89742af7dcff65"}, + {file = "msgspec-0.18.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:9721948182d471c4f1655634f1970628a7321ec58a2cfb89d35af78c2fc2ebfa"}, + {file = "msgspec-0.18.1-cp38-cp38-win_amd64.whl", hash = "sha256:f01fe87b592185a11091206a745fdcba5b40d4c4342d1089959df49f18d6a700"}, + {file = "msgspec-0.18.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:966ee615b8227c208276863c4269a01dfe8c3b2538b8e1ee33bb01010fe7a3af"}, + {file = "msgspec-0.18.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:d94555a79013c100b1345e0a5a6d36bfa915e74831e42de3a97cb81313426ea7"}, + {file = "msgspec-0.18.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9c63a0f49540e2a888acec8c154066b6ef985813ce27132eb38e1f0c7f49df27"}, + {file = "msgspec-0.18.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0784a23d1b5b8a6fe4c9f5b9c1779adc5bff4de0fe388545dc2a4f1b5b90e546"}, + {file = "msgspec-0.18.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:4bd273e373e220437a22a5ad83a90e3dd648c4e625f48e42e172026de77a3038"}, + {file = "msgspec-0.18.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:a0f5070d77658ac953f63114fbaafc6ec967e9e61993ff70cc2432e938a3cf3e"}, + {file = "msgspec-0.18.1-cp39-cp39-win_amd64.whl", hash = "sha256:fe22658000c165be1055c8df3f7ecc3db85be838d47d1ce1e0526b10747bdf0f"}, + {file = "msgspec-0.18.1.tar.gz", hash = "sha256:a7d837e370cfe5afb941e9c922dbdbee9c854b21bafdebaf068bdf15c43ec21d"}, ] [package.extras] @@ -823,17 +823,17 @@ pytzdata = ">=2020.1" [[package]] name = "polars" -version = "0.18.14" +version = "0.18.15" description = "Blazingly fast DataFrame library" optional = false python-versions = ">=3.8" files = [ - {file = "polars-0.18.14-cp38-abi3-macosx_10_7_x86_64.whl", hash = "sha256:47dcf649a9cf8d3152d086a772cfb6202a81b1ac1d98e62dc83d1504bb81013a"}, - {file = "polars-0.18.14-cp38-abi3-macosx_11_0_arm64.whl", hash = "sha256:0d2c5c0b26d5abfb87ac931ef23515646ae8074ca5a5273a408c86ea7887511e"}, - {file = "polars-0.18.14-cp38-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b50bfab638a7da85f242c4653d2fc9a5439256d571f5fc0a007241521b111473"}, - {file = "polars-0.18.14-cp38-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8da787972ec3216edaa21f9fcf80c7db021a8e3b54e9a134bdead5a0c426c9c7"}, - {file = "polars-0.18.14-cp38-abi3-win_amd64.whl", hash = "sha256:18c1b44fd7bb9339e5f9fa158ad89b1c5132ef145b4d69667ada45dd26a6e9a8"}, - {file = "polars-0.18.14.tar.gz", hash = "sha256:6fd6a453813bf724ed7b62142658c93970dca04fe6a469d03c4c91e75efbae0d"}, + {file = "polars-0.18.15-cp38-abi3-macosx_10_7_x86_64.whl", hash = "sha256:f7a4e4108efd2ab728249f792c89d2e7baffd65e0d6cd9f09b6c395363e3fbea"}, + {file = "polars-0.18.15-cp38-abi3-macosx_11_0_arm64.whl", hash = "sha256:7dee57ecc6f6151f1f9b960f6baa5032ba5e967d3a0dc0cda830be20745be58c"}, + {file = "polars-0.18.15-cp38-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2c713610c7c144f41987092e2ab2372937933fbdc494a65c08eea251af91b60f"}, + {file = "polars-0.18.15-cp38-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c48d248891cfe62ee58f852dabf54c6bd85d4fc83b3b61b759534be0d3b6ec81"}, + {file = "polars-0.18.15-cp38-abi3-win_amd64.whl", hash = "sha256:a2f1e3ad546b98601d06340606e90a8788c35e064b4d82d27301069ce744086e"}, + {file = "polars-0.18.15.tar.gz", hash = "sha256:0c483fc1cfb25d07443c0d51eff9a18b94ccdbf6b252212767524412667ca870"}, ] [package.extras] @@ -1179,6 +1179,22 @@ pygments = ">=2.13.0,<3.0.0" [package.extras] jupyter = ["ipywidgets (>=7.5.1,<9)"] +[[package]] +name = "setuptools" +version = "68.1.0" +description = "Easily download, build, install, upgrade, and uninstall Python packages" +optional = false +python-versions = ">=3.8" +files = [ + {file = "setuptools-68.1.0-py3-none-any.whl", hash = "sha256:e13e1b0bc760e9b0127eda042845999b2f913e12437046e663b833aa96d89715"}, + {file = "setuptools-68.1.0.tar.gz", hash = "sha256:d59c97e7b774979a5ccb96388efc9eb65518004537e85d52e81eaee89ab6dd91"}, +] + +[package.extras] +docs = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "pygments-github-lexers (==0.0.5)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-favicon", "sphinx-hoverxref (<2)", "sphinx-inline-tabs", "sphinx-lint", "sphinx-notfound-page (==0.8.3)", "sphinx-reredirects", "sphinxcontrib-towncrier"] +testing = ["build[virtualenv]", "filelock (>=3.4.0)", "flake8-2020", "ini2toml[lite] (>=0.9)", "jaraco.develop (>=7.21)", "jaraco.envs (>=2.2)", "jaraco.path (>=3.2.0)", "pip (>=19.1)", "pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-mypy (>=0.9.1)", "pytest-perf", "pytest-ruff", "pytest-timeout", "pytest-xdist", "tomli-w (>=1.0.0)", "virtualenv (>=13.0.0)", "wheel"] +testing-integration = ["build[virtualenv]", "filelock (>=3.4.0)", "jaraco.envs (>=2.2)", "jaraco.path (>=3.2.0)", "pytest", "pytest-enabler", "pytest-xdist", "tomli", "virtualenv (>=13.0.0)", "wheel"] + [[package]] name = "six" version = "1.16.0" @@ -1270,7 +1286,7 @@ description = "structured concurrrent `trio`-\"actors\"" optional = false python-versions = ">=3.10" files = [] -develop = true +develop = false [package.dependencies] async_generator = "*" @@ -1285,8 +1301,10 @@ trio_typing = "*" wrapt = "*" [package.source] -type = "directory" -url = "../tractor" +type = "git" +url = "https://github.com/goodboy/tractor.git" +reference = "piker_pin" +resolved_reference = "64956887302b6450c9503b7d04eef28053270bd6" [[package]] name = "tricycle" @@ -1516,16 +1534,16 @@ h11 = ">=0.9.0,<1" [[package]] name = "xonsh" -version = "0.14.0" +version = "0.14.1" description = "Python-powered, cross-platform, Unix-gazing shell" optional = false -python-versions = ">=3.8" +python-versions = ">=3.9" files = [ - {file = "xonsh-0.14.0-py310-none-any.whl", hash = "sha256:72506c6dc494103df6d04467e127abddb1c6cbe05cc5903b6a4cbfbad217ff5d"}, - {file = "xonsh-0.14.0-py311-none-any.whl", hash = "sha256:678a65671bd0a62cdc43e932d6aecc8b1622aa18942e0afb388b8b8ae02f67a5"}, - {file = "xonsh-0.14.0-py38-none-any.whl", hash = "sha256:25976edc5695fb5806b8b23f384ff48e618e07f4596ec0806007f63122917a83"}, - {file = "xonsh-0.14.0-py39-none-any.whl", hash = "sha256:751b615726d2322d43c8166ad4bc5cbe65d03a3728f1837aa02380fa9fadb189"}, - {file = "xonsh-0.14.0.tar.gz", hash = "sha256:45a8aaabb17ce0d6d4eca9b709ecfd7ce1c8fb92162decd29a45bf88a60e9bf1"}, + {file = "xonsh-0.14.1-py310-none-any.whl", hash = "sha256:9df9df3cebb91f091d0dae698c7e4b779b62892b7d65f356d23a5f42826d1988"}, + {file = "xonsh-0.14.1-py311-none-any.whl", hash = "sha256:37232867a72263405fe09f750462c86cdbc92c9fa66e865e5a40d54e7d9a8bfd"}, + {file = "xonsh-0.14.1-py312-none-any.whl", hash = "sha256:285a9db37eb363bc76dc551b39be6ad2a19b3fca21240d71464100b8acb95516"}, + {file = "xonsh-0.14.1-py39-none-any.whl", hash = "sha256:d6e082b796b6415e86475371d4ae88611e64bbe88818ee6c6b4c42af22801887"}, + {file = "xonsh-0.14.1.tar.gz", hash = "sha256:81dbf5b5d4d23fe780c7ee5b4ded4f41239e8a8945b1742bf77ee030bdf9f9e5"}, ] [package.extras] @@ -1543,4 +1561,4 @@ test = ["coverage (>=5.3.1)", "prompt-toolkit (>=3.0.29)", "pygments (>=2.2)", " [metadata] lock-version = "2.0" python-versions = "^3.10" -content-hash = "630019c04adab7c83ca2f017d870a61e4e90b6e5fd805814544267b50576d8f4" +content-hash = "f90feb38ae9e8eb7b40228626edea5ef4c083fc799a45a102a52660e1e05f6af" diff --git a/pyproject.toml b/pyproject.toml index 7250833ab..7989c3d4f 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -8,6 +8,8 @@ readme = "README.rst" [tool.poetry.dependencies] +# TODO: do we need this? +setuptools = "^68.0.0" python = "^3.10" tomli = "^2.0.1" tomli-w = "^1.0.0" @@ -30,18 +32,24 @@ cython = "^3.0.0" numpy = "1.24" numba = "^0.57.1" polars = "^0.18.13" -pyqt5 = "^5.15.9" qdarkstyle = ">=3.0.2" + +# TODO: outstanding pkging issues on nixos fuzzywuzzy = {extras = ["speedup"], version = "^0.18.0"} +# fuzzywuzzy = "^0.18.0" +pyqt5 = "^5.15.9" +# pyqt6 = "^6.5.2" + +# NOTE: required in explicit env install for shell use w nix xonsh = "^0.14.0" +prompt-toolkit = "^3.0.39" # pinned from git -tractor = { path = '../tractor/', develop = true } -# tractor = { git = 'https://github.com/goodboy/tractor.git', branch = 'piker_pin' } +# tractor = { path = '../tractor/', develop = true } +tractor = { git = 'https://github.com/goodboy/tractor.git', branch = 'piker_pin' } pyqtgraph = { git = 'https://github.com/pikers/pyqtgraph.git' } asyncvnc = { git = 'https://github.com/pikers/asyncvnc.git', branch = 'main' } tomlkit = { git = 'https://github.com/pikers/tomlkit.git', branch = 'piker_pin' } -prompt-toolkit = "^3.0.39" [build-system] @@ -51,3 +59,6 @@ build-backend = "poetry.core.masonry.api" [tool.poetry.scripts] poetry = "poetry.console.application:main" +piker = 'piker.cli:cli' +pikerd = 'piker.cli:pikerd' +ledger = 'pikerd.accounting.cli:ledger' From 847cb7740c5a4b05045f5d9b8021a0588e72274c Mon Sep 17 00:00:00 2001 From: Tyler Goodlet Date: Wed, 16 Aug 2023 12:15:49 -0400 Subject: [PATCH 04/39] Drop `marketstore` mod import from CLIs loader --- piker/cli/__init__.py | 1 - 1 file changed, 1 deletion(-) diff --git a/piker/cli/__init__.py b/piker/cli/__init__.py index 6972270d0..c7ba675db 100644 --- a/piker/cli/__init__.py +++ b/piker/cli/__init__.py @@ -230,7 +230,6 @@ async def list_services(): def _load_clis() -> None: - from ..service import marketstore # noqa from ..service import elastic # noqa from ..brokers import cli # noqa from ..ui import cli # noqa From 6b22024570a4aba97911fc23e37f250c1b92d3fa Mon Sep 17 00:00:00 2001 From: Tyler Goodlet Date: Wed, 16 Aug 2023 12:19:00 -0400 Subject: [PATCH 05/39] MVP get us working fully on nixos NB: for now this is linking to a presumed local clone of the `poetry2nix` repo since part of fixing what was adjusted here needs to be patched upstream, which means hackin on the p2n repo in tandem B) Since there's some dependency build issues we need to tweak the following to get baseline `nix develop` working: - drop `python-levenshtein` (required by `fuzzywuzzy[speedup]`) for now since the overlay and/or wheel install needs to be properly figured out. - build `pyqt5` from src for the moment (since `preferWheel` doesn't seem to be workin?) despite it taking forever XD - add in the `flake.lock` file. --- flake.lock | 138 ++++++++++++++++++++++++++++ flake.nix | 25 +++--- poetry.lock | 237 +------------------------------------------------ pyproject.toml | 4 +- setup.py | 2 +- 5 files changed, 153 insertions(+), 253 deletions(-) create mode 100644 flake.lock diff --git a/flake.lock b/flake.lock new file mode 100644 index 000000000..98a129f79 --- /dev/null +++ b/flake.lock @@ -0,0 +1,138 @@ +{ + "nodes": { + "flake-utils": { + "inputs": { + "systems": "systems" + }, + "locked": { + "lastModified": 1689068808, + "narHash": "sha256-6ixXo3wt24N/melDWjq70UuHQLxGV8jZvooRanIHXw0=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "919d646de7be200f3bf08cb76ae1f09402b6f9b4", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "flake-utils_2": { + "inputs": { + "systems": "systems_2" + }, + "locked": { + "lastModified": 1689068808, + "narHash": "sha256-6ixXo3wt24N/melDWjq70UuHQLxGV8jZvooRanIHXw0=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "919d646de7be200f3bf08cb76ae1f09402b6f9b4", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "nix-github-actions": { + "inputs": { + "nixpkgs": [ + "poetry2nix", + "nixpkgs" + ] + }, + "locked": { + "lastModified": 1688870561, + "narHash": "sha256-4UYkifnPEw1nAzqqPOTL2MvWtm3sNGw1UTYTalkTcGY=", + "owner": "nix-community", + "repo": "nix-github-actions", + "rev": "165b1650b753316aa7f1787f3005a8d2da0f5301", + "type": "github" + }, + "original": { + "owner": "nix-community", + "repo": "nix-github-actions", + "type": "github" + } + }, + "nixpkgs": { + "locked": { + "lastModified": 1692084312, + "narHash": "sha256-Za++qKVK6ovjNL9poQZtLKRM/re663pxzbJ+9M4Pgwg=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "8353344d3236d3fda429bb471c1ee008857d3b7c", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "nixos-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "poetry2nix": { + "inputs": { + "flake-utils": "flake-utils_2", + "nix-github-actions": "nix-github-actions", + "nixpkgs": [ + "nixpkgs" + ] + }, + "locked": { + "lastModified": 1692048894, + "narHash": "sha256-cDw03rso2V4CDc3Mll0cHN+ztzysAvdI8pJ7ybbz714=", + "ref": "refs/heads/pyqt6", + "rev": "b059ad4c3051f45d6c912e17747aae37a9ec1544", + "revCount": 2276, + "type": "git", + "url": "file:///home/lord_fomo/repos/poetry2nix" + }, + "original": { + "type": "git", + "url": "file:///home/lord_fomo/repos/poetry2nix" + } + }, + "root": { + "inputs": { + "flake-utils": "flake-utils", + "nixpkgs": "nixpkgs", + "poetry2nix": "poetry2nix" + } + }, + "systems": { + "locked": { + "lastModified": 1681028828, + "narHash": "sha256-Vy1rq5AaRuLzOxct8nz4T6wlgyUR7zLU309k9mBC768=", + "owner": "nix-systems", + "repo": "default", + "rev": "da67096a3b9bf56a91d16901293e51ba5b49a27e", + "type": "github" + }, + "original": { + "owner": "nix-systems", + "repo": "default", + "type": "github" + } + }, + "systems_2": { + "locked": { + "lastModified": 1681028828, + "narHash": "sha256-Vy1rq5AaRuLzOxct8nz4T6wlgyUR7zLU309k9mBC768=", + "owner": "nix-systems", + "repo": "default", + "rev": "da67096a3b9bf56a91d16901293e51ba5b49a27e", + "type": "github" + }, + "original": { + "owner": "nix-systems", + "repo": "default", + "type": "github" + } + } + }, + "root": "root", + "version": 7 +} diff --git a/flake.nix b/flake.nix index 7442781dd..efe50d058 100644 --- a/flake.nix +++ b/flake.nix @@ -14,9 +14,9 @@ # see https://github.com/nix-community/poetry2nix/tree/master#api inputs.poetry2nix = { - url = "github:nix-community/poetry2nix"; + # url = "github:nix-community/poetry2nix"; # url = "github:K900/poetry2nix/qt5-explicit-deps"; - # url = "/home/lord_fomo/repos/poetry2nix"; + url = "/home/lord_fomo/repos/poetry2nix"; inputs.nixpkgs.follows = "nixpkgs"; }; @@ -57,17 +57,14 @@ eventkit = [ "setuptools" ]; ib-insync = [ "setuptools" "flake8" ]; msgspec = [ "setuptools"]; - tabcompleter = [ "setuptools" ]; pdbp = [ "setuptools" ]; - xonsh = [ "setuptools" ]; + pyqt6-sip = [ "setuptools" ]; + tabcompleter = [ "setuptools" ]; + tractor = [ "setuptools" ]; + tricycle = [ "setuptools" ]; trio-typing = [ "setuptools" ]; trio-util = [ "setuptools" ]; - tricycle = [ "setuptools" ]; - tractor = [ "setuptools" ]; - pyqt6-sip = [ "setuptools" ]; - - # don't need these right? - # tomlkit = [ "setuptools" ]; + xonsh = [ "setuptools" ]; }; # auto-generate override entries @@ -121,10 +118,10 @@ # see PR from @k900: # https://github.com/nix-community/poetry2nix/pull/1257 - pyqt5-qt5 = prev.pyqt5-qt5.override { - withWebkit = false; - preferWheel = true; - }; + # pyqt5-qt5 = prev.pyqt5-qt5.override { + # withWebkit = false; + # preferWheel = true; + # }; # TODO: patch in an override for polars to build # from src! See the details likely needed from diff --git a/poetry.lock b/poetry.lock index 5c4031fe0..c2047d862 100644 --- a/poetry.lock +++ b/poetry.lock @@ -370,9 +370,6 @@ files = [ {file = "fuzzywuzzy-0.18.0.tar.gz", hash = "sha256:45016e92264780e58972dca1b3d939ac864b78437422beecebb3095f8efd00e8"}, ] -[package.dependencies] -python-levenshtein = {version = ">=0.12", optional = true, markers = "extra == \"speedup\""} - [package.extras] speedup = ["python-levenshtein (>=0.12)"] @@ -423,120 +420,6 @@ files = [ {file = "keysymdef-1.2.0-py2.py3-none-any.whl", hash = "sha256:19a5c2263a861f3ff884a1f58e2b4f7efa319ffc9d11f9ba8e20129babc31a9e"}, ] -[[package]] -name = "levenshtein" -version = "0.21.1" -description = "Python extension for computing string edit distances and similarities." -optional = false -python-versions = ">=3.6" -files = [ - {file = "Levenshtein-0.21.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:59e5054c9dea821840af4623a4059c8f0ae56548a5eae8b9c7aaa0b3f1e33340"}, - {file = "Levenshtein-0.21.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:11694c6f7119d68cc199ff3b1407560c0efb0cc49f288169f28b2e032ee03cda"}, - {file = "Levenshtein-0.21.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:f5f7ce639bea0f5e95a1f71963624b85521a39928a2a1bb0e66f6180facf5969"}, - {file = "Levenshtein-0.21.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:39e8a1866325b6d54de4e7d1bffffaf4b4c8cbf0988f47f0f2e929edfbeb870d"}, - {file = "Levenshtein-0.21.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ed73d619e203aad54e2e6119a2b58b7568a36bd50a547817d13618ea0acf4412"}, - {file = "Levenshtein-0.21.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:50fbe01be99554f644657c32a9e3085369d23e8ccc540d855c683947d3b48b67"}, - {file = "Levenshtein-0.21.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:675ba3afaa9e8ec393eb1eeee651697036e8391be54e6c28eae4bfdff4d5e64e"}, - {file = "Levenshtein-0.21.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c89a5ac319a80c131ca8d499ae0f7a91d4dd1dc3b2e9d8b095e991597b79c8f9"}, - {file = "Levenshtein-0.21.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:f9e3a5f4386c8f1811153f309a0ba3dc47d17e81a6dd29aa22d3e10212a2fd73"}, - {file = "Levenshtein-0.21.1-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:ea042ba262ea2a95d93c4d2d5879df956cf6c85ce22c037e3f0d4491182f10c5"}, - {file = "Levenshtein-0.21.1-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:622bc670b906c4bf219755625e9fa704ff07c561a90f1aa35f3f2d8ecd3ec088"}, - {file = "Levenshtein-0.21.1-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:f0e51ff6d5665884b0e39b4ae0ef4e2d2d0174147147db7a870ddc4123882212"}, - {file = "Levenshtein-0.21.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:cc8eb12c48598b20b4b99128bc2bd62974dfb65204ceb37807480788b1e66e64"}, - {file = "Levenshtein-0.21.1-cp310-cp310-win32.whl", hash = "sha256:04d338c9153ddf70a32f324cf9f902fe94a6da82122b8037ccde969d4cc0a94b"}, - {file = "Levenshtein-0.21.1-cp310-cp310-win_amd64.whl", hash = "sha256:5a10fc3be2bfb05b03b868d462941e4099b680b7f358a90b8c6d7d5946e9e97c"}, - {file = "Levenshtein-0.21.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:938581ba87b306675bc41e21c2b2822a9eb83fb1a0e4a4903b7398d7845b22e3"}, - {file = "Levenshtein-0.21.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:06da6c47aa459c725ee90dab467cd2f66956c5f9a43ddb51a0fe2496960f1d3e"}, - {file = "Levenshtein-0.21.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:eea308d98c64dbea48ac351011c4adf66acd936c4de2bf9955826ba8435197e2"}, - {file = "Levenshtein-0.21.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a51974fcb8a94284325cb88b474b76227532a25b035938a46167bebd1646718e"}, - {file = "Levenshtein-0.21.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:87edb05fc6e4eb14008433f02e89815a756fe4ecc32d7180bb757f26e4161e06"}, - {file = "Levenshtein-0.21.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:aee4f570652ad77961e5ab871d11fd42752e7d2117b08324a0c8801a7ee0a7c5"}, - {file = "Levenshtein-0.21.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:43a06b0b492e0d936deff751ad4757786ba7cb5eee510d53b6dfe92c924ff733"}, - {file = "Levenshtein-0.21.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:952e72f173a65f271dfee102b5571004b6594d4f199864ddead77115a2c147fd"}, - {file = "Levenshtein-0.21.1-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:d3f855669e1399597f7a2670310cf20fc04a35c6c446dd70320398e9aa481b3d"}, - {file = "Levenshtein-0.21.1-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:ca992783feaf1d6e25403340157fb584cf71371b094a575134393bba10b974fa"}, - {file = "Levenshtein-0.21.1-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:20361f42f6e7efa5853f69a41a272e9ecb90da284bec4312e42b58fa42b9a752"}, - {file = "Levenshtein-0.21.1-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:9bcb3abbe97975cc6a97baf24a3b6e0491472ecedbc0247a41eb2c8d73ecde5d"}, - {file = "Levenshtein-0.21.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:72b0b84adc52f4cf970a1bb276e76e115b30d693d6dbcd25fca0bcee85ca7cc7"}, - {file = "Levenshtein-0.21.1-cp311-cp311-win32.whl", hash = "sha256:4217ae380f42f825862eb8e2f9beca627fe9ab613f36e206842c003bb1affafc"}, - {file = "Levenshtein-0.21.1-cp311-cp311-win_amd64.whl", hash = "sha256:12bb3540e021c73c5d8796ecf8148afd441c4471731924a112bc31bc25abeabf"}, - {file = "Levenshtein-0.21.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:a0fa251b3b4c561d2f650d9a61fb8980815492bb088a0a521236995a1872e171"}, - {file = "Levenshtein-0.21.1-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d4bf11b89d8d7a7707ae5cac1ef86ac4ff78491482df037289470db8f0378043"}, - {file = "Levenshtein-0.21.1-cp36-cp36m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:91dca7085aa358da71fa50682fc8ff7e21365c99ef17dc1962a7bbf488003528"}, - {file = "Levenshtein-0.21.1-cp36-cp36m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f4f187f0929a35b6ddabc1324161e8c73ddbd4a7747249f10ec9ceaa793e904f"}, - {file = "Levenshtein-0.21.1-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0d997da10fdf1a82e208fd1b05aba40705ca3f053919c84d2e952141d33e3ab3"}, - {file = "Levenshtein-0.21.1-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6ed8f99e4e4ba8a43bb4fe0255606724f22069405fa1e3be679a2d90f74770e5"}, - {file = "Levenshtein-0.21.1-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:5acb7e84ccd619dcff6e04928fa8d8cc24f55bb2c9cdfe96620ed85b0a82a7c7"}, - {file = "Levenshtein-0.21.1-cp36-cp36m-musllinux_1_1_i686.whl", hash = "sha256:62dca15301bdba4ec7fcf53c39dd8d9c198194990cf035def3f47b7cb9c3213e"}, - {file = "Levenshtein-0.21.1-cp36-cp36m-musllinux_1_1_ppc64le.whl", hash = "sha256:832951ad7b5ee0df8152f239a9fc602322da055264459dcf4d50d3ed68e68045"}, - {file = "Levenshtein-0.21.1-cp36-cp36m-musllinux_1_1_s390x.whl", hash = "sha256:e8ab4d5acdd3ac17161539d9f2ea764497dc269dcd8dc722ae4a394c7b64ae7f"}, - {file = "Levenshtein-0.21.1-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:3c13450450d537ec7ede3781be72d72db37cb131943148c8ada58b34e143fc6f"}, - {file = "Levenshtein-0.21.1-cp36-cp36m-win32.whl", hash = "sha256:267ad98befffeed90e73b8c644a297027adb81f61044843aeade7b4a44ccc7d7"}, - {file = "Levenshtein-0.21.1-cp36-cp36m-win_amd64.whl", hash = "sha256:d66d8f3ebde14840a310a557c8f69eed3e153f2477747365355d058208eea515"}, - {file = "Levenshtein-0.21.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:78d0fb5faef0413864c1b593e5261a840eaa47842b0fa4af7be4c09d90b24a14"}, - {file = "Levenshtein-0.21.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9dda976c1dae2a0b41a109facc48d1d242c7acb30ab4c04d8421496da6e153aa"}, - {file = "Levenshtein-0.21.1-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1dc54aeb02f38a36f16bca6b0f9d07462686d92716424d9a4a3fdd11f3624528"}, - {file = "Levenshtein-0.21.1-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:463fd7558f25c477c7e4a59af35c661e133473f62bb02ed2c07c9c95e1c2dc66"}, - {file = "Levenshtein-0.21.1-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f00495a80c5850466f0a57ea874761f78079702e28b63a1b6573ad254f828e44"}, - {file = "Levenshtein-0.21.1-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:31aa08e8ddac402edd530aaf708ab085fea7299c499404989eabfde143377911"}, - {file = "Levenshtein-0.21.1-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:9e96217a7c6a7d43071c830b1353a3ee669757ae477673f0fd3e3a97def6d410"}, - {file = "Levenshtein-0.21.1-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:d83b8c0ce41e410af143bd3abef94e480d143fdb83e60a01bab9069bf565dada"}, - {file = "Levenshtein-0.21.1-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:309f134f3d42fa7df7efbbd7975f2331de8c36da3ebdb3fad59abae84268abba"}, - {file = "Levenshtein-0.21.1-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:267bc6725506571fd3c03afcc871fa5cbf3d2cb6e4bd11043790fa60cbb0f8a4"}, - {file = "Levenshtein-0.21.1-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:4a6cd85ac5f7800e8127b3194fa02c59be735b6bdfe55b8516d094652235e038"}, - {file = "Levenshtein-0.21.1-cp37-cp37m-win32.whl", hash = "sha256:13e87517ce788d71deaa73e37332a67c4085c13e58ea3a0218092d555d1872ce"}, - {file = "Levenshtein-0.21.1-cp37-cp37m-win_amd64.whl", hash = "sha256:918f2e0f590cacb30edb88e7eccbf71b340d5f080c9e69009f1f00dc24810a67"}, - {file = "Levenshtein-0.21.1-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:d17c2ee8aa380c012b3ba015b87502934662c51b7609ef17366c76863e9551d6"}, - {file = "Levenshtein-0.21.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:ee847d3e49870e914074fd31c069a1aaba6f71bee650d41de48e7e4b11671bf0"}, - {file = "Levenshtein-0.21.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:8d01425bd54c482ccbbc6d953633450a2bdbb7d12450d9eeba6073a6d0f06a3c"}, - {file = "Levenshtein-0.21.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bff4f236d1b6c556a77975812a4d51071181721f3a29c08b42e5c4aa11730957"}, - {file = "Levenshtein-0.21.1-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:35a603d952e9f286fe8053332862c8cff426f5d8a85ee962c3a0f597f4c463c4"}, - {file = "Levenshtein-0.21.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9546ded45fb3cf8773ade9c91de164c6cb2cb4927516289abd422a262e81906c"}, - {file = "Levenshtein-0.21.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:79259b10f105f78853210d8769cf77ca55dac8c368dca33b4c10ffa8965e2543"}, - {file = "Levenshtein-0.21.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:41e0e539638a27b5e90a5d46679375f93a1cb65cf06efe7c413cf76f71d3d467"}, - {file = "Levenshtein-0.21.1-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:ccd0b89300a25decdb34d7c4efe2a971438015f552eeb416b8da12918cb3edc0"}, - {file = "Levenshtein-0.21.1-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:ef365ec78938597623d4fb96c8b0db423ab484fcfc00fae44c34b738b1eb1924"}, - {file = "Levenshtein-0.21.1-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:e701b9dfb121faf71b0c5757485fc49e1b511b7b8a80034aa1f580488f8f872e"}, - {file = "Levenshtein-0.21.1-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:e4c2fe1f49f1d8476fe44e243569d775c5454dca70a13be568430d2d2d760ea2"}, - {file = "Levenshtein-0.21.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:40a5e38d0c3e488d1dca5dc9c2691c000764813d4006c243f2ebd39e0b331e95"}, - {file = "Levenshtein-0.21.1-cp38-cp38-win32.whl", hash = "sha256:6c08879d0cf761cd750e976fda67bcc23cf1e485eaa030942e6628b876f4c6d8"}, - {file = "Levenshtein-0.21.1-cp38-cp38-win_amd64.whl", hash = "sha256:248348e94dee05c787b44f16533a366ec5bf8ba949c604ad0db69d0c872f3539"}, - {file = "Levenshtein-0.21.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:3824e9f75ec9f373fc8b4df23eae668918953487f5ff06db282ddcb3f9c802d2"}, - {file = "Levenshtein-0.21.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:2e2ed817fa682243ef2e8a2728fcd0f9352d4e5edd104db44862d0bb55c75a7e"}, - {file = "Levenshtein-0.21.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:94a6ffd7257d12c64de34bc9f801a211e2daa624ec276305f8c67963a9896efa"}, - {file = "Levenshtein-0.21.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6833f8cefb96b8ccac457ad421866a74f4de973e7001699fcbbbe9ccb59a5c66"}, - {file = "Levenshtein-0.21.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c8126d2b51621483823c6e31d16bc1f5a964ae976aab4f241bbe74ed19d93770"}, - {file = "Levenshtein-0.21.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:58eaab403b77e62e096cbcbaf61728c8736f9f7a3e36a58fb663461e5d70144f"}, - {file = "Levenshtein-0.21.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:47e6d66fe0110fd8e6efb1939d686099170c27b3ca838eab0c215f0781f05f06"}, - {file = "Levenshtein-0.21.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f5a1f28b34a15dd2d67bcc324f6661df8cfe66d6ec7ee7a64e921af8ae4c39b7"}, - {file = "Levenshtein-0.21.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:c37609f4e460e570810ec5176c5cdf91c494a9979638f7fef5fd345597245d17"}, - {file = "Levenshtein-0.21.1-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:656c70814280c4002af89112f1457b6ad24c42dfba58dcb2047a249ae8ccdd04"}, - {file = "Levenshtein-0.21.1-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:863d507cba67de2fa66d5501ed1bc5029363d2b393662ac7d740dd0330c66aba"}, - {file = "Levenshtein-0.21.1-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:9437c2342937decf3cf5ac79d0b9497734897c0a09dc813378c97f2916b7aa76"}, - {file = "Levenshtein-0.21.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:a1cd48db3d03adb88bf71b45de77b9720f96d3b9d5ab7a32304352baec482689"}, - {file = "Levenshtein-0.21.1-cp39-cp39-win32.whl", hash = "sha256:023dffdde576639e48cab3cc835bfaf9c441df7a8e2829bf20104868db6e4f72"}, - {file = "Levenshtein-0.21.1-cp39-cp39-win_amd64.whl", hash = "sha256:dcc712696d4332962ecab6e4df40d5126d7379c6612e6058ee2e9d3f924387e3"}, - {file = "Levenshtein-0.21.1-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:9a8d60084e1c9e87ae247c601e331708de09ed23219b5e39af7c8e9115ab8152"}, - {file = "Levenshtein-0.21.1-pp37-pypy37_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ffa6762f8ef1e7dfba101babe43de6edc541cbe64d33d816314ac67cd76c3979"}, - {file = "Levenshtein-0.21.1-pp37-pypy37_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:eec8a1eaaeadc217c15bc77d01bb29e146acdae73a0b2e9df1ad162263c9752e"}, - {file = "Levenshtein-0.21.1-pp37-pypy37_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5da0e2dbddb98da890fb779823df991ad50f184b3d986b8c68784eecbb087f01"}, - {file = "Levenshtein-0.21.1-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:edac6490f84e8a0456cb40f6729d4199311ce50ca0ea4958572e1b7ea99f546c"}, - {file = "Levenshtein-0.21.1-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:b33e2cbaca6f7d01092a28711605568dbc08a3bb7b796d8986bf5d0d651a0b09"}, - {file = "Levenshtein-0.21.1-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:69a430ab564d286f309c19f7abed34fce9c144f39f984c609ee690dd175cc421"}, - {file = "Levenshtein-0.21.1-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f30474b2906301594c8fb64cb7492c6978290c466a717c4b5316887a18b77af5"}, - {file = "Levenshtein-0.21.1-pp38-pypy38_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9817dca597abde9fc9571d56a7eca8bd667e9dfc0867b190f1e8b43ce4fde761"}, - {file = "Levenshtein-0.21.1-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:7d7e00e8cb45981386df9d3f99073ba7de59bdb739069766b32906421bb1026b"}, - {file = "Levenshtein-0.21.1-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:c9a072cb0f6e90092c4323cd7731eb539a79ac360045dbe3cc49a123ba381fc5"}, - {file = "Levenshtein-0.21.1-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2d880a87aca186342bc2fe16b064c3ed434d2a0c170c419f23b4e00261a5340a"}, - {file = "Levenshtein-0.21.1-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f282711a220d1bdf245da508e1fefdf7680d1f7482a094e37465674a7e6985ae"}, - {file = "Levenshtein-0.21.1-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:cdba9f8a7a98b0c4c0bc004b811fb31a96521cd264aeb5375898478e7703de4d"}, - {file = "Levenshtein-0.21.1-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:b2410469cc8fd0f42aa00e63063c42f8aff501996cd5424a5c904739bdaaf4fe"}, - {file = "Levenshtein-0.21.1.tar.gz", hash = "sha256:2e4fc4522f9bf73c6ab4cedec834783999b247312ec9e3d1435a5424ad5bc908"}, -] - -[package.dependencies] -rapidfuzz = ">=2.3.0,<4.0.0" - [[package]] name = "llvmlite" version = "0.40.1" @@ -996,20 +879,6 @@ files = [ [package.dependencies] six = ">=1.5" -[[package]] -name = "python-levenshtein" -version = "0.21.1" -description = "Python extension for computing string edit distances and similarities." -optional = false -python-versions = ">=3.6" -files = [ - {file = "python-Levenshtein-0.21.1.tar.gz", hash = "sha256:01ea6828c03738a475ee18ea8b86a674eb45ce80e9cce88376d132cf3ab26060"}, - {file = "python_Levenshtein-0.21.1-py3-none-any.whl", hash = "sha256:5f49ebb4772a274aac4aeb190fc23ad537ebe778dec15a8f17975f746478c691"}, -] - -[package.dependencies] -Levenshtein = "0.21.1" - [[package]] name = "pytzdata" version = "2020.1" @@ -1057,110 +926,6 @@ packaging = "*" [package.extras] test = ["pytest (>=6,!=7.0.0,!=7.0.1)", "pytest-cov (>=3.0.0)", "pytest-qt"] -[[package]] -name = "rapidfuzz" -version = "3.2.0" -description = "rapid fuzzy string matching" -optional = false -python-versions = ">=3.7" -files = [ - {file = "rapidfuzz-3.2.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:f5787f1cc456207dee1902804209e1a90df67e88517213aeeb1b248822413b4c"}, - {file = "rapidfuzz-3.2.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:e8d91137b0b5a6ef06c3979b6302265129dee1741486b6baa241ac63a632bea7"}, - {file = "rapidfuzz-3.2.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:c130e73e0079f403b7c3dbf6f85816a3773971c3e639f7289f8b4337b8fd70fe"}, - {file = "rapidfuzz-3.2.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4e18059188bfe3cdbc3462aeec2fa3302b08717e04ca34e2cc6e02fb3c0280d8"}, - {file = "rapidfuzz-3.2.0-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:37bb6bd6a79d5524f121ff2a7d7df4491519b3f43565dccd4596bd75aa73ab7c"}, - {file = "rapidfuzz-3.2.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ca0d6aee42effaf2e8883d2181196dd0957b1af5731b0763f10f994c32c823db"}, - {file = "rapidfuzz-3.2.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:49fc2cbbf05bfa1af3fe4c0e0c8e5c8ac118d6b6ddfb0081cff48ad53734f7ac"}, - {file = "rapidfuzz-3.2.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1bd4fdee46f6ba7d254dba8e7e8f33012c964fc891a06b036b0fd20cab0db301"}, - {file = "rapidfuzz-3.2.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:ab2863732eafd1cc58f249f145c20ad13d4c902d3ef3a369b00438c05e5bfb55"}, - {file = "rapidfuzz-3.2.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:a9658c545de62ac948027092ba7f4e8507ebc5c9aef964eca654409c58f207f0"}, - {file = "rapidfuzz-3.2.0-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:5f3e36cfadaf29f081ad4ca476e320b639d610e930e0557f395780c9b2bdb135"}, - {file = "rapidfuzz-3.2.0-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:239ffc04328e14f5e4097102bd934352a43d5912acf34fb7d3e3fe306de92787"}, - {file = "rapidfuzz-3.2.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:b56ce39ba0a77501d491bc20a2266989ae0264452758b004950ee5f4c10c641f"}, - {file = "rapidfuzz-3.2.0-cp310-cp310-win32.whl", hash = "sha256:dbebd639579ab113644699fe0c536ae00aba15b224e40a79987684333d1104a5"}, - {file = "rapidfuzz-3.2.0-cp310-cp310-win_amd64.whl", hash = "sha256:88e99229c4df99a7e5810d4d361033b44e29d8eb4faaddcfb8e4bdcb604cf40a"}, - {file = "rapidfuzz-3.2.0-cp310-cp310-win_arm64.whl", hash = "sha256:8e39c4e2e85828aa6c39cc7f30e2917d991b40190a2a3af1fa02396a3362a54e"}, - {file = "rapidfuzz-3.2.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:2f2e618389427c5e8304357a78f83df22558e61f11bc21aeb95dd544c274d330"}, - {file = "rapidfuzz-3.2.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:a2a6babfe4d3ce2eadd0079ee7861cb5f1584845c5a3394edead85457e7d7464"}, - {file = "rapidfuzz-3.2.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:f223deb06895c9c136b40cd8fd7e96ee745c3bb9ed502d7367f6ad9ab6fdd40e"}, - {file = "rapidfuzz-3.2.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0de6962b45f761355fa4b37de635e4df467d57530732a40d82e748a5bc911731"}, - {file = "rapidfuzz-3.2.0-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:76953516cb3b75fb1234c5a90e0b86be4525f055a9e276237adb1ffe40dca536"}, - {file = "rapidfuzz-3.2.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a1e04861dddbb477500449dc67fb037656a049b6f78c4c434c6000e64aa42bb4"}, - {file = "rapidfuzz-3.2.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4ff6e725eec9c769f9d22126c80a6ada90275c0d693eca2b35d5933178bda5a2"}, - {file = "rapidfuzz-3.2.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9f21ce33242e579ba255c8a8b438782164acaa55bf188d9410298c40cbaa07d5"}, - {file = "rapidfuzz-3.2.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:986a7aad18768b920bb710e15ed7629d1da0af31589348c0a51d152820efc05d"}, - {file = "rapidfuzz-3.2.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:6e98f0a6fac14b7b9893147deceae12131f6ff169ae1c973635ef97617949c8f"}, - {file = "rapidfuzz-3.2.0-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:5dd5c4b9f5cd8a8271a90d1bab643028e7172808c68ed5d8dde661a3e51098e3"}, - {file = "rapidfuzz-3.2.0-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:e336b0a81c5a8e689edf6928136d19e791733a66509026d9acbaa148238186e0"}, - {file = "rapidfuzz-3.2.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:8fa44afb731535a803c4c15ee846257fef050768af96d1d6c0eadb30285d0f7b"}, - {file = "rapidfuzz-3.2.0-cp311-cp311-win32.whl", hash = "sha256:d04ad155dbecc0c143912f691d38d4790e290c2ce5411b146c0e00d4f4afd26f"}, - {file = "rapidfuzz-3.2.0-cp311-cp311-win_amd64.whl", hash = "sha256:b9e79e27344af95a71a3bb6cd3562581da5d0780ff847a13ad69ee622d940d3c"}, - {file = "rapidfuzz-3.2.0-cp311-cp311-win_arm64.whl", hash = "sha256:dc53747e73f34e8f3a3c1b0bc5b437b90a2c69d873e97781aa7c06543201409a"}, - {file = "rapidfuzz-3.2.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:613c1043332eeba0c0910de71af221ac10d820b4fa9615b0083c733b90a757f9"}, - {file = "rapidfuzz-3.2.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f0907f87beca70e44f78e318eede2416ddba19ec43d28af9248617e8a1741ef3"}, - {file = "rapidfuzz-3.2.0-cp37-cp37m-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:bcfd184e0b5c58497cc3d961f49ac07ae1656d161c6c4d06230d267ae4e11f00"}, - {file = "rapidfuzz-3.2.0-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:7a7d53a2f1ccfb169be26fa3824b1b185420592c75853f16c6b7115315ea6784"}, - {file = "rapidfuzz-3.2.0-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2eac585803c4e8132ed5f4a150621db05c418304982c88cf706abdded65e1632"}, - {file = "rapidfuzz-3.2.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fc859f654b350def5df2ebc6d09f822b04399823e3dad1c3f2e8776c825fcde7"}, - {file = "rapidfuzz-3.2.0-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:8a165f64c528edc0bbbd09c76d64efd4dbe4240fd1961710b69586ef40486e79"}, - {file = "rapidfuzz-3.2.0-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:56a392b655597ecf40535b56bfb7c0856c10c0abc0cbc369fd25a1665420710b"}, - {file = "rapidfuzz-3.2.0-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:5863b176da42b1bb450a28375ef1502f81fbecd210a5aae295d7f2221284ad41"}, - {file = "rapidfuzz-3.2.0-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:8f8590c39a3f745b314f2697b140c8f8600fe7ecfb2101e9e4ec6e7716c66827"}, - {file = "rapidfuzz-3.2.0-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:da00990adf1fbc0904f22409b3451473fa465a0ef49f3075703c206080aa31b2"}, - {file = "rapidfuzz-3.2.0-cp37-cp37m-win32.whl", hash = "sha256:2504205552bf568ac478f17dd612d0e31c4a82c645c66209a442df7e572b5adc"}, - {file = "rapidfuzz-3.2.0-cp37-cp37m-win_amd64.whl", hash = "sha256:af3ac648232c109e36c8b941106d726969972644aa3ef55218c5988aa1daea03"}, - {file = "rapidfuzz-3.2.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:04d22f6058ce5d620ec4ecd771e44cfa77d571137d6c6547df57bdfc44ee2a98"}, - {file = "rapidfuzz-3.2.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:ac7ddcd372ed202d1b59b117506da695b291f135435cfbf3e71490aa8e687173"}, - {file = "rapidfuzz-3.2.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:fd3fca0224b84350f73eab1fb5728c58fd25ee4f20e512607c7d83f9bc836d3f"}, - {file = "rapidfuzz-3.2.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9bdb1f92c4666c7e1d3c21268b931cf3f06f32af98dfdeb37641159b15fa31dd"}, - {file = "rapidfuzz-3.2.0-cp38-cp38-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:871052405c465a45b53a3dc854a8be62079f42cdbb052651ff0b65e2452131e6"}, - {file = "rapidfuzz-3.2.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:fb9bb1af5680741cf974f510fb3894907a1b308e819aff3d9ea10b5326e8a5f6"}, - {file = "rapidfuzz-3.2.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:84ce2e010677835fa5ba591419e4404f11a1446f33eec3724a2bff557ae5144a"}, - {file = "rapidfuzz-3.2.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c13107e0fdca5ccae70659f45646d57453338a9dfc6b152fb7372e4bf73466a0"}, - {file = "rapidfuzz-3.2.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:538027685a1a8f1699e329f6443951267f169bfa149298734ea679db8f0e7171"}, - {file = "rapidfuzz-3.2.0-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:3557736672115d082979a8a12f884ed5b24268f4471fee85cfb2ec7212b68607"}, - {file = "rapidfuzz-3.2.0-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:6bc5e3da74644cf75663f5b438e0ae79b67d1f96d082cda771b0ecfed0528f40"}, - {file = "rapidfuzz-3.2.0-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:d2d0fc98d9d7bba44f929d201c2c2c35eb69ea2ffef43d939b297dafef934625"}, - {file = "rapidfuzz-3.2.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:2bf85a3bf34f27383691e8af0fd148b2a3a89f1444d4640d04ef58030f596ee0"}, - {file = "rapidfuzz-3.2.0-cp38-cp38-win32.whl", hash = "sha256:cf5ea3f1d65a0bee707245a0096c3a6f769b3ad6f1b9afc7176dfb73eb0ac98f"}, - {file = "rapidfuzz-3.2.0-cp38-cp38-win_amd64.whl", hash = "sha256:54906095444ea8b0a4013f3799b3f2c380205d7f60b9c55774e7d2264fa8d9c6"}, - {file = "rapidfuzz-3.2.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:6d44218823533e0d47770feef86c73c90a6f7e8d4923eafabf56a1fa3444eda0"}, - {file = "rapidfuzz-3.2.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:87c3d4077e61c66d5dd11198a317f83db8e8cf034239baa16e4384037b611652"}, - {file = "rapidfuzz-3.2.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:fc0e1142350566349c41173685988d942ebc89578f25ee27750d261e7d79e1ce"}, - {file = "rapidfuzz-3.2.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:de44a378751fdfb19ddf6af412b3395db4b21ab61f40139f815c82f1a1611b50"}, - {file = "rapidfuzz-3.2.0-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ca0983b30c7b289f540b11cdb550e301b3f2e8f0ef9df866aa24a16f6cd96041"}, - {file = "rapidfuzz-3.2.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:adfffb79288437006be412d74e28cddd7c5e6cc9f84a34aa9c356b13dc1ad2c9"}, - {file = "rapidfuzz-3.2.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a284386652efb3b7d41ed5dd101ab4ce5936f585c52a47fa9838fc0342235700"}, - {file = "rapidfuzz-3.2.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c546c83d6bc9006b86f56921b92c3e16d8ddeb4e1663653e755a5d8a3ac258da"}, - {file = "rapidfuzz-3.2.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:53b3575fa398a5021192c1592dce98965560ad00690be3ade056eab99288562c"}, - {file = "rapidfuzz-3.2.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:366ade5d0067dc6281e2a6c9e5c91bbfe023b09cef86894de8fe480b4696e3bf"}, - {file = "rapidfuzz-3.2.0-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:f946dec03cc2c77bc091d186c007d1e957d1f16a4d68a181f5fa75aea40bdf87"}, - {file = "rapidfuzz-3.2.0-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:045e5cccb0e792005d5465de0ea4621b9b67778580e558f266984704e68b0087"}, - {file = "rapidfuzz-3.2.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:fd80288b9538c87209893f0934563c20b6a43acf30693794bcc111b294447ee9"}, - {file = "rapidfuzz-3.2.0-cp39-cp39-win32.whl", hash = "sha256:a359436754ed5dd10d88706f076caa7f8e5c1469bf5ebba1897dc87aa9ff953e"}, - {file = "rapidfuzz-3.2.0-cp39-cp39-win_amd64.whl", hash = "sha256:75df3d9b895910ee810b2c96c8626cc2b5b63bb237762db36ff79fb466eccc43"}, - {file = "rapidfuzz-3.2.0-cp39-cp39-win_arm64.whl", hash = "sha256:893833a903875a50acdbcb7ed33b5426ba47412bd18b3eb80d56d982b641dc59"}, - {file = "rapidfuzz-3.2.0-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:3002c3660180747243cccb40c95ade1960e6665b340f211a114f5994b345ab53"}, - {file = "rapidfuzz-3.2.0-pp37-pypy37_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:aa50de7e0f95e1400b2bf38cfeb6e40cf87c862537871c2f7b2050b5db0a9dfc"}, - {file = "rapidfuzz-3.2.0-pp37-pypy37_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:54842a578a2a8e5258812a9032ffb55e6f1185490fd160cae64e57b4dc342297"}, - {file = "rapidfuzz-3.2.0-pp37-pypy37_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:108861623838cd574b0faa3309ce8525c2086159de7f9e23ac263a987c070ebd"}, - {file = "rapidfuzz-3.2.0-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:d39128415f0b52be08c15eeee5f79288189933a4d6fa5dc5fff11e20614b7989"}, - {file = "rapidfuzz-3.2.0-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:3af2b75635f33ffab84e295773c84a176d4cba75311d836ad79b6795e9da11ac"}, - {file = "rapidfuzz-3.2.0-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:68c678f7f3ca3d83d1e1dd7fb7db3232037d9eef12a47f1d5fe248a76ca47571"}, - {file = "rapidfuzz-3.2.0-pp38-pypy38_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:25d2bd257034e910df0951cdeff337dbd086d7d90af3ed9f6721e7bba9fc388a"}, - {file = "rapidfuzz-3.2.0-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5c7f20e68cad26fc140c6f2ac9e8f2632a0cd66e407ba3ea4ace63c669fd4719"}, - {file = "rapidfuzz-3.2.0-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:f09fd9dc73180deb9ca1c4fbd9cc27378f0ab6ee74e97318c38c5080708702b6"}, - {file = "rapidfuzz-3.2.0-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:af7914fc7683f921492f32314cfbe915a5376cc08a982e09084cbd9b866c9fd4"}, - {file = "rapidfuzz-3.2.0-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:08a242c4b909abbcfa44504dc5041d5eeca4cd088ae51afd6a52b4dc61684fa2"}, - {file = "rapidfuzz-3.2.0-pp39-pypy39_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:71b07afaca28398b93d727a2565491c455896898b66daee4664acde4af94e557"}, - {file = "rapidfuzz-3.2.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:24e4c4a031c50e4eeb4787263319a0ac5bed20f4a263d28eac060150e3ba0018"}, - {file = "rapidfuzz-3.2.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:d19c2853a464c7b98cc408654412fd875b030f78023ccbefc4ba9eec754e07e7"}, - {file = "rapidfuzz-3.2.0.tar.gz", hash = "sha256:448d031d9960fea7826d42bd4284156fc68d3b55a6946eb34ca5c6acf960577b"}, -] - -[package.extras] -full = ["numpy"] - [[package]] name = "rich" version = "13.5.2" @@ -1561,4 +1326,4 @@ test = ["coverage (>=5.3.1)", "prompt-toolkit (>=3.0.29)", "pygments (>=2.2)", " [metadata] lock-version = "2.0" python-versions = "^3.10" -content-hash = "f90feb38ae9e8eb7b40228626edea5ef4c083fc799a45a102a52660e1e05f6af" +content-hash = "90313784542c1955425e09c2a9238c2f1682200c99d74c5a5e8d0c2e6bae64d3" diff --git a/pyproject.toml b/pyproject.toml index 7989c3d4f..322337997 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -35,8 +35,8 @@ polars = "^0.18.13" qdarkstyle = ">=3.0.2" # TODO: outstanding pkging issues on nixos -fuzzywuzzy = {extras = ["speedup"], version = "^0.18.0"} -# fuzzywuzzy = "^0.18.0" +# fuzzywuzzy = {extras = ["speedup"], version = "^0.18.0"} +fuzzywuzzy = "^0.18.0" pyqt5 = "^5.15.9" # pyqt6 = "^6.5.2" diff --git a/setup.py b/setup.py index cb5d7df8a..1bbef3541 100755 --- a/setup.py +++ b/setup.py @@ -77,7 +77,7 @@ 'pendulum', # easier datetimes 'bidict', # 2 way map 'cython', - 'numpy', + 'numpy==1.24', 'numba', 'polars', # dataframes From ea9a5e524c1ff36791d30d33d363d5caa557a5e0 Mon Sep 17 00:00:00 2001 From: Tyler Goodlet Date: Thu, 17 Aug 2023 15:56:28 -0400 Subject: [PATCH 06/39] Factor prefer wheels deps into new `ahot_overrides` Makes it easier to pass the overrides to multiple p2n functions (like hopefully `.mkPoetryEnv`). Also, add some commented attempts at using `mkPoetryEnv` and todo list for "why", remove the `poetry` CLI main point from the pyproject.toml, bump the poetry lock file. --- flake.lock | 6 +-- flake.nix | 137 +++++++++++++++++++++++++++++-------------------- poetry.lock | 49 +++++++++++++++--- pyproject.toml | 2 +- 4 files changed, 128 insertions(+), 66 deletions(-) diff --git a/flake.lock b/flake.lock index 98a129f79..b51fe28ab 100644 --- a/flake.lock +++ b/flake.lock @@ -59,11 +59,11 @@ }, "nixpkgs": { "locked": { - "lastModified": 1692084312, - "narHash": "sha256-Za++qKVK6ovjNL9poQZtLKRM/re663pxzbJ+9M4Pgwg=", + "lastModified": 1692174805, + "narHash": "sha256-xmNPFDi/AUMIxwgOH/IVom55Dks34u1g7sFKKebxUm0=", "owner": "NixOS", "repo": "nixpkgs", - "rev": "8353344d3236d3fda429bb471c1ee008857d3b7c", + "rev": "caac0eb6bdcad0b32cb2522e03e4002c8975c62e", "type": "github" }, "original": { diff --git a/flake.nix b/flake.nix index efe50d058..6a4608127 100644 --- a/flake.nix +++ b/flake.nix @@ -82,16 +82,53 @@ ) pypkgs-build-requirements ); - in - { - # let - # devEnv = poetry2nix.mkPoetryEnv { - # projectDir = ./.; - # }; + # override some ahead-of-time compiled extensions + # to be built with their wheels. + ahot_overrides = p2n-overrides.extend( + final: prev: { + + # llvmlite = prev.llvmlite.override { + # preferWheel = false; + # }; + + # TODO: get this workin with p2n and nixpkgs.. + # pyqt6 = prev.pyqt6.override { + # preferWheel = true; + # }; + + # NOTE: this DOESN'T work atm but after a fix + # to poetry2nix, it will and actually this line + # won't be needed - thanks @k900: + # https://github.com/nix-community/poetry2nix/pull/1257 + pyqt5 = prev.pyqt5.override { + withWebkit = false; + preferWheel = true; + }; + + # see PR from @k900: + # https://github.com/nix-community/poetry2nix/pull/1257 + # pyqt5-qt5 = prev.pyqt5-qt5.override { + # withWebkit = false; + # preferWheel = true; + # }; + + # TODO: patch in an override for polars to build + # from src! See the details likely needed from + # the cryptography entry: + # https://github.com/nix-community/poetry2nix/blob/master/overrides/default.nix#L426-L435 + polars = prev.polars.override { + preferWheel = true; + }; + } + ); + # WHY!? -> output-attrs that `nix develop` scans for: + # https://nixos.org/manual/nix/stable/command-ref/new-cli/nix3-develop.html#flake-output-attributes + in { packages = { # piker = poetry2nix.legacyPackages.x86_64-linux.mkPoetryEditablePackage { # editablePackageSources = { piker = ./piker; }; + piker = p2npkgs.mkPoetryApplication { projectDir = projectDir; @@ -99,55 +136,43 @@ # buncha deps with extras.. like `setuptools` mostly. # TODO: maybe propose a patch to p2n to show that you # can even do this in the edgecases docs? - overrides = p2n-overrides.extend( - final: prev: { - - # TODO: get this workin with p2n and nixpkgs.. - # pyqt6 = prev.pyqt6.override { - # preferWheel = true; - # }; - - # NOTE: this DOESN'T work atm but after a fix - # to poetry2nix, it will and actually this line - # won't be needed - thanks @k900: - # https://github.com/nix-community/poetry2nix/pull/1257 - pyqt5 = prev.pyqt5.override { - withWebkit = false; - preferWheel = true; - }; - - # see PR from @k900: - # https://github.com/nix-community/poetry2nix/pull/1257 - # pyqt5-qt5 = prev.pyqt5-qt5.override { - # withWebkit = false; - # preferWheel = true; - # }; - - # TODO: patch in an override for polars to build - # from src! See the details likely needed from - # the cryptography entry: - # https://github.com/nix-community/poetry2nix/blob/master/overrides/default.nix#L426-L435 - polars = prev.polars.override { - preferWheel = true; - }; - } - ); - }; - }; + overrides = ahot_overrides; - # output-attr that `nix-develop` scans for: - # https://nixos.org/manual/nix/stable/command-ref/new-cli/nix3-develop.html#flake-output-attributes - devShells.default = pkgs.mkShell { - # packages = [ poetry2nix.packages.${system}.poetry ]; - packages = [ poetry2nix.packages.x86_64-linux.poetry ]; - inputsFrom = [ self.packages.x86_64-linux.piker ]; - - # TODO: boot xonsh inside the poetry virtualenv when - # defined via a custom entry point? - # NOTE XXX: apparently DON'T do these..? - # shellHook = "poetry run xonsh"; - # shellHook = "poetry shell"; - }; - } - ); + # XXX: won't work on llvmlite.. + # preferWheels = true; + }; + }; + + devShells.default = pkgs.mkShell { + # packages = [ poetry2nix.packages.${system}.poetry ]; + packages = [ poetry2nix.packages.x86_64-linux.poetry ]; + inputsFrom = [ self.packages.x86_64-linux.piker ]; + + # TODO: boot xonsh inside the poetry virtualenv when + # defined via a custom entry point? + # NOTE XXX: apparently DON'T do these..? + # shellHook = "poetry run xonsh"; + # shellHook = "poetry shell"; + }; + + + # TODO: grok the difference here.. + # - avoid re-cloning git repos on every develop entry.. + # - ideally allow hacking on the src code of some deps + # (tractor, pyqtgraph, tomlkit, etc.) WITHOUT having to + # re-install them every time a change is made. + + # devShells.default = (p2npkgs.mkPoetryEnv { + # # let { + # # devEnv = p2npkgs.mkPoetryEnv { + # projectDir = projectDir; + # overrides = ahot_overrides; + # inputsFrom = [ self.packages.x86_64-linux.piker ]; + # }).env.overrideAttrs (old: { + # buildInputs = [ packages.piker ]; + # } + # ); + + } + ); # end of .outputs scope } diff --git a/poetry.lock b/poetry.lock index c2047d862..7c839dffb 100644 --- a/poetry.lock +++ b/poetry.lock @@ -179,13 +179,13 @@ pycparser = "*" [[package]] name = "click" -version = "8.1.6" +version = "8.1.7" description = "Composable command line interface toolkit" optional = false python-versions = ">=3.7" files = [ - {file = "click-8.1.6-py3-none-any.whl", hash = "sha256:fa244bb30b3b5ee2cae3da8f55c9e5e0c0e86093306301fb418eb9dc40fbded5"}, - {file = "click-8.1.6.tar.gz", hash = "sha256:48ee849951919527a045bfe3bf7baa8a959c423134e1a5b98c05c20ba75a1cbd"}, + {file = "click-8.1.7-py3-none-any.whl", hash = "sha256:ae74fb96c20a0277a1d615f1e4d73c8414f5a98db8b799a7931d1582f3390c28"}, + {file = "click-8.1.7.tar.gz", hash = "sha256:ca9853ad459e787e2192211578cc907e7594e294c7ccc834310722b41b9ca6de"}, ] [package.dependencies] @@ -410,6 +410,25 @@ files = [ {file = "idna-3.4.tar.gz", hash = "sha256:814f528e8dead7d329833b91c5faa87d60bf71824cd12a7530b5526063d02cb4"}, ] +[[package]] +name = "importlib-metadata" +version = "6.8.0" +description = "Read metadata from Python packages" +optional = false +python-versions = ">=3.8" +files = [ + {file = "importlib_metadata-6.8.0-py3-none-any.whl", hash = "sha256:3ebb78df84a805d7698245025b975d9d67053cd94c79245ba4b3eb694abe68bb"}, + {file = "importlib_metadata-6.8.0.tar.gz", hash = "sha256:dbace7892d8c0c4ac1ad096662232f831d4e64f4c4545bd53016a3e9d4654743"}, +] + +[package.dependencies] +zipp = ">=0.5" + +[package.extras] +docs = ["furo", "jaraco.packaging (>=9)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-lint"] +perf = ["ipython"] +testing = ["flufl.flake8", "importlib-resources (>=1.3)", "packaging", "pyfakefs", "pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-mypy (>=0.9.1)", "pytest-perf (>=0.9.2)", "pytest-ruff"] + [[package]] name = "keysymdef" version = "1.2.0" @@ -1108,17 +1127,20 @@ sortedcontainers = "*" [[package]] name = "trio-typing" -version = "0.8.0" +version = "0.9.0" description = "Static type checking support for Trio and related projects" optional = false python-versions = "*" files = [ - {file = "trio-typing-0.8.0.tar.gz", hash = "sha256:f14264a27b45cec5dabd25b686255ac7d841984200c54b2057bc98a099318a97"}, - {file = "trio_typing-0.8.0-py3-none-any.whl", hash = "sha256:3734fa3f61cab047fdc97aa0030c72e910455cf85f18ca18c3ff336781b144bb"}, + {file = "trio-typing-0.9.0.tar.gz", hash = "sha256:678d4879205c4d28cbf458cf8a7c60d6feaed0fabfa8bb2129235f769b6df3ec"}, + {file = "trio_typing-0.9.0-py3-none-any.whl", hash = "sha256:219e73f72f07fbc97e7019dad3bd49a8bf13d2e53136f3467ae2ee1fcca7a0b9"}, ] [package.dependencies] +async-generator = "*" +importlib-metadata = "*" mypy-extensions = ">=0.4.2" +packaging = "*" trio = ">=0.16.0" typing-extensions = ">=3.7.4" @@ -1323,6 +1345,21 @@ ptk = ["prompt-toolkit (>=3.0.29)", "pyperclip"] pygments = ["pygments (>=2.2)"] test = ["coverage (>=5.3.1)", "prompt-toolkit (>=3.0.29)", "pygments (>=2.2)", "pyte (>=0.8.0)", "pytest (>=7)", "pytest-cov", "pytest-mock", "pytest-rerunfailures", "pytest-subprocess", "pytest-timeout", "restructuredtext-lint", "virtualenv (>=20.16.2)", "xonsh[bestshell]"] +[[package]] +name = "zipp" +version = "3.16.2" +description = "Backport of pathlib-compatible object wrapper for zip files" +optional = false +python-versions = ">=3.8" +files = [ + {file = "zipp-3.16.2-py3-none-any.whl", hash = "sha256:679e51dd4403591b2d6838a48de3d283f3d188412a9782faadf845f298736ba0"}, + {file = "zipp-3.16.2.tar.gz", hash = "sha256:ebc15946aa78bd63458992fc81ec3b6f7b1e92d51c35e6de1c3804e73b799147"}, +] + +[package.extras] +docs = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-lint"] +testing = ["big-O", "jaraco.functools", "jaraco.itertools", "more-itertools", "pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-ignore-flaky", "pytest-mypy (>=0.9.1)", "pytest-ruff"] + [metadata] lock-version = "2.0" python-versions = "^3.10" diff --git a/pyproject.toml b/pyproject.toml index 322337997..e4913153c 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -58,7 +58,7 @@ build-backend = "poetry.core.masonry.api" [tool.poetry.scripts] -poetry = "poetry.console.application:main" +# poetry = "poetry.console.application:main" piker = 'piker.cli:cli' pikerd = 'piker.cli:pikerd' ledger = 'pikerd.accounting.cli:ledger' From 94540ce1cf7d6e4728e8e49582818143f9b6f41f Mon Sep 17 00:00:00 2001 From: Tyler Goodlet Date: Fri, 25 Aug 2023 13:13:29 -0400 Subject: [PATCH 07/39] Pin tomlkit as a path dep for now --- poetry.lock | 4 ++-- pyproject.toml | 23 ++++++++++++++++++----- 2 files changed, 20 insertions(+), 7 deletions(-) diff --git a/poetry.lock b/poetry.lock index 7c839dffb..92abdc466 100644 --- a/poetry.lock +++ b/poetry.lock @@ -1070,7 +1070,7 @@ description = "structured concurrrent `trio`-\"actors\"" optional = false python-versions = ">=3.10" files = [] -develop = false +develop = true [package.dependencies] async_generator = "*" @@ -1363,4 +1363,4 @@ testing = ["big-O", "jaraco.functools", "jaraco.itertools", "more-itertools", "p [metadata] lock-version = "2.0" python-versions = "^3.10" -content-hash = "90313784542c1955425e09c2a9238c2f1682200c99d74c5a5e8d0c2e6bae64d3" +content-hash = "60794b764aa110829379b5c12ea0a0715896d566f692a68330f708071a8b2ecf" diff --git a/pyproject.toml b/pyproject.toml index e4913153c..dc93bedd0 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -44,12 +44,25 @@ pyqt5 = "^5.15.9" xonsh = "^0.14.0" prompt-toolkit = "^3.0.39" -# pinned from git -# tractor = { path = '../tractor/', develop = true } -tractor = { git = 'https://github.com/goodboy/tractor.git', branch = 'piker_pin' } +# pinned from git for "hackability" pyqtgraph = { git = 'https://github.com/pikers/pyqtgraph.git' } -asyncvnc = { git = 'https://github.com/pikers/asyncvnc.git', branch = 'main' } -tomlkit = { git = 'https://github.com/pikers/tomlkit.git', branch = 'piker_pin' } + +[tool.poetry.dependencies.asyncvnc] +git = 'https://github.com/pikers/asyncvnc.git' +branch = 'main' + +[tool.poetry.dependencies.tomlkit] +# git = 'https://github.com/pikers/tomlkit.git', +# branch = 'piker_pin' +path = "../tomlkit/" +develop = true + +# tractor = { git = 'https://github.com/goodboy/tractor.git', branch = 'piker_pin' , develop = true} +# tractor = { path = '../tractor/', develop = true } +[tool.poetry.dependencies.tractor] +git = 'https://github.com/goodboy/tractor.git' +branch = 'piker_pin' +develop = true [build-system] From 0068119a6d3d3c3272f3230057e547547db13f32 Mon Sep 17 00:00:00 2001 From: Tyler Goodlet Date: Wed, 16 Aug 2023 16:57:11 -0400 Subject: [PATCH 08/39] ib: use `asyncio.wait_for()` on ticker first quote; on 3.11 input coros are not allowed.. --- piker/brokers/ib/_util.py | 21 +++++++++++++++------ piker/brokers/ib/api.py | 12 +++++++----- 2 files changed, 22 insertions(+), 11 deletions(-) diff --git a/piker/brokers/ib/_util.py b/piker/brokers/ib/_util.py index 05417d98b..a80bd5144 100644 --- a/piker/brokers/ib/_util.py +++ b/piker/brokers/ib/_util.py @@ -88,16 +88,25 @@ async def data_reset_hack( api_port: str = str(ib_client.client.port) vnc_host: str vnc_port: int - vnc_host, vnc_port = client.conf['vnc_addrs'].get( - api_port, - ('localhost', 3003) - ) + vnc_sockaddr: tuple[str] | None = client.conf.get('vnc_addrs') no_setup_msg:str = ( - f'No data reset hack test setup for {vnc_host}!\n' - 'See setup @\n' + f'No data reset hack test setup for {vnc_sockaddr}!\n' + 'See config setup tips @\n' 'https://github.com/pikers/piker/tree/master/piker/brokers/ib' ) + + if not vnc_sockaddr: + log.warning( + no_setup_msg + + + f'REQUIRES A `vnc_addrs: array` ENTRY' + ) + + vnc_host, vnc_port = vnc_sockaddr.get( + api_port, + ('localhost', 3003) + ) global _reset_tech match _reset_tech: diff --git a/piker/brokers/ib/api.py b/piker/brokers/ib/api.py index 58fd6a1ec..75a79dbed 100644 --- a/piker/brokers/ib/api.py +++ b/piker/brokers/ib/api.py @@ -779,6 +779,7 @@ async def get_sym_details( async def get_quote( self, contract: Contract, + timeout: float = 1, ) -> Ticker: ''' @@ -789,18 +790,19 @@ async def get_quote( contract, snapshot=True, ) - ready = ticker.updateEvent + ready: ticker.TickerUpdateEvent = ticker.updateEvent # ensure a last price gets filled in before we deliver quote warnset: bool = False for _ in range(100): if isnan(ticker.last): - done, pending = await asyncio.wait( - [ready], - timeout=0.01, + # wait for a first update(Event) + tkr = await asyncio.wait_for( + ready, + timeout=timeout, ) - if ready in done: + if tkr: break else: if not warnset: From c3f8b089be9c205747d15d984d609bc283a25fbb Mon Sep 17 00:00:00 2001 From: Tyler Goodlet Date: Fri, 18 Aug 2023 14:31:23 -0400 Subject: [PATCH 09/39] Drop `.service._ahab` from storage cli runtime mods --- piker/storage/cli.py | 3 --- 1 file changed, 3 deletions(-) diff --git a/piker/storage/cli.py b/piker/storage/cli.py index abde1b3ca..9835f32b0 100644 --- a/piker/storage/cli.py +++ b/piker/storage/cli.py @@ -77,7 +77,6 @@ async def query_all(): async with ( open_piker_runtime( 'tsdb_storage', - enable_modules=['piker.service._ahab'], ), ): for i, backend in enumerate(backends): @@ -121,7 +120,6 @@ async def main(symbols: list[str]): async with ( open_piker_runtime( 'tsdb_storage', - enable_modules=['piker.service._ahab'] ), open_storage_client(backend) as (_, client), trio.open_nursery() as n, @@ -149,7 +147,6 @@ async def main(): async with ( open_piker_runtime( 'tsdb_polars_anal', - # enable_modules=['piker.service._ahab'] debug_mode=True, ), open_storage_client() as (mod, client), From 9005335e18eaa077ee2ee1ea6d71195693998b70 Mon Sep 17 00:00:00 2001 From: Tyler Goodlet Date: Fri, 18 Aug 2023 15:10:58 -0400 Subject: [PATCH 10/39] ib: pack empty `dict` on no flow entry --- piker/brokers/ib/broker.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/piker/brokers/ib/broker.py b/piker/brokers/ib/broker.py index e3403397a..0c174fb0c 100644 --- a/piker/brokers/ib/broker.py +++ b/piker/brokers/ib/broker.py @@ -1249,7 +1249,7 @@ async def deliver_trade_events( if err['reqid'] == -1: log.error(f'TWS external order error:\n{pformat(err)}') - flow: ChainMap = flows.get(reqid) + flow: dict = dict(flows.get(reqid)) or {} # TODO: we don't want to relay data feed / lookup errors # so we need some further filtering logic here.. @@ -1260,7 +1260,7 @@ async def deliver_trade_events( reason=reason, broker_details={ 'name': 'ib', - 'flow': dict(flow), + 'flow': flow, }, ) flows.add_msg(reqid, err_msg.to_dict()) From fed89562dc46e26de2f6869494c6238d43f79cf9 Mon Sep 17 00:00:00 2001 From: Tyler Goodlet Date: Fri, 18 Aug 2023 15:11:27 -0400 Subject: [PATCH 11/39] Import crash handler mngr from `piker.toolz` --- piker/accounting/calc.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/piker/accounting/calc.py b/piker/accounting/calc.py index ef0179e4e..ac4d9c220 100644 --- a/piker/accounting/calc.py +++ b/piker/accounting/calc.py @@ -353,7 +353,7 @@ def open_ledger_dfs( can update the ledger on exit. ''' - from tractor._debug import open_crash_handler + from piker.toolz import open_crash_handler with open_crash_handler(): if not ledger: import time From a6952089920410a86a91730597356f6d97b70962 Mon Sep 17 00:00:00 2001 From: Tyler Goodlet Date: Fri, 18 Aug 2023 15:13:00 -0400 Subject: [PATCH 12/39] brokers._daemon: drop question-comment about enabling feed module --- piker/brokers/_daemon.py | 3 --- 1 file changed, 3 deletions(-) diff --git a/piker/brokers/_daemon.py b/piker/brokers/_daemon.py index ecb785f7b..5efb03ddc 100644 --- a/piker/brokers/_daemon.py +++ b/piker/brokers/_daemon.py @@ -179,9 +179,6 @@ def broker_init( subpath: str = f'{modpath}.{submodname}' enabled.append(subpath) - # TODO XXX: DO WE NEED THIS? - # enabled.append('piker.data.feed') - return ( brokermod, start_actor_kwargs, # to `ActorNursery.start_actor()` From 9d31941d42878ca2989338d08c911e813f0a849d Mon Sep 17 00:00:00 2001 From: Tyler Goodlet Date: Fri, 18 Aug 2023 15:13:35 -0400 Subject: [PATCH 13/39] order_mode: embedded `Order` maybe be in dict form.. --- piker/ui/order_mode.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/piker/ui/order_mode.py b/piker/ui/order_mode.py index a64bb7180..c07933bc4 100644 --- a/piker/ui/order_mode.py +++ b/piker/ui/order_mode.py @@ -1163,7 +1163,10 @@ async def process_trade_msg( # XXX TODO: have seen order be a dict here!? # that should never happen tho? - action: str = order.action + action: str = ( + getattr(order, 'action', None) + or order['action'] + ) details: dict = msg.brokerd_msg # TODO: state tracking: From 995d1534b68fc2363440be3a1a7dce2882cb939f Mon Sep 17 00:00:00 2001 From: Tyler Goodlet Date: Fri, 18 Aug 2023 15:14:05 -0400 Subject: [PATCH 14/39] Drop hard redraws for now --- piker/ui/_display.py | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/piker/ui/_display.py b/piker/ui/_display.py index 5f9e2cb93..75048e229 100644 --- a/piker/ui/_display.py +++ b/piker/ui/_display.py @@ -252,7 +252,15 @@ async def increment_history_view( (bf_wut := msg.get('backfilling', False)) ): viz_name, timeframe = bf_wut - if viz_name == name: + if ( + viz_name == name + + # TODO: only allow this when the data is IN VIEW! + # also, we probably can do this more efficiently + # / smarter by only redrawing the portion of the + # path necessary? + and False + ): log.info(f'Forcing hard redraw -> {name}@{timeframe}') match timeframe: case 60: From 2e6b1330f375c310adc179fd436d2413dca7942c Mon Sep 17 00:00:00 2001 From: Tyler Goodlet Date: Fri, 18 Aug 2023 16:59:30 -0400 Subject: [PATCH 15/39] Add `.ui` and `.dev` deps groups via `poetry` Bo Since we eventually want to allow users to minimally deploy `pikerd` service-tree (aka distributed cross host) installs, we need to offer a "headless" deps group. Really this is just the core dep set minus Qt and some aux search related libs (for now). The new `.dev` group is for adding hacking and testing tools including `xonsh` since that will eventually be our REPL of choice more then likely B) Oh, and fix the namespace path (was a typo) for the `ledger` CLI and of course bump the lock file. --- poetry.lock | 259 +++++++++++++++++++++++++++++++++++++++++++++---- pyproject.toml | 106 +++++++++++++------- 2 files changed, 311 insertions(+), 54 deletions(-) diff --git a/poetry.lock b/poetry.lock index 92abdc466..b8aed1fc7 100644 --- a/poetry.lock +++ b/poetry.lock @@ -67,6 +67,16 @@ url = "https://github.com/pikers/asyncvnc.git" reference = "main" resolved_reference = "825447564e3af6b0d4a0996793f1ca7fb360c48f" +[[package]] +name = "atomicwrites" +version = "1.4.1" +description = "Atomic file writes." +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" +files = [ + {file = "atomicwrites-1.4.1.tar.gz", hash = "sha256:81b2c9071a49367a7f770170e5eec8cb66567cfbbc8c73d20ce5ca4a8d71cf11"}, +] + [[package]] name = "attrs" version = "23.1.0" @@ -101,6 +111,17 @@ docs = ["furo", "sphinx", "sphinx-copybutton"] lint = ["pre-commit"] test = ["hypothesis", "pytest", "pytest-benchmark[histogram]", "pytest-cov", "pytest-xdist", "sortedcollections", "sortedcontainers", "sphinx"] +[[package]] +name = "certifi" +version = "2023.7.22" +description = "Python package for providing Mozilla's CA Bundle." +optional = false +python-versions = ">=3.6" +files = [ + {file = "certifi-2023.7.22-py3-none-any.whl", hash = "sha256:92d6037539857d8206b8f6ae472e8b77db8058fec5937a1ef3f54304089edbb9"}, + {file = "certifi-2023.7.22.tar.gz", hash = "sha256:539cc1d13202e33ca466e88b2807e29f4c13049d6d87031a3c110744495cb082"}, +] + [[package]] name = "cffi" version = "1.15.1" @@ -331,6 +352,42 @@ files = [ {file = "Cython-3.0.0.tar.gz", hash = "sha256:350b18f9673e63101dbbfcf774ee2f57c20ac4636d255741d76ca79016b1bd82"}, ] +[[package]] +name = "elastic-transport" +version = "8.4.0" +description = "Transport classes and utilities shared among Python Elastic client libraries" +optional = false +python-versions = ">=3.6" +files = [ + {file = "elastic-transport-8.4.0.tar.gz", hash = "sha256:b9ad708ceb7fcdbc6b30a96f886609a109f042c0b9d9f2e44403b3133ba7ff10"}, + {file = "elastic_transport-8.4.0-py3-none-any.whl", hash = "sha256:19db271ab79c9f70f8c43f8f5b5111408781a6176b54ab2e54d713b6d9ceb815"}, +] + +[package.dependencies] +certifi = "*" +urllib3 = ">=1.26.2,<2" + +[package.extras] +develop = ["aiohttp", "mock", "pytest", "pytest-asyncio", "pytest-cov", "pytest-httpserver", "pytest-mock", "requests", "trustme"] + +[[package]] +name = "elasticsearch" +version = "8.9.0" +description = "Python client for Elasticsearch" +optional = false +python-versions = ">=3.6, <4" +files = [ + {file = "elasticsearch-8.9.0-py3-none-any.whl", hash = "sha256:0795cbf0f61482070741c09ba02ac8fdf18f5984912fbd08b248fadd8a8c9952"}, + {file = "elasticsearch-8.9.0.tar.gz", hash = "sha256:d3367fc013e04fc7aad349a6de9fad1ee04fb6d627b0e7896aa505c12fde5e04"}, +] + +[package.dependencies] +elastic-transport = ">=8,<9" + +[package.extras] +async = ["aiohttp (>=3,<4)"] +requests = ["requests (>=2.4.0,<3.0.0)"] + [[package]] name = "eventkit" version = "1.0.0" @@ -373,6 +430,95 @@ files = [ [package.extras] speedup = ["python-levenshtein (>=0.12)"] +[[package]] +name = "greenback" +version = "1.1.1" +description = "Reenter an async event loop from synchronous code" +optional = false +python-versions = ">=3.6" +files = [ + {file = "greenback-1.1.1-py3-none-any.whl", hash = "sha256:f552b41294d22b68fc3f38bbd4368c5e43ab15c1db973b7735ba63afc7e882b6"}, + {file = "greenback-1.1.1.tar.gz", hash = "sha256:5b7296d138c20c0089e22e2f113581b1a45362ce88530cbab2b530279df43f9a"}, +] + +[package.dependencies] +greenlet = "!=0.4.17" +outcome = "*" +sniffio = "*" + +[[package]] +name = "greenlet" +version = "2.0.2" +description = "Lightweight in-process concurrent programming" +optional = false +python-versions = ">=2.7,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*" +files = [ + {file = "greenlet-2.0.2-cp27-cp27m-macosx_10_14_x86_64.whl", hash = "sha256:bdfea8c661e80d3c1c99ad7c3ff74e6e87184895bbaca6ee8cc61209f8b9b85d"}, + {file = "greenlet-2.0.2-cp27-cp27m-manylinux2010_x86_64.whl", hash = "sha256:9d14b83fab60d5e8abe587d51c75b252bcc21683f24699ada8fb275d7712f5a9"}, + {file = "greenlet-2.0.2-cp27-cp27m-win32.whl", hash = "sha256:6c3acb79b0bfd4fe733dff8bc62695283b57949ebcca05ae5c129eb606ff2d74"}, + {file = "greenlet-2.0.2-cp27-cp27m-win_amd64.whl", hash = "sha256:283737e0da3f08bd637b5ad058507e578dd462db259f7f6e4c5c365ba4ee9343"}, + {file = "greenlet-2.0.2-cp27-cp27mu-manylinux2010_x86_64.whl", hash = "sha256:d27ec7509b9c18b6d73f2f5ede2622441de812e7b1a80bbd446cb0633bd3d5ae"}, + {file = "greenlet-2.0.2-cp310-cp310-macosx_11_0_x86_64.whl", hash = "sha256:30bcf80dda7f15ac77ba5af2b961bdd9dbc77fd4ac6105cee85b0d0a5fcf74df"}, + {file = "greenlet-2.0.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:26fbfce90728d82bc9e6c38ea4d038cba20b7faf8a0ca53a9c07b67318d46088"}, + {file = "greenlet-2.0.2-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9190f09060ea4debddd24665d6804b995a9c122ef5917ab26e1566dcc712ceeb"}, + {file = "greenlet-2.0.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d75209eed723105f9596807495d58d10b3470fa6732dd6756595e89925ce2470"}, + {file = "greenlet-2.0.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:3a51c9751078733d88e013587b108f1b7a1fb106d402fb390740f002b6f6551a"}, + {file = "greenlet-2.0.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:76ae285c8104046b3a7f06b42f29c7b73f77683df18c49ab5af7983994c2dd91"}, + {file = "greenlet-2.0.2-cp310-cp310-win_amd64.whl", hash = "sha256:2d4686f195e32d36b4d7cf2d166857dbd0ee9f3d20ae349b6bf8afc8485b3645"}, + {file = "greenlet-2.0.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:c4302695ad8027363e96311df24ee28978162cdcdd2006476c43970b384a244c"}, + {file = "greenlet-2.0.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c48f54ef8e05f04d6eff74b8233f6063cb1ed960243eacc474ee73a2ea8573ca"}, + {file = "greenlet-2.0.2-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a1846f1b999e78e13837c93c778dcfc3365902cfb8d1bdb7dd73ead37059f0d0"}, + {file = "greenlet-2.0.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3a06ad5312349fec0ab944664b01d26f8d1f05009566339ac6f63f56589bc1a2"}, + {file = "greenlet-2.0.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:eff4eb9b7eb3e4d0cae3d28c283dc16d9bed6b193c2e1ace3ed86ce48ea8df19"}, + {file = "greenlet-2.0.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:5454276c07d27a740c5892f4907c86327b632127dd9abec42ee62e12427ff7e3"}, + {file = "greenlet-2.0.2-cp311-cp311-win_amd64.whl", hash = "sha256:7cafd1208fdbe93b67c7086876f061f660cfddc44f404279c1585bbf3cdc64c5"}, + {file = "greenlet-2.0.2-cp35-cp35m-macosx_10_14_x86_64.whl", hash = "sha256:910841381caba4f744a44bf81bfd573c94e10b3045ee00de0cbf436fe50673a6"}, + {file = "greenlet-2.0.2-cp35-cp35m-manylinux2010_x86_64.whl", hash = "sha256:18a7f18b82b52ee85322d7a7874e676f34ab319b9f8cce5de06067384aa8ff43"}, + {file = "greenlet-2.0.2-cp35-cp35m-win32.whl", hash = "sha256:03a8f4f3430c3b3ff8d10a2a86028c660355ab637cee9333d63d66b56f09d52a"}, + {file = "greenlet-2.0.2-cp35-cp35m-win_amd64.whl", hash = "sha256:4b58adb399c4d61d912c4c331984d60eb66565175cdf4a34792cd9600f21b394"}, + {file = "greenlet-2.0.2-cp36-cp36m-macosx_10_14_x86_64.whl", hash = "sha256:703f18f3fda276b9a916f0934d2fb6d989bf0b4fb5a64825260eb9bfd52d78f0"}, + {file = "greenlet-2.0.2-cp36-cp36m-manylinux2010_x86_64.whl", hash = "sha256:32e5b64b148966d9cccc2c8d35a671409e45f195864560829f395a54226408d3"}, + {file = "greenlet-2.0.2-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2dd11f291565a81d71dab10b7033395b7a3a5456e637cf997a6f33ebdf06f8db"}, + {file = "greenlet-2.0.2-cp36-cp36m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e0f72c9ddb8cd28532185f54cc1453f2c16fb417a08b53a855c4e6a418edd099"}, + {file = "greenlet-2.0.2-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cd021c754b162c0fb55ad5d6b9d960db667faad0fa2ff25bb6e1301b0b6e6a75"}, + {file = "greenlet-2.0.2-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:3c9b12575734155d0c09d6c3e10dbd81665d5c18e1a7c6597df72fd05990c8cf"}, + {file = "greenlet-2.0.2-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:b9ec052b06a0524f0e35bd8790686a1da006bd911dd1ef7d50b77bfbad74e292"}, + {file = "greenlet-2.0.2-cp36-cp36m-win32.whl", hash = "sha256:dbfcfc0218093a19c252ca8eb9aee3d29cfdcb586df21049b9d777fd32c14fd9"}, + {file = "greenlet-2.0.2-cp36-cp36m-win_amd64.whl", hash = "sha256:9f35ec95538f50292f6d8f2c9c9f8a3c6540bbfec21c9e5b4b751e0a7c20864f"}, + {file = "greenlet-2.0.2-cp37-cp37m-macosx_10_15_x86_64.whl", hash = "sha256:d5508f0b173e6aa47273bdc0a0b5ba055b59662ba7c7ee5119528f466585526b"}, + {file = "greenlet-2.0.2-cp37-cp37m-manylinux2010_x86_64.whl", hash = "sha256:f82d4d717d8ef19188687aa32b8363e96062911e63ba22a0cff7802a8e58e5f1"}, + {file = "greenlet-2.0.2-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c9c59a2120b55788e800d82dfa99b9e156ff8f2227f07c5e3012a45a399620b7"}, + {file = "greenlet-2.0.2-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2780572ec463d44c1d3ae850239508dbeb9fed38e294c68d19a24d925d9223ca"}, + {file = "greenlet-2.0.2-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:937e9020b514ceedb9c830c55d5c9872abc90f4b5862f89c0887033ae33c6f73"}, + {file = "greenlet-2.0.2-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:36abbf031e1c0f79dd5d596bfaf8e921c41df2bdf54ee1eed921ce1f52999a86"}, + {file = "greenlet-2.0.2-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:18e98fb3de7dba1c0a852731c3070cf022d14f0d68b4c87a19cc1016f3bb8b33"}, + {file = "greenlet-2.0.2-cp37-cp37m-win32.whl", hash = "sha256:3f6ea9bd35eb450837a3d80e77b517ea5bc56b4647f5502cd28de13675ee12f7"}, + {file = "greenlet-2.0.2-cp37-cp37m-win_amd64.whl", hash = "sha256:7492e2b7bd7c9b9916388d9df23fa49d9b88ac0640db0a5b4ecc2b653bf451e3"}, + {file = "greenlet-2.0.2-cp38-cp38-macosx_10_15_x86_64.whl", hash = "sha256:b864ba53912b6c3ab6bcb2beb19f19edd01a6bfcbdfe1f37ddd1778abfe75a30"}, + {file = "greenlet-2.0.2-cp38-cp38-manylinux2010_x86_64.whl", hash = "sha256:ba2956617f1c42598a308a84c6cf021a90ff3862eddafd20c3333d50f0edb45b"}, + {file = "greenlet-2.0.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fc3a569657468b6f3fb60587e48356fe512c1754ca05a564f11366ac9e306526"}, + {file = "greenlet-2.0.2-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8eab883b3b2a38cc1e050819ef06a7e6344d4a990d24d45bc6f2cf959045a45b"}, + {file = "greenlet-2.0.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:acd2162a36d3de67ee896c43effcd5ee3de247eb00354db411feb025aa319857"}, + {file = "greenlet-2.0.2-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:0bf60faf0bc2468089bdc5edd10555bab6e85152191df713e2ab1fcc86382b5a"}, + {file = "greenlet-2.0.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:b0ef99cdbe2b682b9ccbb964743a6aca37905fda5e0452e5ee239b1654d37f2a"}, + {file = "greenlet-2.0.2-cp38-cp38-win32.whl", hash = "sha256:b80f600eddddce72320dbbc8e3784d16bd3fb7b517e82476d8da921f27d4b249"}, + {file = "greenlet-2.0.2-cp38-cp38-win_amd64.whl", hash = "sha256:4d2e11331fc0c02b6e84b0d28ece3a36e0548ee1a1ce9ddde03752d9b79bba40"}, + {file = "greenlet-2.0.2-cp39-cp39-macosx_11_0_x86_64.whl", hash = "sha256:88d9ab96491d38a5ab7c56dd7a3cc37d83336ecc564e4e8816dbed12e5aaefc8"}, + {file = "greenlet-2.0.2-cp39-cp39-manylinux2010_x86_64.whl", hash = "sha256:561091a7be172ab497a3527602d467e2b3fbe75f9e783d8b8ce403fa414f71a6"}, + {file = "greenlet-2.0.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:971ce5e14dc5e73715755d0ca2975ac88cfdaefcaab078a284fea6cfabf866df"}, + {file = "greenlet-2.0.2-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:be4ed120b52ae4d974aa40215fcdfde9194d63541c7ded40ee12eb4dda57b76b"}, + {file = "greenlet-2.0.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:94c817e84245513926588caf1152e3b559ff794d505555211ca041f032abbb6b"}, + {file = "greenlet-2.0.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:1a819eef4b0e0b96bb0d98d797bef17dc1b4a10e8d7446be32d1da33e095dbb8"}, + {file = "greenlet-2.0.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:7efde645ca1cc441d6dc4b48c0f7101e8d86b54c8530141b09fd31cef5149ec9"}, + {file = "greenlet-2.0.2-cp39-cp39-win32.whl", hash = "sha256:ea9872c80c132f4663822dd2a08d404073a5a9b5ba6155bea72fb2a79d1093b5"}, + {file = "greenlet-2.0.2-cp39-cp39-win_amd64.whl", hash = "sha256:db1a39669102a1d8d12b57de2bb7e2ec9066a6f2b3da35ae511ff93b01b5d564"}, + {file = "greenlet-2.0.2.tar.gz", hash = "sha256:e7c8dc13af7db097bed64a051d2dd49e9f0af495c26995c00a9ee842690d34c0"}, +] + +[package.extras] +docs = ["Sphinx", "docutils (<0.18)"] +test = ["objgraph", "psutil"] + [[package]] name = "h11" version = "0.14.0" @@ -430,6 +576,20 @@ perf = ["ipython"] testing = ["flufl.flake8", "importlib-resources (>=1.3)", "packaging", "pyfakefs", "pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-mypy (>=0.9.1)", "pytest-perf (>=0.9.2)", "pytest-ruff"] [[package]] +<<<<<<< HEAD +======= +name = "iniconfig" +version = "2.0.0" +description = "brain-dead simple config-ini parsing" +optional = false +python-versions = ">=3.7" +files = [ + {file = "iniconfig-2.0.0-py3-none-any.whl", hash = "sha256:b6a85871a79d2e3b22d2d1b94ac2824226a63c6b741c88f7ae975f18b6778374"}, + {file = "iniconfig-2.0.0.tar.gz", hash = "sha256:2d91e135bf72d31a410b17c16da610a82cb55f6b0477d1a902134b24a455b8b3"}, +] + +[[package]] +>>>>>>> b9eeecf1 (Add `.ui` and `.dev` deps groups via `poetry` Bo) name = "keysymdef" version = "1.2.0" description = "X11 keysym data for Python" @@ -723,6 +883,21 @@ files = [ python-dateutil = ">=2.6,<3.0" pytzdata = ">=2020.1" +[[package]] +name = "pluggy" +version = "1.2.0" +description = "plugin and hook calling mechanisms for python" +optional = false +python-versions = ">=3.7" +files = [ + {file = "pluggy-1.2.0-py3-none-any.whl", hash = "sha256:c2fd55a7d7a3863cba1a013e4e2414658b1d07b6bc57b3919e0c63c9abb99849"}, + {file = "pluggy-1.2.0.tar.gz", hash = "sha256:d12f0c4b579b15f5e054301bb226ee85eeeba08ffec228092f8defbaa3a4c4b3"}, +] + +[package.extras] +dev = ["pre-commit", "tox"] +testing = ["pytest", "pytest-benchmark"] + [[package]] name = "polars" version = "0.18.15" @@ -769,6 +944,17 @@ files = [ [package.dependencies] wcwidth = "*" +[[package]] +name = "py" +version = "1.11.0" +description = "library with cross-python path, ini-parsing, io, code, log facilities" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" +files = [ + {file = "py-1.11.0-py2.py3-none-any.whl", hash = "sha256:607c53218732647dff4acdfcd50cb62615cedf612e72d1724fb1a0cc6405b378"}, + {file = "py-1.11.0.tar.gz", hash = "sha256:51c75c4126074b472f746a24399ad32f6053d1b34b68d2fa41e558e6f4a98719"}, +] + [[package]] name = "pycparser" version = "2.21" @@ -884,6 +1070,30 @@ files = [ {file = "pyreadline3-3.4.1.tar.gz", hash = "sha256:6f3d1f7b8a31ba32b73917cefc1f28cc660562f39aea8646d30bd6eff21f7bae"}, ] +[[package]] +name = "pytest" +version = "6.2.5" +description = "pytest: simple powerful testing with Python" +optional = false +python-versions = ">=3.6" +files = [ + {file = "pytest-6.2.5-py3-none-any.whl", hash = "sha256:7310f8d27bc79ced999e760ca304d69f6ba6c6649c0b60fb0e04a4a77cacc134"}, + {file = "pytest-6.2.5.tar.gz", hash = "sha256:131b36680866a76e6781d13f101efb86cf674ebb9762eb70d3082b6f29889e89"}, +] + +[package.dependencies] +atomicwrites = {version = ">=1.0", markers = "sys_platform == \"win32\""} +attrs = ">=19.2.0" +colorama = {version = "*", markers = "sys_platform == \"win32\""} +iniconfig = "*" +packaging = "*" +pluggy = ">=0.12,<2.0" +py = ">=1.8.2" +toml = "*" + +[package.extras] +testing = ["argcomplete", "hypothesis (>=3.56)", "mock", "nose", "requests", "xmlschema"] + [[package]] name = "python-dateutil" version = "2.8.2" @@ -963,22 +1173,6 @@ pygments = ">=2.13.0,<3.0.0" [package.extras] jupyter = ["ipywidgets (>=7.5.1,<9)"] -[[package]] -name = "setuptools" -version = "68.1.0" -description = "Easily download, build, install, upgrade, and uninstall Python packages" -optional = false -python-versions = ">=3.8" -files = [ - {file = "setuptools-68.1.0-py3-none-any.whl", hash = "sha256:e13e1b0bc760e9b0127eda042845999b2f913e12437046e663b833aa96d89715"}, - {file = "setuptools-68.1.0.tar.gz", hash = "sha256:d59c97e7b774979a5ccb96388efc9eb65518004537e85d52e81eaee89ab6dd91"}, -] - -[package.extras] -docs = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "pygments-github-lexers (==0.0.5)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-favicon", "sphinx-hoverxref (<2)", "sphinx-inline-tabs", "sphinx-lint", "sphinx-notfound-page (==0.8.3)", "sphinx-reredirects", "sphinxcontrib-towncrier"] -testing = ["build[virtualenv]", "filelock (>=3.4.0)", "flake8-2020", "ini2toml[lite] (>=0.9)", "jaraco.develop (>=7.21)", "jaraco.envs (>=2.2)", "jaraco.path (>=3.2.0)", "pip (>=19.1)", "pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-mypy (>=0.9.1)", "pytest-perf", "pytest-ruff", "pytest-timeout", "pytest-xdist", "tomli-w (>=1.0.0)", "virtualenv (>=13.0.0)", "wheel"] -testing-integration = ["build[virtualenv]", "filelock (>=3.4.0)", "jaraco.envs (>=2.2)", "jaraco.path (>=3.2.0)", "pytest", "pytest-enabler", "pytest-xdist", "tomli", "virtualenv (>=13.0.0)", "wheel"] - [[package]] name = "six" version = "1.16.0" @@ -1026,6 +1220,17 @@ files = [ [package.dependencies] pyreadline3 = {version = "*", markers = "platform_system == \"Windows\""} +[[package]] +name = "toml" +version = "0.10.2" +description = "Python Library for Tom's Obvious, Minimal Language" +optional = false +python-versions = ">=2.6, !=3.0.*, !=3.1.*, !=3.2.*" +files = [ + {file = "toml-0.10.2-py2.py3-none-any.whl", hash = "sha256:806143ae5bfb6a3c6e736a764057db0e6a0e05e338b5630894a5f779cabb4f9b"}, + {file = "toml-0.10.2.tar.gz", hash = "sha256:b3bda1d108d5dd99f4a20d24d9c348e91c4db7ab1b749200bded2f839ccbe68f"}, +] + [[package]] name = "tomli" version = "2.0.1" @@ -1065,8 +1270,8 @@ resolved_reference = "8e0239a766e96739da700cd87cc00b48dbe7451f" [[package]] name = "tractor" -version = "0.1.0a6.dev0" -description = "structured concurrrent `trio`-\"actors\"" +version = "0.1.0a6dev0" +description = "" optional = false python-versions = ">=3.10" files = [] @@ -1210,6 +1415,22 @@ files = [ {file = "typing_extensions-4.7.1.tar.gz", hash = "sha256:b75ddc264f0ba5615db7ba217daeb99701ad295353c45f9e95963337ceeeffb2"}, ] +[[package]] +name = "urllib3" +version = "1.26.16" +description = "HTTP library with thread-safe connection pooling, file post, and more." +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, !=3.5.*" +files = [ + {file = "urllib3-1.26.16-py2.py3-none-any.whl", hash = "sha256:8d36afa7616d8ab714608411b4a3b13e58f463aee519024578e062e141dce20f"}, + {file = "urllib3-1.26.16.tar.gz", hash = "sha256:8f135f6502756bde6b2a9b28989df5fbe87c9970cecaa69041edcce7f0589b14"}, +] + +[package.extras] +brotli = ["brotli (>=1.0.9)", "brotlicffi (>=0.8.0)", "brotlipy (>=0.6.0)"] +secure = ["certifi", "cryptography (>=1.3.4)", "idna (>=2.0.0)", "ipaddress", "pyOpenSSL (>=0.14)", "urllib3-secure-extra"] +socks = ["PySocks (>=1.5.6,!=1.5.7,<2.0)"] + [[package]] name = "wcwidth" version = "0.2.6" @@ -1363,4 +1584,4 @@ testing = ["big-O", "jaraco.functools", "jaraco.itertools", "more-itertools", "p [metadata] lock-version = "2.0" python-versions = "^3.10" -content-hash = "60794b764aa110829379b5c12ea0a0715896d566f692a68330f708071a8b2ecf" +content-hash = "3af2ea8463f2fc48dc5051e8024d8df2b22dddc0e684c4d59c5318395132163d" diff --git a/pyproject.toml b/pyproject.toml index dc93bedd0..5c78c9078 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,3 +1,9 @@ +[build-system] +requires = ["poetry-core"] +build-backend = "poetry.core.masonry.api" +# ------ - ------ + + [tool.poetry] name = "piker" version = "0.1.0.alpha0.dev0" @@ -5,47 +11,35 @@ description = "trading gear for hackers" authors = ["Tyler Goodlet "] license = "AGPLv3" readme = "README.rst" +# ------ - ------ [tool.poetry.dependencies] -# TODO: do we need this? -setuptools = "^68.0.0" -python = "^3.10" -tomli = "^2.0.1" -tomli-w = "^1.0.0" -colorlog = "^6.7.0" +asks = "^3.0.0" +async-generator = "^1.10" attrs = "^23.1.0" -pygments = "^2.16.1" +bidict = "^0.22.1" colorama = "^0.4.6" +colorlog = "^6.7.0" +cython = "^3.0.0" +greenback = "^1.1.1" +ib-insync = "^0.9.86" msgspec = "^0.18.0" -typer = "^0.9.0" +numba = "^0.57.1" +numpy = "1.24" +pendulum = "^2.1.2" +polars = "^0.18.13" +pygments = "^2.16.1" +python = "^3.10" rich = "^13.5.2" +# setuptools = "^68.0.0" +tomli = "^2.0.1" +tomli-w = "^1.0.0" trio = "^0.22.2" -trio-websocket = "^0.10.3" trio-util = "^0.7.0" -async-generator = "^1.10" -asks = "^3.0.0" -ib-insync = "^0.9.86" -pendulum = "^2.1.2" -bidict = "^0.22.1" -cython = "^3.0.0" -numpy = "1.24" -numba = "^0.57.1" -polars = "^0.18.13" -qdarkstyle = ">=3.0.2" - -# TODO: outstanding pkging issues on nixos -# fuzzywuzzy = {extras = ["speedup"], version = "^0.18.0"} -fuzzywuzzy = "^0.18.0" -pyqt5 = "^5.15.9" -# pyqt6 = "^6.5.2" - -# NOTE: required in explicit env install for shell use w nix -xonsh = "^0.14.0" -prompt-toolkit = "^3.0.39" +trio-websocket = "^0.10.3" +typer = "^0.9.0" -# pinned from git for "hackability" -pyqtgraph = { git = 'https://github.com/pikers/pyqtgraph.git' } [tool.poetry.dependencies.asyncvnc] git = 'https://github.com/pikers/asyncvnc.git' @@ -64,14 +58,56 @@ git = 'https://github.com/goodboy/tractor.git' branch = 'piker_pin' develop = true +[tool.poetry.dependencies.tractor] +# path = '../tractor/' +# branch = 'asyncio_debugger_support' +git = 'https://github.com/goodboy/tractor.git' +branch = 'piker_pin' +develop = true +# ------ - ------ + + +[tool.poetry.group.uis] +optional=true +[tool.poetry.group.uis.dependencies] +# https://python-poetry.org/docs/managing-dependencies/#dependency-groups +# TODO: outstanding pkging issues on nixos +fuzzywuzzy = {extras = ["speedup"], version = "^0.18.0"} +# fuzzywuzzy = "^0.18.0" +qdarkstyle = ">=3.0.2" +pyqt5 = "^5.15.9" +pyqtgraph = { git = 'https://github.com/pikers/pyqtgraph.git' } +# pyqt6 = "^6.5.2" +# ------ - ------ + + +[tool.poetry.group.dev] +optional = true +[tool.poetry.group.dev.dependencies] +# testing / CI +pytest = "^6.0.0" +elasticsearch = "^8.9.0" + +# console ehancements and eventually remote debugging +# extras/helpers. +# TODO: add a toolset that makes debugging a `pikerd` service +# (tree) easy to hack on directly using more or less the local env: +# - xonsh + xxh +# - rsyscall + pdbp +# - actor runtime control console like BEAM/OTP +xonsh = "^0.14.0" # XXX: explicit env install for shell use w nix +prompt-toolkit = "^3.0.39" +# ------ - ------ -[build-system] -requires = ["poetry-core"] -build-backend = "poetry.core.masonry.api" +# TODO: add an `--only daemon` group for running non-ui / pikerd +# service tree in distributed mode B) +# https://python-poetry.org/docs/managing-dependencies/#installing-group-dependencies +# [tool.poetry.group.daemon.dependencies] [tool.poetry.scripts] # poetry = "poetry.console.application:main" piker = 'piker.cli:cli' pikerd = 'piker.cli:pikerd' -ledger = 'pikerd.accounting.cli:ledger' +ledger = 'piker.accounting.cli:ledger' +# ------ - ------ From 2b8cd031e802fc9945d816b634c6d4630e2abb4f Mon Sep 17 00:00:00 2001 From: Tyler Goodlet Date: Fri, 18 Aug 2023 17:28:28 -0400 Subject: [PATCH 16/39] By default silence `Client.get_quote()` timeout errors unless caller specifies to raise --- piker/brokers/ib/api.py | 17 ++++++++++++----- piker/brokers/ib/feed.py | 5 ++++- 2 files changed, 16 insertions(+), 6 deletions(-) diff --git a/piker/brokers/ib/api.py b/piker/brokers/ib/api.py index 75a79dbed..7647d03e4 100644 --- a/piker/brokers/ib/api.py +++ b/piker/brokers/ib/api.py @@ -663,7 +663,7 @@ async def find_contracts( # commodities elif exch == 'CMDTY': # eg. XAUUSD.CMDTY - con_kwargs, bars_kwargs = _adhoc_symbol_map[symbol] + con_kwargs, bars_kwargs = _adhoc_symbol_map[symbol.upper()] con = Commodity(**con_kwargs) con.bars_kwargs = bars_kwargs @@ -780,6 +780,7 @@ async def get_quote( self, contract: Contract, timeout: float = 1, + raise_on_timeout: bool = False, ) -> Ticker: ''' @@ -798,10 +799,16 @@ async def get_quote( if isnan(ticker.last): # wait for a first update(Event) - tkr = await asyncio.wait_for( - ready, - timeout=timeout, - ) + try: + tkr = await asyncio.wait_for( + ready, + timeout=timeout, + ) + except TimeoutError: + if raise_on_timeout: + raise + return tkr + if tkr: break else: diff --git a/piker/brokers/ib/feed.py b/piker/brokers/ib/feed.py index 72f519647..44e3af2a7 100644 --- a/piker/brokers/ib/feed.py +++ b/piker/brokers/ib/feed.py @@ -843,7 +843,10 @@ async def stream_quotes( # TODO: we should instead spawn a task that waits on a feed to start # and let it wait indefinitely..instead of this hard coded stuff. with trio.move_on_after(1): - first_ticker = await proxy.get_quote(contract=con) + first_ticker = await proxy.get_quote( + contract=con, + raise_on_timeout=True, + ) # it might be outside regular trading hours so see if we can at # least grab history. From e9517cdb021923987ecfb85e9760e35beeb1d603 Mon Sep 17 00:00:00 2001 From: Tyler Goodlet Date: Fri, 18 Aug 2023 17:29:51 -0400 Subject: [PATCH 17/39] ib: handle commodity-contract trade records --- piker/brokers/ib/ledger.py | 18 +++++++++++++++++- 1 file changed, 17 insertions(+), 1 deletion(-) diff --git a/piker/brokers/ib/ledger.py b/piker/brokers/ib/ledger.py index 7273d8c92..a767d5518 100644 --- a/piker/brokers/ib/ledger.py +++ b/piker/brokers/ib/ledger.py @@ -32,8 +32,9 @@ from bidict import bidict import pendulum -from ib_insync.objects import ( +from ib_insync import ( Contract, + Commodity, Fill, Execution, CommissionReport, @@ -237,6 +238,21 @@ def norm_trade( name=symbol.lower(), atype='option', tx_tick=Decimal('1'), + + # TODO: we should probably always cast to the + # `Contract` instance then dict-serialize that for + # the `.info` field! + # info=asdict(Option()), + ) + + case 'CMDTY': + from .symbols import _adhoc_symbol_map + con_kwargs, _ = _adhoc_symbol_map[symbol.upper()] + dst = Asset( + name=symbol.lower(), + atype='commodity', + tx_tick=Decimal('1'), + info=asdict(Commodity(**con_kwargs)), ) # try to build out piker fqme from record. From 546049b62f41bf68fec50647ea56f8265134e62e Mon Sep 17 00:00:00 2001 From: Tyler Goodlet Date: Sun, 20 Aug 2023 18:39:52 -0400 Subject: [PATCH 18/39] data.history: handle venue-closure gap edge case --- piker/data/history.py | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) diff --git a/piker/data/history.py b/piker/data/history.py index 997a902cb..aad7d49f1 100644 --- a/piker/data/history.py +++ b/piker/data/history.py @@ -701,8 +701,23 @@ async def tsdb_backfill( # prepended, presuming there is a gap between the # latest frame (loaded/read above) and the latest # sample loaded from the tsdb. - backfill_diff: Duration = mr_start_dt - last_tsdb_dt + backfill_diff: Duration = mr_start_dt - last_tsdb_dt offset_s: float = backfill_diff.in_seconds() + + # XXX EDGE CASE: when the venue was closed (say over + # the weeknd) causing a timeseries gap, AND the query + # frames size (eg. for 1s we rx 2k datums ~= 33.33m) IS + # GREATER THAN the current venue-market's operating + # session (time) we will receive datums from BEFORE THE + # CLOSURE GAP and thus the `offset_s` value will be + # NEGATIVE! In this case we need to ensure we don't try + # to push datums that have already been recorded in the + # tsdb. In this case we instead only retreive and push + # the series portion missing from the db's data set. + if offset_s < 0: + backfill_diff: Duration = mr_end_dt - last_tsdb_dt + offset_s: float = backfill_diff.in_seconds() + offset_samples: int = round(offset_s / timeframe) # TODO: see if there's faster multi-field reads: From 1002ce1e1003d391f3bb742f94f36b55810e0f77 Mon Sep 17 00:00:00 2001 From: Tyler Goodlet Date: Thu, 24 Aug 2023 15:13:18 -0400 Subject: [PATCH 19/39] kraken.broker: one last fix to `Position.cumsize`.. --- piker/brokers/kraken/broker.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/piker/brokers/kraken/broker.py b/piker/brokers/kraken/broker.py index 74bd75622..25a303461 100644 --- a/piker/brokers/kraken/broker.py +++ b/piker/brokers/kraken/broker.py @@ -407,7 +407,7 @@ def trades2pps( # included? account='kraken.' + acctid, symbol=p.mkt.fqme, - size=p.size, + size=p.cumsize, avg_price=p.ppu, currency='', ) From 461764419d584fa6db942d02c1504eac0c796499 Mon Sep 17 00:00:00 2001 From: Tyler Goodlet Date: Fri, 25 Aug 2023 12:10:06 -0400 Subject: [PATCH 20/39] ib.api: always key `._contracts` with '.ib' suffix So that pos msgs from the ems are correctly loaded.. --- piker/brokers/ib/api.py | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/piker/brokers/ib/api.py b/piker/brokers/ib/api.py index 7647d03e4..bc4bdcf1d 100644 --- a/piker/brokers/ib/api.py +++ b/piker/brokers/ib/api.py @@ -727,12 +727,16 @@ async def find_contracts( or tract.exchange or exch ) - pattern: str = f'{symbol}.{exch}' + pattern: str = f'{symbol}.{exch.lower()}' expiry: str = tract.lastTradeDateOrContractMonth # add an entry with expiry suffix if available if expiry: pattern += f'.{expiry}' + # since pos update msgs will always have the full fqme + # with suffix? + pattern += '.ib' + # directly cache the input pattern to the output # contract match as well as by the IB-internal conId. self._contracts[pattern] = tract From 8369f557c73e5c868fc5d8a05139cdc61511c734 Mon Sep 17 00:00:00 2001 From: Tyler Goodlet Date: Fri, 25 Aug 2023 18:07:15 -0400 Subject: [PATCH 21/39] TOSQUASH 2e6b1330f375c310ad: adding .dev / .ui groups --- pyproject.toml | 7 ------- 1 file changed, 7 deletions(-) diff --git a/pyproject.toml b/pyproject.toml index 5c78c9078..f5313f8c7 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -51,13 +51,6 @@ branch = 'main' path = "../tomlkit/" develop = true -# tractor = { git = 'https://github.com/goodboy/tractor.git', branch = 'piker_pin' , develop = true} -# tractor = { path = '../tractor/', develop = true } -[tool.poetry.dependencies.tractor] -git = 'https://github.com/goodboy/tractor.git' -branch = 'piker_pin' -develop = true - [tool.poetry.dependencies.tractor] # path = '../tractor/' # branch = 'asyncio_debugger_support' From ad37cfbe2fe3a1f8124b73557c469daa80211e5a Mon Sep 17 00:00:00 2001 From: Tyler Goodlet Date: Tue, 29 Aug 2023 08:43:14 -0400 Subject: [PATCH 22/39] Break backfill loop on `end_dt < start_dt` --- piker/data/history.py | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/piker/data/history.py b/piker/data/history.py index aad7d49f1..9d110bb29 100644 --- a/piker/data/history.py +++ b/piker/data/history.py @@ -418,6 +418,12 @@ async def start_backfill( start_dt = from_timestamp(start) end_dt = from_timestamp(end) + + # if we get a baddly ordered timestamp + # pair, imeeditately stop backfilling. + if end_dt < start_dt: + break + ( array, next_start_dt, From e54c3dc523ac21b8bf88d361076e3269a0db678a Mon Sep 17 00:00:00 2001 From: Tyler Goodlet Date: Tue, 29 Aug 2023 08:45:45 -0400 Subject: [PATCH 23/39] TOSQUASH 9005335e18: pack empty dict on no flow --- piker/brokers/ib/broker.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/piker/brokers/ib/broker.py b/piker/brokers/ib/broker.py index 0c174fb0c..9b256f244 100644 --- a/piker/brokers/ib/broker.py +++ b/piker/brokers/ib/broker.py @@ -1249,7 +1249,10 @@ async def deliver_trade_events( if err['reqid'] == -1: log.error(f'TWS external order error:\n{pformat(err)}') - flow: dict = dict(flows.get(reqid)) or {} + flow: dict = dict( + flows.get(reqid) + or {} + ) # TODO: we don't want to relay data feed / lookup errors # so we need some further filtering logic here.. From 778d26067d463ba52d685539ba20bb81cec68657 Mon Sep 17 00:00:00 2001 From: Tyler Goodlet Date: Wed, 30 Aug 2023 14:56:11 -0400 Subject: [PATCH 24/39] ib.api: return None on manual quote timeout --- piker/brokers/ib/api.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/piker/brokers/ib/api.py b/piker/brokers/ib/api.py index bc4bdcf1d..63c38bc80 100644 --- a/piker/brokers/ib/api.py +++ b/piker/brokers/ib/api.py @@ -786,7 +786,7 @@ async def get_quote( timeout: float = 1, raise_on_timeout: bool = False, - ) -> Ticker: + ) -> Ticker | None: ''' Return a single (snap) quote for symbol. @@ -811,7 +811,7 @@ async def get_quote( except TimeoutError: if raise_on_timeout: raise - return tkr + return None if tkr: break From 481618cc514acee4929900cba7cfce3c34edd58d Mon Sep 17 00:00:00 2001 From: Tyler Goodlet Date: Wed, 30 Aug 2023 16:09:45 -0400 Subject: [PATCH 25/39] kraken: handle ws live trading API symbology Of course I missed this first try but, we need to use the ws market pair symbology set (since apparently kraken loves redundancy at least 3 times XD) when processing transactions that arrive from live clears since it's an entirely different `LTC/EUR` style key then the `XLTCEUR` style delivered from the ReST eps.. As part of this: - add `Client._altnames`, `._wsnames` as `dict[str, Pair]` tables, leaving the `._AssetPairs` table as is keyed by the "xname"s. - Change `Pair.respname: str` -> `.xname` since these keys all just seem to have a weird 'X' prefix. - do the appropriately keyed pair table lookup via a new `api_name_set: str` to `norm_trade_records()` and set is correctly in the ws live txn handler task. --- piker/brokers/kraken/api.py | 83 ++++++++++++++++++--------------- piker/brokers/kraken/broker.py | 3 ++ piker/brokers/kraken/ledger.py | 24 ++++++++-- piker/brokers/kraken/symbols.py | 4 +- piker/data/_web_bs.py | 20 +++++--- 5 files changed, 84 insertions(+), 50 deletions(-) diff --git a/piker/brokers/kraken/api.py b/piker/brokers/kraken/api.py index b9fb65408..a4dcdec97 100644 --- a/piker/brokers/kraken/api.py +++ b/piker/brokers/kraken/api.py @@ -106,16 +106,19 @@ class InvalidKey(ValueError): class Client: - # symbol mapping from all names to the altname - _altnames: dict[str, str] = {} - - # key-ed by kraken's own bs_mktids (like fricking "XXMRZEUR") - # with said keys used directly from EP responses so that ledger - # parsing can be easily accomplished from both trade-event-msgs - # and offline toml files + # assets and mkt pairs are key-ed by kraken's ReST response + # symbol-bs_mktids (we call them "X-keys" like fricking + # "XXMRZEUR"). these keys used directly since ledger endpoints + # return transaction sets keyed with the same set! _Assets: dict[str, Asset] = {} _AssetPairs: dict[str, Pair] = {} + # offer lookup tables for all .altname and .wsname + # to the equivalent .xname so that various symbol-schemas + # can be mapped to `Pair`s in the tables above. + _altnames: dict[str, str] = {} + _wsnames: dict[str, str] = {} + # key-ed by `Pair.bs_fqme: str`, and thus used for search # allowing for lookup using piker's own FQME symbology sys. _pairs: dict[str, Pair] = {} @@ -209,8 +212,8 @@ async def get_balances( by_bsmktid: dict[str, dict] = resp['result'] balances: dict = {} - for respname, bal in by_bsmktid.items(): - asset: Asset = self._Assets[respname] + for xname, bal in by_bsmktid.items(): + asset: Asset = self._Assets[xname] # TODO: which KEY should we use? it's used to index # the `Account.pps: dict` .. @@ -367,7 +370,6 @@ async def get_xfers( asset_key: str = entry['asset'] asset: Asset = self._Assets[asset_key] asset_key: str = asset.name.lower() - # asset_key: str = self._altnames[asset_key].lower() # XXX: this is in the asset units (likely) so it isn't # quite the same as a commisions cost necessarily..) @@ -473,25 +475,31 @@ async def asset_pairs( if err: raise SymbolNotFound(pair_patt) - # NOTE: we key pairs by our custom defined `.bs_fqme` - # field since we want to offer search over this key - # set, callers should fill out lookup tables for - # kraken's bs_mktid keys to map to these keys! - for key, data in resp['result'].items(): - pair = Pair(respname=key, **data) - - # always cache so we can possibly do faster lookup - self._AssetPairs[key] = pair - - bs_fqme: str = pair.bs_fqme - - self._pairs[bs_fqme] = pair - - # register the piker pair under all monikers, a giant flat - # surjection of all possible (and stupid) kraken names to - # the FMQE style piker key. - self._altnames[pair.altname] = bs_fqme - self._altnames[pair.wsname] = bs_fqme + # NOTE: we try to key pairs by our custom defined + # `.bs_fqme` field since we want to offer search over + # this pattern set, callers should fill out lookup + # tables for kraken's bs_mktid keys to map to these + # keys! + # XXX: FURTHER kraken's data eng team decided to offer + # 3 frickin market-pair-symbol key sets depending on + # which frickin API is being used. + # Example for the trading pair 'LTC tuple[str, Pair]: + ) -> str: ''' Normalize symbol names to to a 3x3 pair from the global definition map which we build out from the data retreived from @@ -636,7 +645,7 @@ def to_bs_fqme( ''' try: - return cls._altnames[pair_str.upper()] + return cls._altnames[pair_str.upper()].bs_fqme except KeyError as ke: raise SymbolNotFound(f'kraken has no {ke.args[0]}') diff --git a/piker/brokers/kraken/broker.py b/piker/brokers/kraken/broker.py index 25a303461..53168c039 100644 --- a/piker/brokers/kraken/broker.py +++ b/piker/brokers/kraken/broker.py @@ -513,6 +513,7 @@ async def open_trade_dialog( ledger_trans: dict[str, Transaction] = await norm_trade_records( ledger, client, + api_name_set='xname', ) if not acnt.pps: @@ -534,6 +535,7 @@ async def open_trade_dialog( api_trans: dict[str, Transaction] = await norm_trade_records( tids2trades, client, + api_name_set='xname', ) # retrieve kraken reported balances @@ -743,6 +745,7 @@ async def handle_order_updates( new_trans = await norm_trade_records( trades, client, + api_name_set='wsname', ) ppmsgs = trades2pps( acnt, diff --git a/piker/brokers/kraken/ledger.py b/piker/brokers/kraken/ledger.py index 6dcd327ec..f250d2468 100644 --- a/piker/brokers/kraken/ledger.py +++ b/piker/brokers/kraken/ledger.py @@ -64,9 +64,19 @@ def norm_trade( 'sell': -1, }[record['type']] - rest_pair_key: str = record['pair'] - pair: Pair = pairs[rest_pair_key] - + # NOTE: this value may be either the websocket OR the rest schema + # so we need to detect the key format and then choose the + # correct symbol lookup table to evetually get a ``Pair``.. + # See internals of `Client.asset_pairs()` for deats! + src_pair_key: str = record['pair'] + + # XXX: kraken's data engineering is soo bad they require THREE + # different pair schemas (more or less seemingly tied to + # transport-APIs)..LITERALLY they return different market id + # pairs in the ledger endpoints vs. the websocket event subs.. + # lookup pair using appropriately provided tabled depending + # on API-key-schema.. + pair: Pair = pairs[src_pair_key] fqme: str = pair.bs_fqme.lower() + '.kraken' return Transaction( @@ -83,6 +93,7 @@ def norm_trade( async def norm_trade_records( ledger: dict[str, Any], client: Client, + api_name_set: str = 'xname', ) -> dict[str, Transaction]: ''' @@ -97,11 +108,16 @@ async def norm_trade_records( # mkt: MktPair = (await get_mkt_info(manual_fqme))[0] # fqme: str = mkt.fqme # assert fqme == manual_fqme + pairs: dict[str, Pair] = { + 'xname': client._AssetPairs, + 'wsname': client._wsnames, + 'altname': client._altnames, + }[api_name_set] records[tid] = norm_trade( tid, record, - pairs=client._AssetPairs, + pairs=pairs, ) return records diff --git a/piker/brokers/kraken/symbols.py b/piker/brokers/kraken/symbols.py index d71828b2c..168b05084 100644 --- a/piker/brokers/kraken/symbols.py +++ b/piker/brokers/kraken/symbols.py @@ -43,7 +43,7 @@ # https://www.kraken.com/features/api#get-tradable-pairs class Pair(Struct): - respname: str # idiotic bs_mktid equiv i guess? + xname: str # idiotic bs_mktid equiv i guess? altname: str # alternate pair name wsname: str # WebSocket pair name (if available) aclass_base: str # asset class of base component @@ -94,7 +94,7 @@ def bs_mktid(self) -> str: make up their minds on a better key set XD ''' - return self.respname + return self.xname @property def price_tick(self) -> Decimal: diff --git a/piker/data/_web_bs.py b/piker/data/_web_bs.py index e60f871b1..256b35afc 100644 --- a/piker/data/_web_bs.py +++ b/piker/data/_web_bs.py @@ -234,10 +234,13 @@ async def open_fixture( f'{url} trying (RE)CONNECT' ) - async with trio.open_nursery() as n: - cs = nobsws._cs = n.cancel_scope - ws: WebSocketConnection - async with open_websocket_url(url) as ws: + ws: WebSocketConnection + try: + async with ( + trio.open_nursery() as n, + open_websocket_url(url) as ws, + ): + cs = nobsws._cs = n.cancel_scope nobsws._ws = ws log.info( f'{src_mod}\n' @@ -269,9 +272,11 @@ async def open_fixture( # to let tasks run **inside** the ws open block above. nobsws._connected.set() await trio.sleep_forever() + except HandshakeError: + log.exception(f'Retrying connection') + + # ws & nursery block ends - # ws open block end - # nursery block end nobsws._connected = trio.Event() if cs.cancelled_caught: log.cancel( @@ -284,7 +289,8 @@ async def open_fixture( and not nobsws._connected.is_set() ) - # -> from here, move to next reconnect attempt + # -> from here, move to next reconnect attempt iteration + # in the while loop above Bp else: log.exception( From 4d274b16d802f6df0f94d7a87d4a84b933d54e07 Mon Sep 17 00:00:00 2001 From: Tyler Goodlet Date: Thu, 7 Sep 2023 14:17:01 -0400 Subject: [PATCH 26/39] Attempt to generate .uis deps free lock file Since `poetry` doesn't seem to actually mark optional group deps as such in the lock file (!?) manually generate a `poetry.lock` with the optional groups commented out in the `pyproject.toml`; this is all in an attempt at trying to make `poetry2nix` build without any UI components which seem to be the source of much frustration without hacking on p2n and/or nixpkgs repos.. Further drop all the old build system files including the setup.py and requirements.txt files. --- poetry.lock | 536 +++++++++--------------------------------- pyproject.toml | 65 ++++- requirements-test.txt | 3 - requirements.txt | 20 -- setup.py | 121 ---------- 5 files changed, 158 insertions(+), 587 deletions(-) delete mode 100644 requirements-test.txt delete mode 100644 requirements.txt delete mode 100755 setup.py diff --git a/poetry.lock b/poetry.lock index b8aed1fc7..c9b5ced69 100644 --- a/poetry.lock +++ b/poetry.lock @@ -1,4 +1,4 @@ -# This file is automatically @generated by Poetry 1.5.1 and should not be changed by hand. +# This file is automatically @generated by Poetry 1.6.1 and should not be changed by hand. [[package]] name = "anyio" @@ -50,9 +50,9 @@ files = [ [[package]] name = "asyncvnc" version = "1.1.0" -description = "Asynchronous VNC for Python" +description = "" optional = false -python-versions = ">=3.7" +python-versions = ">= 3.7" files = [] develop = false @@ -67,16 +67,6 @@ url = "https://github.com/pikers/asyncvnc.git" reference = "main" resolved_reference = "825447564e3af6b0d4a0996793f1ca7fb360c48f" -[[package]] -name = "atomicwrites" -version = "1.4.1" -description = "Atomic file writes." -optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" -files = [ - {file = "atomicwrites-1.4.1.tar.gz", hash = "sha256:81b2c9071a49367a7f770170e5eec8cb66567cfbbc8c73d20ce5ca4a8d71cf11"}, -] - [[package]] name = "attrs" version = "23.1.0" @@ -111,17 +101,6 @@ docs = ["furo", "sphinx", "sphinx-copybutton"] lint = ["pre-commit"] test = ["hypothesis", "pytest", "pytest-benchmark[histogram]", "pytest-cov", "pytest-xdist", "sortedcollections", "sortedcontainers", "sphinx"] -[[package]] -name = "certifi" -version = "2023.7.22" -description = "Python package for providing Mozilla's CA Bundle." -optional = false -python-versions = ">=3.6" -files = [ - {file = "certifi-2023.7.22-py3-none-any.whl", hash = "sha256:92d6037539857d8206b8f6ae472e8b77db8058fec5937a1ef3f54304089edbb9"}, - {file = "certifi-2023.7.22.tar.gz", hash = "sha256:539cc1d13202e33ca466e88b2807e29f4c13049d6d87031a3c110744495cb082"}, -] - [[package]] name = "cffi" version = "1.15.1" @@ -287,116 +266,80 @@ test-randomorder = ["pytest-randomly"] [[package]] name = "cython" -version = "3.0.0" +version = "3.0.2" description = "The Cython compiler for writing C extensions in the Python language." optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" files = [ - {file = "Cython-3.0.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:7c7d728e1a49ad01d41181e3a9ea80b8d14e825f4679e4dd837cbf7bca7998a5"}, - {file = "Cython-3.0.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:626a4a6ef4b7ced87c348ea805488e4bd39dad9d0b39659aa9e1040b62bbfedf"}, - {file = "Cython-3.0.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:33c900d1ca9f622b969ac7d8fc44bdae140a4a6c7d8819413b51f3ccd0586a09"}, - {file = "Cython-3.0.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a65bc50dc1bc2faeafd9425defbdef6a468974f5c4192497ff7f14adccfdcd32"}, - {file = "Cython-3.0.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:3b71b399b10b038b056ad12dce1e317a8aa7a96e99de7e4fa2fa5d1c9415cfb9"}, - {file = "Cython-3.0.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:f42f304c097cc53e9eb5f1a1d150380353d5018a3191f1b77f0de353c762181e"}, - {file = "Cython-3.0.0-cp310-cp310-win32.whl", hash = "sha256:3e234e2549e808d9259fdb23ebcfd145be30c638c65118326ec33a8d29248dc2"}, - {file = "Cython-3.0.0-cp310-cp310-win_amd64.whl", hash = "sha256:829c8333195100448a23863cf64a07e1334fae6a275aefe871458937911531b6"}, - {file = "Cython-3.0.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:06db81b1a01858fcc406616f8528e686ffb6cf7c3d78fb83767832bfecea8ad8"}, - {file = "Cython-3.0.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c93634845238645ce7abf63a56b1c5b6248189005c7caff898fd4a0dac1c5e1e"}, - {file = "Cython-3.0.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:aa606675c6bd23478b1d174e2a84e3c5a2c660968f97dc455afe0fae198f9d3d"}, - {file = "Cython-3.0.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d3355e6f690184f984eeb108b0f5bbc4bcf8b9444f8168933acf79603abf7baf"}, - {file = "Cython-3.0.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:93a34e1ca8afa4b7075b02ed14a7e4969256297029fb1bfd4cbe48f7290dbcff"}, - {file = "Cython-3.0.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:bb1165ca9e78823f9ad1efa5b3d83156f868eabd679a615d140a3021bb92cd65"}, - {file = "Cython-3.0.0-cp311-cp311-win32.whl", hash = "sha256:2fadde1da055944f5e1e17625055f54ddd11f451889110278ef30e07bd5e1695"}, - {file = "Cython-3.0.0-cp311-cp311-win_amd64.whl", hash = "sha256:254ed1f03a6c237fa64f0c6e44862058de65bfa2e6a3b48ca3c205492e0653aa"}, - {file = "Cython-3.0.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:4e212237b7531759befb92699c452cd65074a78051ae4ee36ff8b237395ecf3d"}, - {file = "Cython-3.0.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9f29307463eba53747b31f71394ed087e3e3e264dcc433e62de1d51f5c0c966c"}, - {file = "Cython-3.0.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:53328a8af0806bebbdb48a4191883b11ee9d9dfb084d84f58fa5a8ab58baefc9"}, - {file = "Cython-3.0.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5962e70b15e863e72bed6910e8c6ffef77d36cc98e2b31c474378f3b9e49b0e3"}, - {file = "Cython-3.0.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:9e69139f4e60ab14c50767a568612ea64d6907e9c8e0289590a170eb495e005f"}, - {file = "Cython-3.0.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:c40bdbcb2286f0aeeb5df9ce53d45da2d2a9b36a16b331cd0809d212d22a8fc7"}, - {file = "Cython-3.0.0-cp312-cp312-win32.whl", hash = "sha256:8abb8915eb2e57fa53d918afe641c05d1bcc6ed1913682ec1f28de71f4e3f398"}, - {file = "Cython-3.0.0-cp312-cp312-win_amd64.whl", hash = "sha256:30a4bd2481e59bd7ab2539f835b78edc19fc455811e476916f56026b93afd28b"}, - {file = "Cython-3.0.0-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:0e1e4b7e4bfbf22fecfa5b852f0e499c442d4853b7ebd33ae37cdec9826ed5d8"}, - {file = "Cython-3.0.0-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6b00df42cdd1a285a64491ba23de08ab14169d3257c840428d40eb7e8e9979af"}, - {file = "Cython-3.0.0-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:650d03ddddc08b051b4659778733f0f173ca7d327415755c05d265a6c1ba02fb"}, - {file = "Cython-3.0.0-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4965f2ebade17166f21a508d66dd60d2a0b3a3b90abe3f72003baa17ae020dd6"}, - {file = "Cython-3.0.0-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:4123c8d03167803df31da6b39de167cb9c04ac0aa4e35d4e5aa9d08ad511b84d"}, - {file = "Cython-3.0.0-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:296c53b6c0030cf82987eef163444e8d7631cc139d995f9d58679d9fd1ddbf31"}, - {file = "Cython-3.0.0-cp36-cp36m-win32.whl", hash = "sha256:0d2c1e172f1c81bafcca703093608e10dc16e3e2d24c5644c17606c7fdb1792c"}, - {file = "Cython-3.0.0-cp36-cp36m-win_amd64.whl", hash = "sha256:bc816d8eb3686d6f8d165f4156bac18c1147e1035dc28a76742d0b7fb5b7c032"}, - {file = "Cython-3.0.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:8d86651347bbdbac1aca1824696c5e4c0a3b162946c422edcca2be12a03744d1"}, - {file = "Cython-3.0.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:84176bd04ce9f3cc8799b47ec6d1959fa1ea5e71424507df7bbf0b0915bbedef"}, - {file = "Cython-3.0.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:35abcf07b8277ec95bbe49a07b5c8760a2d941942ccfe759a94c8d2fe5602e9f"}, - {file = "Cython-3.0.0-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a44d6b9a29b2bff38bb648577b2fcf6a68cf8b1783eee89c2eb749f69494b98d"}, - {file = "Cython-3.0.0-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:4dc6bbe7cf079db37f1ebb9b0f10d0d7f29e293bb8688e92d50b5ea7a91d82f3"}, - {file = "Cython-3.0.0-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:e28763e75e380b8be62b02266a7995a781997c97c119efbdccb8fb954bcd7574"}, - {file = "Cython-3.0.0-cp37-cp37m-win32.whl", hash = "sha256:edae615cb4af51d5173e76ba9aea212424d025c57012e9cdf2f131f774c5ba71"}, - {file = "Cython-3.0.0-cp37-cp37m-win_amd64.whl", hash = "sha256:20c604e974832aaf8b7a1f5455ee7274b34df62a35ee095cd7d2ed7e818e6c53"}, - {file = "Cython-3.0.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:c85fd2b1cbd9400d60ebe074795bb9a9188752f1612be3b35b0831a24879b91f"}, - {file = "Cython-3.0.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:090256c687106932339f87f888b95f0d69c617bc9b18801555545b695d29d8ab"}, - {file = "Cython-3.0.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cec2a67a0a7d9d4399758c0657ca03e5912e37218859cfbf046242cc532bfb3b"}, - {file = "Cython-3.0.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a1cdd01ce45333bc264a218c6e183700d6b998f029233f586a53c9b13455c2d2"}, - {file = "Cython-3.0.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:ecee663d2d50ca939fc5db81f2f8a219c2417b4651ad84254c50a03a9cb1aadd"}, - {file = "Cython-3.0.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:30f10e79393b411af7677c270ea69807acb9fc30205c8ff25561f4deef780ec1"}, - {file = "Cython-3.0.0-cp38-cp38-win32.whl", hash = "sha256:609777d3a7a0a23b225e84d967af4ad2485c8bdfcacef8037cf197e87d431ca0"}, - {file = "Cython-3.0.0-cp38-cp38-win_amd64.whl", hash = "sha256:7f4a6dfd42ae0a45797f50fc4f6add702abf46ab3e7cd61811a6c6a97a40e1a2"}, - {file = "Cython-3.0.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:2d8158277c8942c0b20ff4c074fe6a51c5b89e6ac60cef606818de8c92773596"}, - {file = "Cython-3.0.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:54e34f99b2a8c1e11478541b2822e6408c132b98b6b8f5ed89411e5e906631ea"}, - {file = "Cython-3.0.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:877d1c8745df59dd2061a0636c602729e9533ba13f13aa73a498f68662e1cbde"}, - {file = "Cython-3.0.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:204690be60f0ff32eb70b04f28ef0d1e50ffd7b3f77ba06a7dc2389ee3b848e0"}, - {file = "Cython-3.0.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:06fcb4628ccce2ba5abc8630adbeaf4016f63a359b4c6c3827b2d80e0673981c"}, - {file = "Cython-3.0.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:090e24cfa31c926d0b13d8bb2ef48175acdd061ae1413343c94a2b12a4a4fa6f"}, - {file = "Cython-3.0.0-cp39-cp39-win32.whl", hash = "sha256:4cd00f2158dc00f7f93a92444d0f663eda124c9c29bbbd658964f4e89c357fe8"}, - {file = "Cython-3.0.0-cp39-cp39-win_amd64.whl", hash = "sha256:5b4cc896d49ce2bae8d6a030f9a4c64965b59c38acfbf4617685e17f7fcf1731"}, - {file = "Cython-3.0.0-py2.py3-none-any.whl", hash = "sha256:ff1aef1a03cfe293237c7a86ae9625b0411b2df30c53d1a7f29a8d381f38a1df"}, - {file = "Cython-3.0.0.tar.gz", hash = "sha256:350b18f9673e63101dbbfcf774ee2f57c20ac4636d255741d76ca79016b1bd82"}, -] - -[[package]] -name = "elastic-transport" -version = "8.4.0" -description = "Transport classes and utilities shared among Python Elastic client libraries" -optional = false -python-versions = ">=3.6" -files = [ - {file = "elastic-transport-8.4.0.tar.gz", hash = "sha256:b9ad708ceb7fcdbc6b30a96f886609a109f042c0b9d9f2e44403b3133ba7ff10"}, - {file = "elastic_transport-8.4.0-py3-none-any.whl", hash = "sha256:19db271ab79c9f70f8c43f8f5b5111408781a6176b54ab2e54d713b6d9ceb815"}, + {file = "Cython-3.0.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:8ccb91d2254e34724f1541b2a6fcdfacdb88284185b0097ae84e0ddf476c7a38"}, + {file = "Cython-3.0.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c298b1589205ecaaed0457ad05e0c8a43e7db2053607f48ed4a899cb6aa114df"}, + {file = "Cython-3.0.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e825e682cef76d0c33384f38b56b7e87c76152482a914dfc78faed6ff66ce05a"}, + {file = "Cython-3.0.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:77ec0134fc1b10aebef2013936a91c07bff2498ec283bc2eca099ee0cb94d12e"}, + {file = "Cython-3.0.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:c90eeb94395315e65fd758a2f86b92904fce7b50060b4d45a878ef6767f9276e"}, + {file = "Cython-3.0.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:38085523fa7a299638d051ae08144222785639882f6291bd275c0b12db1034ff"}, + {file = "Cython-3.0.2-cp310-cp310-win32.whl", hash = "sha256:b032cb0c69082f0665b2c5fb416d041157062f1538336d0edf823b9ee500e39c"}, + {file = "Cython-3.0.2-cp310-cp310-win_amd64.whl", hash = "sha256:067b2b9eb487bd61367b296f11b7c1c70a084b3eb7d5a572f607cd1fc5ca5586"}, + {file = "Cython-3.0.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:213ff9f95de319e54b520bf31edd6aa7a1fa4fbf617c2beb0f92362595e6476a"}, + {file = "Cython-3.0.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4bebbca13078125a35937966137af4bd0300a0c66fd7ae4ce36adc049b13bdf3"}, + {file = "Cython-3.0.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d5e5587128e8c2423aefcffa4ded4ddf60d44898938fbb7c0f236636a750a94f"}, + {file = "Cython-3.0.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:78e2853d484643c6b7ac3bdb48392753442da1c71b689468fa3176b619bebe54"}, + {file = "Cython-3.0.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:c5e722732e9aa9bde667ed6d87525234823eb7766ca234cfb19d7e0c095a2ef4"}, + {file = "Cython-3.0.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:989787fc24a95100a26918b6577d06e15a8868a3ed267009c5cfcf1a906179ac"}, + {file = "Cython-3.0.2-cp311-cp311-win32.whl", hash = "sha256:d21801981db44b7e9f9768f121317946461d56b51de1e6eff3c42e8914048696"}, + {file = "Cython-3.0.2-cp311-cp311-win_amd64.whl", hash = "sha256:809617cf4825b2138ce0ec827e1f28e39668743c81ac8286373f8d148c05f088"}, + {file = "Cython-3.0.2-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:5682293d344b7dbad97ce6eceb9e887aca6e53499709db9da726ca3424e5559d"}, + {file = "Cython-3.0.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7e08ff5da5f5b969639784b1bffcd880a0c0f048d182aed7cba9945ee8b367c2"}, + {file = "Cython-3.0.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8850269ff59f77a1629e26d0576701925360d732011d6d3516ccdc5b2c2bc310"}, + {file = "Cython-3.0.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:550b3fbe9b3c555b44ded934f4822f9fcc04dfcee512167ebcbbd370ccede20e"}, + {file = "Cython-3.0.2-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:4db017b104f47b1185237702f6ed2651839c8124614683efa7c489f3fa4e19d9"}, + {file = "Cython-3.0.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:75a2395cc7b78cff59be6e9b7f92bbb5d7b8d25203f6d3fb6f72bdb7d3f49777"}, + {file = "Cython-3.0.2-cp312-cp312-win32.whl", hash = "sha256:786b6034a91e886116bb562fe42f8bf0f97c3e00c02e56791d02675959ed65b1"}, + {file = "Cython-3.0.2-cp312-cp312-win_amd64.whl", hash = "sha256:cc9d173ab8b167cae674f6deed8c65ba816574797a2bd6d8aa623277d1fa81ca"}, + {file = "Cython-3.0.2-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:8948504338d7a140ce588333177dcabf0743a68dbc83b0174f214f5b959634d5"}, + {file = "Cython-3.0.2-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a51efba0e136b2af358e5a347bae09678b17460c35cf1eab24f0476820348991"}, + {file = "Cython-3.0.2-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:05cb2a73810f045d328b7579cf98f550a9e601df5e282d1fea0512d8ad589011"}, + {file = "Cython-3.0.2-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:22ba78e48bdb65977928ecb275ac8c82df7b0eefa075078a1363a5af4606b42e"}, + {file = "Cython-3.0.2-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:302281b927409b3e0ef8cd9251eab782cf1acd2578eab305519fbae5d184b7e9"}, + {file = "Cython-3.0.2-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:a1c3675394b81024aaf56e4f53c2b4f81d9a116c7049e9d4706f810899c9134e"}, + {file = "Cython-3.0.2-cp36-cp36m-win32.whl", hash = "sha256:34f7b014ebce5d325c8084e396c81cdafbd8d82be56780dffe6b67b28c891f1b"}, + {file = "Cython-3.0.2-cp36-cp36m-win_amd64.whl", hash = "sha256:477cd3549597f09a1608da7b05e16ba641e9aedd171b868533a5a07790ed886f"}, + {file = "Cython-3.0.2-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:a49dde9f9e29ea82f29aaf3bb1a270b6eb90b75d627c7ff2f5dd3764540ae646"}, + {file = "Cython-3.0.2-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bc1c8013fad0933f5201186eccc5f2be223cafd6a8dcd586d3f7bb6ba84dc845"}, + {file = "Cython-3.0.2-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6b75e9c9d7ad7c9dd85d45241d1d4e3c5f66079c1f84eec91689c26d98bc3349"}, + {file = "Cython-3.0.2-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7f43c4d3ecd9e3b8b7afe834e519f55cf4249b1088f96d11b96f02c55cbaeff7"}, + {file = "Cython-3.0.2-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:dab6a923e21e212aa3dc6dde9b22a190f5d7c449315a94e57ddc019ea74a979b"}, + {file = "Cython-3.0.2-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:ae453cfa933b919c0a19d2cc5dc9fb28486268e95dc2ab7a11ab7f99cf8c3883"}, + {file = "Cython-3.0.2-cp37-cp37m-win32.whl", hash = "sha256:b1f023d36a3829069ed11017c670128be3f135a9c17bd64c35d3b3442243b05c"}, + {file = "Cython-3.0.2-cp37-cp37m-win_amd64.whl", hash = "sha256:011c4e0b75baee1843334562487eb4fbc0c59ddb2cc32a978b972a81eedcbdcc"}, + {file = "Cython-3.0.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:832bbee87bca760efeae248ddf19ccd77f9a2355cb6f8a64f20cc377e56957b3"}, + {file = "Cython-3.0.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4fe806d154b6b7f0ab746dac36c022889e2e7cf47546ff9afdc29a62cfa692d0"}, + {file = "Cython-3.0.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e486331a29e7700b1ad5f4f753bef483c81412a5e64a873df46d6cb66f9a65de"}, + {file = "Cython-3.0.2-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:54d41a1dfbaab74449873e7f8e6cd4239850fe7a50f7f784dd99a560927f3bac"}, + {file = "Cython-3.0.2-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:4dca13c86d6cd523c7d8bbf8db1b2bbf8faedd0addedb229158d8015ad1819e1"}, + {file = "Cython-3.0.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:10cbfb37f31938371a6213cc8b5459c639954aed053efeded3c012d4c5915db9"}, + {file = "Cython-3.0.2-cp38-cp38-win32.whl", hash = "sha256:e663c237579c033deaa2cb362b74651da7712f56e441c11382510a8c4c4f2dd7"}, + {file = "Cython-3.0.2-cp38-cp38-win_amd64.whl", hash = "sha256:2f84bd6cefa5130750c492038170c44f1cbd6f42e9ed85e168fd9cb453f85160"}, + {file = "Cython-3.0.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:f37e4287f520f3748a06ad5eaae09ba4ac68f52e155d70de5f75780d83575c43"}, + {file = "Cython-3.0.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dd30826ca8b27b2955a63c8ffe8aacc9f0779582b4bd154cf7b441ac10dae2cb"}, + {file = "Cython-3.0.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:08d67c7225a09eeb77e090c8d4f60677165b052ccf76e3a57d8237064e5c2de2"}, + {file = "Cython-3.0.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9e625eec8c5c9a8cb062a318b257cc469d301bed952c7daf86e38bbd3afe7c91"}, + {file = "Cython-3.0.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:1b12a8f23270675b537d1c3b988f845bea4bbcc66ae0468857f5ede0526d4522"}, + {file = "Cython-3.0.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:62dd78afdf748a58dae9c9b9c42a1519ae30787b28ce5f84a0e1bb54144142ca"}, + {file = "Cython-3.0.2-cp39-cp39-win32.whl", hash = "sha256:d0d0cc4ecc05f41c5e02af14ac0083552d22efed976f79eb7bade55fed63b25d"}, + {file = "Cython-3.0.2-cp39-cp39-win_amd64.whl", hash = "sha256:147cc1d3dda8b06de9d86df5e59cdf15f0a522620168b7349a5ec88b48104d7d"}, + {file = "Cython-3.0.2-py2.py3-none-any.whl", hash = "sha256:8f1c9e4b8e413da211dd7942440cf410ff0eafb081309e04e81f4fafbb146bf2"}, + {file = "Cython-3.0.2.tar.gz", hash = "sha256:9594818dca8bb22ae6580c5222da2bc5cc32334350bd2d294a00d8669bcc61b5"}, ] -[package.dependencies] -certifi = "*" -urllib3 = ">=1.26.2,<2" - -[package.extras] -develop = ["aiohttp", "mock", "pytest", "pytest-asyncio", "pytest-cov", "pytest-httpserver", "pytest-mock", "requests", "trustme"] - -[[package]] -name = "elasticsearch" -version = "8.9.0" -description = "Python client for Elasticsearch" -optional = false -python-versions = ">=3.6, <4" -files = [ - {file = "elasticsearch-8.9.0-py3-none-any.whl", hash = "sha256:0795cbf0f61482070741c09ba02ac8fdf18f5984912fbd08b248fadd8a8c9952"}, - {file = "elasticsearch-8.9.0.tar.gz", hash = "sha256:d3367fc013e04fc7aad349a6de9fad1ee04fb6d627b0e7896aa505c12fde5e04"}, -] - -[package.dependencies] -elastic-transport = ">=8,<9" - -[package.extras] -async = ["aiohttp (>=3,<4)"] -requests = ["requests (>=2.4.0,<3.0.0)"] - [[package]] name = "eventkit" -version = "1.0.0" +version = "1.0.1" description = "Event-driven data pipelines" optional = false python-versions = "*" files = [ - {file = "eventkit-1.0.0-py3-none-any.whl", hash = "sha256:c3c1ae6e15cda9970c3996b0aaeda48431fc6b8674c01e7a7ff77a13629cc021"}, - {file = "eventkit-1.0.0.tar.gz", hash = "sha256:c9c4bb8a9685e4131e845882512a630d6a57acee148f38af286562a76873e4a9"}, + {file = "eventkit-1.0.1-py3-none-any.whl", hash = "sha256:6060a6aa04d5c5d20f2e55b7c17e2a22e8d31f88f2c2791d60eab3301aa040da"}, + {file = "eventkit-1.0.1.tar.gz", hash = "sha256:56b99a6205f61cd995aa5e0036e37bd61f052f7d32560e60b6fe45e319a7ef3a"}, ] [package.dependencies] @@ -416,20 +359,6 @@ files = [ [package.extras] test = ["pytest (>=6)"] -[[package]] -name = "fuzzywuzzy" -version = "0.18.0" -description = "Fuzzy string matching in python" -optional = false -python-versions = "*" -files = [ - {file = "fuzzywuzzy-0.18.0-py2.py3-none-any.whl", hash = "sha256:928244b28db720d1e0ee7587acf660ea49d7e4c632569cad4f1cd7e68a5f0993"}, - {file = "fuzzywuzzy-0.18.0.tar.gz", hash = "sha256:45016e92264780e58972dca1b3d939ac864b78437422beecebb3095f8efd00e8"}, -] - -[package.extras] -speedup = ["python-levenshtein (>=0.12)"] - [[package]] name = "greenback" version = "1.1.1" @@ -458,6 +387,7 @@ files = [ {file = "greenlet-2.0.2-cp27-cp27m-win32.whl", hash = "sha256:6c3acb79b0bfd4fe733dff8bc62695283b57949ebcca05ae5c129eb606ff2d74"}, {file = "greenlet-2.0.2-cp27-cp27m-win_amd64.whl", hash = "sha256:283737e0da3f08bd637b5ad058507e578dd462db259f7f6e4c5c365ba4ee9343"}, {file = "greenlet-2.0.2-cp27-cp27mu-manylinux2010_x86_64.whl", hash = "sha256:d27ec7509b9c18b6d73f2f5ede2622441de812e7b1a80bbd446cb0633bd3d5ae"}, + {file = "greenlet-2.0.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:d967650d3f56af314b72df7089d96cda1083a7fc2da05b375d2bc48c82ab3f3c"}, {file = "greenlet-2.0.2-cp310-cp310-macosx_11_0_x86_64.whl", hash = "sha256:30bcf80dda7f15ac77ba5af2b961bdd9dbc77fd4ac6105cee85b0d0a5fcf74df"}, {file = "greenlet-2.0.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:26fbfce90728d82bc9e6c38ea4d038cba20b7faf8a0ca53a9c07b67318d46088"}, {file = "greenlet-2.0.2-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9190f09060ea4debddd24665d6804b995a9c122ef5917ab26e1566dcc712ceeb"}, @@ -466,6 +396,7 @@ files = [ {file = "greenlet-2.0.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:76ae285c8104046b3a7f06b42f29c7b73f77683df18c49ab5af7983994c2dd91"}, {file = "greenlet-2.0.2-cp310-cp310-win_amd64.whl", hash = "sha256:2d4686f195e32d36b4d7cf2d166857dbd0ee9f3d20ae349b6bf8afc8485b3645"}, {file = "greenlet-2.0.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:c4302695ad8027363e96311df24ee28978162cdcdd2006476c43970b384a244c"}, + {file = "greenlet-2.0.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:d4606a527e30548153be1a9f155f4e283d109ffba663a15856089fb55f933e47"}, {file = "greenlet-2.0.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c48f54ef8e05f04d6eff74b8233f6063cb1ed960243eacc474ee73a2ea8573ca"}, {file = "greenlet-2.0.2-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a1846f1b999e78e13837c93c778dcfc3365902cfb8d1bdb7dd73ead37059f0d0"}, {file = "greenlet-2.0.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3a06ad5312349fec0ab944664b01d26f8d1f05009566339ac6f63f56589bc1a2"}, @@ -495,6 +426,7 @@ files = [ {file = "greenlet-2.0.2-cp37-cp37m-win32.whl", hash = "sha256:3f6ea9bd35eb450837a3d80e77b517ea5bc56b4647f5502cd28de13675ee12f7"}, {file = "greenlet-2.0.2-cp37-cp37m-win_amd64.whl", hash = "sha256:7492e2b7bd7c9b9916388d9df23fa49d9b88ac0640db0a5b4ecc2b653bf451e3"}, {file = "greenlet-2.0.2-cp38-cp38-macosx_10_15_x86_64.whl", hash = "sha256:b864ba53912b6c3ab6bcb2beb19f19edd01a6bfcbdfe1f37ddd1778abfe75a30"}, + {file = "greenlet-2.0.2-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:1087300cf9700bbf455b1b97e24db18f2f77b55302a68272c56209d5587c12d1"}, {file = "greenlet-2.0.2-cp38-cp38-manylinux2010_x86_64.whl", hash = "sha256:ba2956617f1c42598a308a84c6cf021a90ff3862eddafd20c3333d50f0edb45b"}, {file = "greenlet-2.0.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fc3a569657468b6f3fb60587e48356fe512c1754ca05a564f11366ac9e306526"}, {file = "greenlet-2.0.2-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8eab883b3b2a38cc1e050819ef06a7e6344d4a990d24d45bc6f2cf959045a45b"}, @@ -503,6 +435,7 @@ files = [ {file = "greenlet-2.0.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:b0ef99cdbe2b682b9ccbb964743a6aca37905fda5e0452e5ee239b1654d37f2a"}, {file = "greenlet-2.0.2-cp38-cp38-win32.whl", hash = "sha256:b80f600eddddce72320dbbc8e3784d16bd3fb7b517e82476d8da921f27d4b249"}, {file = "greenlet-2.0.2-cp38-cp38-win_amd64.whl", hash = "sha256:4d2e11331fc0c02b6e84b0d28ece3a36e0548ee1a1ce9ddde03752d9b79bba40"}, + {file = "greenlet-2.0.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:8512a0c38cfd4e66a858ddd1b17705587900dd760c6003998e9472b77b56d417"}, {file = "greenlet-2.0.2-cp39-cp39-macosx_11_0_x86_64.whl", hash = "sha256:88d9ab96491d38a5ab7c56dd7a3cc37d83336ecc564e4e8816dbed12e5aaefc8"}, {file = "greenlet-2.0.2-cp39-cp39-manylinux2010_x86_64.whl", hash = "sha256:561091a7be172ab497a3527602d467e2b3fbe75f9e783d8b8ce403fa414f71a6"}, {file = "greenlet-2.0.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:971ce5e14dc5e73715755d0ca2975ac88cfdaefcaab078a284fea6cfabf866df"}, @@ -576,20 +509,6 @@ perf = ["ipython"] testing = ["flufl.flake8", "importlib-resources (>=1.3)", "packaging", "pyfakefs", "pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-mypy (>=0.9.1)", "pytest-perf (>=0.9.2)", "pytest-ruff"] [[package]] -<<<<<<< HEAD -======= -name = "iniconfig" -version = "2.0.0" -description = "brain-dead simple config-ini parsing" -optional = false -python-versions = ">=3.7" -files = [ - {file = "iniconfig-2.0.0-py3-none-any.whl", hash = "sha256:b6a85871a79d2e3b22d2d1b94ac2824226a63c6b741c88f7ae975f18b6778374"}, - {file = "iniconfig-2.0.0.tar.gz", hash = "sha256:2d91e135bf72d31a410b17c16da610a82cb55f6b0477d1a902134b24a455b8b3"}, -] - -[[package]] ->>>>>>> b9eeecf1 (Add `.ui` and `.dev` deps groups via `poetry` Bo) name = "keysymdef" version = "1.2.0" description = "X11 keysym data for Python" @@ -669,40 +588,40 @@ files = [ [[package]] name = "msgspec" -version = "0.18.1" +version = "0.18.2" description = "A fast serialization and validation library, with builtin support for JSON, MessagePack, YAML, and TOML." optional = false python-versions = ">=3.8" files = [ - {file = "msgspec-0.18.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:262e5f1a981644f5e9b28a984d6df238eac0ed2c37d788f40abaf10d380b0424"}, - {file = "msgspec-0.18.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:e3f4a7d5897984f59baf51976682f52f4d2eff88aa64eec8b7f5b80b7a2b6dc5"}, - {file = "msgspec-0.18.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b6d21f0da90d1f3e7f65123d375c2b590bfbe3a014920ea812e1a022027b60d3"}, - {file = "msgspec-0.18.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ebb71f51ca2f62d0d1cf9585f763e3d9fd8a85a0f00d682112916532964692ae"}, - {file = "msgspec-0.18.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:52bb422d2b2e80e86d72439edb1a372ff016c0c5d9f44d277b220511486b3f9a"}, - {file = "msgspec-0.18.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:119ff9d5412eccf53f0d7ab43b587a58f6f806a40ae6b14fd8140173b1cc0285"}, - {file = "msgspec-0.18.1-cp310-cp310-win_amd64.whl", hash = "sha256:36da63a8f64292fff7c814bd3cbbba669f0fa5068c149b4a386dba662ace5621"}, - {file = "msgspec-0.18.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:b132ae2691623b3fbee730604671da3bf57ca97d648f1a46a35ea09c6f490fcf"}, - {file = "msgspec-0.18.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:944af5f9ec66de8e21b30ccafdab3e87be11d757ca9304c01e3b2efc373f3293"}, - {file = "msgspec-0.18.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4e96b71e98728830ea3d20acf65969ba7059dfc9e32581039f05e88b8461d98b"}, - {file = "msgspec-0.18.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:914ab6407fdce1bc795583ba0428f49baf6eedd40df117200ec8fe7666ca2ec4"}, - {file = "msgspec-0.18.1-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:13980627b9ba28fac2e051757ef5edbe0bebfef411d648e58d2100b86c5eca03"}, - {file = "msgspec-0.18.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:a6bd460e2057a6d9ca6d0e2b848a441c6e30977012d1fca43e4bc1702c9abca5"}, - {file = "msgspec-0.18.1-cp311-cp311-win_amd64.whl", hash = "sha256:c63f9dc8c33ca56903d7957ee7a5d0b3ece6b345b8b10f44b226787a4410c8e1"}, - {file = "msgspec-0.18.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:3a88d2fb82eb59de0f0f365a27dcea2020440883770b99353e0a3e0aa8ef552a"}, - {file = "msgspec-0.18.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:f936f6ea351c2e8c0d53875a6a71d9887603e3faadbe380172d22283e011f1b3"}, - {file = "msgspec-0.18.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:597324c72b504f04fb283078b748e664f7f7fc5337bb493e0996511bab895e7e"}, - {file = "msgspec-0.18.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f94eca90ac47a24cb07b3702c863a6b0881830ea02de7ac58a00f778b4b7762b"}, - {file = "msgspec-0.18.1-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:c256b21baa1336d651aa9955d69d3f8d0e971d78e0e75fd28a89742af7dcff65"}, - {file = "msgspec-0.18.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:9721948182d471c4f1655634f1970628a7321ec58a2cfb89d35af78c2fc2ebfa"}, - {file = "msgspec-0.18.1-cp38-cp38-win_amd64.whl", hash = "sha256:f01fe87b592185a11091206a745fdcba5b40d4c4342d1089959df49f18d6a700"}, - {file = "msgspec-0.18.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:966ee615b8227c208276863c4269a01dfe8c3b2538b8e1ee33bb01010fe7a3af"}, - {file = "msgspec-0.18.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:d94555a79013c100b1345e0a5a6d36bfa915e74831e42de3a97cb81313426ea7"}, - {file = "msgspec-0.18.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9c63a0f49540e2a888acec8c154066b6ef985813ce27132eb38e1f0c7f49df27"}, - {file = "msgspec-0.18.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0784a23d1b5b8a6fe4c9f5b9c1779adc5bff4de0fe388545dc2a4f1b5b90e546"}, - {file = "msgspec-0.18.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:4bd273e373e220437a22a5ad83a90e3dd648c4e625f48e42e172026de77a3038"}, - {file = "msgspec-0.18.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:a0f5070d77658ac953f63114fbaafc6ec967e9e61993ff70cc2432e938a3cf3e"}, - {file = "msgspec-0.18.1-cp39-cp39-win_amd64.whl", hash = "sha256:fe22658000c165be1055c8df3f7ecc3db85be838d47d1ce1e0526b10747bdf0f"}, - {file = "msgspec-0.18.1.tar.gz", hash = "sha256:a7d837e370cfe5afb941e9c922dbdbee9c854b21bafdebaf068bdf15c43ec21d"}, + {file = "msgspec-0.18.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:1535855b0db1bee4e5c79384010861de2a23391b45095785e84ec9489abc56cd"}, + {file = "msgspec-0.18.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:2ad4f4704045a0fb1b5226769d9cdc00a4a69adec2e6770064f3db73bb91bbf9"}, + {file = "msgspec-0.18.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:abcb92ffbca77bcfbedd5b29b68629628948982aafb994658e7abfad6e15913c"}, + {file = "msgspec-0.18.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:358c2b908f1ed63419ccc5f185150c0caa3fc49599f4582504637cbfd5ff6242"}, + {file = "msgspec-0.18.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:78a593bc0db95416d633b28cff00af0465f04590d53ff1a80a33d7e2728820ad"}, + {file = "msgspec-0.18.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:7b065995f3a41e4c8274a86e1ee84ac432969918373c777de239ef14f9537d80"}, + {file = "msgspec-0.18.2-cp310-cp310-win_amd64.whl", hash = "sha256:d127bf90f29f1211520f1baa897b10f2a9c05b8648ce7dc89dfc9ca45599be53"}, + {file = "msgspec-0.18.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:3bfc55d5ca60b3aa2c2287191aa9e943c54eb0aef16d4babb92fddcc047093b1"}, + {file = "msgspec-0.18.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:e03ff009f3a2e1fe883703f98098d12aea6b30934707b404fd994e9ea1c1bfa7"}, + {file = "msgspec-0.18.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ade3959577bff46c7d9476962d2d7aa086b2820f3da03ee000e9be4958404829"}, + {file = "msgspec-0.18.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:80e57102469ee0d2186c72d42fa9460981ccd4252bdb997bf04ef2af0818984f"}, + {file = "msgspec-0.18.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:25f7e3adaf1ca5d80455057576785069475b1d941eb877dbd0ae738cc5d1fefa"}, + {file = "msgspec-0.18.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:b56cc7b9956daefb309447bbbb2581c84e5d5e3b89d573b1d5a25647522d2e43"}, + {file = "msgspec-0.18.2-cp311-cp311-win_amd64.whl", hash = "sha256:84cc7932f78aeec6ef014cca4bb4ecea8469bc05f13c9eacdfa27baa785e54b9"}, + {file = "msgspec-0.18.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:35420ae8afaa90498733541c0d8b2a73c70548a8a4d86da11201ed6df557e98f"}, + {file = "msgspec-0.18.2-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:3f71c33efda990ecddc878ea2bb37f22e941d4264ded83e1b2309f86d335cde7"}, + {file = "msgspec-0.18.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ccaddb764b5abe457c0eded4a252f5fbeb8b04a946b46a06a7e6ca299c35dcb1"}, + {file = "msgspec-0.18.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:23e65efaef864bf66a4ddfae9c2200c40ce1a50411f454de1757f3651e5762cd"}, + {file = "msgspec-0.18.2-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:baaba2411003f2e7a4328b5a58eba9efeb4c5e6a27e8ffd2adaccdc8feb0a805"}, + {file = "msgspec-0.18.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:eb80befd343f3b378c8abad0367154703c74bde02fc62cbcf1a0e6b5fa779459"}, + {file = "msgspec-0.18.2-cp38-cp38-win_amd64.whl", hash = "sha256:b9b3ed82f71816cddf0a9cdaae30a1d1addf8fe56ec09e7368db93ce43b29a81"}, + {file = "msgspec-0.18.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:84fcf74b6371494aa536bf438ef96b08ce8f6e40483a01ed305535a40113136b"}, + {file = "msgspec-0.18.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:a75c4efa7565048f81e709a366e14b9dc10752b3fb5ea1f3c8de5abfca3db3c2"}, + {file = "msgspec-0.18.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4c1ee8b9667fde3b5d7e0e0b555a8b70e2fa7bf2e02e9e8673af262c82c7b691"}, + {file = "msgspec-0.18.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c79ac853409b0000727f4c3e5fb32fe38122ad94b9e074f992fa9ea7f00eb498"}, + {file = "msgspec-0.18.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:595f14f628825d9d79eeea6e08514144a3d516eb014f0c6191f91899c83a6836"}, + {file = "msgspec-0.18.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:b90a44550f19ee0b8c37dbca75f96473299275001af2a00273d736b7347ead6d"}, + {file = "msgspec-0.18.2-cp39-cp39-win_amd64.whl", hash = "sha256:70fa7f008008e2c823ecc1a143258bb2820ac76010cf6003091fa3832b6334c9"}, + {file = "msgspec-0.18.2.tar.gz", hash = "sha256:3996bf1fc252658a7e028a0c263d28ac4dc48476e35f6fd8ebaf461a39459825"}, ] [package.extras] @@ -883,21 +802,6 @@ files = [ python-dateutil = ">=2.6,<3.0" pytzdata = ">=2020.1" -[[package]] -name = "pluggy" -version = "1.2.0" -description = "plugin and hook calling mechanisms for python" -optional = false -python-versions = ">=3.7" -files = [ - {file = "pluggy-1.2.0-py3-none-any.whl", hash = "sha256:c2fd55a7d7a3863cba1a013e4e2414658b1d07b6bc57b3919e0c63c9abb99849"}, - {file = "pluggy-1.2.0.tar.gz", hash = "sha256:d12f0c4b579b15f5e054301bb226ee85eeeba08ffec228092f8defbaa3a4c4b3"}, -] - -[package.extras] -dev = ["pre-commit", "tox"] -testing = ["pytest", "pytest-benchmark"] - [[package]] name = "polars" version = "0.18.15" @@ -930,31 +834,6 @@ timezone = ["backports.zoneinfo", "tzdata"] xlsx2csv = ["xlsx2csv (>=0.8.0)"] xlsxwriter = ["xlsxwriter"] -[[package]] -name = "prompt-toolkit" -version = "3.0.39" -description = "Library for building powerful interactive command lines in Python" -optional = false -python-versions = ">=3.7.0" -files = [ - {file = "prompt_toolkit-3.0.39-py3-none-any.whl", hash = "sha256:9dffbe1d8acf91e3de75f3b544e4842382fc06c6babe903ac9acb74dc6e08d88"}, - {file = "prompt_toolkit-3.0.39.tar.gz", hash = "sha256:04505ade687dc26dc4284b1ad19a83be2f2afe83e7a828ace0c72f3a1df72aac"}, -] - -[package.dependencies] -wcwidth = "*" - -[[package]] -name = "py" -version = "1.11.0" -description = "library with cross-python path, ini-parsing, io, code, log facilities" -optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" -files = [ - {file = "py-1.11.0-py2.py3-none-any.whl", hash = "sha256:607c53218732647dff4acdfcd50cb62615cedf612e72d1724fb1a0cc6405b378"}, - {file = "py-1.11.0.tar.gz", hash = "sha256:51c75c4126074b472f746a24399ad32f6053d1b34b68d2fa41e558e6f4a98719"}, -] - [[package]] name = "pycparser" version = "2.21" @@ -980,85 +859,6 @@ files = [ [package.extras] plugins = ["importlib-metadata"] -[[package]] -name = "pyqt5" -version = "5.15.9" -description = "Python bindings for the Qt cross platform application toolkit" -optional = false -python-versions = ">=3.7" -files = [ - {file = "PyQt5-5.15.9-cp37-abi3-macosx_10_13_x86_64.whl", hash = "sha256:883ba5c8a348be78c8be6a3d3ba014c798e679503bce00d76c666c2dc6afe828"}, - {file = "PyQt5-5.15.9-cp37-abi3-manylinux_2_17_x86_64.whl", hash = "sha256:dd5ce10e79fbf1df29507d2daf99270f2057cdd25e4de6fbf2052b46c652e3a5"}, - {file = "PyQt5-5.15.9-cp37-abi3-win32.whl", hash = "sha256:e45c5cc15d4fd26ab5cb0e5cdba60691a3e9086411f8e3662db07a5a4222a696"}, - {file = "PyQt5-5.15.9-cp37-abi3-win_amd64.whl", hash = "sha256:e030d795df4cbbfcf4f38b18e2e119bcc9e177ef658a5094b87bb16cac0ce4c5"}, - {file = "PyQt5-5.15.9.tar.gz", hash = "sha256:dc41e8401a90dc3e2b692b411bd5492ab559ae27a27424eed4bd3915564ec4c0"}, -] - -[package.dependencies] -PyQt5-Qt5 = ">=5.15.2" -PyQt5-sip = ">=12.11,<13" - -[[package]] -name = "pyqt5-qt5" -version = "5.15.2" -description = "The subset of a Qt installation needed by PyQt5." -optional = false -python-versions = "*" -files = [ - {file = "PyQt5_Qt5-5.15.2-py3-none-macosx_10_13_intel.whl", hash = "sha256:76980cd3d7ae87e3c7a33bfebfaee84448fd650bad6840471d6cae199b56e154"}, - {file = "PyQt5_Qt5-5.15.2-py3-none-manylinux2014_x86_64.whl", hash = "sha256:1988f364ec8caf87a6ee5d5a3a5210d57539988bf8e84714c7d60972692e2f4a"}, - {file = "PyQt5_Qt5-5.15.2-py3-none-win32.whl", hash = "sha256:9cc7a768b1921f4b982ebc00a318ccb38578e44e45316c7a4a850e953e1dd327"}, - {file = "PyQt5_Qt5-5.15.2-py3-none-win_amd64.whl", hash = "sha256:750b78e4dba6bdf1607febedc08738e318ea09e9b10aea9ff0d73073f11f6962"}, -] - -[[package]] -name = "pyqt5-sip" -version = "12.12.2" -description = "The sip module support for PyQt5" -optional = false -python-versions = ">=3.7" -files = [ - {file = "PyQt5_sip-12.12.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:1cc49c8498c34649325d53bcd243c854391f828d9bab4f2f3afd3ee3451cab72"}, - {file = "PyQt5_sip-12.12.2-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:c8f6e7a697d0ddf754798988fae7b2a0da04f6a59fb13ae863e5d1da4b280c4f"}, - {file = "PyQt5_sip-12.12.2-cp310-cp310-win32.whl", hash = "sha256:7e572c8104e75db2c69609d195daf44c7b965dcb1c5b48e30fc376868909be56"}, - {file = "PyQt5_sip-12.12.2-cp310-cp310-win_amd64.whl", hash = "sha256:6a65697aa0fdb66e20d7b1ef8adfacc1caf1e61655530920172bf3a2fb1148cd"}, - {file = "PyQt5_sip-12.12.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:761e018dbbc46daccdb01f8f0dcc0d055c76834d839f0343cbec4b0ecbbde512"}, - {file = "PyQt5_sip-12.12.2-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:9d2b127ba5155bff452944b8a96ba06d7ec2161f48a2f9cc190425bfca94ab6b"}, - {file = "PyQt5_sip-12.12.2-cp311-cp311-win32.whl", hash = "sha256:26e75bc4ffd8e6b19ae96fe93dc135eb5aea03e4570724d4b3c40dbf36f3a2e6"}, - {file = "PyQt5_sip-12.12.2-cp311-cp311-win_amd64.whl", hash = "sha256:d9548f353f17407d00f67d08c737de9f5c067352c3bdac8571492c614c2893eb"}, - {file = "PyQt5_sip-12.12.2-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:7e640b7636d86271ba8969b260e1655068b44750f20801ebc80f49a1aa737bf9"}, - {file = "PyQt5_sip-12.12.2-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:e46d957fbeecaa1437f2dd715407b1e59e0918cc29382c7ea79784c5f3cbe0d2"}, - {file = "PyQt5_sip-12.12.2-cp37-cp37m-win32.whl", hash = "sha256:cb4523097f1ccabb95b3197a58278a40fc944b33791d3406bfa397e12303b6c6"}, - {file = "PyQt5_sip-12.12.2-cp37-cp37m-win_amd64.whl", hash = "sha256:ed04bd0065d870912c1b0a4b34b8a78698c76d77f15474c3e841b0b6dd2f429f"}, - {file = "PyQt5_sip-12.12.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:71795c177010e52109812b03ec919020461ec42a7d9d241a45fe6d708529b5a6"}, - {file = "PyQt5_sip-12.12.2-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:de06b6bd8241a189f729b8c093ce5dcf5928489eb7748bda28e28324e57544b0"}, - {file = "PyQt5_sip-12.12.2-cp38-cp38-win32.whl", hash = "sha256:7050ad8f94370eb7e4caa022b7e6d8b2de615e0714b557ca2098c82c0132074a"}, - {file = "PyQt5_sip-12.12.2-cp38-cp38-win_amd64.whl", hash = "sha256:67eed70427d3291e5c52c349fb4619c57c9a8810ab8d78a142c00edcbfd20d3b"}, - {file = "PyQt5_sip-12.12.2-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:cf74db9a1542f66793ccc00e403c8c2c36c67c0cff0fb01d23fe71cc1c56c788"}, - {file = "PyQt5_sip-12.12.2-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:23e983119f760dc6c1a1e6cb21fd4c268d14c4ee497de6da9ce2b9d46f9779b2"}, - {file = "PyQt5_sip-12.12.2-cp39-cp39-win32.whl", hash = "sha256:a88ce85176639723f04cf5ce59157ecf3a9faca5d5dd1fe82d5ef46a3bd1d102"}, - {file = "PyQt5_sip-12.12.2-cp39-cp39-win_amd64.whl", hash = "sha256:7f13e71f5171f30d8b4176c081f0203a43e1704746b4cdaa837477945177b2a0"}, - {file = "PyQt5_sip-12.12.2.tar.gz", hash = "sha256:10d9bfa9f59f0fd1cad81be187479316ffc95684f573efea94512cb4257d2b17"}, -] - -[[package]] -name = "pyqtgraph" -version = "0.12.3" -description = "Scientific Graphics and GUI Library for Python" -optional = false -python-versions = ">=3.7" -files = [] -develop = false - -[package.dependencies] -numpy = ">=1.17.0" - -[package.source] -type = "git" -url = "https://github.com/pikers/pyqtgraph.git" -reference = "HEAD" -resolved_reference = "373f9561ea8ec4fef9b4e8bdcdd4bbf372dd6512" - [[package]] name = "pyreadline3" version = "3.4.1" @@ -1070,30 +870,6 @@ files = [ {file = "pyreadline3-3.4.1.tar.gz", hash = "sha256:6f3d1f7b8a31ba32b73917cefc1f28cc660562f39aea8646d30bd6eff21f7bae"}, ] -[[package]] -name = "pytest" -version = "6.2.5" -description = "pytest: simple powerful testing with Python" -optional = false -python-versions = ">=3.6" -files = [ - {file = "pytest-6.2.5-py3-none-any.whl", hash = "sha256:7310f8d27bc79ced999e760ca304d69f6ba6c6649c0b60fb0e04a4a77cacc134"}, - {file = "pytest-6.2.5.tar.gz", hash = "sha256:131b36680866a76e6781d13f101efb86cf674ebb9762eb70d3082b6f29889e89"}, -] - -[package.dependencies] -atomicwrites = {version = ">=1.0", markers = "sys_platform == \"win32\""} -attrs = ">=19.2.0" -colorama = {version = "*", markers = "sys_platform == \"win32\""} -iniconfig = "*" -packaging = "*" -pluggy = ">=0.12,<2.0" -py = ">=1.8.2" -toml = "*" - -[package.extras] -testing = ["argcomplete", "hypothesis (>=3.56)", "mock", "nose", "requests", "xmlschema"] - [[package]] name = "python-dateutil" version = "2.8.2" @@ -1119,42 +895,6 @@ files = [ {file = "pytzdata-2020.1.tar.gz", hash = "sha256:3efa13b335a00a8de1d345ae41ec78dd11c9f8807f522d39850f2dd828681540"}, ] -[[package]] -name = "qdarkstyle" -version = "3.1" -description = "The most complete dark/light style sheet for C++/Python and Qt applications" -optional = false -python-versions = "*" -files = [ - {file = "QDarkStyle-3.1-py2.py3-none-any.whl", hash = "sha256:679a38fcd040de9fac8b8cae483310302fdb12c8d912845249c41dc54974a9b2"}, - {file = "QDarkStyle-3.1.tar.gz", hash = "sha256:600584d625343e0ddd128de08393d3c35637786a49827f174d29aa7caa8279c1"}, -] - -[package.dependencies] -qtpy = ">=1.9" - -[package.extras] -develop = ["qtsass", "watchdog"] -docs = ["sphinx", "sphinx-rtd-theme"] -example = ["pyqt5", "pyside2"] - -[[package]] -name = "qtpy" -version = "2.3.1" -description = "Provides an abstraction layer on top of the various Qt bindings (PyQt5/6 and PySide2/6)." -optional = false -python-versions = ">=3.7" -files = [ - {file = "QtPy-2.3.1-py3-none-any.whl", hash = "sha256:5193d20e0b16e4d9d3bc2c642d04d9f4e2c892590bd1b9c92bfe38a95d5a2e12"}, - {file = "QtPy-2.3.1.tar.gz", hash = "sha256:a8c74982d6d172ce124d80cafd39653df78989683f760f2281ba91a6e7b9de8b"}, -] - -[package.dependencies] -packaging = "*" - -[package.extras] -test = ["pytest (>=6,!=7.0.0,!=7.0.1)", "pytest-cov (>=3.0.0)", "pytest-qt"] - [[package]] name = "rich" version = "13.5.2" @@ -1220,17 +960,6 @@ files = [ [package.dependencies] pyreadline3 = {version = "*", markers = "platform_system == \"Windows\""} -[[package]] -name = "toml" -version = "0.10.2" -description = "Python Library for Tom's Obvious, Minimal Language" -optional = false -python-versions = ">=2.6, !=3.0.*, !=3.1.*, !=3.2.*" -files = [ - {file = "toml-0.10.2-py2.py3-none-any.whl", hash = "sha256:806143ae5bfb6a3c6e736a764057db0e6a0e05e338b5630894a5f779cabb4f9b"}, - {file = "toml-0.10.2.tar.gz", hash = "sha256:b3bda1d108d5dd99f4a20d24d9c348e91c4db7ab1b749200bded2f839ccbe68f"}, -] - [[package]] name = "tomli" version = "2.0.1" @@ -1260,7 +989,7 @@ description = "Style preserving TOML library" optional = false python-versions = ">=3.7" files = [] -develop = false +develop = true [package.source] type = "git" @@ -1292,8 +1021,8 @@ wrapt = "*" [package.source] type = "git" url = "https://github.com/goodboy/tractor.git" -reference = "piker_pin" -resolved_reference = "64956887302b6450c9503b7d04eef28053270bd6" +reference = "asyncio_debugger_support" +resolved_reference = "22c14e235e3390674796dfc3c462863395d2bfda" [[package]] name = "tricycle" @@ -1369,13 +1098,13 @@ trio = ">=0.11.0" [[package]] name = "trio-websocket" -version = "0.10.3" +version = "0.10.4" description = "WebSocket library for Trio" optional = false python-versions = ">=3.7" files = [ - {file = "trio-websocket-0.10.3.tar.gz", hash = "sha256:1a748604ad906a7dcab9a43c6eb5681e37de4793ba0847ef0bc9486933ed027b"}, - {file = "trio_websocket-0.10.3-py3-none-any.whl", hash = "sha256:a9937d48e8132ebf833019efde2a52ca82d223a30a7ea3e8d60a7d28f75a4e3a"}, + {file = "trio-websocket-0.10.4.tar.gz", hash = "sha256:e66b3db3e2453017431dfbd352081006654e1241c2a6800dc2f43d7df54d55c5"}, + {file = "trio_websocket-0.10.4-py3-none-any.whl", hash = "sha256:c7a620c4013c34b7e4477d89fe76695da1e455e4510a8d7ae13f81c632bdce1d"}, ] [package.dependencies] @@ -1415,33 +1144,6 @@ files = [ {file = "typing_extensions-4.7.1.tar.gz", hash = "sha256:b75ddc264f0ba5615db7ba217daeb99701ad295353c45f9e95963337ceeeffb2"}, ] -[[package]] -name = "urllib3" -version = "1.26.16" -description = "HTTP library with thread-safe connection pooling, file post, and more." -optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, !=3.5.*" -files = [ - {file = "urllib3-1.26.16-py2.py3-none-any.whl", hash = "sha256:8d36afa7616d8ab714608411b4a3b13e58f463aee519024578e062e141dce20f"}, - {file = "urllib3-1.26.16.tar.gz", hash = "sha256:8f135f6502756bde6b2a9b28989df5fbe87c9970cecaa69041edcce7f0589b14"}, -] - -[package.extras] -brotli = ["brotli (>=1.0.9)", "brotlicffi (>=0.8.0)", "brotlipy (>=0.6.0)"] -secure = ["certifi", "cryptography (>=1.3.4)", "idna (>=2.0.0)", "ipaddress", "pyOpenSSL (>=0.14)", "urllib3-secure-extra"] -socks = ["PySocks (>=1.5.6,!=1.5.7,<2.0)"] - -[[package]] -name = "wcwidth" -version = "0.2.6" -description = "Measures the displayed width of unicode strings in a terminal" -optional = false -python-versions = "*" -files = [ - {file = "wcwidth-0.2.6-py2.py3-none-any.whl", hash = "sha256:795b138f6875577cd91bba52baf9e445cd5118fd32723b460e30a0af30ea230e"}, - {file = "wcwidth-0.2.6.tar.gz", hash = "sha256:a5220780a404dbe3353789870978e472cfe477761f06ee55077256e509b156d0"}, -] - [[package]] name = "wrapt" version = "1.15.0" @@ -1540,32 +1242,6 @@ files = [ [package.dependencies] h11 = ">=0.9.0,<1" -[[package]] -name = "xonsh" -version = "0.14.1" -description = "Python-powered, cross-platform, Unix-gazing shell" -optional = false -python-versions = ">=3.9" -files = [ - {file = "xonsh-0.14.1-py310-none-any.whl", hash = "sha256:9df9df3cebb91f091d0dae698c7e4b779b62892b7d65f356d23a5f42826d1988"}, - {file = "xonsh-0.14.1-py311-none-any.whl", hash = "sha256:37232867a72263405fe09f750462c86cdbc92c9fa66e865e5a40d54e7d9a8bfd"}, - {file = "xonsh-0.14.1-py312-none-any.whl", hash = "sha256:285a9db37eb363bc76dc551b39be6ad2a19b3fca21240d71464100b8acb95516"}, - {file = "xonsh-0.14.1-py39-none-any.whl", hash = "sha256:d6e082b796b6415e86475371d4ae88611e64bbe88818ee6c6b4c42af22801887"}, - {file = "xonsh-0.14.1.tar.gz", hash = "sha256:81dbf5b5d4d23fe780c7ee5b4ded4f41239e8a8945b1742bf77ee030bdf9f9e5"}, -] - -[package.extras] -bestshell = ["prompt-toolkit (>=3.0.29)", "pygments (>=2.2)"] -dev = ["pre-commit", "re-ver", "tomli", "xonsh[doc,test]"] -doc = ["doctr", "furo", "livereload", "matplotlib", "myst-parser", "numpydoc", "psutil", "pyzmq", "runthis-sphinxext", "sphinx (>=3.1,<5)", "tornado", "xonsh[bestshell]"] -full = ["distro", "gnureadline", "setproctitle", "ujson", "xonsh[ptk,pygments]"] -linux = ["distro"] -mac = ["gnureadline"] -proctitle = ["setproctitle"] -ptk = ["prompt-toolkit (>=3.0.29)", "pyperclip"] -pygments = ["pygments (>=2.2)"] -test = ["coverage (>=5.3.1)", "prompt-toolkit (>=3.0.29)", "pygments (>=2.2)", "pyte (>=0.8.0)", "pytest (>=7)", "pytest-cov", "pytest-mock", "pytest-rerunfailures", "pytest-subprocess", "pytest-timeout", "restructuredtext-lint", "virtualenv (>=20.16.2)", "xonsh[bestshell]"] - [[package]] name = "zipp" version = "3.16.2" @@ -1584,4 +1260,4 @@ testing = ["big-O", "jaraco.functools", "jaraco.itertools", "more-itertools", "p [metadata] lock-version = "2.0" python-versions = "^3.10" -content-hash = "3af2ea8463f2fc48dc5051e8024d8df2b22dddc0e684c4d59c5318395132163d" +content-hash = "5b70e71ee96a7daceefc3b57db8b26b2699c2c3e95118e1210c5dc100bfb8d4e" diff --git a/pyproject.toml b/pyproject.toml index f5313f8c7..ee08613e6 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,8 +1,24 @@ +# piker: trading gear for hackers +# Copyright (C) 2018-present (in stewardship of pikers) +# Tyler Goodlet + +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Affero General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Affero General Public License for more details. + +# You should have received a copy of the GNU Affero General Public License +# along with this program. If not, see . [build-system] requires = ["poetry-core"] build-backend = "poetry.core.masonry.api" -# ------ - ------ +# ------ - ------ [tool.poetry] name = "piker" @@ -11,8 +27,30 @@ description = "trading gear for hackers" authors = ["Tyler Goodlet "] license = "AGPLv3" readme = "README.rst" -# ------ - ------ +# TODO: add meta-data from setup.py +# keywords=[ +# "async", +# "trading", +# "finance", +# "quant", +# "charting", +# ], +# classifiers=[ +# 'Development Status :: 3 - Alpha', +# 'License :: OSI Approved :: ', +# 'Operating System :: POSIX :: Linux', +# "Programming Language :: Python :: Implementation :: CPython", +# "Programming Language :: Python :: 3 :: Only", +# "Programming Language :: Python :: 3.10", +# "Programming Language :: Python :: 3.11", +# 'Intended Audience :: Financial and Insurance Industry', +# 'Intended Audience :: Science/Research', +# 'Intended Audience :: Developers', +# 'Intended Audience :: Education', +# ], + +# ------ - ------ [tool.poetry.dependencies] asks = "^3.0.0" @@ -46,22 +84,22 @@ git = 'https://github.com/pikers/asyncvnc.git' branch = 'main' [tool.poetry.dependencies.tomlkit] -# git = 'https://github.com/pikers/tomlkit.git', -# branch = 'piker_pin' -path = "../tomlkit/" +git = 'https://github.com/pikers/tomlkit.git' +branch = 'piker_pin' develop = true +# path = "../tomlkit/" [tool.poetry.dependencies.tractor] -# path = '../tractor/' -# branch = 'asyncio_debugger_support' git = 'https://github.com/goodboy/tractor.git' -branch = 'piker_pin' +branch = 'asyncio_debugger_support' +# branch = 'piker_pin' develop = true -# ------ - ------ +# path = '../tractor/' +# ------ - ------ [tool.poetry.group.uis] -optional=true +optional = true [tool.poetry.group.uis.dependencies] # https://python-poetry.org/docs/managing-dependencies/#dependency-groups # TODO: outstanding pkging issues on nixos @@ -70,9 +108,9 @@ fuzzywuzzy = {extras = ["speedup"], version = "^0.18.0"} qdarkstyle = ">=3.0.2" pyqt5 = "^5.15.9" pyqtgraph = { git = 'https://github.com/pikers/pyqtgraph.git' } -# pyqt6 = "^6.5.2" -# ------ - ------ +pyqt6 = "^6.5.2" +# ------ - ------ [tool.poetry.group.dev] optional = true @@ -90,8 +128,8 @@ elasticsearch = "^8.9.0" # - actor runtime control console like BEAM/OTP xonsh = "^0.14.0" # XXX: explicit env install for shell use w nix prompt-toolkit = "^3.0.39" -# ------ - ------ +# ------ - ------ # TODO: add an `--only daemon` group for running non-ui / pikerd # service tree in distributed mode B) @@ -103,4 +141,5 @@ prompt-toolkit = "^3.0.39" piker = 'piker.cli:cli' pikerd = 'piker.cli:pikerd' ledger = 'piker.accounting.cli:ledger' + # ------ - ------ diff --git a/requirements-test.txt b/requirements-test.txt deleted file mode 100644 index ad27fc5df..000000000 --- a/requirements-test.txt +++ /dev/null @@ -1,3 +0,0 @@ -pytest -docker -elasticsearch diff --git a/requirements.txt b/requirements.txt deleted file mode 100644 index 742c2efaa..000000000 --- a/requirements.txt +++ /dev/null @@ -1,20 +0,0 @@ -# we require a pinned dev branch to get some edge features that -# are often untested in tractor's CI and/or being tested by us -# first before committing as core features in tractor's base. --e git+https://github.com/goodboy/tractor.git@piker_pin#egg=tractor - -# `pyqtgraph` peeps keep breaking, fixing, improving so might as well -# pin this to a dev branch that we have more control over especially -# as more graphics stuff gets hashed out. --e git+https://github.com/pikers/pyqtgraph.git@master#egg=pyqtgraph - -# our async client for ``marketstore`` (the tsdb) --e git+https://github.com/pikers/anyio-marketstore.git@master#egg=anyio-marketstore - -# ``asyncvnc`` for sending interactions to ib-gw inside docker --e git+https://github.com/pikers/asyncvnc.git@main#egg=asyncvnc - - -# ``tomlkit`` for account files and configs; we've -# added some new features that need to get upstreamed: --e git+https://github.com/pikers/tomlkit.git@piker_pin#egg=tomlkit diff --git a/setup.py b/setup.py deleted file mode 100755 index 1bbef3541..000000000 --- a/setup.py +++ /dev/null @@ -1,121 +0,0 @@ -#!/usr/bin/env python - -# piker: trading gear for hackers -# Copyright (C) 2018-present Tyler Goodlet (in stewardship of piker0) - -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU Affero General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. - -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU Affero General Public License for more details. - -# You should have received a copy of the GNU Affero General Public License -# along with this program. If not, see . - -from setuptools import ( - setup, - find_packages, -) - -with open('README.rst', encoding='utf-8') as f: - readme = f.read() - - -setup( - name="piker", - version='0.1.0.alpha0.dev0', - description='trading gear for hackers.', - long_description=readme, - license='AGPLv3', - author='Tyler Goodlet', - maintainer='Tyler Goodlet', - url='https://github.com/pikers/piker', - platforms=['linux'], - packages=find_packages(), - entry_points={ - 'console_scripts': [ - 'piker = piker.cli:cli', - 'pikerd = piker.cli:pikerd', - 'ledger = piker.accounting.cli:ledger', - # 'store = piker.storage.cli:store', - ] - }, - install_requires=[ - # 'tomlkit', # fork & fix for now.. - 'tomli', # for pre-3.11 - 'tomli-w', # for fast ledger writing - 'colorlog', - 'attrs', - 'pygments', - 'colorama', # numba traceback coloring - 'msgspec', # performant IPC messaging and structs - 'protobuf', - 'typer', - 'rich', - - # async - 'trio', - 'trio-websocket', - 'trio-util', - 'async_generator', - - # from github currently (see requirements.txt) - # normally pinned to particular git hashes.. - # 'tractor', - # 'asyncvnc', - # 'anyio-marketstore', # mkts tsdb client - - # brokers - 'asks', # for non-ws rest apis - 'ib_insync', - - # numerics - 'pendulum', # easier datetimes - 'bidict', # 2 way map - 'cython', - 'numpy==1.24', - 'numba', - 'polars', # dataframes - - # UI - 'PyQt5', - # 'pyqtgraph', from our fork see reqs.txt - 'qdarkstyle >= 3.0.2', # themeing - 'fuzzywuzzy[speedup]', # fuzzy search - ], - extras_require={ - 'tsdb': [ - 'docker', - ], - 'es': [ - 'docker', - 'elasticsearch' - ] - }, - tests_require=['pytest'], - python_requires=">=3.10", - keywords=[ - "async", - "trading", - "finance", - "quant", - "charting", - ], - classifiers=[ - 'Development Status :: 3 - Alpha', - 'License :: OSI Approved :: ', - 'Operating System :: POSIX :: Linux', - "Programming Language :: Python :: Implementation :: CPython", - "Programming Language :: Python :: 3 :: Only", - "Programming Language :: Python :: 3.10", - "Programming Language :: Python :: 3.11", - 'Intended Audience :: Financial and Insurance Industry', - 'Intended Audience :: Science/Research', - 'Intended Audience :: Developers', - 'Intended Audience :: Education', - ], -) From 4a180019f04994021706feba4138ccba2d6f2e6d Mon Sep 17 00:00:00 2001 From: Tyler Goodlet Date: Wed, 13 Sep 2023 11:57:02 -0400 Subject: [PATCH 27/39] Swap out `fuzzywuzzy` for the newer `rapidfuzz` lib --- piker/brokers/binance/api.py | 2 +- piker/brokers/deribit/api.py | 2 +- piker/brokers/deribit/feed.py | 2 +- piker/brokers/ib/symbols.py | 2 +- piker/brokers/kraken/api.py | 2 +- piker/brokers/kraken/symbols.py | 2 +- piker/brokers/kucoin.py | 2 +- piker/data/_symcache.py | 2 +- piker/ui/_search.py | 4 ++-- pyproject.toml | 11 ++++------- 10 files changed, 14 insertions(+), 17 deletions(-) diff --git a/piker/brokers/binance/api.py b/piker/brokers/binance/api.py index 25cd31a83..9f5476a0a 100644 --- a/piker/brokers/binance/api.py +++ b/piker/brokers/binance/api.py @@ -42,7 +42,7 @@ now, ) import asks -from fuzzywuzzy import process as fuzzy +from rapidfuzz import process as fuzzy import numpy as np from piker import config diff --git a/piker/brokers/deribit/api.py b/piker/brokers/deribit/api.py index 93d4c498f..f66ed73b7 100644 --- a/piker/brokers/deribit/api.py +++ b/piker/brokers/deribit/api.py @@ -34,7 +34,7 @@ import pendulum import trio from trio_typing import TaskStatus -from fuzzywuzzy import process as fuzzy +from rapidfuzz import process as fuzzy import numpy as np from tractor.trionics import ( broadcast_receiver, diff --git a/piker/brokers/deribit/feed.py b/piker/brokers/deribit/feed.py index ca6a3f54d..821aab878 100644 --- a/piker/brokers/deribit/feed.py +++ b/piker/brokers/deribit/feed.py @@ -26,7 +26,7 @@ import trio from trio_typing import TaskStatus import pendulum -from fuzzywuzzy import process as fuzzy +from rapidfuzz import process as fuzzy import numpy as np import tractor diff --git a/piker/brokers/ib/symbols.py b/piker/brokers/ib/symbols.py index 31cf74a04..e792113e0 100644 --- a/piker/brokers/ib/symbols.py +++ b/piker/brokers/ib/symbols.py @@ -29,7 +29,7 @@ TYPE_CHECKING, ) -from fuzzywuzzy import process as fuzzy +from rapidfuzz import process as fuzzy import ib_insync as ibis import tractor import trio diff --git a/piker/brokers/kraken/api.py b/piker/brokers/kraken/api.py index a4dcdec97..8e4cce40c 100644 --- a/piker/brokers/kraken/api.py +++ b/piker/brokers/kraken/api.py @@ -29,7 +29,7 @@ import pendulum import asks -from fuzzywuzzy import process as fuzzy +from rapidfuzz import process as fuzzy import numpy as np import urllib.parse import hashlib diff --git a/piker/brokers/kraken/symbols.py b/piker/brokers/kraken/symbols.py index 168b05084..64e79f80f 100644 --- a/piker/brokers/kraken/symbols.py +++ b/piker/brokers/kraken/symbols.py @@ -21,7 +21,7 @@ from decimal import Decimal import tractor -from fuzzywuzzy import process as fuzzy +from rapidfuzz import process as fuzzy from piker._cacheables import ( async_lifo_cache, diff --git a/piker/brokers/kucoin.py b/piker/brokers/kucoin.py index 26aab4df6..cf9bba62e 100755 --- a/piker/brokers/kucoin.py +++ b/piker/brokers/kucoin.py @@ -41,7 +41,7 @@ import wsproto from uuid import uuid4 -from fuzzywuzzy import process as fuzzy +from rapidfuzz import process as fuzzy from trio_typing import TaskStatus import asks from bidict import bidict diff --git a/piker/data/_symcache.py b/piker/data/_symcache.py index abb0145db..1ba724a2f 100644 --- a/piker/data/_symcache.py +++ b/piker/data/_symcache.py @@ -35,7 +35,7 @@ ) from types import ModuleType -from fuzzywuzzy import process as fuzzy +from rapidfuzz import process as fuzzy import tomli_w # for fast symbol cache writing import tractor import trio diff --git a/piker/ui/_search.py b/piker/ui/_search.py index 216a94b67..ba81eb1ad 100644 --- a/piker/ui/_search.py +++ b/piker/ui/_search.py @@ -15,7 +15,7 @@ # along with this program. If not, see . """ -qompleterz: embeddable search and complete using trio, Qt and fuzzywuzzy. +qompleterz: embeddable search and complete using trio, Qt and rapidfuzz. """ @@ -45,7 +45,7 @@ import time # from pprint import pformat -from fuzzywuzzy import process as fuzzy +from rapidfuzz import process as fuzzy import trio from trio_typing import TaskStatus from PyQt5 import QtCore diff --git a/pyproject.toml b/pyproject.toml index ee08613e6..efaf8336a 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ # piker: trading gear for hackers # Copyright (C) 2018-present (in stewardship of pikers) -# Tyler Goodlet +# Tyler Goodlet and the pike pikes # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU Affero General Public License as published by @@ -102,9 +102,9 @@ develop = true optional = true [tool.poetry.group.uis.dependencies] # https://python-poetry.org/docs/managing-dependencies/#dependency-groups -# TODO: outstanding pkging issues on nixos -fuzzywuzzy = {extras = ["speedup"], version = "^0.18.0"} -# fuzzywuzzy = "^0.18.0" +# TODO: make sure the levenshtein shit compiles on nix.. +# rapidfuzz = {extras = ["speedup"], version = "^0.18.0"} +rapidfuzz = "^3.2.0" qdarkstyle = ">=3.0.2" pyqt5 = "^5.15.9" pyqtgraph = { git = 'https://github.com/pikers/pyqtgraph.git' } @@ -137,9 +137,6 @@ prompt-toolkit = "^3.0.39" # [tool.poetry.group.daemon.dependencies] [tool.poetry.scripts] -# poetry = "poetry.console.application:main" piker = 'piker.cli:cli' pikerd = 'piker.cli:pikerd' ledger = 'piker.accounting.cli:ledger' - -# ------ - ------ From 2c88ebe6972a6f2eeb84463363bf0442d45e533f Mon Sep 17 00:00:00 2001 From: Tyler Goodlet Date: Wed, 13 Sep 2023 11:59:51 -0400 Subject: [PATCH 28/39] binance: implement `Client.search_symbols()` using `rapidfuzz` Change the deats inside the method and have the `brokerd` search task just call it as needed since we already do internal mem caching on the lookup table. APIs changed so we need to make some tweaks as per: - https://github.com/maxbachmann/RapidFuzz/blob/main/api_differences.md - https://github.com/maxbachmann/RapidFuzz/blob/main/api_differences.md#differences-in-processor-functions The main motivation is to get better wheel pkging support (for nixos), better impl in C++, and a more simply licensed dep. --- piker/brokers/binance/api.py | 26 ++++++++++++++++++++------ piker/brokers/binance/feed.py | 19 ++++++++++--------- 2 files changed, 30 insertions(+), 15 deletions(-) diff --git a/piker/brokers/binance/api.py b/piker/brokers/binance/api.py index 9f5476a0a..f9ecc8fd9 100644 --- a/piker/brokers/binance/api.py +++ b/piker/brokers/binance/api.py @@ -31,6 +31,8 @@ from typing import ( Any, Callable, + Hashable, + Sequence, Type, ) import hmac @@ -549,7 +551,7 @@ async def exch_info( if sym: return pair_table[sym] else: - self._pairs + return self._pairs async def get_assets( self, @@ -596,14 +598,26 @@ async def search_symbols( fq_pairs: dict = await self.exch_info() - matches = fuzzy.extractBests( - pattern, - fq_pairs, + # TODO: cache this list like we were in + # `open_symbol_search()`? + keys: list[str] = list(fq_pairs) + + matches: list[tuple[ + Sequence[Hashable], # matching input key + Any, # scores + Any, + ]] = fuzzy.extract( + query=pattern.upper(), # since all keys are uppercase + choices=keys, score_cutoff=50, ) # repack in dict form - return {item[0]['symbol']: item[0] - for item in matches} + matched_pairs: dict[str, Pair] = {} + for item in matches: + pair_key: str = item[0] + matched_pairs[pair_key] = self._pairs[pair_key] + + return matched_pairs async def bars( self, diff --git a/piker/brokers/binance/feed.py b/piker/brokers/binance/feed.py index 713f76c66..1416d6a77 100644 --- a/piker/brokers/binance/feed.py +++ b/piker/brokers/binance/feed.py @@ -42,7 +42,7 @@ from pendulum import ( from_timestamp, ) -from fuzzywuzzy import process as fuzzy +from rapidfuzz import process as fuzzy import numpy as np import tractor @@ -533,14 +533,15 @@ async def open_symbol_search( pattern: str async for pattern in stream: - matches = fuzzy.extractBests( + # NOTE: pattern fuzzy-matching is done within + # the methd impl. + pairs: dict[str, Pair] = await client.search_symbols( pattern, - client._pairs, - score_cutoff=50, ) - # repack in dict form - await stream.send({ - item[0].bs_fqme: item[0] - for item in matches - }) + # repack in fqme-keyed table + byfqme: dict[start, Pair] = {} + for pair in pairs.values(): + byfqme[pair.bs_fqme] = pair + + await stream.send(byfqme) From 30d55fdb275373516dd2133ae6f850a6acd6d7a3 Mon Sep 17 00:00:00 2001 From: Tyler Goodlet Date: Wed, 13 Sep 2023 12:13:56 -0400 Subject: [PATCH 29/39] Add `--pdb` support to `piker search` --- piker/brokers/cli.py | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/piker/brokers/cli.py b/piker/brokers/cli.py index 937e936e1..814950c7d 100644 --- a/piker/brokers/cli.py +++ b/piker/brokers/cli.py @@ -454,8 +454,18 @@ async def main(): @cli.command() @click.argument('pattern', required=True) +# TODO: move this to top level click/typer context for all subs +@click.option( + '--pdb', + is_flag=True, + help='Enable tractor debug mode', +) @click.pass_obj -def search(config, pattern): +def search( + config: dict, + pattern: str, + pdb: bool, +): ''' Search for symbols from broker backend(s). @@ -468,6 +478,7 @@ async def main(func): async with maybe_open_pikerd( loglevel=config['loglevel'], + debug_mode=pdb, ): return await func() From 05959eaf700c3a505807e62db6ad13b2655cc65e Mon Sep 17 00:00:00 2001 From: Tyler Goodlet Date: Tue, 19 Sep 2023 15:56:47 -0400 Subject: [PATCH 30/39] Always ensure symcache mkt pair entry is valid type --- piker/accounting/_pos.py | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/piker/accounting/_pos.py b/piker/accounting/_pos.py index 1a2378da4..1b3050097 100644 --- a/piker/accounting/_pos.py +++ b/piker/accounting/_pos.py @@ -543,6 +543,11 @@ def update_from_ledger( if not (pos := pps.get(bs_mktid)): + assert isinstance( + mkt, + MktPair, + ) + # if no existing pos, allocate fresh one. pos = pps[bs_mktid] = Position( mkt=mkt, From 14f124164a715179e6aea8c0bb8cfd7fc2db77e4 Mon Sep 17 00:00:00 2001 From: Tyler Goodlet Date: Thu, 21 Sep 2023 19:14:44 -0400 Subject: [PATCH 31/39] ib: fix mktpair fallback table: use `Client._con2mkts` to translate.. Previously we were assuming that the `Client._contracts: dict[str, Contract]` would suffice this directly, which obviously isn't true XD Also, - add the `NSE` venue to skip list. - use new `rapidfuzz.process.extract()` lib API. - only get con deats for non null exchange names.. --- piker/brokers/ib/api.py | 13 +++++++++---- piker/brokers/ib/broker.py | 14 +++++++++++++- piker/brokers/ib/symbols.py | 13 +++++++------ 3 files changed, 29 insertions(+), 11 deletions(-) diff --git a/piker/brokers/ib/api.py b/piker/brokers/ib/api.py index 63c38bc80..cc0ad0517 100644 --- a/piker/brokers/ib/api.py +++ b/piker/brokers/ib/api.py @@ -416,20 +416,26 @@ async def con_deats( futs: list[asyncio.Future] = [] for con in contracts: - if con.primaryExchange not in _exch_skip_list: + exch: str = con.primaryExchange or con.exchange + if ( + exch + and exch not in _exch_skip_list + ): futs.append(self.ib.reqContractDetailsAsync(con)) # batch request all details try: results: list[ContractDetails] = await asyncio.gather(*futs) except RequestError as err: - msg = err.message + msg: str = err.message if ( 'No security definition' in msg ): log.warning(f'{msg}: {contracts}') return {} + raise + # one set per future result details: dict[str, ContractDetails] = {} for details_set in results: @@ -1356,8 +1362,7 @@ async def open_aio_client_method_relay( # relay all method requests to ``asyncio``-side client and deliver # back results while not to_trio._closed: - msg = await from_trio.get() - + msg: tuple[str, dict] | dict | None = await from_trio.get() match msg: case None: # termination sentinel print('asyncio PROXY-RELAY SHUTDOWN') diff --git a/piker/brokers/ib/broker.py b/piker/brokers/ib/broker.py index 9b256f244..1b144e3c1 100644 --- a/piker/brokers/ib/broker.py +++ b/piker/brokers/ib/broker.py @@ -846,6 +846,18 @@ async def emit_pp_update( # con: Contract = fill.contract + # provide a backup fqme -> MktPair table in case the + # symcache does not (yet) have an entry for the current mkt + # txn. + backup_table: dict[str, MktPair] = {} + for tid, txn in trans.items(): + fqme: str = txn.fqme + if fqme not in ledger.symcache.mktmaps: + # bs_mktid: str = txn.bs_mktid + backup_table[fqme] = client._cons2mkts[ + client._contracts[fqme] + ] + acnt.update_from_ledger( trans, @@ -855,7 +867,7 @@ async def emit_pp_update( # TODO: remove this hack by attempting to symcache an # incrementally updated table? - _mktmap_table=client._contracts + _mktmap_table=backup_table, ) # re-compute all positions that have changed state. diff --git a/piker/brokers/ib/symbols.py b/piker/brokers/ib/symbols.py index e792113e0..99b3a8019 100644 --- a/piker/brokers/ib/symbols.py +++ b/piker/brokers/ib/symbols.py @@ -165,6 +165,7 @@ 'MEXI', # mexican stocks # no idea + 'NSE', 'VALUE', 'FUNDSERV', 'SWB2', @@ -269,7 +270,7 @@ async def stash_results(target: Awaitable[list]): stock_results.extend(results) - for i in range(10): + for _ in range(10): with trio.move_on_after(3) as cs: async with trio.open_nursery() as sn: sn.start_soon( @@ -292,7 +293,7 @@ async def stash_results(target: Awaitable[list]): break # # match against our ad-hoc set immediately - # adhoc_matches = fuzzy.extractBests( + # adhoc_matches = fuzzy.extract( # pattern, # list(_adhoc_futes_set), # score_cutoff=90, @@ -305,7 +306,7 @@ async def stash_results(target: Awaitable[list]): # adhoc_matches} log.debug(f'fuzzy matching stocks {stock_results}') - stock_matches = fuzzy.extractBests( + stock_matches = fuzzy.extract( pattern, stock_results, score_cutoff=50, @@ -423,9 +424,9 @@ def con2fqme( except KeyError: pass - suffix = con.primaryExchange or con.exchange - symbol = con.symbol - expiry = con.lastTradeDateOrContractMonth or '' + suffix: str = con.primaryExchange or con.exchange + symbol: str = con.symbol + expiry: str = con.lastTradeDateOrContractMonth or '' match con: case ibis.Option(): From d4833eba21ad4184142ff3cdb2955fad6f1e0156 Mon Sep 17 00:00:00 2001 From: Tyler Goodlet Date: Thu, 21 Sep 2023 19:44:06 -0400 Subject: [PATCH 32/39] binance: switch to `rapidfuzz` API --- piker/brokers/binance/api.py | 22 +++++++--------------- 1 file changed, 7 insertions(+), 15 deletions(-) diff --git a/piker/brokers/binance/api.py b/piker/brokers/binance/api.py index f9ecc8fd9..292199d04 100644 --- a/piker/brokers/binance/api.py +++ b/piker/brokers/binance/api.py @@ -56,7 +56,10 @@ digits_to_dec, ) from piker.types import Struct -from piker.data import def_iohlcv_fields +from piker.data import ( + def_iohlcv_fields, + match_from_pairs, +) from piker.brokers import ( resproc, SymbolNotFound, @@ -602,22 +605,11 @@ async def search_symbols( # `open_symbol_search()`? keys: list[str] = list(fq_pairs) - matches: list[tuple[ - Sequence[Hashable], # matching input key - Any, # scores - Any, - ]] = fuzzy.extract( - query=pattern.upper(), # since all keys are uppercase - choices=keys, + return match_from_pairs( + pairs=fq_pairs, + query=pattern.upper(), score_cutoff=50, ) - # repack in dict form - matched_pairs: dict[str, Pair] = {} - for item in matches: - pair_key: str = item[0] - matched_pairs[pair_key] = self._pairs[pair_key] - - return matched_pairs async def bars( self, From 46d83e9ca994fc6daa06715954e45e506c629086 Mon Sep 17 00:00:00 2001 From: Tyler Goodlet Date: Thu, 21 Sep 2023 19:44:27 -0400 Subject: [PATCH 33/39] deribit: switch to `rapidfuzz` API --- piker/brokers/deribit/api.py | 53 +++++++++++++++++++++++------------- 1 file changed, 34 insertions(+), 19 deletions(-) diff --git a/piker/brokers/deribit/api.py b/piker/brokers/deribit/api.py index f66ed73b7..03cc301e5 100644 --- a/piker/brokers/deribit/api.py +++ b/piker/brokers/deribit/api.py @@ -52,8 +52,11 @@ ) from cryptofeed.symbols import Symbol -from piker.data.types import Struct -from piker.data import def_iohlcv_fields +from piker.data import ( + def_iohlcv_fields, + match_from_pairs, + Struct, +) from piker.data._web_bs import ( open_jsonrpc_session ) @@ -79,7 +82,7 @@ class JSONRPCResult(Struct): jsonrpc: str = '2.0' id: int - result: Optional[dict] = None + result: Optional[list[dict]] = None error: Optional[dict] = None usIn: int usOut: int @@ -289,24 +292,29 @@ async def symbol_info( currency: str = 'btc', # BTC, ETH, SOL, USDC kind: str = 'option', expired: bool = False - ) -> dict[str, Any]: - """Get symbol info for the exchange. - """ + ) -> dict[str, dict]: + ''' + Get symbol infos. + + ''' if self._pairs: return self._pairs # will retrieve all symbols by default - params = { + params: dict[str, str] = { 'currency': currency.upper(), 'kind': kind, 'expired': str(expired).lower() } - resp = await self.json_rpc('public/get_instruments', params) - results = resp.result - - instruments = { + resp: JSONRPCResult = await self.json_rpc( + 'public/get_instruments', + params, + ) + # convert to symbol-keyed table + results: list[dict] | None = resp.result + instruments: dict[str, dict] = { item['instrument_name'].lower(): item for item in results } @@ -319,6 +327,7 @@ async def symbol_info( async def cache_symbols( self, ) -> dict: + if not self._pairs: self._pairs = await self.symbol_info() @@ -329,17 +338,23 @@ async def search_symbols( pattern: str, limit: int = 30, ) -> dict[str, Any]: - data = await self.symbol_info() - - matches = fuzzy.extractBests( - pattern, - data, + ''' + Fuzzy search symbology set for pairs matching `pattern`. + + ''' + pairs: dict[str, Any] = await self.symbol_info() + matches: dict[str, Pair] = match_from_pairs( + pairs=pairs, + query=pattern.upper(), score_cutoff=35, limit=limit ) - # repack in dict form - return {item[0]['instrument_name'].lower(): item[0] - for item in matches} + + # repack in name-keyed table + return { + pair['instrument_name'].lower(): pair + for pair in matches.values() + } async def bars( self, From a97a0ced8cbfd8302e757aefb3d037c48059e346 Mon Sep 17 00:00:00 2001 From: Tyler Goodlet Date: Thu, 21 Sep 2023 19:49:10 -0400 Subject: [PATCH 34/39] kraken: switch to `rapidfuzz` API --- piker/brokers/kraken/api.py | 19 +++++++++++++------ piker/brokers/kraken/symbols.py | 13 ++----------- 2 files changed, 15 insertions(+), 17 deletions(-) diff --git a/piker/brokers/kraken/api.py b/piker/brokers/kraken/api.py index 8e4cce40c..c596e0732 100644 --- a/piker/brokers/kraken/api.py +++ b/piker/brokers/kraken/api.py @@ -38,7 +38,10 @@ import trio from piker import config -from piker.data import def_iohlcv_fields +from piker.data import ( + def_iohlcv_fields, + match_from_pairs, +) from piker.accounting._mktinfo import ( Asset, digits_to_dec, @@ -548,13 +551,17 @@ async def search_symbols( await self.get_mkt_pairs() assert self._pairs, '`Client.get_mkt_pairs()` was never called!?' - matches = fuzzy.extractBests( - pattern, - self._pairs, + matches: dict[str, Pair] = match_from_pairs( + pairs=self._pairs, + query=pattern.upper(), score_cutoff=50, ) - # repack in dict form - return {item[0].altname: item[0] for item in matches} + + # repack in .altname-keyed output table + return { + pair.altname: pair + for pair in matches.values() + } async def bars( self, diff --git a/piker/brokers/kraken/symbols.py b/piker/brokers/kraken/symbols.py index 64e79f80f..80176b4db 100644 --- a/piker/brokers/kraken/symbols.py +++ b/piker/brokers/kraken/symbols.py @@ -136,19 +136,10 @@ async def open_symbol_search(ctx: tractor.Context) -> None: await ctx.started(cache) async with ctx.open_stream() as stream: - async for pattern in stream: - - matches = fuzzy.extractBests( - pattern, - client._pairs, - score_cutoff=50, + await stream.send( + await client.search_symbols(pattern) ) - # repack in dict form - await stream.send({ - pair[0].altname: pair[0] - for pair in matches - }) @async_lifo_cache() From 0ba75df877e189dfcde4f33e14960f77ca075e52 Mon Sep 17 00:00:00 2001 From: Tyler Goodlet Date: Fri, 22 Sep 2023 13:53:18 -0400 Subject: [PATCH 35/39] Add `data.match_from_pairs` fuzzy symbology scanner A helper for scanning a "pairs table" that most backends should expose as part of their (internal) symbology set using `rapidfuzz` over a `dict[str, Struct]` input table. Also expose the `data.types.Struct` at the subpkg top level. --- piker/data/__init__.py | 3 +++ piker/data/_symcache.py | 40 +++++++++++++++++++++++++++++++++++++++- 2 files changed, 42 insertions(+), 1 deletion(-) diff --git a/piker/data/__init__.py b/piker/data/__init__.py index 9b12697e9..25c2912a5 100644 --- a/piker/data/__init__.py +++ b/piker/data/__init__.py @@ -43,8 +43,10 @@ SymbologyCache, open_symcache, get_symcache, + match_from_pairs, ) from ._sampling import open_sample_stream +from ..types import Struct __all__: list[str] = [ @@ -62,6 +64,7 @@ 'open_symcache', 'open_sample_stream', 'get_symcache', + 'Struct', 'SymbologyCache', 'types', ] diff --git a/piker/data/_symcache.py b/piker/data/_symcache.py index 1ba724a2f..44057e89d 100644 --- a/piker/data/_symcache.py +++ b/piker/data/_symcache.py @@ -308,7 +308,7 @@ def search( matches in a `dict` including the `MktPair` values. ''' - matches = fuzzy.extractBests( + matches = fuzzy.extract( pattern, getattr(self, table), score_cutoff=50, @@ -466,3 +466,41 @@ async def sched_gen_symcache(): pdbp.xpm() return symcache + + +def match_from_pairs( + pairs: dict[str, Struct], + query: str, + score_cutoff: int = 50, + +) -> dict[str, Struct]: + ''' + Fuzzy search over a "pairs table" maintained by most backends + as part of their symbology-info caching internals. + + Scan the native symbol key set and return best ranked + matches back in a new `dict`. + + ''' + + # TODO: somehow cache this list (per call) like we were in + # `open_symbol_search()`? + keys: list[str] = list(pairs) + matches: list[tuple[ + Sequence[Hashable], # matching input key + Any, # scores + Any, + ]] = fuzzy.extract( + # NOTE: most backends provide keys uppercased + query=query, + choices=keys, + score_cutoff=score_cutoff, + ) + + # pop and repack pairs in output dict + matched_pairs: dict[str, Pair] = {} + for item in matches: + pair_key: str = item[0] + matched_pairs[pair_key] = pairs[pair_key] + + return matched_pairs From e9887cb6110cd59aed6964c38244be3c50a6a033 Mon Sep 17 00:00:00 2001 From: Tyler Goodlet Date: Fri, 22 Sep 2023 14:48:50 -0400 Subject: [PATCH 36/39] binance: parse .expiry separate from .venue Apparently they're being massive cucks and changing their futes pair schema again now adding a `NEXT_QUARTER` contract type which we weren't handling at all. The good news is falling back to an old symcache file would have prevented this from crashing. Add a new `FutesPair.expiry: str` field so that `.bs_fqme` can simply call it during the summary FQME-ification output rendering.. --- piker/brokers/binance/venues.py | 61 +++++++++++++++++++++++++++------ 1 file changed, 51 insertions(+), 10 deletions(-) diff --git a/piker/brokers/binance/venues.py b/piker/brokers/binance/venues.py index dc3312be1..a82c33246 100644 --- a/piker/brokers/binance/venues.py +++ b/piker/brokers/binance/venues.py @@ -194,6 +194,37 @@ class FutesPair(Pair): def quoteAssetPrecision(self) -> int: return self.quotePrecision + @property + def expiry(self) -> str: + symbol: str = self.symbol + contype: str = self.contractType + match contype: + case ( + 'CURRENT_QUARTER' + | 'NEXT_QUARTER' # su madre binance.. + ): + pair, _, expiry = symbol.partition('_') + assert pair == self.pair # sanity + return f'{expiry}' + + case 'PERPETUAL': + return 'PERP' + + case '': + subtype: list[str] = self.underlyingSubType + if not subtype: + if self.status == 'PENDING_TRADING': + return 'PENDING' + + match subtype: + case ['DEFI']: + return 'PERP' + + # XXX: yeah no clue then.. + raise ValueError( + f'Bad .expiry token match: {contype} for {symbol}' + ) + @property def venue(self) -> str: symbol: str = self.symbol @@ -202,36 +233,46 @@ def venue(self) -> str: match ctype: case 'PERPETUAL': - return f'{margin}M.PERP' + return f'{margin}M' - case 'CURRENT_QUARTER': + case ( + 'CURRENT_QUARTER' + | 'NEXT_QUARTER' # su madre binance.. + ): _, _, expiry = symbol.partition('_') - return f'{margin}M.{expiry}' + return f'{margin}M' case '': subtype: list[str] = self.underlyingSubType if not subtype: if self.status == 'PENDING_TRADING': - return f'{margin}M.PENDING' + return f'{margin}M' match subtype: case ['DEFI']: - return f'{subtype[0]}.PERP' + return f'{subtype[0]}' # XXX: yeah no clue then.. - return 'WTF.PWNED.BBQ' + raise ValueError( + f'Bad .venue token match: {ctype}' + ) @property def bs_fqme(self) -> str: symbol: str = self.symbol ctype: str = self.contractType venue: str = self.venue + pair: str = self.pair match ctype: - case 'CURRENT_QUARTER': - symbol, _, expiry = symbol.partition('_') - - return f'{symbol}.{venue}' + case ( + 'CURRENT_QUARTER' + | 'NEXT_QUARTER' # su madre binance.. + ): + pair, _, expiry = symbol.partition('_') + assert pair == self.pair + + return f'{pair}.{venue}.{self.expiry}' @property def bs_src_asset(self) -> str: From 1a859bc1a2251b61ca3eedaecf530bd7f2b372ab Mon Sep 17 00:00:00 2001 From: Tyler Goodlet Date: Fri, 22 Sep 2023 15:53:03 -0400 Subject: [PATCH 37/39] kraken: drop now unused `rapidfuzz` import --- piker/brokers/kraken/api.py | 1 - 1 file changed, 1 deletion(-) diff --git a/piker/brokers/kraken/api.py b/piker/brokers/kraken/api.py index c596e0732..45de4c8c7 100644 --- a/piker/brokers/kraken/api.py +++ b/piker/brokers/kraken/api.py @@ -29,7 +29,6 @@ import pendulum import asks -from rapidfuzz import process as fuzzy import numpy as np import urllib.parse import hashlib From c312f90c0c5a6ac394f6dcda5ae5794cb255ce4a Mon Sep 17 00:00:00 2001 From: Tyler Goodlet Date: Fri, 22 Sep 2023 15:55:19 -0400 Subject: [PATCH 38/39] kucoin: port to using `rapidfuzz` Just like the others but also flip to using a `Client.get_mkt_pairs()` meth name for consistency across clients. --- piker/brokers/kucoin.py | 35 +++++++++++++++++++++++++---------- 1 file changed, 25 insertions(+), 10 deletions(-) diff --git a/piker/brokers/kucoin.py b/piker/brokers/kucoin.py index cf9bba62e..dc6daa085 100755 --- a/piker/brokers/kucoin.py +++ b/piker/brokers/kucoin.py @@ -65,7 +65,10 @@ from piker.log import get_logger from piker.data.validate import FeedInit from piker.types import Struct -from piker.data import def_iohlcv_fields +from piker.data import ( + def_iohlcv_fields, + match_from_pairs, +) from piker.data._web_bs import ( open_autorecon_ws, NoBsWs, @@ -377,7 +380,7 @@ async def _get_pairs( return pairs, fqmes2mktids - async def cache_pairs( + async def get_mkt_pairs( self, update: bool = False, @@ -405,16 +408,28 @@ async def search_symbols( ) -> dict[str, KucoinMktPair]: ''' - Use fuzzy search to match against all market names. + Use fuzzy search engine to match against pairs, deliver + matching ones. ''' - data = await self.cache_pairs() + if not len(self._pairs): + await self.get_mkt_pairs() + assert self._pairs, '`Client.get_mkt_pairs()` was never called!?' + - matches = fuzzy.extractBests( - pattern, data, score_cutoff=35, limit=limit + matches: dict[str, Pair] = match_from_pairs( + pairs=self._pairs, + # query=pattern.upper(), + query=pattern.upper(), + score_cutoff=35, + limit=limit, ) + # repack in dict form - return {item[0].name: item[0] for item in matches} + return { + pair.name: pair + for pair in matches.values() + } async def last_trades(self, sym: str) -> list[AccountTrade]: trades = await self._request( @@ -557,7 +572,7 @@ async def get_client() -> AsyncGenerator[Client, None]: client = Client() async with trio.open_nursery() as n: - n.start_soon(client.cache_pairs) + n.start_soon(client.get_mkt_pairs) await client.get_currencies() yield client @@ -569,7 +584,7 @@ async def open_symbol_search( ) -> None: async with open_cached_client('kucoin') as client: # load all symbols locally for fast search - await client.cache_pairs() + await client.get_mkt_pairs() await ctx.started() async with ctx.open_stream() as stream: @@ -617,7 +632,7 @@ async def get_mkt_info( # split off any fqme broker part bs_fqme, _, broker = fqme.partition('.') - pairs: dict[str, KucoinMktPair] = await client.cache_pairs() + pairs: dict[str, KucoinMktPair] = await client.get_mkt_pairs() try: # likely search result key which is already in native mkt symbol form From ad59a581c7f34c19b43b83737cbb3b09f1a3260c Mon Sep 17 00:00:00 2001 From: Tyler Goodlet Date: Fri, 22 Sep 2023 15:56:49 -0400 Subject: [PATCH 39/39] symcache: passthrough `rapidfuzz.process.extract` kwargs --- piker/data/_symcache.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/piker/data/_symcache.py b/piker/data/_symcache.py index 44057e89d..d06420ff3 100644 --- a/piker/data/_symcache.py +++ b/piker/data/_symcache.py @@ -472,6 +472,7 @@ def match_from_pairs( pairs: dict[str, Struct], query: str, score_cutoff: int = 50, + **extract_kwargs, ) -> dict[str, Struct]: ''' @@ -495,6 +496,7 @@ def match_from_pairs( query=query, choices=keys, score_cutoff=score_cutoff, + **extract_kwargs, ) # pop and repack pairs in output dict