when_exe 0.3.7 → 0.3.8

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (108) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +210 -171
  3. data/bin/irb.rc +1 -0
  4. data/lib/when_exe.rb +78 -53
  5. data/lib/when_exe/basictypes.rb +27 -8
  6. data/lib/when_exe/calendarnote.rb +848 -805
  7. data/lib/when_exe/calendartypes.rb +110 -240
  8. data/lib/when_exe/coordinates.rb +2440 -2175
  9. data/lib/when_exe/core/compatibility.rb +1 -1
  10. data/lib/when_exe/core/duration.rb +13 -11
  11. data/lib/when_exe/core/extension.rb +38 -45
  12. data/lib/when_exe/ephemeris.rb +43 -14
  13. data/lib/when_exe/ephemeris/eclipse.rb +149 -0
  14. data/lib/when_exe/ephemeris/notes.rb +39 -7
  15. data/lib/when_exe/icalendar.rb +2 -6
  16. data/lib/when_exe/inspect.rb +1408 -1399
  17. data/lib/when_exe/parts/enumerator.rb +486 -477
  18. data/lib/when_exe/parts/resource.rb +1101 -1069
  19. data/lib/when_exe/parts/timezone.rb +6 -5
  20. data/lib/when_exe/region/babylonian.rb +405 -405
  21. data/lib/when_exe/region/bahai.rb +21 -61
  22. data/lib/when_exe/region/chinese/epochs.rb +81 -81
  23. data/lib/when_exe/region/chinese/twins.rb +51 -51
  24. data/lib/when_exe/region/christian.rb +7 -2
  25. data/lib/when_exe/region/coptic.rb +1 -1
  26. data/lib/when_exe/region/discordian.rb +9 -16
  27. data/lib/when_exe/region/french.rb +1 -1
  28. data/lib/when_exe/region/hanke_henry.rb +57 -0
  29. data/lib/when_exe/region/indian.rb +41 -73
  30. data/lib/when_exe/region/international_fixed.rb +97 -0
  31. data/lib/when_exe/region/iranian.rb +203 -203
  32. data/lib/when_exe/region/japanese.rb +13 -13
  33. data/lib/when_exe/region/japanese/eclipses.rb +1194 -0
  34. data/lib/when_exe/region/japanese/notes.rb +1482 -1383
  35. data/lib/when_exe/region/japanese/residues.rb +726 -721
  36. data/lib/when_exe/region/japanese/twins.rb +37 -37
  37. data/lib/when_exe/region/jewish.rb +2 -2
  38. data/lib/when_exe/region/pax.rb +60 -0
  39. data/lib/when_exe/region/positivist.rb +100 -0
  40. data/lib/when_exe/region/roman.rb +333 -334
  41. data/lib/when_exe/region/shire.rb +3 -20
  42. data/lib/when_exe/region/thai.rb +2 -2
  43. data/lib/when_exe/region/tibetan.rb +3 -3
  44. data/lib/when_exe/region/tranquility.rb +208 -0
  45. data/lib/when_exe/region/vanishing_leprechaun.rb +53 -0
  46. data/lib/when_exe/region/vietnamese.rb +4 -4
  47. data/lib/when_exe/region/world.rb +9 -13
  48. data/lib/when_exe/region/world_season.rb +89 -0
  49. data/lib/when_exe/region/zoroastrian.rb +4 -2
  50. data/lib/when_exe/tmobjects.rb +14 -4
  51. data/lib/when_exe/tmposition.rb +239 -81
  52. data/lib/when_exe/tmreference.rb +57 -28
  53. data/lib/when_exe/version.rb +1 -1
  54. data/link_to_online_documents +6 -3
  55. data/test/examples/today.rb +1 -1
  56. data/test/scripts.rb +23 -0
  57. data/test/scripts/2.ext.rb +169 -0
  58. data/test/scripts/2.rb +169 -0
  59. data/test/scripts/3.ext.rb +133 -0
  60. data/test/scripts/3.rb +134 -0
  61. data/test/scripts/4.ext.rb +112 -0
  62. data/test/scripts/4.min.rb +65 -0
  63. data/test/scripts/4.rb +136 -0
  64. data/test/scripts/5.ext.rb +78 -0
  65. data/test/scripts/5.rb +81 -0
  66. data/test/scripts/6.gcal.rb +131 -0
  67. data/test/scripts/6.rb +205 -0
  68. data/test/scripts/6.tz.rb +105 -0
  69. data/test/scripts/7.phase.rb +109 -0
  70. data/test/scripts/7.rb +95 -0
  71. data/test/scripts/7.term.rb +128 -0
  72. data/test/scripts/7.week.rb +84 -0
  73. data/test/scripts/8.ext.rb +61 -0
  74. data/test/scripts/8.rb +62 -0
  75. data/test/scripts/9.ext.rb +131 -0
  76. data/test/scripts/9.rb +130 -0
  77. data/test/scripts/chinese-luni-solar.rb +52 -0
  78. data/test/{examples → scripts}/geometric_complex.rb +41 -41
  79. data/test/scripts/geometric_complex.txt +18 -0
  80. data/test/scripts/korea.rb +59 -0
  81. data/test/scripts/thai-reviewed.txt +211 -0
  82. data/test/scripts/thai.rb +36 -0
  83. data/test/scripts/thai.txt +210 -0
  84. data/test/test.rb +7 -0
  85. data/test/test/basictypes.rb +22 -0
  86. data/test/test/coordinates.rb +2 -1
  87. data/test/test/ephemeris.rb +34 -2
  88. data/test/test/icalendar.rb +12 -0
  89. data/test/test/inspect.rb +37 -1
  90. data/test/test/parts.rb +4 -3
  91. data/test/test/region/armenian.rb +20 -0
  92. data/test/test/region/bahai.rb +58 -0
  93. data/test/test/region/chinese.rb +14 -3
  94. data/test/test/region/christian.rb +16 -35
  95. data/test/test/region/discordian.rb +20 -0
  96. data/test/test/region/indian.rb +30 -2
  97. data/test/test/region/japanese.rb +24 -0
  98. data/test/test/region/jewish.rb +2 -0
  99. data/test/test/region/m17n.rb +9 -0
  100. data/test/test/region/reforms.rb +121 -0
  101. data/test/test/region/residue.rb +17 -11
  102. data/test/test/region/shire.rb +58 -0
  103. data/test/test/region/swedish.rb +45 -0
  104. data/test/test/region/zoroastrian.rb +58 -0
  105. data/test/test/tmobjects.rb +74 -0
  106. data/test/test/tmposition.rb +468 -397
  107. data/when_exe.gemspec +2 -2
  108. metadata +49 -6
