Skip to content

feat: temporal expressions and 90% test coverage#2

Merged
abkrim merged 3 commits intomainfrom
feature/temporal-expressions
Dec 10, 2025
Merged

feat: temporal expressions and 90% test coverage#2
abkrim merged 3 commits intomainfrom
feature/temporal-expressions

Conversation

@abkrim
Copy link
Contributor

@abkrim abkrim commented Dec 10, 2025

Summary

  • Temporal Extensions (ADR-001): Complete implementation of temporal expression evaluation for scheduling and time-based conditions
  • CRON support: Integration with dragonmantank/cron-expression for cron-based scheduling
  • Custom evaluators: Register business-specific conditions (e.g., holiday, astronomical_day)
  • Test coverage improvement: 68.7% → 90.0% (792 tests, 1,141 assertions)

Features

New Temporal Tokens

  • {{TEMPORAL:isDue('weekday && 08:00-18:00')}} - Boolean evaluation
  • {{TEMPORAL:nextRun('cron:0 8 * * 1-5')}} - Next scheduled run
  • {{NOW:format('Y-m-d')}} - Current datetime functions
  • {{TODAY:startOfDay}} - Today-based calculations

Expression Syntax

weekday && 08:00-18:00          # Weekdays 8am-6pm
cron:0 8 * * 1-5                # CRON expressions
nth:saturday:1                   # First Saturday
last:friday                      # Last Friday of month
weekday && !holiday             # Custom evaluators

Core Components

Component Description
TemporalResolver Handles TEMPORAL/NOW/TODAY tokens
ExpressionParser Parses boolean temporal expressions
TimeRange Time-of-day evaluation with overnight support
CronWrapper CRON expression wrapper
ConditionRegistry Centralized condition management

Conditions

  • WeekdayCondition, WeekendCondition
  • CronCondition, TimeRangeCondition
  • NthWeekdayCondition, LastWeekdayCondition
  • AlwaysCondition, NeverCondition, CustomCondition

Test Plan

  • All 792 tests pass
  • PHPStan level max: no errors
  • Laravel Pint: formatted
  • Coverage ≥90% enforced
  • Infection mutation testing configured (minMsi: 80%)

Breaking Changes

None. This is a feature addition.

Dependencies

  • Added: dragonmantank/cron-expression: ^3.3
  • Added dev: infection/infection: ^0.29

Temporal Extensions (ADR-001):
- Add TemporalResolver for NOW, TODAY, and TEMPORAL expressions
- Implement CRON-based scheduling (nextRun, previousRun, isDue)
- Add time range evaluation (08:00-18:00)
- Support nth/last weekday conditions (first Saturday, last Friday)
- Add custom evaluator registration for business logic

Core temporal components:
- TemporalExpression: Boolean expression parser (weekday && !holiday)
- ExpressionParser: Tokenizer for temporal expressions
- CronWrapper: CRON expression evaluation via dragonmantank/cron-expression
- TimeRange: Time-of-day range checking with overnight support
- ConditionRegistry: Centralized condition management

Condition implementations:
- WeekdayCondition, WeekendCondition
- CronCondition, TimeRangeCondition
- NthWeekdayCondition, LastWeekdayCondition
- AlwaysCondition, NeverCondition, CustomCondition

Test coverage improvements (68.7% → 90.0%):
- 792 tests with 1,141 assertions
- New tests for TokenCollection, ConditionRegistry
- New tests for DynamicFieldResolver, TableResolver
- New tests for Cache, Accessors, Exceptions
- Full coverage for TemporalResolver and all conditions

Configuration:
- Add Infection mutation testing configuration
- Update phpunit.xml.dist with coverage settings
- Add dragonmantank/cron-expression dependency
@abkrim abkrim merged commit f81c48d into main Dec 10, 2025
12 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant