uwat.cc/check.py

79 lines
2.9 KiB
Python
Raw Permalink Normal View History

#!/usr/bin/env python3
import os
import re
import yaml
SRC_DIR = os.path.join(os.path.dirname(__file__), 'src')
def ensure(cond, output):
if not cond:
raise SystemExit(output)
def check_link(link, description=True):
ensure(isinstance(link, dict), 'a link must be dict, not: %s' % (link,))
ensure('name' in link, 'a link must contain a name: %s' % (link,))
ensure(isinstance(link['name'], str), 'key "name" under link must be string: %s' % (link,))
ensure(link['name'].startswith('/'), 'the name of a link must start with /: %s' % (link,))
ensure(re.match('^/[a-z0-9-]+$', link['name']),
'the name of a link must be / followed by letters, numbers, and -, not %s' % (link['name'],))
ensure('target' in link, 'link "%s" must contain a target' % (link['name'],))
ensure(isinstance(link['target'], str), 'key "target" under link "%s" must be string' % (link['name'],))
if description:
ensure('description' in link, 'link "%s" must contain a description' % (link['name'],))
ensure(isinstance(link['description'], str),
'key "description" under link "%s" must be string' % (link['name'],))
def main():
with open(os.path.join(SRC_DIR, 'links.yml'), encoding='utf-8') as f:
links = yaml.safe_load(f)
unique = set()
ensure('sections' in links, 'links.yml should contain key "sections"')
ensure(isinstance(links['sections'], list), 'key "sections" should map to a list')
for section in links['sections']:
ensure(isinstance(section, dict), 'every item in "sections" should be a dict')
ensure('id' in section, 'every section must have an id')
ensure(isinstance(section['id'], str), 'section IDs must be strings')
ensure(re.match('^[a-z-]+$', section['id']), 'section IDs should only contain lowercase letters and -')
ensure('name' in section, 'every section must have a name')
ensure(isinstance(section['name'], str), 'section names must be strings')
ensure('links' in section, 'every section must have links')
ensure(isinstance(section['links'], list), 'links under %s must be a list' % (section['id'],))
for link in section['links']:
check_link(link)
if link['name'] in unique:
raise SystemExit('duplicate link "%s"' % link['name'])
unique.add(link['name'])
if 'other_links' in links:
ensure(isinstance(links['other_links'], list), 'other_links must be a list')
for link in links['other_links']:
check_link(link, description=False)
if link['name'] in unique:
raise SystemExit('duplicate link "%s"' % link['name'])
unique.add(link['name'])
with open(os.path.join(SRC_DIR, 'index.html'), encoding='utf-8') as f:
contents = f.read()
ensure('{listing}' in contents, 'index.html should have {listing}')
if __name__ == '__main__':
main()