when_exe 0.4.1 → 0.4.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (96) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +36 -33
  3. data/bin/locales.rb +1 -1
  4. data/bin/make_ttl.rb.config +1 -1
  5. data/lib/when_exe.rb +27 -16
  6. data/lib/when_exe/basictypes.rb +772 -771
  7. data/lib/when_exe/calendartypes.rb +1485 -1453
  8. data/lib/when_exe/coordinates.rb +5 -0
  9. data/lib/when_exe/core/compatibility.rb +1 -1
  10. data/lib/when_exe/core/duration.rb +147 -116
  11. data/lib/when_exe/core/extension.rb +499 -497
  12. data/lib/when_exe/ephemeris.rb +1952 -1951
  13. data/lib/when_exe/ephemeris/eclipse.rb +5 -4
  14. data/lib/when_exe/ephemeris/notes.rb +457 -421
  15. data/lib/when_exe/ephemeris/planets.rb +585 -585
  16. data/lib/when_exe/ephemeris/sun.rb +214 -214
  17. data/lib/when_exe/google_api.rb +153 -0
  18. data/lib/when_exe/icalendar.rb +1640 -1632
  19. data/lib/when_exe/inspect.rb +42 -20
  20. data/lib/when_exe/linkeddata.rb +28 -7
  21. data/lib/when_exe/locales/autoload.rb +2 -1
  22. data/lib/when_exe/locales/locale.rb +35 -15
  23. data/lib/when_exe/locales/zh.rb +77 -0
  24. data/lib/when_exe/mini_application.rb +3 -1
  25. data/lib/when_exe/{googlecalendar.rb → obsolete/googlecalendar.rb} +144 -144
  26. data/lib/when_exe/parts/enumerator.rb +498 -486
  27. data/lib/when_exe/parts/geometric_complex.rb +397 -397
  28. data/lib/when_exe/parts/timezone.rb +246 -241
  29. data/lib/when_exe/region/armenian.rb +55 -56
  30. data/lib/when_exe/region/babylonian.rb +406 -405
  31. data/lib/when_exe/region/bahai.rb +107 -106
  32. data/lib/when_exe/region/balinese.rb +624 -622
  33. data/lib/when_exe/region/chinese.rb +1071 -1026
  34. data/lib/when_exe/region/chinese/epochs.rb +28 -28
  35. data/lib/when_exe/region/chinese/notes.rb +219 -0
  36. data/lib/when_exe/region/chinese/twins.rb +803 -803
  37. data/lib/when_exe/region/christian.rb +21 -15
  38. data/lib/when_exe/region/coptic.rb +107 -106
  39. data/lib/when_exe/region/discordian.rb +218 -218
  40. data/lib/when_exe/region/east_asian.rb +1 -1
  41. data/lib/when_exe/region/french.rb +126 -56
  42. data/lib/when_exe/region/geologicalage.rb +639 -639
  43. data/lib/when_exe/region/goddess.rb +60 -58
  44. data/lib/when_exe/region/hanke_henry.rb +2 -2
  45. data/lib/when_exe/region/indian.rb +1225 -1222
  46. data/lib/when_exe/region/international_fixed.rb +96 -97
  47. data/lib/when_exe/region/iranian.rb +206 -203
  48. data/lib/when_exe/region/islamic.rb +102 -102
  49. data/lib/when_exe/region/japanese.rb +126 -71
  50. data/lib/when_exe/region/japanese/epochs.rb +426 -426
  51. data/lib/when_exe/region/japanese/notes.rb +101 -81
  52. data/lib/when_exe/region/japanese/residues.rb +1345 -1311
  53. data/lib/when_exe/region/japanese/twins.rb +225 -225
  54. data/lib/when_exe/region/japanese/weeks.rb +112 -112
  55. data/lib/when_exe/region/javanese.rb +230 -230
  56. data/lib/when_exe/region/jewish.rb +130 -131
  57. data/lib/when_exe/region/m17n.rb +114 -114
  58. data/lib/when_exe/region/martian.rb +258 -258
  59. data/lib/when_exe/region/mayan.rb +11 -8
  60. data/lib/when_exe/region/pax.rb +4 -5
  61. data/lib/when_exe/region/pope.rb +1 -1
  62. data/lib/when_exe/region/positivist.rb +100 -100
  63. data/lib/when_exe/region/residue.rb +162 -162
  64. data/lib/when_exe/region/roman.rb +333 -333
  65. data/lib/when_exe/region/{soviet.rb → russian.rb} +221 -209
  66. data/lib/when_exe/region/shire.rb +222 -223
  67. data/lib/when_exe/region/symmetry.rb +50 -50
  68. data/lib/when_exe/region/thai.rb +336 -336
  69. data/lib/when_exe/region/tibetan.rb +315 -316
  70. data/lib/when_exe/region/tranquility.rb +207 -208
  71. data/lib/when_exe/region/vanishing_leprechaun.rb +3 -1
  72. data/lib/when_exe/region/vietnamese.rb +449 -440
  73. data/lib/when_exe/region/weekdate.rb +80 -80
  74. data/lib/when_exe/region/world.rb +170 -171
  75. data/lib/when_exe/region/world_season.rb +89 -89
  76. data/lib/when_exe/region/yerm.rb +3 -3
  77. data/lib/when_exe/region/zoroastrian.rb +205 -205
  78. data/lib/when_exe/timestandard.rb +708 -707
  79. data/lib/when_exe/tmduration.rb +338 -338
  80. data/lib/when_exe/tmobjects.rb +1356 -1356
  81. data/lib/when_exe/tmposition.rb +66 -31
  82. data/lib/when_exe/version.rb +16 -2
  83. data/test/examples/Residue.m17n +83 -83
  84. data/test/examples/Terms.m17n +2 -2
  85. data/test/test.rb +2 -2
  86. data/test/test/google_api.rb +65 -0
  87. data/test/test/linkeddata.rb +1 -1
  88. data/test/test/{googlecalendar.rb → obsolete/googlecalendar.rb} +194 -194
  89. data/test/test/region/indian.rb +90 -85
  90. data/test/test/region/m17n.rb +7 -7
  91. data/test/test/region/mayan.rb +195 -195
  92. data/test/test/region/residue.rb +153 -153
  93. data/test/test/tmposition.rb +11 -1
  94. data/when_exe.gemspec +2 -2
  95. metadata +95 -8
  96. data/test/test.rb.config +0 -1
