Spaces:
Sleeping
Sleeping
| # The selector library provides a set of tools to select molecule | |
| # subset with maximum molecular diversity. | |
| # | |
| # Copyright (C) 2023 The QC-Devs Community | |
| # | |
| # This file is part of selector. | |
| # | |
| # selector is free software; you can redistribute it and/or | |
| # modify it under the terms of the GNU General Public License | |
| # as published by the Free Software Foundation; either version 3 | |
| # of the License, or (at your option) any later version. | |
| # | |
| # selector is distributed in the hope that it will be useful, | |
| # but WITHOUT ANY WARRANTY; without even the implied warranty of | |
| # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
| # GNU General Public License for more details. | |
| # | |
| # You should have received a copy of the GNU General Public License | |
| # along with this program; if not, see <http://www.gnu.org/licenses/> | |
| # | |
| # -- | |
| import os | |
| from fnmatch import fnmatch | |
| from glob import glob | |
| def strip_header(lines, closing): | |
| # search for the header closing line, i.e. '# --\n' | |
| counter = 0 | |
| found = False | |
| for line in lines: | |
| counter += 1 | |
| if line == closing: | |
| found = True | |
| break | |
| if found: | |
| del lines[:counter] | |
| # If the header closing is not found, we assume it is not present. | |
| # add a header closing line | |
| lines.insert(0, closing) | |
| def fix_python(fn, lines, header_lines): | |
| # check if a shebang is present | |
| do_shebang = lines[0].startswith("#!") | |
| # remove the current header | |
| strip_header(lines, "# --\n") | |
| # add a pylint line for test files: | |
| # if os.path.basename(fn).startswith('test_'): | |
| # if not lines[1].startswith('#pylint: skip-file'): | |
| # lines.insert(1, '#pylint: skip-file\n') | |
| # add new header (insert in reverse order) | |
| for hline in header_lines[::-1]: | |
| lines.insert(0, ("# " + hline).strip() + "\n") | |
| # add a source code encoding line | |
| lines.insert(0, "# -*- coding: utf-8 -*-\n") | |
| if do_shebang: | |
| lines.insert(0, "#!/usr/bin/env python\n") | |
| def fix_c(fn, lines, header_lines): | |
| # check for an exception line | |
| for line in lines: | |
| if "no_update_headers" in line: | |
| return | |
| # remove the current header | |
| strip_header(lines, "//--\n") | |
| # add new header (insert must be in reverse order) | |
| for hline in header_lines[::-1]: | |
| lines.insert(0, ("// " + hline).strip() + "\n") | |
| def fix_rst(fn, lines, header_lines): | |
| # check for an exception line | |
| for line in lines: | |
| if "no_update_headers" in line: | |
| return | |
| # remove the current header | |
| strip_header(lines, " : --\n") | |
| # add an empty line after header if needed | |
| if len(lines[1].strip()) > 0: | |
| lines.insert(1, "\n") | |
| # add new header (insert must be in reverse order) | |
| for hline in header_lines[::-1]: | |
| lines.insert(0, (" : " + hline).rstrip() + "\n") | |
| # add comment instruction | |
| lines.insert(0, "..\n") | |
| def iter_subdirs(root): | |
| for dn, _, _ in os.walk(root): | |
| yield dn | |
| def main(): | |
| source_dirs = [".", "doc", "scripts", "tools"] + list(iter_subdirs("procrustes")) | |
| fixers = [ | |
| ("*.py", fix_python), | |
| ("*.pxd", fix_python), | |
| ("*.pyx", fix_python), | |
| ("*.txt", fix_python), | |
| ("*.c", fix_c), | |
| ("*.cpp", fix_c), | |
| ("*.h", fix_c), | |
| ("*.rst", fix_rst), | |
| ] | |
| f = open("HEADER") | |
| header_lines = f.readlines() | |
| f.close() | |
| for sdir in source_dirs: | |
| print("Scanning:", sdir) | |
| for fn in glob(sdir + "/*.*"): | |
| if not os.path.isfile(fn): | |
| continue | |
| for pattern, fixer in fixers: | |
| if fnmatch(fn, pattern): | |
| print(" Fixing:", fn) | |
| with open(fn) as f: | |
| lines = f.readlines() | |
| fixer(fn, lines, header_lines) | |
| with open(fn, "w") as f: | |
| f.writelines(lines) | |
| break | |
| if __name__ == "__main__": | |
| main() | |