twitter-conduit 0.0.5.5 → 0.0.5.6
raw patch · 10 files changed
+122/−64 lines, 10 filesdep +lens-aesondep +network-uridep −shakespearedep ~lensdep ~networkdep ~twitter-typesPVP: major bump suggested
API removals or changes: PVP suggests a major version bump
Dependencies added: lens-aeson, network-uri
Dependencies removed: shakespeare
Dependency ranges changed: lens, network, twitter-types
API changes (from Hackage documentation)
- Web.Twitter.Conduit.Base: apiRequest :: TwitterBaseM m => Request -> TW m (Response (ResumableSource (TW m) ByteString))
+ Web.Twitter.Conduit.Api: data FollowersList
+ Web.Twitter.Conduit.Api: followersList :: UserParam -> APIRequest FollowersList (WithCursor UsersCursorKey User)
+ Web.Twitter.Conduit.Api: instance HasCountParam (APIRequest FollowersList a0)
+ Web.Twitter.Conduit.Api: instance HasCursorParam (APIRequest FollowersList a0)
+ Web.Twitter.Conduit.Api: instance HasIncludeUserEntitiesParam (APIRequest FollowersList a0)
+ Web.Twitter.Conduit.Api: instance HasSkipStatusParam (APIRequest FollowersList a0)
+ Web.Twitter.Conduit.Base: getResponse :: TwitterBaseM m => Request -> TW m (Response (ResumableSource (TW m) ByteString))
+ Web.Twitter.Conduit.Stream: data StatusesFilter
+ Web.Twitter.Conduit.Stream: data Userstream
- Web.Twitter.Conduit.Base: makeRequest :: MonadThrow m => Method -> String -> SimpleQuery -> TW m Request
+ Web.Twitter.Conduit.Base: makeRequest :: (MonadThrow m, MonadIO m) => APIRequest apiName responseType -> m Request
- Web.Twitter.Conduit.Parameters: class Parameters a_aek9 => HasContributorDetailsParam a_aek9 where contributorDetails = wrappedParam "contributor_details" booleanQuery
+ Web.Twitter.Conduit.Parameters: class Parameters a_adYf => HasContributorDetailsParam a_adYf where contributorDetails = wrappedParam "contributor_details" booleanQuery
- Web.Twitter.Conduit.Parameters: class Parameters a_aeeg => HasCountParam a_aeeg where count = wrappedParam "count" readShow
+ Web.Twitter.Conduit.Parameters: class Parameters a_adSm => HasCountParam a_adSm where count = wrappedParam "count" readShow
- Web.Twitter.Conduit.Parameters: class Parameters a_aehG => HasCursorParam a_aehG where cursor = wrappedParam "cursor" readShow
+ Web.Twitter.Conduit.Parameters: class Parameters a_adVM => HasCursorParam a_adVM where cursor = wrappedParam "cursor" readShow
- Web.Twitter.Conduit.Parameters: class Parameters a_aep2 => HasDisplayCoordinatesParam a_aep2 where displayCoordinates = wrappedParam "display_coordinates" booleanQuery
+ Web.Twitter.Conduit.Parameters: class Parameters a_ae38 => HasDisplayCoordinatesParam a_ae38 where displayCoordinates = wrappedParam "display_coordinates" booleanQuery
- Web.Twitter.Conduit.Parameters: class Parameters a_aejl => HasExcludeRepliesParam a_aejl where excludeReplies = wrappedParam "exclude_replies" booleanQuery
+ Web.Twitter.Conduit.Parameters: class Parameters a_adXr => HasExcludeRepliesParam a_adXr where excludeReplies = wrappedParam "exclude_replies" booleanQuery
- Web.Twitter.Conduit.Parameters: class Parameters a_aetV => HasFollowParam a_aetV where follow = wrappedParam "follow" booleanQuery
+ Web.Twitter.Conduit.Parameters: class Parameters a_ae81 => HasFollowParam a_ae81 where follow = wrappedParam "follow" booleanQuery
- Web.Twitter.Conduit.Parameters: class Parameters a_aeob => HasInReplyToStatusIdParam a_aeob where inReplyToStatusId = wrappedParam "in_reply_to_status_id" readShow
+ Web.Twitter.Conduit.Parameters: class Parameters a_ae2h => HasInReplyToStatusIdParam a_ae2h where inReplyToStatusId = wrappedParam "in_reply_to_status_id" readShow
- Web.Twitter.Conduit.Parameters: class Parameters a_aekX => HasIncludeEntitiesParam a_aekX where includeEntities = wrappedParam "include_entities" booleanQuery
+ Web.Twitter.Conduit.Parameters: class Parameters a_adZ3 => HasIncludeEntitiesParam a_adZ3 where includeEntities = wrappedParam "include_entities" booleanQuery
- Web.Twitter.Conduit.Parameters: class Parameters a_aenn => HasIncludeMyRetweetParam a_aenn where includeMyRetweet = wrappedParam "include_my_retweet" booleanQuery
+ Web.Twitter.Conduit.Parameters: class Parameters a_ae1t => HasIncludeMyRetweetParam a_ae1t where includeMyRetweet = wrappedParam "include_my_retweet" booleanQuery
- Web.Twitter.Conduit.Parameters: class Parameters a_aemz => HasIncludeRtsParam a_aemz where includeRts = wrappedParam "include_rts" booleanQuery
+ Web.Twitter.Conduit.Parameters: class Parameters a_ae0F => HasIncludeRtsParam a_ae0F where includeRts = wrappedParam "include_rts" booleanQuery
- Web.Twitter.Conduit.Parameters: class Parameters a_aelL => HasIncludeUserEntitiesParam a_aelL where includeUserEntities = wrappedParam "include_user_entities" booleanQuery
+ Web.Twitter.Conduit.Parameters: class Parameters a_adZR => HasIncludeUserEntitiesParam a_adZR where includeUserEntities = wrappedParam "include_user_entities" booleanQuery
- Web.Twitter.Conduit.Parameters: class Parameters a_aeqE => HasLangParam a_aeqE where lang = wrappedParam "lang" utf8
+ Web.Twitter.Conduit.Parameters: class Parameters a_ae4K => HasLangParam a_ae4K where lang = wrappedParam "lang" utf8
- Web.Twitter.Conduit.Parameters: class Parameters a_aers => HasLocaleParam a_aers where locale = wrappedParam "locale" utf8
+ Web.Twitter.Conduit.Parameters: class Parameters a_ae5y => HasLocaleParam a_ae5y where locale = wrappedParam "locale" utf8
- Web.Twitter.Conduit.Parameters: class Parameters a_aeuJ => HasMapParam a_aeuJ where map = wrappedParam "map" booleanQuery
+ Web.Twitter.Conduit.Parameters: class Parameters a_ae8P => HasMapParam a_ae8P where map = wrappedParam "map" booleanQuery
- Web.Twitter.Conduit.Parameters: class Parameters a_aefY => HasMaxIdParam a_aefY where maxId = wrappedParam "max_id" readShow
+ Web.Twitter.Conduit.Parameters: class Parameters a_adU4 => HasMaxIdParam a_adU4 where maxId = wrappedParam "max_id" readShow
- Web.Twitter.Conduit.Parameters: class Parameters a_aevB => HasMediaIdsParam a_aevB where mediaIds = wrappedParam "media_ids" integerArrayQuery
+ Web.Twitter.Conduit.Parameters: class Parameters a_ae9H => HasMediaIdsParam a_ae9H where mediaIds = wrappedParam "media_ids" integerArrayQuery
- Web.Twitter.Conduit.Parameters: class Parameters a_aegP => HasPageParam a_aegP where page = wrappedParam "page" readShow
+ Web.Twitter.Conduit.Parameters: class Parameters a_adUV => HasPageParam a_adUV where page = wrappedParam "page" readShow
- Web.Twitter.Conduit.Parameters: class Parameters a_aepQ => HasPossiblySensitiveParam a_aepQ where possiblySensitive = wrappedParam "possibly_sensitive" booleanQuery
+ Web.Twitter.Conduit.Parameters: class Parameters a_ae3W => HasPossiblySensitiveParam a_ae3W where possiblySensitive = wrappedParam "possibly_sensitive" booleanQuery
- Web.Twitter.Conduit.Parameters: class Parameters a_aef7 => HasSinceIdParam a_aef7 where sinceId = wrappedParam "since_id" readShow
+ Web.Twitter.Conduit.Parameters: class Parameters a_adTd => HasSinceIdParam a_adTd where sinceId = wrappedParam "since_id" readShow
- Web.Twitter.Conduit.Parameters: class Parameters a_aet7 => HasSkipStatusParam a_aet7 where skipStatus = wrappedParam "skip_status" booleanQuery
+ Web.Twitter.Conduit.Parameters: class Parameters a_ae7d => HasSkipStatusParam a_ae7d where skipStatus = wrappedParam "skip_status" booleanQuery
- Web.Twitter.Conduit.Parameters: class Parameters a_aeix => HasTrimUserParam a_aeix where trimUser = wrappedParam "trim_user" booleanQuery
+ Web.Twitter.Conduit.Parameters: class Parameters a_adWD => HasTrimUserParam a_adWD where trimUser = wrappedParam "trim_user" booleanQuery
- Web.Twitter.Conduit.Parameters: class Parameters a_aesg => HasUntilParam a_aesg where until = wrappedParam "until" readShow
+ Web.Twitter.Conduit.Parameters: class Parameters a_ae6m => HasUntilParam a_ae6m where until = wrappedParam "until" readShow
- Web.Twitter.Conduit.Parameters: contributorDetails :: HasContributorDetailsParam a_aek9 => Lens' a_aek9 (Maybe Bool)
+ Web.Twitter.Conduit.Parameters: contributorDetails :: HasContributorDetailsParam a_adYf => Lens' a_adYf (Maybe Bool)
- Web.Twitter.Conduit.Parameters: count :: HasCountParam a_aeeg => Lens' a_aeeg (Maybe Integer)
+ Web.Twitter.Conduit.Parameters: count :: HasCountParam a_adSm => Lens' a_adSm (Maybe Integer)
- Web.Twitter.Conduit.Parameters: cursor :: HasCursorParam a_aehG => Lens' a_aehG (Maybe Integer)
+ Web.Twitter.Conduit.Parameters: cursor :: HasCursorParam a_adVM => Lens' a_adVM (Maybe Integer)
- Web.Twitter.Conduit.Parameters: displayCoordinates :: HasDisplayCoordinatesParam a_aep2 => Lens' a_aep2 (Maybe Bool)
+ Web.Twitter.Conduit.Parameters: displayCoordinates :: HasDisplayCoordinatesParam a_ae38 => Lens' a_ae38 (Maybe Bool)
- Web.Twitter.Conduit.Parameters: excludeReplies :: HasExcludeRepliesParam a_aejl => Lens' a_aejl (Maybe Bool)
+ Web.Twitter.Conduit.Parameters: excludeReplies :: HasExcludeRepliesParam a_adXr => Lens' a_adXr (Maybe Bool)
- Web.Twitter.Conduit.Parameters: follow :: HasFollowParam a_aetV => Lens' a_aetV (Maybe Bool)
+ Web.Twitter.Conduit.Parameters: follow :: HasFollowParam a_ae81 => Lens' a_ae81 (Maybe Bool)
- Web.Twitter.Conduit.Parameters: inReplyToStatusId :: HasInReplyToStatusIdParam a_aeob => Lens' a_aeob (Maybe StatusId)
+ Web.Twitter.Conduit.Parameters: inReplyToStatusId :: HasInReplyToStatusIdParam a_ae2h => Lens' a_ae2h (Maybe StatusId)
- Web.Twitter.Conduit.Parameters: includeEntities :: HasIncludeEntitiesParam a_aekX => Lens' a_aekX (Maybe Bool)
+ Web.Twitter.Conduit.Parameters: includeEntities :: HasIncludeEntitiesParam a_adZ3 => Lens' a_adZ3 (Maybe Bool)
- Web.Twitter.Conduit.Parameters: includeMyRetweet :: HasIncludeMyRetweetParam a_aenn => Lens' a_aenn (Maybe Bool)
+ Web.Twitter.Conduit.Parameters: includeMyRetweet :: HasIncludeMyRetweetParam a_ae1t => Lens' a_ae1t (Maybe Bool)
- Web.Twitter.Conduit.Parameters: includeRts :: HasIncludeRtsParam a_aemz => Lens' a_aemz (Maybe Bool)
+ Web.Twitter.Conduit.Parameters: includeRts :: HasIncludeRtsParam a_ae0F => Lens' a_ae0F (Maybe Bool)
- Web.Twitter.Conduit.Parameters: includeUserEntities :: HasIncludeUserEntitiesParam a_aelL => Lens' a_aelL (Maybe Bool)
+ Web.Twitter.Conduit.Parameters: includeUserEntities :: HasIncludeUserEntitiesParam a_adZR => Lens' a_adZR (Maybe Bool)
- Web.Twitter.Conduit.Parameters: lang :: HasLangParam a_aeqE => Lens' a_aeqE (Maybe Text)
+ Web.Twitter.Conduit.Parameters: lang :: HasLangParam a_ae4K => Lens' a_ae4K (Maybe Text)
- Web.Twitter.Conduit.Parameters: locale :: HasLocaleParam a_aers => Lens' a_aers (Maybe Text)
+ Web.Twitter.Conduit.Parameters: locale :: HasLocaleParam a_ae5y => Lens' a_ae5y (Maybe Text)
- Web.Twitter.Conduit.Parameters: map :: HasMapParam a_aeuJ => Lens' a_aeuJ (Maybe Bool)
+ Web.Twitter.Conduit.Parameters: map :: HasMapParam a_ae8P => Lens' a_ae8P (Maybe Bool)
- Web.Twitter.Conduit.Parameters: maxId :: HasMaxIdParam a_aefY => Lens' a_aefY (Maybe Integer)
+ Web.Twitter.Conduit.Parameters: maxId :: HasMaxIdParam a_adU4 => Lens' a_adU4 (Maybe Integer)
- Web.Twitter.Conduit.Parameters: mediaIds :: HasMediaIdsParam a_aevB => Lens' a_aevB (Maybe [Integer])
+ Web.Twitter.Conduit.Parameters: mediaIds :: HasMediaIdsParam a_ae9H => Lens' a_ae9H (Maybe [Integer])
- Web.Twitter.Conduit.Parameters: page :: HasPageParam a_aegP => Lens' a_aegP (Maybe Integer)
+ Web.Twitter.Conduit.Parameters: page :: HasPageParam a_adUV => Lens' a_adUV (Maybe Integer)
- Web.Twitter.Conduit.Parameters: possiblySensitive :: HasPossiblySensitiveParam a_aepQ => Lens' a_aepQ (Maybe Bool)
+ Web.Twitter.Conduit.Parameters: possiblySensitive :: HasPossiblySensitiveParam a_ae3W => Lens' a_ae3W (Maybe Bool)
- Web.Twitter.Conduit.Parameters: sinceId :: HasSinceIdParam a_aef7 => Lens' a_aef7 (Maybe Integer)
+ Web.Twitter.Conduit.Parameters: sinceId :: HasSinceIdParam a_adTd => Lens' a_adTd (Maybe Integer)
- Web.Twitter.Conduit.Parameters: skipStatus :: HasSkipStatusParam a_aet7 => Lens' a_aet7 (Maybe Bool)
+ Web.Twitter.Conduit.Parameters: skipStatus :: HasSkipStatusParam a_ae7d => Lens' a_ae7d (Maybe Bool)
- Web.Twitter.Conduit.Parameters: trimUser :: HasTrimUserParam a_aeix => Lens' a_aeix (Maybe Bool)
+ Web.Twitter.Conduit.Parameters: trimUser :: HasTrimUserParam a_adWD => Lens' a_adWD (Maybe Bool)
- Web.Twitter.Conduit.Parameters: until :: HasUntilParam a_aesg => Lens' a_aesg (Maybe Day)
+ Web.Twitter.Conduit.Parameters: until :: HasUntilParam a_ae6m => Lens' a_ae6m (Maybe Day)
- Web.Twitter.Conduit.Types.Lens: contents :: Lens (WithCursor cursorKey_ab7U wrapped_ab7V) (WithCursor cursorKey_adQS wrapped_adQT) [wrapped_ab7V] [wrapped_adQT]
+ Web.Twitter.Conduit.Types.Lens: contents :: Lens (WithCursor cursorKey_aalL wrapped_aalM) (WithCursor cursorKey_admw wrapped_admx) [wrapped_aalM] [wrapped_admx]
- Web.Twitter.Conduit.Types.Lens: nextCursor :: Lens (WithCursor cursorKey_ab7U wrapped_ab7V) (WithCursor cursorKey_adQZ wrapped_ab7V) Integer Integer
+ Web.Twitter.Conduit.Types.Lens: nextCursor :: Lens (WithCursor cursorKey_aalL wrapped_aalM) (WithCursor cursorKey_admy wrapped_aalM) Integer Integer
- Web.Twitter.Conduit.Types.Lens: previousCursor :: Lens (WithCursor cursorKey_ab7U wrapped_ab7V) (WithCursor cursorKey_adR5 wrapped_ab7V) Integer Integer
+ Web.Twitter.Conduit.Types.Lens: previousCursor :: Lens (WithCursor cursorKey_aalL wrapped_aalM) (WithCursor cursorKey_admz wrapped_aalM) Integer Integer
- Web.Twitter.Conduit.Types.Lens: responseBody :: Lens (Response responseType_ab5P) (Response responseType_adT4) responseType_ab5P responseType_adT4
+ Web.Twitter.Conduit.Types.Lens: responseBody :: Lens (Response responseType_aajD) (Response responseType_adoC) responseType_aajD responseType_adoC
- Web.Twitter.Conduit.Types.Lens: responseHeaders :: Lens' (Response responseType_ab5P) ResponseHeaders
+ Web.Twitter.Conduit.Types.Lens: responseHeaders :: Lens' (Response responseType_aajD) ResponseHeaders
- Web.Twitter.Conduit.Types.Lens: responseStatus :: Lens' (Response responseType_ab5P) Status
+ Web.Twitter.Conduit.Types.Lens: responseStatus :: Lens' (Response responseType_aajD) Status
Files
- .travis.yml +5/−1
- Web/Twitter/Conduit.hs +0/−2
- Web/Twitter/Conduit/Api.hs +30/−1
- Web/Twitter/Conduit/Base.hs +41/−45
- Web/Twitter/Conduit/Stream.hs +5/−8
- Web/Twitter/Conduit/Types/TH.hs +9/−0
- sample/simple.hs +1/−0
- sample/userstream.hs +1/−0
- tests/hlint.hs +1/−1
- twitter-conduit.cabal +29/−6
.travis.yml view
@@ -13,11 +13,12 @@ matrix: - GHCVER=7.4.2 - GHCVER=7.6.3- - GHCVER=7.8.2 USE_COVERALLS=1 CABAL_FLAGS="-frun-integrated-test"+ - GHCVER=7.8.3 USE_COVERALLS=1 CABAL_FLAGS="-frun-integrated-test" - GHCVER=head matrix: allow_failures:+ - env: GHCVER=7.4.2 - env: GHCVER=head before_install:@@ -36,6 +37,9 @@ - export PATH=$HOME/.cabal/bin:$PATH - which cabal - travis_retry cabal update+ # GHC 7.8.3 exports transformers-0.3.0, but happy and our package installs transformers 0.4 series.+ # However, doctest fails when we have multiple version of transformers.+ # To prevent this, we restrict transformers version to (< 0.4) - cabal install happy --constraint="transformers < 0.4" - cabal install --only-dependencies --enable-tests - "[ -n \"$USE_COVERALLS\" ] && travis_retry cabal install hpc-coveralls || true"
Web/Twitter/Conduit.hs view
@@ -24,7 +24,6 @@ , module Web.Twitter.Conduit.Stream , module Web.Twitter.Conduit.Request , module Web.Twitter.Conduit.Parameters- , module Web.Twitter.Types.Lens , MediaData (..) , UploadedMedia@@ -45,7 +44,6 @@ import Web.Twitter.Conduit.Stream import Web.Twitter.Conduit.Request import Web.Twitter.Conduit.Parameters-import Web.Twitter.Types.Lens -- for haddock import Web.Authenticate.OAuth
Web/Twitter/Conduit/Api.hs view
@@ -46,7 +46,8 @@ -- , friendshipsShow , FriendsList , friendsList- -- , followersList+ , FollowersList+ , followersList -- , friendshipsLookup -- * Users@@ -449,6 +450,34 @@ friendsList :: UserParam -> APIRequest FriendsList (WithCursor UsersCursorKey User) friendsList q = APIRequestGet (endpoint ++ "friends/list.json") (mkUserParam q) deriveHasParamInstances ''FriendsList+ [ "cursor"+ , "count"+ , "skip_status"+ , "include_user_entities"+ ]++data FollowersList+-- | Returns query data which asks a cursored collection of user objects for users following the specified user.+--+-- You can perform request by using 'call':+--+-- @+-- res <- 'call' '$' 'followersList' ('ScreenNameParam' \"thimura\")+-- @+--+-- Or, you can iterate with 'sourceWithCursor':+--+-- @+-- 'sourceWithCursor' ('followersList' ('ScreenNameParam' \"thimura\")) $$ CL.consume+-- @+--+-- >>> followersList (ScreenNameParam "thimura")+-- APIRequestGet "https://api.twitter.com/1.1/followers/list.json" [("screen_name","thimura")]+-- >>> followersList (UserIdParam 69179963)+-- APIRequestGet "https://api.twitter.com/1.1/followers/list.json" [("user_id","69179963")]+followersList :: UserParam -> APIRequest FollowersList (WithCursor UsersCursorKey User)+followersList q = APIRequestGet (endpoint ++ "followers/list.json") (mkUserParam q)+deriveHasParamInstances ''FollowersList [ "cursor" , "count" , "skip_status"
Web/Twitter/Conduit/Base.hs view
@@ -8,7 +8,7 @@ module Web.Twitter.Conduit.Base ( api- , apiRequest+ , getResponse , call , call' , checkResponse@@ -24,7 +24,6 @@ , showBS ) where -import Prelude as P import Web.Twitter.Conduit.Monad import Web.Twitter.Conduit.Types import Web.Twitter.Conduit.Parameters@@ -40,12 +39,13 @@ import Data.Aeson import Data.Aeson.Lens import qualified Data.Conduit.Attoparsec as CA+import qualified Data.Text as T import qualified Data.Text.Encoding as T import Data.ByteString (ByteString) import qualified Data.ByteString.Char8 as S8+import Control.Monad.IO.Class import Control.Monad.Trans.Class (lift) import Control.Monad.Trans.Resource (MonadResource, MonadThrow, monadThrow)-import Text.Shakespeare.Text import Control.Monad.Logger import Control.Lens import Unsafe.Coerce@@ -54,38 +54,49 @@ , MonadLogger m ) -makeRequest :: MonadThrow m- => HT.Method -- ^ HTTP request method (GET or POST)- -> String -- ^ API Resource URL- -> HT.SimpleQuery -- ^ Query- -> TW m HTTP.Request-makeRequest m url query = do- p <- getProxy+makeRequest :: (MonadThrow m, MonadIO m)+ => APIRequest apiName responseType+ -> m HTTP.Request+makeRequest (APIRequestGet u pa) = makeRequest' "GET" u pa+makeRequest (APIRequestPost u pa) = makeRequest' "POST" u pa+makeRequest (APIRequestPostMultipart u param prt) =+ formDataBody body =<< makeRequest' "POST" u []+ where+ body = prt ++ partParam+ partParam = Prelude.map (uncurry partBS . over _1 T.decodeUtf8) param++makeRequest' :: MonadThrow m+ => HT.Method -- ^ HTTP request method (GET or POST)+ -> String -- ^ API Resource URL+ -> HT.SimpleQuery -- ^ Query+ -> m HTTP.Request+makeRequest' m url query = do req <- HTTP.parseUrl url return $ req { HTTP.method = m , HTTP.queryString = HT.renderSimpleQuery False query- , HTTP.proxy = p , HTTP.checkStatus = \_ _ _ -> Nothing } +{-# DEPRECATED api "use `getResponse =<< makeRequest'`" #-} api :: TwitterBaseM m => HT.Method -- ^ HTTP request method (GET or POST) -> String -- ^ API Resource URL -> HT.SimpleQuery -- ^ Query -> TW m (Response (C.ResumableSource (TW m) ByteString)) api m url query =- apiRequest =<< makeRequest m url query+ getResponse =<< makeRequest' m url query -apiRequest :: TwitterBaseM m- => HTTP.Request- -> TW m (Response (C.ResumableSource (TW m) ByteString))-apiRequest req = do- signedReq <- signOAuthTW req- $(logDebug) [st|Signed Request: #{show signedReq}|]+getResponse :: TwitterBaseM m+ => HTTP.Request+ -> TW m (Response (C.ResumableSource (TW m) ByteString))+getResponse req = do+ proxy <- getProxy+ signedReq <- signOAuthTW $ req { HTTP.proxy = proxy }+ $(logDebug) $ T.pack $ "Signed Request: " ++ show signedReq mgr <- getManager res <- HTTP.http signedReq mgr- $(logDebug) [st|Response Status: #{show $ HTTP.responseStatus res}|]- $(logDebug) [st|Response Header: #{show $ HTTP.responseHeaders res}|]+ $(logDebug) $ T.pack $ "Response Status: " ++ show (HTTP.responseStatus res)+ $(logDebug) $ T.pack $ "Response Header: " ++ show (HTTP.responseHeaders res) return Response { responseStatus = HTTP.responseStatus res , responseHeaders = HTTP.responseHeaders res@@ -96,8 +107,8 @@ endpoint = "https://api.twitter.com/1.1/" getValue :: (MonadLogger m, MonadThrow m)- => Response (C.ResumableSource (TW m) ByteString)- -> TW m (Response Value)+ => Response (C.ResumableSource m ByteString)+ -> m (Response Value) getValue res = do value <- responseBody res C.$$+- sinkJSON return $ res { responseBody = value }@@ -118,8 +129,8 @@ sci = HT.statusCode responseStatus getValueOrThrow :: (MonadThrow m, MonadLogger m, FromJSON a)- => Response (C.ResumableSource (TW m) ByteString)- -> TW m a+ => Response (C.ResumableSource m ByteString)+ -> m a getValueOrThrow res = do val <- getValueOrThrow' res case fromJSON val of@@ -127,23 +138,14 @@ Error err -> monadThrow $ FromJSONError err getValueOrThrow' :: (MonadLogger m, MonadThrow m)- => Response (C.ResumableSource (TW m) ByteString)- -> TW m Value+ => Response (C.ResumableSource m ByteString)+ -> m Value getValueOrThrow' res = do res' <- getValue res case checkResponse res' of Left err -> monadThrow err Right v -> return v -apiValue :: (TwitterBaseM m, FromJSON a)- => HT.Method -- ^ HTTP request method (GET or POST)- -> String -- ^ API Resource URL- -> HT.SimpleQuery -- ^ Query- -> TW m a-apiValue m url query = do- src <- api m url query- getValueOrThrow src- call :: (TwitterBaseM m, FromJSON responseType) => APIRequest apiName responseType -> TW m responseType@@ -152,15 +154,9 @@ call' :: (TwitterBaseM m, FromJSON value) => APIRequest apiName responseType -> TW m value-call' (APIRequestGet u pa) = apiValue "GET" u pa-call' (APIRequestPost u pa) = apiValue "POST" u pa-call' (APIRequestPostMultipart u param prt) = do- req <- formDataBody body =<< makeRequest "POST" u []- src <- apiRequest req- getValueOrThrow src- where- body = prt ++ partParam- partParam = P.map (uncurry partBS . over _1 T.decodeUtf8) param+call' req = do+ res <- getResponse =<< makeRequest req+ getValueOrThrow res sourceWithMaxId :: ( TwitterBaseM m , FromJSON responseType@@ -235,7 +231,7 @@ ) => C.Consumer ByteString m Value sinkJSON = do js <- CA.sinkParser json- $(logDebug) [st|Response JSON: #{show js}|]+ $(logDebug) $ T.pack $ "Response JSON: " ++ show js return js sinkFromJSON :: ( FromJSON a
Web/Twitter/Conduit/Stream.hs view
@@ -9,7 +9,9 @@ module Web.Twitter.Conduit.Stream ( -- * StreamingAPI- userstream+ Userstream+ , userstream+ , StatusesFilter , statusesFilterByFollow , statusesFilterByTrack -- , statusesFilterByLocation@@ -52,14 +54,9 @@ stream' :: (TwitterBaseM m, FromJSON value) => APIRequest apiName responseType -> TW m (C.ResumableSource (TW m) value)-stream' (APIRequestGet u pa) = do- rsrc <- api "GET" u pa- responseBody rsrc $=+ CL.sequence sinkFromJSON-stream' (APIRequestPost u pa) = do- rsrc <- api "POST" u pa+stream' req = do+ rsrc <- getResponse =<< makeRequest req responseBody rsrc $=+ CL.sequence sinkFromJSON-stream' APIRequestPostMultipart {} =- error "APIRequestPostMultipart is not supported by stream function." data Userstream userstream :: APIRequest Userstream StreamingAPI
Web/Twitter/Conduit/Types/TH.hs view
@@ -1,3 +1,5 @@+{-# LANGUAGE CPP #-}+ module Web.Twitter.Conduit.Types.TH ( makeLenses ) where@@ -5,5 +7,12 @@ import Control.Lens hiding (makeLenses) import Language.Haskell.TH +#if MIN_VERSION_lens(4,4,0) makeLenses :: Name -> Q [Dec]+makeLenses = makeLensesWith (lensRules & lensField .~ myFieldToDef)+ where+ myFieldToDef _ n = [TopName (mkName (nameBase n))]+#else+makeLenses :: Name -> Q [Dec] makeLenses = makeLensesWith (defaultRules & lensField .~ Just)+#endif
sample/simple.hs view
@@ -4,6 +4,7 @@ module Main where import Web.Twitter.Conduit+import Web.Twitter.Types.Lens import Control.Lens import Web.Authenticate.OAuth (OAuth(..), Credential(..)) import qualified Web.Authenticate.OAuth as OA
sample/userstream.hs view
@@ -17,6 +17,7 @@ import Network.HTTP.Conduit import Web.Twitter.Conduit+import Web.Twitter.Types.Lens import Common import Control.Lens
tests/hlint.hs view
@@ -8,5 +8,5 @@ main :: IO () main = do args <- getArgs- hints <- hlint $ ["Web", "--cpp-define=HLINT", "--cpp-ansi"] ++ args+ hints <- hlint $ ["Web", "--cpp-define=HLINT", "--cpp-ansi", "--cpp-file=dist/build/autogen/cabal_macros.h"] ++ args unless (null hints) exitFailure
twitter-conduit.cabal view
@@ -1,5 +1,5 @@ name: twitter-conduit-version: 0.0.5.5+version: 0.0.5.6 license: BSD3 license-file: LICENSE author: HATTORI Hiroki, Hideyuki Tanaka, Takahiro HIMURA@@ -31,6 +31,14 @@ type: git location: git://github.com/himura/twitter-conduit.git +flag network-uri+ description: Get Network.URI from the network-uri package+ default: True++flag lens-aeson+ description: Get Data.Aeson.Lens from the lens-aeson package+ default: True+ flag build-samples description: build samples default: False@@ -50,13 +58,12 @@ base >= 4.5 && < 5 , transformers >= 0.2.2 , template-haskell- , lens >= 4.0+ , lens >= 4.0 && < 4.5 , authenticate-oauth >= 1.3 , resourcet >= 1.0 , conduit >= 1.1 , conduit-extra >= 1.1 , monad-logger- , shakespeare >= 2.0 , http-types , http-conduit >= 2.0 && < 2.2 , http-client >= 0.3@@ -69,6 +76,9 @@ , time , twitter-types >= 0.2 + if flag(lens-aeson)+ build-depends: lens-aeson >= 1+ exposed-modules: Web.Twitter.Conduit Web.Twitter.Conduit.Types@@ -128,7 +138,6 @@ , text , aeson , attoparsec >= 0.10- , shakespeare , data-default , resourcet , conduit@@ -139,10 +148,18 @@ , monad-logger , authenticate-oauth , case-insensitive- , network , containers , hspec , twitter-types >= 0.4.0++ if flag(network-uri)+ build-depends: network-uri >= 2.6+ else+ build-depends: network < 2.6++ if flag(lens-aeson)+ build-depends: lens-aeson >= 1+ other-modules: Spec ApiSpec@@ -171,6 +188,7 @@ , monad-logger , authenticate-oauth , twitter-conduit+ , twitter-types executable userstream main-is: userstream.hs@@ -189,7 +207,6 @@ , text , filepath , directory- , network , process , case-insensitive , lens@@ -202,6 +219,12 @@ , monad-logger , authenticate-oauth , twitter-conduit+ , twitter-types++ if flag(network-uri)+ build-depends: network-uri >= 2.6+ else+ build-depends: network < 2.6 executable oauth_callback main-is: oauth_callback.hs