Fix lint debt and make CI gates honest
- ruff: fix all 328 errors (autofix + manual); move config to [tool.ruff.lint] - mypy: fix all errors (annotations, nullable-column guards, stale kwargs in weekly report caller) - black: reformat src/tests so black --check passes - CI: remove `|| true` from ruff/black/mypy/pytest steps in both .gitea and .github workflows; install project deps and add mypy step in gitea python-ci so gates actually run - docs: move 14 root status/guide markdown files into docs/, update links
This commit is contained in:
+21
-17
@@ -1,27 +1,28 @@
|
||||
"""Tests for analytics module."""
|
||||
|
||||
import pytest
|
||||
from datetime import date, timedelta
|
||||
from decimal import Decimal
|
||||
|
||||
from pote.analytics.returns import ReturnCalculator
|
||||
import pytest
|
||||
|
||||
from pote.analytics.benchmarks import BenchmarkComparison
|
||||
from pote.analytics.metrics import PerformanceMetrics
|
||||
from pote.db.models import Official, Security, Trade, Price
|
||||
from pote.analytics.returns import ReturnCalculator
|
||||
from pote.db.models import Price, Security, Trade
|
||||
|
||||
|
||||
@pytest.fixture
|
||||
def sample_prices(test_db_session, sample_security):
|
||||
"""Create sample price data for testing."""
|
||||
session = test_db_session
|
||||
|
||||
|
||||
# Add SPY (benchmark) prices
|
||||
spy = Security(ticker="SPY", name="SPDR S&P 500 ETF")
|
||||
session.add(spy)
|
||||
session.flush()
|
||||
|
||||
|
||||
base_date = date(2024, 1, 1)
|
||||
|
||||
|
||||
# Create SPY prices
|
||||
for i in range(100):
|
||||
price = Price(
|
||||
@@ -34,7 +35,7 @@ def sample_prices(test_db_session, sample_security):
|
||||
volume=1000000,
|
||||
)
|
||||
session.add(price)
|
||||
|
||||
|
||||
# Create prices for sample_security (AAPL)
|
||||
for i in range(100):
|
||||
price = Price(
|
||||
@@ -47,7 +48,7 @@ def sample_prices(test_db_session, sample_security):
|
||||
volume=50000000,
|
||||
)
|
||||
session.add(price)
|
||||
|
||||
|
||||
session.commit()
|
||||
return session
|
||||
|
||||
@@ -80,7 +81,9 @@ def test_return_calculator_basic(test_db_session, sample_official, sample_securi
|
||||
assert "exit_price" in result
|
||||
|
||||
|
||||
def test_return_calculator_sell_trade(test_db_session, sample_official, sample_security, sample_prices):
|
||||
def test_return_calculator_sell_trade(
|
||||
test_db_session, sample_official, sample_security, sample_prices
|
||||
):
|
||||
session = test_db_session
|
||||
"""Test return calculation for sell trade."""
|
||||
trade = Trade(
|
||||
@@ -130,7 +133,7 @@ def test_benchmark_comparison(test_db_session, sample_official, sample_security,
|
||||
"""Test benchmark comparison."""
|
||||
# Create trade and SPY security
|
||||
spy = session.query(Security).filter_by(ticker="SPY").first()
|
||||
|
||||
|
||||
trade = Trade(
|
||||
official_id=sample_official.id,
|
||||
security_id=spy.id,
|
||||
@@ -154,12 +157,14 @@ def test_benchmark_comparison(test_db_session, sample_official, sample_security,
|
||||
assert "beat_market" in result
|
||||
|
||||
|
||||
def test_performance_metrics_official(test_db_session, sample_official, sample_security, sample_prices):
|
||||
def test_performance_metrics_official(
|
||||
test_db_session, sample_official, sample_security, sample_prices
|
||||
):
|
||||
session = test_db_session
|
||||
"""Test official performance metrics."""
|
||||
# Create multiple trades
|
||||
spy = session.query(Security).filter_by(ticker="SPY").first()
|
||||
|
||||
|
||||
for i in range(3):
|
||||
trade = Trade(
|
||||
official_id=sample_official.id,
|
||||
@@ -171,7 +176,7 @@ def test_performance_metrics_official(test_db_session, sample_official, sample_s
|
||||
value_max=Decimal("50000"),
|
||||
)
|
||||
session.add(trade)
|
||||
|
||||
|
||||
session.commit()
|
||||
|
||||
# Get performance metrics
|
||||
@@ -187,7 +192,7 @@ def test_multiple_windows(test_db_session, sample_official, sample_security, sam
|
||||
session = test_db_session
|
||||
"""Test calculating returns for multiple windows."""
|
||||
spy = session.query(Security).filter_by(ticker="SPY").first()
|
||||
|
||||
|
||||
trade = Trade(
|
||||
official_id=sample_official.id,
|
||||
security_id=spy.id,
|
||||
@@ -231,7 +236,7 @@ def test_sector_analysis(test_db_session, sample_official, sample_prices):
|
||||
value_max=Decimal("50000"),
|
||||
)
|
||||
session.add(trade)
|
||||
|
||||
|
||||
session.commit()
|
||||
|
||||
metrics = PerformanceMetrics(session)
|
||||
@@ -257,7 +262,7 @@ def test_timing_analysis(test_db_session, sample_official, sample_security):
|
||||
value_max=Decimal("50000"),
|
||||
)
|
||||
session.add(trade)
|
||||
|
||||
|
||||
session.commit()
|
||||
|
||||
metrics = PerformanceMetrics(session)
|
||||
@@ -265,4 +270,3 @@ def test_timing_analysis(test_db_session, sample_official, sample_security):
|
||||
|
||||
assert "avg_disclosure_lag_days" in timing
|
||||
assert timing["avg_disclosure_lag_days"] > 0
|
||||
|
||||
|
||||
Reference in New Issue
Block a user