Вы не можете выбрать более 25 тем
Темы должны начинаться с буквы или цифры, могут содержать дефисы(-) и должны содержать не более 35 символов.
33 строки
1.5 KiB
33 строки
1.5 KiB
import os
|
|
import re
|
|
from typing import Dict
|
|
from calculate.utils.files import read_file_lines
|
|
|
|
|
|
class ProfileWalker:
|
|
'''Объект обходящий все директории профиля через parent файлы.'''
|
|
def __init__(self, filename: str, repositories: Dict[str, str]):
|
|
self.repositories: Dict[str, str] = repositories
|
|
self.filename: str = filename
|
|
self.re_reppath: re.Pattern = re.compile("^({0})+:".format(
|
|
"|".join(self.repositories.keys())))
|
|
|
|
def interpolate(self, path: str):
|
|
def subfunc(m):
|
|
return "{0}/profiles/".format(self.repositories.get(m.group(1)))
|
|
return self.re_reppath.sub(subfunc, path)
|
|
|
|
def find(self, directory: str):
|
|
'''Метод для поиска по профилю всех файлов с именем, указанным в
|
|
self.filename.'''
|
|
parent_file_path = os.path.join(directory, "parent")
|
|
for line in (parent_line for parent_line in
|
|
read_file_lines(parent_file_path) if parent_line.strip()):
|
|
parent_directory = os.path.normpath(
|
|
os.path.join(directory, self.interpolate(line)))
|
|
if os.path.exists(parent_directory):
|
|
yield from self.find(parent_directory)
|
|
findfile = os.path.normpath(os.path.join(directory, self.filename))
|
|
if os.path.exists(findfile):
|
|
yield findfile
|