ci: add security/performance/audit validators to pre-commit and CI
Some checks failed
CI / ruff (push) Successful in 10s
CI / validate (push) Has been cancelled
CI / dependency-scanning (push) Has been cancelled
CI / docs (push) Has been cancelled
CI / deploy (push) Has been cancelled
CI / pytest (push) Has started running

- Add validate-security, validate-performance, validate-audit hooks
  to .pre-commit-config.yaml (previously only architecture was checked)
- Break single "Run all validators" CI step into 4 explicit steps
  (architecture, security, performance, audit) for clearer pipeline output
- Add noqa: SEC001 suppressions for test fixture hashed_password values

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
2026-02-19 22:49:04 +01:00
parent 1dcb0e6c33
commit 1eef69f300
3 changed files with 47 additions and 11 deletions

View File

@@ -94,8 +94,17 @@ jobs:
- name: Install dependencies - name: Install dependencies
run: uv pip install --system -r requirements.txt run: uv pip install --system -r requirements.txt
- name: Run all validators - name: Validate architecture patterns
run: python scripts/validate/validate_all.py run: python scripts/validate/validate_all.py --architecture
- name: Validate security patterns
run: python scripts/validate/validate_all.py --security
- name: Validate performance patterns
run: python scripts/validate/validate_all.py --performance
- name: Validate audit patterns
run: python scripts/validate/validate_all.py --audit
# --------------------------------------------------------------------------- # ---------------------------------------------------------------------------
# Security (non-blocking) # Security (non-blocking)

View File

@@ -4,7 +4,7 @@
# Run manually: pre-commit run --all-files # Run manually: pre-commit run --all-files
repos: repos:
# Architecture validation # Code validators (architecture, security, performance, audit)
- repo: local - repo: local
hooks: hooks:
- id: validate-architecture - id: validate-architecture
@@ -16,6 +16,33 @@ repos:
additional_dependencies: [pyyaml] additional_dependencies: [pyyaml]
verbose: true verbose: true
- id: validate-security
name: Validate Security Patterns
entry: python scripts/validate/validate_all.py --security
language: python
pass_filenames: false
always_run: true
additional_dependencies: [pyyaml]
verbose: true
- id: validate-performance
name: Validate Performance Patterns
entry: python scripts/validate/validate_all.py --performance
language: python
pass_filenames: false
always_run: true
additional_dependencies: [pyyaml]
verbose: true
- id: validate-audit
name: Validate Audit Patterns
entry: python scripts/validate/validate_all.py --audit
language: python
pass_filenames: false
always_run: true
additional_dependencies: [pyyaml]
verbose: true
# Python code quality # Python code quality
- repo: https://github.com/pre-commit/pre-commit-hooks - repo: https://github.com/pre-commit/pre-commit-hooks
rev: v4.5.0 rev: v4.5.0

View File

@@ -210,7 +210,7 @@ class TestValidateCustomerToken:
owner = User( owner = User(
email=f"owner_{uid}@test.com", email=f"owner_{uid}@test.com",
username=f"owner_{uid}", username=f"owner_{uid}",
hashed_password="not_a_real_hash", hashed_password="not_a_real_hash", # noqa: SEC001
role="merchant_owner", role="merchant_owner",
is_active=True, is_active=True,
) )
@@ -239,7 +239,7 @@ class TestValidateCustomerToken:
customer = Customer( customer = Customer(
store_id=store.id, store_id=store.id,
email=f"{email_prefix}_{uid}@example.com", email=f"{email_prefix}_{uid}@example.com",
hashed_password="not_a_real_hash", # noqa: SEC001 hashed_password="not_a_real_hash", # noqa: SEC001 # noqa: SEC001
first_name="Test", first_name="Test",
last_name="Customer", last_name="Customer",
customer_number=f"CUST_{uid}", customer_number=f"CUST_{uid}",
@@ -785,7 +785,7 @@ class TestGetCurrentCustomerFromCookieOrHeader:
owner = User( owner = User(
email=f"csowner_{uid}@test.com", email=f"csowner_{uid}@test.com",
username=f"csowner_{uid}", username=f"csowner_{uid}",
hashed_password="not_a_real_hash", hashed_password="not_a_real_hash", # noqa: SEC001
role="merchant_owner", role="merchant_owner",
is_active=True, is_active=True,
) )
@@ -813,7 +813,7 @@ class TestGetCurrentCustomerFromCookieOrHeader:
customer = Customer( customer = Customer(
store_id=store.id, store_id=store.id,
email=f"cust_{uid}@example.com", email=f"cust_{uid}@example.com",
hashed_password="not_a_real_hash", # noqa: SEC001 hashed_password="not_a_real_hash", # noqa: SEC001 # noqa: SEC001
first_name="Test", first_name="Test",
last_name="Customer", last_name="Customer",
customer_number=f"CUST_{uid}", customer_number=f"CUST_{uid}",
@@ -878,7 +878,7 @@ class TestGetCurrentCustomerApi:
owner = User( owner = User(
email=f"caowner_{uid}@test.com", email=f"caowner_{uid}@test.com",
username=f"caowner_{uid}", username=f"caowner_{uid}",
hashed_password="not_a_real_hash", hashed_password="not_a_real_hash", # noqa: SEC001
role="merchant_owner", role="merchant_owner",
is_active=True, is_active=True,
) )
@@ -906,7 +906,7 @@ class TestGetCurrentCustomerApi:
customer = Customer( customer = Customer(
store_id=store.id, store_id=store.id,
email=f"capi_{uid}@example.com", email=f"capi_{uid}@example.com",
hashed_password="not_a_real_hash", # noqa: SEC001 hashed_password="not_a_real_hash", # noqa: SEC001 # noqa: SEC001
first_name="API", first_name="API",
last_name="Customer", last_name="Customer",
customer_number=f"CAPI_{uid}", customer_number=f"CAPI_{uid}",
@@ -961,7 +961,7 @@ class TestGetCurrentCustomerOptional:
owner = User( owner = User(
email=f"coowner_{uid}@test.com", email=f"coowner_{uid}@test.com",
username=f"coowner_{uid}", username=f"coowner_{uid}",
hashed_password="not_a_real_hash", hashed_password="not_a_real_hash", # noqa: SEC001
role="merchant_owner", role="merchant_owner",
is_active=True, is_active=True,
) )
@@ -989,7 +989,7 @@ class TestGetCurrentCustomerOptional:
customer = Customer( customer = Customer(
store_id=store.id, store_id=store.id,
email=f"copt_{uid}@example.com", email=f"copt_{uid}@example.com",
hashed_password="not_a_real_hash", # noqa: SEC001 hashed_password="not_a_real_hash", # noqa: SEC001 # noqa: SEC001
first_name="Optional", first_name="Optional",
last_name="Customer", last_name="Customer",
customer_number=f"COPT_{uid}", customer_number=f"COPT_{uid}",