Пета задача

  1. Имате честта да се насладите на пета задача.

    Можете да намерите примерен тест в хранилището в github.

    Разбира се уверете се, че сте прочели „Как да (не) си изпращаме задачите“.

    Крайния срок е 17:00 на 30 април.

    Тук може да задавате всякакви възникнали въпроси и да публикувате ваши допълнителни тестове, които да са от полза и за останалите колеги.

  2. Няма как да имаш файл и директория с едно и също име. Това би било катастрофално, ако се случваше в операционните системи. Да не говорим, че при Unix системите директорията представлява специален вид файл, който "съдържа" други файлове - тогава реално би имал 2 файла с едно и също име.

  3. Трябва ли нашите exception-и да са със същите правописни грешки като вашите. Става въпрос за NonexcplicitDirectoryDeletionError и най-вече думата explicit. Също така трябва ли ни NonexplicitFileDeletionError, в смисъл триенето на файлове влияе ли се от стойността на directory.

  4. Вярно ли е че в една директория имаме задължително един или нула файлове/директория.

    Имаме следната файлова структура / /home /home/roo /home/foo/kartinka.png

    kartinka.png е файл.

    В такъв случай за всяка директория от списък атрибутът .file винаги ще върне kartinka.png

    С две думи няма как да имам дървоидна разклонявща се структура от поддиректории. В папка по няколко подпапки?

  5. @Диан:

    "Какво става, когато fs = FileSystem(0) и при FileSystem(-10)"

    Мисля, че трябва да се хвърля NotEnoughSpaceError.

    "Вярно ли е че в една директория имаме задължително един или нула файлове/директория..."

    Методът files() на дадена директория трябва да връща файловете, които се намират в тази директория, не в поддиректориите ѝ. От примера ти:

    • директорията с път "/home" при извикването на files() ще върне празен списък
    • директорията с път "/home/foo" при извикването на files() ще върне списък, в който се съдържа файлът с път "/home/foo/kartinka.png"

    "Какво става, ако имам //home"

    Не мисля, че трябва да е позволено, може би @Евгени може да разясни този въпрос.

    "Какво трябва да изведе fs.get_noed('') и fs.get_node('')"

    Според моето разбиране трябва да хвърля NodeDoesNotExistError.

    @Павел:

    Очевидно това е typo, което просто трябва да се оправи, също както в частта от условието, където се обяснява работата на get_node, грешката, която трябва да се хвърля при ненамерен обект трябва да е NodeDoesNotExistError, а не NodeDoesNotExist.

    Всъшност и аз имам въпрос - редът на проверките (респективно хвърлянето на грешки) трябва да бъде както в условието или...? В един от примерите в условието (където се опитва да се създаде файл '/home/gosho') се хваща грешка относно недостатъчно място, но не трябва ли файловата система да гръмне с DestinationNodeDoesNotExistError преди да бъде хвърлена грешка NotEnoughSpaceError?

  6. По ред на постовете:

    @Павел, два node-a в една директория не могат да се казват по един и същи начин, без значение дали става въпрос за файлове, директории или комбинация от двете.

    @Калоян, името на файл не е задължително да има разширение.

    @Диан, може да приемеш, че FileSystem винаги ще се инициализира с положително число.

    @Павел, правописната грешка в името на exception-а е оправена в условието. Благодаря за откриването. directory няма значение ако трием файл.

    @Диан, повтарящите се последователни '/' може да третирате като едно '/'. '//////home///gosho' е същото като '/home/gosho'. В теста обаче няма да има такива пътища. fs.get_node('') е добре да хвърля NodeDoesNotExist.

    @Екатерина, правилно, там трябва да се счупи още заради несъществуващия /home. Ще направя два отделни примера за целта.

    @Светлин, определен път(ако съществува) сочи към файл, връзка или директория, при коректна имплементация не е възможно да стигнеш до ситуация, в която два node-а се намират на един и същи път.

  7. Нека имам вход

    fs.create('/home', directory=True)
    fs.create('/home/foo', directory=True)
    fs.create('/home/moo', directory=True)
    fs.create('/home/roo', directory=True)
    fs.create('/home/roo/loo', directory=True)
    fs.create('/home/roo/lala', directory=True)
    fs.create('/home/roo/lala/fafa', directory=True)
    fs.create('/home/roo/lala/fafa/swag', directory=True)
    fs.create('/home/roo/lala/fafa/yolo', directory=True)
    fs.create('/home/roo/lala/fafa/nigga', directory=True)
    

    За '/home' какво трябва да върне списъка с поддиректории. Само директните поддиректории или всичко по дървото до долу, включително '/home/roo/lala/fafa/nigga'? С две думи трябва ли да правим пълна рекурсия за да покрием цялата дървоидна структура

  8. Ако в една директория има директория, файл, символна връзка и твърда връзка, какво трябва да върнат методите nodes, files и directories, извикани върху тази папка?

    Предполагам, че твърдата връзка попада в files, но къде попада символната? Тя може да сочи към папка, файл, друга символна връзка, че дори и към несъществуващ node.

  9. @Диан, nodes, files и direcotries винаги връщат елементите - преки деца на съответната директория, не трябва да се прави рекурсия.

    @Теодор, твърдата връзка попада във files, символната според това към какво сочи.

    @Екатерина, duck type all the things! Очаквайте да можете да правите с него всичко, което може да се прави със str, няма значение от какъв тип е.

  10. @Теди, няма как да имаш символна връзка, която сочи към нищо - при опит да се създаде такава, трябва да хвърляш NodeDoesNotExistError. Ето и цитат от условието:

    Ако source не съществува в нашата файлова система и symbolic е True трябва да се хвърли NodeDoesNotExistError.
    
  11. @Теди, не съм те разбрал.

    В такъв случай предполагам, че трябва да остане само в nodes и да се заличи в другите списъци, тъй като реално не сочи към нито един от двата типа обекти, но и това леко противоречи на дефиницията на nodes. Ще е добре да се уточни.

  12. При създаване на празна директория, тя съдържа само root директорията, която е 1 байт. В такъв случай като направим: sda1 = FileSystem(250 * (1024 ** 3)) # initialize a 250GB file system, available_size да считаме, че е ((250 * (1024 * * 3)) - 1) bytes или да считаме, че е (250 * (1024 ** 3)) bytes

  13. @Илиян Якимов

    available_size трябва да отразява оставащото място на файловата система. В нашия случай за простота всеки файл заема толкова байта колкото е дължината на content-а му плюс 1(за „системна информация“), а всяка директория(включително '/') заема по 1 байт.

    Това означава, че отговорът е: ((250 * (1024 * * 3)) - 1)

    даже и в примерният тест го има това:

    >>> fs = FileSystem(22)
    >>> fs.size
    22
    >>> fs.available_size
    21
    
  14. В примерите, които са дадени: evstati_vimrc in evstati_home_directory, мисля че трябва да бъде заменено с evstati_vimrc in evstati_home_directory.files , тъй като evstati_home_directory е Directory object и ще гърми, че не е iterable. Също evstati_vimrc in home_directory трябва да се замени с evstati_vimrc in home_directory.files по същите причини. Последният трябва от evstati.content да стане evstati_vimrc.content

Трябва да сте влезли в системата, за да може да отговаряте на теми.