X-Git-Url: https://git.arvados.org/rnaseq-cwl-training.git/blobdiff_plain/90f06fcfe146a185c9f71c288f838fdd4393c0ef..efa2cc93ffcce0bb335a8f2e5121c67c146fcb8c:/bin/lesson_check.py diff --git a/bin/lesson_check.py b/bin/lesson_check.py old mode 100755 new mode 100644 index 2597da5..1fd7118 --- a/bin/lesson_check.py +++ b/bin/lesson_check.py @@ -1,5 +1,3 @@ -#!/usr/bin/env python3 - """ Check lesson files and their contents. """ @@ -29,19 +27,19 @@ SOURCE_RMD_DIRS = ['_episodes_rmd'] # specially. This list must include all the Markdown files listed in the # 'bin/initialize' script. REQUIRED_FILES = { - '%/CODE_OF_CONDUCT.md': True, - '%/CONTRIBUTING.md': False, - '%/LICENSE.md': True, - '%/README.md': False, - '%/_extras/discuss.md': True, - '%/_extras/guide.md': True, - '%/index.md': True, - '%/reference.md': True, - '%/setup.md': True, + 'CODE_OF_CONDUCT.md': True, + 'CONTRIBUTING.md': False, + 'LICENSE.md': True, + 'README.md': False, + os.path.join('_extras', 'discuss.md'): True, + os.path.join('_extras', 'guide.md'): True, + 'index.md': True, + 'reference.md': True, + 'setup.md': True, } # Episode filename pattern. -P_EPISODE_FILENAME = re.compile(r'/_episodes/(\d\d)-[-\w]+.md$') +P_EPISODE_FILENAME = re.compile(r'(\d\d)-[-\w]+.md$') # Pattern to match lines ending with whitespace. P_TRAILING_WHITESPACE = re.compile(r'\s+$') @@ -69,7 +67,8 @@ KNOWN_BLOCKQUOTES = { 'prereq', 'quotation', 'solution', - 'testimonial' + 'testimonial', + 'warning' } # What kinds of code fragments are allowed? @@ -79,12 +78,16 @@ KNOWN_CODEBLOCKS = { 'source', 'language-bash', 'html', + 'language-c', + 'language-cmake', + 'language-cpp', 'language-make', 'language-matlab', 'language-python', 'language-r', 'language-shell', - 'language-sql' + 'language-sql', + 'warning' } # What fields are required in teaching episode metadata? @@ -217,7 +220,7 @@ def read_references(reporter, ref_path): result = {} urls_seen = set() - with open(ref_path, 'r') as reader: + with open(ref_path, 'r', encoding='utf-8') as reader: for (num, line) in enumerate(reader, 1): if P_INTERNAL_INCLUDE_LINK.search(line): continue @@ -272,7 +275,7 @@ def check_fileset(source_dir, reporter, filenames_present): """Are all required files present? Are extraneous files present?""" # Check files with predictable names. - required = [p.replace('%', source_dir) for p in REQUIRED_FILES] + required = [os.path.join(source_dir, p) for p in REQUIRED_FILES] missing = set(required) - set(filenames_present) for m in missing: reporter.add(None, 'Missing required file {0}', m) @@ -282,7 +285,10 @@ def check_fileset(source_dir, reporter, filenames_present): for filename in filenames_present: if '_episodes' not in filename: continue - m = P_EPISODE_FILENAME.search(filename) + + # split path to check episode name + base_name = os.path.basename(filename) + m = P_EPISODE_FILENAME.search(base_name) if m and m.group(1): seen.append(m.group(1)) else: @@ -556,7 +562,7 @@ CHECKERS = [ (re.compile(r'README\.md'), CheckNonJekyll), (re.compile(r'index\.md'), CheckIndex), (re.compile(r'reference\.md'), CheckReference), - (re.compile(r'_episodes/.*\.md'), CheckEpisode), + (re.compile(os.path.join('_episodes', '*\.md')), CheckEpisode), (re.compile(r'.*\.md'), CheckGeneric) ]