http://github.com/icalendar/icalendar
Улучшенная документация еще впереди, а пока изменения, необходимые для перехода с 1.x на 2.0, суммируются в различиях, необходимых для обновления README.
iCalendar — это библиотека Ruby для работы с файлами iCalendar в формате iCalendar, определенном RFC-5545.
require 'icalendar'
# Create a calendar with an event (standard method)
cal = Icalendar :: Calendar . new
cal . event do | e |
e . dtstart = Icalendar :: Values :: Date . new ( '20050428' )
e . dtend = Icalendar :: Values :: Date . new ( '20050429' )
e . summary = "Meeting with the man."
e . description = "Have a long lunch meeting and decide nothing..."
e . ip_class = "PRIVATE"
end
cal . publish
event = Icalendar :: Event . new
event . dtstart = DateTime . civil ( 2006 , 6 , 23 , 8 , 30 )
event . summary = "A great event!"
cal . add_event ( event )
event2 = cal . event # This automatically adds the event to the calendar
event2 . dtstart = DateTime . civil ( 2006 , 6 , 24 , 8 , 30 )
event2 . summary = "Another great event!"
params = { "altrep" => "http://my.language.net" , "language" => "SPANISH" }
event = cal . event do | e |
e . dtstart = Icalendar :: Values :: Date . new ( '20050428' )
e . dtend = Icalendar :: Values :: Date . new ( '20050429' )
e . summary = Icalendar :: Values :: Text . new "This is a summary with params." , params
end
event . summary . ical_params #=> {'altrep' => 'http://my.language.net', 'language' => 'SPANISH'}
# or
event = cal . event do | e |
e . dtstart = Icalendar :: Values :: Date . new ( '20050428' )
e . dtend = Icalendar :: Values :: Date . new ( '20050429' )
e . summary = "This is a summary with params."
e . summary . ical_params = params
end
event . summary . ical_params #=> {'altrep' => 'http://my.language.net', 'language' => 'SPANISH'}
Иногда нас не волнует, являются ли начало или конец события объектами Date
или DateTime
. Для этого мы можем использовать DateOrDateTime.new(value)
. Вызов .call
для возвращенного DateOrDateTime
немедленно вернет базовый объект Date
или DateTime
.
event = cal . event do | e |
e . dtstart = Icalendar :: Values :: DateOrDateTime . new ( '20140924' )
e . dtend = Icalendar :: Values :: DateOrDateTime . new ( '20140925' ) . call
e . summary = 'This is an all-day event, because DateOrDateTime will return Dates'
end
Клиентам, которые могут анализировать и отображать URL-адрес, связанный с событием, можно назначить его.
event = cal . event do | e |
e . url = 'https://example.com'
end
cal_string = cal.to_ical
puts cal_string
cal . event do | e |
# ...other event properties
e . alarm do | a |
a . action = "EMAIL"
a . description = "This is an event reminder" # email body (required)
a . summary = "Alarm notification" # email subject (required)
a . attendee = %w( mailto:[email protected] mailto:[email protected] ) # one or more email recipients (required)
a . append_attendee "mailto:[email protected]"
a . trigger = "-PT15M" # 15 minutes before
a . append_attach Icalendar :: Values :: Uri . new ( "ftp://host.com/novo-procs/felizano.exe" , "fmttype" => "application/binary" ) # email attachments (optional)
end
e . alarm do | a |
a . action = "DISPLAY" # This line isn't necessary, it's the default
a . summary = "Alarm notification"
a . trigger = "-P1DT0H0M0S" # 1 day before
end
e . alarm do | a |
a . action = "AUDIO"
a . trigger = "-PT15M"
a . append_attach "Basso"
end
end
# BEGIN:VALARM
# ACTION:EMAIL
# ATTACH;FMTTYPE=application/binary:ftp://host.com/novo-procs/felizano.exe
# TRIGGER:-PT15M
# SUMMARY:Alarm notification
# DESCRIPTION:This is an event reminder
# ATTENDEE:mailto:[email protected]
# ATTENDEE:mailto:[email protected]
# END:VALARM
#
# BEGIN:VALARM
# ACTION:DISPLAY
# TRIGGER:-P1DT0H0M0S
# SUMMARY:Alarm notification
# END:VALARM
#
# BEGIN:VALARM
# ACTION:AUDIO
# ATTACH;VALUE=URI:Basso
# TRIGGER:-PT15M
# END:VALARM
Вызов метода event.alarm
создаст сигнал тревоги, если его не существует. Чтобы проверить, имеет ли событие сигнал тревоги, используйте has_alarm?
метод.
event . has_alarm?
# => false
event . alarm
# => #<Icalendar::Alarm ... >
event . has_alarm?
#=> true
cal = Icalendar :: Calendar . new
cal . timezone do | t |
t . tzid = "America/Chicago"
t . daylight do | d |
d . tzoffsetfrom = "-0600"
d . tzoffsetto = "-0500"
d . tzname = "CDT"
d . dtstart = "19700308T020000"
d . rrule = "FREQ=YEARLY;BYMONTH=3;BYDAY=2SU"
end
t . standard do | s |
s . tzoffsetfrom = "-0500"
s . tzoffsetto = "-0600"
s . tzname = "CST"
s . dtstart = "19701101T020000"
s . rrule = "FREQ=YEARLY;BYMONTH=11;BYDAY=1SU"
end
end
# BEGIN:VTIMEZONE
# TZID:America/Chicago
# BEGIN:DAYLIGHT
# TZOFFSETFROM:-0600
# TZOFFSETTO:-0500
# TZNAME:CDT
# DTSTART:19700308T020000
# RRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=2SU
# END:DAYLIGHT
# BEGIN:STANDARD
# TZOFFSETFROM:-0500
# TZOFFSETTO:-0600
# TZNAME:CST
# DTSTART:19701101T020000
# RRULE:FREQ=YEARLY;BYMONTH=11;BYDAY=1SU
# END:STANDARD
# END:VTIMEZONE
iCalendar имеет некоторую базовую поддержку для создания блоков VTIMEZONE на основе информации о часовом поясе, полученной из tzinfo
. Чтобы воспользоваться преимуществами, вам необходимо вручную запросить поддержку tzinfo
.
iCalendar протестирован и работает с tzinfo
версий 0.3, 1.x и 2.x. Гем tzinfo-data
также может потребоваться в зависимости от вашей версии tzinfo
и, возможно, вашей операционной системы.
require 'icalendar/tzinfo'
cal = Icalendar :: Calendar . new
event_start = DateTime . new 2008 , 12 , 29 , 8 , 0 , 0
event_end = DateTime . new 2008 , 12 , 29 , 11 , 0 , 0
tzid = "America/Chicago"
tz = TZInfo :: Timezone . get tzid
timezone = tz . ical_timezone event_start
cal . add_timezone timezone
cal . event do | e |
e . dtstart = Icalendar :: Values :: DateTime . new event_start , 'tzid' => tzid
e . dtend = Icalendar :: Values :: DateTime . new event_end , 'tzid' => tzid
e . summary = "Meeting with the man."
e . description = "Have a long lunch meeting and decide nothing..."
e . organizer = "mailto:[email protected]"
e . organizer = Icalendar :: Values :: CalAddress . new ( "mailto:[email protected]" , cn : 'John Smith' )
end
# Open a file or pass a string to the parser
cal_file = File . open ( "single_event.ics" )
# Parser returns an array of calendars because a single file
# can have multiple calendars.
cals = Icalendar :: Calendar . parse ( cal_file )
cal = cals . first
# Now you can access the cal object in just the same way I created it
event = cal . events . first
puts "start date-time: #{ event . dtstart } "
puts "start date-time timezone: #{ event . dtstart . ical_params [ 'tzid' ] } "
puts "summary: #{ event . summary } "
Вы также можете создать экземпляр Parser
напрямую, это можно использовать для включения строгого анализа:
# Sometimes you want to strongly verify only rfc-approved properties are
# used
strict_parser = Icalendar :: Parser . new ( cal_file , true )
cal = strict_parser . parse
# Open a file or pass a string to the parser
event_file = File . open ( "event.ics" )
# Parser returns an array of events because a single file
# can have multiple events.
events = Icalendar :: Event . parse ( event_file )
event = events . first
puts "start date-time: #{ event . dtstart } "
puts "start date-time timezone: #{ event . dtstart . ical_params [ 'tzid' ] } "
puts "summary: #{ event . summary } "
Часто в веб-приложениях и других интерактивных приложениях вам нужно искать элементы в календаре, чтобы внести изменения или получить подробную информацию. Теперь вы можете найти все по уникальному идентификатору, автоматически связанному со всеми компонентами.
cal = Calendar . new
10 . times { cal . event } # Create 10 events with only default data.
some_event = cal . events [ 5 ] # Grab it from the array of events
# Use the uid as the key in your app
key = some_event . uid
# so later you can find it.
same_event = cal . find_event ( key )
Проверьте модульные тесты на предмет примеров большинства вещей, которые вам нужно сделать, но, пожалуйста, пришлите мне пример кода или сообщите, чего не хватает.
Последнюю версию этой библиотеки можно найти по адресу
Все дело в рубигемах:
$ gem install icalendar
Чтобы запустить тесты:
$ bundle install
$ rake spec
Эта библиотека выпускается под той же лицензией, что и сам Ruby.
Пожалуйста, отправьте запросы на включение из измененной тематической ветки и включите тесты на все ошибки и функции.
Как участники и сопровождающие этого проекта, мы обязуемся уважать всех людей, которые вносят свой вклад, сообщая о проблемах, публикуя запросы функций, обновляя документацию, отправляя запросы на включение или исправления и другие действия.
Мы стремимся сделать участие в этом проекте свободным от притеснений для всех, независимо от уровня опыта, пола, гендерной идентичности и гендерного самовыражения, сексуальной ориентации, инвалидности, внешнего вида, размера тела, расы, этнической принадлежности, возраста или религии.
Примеры неприемлемого поведения участников включают использование сексуальных выражений или образов, уничижительные комментарии или личные нападки, троллинг, публичное или частное преследование, оскорбления или другое непрофессиональное поведение.
Сопровождающие проекта имеют право и ответственность удалять, редактировать или отклонять комментарии, коммиты, код, изменения вики, проблемы и другие материалы, которые не соответствуют настоящему Кодексу поведения. Специалисты по сопровождению проекта, не соблюдающие Кодекс поведения, могут быть исключены из команды проекта.
Этот кодекс поведения применяется как в рамках проекта, так и в общественных местах, когда человек представляет проект или его сообщество.
О случаях оскорбительного, преследующего или иного неприемлемого поведения можно сообщить, открыв проблему или связавшись с одним или несколькими сопровождающими проекта.
Настоящий Кодекс поведения представляет собой адаптированную версию Соглашения для участников, версия 1.1.0, доступную по адресу http://contributor-covenant.org/version/1/1/0/.