fb 0.14.8 → 0.14.9
raw patch · 4 files changed
+68/−3 lines, 4 filesPVP ok
version bump matches the API change (PVP)
API changes (from Hackage documentation)
Files
- fb.cabal +1/−1
- src/Facebook/Base.hs +1/−1
- src/Facebook/Types.hs +60/−1
- tests/Main.hs +6/−0
fb.cabal view
@@ -1,5 +1,5 @@ name: fb-version: 0.14.8+version: 0.14.9 license: BSD3 license-file: LICENSE author: Felipe Lessa
src/Facebook/Base.hs view
@@ -24,7 +24,6 @@ import qualified Data.Aeson as A import qualified Data.Attoparsec.Char8 as AT import qualified Data.ByteString as B-import qualified Data.ByteString.Lazy as L import qualified Data.Conduit as C import qualified Data.Conduit.Attoparsec as C import qualified Data.Conduit.List as CL@@ -36,6 +35,7 @@ #if DEBUG import Control.Monad.IO.Class (MonadIO, liftIO) import Text.Printf (printf)+import qualified Data.ByteString.Lazy as L #endif
src/Facebook/Types.hs view
@@ -19,7 +19,8 @@ , FbUTCTime(..) ) where -import Control.Applicative (pure)+import Control.Applicative ((<$>), (<*>), pure)+import Control.Monad (mzero) import Data.ByteString (ByteString) import Data.Int (Int64) import Data.Monoid (Monoid, mappend)@@ -31,6 +32,7 @@ import System.Locale (defaultTimeLocale) import qualified Data.Aeson as A+import qualified Data.Aeson.Types as A import qualified Data.Text as T import qualified Data.Text.Encoding as TE import qualified Data.Text.Lazy as TL@@ -144,6 +146,63 @@ -- | Synonym for 'mappend'. (<>) :: Monoid a => a -> a -> a (<>) = mappend+++----------------------------------------------------------------------+++-- | /Since 0.14.9./ Not a Facebook JSON format, but a custom @fb@+-- format for convenience if you need to serialize access tokens.+instance A.ToJSON (AccessToken kind) where+ toJSON (UserAccessToken uid data_ expires) =+ A.object+ [ "kind" A..= ("user" :: Text)+ , "id" A..= uid+ , "token" A..= data_+ , "expires" A..= expires ]+ toJSON (AppAccessToken data_) =+ A.object+ [ "kind" A..= ("app" :: Text)+ , "token" A..= data_ ]+++-- | (Internal) Since the user of 'parseJSON' is going to choose+-- via its @kind@ whether a 'UserAccessToken' or an+-- 'AppAccessToken' is wanted, we need this type class to+-- implement 'FromJSON'.+class ParseAccessToken kind where+ parseTokenJSON :: A.Object -> A.Parser (AccessToken kind)++instance ParseAccessToken UserKind where+ parseTokenJSON v =+ checkKind v "user" $+ UserAccessToken <$> v A..: "id"+ <*> v A..: "token"+ <*> v A..: "expires"++instance ParseAccessToken AppKind where+ parseTokenJSON v =+ checkKind v "app" $+ AppAccessToken <$> v A..: "token"++-- | (Internal) Used to implement 'parseTokenJSON'.+checkKind :: A.Object -> Text -> A.Parser a -> A.Parser a+checkKind v kind ok = do+ kind' <- v A..: "kind"+ if kind == kind'+ then ok+ else fail $ "Expected access token kind " <> show kind <>+ " but found " <> show kind' <> "."++-- | /Since 0.14.9./ Parses the format that 'ToJSON' produces.+-- Note that you need to statically decide whether you want to+-- parse a user access token or an app access token.+instance ParseAccessToken kind => A.FromJSON (AccessToken kind) where+ parseJSON (A.Object v) = parseTokenJSON v+ parseJSON _ = mzero+++---------------------------------------------------------------------- -- | @newtype@ for 'UTCTime' that follows Facebook's
tests/Main.hs view
@@ -457,6 +457,12 @@ it "can be parsed from an object with an integer" $ do A.decode "{\"id\": 1234}" @?= Just (FB.Id "1234") + describe "AccessToken" $ do+ it "can be round-tripped with ToJSON/FromJSON (UserKind)" $ do+ A.eitherDecode (A.encode invalidUserAccessToken) @?= Right invalidUserAccessToken+ it "can be round-tripped with ToJSON/FromJSON (AppKind)" $ do+ A.eitherDecode (A.encode invalidAppAccessToken) @?= Right invalidAppAccessToken+ -- Wrappers for HUnit operators using MonadIO