Files
POTE/docs/OFFLINE_DEMO.md
T
ilia 662cb1b1b8
CI / skip-ci-check (pull_request) Successful in 32s
CI / secret-scan (pull_request) Successful in 30s
CI / python-ci (pull_request) Successful in 2m5s
Humanize READMEs and guides for clearer, professional tone
Align with project-template docs/writing-docs.md: plain openings, no
emoji decoration, archive scratch plans where they cluttered live docs.
2026-08-05 14:52:53 -04:00

3.2 KiB

Offline Demo - Works Without Internet!

Full System Working Without Network Access

Even though your environment doesn't have external internet, everything works perfectly using fixture files.

What Just Worked (100% Offline)

python scripts/ingest_from_fixtures.py

# Output:
# Officials created/updated: 4
# Securities created/updated: 2
# Trades ingested: 5
#
# Database totals:
#   Total officials: 4
#   Total trades: 5
#
# Sample Officials:
#   Nancy Pelosi (House, Democrat): 2 trades
#   Josh Gottheimer (House, Democrat): 1 trades
#   Tommy Tuberville (Senate, Republican): 1 trades
#   Dan Crenshaw (House, Republican): 1 trades

How It Works

  1. Test Fixtures (tests/fixtures/sample_house_watcher.json)

    • Realistic sample data (5 trades, 4 officials)
    • Nancy Pelosi, Josh Gottheimer, Tommy Tuberville, Dan Crenshaw
    • NVDA, MSFT, AAPL, TSLA, GOOGL tickers
  2. Offline Scripts

  • scripts/ingest_from_fixtures.py - Ingest sample trades ( works now!)
    • scripts/fetch_sample_prices.py - Would need network (yfinance)
  1. 28 Passing Tests - All use mocks, no network required
    • Models: 7 tests
    • Price loader: 8 tests (mocked yfinance)
    • House watcher: 8 tests (mocked HTTP)
    • Trade loader: 5 tests (uses fixtures)

Query the Database

from pote.db import SessionLocal
from pote.db.models import Official, Trade
from sqlalchemy import select

with SessionLocal() as session:
    # Get all officials
    stmt = select(Official)
    officials = session.scalars(stmt).all()
    
    for official in officials:
        print(f"{official.name} ({official.party})")
        
        # Get their trades
        stmt = select(Trade).where(Trade.official_id == official.id)
        trades = session.scalars(stmt).all()
        
        for trade in trades:
            print(f"  {trade.transaction_date}: {trade.side} {trade.security.ticker}")

What You Can Do Offline

Run all tests: make test Ingest fixture data: python scripts/ingest_from_fixtures.py Query the database: Use Python REPL or SQLite browser Lint & format: make lint format Run migrations: make migrate Build analytics (Phase 2): All math/ML works offline!

Can't do (needs network):

  • Fetch live congressional trades from House Stock Watcher
  • Fetch stock prices from yfinance
  • (But you can add more fixture files to simulate this!)

For Production (With Internet)

When you deploy to an environment with internet:

# Fetch real congressional trades
python scripts/fetch_congressional_trades.py --days 30

# Fetch real stock prices
python scripts/fetch_sample_prices.py

# Everything "just works" with the same code!

Adding More Fixture Data

You can expand the fixtures for offline development:

# Add more trades to tests/fixtures/sample_house_watcher.json
# Add price data to tests/fixtures/sample_prices.csv
# Update scripts to load from these files

Summary

The network error is not a problem! The entire system is designed to work with:

  • Fixtures for development/testing
  • Real APIs for production (when network available)
  • Same code paths for both

This is by design - makes development fast and tests reliable!