Skip to content

Centralize ISO 8601 timestamp regex pattern in CIHelpers #1333

@chaosdinosaur

Description

@chaosdinosaur

Summary

The ISO 8601 timestamp validation regex ^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}\.\d+Z$ is duplicated across 5 test files. If Get-StandardTimestamp in CIHelpers.psm1 changes its output format, every copy must be updated in lockstep. Centralizing the pattern in CIHelpers eliminates this maintenance risk.

Origin: PR #1314 review discussion with @WilliamBerryiii about moving timestamp concerns into a CI helper.

Current Behavior

The same regex is hard-coded in each test file that validates timestamp output:

File Line
scripts/tests/lib/CIHelpers.Tests.ps1 28
scripts/tests/security/SecurityClasses.Tests.ps1 195
scripts/tests/security/SecurityHelpers.Tests.ps1 146
scripts/tests/linting/FrontmatterValidation.Tests.ps1 356
scripts/tests/linting/Invoke-YamlLint.Tests.ps1 415

Expected Behavior

CIHelpers exports a Get-StandardTimestampPattern function (or module-scoped variable) returning the canonical regex. All test files reference that single source of truth instead of duplicating the pattern.

Proposed Approach

  1. Add to scripts/lib/Modules/CIHelpers.psm1:
function Get-StandardTimestampPattern {
    [CmdletBinding()]
    [OutputType([string])]
    param()

    return '^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}\.\d+Z$'
}
  1. Export Get-StandardTimestampPattern in the Export-ModuleMember list.
  2. Replace all hard-coded regex occurrences in test files with Get-StandardTimestampPattern.
  3. Add a unit test in CIHelpers.Tests.ps1 verifying the pattern matches Get-StandardTimestamp output.

Files Requiring Changes

File Change
scripts/lib/Modules/CIHelpers.psm1 Add Get-StandardTimestampPattern function and export
scripts/tests/lib/CIHelpers.Tests.ps1 Use new function; add pattern-matches-output test
scripts/tests/security/SecurityClasses.Tests.ps1 Replace hard-coded regex
scripts/tests/security/SecurityHelpers.Tests.ps1 Replace hard-coded regex
scripts/tests/linting/FrontmatterValidation.Tests.ps1 Replace hard-coded regex
scripts/tests/linting/Invoke-YamlLint.Tests.ps1 Replace hard-coded regex

RPI Framework Starter Prompts

Phase 1: Research

Select Task Researcher from the agent picker, then send:

Research ISO 8601 timestamp regex centralization. Investigate: (1) Grep all files under scripts/ for the pattern \d{4}-\d{2}-\d{2}T to find every occurrence of the timestamp regex. (2) Confirm the exact regex used in each location and note any slight variations. (3) Verify Get-StandardTimestamp output format matches the regex. (4) Check whether any non-test files also hard-code the pattern.

Phase 2: Plan

Select Task Planner from the agent picker, then send:

Plan centralization of the ISO 8601 timestamp regex into CIHelpers.psm1. The plan should cover: (1) Adding Get-StandardTimestampPattern to CIHelpers. (2) Updating all test files to use the new function. (3) Adding a unit test verifying the pattern matches Get-StandardTimestamp output. (4) Validation: npm run test:ps, npm run lint:ps.

Phase 3: Implement

Select Task Implementor from the agent picker, then send:

Implement ISO 8601 timestamp regex centralization following the plan. Steps: (1) Add Get-StandardTimestampPattern function to CIHelpers.psm1 and export it. (2) Replace all hard-coded timestamp regex patterns in test files. (3) Add a unit test in CIHelpers.Tests.ps1. (4) Run npm run lint:ps and npm run test:ps.

Phase 4: Review

Select Task Reviewer from the agent picker, then send:

Review ISO 8601 timestamp regex centralization. Verify: (1) No hard-coded timestamp regexes remain in test files. (2) Get-StandardTimestampPattern output matches Get-StandardTimestamp output. (3) All Pester tests pass. (4) npm run lint:ps clean.

References

Metadata

Metadata

Assignees

No one assigned

    Labels

    good first issueGood for newcomersscriptsPowerShell, Bash, or Python scripts

    Type

    No type
    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions