mirror of
				https://github.com/mfulz/qmk_firmware.git
				synced 2025-10-31 05:12:33 +01:00 
			
		
		
		
	qmk info: Add --ascii flag (#10793)
				
					
				
			* `qmk info`: Add `--ascii` flag * Fix typo * Force ASCII for Windows/MSYS2 * Make it gooder * Remove redundant windows check * ...And this too * Make pytest work on Windows
This commit is contained in:
		
							parent
							
								
									dc40f00aaf
								
							
						
					
					
						commit
						e69da2db2c
					
				| @ -3,6 +3,7 @@ | |||||||
| Compile an info.json for a particular keyboard and pretty-print it. | Compile an info.json for a particular keyboard and pretty-print it. | ||||||
| """ | """ | ||||||
| import json | import json | ||||||
|  | import platform | ||||||
| 
 | 
 | ||||||
| from milc import cli | from milc import cli | ||||||
| 
 | 
 | ||||||
| @ -12,6 +13,8 @@ from qmk.keymap import locate_keymap | |||||||
| from qmk.info import info_json | from qmk.info import info_json | ||||||
| from qmk.path import is_keyboard | from qmk.path import is_keyboard | ||||||
| 
 | 
 | ||||||
|  | platform_id = platform.platform().lower() | ||||||
|  | 
 | ||||||
| ROW_LETTERS = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnop' | ROW_LETTERS = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnop' | ||||||
| COL_LETTERS = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijilmnopqrstuvwxyz' | COL_LETTERS = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijilmnopqrstuvwxyz' | ||||||
| 
 | 
 | ||||||
| @ -36,13 +39,13 @@ def show_keymap(kb_info_json, title_caps=True): | |||||||
|             else: |             else: | ||||||
|                 cli.echo('{fg_cyan}layer_%s{fg_reset}:', layer_num) |                 cli.echo('{fg_cyan}layer_%s{fg_reset}:', layer_num) | ||||||
| 
 | 
 | ||||||
|             print(render_layout(kb_info_json['layouts'][layout_name]['layout'], layer)) |             print(render_layout(kb_info_json['layouts'][layout_name]['layout'], cli.config.info.ascii, layer)) | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
| def show_layouts(kb_info_json, title_caps=True): | def show_layouts(kb_info_json, title_caps=True): | ||||||
|     """Render the layouts with info.json labels. |     """Render the layouts with info.json labels. | ||||||
|     """ |     """ | ||||||
|     for layout_name, layout_art in render_layouts(kb_info_json).items(): |     for layout_name, layout_art in render_layouts(kb_info_json, cli.config.info.ascii).items(): | ||||||
|         title = layout_name.title() if title_caps else layout_name |         title = layout_name.title() if title_caps else layout_name | ||||||
|         cli.echo('{fg_cyan}%s{fg_reset}:', title) |         cli.echo('{fg_cyan}%s{fg_reset}:', title) | ||||||
|         print(layout_art)  # Avoid passing dirty data to cli.echo() |         print(layout_art)  # Avoid passing dirty data to cli.echo() | ||||||
| @ -69,7 +72,7 @@ def show_matrix(kb_info_json, title_caps=True): | |||||||
|         else: |         else: | ||||||
|             cli.echo('{fg_blue}matrix_%s{fg_reset}:', layout_name) |             cli.echo('{fg_blue}matrix_%s{fg_reset}:', layout_name) | ||||||
| 
 | 
 | ||||||
|         print(render_layout(kb_info_json['layouts'][layout_name]['layout'], labels)) |         print(render_layout(kb_info_json['layouts'][layout_name]['layout'], cli.config.info.ascii, labels)) | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
| def print_friendly_output(kb_info_json): | def print_friendly_output(kb_info_json): | ||||||
| @ -124,6 +127,7 @@ def print_text_output(kb_info_json): | |||||||
| @cli.argument('-l', '--layouts', action='store_true', help='Render the layouts.') | @cli.argument('-l', '--layouts', action='store_true', help='Render the layouts.') | ||||||
| @cli.argument('-m', '--matrix', action='store_true', help='Render the layouts with matrix information.') | @cli.argument('-m', '--matrix', action='store_true', help='Render the layouts with matrix information.') | ||||||
| @cli.argument('-f', '--format', default='friendly', arg_only=True, help='Format to display the data in (friendly, text, json) (Default: friendly).') | @cli.argument('-f', '--format', default='friendly', arg_only=True, help='Format to display the data in (friendly, text, json) (Default: friendly).') | ||||||
|  | @cli.argument('--ascii', action='store_true', default='windows' in platform_id, help='Render layout box drawings in ASCII only.') | ||||||
| @cli.subcommand('Keyboard information.') | @cli.subcommand('Keyboard information.') | ||||||
| @automagic_keyboard | @automagic_keyboard | ||||||
| @automagic_keymap | @automagic_keymap | ||||||
| @ -132,7 +136,7 @@ def info(cli): | |||||||
|     """ |     """ | ||||||
|     # Determine our keyboard(s) |     # Determine our keyboard(s) | ||||||
|     if not cli.config.info.keyboard: |     if not cli.config.info.keyboard: | ||||||
|         cli.log.error('Missing paramater: --keyboard') |         cli.log.error('Missing parameter: --keyboard') | ||||||
|         cli.subcommands['info'].print_help() |         cli.subcommands['info'].print_help() | ||||||
|         return False |         return False | ||||||
| 
 | 
 | ||||||
|  | |||||||
| @ -9,6 +9,25 @@ from glob import glob | |||||||
| from qmk.c_parse import parse_config_h_file | from qmk.c_parse import parse_config_h_file | ||||||
| from qmk.makefile import parse_rules_mk_file | from qmk.makefile import parse_rules_mk_file | ||||||
| 
 | 
 | ||||||
|  | BOX_DRAWING_CHARACTERS = { | ||||||
|  |     "unicode": { | ||||||
|  |         "tl": "┌", | ||||||
|  |         "tr": "┐", | ||||||
|  |         "bl": "└", | ||||||
|  |         "br": "┘", | ||||||
|  |         "v": "│", | ||||||
|  |         "h": "─", | ||||||
|  |     }, | ||||||
|  |     "ascii": { | ||||||
|  |         "tl": " ", | ||||||
|  |         "tr": " ", | ||||||
|  |         "bl": "|", | ||||||
|  |         "br": "|", | ||||||
|  |         "v": "|", | ||||||
|  |         "h": "_", | ||||||
|  |     }, | ||||||
|  | } | ||||||
|  | 
 | ||||||
| base_path = os.path.join(os.getcwd(), "keyboards") + os.path.sep | base_path = os.path.join(os.getcwd(), "keyboards") + os.path.sep | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
| @ -72,10 +91,12 @@ def rules_mk(keyboard): | |||||||
|     return rules |     return rules | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
| def render_layout(layout_data, key_labels=None): | def render_layout(layout_data, render_ascii, key_labels=None): | ||||||
|     """Renders a single layout. |     """Renders a single layout. | ||||||
|     """ |     """ | ||||||
|     textpad = [array('u', ' ' * 200) for x in range(50)] |     textpad = [array('u', ' ' * 200) for x in range(50)] | ||||||
|  |     style = 'ascii' if render_ascii else 'unicode' | ||||||
|  |     box_chars = BOX_DRAWING_CHARACTERS[style] | ||||||
| 
 | 
 | ||||||
|     for key in layout_data: |     for key in layout_data: | ||||||
|         x = ceil(key.get('x', 0) * 4) |         x = ceil(key.get('x', 0) * 4) | ||||||
| @ -97,13 +118,13 @@ def render_layout(layout_data, key_labels=None): | |||||||
|             label = label[:label_len] |             label = label[:label_len] | ||||||
| 
 | 
 | ||||||
|         label_blank = ' ' * label_len |         label_blank = ' ' * label_len | ||||||
|         label_border = '─' * label_len |         label_border = box_chars['h'] * label_len | ||||||
|         label_middle = label + ' '*label_leftover  # noqa: yapf insists there be no whitespace around * |         label_middle = label + ' '*label_leftover  # noqa: yapf insists there be no whitespace around * | ||||||
| 
 | 
 | ||||||
|         top_line = array('u', '┌' + label_border + '┐') |         top_line = array('u', box_chars['tl'] + label_border + box_chars['tr']) | ||||||
|         lab_line = array('u', '│' + label_middle + '│') |         lab_line = array('u', box_chars['v'] + label_middle + box_chars['v']) | ||||||
|         mid_line = array('u', '│' + label_blank + '│') |         mid_line = array('u', box_chars['v'] + label_blank + box_chars['v']) | ||||||
|         bot_line = array('u', '└' + label_border + "┘") |         bot_line = array('u', box_chars['bl'] + label_border + box_chars['br']) | ||||||
| 
 | 
 | ||||||
|         textpad[y][x:x + w] = top_line |         textpad[y][x:x + w] = top_line | ||||||
|         textpad[y + 1][x:x + w] = lab_line |         textpad[y + 1][x:x + w] = lab_line | ||||||
| @ -119,13 +140,13 @@ def render_layout(layout_data, key_labels=None): | |||||||
|     return '\n'.join(lines) |     return '\n'.join(lines) | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
| def render_layouts(info_json): | def render_layouts(info_json, render_ascii): | ||||||
|     """Renders all the layouts from an `info_json` structure. |     """Renders all the layouts from an `info_json` structure. | ||||||
|     """ |     """ | ||||||
|     layouts = {} |     layouts = {} | ||||||
| 
 | 
 | ||||||
|     for layout in info_json['layouts']: |     for layout in info_json['layouts']: | ||||||
|         layout_data = info_json['layouts'][layout]['layout'] |         layout_data = info_json['layouts'][layout]['layout'] | ||||||
|         layouts[layout] = render_layout(layout_data) |         layouts[layout] = render_layout(layout_data, render_ascii) | ||||||
| 
 | 
 | ||||||
|     return layouts |     return layouts | ||||||
|  | |||||||
| @ -1,7 +1,11 @@ | |||||||
|  | import platform | ||||||
|  | 
 | ||||||
| from subprocess import STDOUT, PIPE | from subprocess import STDOUT, PIPE | ||||||
| 
 | 
 | ||||||
| from qmk.commands import run | from qmk.commands import run | ||||||
| 
 | 
 | ||||||
|  | is_windows = 'windows' in platform.platform().lower() | ||||||
|  | 
 | ||||||
| 
 | 
 | ||||||
| def check_subcommand(command, *args): | def check_subcommand(command, *args): | ||||||
|     cmd = ['bin/qmk', command] + list(args) |     cmd = ['bin/qmk', command] + list(args) | ||||||
| @ -148,7 +152,11 @@ def test_info_keymap_render(): | |||||||
|     check_returncode(result) |     check_returncode(result) | ||||||
|     assert 'Keyboard Name: handwired/onekey/pytest' in result.stdout |     assert 'Keyboard Name: handwired/onekey/pytest' in result.stdout | ||||||
|     assert 'Processor: STM32F303' in result.stdout |     assert 'Processor: STM32F303' in result.stdout | ||||||
|     assert '│A │' in result.stdout | 
 | ||||||
|  |     if is_windows: | ||||||
|  |         assert '|A |' in result.stdout | ||||||
|  |     else: | ||||||
|  |         assert '│A │' in result.stdout | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
| def test_info_matrix_render(): | def test_info_matrix_render(): | ||||||
| @ -157,7 +165,12 @@ def test_info_matrix_render(): | |||||||
|     assert 'Keyboard Name: handwired/onekey/pytest' in result.stdout |     assert 'Keyboard Name: handwired/onekey/pytest' in result.stdout | ||||||
|     assert 'Processor: STM32F303' in result.stdout |     assert 'Processor: STM32F303' in result.stdout | ||||||
|     assert 'LAYOUT_ortho_1x1' in result.stdout |     assert 'LAYOUT_ortho_1x1' in result.stdout | ||||||
|     assert '│0A│' in result.stdout | 
 | ||||||
|  |     if is_windows: | ||||||
|  |         assert '|0A|' in result.stdout | ||||||
|  |     else: | ||||||
|  |         assert '│0A│' in result.stdout | ||||||
|  | 
 | ||||||
|     assert 'Matrix for "LAYOUT_ortho_1x1"' in result.stdout |     assert 'Matrix for "LAYOUT_ortho_1x1"' in result.stdout | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
|  | |||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user
	 Ryan
						Ryan