packages feed

korea-holidays 0.1.0.2 → 0.1.0.3

raw patch · 7 files changed

+282/−96 lines, 7 filessetup-changedPVP: major bump suggested

API removals or changes: PVP suggests a major version bump

API changes (from Hackage documentation)

- Data.Holiday.Model: [lunar] :: Holiday -> Maybe Bool
- Data.Holiday.Model: Holiday :: Date -> String -> Maybe Bool -> Holiday
+ Data.Holiday.Model: Holiday :: Date -> String -> Holiday

Files

Setup.hs view
@@ -1,2 +1,2 @@-import Distribution.Simple+import           Distribution.Simple main = defaultMain
data/ko_holidays.yaml view
@@ -1,30 +1,18 @@ - name: "New Year's Day"   date: 1-1 -- name: "Korean New Year"-  date: 1-1-  lunar: true- - name: "March 1 Movement Day"   date: 3-1  - name: "Children's Day"   date: 5-5 -- name: "Buddha's Birthday"-  date: 4-8-  lunar: true- - name: "Memorial Day"   date: 6-6  - name: "National Liberation Day"   date: 8-15 -- name: "Chuseok"-  date: 8-15-  lunar: true- - name: "National Foundation Day"   date: 10-3 @@ -33,3 +21,192 @@  - name: "Christmas"   date: 12-25++- name: "Korean New Year"+  date: 2009-1-26++- name: "Korean New Year"+  date: 2010-2-14++- name: "Korean New Year"+  date: 2011-2-3++- name: "Korean New Year"+  date: 2012-1-23++- name: "Korean New Year"+  date: 2013-2-10++- name: "Korean New Year"+  date: 2014-1-31++- name: "Korean New Year"+  date: 2015-2-19++- name: "Korean New Year"+  date: 2016-2-8++- name: "Korean New Year"+  date: 2017-1-28++- name: "Korean New Year"+  date: 2018-2-16++- name: "Korean New Year"+  date: 2019-2-5++- name: "Korean New Year"+  date: 2020-1-25++- name: "Korean New Year"+  date: 2021-2-12++- name: "Korean New Year"+  date: 2022-2-1++- name: "Korean New Year"+  date: 2023-1-22++- name: "Korean New Year"+  date: 2024-2-10++- name: "Korean New Year"+  date: 2025-1-29++- name: "Korean New Year"+  date: 2026-2-17++- name: "Korean New Year"+  date: 2027-2-7++- name: "Korean New Year"+  date: 2028-1-27++- name: "Korean New Year"+  date: 2029-2-13++- name: "Buddha's Birthday"+  date: 2009-5-2++- name: "Buddha's Birthday"+  date: 2010-5-21++- name: "Buddha's Birthday"+  date: 2011-5-10++- name: "Buddha's Birthday"+  date: 2012-5-28++- name: "Buddha's Birthday"+  date: 2013-5-17++- name: "Buddha's Birthday"+  date: 2014-5-6++- name: "Buddha's Birthday"+  date: 2015-5-25++- name: "Buddha's Birthday"+  date: 2016-5-14++- name: "Buddha's Birthday"+  date: 2017-5-3++- name: "Buddha's Birthday"+  date: 2018-5-22++- name: "Buddha's Birthday"+  date: 2019-5-12++- name: "Buddha's Birthday"+  date: 2020-4-30++- name: "Buddha's Birthday"+  date: 2021-5-19++- name: "Buddha's Birthday"+  date: 2022-5-8++- name: "Buddha's Birthday"+  date: 2023-5-27++- name: "Buddha's Birthday"+  date: 2024-5-15++- name: "Buddha's Birthday"+  date: 2025-5-5++- name: "Buddha's Birthday"+  date: 2026-5-24++- name: "Buddha's Birthday"+  date: 2027-5-13++- name: "Buddha's Birthday"+  date: 2028-5-2++- name: "Buddha's Birthday"+  date: 2029-5-20++- name: "Chuseok"+  date: 2009-10-3++- name: "Chuseok"+  date: 2010-9-22++- name: "Chuseok"+  date: 2011-9-12++- name: "Chuseok"+  date: 2012-9-30++- name: "Chuseok"+  date: 2013-9-19++- name: "Chuseok"+  date: 2014-9-8++- name: "Chuseok"+  date: 2015-9-27++- name: "Chuseok"+  date: 2016-9-15++- name: "Chuseok"+  date: 2017-10-4++- name: "Chuseok"+  date: 2018-9-24++- name: "Chuseok"+  date: 2019-9-13++- name: "Chuseok"+  date: 2020-10-1++- name: "Chuseok"+  date: 2021-9-21++- name: "Chuseok"+  date: 2022-9-10++- name: "Chuseok"+  date: 2023-9-29++- name: "Chuseok"+  date: 2024-9-17++- name: "Chuseok"+  date: 2025-10-6++- name: "Chuseok"+  date: 2026-9-25++- name: "Chuseok"+  date: 2027-9-15++- name: "Chuseok"+  date: 2028-10-3++- name: "Chuseok"+  date: 2029-9-22
korea-holidays.cabal view
@@ -4,10 +4,10 @@ -- -- see: https://github.com/sol/hpack ----- hash: f801a997f4d1d6b8a9921d6b1d40602714658b584df43c2d9d7b078a87264249+-- hash: f38259eef1c2f67a41fc49b224e7408e8596a6f8568a509f9fc893bc7b39fdcb  name:           korea-holidays-version:        0.1.0.2+version:        0.1.0.3 synopsis:       Korea Holidays description:    Please see the README on GitHub at <https://github.com/kkweon/korea-holidays#readme> category:       Time
src/Data/Holiday/Korea.hs view
@@ -1,10 +1,8 @@-{-# LANGUAGE OverloadedStrings #-}- {-| Module      : Data.Holiday.Korea Description : The module contains Korea Holidays Copyright   : (c) Kyung Mo Kweon-License     : BSD+License     : MIT Maintainer  : kkweon@gmail.com Stability   : experimental Portability : POSIX@@ -13,22 +11,29 @@ -} module Data.Holiday.Korea where -import Data.Aeson.Types (FromJSON, (.:), parseJSON, withObject)-import Data.Holiday.Model (Date(..), Holiday(..))-import Data.Maybe (fromJust, listToMaybe)-import Util.Config (holidays)+import           Data.Aeson.Types               ( FromJSON+                                                , (.:)+                                                , parseJSON+                                                , withObject+                                                )+import           Data.Holiday.Model             ( Date(..)+                                                , Holiday(..)+                                                )+import           Data.Maybe                     ( fromJust+                                                , listToMaybe+                                                )+import           Util.Config                    ( holidays )  -- | 'getHoliday' returns Nothing if there is no Korean holiday.-getHoliday ::-     Integer -- ^ Year+getHoliday+  :: Integer -- ^ Year   -> Int -- ^ Month   -> Int -- ^ Day   -> Maybe Holiday getHoliday year month day = listToMaybe $ filter match holidays-  where-    match :: Holiday -> Bool-    match Holiday {date = YMD (y, m, d)}-      | y == year && m == month && d == day = True-    match Holiday {date = MD (m, d)}-      | m == month && d == day = True-    match _ = False+ where+  match :: Holiday -> Bool+  match Holiday { date = YMD (y, m, d) } | y == year && m == month && d == day =+    True+  match Holiday { date = MD (m, d) } | m == month && d == day = True+  match _ = False
src/Data/Holiday/Model.hs view
@@ -16,15 +16,22 @@ module Data.Holiday.Model   ( Date(..)   , Holiday(..)-  ) where+  )+where -import Control.Monad.Extra (liftMaybe)-import Data.Aeson.Types (FromJSON, (.:), (.:?), parseJSON, withObject, Parser)-import Data.List.Split (splitOn)-import Data.Maybe (fromMaybe)-import GHC.Generics (Generic)-import Text.Read (readMaybe)-import Language.Haskell.TH.Syntax (Lift)+import           Control.Monad.Extra            ( liftMaybe )+import           Data.Aeson.Types               ( FromJSON+                                                , Parser+                                                , (.:)+                                                , (.:?)+                                                , parseJSON+                                                , withObject+                                                )+import           Data.List.Split                ( splitOn )+import           Data.Maybe                     ( fromMaybe )+import           GHC.Generics                   ( Generic )+import           Language.Haskell.TH.Syntax     ( Lift )+import           Text.Read                      ( readMaybe )  data Date   = YMD (Integer, Int, Int) -- ^ (Year, Month, Day) Some Holiday has a different date every year@@ -35,57 +42,43 @@ data Holiday = Holiday   { date :: Date -- ^ Date of the holiday   , name :: String -- ^ Name of the holiday-  , lunar :: Maybe Bool -- ^ Date maybe Lunar Date   } deriving (Show, Eq, Generic, Lift)  instance FromJSON Holiday where-    parseJSON =-        withObject "Holiday" $ \v -> Holiday-            <$> parseDate v-            <*> v .: "name"-            <*> v .:? "lunar"-        where-            parseDate o = do-                s <- o .: "date"-                liftMaybe $ parseKoreanDate s--+  parseJSON =+    withObject "Holiday" $ \v -> Holiday <$> parseDate v <*> v .: "name"+    where+      parseDate o = do+        s <- o .: "date"+        liftMaybe $ parseKoreanDate s  parseKoreanDate :: String -> Maybe Date-parseKoreanDate xs =-  case splitOn "-" xs of-    [y, m, d]-      | verifyYmd y m d -> Just $ YMD (read y, read m, read d)-    [m, d]-      | verifyMd m d -> Just $ MD (read m, read d)-    _ -> Nothing+parseKoreanDate xs = case splitOn "-" xs of+  [y, m, d] | verifyYmd y m d -> Just $ YMD (read y, read m, read d)+  [m, d] | verifyMd m d       -> Just $ MD (read m, read d)+  _                           -> Nothing  verifyYmd :: String -> String -> String -> Bool-verifyYmd y m d =-  fromMaybe False $ do-    year <- readMaybe y :: Maybe Integer-    month <- readMaybe m :: Maybe Int-    day <- readMaybe d :: Maybe Int-    return $ isValidYear year && isValidMonth month && isValidDay day+verifyYmd y m d = fromMaybe False $ do+  year  <- readMaybe y :: Maybe Integer+  month <- readMaybe m :: Maybe Int+  day   <- readMaybe d :: Maybe Int+  return $ isValidYear year && isValidMonth month && isValidDay day  verifyMd :: String -> String -> Bool-verifyMd m d =-  fromMaybe False $ do-    month <- readMaybe m :: Maybe Int-    day <- readMaybe d :: Maybe Int-    return $ isValidMonth month && isValidDay day+verifyMd m d = fromMaybe False $ do+  month <- readMaybe m :: Maybe Int+  day   <- readMaybe d :: Maybe Int+  return $ isValidMonth month && isValidDay day  isValidYear :: Integer -> Bool-isValidYear y-  | 1900 <= y && y <= 3000 = True-  | otherwise = False+isValidYear y | 1900 <= y && y <= 3000 = True+              | otherwise              = False  isValidMonth :: Int -> Bool-isValidMonth m-  | 1 <= m && m <= 12 = True-  | otherwise = False+isValidMonth m | 1 <= m && m <= 12 = True+               | otherwise         = False  isValidDay :: Int -> Bool-isValidDay d-  | 1 <= d && d <= 31 = True-  | otherwise = False+isValidDay d | 1 <= d && d <= 31 = True+             | otherwise         = False
src/Util/Config.hs view
@@ -2,8 +2,8 @@  module Util.Config where -import Data.Yaml.TH (decodeFile)-import qualified Data.Holiday.Model as K+import           Data.Yaml.TH                   ( decodeFile )+import qualified Data.Holiday.Model            as K  holidays :: [K.Holiday] holidays = $$(decodeFile "data/ko_holidays.yaml")
test/Data/Holiday/KoreaSpec.hs view
@@ -1,20 +1,31 @@ module Data.Holiday.KoreaSpec where -import qualified Data.Holiday.Korea as Korea-import qualified Data.Holiday.Model as KM-import Data.Holiday.Model (date, lunar, name)-import Test.Hspec (Spec, describe, it, shouldBe)+import qualified Data.Holiday.Korea            as Korea+import qualified Data.Holiday.Model            as KM +import           Data.Holiday.Model             ( date+                                                , name+                                                )+import           Test.Hspec                     ( Spec+                                                , describe+                                                , it+                                                , shouldBe+                                                )+ spec :: Spec-spec =-  describe "Data.Holiday.Korea" $ do-    it "returns New Year's Day when 2000/1/1" $-      Korea.getHoliday 2000 1 1 `shouldBe`-      Just-        KM.Holiday-          {date = KM.MD (1, 1), name = "New Year's Day", lunar = Nothing}-    it "returns March 1 Movement Day when 2019/3/1" $-      Korea.getHoliday 2019 3 1 `shouldBe`-      Just-        KM.Holiday-          {date = KM.MD (3, 1), name = "March 1 Movement Day", lunar = Nothing}+spec = describe "Data.Holiday.Korea" $ do+  it "returns New Year's Day when 2000/1/1"+    $          Korea.getHoliday 2000 1 1+    `shouldBe` Just KM.Holiday {date = KM.MD (1, 1), name = "New Year's Day"}+  it "returns March 1 Movement Day when 2019/3/1"+    $          Korea.getHoliday 2019 3 1+    `shouldBe` Just KM.Holiday+                 { date = KM.MD (3, 1)+                 , name = "March 1 Movement Day"+                 }+  it "returns Chuseok when 2029/09/22"+    $          Korea.getHoliday 2029 9 22+    `shouldBe` Just KM.Holiday {date = KM.YMD (2029, 9, 22), name = "Chuseok"}+  it "returns Nothing when it's not a Holiday 2019/07/04"+    $          Korea.getHoliday 2019 7 4+    `shouldBe` Nothing