From 57e063c71119306f924af330a04b49b338640511 Mon Sep 17 00:00:00 2001 From: generalmat82 Date: Wed, 17 Dec 2025 14:56:03 -0500 Subject: [PATCH] Add theme functionality reporting scripts and overview page (#88) Fixes #88 --- .gitignore | 5 + Home.md | 3 +- Themes-Overview.md | 154 ++++++++++++++++++++ _Sidebar.md | 1 + scripts/experimental/generate_summaries.py | 130 +++++++++++++++++ scripts/experimental/make_theme_reports.py | 161 +++++++++++++++++++++ 6 files changed, 453 insertions(+), 1 deletion(-) create mode 100644 .gitignore create mode 100644 Themes-Overview.md create mode 100755 scripts/experimental/generate_summaries.py create mode 100755 scripts/experimental/make_theme_reports.py diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..3e503e4 --- /dev/null +++ b/.gitignore @@ -0,0 +1,5 @@ +.vscode/* + +# file for testing the theme scripts: +themes-files/* +reports/* diff --git a/Home.md b/Home.md index 9216b9b..721374a 100644 --- a/Home.md +++ b/Home.md @@ -41,7 +41,8 @@ Once Oh My Zsh is installed: - Take a look at the most common questions and gotchas in the [[FAQ]]. - Get a quick summary of the built-in plugins: [[Plugins Overview]]. -- Take a look at our [[Themes]] and [[Plugins]] (read the READMEs first!). +- Take a look at our [[Themes]] and their functionality: [[Themes Overview]]. +- And check out our full list of [[Plugins]] (read the READMEs first!). - If you need more, you can look at [[External themes]] and [[External plugins]]. **Take caution, we do not review these.** - Have a look at the [[Cheatsheet]] for other Oh My Zsh tricks. diff --git a/Themes-Overview.md b/Themes-Overview.md new file mode 100644 index 0000000..8f419d3 --- /dev/null +++ b/Themes-Overview.md @@ -0,0 +1,154 @@ + +> _This wiki is automatically published from [ohmyzsh/wiki](https://github.com/ohmyzsh/wiki). To edit this page,_ +> _go to [ohmyzsh/wiki](https://github.com/ohmyzsh/wiki), make your changes and submit a Pull Request._ + + +# Themes Overview + +This list represents the functionality for each one of our themes. You can see every theme and their screenshot in [[Themes]]. + +| Theme | Username | Hostname | Time/Date | Last Failure | PWD style | Other info | +| -------------------- | -------: | -------: | --------: | -----------: | --------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| 3den | True | True | True | False | shortened path | git, ruby, git, ruby | +| Soliah | True | True | False | False | shortened path | git, ruby, rvm, git, ruby, rvm | +| adben | True | True | True | False | shortened path | git, svn, vcs_info, fortune_commandlinefu, ssh_indicator, git, svn, vcs_info, fortune_commandlinefu, ssh_indicator | +| af-magic | True | True | False | True | shortened path | git, hg, vcs_info, virtualenv, root_indicator, conda, git, hg, vcs_info, virtualenv, root_indicator, conda | +| afowler | False | True | False | True | shortened path (3 folders) | git, hg, root_indicator, git, hg, root_indicator | +| agnoster | True | True | False | True | basename (current directory name) | git, hg, vcs_info, virtualenv, root_indicator, aws, terraform, conda, ssh_indicator, bzr, git, hg, vcs_info, virtualenv, root_indicator, aws, terraform, conda, ssh_indicator, bzr | +| alanpeabody | True | True | False | True | shortened path | git, ruby, rvm, git, ruby, rvm | +| amuse | False | False | True | False | shortened path | git, virtualenv, ruby, git, virtualenv, ruby | +| apple | False | False | False | False | basename (current directory name) | git, svn, vcs_info, git, svn, vcs_info | +| arrow | False | False | False | False | basename (current directory name) | git, root_indicator, git, root_indicator | +| aussiegeek | True | True | True | False | shortened path | git, ruby, git, ruby | +| avit | True | True | False | True | shortened path (3 folders) | git, ruby, history_number, root_indicator, vi-mode, ssh_indicator, git, ruby, history_number, root_indicator, vi-mode, ssh_indicator | +| awesomepanda | False | False | False | True | basename (current directory name) | git, svn, git, svn | +| bira | True | True | False | True | shortened path | git, hg, vcs_info, virtualenv, ruby, root_indicator, kube, conda, rvm, git, hg, vcs_info, virtualenv, ruby, root_indicator, kube, conda, rvm | +| blinks | True | True | False | False | shortened path | git, history_number, root_indicator, git, history_number, root_indicator | +| bureau | True | True | True | False | shortened path | git, root_indicator, nodejs, git, root_indicator, nodejs | +| candy | True | True | True | False | shortened path | git, root_indicator, git, root_indicator | +| candy-kingdom | True | True | False | True | shortened path | git, hg, battery, git, hg, battery | +| clean | True | False | True | False | basename (current directory name) | git, root_indicator, git, root_indicator | +| cloud | False | False | False | False | basename (current directory name) | git, git | +| crcandy | True | True | True | False | shortened path | git, root_indicator, git, root_indicator | +| crunch | False | False | True | False | shortened path | git, ruby, rvm, git, ruby, rvm | +| cypher | False | True | False | True | shortened path (3 folders) | - | +| dallas | True | True | True | False | shortened path | git, ruby, root_indicator, git, ruby, root_indicator | +| darkblood | True | True | False | True | shortened path | git, git | +| daveverwer | False | True | False | False | basename (current directory name) | git, root_indicator, git, root_indicator | +| dieter | True | True | True | True | basename (current directory name) | git, root_indicator, git, root_indicator | +| dogenpunk | False | True | False | True | shortened path | git, hg, history_number, git, hg, history_number | +| dpoggi | True | True | False | True | shortened path | git, root_indicator, git, root_indicator | +| dst | True | True | True | True | shortened path | git, root_indicator, git, root_indicator | +| dstufft | True | True | False | False | shortened path | git, hg, virtualenv, git, hg, virtualenv | +| duellj | True | True | True | False | shortened path | history_number, history_number | +| eastwood | False | False | False | False | shortened path | git, ruby, rvm, git, ruby, rvm | +| edvardm | False | False | False | False | basename (current directory name) | git, git | +| emotty | True | True | False | True | shortened path (3 folders) | git, hg, svn, vcs_info, root_indicator, ssh_indicator, git, hg, svn, vcs_info, root_indicator, ssh_indicator | +| essembeh | True | True | False | True | shortened path | git, root_indicator, ssh_indicator, git, root_indicator, ssh_indicator | +| evan | False | True | False | False | shortened path (2 folders) | - | +| fino | True | True | False | False | shortened path | git, virtualenv, ruby, git, virtualenv, ruby | +| fino-time | True | True | True | False | shortened path | git, virtualenv, ruby, conda, rvm, git, virtualenv, ruby, conda, rvm | +| fishy | True | True | False | True | shortened path | git, root_indicator, ssh_indicator, git, root_indicator, ssh_indicator | +| flazz | False | True | False | True | shortened path (3 folders) | git, root_indicator, vi-mode, git, root_indicator, vi-mode | +| fletcherm | True | False | True | False | shortened path (3 folders) | git, git | +| fox | True | True | False | False | shortened path | git, git | +| frisk | True | True | True | False | full path | git, bzr, git, bzr | +| frontcube | False | False | False | False | shortened path | git, ruby, git, ruby | +| funky | True | True | False | True | shortened path | history_number, root_indicator, history_number, root_indicator | +| fwalch | False | False | False | False | basename (current directory name) | git, git | +| gallifrey | False | True | False | True | shortened path (2 folders) | git, root_indicator, git, root_indicator | +| gallois | False | False | False | True | shortened path | git, hg, vcs_info, command_duration, git, hg, vcs_info, command_duration | +| garyblessington | False | False | False | False | basename (current directory name) | git, git | +| gentoo | True | True | False | False | shortened path (1 folders) | git, svn, vcs_info, root_indicator, git, svn, vcs_info, root_indicator | +| geoffgarside | True | False | True | False | basename (current directory name) | git, root_indicator, git, root_indicator | +| gianu | True | True | False | False | basename (current directory name) | git, git | +| gnzh | True | True | False | True | shortened path | git, virtualenv, ruby, root_indicator, ssh_indicator, git, virtualenv, ruby, root_indicator, ssh_indicator | +| gozilla | False | False | False | False | basename (current directory name) | git, git | +| half-life | True | False | False | False | basename (current directory name) | git, svn, vcs_info, virtualenv, ruby, rvm, git, svn, vcs_info, virtualenv, ruby, rvm | +| humza | True | False | False | False | shortened path | git, git | +| imajes | False | False | False | False | shortened path | - | +| intheloop | True | True | False | True | shortened path | git, ssh_indicator, git, ssh_indicator | +| itchy | True | True | False | True | shortened path | git, ruby, git, ruby | +| jaischeema | False | True | False | False | shortened path | git, ruby, git, ruby | +| jbergantine | False | False | False | False | basename (current directory name) | git, git | +| jispwoso | True | True | False | True | full path | git, git | +| jnrowe | False | True | False | True | shortened path (2 folders) | git, vcs_info, ssh_indicator, git, vcs_info, ssh_indicator | +| jonathan | True | True | True | True | shortened path | git, virtualenv, ruby, root_indicator, conda, git, virtualenv, ruby, root_indicator, conda | +| josh | True | True | False | True | shortened path | git, ruby, git, ruby | +| jreese | True | True | False | True | shortened path | git, root_indicator, git, root_indicator | +| jtriley | True | True | True | False | full path | - | +| juanghurtado | True | True | False | False | shortened path | git, root_indicator, git, root_indicator | +| junkfood | True | True | True | False | shortened path | git, git | +| kafeitu | True | True | False | False | shortened path | git, git | +| kardan | False | True | False | False | shortened path | git, git | +| kennethreitz | False | False | False | True | basename (current directory name) | git, virtualenv, root_indicator, git, virtualenv, root_indicator | +| kiwi | False | False | False | False | shortened path (2 folders) | git, svn, battery, git, svn, battery | +| kolo | False | False | False | False | basename (current directory name) | git, svn, vcs_info, git, svn, vcs_info | +| kphoen | True | True | False | True | shortened path | git, root_indicator, git, root_indicator | +| lambda | False | False | False | False | shortened path | git, git | +| linuxonly | True | True | False | True | full path | git, vcs_info, git, vcs_info | +| lukerandall | True | True | False | True | shortened path (2 folders) | git, git | +| macovsky | False | False | False | True | shortened path | git, ruby, git, ruby | +| macovsky-ruby | False | False | False | True | shortened path | git, ruby, git, ruby | +| maran | True | True | False | False | full path | git, root_indicator, git, root_indicator | +| mgutz | False | False | False | False | shortened path (1 folders) | git, root_indicator, git, root_indicator | +| mh | True | False | False | False | shortened path | git, root_indicator, git, root_indicator | +| michelebologna | True | True | False | True | shortened path | git, root_indicator, git, root_indicator | +| mikeh | True | True | True | False | shortened path | vcs_info, vcs_info | +| miloshadzic | False | False | False | False | shortened path (1 folders) | git, git | +| minimal | False | False | False | False | shortened path (2 folders) | git, hg, svn, vcs_info, git, hg, svn, vcs_info | +| mira | True | True | False | True | shortened path | git, ruby, rvm, nodejs, jenv, git, ruby, rvm, nodejs, jenv | +| mlh | True | True | True | True | shortened path (1 folders) | git, customizable, git, customizable | +| mortalscumbag | True | True | False | True | shortened path | git, root_indicator, ssh_indicator, git, root_indicator, ssh_indicator | +| mrtazz | False | True | False | False | basename (current directory name) | git, root_indicator, git, root_indicator | +| murilasso | True | True | False | True | shortened path | git, ruby, rvm, git, ruby, rvm | +| muse | False | False | False | False | shortened path | git, virtualenv, git, virtualenv | +| nanotech | False | True | True | False | shortened path | git, git | +| nebirhos | False | True | False | False | basename (current directory name) | git, ruby, rvm, git, ruby, rvm | +| nicoulaj | True | True | False | True | basename (current directory name) | git, hg, vcs_info, root_indicator, ssh_indicator, bzr, git, hg, vcs_info, root_indicator, ssh_indicator, bzr | +| norm | False | True | False | False | basename (current directory name) | git, hg, git, hg | +| obraun | True | True | True | True | shortened path (3 folders) | git, root_indicator, git, root_indicator | +| oldgallois | False | False | False | True | shortened path | git, ruby, rvm, git, ruby, rvm | +| peepcode | False | False | False | True | shortened path | git, virtualenv, ruby, git, virtualenv, ruby | +| philips | True | False | True | False | basename (current directory name) | git, root_indicator, git, root_indicator | +| pmcgee | True | True | True | False | shortened path | git, root_indicator, git, root_indicator | +| pygmalion | True | True | False | False | shortened path (0 folders) | git, git | +| pygmalion-virtualenv | True | True | False | False | shortened path (0 folders) | git, virtualenv, git, virtualenv | +| random | False | False | False | False | shortened path | - | +| re5et | True | True | True | True | shortened path | git, root_indicator, git, root_indicator | +| refined | True | True | True | True | basename (current directory name) | git, hg, vcs_info, ssh_indicator, bzr, command_duration, git, hg, vcs_info, ssh_indicator, bzr, command_duration | +| rgm | True | True | False | True | shortened path | git, git | +| risto | True | True | False | False | shortened path (2 folders) | git, root_indicator, git, root_indicator | +| rixius | True | False | True | False | shortened path | git, git | +| rkj | True | True | True | True | shortened path | - | +| rkj-repos | True | True | True | True | shortened path | git, hg, git, hg | +| robbyrussell | False | False | False | True | basename (current directory name) | git, git | +| sammy | False | False | False | False | basename (current directory name) | git, git | +| simonoff | True | True | False | True | shortened path | git, ruby, root_indicator, rvm, git, ruby, root_indicator, rvm | +| simple | False | False | False | False | shortened path | git, root_indicator, git, root_indicator | +| skaro | False | False | False | False | shortened path (2 folders) | git, history_number, git, history_number | +| smt | False | True | False | True | shortened path | git, hg, history_number, git, hg, history_number | +| sonicradish | False | True | False | True | basename (current directory name) | git, vcs_info, root_indicator, git, vcs_info, root_indicator | +| sorin | False | False | False | True | basename (current directory name) | git, root_indicator, git, root_indicator | +| sporty_256 | True | True | False | False | basename (current directory name) | git, root_indicator, git, root_indicator | +| steeef | True | True | False | False | basename (current directory name) | git, svn, vcs_info, virtualenv, git, svn, vcs_info, virtualenv | +| strug | True | True | False | False | shortened path | git, git | +| sunaku | False | False | False | True | shortened path | git, root_indicator, git, root_indicator | +| sunrise | False | False | False | True | shortened path (2 folders) | git, root_indicator, git, root_indicator | +| superjarin | False | False | False | False | shortened path | git, ruby, git, ruby | +| suvash | True | True | False | False | shortened path | git, hg, virtualenv, ruby, git, hg, virtualenv, ruby | +| takashiyoshida | True | True | False | False | basename (current directory name) | git, root_indicator, git, root_indicator | +| terminalparty | False | True | False | True | shortened path (2 folders) | git, git | +| theunraveler | False | False | False | False | basename (current directory name) | git, git | +| tjkirch | True | True | True | True | shortened path | git, root_indicator, git, root_indicator | +| tjkirch_mod | True | True | True | True | shortened path | git, root_indicator, git, root_indicator | +| tonotdo | True | False | True | False | shortened path (3 folders) | git, git | +| trapd00r | True | True | False | True | shortened path | git, vcs_info, git, vcs_info | +| wedisagree | False | False | True | True | basename (current directory name) | git, ruby, rvm, git, ruby, rvm | +| wezm | False | False | False | True | shortened path | git, root_indicator, git, root_indicator | +| wezm+ | True | True | False | True | shortened path | git, root_indicator, git, root_indicator | +| wuffers | False | False | False | False | basename (current directory name) | git, ruby, rvm, git, ruby, rvm | +| xiong-chiamiov | True | True | True | False | shortened path | - | +| xiong-chiamiov-plus | True | True | True | False | shortened path | git, git | +| ys | True | True | True | True | shortened path | git, hg, svn, vcs_info, virtualenv, root_indicator, git, hg, svn, vcs_info, virtualenv, root_indicator | +| zhann | False | False | False | False | basename (current directory name) | git, svn, vcs_info, git, svn, vcs_info | diff --git a/_Sidebar.md b/_Sidebar.md index 23b75c4..f55ca0f 100644 --- a/_Sidebar.md +++ b/_Sidebar.md @@ -1,6 +1,7 @@ - **[[Home]]** - **[[FAQ]]** - **[[Plugins Overview]]** +- **[[Themes Overview]]** - **Documentation** - [[Installing ZSH]] - [[Settings]] diff --git a/scripts/experimental/generate_summaries.py b/scripts/experimental/generate_summaries.py new file mode 100755 index 0000000..3f9ecc6 --- /dev/null +++ b/scripts/experimental/generate_summaries.py @@ -0,0 +1,130 @@ +#!/usr/bin/env python3 +"""Generate reports/summary.md and reports/summary.csv from `reports/` files. + +Usage: python3 scripts/generate_summaries.py [--reports-dir reports] +""" +import os +import re +import csv +import argparse +import tempfile + + +def parse_report(path): + txt = '' + try: + with open(path, 'r', encoding='utf-8', errors='ignore') as f: + txt = f.read() + except Exception: + return None + + def find(rx): + m = re.search(rx, txt) + return m.group(1).strip() if m else '' + + return { + 'Shows username': find(r'Shows username:\s*([^\n]+)'), + 'Shows hostname': find(r'Shows hostname:\s*([^\n]+)'), + 'Shows time/date': find(r'Shows time/date:\s*([^\n]+)'), + 'Shows last command failure': find(r'Shows last command failure:\s*([^\n]+)'), + 'PWD style': find(r'PWD style:\s*([^\n]+)'), + 'Other info': find(r'Other info:\s*([^\n]+)'), + } + + +def write_atomic(path, data, mode='w', encoding='utf-8'): + dname = os.path.dirname(path) or '.' + fd, tmp = tempfile.mkstemp(dir=dname) + with os.fdopen(fd, mode, encoding=encoding) as f: + f.write(data) + f.flush(); os.fsync(f.fileno()) + os.replace(tmp, path) + +def generate_md(reports_dir,out_md,out_csv): + """This will generate the Markdown file + + Args: + reports_dir (str): directory of all reports + out_md (str): Where the markdown file will be created + out_csv (str): Where the CSV file will be created + """ + files = sorted([f for f in os.listdir(reports_dir) if os.path.isfile(os.path.join(reports_dir, f))]) + rows = [] + for fn in files: + # skip file if it has the name of the summary files + # or has extension .md or .csv(most likely are summary files) + if fn in (os.path.basename(out_md), os.path.basename(out_csv)) or fn.endswith(".csv") or fn.endswith(".md"): continue + path = os.path.join(reports_dir, fn) + parsed = parse_report(path) + if parsed is None: + continue + rows.append((fn, parsed)) + # Markdown + md_lines = ['# Reports summary', ''] + md_lines.append('| Report | Username | Hostname | Time/Date | Last Failure | PWD style | Other info |') + md_lines.append('|---|---:|---:|---:|---:|---|---|') + for fn, vals in rows: + md_lines.append('| {} | {} | {} | {} | {} | {} | {} |'.format( + fn, + vals.get('Shows username') or '-', + vals.get('Shows hostname') or '-', + vals.get('Shows time/date') or '-', + vals.get('Shows last command failure') or '-', + vals.get('PWD style') or '-', + vals.get('Other info') or '-' + )) + md_text = '\n'.join(md_lines) + '\n' + write_atomic(out_md, md_text) + +def generate_csv(reports_dir, out_md, out_csv): + files = sorted([f for f in os.listdir(reports_dir) if os.path.isfile(os.path.join(reports_dir, f))]) + rows = [] + for fn in files: + # skip summary files if present + if fn in (os.path.basename(out_md), os.path.basename(out_csv)) or fn.endswith(".csv") or fn.endswith(".md"): continue + path = os.path.join(reports_dir, fn) + parsed = parse_report(path) + if parsed is None: + continue + rows.append((fn, parsed)) + # CSV + csv_path = out_csv + with tempfile.NamedTemporaryFile('w', delete=False, dir=os.path.dirname(csv_path), encoding='utf-8', newline='') as tmpf: + w = csv.writer(tmpf) + w.writerow(['Report','Shows username','Shows hostname','Shows time/date','Shows last command failure','PWD style','Other info']) + for fn, vals in rows: + w.writerow([ + fn, + vals.get('Shows username') or '-', + vals.get('Shows hostname') or '-', + vals.get('Shows time/date') or '-', + vals.get('Shows last command failure') or '-', + vals.get('PWD style') or '-', + vals.get('Other info') or '-', + ]) + os.replace(tmpf.name, csv_path) + + +def main(): + p = argparse.ArgumentParser(description='Generate reports/summary.md and reports/summary.csv') + p.add_argument('--reports-dir', required=True, help='Directory containing report files') + p.add_argument('-m','--make-md',help="Enables creating a MD file",action='store_true') + p.add_argument('-c','--make-csv',help="Enables creating a csv file",action='store_true') + p.add_argument('--out-md', default=os.path.join('reports','summary.md'), help='Output markdown file') + p.add_argument('--out-csv', default=os.path.join('reports','summary.csv'), help='Output csv file') + args = p.parse_args() + + reports_dir = args.reports_dir + if not os.path.isdir(reports_dir): + raise SystemExit(f'reports dir not found: {reports_dir}') + #generating files: + if args.make_csv: + generate_csv(reports_dir, args.out_md, args.out_csv) + print('WROTE', args.out_csv) + if args.make_md: + generate_md(reports_dir, args.out_md, args.out_csv) + print('WROTE', args.out_md) + + +if __name__ == '__main__': + main() diff --git a/scripts/experimental/make_theme_reports.py b/scripts/experimental/make_theme_reports.py new file mode 100755 index 0000000..9790295 --- /dev/null +++ b/scripts/experimental/make_theme_reports.py @@ -0,0 +1,161 @@ +#!/usr/bin/env python3 +# The script goes through all the .zsh-thmes files and makes a dedicated file. with the theme's report. +# It is very possible that the scripts gets false positives. +import os +import re +import tempfile +import argparse +# all ways to find things. +WAYS_TO_FIND={ + "username": re.compile(r'%n'), + "hostname":re.compile(r'%m|%M|HOST|host_repr'), + "time":re.compile(r'%D|%T|%t|%\*'), + "last_failure":re.compile(r'%\?|%\(\?|%\?\)|RETVAL|RETURN|FAIL|ret_status'), + "pwd_num":re.compile(r'%([0-9]+)~'), + "pwd_basename":re.compile(r'%c'), + "pwd_short":re.compile(r'%~'), + "pwd_full":re.compile(r'%/|%d'), + "extra":{ + "git":re.compile(r'git_prompt_info|git_prompt_status|git_prompt|vcs_branch|\bgit\b'), + "hg":re.compile(r'hg_prompt_info|\bhg\b|hg_prompt'), + "svn": re.compile(r'svn_prompt_info|\bsvn\b'), + "vcs_info":re.compile(r'vcs|VCS'), + "virtualenv":re.compile(r'VIRTUAL_ENV|virtualenv_prompt_info|virtualenv|CONDA_DEFAULT_ENV|conda_prompt'), + "ruby": re.compile(r'ruby_prompt_info|\bRVM\b|ruby_prompt|rvm'), + "fortune_commandlinefu":re.compile(r'fortune|commandlinefu|wget -qO-|curl -fsL'), + "history_number":re.compile(r'%!|%h'), + "root_indicator":re.compile(r'%#|%\(\!|UID\s*-eq\s*0|\$EUID\ \-ne\ 0|\"\$USERNAME"\ \=\ \"root\"|_LIBERTY\s*=.*#|\%\(\#\,'), + "aws":re.compile(r'AWS_PROFILE'), + "terraform":re.compile(r'tf_prompt_info|terraform'), + "vi-mode":re.compile(r'vi_mode_prompt_info|vi_mode'), + "kube":re.compile(r'kube_ps1|kube_prompt|kubernetes'), + 'conda': re.compile(r'conda_prompt|CONDA_DEFAULT_ENV'), + 'rvm': re.compile(r'ZSH_THEME_RVM_PROMPT_OPTIONS|rvm|RVM'), + 'nodejs': re.compile(r'node_version_prompt|node_prompt_info|nvm'), + 'battery': re.compile(r'battery_prompt_info|battery'), + 'ssh_indicator': re.compile(r'ssh|SSH'), + 'bzr': re.compile(r'bzr_prompt_info|\bbzr\b'), + 'command_duration': re.compile(r'duration|cmd_timestamp'), + 'jenv': re.compile(r'jenv_prompt_info|jenv'), + 'customizable': re.compile(r'MLH'), + } +} +class themes: + def __init__(self, name, conf,cfpath,repath): + """this class contains all info about a theme + + Args: + name (str): theme's name + conf (str): the contents of a theme's config file + path (str): the path of the config file + """ + self.name = name + self.config = conf + self.cfpath = cfpath + self.repath = repath + self.capabilities = { + "basic":{ + "username":bool, + "hostname":bool, + "time":bool, + "last_failure":bool, + "pwd":str, + }, + "extras":[] + } + self.fill_data() + def fill_data(self): + """gathers all the info on the theme + """ + self.capabilities["basic"]["username"]=True if WAYS_TO_FIND["username"].search(self.config) else False + self.capabilities["basic"]["hostname"]=True if WAYS_TO_FIND["hostname"].search(self.config) else False + self.capabilities["basic"]["time"]=True if WAYS_TO_FIND["time"].search(self.config) else False + self.capabilities["basic"]["last_failure"]=True if WAYS_TO_FIND["last_failure"].search(self.config) else False + #pwd determination: + pwd_style='shortened path' + n=WAYS_TO_FIND["pwd_num"].search(self.config) + if n: + pwd_style=f'shortened path ({n.group(1)} folders)' + elif WAYS_TO_FIND["pwd_basename"].search(self.config): + pwd_style='basename (current directory name)' + elif WAYS_TO_FIND["pwd_short"].search(self.config): + pwd_style='shortened path' + elif WAYS_TO_FIND["pwd_full"].search(self.config): + pwd_style='full path' + self.capabilities["basic"]["pwd"]=pwd_style + #checking for the extras + #? theory: I will loop through the keys in WAYS_TO_FIND['extra'] in order to have the name of the tool + #? then i will verify if it applies. If it does, then I will add the key to the capabilities extra list. + for key in WAYS_TO_FIND['extra'].keys(): + if WAYS_TO_FIND['extra'][key].search(self.config): + self.capabilities['extras'].append(key) + else:continue #sounded harder in my head. + def generate_report(self) -> str: + """Generating the report, returns a string formated as a markdown list. + """ + extras=', '.join(self.capabilities["extras"]) if self.capabilities["extras"] else '' + lines=[ + f"# Report for {self.name}", + f"- Name: {self.name}", + f"- Shows username: {self.capabilities["basic"]["username"]}", + f"- Shows hostname: {self.capabilities["basic"]["hostname"]}", + f"- Shows time/date: {self.capabilities["basic"]["time"]}", + f"- Shows last command failure: {self.capabilities["basic"]["last_failure"]}", + f"- PWD style: {self.capabilities["basic"]["pwd"]}", + f"- Other info: {extras}" + ] + report='\n'.join(lines)+'\n' + return report + +def main(): + p = argparse.ArgumentParser(description='Generate reports/summary.md and reports/summary.csv') + p.add_argument('--reports-dir',required=True , help='Directory containing report files') + p.add_argument('--theme-dirs',required=True,help="Where theme files are. Multiple allowed",action="append") + p.add_argument('--alias',help="anykind of name change to be made. (wezm+ -> wezmplus) Multiple allowed",metavar="'b4:after'",action="append") + args = p.parse_args() + #making the aliases into something usefull. + alias={} + if args.alias: + for i in args.alias: + x=i.split(":", 2) #split the alias in a temp var + alias[x[0]]=x[1] #making the before be the key and the after be the value + #making documentation is harder then i thought ngl, i am not a programmer lol + themeDict: list[type[themes]] + themeDict=[] + #Looping through all theme directory + for theme_dir in args.theme_dirs: + #? step 1 - verify if dir actually exists + if not os.path.isdir(theme_dir): + continue + #? step 2 - loop through all files in dir + for theme in sorted(os.listdir(theme_dir)): + if not theme.endswith('.zsh-theme'): #verification that the file is actually a theme file + continue + #now i need to obtain the important data... + themeName=theme[:-10] #remove the file extension from name + if alias: + if themeName in alias.keys: themeName=alias[themeName] + themePath=os.path.join(theme_dir,theme) + rePath=os.path.join(args.reports_dir,themeName) + try: + with open(themePath,'r',errors='ignore') as fh: + themeConfig=fh.read() + except Exception as e: + print("Failed to read config file: "+themePath) + print(e) + continue + #Now adding to the theme dict the class for the theme. + themeDict.append(themes(themeName,themeConfig,themePath,rePath)) + for th in themeDict: + th.fill_data() + report=th.generate_report() + try: + with open(th.repath, "w") as f: + f.write(report) + except Exception as e: + print("failed write") + exit(1) + + +if __name__ == '__main__': + main()