packages feed

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 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