new datetime parser #13

Merged
navicore merged 1 commit from new-datetime-parser into main 2026-01-30 20:21:59 +00:00
navicore commented 2026-01-30 20:21:19 +00:00 (Migrated from github.com)

Summary

I've implemented the token-based natural language datetime parser as specified:

Files Modified

  1. lua/reminders/time_parser.lua - Complete rewrite
    - Removed all 5 parse_* functions with ~50 regex patterns
    - Added TokenType definitions (16 token types)
    - Added M.tokenize(expression) - tokenizes input left-to-right
    - Added M.assemble(tokens, opts) - assembles datetime from tokens
    - Updated M.parse(expression, opts) - backward compatible API with new opts parameter
    - Kept M.time_until(datetime) unchanged
    - Added date validation (rejects Feb 31, Apr 31, handles leap years)
  2. lua/reminders/snooze.lua - Simplified from 60 lines to 26 lines
    - Replaced hardcoded if/elseif chain with single call to time_parser.parse()
  3. tests/time_parser_spec.lua - Expanded from 237 to 463 lines
    - Added word-order flexibility tests
    - Added default_hour option tests
    - Added error case tests
    - Added tokenize function tests
    - Added snooze choices validation test
    - Removed tests for deleted internal functions

Key Features

  • Two-phase parsing: Tokenize → Assemble
  • Word-order flexibility: "Feb 20 6am", "6am Feb 20", "on Feb 20 at 6am" all work
  • Configurable defaults: opts.default_hour and opts.default_minute
  • Date validation: Strict validation of day/month combinations with leap year support
  • Error messages: Returns nil, error_message on failure instead of just nil
  • Backward compatible: Old M.parse(expression) still works
Summary I've implemented the token-based natural language datetime parser as specified: Files Modified 1. lua/reminders/time_parser.lua - Complete rewrite - Removed all 5 parse_* functions with ~50 regex patterns - Added TokenType definitions (16 token types) - Added M.tokenize(expression) - tokenizes input left-to-right - Added M.assemble(tokens, opts) - assembles datetime from tokens - Updated M.parse(expression, opts) - backward compatible API with new opts parameter - Kept M.time_until(datetime) unchanged - Added date validation (rejects Feb 31, Apr 31, handles leap years) 2. lua/reminders/snooze.lua - Simplified from 60 lines to 26 lines - Replaced hardcoded if/elseif chain with single call to time_parser.parse() 3. tests/time_parser_spec.lua - Expanded from 237 to 463 lines - Added word-order flexibility tests - Added default_hour option tests - Added error case tests - Added tokenize function tests - Added snooze choices validation test - Removed tests for deleted internal functions Key Features - Two-phase parsing: Tokenize → Assemble - Word-order flexibility: "Feb 20 6am", "6am Feb 20", "on Feb 20 at 6am" all work - Configurable defaults: opts.default_hour and opts.default_minute - Date validation: Strict validation of day/month combinations with leap year support - Error messages: Returns nil, error_message on failure instead of just nil - Backward compatible: Old M.parse(expression) still works
Sign in to join this conversation.
No description provided.