# Contributing to WebDrop Bridge

Thank you for your interest in contributing! This document provides guidelines and instructions for contributing to the WebDrop Bridge project.

## Code of Conduct

Please be respectful and constructive in all interactions. We're building a welcoming community for developers of all experience levels.

## Getting Started

### Prerequisites
- Python 3.9+
- Git
- Familiarity with Qt/PySide6 or willingness to learn

### Setup Development Environment

```bash
# Fork and clone the repository
git clone https://github.com/yourusername/webdrop-bridge.git
cd webdrop-bridge

# Create virtual environment
python -m venv venv
source venv/bin/activate  # macOS/Linux
# venv\Scripts\activate  # Windows

# Install development dependencies
pip install -r requirements-dev.txt

# Install pre-commit hooks (optional)
pip install pre-commit
pre-commit install
```

## Development Workflow

### 1. Create a Feature Branch

```bash
git checkout -b feature/your-feature-name
```

Use descriptive names:
- `feature/drag-performance-optimization`
- `bugfix/path-validation-windows`
- `docs/add-architecture-guide`

### 2. Write Tests First (TDD)

```bash
# Create test file
touch tests/unit/test_my_feature.py

# Write failing tests
pytest tests/unit/test_my_feature.py

# Implement feature
# Re-run tests until passing
```

### 3. Implement Your Feature

```bash
# Follow the project structure
src/webdrop_bridge/
├── core/       # Core logic
├── ui/         # UI components
└── utils/      # Utilities
```

### 4. Code Quality Checks

```bash
# Format code
tox -e format

# Run linting
tox -e lint

# Type checking
tox -e type

# Full test suite
pytest --cov

# All checks
tox
```

### 5. Write Documentation

- Add docstrings to all functions/classes
- Update README.md if adding features
- Add examples for new APIs

### 6. Commit and Push

```bash
# Commit with meaningful message
git commit -m "feat: add feature description

- Detailed explanation of changes
- Bullet points for key changes
- References to related issues"

# Push to your fork
git push origin feature/your-feature-name
```

### 7. Submit Pull Request

