diff --git a/piker/data/_formatters.py b/piker/data/_formatters.py index 4fbe3151..29d2ac9c 100644 --- a/piker/data/_formatters.py +++ b/piker/data/_formatters.py @@ -1,5 +1,5 @@ # piker: trading gear for hackers -# Copyright (C) 2018-present Tyler Goodlet (in stewardship of piker0) +# Copyright (C) Tyler Goodlet (in stewardship for pikers) # 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 @@ -13,10 +13,10 @@ # You should have received a copy of the GNU Affero General Public License # along with this program. If not, see . -""" +''' Pre-(path)-graphics formatted x/y nd/1d rendering subsystem. -""" +''' from __future__ import annotations from typing import ( Optional, @@ -39,7 +39,7 @@ if TYPE_CHECKING: from ._dataviz import ( Viz, ) - from .._profile import Profiler + from piker.toolz import Profiler class IncrementalFormatter(msgspec.Struct): diff --git a/piker/data/_timeseries.py b/piker/data/_timeseries.py index c812e08a..2d73c263 100644 --- a/piker/data/_timeseries.py +++ b/piker/data/_timeseries.py @@ -32,7 +32,7 @@ import numpy as np import polars as pl from ._sharedmem import ShmArray -from .._profile import ( +from ..toolz.profile import ( Profiler, pg_profile_enabled, ms_slower_then, diff --git a/piker/data/flows.py b/piker/data/flows.py index 652e1e71..86e5370f 100644 --- a/piker/data/flows.py +++ b/piker/data/flows.py @@ -37,10 +37,6 @@ from ._sharedmem import ( ShmArray, _Token, ) -# from .._profile import ( -# Profiler, -# pg_profile_enabled, -# ) if TYPE_CHECKING: # from pyqtgraph import PlotItem diff --git a/piker/fsp/_engine.py b/piker/fsp/_engine.py index 9a6ebddb..b4cccdae 100644 --- a/piker/fsp/_engine.py +++ b/piker/fsp/_engine.py @@ -51,7 +51,7 @@ from ._api import ( _load_builtins, _Token, ) -from .._profile import Profiler +from ..toolz import Profiler log = get_logger(__name__) diff --git a/piker/storage/__init__.py b/piker/storage/__init__.py index 465d3e28..c813c48a 100644 --- a/piker/storage/__init__.py +++ b/piker/storage/__init__.py @@ -246,7 +246,7 @@ async def open_tsdb_client( # * the original data feed arch blurb: # - https://github.com/pikers/piker/issues/98 # - from .._profile import Profiler + from ..toolz import Profiler profiler = Profiler( disabled=True, # not pg_profile_enabled(), delayed=False, diff --git a/piker/storage/marketstore/__init__.py b/piker/storage/marketstore/__init__.py index 2f0a7970..7466c06a 100644 --- a/piker/storage/marketstore/__init__.py +++ b/piker/storage/marketstore/__init__.py @@ -59,7 +59,6 @@ from anyio_marketstore import ( # noqa Params, ) from piker.log import get_logger -# from .._profile import Profiler log = get_logger(__name__) diff --git a/piker/storage/nativedb.py b/piker/storage/nativedb.py index 274bf039..1f7da9f7 100644 --- a/piker/storage/nativedb.py +++ b/piker/storage/nativedb.py @@ -67,7 +67,6 @@ from piker import config from piker.data import def_iohlcv_fields from piker.data import ShmArray from piker.log import get_logger -# from .._profile import Profiler log = get_logger('storage.nativedb') diff --git a/piker/toolz/__init__.py b/piker/toolz/__init__.py new file mode 100644 index 00000000..4b8a9338 --- /dev/null +++ b/piker/toolz/__init__.py @@ -0,0 +1,38 @@ +# piker: trading gear for hackers +# Copyright (C) Tyler Goodlet (in stewardship for pikers) + +# 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 . + +''' +Toolz for debug, profile and trace of the distributed runtime :surfer: + +''' +from .debug import ( + open_crash_handler, +) +from .profile import ( + Profiler, + pg_profile_enabled, + ms_slower_then, + timeit, +) + + +__all__: list[str] = [ + 'open_crash_handler', + 'pg_profile_enabled', + 'ms_slower_then', + 'Profiler', + 'timeit', +] diff --git a/piker/toolz/debug.py b/piker/toolz/debug.py new file mode 100644 index 00000000..3b8a3e3e --- /dev/null +++ b/piker/toolz/debug.py @@ -0,0 +1,40 @@ +# piker: trading gear for hackers +# Copyright (C) Tyler Goodlet (in stewardship for pikers) + +# 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 . + +''' +Debugger wrappers for `pdbp` as used by `tractor`. + +''' +from contextlib import contextmanager as cm + +import pdbp + + +# TODO: better naming and what additionals? +# - optional runtime plugging? +# - detection for sync vs. async code? +# - specialized REPL entry when in distributed mode? +@cm +def open_crash_handler(): + ''' + Super basic crash handler using `pdbp` debugger. + + ''' + try: + yield + except BaseException: + pdbp.xpm() + raise diff --git a/piker/_profile.py b/piker/toolz/profile.py similarity index 100% rename from piker/_profile.py rename to piker/toolz/profile.py diff --git a/piker/ui/_curve.py b/piker/ui/_curve.py index 5442d347..c8e4c373 100644 --- a/piker/ui/_curve.py +++ b/piker/ui/_curve.py @@ -34,10 +34,13 @@ from PyQt5.QtGui import ( QPainter, QPainterPath, ) -from .._profile import pg_profile_enabled, ms_slower_then from ._style import hcolor from ..log import get_logger -from .._profile import Profiler +from ..toolz.profile import ( + Profiler, + pg_profile_enabled, + ms_slower_then, +) log = get_logger(__name__) diff --git a/piker/ui/_dataviz.py b/piker/ui/_dataviz.py index 9da45f44..c011bff0 100644 --- a/piker/ui/_dataviz.py +++ b/piker/ui/_dataviz.py @@ -62,7 +62,7 @@ from ._curve import ( ) from ._render import Renderer from ..log import get_logger -from .._profile import ( +from ..toolz.profile import ( Profiler, pg_profile_enabled, ms_slower_then, diff --git a/piker/ui/_display.py b/piker/ui/_display.py index 610b38f3..27e70145 100644 --- a/piker/ui/_display.py +++ b/piker/ui/_display.py @@ -79,12 +79,12 @@ from .order_mode import ( open_order_mode, OrderMode, ) -from .._profile import ( +from ..toolz import ( pg_profile_enabled, ms_slower_then, + Profiler, ) from ..log import get_logger -from .._profile import Profiler if TYPE_CHECKING: from ._interaction import ChartView diff --git a/piker/ui/_fsp.py b/piker/ui/_fsp.py index 5202ea97..a4deb034 100644 --- a/piker/ui/_fsp.py +++ b/piker/ui/_fsp.py @@ -66,7 +66,7 @@ from ..fsp._volume import ( flow_rates, ) from ..log import get_logger -from .._profile import Profiler +from ..toolz import Profiler log = get_logger(__name__) diff --git a/piker/ui/_interaction.py b/piker/ui/_interaction.py index 1219e94e..6cc6bee4 100644 --- a/piker/ui/_interaction.py +++ b/piker/ui/_interaction.py @@ -39,8 +39,11 @@ import numpy as np import trio from ..log import get_logger -from .._profile import Profiler -from .._profile import pg_profile_enabled, ms_slower_then +from ..toolz import ( + Profiler, + pg_profile_enabled, + ms_slower_then, +) from .view_mode import overlay_viewlists # from ._style import _min_points_to_show from ._editors import SelectRect diff --git a/piker/ui/_ohlc.py b/piker/ui/_ohlc.py index 33d7bbda..2bbec253 100644 --- a/piker/ui/_ohlc.py +++ b/piker/ui/_ohlc.py @@ -31,9 +31,12 @@ from PyQt5.QtCore import ( from PyQt5.QtGui import QPainterPath from ._curve import FlowGraphic -from .._profile import pg_profile_enabled, ms_slower_then +from ..toolz import ( + Profiler, + pg_profile_enabled, + ms_slower_then, +) from ..log import get_logger -from .._profile import Profiler log = get_logger(__name__) diff --git a/piker/ui/_render.py b/piker/ui/_render.py index 2a442e98..bd3d1757 100644 --- a/piker/ui/_render.py +++ b/piker/ui/_render.py @@ -39,7 +39,7 @@ from ..data._pathops import ( xy_downsample, ) from ..log import get_logger -from .._profile import ( +from ..toolz import ( Profiler, ) diff --git a/piker/ui/view_mode.py b/piker/ui/view_mode.py index 82dfbf62..191b62b9 100644 --- a/piker/ui/view_mode.py +++ b/piker/ui/view_mode.py @@ -33,7 +33,7 @@ import pyqtgraph as pg from ..data.types import Struct from ..data._timeseries import slice_from_time from ..log import get_logger -from .._profile import Profiler +from ..toolz import Profiler if TYPE_CHECKING: from ._chart import ChartPlotWidget