Overview
GOV.UK Notify Admin maintains strict code quality standards through automated linting and formatting tools. This ensures consistency across the codebase and reduces review overhead.Python Style Guide
Linting with Ruff
We use Ruff for Python linting and formatting. Ruff is configured inruff.toml:
Running Ruff
Python Code Conventions
Line Length
Maximum 120 characters per lineImport Sorting
Imports are automatically sorted by Ruff (isort rules):Class Method First Argument
Class methods must usecls as the first parameter:
No Print Statements
Use proper logging instead of print:List/Dict Comprehensions
Use comprehensions appropriately:Type Hints
Use type hints for function parameters and returns:String Formatting
Use f-strings for string interpolation:JavaScript Style Guide
ESLint Configuration
JavaScript is linted with ESLint using configuration fromeslint.config.mjs:
Running ESLint
JavaScript Conventions
Semicolons Required
Always use semicolons:Module Format
Use CommonJS for browser code, ES modules for tests:Global Variables
Declare globals in ESLint config:jQuery Usage
SCSS/CSS Style Guide
Stylelint Configuration
SCSS is linted with Stylelint usingstylelint.config.mjs:
Running Stylelint
SCSS Conventions
- Follow GOV.UK Design System patterns
- Use standard SCSS syntax
- Avoid overly nested selectors
- Use variables for colors and spacing
Template Style Guide
Jinja2 Templates
Templates use Jinja2 syntax with GOV.UK Frontend components:Template Conventions
- Use GOV.UK Frontend components via macros
- Always include CSRF tokens in forms
- Use semantic HTML5 elements
- Follow accessibility guidelines (WCAG 2.1 AA)
- Use
govuk-prefixed classes
Test Code Style
Python Tests (pytest)
JavaScript Tests (Jest)
Editor Configuration
VS Code
Recommended.vscode/settings.json:
Pre-commit Integration
Pre-commit hooks automatically enforce these standards:Common Style Violations
Python
| Issue | Solution |
|---|---|
| Line too long | Break into multiple lines or extract to variable |
| Import order wrong | Run make fix-imports |
| Print statement | Use logging module instead |
| Missing type hints | Add type annotations to function signatures |
| Unused imports | Remove or mark with # noqa: F401 if needed |
JavaScript
| Issue | Solution |
|---|---|
| Missing semicolon | Add semicolon at end of statement |
| Undefined variable | Declare variable or add to globals config |
| Unused variable | Remove or prefix with _ |
| Console.log in production | Remove or use proper logging |