[docs]@dataclassclassCsvGenerator(Generator):""" Generates CSV summaries Note: this generator is not widely used, and has largely been supplanted by schemasheets """# ClassVarsgeneratorname=os.path.basename(__file__)generatorversion="0.1.1"valid_formats=["csv","tsv"]uses_schemaloader=Truerequires_metamodel=False# ObjectVarssep:Optional[str]=None"""Separator for columns"""closure:Optional[set[ClassDefinitionName]]=None"""List of classes to include in output"""writer:Optional[DictWriter]=None"""Python dictwriter"""_str_io:Optional[StringIO]=None"""String that the writer outputs to"""def__post_init__(self):super().__post_init__()self._str_io=Noneself.generate_header()# TODO: don't do this in initialization
[docs]defvisit_schema(self,classes:list[ClassDefinitionName]=None,**_)->None:# Note: classes comes from the "root" argumentself.closure=set()ifclassesisNone:classes=[]# Validate the supplied list of classesforclsnameinclasses:ifclsnamenotinself.schema.classes:raiseValueError(f"Unrecognized class: {clsname}")else:self.closure.update(self.ancestors(self.schema.classes[clsname]))self._str_io=StringIO()dialect:str="excel"ifself.format=="csv"else"excel-tab"self.writer=DictWriter(self._str_io,["id","mappings","description"],dialect=dialect)self.writer.writeheader()
[docs]defvisit_class(self,cls:ClassDefinition)->bool:# TODO: find out what to do with mappingsifnotself.closureorcls.nameinself.closure:self.writer.writerow({"id":underscore(cls.name),# 'mappings': "|".join(cls.mappings),"mappings":"","description":be(cls.description),})returnTruereturnFalse
@shared_arguments(CsvGenerator)@click.command(name="csv")@click.version_option(__version__,"-V","--version")@click.option("--root","-r",multiple=True,help="Class(es) to transform")defcli(yamlfile,root=None,**args):"""Generate CSV/TSV file from LinkML model"""print(CsvGenerator(yamlfile,**args).serialize(classes=root,**args))if__name__=="__main__":cli()