tzinfo 2.0.2 → 2.0.5

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.
@@ -0,0 +1,455 @@
1
+ # encoding: UTF-8
2
+ # frozen_string_literal: true
3
+
4
+ module TZInfo
5
+ # Base class for rules definining the transition between standard and daylight
6
+ # savings time.
7
+ #
8
+ # @abstract
9
+ # @private
10
+ class TransitionRule #:nodoc:
11
+ # Returns the number of seconds after midnight local time on the day
12
+ # identified by the rule at which the transition occurs. Can be negative to
13
+ # denote a time on the prior day. Can be greater than or equal to 86,400 to
14
+ # denote a time of the following day.
15
+ #
16
+ # @return [Integer] the time in seconds after midnight local time at which
17
+ # the transition occurs.
18
+ attr_reader :transition_at
19
+
20
+ # Initializes a new {TransitionRule}.
21
+ #
22
+ # @param transition_at [Integer] the time in seconds after midnight local
23
+ # time at which the transition occurs.
24
+ # @raise [ArgumentError] if `transition_at` is not an `Integer`.
25
+ def initialize(transition_at)
26
+ raise ArgumentError, 'Invalid transition_at' unless transition_at.kind_of?(Integer)
27
+ @transition_at = transition_at
28
+ end
29
+
30
+ # Calculates the time of the transition from a given offset on a given year.
31
+ #
32
+ # @param offset [TimezoneOffset] the current offset at the time the rule
33
+ # will transition.
34
+ # @param year [Integer] the year in which the transition occurs (local
35
+ # time).
36
+ # @return [TimestampWithOffset] the time at which the transition occurs.
37
+ def at(offset, year)
38
+ day = get_day(offset, year)
39
+ TimestampWithOffset.set_timezone_offset(Timestamp.for(day + @transition_at), offset)
40
+ end
41
+
42
+ # Determines if this {TransitionRule} is equal to another instance.
43
+ #
44
+ # @param r [Object] the instance to test for equality.
45
+ # @return [Boolean] `true` if `r` is a {TransitionRule} with the same
46
+ # {transition_at} as this {TransitionRule}, otherwise `false`.
47
+ def ==(r)
48
+ r.kind_of?(TransitionRule) && @transition_at == r.transition_at
49
+ end
50
+ alias eql? ==
51
+
52
+ # @return [Integer] a hash based on {hash_args} (defaulting to
53
+ # {transition_at}).
54
+ def hash
55
+ hash_args.hash
56
+ end
57
+
58
+ protected
59
+
60
+ # @return [Array] an `Array` of parameters that will influence the output of
61
+ # {hash}.
62
+ def hash_args
63
+ [@transition_at]
64
+ end
65
+ end
66
+ private_constant :TransitionRule
67
+
68
+ # A base class for transition rules that activate based on an integer day of
69
+ # the year.
70
+ #
71
+ # @abstract
72
+ # @private
73
+ class DayOfYearTransitionRule < TransitionRule #:nodoc:
74
+ # Initializes a new {DayOfYearTransitionRule}.
75
+ #
76
+ # @param day [Integer] the day of the year on which the transition occurs.
77
+ # The precise meaning is defined by subclasses.
78
+ # @param transition_at [Integer] the time in seconds after midnight local
79
+ # time at which the transition occurs.
80
+ # @raise [ArgumentError] if `transition_at` is not an `Integer`.
81
+ # @raise [ArgumentError] if `day` is not an `Integer`.
82
+ def initialize(day, transition_at)
83
+ super(transition_at)
84
+ raise ArgumentError, 'Invalid day' unless day.kind_of?(Integer)
85
+ @seconds = day * 86400
86
+ end
87
+
88
+ # Determines if this {DayOfYearTransitionRule} is equal to another instance.
89
+ #
90
+ # @param r [Object] the instance to test for equality.
91
+ # @return [Boolean] `true` if `r` is a {DayOfYearTransitionRule} with the
92
+ # same {transition_at} and day as this {DayOfYearTransitionRule},
93
+ # otherwise `false`.
94
+ def ==(r)
95
+ super(r) && r.kind_of?(DayOfYearTransitionRule) && @seconds == r.seconds
96
+ end
97
+ alias eql? ==
98
+
99
+ protected
100
+
101
+ # @return [Integer] the day multipled by the number of seconds in a day.
102
+ attr_reader :seconds
103
+
104
+ # (see TransitionRule#hash_args)
105
+ def hash_args
106
+ [@seconds] + super
107
+ end
108
+ end
109
+ private_constant :DayOfYearTransitionRule
110
+
111
+ # Defines transitions that occur on the zero-based nth day of the year.
112
+ #
113
+ # Day 0 is 1 January.
114
+ #
115
+ # Leap days are counted. Day 59 will be 29 February on a leap year and 1 March
116
+ # on a non-leap year. Day 365 will be 31 December on a leap year and 1 January
117
+ # the following year on a non-leap year.
118
+ #
119
+ # @private
120
+ class AbsoluteDayOfYearTransitionRule < DayOfYearTransitionRule #:nodoc:
121
+ # Initializes a new {AbsoluteDayOfYearTransitionRule}.
122
+ #
123
+ # @param day [Integer] the zero-based day of the year on which the
124
+ # transition occurs (0 to 365 inclusive).
125
+ # @param transition_at [Integer] the time in seconds after midnight local
126
+ # time at which the transition occurs.
127
+ # @raise [ArgumentError] if `transition_at` is not an `Integer`.
128
+ # @raise [ArgumentError] if `day` is not an `Integer`.
129
+ # @raise [ArgumentError] if `day` is less than 0 or greater than 365.
130
+ def initialize(day, transition_at = 0)
131
+ super(day, transition_at)
132
+ raise ArgumentError, 'Invalid day' unless day >= 0 && day <= 365
133
+ end
134
+
135
+ # @return [Boolean] `true` if the day specified by this transition is the
136
+ # first in the year (a day number of 0), otherwise `false`.
137
+ def is_always_first_day_of_year?
138
+ seconds == 0
139
+ end
140
+
141
+ # @return [Boolean] `false`.
142
+ def is_always_last_day_of_year?
143
+ false
144
+ end
145
+
146
+ # Determines if this {AbsoluteDayOfYearTransitionRule} is equal to another
147
+ # instance.
148
+ #
149
+ # @param r [Object] the instance to test for equality.
150
+ # @return [Boolean] `true` if `r` is a {AbsoluteDayOfYearTransitionRule}
151
+ # with the same {transition_at} and day as this
152
+ # {AbsoluteDayOfYearTransitionRule}, otherwise `false`.
153
+ def ==(r)
154
+ super(r) && r.kind_of?(AbsoluteDayOfYearTransitionRule)
155
+ end
156
+ alias eql? ==
157
+
158
+ protected
159
+
160
+ # Returns a `Time` representing midnight local time on the day specified by
161
+ # the rule for the given offset and year.
162
+ #
163
+ # @param offset [TimezoneOffset] the current offset at the time of the
164
+ # transition.
165
+ # @param year [Integer] the year in which the transition occurs.
166
+ # @return [Time] midnight local time on the day specified by the rule for
167
+ # the given offset and year.
168
+ def get_day(offset, year)
169
+ Time.new(year, 1, 1, 0, 0, 0, offset.observed_utc_offset) + seconds
170
+ end
171
+
172
+ # (see TransitionRule#hash_args)
173
+ def hash_args
174
+ [AbsoluteDayOfYearTransitionRule] + super
175
+ end
176
+ end
177
+
178
+ # Defines transitions that occur on the one-based nth Julian day of the year.
179
+ #
180
+ # Leap days are not counted. Day 1 is 1 January. Day 60 is always 1 March.
181
+ # Day 365 is always 31 December.
182
+ #
183
+ # @private
184
+ class JulianDayOfYearTransitionRule < DayOfYearTransitionRule #:nodoc:
185
+ # The 60 days in seconds.
186
+ LEAP = 60 * 86400
187
+ private_constant :LEAP
188
+
189
+ # The length of a non-leap year in seconds.
190
+ YEAR = 365 * 86400
191
+ private_constant :YEAR
192
+
193
+ # Initializes a new {JulianDayOfYearTransitionRule}.
194
+ #
195
+ # @param day [Integer] the one-based Julian day of the year on which the
196
+ # transition occurs (1 to 365 inclusive).
197
+ # @param transition_at [Integer] the time in seconds after midnight local
198
+ # time at which the transition occurs.
199
+ # @raise [ArgumentError] if `transition_at` is not an `Integer`.
200
+ # @raise [ArgumentError] if `day` is not an `Integer`.
201
+ # @raise [ArgumentError] if `day` is less than 1 or greater than 365.
202
+ def initialize(day, transition_at = 0)
203
+ super(day, transition_at)
204
+ raise ArgumentError, 'Invalid day' unless day >= 1 && day <= 365
205
+ end
206
+
207
+ # @return [Boolean] `true` if the day specified by this transition is the
208
+ # first in the year (a day number of 1), otherwise `false`.
209
+ def is_always_first_day_of_year?
210
+ seconds == 86400
211
+ end
212
+
213
+ # @return [Boolean] `true` if the day specified by this transition is the
214
+ # last in the year (a day number of 365), otherwise `false`.
215
+ def is_always_last_day_of_year?
216
+ seconds == YEAR
217
+ end
218
+
219
+ # Determines if this {JulianDayOfYearTransitionRule} is equal to another
220
+ # instance.
221
+ #
222
+ # @param r [Object] the instance to test for equality.
223
+ # @return [Boolean] `true` if `r` is a {JulianDayOfYearTransitionRule} with
224
+ # the same {transition_at} and day as this
225
+ # {JulianDayOfYearTransitionRule}, otherwise `false`.
226
+ def ==(r)
227
+ super(r) && r.kind_of?(JulianDayOfYearTransitionRule)
228
+ end
229
+ alias eql? ==
230
+
231
+ protected
232
+
233
+ # Returns a `Time` representing midnight local time on the day specified by
234
+ # the rule for the given offset and year.
235
+ #
236
+ # @param offset [TimezoneOffset] the current offset at the time of the
237
+ # transition.
238
+ # @param year [Integer] the year in which the transition occurs.
239
+ # @return [Time] midnight local time on the day specified by the rule for
240
+ # the given offset and year.
241
+ def get_day(offset, year)
242
+ # Returns 1 March on non-leap years.
243
+ leap = Time.new(year, 2, 29, 0, 0, 0, offset.observed_utc_offset)
244
+ diff = seconds - LEAP
245
+ diff += 86400 if diff >= 0 && leap.mday == 29
246
+ leap + diff
247
+ end
248
+
249
+ # (see TransitionRule#hash_args)
250
+ def hash_args
251
+ [JulianDayOfYearTransitionRule] + super
252
+ end
253
+ end
254
+ private_constant :JulianDayOfYearTransitionRule
255
+
256
+ # A base class for rules that transition on a particular day of week of a
257
+ # given week (subclasses specify which week of the month).
258
+ #
259
+ # @abstract
260
+ # @private
261
+ class DayOfWeekTransitionRule < TransitionRule #:nodoc:
262
+ # Initializes a new {DayOfWeekTransitionRule}.
263
+ #
264
+ # @param month [Integer] the month of the year when the transition occurs.
265
+ # @param day_of_week [Integer] the day of the week when the transition
266
+ # occurs. 0 is Sunday, 6 is Saturday.
267
+ # @param transition_at [Integer] the time in seconds after midnight local
268
+ # time at which the transition occurs.
269
+ # @raise [ArgumentError] if `transition_at` is not an `Integer`.
270
+ # @raise [ArgumentError] if `month` is not an `Integer`.
271
+ # @raise [ArgumentError] if `month` is less than 1 or greater than 12.
272
+ # @raise [ArgumentError] if `day_of_week` is not an `Integer`.
273
+ # @raise [ArgumentError] if `day_of_week` is less than 0 or greater than 6.
274
+ def initialize(month, day_of_week, transition_at)
275
+ super(transition_at)
276
+ raise ArgumentError, 'Invalid month' unless month.kind_of?(Integer) && month >= 1 && month <= 12
277
+ raise ArgumentError, 'Invalid day_of_week' unless day_of_week.kind_of?(Integer) && day_of_week >= 0 && day_of_week <= 6
278
+ @month = month
279
+ @day_of_week = day_of_week
280
+ end
281
+
282
+ # @return [Boolean] `false`.
283
+ def is_always_first_day_of_year?
284
+ false
285
+ end
286
+
287
+ # @return [Boolean] `false`.
288
+ def is_always_last_day_of_year?
289
+ false
290
+ end
291
+
292
+ # Determines if this {DayOfWeekTransitionRule} is equal to another
293
+ # instance.
294
+ #
295
+ # @param r [Object] the instance to test for equality.
296
+ # @return [Boolean] `true` if `r` is a {DayOfWeekTransitionRule} with the
297
+ # same {transition_at}, month and day of week as this
298
+ # {DayOfWeekTransitionRule}, otherwise `false`.
299
+ def ==(r)
300
+ super(r) && r.kind_of?(DayOfWeekTransitionRule) && @month == r.month && @day_of_week == r.day_of_week
301
+ end
302
+ alias eql? ==
303
+
304
+ protected
305
+
306
+ # @return [Integer] the month of the year (1 to 12).
307
+ attr_reader :month
308
+
309
+ # @return [Integer] the day of the week (0 to 6 for Sunday to Monday).
310
+ attr_reader :day_of_week
311
+
312
+ # (see TransitionRule#hash_args)
313
+ def hash_args
314
+ [@month, @day_of_week] + super
315
+ end
316
+ end
317
+ private_constant :DayOfWeekTransitionRule
318
+
319
+ # A rule that transitions on the nth occurrence of a particular day of week
320
+ # of a calendar month.
321
+ #
322
+ # @private
323
+ class DayOfMonthTransitionRule < DayOfWeekTransitionRule #:nodoc:
324
+ # Initializes a new {DayOfMonthTransitionRule}.
325
+ #
326
+ # @param month [Integer] the month of the year when the transition occurs.
327
+ # @param week [Integer] the week of the month when the transition occurs (1
328
+ # to 4).
329
+ # @param day_of_week [Integer] the day of the week when the transition
330
+ # occurs. 0 is Sunday, 6 is Saturday.
331
+ # @param transition_at [Integer] the time in seconds after midnight local
332
+ # time at which the transition occurs.
333
+ # @raise [ArgumentError] if `transition_at` is not an `Integer`.
334
+ # @raise [ArgumentError] if `month` is not an `Integer`.
335
+ # @raise [ArgumentError] if `month` is less than 1 or greater than 12.
336
+ # @raise [ArgumentError] if `week` is not an `Integer`.
337
+ # @raise [ArgumentError] if `week` is less than 1 or greater than 4.
338
+ # @raise [ArgumentError] if `day_of_week` is not an `Integer`.
339
+ # @raise [ArgumentError] if `day_of_week` is less than 0 or greater than 6.
340
+ def initialize(month, week, day_of_week, transition_at = 0)
341
+ super(month, day_of_week, transition_at)
342
+ raise ArgumentError, 'Invalid week' unless week.kind_of?(Integer) && week >= 1 && week <= 4
343
+ @offset_start = (week - 1) * 7 + 1
344
+ end
345
+
346
+ # Determines if this {DayOfMonthTransitionRule} is equal to another
347
+ # instance.
348
+ #
349
+ # @param r [Object] the instance to test for equality.
350
+ # @return [Boolean] `true` if `r` is a {DayOfMonthTransitionRule} with the
351
+ # same {transition_at}, month, week and day of week as this
352
+ # {DayOfMonthTransitionRule}, otherwise `false`.
353
+ def ==(r)
354
+ super(r) && r.kind_of?(DayOfMonthTransitionRule) && @offset_start == r.offset_start
355
+ end
356
+ alias eql? ==
357
+
358
+ protected
359
+
360
+ # @return [Integer] the day the week starts on for a month starting on a
361
+ # Sunday.
362
+ attr_reader :offset_start
363
+
364
+ # Returns a `Time` representing midnight local time on the day specified by
365
+ # the rule for the given offset and year.
366
+ #
367
+ # @param offset [TimezoneOffset] the current offset at the time of the
368
+ # transition.
369
+ # @param year [Integer] the year in which the transition occurs.
370
+ # @return [Time] midnight local time on the day specified by the rule for
371
+ # the given offset and year.
372
+ def get_day(offset, year)
373
+ candidate = Time.new(year, month, @offset_start, 0, 0, 0, offset.observed_utc_offset)
374
+ diff = day_of_week - candidate.wday
375
+
376
+ if diff < 0
377
+ candidate + (7 + diff) * 86400
378
+ elsif diff > 0
379
+ candidate + diff * 86400
380
+ else
381
+ candidate
382
+ end
383
+ end
384
+
385
+ # (see TransitionRule#hash_args)
386
+ def hash_args
387
+ [@offset_start] + super
388
+ end
389
+ end
390
+ private_constant :DayOfMonthTransitionRule
391
+
392
+ # A rule that transitions on the last occurrence of a particular day of week
393
+ # of a calendar month.
394
+ #
395
+ # @private
396
+ class LastDayOfMonthTransitionRule < DayOfWeekTransitionRule #:nodoc:
397
+ # Initializes a new {LastDayOfMonthTransitionRule}.
398
+ #
399
+ # @param month [Integer] the month of the year when the transition occurs.
400
+ # @param day_of_week [Integer] the day of the week when the transition
401
+ # occurs. 0 is Sunday, 6 is Saturday.
402
+ # @param transition_at [Integer] the time in seconds after midnight local
403
+ # time at which the transition occurs.
404
+ # @raise [ArgumentError] if `transition_at` is not an `Integer`.
405
+ # @raise [ArgumentError] if `month` is not an `Integer`.
406
+ # @raise [ArgumentError] if `month` is less than 1 or greater than 12.
407
+ # @raise [ArgumentError] if `day_of_week` is not an `Integer`.
408
+ # @raise [ArgumentError] if `day_of_week` is less than 0 or greater than 6.
409
+ def initialize(month, day_of_week, transition_at = 0)
410
+ super(month, day_of_week, transition_at)
411
+ end
412
+
413
+ # Determines if this {LastDayOfMonthTransitionRule} is equal to another
414
+ # instance.
415
+ #
416
+ # @param r [Object] the instance to test for equality.
417
+ # @return [Boolean] `true` if `r` is a {LastDayOfMonthTransitionRule} with
418
+ # the same {transition_at}, month and day of week as this
419
+ # {LastDayOfMonthTransitionRule}, otherwise `false`.
420
+ def ==(r)
421
+ super(r) && r.kind_of?(LastDayOfMonthTransitionRule)
422
+ end
423
+ alias eql? ==
424
+
425
+ protected
426
+
427
+ # Returns a `Time` representing midnight local time on the day specified by
428
+ # the rule for the given offset and year.
429
+ #
430
+ # @param offset [TimezoneOffset] the current offset at the time of the
431
+ # transition.
432
+ # @param year [Integer] the year in which the transition occurs.
433
+ # @return [Time] midnight local time on the day specified by the rule for
434
+ # the given offset and year.
435
+ def get_day(offset, year)
436
+ next_month = month + 1
437
+ if next_month == 13
438
+ year += 1
439
+ next_month = 1
440
+ end
441
+
442
+ candidate = Time.new(year, next_month, 1, 0, 0, 0, offset.observed_utc_offset) - 86400
443
+ diff = candidate.wday - day_of_week
444
+
445
+ if diff < 0
446
+ candidate - (diff + 7) * 86400
447
+ elsif diff > 0
448
+ candidate - diff * 86400
449
+ else
450
+ candidate
451
+ end
452
+ end
453
+ end
454
+ private_constant :LastDayOfMonthTransitionRule
455
+ end
@@ -3,5 +3,5 @@
3
3
 
