when_exe 0.4.1 → 0.4.2

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 (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