보석 설치 ice_cube
ice_cube는 반복되는 이벤트(스케줄)를 쉽게 처리하기 위한 Ruby 라이브러리입니다. API는 iCalendar 이벤트를 따라 멋진 Ruby 구문으로 모델링되었습니다. 강력한 기능은 여러 규칙을 지정하고 ice_cube에서 일정이 특정 날짜(.occurs_on?)에 속하는지 또는 해당 일정이 몇시에 발생하는지(.occurrences, .first, .all_occurrences) 빠르게 파악하도록 하는 기능에 있습니다.
당신이 원하는 것을 상상해보십시오 :
10월 매주 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'
)가 필요합니다.
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# end_time까지 발생 목록(비종료 규칙의 경우 end_time이 필요함)occurrences = Schedule.occurrences(end_time) # [now]# 또는 모든 발생(일정 종료에만 해당) 발생 = Schedule.all_occurrences # [지금, 지금 + 2.일, 지금 + 3.일]# 또는 하나만 확인 timeschedule.occurs_at?(now + 1.day) # falseschedule.occurs_at?(now + 2.days) # true# 또는 단일 dayschedule.occurs_on?(Date.today) # true# 또는 두 날짜 사이에 발생하는지 확인 날짜 일정.occurs_between?(현재, 현재 + 30.일) # trueschedule.occurs_between?(현재 + 4.일, 현재 + 30.일) # false# 또는 첫 번째(n) 발생sschedule.first(2) # [지금, 지금 + 2.일]schedule.first # 지금# 또는 마지막(n) 발생(if 일정이 종료됩니다)schedule.last(2) # [지금 + 2.일, 지금 + 3.일]schedule.last # 지금 + 3.일# 또는 다음 발생 일정.next_occurrence(from_time) # 기본값은 Time.nowschedule.next_occurrences(4, from_time) # 기본값은 Time.nowschedule.remaining_occurrences # 일정 종료# 또는 이전 발생chedule.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(now, 기간: 3600 )schedule.add_recurrence_rule IceCube::Rule.dailyschedule.occurring_at?(now + 1800) # trueschedule.occurring_between?(t1, t2)# end_time을 사용하면 지속 시간도 설정됩니다.schedule = 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을 사용합니다.schedule = IceCube::Schedule.newschedule.add_recurrence_rule IceCube::Rule.daily.until( 날짜.오늘 + 30)schedule.each_occurrence { |t| t를 넣습니다 }
일정에 개별 규칙이 아닌 기간이 있는 이유는 ical RFC(http://www.kanzaki.com/docs/ical/rrule.html)와의 호환성을 유지하기 위한 것입니다.
일정을 제한하려면 반복 규칙에서 count
또는 until
사용하세요. 일정에 end_time
설정하면 각 발생의 기간(시작 시간부터)만 설정됩니다.
ice_cube는 ActiveSupport 없이도 훌륭하게 작동하지만 환경의 단일 "로컬" 시간대( ENV['TZ']
) 또는 UTC만 지원합니다. 여러 시간대(특히 DST의 경우)를 올바르게 지원하려면 'active_support/time'이 필요합니다.
일정의 발생은 일정의 start_time과 동일한 클래스 및 시간대에 반환됩니다. 일정 시작 시간은 다음과 같이 지원됩니다.
Time.local(시간이 지정되지 않은 경우 기본값)
시간.utc
ActiveSupport::TimeWithZone ( Time.zone.now
, Time.zone.local
, time.in_time_zone(tz)
포함)
DateTime(더 이상 사용되지 않음) 및 Date는 Time.local로 변환됩니다.
ice_cube는 자체 해시 기반 .to_yaml을 구현하므로 데이터 저장소 내부 및 외부에서 일정 개체를 빠르고 안전하게 직렬화할 수 있습니다.
또한 ICAL
과의 부분 직렬화를 지원합니다. 시간대 정보를 사용한 날짜/시간 구문 분석은 현재 지원되지 않습니다.
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는 개별 규칙이나 전체 일정에 대한 형식 또는 문자열 표현을 제공할 수 있습니다.
rule = IceCube::Rule.daily(2).day_of_week(화요일: [1, -1], 수요일: [2])rule.to_ical # 'FREQ=DAILY;INTERVAL=2;BYDAY=1TU,-1TU,2WE 'rule.to_s # '마지막, 첫째 화요일, 둘째 수요일 2일마다'
일정에 추가할 수 있는 다양한 유형의 반복 규칙이 있습니다.
# 매일chedule.add_recurrence_rule IceCube::Rule.daily# 3일마다chedule.add_recurrence_rule IceCube::Rule.daily(3)
# 매주chedule.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)
# 매월 Monthchedule.add_recurrence_rule IceCube::Rule.monthly.day_of_month(1, -1)# 매월 15일 Monthchedule.add_recurrence_rule IceCube::Rule.monthly(2). day_of_month(15)
월별 규칙은 지정된 날짜에 비해 너무 짧은 달을 건너뜁니다(예: day_of_month(31)
에 대해 2월에 발생하지 않음).
# 매달 첫 번째와 마지막 화요일에chedule.add_recurrence_rule IceCube::Rule.monthly.day_of_week(tuesday: [1, -1])# 격월로 첫 번째 월요일과 마지막 tuesdayschedule.add_recurrence_rule IceCube::Rule. 월별(2).day_of_week( 월요일: [1], tuesday: [-1])# 프로그래밍상의 편의를 위해 (위와 동일)schedule.add_recurrence_rule IceCube::Rule.monthly(2).day_of_week(1 => [1], 2 => [-1])
# 매년 yearchedule.add_recurrence_rule IceCube::Rule.yearly.day_of_year(100, -100)# 새해 4년마다 eveschedule.add_recurrence_rule IceCube::Rule.yearly(4) .day_of_year(-1)
# 매년 start_time과 같은 날, 단 1월 및 februaryschedule.add_recurrence_rule IceCube::Rule.yearly.month_of_year(:january, :february)# Marchschedule.add_recurrence_rule의 3년마다 IceCube::Rule.yearly(3).month_of_year (:march)# 프로그래밍상의 편의를 위해 (동일 위)schedule.add_recurrence_rule IceCube::Rule.yearly(3).month_of_year(3)
# 매시간 시작 날짜와 동일한 분, 초에chedule.add_recurrence_rule IceCube::Rule.hourly# 격월로, mondaysschedule.add_recurrence_rule IceCube::Rule.hourly(2).day(:monday)
# 10분마다schedule.add_recurrence_rule IceCube::Rule. Minutely(10)# 매시간 30분마다, 해당 월의 마지막 화요일에chedule.add_recurrence_rule IceCube::Rule. Minutely(90).day_of_week(tuesday: [-1])
# 매 초chedule.add_recurrence_rule IceCube::Rule.secondly# 12:00 - 12:59 사이에 15초마다schedule.add_recurrence_rule IceCube::Rule.secondly(15).hour_of_day(12)
GetJobber 팀은 RecurringSelect를 오픈 소스로 공개했습니다. 이를 통해 몇 가지 훌륭한 도우미를 통해 Rails 앱에서 IceCube 작업을 더 쉽게 할 수 있습니다.
https://github.com/GetJobber/recurring_select에서 확인하세요.
https://github.com/ice-cube-ruby/ice_cube/graphs/contributors
GitHub 문제 추적기 사용
기여를 환영합니다. 저는 문제 추적(실패한 테스트에 수반되는 테스트는 훌륭합니다) 및 기능 요청을 위해 GitHub를 사용합니다.
포크 및 풀 요청을 통해 제출(테스트 포함)
중요한 일을 하고 있다면 미리 메시지를 보내주세요.