- Use clear, descriptive title
- Reference related issues (#123)
- Describe changes and testing approach
- Include screenshots/videos if UI-related

## Code Style

### Python Style Guide

Follow PEP 8, enforced by Black and Ruff:

```python
# Good
def validate_path(path: Path, allowed_roots: List[Path]) -> bool:
    """Validate path against allowed roots."""
    resolved = path.resolve()
    return any(is_relative_to(resolved, root) for root in allowed_roots)


# Bad
def validate_path(path,allowed_roots):
    resolved=path.resolve()
    return any(is_relative_to(resolved,root)for root in allowed_roots)
```

### Type Hints

Always use type hints:

```python
from typing import Optional, List
from pathlib import Path

def process_files(files: List[Path], validate: bool = True) -> Optional[int]:
    """Process a list of files."""
    pass
```

### Docstrings

Use Google-style docstrings:

```python
def validate_path(path: Path, allowed_roots: List[Path]) -> bool:
    """Validate that path is within allowed roots.
    
    Args:
        path: File path to validate
        allowed_roots: List of allowed root directories
        
    Returns:
        True if path is valid, False otherwise
        
    Raises:
        ValueError: If path cannot be resolved
    """
```

## Testing Guidelines

### Unit Tests

Test individual functions/classes in isolation:

```python
# tests/unit/test_validator.py
import pytest
from webdrop_bridge.core.validator import PathValidator
from pathlib import Path

@pytest.fixture
def validator():
    allowed_roots = [Path("C:/Users/Public")]
    return PathValidator(allowed_roots)

def test_valid_path(validator):
    """Test that valid paths are accepted."""
    path = Path("C:/Users/Public/Documents/file.txt")
    assert validator.is_allowed(path)

def test_invalid_path(validator):
    """Test that invalid paths are rejected."""
    path = Path("C:/Windows/System32/file.txt")
    assert not validator.is_allowed(path)
```

### Integration Tests

Test components working together:

```python
# tests/integration/test_drag_workflow.py
def test_complete_drag_workflow(temp_test_dir):
    """Test complete drag-and-drop workflow."""
    # Setup
    test_file = temp_test_dir / "test.txt"
    test_file.write_text("content")
    
    # Execute
    validator = PathValidator([temp_test_dir])
    result = validator.is_valid_file(test_file)
    
    # Verify
    assert result is True
```

### Test Coverage

- Aim for 80%+ code coverage
- All public APIs must have tests
- Test both happy path and error cases

```bash
# Check coverage
pytest --cov=src/webdrop_bridge --cov-report=html

# View detailed report
open htmlcov/index.html  # macOS
start htmlcov\index.html # Windows
```

## Platform-Specific Development

### Windows

```bash
# For Windows-specific tests
pytest -m windows

# Build Windows installer
python build/scripts/build_windows.py
```

### macOS

```bash
# For macOS-specific tests
pytest -m macos

# Build macOS DMG
bash build/scripts/build_macos.sh
```

## Common Issues

### Import Errors

Ensure project is in PYTHONPATH:

```bash
export PYTHONPATH="${PYTHONPATH}:$(pwd)/src"  # macOS/Linux
set PYTHONPATH=%PYTHONPATH%;%cd%\src  # Windows
```

Or install in development mode:

```bash
pip install -e .
```

### PySide6 Installation Issues

```bash
# Force reinstall
pip install --force-reinstall --no-cache-dir PySide6

# On macOS with Apple Silicon
pip install PySide6 --target $PYTHON_ENV
```

### Test Failures in CI but Not Locally

- Check Python version: `python --version`
- Verify all dependencies: `pip list`
- Clear cache: `rm -rf .pytest_cache build/`
- Try clean venv: `rm -rf venv && python -m venv venv`

## Documentation

### API Documentation

Docstrings are automatically converted to HTML:

```bash
tox -e docs

# View documentation
open docs/_build/html/index.html  # macOS
start docs\_build\html\index.html # Windows
```

### Writing Documentation

- Use Markdown for guides
- Include code examples
- Add screenshots for UI features
- Keep language clear and concise

## Writing Integration Tests

Integration tests should cover workflows across multiple components. See [tests/integration/test_update_flow.py](tests/integration/test_update_flow.py) for an example covering the update system.

## Release Process

### Versioning & Release Process

### Version Management

WebDrop Bridge uses **semantic versioning** (MAJOR.MINOR.PATCH). The version is centralized in one location:

**Single Source of Truth**: `src/webdrop_bridge/__init__.py`

```python
__version__ = "1.0.0"
```

**Shared Version Utility**: `build/scripts/version_utils.py`

All build scripts and version management tools use a shared utility to read the version from `__init__.py`, ensuring consistency across:
- `pyproject.toml` - Reads dynamically at build time
- `config.py` - Reads dynamically at startup
- `.env.example` - Updated by sync script (optional)
- `CHANGELOG.md` - Updated by sync script

### Releasing a New Version

#### Step 1: Update the Version (Only Place to Edit)

Edit `src/webdrop_bridge/__init__.py` and change `__version__`:

```python
__version__ = "1.2.0"  # Change this to your new version
```

#### Step 2: Sync Version to Changelog

Run the sync script to update the changelog:

```bash
python scripts/sync_version.py
```

Or let the build script do it automatically:

```bash
# Windows
python build/scripts/build_windows.py

# macOS
bash build/scripts/build_macos.sh
```

Both the build script and sync script use the shared `build/scripts/version_utils.py` utility.

#### Step 3: Update CHANGELOG.md Manually (Content Only)

The sync script adds the version header with the date. Now add your changes under each section:

```markdown
## [1.2.0] - 2026-01-15

### Added
- New feature description

### Changed
- Breaking change description

### Fixed
- Bug fix description
```

#### Step 4: Commit and Tag

```bash
git add -A
git commit -m "chore: release v1.2.0

- Feature 1 details
- Feature 2 details"

git tag -a v1.2.0 -m "Release version 1.2.0"
git push origin main --tags
```

### Manual Version Sync (If Needed)

If you need to sync versions without building:

```bash
python scripts/sync_version.py
```

To set a specific version:

```bash
python scripts/sync_version.py --version 1.2.0
```

### Querying Version in Code

Always import from the package:

```python
from webdrop_bridge import __version__

print(__version__)  # "1.2.0"
```

### Environment Override (Development Only)

If needed for testing, you can override with `.env`:

```bash
# .env (development only)
APP_VERSION=1.2.0-dev
```

Config loads it via lazy import (to avoid circular dependencies):
```python
if not os.getenv("APP_VERSION"):
    from webdrop_bridge import __version__
    app_version = __version__
else:
    app_version = os.getenv("APP_VERSION")
```

### Shared Version Utility

Both build scripts and the sync script use `build/scripts/version_utils.py` to read the version:

```python
from version_utils import get_current_version, get_project_root

version = get_current_version()  # Reads from __init__.py
root = get_project_root()        # Gets project root
```

This ensures:
- **No duplication** - Single implementation used everywhere
- **Consistency** - All tools read from the same source
- **Maintainability** - Update once, affects all tools

If you create new build scripts or tools, import from this utility instead of implementing version reading again.

---

## Summary of Version Management

| Task | How | Location |
|------|-----|----------|
| Define version | Edit `__version__` | `src/webdrop_bridge/__init__.py` |
| Read version in app | Lazy import `__init__.py` | `src/webdrop_bridge/config.py` |
| Read version in builds | Use shared utility | `build/scripts/version_utils.py` |
| Update changelog | Run sync script | `scripts/sync_version.py` |
| Release new version | Edit `__init__.py`, run sync, commit/tag | See "Releasing a New Version" above |

**Golden Rule**: Only edit `src/webdrop_bridge/__init__.py`. Everything else is automated or handled by scripts.

## Getting Help

- **Issues**: Report bugs or request features
- **Discussions**: Ask questions or discuss ideas
- **Documentation**: Check docs/ folder
- **Code Examples**: Look at tests/ folder

## Review Process

All pull requests require:

- ✅ Tests pass (100% on target platforms)
- ✅ Code review approved
- ✅ No lint/type warnings
- ✅ Documentation updated
- ✅ Coverage maintained or improved

## Recognition

Contributors are recognized in:
- CONTRIBUTORS.md
- GitHub releases
- Project website

Thank you for contributing to WebDrop Bridge! 🎉
