Rename to stealergram, add pyproject.toml, purge em-dashes
- Rename project to stealergram throughout - Add pyproject.toml (replaces requirements.txt split, folds pytest.ini) - Replace all em-dashes with hyphens across all source files Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
12
CLAUDE.md
12
CLAUDE.md
@@ -5,7 +5,7 @@ This file provides guidance to Claude Code (claude.ai/code) when working with co
|
||||
## Development workflow
|
||||
|
||||
After every code change:
|
||||
1. Run `pytest` — all tests must pass at 100%.
|
||||
1. Run `pytest` - all tests must pass at 100%.
|
||||
2. If 100% pass: present the change to the user, then commit.
|
||||
3. If any test fails: fix the bug and re-run before showing anything to the user.
|
||||
|
||||
@@ -20,7 +20,7 @@ pytest -v # verbose
|
||||
pytest tests/test_scorer.py # single file
|
||||
```
|
||||
|
||||
Tests cover `utils/scorer`, `utils/cache`, `utils/database`, and `core/processor`. They are fully isolated — no `.env` required, no real DB or cache files touched. The `patched_keywords` fixture in `conftest.py` replaces `TARGET_KEYWORDS` with known test patterns; it must patch both `config.TARGET_KEYWORDS` and `scorer.TARGET_KEYWORDS` (the local `from config import` binding).
|
||||
Tests cover `utils/scorer`, `utils/cache`, `utils/database`, and `core/processor`. They are fully isolated - no `.env` required, no real DB or cache files touched. The `patched_keywords` fixture in `conftest.py` replaces `TARGET_KEYWORDS` with known test patterns; it must patch both `config.TARGET_KEYWORDS` and `scorer.TARGET_KEYWORDS` (the local `from config import` binding).
|
||||
|
||||
## Running the monitor
|
||||
|
||||
@@ -66,15 +66,15 @@ Telegram channel message with file attachment
|
||||
|
||||
The TUI and Telegram bot run in separate threads with different event loops:
|
||||
|
||||
- **Main thread**: Textual's event loop — runs `MonitorApp`, drains the event bus every 100ms via `_drain_bus()`
|
||||
- **Bot thread**: own `asyncio` event loop — runs `_bot_main()` with both `user_client` and `bot_client`
|
||||
- **Main thread**: Textual's event loop - runs `MonitorApp`, drains the event bus every 100ms via `_drain_bus()`
|
||||
- **Bot thread**: own `asyncio` event loop - runs `_bot_main()` with both `user_client` and `bot_client`
|
||||
- **Cross-thread communication**: bot → TUI via `bus.post()` (`queue.Queue.put_nowait`, always safe); TUI → bot via `loop.call_soon_threadsafe()` (e.g., to signal channel list changes)
|
||||
|
||||
### Module responsibilities
|
||||
|
||||
| Module | Role |
|
||||
|--------|------|
|
||||
| `config.py` | All settings — edit keywords, channels, paths, tdl tuning here |
|
||||
| `config.py` | All settings - edit keywords, channels, paths, tdl tuning here |
|
||||
| `core/scraper.py` | Live listener + backfill orchestration; registers Telethon `NewMessage` handlers |
|
||||
| `core/tdl_downloader.py` | Wraps `tdl` subprocess for fast downloads; falls back to Telethon |
|
||||
| `core/bot_downloader.py` | Handles inline button click flow where files come via bot reply |
|
||||
@@ -127,4 +127,4 @@ tail -f data/logs/monitor.log
|
||||
| `r` | Refresh stats |
|
||||
| `q` / `Escape` | Quit / back |
|
||||
|
||||
Runtime keyword and channel changes are **not** persisted — copy them to `config.py` to survive restarts.
|
||||
Runtime keyword and channel changes are **not** persisted - copy them to `config.py` to survive restarts.
|
||||
|
||||
Reference in New Issue
Block a user