code-style
skill✓Guide for running code style linters and formatters. Use this when asked to check code style, run linters, or fix formatting issues.
apm::install
apm install @microsoft/code-styleapm::skill.md
---
name: code-style
description: Guide for running code style linters and formatters. Use this when asked to check code style, run linters, or fix formatting issues.
---
# Code Style and Linting
This skill covers code style checking and formatting workflows for the Semantic Link Labs project.
## When to Use This Skill
Use this skill when you need to:
- Check code for style violations
- Format code with black
- Verify type correctness with mypy
- Fix linting errors before committing
- Ensure code follows project standards
---
## Formatting Tools
| Tool | Purpose | Configuration |
|------|---------|---------------|
| **black** | Code formatting | `pyproject.toml` |
| **flake8** | Style checking | `pyproject.toml` |
| **mypy** | Type checking | `pyproject.toml` |
---
## Code Formatting with Black
The project uses `black` for code formatting.
### Running Black
```bash
# Format all source files
black src/sempy_labs tests
# Check without modifying (dry run)
black --check src/sempy_labs tests
# Show diff of changes
black --diff src/sempy_labs tests
# Format specific file
black src/sempy_labs/_workspaces.py
```
### Black Configuration
From `pyproject.toml`, max line length is configured via flake8 settings.
---
## Style Checking with Flake8
### Running Flake8
```bash
# Check all source files
flake8 src/sempy_labs tests
# Check specific file
flake8 src/sempy_labs/_helper_functions.py
# Show source code for each error
flake8 --show-source src/sempy_labs
# Show statistics summary
flake8 --statistics src/sempy_labs
```
### Flake8 Configuration
From `pyproject.toml`:
```toml
[tool.flake8]
max-line-length = 200
```
### Common Flake8 Errors
| Code | Description | Fix |
|------|-------------|-----|
| E501 | Line too long (>200 chars) | Break line or shorten code |
| F401 | Imported but unused | Remove unused import |
| F841 | Variable assigned but never used | Remove or use the variable |
| E302 | Expected 2 blank lines | Add blank lines between functions |
| E303 | Too many blank lines | Remove extra blank lines |
| W291 | Trailing whitespace | Remove trailing spaces |
| E711 | Comparison to None | Use `is None` instead of `== None` |
---
## Type Checking with Mypy
### Running Mypy
```bash
# Check all source files
mypy src/sempy_labs
# Check specific file
mypy src/sempy_labs/_workspaces.py
# Show error codes
mypy --show-error-codes src/sempy_labs
```
### Mypy Configuration
From `pyproject.toml`:
```toml
[[tool.mypy.overrides]]
module = "sempy.*,Microsoft.*,System.*,anytree.*,powerbiclient.*,synapse.ml.services.*,polib.*,jsonpath_ng.*"
ignore_missing_imports = true
```
### Common Mypy Errors
| Error | Description | Fix |
|-------|-------------|-----|
| `Incompatible types` | Type mismatch | Fix type annotation or value |
| `Missing return statement` | Function missing return | Add return statement |
| `Argument has incompatible type` | Wrong argument type | Pass correct type |
| `has no attribute` | Attribute doesn't exist | Check spelling or type |
### Adding Type Ignore Comments
When mypy raises false positives:
```python
# Ignore specific error
result = some_function() # type: ignore[return-value]
# Ignore all errors on line
result = some_function() # type: ignore
```
---
## Import Organization
### Import Order
Organize imports in this order (with blank lines between groups):
1. Standard library imports
2. Third-party imports
3. Local application imports
### Example Import Structure
```python
# Standard library
import os
import json
from typing import Optional, List
from uuid import UUID
# Third-party
import pandas as pd
import requests
# Semantic Link (dependency)
import sempy.fabric as fabric
from sempy._utils._log import log
# Local imports
import sempy_labs._icons as icons
from sempy_labs._helper_functions import (
resolve_workspace_id,
_base_api,
)
```
---
## Pre-Commit Style Checklist
Before committing code changes:
```bash
# Format code
black src/sempy_labs tests
# Check for style issues
flake8 src/sempy_labs tests
# Check types (optional)
mypy src/sempy_labs
# If any errors, fix and re-run
```
---
## Common Style Fixes
### Line Too Long
Break long lines using parentheses or backslash:
```python
# Before
result = some_very_long_function_call(parameter1, parameter2, parameter3, parameter4, parameter5)
# After
result = some_very_long_function_call(
parameter1,
parameter2,
parameter3,
parameter4,
parameter5
)
```
### F-String Line Breaks
```python
# Before
print(f"{icons.green_dot} The '{item_name}' {item_type} has been successfully created in the '{workspace_name}' workspace.")
# After (if too long)
print(
f"{icons.green_dot} The '{item_name}' {item_type} has been successfully "
f"created in the '{workspace_name}' workspace."
)
```
### Dictionary Formatting
```python
# Before
payload = {"displayName": name, "description": description, "definition": definition}
# After
payload = {
"displayName": name,
"description": description,
"definition": definition,
}
```
---
## IDE Integration
### VS Code Settings
Recommended `.vscode/settings.json`:
```json
{
"python.formatting.provider": "black",
"python.linting.flake8Enabled": true,
"python.linting.mypyEnabled": true,
"editor.formatOnSave": true,
"[python]": {
"editor.defaultFormatter": "ms-python.black-formatter"
}
}
```