4
4
  module TZInfo
5
5
  # The TZInfo version number.
6
- VERSION = '2.0.2'
6
+ VERSION = '2.0.5'
7
7
  end
data/lib/tzinfo.rb CHANGED
@@ -3,6 +3,18 @@
3
3
 
4
4
  # The top level module for TZInfo.
5
5
  module TZInfo
6
+ class << self
7
+ # Instructs the current {DataSource} to load all timezone and country data
8
+ # into memory (initializing the {DataSource} first if not previously
9
+ # accessed or set).
10
+ #
11
+ # This may be desirable in production environments to improve copy-on-write
12
+ # performance and to avoid flushing the constant cache every time a new
13
+ # timezone or country is loaded from {DataSources::RubyDataSource}.
14
+ def eager_load!
15
+ DataSource.get.eager_load!
16
+ end
17
+ end
6
18
  end
7
19
 
8
20
  # Object#untaint is a deprecated no-op in Ruby >= 2.7 and will be removed in
@@ -25,6 +37,8 @@ require_relative 'tzinfo/timestamp_with_offset'
25
37
 
26
38
  require_relative 'tzinfo/timezone_offset'
27
39
  require_relative 'tzinfo/timezone_transition'
40
+ require_relative 'tzinfo/transition_rule'
41
+ require_relative 'tzinfo/annual_rules'
28
42
 
