diff --git a/qiskit_ibm_runtime/runtime_program.py b/qiskit_ibm_runtime/runtime_program.py index b6a3ee5bb7..6123641e5c 100644 --- a/qiskit_ibm_runtime/runtime_program.py +++ b/qiskit_ibm_runtime/runtime_program.py @@ -107,7 +107,8 @@ def _format_common(schema: Dict) -> None: formatted.append(" " * 8 + "- " + property_name + ":") for key, value in property_value.items(): formatted.append( - " " * 12 + "{}: {}".format(sentence_case(key), str(value)) + " " * 12 + + "{}: {}".format(camel_to_sentence_case(key), str(value)) ) formatted.append( " " * 12 @@ -115,7 +116,30 @@ def _format_common(schema: Dict) -> None: + str(property_name in schema.get("required", [])) ) - def sentence_case(camel_case_text: str) -> str: + def _format_backend_requirements(schema: Dict) -> None: + """Add backend requirements details to `formatted`.""" + if "min_num_qubits" in schema: + formatted.append( + " " * 4 + + "Minimum number of qubits: {}".format( + str(schema["min_num_qubits"]) + ) + ) + for key, value in schema.items(): + if key not in ["min_num_qubits"]: + formatted.append( + " " * 4 + + "{}: {}".format(snake_to_sentence_case(key), str(value)) + ) + + def snake_to_sentence_case(snake_case_text: str) -> str: + """Converts snake_case to Sentence case""" + snake_case_words = snake_case_text.split("_") + return camel_to_sentence_case( + snake_case_words[0] + "".join(x.title() for x in snake_case_words[1:]) + ) + + def camel_to_sentence_case(camel_case_text: str) -> str: """Converts camelCase to Sentence case""" if camel_case_text == "": return camel_case_text @@ -131,6 +155,12 @@ def sentence_case(camel_case_text: str) -> str: f" Max execution time: {self.max_execution_time}", ] + formatted.append(" Backend requirements:") + if self._backend_requirements: + _format_backend_requirements(self._backend_requirements) + else: + formatted.append(" " * 4 + "none") + formatted.append(" Input parameters:") if self._parameters: _format_common(self._parameters) diff --git a/releasenotes/notes/print-backend-requirements-a682e98ded7977d7.yaml b/releasenotes/notes/print-backend-requirements-a682e98ded7977d7.yaml new file mode 100644 index 0000000000..93cbfa7608 --- /dev/null +++ b/releasenotes/notes/print-backend-requirements-a682e98ded7977d7.yaml @@ -0,0 +1,6 @@ +--- +upgrade: + - | + When printing programs with :meth:`qiskit_ibm_runtime.IBMRuntimeService.pprint_programs`, + ``backend_requirements`` will now be listed. + diff --git a/test/test_programs.py b/test/test_programs.py index bcbfba9907..4f63e5358e 100644 --- a/test/test_programs.py +++ b/test/test_programs.py @@ -77,12 +77,14 @@ def test_print_programs(self, service): self.assertIn(prog.program_id, stdout) self.assertIn(prog.name, stdout) self.assertNotIn(str(prog.max_execution_time), stdout) + self.assertNotIn("Backend requirements", stdout) service.pprint_programs(detailed=True) stdout_detailed = mock_stdout.getvalue() for prog in programs: self.assertIn(prog.program_id, stdout_detailed) self.assertIn(prog.name, stdout_detailed) self.assertIn(str(prog.max_execution_time), stdout_detailed) + self.assertIn("Backend requirements", stdout_detailed) @run_legacy_and_cloud_fake def test_upload_program(self, service):