gemme installer ice_cube
ice_cube est une bibliothèque Ruby permettant de gérer facilement les événements répétés (planifications). L'API est calquée sur les événements iCalendar, dans une syntaxe Ruby agréable. La puissance réside dans la possibilité de spécifier plusieurs règles et de permettre à ice_cube de déterminer rapidement si le calendrier tombe à une certaine date (.occurs_on ?) ou à quelles heures il se produit (.occurrences, .first, .all_occurrences).
Imaginez que vous vouliez :
Chaque vendredi 13 qui tombe en octobre
Vous écririez :
planning = IceCube::Schedule.newschedule.add_recurrence_rule( IceCube::Rule.yearly.day_of_month(13).day(:vendredi).month_of_year(:octobre))
Présentation de Lone Star Ruby Conf (diapositives, YouTube)
Introduction rapide
Site Web de documentation
Avec ice_cube, vous pouvez spécifier (par ordre croissant de priorité) :
Règles de récurrence - Règles sur la manière d'inclure des heures récurrentes dans un planning
Temps de récurrence - À inclure spécifiquement dans un planning
Heures d'exception - Pour exclure spécifiquement d'un planning
Exemple : Spécification d'une récurrence avec une heure d'exception. Nécessite "rails/activesupport" ( gem install 'activesupport'
).
require 'ice_cube'require '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# liste les occurrences jusqu'à end_time (end_time est nécessaire pour les règles sans fin)occurrences = planning.occurrences(end_time) # [now]# ou toutes les occurrences (uniquement pour les planifications de fin) occurrences = planning.all_occurrences # [maintenant, maintenant + 2.jours, maintenant + 3.jours]# ou vérifiez un seul horaire.occurs_at?(maintenant + 1.day) # falseschedule.occurs_at?(now + 2.days) # true# ou vérifiez un seul daychedule.occurs_on?(Date.today) # true# ou vérifiez si cela se produit entre deux datesschedule.occurs_between?(maintenant, maintenant + 30.jours) # trueschedule.occurs_between?(maintenant + 4.jours, maintenant + 30.jours) # faux# ou les (n) premières occurrencesschedule.first(2) # [maintenant, maintenant + 2.days]schedule.first # now# ou les (n) dernières occurrences (si le planning se termine)schedule.last(2) # [now + 2.days, now + 3.days]schedule.last # now + 3.days# ou la prochaine occurrenceschedule.next_occurrence(from_time) # par défaut Time.nowschedule.next_occurrences(4, from_time) # est par défaut Time.nowschedule.remaining_occurrences # pour mettre fin aux plannings# ou aux occurrences précédenteschedule.previous_occurrence(from_time)schedule.previous_occurrences(4, from_time)# ou inclure des occurrences antérieures dont la durée chevauche from_timeschedule .next_occurrences(4, from_time, s'étend sur : true)schedule.occurrences_between(from_time, to_time, spans: true)# ou donnez une durée au planning et demandez si cela se produit_at?schedule = IceCube::Schedule.new(now, durée: 3600)schedule.add_recurrence_rule IceCube::Rule.dailyschedule .occurring_at?(maintenant + 1800) # trueschedule.occurring_between?(t1, t2)# en utilisant end_time définit également la duréeschedule = 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# prenez le contrôle et utilisez iterationschedule = IceCube::Schedule.newschedule.add_recurrence_rule IceCube::Rule.daily.until(Date.today + 30)schedule.each_occurrence { |t| met t }
La raison pour laquelle les plannings ont des durées et non des règles individuelles est de maintenir la compatibilité avec la RFC ical : http://www.kanzaki.com/docs/ical/rrule.html
Pour limiter les planifications, utilisez count
ou until
sur les règles de récurrence. La définition end_time
sur le planning définit simplement la durée (à partir de l'heure de début) pour chaque occurrence.
ice_cube fonctionne très bien sans ActiveSupport mais ne prend en charge que le seul fuseau horaire "local" de l'environnement ( ENV['TZ']
) ou UTC. Pour prendre en charge correctement plusieurs fuseaux horaires (en particulier pour l'heure d'été), vous devez avoir besoin de « active_support/time ».
Les occurrences d'un planning seront renvoyées dans la même classe et le même fuseau horaire que l'heure de début du planning. Les heures de début de planification sont prises en charge comme :
Time.local (par défaut lorsqu'aucune heure n'est spécifiée)
Heure.utc
ActiveSupport :: TimeWithZone (avec Time.zone.now
, Time.zone.local
, time.in_time_zone(tz)
)
DateTime (obsolète) et Date sont convertis en Time.local
ice_cube implémente son propre .to_yaml basé sur le hachage, afin que vous puissiez rapidement (et en toute sécurité) sérialiser les objets de planification dans et hors de votre magasin de données.
Il prend également en charge la sérialisation partielle vers/depuis ICAL
. L'analyse des dates et heures avec les informations de fuseau horaire n'est actuellement pas prise en charge.
yaml = planning.to_yamlIceCube::Schedule.from_yaml(yaml)hash = planning.to_hashIceCube ::Schedule.from_hash(hash)ical = planning.to_icalIceCube ::Schedule.from_ical(ical)
ice_cube peut fournir des représentations graphiques ou sous forme de chaîne de règles individuelles ou de l'ensemble du programme.
Rule = IceCube::Rule.daily(2).day_of_week(mardi : [1, -1], mercredi : [2])rule.to_ical # 'FREQ=DAILY;INTERVAL=2;BYDAY=1TU,-1TU,2WE 'rule.to_s # 'Tous les 2 jours le dernier et le 1er mardi et le 2ème mercredi'
Il existe de nombreux types de règles de récurrence qui peuvent être ajoutées à un planning :
# tous les jourschedule.add_recurrence_rule IceCube::Rule.daily# tous les trois jourschedule.add_recurrence_rule IceCube::Rule.daily(3)
# toutes les semaineschedule.add_recurrence_rule IceCube::Rule.weekly# toutes les deux semaines le lundi et le mardischedule.add_recurrence_rule IceCube::Rule.weekly(2).day(:lundi, :tuesday)# pour des raisons de commodité programmatique (comme ci-dessus). add_recurrence_rule IceCube::Rule.weekly(2).day(1, 2)# spécifiant un intervalle hebdomadaire avec un premier jour de semaine différent (par défaut le dimanche)schedule.add_recurrence_rule IceCube::Rule.weekly(1, :monday)
# tous les mois le premier et le dernier jour du moischedule.add_recurrence_rule IceCube::Rule.monthly.day_of_month(1, -1)# tous les deux mois le 15 du moischedule.add_recurrence_rule IceCube::Rule.monthly(2). jour_du_mois(15)
Les règles mensuelles ignoreront les mois trop courts pour le jour du mois spécifié (par exemple, aucune occurrence en février pour day_of_month(31)
).
# tous les mois le premier et le dernier mardi du moischedule.add_recurrence_rule IceCube::Rule.monthly.day_of_week(mardi: [1, -1])# tous les deux mois le premier lundi et le dernier mardischedule.add_recurrence_rule IceCube::Rule. mensuel(2).day_of_week( lundi : [1], mardi : [-1])# pour des raisons de commodité de programmation (comme ci-dessus)schedule.add_recurrence_rule IceCube::Rule.monthly(2).day_of_week(1 => [1], 2 => [-1])
# chaque année, les 100e jours à compter du début et de la fin de l'année. .day_of_year(-1)
# chaque année le même jour que start_time mais en janvier et février (:mars)# pour plus de commodité programmatique (identique à ci-dessus)schedule.add_recurrence_rule IceCube::Rule.yearly(3).month_of_year(3)
# toutes les heures à la même minute et seconde que les dates de débutchedule.add_recurrence_rule IceCube::Rule.hourly# toutes les deux heures, le lundischedule.add_recurrence_rule IceCube::Rule.hourly(2).day(:monday)
# toutes les 10 minutesschedule.add_recurrence_rule IceCube::Rule.minutely(10)# toutes les heures et demie, le dernier mardi du moischedule.add_recurrence_rule IceCube::Rule.minutely(90).day_of_week(mardi : [-1])
# toutes les secondeschedule.add_recurrence_rule IceCube::Rule.secondly# toutes les 15 secondes entre 12h00 et 12h59schedule.add_recurrence_rule IceCube::Rule.secondly(15).hour_of_day(12)
L'équipe de GetJobber dispose d'un RecurringSelect open source, ce qui facilite le travail avec IceCube dans une application Rails via de belles aides.
Découvrez-le sur https://github.com/GetJobber/recurring_select
https://github.com/ice-cube-ruby/ice_cube/graphs/contributors
Utilisez le suivi des problèmes GitHub
Les contributions sont les bienvenues - J'utilise GitHub pour le suivi des problèmes (les tests qui échouent sont géniaux) et les demandes de fonctionnalités
Soumettre via fork et pull request (inclure les tests)
Si vous travaillez sur quelque chose d'important, envoyez-moi un message au préalable