On 16/04/2024 10:03, Juraj Linkeš wrote:
+@dataclass
+class TestPmdPort(TextParser):

This and the classes above are missing docstrings.

Ack.

@@ -225,6 +664,38 @@ def set_forward_mode(self, mode: TestPmdForwardingModes, 
verify: bool = True):
                  f"Test pmd failed to set fwd mode to {mode.value}"
              )

+    def show_port_info_all(self) -> list[TestPmdPort]:
+        """Returns the information of all the ports."""

Can we add sample output so that the format of what we're trying to
parse is clear?

Ack.

+        output = self.send_command("show port info all")
+
+        ports = []
+        iter = re.finditer(r"\*+.+\*+", output)
+        if next(iter, False):  # we are slicing retrospectively, skip first 
block
+            start_pos = 0
+            for block in iter:
+                end_pos = block.start()
+                ports.append(TestPmdPort.parse(output[start_pos:end_pos]))
+                start_pos = end_pos
+
+            ports.append(TestPmdPort.parse(output[start_pos:]))
+
+        return ports

Can this be done the same way it's done in the last commit?

iter = re.finditer(r"(^  #*.+#*$[^#]+)^  #*$", output, re.MULTILINE)
return [TestPmdPortStats.parse(block.group(1)) for block in iter]

Looks much better.

I agree that it looks much better. I gave it a first attempt to come up with a regular expression that is not too complicated and is able to match blocks individually. I've noticed that blocks start with:

  \n********* Infos for port X ************

but don't have an actual ending delimiter, unlike for the stats. I'll experiment with some look ahead constructs. The easiest solution is to match everything that is not * ([^*]+) but can we be certain that there won't be any asterisk in the actual information?

Reply via email to