refactored code into object oriented
will ease adding csv renderer work related to https://bugzilla.ipr.univ-rennes1.fr/show_bug.cgi?id=3368
This commit is contained in:
		
							parent
							
								
									60291a9b76
								
							
						
					
					
						commit
						66058120b2
					
				|  | @ -2,64 +2,85 @@ from typing import List | |||
| from cocluto.inventory import Inventory | ||||
| from cocluto.SimpaDbUtil import SqlDatabaseReader, SqlFile | ||||
| from urllib.parse import urlparse | ||||
| from abc import ABC, abstractmethod | ||||
| import re | ||||
| 
 | ||||
| 
 | ||||
| class Table(): | ||||
|     columns_data: List[List[str]] | ||||
|     column_labels: List[str] | ||||
| 
 | ||||
| def get_md_table_separator_line(columns_width): | ||||
|     sep_line = '|' | ||||
|     for col_width in columns_width: | ||||
|         sep_line += '-' * col_width | ||||
|         sep_line += '|' | ||||
|     return sep_line | ||||
|     def __init__(self): | ||||
|         self.columns_data = [] | ||||
|         self.columns_labels = [] | ||||
| 
 | ||||
| 
 | ||||
| def render_table_md(columns_data, labels): | ||||
|     assert len(labels) == len(columns_data) | ||||
|     num_cols = len(columns_data) | ||||
|     num_rows = len(columns_data[0]) | ||||
|     cols_width = [0 for col in range(num_cols)] | ||||
|     for icol in range(num_cols): | ||||
|         cols_width[icol] = max(cols_width[icol], len(labels[icol])) | ||||
|         for irow in range(num_rows): | ||||
|             cols_width[icol] = max(cols_width[icol], len(columns_data[icol][irow])) | ||||
|     sep_line = get_md_table_separator_line([col_width + 2 for col_width in cols_width]) | ||||
|     line_format = "|" + ''.join([" %%%ds |" % col_width for col_width in cols_width]) | ||||
|     print(sep_line) | ||||
|     print(line_format % tuple(labels)) | ||||
|     print(sep_line) | ||||
|     for irow in range(num_rows): | ||||
|         row = [] | ||||
| class TableRenderer(ABC): | ||||
| 
 | ||||
|     @abstractmethod | ||||
|     def render_table(self, table: Table): | ||||
|         pass | ||||
| 
 | ||||
| 
 | ||||
| class MarkdownTableRenderer(): | ||||
| 
 | ||||
|     @staticmethod | ||||
|     def get_md_table_separator_line(columns_width): | ||||
|         sep_line = '|' | ||||
|         for col_width in columns_width: | ||||
|             sep_line += '-' * col_width | ||||
|             sep_line += '|' | ||||
|         return sep_line | ||||
| 
 | ||||
|     def render_table(self, table: Table): | ||||
|         assert len(table.column_labels) == len(table.columns_data) | ||||
|         num_cols = len(table.columns_data) | ||||
|         num_rows = len(table.columns_data[0]) | ||||
|         cols_width = [0 for col in range(num_cols)] | ||||
|         for icol in range(num_cols): | ||||
|             row.append(columns_data[icol][irow]) | ||||
| 
 | ||||
|         print(line_format % tuple(row)) | ||||
|     print(sep_line) | ||||
| 
 | ||||
| 
 | ||||
