yesod 1.4.2.1 → 1.4.3
raw patch · 3 files changed
+27/−99 lines, 3 filesdep ~yaml
Dependency ranges changed: yaml
Files
- ChangeLog.md +4/−0
- Yesod/Default/Config2.hs +21/−97
- yesod.cabal +2/−2
ChangeLog.md view
@@ -1,3 +1,7 @@+## 1.4.3++* Switch to `Data.Yaml.Config`+ ## 1.4.2 * Do not parse string environment variables into numbers/booleans [#1061](https://github.com/yesodweb/yesod/issues/1061)
Yesod/Default/Config2.hs view
@@ -2,40 +2,40 @@ {-# LANGUAGE OverloadedStrings #-} -- | Some next-gen helper functions for the scaffolding's configuration system. module Yesod.Default.Config2- ( MergedValue (..)- , applyCurrentEnv- , getCurrentEnv- , applyEnvValue- , loadAppSettings- , loadAppSettingsArgs- , configSettingsYml+ ( -- * Locally defined+ configSettingsYml , getDevSettings , develMainHelper , makeYesodLogger+ -- * Re-exports from Data.Yaml.Config+ , applyCurrentEnv+ , getCurrentEnv+ , applyEnvValue+ , loadYamlSettings+ , loadYamlSettingsArgs , EnvUsage , ignoreEnv , useEnv , requireEnv , useCustomEnv , requireCustomEnv+ -- * For backwards compatibility+ , MergedValue (..)+ , loadAppSettings+ , loadAppSettingsArgs ) where +import Data.Yaml.Config+ #if __GLASGOW_HASKELL__ < 710 import Control.Applicative ((<$>)) import Data.Monoid #endif import Data.Semigroup-import Data.List.NonEmpty (nonEmpty) import Data.Aeson import qualified Data.HashMap.Strict as H-import Data.Text (Text, pack)-import System.Environment (getEnvironment, getArgs)-import Control.Arrow ((***))-import Control.Monad (forM)-import Control.Exception (throwIO)-import Data.Text.Encoding (encodeUtf8)-import qualified Data.Yaml as Y+import System.Environment (getEnvironment) import Network.Wai (Application) import Network.Wai.Handler.Warp import Safe (readMay)@@ -46,7 +46,6 @@ import Network.Wai.Logger (clockDateCacher) import Yesod.Core.Types (Logger (Logger)) import System.Log.FastLogger (LoggerSet)-import qualified Data.Text as T #ifndef mingw32_HOST_OS import System.Posix.Signals (installHandler, sigINT, Handler(Catch))@@ -62,60 +61,6 @@ mergeValues (Object x) (Object y) = Object $ H.unionWith mergeValues x y mergeValues x _ = x -applyEnvValue :: Bool -- ^ require an environment variable to be present?- -> H.HashMap Text Text -> Value -> Value-applyEnvValue requireEnv' env =- goV- where- goV (Object o) = Object $ goV <$> o- goV (Array a) = Array (goV <$> a)- goV (String t1) = fromMaybe (String t1) $ do- t2 <- T.stripPrefix "_env:" t1- let (name, t3) = T.break (== ':') t2- mdef = fmap parseValue $ T.stripPrefix ":" t3- Just $ case H.lookup name env of- Just val ->- -- If the default value parses as a String, we treat the- -- environment variable as a raw value and do not parse it.- -- This means that things like numeric passwords just work.- -- However, for originally numerical or boolean values (e.g.,- -- port numbers), we still perform a normal YAML parse.- --- -- For details, see:- -- https://github.com/yesodweb/yesod/issues/1061- case mdef of- Just (String _) -> String val- _ -> parseValue val- Nothing ->- case mdef of- Just val | not requireEnv' -> val- _ -> Null- goV v = v-- parseValue val = fromMaybe (String val) $ Y.decode $ encodeUtf8 val--getCurrentEnv :: IO (H.HashMap Text Text)-getCurrentEnv = fmap (H.fromList . map (pack *** pack)) getEnvironment--applyCurrentEnv :: Bool -- ^ require an environment variable to be present?- -> Value -> IO Value-applyCurrentEnv requireEnv' orig = flip (applyEnvValue requireEnv') orig <$> getCurrentEnv--data EnvUsage = IgnoreEnv- | UseEnv- | RequireEnv- | UseCustomEnv (H.HashMap Text Text)- | RequireCustomEnv (H.HashMap Text Text)--ignoreEnv, useEnv, requireEnv :: EnvUsage-ignoreEnv = IgnoreEnv-useEnv = UseEnv-requireEnv = RequireEnv--useCustomEnv, requireCustomEnv :: H.HashMap Text Text -> EnvUsage-useCustomEnv = UseCustomEnv-requireCustomEnv = RequireCustomEnv- -- | Load the settings from the following three sources: -- -- * Run time config files@@ -129,30 +74,8 @@ -> [Value] -- ^ any other values to use, usually from compile time config. overridden by files -> EnvUsage -> IO settings-loadAppSettings runTimeFiles compileValues envUsage = do- runValues <- forM runTimeFiles $ \fp -> do- eres <- Y.decodeFileEither fp- case eres of- Left e -> do- putStrLn $ "loadAppSettings: Could not parse file as YAML: " ++ fp- throwIO e- Right value -> return value-- value' <-- case nonEmpty $ map MergedValue $ runValues ++ compileValues of- Nothing -> error "loadAppSettings: No configuration provided"- Just ne -> return $ getMergedValue $ sconcat ne- value <-- case envUsage of- IgnoreEnv -> return $ applyEnvValue False mempty value'- UseEnv -> applyCurrentEnv False value'- RequireEnv -> applyCurrentEnv True value'- UseCustomEnv env -> return $ applyEnvValue False env value'- RequireCustomEnv env -> return $ applyEnvValue True env value'-- case fromJSON value of- Error s -> error $ "Could not convert to AppSettings: " ++ s- Success settings -> return settings+loadAppSettings = loadYamlSettings+{-# DEPRECATED loadAppSettings "Use loadYamlSettings" #-} -- | Same as @loadAppSettings@, but get the list of runtime config files from -- the command line arguments.@@ -161,9 +84,8 @@ => [Value] -- ^ any other values to use, usually from compile time config. overridden by files -> EnvUsage -- ^ use environment variables -> IO settings-loadAppSettingsArgs values env = do- args <- getArgs- loadAppSettings args values env+loadAppSettingsArgs = loadYamlSettingsArgs+{-# DEPRECATED loadAppSettingsArgs "Use loadYamlSettingsArgs" #-} -- | Location of the default config file. configSettingsYml :: FilePath@@ -200,6 +122,8 @@ terminateDevel :: IO () terminateDevel = exitSuccess +-- | Create a 'Logger' value (from yesod-core) out of a 'LoggerSet' (from+-- fast-logger). makeYesodLogger :: LoggerSet -> IO Logger makeYesodLogger loggerSet' = do (getter, _) <- clockDateCacher
yesod.cabal view
@@ -1,5 +1,5 @@ name: yesod-version: 1.4.2.1+version: 1.4.3 license: MIT license-file: LICENSE author: Michael Snoyman <michael@snoyman.com>@@ -33,7 +33,7 @@ , safe , data-default , unordered-containers- , yaml+ , yaml >= 0.8.17 , text , directory , template-haskell