Назад к задачам
Middle — Senior
6

SOLID‑рефакторинг: преобразование FileStatManager

Получайте помощь с лайвкодингом в реальном времени с Sobes Copilot
Условие задачи

Необходимо привести класс FileStatManager в соответствие с принципами SOLID. Требуется разделить обязанности, вынести работу с файловой системой и взаимодействие с пользователем в отдельные модули, чтобы каждый класс отвечал только за свою часть функционала.

import csv
import os
import shutil

class FileStatManager:
    def __init__(self):
        self.txt_stat = FileStats('txt')
        self.csv_stat = FileStats('csv')

    def read_txt_stats(self, file_path):
        with open(file_path, 'r') as f:
            lines = f.readlines()
            self.txt_stat.increase(lines=len(lines))
        print('TXT stats were updated.')

    def read_csv_stats(self, file_path):
        with open(file_path, 'r') as f:
            reader = csv.reader(f)
            lines = list(reader)
            self.csv_stat.increase(lines=len(lines), columns=min(len(l) for l in lines))
        print('CSV stats were updated.')

    def choose_file(self):
        while True:
            file_path = input('Enter a path to a file you want to count:')
            if os.path.isfile(file_path):
                break
            else:
                print('You entered a wrong path. Try again.')

        if file_path.endswith('.txt'):
            self.read_txt_stats(file_path)
        elif file_path.endswith('.csv'):
            self.read_csv_stats(file_path)

    def clean_stats(self):
        while True:
            answer = input('Are you sure? (y/n)')
            if answer == 'y':
                self.txt_stat = FileStats('txt')
                self.csv_stat = FileStats('csv')
                print('Stats were cleaned')
                break
            elif answer == 'n':
                print('Stats were preserved')
                break

    def show_stats(self):
        print('TXT stats:')
        print(self.txt_stat)
        print('CSV stats:')
        print(self.csv_stat)

    def clean_folder(self):
        while True:
            folder_path = input('Enter a path to a folder you want to clean:')
            if os.path.isdir(folder_path):
                break
            else:
                print('You entered a wrong path. Try again.')

        while True:
            answer = input('Are you sure? (y/n)')
            if answer == 'y':
                try:
                    shutil.rmtree(folder_path)
                    print('Folder was cleaned')
                    break
                except Exception as e:
                    print('Something went wrong. Try again.')
            elif answer == 'n':
                print('Folder was preserved')
                break