http://github.com/icalendar/icalendar
Une meilleure documentation est encore à venir, mais en attendant les changements nécessaires pour passer de 1.x à 2.0 sont résumés par la différence nécessaire pour mettre à jour le README
iCalendar est une bibliothèque Ruby permettant de traiter les fichiers iCalendar au format iCalendar défini par 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'}
Parfois, nous ne nous soucions pas de savoir si le début ou la fin d'un événement sont des objets Date
ou DateTime
. Pour cela, nous pouvons utiliser DateOrDateTime.new(value)
. L’appel de .call
sur le DateOrDateTime
renvoyé renverra immédiatement l’objet Date
ou DateTime
sous-jacent.
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
Pour les clients capables d'analyser et d'afficher une URL associée à un événement, il est possible d'en attribuer une.
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
L’appel de la méthode event.alarm
créera une alarme s’il n’en existe pas. Pour vérifier si un événement a une alarme, utilisez has_alarm?
méthode.
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 dispose d'un support de base pour la création de blocs VTIMEZONE à partir des informations de fuseau horaire extraites de tzinfo
. Vous devez demander manuellement le support tzinfo
pour en profiter.
iCalendar a été testé et fonctionne avec les versions 0.3, 1.x et 2.x tzinfo
. La gem tzinfo-data
peut également être requise en fonction de votre version de tzinfo
et potentiellement de votre système d'exploitation.
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 } "
Vous pouvez également créer directement une instance Parser
, celle-ci peut être utilisée pour activer une analyse stricte :
# 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 } "
Souvent, dans les applications Web et autres applications interactives, vous devrez rechercher des éléments dans un calendrier pour apporter des modifications ou obtenir des détails. Vous pouvez désormais tout trouver grâce à l'identifiant unique automatiquement associé à tous les composants.
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 )
Consultez les tests unitaires pour obtenir des exemples de la plupart des choses que vous voudrez faire, mais envoyez-moi un exemple de code ou faites-moi savoir ce qui manque.
La dernière version de cette bibliothèque peut être trouvée sur
Tout tourne autour des rubis :
$ gem install icalendar
Pour exécuter les tests :
$ bundle install
$ rake spec
Cette bibliothèque est publiée sous la même licence que Ruby elle-même.
Veuillez soumettre des demandes d'extraction à partir d'une branche thématique rebasée et inclure des tests pour tous les bogues et fonctionnalités.
En tant que contributeurs et responsables de ce projet, nous nous engageons à respecter toutes les personnes qui contribuent en signalant des problèmes, en publiant des demandes de fonctionnalités, en mettant à jour la documentation, en soumettant des demandes d'extraction ou de correctifs et d'autres activités.
Nous nous engageons à faire de la participation à ce projet une expérience sans harcèlement pour tous, quel que soit le niveau d'expérience, le sexe, l'identité et l'expression de genre, l'orientation sexuelle, le handicap, l'apparence personnelle, la taille, la race, l'origine ethnique, l'âge ou la religion.
Des exemples de comportements inacceptables de la part des participants comprennent l'utilisation d'un langage ou d'images à caractère sexuel, des commentaires désobligeants ou des attaques personnelles, la pêche à la traîne, le harcèlement public ou privé, les insultes ou tout autre comportement non professionnel.
Les responsables du projet ont le droit et la responsabilité de supprimer, modifier ou rejeter les commentaires, les validations, le code, les modifications du wiki, les problèmes et autres contributions qui ne sont pas alignés sur ce code de conduite. Les responsables du projet qui ne respectent pas le code de conduite peuvent être retirés de l'équipe de projet.
Ce code de conduite s'applique à la fois dans les espaces du projet et dans les espaces publics lorsqu'un individu représente le projet ou sa communauté.
Les cas de comportement abusif, de harcèlement ou autrement inacceptable peuvent être signalés en ouvrant un problème ou en contactant un ou plusieurs responsables du projet.
Ce code de conduite est adapté du Contributor Covenant, version 1.1.0, disponible sur http://contributor-covenant.org/version/1/1/0/