[前][次][番号順一覧][スレッド一覧]

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/

[前][次][番号順一覧][スレッド一覧]