rollbar-hs 0.3.0.1 → 0.3.1.0
raw patch · 5 files changed
+95/−64 lines, 5 filesdep −containersdep −lensdep −lens-aesondep ~networkdep ~unordered-containersPVP ok
version bump matches the API change (PVP)
Dependencies removed: containers, lens, lens-aeson
Dependency ranges changed: network, unordered-containers
API changes (from Hackage documentation)
Files
- CHANGELOG.md +5/−0
- rollbar-hs.cabal +4/−6
- test/Rollbar/Item/Data/Test.hs +18/−10
- test/Rollbar/Item/MissingHeaders/Test.hs +39/−30
- test/Rollbar/Item/Request/Test.hs +29/−18
CHANGELOG.md view
@@ -1,5 +1,10 @@ # Changelog +## 0.3.1.0++* [Drop some test dependencies](https://github.com/joneshf/rollbar-hs/pull/12)+* [Relax upper bound for `network` to 2.8](https://github.com/joneshf/rollbar-hs/pull/14)+ ## 0.3.0.1 * [Add a changelog](https://github.com/joneshf/rollbar-hs/pull/10)
rollbar-hs.cabal view
@@ -2,10 +2,10 @@ -- -- see: https://github.com/sol/hpack ----- hash: d9423057df8ea7fdf732a28499c2768d66c67e324872edffd9032e7e289ab9de+-- hash: ada36aef8292b669d79078e0bd25b6fdd183acfef29e34ca61e5493dd8b8958f name: rollbar-hs-version: 0.3.0.1+version: 0.3.1.0 synopsis: Core Rollbar data types and APIs. description: Provides a type-safe encoding of the Rollbar API. Also provides functions to communicate with the Rollbar API.@@ -57,7 +57,7 @@ , http-client >=0.5 && <0.6 , http-conduit >=2.2 && <2.4 , http-types >=0.9 && <0.13- , network >=2.6 && <2.7+ , network >=2.6 && <2.8 , text >=1.2 && <1.3 , time >=1.6 && <1.9 , unordered-containers >=0.2 && <0.3@@ -82,11 +82,9 @@ , base >=4.9 , bytestring >=0.10 , case-insensitive >=1.2- , containers >=0.5 , hspec >=2.4 , hspec-golden-aeson >=0.2- , lens >=4.15- , lens-aeson >=1.0 , rollbar-hs , text >=1.2+ , unordered-containers >=0.2 default-language: Haskell2010
test/Rollbar/Item/Data/Test.hs view
@@ -1,17 +1,18 @@-{-# LANGUAGE DataKinds #-}+{-# LANGUAGE DataKinds #-}+{-# LANGUAGE LambdaCase #-} {-# LANGUAGE OverloadedStrings #-} module Rollbar.Item.Data.Test where -import Control.Lens ((^@..))+import Data.Aeson (Value (Null, Object), decode', encode,+ toJSON)+import Data.Text (Text) -import Data.Aeson (encode, toJSON)-import Data.Aeson.Lens (key, members)-import Data.Text (Text)+import Rollbar.Item+import Rollbar.QuickCheck () -import Rollbar.Item-import Rollbar.QuickCheck ()+import Test.QuickCheck (conjoin, quickCheck) -import Test.QuickCheck (conjoin, quickCheck)+import qualified Data.HashMap.Strict props :: IO () props =@@ -24,13 +25,20 @@ prop_valueDataBodyHasRequiredKey x = length ms == 1 && fst (head ms) `elem` requiredBodyKeys where- ms = toJSON x ^@.. key "body" . members+ ms = key "body" (toJSON x) prop_encodingDataBodyHasRequiredKey :: Data () '["Authorization"] -> Bool prop_encodingDataBodyHasRequiredKey x = length ms == 1 && fst (head ms) `elem` requiredBodyKeys where- ms = encode x ^@.. key "body" . members+ ms = foldMap (key "body") (decode' $ encode x) requiredBodyKeys :: [Text] requiredBodyKeys = ["trace", "trace_chain", "message", "crash_report"]++key :: Text -> Value -> [(Text, Value)]+key k = \case+ Object o -> case Data.HashMap.Strict.lookupDefault Null k o of+ Object o -> Data.HashMap.Strict.toList o+ _ -> mempty+ _ -> mempty
test/Rollbar/Item/MissingHeaders/Test.hs view
@@ -1,23 +1,25 @@-{-# LANGUAGE DataKinds #-}-{-# LANGUAGE FlexibleContexts #-}+{-# LANGUAGE DataKinds #-}+{-# LANGUAGE FlexibleContexts #-} {-# LANGUAGE FlexibleInstances #-}+{-# LANGUAGE LambdaCase #-} {-# LANGUAGE OverloadedStrings #-}-{-# LANGUAGE TypeOperators #-}+{-# LANGUAGE TypeOperators #-} module Rollbar.Item.MissingHeaders.Test where -import Control.Lens ((&), (^@..))--import Data.Aeson (encode, toJSON)-import Data.Aeson.Lens (members)+import Data.Aeson (Value (Object), decode', encode,+ toJSON)+import Data.Functor (void)+import Data.HashSet (HashSet)+import Data.Text (Text) -import Prelude hiding (error)+import Prelude hiding (error) -import Rollbar.Item.MissingHeaders (MissingHeaders(..))-import Rollbar.QuickCheck ()+import Rollbar.Item.MissingHeaders (MissingHeaders (..))+import Rollbar.QuickCheck () -import Test.QuickCheck (conjoin, quickCheck)+import Test.QuickCheck (conjoin, quickCheck) -import Data.Set as S+import qualified Data.HashSet props :: IO () props = do@@ -38,48 +40,55 @@ prop_valueAuthorizationIsRemoved :: MissingHeaders '["Authorization"] -> Bool prop_valueAuthorizationIsRemoved hs =- "Authorization" `S.notMember` actual+ "Authorization" `notMember` actual where- actual = toJSON hs ^@.. members & fmap fst & S.fromList+ actual = keys (toJSON hs) prop_encodingAuthorizationIsRemoved :: MissingHeaders '["Authorization"] -> Bool prop_encodingAuthorizationIsRemoved hs =- "Authorization" `S.notMember` actual+ "Authorization" `notMember` actual where- actual = encode hs ^@.. members & fmap fst & S.fromList+ actual = foldMap keys (decode' $ encode hs) prop_valueX_AccessTokenIsRemoved :: MissingHeaders '["X-AccessToken"] -> Bool prop_valueX_AccessTokenIsRemoved hs =- "X-AccessToken" `S.notMember` actual+ "X-AccessToken" `notMember` actual where- actual = toJSON hs ^@.. members & fmap fst & S.fromList+ actual = keys (toJSON hs) prop_encodingX_AccessTokenIsRemoved :: MissingHeaders '["X-AccessToken"] -> Bool prop_encodingX_AccessTokenIsRemoved hs =- "X-AccessToken" `S.notMember` actual+ "X-AccessToken" `notMember` actual where- actual = encode hs ^@.. members & fmap fst & S.fromList+ actual = foldMap keys (decode' $ encode hs) prop_valueAllHeadersAreRemoved :: MissingHeaders '["Authorization", "this is made up", "Server", "X-AccessToken"] -> Bool prop_valueAllHeadersAreRemoved hs =- "Authorization" `S.notMember` actual- && "this is made up" `S.notMember` actual- && "Server" `S.notMember` actual- && "X-AccessToken" `S.notMember` actual+ "Authorization" `notMember` actual+ && "this is made up" `notMember` actual+ && "Server" `notMember` actual+ && "X-AccessToken" `notMember` actual where- actual = toJSON hs ^@.. members & fmap fst & S.fromList+ actual = keys (toJSON hs) prop_encodingAllHeadersAreRemoved :: MissingHeaders '["Authorization", "this is made up", "Server", "X-AccessToken"] -> Bool prop_encodingAllHeadersAreRemoved hs =- "Authorization" `S.notMember` actual- && "this is made up" `S.notMember` actual- && "Server" `S.notMember` actual- && "X-AccessToken" `S.notMember` actual+ "Authorization" `notMember` actual+ && "this is made up" `notMember` actual+ && "Server" `notMember` actual+ && "X-AccessToken" `notMember` actual where- actual = encode hs ^@.. members & fmap fst & S.fromList+ actual = foldMap keys (decode' $ encode hs)++keys :: Value -> HashSet Text+keys = \case+ Object o -> Data.HashSet.fromMap (void o)+ _ -> mempty++notMember x = not . Data.HashSet.member x
test/Rollbar/Item/Request/Test.hs view
@@ -1,24 +1,27 @@-{-# LANGUAGE DataKinds #-}+{-# LANGUAGE DataKinds #-} {-# LANGUAGE FlexibleInstances #-}+{-# LANGUAGE LambdaCase #-} {-# LANGUAGE OverloadedStrings #-}-{-# LANGUAGE TypeOperators #-}+{-# LANGUAGE TypeOperators #-} module Rollbar.Item.Request.Test where -import Control.Lens ((&), (^@..))+import Data.Aeson (Value (Object), decode', encode, toJSON)+import Data.CaseInsensitive (original)+import Data.Foldable (fold)+import Data.Functor (void)+import Data.HashSet (HashSet)+import Data.Text (Text) -import Data.Aeson (encode, toJSON)-import Data.Aeson.Lens (members)-import Data.CaseInsensitive (original)+import Prelude hiding (error) -import Prelude hiding (error)+import Rollbar.Item.Request (MissingHeaders (..))+import Rollbar.QuickCheck () -import Rollbar.Item.Request (MissingHeaders(..))-import Rollbar.QuickCheck ()+import Test.QuickCheck (conjoin, quickCheck) -import Test.QuickCheck (conjoin, quickCheck)+import qualified Data.Text.Encoding as TE -import Data.Set as S-import Data.Text.Encoding as TE+import qualified Data.HashSet props :: IO () props =@@ -29,14 +32,22 @@ prop_valueHeadersArentWrapped :: MissingHeaders '["Authorization"] -> Bool prop_valueHeadersArentWrapped hs@(MissingHeaders rhs) =- actual `S.isSubsetOf` expected+ actual `isSubsetOf` expected where- actual = toJSON hs ^@.. members & fmap fst & S.fromList- expected = S.fromList $ either (const "") id . TE.decodeUtf8' . original . fst <$> rhs+ actual = keys (toJSON hs)+ expected = Data.HashSet.fromList $ fold . TE.decodeUtf8' . original . fst <$> rhs+ isSubsetOf x y = Data.HashSet.difference x y == mempty prop_encodingHeadersArentWrapped :: MissingHeaders '["Authorization"] -> Bool prop_encodingHeadersArentWrapped hs@(MissingHeaders rhs) =- actual `S.isSubsetOf` expected+ actual `isSubsetOf` expected where- actual = encode hs ^@.. members & fmap fst & S.fromList- expected = S.fromList $ either (const "") id . TE.decodeUtf8' . original . fst <$> rhs+ actual = foldMap keys (decode' $ encode hs)+ expected = Data.HashSet.fromList $ fold . TE.decodeUtf8' . original . fst <$> rhs+ isSubsetOf x y = Data.HashSet.difference x y == mempty++keys :: Value -> HashSet Text+keys = \case+ Object o -> Data.HashSet.fromMap (void o)+ _ -> mempty+