From db92a14d306c0c2d8509ce33f479b726b3947170 Mon Sep 17 00:00:00 2001 From: Barrett Ruth Date: Fri, 12 Sep 2025 16:00:40 -0500 Subject: [PATCH 1/2] code cleanup --- CLAUDE.md | 188 ++++++++++++++++++++++++++++++++++++++++++++ lua/cp/snippets.lua | 22 ++++-- 2 files changed, 202 insertions(+), 8 deletions(-) create mode 100644 CLAUDE.md diff --git a/CLAUDE.md b/CLAUDE.md new file mode 100644 index 0000000..d231b36 --- /dev/null +++ b/CLAUDE.md @@ -0,0 +1,188 @@ +# CP.nvim Modernization Status & Upcoming Changes + +## ✅ Completed Modernization + +### Core System Overhaul +- **Eliminated makefile dependency** - Pure Lua implementation using `vim.system()` +- **Native Neovim 0.10+ APIs** throughout (no more shell scripts or `vim.fn.system`) +- **JSON-based problem scraping** replacing `---INPUT---` format with structured data +- **Modular architecture** with dedicated modules: + - `execute.lua` - Compilation and execution + - `scrape.lua` - Problem scraping with JSON parsing + - `window.lua` - Native window management + - `config.lua` - Base + extension configuration system + +### Enhanced Features +- **Configurable timeouts** per contest type +- **Contest-specific compiler flags** with inheritance +- **Direct Python scraper integration** without shell script middleware +- **Native diff mode** with proper window state management (eliminated vim-zoom dependency) +- **LuaSnip integration** with automatic snippet expansion +- **Debug flag accuracy** in output formatting + +### Configuration System +- **Base + extension pattern** for contest configuration +- **Dynamic C++ standard flag generation** (`-std=c++XX`) +- **Default snippet templates** built into the plugin + +## 🔧 Upcoming Development Tasks + +### 1. Multi-Test Case Support +**Current**: Only writes first scraped test case to `.in`/`.expected` +**Needed**: +- Write all test cases or let users cycle through them +- Support for test case selection/management + +### 2. Template System Enhancement +**Current**: Basic snippet expansion with contest types +**Needed**: +- Template customization beyond snippets +- Problem-specific template variables +- Integration with scraped problem metadata + +### 3. Enhanced Output Processing +**Current**: Basic output comparison with expected results +**Needed**: +- Better diff visualization in output window +- Partial match scoring +- Test case result breakdown for multi-case problems + +### 4. Error Handling & User Experience +**Current**: Basic error messages and logging +**Needed**: +- Better error recovery from failed scraping +- Progress indicators for long-running operations +- More descriptive compilation error formatting + +### 5. Contest Platform Extensions +**Current**: AtCoder, Codeforces, CSES support +**Potential**: +- USACO integration (mentioned in TODO) +- Additional platform support as needed + +### 6. Documentation & Examples +**Current**: Basic README +**Needed**: +- Video demonstration (TODO item) +- Comprehensive vim docs (`:help cp.nvim`) +- Configuration examples and best practices + +## 🏗️ Architecture Notes for Future Development + +### Plugin Structure +``` +lua/cp/ +├── init.lua # Main plugin logic & command setup +├── config.lua # Configuration with inheritance +├── execute.lua # Compilation & execution (vim.system) +├── scrape.lua # JSON-based problem scraping +├── snippets.lua # Default LuaSnip templates +└── window.lua # Native window management +``` + +### Key Design Principles +1. **Pure Lua** - No external shell dependencies +2. **Modular** - Each concern in separate module +3. **Configurable** - Base + extension configuration pattern +4. **Modern APIs** - Neovim 0.10+ native functions +5. **Graceful Fallbacks** - Degrade gracefully when optional deps unavailable + +## 📊 Current Feature Completeness + +| Feature | Status | Notes | +|---------|--------|-------| +| Problem Setup | ✅ Complete | Native scraping + file generation | +| Code Execution | ✅ Complete | Direct compilation with timeouts | +| Debug Mode | ✅ Complete | Separate flags + debug output | +| Diff Comparison | ✅ Complete | Native window management | +| LuaSnip Integration | ✅ Complete | Auto-expanding templates | +| Multi-platform | ✅ Complete | AtCoder, Codeforces, CSES | +| Configuration | ✅ Complete | Flexible inheritance system | + +## 📋 PLAN - Remaining Tasks + +### Phase 1: Core System Testing (High Priority) +1. **End-to-end functionality testing** + - Test all contest types: `CP atcoder`, `CP codeforces`, `CP cses` + - Verify problem setup with scraping: `CP atcoder abc123 a` + - Test run/debug/diff workflow for each platform + - Validate compilation with different C++ standards + +2. **Python environment validation** + - Verify `uv sync` creates proper virtual environment + - Test Python scrapers output valid JSON + - Handle scraping failures gracefully + - Check scraper dependencies (requests, beautifulsoup, etc.) + +3. **Configuration system testing** + - Test default vs custom contest configurations + - Verify timeout settings work correctly + - Test compiler flag inheritance and overrides + - Validate C++ version flag generation + +### Phase 2: Integration Testing (Medium Priority) +4. **LuaSnip integration validation** + - Test snippet expansion for contest types + - Verify fallback when LuaSnip unavailable + - Test custom user snippets alongside defaults + - Validate snippet triggering in empty files + +5. **Window management testing** + - Test diff mode enter/exit functionality + - Verify layout save/restore works correctly + - Test window state persistence across operations + - Validate split ratios and window positioning + +6. **File I/O and path handling** + - Test with various problem ID formats + - Verify input/output/expected file handling + - Test directory creation (build/, io/) + - Validate file path resolution across platforms + +### Phase 3: Error Handling & Edge Cases (Medium Priority) +7. **Error scenario testing** + - Test with invalid contest types + - Test with missing Python dependencies + - Test compilation failures + - Test scraping failures (network issues, rate limits) + - Test with malformed JSON from scrapers + +8. **Performance validation** + - Test timeout handling for slow compilations + - Verify non-blocking execution with vim.system + - Test with large output files + - Validate memory usage with multiple test cases + +### Phase 4: User Experience Testing (Lower Priority) +9. **Command completion and validation** + - Test command-line completion for contest types + - Test argument validation and error messages + - Verify help text accuracy + +10. **Documentation verification** + - Test all examples in README work correctly + - Verify installation instructions are accurate + - Test user configuration examples + +### Phase 5: Regression Testing (Ongoing) +11. **Compare with original functionality** + - Ensure no features were lost in migration + - Verify output format matches expectations + - Test backward compatibility with existing workflows + +### Testing Priority Order: +1. **Critical Path**: Problem setup → Run → Output verification +2. **Core Features**: Debug mode, diff mode, LuaSnip integration +3. **Error Handling**: Graceful failures, helpful error messages +4. **Edge Cases**: Unusual problem formats, network issues +5. **Performance**: Large problems, slow networks, timeout handling + +### Success Criteria: +- All basic workflows complete without errors +- Python scrapers produce valid problem files +- Compilation and execution work for all contest types +- LuaSnip integration functions or degrades gracefully +- Error messages are clear and actionable +- No vim.fn.system calls remain (all migrated to vim.system) + +The plugin is now fully modernized and ready for comprehensive testing to ensure production readiness. \ No newline at end of file diff --git a/lua/cp/snippets.lua b/lua/cp/snippets.lua index a20fd00..515c2a6 100644 --- a/lua/cp/snippets.lua +++ b/lua/cp/snippets.lua @@ -1,21 +1,23 @@ local M = {} function M.setup(config) - local has_luasnip, luasnip = pcall(require, "luasnip") - if not has_luasnip then + local ok, ls = pcall(require, "luasnip") + if not ok then vim.notify("[cp.nvim]: LuaSnip not available - snippets disabled", vim.log.levels.INFO) return end - local s = luasnip.snippet - local i = luasnip.insert_node - local fmt = require("luasnip.extras.fmt").fmt + local s, i, fmt = ls.snippet, ls.insert_node, require('luasnip.extras.fmt').fmt local default_snippets = { s( "codeforces", fmt( - [[void solve() {{ + [[#include + +using namespace std; + +void solve() {{ {} }} @@ -38,7 +40,11 @@ int main() {{ s( "atcoder", fmt( - [[void solve() {{ + [[#include + +using namespace std; + +void solve() {{ {} }} @@ -69,7 +75,7 @@ int main() {{ end local all_snippets = vim.list_extend(default_snippets, user_snippets) - luasnip.add_snippets("cpp", all_snippets) + ls.add_snippets("cpp", all_snippets) end return M From 6f2e6c606bf5a190f64dbf1f4511e2ebaf318211 Mon Sep 17 00:00:00 2001 From: Barrett Ruth Date: Fri, 12 Sep 2025 16:01:21 -0500 Subject: [PATCH 2/2] fix(fmt): stylua --- lua/cp/snippets.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lua/cp/snippets.lua b/lua/cp/snippets.lua index 515c2a6..4b5549d 100644 --- a/lua/cp/snippets.lua +++ b/lua/cp/snippets.lua @@ -7,7 +7,7 @@ function M.setup(config) return end - local s, i, fmt = ls.snippet, ls.insert_node, require('luasnip.extras.fmt').fmt + local s, i, fmt = ls.snippet, ls.insert_node, require("luasnip.extras.fmt").fmt local default_snippets = { s(