29
43
  require_relative 'tzinfo/data_sources'
30
44
  require_relative 'tzinfo/data_sources/timezone_info'
@@ -35,6 +49,7 @@ require_relative 'tzinfo/data_sources/transitions_data_timezone_info'
35
49
 
36
50
  require_relative 'tzinfo/data_sources/country_info'
37
51
 
52
+ require_relative 'tzinfo/data_sources/posix_time_zone_parser'
38
53
  require_relative 'tzinfo/data_sources/zoneinfo_reader'
39
54
 
40
55
  require_relative 'tzinfo/data_source'
data.tar.gz.sig CHANGED
Binary file
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: tzinfo
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.0.2
4
+ version: 2.0.5
5
5
  platform: ruby
6
6
  authors:
7
7
  - Philip Ross
@@ -29,7 +29,7 @@ cert_chain:
29
29
  J3Zn/kSTjTekiaspyGbczC3PUaeJNxr+yCvR4sk71Xmk/GaKKGOHedJ1uj/LAXrA
30
30
  MR0mpl7b8zCg0PFC1J73uw==
31
31
  -----END CERTIFICATE-----
32
- date: 2020-04-02 00:00:00.000000000 Z
32
+ date: 2022-07-19 00:00:00.000000000 Z
33
33
  dependencies:
