From dbd6e103c0c083a29790a6bd8fe23be14c8c0d77 Mon Sep 17 00:00:00 2001 From: Bu5hm4nn Date: Wed, 1 Apr 2026 13:58:49 +0200 Subject: [PATCH] fix: pin black to 26.3.1 across all environments - Pin black version in requirements-dev.txt (was >=24.0.0) - Update pre-commit to use black 26.3.1 with Python 3.12 - Add language_version: python3.12 to pre-commit black hook - Reformat files with new black version for consistency --- .pre-commit-config.yaml | 5 +- app/components/charts.py | 48 +++++++------------ app/components/strategy_panel.py | 6 +-- app/pages/options.py | 7 +-- app/pages/overview.py | 6 +-- requirements-dev.txt | 2 +- tests/test_overview_ltv_history_playwright.py | 6 +-- 7 files changed, 28 insertions(+), 52 deletions(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 8601be4..02dd261 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -3,7 +3,7 @@ repos: # Ruff - fast Python linter - repo: https://github.com/astral-sh/ruff-pre-commit - rev: v0.11.2 + rev: v0.15.8 hooks: - id: ruff args: [--fix, --exit-non-zero-on-fix] @@ -11,10 +11,11 @@ repos: # Black - Python formatter - repo: https://github.com/psf/black - rev: 25.1.0 + rev: 26.3.1 hooks: - id: black files: ^(app|tests|scripts)/ + language_version: python3.12 # Type checking with mypy (optional, slower) # Uncomment to enable: diff --git a/app/components/charts.py b/app/components/charts.py index 41d945b..aef4fca 100644 --- a/app/components/charts.py +++ b/app/components/charts.py @@ -13,11 +13,9 @@ def _ensure_lightweight_charts_assets() -> None: global _CHARTS_SCRIPT_ADDED if _CHARTS_SCRIPT_ADDED: return - ui.add_head_html( - """ + ui.add_head_html(""" - """ - ) + """) _CHARTS_SCRIPT_ADDED = True @@ -48,8 +46,7 @@ class CandlestickChart: self._initialize_chart() def _initialize_chart(self) -> None: - ui.run_javascript( - f""" + ui.run_javascript(f""" (function() {{ const root = document.getElementById({json.dumps(self.chart_id)}); if (!root || typeof LightweightCharts === 'undefined') return; @@ -94,57 +91,48 @@ class CandlestickChart: indicators: {{}}, }}; }})(); - """ - ) + """) def set_candles(self, candles: list[dict[str, Any]]) -> None: payload = json.dumps(candles) - ui.run_javascript( - f""" + ui.run_javascript(f""" (function() {{ const ref = window.vaultDashCharts?.[{json.dumps(self.chart_id)}]; if (!ref) return; ref.candleSeries.setData({payload}); ref.chart.timeScale().fitContent(); }})(); - """ - ) + """) def update_price(self, candle: dict[str, Any]) -> None: payload = json.dumps(candle) - ui.run_javascript( - f""" + ui.run_javascript(f""" (function() {{ const ref = window.vaultDashCharts?.[{json.dumps(self.chart_id)}]; if (!ref) return; ref.candleSeries.update({payload}); }})(); - """ - ) + """) def set_volume(self, volume_points: list[dict[str, Any]]) -> None: payload = json.dumps(volume_points) - ui.run_javascript( - f""" + ui.run_javascript(f""" (function() {{ const ref = window.vaultDashCharts?.[{json.dumps(self.chart_id)}]; if (!ref) return; ref.volumeSeries.setData({payload}); }})(); - """ - ) + """) def update_volume(self, volume_point: dict[str, Any]) -> None: payload = json.dumps(volume_point) - ui.run_javascript( - f""" + ui.run_javascript(f""" (function() {{ const ref = window.vaultDashCharts?.[{json.dumps(self.chart_id)}]; if (!ref) return; ref.volumeSeries.update({payload}); }})(); - """ - ) + """) def set_indicator( self, @@ -156,8 +144,7 @@ class CandlestickChart: ) -> None: key = json.dumps(name) payload = json.dumps(points) - ui.run_javascript( - f""" + ui.run_javascript(f""" (function() {{ const ref = window.vaultDashCharts?.[{json.dumps(self.chart_id)}]; if (!ref) return; @@ -171,19 +158,16 @@ class CandlestickChart: }} ref.indicators[{key}].setData({payload}); }})(); - """ - ) + """) def update_indicator(self, name: str, point: dict[str, Any]) -> None: key = json.dumps(name) payload = json.dumps(point) - ui.run_javascript( - f""" + ui.run_javascript(f""" (function() {{ const ref = window.vaultDashCharts?.[{json.dumps(self.chart_id)}]; const series = ref?.indicators?.[{key}]; if (!series) return; series.update({payload}); }})(); - """ - ) + """) diff --git a/app/components/strategy_panel.py b/app/components/strategy_panel.py index 35f66a3..e1cb165 100644 --- a/app/components/strategy_panel.py +++ b/app/components/strategy_panel.py @@ -117,8 +117,7 @@ class StrategyComparisonPanel: scenario_class = ( "text-emerald-600 dark:text-emerald-400" if scenario >= 0 else "text-rose-600 dark:text-rose-400" ) - rows.append( - f""" + rows.append(f""" {name} ${cost:,.2f} @@ -126,8 +125,7 @@ class StrategyComparisonPanel: {self._format_cap(strategy)} ${scenario:,.2f} - """ - ) + """) return f"""
diff --git a/app/pages/options.py b/app/pages/options.py index 444a4cd..a2f81e0 100644 --- a/app/pages/options.py +++ b/app/pages/options.py @@ -137,8 +137,7 @@ async def options_page() -> None: """ - + "".join( - f""" + + "".join(f""" @@ -149,9 +148,7 @@ async def options_page() -> None: - """ - for row in rows - ) + """ for row in rows) + ( "" if rows diff --git a/app/pages/overview.py b/app/pages/overview.py index 666881f..7b3e0fb 100644 --- a/app/pages/overview.py +++ b/app/pages/overview.py @@ -124,13 +124,11 @@ def welcome_page(request: Request): if turnstile.uses_test_keys else "" ) - ui.html( - f""" + ui.html(f""" {hidden_token}
- """ - ) + """) ui.label("You can always create a fresh workspace later if a link is lost.").classes( "text-sm text-slate-500 dark:text-slate-400" ) diff --git a/requirements-dev.txt b/requirements-dev.txt index 4759ae5..acdf6f8 100644 --- a/requirements-dev.txt +++ b/requirements-dev.txt @@ -2,7 +2,7 @@ pytest>=8.0.0 pytest-asyncio>=0.23.0 -black>=24.0.0 +black==26.3.1 ruff>=0.2.0 mypy>=1.8.0 types-requests>=2.31.0 diff --git a/tests/test_overview_ltv_history_playwright.py b/tests/test_overview_ltv_history_playwright.py index 54caf26..2a6d4a8 100644 --- a/tests/test_overview_ltv_history_playwright.py +++ b/tests/test_overview_ltv_history_playwright.py @@ -26,16 +26,14 @@ def test_overview_shows_ltv_history_and_exports_csv() -> None: expect(page.locator("text=90 Day").first).to_be_visible(timeout=15000) expect(page.get_by_role("button", name="Export CSV")).to_be_visible(timeout=15000) - series_names = page.evaluate( - """ + series_names = page.evaluate(""" async () => { const importMap = JSON.parse(document.querySelector('script[type="importmap"]').textContent).imports; const mod = await import(importMap['nicegui-echart']); const chart = mod.echarts.getInstanceByDom(document.querySelector('.nicegui-echart')); return chart ? chart.getOption().series.map(series => series.name) : []; } - """ - ) + """) assert series_names == ["LTV", "Margin threshold"] with page.expect_download() as download_info:
{row['symbol']} {row['type'].upper()}Δ {float(row.get('delta', 0.0)):+.3f} · Γ {float(row.get('gamma', 0.0)):.3f} · Θ {float(row.get('theta', 0.0)):+.3f} · V {float(row.get('vega', 0.0)):.3f} Use quick-add buttons below