Vous ne pouvez pas sélectionner plus de 25 sujets Les noms de sujets doivent commencer par une lettre ou un nombre, peuvent contenir des tirets ('-') et peuvent comporter jusqu'à 35 caractères.

33 lignes
1.5 KiB

  1. import os
  2. import re
  3. from typing import Dict
  4. from calculate.utils.files import read_file_lines
  5. class ProfileWalker:
  6. '''Объект обходящий все директории профиля через parent файлы.'''
  7. def __init__(self, filename: str, repositories: Dict[str, str]):
  8. self.repositories: Dict[str, str] = repositories
  9. self.filename: str = filename
  10. self.re_reppath: re.Pattern = re.compile("^({0})+:".format(
  11. "|".join(self.repositories.keys())))
  12. def interpolate(self, path: str):
  13. def subfunc(m):
  14. return "{0}/profiles/".format(self.repositories.get(m.group(1)))
  15. return self.re_reppath.sub(subfunc, path)
  16. def find(self, directory: str):
  17. '''Метод для поиска по профилю всех файлов с именем, указанным в
  18. self.filename.'''
  19. parent_file_path = os.path.join(directory, "parent")
  20. for line in (parent_line for parent_line in
  21. read_file_lines(parent_file_path) if parent_line.strip()):
  22. parent_directory = os.path.normpath(
  23. os.path.join(directory, self.interpolate(line)))
  24. if os.path.exists(parent_directory):
  25. yield from self.find(parent_directory)
  26. findfile = os.path.normpath(os.path.join(directory, self.filename))
  27. if os.path.exists(findfile):
  28. yield findfile