البرمجة

أهم اختبارات في Jinja

بعض من أهم الاختبارات المُتوفّرة في مُحرّك القوالب Jinja

يُعدّ مُحرّك القوالب Jinja أحد أقوى وأشهر محركات القوالب المستخدمة في بيئة Python، خاصة في تطبيقات الويب المعتمدة على إطار العمل Flask وDjango (عبر تكامل غير مباشر). يتميز Jinja بقدرته العالية على توليد محتوى HTML ديناميكي من خلال قوالب مُنظمة ومدمجة مع منطق برمجي محدود، ما يجعل الكود أكثر نظافة، وأسهل في الصيانة، ويعزز الفصل بين منطق التطبيق ومظهره.

من أبرز أدوات Jinja التي تُستخدم ضمن القوالب هي الاختبارات (Tests). توفر Jinja مجموعة من الاختبارات الجاهزة التي تُستخدم للتحقق من نوع القيم، خصائصها، أو تحقق شروط معينة داخل التعبيرات الشرطية. هذه الاختبارات تُستخدم غالبًا مع عبارة if وتُقدَّم بواسطة الكلمة المحجوزة is.


أهمية الاختبارات (Tests) في Jinja

توفر الاختبارات في Jinja طبقة إضافية من الذكاء داخل القوالب، حيث يمكن استخدامها لاتخاذ قرارات أثناء توليد المحتوى. على سبيل المثال، يُمكن عبرها التحقق مما إذا كانت القيمة سلسلة نصية، أو قائمة، أو رقم، أو حتى None. كما يمكن من خلالها اختبار التفريغ، أو التساوي، أو التحقق من تواجد عنصر ضمن مجموعة، أو مطابقة نمط معين.


البنية العامة لاستخدام الاختبارات

يتم استخدام الاختبارات ضمن الشيفرة في قوالب Jinja باستخدام الصيغة التالية:

jinja
{% if variable is test_name %} {% endif %}

بعض الاختبارات تقبل وسائط إضافية:

jinja
{% if variable is test_name(argument) %} {% endif %}

أهم الاختبارات في Jinja

فيما يلي عرض موسّع لأبرز الاختبارات المتوفّرة في محرك Jinja، مع توضيح وظيفتها وأمثلة عملية على استخدامها:


1. defined

الوظيفة: يُستخدم للتحقق مما إذا كانت المتغيرات معرفة في السياق.

مثال:

jinja
{% if username is defined %}

مرحبا {{ username }}

{% endif %}

الفائدة: تجنب الأخطاء الناتجة عن استخدام متغيرات غير معرفة.


2. undefined

الوظيفة: عكس defined؛ يتحقق مما إذا كان المتغير غير معرف.

مثال:

jinja
{% if user_age is undefined %}

العمر غير محدد

{% endif %}

3. none

الوظيفة: يتحقق مما إذا كانت القيمة None (أي لا تحتوي على شيء).

مثال:

jinja
{% if profile_picture is none %} {% endif %}

4. number

الوظيفة: يتحقق مما إذا كانت القيمة رقمية (عدد صحيح أو عشري).

مثال:

jinja
{% if score is number %}

النتيجة: {{ score }}

{% endif %}

5. string

الوظيفة: يتحقق مما إذا كانت القيمة سلسلة نصية (String).

مثال:

jinja
{% if name is string %}

الاسم: {{ name }}

{% endif %}

6. sequence

الوظيفة: يتحقق مما إذا كانت القيمة تمثل تسلسلاً مثل قائمة أو سلسلة.

مثال:

jinja
{% if items is sequence %}
    {% for item in items %}
  • {{ item }}
  • {% endfor %}
{% endif %}

7. mapping

الوظيفة: يتحقق مما إذا كانت القيمة تمثل قاموسًا (dictionary).

مثال:

jinja
{% if user_data is mapping %}

اسم المستخدم: {{ user_data.username }}

{% endif %}

8. iterable

الوظيفة: يتحقق مما إذا كانت القيمة قابلة للتكرار (مثل قائمة أو سلسلة أو قاموس).

مثال:

jinja
{% if values is iterable %} {% for val in values %}

{{ val }}

{% endfor %} {% endif %}

9. callable