34
34
  - !ruby/object:Gem::Dependency
35
35
  name: concurrent-ruby
@@ -60,6 +60,7 @@ files:
60
60
  - LICENSE
61
61
  - README.md
62
62
  - lib/tzinfo.rb
63
+ - lib/tzinfo/annual_rules.rb
63
64
  - lib/tzinfo/country.rb
64
65
  - lib/tzinfo/country_timezone.rb
65
66
  - lib/tzinfo/data_source.rb
@@ -68,6 +69,7 @@ files:
68
69
  - lib/tzinfo/data_sources/country_info.rb
69
70
  - lib/tzinfo/data_sources/data_timezone_info.rb
70
71
  - lib/tzinfo/data_sources/linked_timezone_info.rb
72
+ - lib/tzinfo/data_sources/posix_time_zone_parser.rb
71
73
  - lib/tzinfo/data_sources/ruby_data_source.rb
72
74
  - lib/tzinfo/data_sources/timezone_info.rb
73
75
  - lib/tzinfo/data_sources/transitions_data_timezone_info.rb
@@ -101,6 +103,7 @@ files:
101
103
  - lib/tzinfo/timezone_period.rb
102
104
  - lib/tzinfo/timezone_proxy.rb
103
105
  - lib/tzinfo/timezone_transition.rb
