6
0
Fork 0
Você não pode selecionar mais de 25 tópicos Os tópicos devem começar com uma letra ou um número, podem incluir traços ('-') e podem ter até 35 caracteres.

33 linhas
1.5 KiB

Esse arquivo contém caracteres Unicode ambíguos!

Este arquivo contém caracteres ambíguos Unicode que podem ser confundidos com outros no seu idioma atual. Se o seu caso de uso for intencional e legítimo, você pode ignorar com segurança este aviso. Use o botão Escapar para destacar esses caracteres.

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