def _get_scenario_group_info(self, query): try: scenario_group = scenario_base.Scenario.get_by_name(query) info = ("%s (benchmark scenario group).\n\n" % scenario_group.__name__) info += utils.format_docstring(scenario_group.__doc__) info += "\nBenchmark scenarios:\n" scenarios = scenario_group.list_benchmark_scenarios() first_column_len = max(map(len, scenarios)) + cliutils.MARGIN second_column_len = len("Description") + cliutils.MARGIN table = "" for scenario_name in scenarios: cls, method_name = scenario_name.split(".") if hasattr(scenario_group, method_name): scenario = getattr(scenario_group, method_name) doc = utils.parse_docstring(scenario.__doc__) descr = doc["short_description"] or "" second_column_len = max(second_column_len, len(descr) + cliutils.MARGIN) table += " " + scenario_name table += " " * (first_column_len - len(scenario_name)) table += descr + "\n" info += "-" * (first_column_len + second_column_len + 1) + "\n" info += (" Name" + " " * (first_column_len - len("Name")) + "Description\n") info += "-" * (first_column_len + second_column_len + 1) + "\n" info += table return info except exceptions.NoSuchScenario: return None
def find(self, query): """Search for an entity that matches the query and print info about it. :param query: search query. """ scenario_group = searchutils.find_benchmark_scenario_group(query) if scenario_group: print("%s (benchmark scenario group).\n" % scenario_group.__name__) # TODO(msdubov): Provide all scenario classes with docstrings. doc = utils.format_docstring(scenario_group.__doc__) print(doc) return scenario = searchutils.find_benchmark_scenario(query) if scenario: print("%(scenario_group)s.%(scenario_name)s " "(benchmark scenario).\n" % {"scenario_group": utils.get_method_class(scenario).__name__, "scenario_name": scenario.__name__}) doc = utils.parse_docstring(scenario.__doc__) print(doc["short_description"] + "\n") if doc["long_description"]: print(doc["long_description"] + "\n") if doc["params"]: print("Parameters:") for param in doc["params"]: print(" - %(name)s: %(doc)s" % param) if doc["returns"]: print("Returns: %s" % doc["returns"]) return print("Failed to find any docs for query: '%s'" % query) return 1
def _get_scenario_info(self, query): try: scenario = scenario_base.Scenario.get_scenario_by_name(query) scenario_group_name = utils.get_method_class(scenario).__name__ header = ("%(scenario_group)s.%(scenario_name)s " "(benchmark scenario)" % {"scenario_group": scenario_group_name, "scenario_name": scenario.__name__}) info = self._make_header(header) info += "\n\n" doc = utils.parse_docstring(scenario.__doc__) if not doc["short_description"]: return None info += doc["short_description"] + "\n\n" if doc["long_description"]: info += doc["long_description"] + "\n\n" if doc["params"]: info += "Parameters:\n" for param in doc["params"]: info += " - %(name)s: %(doc)s" % param + "\n" if doc["returns"]: info += "Returns: %s" % doc["returns"] return info except exceptions.NoSuchScenario: return None
def _get_descriptions(self, base_cls): descriptions = [] for entity in utils.itersubclasses(base_cls): name = entity.__name__ doc = utils.parse_docstring(entity.__doc__) description = doc["short_description"] or "" descriptions.append((name, description)) return descriptions
def _compose_action_description(action_fn): description = "" if action_fn.__doc__: parsed_doc = utils.parse_docstring(action_fn.__doc__) short = parsed_doc.get("short_description") long = parsed_doc.get("long_description") description = "%s\n\n%s" % (short, long) if long else short return description
def _get_descriptions(self, base_cls, subclass_filter=None): descriptions = [] subclasses = utils.itersubclasses(base_cls) if subclass_filter: subclasses = filter(subclass_filter, subclasses) for entity in subclasses: name = entity.__name__ doc = utils.parse_docstring(entity.__doc__) description = doc["short_description"] or "" descriptions.append((name, description)) descriptions.sort(key=lambda d: d[0]) return descriptions
def test_parse_incomplete_docstring(self): docstring = """One-line description. :param p1: Param 1 description. :param p2: Param 2 description. """ dct = utils.parse_docstring(docstring) expected = { "short_description": "One-line description.", "long_description": None, "params": [{"name": "p1", "doc": "Param 1 description."}, {"name": "p2", "doc": "Param 2 description."}], "returns": None } self.assertEqual(dct, expected)
def test_parse_docstring_with_no_params(self): docstring = """One-line description. Multi- line- description. :returns: Return value description. """ dct = utils.parse_docstring(docstring) expected = { "short_description": "One-line description.", "long_description": "Multi-\nline-\ndescription.", "params": [], "returns": "Return value description." } self.assertEqual(dct, expected)
def _get_scenario_group_info(self, query): try: scenario_group = scenario_base.Scenario.get_by_name(query) if not any(scenario_base.Scenario.is_scenario(scenario_group, m) for m in dir(scenario_group)): return None info = self._make_header("%s (benchmark scenario group)" % scenario_group.__name__) info += "\n\n" info += utils.format_docstring(scenario_group.__doc__) scenarios = scenario_group.list_benchmark_scenarios() descriptions = [] for scenario_name in scenarios: cls, method_name = scenario_name.split(".") if hasattr(scenario_group, method_name): scenario = getattr(scenario_group, method_name) doc = utils.parse_docstring(scenario.__doc__) descr = doc["short_description"] or "" descriptions.append((scenario_name, descr)) info += self._compose_table("Benchmark scenarios", descriptions) return info except exceptions.NoSuchScenario: return None
def _compose_category_description(category): descr_pairs = _methods_of(category) description = "" doc = category.__doc__ if doc: description = doc.strip() if descr_pairs: description += "\n\nCommands:\n" sublen = lambda item: len(item[0]) first_column_len = max(map(sublen, descr_pairs)) + MARGIN for item in descr_pairs: name = item[0] if item[1].__doc__: doc = utils.parse_docstring( item[1].__doc__)["short_description"] else: doc = "" name += " " * (first_column_len - len(name)) description += " %s%s\n" % (name, doc) return description
def _get_scenario_info(self, query): try: scenario = scenario_base.Scenario.get_scenario_by_name(query) scenario_group_name = utils.get_method_class(scenario).__name__ info = ("%(scenario_group)s.%(scenario_name)s " "(benchmark scenario).\n\n" % { "scenario_group": scenario_group_name, "scenario_name": scenario.__name__ }) doc = utils.parse_docstring(scenario.__doc__) if not doc["short_description"]: return None info += doc["short_description"] + "\n\n" if doc["long_description"]: info += doc["long_description"] + "\n\n" if doc["params"]: info += "Parameters:\n" for param in doc["params"]: info += " - %(name)s: %(doc)s" % param + "\n" if doc["returns"]: info += "Returns: %s" % doc["returns"] return info except exceptions.NoSuchScenario: return None