[commit: packages/time] master: fix format modifiers for YCGf (fc49f3e)

git at git.haskell.org git at git.haskell.org
Fri Jan 23 23:01:07 UTC 2015


Repository : ssh://git@git.haskell.org/time

On branch  : master
Link       : http://git.haskell.org/packages/time.git/commitdiff/fc49f3e92d7ce4474d16a282784da6686ed8a180

>---------------------------------------------------------------

commit fc49f3e92d7ce4474d16a282784da6686ed8a180
Author: Ashley Yakeley <ashley at semantic.org>
Date:   Sat Nov 24 18:23:58 2012 -0800

    fix format modifiers for YCGf
    
    Ignore-this: 6fb972e177214f11f807e125d5e69da3
    
    darcs-hash:20121125022358-ac6dd-901bbe054d6df17f3410480ba25140d6d0068879


>---------------------------------------------------------------

fc49f3e92d7ce4474d16a282784da6686ed8a180
 Data/Time/Calendar/Private.hs | 32 ++++++++++++++------------------
 Data/Time/Format.hs           |  8 ++++----
 Test/TestFormat.hs            | 21 +++++++++++++++++++--
 3 files changed, 37 insertions(+), 24 deletions(-)

diff --git a/Data/Time/Calendar/Private.hs b/Data/Time/Calendar/Private.hs
index 6afe648..f241dc3 100644
--- a/Data/Time/Calendar/Private.hs
+++ b/Data/Time/Calendar/Private.hs
@@ -9,33 +9,29 @@ pad1 :: NumericPadOption -> String -> String
 pad1 (Just c) s = c:s
 pad1 _ s = s
 
+padN :: Int -> Char -> String -> String
+padN i _ s | i <= 0 = s
+padN i c s = (replicate i c) ++ s
+
 show2Fixed :: NumericPadOption -> Pico -> String
 show2Fixed opt x | x < 10 = pad1 opt (showFixed True x)
 show2Fixed _ x = showFixed True x
 
+showPaddedMin :: (Num t,Ord t,Show t) => Int -> NumericPadOption -> t -> String
+showPaddedMin _ Nothing i = show i
+showPaddedMin pl opt i | i < 0 = '-':(showPaddedMin pl opt (negate i))
+showPaddedMin pl (Just c) i =
+  let s = show i in 
+    padN (pl - (length s)) c s
+
 show2 :: (Num t,Ord t,Show t) => NumericPadOption -> t -> String
-show2 opt i | i < 0 = '-':(show2 opt (negate i))
-show2 opt i = let
-	s = show i in
-  case s of
-	[_] -> pad1 opt s
-	_ -> s
+show2 = showPaddedMin 2
 
 show3 :: (Num t,Ord t,Show t) => NumericPadOption -> t -> String
-show3 opt i | i < 0 = '-':(show3 opt (negate i))
-show3 opt i = let
-	s = show2 opt i in
-  case s of
-	[_,_] -> pad1 opt s
-	_ -> s
+show3 = showPaddedMin 3
 
 show4 :: (Num t,Ord t,Show t) => NumericPadOption -> t -> String
-show4 opt i | i < 0 = '-':(show4 opt (negate i))
-show4 opt i = let
-	s = show3 opt i in
-  case s of
-	[_,_,_] -> pad1 opt s
-	_ -> s
+show4 = showPaddedMin 4
 
 mod100 :: (Integral i) => i -> i
 mod100 x = mod x 100
diff --git a/Data/Time/Format.hs b/Data/Time/Format.hs
index 926004b..f332f97 100644
--- a/Data/Time/Format.hs
+++ b/Data/Time/Format.hs
@@ -211,9 +211,9 @@ instance FormatTime Day where
 	formatCharacter 'x' = Just (\locale _ -> formatTime locale (dateFmt locale))
 
 	-- Year Count
-	formatCharacter 'Y' = Just (\_ _ -> show . fst . toOrdinalDate)
+	formatCharacter 'Y' = Just (\_ opt -> (show4 (fromMaybe Nothing opt)) . fst . toOrdinalDate)
 	formatCharacter 'y' = Just (\_ opt -> (show2 (fromMaybe (Just '0') opt)) . mod100 . fst . toOrdinalDate)
