rollbar-hs 0.2.0.0 → 0.3.1.0
raw patch · 6 files changed
Files
- CHANGELOG.md +31/−0
- README.md +2/−0
- rollbar-hs.cabal +30/−30
- 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
@@ -0,0 +1,31 @@+# 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)++## 0.3.0.0++* [Bump `aeson` upper bound](https://github.com/joneshf/rollbar-hs/pull/3)++## 0.2.0.0++* [Fix the type of `Notifier` `name`](https://github.com/joneshf/rollbar-hs/commit/11a3a2463cf44735237d062f15a349d8bfa7ffce)++## 0.1.0.1++* [Add synopsis](https://github.com/joneshf/rollbar-hs/commit/272c5764a9657f55e00e31c43a3d583362d823d5)++## 0.1.0.0++* Extract core rollbar to its own package++ This is almost entirely copy-pasted from [`wai-middleware-rollbar` version 0.8.4](https://hackage.haskell.org/package/wai-middleware-rollbar-0.8.4).++ The intent is to make the core data types available for other packages.+ If this gets unweildy, move it right back.
README.md view
@@ -1,1 +1,3 @@ # rollbar-hs++[](https://circleci.com/gh/joneshf/rollbar-hs)
rollbar-hs.cabal view
@@ -1,12 +1,14 @@--- This file has been generated from package.yaml by hpack version 0.20.0.+-- This file has been generated from package.yaml by hpack version 0.28.2. -- -- see: https://github.com/sol/hpack ----- hash: eac54e2631e9bbfada016ff0f7e6f51024450be3752b9c2c3894efb49efbace6+-- hash: ada36aef8292b669d79078e0bd25b6fdd183acfef29e34ca61e5493dd8b8958f name: rollbar-hs-version: 0.2.0.0+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. category: Web homepage: https://github.com/joneshf/rollbar-hs#readme bug-reports: https://github.com/joneshf/rollbar-hs/issues@@ -17,8 +19,8 @@ license-file: LICENSE build-type: Simple cabal-version: >= 1.10- extra-source-files:+ CHANGELOG.md README.md source-repository head@@ -26,22 +28,6 @@ location: https://github.com/joneshf/rollbar-hs library- hs-source-dirs:- src- build-depends:- aeson >=1.0 && <1.3- , base >=4.9 && <5- , bytestring >=0.10 && <0.11- , case-insensitive >=1.2 && <1.3- , hostname >=1.0 && <1.1- , http-client >=0.5 && <0.6- , http-conduit >=2.2 && <2.4- , http-types >=0.9 && <0.13- , network >=2.6 && <2.7- , text >=1.2 && <1.3- , time >=1.6 && <1.9- , unordered-containers >=0.2 && <0.3- , uuid >=1.3 && <1.4 exposed-modules: Rollbar.AccessToken Rollbar.API@@ -60,11 +46,34 @@ Rollbar.Item.Server other-modules: Paths_rollbar_hs+ hs-source-dirs:+ src+ build-depends:+ aeson >=1.0 && <1.5+ , base >=4.9 && <5+ , bytestring >=0.10 && <0.11+ , case-insensitive >=1.2 && <1.3+ , hostname >=1.0 && <1.1+ , http-client >=0.5 && <0.6+ , http-conduit >=2.2 && <2.4+ , http-types >=0.9 && <0.13+ , network >=2.6 && <2.8+ , text >=1.2 && <1.3+ , time >=1.6 && <1.9+ , unordered-containers >=0.2 && <0.3+ , uuid >=1.3 && <1.4 default-language: Haskell2010 test-suite doc-test type: exitcode-stdio-1.0 main-is: Main.hs+ other-modules:+ Rollbar.Golden+ Rollbar.Item.Data.Test+ Rollbar.Item.MissingHeaders.Test+ Rollbar.Item.Request.Test+ Rollbar.QuickCheck+ Paths_rollbar_hs hs-source-dirs: test build-depends:@@ -73,18 +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- other-modules:- Rollbar.Golden- Rollbar.Item.Data.Test- Rollbar.Item.MissingHeaders.Test- Rollbar.Item.Request.Test- Rollbar.QuickCheck- Paths_rollbar_hs+ , 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+