when_exe 0.3.7 → 0.3.8
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +210 -171
- data/bin/irb.rc +1 -0
- data/lib/when_exe.rb +78 -53
- data/lib/when_exe/basictypes.rb +27 -8
- data/lib/when_exe/calendarnote.rb +848 -805
- data/lib/when_exe/calendartypes.rb +110 -240
- data/lib/when_exe/coordinates.rb +2440 -2175
- data/lib/when_exe/core/compatibility.rb +1 -1
- data/lib/when_exe/core/duration.rb +13 -11
- data/lib/when_exe/core/extension.rb +38 -45
- data/lib/when_exe/ephemeris.rb +43 -14
- data/lib/when_exe/ephemeris/eclipse.rb +149 -0
- data/lib/when_exe/ephemeris/notes.rb +39 -7
- data/lib/when_exe/icalendar.rb +2 -6
- data/lib/when_exe/inspect.rb +1408 -1399
- data/lib/when_exe/parts/enumerator.rb +486 -477
- data/lib/when_exe/parts/resource.rb +1101 -1069
- data/lib/when_exe/parts/timezone.rb +6 -5
- data/lib/when_exe/region/babylonian.rb +405 -405
- data/lib/when_exe/region/bahai.rb +21 -61
- data/lib/when_exe/region/chinese/epochs.rb +81 -81
- data/lib/when_exe/region/chinese/twins.rb +51 -51
- data/lib/when_exe/region/christian.rb +7 -2
- data/lib/when_exe/region/coptic.rb +1 -1
- data/lib/when_exe/region/discordian.rb +9 -16
- data/lib/when_exe/region/french.rb +1 -1
- data/lib/when_exe/region/hanke_henry.rb +57 -0
- data/lib/when_exe/region/indian.rb +41 -73
- data/lib/when_exe/region/international_fixed.rb +97 -0
- data/lib/when_exe/region/iranian.rb +203 -203
- data/lib/when_exe/region/japanese.rb +13 -13
- data/lib/when_exe/region/japanese/eclipses.rb +1194 -0
- data/lib/when_exe/region/japanese/notes.rb +1482 -1383
- data/lib/when_exe/region/japanese/residues.rb +726 -721
- data/lib/when_exe/region/japanese/twins.rb +37 -37
- data/lib/when_exe/region/jewish.rb +2 -2
- data/lib/when_exe/region/pax.rb +60 -0
- data/lib/when_exe/region/positivist.rb +100 -0
- data/lib/when_exe/region/roman.rb +333 -334
- data/lib/when_exe/region/shire.rb +3 -20
- data/lib/when_exe/region/thai.rb +2 -2
- data/lib/when_exe/region/tibetan.rb +3 -3
- data/lib/when_exe/region/tranquility.rb +208 -0
- data/lib/when_exe/region/vanishing_leprechaun.rb +53 -0
- data/lib/when_exe/region/vietnamese.rb +4 -4
- data/lib/when_exe/region/world.rb +9 -13
- data/lib/when_exe/region/world_season.rb +89 -0
- data/lib/when_exe/region/zoroastrian.rb +4 -2
- data/lib/when_exe/tmobjects.rb +14 -4
- data/lib/when_exe/tmposition.rb +239 -81
- data/lib/when_exe/tmreference.rb +57 -28
- data/lib/when_exe/version.rb +1 -1
- data/link_to_online_documents +6 -3
- data/test/examples/today.rb +1 -1
- data/test/scripts.rb +23 -0
- data/test/scripts/2.ext.rb +169 -0
- data/test/scripts/2.rb +169 -0
- data/test/scripts/3.ext.rb +133 -0
- data/test/scripts/3.rb +134 -0
- data/test/scripts/4.ext.rb +112 -0
- data/test/scripts/4.min.rb +65 -0
- data/test/scripts/4.rb +136 -0
- data/test/scripts/5.ext.rb +78 -0
- data/test/scripts/5.rb +81 -0
- data/test/scripts/6.gcal.rb +131 -0
- data/test/scripts/6.rb +205 -0
- data/test/scripts/6.tz.rb +105 -0
- data/test/scripts/7.phase.rb +109 -0
- data/test/scripts/7.rb +95 -0
- data/test/scripts/7.term.rb +128 -0
- data/test/scripts/7.week.rb +84 -0
- data/test/scripts/8.ext.rb +61 -0
- data/test/scripts/8.rb +62 -0
- data/test/scripts/9.ext.rb +131 -0
- data/test/scripts/9.rb +130 -0
- data/test/scripts/chinese-luni-solar.rb +52 -0
- data/test/{examples → scripts}/geometric_complex.rb +41 -41
- data/test/scripts/geometric_complex.txt +18 -0
- data/test/scripts/korea.rb +59 -0
- data/test/scripts/thai-reviewed.txt +211 -0
- data/test/scripts/thai.rb +36 -0
- data/test/scripts/thai.txt +210 -0
- data/test/test.rb +7 -0
- data/test/test/basictypes.rb +22 -0
- data/test/test/coordinates.rb +2 -1
- data/test/test/ephemeris.rb +34 -2
- data/test/test/icalendar.rb +12 -0
- data/test/test/inspect.rb +37 -1
- data/test/test/parts.rb +4 -3
- data/test/test/region/armenian.rb +20 -0
- data/test/test/region/bahai.rb +58 -0
- data/test/test/region/chinese.rb +14 -3
- data/test/test/region/christian.rb +16 -35
- data/test/test/region/discordian.rb +20 -0
- data/test/test/region/indian.rb +30 -2
- data/test/test/region/japanese.rb +24 -0
- data/test/test/region/jewish.rb +2 -0
- data/test/test/region/m17n.rb +9 -0
- data/test/test/region/reforms.rb +121 -0
- data/test/test/region/residue.rb +17 -11
- data/test/test/region/shire.rb +58 -0
- data/test/test/region/swedish.rb +45 -0
- data/test/test/region/zoroastrian.rb +58 -0
- data/test/test/tmobjects.rb +74 -0
- data/test/test/tmposition.rb +468 -397
- data/when_exe.gemspec +2 -2
- 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
|
+
|