جوهرة تثبيت Ice_cube
Ice_cube هي مكتبة روبي للتعامل بسهولة مع الأحداث (الجداول الزمنية) المتكررة. تم تصميم واجهة برمجة التطبيقات (API) على غرار أحداث iCalendar، في بناء جملة روبي لطيف. تكمن القوة في القدرة على تحديد قواعد متعددة، وجعل Ice_cube يكتشف بسرعة ما إذا كان الجدول يقع في تاريخ معين (.occurs_on؟)، أو في أي وقت يحدث فيه (.occurrences، .first، .all_occurrences).
تخيل أنك تريد:
كل يوم جمعة يوم 13 الذي يصادف شهر أكتوبر
سوف تكتب:
الجدول = IceCube::Schedule.newschedule.add_recurrence_rule( IceCube::Rule.yearly.day_of_month(13).day(:friday).month_of_year(:october))
عرض تقديمي من Lone Star Ruby Conf (شرائح، YouTube)
مقدمة سريعة
موقع التوثيق
باستخدام Ice_cube، يمكنك تحديد (بترتيب الأسبقية المتزايد):
قواعد التكرار - قواعد حول كيفية تضمين الأوقات المتكررة في الجدول الزمني
أوقات التكرار - لتضمينها على وجه التحديد في الجدول الزمني
أوقات الاستثناء - للاستثناء على وجه التحديد من الجدول الزمني
مثال: تحديد تكرار مع وقت استثناء. يتطلب "rails/activesupport" ( gem install 'activesupport'
).
تتطلب 'ice_cube' تتطلب 'active_support/time'schedule = IceCube::Schedule.new(now = Time.now) do |s| s.add_recurrence_rule(IceCube::Rule.daily.count(4)) s.add_exception_time(now + 1.day)end# قائمة التكرارات حتى end_time (يلزم وقت النهاية للقواعد غير الإنهاء)occurrences = جدول.occurrences(end_time) # [now]# أو جميع التكرارات (فقط لجداول الإنهاء) الأحداث = الجدول الزمني. جميع_الأحداث # [الآن، الآن + 2.days، الآن + 3.days]# أو تحقق جدول زمني واحد فقط.occurs_at?(الآن + 1.day) # falseschedule.occurs_at?(الآن + 2.days) # true# أو تحقق من جدول زمني واحد فقط.occurs_on?(Date.today) # true# أو تحقق مما إذا كان يحدث بين تاريخينschedule.occurs_between?(الآن، الآن + 30.days) # trueschedule.occurs_between?(now + 4.days، now + 30.days) # false# أو أول (n) تكراراتschedule.first(2) # [now, now + 2.days]schedule.first # now# أو آخر (n) تكرارات ( إذا انتهى الجدول)schedule.last(2) # [الآن + 2.days، الآن + 3.days]schedule.last # now + 3.days# أو التالي الحدثschedule.next_occurrence(from_time) # الافتراضي هو Time.nowschedule.next_occurrences(4, from_time) # الافتراضي هو Time.nowschedule.remaining_occurrences # لإنهاء الجداول# أو الحدوث السابق.previous_occurrence(from_time)schedule.previous_occurrences(4, from_time)# أو تشمل السابقة تكرارات ذات مدة متداخلة from_timeschedule.next_occurrences(4, from_time,spans: true)schedule.occurrences_between(from_time, to_time,spans: true)# أو قم بإعطاء الجدول مدة واسأل عما إذا كان يحدث_at?schedule = IceCube::Schedule.new( الآن المدة: 3600)schedule.add_recurrence_rule IceCube::Rule.dailyschedule.occurring_at?(now + 1800) # trueschedule.occurring_between?(t1, t2)# استخدام end_time يضبط أيضًا جدول المدة = IceCube::Schedule.new(start = Time.now, end_time: start + 3600 )schedule.add_recurrence_rule IceCube::Rule.dailyschedule.occurring_at?(start + 3599) # trueschedule.occurring_at?(start + 3600) # false# السيطرة واستخدام iterationschedule = IceCube::Schedule.newschedule.add_recurrence_rule IceCube::Rule.daily.until( التاريخ.اليوم + 30)schedule.each_occurrence { |t| يضع ر }
السبب في أن الجداول لها فترات وليس قواعد فردية، هو الحفاظ على التوافق مع RFC ical: http://www.kanzaki.com/docs/ical/rrule.html
للحد من الجداول، استخدم count
أو until
في قواعد التكرار. يؤدي تعيين end_time
في الجدول إلى تعيين المدة (من وقت البدء) لكل تكرار.
يعمل Ice_cube بشكل رائع بدون ActiveSupport ولكنه يدعم فقط المنطقة الزمنية "المحلية" الوحيدة للبيئة ( ENV['TZ']
) أو UTC. لدعم مناطق زمنية متعددة بشكل صحيح (خاصة التوقيت الصيفي)، يجب أن تحتاج إلى "active_support/time".
سيتم إرجاع تكرارات الجدول في نفس الفصل والمنطقة الزمنية مثل وقت بدء الجدول. يتم دعم أوقات البدء المجدولة على النحو التالي:
Time.local (الافتراضي عندما لا يتم تحديد وقت)
التوقيت العالمي المنسق
ActiveSupport::TimeWithZone (مع Time.zone.now
و Time.zone.local
و time.in_time_zone(tz)
)
يتم تحويل DateTime (مهمل) والتاريخ إلى Time.local
ينفذ Ice_cube ملف .to_yaml الخاص به القائم على التجزئة، حتى تتمكن بسرعة (وبأمان) من إجراء تسلسل لكائنات الجدول داخل وخارج مخزن البيانات الخاص بك
كما أنه يدعم التسلسل الجزئي من/إلى ICAL
. تحليل أوقات التاريخ مع معلومات المنطقة الزمنية غير مدعوم حاليًا.
yaml = جدول.to_yamlIceCube::Schedule.from_yaml(yaml)hash = جدول.to_hashIceCube::Schedule.from_hash(hash)ical = جدول.to_icalIceCube::Schedule.from_ical(ical)
يمكن أن يوفر Ice_cube تمثيلات ical أو سلسلة للقواعد الفردية، أو الجدول بأكمله.
القاعدة = IceCube::Rule.daily(2).day_of_week(tuesday: [1, -1], الأربعاء: [2])rule.to_ical # 'FREQ=DAILY;INTERVAL=2;BYDAY=1TU,-1TU,2WE 'rule.to_s # 'كل يومين في يومي الثلاثاء الأخير والأول والأربعاء الثاني'
هناك العديد من أنواع قواعد التكرار التي يمكن إضافتها إلى الجدول الزمني:
# every timeschedule.add_recurrence_rule IceCube::Rule.daily# كل يوم ثالث.add_recurrence_rule IceCube::Rule.daily(3)
# كلweekschedule.add_recurrence_rule IceCube::Rule.weekly# كل أسبوعين من يوم الاثنين وtuesdayschedule.add_recurrence_rule IceCube::Rule.weekly(2).day(:monday, :tuesday)# للجدول الزمني الملائم برمجيًا (كما هو مذكور أعلاه). add_recurrence_rule IceCube::Rule.weekly(2).day(1, 2)# تحديد فاصل زمني أسبوعي مع أول يوم أسبوعي مختلف (الافتراضي هو الأحد)schedule.add_recurrence_rule IceCube::Rule.weekly(1, :monday)
# كل شهر في اليوم الأول والأخير من جدول الأشهر.add_recurrence_rule IceCube::Rule.monthly.day_of_month(1, -1)# كل شهرين في اليوم الخامس عشر من جدول الأشهر.add_recurrence_rule IceCube::Rule.monthly(2). يوم_من_الشهر(15)
سوف تتخطى القواعد الشهرية الأشهر القصيرة جدًا بالنسبة لليوم المحدد من الشهر (على سبيل المثال، لا توجد حالات في شهر فبراير لـ day_of_month(31)
).
# كل شهر في يومي الثلاثاء الأول والأخير من Monthschedule.add_recurrence_rule IceCube::Rule.monthly.day_of_week(tuesday: [1, -1])# كل شهرين في أول اثنين وآخر ثلاثاء جدولة.add_recurrence_rule IceCube::Rule. شهريا(2).day_of_week( الاثنين: [1]، الثلاثاء: [-1])# لسهولة البرمجة (كما هو مذكور أعلاه)schedule.add_recurrence_rule IceCube::Rule.monthly(2).day_of_week(1 => [1], 2 => [-1])
# كل عام في اليوم المائة من بداية ونهاية جدول السنوات.add_recurrence_rule IceCube::Rule.yearly.day_of_year(100, -100)# كل أربع سنوات في جدول العام الجديد.add_recurrence_rule IceCube::Rule.yearly(4) .day_of_year(-1)
# كل عام في نفس يوم البدء ولكن في يناير وفبراير.add_recurrence_rule IceCube::Rule.yearly.month_of_year(:january, :february)# كل عام ثالث في Marchschedule.add_recurrence_rule IceCube::Rule.yearly(3).month_of_year (:march)# لسهولة البرمجة (مثل أعلاه)schedule.add_recurrence_rule IceCube::Rule.yearly(3).month_of_year(3)
# كل ساعة في نفس الدقيقة والثانية من مواعيد البدء IceCube::Rule.hourly# كل ساعتين، في mondaysschedule.add_recurrence_rule IceCube::Rule.hourly(2).day(:monday)
# كل 10 دقائقschedule.add_recurrence_rule IceCube::Rule.minutely(10)# كل ساعة ونصف، في يوم الثلاثاء الأخير من أشهرجدول.add_recurrence_rule IceCube::Rule.دقيقة(90).day_of_week(tuesday: [-1])
# every Secondschedule.add_recurrence_rule IceCube::Rule.thanly# كل 15 ثانية بين 12:00 - 12:59schedule.add_recurrence_rule IceCube::Rule.thanly(15).hour_of_day(12)
فريق العمل في GetJobber لديه RecurringSelect مفتوح المصدر، مما يجعل العمل مع IceCube أسهل في تطبيق Rails عبر بعض المساعدين اللطيفين.
التحقق من ذلك على https://github.com/GetJobber/recurring_select
https://github.com/ice-cube-ruby/ice_cube/graphs/contributors
استخدم أداة تعقب مشكلات GitHub
نرحب بالمساهمات - أستخدم GitHub لتتبع المشكلات (الاختبارات الفاشلة المصاحبة رائعة) وطلبات الميزات
إرسال عبر طلب الشوكة والسحب (بما في ذلك الاختبارات)
إذا كنت تعمل على شيء كبير، أرسل لي رسالة مسبقًا