ملاحظات سلوكية من اختبار ics_to_discourse.py
لقد أجريت سلسلة من الاختبارات على هذا البرنامج النصي (مع وبدون --time-only-dedupe) واعتقدت أنه سيكون من المفيد توثيق تدفق التحديث/التبني بالتفصيل.
1. كيفية تحديد التفرد
- الوضع الافتراضي: يتطلب التبني تطابق البداية + النهاية + الموقع بالضبط.
- مع
--time-only-dedupe: يتطلب التبني فقط البداية + النهاية؛ يُعامل الموقع على أنه “قريب بما فيه الكفاية”.
إذا لم يتطابق أي موضوع موجود مع هذه القواعد، يتم إنشاء موضوع جديد.
2. دور علامة UID
- يحصل كل موضوع حدث على علامة HTML مخفية في المنشور الأول:
<!-- ICSUID:xxxxxxxxxxxxxxxx -->
- في عمليات التشغيل اللاحقة، يبحث البرنامج النصي عن تلك العلامة أولاً.
- إذا تم العثور عليها، يُعتبر الموضوع مطابقًا لـ UID ويتم تحديثه مباشرة، بغض النظر عن مدى صخب أو قدم نص الوصف.
- هذا يجعل UID مفتاح الهوية الحقيقي. حقول الوصف المرئية لا تؤثر على المطابقة.
3. تدفق التحديث مع مطابقة UID
- يجلب البرنامج النصي المنشور الأول ويزيل العلامة:
old_clean = strip_marker(old_raw)
fresh_clean = strip_marker(fresh_raw)
- إذا كان old_clean == fresh_clean: لا يوجد تحديث (يتجنب التغيير).
- إذا اختلفا: تحقق مما إذا كان التغيير “ذا مغزى”:
meaningful = (
_norm_time(old_attrs.get("start")) != _norm_time(new_attrs.get("start"))
or _norm_time(old_attrs.get("end")) != _norm_time(new_attrs.get("end"))
or _norm_loc(old_attrs.get("location")) != _norm_loc(new_attrs.get("location"))
)
- إذا كان meaningful = True → تحديث مع دفعة (يرتفع الموضوع في الأحدث).
- إذا كان meaningful = False → تحديث بهدوء (bypass_bump=True → مراجعة فقط، لا دفعة).
- يتم دمج العلامات (يضمن وجود العلامات الثابتة/الافتراضية، ولا يزيل أبدًا العلامات اليدوية/الخاصة بالمشرف).
- لا يتم تغيير العنوان والفئة أبدًا عند التحديث.
- تدفق التحديث بدون مطابقة UID
- يحاول البرنامج النصي التبني:
• يبني ثلاثيات مرشحة للبداية/النهاية/الموقع (أو البداية/النهاية فقط مع --time-only-dedupe).
• يبحث في /search.json و /latest.json عن حدث موجود بسمات متطابقة.
• إذا تم العثور عليه → تبني هذا الموضوع، وتزويده بعلامة UID والعلامات (يُترك الجسم دون تغيير في هذه المرحلة).
• إذا لم يتم العثور عليه → إنشاء موضوع جديد تمامًا بالعلامة والعلامات. - بمجرد تبنيه أو إنشائه، ستحل جميع المزامنات المستقبلية مباشرة عن طريق UID.
⸻
- العواقب العملية
• تغييرات الوقت
• افتراضي: يفشل التبني (الأوقات مختلفة) → يتم إنشاء موضوع جديد.
• مع --time-only-dedupe: يفشل التبني بنفس الطريقة؛ يتم إنشاء موضوع جديد.
• تغييرات الموقع
• افتراضي: يفشل التبني (الموقع مختلف) → يتم إنشاء موضوع جديد.
• مع --time-only-dedupe: ينجح التبني (الأوقات متطابقة)، ولكن يتم تمييز اختلاف الموقع على أنه “ذو مغزى” → تحديث مع دفعة.
• تغييرات الوصف
• إذا تغير نص الوصف ولكن لم تتغير البداية/النهاية/الموقع:
• يتم تحديث الجسم بهدوء (bypass_bump=True).
• يتم إنشاء مراجعة للموضوع، ولكن لا توجد دفعة في الأحدث.
• إذا لم يتغير الوصف (أو كان مجرد ضوضاء مثل Last Updated: التي يتم تطبيعها بعيدًا)، فلن يحدث أي تحديث على الإطلاق.
• علامة UID
• يضمن المطابقة الموثوقة في المزامنات المستقبلية.
• يعني أن حقول الوصف الصاخبة لا تؤثر على ما إذا كان الموضوع الصحيح سيتم العثور عليه.
⸻
- لماذا يبقى الوصف “كما هو” أحيانًا
يقارن البرنامج النصي الجسم بأكمله (باستثناء علامة UID).
إذا كان سطر متقلب فقط مثل Last Updated: مختلفًا، ولكنه يتم تطبيعه بعيدًا (مثل المسافات البيضاء، نهايات الأسطر، Unicode)، فإن old_clean و fresh_clean يبدوان متطابقين → لا يتم إجراء أي تحديث.
هذا عن قصد، لمنع التغيير من ضوضاء التغذية.
⸻
ملخص
• الوقت يحدد التفرد (ينشئ دائمًا موضوعًا جديدًا عند تغيير الأوقات).
• تغييرات الموقع → دفعة مرئية (حتى يلاحظ المستخدمون تحديثات المكان).
• تغييرات الوصف → تحديث هادئ (مراجعة ولكن لا دفعة).
• علامة UID = مفتاح هوية موثوق، يضمن العثور دائمًا على الموضوع الصحيح، حتى لو كان الوصف قديمًا أو صاخبًا.
هذا يحقق توازنًا جيدًا: التغييرات المهمة تظهر في الأحدث، والتغييرات غير المهمة تبقى غير مرئية.