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 +1/−1
- data/ko_holidays.yaml +189/−12
- korea-holidays.cabal +2/−2
- src/Data/Holiday/Korea.hs +21/−16
- src/Data/Holiday/Model.hs +40/−47
- src/Util/Config.hs +2/−2
- test/Data/Holiday/KoreaSpec.hs +27/−16
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