modifs.mineures sans commentaires

This commit is contained in:
Jephté Clain 2025-10-09 16:29:02 +04:00
parent 0e3c53dd98
commit 2635e497ca
4 changed files with 382 additions and 223 deletions

View File

@ -1,8 +1,10 @@
# nulib\output
* dans msg::action($m, function() {}), *bloquer* la marque pour empêcher d'aller
plus bas que prévu. comme ça s'il y a plusieurs success ou failure dans la
fonction, c'est affiché correctement.
* [ ] vérifier que la date affichée pour un TITLE est celle à laquelle l'appel
a été fait, même si le premier événement en dessous arrive bien plus tard
* [ ] pareil pour action: sauf si c'est une seule ligne, la date de action est
la date du premier appel, alors que la date de $result est celui du result si
c'est affiché sur une autre ligne
* [ ] possibilité de paramétrer le nom du fichier destination pour faire une
rotation des logs
@ -13,11 +15,6 @@
* [ ] dans `StdMessenger::resetParams()`, `[output]` peut être une instance de
StdOutput pour mettre à jour $out ET $err, ou un tableau de deux éléments pour
mettre à jour séparément $out et $err
* [ ] vérifier que la date affichée pour un TITLE est celle à laquelle l'appel
a été fait, même si le premier événement en dessous arrive bien plus tard
* [ ] pareil pour action: sauf si c'est une seule ligne, la date de action est
la date du premier appel, alors que la date de $result est celui du result si
c'est affiché sur une autre ligne
* réorganiser pour que msg:: attaque un proxy dans lequel est configuré un
ensemble standard de sorties: say, log, debuglog
* `--aD, --av, --aq, --asilent` pour les valeurs d'ajustement qui sont un

View File