-	formatCharacter 'C' = Just (\_ _ -> show . div100 . fst . toOrdinalDate)
+	formatCharacter 'C' = Just (\_ opt -> (show2 (fromMaybe Nothing opt)) . div100 . fst . toOrdinalDate)
 	-- Month of Year
 	formatCharacter 'B' = Just (\locale _ -> fst . (\(_,m,_) -> (months locale) !! (m - 1)) . toGregorian)
 	formatCharacter 'b' = Just (\locale _ -> snd . (\(_,m,_) -> (months locale) !! (m - 1)) . toGregorian)
@@ -226,9 +226,9 @@ instance FormatTime Day where
 	formatCharacter 'j' = Just (\_ opt -> (show3 (fromMaybe (Just '0') opt)) . snd . toOrdinalDate)
 
 	-- ISO 8601 Week Date
-	formatCharacter 'G' = Just (\_ _ -> show . (\(y,_,_) -> y) . toWeekDate)
+	formatCharacter 'G' = Just (\_ opt -> (show4 (fromMaybe Nothing opt)) . (\(y,_,_) -> y) . toWeekDate)
 	formatCharacter 'g' = Just (\_ opt -> (show2 (fromMaybe (Just '0') opt)) . mod100 . (\(y,_,_) -> y) . toWeekDate)
-	formatCharacter 'f' = Just (\_ opt -> (show2 (fromMaybe (Just '0') opt)) . div100 . (\(y,_,_) -> y) . toWeekDate)
+	formatCharacter 'f' = Just (\_ opt -> (show2 (fromMaybe Nothing opt)) . div100 . (\(y,_,_) -> y) . toWeekDate)
 
 	formatCharacter 'V' = Just (\_ opt -> (show2 (fromMaybe (Just '0') opt)) . (\(_,w,_) -> w) . toWeekDate)
 	formatCharacter 'u' = Just (\_ _ -> show . (\(_,_,d) -> d) . toWeekDate)
diff --git a/Test/TestFormat.hs b/Test/TestFormat.hs
index c063847..fe5f375 100644
--- a/Test/TestFormat.hs
+++ b/Test/TestFormat.hs
@@ -70,17 +70,34 @@ times :: [UTCTime]
 times = [baseTime0] ++ (fmap getDay [0..23]) ++ (fmap getDay [0..100]) ++
 	(fmap getYearP1 years) ++ (fmap getYearP2 years) ++ (fmap getYearP3 years) ++ (fmap getYearP4 years)
 
+padN :: Int -> Char -> String -> String
+padN n _ s | n <= (length s) = s
+padN n c s = (replicate (n - length s) c) ++ s
+
+unixWorkarounds :: String -> String -> String
+unixWorkarounds "%_Y" s = padN 4 ' ' s
+unixWorkarounds "%0Y" s = padN 4 '0' s
+unixWorkarounds "%_C" s = padN 2 ' ' s
+unixWorkarounds "%0C" s = padN 2 '0' s
+unixWorkarounds "%_G" s = padN 4 ' ' s
+unixWorkarounds "%0G" s = padN 4 '0' s
+unixWorkarounds "%_f" s = padN 2 ' ' s
+unixWorkarounds "%0f" s = padN 2 '0' s
+unixWorkarounds _ s = s
+
 compareFormat :: String -> (String -> String) -> String -> TimeZone -> UTCTime -> Test
 compareFormat testname modUnix fmt zone time = let
     ctime = utcToZonedTime zone time 
     haskellText = formatTime locale fmt ctime
     in ioTest (testname ++ ": " ++ (show fmt) ++ " of " ++ (show ctime)) $
     do
-       unixText <- fmap modUnix (unixFormatTime fmt zone time)
-       return $ diff unixText haskellText
+       unixText <- unixFormatTime fmt zone time
+       let expectedText = unixWorkarounds fmt (modUnix unixText)
+       return $ diff expectedText haskellText
 
 -- as found in http://www.opengroup.org/onlinepubs/007908799/xsh/strftime.html
 -- plus FgGklz
+-- f not supported
 -- P not always supported
 -- s time-zone dependent
 chars :: [Char]



More information about the ghc-commits mailing list