ArgTools
Argument Handling
ArgTools.ArgRead
— TypeArgRead = Union{AbstractString, AbstractCmd, IO}
أنواع ArgRead
هي اتحاد للأنواع التي يعرفها دالة arg_read
كيفية تحويلها إلى مقبضات IO قابلة للقراءة. انظر arg_read
لمزيد من التفاصيل.
ArgTools.ArgWrite
— TypeArgWrite = Union{AbstractString, AbstractCmd, IO}
أنواع ArgWrite
هي اتحاد من الأنواع التي يعرفها دالة arg_write
لكيفية تحويلها إلى مقبضات IO قابلة للكتابة، باستثناء Nothing
التي تتعامل معها arg_write
عن طريق إنشاء ملف مؤقت. انظر arg_write
لمزيد من التفاصيل.
ArgTools.arg_read
— Functionarg_read(f::Function, arg::ArgRead) -> f(arg_io)
تقبل دالة arg_read
وسيطًا arg
يمكن أن يكون أيًا من هذه:
AbstractString
: مسار ملف لفتحه للقراءةAbstractCmd
: أمر للتنفيذ، يتم القراءة من مخرجاته القياسيةIO
: مقبض IO مفتوح للقراءة منه
سواءً كانت النتيجة طبيعية أو حدث خطأ، سيتم إغلاق المسار الذي تم فتحه قبل العودة من arg_read
وسيتم تفريغ مقبض IO
ولكن لن يتم إغلاقه قبل العودة من arg_read
.
ملاحظة: عند فتح ملف، ستقوم ArgTools بتمرير lock = false
إلى استدعاء open(...)
للملف. لذلك، يجب عدم استخدام الكائن الذي تم إرجاعه من هذه الدالة من عدة خيوط. قد يتم تخفيف هذا القيد في المستقبل، مما لن يكسر أي كود يعمل.
ArgTools.arg_write
— Functionarg_write(f::Function, arg::ArgWrite) -> arg
arg_write(f::Function, arg::Nothing) -> tempname()
تقبل دالة arg_read
وسيطًا arg
يمكن أن يكون أيًا من هذه:
AbstractString
: مسار ملف لفتحه للكتابةAbstractCmd
: أمر للتنفيذ، يكتب إلى مدخلاته القياسيةIO
: مقبض IO مفتوح للكتابةNothing
: يجب كتابة مسار مؤقت
إذا عاد الجسم بشكل طبيعي، سيتم إغلاق المسار الذي تم فتحه عند الانتهاء؛ بينما يظل وسيط مقبض IO مفتوحًا ولكن يتم تفريغه قبل العودة. إذا كان الوسيط هو nothing
، فسيتم فتح مسار مؤقت للكتابة وإغلاقه عند الانتهاء، وسيتم إرجاع المسار من arg_write
. في جميع الحالات الأخرى، يتم إرجاع arg
نفسه. هذه نمط مفيد حيث يمكنك بشكل متسق إرجاع ما تم كتابته، سواء تم تمرير وسيط أم لا.
إذا حدث خطأ أثناء تقييم الجسم، سيتم حذف المسار الذي تم فتحه بواسطة arg_write
للكتابة، سواء تم تمريره كسلسلة نصية أو كمسار مؤقت تم إنشاؤه عندما يكون arg
هو nothing
.
ملاحظة: عند فتح ملف، ستقوم ArgTools بتمرير lock = false
إلى استدعاء open(...)
للملف. لذلك، يجب عدم استخدام الكائن الذي تم إرجاعه من هذه الدالة من عدة خيوط. قد يتم تخفيف هذا القيد في المستقبل، مما لن يكسر أي كود يعمل.
ArgTools.arg_isdir
— Functionarg_isdir(f::Function, arg::AbstractString) -> f(arg)
تأخذ دالة arg_isdir
المتغير arg
الذي يجب أن يكون مسارًا إلى دليل موجود (يتم رفع خطأ خلاف ذلك) وتقوم بتمرير ذلك المسار إلى f
وأخيرًا تعيد نتيجة f(arg)
. هذه بالتأكيد أقل أداة مفيدة تقدمها ArgTools
وتوجد في الغالب من أجل التماثل مع arg_mkdir
ولتقديم رسائل خطأ متسقة.
ArgTools.arg_mkdir
— Functionarg_mkdir(f::Function, arg::AbstractString) -> arg
arg_mkdir(f::Function, arg::Nothing) -> mktempdir()
تأخذ دالة arg_mkdir
المتغير arg
الذي يجب أن يكون إما واحدًا من:
- مسار إلى دليل فارغ موجود بالفعل،
- مسار غير موجود يمكن إنشاؤه كدليل، أو
nothing
وفي هذه الحالة يتم إنشاء دليل مؤقت.
في جميع الحالات، يتم إرجاع المسار إلى الدليل. إذا حدث خطأ أثناء f(arg)
، يتم إرجاع الدليل إلى حالته الأصلية: إذا كان موجودًا بالفعل ولكنه كان فارغًا، فسيتم إفراغه؛ إذا لم يكن موجودًا، فسيتم حذفه.
Function Testing
ArgTools.arg_readers
— Functionarg_readers(arg :: AbstractString, [ type = ArgRead ]) do arg::Function
## إعداد ما قبل الاختبار ##
@arg_test arg begin
arg :: ArgRead
## اختبار باستخدام `arg` ##
end
## تنظيف ما بعد الاختبار ##
end
تأخذ دالة arg_readers
مسارًا ليتم قراءته وكتلة do ذات حجة واحدة، والتي يتم استدعاؤها مرة واحدة لكل نوع من أنواع قارئ الاختبار التي يمكن أن يتعامل معها arg_read
. إذا تم إعطاء حجة type
الاختيارية، فسيتم استدعاء كتلة do فقط للقارئين الذين ينتجون حججًا من هذا النوع.
الحجة arg
المرسلة إلى كتلة do ليست قيمة الحجة نفسها، لأن بعض أنواع حجج الاختبار تحتاج إلى التهيئة والتصفية لكل حالة اختبار. اعتبر حجة مقبض ملف مفتوح: بمجرد أن تستخدمه لاختبار واحد، لا يمكنك استخدامه مرة أخرى؛ تحتاج إلى إغلاقه وفتح الملف مرة أخرى للاختبار التالي. يمكن تحويل هذه الدالة arg
إلى مثيل ArgRead
باستخدام @arg_test arg begin ... end
.
ArgTools.arg_writers
— Functionarg_writers([ type = ArgWrite ]) do path::String, arg::Function
## إعداد ما قبل الاختبار ##
@arg_test arg begin
arg :: ArgWrite
## اختبار باستخدام `arg` ##
end
## تنظيف ما بعد الاختبار ##
end
تأخذ دالة arg_writers
كتلة do، والتي يتم استدعاؤها مرة واحدة لكل نوع كاتب اختبار يمكن أن يتعامل معه arg_write
مع path
مؤقت (غير موجود) و arg
الذي يمكن تحويله إلى أنواع وسائط قابلة للكتابة مختلفة تكتب إلى path
. إذا تم إعطاء الوسيطة الاختيارية type
، فإن كتلة do يتم استدعاؤها فقط للكتاب الذين ينتجون وسائط من هذا النوع.
الـ arg
الممرر إلى كتلة do ليس قيمة الوسيطة نفسها، لأن بعض أنواع الوسائط الاختبارية تحتاج إلى التهيئة والانتهاء لكل حالة اختبار. اعتبر وسيطة مقبض ملف مفتوح: بمجرد أن تستخدمه لاختبار واحد، لا يمكنك استخدامه مرة أخرى؛ تحتاج إلى إغلاقه وفتح الملف مرة أخرى للاختبار التالي. يمكن تحويل هذه الدالة arg
إلى مثيل ArgWrite
باستخدام @arg_test arg begin ... end
.
هناك أيضًا طريقة arg_writers
تأخذ اسم مسار مثل arg_readers
:
arg_writers(path::AbstractString, [ type = ArgWrite ]) do arg::Function
## إعداد ما قبل الاختبار ##
@arg_test arg begin
# هنا `arg :: ArgWrite`
## اختبار باستخدام `arg` ##
end
## تنظيف ما بعد الاختبار ##
end
تكون هذه الطريقة مفيدة إذا كنت بحاجة إلى تحديد path
بدلاً من استخدام اسم المسار الذي تم إنشاؤه بواسطة tempname()
. نظرًا لأن path
يتم تمريره من خارج arg_writers
، فإن المسار ليس وسيطة في كتلة do في هذا الشكل.
ArgTools.@arg_test
— Macro@arg_test arg1 arg2 ... body
تُستخدم ماكرو @arg_test
لتحويل دوال arg
المقدمة من arg_readers
و arg_writers
إلى قيم فعلية للوسائط. عندما تكتب @arg_test arg body
، فإنها تعادل arg(arg -> body)
.