@@ -0,0 +1,78 @@
1
+ # -*- coding: utf-8 -*-
2
+ =begin
3
+ Copyright (C) 2014 Takashi SUGA
4
+
5
+ You may use and/or modify this file according to the license described in the LICENSE.txt file included in this archive.
6
+ =end
7
+
8
+ # Calendar/When/Ruby/2.APIの使用例/5.剰余類/コア拡張
9
+
10
+ # コアクラスを require 'when_exe/core/extension' で拡張した場合の記法を確認
11
+
12
+ # *準備
13
+ # when_exe Ruby 版の When モジュールを include する
14
+ require 'when_exe'
15
+ require 'when_exe/core/extension'
16
+ include When
17
+
18
+ # *日の剰余
19
+ # ** 剰余を求める
20
+ date = '2013-05-28'.when?
21
+ p date #=> 2013-05-28
22
+ p 'Week'.day_of_week.iri #=> "http://hosi.org/When/Coordinates/CommonResidue::Week"
23
+ p ('Week'.day_of_week % date).iri #=> "http://hosi.org/When/Coordinates/CommonResidue::Week::Tuesday"
24
+ p date % 'Week'.day_of_week #=> 1 (Integer)
25
+ p 1.day_of_week.iri #=> "http://hosi.org/When/Coordinates/CommonResidue::Week::Tuesday"
26
+
27
+ # ** 指定の剰余となる日を求める
28
+ date = '2013-05-27'.when?
29
+ p date #=> 2013-05-27
30
+ p 'Tuesday'.day_of_week.iri #=> "http://hosi.org/When/Coordinates/CommonResidue::Week::Tuesday"
31
+ p date & 'Tuesday'.day_of_week #=> 2013-05-28
32
+ p date & 'Tuesday'.day_of_week << 1 #=> 2013-05-21
33
+ p '甲子'.residue.iri #=> "http://hosi.org/When/Coordinates/CommonResidue::干支::甲子"
34
+ p date & '甲子'.residue #=> 2013-06-27
35
+ p date & '甲子'.residue >> 1 #=> 2013-08-26
36
+ p date & ('Tuesday'.day_of_week & '甲子'.residue) #=> 2013-12-24
37
+
38
+ # **ブロック
39
+ date = '2013-05-27'.when?
40
+ p date #=> 2013-05-27
41
+ (date ^ 'Tuesday'.day_of_week).each do |d|
42
+ break if d >= '2013-06-15'.when?
43
+ p d #=> 2013-05-28, 2013-06-04, 2013-06-11
44
+ end
45
+
46
+ # *年の剰余
47
+ p 'Indiction'.residue #=> nil
48
+ p 'Metonic'.residue #=> nil
49
+ p 'Solar'.residue #=> nil
50
+
51
+ # ローマ暦をメモリにロードし、建国紀元500年の日付詳細を出力
52
+
53
+ p 'AUC0500'.when?.to_h(:method=>:to_m17n, :locale=>'en') #=> 下記
54
+ # {:frame=>"http://hosi.org/When/CalendarTypes/RomanA?border=0-5-1",
55
+ # :precision=>-2,
56
+ # :trans=>{},
57
+ # :query=>{"area"=>"", "period"=>"Roman", :validate=>:epoch},
58
+ # :sdn=>1628745,
59
+ # :calendar=>["http://hosi.org/When/TM/CalendarEra/Roman::AUC", -753],
60
+ # :notes=>
61
+ # [[{:note=>"Solar", :value=>"Solar(7)"},
62
+ # {:note=>"Metonic", :value=>"Metonic(13)"},
63
+ # {:note=>"Indiction", :value=>"V"}],
64
+ # [],
65
+ # []],
66
+ # :cal_date=>["500", "5", 1]}
67
+
68
+ # 剰余類の定義がメモリに読み込まれている
69
+
70
+ p 'Indiction'.residue.iri #=> "http://hosi.org/When/CalendarTypes/CalendarNote/RomanNote/NoteObjects::year::Indiction"
71
+ p 'Metonic'.residue.iri #=> "http://hosi.org/When/CalendarTypes/CalendarNote/RomanNote/NoteObjects::year::Metonic"
72
+ p 'Solar'.residue.iri #=> "http://hosi.org/When/CalendarTypes/CalendarNote/RomanNote/NoteObjects::year::Solar"
73
+
74
+ # ユリウス通日の元期を求めてみる
75
+ p [2014, 1, 1].tm_pos(:frame=>'Julian') &
76
+ (('Indiction'.residue &
77
+ 'Metonic'.residue &
78
+ 'Solar'.residue) << 1) #=> -04712-01-01 (ユリウス通日の元期)
data/test/scripts/5.rb ADDED
@@ -0,0 +1,81 @@
1
+ # -*- coding: utf-8 -*-
2
+ =begin
3
+ Copyright (C) 2014 Takashi SUGA
4
+
5
+ You may use and/or modify this file according to the license described in the LICENSE.txt file included in this archive.
6
+ =end
7
+
8
+ # Calendar/When/Ruby/2.APIの使用例/5.剰余類
9
+
10
+ # →関連クラス図 [[Calendar/When/Ruby/3.クラス図/01.Coordinates]]
11
+
12
+ # *準備
13
+ # when_exe Ruby 版の When モジュールを include する
14
+ require 'when_exe'
15
+ include When
16
+
17
+ # コア拡張を利用する場合は[[Calendar/When/Ruby/2.APIの使用例/5.剰余類/コア拡張]]を参照
18
+
19
+ # *日の剰余
20
+ # ** 剰余を求める
21
+ date = when?('2013-05-28')
22
+ p date #=> 2013-05-28
23
+ p day_of_week('Week').iri #=> "http://hosi.org/When/Coordinates/CommonResidue::Week"
24
+ p (day_of_week('Week') % date).iri #=> "http://hosi.org/When/Coordinates/CommonResidue::Week::Tuesday"
25
+ p date % day_of_week('Week') #=> 1 (Integer)
26
+ p day_of_week(1).iri #=> "http://hosi.org/When/Coordinates/CommonResidue::Week::Tuesday"
27
+
28
+ # ** 指定の剰余となる日を求める
29
+ date = when?('2013-05-27')
30
+ p date #=> 2013-05-27
31
+ p day_of_week('Tuesday').iri #=> "http://hosi.org/When/Coordinates/CommonResidue::Week::Tuesday"
32
+ p date & day_of_week('Tuesday') #=> 2013-05-28
33
+ p date & day_of_week('Tuesday') << 1 #=> 2013-05-21
34
+ p Residue('甲子').iri #=> "http://hosi.org/When/Coordinates/CommonResidue::干支::甲子"
35
+ p date & Residue('甲子') #=> 2013-06-27
36
+ p date & Residue('甲子') >> 1 #=> 2013-08-26
37
+ p date & (day_of_week('Tuesday') & Residue('甲子')) #=> 2013-12-24
38
+
39
+ # **ブロック
40
+ date = when?('2013-05-27')
41
+ p date #=> 2013-05-27
42
+ day_of_week('Tuesday').enum_for(date, :forward, 3).each do |d|
43
+ p d #=> 2013-05-28, 2013-06-04, 2013-06-11
44
+ end
45
+ day_of_week('Tuesday').enum_for(date, :reverse, 3).each do |d|
46
+ p d #=> 2013-05-21, 2013-05-14, 2013-05-07
47
+ end
48
+
49
+ # *年の剰余
50
+ p Residue('Indiction') #=> nil
51
+ p Residue('Metonic') #=> nil
52
+ p Residue('Solar') #=> nil
53
+
54
+ # ローマ暦をメモリにロードし、建国紀元500年の日付詳細を出力
55
+
56
+ p when?('AUC0500').to_h(:method=>:to_m17n, :locale=>'en') #=> 下記
57
+ # {:frame=>"http://hosi.org/When/CalendarTypes/RomanA?border=0-5-1",
58
+ # :precision=>-2,
59
+ # :trans=>{},
60
+ # :query=>{"area"=>"", "period"=>"Roman", :validate=>:epoch},
61
+ # :sdn=>1628745,
62
+ # :calendar=>["http://hosi.org/When/TM/CalendarEra/Roman::AUC", -753],
63
+ # :notes=>
64
+ # [[{:note=>"Solar", :value=>"Solar(7)"},
65
+ # {:note=>"Metonic", :value=>"Metonic(13)"},
66
+ # {:note=>"Indiction", :value=>"V"}],
67
+ # [],
68
+ # []],
69
+ # :cal_date=>["500", "5", 1]}
70
+
71
+ # 剰余類の定義がメモリに読み込まれている
72
+
73
+ p Residue('Indiction').iri #=> "http://hosi.org/When/CalendarTypes/CalendarNote/RomanNote/NoteObjects::year::Indiction"
74
+ p Residue('Metonic').iri #=> "http://hosi.org/When/CalendarTypes/CalendarNote/RomanNote/NoteObjects::year::Metonic"
75
+ p Residue('Solar').iri #=> "http://hosi.org/When/CalendarTypes/CalendarNote/RomanNote/NoteObjects::year::Solar"
76
+
77
+ # ユリウス通日の元期を求めてみる
78
+ p tm_pos(2014, 1, 1, :frame=>'Julian') &
79
+ ((Residue('Indiction') &
80
+ Residue('Metonic') &
81
+ Residue('Solar')) << 1) #=> -04712-01-01 (ユリウス通日の元期)
@@ -0,0 +1,131 @@
1
+ # -*- coding: utf-8 -*-
2
+ =begin
3
+ Copyright (C) 2014 Takashi SUGA
4
+
5
+ You may use and/or modify this file according to the license described in the LICENSE.txt file included in this archive.
6
+ =end
7
+
8
+ # Calendar/When/Ruby/2.APIの使用例/6.iCalendar/GoogleCalendar
9
+
10
+ # *Ruby から制御するAPI
11
+
12
+ # gcalapi for gem - http://gcalapi.rubyforge.org/
13
+
14
+ # これ自体は周期イベントに対応していないが、簡単なパッチで対応可能
15
+
16
+ require 'rubygems'
17
+ gem 'gcalapi'
18
+ require 'gcalapi'
19
+ module GoogleCalendar
20
+ class Event
21
+ attr_accessor :recurrence
22
+ alias :_instance_to_xml :instance_to_xml
23
+ def instance_to_xml
24
+ _instance_to_xml
25
+ @xml.root.elements[recurrence ? "gd:when" : "gd:recurrence"].remove
26
+ end
27
+ end
28
+ Event::ATTRIBUTES_MAP["recurrence"] = { "element" => "gd:recurrence"}
29
+ end
30
+
31
+ # 期間を指定してイベントを取得する場合は、
32
+
33
+ events = cal.events({'start-min'=>'2012-01-01', 'start-max'=>'2012-12-31'})
34
+
35
+ # のようなコードで可能。:start_min, :start_max でないことに注意。
36
+
37
+ # また、日時はISO8601として正しい文字列でなければならない。
38
+
39
+ # *Google Calendar の挙動
40
+
41
+ # 2014-07-15現在、Google側の動作が変わって、gcalapi が動作しなくなっているようです。
42
+ # http://aligach.net/diary/20131214.html を読んだところ、REDIRECT 対応が必要になった由。
43
+ # REDIRECT動作に対応した https://github.com/suchowan/gcalapi (0.1.2s)で動作が改善されます。
44
+
45
+ # どうも insertだけでなく update や destroy でも REDIRECT 対応が必要のようです。
46
+ # &yard(GoogleCalendar)の仕様を理解しないまま対症療法的に施した対策ですので妥当性は不明です。
47
+ # が、一応 when_exe と協働したテストには通るようになったので、とりあえずこの 0.1.2s を前提にしようと思います。
48
+
49
+ # **フィード先URI
50
+
51
+ # フィード先URIは表の通り
52
+
53
+ # |私用|http://www.google.com/calendar/feeds/'''ユーザ名'''%40gmail.com/private/full
54
+ # |国別祝日|http://www.google.com/calendar/feeds/'''国名'''__'''言語コード'''%40holiday.calendar.google.com/public/full
55
+
56
+ # 国名には、irish, usa, uk, islamic, italian, iranian, indian, indonesian, dutch,
57
+ # australian, austrian, canadian, christian, greek, singapore, swedish, spain,
58
+ # thai, danish, german, new_zealand, norwegian, philippines, finnish, french,
59
+ # brazilian, vietnamese, portuguese, polish, malaysia, mexican, jewish, russian,
60
+ # china, sa, taiwan, japanese, south_korea, hong_kong_c, hong_kong が
61
+ # [[使用可能>https://gist.github.com/1438183]](2012-04-10現在)。
62
+
63
+ # ただし、iranian は言語コード ja では使えない。
64
+
65
+ # **recurrence定義
66
+
67
+ # *** タイムゾーン部
68
+
69
+ # 終日イベントはローカルタイムを使用する。タイムゾーンの指定は無視される。
70
+
71
+ # 終日でないイベントにはタイムゾーンが付く。
72
+ # 自前でタイムゾーンを定義する必要はなく、定義しても Google が提供するタイムゾーンに置き換えられる。
73
+ # たとえば、America/New_York は、
74
+ BEGIN:VTIMEZONE
75
+ TZID:America/New_York
76
+ X-LIC-LOCATION:America/New_York
77
+ BEGIN:DAYLIGHT
78
+ TZOFFSETFROM:-0500
79
+ TZOFFSETTO:-0400
80
+ TZNAME:EDT
81
+ DTSTART:19700308T020000
82
+ RRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=2SU
83
+ END:DAYLIGHT
84
+ BEGIN:STANDARD
85
+ TZOFFSETFROM:-0400
86
+ TZOFFSETTO:-0500
87
+ TZNAME:EST
88
+ DTSTART:19701101T020000
89
+ RRULE:FREQ=YEARLY;BYMONTH=11;BYDAY=1SU
90
+ END:STANDARD
91
+ END:VTIMEZONE
92
+
93
+ # となるが、夏時間が上記のロジックになったのは2007年からなので、
94
+ # Google が提供するタイムゾーン定義は実際には誤りである。
95
+
96
+ # *** イベント部
97
+
98
+ # 認識するのは、DTSTART, DTEND, RRULE のみである。
99
+
100
+ # LOCALE, NAMESPACE などはエラーにならず破棄される。
101
+
102
+ # 当然ながら RRULE に when.exe 独自の拡張機能は使えない(パースエラー)。
103
+
104
+ # EXDATE は使用せず、別途キャンセルイベントを定義する方式になっている。
105
+ # このため、キャンセルされたイベントも期間検索でヒットする。
106
+ <gd:eventStatus value='http://schemas.google.com/g/2005#event.canceled'/>
107
+
108
+ # * When::V::Event との連携
109
+
110
+ # [[When::V::Event>http://www.asahi-net.or.jp/~dd6t-sg/when_rdoc/doc.1.9/When/V/Event.html]]と連携するため、gcalapi に API を追加
111
+
112
+ # ** When::V::Event クラス
113
+ # *** to_gcalevent(gcal)
114
+
115
+ # When::V::Event クラスのインスタンスを &yard(GoogleCalendar::Event,2) クラスのインスタンスに変換する。
116
+
117
+ # 引数 gcal は&yard(GoogleCalendar)::Calendarクラスのインスタンス
118
+
119
+ # ** Google Calendar::Event クラス
120
+ # *** to_vevent()
121
+
122
+ # &yard(GoogleCalendar)::Event クラスのインスタンスを &yard(When::V::Event,2)クラスのインスタンスに変換する。
123
+
124
+ # ** Google Calendar::Calendar クラス
125
+ # *** enum_for(conditions)
126
+
127
+ # 引数 conditions で抽出したイベントに対応する日時(&yard(When::TM::TemporalPosition,2))を生成する Enumeratorを取得する。
128
+
129
+ # conditions は &yard(GoogleCalendar::Calendar,2)クラスの eventsメソッドと互換だが、'start-min'が省略された場合、現在時刻とみなす。
130
+
131
+ # to_enum は enum_for の alias
data/test/scripts/6.rb ADDED
@@ -0,0 +1,205 @@
1
+ # -*- coding: utf-8 -*-
2
+ =begin
3
+ Copyright (C) 2014 Takashi SUGA
4
+
5
+ You may use and/or modify this file according to the license described in the LICENSE.txt file included in this archive.
6
+ =end
7
+
8
+ # Calendar/When/Ruby/2.APIの使用例/6.iCalendar
9
+
10
+ # →関連クラス図 [[Calendar/When/Ruby/3.クラス図/05.RFC5545継承と包含]]
11
+
12
+ # *準備
13
+ # when_exe Ruby 版の When モジュールを include する
14
+ require 'when_exe'
15
+ include When
16
+
17
+ # 標準時間と夏時間の切り替え時の振る舞いについては[[Calendar/When/Ruby/2.APIの使用例/6.iCalendar/時間帯]]を参照
18
+
19
+ # &yard(When::TM::GoogleCalendar,1)を利用する場合は[[Calendar/When/Ruby/2.APIの使用例/6.iCalendar/GoogleCalendar]]も参照
20
+
21
+ # *敬老の日
22
+ # **APIのみで計算
23
+ event = When::V::Event.new({
24
+ 'rrule' => {'FREQ'=>'MONTHLY', 'INTERVAL'=>12, 'BYDAY'=>{''=>'3MO'}},
25
+ 'dtstart' => 'VALUE=DATE;TZID=Asia/Tokyo:20080915'
26
+ })
27
+ p event.class #=> When::V::Event
28
+ event.enum_for(When.when?('20070101'), :forward, 3).each do |date|
29
+ p date #=> 2008-09-15T+09:00, 2009-09-21T+09:00, 2010-09-20T+09:00
30
+ end
31
+
32
+ # **ローカル時刻を使う場合
33
+ When::TM::Clock.local_time = Clock("+0900")
34
+ event = When::V::Event.new({
35
+ 'rrule' => {'FREQ'=>'MONTHLY', 'INTERVAL'=>12, 'BYDAY'=>{''=>'3MO'}},
36
+ 'dtstart' => 'VALUE=DATE:20080915'
37
+ })
38
+ p event.class #=> When::V::Event
39
+ event.enum_for(When.when?('20070101'), :forward, 3).each do |date|
40
+ p date #=> 2008-09-15, 2009-09-21, 2010-09-20
41
+ end
42
+
43
+ # **icsファイルを読み込んで利用
44
+ -- sample1.ics -- (使用する場合は行頭の空白を削除)
45
+ BEGIN:VCALENDAR
46
+ VERSION:2.0
47
+ PRODID:-//hacksw/handcal//NONSGML v1.0//EN
48
+ BEGIN:VTIMEZONE
49
+ TZID:Asia/Tokyo
50
+ BEGIN:STANDARD
51
+ TZOFFSETFROM:+0900
52
+ TZOFFSETTO:+0900
53
+ TZNAME:JST
54
+ DTSTART:19700101T000000
55
+ END:STANDARD
56
+ END:VTIMEZONE
57
+ BEGIN:VEVENT
58
+ CREATED:20050809T050000Z
59
+ LAST-MODIFIED:20050809T050000Z
60
+ DTSTAMP:20050809T050000Z
61
+ UID:event1-ID
62
+ RRULE:FREQ=MONTHLY;INTERVAL=12;BYDAY=3MO
63
+ DTSTART;VALUE=DATE;TZID=Asia/Tokyo:20080915
64
+ DTEND;VALUE=DATE;TZID=Asia/Tokyo:20080916
65
+ END:VEVENT
66
+ END:VCALENDAR
67
+ ----------------
68
+
69
+ event = Resource('sample1.ics::event1-ID')
70
+ p event.iri #=> "sample1.ics::event1-ID" (実際は IRI に適合しないが便宜上ファイル名から生成)
71
+ p event.class #=> When::V::Event
72
+ event.enum_for(When.when?('20080101'), :forward, 3).each do |date|
73
+ p date #=> 2008-09-15T+09:00, 2009-09-21T+09:00, 2010-09-20T+09:00
74
+ end
75
+
76
+ # *秋分の日
77
+ # **APIのみで計算(RFC5545に対する拡張機能)
78
+ event = When::V::Event.new({
79
+ 'rrule' => {'FREQ'=>'YEARLY', 'BYDAY'=>{'SolarTerms'=>'term180'}},
80
+ 'dtstart' => 'VALUE=DATE;TZID=Asia/Tokyo:19480923'
81
+ })
82
+ p event.class #=> When::V::Event
83
+ event.enum_for(When.when?('20110101'), :forward, 3).each do |date|
84
+ p date #=> 2011-09-23T+09:00, 2012-09-22T+09:00, 2013-09-23T+09:00
85
+ end
86
+
87
+ # **icsファイルを読み込んで利用
88
+ -- sample2.ics --
89
+ (snip) - sample1.ics と同じ
90
+ UID:event2-ID
91
+ RRULE:FREQ=YEARLY;BYDAY/SolarTerms=term180
92
+ DTSTART;VALUE=DATE;TZID=Asia/Tokyo:19480923
93
+ DTEND;VALUE=DATE;TZID=Asia/Tokyo:19480924
94
+ (snip) - sample1.ics と同じ
95
+ ----------------
96
+
97
+ event = Resource('sample2.ics::event2-ID')
98
+ p event.iri #=> "sample2.ics::event2-ID" (実際は IRI に適合しないが便宜上ファイル名から生成)
99
+ p event.class #=> When::V::Event
100
+ event.enum_for(When.when?('20110101'), :forward, 3).each do |date|
101
+ p date #=> 2011-09-23T+09:00, 2012-09-22T+09:00, 2013-09-23T+09:00
102
+ end
103
+
104
+ # *日本の年間祝日
105
+ # **イベントの取得
106
+ service = GoogleCalendar::Service.new('xxxxxxxx@gmail.com', '*********')
107
+ feed = "http://www.google.com/calendar/feeds/%s__%s%%40holiday.calendar.google.com/public/full" % ['japanese', 'ja']
108
+ gcal = GoogleCalendar::Calendar::new(service, feed)
109
+ gcal.events({'start-min'=>'2012-01-01', 'start-max'=>'2013-01-01',
110
+ 'orderby'=>'starttime', 'sortorder'=>'a'
111
+ }).each do |event|
112
+ vevent = event.to_vevent
113
+ p [vevent.summary, vevent.dtstart] #=> 下記の通り
114
+ # ["元日", "2012-01-01T00:00:00.00+09:00"]
115
+ # ["元日 振替休日", "2012-01-02T00:00:00.00+09:00"]
116
+ # ["銀行休業日", "2012-01-02T00:00:00.00+09:00"]
117
+ # ["銀行休業日", "2012-01-03T00:00:00.00+09:00"]
118
+ # ["成人の日", "2012-01-09T00:00:00.00+09:00"]
119
+ # ["建国記念の日", "2012-02-11T00:00:00.00+09:00"]
120
+ # ["春分の日", "2012-03-20T00:00:00.00+09:00"]
121
+ # ["昭和の日", "2012-04-29T00:00:00.00+09:00"]
122
+ # ["昭和の日 振替休日", "2012-04-30T00:00:00.00+09:00"]
123
+ # ["憲法記念日", "2012-05-03T00:00:00.00+09:00"]
124
+ # ["みどりの日", "2012-05-04T00:00:00.00+09:00"]
125
+ # ["こどもの日", "2012-05-05T00:00:00.00+09:00"]
126
+ # ["海の日", "2012-07-16T00:00:00.00+09:00"]
127
+ # ["敬老の日", "2012-09-17T00:00:00.00+09:00"]
128
+ # ["秋分の日", "2012-09-22T00:00:00.00+09:00"]
129
+ # ["体育の日", "2012-10-08T00:00:00.00+09:00"]
130
+ # ["文化の日", "2012-11-03T00:00:00.00+09:00"]
131
+ # ["勤労感謝の日", "2012-11-23T00:00:00.00+09:00"]
132
+ # ["天皇誕生日", "2012-12-23T00:00:00.00+09:00"]
133
+ # ["天皇誕生日 振替休日", "2012-12-24T00:00:00.00+09:00"]
134
+ # ["クリスマス", "2012-12-25T00:00:00.00+09:00"]
135
+ # ["大晦日", "2012-12-31T00:00:00.00+09:00"]
136
+ end
137
+
138
+ # **日時範囲の取得
139
+ service = GoogleCalendar::Service.new('xxxxxxxx@gmail.com', '*********')
140
+ feed = "http://www.google.com/calendar/feeds/%s__%s%%40holiday.calendar.google.com/public/full" % ['japanese', 'ja']
141
+ gcal = GoogleCalendar::Calendar::new(service, feed)
142
+ gcal.enum_for({'start-min'=>'2012-01-01', 'start-max'=>'2013-01-01',
143
+ 'orderby'=>'starttime', 'sortorder'=>'a'
144
+ }).each do |range|
145
+ p [range.events[0].summary, range] #=> 下記の通り
146
+ # ["元日", 2012-01-01T00:00:00.00+09:00...2012-01-02T00:00:00.00+09:00]
147
+ # ["元日 振替休日", 2012-01-02T00:00:00.00+09:00...2012-01-03T00:00:00.00+09:00]
148
+ # ["銀行休業日", 2012-01-02T00:00:00.00+09:00...2012-01-03T00:00:00.00+09:00]
149
+ # ["銀行休業日", 2012-01-03T00:00:00.00+09:00...2012-01-04T00:00:00.00+09:00]
150
+ # ["成人の日", 2012-01-09T00:00:00.00+09:00...2012-01-10T00:00:00.00+09:00]
151
+ # ["建国記念の日", 2012-02-11T00:00:00.00+09:00...2012-02-12T00:00:00.00+09:00]
152
+ # ["春分の日", 2012-03-20T00:00:00.00+09:00...2012-03-21T00:00:00.00+09:00]
153
+ # ["昭和の日", 2012-04-29T00:00:00.00+09:00...2012-04-30T00:00:00.00+09:00]
154
+ # ["昭和の日 振替休日", 2012-04-30T00:00:00.00+09:00...2012-05-01T00:00:00.00+09:00]
155
+ # ["憲法記念日", 2012-05-03T00:00:00.00+09:00...2012-05-04T00:00:00.00+09:00]
156
+ # ["みどりの日", 2012-05-04T00:00:00.00+09:00...2012-05-05T00:00:00.00+09:00]
157
+ # ["こどもの日", 2012-05-05T00:00:00.00+09:00...2012-05-06T00:00:00.00+09:00]
158
+ # ["海の日", 2012-07-16T00:00:00.00+09:00...2012-07-17T00:00:00.00+09:00]
159
+ # ["敬老の日", 2012-09-17T00:00:00.00+09:00...2012-09-18T00:00:00.00+09:00]
160
+ # ["秋分の日", 2012-09-22T00:00:00.00+09:00...2012-09-23T00:00:00.00+09:00]
161
+ # ["体育の日", 2012-10-08T00:00:00.00+09:00...2012-10-09T00:00:00.00+09:00]
162
+ # ["文化の日", 2012-11-03T00:00:00.00+09:00...2012-11-04T00:00:00.00+09:00]
163
+ # ["勤労感謝の日", 2012-11-23T00:00:00.00+09:00...2012-11-24T00:00:00.00+09:00]
164
+ # ["天皇誕生日", 2012-12-23T00:00:00.00+09:00...2012-12-24T00:00:00.00+09:00]
165
+ # ["天皇誕生日 振替休日", 2012-12-24T00:00:00.00+09:00...2012-12-25T00:00:00.00+09:00]
166
+ # ["クリスマス", 2012-12-25T00:00:00.00+09:00...2012-12-26T00:00:00.00+09:00]
167
+ # ["大晦日", 2012-12-31T00:00:00.00+09:00...2013-01-01T00:00:00.00+09:00]
168
+ end
169
+
170
+ # **when.exe での iCalendar の拡張
171
+
172
+ TM::Clock.local_time = Clock("+0900")
173
+ cal = Resource("../test/examples/JapanHolidays.ics")
174
+ cal.each(when?('20090101')...when?('20100101')) do |date|
175
+ p date #=> 下記の通り
176
+ # 2009-01-01T+09:00
177
+ # 2009-01-12T+09:00
178
+ # 2009-02-11T+09:00
179
+ # 2009-03-20T+09:00
180
+ # 2009-04-29T+09:00
181
+ # 2009-05-03T+09:00
182
+ # 2009-05-04T+09:00
183
+ # 2009-05-05T+09:00
184
+ # 2009-05-06T+09:00
185
+ # 2009-07-20T+09:00
186
+ # 2009-09-21T+09:00
187
+ # 2009-09-22T+09:00
188
+ # 2009-09-23T+09:00
189
+ # 2009-10-12T+09:00
190
+ # 2009-11-03T+09:00
191
+ # 2009-11-23T+09:00
192
+ # 2009-12-23T+09:00
193
+ end
194
+
195
+ # 9月22日が現れるのは &yard(JapanHolidays.ics) に拡張構文
196
+
197
+ # -- JapanHolidays.ics --
198
+ # (snip)
199
+ # RRULE:FREQ=MONTHLY;INTERVAL=12;BYDAY=TU;BYDAY/SolarTerms=term180-1
200
+ # (snip)
201
+ # ----------------
202
+
203
+ # で「秋分の前日である火曜日」が定義してあるからです。
204
+ # 拡張構文を使っていますから&yard(JapanHolidays.ics) は when.exe 以外とは情報交換できません。
205
+