From f29e139cbb7e4a4d539cba6e894ef4a6acd312d6 Mon Sep 17 00:00:00 2001 From: Evgeny Zinoviev Date: Wed, 31 May 2023 09:22:00 +0300 Subject: WIP: big refactoring --- src/pio_ini.py | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) (limited to 'src/pio_ini.py') diff --git a/src/pio_ini.py b/src/pio_ini.py index 19dd707..920c3e5 100755 --- a/src/pio_ini.py +++ b/src/pio_ini.py @@ -54,12 +54,17 @@ def bsd_parser(product_config: dict, arg_kwargs['type'] = int elif kwargs['type'] == 'int': arg_kwargs['type'] = int + elif kwargs['type'] == 'bool': + arg_kwargs['action'] = 'store_true' + arg_kwargs['required'] = False else: raise TypeError(f'unsupported type {kwargs["type"]} for define {define_name}') else: arg_kwargs['action'] = 'store_true' - parser.add_argument(f'--{define_name}', required=True, **arg_kwargs) + if 'required' not in arg_kwargs: + arg_kwargs['required'] = True + parser.add_argument(f'--{define_name}', **arg_kwargs) bsd_walk(product_config, f) @@ -76,6 +81,9 @@ def bsd_get(product_config: dict, enums.append(f'CONFIG_{define_name}') defines[f'CONFIG_{define_name}'] = f'HOMEKIT_{attr_value.upper()}' return + if kwargs['type'] == 'bool': + defines[f'CONFIG_{define_name}'] = True + return defines[f'CONFIG_{define_name}'] = str(attr_value) bsd_walk(product_config, f) return defines, enums -- cgit v1.2.3 From b0bf43e6a272d42a55158e657bd937cb82fc3d8d Mon Sep 17 00:00:00 2001 From: Evgeny Zinoviev Date: Sat, 10 Jun 2023 23:02:34 +0300 Subject: move files, rename home package to homekit --- src/pio_ini.py | 136 --------------------------------------------------------- 1 file changed, 136 deletions(-) delete mode 100755 src/pio_ini.py (limited to 'src/pio_ini.py') diff --git a/src/pio_ini.py b/src/pio_ini.py deleted file mode 100755 index 920c3e5..0000000 --- a/src/pio_ini.py +++ /dev/null @@ -1,136 +0,0 @@ -#!/usr/bin/env python3 -import os -import yaml -import re - -from pprint import pprint -from argparse import ArgumentParser, ArgumentError -from home.pio import get_products, platformio_ini -from home.pio.exceptions import ProductConfigNotFoundError - - -def get_config(product: str) -> dict: - config_path = os.path.join( - os.getenv('HOME'), '.config', - 'homekit_pio', f'{product}.yaml' - ) - if not os.path.exists(config_path): - raise ProductConfigNotFoundError(f'{config_path}: product config not found') - - with open(config_path, 'r') as f: - return yaml.safe_load(f) - - -def bsd_walk(product_config: dict, - f: callable): - try: - for define_name, define_extra_params in product_config['build_specific_defines'].items(): - define_name = re.sub(r'^CONFIG_', '', define_name) - kwargs = {} - if isinstance(define_extra_params, dict): - kwargs = define_extra_params - f(define_name, **kwargs) - except KeyError: - pass - - -# 'bsd' means 'build_specific_defines' -def bsd_parser(product_config: dict, - parser: ArgumentParser): - def f(define_name, **kwargs): - arg_kwargs = {} - define_name = define_name.lower().replace('_', '-') - - if 'type' in kwargs: - if kwargs['type'] in ('str', 'enum'): - arg_kwargs['type'] = str - if kwargs['type'] == 'enum' and 'list_config_key' in kwargs: - if not isinstance(product_config[kwargs['list_config_key']], list): - raise TypeError(f'product_config[{kwargs["list_config_key"]}] enum is not list') - if not product_config[kwargs['list_config_key']]: - raise ValueError(f'product_config[{kwargs["list_config_key"]}] enum cannot be empty') - arg_kwargs['choices'] = product_config[kwargs['list_config_key']] - if isinstance(product_config[kwargs['list_config_key']][0], int): - arg_kwargs['type'] = int - elif kwargs['type'] == 'int': - arg_kwargs['type'] = int - elif kwargs['type'] == 'bool': - arg_kwargs['action'] = 'store_true' - arg_kwargs['required'] = False - else: - raise TypeError(f'unsupported type {kwargs["type"]} for define {define_name}') - else: - arg_kwargs['action'] = 'store_true' - - if 'required' not in arg_kwargs: - arg_kwargs['required'] = True - parser.add_argument(f'--{define_name}', **arg_kwargs) - - bsd_walk(product_config, f) - - -def bsd_get(product_config: dict, - arg: object): - defines = {} - enums = [] - def f(define_name, **kwargs): - attr_name = define_name.lower() - attr_value = getattr(arg, attr_name) - if 'type' in kwargs: - if kwargs['type'] == 'enum': - enums.append(f'CONFIG_{define_name}') - defines[f'CONFIG_{define_name}'] = f'HOMEKIT_{attr_value.upper()}' - return - if kwargs['type'] == 'bool': - defines[f'CONFIG_{define_name}'] = True - return - defines[f'CONFIG_{define_name}'] = str(attr_value) - bsd_walk(product_config, f) - return defines, enums - - -if __name__ == '__main__': - products = get_products() - - # first, get the product - product_parser = ArgumentParser(add_help=False) - product_parser.add_argument('--product', type=str, choices=products, required=True, - help='PIO product name') - arg, _ = product_parser.parse_known_args() - if not arg.product: - product = os.path.basename(os.path.realpath(os.getcwd())) - if product not in products: - raise ArgumentError(None, 'invalid product') - else: - product = arg.product - - product_config = get_config(product) - - # then everythingm else - parser = ArgumentParser(parents=[product_parser]) - parser.add_argument('--target', type=str, required=True, choices=product_config['targets'], - help='PIO build target') - parser.add_argument('--platform', default='espressif8266', type=str) - parser.add_argument('--framework', default='arduino', type=str) - parser.add_argument('--upload-port', default='/dev/ttyUSB0', type=str) - parser.add_argument('--monitor-speed', default=115200) - parser.add_argument('--debug', action='store_true') - parser.add_argument('--debug-network', action='store_true') - bsd_parser(product_config, parser) - arg = parser.parse_args() - - if arg.target not in product_config['targets']: - raise ArgumentError(None, f'target {arg.target} not found for product {product}') - - bsd, bsd_enums = bsd_get(product_config, arg) - ini = platformio_ini(product_config=product_config, - target=arg.target, - build_specific_defines=bsd, - build_specific_defines_enums=bsd_enums, - platform=arg.platform, - framework=arg.framework, - upload_port=arg.upload_port, - monitor_speed=arg.monitor_speed, - debug=arg.debug, - debug_network=arg.debug_network) - print(ini) -- cgit v1.2.3