Goal
Let Schwab users bring their own data. The backtest engine only needs a contribution calendar (date, contributed); optionally also dividends received (date, symbol, dividend) for the real-account comparison row.
What to do
- Copy
src/divvy/importers/broker_template.py to src/divvy/importers/schwab.py.
- Implement
contributions() (and optionally dividends_actual()) to parse Schwab's Transactions CSV export into the documented schemas. See src/divvy/ledger.py for the complete Fidelity example (how it classifies buys vs. reinvestments vs. dividends).
- Add a test with a small fake fixture (follow
tests/test_ledger.py). Never commit a real statement.
- Optionally wire a
--broker schwab path into divvy compare in src/divvy/cli.py.
Acceptance criteria
contributions() returns columns date, contributed (positive $, DRIP reinvestments excluded).
- Test passes;
ruff check + ruff format clean.
Good first issue — self-contained, one new file + one test. See CONTRIBUTING.md.
Goal
Let Schwab users bring their own data. The backtest engine only needs a contribution calendar (
date,contributed); optionally also dividends received (date,symbol,dividend) for the real-account comparison row.What to do
src/divvy/importers/broker_template.pytosrc/divvy/importers/schwab.py.contributions()(and optionallydividends_actual()) to parse Schwab's Transactions CSV export into the documented schemas. Seesrc/divvy/ledger.pyfor the complete Fidelity example (how it classifies buys vs. reinvestments vs. dividends).tests/test_ledger.py). Never commit a real statement.--broker schwabpath intodivvy compareinsrc/divvy/cli.py.Acceptance criteria
contributions()returns columnsdate, contributed(positive $, DRIP reinvestments excluded).ruff check+ruff formatclean.Good first issue — self-contained, one new file + one test. See CONTRIBUTING.md.