Knaph

حلقه16 از 37

درونِ پوشه بمان

در درس «[ابزارهایی که به فایل‌ها دست می‌زنند](tools-that-touch-files)» دیدید mini چطور ابزارهای فایلش را درونِ یک پوشه نگه می‌دارد. اینجا همان بررسی را می‌نویسید، و آزمون‌ها مسیرهای فریبنده‌ای را امتحان می‌کنند که ممکن است یک مدل بفرستد. ## ورودی خطِ اول پوشه‌ی کاری را نام می‌برد، و بعد در هر خط یک مسیر، همان‌طور که یک مدل ممکن است به یک ابزار بدهد: ``text root /home/leila/project notes.txt ../secrets.txt /etc/passwd /home/leila/project-old/notes.txt ` ## چه بنویسید inside_folder(root, path) اگر مسیر درونِ پوشه بماند True و اگر از آن بیرون برود False برمی‌گرداند. کدِ زیرِ آن پیش از هر مسیر allowed یا blocked چاپ می‌کند. برای نمونه‌ی بالا: `text allowed notes.txt blocked ../secrets.txt blocked /etc/passwd blocked /home/leila/project-old/notes.txt ` قاعده‌ها، همان قاعده‌های inside در mini: - مسیر نسبت به پوشه حساب می‌شود، مگر اینکه با / شروع شود؛ آن وقت همان‌طور که هست به کار می‌رود. posixpath.join(root, path) دقیقاً همین کار را می‌کند. - با posixpath.normpath حساب کنید مسیر واقعاً به کجا می‌رسد؛ این تابع reports/../notes.txt را به notes.txt تبدیل می‌کند. پیش از آن root را هم به همین شکل یکدست کنید، چون ممکن است با اسلش تمام شود. - مسیر درونِ پوشه است اگر خودِ پوشه باشد، یا با اسمِ پوشه و بعد / شروع شود. بدونِ اسلش، /home/leila/project-old درونِ /home/leila/project به نظر می‌رسید. - یک قاعده که mini ندارد: هر مسیری را که با ~ شروع می‌شود ممنوع کنید. برای یک آدم ~ یعنی پوشه‌ی خانگی؛ برای join فقط پوشه‌ای به اسمِ ~ است. در هر دو حالت، چیزی نیست که یک ابزار درباره‌اش حدس بزند. فقط به متنِ مسیر نگاه کنید، هرگز به دیسک: posixpath` به فایل‌ها دست نمی‌زند. (حدِ این بررسی هم همین است: پیوندی درونِ پوشه که به بیرون اشاره کند رد می‌شود. درس می‌گوید چه چیزی جلوی آن را می‌گیرد.)

ورود برای امتحان این تمرین.