@@ -1,214 +1,214 @@
1
- # -*- coding: utf-8 -*-
2
- =begin
3
- Copyright (C) 2011-2013 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
- module When
9
- module Ephemeris
10
-
11
- #------------------------------------------
12
- # 太陽・地球 位置計算用データ
13
- #------------------------------------------
14
-
15
- # 太陽の地心黄経
16
- # @private
17
- P3L =
18
- [[LIN , 279.0357964 , 360.007693787, 3.02500E-8],
19
- [SIN , 353.06 , 719.981008 , 0.02009 ,-2.98832E-8],
20
- [SIN , 248.64 , -19.34136 , -0.0048 ],
21
- [SIN , 285.0 , 329.6446699, 0.0020 ,+8.0E-9 ],
22
- [SIN , 334.2 , -4452.671109 , 0.0018 ,-0.1634E-6 ],
23
-
24
- [SIN , 293.7 , -0.2020 , 0.00178 ],
25
- [SIN , 242.4 , 450.3688 , 0.0015 ,+1.4E-9 ],
26
- [SIN , 211.1 , 225.1844 , 0.0013 ,+0.7E-9 ],
27
- [SIN , 208.0 , 659.2893 , 0.0008 ,+1.6E-8 ],
28
- [SIN , 53.5 , 90.3783 , 0.0007 ],
29
-
30
- [SIN , 12.1 , -30.35 , 0.0007 ],
31
- [SIN , 239.1 , 337.18 , 0.0006 ],
32
- [SIN , 10.1 , -1.50 , 0.0005 ],
33
- [SIN , 99.1 , -22.81 , 0.0005 ],
34
- [SIN , 264.8 , 315.56 , 0.0004 ],
35
-
36
- [SIN , 233.8 , 299.30 , 0.0004 ],
37
- [SIN , 198.1 , 720.02 , -0.0004 ],
38
- [SIN , 349.6 , 1079.97 , 0.0003 ],
39
- [SIN , 241.2 , -44.43 , 0.0003 ]]
40
- # [SIN , 65.0 , -44.43 , 0.0003 ]], 旧版
41
- # 太陽の動径の対数
42
- # @private
43
- P3Q =
44
- [[COS , 356.53 , 359.990504 , -0.007261 ,-1.49416E-8],
45
- [COST , 356.53 , 359.990504 , 0.0000002,-1.49416E-8],
46
- [COS , 353.1 , 719.981008 , -0.000091 ,-2.98832E-8],
47
- [COS , 205.8 , 4452.671109 , 0.000013 ,-0.1634E-6 ],
48
- [COS , 62.0 , 450.4 , 0.000007 ,+1.4E-9 ],
49
- [COS , 105.0 , 329.6 , 0.000007 ,+8.0E-9 ]]
50
-
51
- #
52
- # The Sun
53
- #
54
- class Sun < Datum
55
-
56
- # @private
57
- Radius = 696000.0
58
-
59
- class << self
60
-
61
- include Ephemeris
62
-
63
- S0=[356.531, 359.990504, -1.49416E-8] # 太陽の中心差の位相
64
- S1=[ 1.9159, -4.8E-5 , -1.44444E-9] # 太陽の中心差の振幅
65
-
66
- # 視黄経 / CIRCLE
67
- #
68
- # @param [Numeric] t ユリウス日(Terrestrial Time)
69
- # @param [When::TM::TemporalPosition] t
70
- #
71
- # @return [Numeric]
72
- #
73
- def true_longitude(t)
74
- y = julian_year_from_1975(+t)
75
- return (sind(S0[0]+y*(S0[1]+y*S0[2]))*(S1[0]+y*(S1[1]+y*S1[2])) +
76
- trigonometric(y, P3L)) / 360.0 + 1974.0
77
- end
78
-
79
- # 距離 / AU
80
- #
81
- # @param [Numeric] t ユリウス日(Terrestrial Time)
82
- # @param [When::TM::TemporalPosition] t
83
- #
84
- # @return [Numeric]
85
- #
86
- def pi(t)
87
- return 10.0**(0.000030+trigonometric(julian_year_from_1975(+t), P3Q))
88
- end
89
-
90
- # 平均黄経 / CIRCLE
91
- #
92
- # @param [Numeric] t ユリウス日(Terrestrial Time)
93
- # @param [When::TM::TemporalPosition] t
94
- #
95
- # @return [Numeric]
96
- #
97
- def mean_longitude(t)
98
- return trigonometric(julian_year_from_1975(+t), P3L, 0.0, 1) / 360.0 + 1974.0
99
- end
100
- end
101
-
102
- # 位置 (黄道座標)
103
- #
104
- # @param [Numeric] t ユリウス日(Terrestrial Time)
105
- # @param [When::TM::TemporalPosition] t
106
- #
107
- # @return [When::Ephemeris::Coords]
108
- #
109
- def _coords(t)
110
- Coords.polar(0, 0, 0, 0)
111
- end
112
-
113
- # 視黄経 / CIRCLE
114
- #
115
- # @param [Numeric] t ユリウス日(Terrestrial Time)
116
- # @param [When::TM::TemporalPosition] t
117
- #
118
- # @return [0]
119
- #
120
- def true_longitude(t)
121
- 0
122
- end
123
-
124
- # 平均黄経 / CIRCLE
125
- #
126
- # @param [Numeric] t ユリウス日(Terrestrial Time)
127
- # @param [When::TM::TemporalPosition] t
128
- #
129
- # @return [0]
130
- #
131
- def mean_longitude(t)
132
- 0
133
- end
134
-
135
- # 平均運動 / (DEG/YEAR)
136
- #
137
- # @param [Numeric] t ユリウス日(Terrestrial Time)
138
- # @param [When::TM::TemporalPosition] t
139
- #
140
- # @return [0]
141
- #
142
- def mean_motion
143
- 0
144
- end
145
-
146
- # オブジェクトの生成
147
- # @private
148
- def initialize(*args)
149
- options = [args.pop] if args[-1].kind_of?(Hash)
150
- surface_radius, aberration, luminosity, *rest = args
151
- surface_radius ||= Radius
152
- aberration ||= 0.00000
153
- luminosity ||= 4.58
154
- args = [surface_radius, aberration, luminosity] + rest
155
- args += options if options
156
- super(*args)
157
- end
158
- end
159
-
160
- #
161
- # The Earth
162
- #
163
- class Earth < Datum
164
-
165
- # 地球の位置 (黄道座標)
166
- #
167
- # @param [Numeric] t ユリウス日(Terrestrial Time)
168
- # @param [When::TM::TemporalPosition] t
169
- #
170
- # @return [When::Ephemeris::Coords]
171
- #
172
- def _coords(t)
173
- t = +t
174
- radius = Sun.pi(t)
175
- dl = 0.5 + @aberration / radius / 360 # 略算式に含まれる光行差をキャンセルする
176
- Coords.polar(Sun.true_longitude(t)+dl, 0, radius, Sun.mean_longitude(t)+dl)
177
- end
178
-
179
- # 地球の平均運動 / (DEG/YEAR)
180
- #
181
- # @return [Numeric]
182
- #
183
- def mean_motion
184
- P3L[0][2]
185
- end
186
-
187
- # オブジェクトの生成
188
- # @private
189
- def initialize(*args)
190
- options = {
191
- 'shape' => [0.998327112, +0.001676399, -0.000003519, -11.514/60.0],
192
- 'sid' => [6.697375, 2400.0513369, 0.0000259],
193
- 'zeros' => {'Z'=>0, 'A'=>-0.58555, '0'=>-0.85255, 'T'=>-7.36111},
194
- 'air' => [10.0, 0.40, 20.0]
195
- }
196
- options.update(args.pop) if args[-1].kind_of?(Hash)
197
- surface_radius, aberration, luminosity, *rest = args
198
- surface_radius ||= 6378.14
199
- aberration ||= 0.0056932
200
- luminosity ||= -3.50
201
- args = [surface_radius, aberration, luminosity] + rest + [options]
202
- super(*args)
203
- end
204
- end
205
-
206
- #
207
- # Typical Geometrical Datum
208
- #
209
- # provisionally same as When::Ephemeris::Earth
210
- #
211
- class JGD2000 < Earth # TODO
212
- end
213
- end
214
- end
1
+ # -*- coding: utf-8 -*-
2
+ =begin
3
+ Copyright (C) 2011-2015 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
+ module When
9
+ module Ephemeris
10
+
11
+ #------------------------------------------
12
+ # 太陽・地球 位置計算用データ
13
+ #------------------------------------------
14
+
15
+ # 太陽の地心黄経
16
+ # @private
17
+ P3L =
18
+ [[LIN , 279.0357964 , 360.007693787, 3.02500E-8],
19
+ [SIN , 353.06 , 719.981008 , 0.02009 ,-2.98832E-8],
20
+ [SIN , 248.64 , -19.34136 , -0.0048 ],
21
+ [SIN , 285.0 , 329.6446699, 0.0020 ,+8.0E-9 ],
22
+ [SIN , 334.2 , -4452.671109 , 0.0018 ,-0.1634E-6 ],
23
+
24
+ [SIN , 293.7 , -0.2020 , 0.00178 ],
25
+ [SIN , 242.4 , 450.3688 , 0.0015 ,+1.4E-9 ],
26
+ [SIN , 211.1 , 225.1844 , 0.0013 ,+0.7E-9 ],
27
+ [SIN , 208.0 , 659.2893 , 0.0008 ,+1.6E-8 ],
28
+ [SIN , 53.5 , 90.3783 , 0.0007 ],
29
+
30
+ [SIN , 12.1 , -30.35 , 0.0007 ],
31
+ [SIN , 239.1 , 337.18 , 0.0006 ],
32
+ [SIN , 10.1 , -1.50 , 0.0005 ],
33
+ [SIN , 99.1 , -22.81 , 0.0005 ],
34
+ [SIN , 264.8 , 315.56 , 0.0004 ],
35
+
36
+ [SIN , 233.8 , 299.30 , 0.0004 ],
37
+ [SIN , 198.1 , 720.02 , -0.0004 ],
38
+ [SIN , 349.6 , 1079.97 , 0.0003 ],
39
+ [SIN , 241.2 , -44.43 , 0.0003 ]]
40
+ # [SIN , 65.0 , -44.43 , 0.0003 ]], 旧版
41
+ # 太陽の動径の対数
42
+ # @private
43
+ P3Q =
44
+ [[COS , 356.53 , 359.990504 , -0.007261 ,-1.49416E-8],
45
+ [COST , 356.53 , 359.990504 , 0.0000002,-1.49416E-8],
46
+ [COS , 353.1 , 719.981008 , -0.000091 ,-2.98832E-8],
47
+ [COS , 205.8 , 4452.671109 , 0.000013 ,-0.1634E-6 ],
48
+ [COS , 62.0 , 450.4 , 0.000007 ,+1.4E-9 ],
49
+ [COS , 105.0 , 329.6 , 0.000007 ,+8.0E-9 ]]
50
+
51
+ #
52
+ # The Sun
53
+ #
54
+ class Sun < Datum
55
+
56
+ # @private
57
+ Radius = 696000.0
58
+
59
+ class << self
60
+
61
+ include Ephemeris
62
+
63
+ S0=[356.531, 359.990504, -1.49416E-8] # 太陽の中心差の位相
64
+ S1=[ 1.9159, -4.8E-5 , -1.44444E-9] # 太陽の中心差の振幅
65
+
66
+ # 視黄経 / CIRCLE
67
+ #
68
+ # @param [Numeric] t ユリウス日(Terrestrial Time)
69
+ # @param [When::TM::TemporalPosition] t
70
+ #
71
+ # @return [Numeric]
72
+ #
73
+ def true_longitude(t)
74
+ y = julian_year_from_1975(+t)
75
+ return (sind(S0[0]+y*(S0[1]+y*S0[2]))*(S1[0]+y*(S1[1]+y*S1[2])) +
76
+ trigonometric(y, P3L)) / 360.0 + 1974.0
77
+ end
78
+
79
+ # 距離 / AU
80
+ #
81
+ # @param [Numeric] t ユリウス日(Terrestrial Time)
82
+ # @param [When::TM::TemporalPosition] t
83
+ #
84
+ # @return [Numeric]
85
+ #
86
+ def pi(t)
87
+ return 10.0**(0.000030+trigonometric(julian_year_from_1975(+t), P3Q))
88
+ end
89
+
90
+ # 平均黄経 / CIRCLE
91
+ #
92
+ # @param [Numeric] t ユリウス日(Terrestrial Time)
93
+ # @param [When::TM::TemporalPosition] t
94
+ #
95
+ # @return [Numeric]
96
+ #
97
+ def mean_longitude(t)
98
+ return trigonometric(julian_year_from_1975(+t), P3L, 0.0, 1) / 360.0 + 1974.0
99
+ end
100
+ end
101
+
102
+ # 位置 (黄道座標)
103
+ #
104
+ # @param [Numeric] t ユリウス日(Terrestrial Time)
105
+ # @param [When::TM::TemporalPosition] t
106
+ #
107
+ # @return [When::Ephemeris::Coords]
108
+ #
109
+ def _coords(t)
110
+ Coords.polar(0, 0, 0, 0)
111
+ end
112
+
113
+ # 視黄経 / CIRCLE
114
+ #
115
+ # @param [Numeric] t ユリウス日(Terrestrial Time)
116
+ # @param [When::TM::TemporalPosition] t
117
+ #
118
+ # @return [0]
119
+ #
120
+ def true_longitude(t)
121
+ 0
122
+ end
123
+
124
+ # 平均黄経 / CIRCLE
125
+ #
126
+ # @param [Numeric] t ユリウス日(Terrestrial Time)
127
+ # @param [When::TM::TemporalPosition] t
128
+ #
129
+ # @return [0]
130
+ #
131
+ def mean_longitude(t)
132
+ 0
133
+ end
134
+
135
+ # 平均運動 / (DEG/YEAR)
136
+ #
137
+ # @param [Numeric] t ユリウス日(Terrestrial Time)
138
+ # @param [When::TM::TemporalPosition] t
139
+ #
140
+ # @return [0]
141
+ #
142
+ def mean_motion
143
+ 0
144
+ end
145
+
146
+ # オブジェクトの生成
147
+ # @private
148
+ def initialize(*args)
149
+ options = [args.pop] if args[-1].kind_of?(Hash)
150
+ surface_radius, aberration, luminosity, *rest = args
151
+ surface_radius ||= Radius
152
+ aberration ||= 0.00000
153
+ luminosity ||= 4.58
154
+ args = [surface_radius, aberration, luminosity] + rest
155
+ args += options if options
156
+ super(*args)
157
+ end
158
+ end
159
+
160
+ #
161
+ # The Earth
162
+ #
163
+ class Earth < Datum
164
+
165
+ # 地球の位置 (黄道座標)
166
+ #
167
+ # @param [Numeric] t ユリウス日(Terrestrial Time)
168
+ # @param [When::TM::TemporalPosition] t
169
+ #
170
+ # @return [When::Ephemeris::Coords]
171
+ #
172
+ def _coords(t)
173
+ t = +t
174
+ radius = Sun.pi(t)
175
+ dl = 0.5 + @aberration / radius / 360 # 略算式に含まれる光行差をキャンセルする
176
+ Coords.polar(Sun.true_longitude(t)+dl, 0, radius, Sun.mean_longitude(t)+dl)
177
+ end
178
+
179
+ # 地球の平均運動 / (DEG/YEAR)
180
+ #
181
+ # @return [Numeric]
182
+ #
183
+ def mean_motion
184
+ P3L[0][2]
185
+ end
186
+
187
+ # オブジェクトの生成
188
+ # @private
189
+ def initialize(*args)
190
+ options = {
191
+ 'shape' => [0.998327112, +0.001676399, -0.000003519, -11.514/60.0],
192
+ 'sid' => [6.697375, 2400.0513369, 0.0000259],
193
+ 'zeros' => {'Z'=>0, 'A'=>-0.58555, '0'=>-0.85255, 'T'=>-7.36111},
194
+ 'air' => [10.0, 0.40, 20.0]
195
+ }
196
+ options.update(args.pop) if args[-1].kind_of?(Hash)
197
+ surface_radius, aberration, luminosity, *rest = args
198
+ surface_radius ||= 6378.14
199
+ aberration ||= 0.0056932
200
+ luminosity ||= -3.50
201
+ args = [surface_radius, aberration, luminosity] + rest + [options]
202
+ super(*args)
203
+ end
204
+ end
205
+
206
+ #
207
+ # Typical Geometrical Datum
208
+ #
209
+ # provisionally same as When::Ephemeris::Earth
210
+ #
211
+ class JGD2000 < Earth # TODO
212
+ end
213
+ end
214
+ end
@@ -0,0 +1,153 @@
1
+ # -*- coding: utf-8 -*-
2
+ =begin
3
+ Copyright (C) 2015 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
+ #
9
+ # GoogleAPI の Calendar API v3 への対応
10
+ #
11
+ # see {Google Calendar API Reference https://developers.google.com/google-apps/calendar/v3/reference/}
12
+ #
13
+ module When::GoogleAPI
14
+
15
+ #
16
+ # GoogleAPI の Calendar API v3 に対応した Calendar クラス
17
+ #
18
+ class Calendar
19
+
20
+ # APIClient のインスタンス
21
+ #
22
+ # @return [Google::APIClient]
23
+ #
24
+ attr_reader :client
25
+
26
+ # Calendar API のインスタンス
27
+ #
28
+ # @return [Google::APIClient::API]
29
+ #
30
+ attr_reader :service
31
+
32
+ # calendar の id
33
+ #
34
+ # @return [String]
35
+ #
36
+ attr_reader :calendar_id
37
+
38
+ # Calendar に属する Event
39
+ #
40
+ # @return [Array<When::V::Event>]
41
+ #
42
+ attr_reader :events
43
+
44
+ class << self
45
+ #
46
+ # GoogleAPI の Calendar を生成する
47
+ #
48
+ # @param [Google::APIClient] client
49
+ # @param [Google::APIClient::API] service
50
+ # @param [String] calendar_id
51
+ #
52
+ def list(client, service, calendar_id)
53
+ events = []
54
+ result = client.execute({:api_method => service.events.list,
55
+ :parameters => {'calendarId' => calendar_id}})
56
+ loop do
57
+ events += result.data.items.map {|event| event.to_hash}
58
+ page_token = result.data.next_page_token
59
+ break unless page_token
60
+ result = client.execute({:api_method => service.events.list,
61
+ :parameters => {'calendarId' => calendar_id,
62
+ 'pageToken' => page_token}})
63
+ end
64
+ calendar = new(events)
65
+ calendar.instance_variable_set(:@client, client)
66
+ calendar.instance_variable_set(:@service, service)
67
+ calendar.instance_variable_set(:@calendar_id, calendar_id)
68
+ calendar
69
+ end
70
+ end
71
+
72
+ # イベントを順に取り出す enumerator
73
+ #
74
+ # @param [Array] args 個々のイベントの引数 (see {When::V::Event#each})
75
+ #
76
+ # @return [Enumerator]
77
+ #
78
+ def enum_for(*args)
79
+ When::Parts::Enumerator::Integrated.new(self, @events.map {|event| event.enum_for(*args)}, *args)
80
+ end
81
+ alias :to_enum :enum_for
82
+
83
+ #
84
+ # Calendar インスタンスを生成する
85
+ #
86
+ # @param [Array<Hash>] events
87
+ #
88
+ def initialize(events)
89
+ @events = events.map {|event|
90
+ next nil unless event['status'] == 'confirmed'
91
+ When::V::Event.new(event)
92
+ }.compact
93
+ end
94
+ end
95
+ end
96
+
97
+ class When::V::Event
98
+
99
+ # イベントのプロパティ
100
+ #
101
+ # @return [Hash]
102
+ #
103
+ attr_reader :google_api_props
104
+
105
+ class << self
106
+ #
107
+ # GoogleCalendar のプロパティを iCalendar のプロパティに変換する
108
+ #
109
+ # @param [Hash] gprops GoogleCalendar のプロパティ
110
+ #
111
+ # @return [Hash] iCalendar のプロパティ
112
+ #
113
+ def gcal2ical(gprops)
114
+ iprops = {}
115
+ gprops.each_pair do |key, value|
116
+ case key
117
+ when 'summary'
118
+ iprops['summary'] = value
119
+ when 'start', 'end'
120
+ date = 'VALUE=DATE'
121
+ date += '-TIME' if value.key?('dateTime')
122
+ date += ';TZID=' + value['timeZone'] if value.key?('timeZone')
123
+ date += ':' + (value['date'] || value['dateTime'])
124
+ iprops['dt' + key] = date
125
+ when 'recurrence'
126
+ value.map do |line|
127
+ tag, rule = line.split(':', 2)
128
+ tag.downcase!
129
+ if iprops.key?(tag)
130
+ iprops[tag] = Array(iprops[tag]) + [rule]
131
+ else
132
+ iprops[tag] = rule
133
+ end
134
+ end
135
+ when 'iCalUID'
136
+ iprops['uid'] = value
137
+ end
138
+ end
139
+ iprops
140
+ end
141
+ end
142
+
143
+ private
144
+
145
+ # Hash からの属性読み込み
146
+ def _parse_from_code(options)
147
+ if options.key?('start')
148
+ @google_api_props = options
149
+ options = self.class.gcal2ical(options)
150
+ end
151
+ super(options)
152
+ end
153
+ end