106
+ - lib/tzinfo/transition_rule.rb
104
107
  - lib/tzinfo/transitions_timezone_period.rb
105
108
  - lib/tzinfo/untaint_ext.rb
106
109
  - lib/tzinfo/version.rb
@@ -108,7 +111,12 @@ files:
108
111
  homepage: https://tzinfo.github.io
109
112
  licenses:
110
113
  - MIT
111
- metadata: {}
114
+ metadata:
115
+ bug_tracker_uri: https://github.com/tzinfo/tzinfo/issues
116
+ changelog_uri: https://github.com/tzinfo/tzinfo/blob/master/CHANGES.md
117
+ documentation_uri: https://rubydoc.info/gems/tzinfo/2.0.5
118
+ homepage_uri: https://tzinfo.github.io
119
+ source_code_uri: https://github.com/tzinfo/tzinfo/tree/v2.0.5
112
120
  post_install_message:
113
121
  rdoc_options:
114
122
  - "--title"
@@ -128,7 +136,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
128
136
  - !ruby/object:Gem::Version
129
137
  version: '0'
130
138
  requirements: []
131
- rubygems_version: 3.1.2
139
+ rubygems_version: 3.3.7
132
140
  signing_key:
133
141
  specification_version: 4
134
142
  summary: Time Zone Library
metadata.gz.sig CHANGED
Binary file