packages feed

yam 0.5.14 → 0.5.15

raw patch · 9 files changed

+111/−141 lines, 9 filesdep ~http-typesdep ~salakdep ~swagger2PVP: major bump suggested

API removals or changes: PVP suggests a major version bump

Dependency ranges changed: http-types, salak, swagger2

API changes (from Hackage documentation)

- Yam.Logger: instance Data.Salak.Types.FromProperties Control.Monad.Logger.LogLevel
- Yam.Logger: instance Data.Salak.Types.FromProperties Yam.Logger.LogConfig
- Yam.Middleware.Client: instance Data.Salak.Types.FromProperties Yam.Middleware.Client.ClientConfig
- Yam.Middleware.Trace: instance Data.Salak.Types.FromProperties Yam.Middleware.Trace.TraceConfig
- Yam.Middleware.Trace: instance Data.Salak.Types.FromProperties Yam.Middleware.Trace.TraceNotifyType
- Yam.Swagger: instance Data.Default.Class.Default Yam.Swagger.SwaggerConfig
- Yam.Swagger: instance Data.Salak.Types.FromProperties Yam.Swagger.SwaggerConfig
+ Yam.Logger: instance Salak.Prop.FromEnumProp Control.Monad.Logger.LogLevel
+ Yam.Logger: instance Salak.Prop.FromProp Yam.Logger.LogConfig
+ Yam.Middleware.Client: instance Salak.Prop.FromProp Yam.Middleware.Client.ClientConfig
+ Yam.Middleware.Trace: instance Salak.Prop.FromEnumProp Yam.Middleware.Trace.TraceNotifyType
+ Yam.Middleware.Trace: instance Salak.Prop.FromProp Yam.Middleware.Trace.TraceConfig
+ Yam.Swagger: baseInfo :: Text -> Version -> Int -> Swagger -> Swagger
+ Yam.Swagger: instance Salak.Prop.FromProp Yam.Swagger.SwaggerConfig
- Yam.Internal: start :: forall api. (HasSwagger api, HasServer api '[Env]) => Properties -> Version -> [AppMiddleware] -> Proxy api -> ServerT api App -> IO ()
+ Yam.Internal: start :: forall api. (HasSwagger api, HasServer api '[Env]) => PropConfig -> Version -> [AppMiddleware] -> Proxy api -> ServerT api App -> IO ()
- Yam.Swagger: serveWithContextAndSwagger :: (HasSwagger api, HasServer api context) => SwaggerConfig -> AppConfig -> Version -> Proxy api -> Context context -> ServerT api Handler -> Application
+ Yam.Swagger: serveWithContextAndSwagger :: forall api context. (HasSwagger api, HasServer api context) => SwaggerConfig -> (Swagger -> Swagger) -> Proxy api -> Context context -> ServerT api Handler -> Application

Files

src/Yam/Internal.hs view
@@ -6,7 +6,7 @@   , start   ) where -import           Data.Salak+import           Salak import qualified Data.Vault.Lazy          as L import           Network.Wai.Handler.Warp import           Servant@@ -28,53 +28,45 @@   -> Proxy api   -> ServerT api App   -> IO ()-startYam ac@AppConfig{..} sw@SwaggerConfig{..} logConfig enableDefaultMiddleware vs middlewares proxy server-  = withLogger name logConfig $ do-      logInfo $ "Start Service [" <> name <> "] ..."-      logger <- askLoggerIO-      let act = runAM $ foldr1 (<>) ((if enableDefaultMiddleware then defaultMiddleware else []) <> middlewares)-      act (putLogger logger $ Env L.empty Nothing ac) $ \(env, middleware) -> do-        let cxt                  = env :. EmptyContext-            pCxt                 = Proxy :: Proxy '[Env]-            portText             = showText port-            proxy'               = Proxy :: Proxy (Vault :> api)-            server'              = runRequest proxy pCxt server-            settings             = defaultSettings-                                 & setPort port-                                 & setOnException (\_ _ -> return ())-                                 & setOnExceptionResponse whenException-                                 & setSlowlorisSize slowlorisSize-        when enabled $-          logInfo $ "Swagger enabled: http://localhost:" <> portText <> "/" <> pack urlDir-        logInfo $ "Servant started on port(s): " <> portText-        lift $ runSettings settings-          $ middleware-          $ serveWithContextAndSwagger sw ac vs proxy' cxt-          $ hoistServerWithContext proxy' pCxt (transApp env) server'--runRequest :: (HasServer api context) => Proxy api -> Proxy context -> ServerT api App -> Vault -> ServerT api App-runRequest p pc a v = hoistServerWithContext p pc go a-  where-    {-# INLINE go #-}-    go :: App a -> App a-    go = local (\env -> env { reqAttributes = Just v})+startYam ac@AppConfig{..} sw@SwaggerConfig{..} logConfig enableDefaultMiddleware vs middlewares proxy server =+  withLogger name logConfig $ do+    logInfo $ "Start Service [" <> name <> "] ..."+    logger <- askLoggerIO+    let at = runAM $ foldr1 (<>) ((if enableDefaultMiddleware then defaultMiddleware else []) <> middlewares)+    at (putLogger logger $ Env L.empty Nothing ac) $ \(env, middleware) -> do+      let cxt      = env :. EmptyContext+          pCxt     = Proxy @'[Env]+          portText = showText port+          settings = defaultSettings+                   & setPort port+                   & setOnException (\_ _ -> return ())+                   & setOnExceptionResponse whenException+                   & setSlowlorisSize slowlorisSize+      when enabled $+        logInfo    $ "Swagger enabled: http://localhost:" <> portText <> "/" <> pack urlDir+      logInfo      $ "Servant started on port(s): "       <> portText+      lift+        $ runSettings settings+        $ middleware+        $ serveWithContextAndSwagger sw (baseInfo name vs port) (Proxy @(Vault :> api)) cxt+        $ \v -> hoistServerWithContext proxy pCxt (transApp v env) server -transApp :: Env -> App a -> Handler a-transApp b c = liftIO $ runApp b c+transApp :: Vault -> Env -> App a -> Handler a+transApp v b = liftIO . runApp b . local (\env -> env { reqAttributes = Just v})  start   :: forall api. (HasSwagger api, HasServer api '[Env])-  => Properties+  => PropConfig   -> Version   -> [AppMiddleware]   -> Proxy api   -> ServerT api App   -> IO ()-start p a b c d = do-  (lc,_) <- runLoader p $ (,) <$> load "yam.logging" <*> askSetProperties-  startYam-    (p .>> "yam.application")-    (p .>> "yam.swagger"    )-    lc-    (p .?> "yam.middleware.default.enabled" .|= True)-    a b c d+start p a b c d = defaultLoadSalak p $ do+  al <- require "yam.application"+  sw <- require "yam.swagger"+  md <- require "yam.middleware.default.enabled" .?= True+  reloadable $ do+    lc <- requireD "yam.logging"+    liftIO $ startYam al sw lc md a b c d+
src/Yam/Logger.hs view
@@ -10,25 +10,19 @@   , LogConfig(..)   ) where -import           Data.Salak-import qualified Data.Text             as T+import           Salak import qualified Data.Vault.Lazy       as L import           System.IO.Unsafe      (unsafePerformIO) import           System.Log.FastLogger import           Yam.Types.Env import           Yam.Types.Prelude -instance FromProperties LogLevel where-  fromProperties = fromProperties >=> go-    where-      go :: Property -> Return LogLevel-      go (PStr t) = return (gt $ T.toLower t)-      go _        = error "loglevel shoudbe string"-      gt "debug" = LevelDebug-      gt "info"  = LevelInfo-      gt "warn"  = LevelWarn-      gt "error" = LevelError-      gt _       = LevelOther "fatal"+instance FromEnumProp LogLevel where+  fromEnumProp "debug" = Right   LevelDebug+  fromEnumProp "info"  = Right   LevelInfo+  fromEnumProp "warn"  = Right   LevelWarn+  fromEnumProp "error" = Right   LevelError+  fromEnumProp _       = Right $ LevelOther "fatal"  {-# INLINE toStr #-} toStr :: LogLevel -> LogStr@@ -49,13 +43,13 @@ instance Default LogConfig where   def = LogConfig 4096 "" 10485760 256 LevelInfo -instance FromProperties LogConfig where-  fromProperties p = LogConfig-    <$> p .?> "buffer-size" .?= bufferSize    def-    <*> p .?> "file"        .?= file          def-    <*> p .?> "max-size"    .?= maxSize       def-    <*> p .?> "max-history" .?= rotateHistory def-    <*> p .?> "level"       .?= level         def+instance FromProp LogConfig where+  fromProp = LogConfig+    <$> "buffer-size" .?= bufferSize    def+    <*> "file"        .?= file          def+    <*> "max-size"    .?= maxSize       def+    <*> "max-history" .?= rotateHistory def+    <*> "level"       .?= level         def  newLogger :: Text -> IO LogConfig -> IO (LogFunc, IO ()) newLogger name lc = do
src/Yam/Middleware/Auth.hs view
@@ -1,4 +1,4 @@-{-# LANGUAGE CPP                  #-}+{-# LANGUAGE CPP #-} module Yam.Middleware.Auth(   -- * Auth Middleware     authAppMiddleware
src/Yam/Middleware/Client.hs view
@@ -7,9 +7,9 @@   , BaseUrl   ) where -import           Data.Salak import qualified Data.Vault.Lazy     as L import           Network.HTTP.Client+import           Salak import           Servant.Client import           System.IO.Unsafe    (unsafePerformIO) import           Yam.Middleware@@ -22,9 +22,8 @@ instance Default ClientConfig where   def = ClientConfig True -instance FromProperties ClientConfig where-  fromProperties p = ClientConfig-    <$> p .?> "enabled" .?= enabled def+instance FromProp ClientConfig where+  fromProp = ClientConfig <$> "enabled" .?= enabled def  {-# NOINLINE managerKey #-} managerKey :: L.Key Manager
src/Yam/Middleware/Trace.hs view
@@ -12,9 +12,9 @@  import qualified Data.HashMap.Lazy as HM import           Data.Opentracing-import           Data.Salak import qualified Data.Text         as T import qualified Data.Vault.Lazy   as L+import           Salak import           System.IO.Unsafe  (unsafePerformIO) import           Yam.Logger import           Yam.Middleware@@ -29,16 +29,13 @@   = NoTracer   deriving (Eq, Show) -instance FromProperties TraceNotifyType where-  fromProperties = fromProperties >=> go-    where-      go :: Property -> Return TraceNotifyType-      go _ = return NoTracer+instance FromEnumProp TraceNotifyType where+  fromEnumProp _ = Right NoTracer -instance FromProperties TraceConfig where-  fromProperties p = TraceConfig-    <$> p .?> "enabled" .?= enabled def-    <*> p .?> "type"    .?= method  def+instance FromProp TraceConfig where+  fromProp = TraceConfig+    <$> "enabled" .?= enabled def+    <*> "type"    .?= method  def  instance Default TraceConfig where   def = TraceConfig True NoTracer
src/Yam/Swagger.hs view
@@ -2,18 +2,16 @@ module Yam.Swagger(     SwaggerConfig(..)   , serveWithContextAndSwagger+  , baseInfo   ) where -import           Control.Lens       hiding (Context, Empty, allOf, (.=))+import           Control.Lens       hiding (Context) import           Data.Reflection-import           Data.Salak-import           Data.Swagger       hiding (name, port)-import qualified Data.Swagger       as S-import           GHC.TypeLits+import           Salak+import           Data.Swagger import           Servant import           Servant.Swagger import           Servant.Swagger.UI-import           Yam.Types.Env import           Yam.Types.Prelude  data SwaggerConfig = SwaggerConfig@@ -22,44 +20,34 @@   , enabled   :: Bool   } deriving (Eq, Show) -instance Default SwaggerConfig where-  def = SwaggerConfig "swagger-ui" "swagger-ui.json" True--instance FromProperties SwaggerConfig where-  fromProperties p = SwaggerConfig-    <$> p .?> "dir"     .?= urlDir    def-    <*> p .?> "schema"  .?= urlSchema def-    <*> p .?> "enabled" .?= enabled   def--type SAPI dir schema api = SwaggerSchemaUI dir schema :<|> api+instance FromProp SwaggerConfig where+  fromProp = SwaggerConfig+    <$> "dir"     .?= "swagger-ui" +    <*> "schema"  .?= "swagger-ui.json"+    <*> "enabled" .?= True  serveWithContextAndSwagger-  :: (HasSwagger api, HasServer api context)+  :: forall api context. (HasSwagger api, HasServer api context)   => SwaggerConfig-  -> AppConfig-  -> Version+  -> (Swagger -> Swagger)   -> Proxy api   -> Context context   -> ServerT api Handler   -> Application-serveWithContextAndSwagger SwaggerConfig{..} AppConfig{..} versions proxy cxt api =-    if enabled-      then reifySymbol urlDir $ \pd -> reifySymbol urlSchema $ \ps -> go (pd,ps) proxy cxt api-      else serveWithContext proxy cxt api+serveWithContextAndSwagger SwaggerConfig{..} g5 proxy cxt api =+  if enabled+    then reifySymbol urlDir $ \pd -> reifySymbol urlSchema $ \ps ->+         serveWithContext (go proxy pd ps) cxt (swaggerSchemaUIServer (g5 $ toSwagger proxy) :<|> api)+    else serveWithContext proxy cxt api   where-    go :: (HasSwagger api, HasServer api context, KnownSymbol d, KnownSymbol s)-        => (Proxy d, Proxy s)-        -> Proxy api-        -> Context context-        -> ServerT api Handler-        -> Application-    go pds p c api' = let p' = g2 pds in serveWithContext p' c (g3 p api' p')-    g2 :: (Proxy d, Proxy s) -> Proxy (SAPI d s api)-    g2 _ = Proxy-    g3 :: HasSwagger api => Proxy api -> Server api -> Proxy (SAPI d s api) -> Server (SAPI d s api)-    g3 p a _ = swaggerSchemaUIServer (g4 $ toSwagger p) :<|> a-    g4 s = s-      & info .~ (mempty-          & title   .~ (name <> " API Documents")-          & S.version .~ pack (showVersion versions))-      & host ?~ Host "localhost" (Just $ fromIntegral port)+    go :: forall dir schema. Proxy api -> Proxy dir -> Proxy schema -> Proxy (SwaggerSchemaUI dir schema :<|> api)+    go _ _ _ = Proxy++baseInfo :: Text -> Version -> Int -> Swagger -> Swagger+baseInfo n v p s = s+  & info . title   .~ n+  & info . version .~ showText v+  & host ?~ Host "localhost" (Just $ fromIntegral p)+++
src/Yam/Types/Env.hs view
@@ -7,7 +7,7 @@   , setAttr   ) where -import           Data.Salak+import           Salak import qualified Data.Vault.Lazy   as L import           Yam.Types.Prelude @@ -17,14 +17,14 @@   , slowlorisSize :: Int -- Bytes   } deriving (Eq, Show) -instance FromProperties AppConfig where-  fromProperties p = AppConfig-    <$> p .?> "name"           .?= name def-    <*> p .?> "port"           .?= port def-    <*> p .?> "slowloris-size" .?= slowlorisSize def- instance Default AppConfig where   def = AppConfig "application" 8888 2048++instance FromProp AppConfig where+  fromProp = AppConfig+    <$> "name"           .?= name def+    <*> "port"           .?= port def+    <*> "slowloris-size" .?= slowlorisSize def  data Env = Env   { attributes    :: Vault
src/Yam/Types/Prelude.hs view
@@ -40,33 +40,33 @@   ) where  import           Control.Applicative-import           Control.Exception                  hiding (Handler)+import           Control.Exception              hiding (Handler) import           Control.Monad import           Control.Monad.Except import           Control.Monad.IO.Unlift import           Control.Monad.Logger.CallStack import           Control.Monad.Reader import           Data.Aeson-import qualified Data.Binary                        as B-import           Data.ByteString                    (ByteString)-import qualified Data.ByteString.Base16.Lazy        as B16-import qualified Data.ByteString.Lazy               as L+import qualified Data.Binary                    as B+import           Data.ByteString                (ByteString)+import qualified Data.ByteString.Base16.Lazy    as B16+import qualified Data.ByteString.Lazy           as L import           Data.Default import           Data.Function import           Data.Maybe-import           Data.Monoid                        ((<>))+import           Data.Monoid                    ((<>)) import           Data.Proxy-import           Data.Text                          (Text, pack)-import           Data.Text.Encoding                 (decodeUtf8, encodeUtf8)-import           Data.Vault.Lazy                    (Key, Vault, newKey)-import qualified Data.Vector                        as V+import           Data.Text                      (Text, pack)+import           Data.Text.Encoding             (decodeUtf8, encodeUtf8)+import           Data.Vault.Lazy                (Key, Vault, newKey)+import qualified Data.Vector                    as V import           Data.Version import           Data.Word import           GHC.Stack import           Network.HTTP.Types import           Network.Wai import           Servant-import           System.IO.Unsafe                   (unsafePerformIO)+import           System.IO.Unsafe               (unsafePerformIO) import           System.Random.MWC #if MIN_VERSION_servant_server(0,16,0) import           Servant.Server.Internal.ServerError
yam.cabal view
@@ -1,6 +1,6 @@ cabal-version: 1.12 name: yam-version: 0.5.14+version: 0.5.15 license: BSD3 license-file: LICENSE copyright: (c) 2018 Daniel YU@@ -57,20 +57,20 @@         data-default >=0.7.1.1 && <0.8,         fast-logger >=2.4.13 && <2.5,         http-client >=0.5.14 && <0.7,-        http-types >=0.12.2 && <0.13,+        http-types >=0.12.3 && <0.13,         lens ==4.17.*,         menshen >=0.0.1 && <0.1,         monad-logger >=0.3.30 && <0.4,         mtl >=2.2.2 && <2.3,         mwc-random >=0.14.0.0 && <0.15,         reflection >=2.1.4 && <2.2,-        salak >=0.1.8 && <0.3,+        salak >=0.1.10 && <0.3,         scientific >=0.3.6.2 && <0.4,         servant-client >=0.15 && <0.17,         servant-server >=0.15 && <0.17,         servant-swagger >=1.1.7 && <1.2,         servant-swagger-ui >=0.3.2.3.19.3 && <0.4,-        swagger2 >=2.3.1 && <2.4,+        swagger2 >=2.3.1.1 && <2.4,         text >=1.2.3.1 && <1.3,         unliftio-core >=0.1.2.0 && <0.2,         unordered-containers >=0.2.9.0 && <0.3,@@ -126,20 +126,20 @@         fast-logger >=2.4.13 && <2.5,         hspec ==2.*,         http-client >=0.5.14 && <0.7,-        http-types >=0.12.2 && <0.13,+        http-types >=0.12.3 && <0.13,         lens ==4.17.*,         menshen >=0.0.1 && <0.1,         monad-logger >=0.3.30 && <0.4,         mtl >=2.2.2 && <2.3,         mwc-random >=0.14.0.0 && <0.15,         reflection >=2.1.4 && <2.2,-        salak >=0.1.8 && <0.3,+        salak >=0.1.10 && <0.3,         scientific >=0.3.6.2 && <0.4,         servant-client >=0.15 && <0.17,         servant-server >=0.15 && <0.17,         servant-swagger >=1.1.7 && <1.2,         servant-swagger-ui >=0.3.2.3.19.3 && <0.4,-        swagger2 >=2.3.1 && <2.4,+        swagger2 >=2.3.1.1 && <2.4,         text >=1.2.3.1 && <1.3,         unliftio-core >=0.1.2.0 && <0.2,         unordered-containers >=0.2.9.0 && <0.3,