et-orbi 1.1.1 → 1.1.2

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: db2e44b25fa9806ddea412a4c4ab67f404f8abf7
4
- data.tar.gz: 28bff7ef341b1458b17a604638878f17c131ad76
3
+ metadata.gz: 9087de4253106aad0142d0e3a7985b2fd4cef1f4
4
+ data.tar.gz: e5b7dc43e253987e3f60b42ce55c4c8b521438d4
5
5
  SHA512:
6
- metadata.gz: '0411908916cd638a834b73d73685c3615154c26b39d1ef264bb0e924808bbb845dab0ee7d89c12a2d0fc20757e748a0dc2b1785c12396a754123a65393cb7b5c'
7
- data.tar.gz: bde96903887538a4f15885e74996882c68d662d6692e76f217fe471782ef9b8951df0aee97b0c6150ab0ffd5e6985579f9786f00b6e5c4b059b341eb4235b904
6
+ metadata.gz: 72c25c33cca74a4e487f215ad9b2b6c1fda170d06387e1bd9242a8b04bc51f2885a0773f11658076d1f3c99b4ddb8e93269028500d991fed82ab5a2f144e6c91
7
+ data.tar.gz: 220954e56982a997ccee2d2f036f74a10384ab63033055171130cbd984b38c9b1d8148134a57e6db9acb527a35854697e7063a869cb73794d2f529e89a0df7f9
@@ -2,6 +2,12 @@
2
2
  # et-orbi CHANGELOG.md
3
3
 
4
4
 
5
+ ## et-orbi 1.1.2 released 2018-05-24
6
+
7
+ - Let EtOrbi.get_tzone understand "CST+0800"
8
+ - Introduce EtOrbi.to_windows_tz (Asia/Kolkata to IST-5:30)
9
+
10
+
5
11
  ## et-orbi 1.1.1 released 2018-05-04
6
12
 
7
13
  - Stop caching the local tzone, cache the tools used for determining it
data/README.md CHANGED
@@ -2,6 +2,7 @@
2
2
  # et-orbi
3
3
 