| def render_table_wiki(columns_data, labels): | ||||
|     assert len(labels) == len(columns_data) | ||||
|     num_cols = len(columns_data) | ||||
|     num_rows = len(columns_data[0]) | ||||
|     cols_width = [0 for col in range(num_cols)] | ||||
|     for icol in range(num_cols): | ||||
|         cols_width[icol] = max(cols_width[icol], len(labels[icol])) | ||||
|             cols_width[icol] = max(cols_width[icol], len(table.column_labels[icol])) | ||||
|             for irow in range(num_rows): | ||||
|                 cols_width[icol] = max(cols_width[icol], len(table.columns_data[icol][irow])) | ||||
|         sep_line = MarkdownTableRenderer.get_md_table_separator_line([col_width + 2 for col_width in cols_width]) | ||||
|         line_format = "|" + ''.join([" %%%ds |" % col_width for col_width in cols_width]) | ||||
|         print(sep_line) | ||||
|         print(line_format % tuple(table.column_labels)) | ||||
|         print(sep_line) | ||||
|         for irow in range(num_rows): | ||||
|             cols_width[icol] = max(cols_width[icol], len(columns_data[icol][irow])) | ||||
|     cols_width = [col_width + 1 for col_width in cols_width] | ||||
|     header_line_format = "^" + ''.join([" %%%ds ^" % col_width for col_width in cols_width]) | ||||
|     line_format = "|" + ''.join([" %%%ds |" % col_width for col_width in cols_width]) | ||||
|     print(header_line_format % tuple(labels)) | ||||
|     for irow in range(num_rows): | ||||
|         row = [] | ||||
|         for icol in range(num_cols): | ||||
|             row.append(columns_data[icol][irow]) | ||||
|             row = [] | ||||
|             for icol in range(num_cols): | ||||
|                 row.append(table.columns_data[icol][irow]) | ||||
| 
 | ||||
|         print(line_format % tuple(row)) | ||||
|             print(line_format % tuple(row)) | ||||
|         print(sep_line) | ||||
| 
 | ||||
| 
 | ||||
| class WikiTableRenderer(): | ||||
| 
 | ||||
|     def render_table(self, table: Table): | ||||
|         assert len(table.column_labels) == len(table.columns_data) | ||||
|         num_cols = len(table.columns_data) | ||||
|         num_rows = len(table.columns_data[0]) | ||||
|         cols_width = [0 for col in range(num_cols)] | ||||
|         for icol in range(num_cols): | ||||
|             cols_width[icol] = max(cols_width[icol], len(table.column_labels[icol])) | ||||
|             for irow in range(num_rows): | ||||
|                 cols_width[icol] = max(cols_width[icol], len(table.columns_data[icol][irow])) | ||||
|         cols_width = [col_width + 1 for col_width in cols_width] | ||||
|         header_line_format = "^" + ''.join([" %%%ds ^" % col_width for col_width in cols_width]) | ||||
|         line_format = "|" + ''.join([" %%%ds |" % col_width for col_width in cols_width]) | ||||
|         print(header_line_format % tuple(table.column_labels)) | ||||
|         for irow in range(num_rows): | ||||
|             row = [] | ||||
|             for icol in range(num_cols): | ||||
|                 row.append(table.columns_data[icol][irow]) | ||||
| 
 | ||||
|             print(line_format % tuple(row)) | ||||
| 
 | ||||
| 
 | ||||
| def print_machine_table(machines_fqdn: List[str], inventory: Inventory): | ||||
| 
 | ||||
|     table = Table() | ||||
|     machines_name = [] | ||||
|     machines_spec_id = [] | ||||
|     machines_serial_number = [] | ||||
|  | @ -71,12 +92,18 @@ def print_machine_table(machines_fqdn: List[str], inventory: Inventory): | |||
|         machines_name.append(machine_name) | ||||
|         machines_spec_id.append(machine_spec_id) | ||||
|         machines_serial_number.append(serial_number) | ||||
|     name_label = 'Nom' | ||||
|     model_label = 'Modèle' | ||||
|     serial_label = 'Numéro de Série' | ||||
|     table.column_labels = [ | ||||
|         'Nom', | ||||
|         'Modèle', | ||||
|         'Numéro de Série' | ||||
|     ] | ||||
|     table.columns_data = [machines_name, machines_spec_id, machines_serial_number] | ||||
| 
 | ||||
|     render_table_md([machines_name, machines_spec_id, machines_serial_number], [name_label, model_label, serial_label]) | ||||
|     render_table_wiki([machines_name, machines_spec_id, machines_serial_number], [name_label, model_label, serial_label]) | ||||
|     table_renderer = MarkdownTableRenderer() | ||||
|     table_renderer.render_table(table) | ||||
| 
 | ||||
|     table_renderer = WikiTableRenderer() | ||||
|     table_renderer.render_table(table) | ||||
| 
 | ||||
| 
 | ||||
| #  get the list of machines hosted at the dsi | ||||
|  |  | |||
		Loading…
	
		Reference in New Issue