275 lines
7.5 KiB
Markdown
275 lines
7.5 KiB
Markdown
# AGENTS.md
|
|
|
|
This file provides coding guidelines and commands for AI agents working in this repository.
|
|
|
|
## Project Overview
|
|
|
|
This is a **PySide6-based desktop application** for inspection management and file system browsing. The project includes:
|
|
- GUI components for inspection workflows (incoming/manual inspection)
|
|
- Database integration with PostgreSQL
|
|
- XML parsing for element analysis data
|
|
- File system browser utility
|
|
|
|
**Tech Stack**: Python 3.8+, PySide6 6.7.1, PostgreSQL (psycopg2), pywin32
|
|
|
|
---
|
|
|
|
## Build & Run Commands
|
|
|
|
### Installation
|
|
```bash
|
|
# Create virtual environment (recommended)
|
|
python -m venv venv
|
|
source venv/bin/activate # Windows: venv\Scripts\activate
|
|
|
|
# Install dependencies
|
|
pip install -r requirements.txt
|
|
```
|
|
|
|
### Running the Application
|
|
```bash
|
|
# Main inspection application
|
|
python run.py
|
|
|
|
# File system browser (legacy)
|
|
python src/main.py
|
|
```
|
|
|
|
### Testing
|
|
**Note**: This project currently has no test suite. When adding tests:
|
|
```bash
|
|
# Install pytest
|
|
pip install pytest pytest-qt
|
|
|
|
# Run all tests
|
|
pytest
|
|
|
|
# Run single test file
|
|
pytest tests/test_xml_parser.py
|
|
|
|
# Run single test function
|
|
pytest tests/test_xml_parser.py::test_parse_valid_xml
|
|
|
|
# Run with verbose output
|
|
pytest -v
|
|
|
|
# Run with coverage
|
|
pytest --cov=src --cov-report=html
|
|
```
|
|
|
|
### Linting & Formatting
|
|
**Note**: No linter/formatter is currently configured. Recommended setup:
|
|
```bash
|
|
# Install tools
|
|
pip install black flake8 mypy
|
|
|
|
# Format code
|
|
black src/ ui/ utils/
|
|
|
|
# Lint code
|
|
flake8 src/ ui/ utils/ --max-line-length=120
|
|
|
|
# Type checking
|
|
mypy src/ ui/ utils/
|
|
```
|
|
|
|
---
|
|
|
|
## Code Style Guidelines
|
|
|
|
### 1. Imports
|
|
- **Order**: Standard library → Third-party → Local modules
|
|
- **Style**: Absolute imports preferred; relative imports allowed within packages
|
|
- **Grouping**: Separate groups with blank lines
|
|
|
|
```python
|
|
# Standard library
|
|
import os
|
|
from pathlib import Path
|
|
from dataclasses import dataclass
|
|
from typing import List, Dict, Optional
|
|
from datetime import datetime
|
|
|
|
# Third-party
|
|
from PySide6.QtWidgets import QMainWindow, QWidget
|
|
from PySide6.QtCore import Qt
|
|
import psycopg2
|
|
|
|
# Local
|
|
from src.db_manager import DatabaseManager
|
|
from ui.inspection_card import InspectionCard
|
|
```
|
|
|
|
### 2. Formatting
|
|
- **Line length**: ~120 characters (flexible, not enforced)
|
|
- **Indentation**: 4 spaces (no tabs)
|
|
- **Quotes**: Double quotes for strings (not strictly enforced)
|
|
- **Blank lines**: 2 between top-level classes/functions, 1 within classes
|
|
|
|
### 3. Naming Conventions
|
|
- **Classes**: `PascalCase` (e.g., `FileSystemReader`, `InspectionWindow`)
|
|
- **Functions/Methods**: `snake_case` (e.g., `get_files_and_folders`, `parse_file`)
|
|
- **Variables**: `snake_case` (e.g., `sample_name`, `data_list`)
|
|
- **Constants**: `UPPER_SNAKE_CASE` (e.g., `MAX_RETRIES`)
|
|
- **Private members**: Prefix with `_` (e.g., `_get_file_type`)
|
|
|
|
### 4. Type Hints
|
|
- **Usage**: Encouraged but not mandatory
|
|
- **Style**: Use `typing` module for complex types
|
|
- **Return types**: Always specify for public methods
|
|
|
|
```python
|
|
from typing import List, Dict, Optional
|
|
|
|
def get_files_and_folders(self) -> List[FileInfo]:
|
|
"""Returns list of file information objects"""
|
|
pass
|
|
|
|
def parse_file(self, file_path: str) -> tuple[Optional[List[Dict]], str]:
|
|
"""Returns (data, error_message)"""
|
|
pass
|
|
```
|
|
|
|
### 5. Docstrings
|
|
- **Style**: Google-style docstrings (simple format)
|
|
- **Required for**: Public classes, public methods, complex functions
|
|
- **Not required for**: Simple getters/setters, obvious utility functions
|
|
|
|
```python
|
|
def get_files_and_folders(self) -> List[FileInfo]:
|
|
"""
|
|
Read all files and folders from the root path
|
|
|
|
Returns:
|
|
List[FileInfo]: List of file information objects
|
|
"""
|
|
pass
|
|
```
|
|
|
|
### 6. Error Handling
|
|
- **Philosophy**: Fail gracefully, skip inaccessible resources
|
|
- **Pattern**: Try-except with specific exceptions, return None/empty on failure
|
|
- **Logging**: Use `print()` for errors (no logging framework configured)
|
|
|
|
```python
|
|
try:
|
|
conn = psycopg2.connect(**self.config)
|
|
return conn
|
|
except Exception as e:
|
|
print(f"Database connection error: {e}")
|
|
return None
|
|
```
|
|
|
|
### 7. Data Classes
|
|
- Use `@dataclass` for simple data containers
|
|
- Include type hints for all fields
|
|
- Add `@property` methods for computed values
|
|
|
|
```python
|
|
from dataclasses import dataclass
|
|
|
|
@dataclass
|
|
class FileInfo:
|
|
name: str
|
|
path: str
|
|
size: int
|
|
file_type: str
|
|
is_dir: bool
|
|
modified_time: str
|
|
|
|
@property
|
|
def size_readable(self) -> str:
|
|
"""Convert size to human-readable format"""
|
|
# Implementation
|
|
```
|
|
|
|
### 8. PySide6 GUI Patterns
|
|
- **Initialization**: All UI setup in `__init__`
|
|
- **Layouts**: Use explicit layout objects (QVBoxLayout, QHBoxLayout)
|
|
- **Styling**: Inline stylesheets for component-specific styles
|
|
- **Font**: Microsoft YaHei for Chinese text support
|
|
|
|
```python
|
|
class InspectionWindow(QMainWindow):
|
|
def __init__(self):
|
|
super().__init__()
|
|
self.setWindowTitle("检验管理系统")
|
|
|
|
# Setup layouts
|
|
central_widget = QWidget()
|
|
self.setCentralWidget(central_widget)
|
|
main_layout = QVBoxLayout(central_widget)
|
|
```
|
|
|
|
### 9. Database Patterns
|
|
- **Connection**: Create connection per operation, close immediately
|
|
- **Queries**: Use parameterized queries (never string interpolation)
|
|
- **Schema**: Explicitly specify schema with `self.schema` variable
|
|
- **Cursors**: Use `RealDictCursor` for dict-like results
|
|
|
|
```python
|
|
def get_connection(self):
|
|
try:
|
|
conn = psycopg2.connect(**self.config)
|
|
return conn
|
|
except Exception as e:
|
|
print(f"Database connection error: {e}")
|
|
return None
|
|
```
|
|
|
|
### 10. File Operations
|
|
- **Path handling**: Use `pathlib.Path` (not `os.path`)
|
|
- **Existence checks**: Always check before operations
|
|
- **Encoding**: UTF-8 default (not explicitly specified)
|
|
|
|
```python
|
|
from pathlib import Path
|
|
|
|
def parse_file(self, file_path):
|
|
if not os.path.exists(file_path):
|
|
return None, f"文件未找到: {file_path}"
|
|
```
|
|
|
|
---
|
|
|
|
## Project-Specific Rules
|
|
|
|
1. **Minimal Comments**: Code should be self-explanatory; avoid redundant comments
|
|
2. **Chinese UI Text**: All user-facing strings in Chinese (e.g., "入检", "手检")
|
|
3. **No Tests**: Currently no test suite; add tests when implementing new features
|
|
4. **Entry Points**: `run.py` for inspection app, `src/main.py` for file browser
|
|
5. **Database Credentials**: Hardcoded in `db_manager.py` (not production-ready)
|
|
6. **Error Messages**: Return tuple `(data, error_message)` pattern for parsers
|
|
|
|
---
|
|
|
|
## Common Patterns
|
|
|
|
### Adding a New UI Component
|
|
1. Create class in `ui/` directory
|
|
2. Inherit from appropriate PySide6 widget
|
|
3. Initialize layout in `__init__`
|
|
4. Use inline stylesheets for custom styling
|
|
|
|
### Adding Database Operations
|
|
1. Add method to `DatabaseManager` class
|
|
2. Use `get_connection()` to obtain connection
|
|
3. Always close connection in `finally` block or after operation
|
|
4. Return tuple `(success: bool, message: str)` for write operations
|
|
|
|
### Parsing New XML Structures
|
|
1. Add method to `XmlParser` class
|
|
2. Use `xml.etree.ElementTree` for parsing
|
|
3. Return tuple `(data: Optional[List[Dict]], error: str)`
|
|
4. Handle missing elements gracefully with `None` defaults
|
|
|
|
---
|
|
|
|
## Notes for AI Agents
|
|
|
|
- **Preserve existing functionality**: Only modify code directly related to the task
|
|
- **No unnecessary refactoring**: Keep changes minimal and targeted
|
|
- **Test manually**: No automated tests; verify changes by running the application
|
|
- **Database access**: Be cautious with database operations; test queries carefully
|
|
- **Chinese text**: Maintain Chinese for UI elements, English for code/comments
|