الوظيفة: يتحقق مما إذا كانت القيمة قابلة للاستدعاء (مثل دالة).

مثال:

jinja
{% if func is callable %} {{ func() }} {% endif %}

10. divisibleby

الوظيفة: يتحقق مما إذا كانت القيمة تقبل القسمة على رقم معين بدون باقي.

مثال:

jinja
{% if num is divisibleby(3) %}

{{ num }} يقبل القسمة على 3

{% endif %}

11. even / odd

الوظيفة: even يتحقق من كون الرقم زوجي، وodd يتحقق من كونه فردي.

مثال:

jinja
{% if number is even %}

{{ number }} هو عدد زوجي

{% endif %} {% if number is odd %}

{{ number }} هو عدد فردي

{% endif %}

12. equalto

الوظيفة: يتحقق مما إذا كانت القيمة مساوية لقيمة معينة.

مثال:

jinja
{% if status is equalto("success") %}

تمت العملية بنجاح

{% endif %}

13. greaterthan / lessthan

الوظيفة: يقارن ما إذا كانت القيمة أكبر أو أصغر من قيمة محددة.

مثال:

jinja
{% if age is greaterthan(18) %}

مرحبًا بك، أنت بالغ

{% endif %}

14. sameas

الوظيفة: يتحقق من تطابق الكائنات (identical references).

مثال:

jinja
{% if obj1 is sameas(obj2) %}

الكائنان متماثلان

{% endif %}

15. lower / upper

الوظيفة: يتحقق مما إذا كانت السلسلة نصية مكتوبة بأحرف صغيرة أو كبيرة بالكامل.

مثال:

jinja
{% if name is lower %}

الاسم مكتوب بأحرف صغيرة

{% endif %}

16. startingwith / endingwith

الوظيفة: يتحقق مما إذا كانت السلسلة تبدأ أو تنتهي بقيمة معينة.

مثال:

jinja
{% if filename is endingwith(".jpg") %} {% endif %}

جدول مقارن لأهم الاختبارات

اسم الاختبار الوظيفة أمثلة على الاستخدام
defined يتحقق من وجود المتغير {% if var is defined %}
none يتحقق إن كانت القيمة None {% if var is none %}
string يتحقق إن كانت القيمة سلسلة نصية {% if name is string %}
number يتحقق إن كانت القيمة رقمية {% if age is number %}
sequence يتحقق من كون القيمة تسلسل {% if items is sequence %}
divisibleby(n) يتحقق من القابلية للقسمة {% if count is divisibleby(2) %}
even / odd يتحقق من الزوجية أو الفردية {% if num is even %}
equalto(value) يتحقق من المساواة لقيمة {% if status is equalto("ok") %}
callable يتحقق من قابلية الاستدعاء {% if func is callable %}
sameas(value) يتحقق من التطابق الكامل بين كائنين {% if var is sameas(another_var) %}
lower / upper يتحقق من حالة الحروف في النص {% if word is upper %}

أهمية الاختبارات في كتابة قوالب نظيفة وآمنة

تكمن أهمية هذه الاختبارات في كونها تساهم بشكل مباشر في كتابة قوالب:

  • أكثر وضوحًا وتنظيمًا: عبر تقليل التحقق من القيم في منطق التطبيق وجعل القالب أكثر استقلالية.

  • أكثر أمنًا: حيث يتم التأكد من وجود القيم وأنواعها قبل استخدامها.

  • أكثر مرونة: يمكن إعادة استخدام القوالب مع متغيرات مختلفة من دون تعديل كبير.


الخاتمة

الاختبارات في Jinja تُعد أدوات أساسية ضمن القوالب، تُستخدم للتحقق من القيم واتخاذ قرارات منطقية مباشرة أثناء إنشاء المحتوى الديناميكي. بفضل تنوعها وسهولة دمجها في بنية القوالب، تمكّن المطور من كتابة صفحات ديناميكية دقيقة وآمنة، ذات أداء محسّن وقابلية عالية للصيانة.

إن فهم هذه الاختبارات واستخدامها بشكل صحيح يُعد خطوة ضرورية لكل مطور يستخدم Jinja، ويضمن إنتاج تطبيقات ويب ذات جودة عالية على مستوى العرض والمنطق.


المراجع: