instalación de gemas ice_cube
ice_cube es una biblioteca Ruby para manejar fácilmente eventos repetidos (horarios). La API está modelada a partir de los eventos de iCalendar, en una agradable sintaxis de Ruby. El poder radica en la capacidad de especificar múltiples reglas y hacer que ice_cube averigüe rápidamente si el cronograma cae en una fecha determinada (.occurs_on?) o en qué horas ocurre (.occurrences, .first, .all_occurrences).
Imagina que quieres:
Cada viernes 13 que cae en octubre.
Escribirías:
programación = IceCube::Schedule.newschedule.add_recurrence_rule( IceCube::Regla.anual.día_del_mes(13).día(:viernes).mes_del_año(:octubre))
Presentación de Lone Star Ruby Conf (diapositivas, YouTube)
Introducción rápida
Sitio web de documentación
Con ice_cube, puede especificar (en orden creciente de precedencia):
Reglas de recurrencia: reglas sobre cómo incluir tiempos recurrentes en una programación
Tiempos de recurrencia: para incluir específicamente en un cronograma
Horarios de excepción: para excluir específicamente de un cronograma
Ejemplo: especificar una recurrencia con un tiempo de excepción. Requiere "rails/activesupport" ( gem install 'activesupport'
).
require 'ice_cube'require 'active_support/time'schedule = IceCube::Schedule.new(ahora = Hora.ahora) do |s| s.add_recurrence_rule(IceCube::Rule.daily.count(4)) s.add_exception_time(ahora + 1.día)end# enumera las ocurrencias hasta la hora_final (la hora_final es necesaria para reglas que no terminan)ocurrencias = agenda.ocurrencias(hora_final) # [ahora]# o todas las ocurrencias (solo para programaciones de terminación) ocurrencias = agenda.todas_ocurrencias # [ahora, ahora + 2.días, ahora + 3.días]# o marca solo una timeschedule.occurs_at?(ahora + 1.día) # falseschedule.occurs_at?(ahora + 2.días) # true# o verificar solo un díachedule.occurs_on?(Date.today) # true# o verificar si ocurre entre dos dateschedule.occurs_between?(ahora, ahora + 30 días) # trueschedule.occurs_between?(ahora + 4 días, ahora + 30.days) # false# o las primeras (n) aparicionesschedule.first(2) # [ahora, ahora + 2.days]schedule.first # ahora# o las últimas (n) apariciones (si la programación termina)schedule .last(2) # [ahora + 2.días, ahora + 3.días]schedule.last # ahora + 3.días# o el siguiente ocurrenciaschedule.next_occurrence(from_time) # por defecto es Time.nowschedule.next_occurrences(4, from_time) # por defecto es Time.nowschedule.remaining_occurrences # para terminar programas# o la ocurrencia anteriorschedule.previous_occurrence(from_time)schedule.previous_occurrences(4, from_time)# o incluir sucesos anteriores con una duración que se superponga from_timeschedule.next_occurrences(4, from_time, spans: true)schedule.occurrences_between(from_time, to_time, spans: true)# o proporcione una duración al cronograma y pregunte si ocurre_en?schedule = IceCube::Schedule.new(ahora, duración: 3600 )schedule.add_recurrence_rule IceCube::Rule.dailyschedule.occurring_at?(now + 1800) # trueschedule.occurring_between?(t1, t2)# usando end_time también establece la duraciónchedule = 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# toma el control y usa iterationschedule = IceCube::Schedule.newschedule.add_recurrence_rule IceCube::Rule.daily.until( Fecha.hoy + 30)programación.cada_ocurrencia { |t| pone t }
La razón por la que los cronogramas tienen duraciones y no reglas individuales, es para mantener la compatibilidad con el RFC ical: http://www.kanzaki.com/docs/ical/rrule.html
Para limitar las programaciones, utilice count
o until
en las reglas de recurrencia. Configurar end_time
en la programación simplemente establece la duración (desde la hora de inicio) para cada ocurrencia.
ice_cube funciona muy bien sin ActiveSupport pero solo admite la única zona horaria "local" del entorno ( ENV['TZ']
) o UTC. Para admitir correctamente varias zonas horarias (especialmente para el horario de verano), debe solicitar 'active_support/time'.
Las apariciones de una programación se devolverán en la misma clase y zona horaria que la hora de inicio de la programación. Los horarios de inicio del cronograma se admiten como:
Time.local (predeterminado cuando no se especifica ninguna hora)
Hora.utc
ActiveSupport::TimeWithZone (con Time.zone.now
, Time.zone.local
, time.in_time_zone(tz)
)
DateTime (obsoleto) y Date se convierten a Time.local
ice_cube implementa su propio .to_yaml basado en hash, por lo que puede serializar de forma rápida (y segura) objetos de programación dentro y fuera de su almacén de datos.
También admite serialización parcial hacia/desde ICAL
. Actualmente no se admite el análisis de fechas y horas con información de zona horaria.
yaml = Schedule.to_yamlIceCube::Schedule.from_yaml(yaml)hash = Schedule.to_hashIceCube::Schedule.from_hash(hash)ical = Schedule.to_icalIceCube::Schedule.from_ical(ical)
ice_cube puede proporcionar representaciones físicas o de cadena de reglas individuales o de todo el programa.
regla = IceCube::Rule.daily(2).día_de_semana(martes: [1, -1], miércoles: [2])rule.to_ical # 'FREQ=DAILY;INTERVAL=2;BYDAY=1TU,-1TU,2WE 'rule.to_s # 'Cada 2 días el último y el primer martes y el segundo miércoles'
Hay muchos tipos de reglas de recurrencia que se pueden agregar a una programación:
# cada díaschedule.add_recurrence_rule IceCube::Rule.daily# cada tres díaschedule.add_recurrence_rule IceCube::Rule.daily(3)
# cada semanachedule.add_recurrence_rule IceCube::Rule.weekly# cada dos semanas los lunes y martesschedule.add_recurrence_rule IceCube::Rule.weekly(2).day(:monday, :tuesday)# para programación conveniente programática (igual que arriba). add_recurrence_rule IceCube::Rule.weekly(2).día(1, 2)# especificando un intervalo semanal con un primer día de la semana diferente (por defecto el domingo)schedule.add_recurrence_rule IceCube::Rule.weekly(1, :monday)
# cada mes en el primer y último día del meschedule.add_recurrence_rule IceCube::Rule.monthly.day_of_month(1, -1)# cada dos meses el día 15 del meschedule.add_recurrence_rule IceCube::Rule.monthly(2). día_del_mes(15)
Las reglas mensuales omitirán los meses que sean demasiado cortos para el día del mes especificado (por ejemplo, no hay apariciones en febrero para day_of_month(31)
).
# cada mes el primer y el último martes del meschedule.add_recurrence_rule IceCube::Rule.monthly.day_of_week(tuesday: [1, -1])# cada dos meses el primer lunes y el último martesschedule.add_recurrence_rule IceCube::Rule. mensual(2).día_de_semana( lunes: [1], martes: [-1])# por conveniencia programática (igual que arriba)schedule.add_recurrence_rule IceCube::Rule.monthly(2).day_of_week(1 => [1], 2 => [-1])
# cada año en los días 100 desde el principio y el final del añochedule.add_recurrence_rule IceCube::Rule.yearly.day_of_year(100, -100)# cada cuatro años en las vísperas de año nuevochedule.add_recurrence_rule IceCube::Rule.yearly(4) .día_del_año(-1)
# cada año el mismo día que start_time pero en enero y febreroschedule.add_recurrence_rule IceCube::Rule.yearly.month_of_year(:january, :february)# cada tres años en marzoschedule.add_recurrence_rule IceCube::Rule.yearly(3).month_of_year (:march)# por conveniencia programática (igual que arriba)schedule.add_recurrence_rule IceCube::Rule.yearly(3).month_of_year(3)
# cada hora en el mismo minuto y segundo que las fechas de iniciochedule.add_recurrence_rule IceCube::Rule.hourly# cada dos horas, los lunessschedule.add_recurrence_rule IceCube::Rule.hourly(2).day(:monday)
# cada 10 minutosschedule.add_recurrence_rule IceCube::Rule.minutely(10)# cada hora y media, el último martes del meschedule.add_recurrence_rule IceCube::Rule.minutely(90).day_of_week(tuesday: [-1])
# cada segundochedule.add_recurrence_rule IceCube::Rule.firstly# cada 15 segundos entre las 12:00 y las 12:59schedule.add_recurrence_rule IceCube::Rule.segundo(15).hora_del_día(12)
El equipo de GetJobber tiene RecurringSelect de código abierto, lo que facilita el trabajo con IceCube en una aplicación Rails a través de algunos buenos ayudantes.
Compruébalo en https://github.com/GetJobber/recurring_select
https://github.com/ice-cube-ruby/ice_cube/graphs/contributors
Utilice el rastreador de problemas de GitHub
Las contribuciones son bienvenidas: uso GitHub para el seguimiento de problemas (las pruebas fallidas que lo acompañan son increíbles) y solicitudes de funciones.
Enviar mediante fork y pull request (incluir pruebas)
Si estás trabajando en algo importante, envíame un mensaje de antemano.