4
4
  [![Build Status](https://secure.travis-ci.org/floraison/et-orbi.svg)](http://travis-ci.org/floraison/et-orbi)
5
+ [![Build status](https://ci.appveyor.com/api/projects/status/6tbo9lk9qdor8ipl?svg=true)](https://ci.appveyor.com/project/jmettraux/et-orbi)
5
6
  [![Gem Version](https://badge.fury.io/rb/et-orbi.svg)](http://badge.fury.io/rb/et-orbi)
6
7
 
7
8
  Time zones for [fugit](https://github.com/floraison/fugit) and for [rufus-scheduler](https://github.com/jmettraux/rufus-scheduler). Urbi et Orbi.
@@ -4,10 +4,12 @@ require 'time'
4
4
 
5
5
  require 'tzinfo'
6
6
 
7
+ require 'et-orbi/zone_aliases'
8
+
7
9
 
8
10
  module EtOrbi
9
11
 
10
- VERSION = '1.1.1'
12
+ VERSION = '1.1.2'
11
13
 
12
14
  #
13
15
  # module methods
@@ -103,7 +105,7 @@ module EtOrbi
103
105
  # pass the abbreviation anyway,
104
106
  # it will be used in resulting the error message
105
107
 
106
- EoTime.new(t.to_f, z)
108
+ EoTime.new(t, z)
107
109
  end
108
110
 
109
111
  def make_from_date(d, zone)
@@ -151,15 +153,16 @@ module EtOrbi
151
153
 
152
154
  return nil unless o.is_a?(String)
153
155
 
154
- (@custom_tz_cache ||= {})[o] ||
155
- get_offset_tzone(o) ||
156
- (::TZInfo::Timezone.get(o) rescue nil)
156
+ s = unalias(o)
157
+
158
+ get_offset_tzone(s) ||
159
+ (::TZInfo::Timezone.get(s) rescue nil)
157
160
  end
158
161
 
159
162
  def render_nozone_time(seconds)
160
163
 
161
164
  t =
162
- Time.utc(0) + seconds
165
+ Time.utc(1970) + seconds
163
166
  ts =
164
167
  t.strftime('%Y-%m-%d %H:%M:%S') +
165
168
  ".#{(seconds % 1).to_s.split('.').last}"
@@ -175,22 +178,26 @@ module EtOrbi
175
178
 
176
179
  etos = Proc.new { |k, v| "#{k}:#{v.inspect}" }
177
180
 
178
- '(' +
179
- {
180
- 'etz' => ENV['TZ'],
181
- 'tnz' => Time.now.zone,
182
- 'tzid' => defined?(TZInfo::Data),
183
- 'rv' => RUBY_VERSION,
184
- 'rp' => RUBY_PLATFORM,
185
- 'rorv' => (Rails::VERSION::STRING rescue nil),
186
- 'astz' => ([ Time.zone.class, Time.zone.tzinfo.name ] rescue nil),
187
- 'eov' => EtOrbi::VERSION,
188
- 'eotnz' => EtOrbi::EoTime.now.zone,
189
- 'eotnfz' => EtOrbi::EoTime.now.strftime('%z'),
190
- 'eotlzn' => EtOrbi::EoTime.local_tzone.name,
191
- }.collect(&etos).join(',') + ',' +
192
- gather_tzs.collect(&etos).join(',') +
193
- ')'
181
+ h = {
182
+ 'etz' => ENV['TZ'],
183
+ 'tnz' => Time.now.zone,
184
+ 'tzid' => defined?(TZInfo::Data),
185
+ 'rv' => RUBY_VERSION,
186
+ 'rp' => RUBY_PLATFORM,
187
+ 'win' => Gem.win_platform?,
188
+ 'rorv' => (Rails::VERSION::STRING rescue nil),
189
+ 'astz' => ([ Time.zone.class, Time.zone.tzinfo.name ] rescue nil),
190
+ 'eov' => EtOrbi::VERSION,
191
+ 'eotnz' => '???',
192
+ 'eotnfz' => '???',
193
+ 'eotlzn' => '???' }
194
+ if ltz = EtOrbi::EoTime.local_tzone
195
+ h['eotnz'] = EtOrbi::EoTime.now.zone
196
+ h['eotnfz'] = EtOrbi::EoTime.now.strftime('%z')
197
+ h['eotlzn'] = ltz.name
198
+ end
199
+
200
+ "(#{h.map(&etos).join(',')},#{gather_tzs.map(&etos).join(',')})"
194
201
  end
195
202
 
196
203
  alias make make_time
@@ -301,7 +308,7 @@ module EtOrbi
301
308
 
302
309
  fail ArgumentError.new(
303
310
  "Cannot determine timezone from #{zone.inspect}" +
304
- "\n#{EtOrbi.render_nozone_time(s)}" +
311
+ "\n#{EtOrbi.render_nozone_time(@seconds)}" +
305
312
  "\n#{EtOrbi.platform_info.sub(',debian:', ",\ndebian:")}" +
306
313
  "\nTry setting `ENV['TZ'] = 'Continent/City'` in your script " +
307
314
  "(see https://en.wikipedia.org/wiki/List_of_tz_database_time_zones)" +
@@ -328,7 +335,7 @@ module EtOrbi
328
335
  #
329
336
  def utc
330
337
 
331
- Time.utc(1970, 1, 1) + @seconds
338
+ Time.utc(1970) + @seconds
332
339
  end
333
340
 
334
341
  # Returns true if this ::EtOrbi::EoTime instance timezone is UTC.
@@ -336,7 +343,8 @@ module EtOrbi
336
343
  #
337
344
  def utc?
338
345
 
339
- %w[ zulu utc gmt ].include?(@zone.canonical_identifier.downcase)
346
+ %w[ gmt utc zulu etc/gmt etc/utc ].include?(
347
+ @zone.canonical_identifier.downcase)
340
348
  end
341
349
 
342
350
  alias getutc utc
@@ -616,7 +624,7 @@ module EtOrbi
616
624
 
617
625
  etz = ENV['TZ']
618
626
 
619
- tz = ::TZInfo::Timezone.get(etz) rescue nil
627
+ tz = etz && (::TZInfo::Timezone.get(etz) rescue nil)
620
628
  return tz if tz
621
629
 
622
630
  if Time.respond_to?(:zone) && Time.zone.respond_to?(:tzinfo)
@@ -628,14 +636,44 @@ module EtOrbi
628
636
  return tz if tz
629
637
 
630
638
  tzs = determine_local_tzones
631
- (etz && tzs.find { |z| z.name == etz }) || tzs.first
639
+ tz = (etz && tzs.find { |z| z.name == etz }) || tzs.first
640
+ return tz if tz
641
+
642
+ n = Time.now
643
+
644
+ get_tzone(n.zone) ||
645
+ get_tzone(n.strftime('%Z%z'))
632
646
  end
633
647
 
648
+ attr_accessor :_os_zone # test tool
649
+
634
650
  def os_tz
635
651
 
652
+ return (@_os_zone == '' ? nil : @_os_zone) if @_os_zone
653
+
636
654
  @os_tz ||= (debian_tz || centos_tz || osx_tz)
637
655
  end
638
656
 
657
+ def to_windows_tz(zone_name, time=Time.now)
658
+
659
+ twin = Time.utc(time.year, 1, 1) # winter
660
+ tsum = Time.utc(time.year, 7, 1) # summer
661
+
662
+ tz = ::TZInfo::Timezone.get(zone_name)
663
+ tzo = tz.period_for_local(time).utc_total_offset
664
+ tzop = tzo < 0 ? nil : '-'; tzo = tzo.abs
665
+ tzoh = tzo / 3600
666
+ tzos = tzo % 3600
667
+ tzos = tzos == 0 ? nil : ':%02d' % (tzos / 60)
668
+
669
+ abbs = [
670
+ tz.period_for_utc(twin).abbreviation.to_s,
671
+ tz.period_for_utc(tsum).abbreviation.to_s ]
672
+ .uniq
673
+
674
+ [ abbs[0], tzop, tzoh, tzos, abbs[1] ].compact.join
675
+ end
676
+
639
677
  #
640
678
  # protected module methods
641
679
 
@@ -664,7 +702,8 @@ module EtOrbi
664
702
  mn = -mn if hr && hr < 0
665
703
 
666
704
  return (
667
- @custom_tz_cache[str] = create_offset_tzone(hr * 3600 + mn * 60, str)
705
+ (@custom_tz_cache ||= {})[str] =
706
+ create_offset_tzone(hr * 3600 + mn * 60, str)
668
707
  ) if hr
669
708
 
670
709
  nil
@@ -694,7 +733,9 @@ module EtOrbi
694
733
  def determine_local_tzones
695
734
 
696
735
  tabbs = (-6..5)
697
- .collect { |i| (Time.now + i * 30 * 24 * 3600).zone }
736
+ .collect { |i|
737
+ t = Time.now + i * 30 * 24 * 3600
738
+ "#{t.zone}_#{t.utc_offset}" }
698
739
  .uniq
699
740
  .sort
700
741
  .join('|')
@@ -702,19 +743,22 @@ module EtOrbi
702
743
  t = Time.now
703
744
  #tu = t.dup.utc # /!\ dup is necessary, #utc modifies its target
704
745
 
705
- twin = Time.utc(t.year, 1, 1) # winter
706
- tsum = Time.utc(t.year, 7, 1) # summer
746
+ twin = Time.local(t.year, 1, 1) # winter
747
+ tsum = Time.local(t.year, 7, 1) # summer
707
748
 
708
749
  @tz_all ||= ::TZInfo::Timezone.all
709
750
  @tz_winter_summer ||= {}
710
751
 
711
752
  @tz_winter_summer[tabbs] ||= @tz_all
712
753
  .select { |tz|
754
+ pw = tz.period_for_local(twin)
755
+ ps = tz.period_for_local(tsum)
713
756
  tabbs ==
714
- [
715
- tz.period_for_utc(twin).abbreviation.to_s,
716
- tz.period_for_utc(tsum).abbreviation.to_s
717
- ].uniq.sort.join('|') }
757
+ [ "#{pw.abbreviation}_#{pw.utc_total_offset}",
758
+ "#{ps.abbreviation}_#{ps.utc_total_offset}" ]
759
+ .uniq.sort.join('|') }
760
+
761
+ @tz_winter_summer[tabbs]
718
762
  end
719
763
 
720
764
  #
@@ -0,0 +1,115 @@
1
+
2
+ module EtOrbi
3
+
4
+ def self.unalias(name)
5
+
6
+ ZONE_ALIASES[name.sub(/ Daylight /, ' Standard ')] ||
7
+ unzz(name) ||
8
+ name
9
+ end
10
+
11
+ def self.unzz(name)
12
+
13
+ m = name.match(/\A([A-Z]{3,4})([+-])(\d{1,2}):?(\d{2})?\z/)
14
+ return nil unless m
15
+
16
+ abbs = [ m[1] ]; a = m[1]
17
+ abbs << "#{a}T" if a.size < 4
18
+
19
+ off = (m[2] == '+' ? 1 : -1) * (m[3].to_i * 3600 + (m[4] || '0').to_i * 60)
20
+
21
+ t = Time.now
22
+ twin = Time.utc(t.year, 1, 1) # winter
23
+ tsum = Time.utc(t.year, 7, 1) # summer
24
+
25
+ (@tz_all ||= ::TZInfo::Timezone.all)
26
+ .each { |tz|
27
+ abbs.each { |abb|
28
+ per = tz.period_for_utc(twin)
29
+ return tz.name \
30
+ if per.abbreviation.to_s == abb && per.utc_total_offset == off
31
+ per = tz.period_for_utc(tsum)
32
+ return tz.name \
33
+ if per.abbreviation.to_s == abb && per.utc_total_offset == off } }
34
+
35
+ nil
36
+ end
37
+
38
+ ZONE_ALIASES = {
39
+ 'Coordinated Universal Time' => 'UTC',
40
+ 'Afghanistan Standard Time' => 'Asia/Kabul',
41
+ 'FLE Standard Time' => 'Europe/Helsinki',
42
+ 'Central Europe Standard Time' => 'Europe/Prague',
43
+ 'UTC-11' => 'Etc/GMT+11',
44
+ 'W. Europe Standard Time' => 'Europe/Rome',
45
+ 'W. Central Africa Standard Time' => 'Africa/Lagos',
46
+ 'SA Western Standard Time' => 'America/La_Paz',
47
+ 'Pacific SA Standard Time' => 'America/Santiago',
48
+ 'Argentina Standard Time' => 'America/Argentina/Buenos_Aires',
49
+ 'Caucasus Standard Time' => 'Asia/Yerevan',
50
+ 'AUS Eastern Standard Time' => 'Australia/Sydney',
51
+ 'Azerbaijan Standard Time' => 'Asia/Baku',
52
+ 'Eastern Standard Time' => 'America/New_York',
53
+ 'Arab Standard Time' => 'Asia/Riyadh',
54
+ 'Bangladesh Standard Time' => 'Asia/Dhaka',
55
+ 'Belarus Standard Time' => 'Europe/Minsk',
56
+ 'Romance Standard Time' => 'Europe/Paris',
57
+ 'Central America Standard Time' => 'America/Belize',
58
+ 'Atlantic Standard Time' => 'Atlantic/Bermuda',
59
+ 'Venezuela Standard Time' => 'America/Caracas',
60
+ 'Central European Standard Time' => 'Europe/Warsaw',
61
+ 'South Africa Standard Time' => 'Africa/Johannesburg',
62
+ #'UTC' => 'Etc/UTC', # 'UTC' is good as is
63
+ 'E. South America Standard Time' => 'America/Sao_Paulo',
64
+ 'Central Asia Standard Time' => 'Asia/Almaty',
65
+ 'Singapore Standard Time' => 'Asia/Singapore',
66
+ 'Greenwich Standard Time' => 'Africa/Monrovia',
67
+ 'Cape Verde Standard Time' => 'Atlantic/Cape_Verde',
68
+ 'SE Asia Standard Time' => 'Asia/Bangkok',
69
+ 'SA Pacific Standard Time' => 'America/Bogota',
70
+ 'China Standard Time' => 'Asia/Shanghai',
71
+ 'Myanmar Standard Time' => 'Asia/Yangon',
72
+ 'E. Africa Standard Time' => 'Africa/Nairobi',
73
+ 'Hawaiian Standard Time' => 'Pacific/Honololu',
74
+ 'E. Europe Standard Time' => 'Europe/Nicosia',
75
+ 'Tokyo Standard Time' => 'Asia/Tokyo',
76
+ 'Egypt Standard Time' => 'Africa/Cairo',
77
+ 'SA Eastern Standard Time' => 'America/Cayenne',
78
+ 'GMT Standard Time' => 'Europe/London',
79
+ 'Fiji Standard Time' => 'Pacific/Fiji',
80
+ 'West Asia Standard Time' => 'Asia/Tashkent',
81
+ 'Georgian Standard Time' => 'Asia/Tbilisi',
82
+ 'GTB Standard Time' => 'Europe/Athens',
83
+ 'Greenland Standard Time' => 'America/Godthab',
84
+ 'West Pacific Standard Time' => 'Pacific/Guam',
85
+ 'Mauritius Standard Time' => 'Indian/Mauritius',
86
+ 'India Standard Time' => 'Asia/Kolkata',
87
+ 'Iran Standard Time' => 'Asia/Tehran',
88
+ 'Arabic Standard Time' => 'Asia/Baghdad',
89
+ 'Israel Standard Time' => 'Asia/Jerusalem',
90
+ 'Jordan Standard Time' => 'Asia/Amman',
91
+ 'UTC+12' => 'Etc/GMT-12',
92
+ 'Korea Standard Time' => 'Asia/Seoul',
93
+ 'Middle East Standard Time' => 'Asia/Beirut',
94
+ 'Central Standard Time (Mexico)' => 'America/Mexico_City',
95
+ 'Ulaanbaatar Standard Time' => 'Asia/Ulaanbaatar',
96
+ 'Morocco Standard Time' => 'Africa/Casablanca',
97
+ 'Namibia Standard Time' => 'Africa/Windhoek',
98
+ 'Nepal Standard Time' => 'Asia/Kathmandu',
99
+ 'Central Pacific Standard Time' => 'Etc/GMT-11',
100
+ 'New Zealand Standard Time' => 'Pacific/Auckland',
101
+ 'Arabian Standard Time' => 'Asia/Dubai',
102
+ 'Pakistan Standard Time' => 'Asia/Karachi',
103
+ 'Paraguay Standard Time' => 'America/Asuncion',
104
+ 'Pacific Standard Time' => 'America/Los_Angeles',
105
+ 'Russian Standard Time' => 'Europe/Moscow',
106
+ 'Samoa Standard Time' => 'Pacific/Pago_Pago',
107
+ 'UTC-02' => 'Etc/GMT+2',
108
+ 'Sri Lanka Standard Time' => 'Asia/Kolkata',
109
+ 'Syria Standard Time' => 'Asia/Damascus',
110
+ 'Taipei Standard Time' => 'Asia/Taipei',
111
+ 'Tonga Standard Time' => 'Pacific/Tongatapu',
112
+ 'Turkey Standard Time' => 'Asia/Istanbul',
113
+ 'Montevideo Standard Time' => 'America/Montevideo' }
114
+ end
115
+
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: et-orbi
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.1.1
4
+ version: 1.1.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - John Mettraux
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2018-05-04 00:00:00.000000000 Z
11
+ date: 2018-05-24 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: tzinfo
@@ -52,6 +52,7 @@ files:
52
52
  - README.md
53
53
  - et-orbi.gemspec
54
54
  - lib/et-orbi.rb
55
+ - lib/et-orbi/zone_aliases.rb
55
56
  - lib/et_orbi.rb
56
57
  - lib/etorbi.rb
57
58
  homepage: http://github.com/floraison/et-orbi