optparse-generic 1.4.9 → 1.5.0
raw patch · 3 files changed
+104/−35 lines, 3 filesdep −system-filepathdep ~basedep ~optparse-applicative
Dependencies removed: system-filepath
Dependency ranges changed: base, optparse-applicative
Files
- CHANGELOG.md +5/−0
- optparse-generic.cabal +2/−3
- src/Options/Generic.hs +97/−32
CHANGELOG.md view
@@ -1,3 +1,8 @@+1.5.0++* BREAKING CHANGE: [Drop support for `system-filepath`](https://github.com/Gabriella439/optparse-generic/pull/106)+* [Add support for more `Data.Time` types](https://github.com/Gabriella439/optparse-generic/pull/102)+ 1.4.9 * [Add `Data` instance for `Unwrapped`](https://github.com/Gabriella439/optparse-generic/pull/100)
optparse-generic.cabal view
@@ -1,5 +1,5 @@ Name: optparse-generic-Version: 1.4.9+Version: 1.5.0 Cabal-Version: >=1.10 Build-Type: Simple License: BSD3@@ -24,8 +24,7 @@ Library Hs-Source-Dirs: src Build-Depends:- base >= 4.7 && < 5 ,- system-filepath >= 0.3.1 && < 0.5 ,+ base >= 4.8 && < 5 , text < 2.1 , transformers >= 0.2.0.0 && < 0.7 , transformers-compat >= 0.3 && < 0.8 ,
src/Options/Generic.hs view
@@ -338,29 +338,37 @@ import Data.Int (Int8, Int16, Int32, Int64) import Data.Maybe (listToMaybe) import Data.Monoid-import Data.List.NonEmpty (NonEmpty((:|)))+import Data.List.NonEmpty (NonEmpty) import Data.Proxy import Data.Text (Text)+import Data.Time.Format.ISO8601 (ISO8601) import Data.Tuple.Only (Only(..)) import Data.Typeable (Typeable) import Data.Void (Void) import Data.Word (Word8, Word16, Word32, Word64)-import Data.Foldable (foldMap)-import Filesystem.Path (FilePath) import GHC.Generics-import Prelude hiding (FilePath)+import Prelude import Options.Applicative (Parser, ReadM) +import Data.Time+ ( CalendarDiffDays+ , CalendarDiffTime+ , Day+ , LocalTime+ , TimeOfDay+ , TimeZone+ , UTCTime+ , ZonedTime+ )+ import qualified Data.Text import qualified Data.Text.Encoding import qualified Data.Text.Lazy import qualified Data.Text.Lazy.Encoding-import qualified Data.Time.Calendar-import qualified Data.Time.Format+import qualified Data.Time.Format.ISO8601 as ISO8601 import qualified Data.Typeable import qualified Data.ByteString import qualified Data.ByteString.Lazy-import qualified Filesystem.Path.CurrentOS as Filesystem import qualified Options.Applicative as Options import qualified Options.Applicative.Types as Options import qualified Options.Applicative.NonEmpty as Options.NonEmpty@@ -520,14 +528,14 @@ parseHelpfulString :: String -> Maybe Text -> Maybe Text -> Maybe Char -> Maybe String -> Parser String-parseHelpfulString metavar h m c d =+parseHelpfulString metavar_ h m c d = case m of Nothing -> do- let fs = Options.metavar metavar+ let fs = Options.metavar metavar_ <> foldMap (Options.help . Data.Text.unpack) h Options.argument Options.str fs Just name -> do- let fs = Options.metavar metavar+ let fs = Options.metavar metavar_ <> Options.long (Data.Text.unpack name) <> foldMap (Options.help . Data.Text.unpack) h <> foldMap Options.short c@@ -546,21 +554,54 @@ instance ParseField Data.ByteString.Lazy.ByteString where parseField h m c d = fmap Data.Text.Lazy.Encoding.encodeUtf8 (parseField h m c d) -instance ParseField FilePath where- parseField h m c d = Filesystem.decodeString <$> parseHelpfulString "FILEPATH" h m c d- readField = Options.str+readISO8601Field :: forall a . (ParseField a, ISO8601 a) => ReadM a+readISO8601Field = Options.eitherReader reader+ where+ reader string =+ case ISO8601.iso8601ParseM string of+ Nothing -> Left ("expected " <> metavar (Proxy :: Proxy a))+ Just t -> Right t -instance ParseField Data.Time.Calendar.Day where- metavar _ = "YYYY-MM-DD"- readField = Options.eitherReader- $ runReadS . Data.Time.Format.readSTime- False- Data.Time.Format.defaultTimeLocale- "%F"- where- runReadS [(day, "")] = Right day- runReadS _ = Left "expected YYYY-MM-DD"+instance ParseField CalendarDiffDays where+ metavar _ = "PyYmMdD" + readField = readISO8601Field++instance ParseField Day where+ metavar _ = "yyyy-mm-dd"++ readField = readISO8601Field++instance ParseField UTCTime where+ metavar _ = "yyyy-mm-ddThh:mm:ss[.sss]Z"++ readField = readISO8601Field++instance ParseField CalendarDiffTime where+ metavar _ = "PyYmMdDThHmMs[.sss]S"++ readField = readISO8601Field++instance ParseField TimeZone where+ metavar _ = "±hh:mm"++ readField = readISO8601Field++instance ParseField TimeOfDay where+ metavar _ = "hh:mm:ss[.sss]"++ readField = readISO8601Field++instance ParseField LocalTime where+ metavar _ = "yyyy-mm-ddThh:mm:ss[.sss]"++ readField = readISO8601Field++instance ParseField ZonedTime where+ metavar _ = "yyyy-mm-ddThh:mm:ss[.sss]±hh:mm"++ readField = readISO8601Field+ {-| A class for all types that can be parsed from zero or more arguments/options on the command line @@ -601,8 +642,14 @@ instance ParseFields Data.ByteString.Lazy.ByteString instance ParseFields Data.Text.Text instance ParseFields Data.Text.Lazy.Text-instance ParseFields FilePath-instance ParseFields Data.Time.Calendar.Day+instance ParseFields CalendarDiffDays+instance ParseFields Day+instance ParseFields UTCTime+instance ParseFields CalendarDiffTime+instance ParseFields TimeZone+instance ParseFields TimeOfDay+instance ParseFields LocalTime+instance ParseFields ZonedTime #if MIN_VERSION_base(4,8,0) instance ParseFields Natural@@ -664,7 +711,7 @@ > , bar :: Double <?> "Documentation for the bar flag" > } deriving (Generic, Show) -}-newtype (<?>) (field :: *) (help :: Symbol) = Helpful { unHelpful :: field } deriving (Generic, Show, Data)+newtype (<?>) field (help :: Symbol) = Helpful { unHelpful :: field } deriving (Generic, Show, Data) instance (ParseField a, KnownSymbol h) => ParseField (a <?> h) where parseField _ m c d = Helpful <$>@@ -685,7 +732,7 @@ > , bar :: Double <!> "0.5" > } deriving (Generic, Show) -}-newtype (<!>) (field :: *) (value :: Symbol) = DefValue { unDefValue :: field } deriving (Generic, Show, Data)+newtype (<!>) field (value :: Symbol) = DefValue { unDefValue :: field } deriving (Generic, Show, Data) instance (ParseField a, KnownSymbol d) => ParseField (a <!> d) where parseField h m c _ = DefValue <$> parseField h m c (Just (symbolVal (Proxy :: Proxy d)))@@ -705,7 +752,7 @@ > , bar :: Double <#> "b" > } deriving (Generic, Show) -}-newtype (<#>) (field :: *) (value :: Symbol) = ShortName { unShortName :: field } deriving (Generic, Show, Data)+newtype (<#>) field (value :: Symbol) = ShortName { unShortName :: field } deriving (Generic, Show, Data) instance (ParseField a, KnownSymbol c) => ParseField (a <#> c) where parseField h m _ d = ShortName <$> parseField h m (listToMaybe (symbolVal (Proxy :: Proxy c))) d@@ -805,16 +852,34 @@ instance ParseRecord All where parseRecord = fmap getOnly parseRecord -instance ParseRecord FilePath where- parseRecord = fmap getOnly parseRecord- instance ParseRecord Data.ByteString.ByteString where parseRecord = fmap getOnly parseRecord instance ParseRecord Data.ByteString.Lazy.ByteString where parseRecord = fmap getOnly parseRecord -instance ParseRecord Data.Time.Calendar.Day where+instance ParseRecord CalendarDiffDays where+ parseRecord = fmap getOnly parseRecord++instance ParseRecord Day where+ parseRecord = fmap getOnly parseRecord++instance ParseRecord UTCTime where+ parseRecord = fmap getOnly parseRecord++instance ParseRecord CalendarDiffTime where+ parseRecord = fmap getOnly parseRecord++instance ParseRecord TimeZone where+ parseRecord = fmap getOnly parseRecord++instance ParseRecord TimeOfDay where+ parseRecord = fmap getOnly parseRecord++instance ParseRecord LocalTime where+ parseRecord = fmap getOnly parseRecord++instance ParseRecord ZonedTime where parseRecord = fmap getOnly parseRecord instance ParseField a => ParseRecord (Maybe a) where