@ -177,6 +177,7 @@ class ConsoleMessenger extends AbstractMessenger {
$this->titles[] = ["id" => $this->lastTitleId++];
A::merge($this->titles[array_key_last($this->titles)], [
"title_level" => $titleLevel,
"max_title_level" => null,
"line_prefix" => $this->getLinePrefix(),
"level" => $level,
"content" => $content,
@ -186,8 +187,11 @@ class ConsoleMessenger extends AbstractMessenger {
]);
if ($func !== null) {
try {
$title =& $this->titles[array_key_last($this->titles)];
$title["max_title_level"] = $titleLevel + 1;
$func($this);
} finally {
$title["max_title_level"] = null;
$this->_endTitle($titleLevel);
}
}
@ -201,7 +205,7 @@ class ConsoleMessenger extends AbstractMessenger {
"content" => $content,
];
$key = array_key_last($this->titles);
if (array_key_exists($key, $this->titles)) {
if ($key !== null) {
$title =& $this->titles[$key];
$title["descs"][] = $desc;
$title["print_descs"] = true;
@ -241,6 +245,8 @@ class ConsoleMessenger extends AbstractMessenger {
}
function _endTitle(?int $until=null): void {
$title = $this->titles[array_key_last($this->titles)];
$until ??= $title["max_title_level"];
$until ??= $this->_getTitleMark() - 1;
while (count($this->titles) > $until) {
array_pop($this->titles);
@ -298,6 +304,7 @@ class ConsoleMessenger extends AbstractMessenger {
$this->actions[] = ["id" => $this->lastActionId++];
A::merge($this->actions[array_key_last($this->actions)], [
"action_level" => $actionLevel,
"max_action_level" => null,
"line_prefix" => $this->getLinePrefix(),
"level" => $level,
"content" => $content,
@ -307,6 +314,8 @@ class ConsoleMessenger extends AbstractMessenger {
]);
if ($func !== null) {
try {
$action =& $this->actions[array_key_last($this->actions)];
$action["max_action_level"] = $actionLevel + 1;
$result = $func($this);
if ($this->_getActionMark() > $actionLevel) {
$this->aresult($result);
@ -315,6 +324,7 @@ class ConsoleMessenger extends AbstractMessenger {
$this->afailure($e);
throw $e;
} finally {
$action["max_action_level"] = null;
$this->_endAction($actionLevel);
}
}
@ -359,7 +369,9 @@ class ConsoleMessenger extends AbstractMessenger {
}
function _endAction(?int $until=null): void {
if ($until === null) $until = $this->_getActionMark() - 1;
$action = $this->actions[array_key_last($this->actions)];
$until ??= $action["max_action_level"];
$until ??= $this->_getActionMark() - 1;
while (count($this->actions) > $until) {
array_pop($this->actions);
}

View File

@ -39,6 +39,8 @@ class LogMessenger extends AbstractMessenger {
$this->dateFormat = $dateFormat;
$this->id = $id;
$this->showIds = $showIds;
$this->titles = [];
$this->actions = [];
}
function resetParams(?array $params=null): void {
@ -97,7 +99,7 @@ class LogMessenger extends AbstractMessenger {
$this->end(true);
}
protected array $titles = [];
protected array $titles;
function _getTitleMark(): int {
return count($this->titles);
@ -113,6 +115,7 @@ class LogMessenger extends AbstractMessenger {
$this->titles[] = [
"id" => $this->lastTitleId++,
"title_level" => $titleLevel,
"max_title_level" => null,
];
$this->_printTitle(
$this->getLinePrefix(), $level,
@ -120,8 +123,11 @@ class LogMessenger extends AbstractMessenger {
$titleLevel, $this->out);
if ($func !== null) {
try {
$title =& $this->titles[array_key_last($this->titles)];
$title["max_title_level"] = $titleLevel + 1;
$func($this);
} finally {
$title["max_title_level"] = null;
$this->_endTitle($titleLevel);
}
}
@ -138,13 +144,15 @@ class LogMessenger extends AbstractMessenger {
}
function _endTitle(?int $until=null): void {
$title = $this->titles[array_key_last($this->titles)];
$until ??= $title["max_title_level"];
$until ??= $this->_getTitleMark() - 1;
while (count($this->titles) > $until) {
array_pop($this->titles);
}
}
protected array $actions = [];
protected array $actions;
function _getActionMark(): int {
return count($this->actions);
@ -160,6 +168,7 @@ class LogMessenger extends AbstractMessenger {
$this->actions[] = [
"id" => $this->lastActionId++,
"action_level" => $actionLevel,
"max_action_level" => null,
"level" => $level
];
$this->_printAction(
@ -169,6 +178,8 @@ class LogMessenger extends AbstractMessenger {
$actionLevel, $this->out);
if ($func !== null) {
try {
$action =& $this->actions[array_key_last($this->actions)];
$action["max_action_level"] = $actionLevel + 1;
$result = $func($this);
if ($this->_getActionMark() > $actionLevel) {
$this->aresult($result);
@ -177,6 +188,7 @@ class LogMessenger extends AbstractMessenger {
$this->afailure($e);
throw $e;
} finally {
$action["max_action_level"] = null;
$this->_endAction($actionLevel);
}
}
@ -236,6 +248,8 @@ class LogMessenger extends AbstractMessenger {
}
function _endAction(?int $until=null): void {
$action = $this->actions[array_key_last($this->actions)];
$until ??= $action["max_action_level"];
$until ??= $this->_getActionMark() - 1;
while (count($this->actions) > $until) {
array_pop($this->actions);

View File

@ -45,245 +45,381 @@ $msg = new $class($params);
###############################################################################
$msg->title("title0");
$msg->desc("desc0");
$msg->title("title1");
$msg->desc("desc1");
$msg->print("print under title1");
$msg->end();
$msg->print("print under title0");
$msg->end();
$titles = 1;
$maxTitleLevel = 0;
$actions = 1;
$maxActionLevel = 0;
$levels = 1;
$complete = 1;
$multilines = 1;
$exceptions = 1;
$msg->desc("action avec step");
$msg->action("action avec step");
$msg->step("step");
$msg->asuccess("action success");
if ($titles) {
$msg->title("title0");
$msg->desc("desc0");
$msg->title("title1");
$msg->desc("desc1");
$msg->print("print under title1");
$msg->end();
$msg->print("print under title0");
$msg->end();
$msg->print("print out of title");
}
$msg->action("action avec step");
$msg->step("step");
$msg->afailure("action failure");
if ($maxTitleLevel) {
$msg->info("test maxTitleLevel");
$msg->title("1first", function(IMessenger $msg) {
$msg->info("1one");
$msg->end();
$msg->info("1two");
$msg->end();
$msg->info("1three");
});
$msg->info("0one");
$msg->end();
$msg->info("0two");
$msg->end();
$msg->info("0three");
$msg->action("action avec step");
$msg->step("step");
$msg->adone("action neutral");
$msg->desc("actions sans step");
$msg->action("action sans step");
$msg->asuccess("action success");
$msg->action("action sans step");
$msg->afailure("action failure");
$msg->action("action sans step");
$msg->adone("action neutral");
$msg->desc("actions imbriquées");
$msg->action("action0");
$msg->action("action1");
$msg->action("action2");
$msg->asuccess("action2 success");
$msg->asuccess("action1 success");
$msg->asuccess("action0 success");
$msg->desc("action avec step, sans messages");
$msg->action("action avec step, sans messages, success");
$msg->step("step");
$msg->asuccess();
$msg->action("action avec step, sans messages, failure");
$msg->step("step");
$msg->afailure();
$msg->action("action avec step, sans messages, done");
$msg->step("step");
$msg->adone();
$msg->desc("action sans step, sans messages");
$msg->action("action sans step, sans messages, success");
$msg->asuccess();
$msg->action("action sans step, sans messages, failure");
$msg->afailure();
$msg->action("action sans step, sans messages, done");
$msg->adone();
$msg->desc("actions imbriquées, sans messages");
$msg->action("action0");
$msg->action("action1");
$msg->action("action2");
$msg->asuccess();
$msg->asuccess();
$msg->asuccess();
$msg->info("info");
$msg->note("note");
$msg->warning("warning");
$msg->error("error");
$msg->section("section", function (IMessenger $msg) {
$msg->title("title", function (IMessenger $msg) {
$msg->desc("desc");
$msg->print("print");
$msg->desc("action avec step");
$msg->action("action avec step", function (IMessenger $msg) {
$msg->step("step");
$msg->asuccess("action success");
});
$msg->action("action avec step", function (IMessenger $msg) {
$msg->step("step");
$msg->afailure("action failure");
});
$msg->action("action avec step", function (IMessenger $msg) {
$msg->step("step");
$msg->adone("action done");
});
$msg->desc("actions sans step");
$msg->action("action sans step", function (IMessenger $msg) {
$msg->asuccess("action success");
});
$msg->action("action sans step", function (IMessenger $msg) {
$msg->afailure("action failure");
});
$msg->action("action sans step", function (IMessenger $msg) {
$msg->adone("action done");
});
$msg->desc("actions imbriquées");
$msg->action("action0", function (IMessenger $msg) {
$msg->action("action1", function (IMessenger $msg) {
$msg->action("action2", function (IMessenger $msg) {
$msg->asuccess("action2 success");
});
$msg->asuccess("action1 success");
$msg->title("2first", function(IMessenger $msg) {
$msg->title("3second", function(IMessenger $msg) {
$msg->title("4third", function(IMessenger $msg) {
$msg->info("4one");
$msg->end();
$msg->info("4two");
$msg->end();
$msg->info("4three");
});
$msg->asuccess("action0 success");
$msg->info("3four");
$msg->end();
$msg->info("3five");
$msg->end();
$msg->info("3six");
});
$msg->info("2seven");
$msg->end();
$msg->info("2eight");
$msg->end();
$msg->info("2nine");
});
$msg->info("1one");
$msg->end();
$msg->info("1two");
$msg->end();
$msg->info("1three");
}
$msg->desc("action avec step, sans messages");
$msg->action("action avec step, sans messages, success", function (IMessenger $msg) {
$msg->step("step");
$msg->asuccess();
if ($actions) {
$msg->desc("action avec step");
$msg->action("action avec step");
$msg->step("step");
$msg->asuccess("action success");
$msg->action("action avec step");
$msg->step("step");
$msg->afailure("action failure");
$msg->action("action avec step");
$msg->step("step");
$msg->adone("action neutral");
$msg->desc("actions sans step");
$msg->action("action sans step");
$msg->asuccess("action success");
$msg->action("action sans step");
$msg->afailure("action failure");
$msg->action("action sans step");
$msg->adone("action neutral");
$msg->desc("actions imbriquées");
$msg->action("action0");
$msg->action("action1");
$msg->action("action2");
$msg->asuccess("action2 success");
$msg->asuccess("action1 success");
$msg->asuccess("action0 success");
$msg->desc("action avec step, sans messages");
$msg->action("action avec step, sans messages, success");
$msg->step("step");
$msg->asuccess();
$msg->action("action avec step, sans messages, failure");
$msg->step("step");
$msg->afailure();
$msg->action("action avec step, sans messages, done");
$msg->step("step");
$msg->adone();
$msg->desc("action sans step, sans messages");
$msg->action("action sans step, sans messages, success");
$msg->asuccess();
$msg->action("action sans step, sans messages, failure");
$msg->afailure();
$msg->action("action sans step, sans messages, done");
$msg->adone();
$msg->desc("actions imbriquées, sans messages");
$msg->action("action0");
$msg->action("action1");
$msg->action("action2");
$msg->asuccess();
$msg->asuccess();
$msg->asuccess();
}
if ($maxActionLevel) {
$msg->info("test maxActionLevel");
$msg->action("first1", function (IMessenger $msg) {
$msg->info("one");
$msg->end();
$msg->info("two");
$msg->end();
$msg->info("three");
});
$msg->action("first2", function (IMessenger $msg) {
$msg->info("one");
$msg->adone();
$msg->info("two");
$msg->adone();
$msg->info("three");
});
$msg->action("first3", function (IMessenger $msg) {
$msg->action("second", function (IMessenger $msg) {
$msg->action("third", function (IMessenger $msg) {
$msg->info("one");
$msg->end();
$msg->info("two");
$msg->end();
$msg->info("three");
});
$msg->info("four");
$msg->end();
$msg->info("five");
$msg->end();
$msg->info("six");
});
$msg->info("seven");
$msg->end();
$msg->info("eight");
$msg->end();
$msg->info("nine");
});
$msg->info("ten");
$msg->end();
$msg->info("eleven");
$msg->end();
$msg->info("twelve");
$msg->action("action avec step, sans messages, failure", function (IMessenger $msg) {
$msg->step("step");
$msg->afailure();
});
$msg->action("action avec step, sans messages, done", function (IMessenger $msg) {
$msg->step("step");
$msg->action("first4", function (IMessenger $msg) {
$msg->action("second", function (IMessenger $msg) {
$msg->action("third", function (IMessenger $msg) {
$msg->info("one");
$msg->adone();
$msg->info("two");
$msg->adone();
$msg->info("three");
});
$msg->info("four");
$msg->adone();
});
$msg->desc("action sans step, sans messages");
$msg->action("action sans step, sans messages, success", function (IMessenger $msg) {
$msg->asuccess();
});
$msg->action("action sans step, sans messages, failure", function (IMessenger $msg) {
$msg->afailure();
});
$msg->action("action sans step, sans messages, done", function (IMessenger $msg) {
$msg->info("five");
$msg->adone();
$msg->info("six");
});
$msg->info("seven");
$msg->adone();
$msg->info("eight");
$msg->adone();
$msg->info("nine");
});
$msg->info("ten");
$msg->adone();
$msg->info("eleven");
$msg->adone();
$msg->info("twelve");
}
$msg->desc("actions imbriquées, sans messages");
$msg->action("action0", function (IMessenger $msg) {
$msg->action("action1", function (IMessenger $msg) {
$msg->action("action2", function (IMessenger $msg) {
if ($levels) {
$msg->info("info");
$msg->note("note");
$msg->warning("warning");
$msg->error("error");
}
if ($complete) {
$msg->section("section", function (IMessenger $msg) {
$msg->title("title", function (IMessenger $msg) {
$msg->desc("desc");
$msg->print("print");
$msg->desc("action avec step");
$msg->action("action avec step", function (IMessenger $msg) {
$msg->step("step");
$msg->asuccess("action success");
});
$msg->action("action avec step", function (IMessenger $msg) {
$msg->step("step");
$msg->afailure("action failure");
});
$msg->action("action avec step", function (IMessenger $msg) {
$msg->step("step");
$msg->adone("action done");
});
$msg->desc("actions sans step");
$msg->action("action sans step", function (IMessenger $msg) {
$msg->asuccess("action success");
});
$msg->action("action sans step", function (IMessenger $msg) {
$msg->afailure("action failure");
});
$msg->action("action sans step", function (IMessenger $msg) {
$msg->adone("action done");
});
$msg->desc("actions imbriquées");
$msg->action("action0", function (IMessenger $msg) {
$msg->action("action1", function (IMessenger $msg) {
$msg->action("action2", function (IMessenger $msg) {
$msg->asuccess("action2 success");
});
$msg->asuccess("action1 success");
});
$msg->asuccess("action0 success");
});
$msg->desc("action avec step, sans messages");
$msg->action("action avec step, sans messages, success", function (IMessenger $msg) {
$msg->step("step");
$msg->asuccess();
});
$msg->action("action avec step, sans messages, failure", function (IMessenger $msg) {
$msg->step("step");
$msg->afailure();
});
$msg->action("action avec step, sans messages, done", function (IMessenger $msg) {
$msg->step("step");
$msg->adone();
});
$msg->desc("action sans step, sans messages");
$msg->action("action sans step, sans messages, success", function (IMessenger $msg) {
$msg->asuccess();
});
$msg->action("action sans step, sans messages, failure", function (IMessenger $msg) {
$msg->afailure();
});
$msg->action("action sans step, sans messages, done", function (IMessenger $msg) {
$msg->adone();
});
$msg->desc("actions imbriquées, sans messages");
$msg->action("action0", function (IMessenger $msg) {
$msg->action("action1", function (IMessenger $msg) {
$msg->action("action2", function (IMessenger $msg) {
$msg->asuccess();
});
$msg->asuccess();
});
$msg->asuccess();
});
$msg->asuccess();
});
$msg->desc("action avec step, avec code de retour");
$msg->action("action avec step, avec code de retour true", function (IMessenger $msg) {
$msg->step("step");
return true;
});
$msg->desc("action avec step, avec code de retour");
$msg->action("action avec step, avec code de retour true", function (IMessenger $msg) {
$msg->step("step");
return true;
});
$msg->action("action avec step, avec code de retour false", function (IMessenger $msg) {
$msg->step("step");
return false;
});
$msg->action("action avec step, avec code de retour false", function (IMessenger $msg) {
$msg->step("step");
return false;
});
$msg->action("action avec step, avec code de retour autre", function (IMessenger $msg) {
$msg->step("step");
return "autre";
});
$msg->action("action avec step, avec code de retour autre", function (IMessenger $msg) {
$msg->step("step");
return "autre";
});
$msg->action("action avec step, avec code de retour null", function (IMessenger $msg) {
$msg->step("step");
});
$msg->action("action avec step, avec code de retour null", function (IMessenger $msg) {
$msg->step("step");
});
$msg->desc("action sans step, avec code de retour");
$msg->action("action sans step, avec code de retour true", function (IMessenger $msg) {
return true;
});
$msg->desc("action sans step, avec code de retour");
$msg->action("action sans step, avec code de retour true", function (IMessenger $msg) {
return true;
});
$msg->action("action sans step, avec code de retour false", function (IMessenger $msg) {
return false;
});
$msg->action("action sans step, avec code de retour false", function (IMessenger $msg) {
return false;
});
$msg->action("action sans step, avec code de retour autre", function (IMessenger $msg) {
return "autre";
});
$msg->action("action sans step, avec code de retour autre", function (IMessenger $msg) {
return "autre";
});
# ici, il n'y aura pas de message du tout
$msg->action("action sans step, avec code de retour null", function (IMessenger $msg) {
});
# ici, il n'y aura pas de message du tout
$msg->action("action sans step, avec code de retour null", function (IMessenger $msg) {
});
$msg->info("info");
$msg->note("note");
$msg->warning("warning");
$msg->error("error");
$msg->info("info");
$msg->note("note");
$msg->warning("warning");
$msg->error("error");
});
});
});
}
$msg->section("multi-line\nsection", function (IMessenger $msg) {
$msg->title("multi-line\ntitle");
$msg->title("another\ntitle");
if ($multilines) {
$msg->section("multi-line\nsection", function (IMessenger $msg) {
$msg->title("multi-line\ntitle");
$msg->title("another\ntitle");
$msg->print("multi-line\nprint");
$msg->info("multi-line\ninfo");
$msg->action("multi-line\naction");
$msg->asuccess();
$msg->action("multi-line\naction");
$msg->step("multi-line\nstep");
$msg->afailure();
$msg->action("multi-line\naction");
$msg->step("multi-line\nstep");
$msg->asuccess("multi-line\nsuccess");
$msg->action("multi-line\naction");
$msg->step("multi-line\nstep");
$msg->adone("multi-line\ndone");
$msg->print("multi-line\nprint");
$msg->info("multi-line\ninfo");
$msg->action("multi-line\naction");
$msg->asuccess();
$msg->action("multi-line\naction");
$msg->step("multi-line\nstep");
$msg->afailure();
$msg->action("multi-line\naction");
$msg->step("multi-line\nstep");
$msg->asuccess("multi-line\nsuccess");
$msg->action("multi-line\naction");
$msg->step("multi-line\nstep");
$msg->adone("multi-line\ndone");
$msg->end();
$msg->end();
});
$msg->section("Exceptions", function (IMessenger $msg) {
$e = new Exception("message");
$u1 = new UserException("userMessage");
$u2 = (new UserException("userMessage"))->setTechMessage("techMessage");
$msg->title("avec message", function (IMessenger $msg) use ($e, $u1, $u2) {
$msg->info(["exception", $e]);
$msg->info(["userException1", $u1]);
$msg->info(["userException2", $u2]);
$msg->end();
$msg->end();
});
$msg->title("sans message", function (IMessenger $msg) use ($e, $u1, $u2) {
$msg->info($e);
$msg->info($u1);
$msg->info($u2);
}
if ($exceptions) {
$msg->section("Exceptions", function (IMessenger $msg) {
$e = new Exception("message");
$u1 = new UserException("userMessage");
$u2 = (new UserException("userMessage"))->setTechMessage("techMessage");
$msg->title("avec message", function (IMessenger $msg) use ($e, $u1, $u2) {
$msg->info(["exception", $e]);
$msg->info(["userException1", $u1]);
$msg->info(["userException2", $u2]);
});
$msg->title("sans message", function (IMessenger $msg) use ($e, $u1, $u2) {
$msg->info($e);
$msg->info($u1);
$msg->info($u2);
});
});
});
}