Committing before help rework

This commit is contained in:
2026-09-05 13:19:55 -05:00
parent 4cce5cc45c
commit 3fa77f5707
105 changed files with 22505 additions and 684 deletions
+269 -16
View File
@@ -62,11 +62,6 @@
<ul>
<li class=" " data-id="CliGenerator/CliGen/AdditionalDefaultFlag" data-name="cligen::additionaldefaultflag">
<a href="../CliGen/AdditionalDefaultFlag.html">AdditionalDefaultFlag</a>
</li>
<li class=" " data-id="CliGenerator/CliGen/App" data-name="cligen::app">
<a href="../CliGen/App.html">App</a>
@@ -77,16 +72,31 @@
</li>
<li class=" " data-id="CliGenerator/CliGen/ArgReprocessedError" data-name="cligen::argreprocessederror">
<a href="../CliGen/ArgReprocessedError.html">ArgReprocessedError</a>
</li>
<li class=" " data-id="CliGenerator/CliGen/Argument" data-name="cligen::argument">
<a href="../CliGen/Argument.html">Argument</a>
</li>
<li class=" " data-id="CliGenerator/CliGen/BaseCommandNode" data-name="cligen::basecommandnode">
<a href="../CliGen/BaseCommandNode.html">BaseCommandNode</a>
</li>
<li class=" " data-id="CliGenerator/CliGen/BaseFlag" data-name="cligen::baseflag">
<a href="../CliGen/BaseFlag.html">BaseFlag</a>
</li>
<li class=" " data-id="CliGenerator/CliGen/Coercable" data-name="cligen::coercable">
<a href="../CliGen/Coercable.html">Coercable</a>
</li>
<li class=" " data-id="CliGenerator/CliGen/Command" data-name="cligen::command">
<a href="../CliGen/Command.html">Command</a>
@@ -97,13 +107,33 @@
</li>
<li class=" " data-id="CliGenerator/CliGen/CommandNode" data-name="cligen::commandnode">
<li class=" " data-id="CliGenerator/CliGen/CommandMeta" data-name="cligen::commandmeta">
<a href="../CliGen/CommandMeta.html">CommandMeta</a>
</li>
<li class=" " data-id="CliGenerator/CliGen/CommandNode" data-name="cligen::commandnode(t)">
<a href="../CliGen/CommandNode.html">CommandNode</a>
</li>
<li class=" " data-id="CliGenerator/CliGen/DefaultFlag" data-name="cligen::defaultflag">
<a href="../CliGen/DefaultFlag.html">DefaultFlag</a>
<li class=" " data-id="CliGenerator/CliGen/ConfigurationError" data-name="cligen::configurationerror">
<a href="../CliGen/ConfigurationError.html">ConfigurationError</a>
</li>
<li class=" " data-id="CliGenerator/CliGen/DuplicateCommandError" data-name="cligen::duplicatecommanderror">
<a href="../CliGen/DuplicateCommandError.html">DuplicateCommandError</a>
</li>
<li class=" " data-id="CliGenerator/CliGen/DuplicateFlagError" data-name="cligen::duplicateflagerror">
<a href="../CliGen/DuplicateFlagError.html">DuplicateFlagError</a>
</li>
<li class=" " data-id="CliGenerator/CliGen/Error" data-name="cligen::error">
<a href="../CliGen/Error.html">Error</a>
</li>
@@ -112,16 +142,86 @@
</li>
<li class=" " data-id="CliGenerator/CliGen/FlagArgumentError" data-name="cligen::flagargumenterror">
<a href="../CliGen/FlagArgumentError.html">FlagArgumentError</a>
</li>
<li class=" " data-id="CliGenerator/CliGen/FlagBundleError" data-name="cligen::flagbundleerror">
<a href="../CliGen/FlagBundleError.html">FlagBundleError</a>
</li>
<li class=" " data-id="CliGenerator/CliGen/FlagMeta" data-name="cligen::flagmeta">
<a href="../CliGen/FlagMeta.html">FlagMeta</a>
</li>
<li class=" " data-id="CliGenerator/CliGen/FlagMissingArgumentError" data-name="cligen::flagmissingargumenterror">
<a href="../CliGen/FlagMissingArgumentError.html">FlagMissingArgumentError</a>
</li>
<li class=" " data-id="CliGenerator/CliGen/FlagNotFoundError" data-name="cligen::flagnotfounderror">
<a href="../CliGen/FlagNotFoundError.html">FlagNotFoundError</a>
</li>
<li class=" " data-id="CliGenerator/CliGen/Format" data-name="cligen::format">
<a href="../CliGen/Format.html">Format</a>
</li>
<li class=" " data-id="CliGenerator/CliGen/HelpRequestedError" data-name="cligen::helprequestederror">
<a href="../CliGen/HelpRequestedError.html">HelpRequestedError</a>
</li>
<li class=" " data-id="CliGenerator/CliGen/InternalError" data-name="cligen::internalerror">
<a href="../CliGen/InternalError.html">InternalError</a>
</li>
<li class=" " data-id="CliGenerator/CliGen/InvalidFlagValueError" data-name="cligen::invalidflagvalueerror">
<a href="../CliGen/InvalidFlagValueError.html">InvalidFlagValueError</a>
</li>
<li class=" " data-id="CliGenerator/CliGen/InvalidOptionError" data-name="cligen::invalidoptionerror">
<a href="../CliGen/InvalidOptionError.html">InvalidOptionError</a>
</li>
<li class=" " data-id="CliGenerator/CliGen/MatchType" data-name="cligen::matchtype">
<a href="../CliGen/MatchType.html">MatchType</a>
</li>
<li class=" " data-id="CliGenerator/CliGen/MissingDispatchError" data-name="cligen::missingdispatcherror">
<a href="../CliGen/MissingDispatchError.html">MissingDispatchError</a>
</li>
<li class=" " data-id="CliGenerator/CliGen/MissingRequiredFlagError" data-name="cligen::missingrequiredflagerror">
<a href="../CliGen/MissingRequiredFlagError.html">MissingRequiredFlagError</a>
</li>
<li class=" " data-id="CliGenerator/CliGen/Parsable" data-name="cligen::parsable">
<a href="../CliGen/Parsable.html">Parsable</a>
</li>
<li class=" " data-id="CliGenerator/CliGen/ParseableInvariantError" data-name="cligen::parseableinvarianterror">
<a href="../CliGen/ParseableInvariantError.html">ParseableInvariantError</a>
</li>
<li class=" " data-id="CliGenerator/CliGen/PreRunCommand" data-name="cligen::preruncommand">
<a href="../CliGen/PreRunCommand.html">PreRunCommand</a>
</li>
<li class=" " data-id="CliGenerator/CliGen/ProxyCommand" data-name="cligen::proxycommand">
<a href="../CliGen/ProxyCommand.html">ProxyCommand</a>
@@ -132,6 +232,26 @@
</li>
<li class=" " data-id="CliGenerator/CliGen/RegexInvariantError" data-name="cligen::regexinvarianterror">
<a href="../CliGen/RegexInvariantError.html">RegexInvariantError</a>
</li>
<li class=" " data-id="CliGenerator/CliGen/ReservedFlagError" data-name="cligen::reservedflagerror">
<a href="../CliGen/ReservedFlagError.html">ReservedFlagError</a>
</li>
<li class=" " data-id="CliGenerator/CliGen/RunCommand" data-name="cligen::runcommand">
<a href="../CliGen/RunCommand.html">RunCommand</a>
</li>
<li class=" " data-id="CliGenerator/CliGen/RuntimeError" data-name="cligen::runtimeerror">
<a href="../CliGen/RuntimeError.html">RuntimeError</a>
</li>
<li class=" " data-id="CliGenerator/CliGen/Selection" data-name="cligen::selection">
<a href="../CliGen/Selection.html">Selection</a>
@@ -142,11 +262,56 @@
</li>
<li class=" " data-id="CliGenerator/CliGen/SubCommandInfo" data-name="cligen::subcommandinfo">
<a href="../CliGen/SubCommandInfo.html">SubCommandInfo</a>
</li>
<li class="parent " data-id="CliGenerator/CliGen/Timeparse" data-name="cligen::timeparse">
<a href="../CliGen/Timeparse.html">Timeparse</a>
<ul>
<li class=" " data-id="CliGenerator/CliGen/Timeparse/OperationUnit" data-name="cligen::timeparse::operationunit">
<a href="../CliGen/Timeparse/OperationUnit.html">OperationUnit</a>
</li>
<li class=" " data-id="CliGenerator/CliGen/Timeparse/RelativeOperation" data-name="cligen::timeparse::relativeoperation">
<a href="../CliGen/Timeparse/RelativeOperation.html">RelativeOperation</a>
</li>
</ul>
</li>
<li class=" " data-id="CliGenerator/CliGen/TimeParseError" data-name="cligen::timeparseerror">
<a href="../CliGen/TimeParseError.html">TimeParseError</a>
</li>
<li class=" " data-id="CliGenerator/CliGen/Trigger" data-name="cligen::trigger">
<a href="../CliGen/Trigger.html">Trigger</a>
</li>
<li class=" " data-id="CliGenerator/CliGen/UnknownCommandNodeError" data-name="cligen::unknowncommandnodeerror">
<a href="../CliGen/UnknownCommandNodeError.html">UnknownCommandNodeError</a>
</li>
<li class=" " data-id="CliGenerator/CliGen/UnknownFlagError" data-name="cligen::unknownflagerror">
<a href="../CliGen/UnknownFlagError.html">UnknownFlagError</a>
</li>
<li class=" " data-id="CliGenerator/CliGen/ValidationError" data-name="cligen::validationerror">
<a href="../CliGen/ValidationError.html">ValidationError</a>
</li>
</ul>
@@ -215,13 +380,23 @@
<dl>
<dt class="entry-const" id="DATE">
<strong>DATE</strong> = <code><span class="s">/(?&lt;date&gt;(?&lt;year&gt;[0-9]{4})-(?&lt;month&gt;[0-9]{2})-(?&lt;day&gt;[0-9]{2}))/</span></code>
</dt>
<dt class="entry-const" id="EPOCH">
<strong>EPOCH</strong> = <code><span class="s">/@(?&lt;epoch&gt;[0-9]+)/</span></code>
</dt>
<dt class="entry-const" id="FLAG_MULTIPLE_SHORT">
<strong>FLAG_MULTIPLE_SHORT</strong> = <code><span class="s">/^-[a-zA-Z]+$/</span></code>
<strong>FLAG_MULTIPLE_SHORT</strong> = <code><span class="s">/^-[a-zA-Z0-9]+$/</span></code>
</dt>
<dt class="entry-const" id="FLAG_REGEX">
<strong>FLAG_REGEX</strong> = <code><span class="s">/^(-[a-zA-Z]|--[a-zA-Z-_]+)$/</span></code>
<strong>FLAG_REGEX</strong> = <code><span class="s">/^(-[a-zA-Z]|--[a-zA-Z-_0-9]+)$/</span></code>
</dt>
@@ -230,18 +405,96 @@
</dt>
<dt class="entry-const" id="INPUT_DATE_REGEX">
<strong>INPUT_DATE_REGEX</strong> = <code><span class="s">/^[0-9]{4}-[0-9]{2}-[0-9]{2}$/</span></code>
<dt class="entry-const" id="FLOAT">
<strong>FLOAT</strong> = <code><span class="s">/^[-+]?[[:digit:]]+(\.[[:digit:]]+)?$/</span></code>
</dt>
<dt class="entry-const" id="INPUT_DATETIME_REGEX">
<strong>INPUT_DATETIME_REGEX</strong> = <code><span class="s">/^[0-9]{4}-[0-9]{2}-[0-9]{2} [0-9]{2}:[0-9]{2}:[0-9]{2}$/</span></code>
<dt class="entry-const" id="INPUT_DATE_EPOCH">
<strong>INPUT_DATE_EPOCH</strong> = <code><span class="s">/^</span><span class="i">#{</span><span class="t">EPOCH</span><span class="i">}</span><span class="s">(\s+</span><span class="i">#{</span><span class="t">TIMEZONE</span><span class="i">}</span><span class="s">)?$/</span></code>
</dt>
<dt class="entry-const" id="SHORT_WITH_INLINE_ARG">
<strong>SHORT_WITH_INLINE_ARG</strong> = <code><span class="s">/^-[a-zA-Z][a-zA-Z0-9]+$/</span></code>
<dt class="entry-const" id="INPUT_DATE_FULL">
<strong>INPUT_DATE_FULL</strong> = <code><span class="s">/^</span><span class="i">#{</span><span class="t">DATE</span><span class="i">}</span><span class="s">\s+</span><span class="i">#{</span><span class="t">TIME</span><span class="i">}</span><span class="s">(\s+</span><span class="i">#{</span><span class="t">TIMEZONE</span><span class="i">}</span><span class="s">)?$/</span></code>
</dt>
<dd class="entry-const-doc">
<hr />
<h2><a id="datetime-matchers-fully-anchored-so-a-partial-match-cant-slip-through." class="anchor" href="#datetime-matchers-fully-anchored-so-a-partial-match-cant-slip-through.">
<svg class="octicon-link" aria-hidden="true">
<use href="#octicon-link"/>
</svg>
</a>Date/time matchers - fully anchored so a partial match can't slip through.</h2>
</dd>
<dt class="entry-const" id="INPUT_DATE_SIMPLE">
<strong>INPUT_DATE_SIMPLE</strong> = <code><span class="s">/^</span><span class="i">#{</span><span class="t">DATE</span><span class="i">}</span><span class="s">(\s+</span><span class="i">#{</span><span class="t">TIMEZONE</span><span class="i">}</span><span class="s">)?$/</span></code>
</dt>
<dt class="entry-const" id="INPUT_RELATIVE_OPERATIONS">
<strong>INPUT_RELATIVE_OPERATIONS</strong> = <code><span class="s">/^(?&lt;operations&gt;(</span><span class="i">#{</span><span class="t">RELATIVE</span><span class="i">}</span><span class="s">\s*)+)(\s+</span><span class="i">#{</span><span class="t">TIMEZONE</span><span class="i">}</span><span class="s">)?$/</span></code>
</dt>
<dt class="entry-const" id="INT">
<strong>INT</strong> = <code><span class="s">/^[-+]?[[:digit:]]+$/</span></code>
</dt>
<dt class="entry-const" id="RELATIVE">
<strong>RELATIVE</strong> = <code><span class="s">/[+-][0-9]+\s+(seconds?|minutes?|hours?|days?|weeks?|months?|years?)/</span></code>
</dt>
<dt class="entry-const" id="RELATIVE_OPERATION">
<strong>RELATIVE_OPERATION</strong> = <code><span class="s">/(?&lt;sign&gt;[+-])(?&lt;quantity&gt;[0-9]+)\s+(?&lt;unit&gt;seconds?|minutes?|hours?|days?|weeks?|months?|years?)/</span></code>
</dt>
<dd class="entry-const-doc">
<hr />
<h2><a id="relative-operation-matcher-for-use-with-cli-gentimeparserelative-operation" class="anchor" href="#relative-operation-matcher-for-use-with-cli-gentimeparserelative-operation">
<svg class="octicon-link" aria-hidden="true">
<use href="#octicon-link"/>
</svg>
</a>Relative Operation matcher - For use with CliGen::Timeparse::RelativeOperation</h2>
</dd>
<dt class="entry-const" id="TIME">
<strong>TIME</strong> = <code><span class="s">/(?&lt;time&gt;(?&lt;hour&gt;[0-9]{2}):(?&lt;minute&gt;[0-9]{2}):(?&lt;second&gt;[0-9]{2}))/</span></code>
</dt>
<dt class="entry-const" id="TIMEZONE">
<strong>TIMEZONE</strong> = <code><span class="s">/(?&lt;timezone&gt;(?&lt;offset_sign&gt;[-+])(?&lt;offset_hour&gt;[01][0-9]|2[0-3])(?&lt;offset_minute&gt;[0-5][0-9]))/</span></code>
</dt>
<dd class="entry-const-doc">
<hr />
<p>Date/time components.</p>
<p>These are building blocks ONLY — they are interpolated into the anchored
matchers below and must stay unanchored. Interpolating a Regex renders it
as <code>(?-imsx:...)</code>, so an anchor here would end up buried mid-pattern in the
composites (<code>^(?-imsx:^...$)\s+...$</code>) and could never match.</p>
<h2><a id="never-match-user-input-against-these-directly-use-the-input-date-matchers-which-are-anchored." class="anchor" href="#never-match-user-input-against-these-directly-use-the-input-date-matchers-which-are-anchored.">
<svg class="octicon-link" aria-hidden="true">
<use href="#octicon-link"/>
</svg>
</a>Never match user input against these directly — use the INPUT_DATE_*
matchers, which are anchored.</h2>
<p>Hour is bounded 00-23 and minute 00-59 so the largest representable offset
is 23:59 (86340s), which stays inside Time::Location.fixed's +/-24h limit.
Without these bounds an offset like -9999 passes the match and then raises
Time::Location::InvalidTimezoneOffsetError - a non-CliGen exception that
escapes App#handle_command_raises and reaches the user as a stack trace.</p>
</dd>
<dt class="entry-const" id="UINT">
<strong>UINT</strong> = <code><span class="s">/^[[:digit:]]+$/</span></code>
</dt>