Step 2: TOML config and SQLite state
config.rs replaces iPXSettings.py and feeds.plist; db.rs replaces the per-feed .ipxd plists, history.dat and qmcache.dat. enclosures.url is UNIQUE, which is the dedupe key the old pickle history provided. ipx list is the first working subcommand. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01RPyeapneuXrCdojsaiXGbe
This commit is contained in:
32
PROGRESS.md
32
PROGRESS.md
@@ -8,8 +8,7 @@ The full design and step list live in the plan file at
|
||||
|
||||
- [x] **1. Repo skeleton** — git init (`main`), `cargo init --name ipx`, deps pinned, LICENSE,
|
||||
README, this file.
|
||||
- [ ] **2. `config.rs` + `db.rs`** — TOML config structs + SQLite schema.
|
||||
*Done when:* `ipx list` prints feeds from a hand-written config; DB created once.
|
||||
- [x] **2. `config.rs` + `db.rs`** — TOML config structs + SQLite schema.
|
||||
- [ ] **3. `feed.rs`** — conditional GET, RSS-then-Atom parse, persist entries.
|
||||
*Done when:* `ipx fetch` populates `entries`, second run 304s.
|
||||
- [ ] **4. `download.rs`** — filename derivation + sanitizer, streaming download, `infer` sniff,
|
||||
@@ -35,6 +34,33 @@ The full design and step list live in the plan file at
|
||||
|
||||
---
|
||||
|
||||
## 2026-09-09 — Step 2: config.rs + db.rs
|
||||
|
||||
`src/config.rs`: serde structs for `[general]`, `[torrent]` and `[feeds.<id>]` with defaults, `~`
|
||||
expansion, `IPX_CONFIG` / `IPX_DATA_DIR` overrides, `save()` at mode 0600, `Feed::password()`
|
||||
(`password_env` beats a literal `password`), `Torrent::ports()` parsing `"6881-6889"`. A missing
|
||||
config file loads as an empty one so a fresh install works. Retention defaults are 0/0
|
||||
(unlimited, keep forever) — nothing gets deleted until Ray asks for it.
|
||||
|
||||
`src/db.rs`: schema exactly as planned, WAL + `busy_timeout`, `Db::open()` idempotent, connection
|
||||
behind a `Mutex`, `feed_summary()` for `list`, `now()` helper. `enclosures.url` is UNIQUE — the
|
||||
dedupe key that replaces `history.dat`.
|
||||
|
||||
`src/main.rs`: clap skeleton with `ipx list`. Only the subcommands that work exist; the rest arrive
|
||||
with their steps.
|
||||
|
||||
Verified: `cargo test` 5/5 green (config defaults, port-range fallback incl. reversed range,
|
||||
password_env precedence, schema idempotency, enclosure-url uniqueness). Gate met — `ipx --config
|
||||
<scratch> list` printed both feeds and created `state.db` once across two runs.
|
||||
|
||||
Deferred: nothing. Two dead-code warnings (`Config::save`, `Feed::password`) are expected; steps 3
|
||||
and 8 consume them.
|
||||
Next: step 3 — `feed.rs`.
|
||||
|
||||
Also added `chrono` 0.4 (std, clock) for RFC-2822 pubDate parsing in step 3.
|
||||
|
||||
---
|
||||
|
||||
## 2026-09-09 — Step 1: repo skeleton
|
||||
|
||||
Repo created at `/src/ipodderx-rs`, default branch `main`, `cargo init --name ipx` (edition 2024,
|
||||
@@ -62,4 +88,4 @@ Gotcha worth keeping: three feature names in the plan were wrong against current
|
||||
`reqwest/rustls-tls` is now `rustls`, env-var proxy support moved behind `system-proxy`, and
|
||||
`rss/with-syndication` does not exist. `librqbit`'s default features drag in OpenSSL; `rust-tls`
|
||||
is the fix. Whole tree is rustls-only now, no C TLS dependency.
|
||||
Next: step 2 — `config.rs` + `db.rs`.
|
||||
Next: step 2 — `config.rs` + `db.rs`. (done)
|
||||
|
||||
Reference in New Issue
Block a user