Add relative time and date #6

Merged
stne3960 merged 5 commits from relative_dates into main 2025-11-03 23:38:56 +01:00
Showing only changes of commit ba6817390c - Show all commits

View File

@ -38,10 +38,19 @@ public class MockService {
private static final Pattern PLACEHOLDER_PATTERN = Pattern.compile("\\{([\\w\\.]+)(?::(int|float|bool))?}"); private static final Pattern PLACEHOLDER_PATTERN = Pattern.compile("\\{([\\w\\.]+)(?::(int|float|bool))?}");
// Patterns for relative date/time placeholders with optional format specifier // Patterns for relative date/time placeholders with optional format specifier
private static final Pattern DATETIME_OFFSET_PATTERN = Pattern.compile("\\{datetime([+-])(\\d+d)?(\\d+h)?(\\d+m)?(?::(\\w+|[^}]+))?}"); private static final Pattern DATETIME_OFFSET_PATTERN =
private static final Pattern DATETIME_AT_TIME_PATTERN = Pattern.compile("\\{datetime([+-])(\\d+)d@(\\d{1,2}:\\d{2})(?::(\\w+|[^}]+))?}"); Pattern.compile("\\{datetime([+-])(\\d+d)?(\\d+h)?(\\d+m)?(?::(\\w+|[^}]+))?}");
private static final Pattern DATETIME_AT_TIME_PATTERN =
Pattern.compile("\\{datetime([+-])(\\d+)d@(\\d{1,2}:\\d{2})(?::(\\w+|[^}]+))?}");
private static final Pattern DATE_OFFSET_PATTERN = Pattern.compile("\\{date([+-])(\\d+)d(?::(\\w+|[^}]+))?}"); private static final Pattern DATE_OFFSET_PATTERN = Pattern.compile("\\{date([+-])(\\d+)d(?::(\\w+|[^}]+))?}");
private static final int GROUP_ONE = 1;
private static final int GROUP_TWO = 2;
private static final int GROUP_THREE = 3;
private static final int GROUP_FOUR = 4;
private static final int GROUP_FIVE = 5;
/** /**
* Initializes the mock service with a reference to the file loader, * Initializes the mock service with a reference to the file loader,
* which holds the live endpoint and global placeholder data. * which holds the live endpoint and global placeholder data.
@ -161,8 +170,8 @@ public class MockService {
Matcher matcher = PLACEHOLDER_PATTERN.matcher(str); Matcher matcher = PLACEHOLDER_PATTERN.matcher(str);
// If the string is a single placeholder (e.g. "{id:int}" or "{id}"), resolve and return its value // If the string is a single placeholder (e.g. "{id:int}" or "{id}"), resolve and return its value
if (matcher.matches()) { if (matcher.matches()) {
String key = matcher.group(1); String key = matcher.group(GROUP_ONE);
String type = matcher.group(2); String type = matcher.group(GROUP_TWO);
String raw = resolveValue(key, pathVariables, globals); String raw = resolveValue(key, pathVariables, globals);
return convertWithType(raw, type); return convertWithType(raw, type);
} }
@ -170,8 +179,8 @@ public class MockService {
// Otherwise: perform inline replacement for all placeholders in the string // Otherwise: perform inline replacement for all placeholders in the string
StringBuilder sb = new StringBuilder(); StringBuilder sb = new StringBuilder();
while (matcher.find()) { while (matcher.find()) {
String key = matcher.group(1); String key = matcher.group(GROUP_ONE);
String type = matcher.group(2); String type = matcher.group(GROUP_TWO);
String raw = resolveValue(key, pathVariables, globals); String raw = resolveValue(key, pathVariables, globals);
Object replacement = convertWithType(raw, type); Object replacement = convertWithType(raw, type);
matcher.appendReplacement(sb, Matcher.quoteReplacement(String.valueOf(replacement))); matcher.appendReplacement(sb, Matcher.quoteReplacement(String.valueOf(replacement)));
@ -209,11 +218,11 @@ public class MockService {
// Process datetime with offset (e.g., {datetime+2d4h30m} or {datetime+2d4h30m:rfc3339}) // Process datetime with offset (e.g., {datetime+2d4h30m} or {datetime+2d4h30m:rfc3339})
Matcher dateTimeOffsetMatcher = DATETIME_OFFSET_PATTERN.matcher(result); Matcher dateTimeOffsetMatcher = DATETIME_OFFSET_PATTERN.matcher(result);
if (dateTimeOffsetMatcher.find()) { if (dateTimeOffsetMatcher.find()) {
String sign = dateTimeOffsetMatcher.group(1); String sign = dateTimeOffsetMatcher.group(GROUP_ONE);
String daysStr = dateTimeOffsetMatcher.group(2); String daysStr = dateTimeOffsetMatcher.group(GROUP_TWO);
String hoursStr = dateTimeOffsetMatcher.group(3); String hoursStr = dateTimeOffsetMatcher.group(GROUP_THREE);
String minutesStr = dateTimeOffsetMatcher.group(4); String minutesStr = dateTimeOffsetMatcher.group(GROUP_FOUR);
String format = dateTimeOffsetMatcher.group(5); String format = dateTimeOffsetMatcher.group(GROUP_FIVE);
LocalDateTime now = LocalDateTime.now(); LocalDateTime now = LocalDateTime.now();
LocalDateTime target = calculateDateTimeWithOffset(now, sign, daysStr, hoursStr, minutesStr); LocalDateTime target = calculateDateTimeWithOffset(now, sign, daysStr, hoursStr, minutesStr);
@ -225,10 +234,10 @@ public class MockService {
// Process datetime with days at specific time (e.g., {datetime+2d@13:00} or {datetime+2d@13:00:rfc3339}) // Process datetime with days at specific time (e.g., {datetime+2d@13:00} or {datetime+2d@13:00:rfc3339})
Matcher dateTimeAtTimeMatcher = DATETIME_AT_TIME_PATTERN.matcher(result); Matcher dateTimeAtTimeMatcher = DATETIME_AT_TIME_PATTERN.matcher(result);
if (dateTimeAtTimeMatcher.find()) { if (dateTimeAtTimeMatcher.find()) {
String sign = dateTimeAtTimeMatcher.group(1); String sign = dateTimeAtTimeMatcher.group(GROUP_ONE);
int days = Integer.parseInt(dateTimeAtTimeMatcher.group(2)); int days = Integer.parseInt(dateTimeAtTimeMatcher.group(GROUP_TWO));
String timeStr = dateTimeAtTimeMatcher.group(3); String timeStr = dateTimeAtTimeMatcher.group(GROUP_THREE);
String format = dateTimeAtTimeMatcher.group(4); String format = dateTimeAtTimeMatcher.group(GROUP_FOUR);
LocalDate targetDate = LocalDate.now(); LocalDate targetDate = LocalDate.now();
if ("+".equals(sign)) { if ("+".equals(sign)) {
@ -247,9 +256,9 @@ public class MockService {
// Process date with offset (e.g., {date-4d} or {date-4d:MMM dd, yyyy}) // Process date with offset (e.g., {date-4d} or {date-4d:MMM dd, yyyy})
Matcher dateOffsetMatcher = DATE_OFFSET_PATTERN.matcher(result); Matcher dateOffsetMatcher = DATE_OFFSET_PATTERN.matcher(result);
if (dateOffsetMatcher.find()) { if (dateOffsetMatcher.find()) {
String sign = dateOffsetMatcher.group(1); String sign = dateOffsetMatcher.group(GROUP_ONE);
int days = Integer.parseInt(dateOffsetMatcher.group(2)); int days = Integer.parseInt(dateOffsetMatcher.group(GROUP_TWO));
String format = dateOffsetMatcher.group(3); String format = dateOffsetMatcher.group(GROUP_THREE);
LocalDate target = LocalDate.now(); LocalDate target = LocalDate.now();
if ("+".equals(sign)) { if ("+".equals(sign)) {
@ -274,7 +283,9 @@ public class MockService {
* @param minutesStr minutes component (e.g., "30m") * @param minutesStr minutes component (e.g., "30m")
* @return the calculated LocalDateTime * @return the calculated LocalDateTime
*/ */
private LocalDateTime calculateDateTimeWithOffset(LocalDateTime base, String sign, String daysStr, String hoursStr, String minutesStr) { private LocalDateTime calculateDateTimeWithOffset(LocalDateTime base, String sign, String daysStr,
String hoursStr, String minutesStr)
{
LocalDateTime result = base; LocalDateTime result = base;
int multiplier = "+".equals(sign) ? 1 : -1; int multiplier = "+".equals(sign) ? 1 : -1;