159 lines
6.0 KiB
Python
Executable File
159 lines
6.0 KiB
Python
Executable File
#!/usr/bin/env python3
|
|
# -*- coding: utf-8 -*-
|
|
|
|
import argparse
|
|
import os
|
|
import sys
|
|
from pathlib import Path
|
|
|
|
script_path = Path(__file__).absolute()
|
|
|
|
sys.path.insert(0, str(script_path.parent.parent)) # to find wireviz module
|
|
from wv_helper import open_file_append, open_file_read, open_file_write
|
|
|
|
from wireviz import APP_NAME, __version__, wireviz
|
|
|
|
dir = script_path.parent.parent.parent
|
|
readme = 'readme.md'
|
|
groups = {
|
|
'examples': {
|
|
'path': dir / 'examples',
|
|
'prefix': 'ex',
|
|
readme: [], # Include no files
|
|
'title': 'Example Gallery',
|
|
},
|
|
'tutorial' : {
|
|
'path': dir / 'tutorial',
|
|
'prefix': 'tutorial',
|
|
readme: ['md', 'yml'], # Include .md and .yml files
|
|
'title': f'{APP_NAME} Tutorial',
|
|
},
|
|
'demos' : {
|
|
'path': dir / 'examples',
|
|
'prefix': 'demo',
|
|
},
|
|
}
|
|
|
|
input_extensions = ['.yml']
|
|
extensions_not_containing_graphviz_output = ['.gv', '.bom.tsv']
|
|
extensions_containing_graphviz_output = ['.png', '.svg', '.html']
|
|
generated_extensions = extensions_not_containing_graphviz_output + extensions_containing_graphviz_output
|
|
|
|
|
|
def collect_filenames(description, groupkey, ext_list):
|
|
path = groups[groupkey]['path']
|
|
patterns = [f"{groups[groupkey]['prefix']}*{ext}" for ext in ext_list]
|
|
if ext_list != input_extensions and readme in groups[groupkey]:
|
|
patterns.append(readme)
|
|
print(f'{description} {groupkey} in "{path}"')
|
|
return sorted([filename for pattern in patterns for filename in path.glob(pattern)])
|
|
|
|
|
|
def build_generated(groupkeys):
|
|
for key in groupkeys:
|
|
# preparation
|
|
path = groups[key]['path']
|
|
build_readme = readme in groups[key]
|
|
if build_readme:
|
|
include_readme = 'md' in groups[key][readme]
|
|
include_source = 'yml' in groups[key][readme]
|
|
with open_file_write(path / readme) as out:
|
|
out.write(f'# {groups[key]["title"]}\n\n')
|
|
# collect and iterate input YAML files
|
|
for yaml_file in collect_filenames('Building', key, input_extensions):
|
|
print(f' "{yaml_file}"')
|
|
wireviz.parse_file(yaml_file)
|
|
|
|
if build_readme:
|
|
i = ''.join(filter(str.isdigit, yaml_file.stem))
|
|
|
|
with open_file_append(path / readme) as out:
|
|
if include_readme:
|
|
with open_file_read(yaml_file.with_suffix('.md')) as info:
|
|
for line in info:
|
|
out.write(line.replace('## ', f'## {i} - '))
|
|
out.write('\n\n')
|
|
else:
|
|
out.write(f'## Example {i}\n')
|
|
|
|
if include_source:
|
|
with open_file_read(yaml_file) as src:
|
|
out.write('```yaml\n')
|
|
for line in src:
|
|
out.write(line)
|
|
out.write('```\n')
|
|
out.write('\n')
|
|
|
|
out.write(f'\n\n')
|
|
out.write(f'[Source]({yaml_file.name}) - [Bill of Materials]({yaml_file.stem}.bom.tsv)\n\n\n')
|
|
|
|
|
|
def clean_generated(groupkeys):
|
|
for key in groupkeys:
|
|
# collect and remove files
|
|
for filename in collect_filenames('Cleaning', key, generated_extensions):
|
|
if filename.is_file():
|
|
print(f' rm "{filename}"')
|
|
Path(filename).unlink()
|
|
|
|
|
|
def compare_generated(groupkeys, branch = '', include_graphviz_output = False):
|
|
if branch:
|
|
branch = f' {branch.strip()}'
|
|
compare_extensions = generated_extensions if include_graphviz_output else extensions_not_containing_graphviz_output
|
|
for key in groupkeys:
|
|
# collect and compare files
|
|
for filename in collect_filenames('Comparing', key, compare_extensions):
|
|
cmd = f'git --no-pager diff{branch} -- "{filename}"'
|
|
print(f' {cmd}')
|
|
os.system(cmd)
|
|
|
|
|
|
def restore_generated(groupkeys, branch = ''):
|
|
if branch:
|
|
branch = f' {branch.strip()}'
|
|
for key in groupkeys:
|
|
# collect input YAML files
|
|
filename_list = collect_filenames('Restoring', key, input_extensions)
|
|
# collect files to restore
|
|
filename_list = [fn.with_suffix(ext) for fn in filename_list for ext in generated_extensions]
|
|
if readme in groups[key]:
|
|
filename_list.append(groups[key]['path'] / readme)
|
|
# restore files
|
|
for filename in filename_list:
|
|
cmd = f'git checkout{branch} -- "{filename}"'
|
|
print(f' {cmd}')
|
|
os.system(cmd)
|
|
|
|
|
|
def parse_args():
|
|
parser = argparse.ArgumentParser(description=f'{APP_NAME} Example Manager',)
|
|
parser.add_argument('-V', '--version', action='version', version=f'%(prog)s - {APP_NAME} {__version__}')
|
|
parser.add_argument('action', nargs='?', action='store',
|
|
choices=['build','clean','compare','diff','restore'], default='build',
|
|
help='what to do with the generated files (default: build)')
|
|
parser.add_argument('-c', '--compare-graphviz-output', action='store_true',
|
|
help='the Graphviz output is also compared (default: False)')
|
|
parser.add_argument('-b', '--branch', action='store', default='',
|
|
help='branch or commit to compare with or restore from')
|
|
parser.add_argument('-g', '--groups', nargs='+',
|
|
choices=groups.keys(), default=groups.keys(),
|
|
help='the groups of generated files (default: all)')
|
|
return parser.parse_args()
|
|
|
|
|
|
def main():
|
|
args = parse_args()
|
|
if args.action == 'build':
|
|
build_generated(args.groups)
|
|
elif args.action == 'clean':
|
|
clean_generated(args.groups)
|
|
elif args.action == 'compare' or args.action == 'diff':
|
|
compare_generated(args.groups, args.branch, args.compare_graphviz_output)
|
|
elif args.action == 'restore':
|
|
restore_generated(args.groups, args.branch)
|
|
|
|
|
|
if __name__ == '__main__':
|
|
main()
|