diff --git a/nur_src/cli/ArgsParser.php b/nur_src/cli/ArgsParser.php index 28f9411..18b6205 100644 --- a/nur_src/cli/ArgsParser.php +++ b/nur_src/cli/ArgsParser.php @@ -348,13 +348,16 @@ class ArgsParser { $have_remains = false; $have_help = false; - $sections[] = $this->buildSection([], $defs, $meta, $sdefs, $ldefs, $cdefs, $rdef, $have_remains, $have_help); if ($msections !== null) { - foreach ($msections as $section) { - [$defs, $section] = A::split_assoc($section); - $sections[] = $this->buildSection($section, $defs, $meta, $sdefs, $ldefs, $cdefs, $rdef, $have_remains, $have_help); + foreach ($msections as $msection) { + [$mdefs, $msection] = A::split_assoc($msection); + $sections[] = $this->buildSection($msection, $mdefs, $meta, $sdefs, $ldefs, $cdefs, $rdef, $have_remains, $have_help); } } + # calculer la section par défaut à la fin, pour qu'elle puisse surcharger + # des options définies précédemment. par contre, il faut la mettre au début + # du tableau $sections + array_unshift($sections, $this->buildSection([], $defs, $meta, $sdefs, $ldefs, $cdefs, $rdef, $have_remains, $have_help)); if (!$have_remains && $autoremains) { $def = [ diff --git a/nur_tbin/base/test-args4.php b/nur_tbin/base/test-args4.php new file mode 100644 index 0000000..f3cfbc3 --- /dev/null +++ b/nur_tbin/base/test-args4.php @@ -0,0 +1,39 @@ +query]); + } +} +if (getenv("TA4") === "bad") { + TestArgs4::run(new class extends TestArgs4 { + const ARGS = [ + "merge" => Application::ARGS, + # avant la modification du 13/05/2024 + # la section par défaut est située AVANT les autres sections. les sections + # définies ont donc la priorité + # l'option -q ci-dessous est masquée par l'option -q,--quiet + ["-q", "--query", "args" => "value"], + ]; + }); +} else { + TestArgs4::run(new class extends TestArgs4 { + const ARGS = [ + "merge" => Application::ARGS, + "sections" => [ + [ + "title" => "QUERY", + # en mettant l'option dans une autre section, l'ordre est respecté et + # donc -q n'est plus masqué + ["-q", "--query", "args" => "value"], + ], + ], + ]; + }); +} diff --git a/nur_tests/cli/ArgsParserTest.php b/nur_tests/cli/ArgsParserTest.php index ce12973..1eb9c06 100644 --- a/nur_tests/cli/ArgsParserTest.php +++ b/nur_tests/cli/ArgsParserTest.php @@ -243,20 +243,20 @@ class ArgsParserTest extends TestCase { unset($dest); self::parse($dest, $defs, []); - self::assertObjectNotHasAttribute("enable", $dest); - self::assertObjectHasAttribute("args", $dest); + self::assertObjectNotHasProperty("enable", $dest); + self::assertObjectHasProperty("args", $dest); self::assertSame([], $dest->args); unset($dest); self::parse($dest, $defs, ["x"]); - self::assertObjectNotHasAttribute("enable", $dest); - self::assertObjectHasAttribute("args", $dest); + self::assertObjectNotHasProperty("enable", $dest); + self::assertObjectHasProperty("args", $dest); self::assertSame(["x"], $dest->args); unset($dest); self::parse($dest, $defs, ["x", "-a"]); - self::assertObjectHasAttribute("enable", $dest); - self::assertObjectHasAttribute("args", $dest); + self::assertObjectHasProperty("enable", $dest); + self::assertObjectHasProperty("args", $dest); self::assertSame(1, $dest->enable); self::assertSame(["x"], $dest->args); @@ -579,4 +579,96 @@ class ArgsParserTest extends TestCase { $parser->parse($dest, ["a", "b", "c"]); self::assertSame(["a", "b", "c"], $dest->args); } + + function testOverride() { + $parser = new ArgsParser([ + ["-a", "--o1"], + ["-a", "--o2"], + ["-b", "--v1", "args" => 1], + ["-b", "--v2", "args" => 1], + ["-c", "--x1"], + ["-c", "--x2", "args" => 1], + ]); + $object = new stdClass(); + $object->o1 = 0; + $object->o2 = 0; + $object->v1 = null; + $object->v2 = null; + $object->x1 = 0; + $object->x2 = null; + $parser->parse($object, ["-a", "-b", "valb", "-c", "valc"]); + self::assertSame(0, $object->o1); + self::assertSame(1, $object->o2); + self::assertNull($object->v1); + self::assertSame("valb", $object->v2); + self::assertSame(0, $object->x1); + self::assertSame("valc", $object->x2); + + $parser = new ArgsParser([ + "sections" => [ + [ + ["-a", "--o1"], + ["-b", "--v1", "args" => 1], + ["-c", "--x1"], + ], + [ + ["-a", "--o2"], + ["-b", "--v2", "args" => 1], + ["-c", "--x2", "args" => 1], + ], + ], + ]); + $object = new stdClass(); + $object->o1 = 0; + $object->o2 = 0; + $object->v1 = null; + $object->v2 = null; + $object->x1 = 0; + $object->x2 = null; + $parser->parse($object, ["-a", "-b", "valb", "-c", "valc"]); + self::assertSame(0, $object->o1); + self::assertSame(1, $object->o2); + self::assertNull($object->v1); + self::assertSame("valb", $object->v2); + self::assertSame(0, $object->x1); + self::assertSame("valc", $object->x2); + + $parser = new ArgsParser([ + "merge" => [ + "sections" => [ + [ + "title" => "une section", + ["group", + ["-A", "--g1"], + ["-a", "--g2"], + ], + ], + ], + ], + ["-a", "--o1"], + ["-b", "--v1", "args" => 1], + ["-c", "--x1"], + ["-a", "--o2"], + ["-b", "--v2", "args" => 1], + ["-c", "--x2", "args" => 1], + ]); + $object = new stdClass(); + $object->g1 = 0; + $object->g2 = 0; + $object->o1 = 0; + $object->o2 = 0; + $object->v1 = null; + $object->v2 = null; + $object->x1 = 0; + $object->x2 = null; + $parser->parse($object, ["-a", "-b", "valb", "-c", "valc"]); + self::assertSame(0, $object->g1); + self::assertSame(0, $object->g2); + self::assertSame(0, $object->o1); + self::assertSame(1, $object->o2); + self::assertNull($object->v1); + self::assertSame("valb", $object->v2); + self::assertSame(0, $object->x1); + self::assertSame("valc", $object->x2); + } }