twitter-enumerator 0.0.1.2 → 0.0.2
raw patch · 7 files changed
+100/−41 lines, 7 filesdep +transformersdep −mtlPVP: major bump suggested
API removals or changes: PVP suggests a major version bump
Dependencies added: transformers
Dependencies removed: mtl
API changes (from Hackage documentation)
- Web.Twitter.Enumerator.Fetch: api :: String -> Query -> Iteratee ByteString IO a -> Iteratee ByteString TW a
+ Web.Twitter.Enumerator.Api: api :: ByteString -> String -> Query -> Iteratee ByteString IO a -> Iteratee ByteString TW a
+ Web.Twitter.Enumerator.Api: endpoint :: String
+ Web.Twitter.Enumerator.Post: statusesUpdate :: ByteString -> Iteratee ByteString IO a -> Iteratee ByteString TW a
Files
- Web/Twitter/Enumerator.hs +2/−0
- Web/Twitter/Enumerator/Api.hs +50/−0
- Web/Twitter/Enumerator/Fetch.hs +9/−36
- Web/Twitter/Enumerator/Monad.hs +2/−1
- Web/Twitter/Enumerator/Post.hs +31/−0
- Web/Twitter/Enumerator/Utils.hs +1/−1
- twitter-enumerator.cabal +5/−3
Web/Twitter/Enumerator.hs view
@@ -2,9 +2,11 @@ ( module Web.Twitter.Enumerator.Types , module Web.Twitter.Enumerator.Monad , module Web.Twitter.Enumerator.Fetch+ , module Web.Twitter.Enumerator.Post ) where import Web.Twitter.Enumerator.Types import Web.Twitter.Enumerator.Monad import Web.Twitter.Enumerator.Fetch+import Web.Twitter.Enumerator.Post
+ Web/Twitter/Enumerator/Api.hs view
@@ -0,0 +1,50 @@+module Web.Twitter.Enumerator.Api+ ( api+ , endpoint+ ) where++import Web.Twitter.Enumerator.Types+import Web.Twitter.Enumerator.Monad++import Network.HTTP.Enumerator+import qualified Network.HTTP.Types as HT+import Data.Enumerator (Iteratee, throwError, liftTrans)++import Data.ByteString (ByteString)++import Control.Monad.Trans.Class+import Control.Monad.IO.Class (MonadIO (liftIO))++endpoint :: String+endpoint = "https://api.twitter.com/1/"++api :: ByteString -- ^ HTTP request method (GET or POST)+ -> String -- ^ API Resource URL+ -> HT.Query -- ^ Query+ -> Iteratee ByteString IO a+ -> Iteratee ByteString TW a+api m url query iter = do+ req <- lift $ apiRequest m url query+ httpMgr req (handleError iter)+ where+ handleError iter' st@(HT.Status sc _) _ =+ if 200 <= sc && sc < 300+ then iter'+ else throwError $ HTTPStatusCodeException st++httpMgr :: Request IO+ -> (HT.Status+ -> HT.ResponseHeaders+ -> Iteratee ByteString IO a)+ -> Iteratee ByteString TW a+httpMgr req iterf = do+ mgr <- lift getManager+ liftTrans $ http req iterf mgr+++apiRequest :: ByteString -> String -> HT.Query -> TW (Request IO)+apiRequest m uri query = do+ p <- getProxy+ req <- liftIO $ parseUrl uri >>= \r ->+ return $ r { method = m, queryString = query, proxy = p }+ signOAuthTW req
Web/Twitter/Enumerator/Fetch.hs view
@@ -1,8 +1,7 @@ {-# LANGUAGE OverloadedStrings #-} module Web.Twitter.Enumerator.Fetch- ( api- , QueryUser(..)+ ( QueryUser(..) , QueryList(..) -- * Timelines@@ -77,11 +76,11 @@ import Web.Twitter.Enumerator.Types import Web.Twitter.Enumerator.Monad import Web.Twitter.Enumerator.Utils+import Web.Twitter.Enumerator.Api import Data.Aeson hiding (Error) import qualified Data.Aeson.Types as AE -import Network.HTTP.Enumerator import qualified Network.HTTP.Types as HT import Data.Enumerator hiding (map, filter, drop, span, iterate) import qualified Data.Enumerator.List as EL@@ -89,7 +88,8 @@ import qualified Data.Text as T import Data.ByteString (ByteString) import qualified Data.ByteString.Char8 as B8-import Control.Monad.Trans+import Control.Monad.Trans.Class+import Control.Monad.IO.Class (MonadIO (liftIO)) import Control.Applicative import qualified Data.Map as M@@ -99,36 +99,9 @@ data QueryList = QListId Integer | QListName String deriving (Show, Eq) -endpoint :: String-endpoint = "https://api.twitter.com/1/" -api :: String -> HT.Query -> Iteratee ByteString IO a -> Iteratee ByteString TW a-api url query iter = do- req <- lift $ apiRequest url query- httpMgr req (handleError iter)- where- handleError iter' st@(HT.Status sc _) _ =- if 200 <= sc && sc < 300- then iter'- else throwError $ HTTPStatusCodeException st--httpMgr :: Request IO- -> (HT.Status- -> HT.ResponseHeaders- -> Iteratee ByteString IO a)- -> Iteratee ByteString TW a-httpMgr req iterf = do- mgr <- lift getManager- liftTrans $ http req iterf mgr--apiRequest :: String -> HT.Query -> TW (Request IO)-apiRequest uri query = do- p <- getProxy- req <- liftIO $ parseUrl uri >>= \r -> return $ r { queryString = query, proxy = p }- signOAuthTW req- apiGet :: FromJSON a => String -> HT.Query -> Iteratee a IO b -> TW b-apiGet uri query iter = run_ $ api uri query (handleParseError iter')+apiGet uri query iter = run_ $ api "GET" uri query (handleParseError iter') where iter' = enumJSON =$ EL.map fromJSON' =$ skipNothing =$ iter statuses :: (FromJSON a, Show a) => String -> HT.Query -> Enumerator a TW b@@ -141,7 +114,7 @@ where go loop page k = do let query' = insertQuery "page" (toMaybeByteString page) query- res <- lift $ run_ $ api uri query' (handleParseError (enumJSON =$ iterPageC))+ res <- lift $ run_ $ api "GET" uri query' (handleParseError (enumJSON =$ iterPageC)) case res of Just [] -> k EOF Just xs -> k (Chunks xs) >>== loop (page + 1)@@ -269,7 +242,7 @@ where go loop cursor k = do let query' = insertQuery "cursor" (toMaybeByteString cursor) query- res <- lift $ run_ $ api uri query' (iterCursor cursorKey)+ res <- lift $ run_ $ api "GET" uri query' (iterCursor cursorKey) case res of Just r -> do let nextCur = cursorNext r@@ -286,10 +259,10 @@ apiIter iter = enumLine =$ handleParseError (enumJSON =$ EL.map fromJSON' =$ skipNothing =$ iter) userstream :: Iteratee StreamingAPI IO a -> Iteratee ByteString TW a-userstream = api "https://userstream.twitter.com/2/user.json" [] . apiIter+userstream = api "GET" "https://userstream.twitter.com/2/user.json" [] . apiIter statusesFilter :: HT.Query -> Iteratee StreamingAPI IO a -> Iteratee ByteString TW a-statusesFilter query = api "https://stream.twitter.com/1/statuses/filter.json" query . apiIter+statusesFilter query = api "GET" "https://stream.twitter.com/1/statuses/filter.json" query . apiIter toMaybeByteString :: Show a => a -> Maybe ByteString toMaybeByteString = Just . B8.pack . show
Web/Twitter/Enumerator/Monad.hs view
@@ -14,7 +14,8 @@ import Web.Authenticate.OAuth import Network.HTTP.Enumerator-import Control.Monad.Reader+import Control.Monad.Trans.Reader+import Control.Monad.IO.Class (MonadIO (liftIO)) type TW = ReaderT TWEnv IO
+ Web/Twitter/Enumerator/Post.hs view
@@ -0,0 +1,31 @@+{-# LANGUAGE OverloadedStrings #-}++module Web.Twitter.Enumerator.Post+ ( statusesUpdate++ -- * Friendship+ -- , friendshipCreate+ -- , friendshipDestroy++ -- * Favorites+ -- , favoritesCreate+ -- , favoritesDestroy++ -- * Lists+ -- , listsCreate+ -- , listsDestroy+ -- , listsUpdate+ -- , listsMembersCreate+ -- , listsMembersDestroy+ )+ where++import Web.Twitter.Enumerator.Monad+import Web.Twitter.Enumerator.Api++import Data.ByteString (ByteString)++import Data.Enumerator (Iteratee)++statusesUpdate :: ByteString -> Iteratee ByteString IO a -> Iteratee ByteString TW a+statusesUpdate tweet iter = api "POST" (endpoint ++ "statuses/update.json") [("status", Just tweet)] iter
Web/Twitter/Enumerator/Utils.hs view
@@ -15,7 +15,7 @@ import qualified Data.Enumerator.Binary as EB import Data.ByteString (ByteString) import Data.Maybe-import Control.Monad.Trans+import Control.Monad.IO.Class (MonadIO (liftIO)) enumLine :: Monad m => E.Enumeratee ByteString ByteString m a enumLine = EB.splitWhen newline
twitter-enumerator.cabal view
@@ -1,5 +1,5 @@ name: twitter-enumerator-version: 0.0.1.2+version: 0.0.2 license: BSD3 license-file: LICENSE author: Takahiro HIMURA@@ -19,14 +19,14 @@ source-repository this type: git location: git://github.com/himura/twitter-enumerator.git- tag: 0.0.1.1+ tag: 0.0.2 library ghc-options: -Wall build-depends: base >= 4 && < 5- , mtl+ , transformers >= 0.2 && < 0.3 , authenticate >= 0.9 && < 0.11 , enumerator >= 0.4.14 && < 0.5 , http-types@@ -42,7 +42,9 @@ Web.Twitter.Enumerator Web.Twitter.Enumerator.Types Web.Twitter.Enumerator.Monad+ Web.Twitter.Enumerator.Api Web.Twitter.Enumerator.Fetch+ Web.Twitter.Enumerator.Post other-modules: Web.Twitter.Enumerator.Utils