airbrake 0.1.0.0 → 0.2.0.0
raw patch · 3 files changed
+88/−3 lines, 3 filesdep +directorydep +filepathPVP ok
version bump matches the API change (PVP)
Dependencies added: directory, filepath
API changes (from Hackage documentation)
+ Airbrake.Credentials: credentialsDefaultFile :: MonadIO m => m FilePath
+ Airbrake.Credentials: credentialsDefaultKey :: String
+ Airbrake.Credentials: loadCredentialsDefault :: MonadIO m => m (Maybe APIKey)
+ Airbrake.Credentials: loadCredentialsFromEnv :: MonadIO m => m (Maybe APIKey)
+ Airbrake.Credentials: loadCredentialsFromEnvOrFile :: MonadIO m => FilePath -> String -> m (Maybe APIKey)
+ Airbrake.Credentials: loadCredentialsFromFile :: MonadIO m => FilePath -> String -> m (Maybe APIKey)
+ Airbrake.Credentials: type APIKey = String
Files
- airbrake.cabal +4/−2
- src/Airbrake.hs +5/−1
- src/Airbrake/Credentials.hs +79/−0
airbrake.cabal view
@@ -1,5 +1,5 @@ name: airbrake-version: 0.1.0.0+version: 0.2.0.0 synopsis: An Airbrake notifier for Haskell description: Airbrake notifier. homepage: https://github.com/joelteon/airbrake@@ -12,12 +12,14 @@ cabal-version: >=1.10 library- exposed-modules: Airbrake, Airbrake.WebRequest+ exposed-modules: Airbrake, Airbrake.WebRequest, Airbrake.Credentials other-modules: Paths_airbrake build-depends: base == 4.* , blaze-markup , bytestring+ , directory , exceptions+ , filepath , http-conduit , monad-control , network
src/Airbrake.hs view
@@ -31,9 +31,13 @@ APIKey, Environment, airbrakeConf, defaultApiEndpoint, AirbrakeConf (..),- Server (..)+ Server (..),++ -- * Convenience exports+ module Airbrake.Credentials ) where +import Airbrake.Credentials hiding (APIKey) import qualified Airbrake.WebRequest as W import Control.Exception import Control.Monad.Catch
+ src/Airbrake/Credentials.hs view
@@ -0,0 +1,79 @@+-- | Utilities for loading the API key from the environment.+module Airbrake.Credentials (+ APIKey,+ credentialsDefaultFile, credentialsDefaultKey,+ loadCredentialsFromFile, loadCredentialsFromEnv,+ loadCredentialsFromEnvOrFile, loadCredentialsDefault+) where++import Control.Monad (liftM)+import Control.Monad.IO.Class+import Data.Functor+import Data.List (find)+import System.Directory+import System.Environment+import System.FilePath++type APIKey = String++-- | The file where API credentials are loaded when using+-- 'loadCredentialsDefault'.+--+-- Default: @$HOME/.airbrake-keys@+credentialsDefaultFile :: MonadIO m => m FilePath+credentialsDefaultFile = liftIO $ liftM (</> ".airbrake-keys") getHomeDirectory++-- | The key to be used in the loaded API credentials file, when using+-- 'loadCredentialsDefault'.+--+-- Default: @default@+credentialsDefaultKey :: String+credentialsDefaultKey = "default"++-- | Load API credentials from a text file given a key name.+--+-- The file should consist of newline-separated credentials in the+-- following format:+--+-- @keyName apiKey@+loadCredentialsFromFile :: MonadIO m => FilePath -> String -> m (Maybe APIKey)+loadCredentialsFromFile file key = liftIO $ do+ contents <- map words . lines <$> readFile file+ return $ do+ [_k, apikey] <- find (hasKey key) contents+ return apikey+ where+ hasKey _ [] = False+ hasKey k (k2 : _) = k == k2++-- | Load API credentials from the environment if possible, or alternately+-- from the default file with the default key name.+--+-- Default file: @$HOME/.airbrake-keys@+--+-- Default key: @default@+--+-- See 'loadCredentialsFromEnv' and 'loadCredentialsFromFile'.+loadCredentialsDefault :: MonadIO m => m (Maybe APIKey)+loadCredentialsDefault = do+ file <- credentialsDefaultFile+ loadCredentialsFromEnvOrFile file credentialsDefaultKey++-- | Load API credentials from the environment variable @AIRBRAKE_API_KEY@.+loadCredentialsFromEnv :: MonadIO m => m (Maybe APIKey)+loadCredentialsFromEnv = liftIO $ do+ env <- getEnvironment+ let lk = flip lookup env+ key = lk "AIRBRAKE_API_KEY"+ return key++-- | Load API credentials from the environment, or, failing that, from the+-- given file with the given key name.+--+-- See 'loadCredentialsFromEnv' and 'loadCredentialsFromFile'.+loadCredentialsFromEnvOrFile :: MonadIO m => FilePath -> String -> m (Maybe APIKey)+loadCredentialsFromEnvOrFile file key = do+ envcr <- loadCredentialsFromEnv+ case envcr of+ Just cr -> return (Just cr)+ Nothing -> loadCredentialsFromFile file key