ruby-changes:57758
From: Nobuyoshi <ko1@a...>
Date: Sun, 15 Sep 2019 22:04:26 +0900 (JST)
Subject: [ruby-changes:57758] 751d4ab9c2 (master): Refine Timezone fixture
https://git.ruby-lang.org/ruby.git/commit/?id=751d4ab9c2 From 751d4ab9c2382d60868446cc69fdac0a9f6cdf4a Mon Sep 17 00:00:00 2001 From: Nobuyoshi Nakada <nobu@r...> Date: Sat, 27 Jul 2019 13:56:54 +0900 Subject: Refine Timezone fixture diff --git a/spec/ruby/core/time/at_spec.rb b/spec/ruby/core/time/at_spec.rb index 592b331..8434e8d 100644 --- a/spec/ruby/core/time/at_spec.rb +++ b/spec/ruby/core/time/at_spec.rb @@ -235,14 +235,14 @@ describe "Time.at" do https://github.com/ruby/ruby/blob/trunk/spec/ruby/core/time/at_spec.rb#L235 end it "could be a timezone object" do - zone = TimeSpecs::TimezoneWithName.new(name: "Asia/Colombo", offset: (5*3600+30*60)) + zone = TimeSpecs::TimezoneWithName.new(name: "Asia/Colombo") time = Time.at(@epoch_time, in: zone) time.utc_offset.should == 5*3600+30*60 time.zone.should == zone time.to_i.should == @epoch_time - zone = TimeSpecs::TimezoneWithName.new(name: "PST", offset: (-9*60*60)) + zone = TimeSpecs::TimezoneWithName.new(name: "PST") time = Time.at(@epoch_time, in: zone) time.utc_offset.should == -9*60*60 diff --git a/spec/ruby/core/time/fixtures/classes.rb b/spec/ruby/core/time/fixtures/classes.rb index a648171..1a9511b 100644 --- a/spec/ruby/core/time/fixtures/classes.rb +++ b/spec/ruby/core/time/fixtures/classes.rb @@ -55,31 +55,52 @@ module TimeSpecs https://github.com/ruby/ruby/blob/trunk/spec/ruby/core/time/fixtures/classes.rb#L55 end end - class TimezoneWithAbbr < Timezone + Z = Struct.new(:offset, :abbr) + Zone = Struct.new(:std, :dst, :dst_range) + Zones = { + "Asia/Colombo" => Zone[Z[5*3600+30*60, "MMT"], nil, nil], + "Europe/Kiev" => Zone[Z[2*3600, "EET"], Z[3*3600, "EEST"], 4..10], + "PST" => Zone[Z[(-9*60*60), "PST"], nil, nil], + } + + class TimezoneWithName < Timezone + attr_reader :name + def initialize(options) - super - @abbr = options[:abbr] + @name = options[:name] + @std, @dst, @dst_range = *Zones[@name] end - def abbr(time) - @abbr + def dst?(t) + @dst_range&.cover?(t.mon) end - end - class TimezoneWithName < Timezone - def initialize(options) - super - @name = options[:name] + def zone(t) + (dst?(t) ? @dst : @std) end - def name - @name + def utc_offset(t) + zone(t)&.offset || 0 + end + + def abbr(t) + zone(t)&.abbr + end + + def local_to_utc(t) + t - utc_offset(t) + end + + def utc_to_local(t) + t + utc_offset(t) end end class TimeWithFindTimezone < Time def self.find_timezone(name) - TimezoneWithName.new(name: name.to_s, offset: 5*3600+30*60) + TimezoneWithName.new(name: name.to_s) end end + + TimezoneWithAbbr = TimezoneWithName end diff --git a/spec/ruby/core/time/new_spec.rb b/spec/ruby/core/time/new_spec.rb index 84e97f8..dcdd83a 100644 --- a/spec/ruby/core/time/new_spec.rb +++ b/spec/ruby/core/time/new_spec.rb @@ -265,7 +265,7 @@ ruby_version_is "2.6" do https://github.com/ruby/ruby/blob/trunk/spec/ruby/core/time/new_spec.rb#L265 context "#name method" do it "uses the optional #name method for marshaling" do - zone = TimeSpecs::TimezoneWithName.new(name: "Asia/Colombo", offset: (5*3600+30*60)) + zone = TimeSpecs::TimezoneWithName.new(name: "Asia/Colombo") time = Time.new(2000, 1, 1, 12, 0, 0, zone) time_loaded = Marshal.load(Marshal.dump(time)) @@ -284,7 +284,7 @@ ruby_version_is "2.6" do https://github.com/ruby/ruby/blob/trunk/spec/ruby/core/time/new_spec.rb#L284 end it "the #abbr method is used by '%Z' in #strftime" do - zone = TimeSpecs::TimezoneWithAbbr.new(abbr: "MMT", offset: (5*3600+30*60)) + zone = TimeSpecs::TimezoneWithAbbr.new(name: "Asia/Colombo") time = Time.new(2000, 1, 1, 12, 0, 0, zone) time.strftime("%Z").should == "MMT" @@ -296,7 +296,7 @@ ruby_version_is "2.6" do https://github.com/ruby/ruby/blob/trunk/spec/ruby/core/time/new_spec.rb#L296 # the necessary methods mentioned above. context "subject's class implements .find_timezone method" do it "calls .find_timezone to build a time object at loading marshaled data" do - zone = TimeSpecs::TimezoneWithName.new(name: "Asia/Colombo", offset: (5*3600+30*60)) + zone = TimeSpecs::TimezoneWithName.new(name: "Asia/Colombo") time = TimeSpecs::TimeWithFindTimezone.new(2000, 1, 1, 12, 0, 0, zone) time_loaded = Marshal.load(Marshal.dump(time)) -- cgit v0.10.2 -- ML: ruby-changes@q... Info: http://www.atdot.net/~ko1/quickml/