packages feed

twitter-conduit 0.0.8.1 → 0.1.0

raw patch · 23 files changed

+556/−432 lines, 23 filesdep −monad-loggerdep ~lensPVP ok

version bump matches the API change (PVP)

Dependencies removed: monad-logger

Dependency ranges changed: lens

API changes (from Hackage documentation)

- Web.Twitter.Conduit.Base: api :: TwitterBaseM m => Method -> String -> SimpleQuery -> TW m (Response (ResumableSource (TW m) ByteString))
- Web.Twitter.Conduit.Base: showBS :: Show a => a -> ByteString
- Web.Twitter.Conduit.Monad: TWInfo :: TWToken -> Maybe Proxy -> TWInfo
- Web.Twitter.Conduit.Monad: TWToken :: OAuth -> Credential -> TWToken
- Web.Twitter.Conduit.Monad: data TWInfo
- Web.Twitter.Conduit.Monad: data TWToken
- Web.Twitter.Conduit.Monad: getManager :: Monad m => TW m Manager
- Web.Twitter.Conduit.Monad: getProxy :: Monad m => TW m (Maybe Proxy)
- Web.Twitter.Conduit.Monad: instance Default TWInfo
- Web.Twitter.Conduit.Monad: instance Default TWToken
- Web.Twitter.Conduit.Monad: instance Show TWInfo
- Web.Twitter.Conduit.Monad: instance Show TWToken
- Web.Twitter.Conduit.Monad: setCredential :: OAuth -> Credential -> TWInfo -> TWInfo
- Web.Twitter.Conduit.Monad: signOAuthTW :: MonadIO m => Request -> TW m Request
- Web.Twitter.Conduit.Monad: twCredential :: TWToken -> Credential
- Web.Twitter.Conduit.Monad: twOAuth :: TWToken -> OAuth
- Web.Twitter.Conduit.Monad: twProxy :: TWInfo -> Maybe Proxy
- Web.Twitter.Conduit.Monad: twToken :: TWInfo -> TWToken
- Web.Twitter.Conduit.Monad: twitterOAuth :: OAuth
+ Web.Twitter.Conduit.Monad: call :: (MonadResource m, FromJSON responseType) => APIRequest apiName responseType -> TW m responseType
+ Web.Twitter.Conduit.Monad: call' :: (MonadResource m, FromJSON value) => APIRequest apiName responseType -> TW m value
+ Web.Twitter.Conduit.Monad: callWithResponse :: (MonadResource m, FromJSON responseType) => APIRequest apiName responseType -> TW m (Response responseType)
+ Web.Twitter.Conduit.Monad: callWithResponse' :: (MonadResource m, FromJSON value) => APIRequest apiName responseType -> TW m (Response value)
+ Web.Twitter.Conduit.Monad: sourceWithCursor :: (MonadResource m, FromJSON responseType, CursorKey ck, HasCursorParam (APIRequest apiName (WithCursor ck responseType))) => APIRequest apiName (WithCursor ck responseType) -> Source (TW m) responseType
+ Web.Twitter.Conduit.Monad: sourceWithCursor' :: (MonadResource m, FromJSON responseType, CursorKey ck, HasCursorParam (APIRequest apiName (WithCursor ck responseType))) => APIRequest apiName (WithCursor ck responseType) -> Source (TW m) Value
+ Web.Twitter.Conduit.Monad: sourceWithMaxId :: (MonadResource m, FromJSON responseType, AsStatus responseType, HasMaxIdParam (APIRequest apiName [responseType])) => APIRequest apiName [responseType] -> Source (TW m) responseType
+ Web.Twitter.Conduit.Monad: sourceWithMaxId' :: (MonadResource m, HasMaxIdParam (APIRequest apiName [responseType])) => APIRequest apiName [responseType] -> Source (TW m) Value
+ Web.Twitter.Conduit.Monad: type TwitterBaseM m = MonadResource m
+ Web.Twitter.Conduit.Types: TWInfo :: TWToken -> Maybe Proxy -> TWInfo
+ Web.Twitter.Conduit.Types: TWToken :: OAuth -> Credential -> TWToken
+ Web.Twitter.Conduit.Types: data TWInfo
+ Web.Twitter.Conduit.Types: data TWToken
+ Web.Twitter.Conduit.Types: instance Default TWInfo
+ Web.Twitter.Conduit.Types: instance Default TWToken
+ Web.Twitter.Conduit.Types: instance Eq TWInfo
+ Web.Twitter.Conduit.Types: instance Eq TWToken
+ Web.Twitter.Conduit.Types: instance Show TWInfo
+ Web.Twitter.Conduit.Types: instance Show TWToken
+ Web.Twitter.Conduit.Types: setCredential :: OAuth -> Credential -> TWInfo -> TWInfo
+ Web.Twitter.Conduit.Types: twCredential :: TWToken -> Credential
+ Web.Twitter.Conduit.Types: twOAuth :: TWToken -> OAuth
+ Web.Twitter.Conduit.Types: twProxy :: TWInfo -> Maybe Proxy
+ Web.Twitter.Conduit.Types: twToken :: TWInfo -> TWToken
+ Web.Twitter.Conduit.Types: twitterOAuth :: OAuth
- Web.Twitter.Conduit: call :: (TwitterBaseM m, FromJSON responseType) => APIRequest apiName responseType -> TW m responseType
+ Web.Twitter.Conduit: call :: (MonadResource m, FromJSON responseType) => TWInfo -> Manager -> APIRequest apiName responseType -> m responseType
- Web.Twitter.Conduit: call' :: (TwitterBaseM m, FromJSON value) => APIRequest apiName responseType -> TW m value
+ Web.Twitter.Conduit: call' :: (MonadResource m, FromJSON value) => TWInfo -> Manager -> APIRequest apiName responseType -> m value
- Web.Twitter.Conduit: callWithResponse :: (TwitterBaseM m, FromJSON responseType) => APIRequest apiName responseType -> TW m (Response responseType)
+ Web.Twitter.Conduit: callWithResponse :: (MonadResource m, FromJSON responseType) => TWInfo -> Manager -> APIRequest apiName responseType -> m (Response responseType)
- Web.Twitter.Conduit: callWithResponse' :: (TwitterBaseM m, FromJSON value) => APIRequest apiName responseType -> TW m (Response value)
+ Web.Twitter.Conduit: callWithResponse' :: (MonadResource m, FromJSON value) => TWInfo -> Manager -> APIRequest apiName responseType -> m (Response value)
- Web.Twitter.Conduit: sourceWithCursor :: (TwitterBaseM m, FromJSON responseType, CursorKey ck, HasCursorParam (APIRequest apiName (WithCursor ck responseType))) => APIRequest apiName (WithCursor ck responseType) -> Source (TW m) responseType
+ Web.Twitter.Conduit: sourceWithCursor :: (MonadResource m, FromJSON responseType, CursorKey ck, HasCursorParam (APIRequest apiName (WithCursor ck responseType))) => TWInfo -> Manager -> APIRequest apiName (WithCursor ck responseType) -> Source m responseType
- Web.Twitter.Conduit: sourceWithCursor' :: (TwitterBaseM m, FromJSON responseType, CursorKey ck, HasCursorParam (APIRequest apiName (WithCursor ck responseType))) => APIRequest apiName (WithCursor ck responseType) -> Source (TW m) Value
+ Web.Twitter.Conduit: sourceWithCursor' :: (MonadResource m, FromJSON responseType, CursorKey ck, HasCursorParam (APIRequest apiName (WithCursor ck responseType))) => TWInfo -> Manager -> APIRequest apiName (WithCursor ck responseType) -> Source m Value
- Web.Twitter.Conduit: sourceWithMaxId :: (TwitterBaseM m, FromJSON responseType, AsStatus responseType, HasMaxIdParam (APIRequest apiName [responseType])) => APIRequest apiName [responseType] -> Source (TW m) responseType
+ Web.Twitter.Conduit: sourceWithMaxId :: (MonadResource m, FromJSON responseType, AsStatus responseType, HasMaxIdParam (APIRequest apiName [responseType])) => TWInfo -> Manager -> APIRequest apiName [responseType] -> Source m responseType
- Web.Twitter.Conduit: sourceWithMaxId' :: (TwitterBaseM m, HasMaxIdParam (APIRequest apiName [responseType])) => APIRequest apiName [responseType] -> Source (TW m) Value
+ Web.Twitter.Conduit: sourceWithMaxId' :: (MonadResource m, HasMaxIdParam (APIRequest apiName [responseType])) => TWInfo -> Manager -> APIRequest apiName [responseType] -> Source m Value
- Web.Twitter.Conduit: type TwitterBaseM m = (MonadResource m, MonadLogger m)
+ Web.Twitter.Conduit: type TwitterBaseM m = MonadResource m
- Web.Twitter.Conduit.Base: call :: (TwitterBaseM m, FromJSON responseType) => APIRequest apiName responseType -> TW m responseType
+ Web.Twitter.Conduit.Base: call :: (MonadResource m, FromJSON responseType) => TWInfo -> Manager -> APIRequest apiName responseType -> m responseType
- Web.Twitter.Conduit.Base: call' :: (TwitterBaseM m, FromJSON value) => APIRequest apiName responseType -> TW m value
+ Web.Twitter.Conduit.Base: call' :: (MonadResource m, FromJSON value) => TWInfo -> Manager -> APIRequest apiName responseType -> m value
- Web.Twitter.Conduit.Base: callWithResponse :: (TwitterBaseM m, FromJSON responseType) => APIRequest apiName responseType -> TW m (Response responseType)
+ Web.Twitter.Conduit.Base: callWithResponse :: (MonadResource m, FromJSON responseType) => TWInfo -> Manager -> APIRequest apiName responseType -> m (Response responseType)
- Web.Twitter.Conduit.Base: callWithResponse' :: (TwitterBaseM m, FromJSON value) => APIRequest apiName responseType -> TW m (Response value)
+ Web.Twitter.Conduit.Base: callWithResponse' :: (MonadResource m, FromJSON value) => TWInfo -> Manager -> APIRequest apiName responseType -> m (Response value)
- Web.Twitter.Conduit.Base: getResponse :: TwitterBaseM m => Request -> TW m (Response (ResumableSource (TW m) ByteString))
+ Web.Twitter.Conduit.Base: getResponse :: MonadResource m => TWInfo -> Manager -> Request -> m (Response (ResumableSource m ByteString))
- Web.Twitter.Conduit.Base: makeRequest :: (MonadThrow m, MonadIO m) => APIRequest apiName responseType -> m Request
+ Web.Twitter.Conduit.Base: makeRequest :: APIRequest apiName responseType -> IO Request
- Web.Twitter.Conduit.Base: sinkFromJSON :: (FromJSON a, MonadThrow m, MonadLogger m) => Consumer ByteString m a
+ Web.Twitter.Conduit.Base: sinkFromJSON :: (FromJSON a, MonadThrow m) => Consumer ByteString m a
- Web.Twitter.Conduit.Base: sinkJSON :: (MonadThrow m, MonadLogger m) => Consumer ByteString m Value
+ Web.Twitter.Conduit.Base: sinkJSON :: MonadThrow m => Consumer ByteString m Value
- Web.Twitter.Conduit.Base: sourceWithCursor :: (TwitterBaseM m, FromJSON responseType, CursorKey ck, HasCursorParam (APIRequest apiName (WithCursor ck responseType))) => APIRequest apiName (WithCursor ck responseType) -> Source (TW m) responseType
+ Web.Twitter.Conduit.Base: sourceWithCursor :: (MonadResource m, FromJSON responseType, CursorKey ck, HasCursorParam (APIRequest apiName (WithCursor ck responseType))) => TWInfo -> Manager -> APIRequest apiName (WithCursor ck responseType) -> Source m responseType
- Web.Twitter.Conduit.Base: sourceWithCursor' :: (TwitterBaseM m, FromJSON responseType, CursorKey ck, HasCursorParam (APIRequest apiName (WithCursor ck responseType))) => APIRequest apiName (WithCursor ck responseType) -> Source (TW m) Value
+ Web.Twitter.Conduit.Base: sourceWithCursor' :: (MonadResource m, FromJSON responseType, CursorKey ck, HasCursorParam (APIRequest apiName (WithCursor ck responseType))) => TWInfo -> Manager -> APIRequest apiName (WithCursor ck responseType) -> Source m Value
- Web.Twitter.Conduit.Base: sourceWithMaxId :: (TwitterBaseM m, FromJSON responseType, AsStatus responseType, HasMaxIdParam (APIRequest apiName [responseType])) => APIRequest apiName [responseType] -> Source (TW m) responseType
+ Web.Twitter.Conduit.Base: sourceWithMaxId :: (MonadResource m, FromJSON responseType, AsStatus responseType, HasMaxIdParam (APIRequest apiName [responseType])) => TWInfo -> Manager -> APIRequest apiName [responseType] -> Source m responseType
- Web.Twitter.Conduit.Base: sourceWithMaxId' :: (TwitterBaseM m, HasMaxIdParam (APIRequest apiName [responseType])) => APIRequest apiName [responseType] -> Source (TW m) Value
+ Web.Twitter.Conduit.Base: sourceWithMaxId' :: (MonadResource m, HasMaxIdParam (APIRequest apiName [responseType])) => TWInfo -> Manager -> APIRequest apiName [responseType] -> Source m Value
- Web.Twitter.Conduit.Base: type TwitterBaseM m = (MonadResource m, MonadLogger m)
+ Web.Twitter.Conduit.Base: type TwitterBaseM m = MonadResource m
- Web.Twitter.Conduit.Parameters: class Parameters a_akAy => HasContributorDetailsParam a_akAy where contributorDetails = wrappedParam "contributor_details" PVBool unPVBool
+ Web.Twitter.Conduit.Parameters: class Parameters a_albG => HasContributorDetailsParam a_albG where contributorDetails = wrappedParam "contributor_details" PVBool unPVBool
- Web.Twitter.Conduit.Parameters: class Parameters a_akvA => HasCountParam a_akvA where count = wrappedParam "count" PVInteger unPVInteger
+ Web.Twitter.Conduit.Parameters: class Parameters a_al6I => HasCountParam a_al6I where count = wrappedParam "count" PVInteger unPVInteger
- Web.Twitter.Conduit.Parameters: class Parameters a_akyq => HasCursorParam a_akyq where cursor = wrappedParam "cursor" PVInteger unPVInteger
+ Web.Twitter.Conduit.Parameters: class Parameters a_al9y => HasCursorParam a_al9y where cursor = wrappedParam "cursor" PVInteger unPVInteger
- Web.Twitter.Conduit.Parameters: class Parameters a_akEO => HasDisplayCoordinatesParam a_akEO where displayCoordinates = wrappedParam "display_coordinates" PVBool unPVBool
+ Web.Twitter.Conduit.Parameters: class Parameters a_alfW => HasDisplayCoordinatesParam a_alfW where displayCoordinates = wrappedParam "display_coordinates" PVBool unPVBool
- Web.Twitter.Conduit.Parameters: class Parameters a_akzQ => HasExcludeRepliesParam a_akzQ where excludeReplies = wrappedParam "exclude_replies" PVBool unPVBool
+ Web.Twitter.Conduit.Parameters: class Parameters a_alaY => HasExcludeRepliesParam a_alaY where excludeReplies = wrappedParam "exclude_replies" PVBool unPVBool
- Web.Twitter.Conduit.Parameters: class Parameters a_akIm => HasFilterLevelParam a_akIm where filterLevel = wrappedParam "filter_level" PVString unPVString
+ Web.Twitter.Conduit.Parameters: class Parameters a_alju => HasFilterLevelParam a_alju where filterLevel = wrappedParam "filter_level" PVString unPVString
- Web.Twitter.Conduit.Parameters: class Parameters a_akLU => HasFollowParam a_akLU where follow = wrappedParam "follow" PVBool unPVBool
+ Web.Twitter.Conduit.Parameters: class Parameters a_aln2 => HasFollowParam a_aln2 where follow = wrappedParam "follow" PVBool unPVBool
- Web.Twitter.Conduit.Parameters: class Parameters a_akE6 => HasInReplyToStatusIdParam a_akE6 where inReplyToStatusId = wrappedParam "in_reply_to_status_id" PVInteger unPVInteger
+ Web.Twitter.Conduit.Parameters: class Parameters a_alfe => HasInReplyToStatusIdParam a_alfe where inReplyToStatusId = wrappedParam "in_reply_to_status_id" PVInteger unPVInteger
- Web.Twitter.Conduit.Parameters: class Parameters a_akBg => HasIncludeEntitiesParam a_akBg where includeEntities = wrappedParam "include_entities" PVBool unPVBool
+ Web.Twitter.Conduit.Parameters: class Parameters a_alco => HasIncludeEntitiesParam a_alco where includeEntities = wrappedParam "include_entities" PVBool unPVBool
- Web.Twitter.Conduit.Parameters: class Parameters a_akDo => HasIncludeMyRetweetParam a_akDo where includeMyRetweet = wrappedParam "include_my_retweet" PVBool unPVBool
+ Web.Twitter.Conduit.Parameters: class Parameters a_alew => HasIncludeMyRetweetParam a_alew where includeMyRetweet = wrappedParam "include_my_retweet" PVBool unPVBool
- Web.Twitter.Conduit.Parameters: class Parameters a_akCG => HasIncludeRtsParam a_akCG where includeRts = wrappedParam "include_rts" PVBool unPVBool
+ Web.Twitter.Conduit.Parameters: class Parameters a_aldO => HasIncludeRtsParam a_aldO where includeRts = wrappedParam "include_rts" PVBool unPVBool
- Web.Twitter.Conduit.Parameters: class Parameters a_akBY => HasIncludeUserEntitiesParam a_akBY where includeUserEntities = wrappedParam "include_user_entities" PVBool unPVBool
+ Web.Twitter.Conduit.Parameters: class Parameters a_ald6 => HasIncludeUserEntitiesParam a_ald6 where includeUserEntities = wrappedParam "include_user_entities" PVBool unPVBool
- Web.Twitter.Conduit.Parameters: class Parameters a_akGe => HasLangParam a_akGe where lang = wrappedParam "lang" PVString unPVString
+ Web.Twitter.Conduit.Parameters: class Parameters a_alhm => HasLangParam a_alhm where lang = wrappedParam "lang" PVString unPVString
- Web.Twitter.Conduit.Parameters: class Parameters a_akGW => HasLanguageParam a_akGW where language = wrappedParam "language" PVString unPVString
+ Web.Twitter.Conduit.Parameters: class Parameters a_ali4 => HasLanguageParam a_ali4 where language = wrappedParam "language" PVString unPVString
- Web.Twitter.Conduit.Parameters: class Parameters a_akHE => HasLocaleParam a_akHE where locale = wrappedParam "locale" PVString unPVString
+ Web.Twitter.Conduit.Parameters: class Parameters a_aliM => HasLocaleParam a_aliM where locale = wrappedParam "locale" PVString unPVString
- Web.Twitter.Conduit.Parameters: class Parameters a_akMC => HasMapParam a_akMC where map = wrappedParam "map" PVBool unPVBool
+ Web.Twitter.Conduit.Parameters: class Parameters a_alnK => HasMapParam a_alnK where map = wrappedParam "map" PVBool unPVBool
- Web.Twitter.Conduit.Parameters: class Parameters a_akx0 => HasMaxIdParam a_akx0 where maxId = wrappedParam "max_id" PVInteger unPVInteger
+ Web.Twitter.Conduit.Parameters: class Parameters a_al88 => HasMaxIdParam a_al88 where maxId = wrappedParam "max_id" PVInteger unPVInteger
- Web.Twitter.Conduit.Parameters: class Parameters a_akNk => HasMediaIdsParam a_akNk where mediaIds = wrappedParam "media_ids" PVIntegerArray unPVIntegerArray
+ Web.Twitter.Conduit.Parameters: class Parameters a_alos => HasMediaIdsParam a_alos where mediaIds = wrappedParam "media_ids" PVIntegerArray unPVIntegerArray
- Web.Twitter.Conduit.Parameters: class Parameters a_akxI => HasPageParam a_akxI where page = wrappedParam "page" PVInteger unPVInteger
+ Web.Twitter.Conduit.Parameters: class Parameters a_al8Q => HasPageParam a_al8Q where page = wrappedParam "page" PVInteger unPVInteger
- Web.Twitter.Conduit.Parameters: class Parameters a_akFw => HasPossiblySensitiveParam a_akFw where possiblySensitive = wrappedParam "possibly_sensitive" PVBool unPVBool
+ Web.Twitter.Conduit.Parameters: class Parameters a_algE => HasPossiblySensitiveParam a_algE where possiblySensitive = wrappedParam "possibly_sensitive" PVBool unPVBool
- Web.Twitter.Conduit.Parameters: class Parameters a_akJM => HasRepliesParam a_akJM where replies = wrappedParam "replies" PVString unPVString
+ Web.Twitter.Conduit.Parameters: class Parameters a_alkU => HasRepliesParam a_alkU where replies = wrappedParam "replies" PVString unPVString
- Web.Twitter.Conduit.Parameters: class Parameters a_akwi => HasSinceIdParam a_akwi where sinceId = wrappedParam "since_id" PVInteger unPVInteger
+ Web.Twitter.Conduit.Parameters: class Parameters a_al7q => HasSinceIdParam a_al7q where sinceId = wrappedParam "since_id" PVInteger unPVInteger
- Web.Twitter.Conduit.Parameters: class Parameters a_akLc => HasSkipStatusParam a_akLc where skipStatus = wrappedParam "skip_status" PVBool unPVBool
+ Web.Twitter.Conduit.Parameters: class Parameters a_almk => HasSkipStatusParam a_almk where skipStatus = wrappedParam "skip_status" PVBool unPVBool
- Web.Twitter.Conduit.Parameters: class Parameters a_akJ4 => HasStallWarningsParam a_akJ4 where stallWarnings = wrappedParam "stall_warnings" PVBool unPVBool
+ Web.Twitter.Conduit.Parameters: class Parameters a_alkc => HasStallWarningsParam a_alkc where stallWarnings = wrappedParam "stall_warnings" PVBool unPVBool
- Web.Twitter.Conduit.Parameters: class Parameters a_akz8 => HasTrimUserParam a_akz8 where trimUser = wrappedParam "trim_user" PVBool unPVBool
+ Web.Twitter.Conduit.Parameters: class Parameters a_alag => HasTrimUserParam a_alag where trimUser = wrappedParam "trim_user" PVBool unPVBool
- Web.Twitter.Conduit.Parameters: class Parameters a_akKu => HasUntilParam a_akKu where until = wrappedParam "until" PVDay unPVDay
+ Web.Twitter.Conduit.Parameters: class Parameters a_allC => HasUntilParam a_allC where until = wrappedParam "until" PVDay unPVDay
- Web.Twitter.Conduit.Parameters: contributorDetails :: HasContributorDetailsParam a_akAy => Lens' a_akAy (Maybe Bool)
+ Web.Twitter.Conduit.Parameters: contributorDetails :: HasContributorDetailsParam a_albG => Lens' a_albG (Maybe Bool)
- Web.Twitter.Conduit.Parameters: count :: HasCountParam a_akvA => Lens' a_akvA (Maybe Integer)
+ Web.Twitter.Conduit.Parameters: count :: HasCountParam a_al6I => Lens' a_al6I (Maybe Integer)
- Web.Twitter.Conduit.Parameters: cursor :: HasCursorParam a_akyq => Lens' a_akyq (Maybe Integer)
+ Web.Twitter.Conduit.Parameters: cursor :: HasCursorParam a_al9y => Lens' a_al9y (Maybe Integer)
- Web.Twitter.Conduit.Parameters: displayCoordinates :: HasDisplayCoordinatesParam a_akEO => Lens' a_akEO (Maybe Bool)
+ Web.Twitter.Conduit.Parameters: displayCoordinates :: HasDisplayCoordinatesParam a_alfW => Lens' a_alfW (Maybe Bool)
- Web.Twitter.Conduit.Parameters: excludeReplies :: HasExcludeRepliesParam a_akzQ => Lens' a_akzQ (Maybe Bool)
+ Web.Twitter.Conduit.Parameters: excludeReplies :: HasExcludeRepliesParam a_alaY => Lens' a_alaY (Maybe Bool)
- Web.Twitter.Conduit.Parameters: filterLevel :: HasFilterLevelParam a_akIm => Lens' a_akIm (Maybe Text)
+ Web.Twitter.Conduit.Parameters: filterLevel :: HasFilterLevelParam a_alju => Lens' a_alju (Maybe Text)
- Web.Twitter.Conduit.Parameters: follow :: HasFollowParam a_akLU => Lens' a_akLU (Maybe Bool)
+ Web.Twitter.Conduit.Parameters: follow :: HasFollowParam a_aln2 => Lens' a_aln2 (Maybe Bool)
- Web.Twitter.Conduit.Parameters: inReplyToStatusId :: HasInReplyToStatusIdParam a_akE6 => Lens' a_akE6 (Maybe Integer)
+ Web.Twitter.Conduit.Parameters: inReplyToStatusId :: HasInReplyToStatusIdParam a_alfe => Lens' a_alfe (Maybe Integer)
- Web.Twitter.Conduit.Parameters: includeEntities :: HasIncludeEntitiesParam a_akBg => Lens' a_akBg (Maybe Bool)
+ Web.Twitter.Conduit.Parameters: includeEntities :: HasIncludeEntitiesParam a_alco => Lens' a_alco (Maybe Bool)
- Web.Twitter.Conduit.Parameters: includeMyRetweet :: HasIncludeMyRetweetParam a_akDo => Lens' a_akDo (Maybe Bool)
+ Web.Twitter.Conduit.Parameters: includeMyRetweet :: HasIncludeMyRetweetParam a_alew => Lens' a_alew (Maybe Bool)
- Web.Twitter.Conduit.Parameters: includeRts :: HasIncludeRtsParam a_akCG => Lens' a_akCG (Maybe Bool)
+ Web.Twitter.Conduit.Parameters: includeRts :: HasIncludeRtsParam a_aldO => Lens' a_aldO (Maybe Bool)
- Web.Twitter.Conduit.Parameters: includeUserEntities :: HasIncludeUserEntitiesParam a_akBY => Lens' a_akBY (Maybe Bool)
+ Web.Twitter.Conduit.Parameters: includeUserEntities :: HasIncludeUserEntitiesParam a_ald6 => Lens' a_ald6 (Maybe Bool)
- Web.Twitter.Conduit.Parameters: lang :: HasLangParam a_akGe => Lens' a_akGe (Maybe Text)
+ Web.Twitter.Conduit.Parameters: lang :: HasLangParam a_alhm => Lens' a_alhm (Maybe Text)
- Web.Twitter.Conduit.Parameters: language :: HasLanguageParam a_akGW => Lens' a_akGW (Maybe Text)
+ Web.Twitter.Conduit.Parameters: language :: HasLanguageParam a_ali4 => Lens' a_ali4 (Maybe Text)
- Web.Twitter.Conduit.Parameters: locale :: HasLocaleParam a_akHE => Lens' a_akHE (Maybe Text)
+ Web.Twitter.Conduit.Parameters: locale :: HasLocaleParam a_aliM => Lens' a_aliM (Maybe Text)
- Web.Twitter.Conduit.Parameters: map :: HasMapParam a_akMC => Lens' a_akMC (Maybe Bool)
+ Web.Twitter.Conduit.Parameters: map :: HasMapParam a_alnK => Lens' a_alnK (Maybe Bool)
- Web.Twitter.Conduit.Parameters: maxId :: HasMaxIdParam a_akx0 => Lens' a_akx0 (Maybe Integer)
+ Web.Twitter.Conduit.Parameters: maxId :: HasMaxIdParam a_al88 => Lens' a_al88 (Maybe Integer)
- Web.Twitter.Conduit.Parameters: mediaIds :: HasMediaIdsParam a_akNk => Lens' a_akNk (Maybe [Integer])
+ Web.Twitter.Conduit.Parameters: mediaIds :: HasMediaIdsParam a_alos => Lens' a_alos (Maybe [Integer])
- Web.Twitter.Conduit.Parameters: page :: HasPageParam a_akxI => Lens' a_akxI (Maybe Integer)
+ Web.Twitter.Conduit.Parameters: page :: HasPageParam a_al8Q => Lens' a_al8Q (Maybe Integer)
- Web.Twitter.Conduit.Parameters: possiblySensitive :: HasPossiblySensitiveParam a_akFw => Lens' a_akFw (Maybe Bool)
+ Web.Twitter.Conduit.Parameters: possiblySensitive :: HasPossiblySensitiveParam a_algE => Lens' a_algE (Maybe Bool)
- Web.Twitter.Conduit.Parameters: replies :: HasRepliesParam a_akJM => Lens' a_akJM (Maybe Text)
+ Web.Twitter.Conduit.Parameters: replies :: HasRepliesParam a_alkU => Lens' a_alkU (Maybe Text)
- Web.Twitter.Conduit.Parameters: sinceId :: HasSinceIdParam a_akwi => Lens' a_akwi (Maybe Integer)
+ Web.Twitter.Conduit.Parameters: sinceId :: HasSinceIdParam a_al7q => Lens' a_al7q (Maybe Integer)
- Web.Twitter.Conduit.Parameters: skipStatus :: HasSkipStatusParam a_akLc => Lens' a_akLc (Maybe Bool)
+ Web.Twitter.Conduit.Parameters: skipStatus :: HasSkipStatusParam a_almk => Lens' a_almk (Maybe Bool)
- Web.Twitter.Conduit.Parameters: stallWarnings :: HasStallWarningsParam a_akJ4 => Lens' a_akJ4 (Maybe Bool)
+ Web.Twitter.Conduit.Parameters: stallWarnings :: HasStallWarningsParam a_alkc => Lens' a_alkc (Maybe Bool)
- Web.Twitter.Conduit.Parameters: trimUser :: HasTrimUserParam a_akz8 => Lens' a_akz8 (Maybe Bool)
+ Web.Twitter.Conduit.Parameters: trimUser :: HasTrimUserParam a_alag => Lens' a_alag (Maybe Bool)
- Web.Twitter.Conduit.Parameters: until :: HasUntilParam a_akKu => Lens' a_akKu (Maybe Day)
+ Web.Twitter.Conduit.Parameters: until :: HasUntilParam a_allC => Lens' a_allC (Maybe Day)
- Web.Twitter.Conduit.Stream: stream :: (TwitterBaseM m, FromJSON responseType) => APIRequest apiName responseType -> TW m (ResumableSource (TW m) responseType)
+ Web.Twitter.Conduit.Stream: stream :: (MonadResource m, FromJSON responseType) => TWInfo -> Manager -> APIRequest apiName responseType -> m (ResumableSource m responseType)
- Web.Twitter.Conduit.Stream: stream' :: (TwitterBaseM m, FromJSON value) => APIRequest apiName responseType -> TW m (ResumableSource (TW m) value)
+ Web.Twitter.Conduit.Stream: stream' :: (MonadResource m, FromJSON value) => TWInfo -> Manager -> APIRequest apiName responseType -> m (ResumableSource m value)

Files

Web/Twitter/Conduit.hs view
@@ -19,12 +19,12 @@        -- * Re-exports          module Web.Twitter.Conduit.Api        , module Web.Twitter.Conduit.Cursor-       , module Web.Twitter.Conduit.Monad        , module Web.Twitter.Conduit.Parameters        , module Web.Twitter.Conduit.Request        , module Web.Twitter.Conduit.Response        , module Web.Twitter.Conduit.Status        , module Web.Twitter.Conduit.Stream+       , module Web.Twitter.Conduit.Types         -- * 'Web.Twitter.Conduit.Base'        , TwitterBaseM@@ -37,27 +37,19 @@        , sourceWithCursor        , sourceWithCursor' -#if !MIN_VERSION_twitter_types(0,5,0)-       , UploadedMedia-       , mediaId-       , mediaSize-       , mediaImage-       , ImageSizeType-       , imageWidth-       , imageHeight-       , imageType-#endif+       -- * Backward compativility+       -- $backward        ) where  import Web.Twitter.Conduit.Api import Web.Twitter.Conduit.Base import Web.Twitter.Conduit.Cursor-import Web.Twitter.Conduit.Monad import Web.Twitter.Conduit.Parameters import Web.Twitter.Conduit.Request import Web.Twitter.Conduit.Response import Web.Twitter.Conduit.Status import Web.Twitter.Conduit.Stream+import Web.Twitter.Conduit.Types  -- for haddock import Web.Authenticate.OAuth@@ -65,7 +57,6 @@ import qualified Data.Conduit.List as CL import qualified Data.Text as T import qualified Data.Text.IO as T-import Control.Monad.Logger import Control.Monad.IO.Class import Control.Lens @@ -84,13 +75,13 @@ -- > {-# LANGUAGE OverloadedStrings #-} -- > -- > import Web.Twitter.Conduit--- > import Web.Twitter.Types+-- > import Web.Twitter.Types.Lens -- > import Web.Authenticate.OAuth+-- > import Network.HTTP.Conduit -- > import Data.Conduit -- > import qualified Data.Conduit.List as CL -- > import qualified Data.Text as T -- > import qualified Data.Text.IO as T--- > import Control.Monad.Logger -- > import Control.Monad.IO.Class -- > import Control.Lens --@@ -137,15 +128,12 @@ -- -- > twInfo = setCredential tokens credential def ----- Every twitter API functions are run in the 'TW' monad.--- By using 'runTW' function, you can perform computation in 'TW' monad.--- -- Twitter API requests are performed by 'call' function. -- For example, <https://dev.twitter.com/docs/api/1.1/get/statuses/home_timeline GET statuses/home_timeline> -- could be obtained by: -- -- @--- timeline <- 'call' 'homeTimeline'+-- timeline \<- 'withManager' $ \\mgr -\> 'call' twInfo mgr 'homeTimeline' -- @ -- -- The response of 'call' function is wrapped by the suitable type of@@ -158,7 +146,7 @@ -- includes 20 tweets, and you can change the number of tweets by the /count/ parameter. -- -- @--- timeline <- 'call' '$' 'homeTimeline' '&' 'count' '?~' 200+-- timeline \<- 'withManager' $ \\mgr -\> 'call' twInfo mgr '$' 'homeTimeline' '&' 'count' '?~' 200 -- @ -- -- If you need more statuses, you can obtain those with multiple API requests.@@ -168,7 +156,7 @@ -- or use the conduit wrapper 'sourceWithCursor' as below: -- -- @--- friends <- 'sourceWithCursor' ('friendsList' ('ScreenNameParam' \"thimura\") '&' 'count' '?~' 200) '$$' 'CL.consume'+-- friends \<- 'withManager' $ \\mgr -\> 'sourceWithCursor' twInfo mgr ('friendsList' ('ScreenNameParam' \"thimura\") '&' 'count' '?~' 200) '$$' 'CL.consume' -- @ -- -- Statuses APIs, for instance, 'homeTimeline', are also wrapped by 'sourceWithMaxId'.@@ -177,8 +165,8 @@ -- -- @ -- main :: IO ()--- main = runNoLoggingT . runTW twInfo $ do---     'sourceWithMaxId' 'homeTimeline'+-- main = withManager $ \mgr -> do+--     'sourceWithMaxId' twInfo mgr 'homeTimeline' --         $= CL.isolate 60 --         $$ CL.mapM_ $ \status -> liftIO $ do --             T.putStrLn $ T.concat [ T.pack . show $ status ^. statusId@@ -188,3 +176,10 @@ --                                   , status ^. statusText --                                   ] -- @++-- $backward+--+-- In the version below 0.1.0, twitter-conduit provides the TW monad,+-- and every Twitter API functions are run in the TW monad.+--+-- For backward compatibility, TW monad and the functions are provided in the Web.Twitter.Conduit.Monad module.
Web/Twitter/Conduit/Api.hs view
@@ -195,7 +195,7 @@ -- You can perform a query using 'call': -- -- @--- res <- 'call' '$' 'directMessages' '&' 'count' '?~' 100+-- res <- 'call' twInfo mgr '$' 'directMessages' '&' 'count' '?~' 100 -- @ -- -- >>> directMessages@@ -218,7 +218,7 @@ -- You can perform a query using 'call': -- -- @--- res <- 'call' '$' 'directMessagesSent' '&' 'count' '?~' 100+-- res <- 'call' twInfo mgr '$' 'directMessagesSent' '&' 'count' '?~' 100 -- @ -- -- >>> directMessagesSent@@ -242,7 +242,7 @@ -- You can perform a query using 'call': -- -- @--- res <- 'call' '$' 'directMessagesShow' 1234567890+-- res <- 'call' twInfo mgr '$' 'directMessagesShow' 1234567890 -- @ -- -- >>> directMessagesShow 1234567890@@ -256,7 +256,7 @@ -- You can perform a query using 'call': -- -- @--- res <- 'call' '$' 'directMessagesDestroy' 1234567890+-- res <- 'call' twInfo mgr '$' 'directMessagesDestroy' 1234567890 -- @ -- -- >>> directMessagesDestroy 1234567890@@ -273,7 +273,7 @@ -- You can perform a post using 'call': -- -- @--- res <- 'call' '$' 'directMessagesNew' (ScreenNameParam \"thimura\") \"Hello DM\"+-- res <- 'call' twInfo mgr '$' 'directMessagesNew' (ScreenNameParam \"thimura\") \"Hello DM\" -- @ -- -- >>> directMessagesNew (ScreenNameParam "thimura") "Hello DM"@@ -289,7 +289,7 @@ -- You can perform a request using 'call': -- -- @--- res <- 'call' '$' 'friendshipsNoRetweetsIds'+-- res <- 'call' twInfo mgr '$' 'friendshipsNoRetweetsIds' -- @ -- -- >>> friendshipsNoRetweetsIds@@ -303,7 +303,7 @@ -- You can perform a query using 'call': -- -- @--- res <- 'call' '$' 'friendsIds' ('ScreenNameParam' \"thimura\")+-- res <- 'call' twInfo mgr '$' 'friendsIds' ('ScreenNameParam' \"thimura\") -- @ -- -- Or, you can iterate with 'sourceWithCursor':@@ -330,7 +330,7 @@ -- You can perform a query using 'call': -- -- @--- res <- 'call' '$' 'followersIds' ('ScreenNameParam' \"thimura\")+-- res <- 'call' twInfo mgr '$' 'followersIds' ('ScreenNameParam' \"thimura\") -- @ -- -- Or, you can iterate with 'sourceWithCursor':@@ -357,7 +357,7 @@ -- You can perform a request by using 'call': -- -- @--- res <- 'call' '$' 'friendshipsIncoming'+-- res <- 'call' twInfo mgr '$' 'friendshipsIncoming' -- @ -- -- Or, you can iterate with 'sourceWithCursor':@@ -381,7 +381,7 @@ -- You can perform a request by using 'call': -- -- @--- res <- 'call' '$' 'friendshipsOutgoing'+-- res <- 'call' twInfo mgr '$' 'friendshipsOutgoing' -- @ -- -- Or, you can iterate with 'sourceWithCursor':@@ -405,7 +405,7 @@ -- You can perform request by using 'call': -- -- @--- res <- 'call' '$' 'friendshipsCreate' ('ScreenNameParam' \"thimura\")+-- res <- 'call' twInfo mgr '$' 'friendshipsCreate' ('ScreenNameParam' \"thimura\") -- @ -- -- >>> friendshipsCreate (ScreenNameParam "thimura")@@ -424,7 +424,7 @@ -- You can perform request by using 'call': -- -- @--- res <- 'call' '$' 'friendshipsDestroy' ('ScreenNameParam' \"thimura\")+-- res <- 'call' twInfo mgr '$' 'friendshipsDestroy' ('ScreenNameParam' \"thimura\") -- @ -- -- >>> friendshipsDestroy (ScreenNameParam "thimura")@@ -440,7 +440,7 @@ -- You can perform request by using 'call': -- -- @--- res <- 'call' '$' 'friendsList' ('ScreenNameParam' \"thimura\")+-- res <- 'call' twInfo mgr '$' 'friendsList' ('ScreenNameParam' \"thimura\") -- @ -- -- Or, you can iterate with 'sourceWithCursor':@@ -468,7 +468,7 @@ -- You can perform request by using 'call': -- -- @--- res <- 'call' '$' 'followersList' ('ScreenNameParam' \"thimura\")+-- res <- 'call' twInfo mgr '$' 'followersList' ('ScreenNameParam' \"thimura\") -- @ -- -- Or, you can iterate with 'sourceWithCursor':@@ -496,7 +496,7 @@ -- You can perform request by using 'call': -- -- @--- res <- 'call' '$' 'accountVerifyCredentials'+-- res <- 'call' twInfo mgr '$' 'accountVerifyCredentials' -- @ -- -- >>> accountVerifyCredentials@@ -514,7 +514,7 @@ -- You can perform request by using 'call': -- -- @--- res <- 'call' '$' 'usersLookup' ('ScreenNameListParam' [\"thimura\", \"twitterapi\"])+-- res <- 'call' twInfo mgr '$' 'usersLookup' ('ScreenNameListParam' [\"thimura\", \"twitterapi\"]) -- @ -- -- >>> usersLookup (ScreenNameListParam ["thimura", "twitterapi"])@@ -531,7 +531,7 @@ -- You can perform request by using 'call': -- -- @--- res <- 'call' '$' 'usersShow' ('ScreenNameParam' \"thimura\")+-- res <- 'call' twInfo mgr '$' 'usersShow' ('ScreenNameParam' \"thimura\") -- @ -- -- >>> usersShow (ScreenNameParam "thimura")@@ -548,7 +548,7 @@ -- You can perform request by using 'call': -- -- @--- res <- 'call' '$' 'favoritesList' (ScreenNameParam \"thimura\")+-- res <- 'call' twInfo mgr '$' 'favoritesList' (ScreenNameParam \"thimura\") -- @ -- -- >>> favoritesList Nothing@@ -575,7 +575,7 @@ -- You can perform request by using 'call': -- -- @--- res <- 'call' '$' 'favoritesCreate' 1234567890+-- res <- 'call' twInfo mgr '$' 'favoritesCreate' 1234567890 -- @ -- -- >>> favoritesCreate 1234567890@@ -592,7 +592,7 @@ -- You can perform request by using 'call': -- -- @--- res <- 'call' '$' 'favoritesDestroy' 1234567890+-- res <- 'call' twInfo mgr '$' 'favoritesDestroy' 1234567890 -- @ -- -- >>> favoritesDestroy 1234567890@@ -609,7 +609,7 @@ -- You can perform request by using 'call': -- -- @--- res <- 'call' '$' 'listsStatuses' ('ListNameParam' "thimura/haskell")+-- res <- 'call' twInfo mgr '$' 'listsStatuses' ('ListNameParam' "thimura/haskell") -- @ -- -- If you need more statuses, you can obtain those by using 'sourceWithMaxId':@@ -637,7 +637,7 @@ -- You can perform request by using 'call': -- -- @--- res <- 'call' '$' 'listsMembersDestroy' ('ListNameParam' "thimura/haskell") ('ScreenNameParam' "thimura")+-- res <- 'call' twInfo mgr '$' 'listsMembersDestroy' ('ListNameParam' "thimura/haskell") ('ScreenNameParam' "thimura") -- @ -- -- >>> listsMembersDestroy (ListNameParam "thimura/haskell") (ScreenNameParam "thimura")@@ -654,7 +654,7 @@ -- You can perform request by using 'call': -- -- @--- res <- 'call' '$' 'listsMemberships' ('ListNameParam' "thimura/haskell")+-- res <- 'call' twInfo mgr '$' 'listsMemberships' ('ListNameParam' "thimura/haskell") -- @ -- -- >>> listsMemberships Nothing@@ -676,7 +676,7 @@ -- You can perform request by using 'call': -- -- @--- res <- 'call' '$' 'listsSubscribers' ('ListNameParam' "thimura/haskell")+-- res <- 'call' twInfo mgr '$' 'listsSubscribers' ('ListNameParam' "thimura/haskell") -- @ -- -- >>> listsSubscribers (ListNameParam "thimura/haskell")@@ -697,7 +697,7 @@ -- You can perform request by using 'call': -- -- @--- res <- 'call' '$' 'listsSubscriptions' ('ListNameParam' "thimura/haskell")+-- res <- 'call' twInfo mgr '$' 'listsSubscriptions' ('ListNameParam' "thimura/haskell") -- @ -- -- >>> listsSubscriptions Nothing@@ -719,7 +719,7 @@ -- You can perform request by using 'call': -- -- @--- res <- 'call' '$' 'listsOwnerships' ('ListNameParam' "thimura/haskell")+-- res <- 'call' twInfo mgr '$' 'listsOwnerships' ('ListNameParam' "thimura/haskell") -- @ -- -- >>> listsOwnerships Nothing@@ -741,7 +741,7 @@ -- You can perform request by using 'call': -- -- @--- res <- 'call' '$' 'listsMembers' ('ListNameParam' "thimura/haskell")+-- res <- 'call' twInfo mgr '$' 'listsMembers' ('ListNameParam' "thimura/haskell") -- @ -- -- >>> listsMembers (ListNameParam "thimura/haskell")@@ -761,7 +761,7 @@ -- You can perform request by using 'call': -- -- @--- res <- 'call' '$' 'listsMembersCreate' ('ListNameParam' "thimura/haskell") ('ScreenNameParam' "thimura")+-- res <- 'call' twInfo mgr '$' 'listsMembersCreate' ('ListNameParam' "thimura/haskell") ('ScreenNameParam' "thimura") -- @ -- -- >>> listsMembersCreate (ListNameParam "thimura/haskell") (ScreenNameParam "thimura")@@ -777,7 +777,7 @@ -- You can perform request by using 'call': -- -- @--- res <- 'call' '$' 'listsDestroy' ('ListNameParam' "thimura/haskell")+-- res <- 'call' twInfo mgr '$' 'listsDestroy' ('ListNameParam' "thimura/haskell") -- @ -- -- >>> listsDestroy (ListNameParam "thimura/haskell")@@ -793,7 +793,7 @@ -- You can perform request by using 'call': -- -- @--- res <- 'call' '$' 'listsUpdate' ('ListNameParam' "thimura/haskell") True (Just "Haskellers")+-- res <- 'call' twInfo mgr '$' 'listsUpdate' ('ListNameParam' "thimura/haskell") True (Just "Haskellers") -- @ -- -- >>> listsUpdate (ListNameParam "thimura/haskell") True (Just "Haskellers")@@ -815,7 +815,7 @@ -- You can perform request by using 'call': -- -- @--- res <- 'call' '$' 'listsCreate' ('ListNameParam' "thimura/haskell")+-- res <- 'call' twInfo mgr '$' 'listsCreate' ('ListNameParam' "thimura/haskell") -- @ -- -- >>> listsCreate "haskell" True Nothing@@ -841,7 +841,7 @@ -- You can perform request by using 'call': -- -- @--- res <- 'call' '$' 'listsShow' ('ListNameParam' "thimura/haskell")+-- res <- 'call' twInfo mgr '$' 'listsShow' ('ListNameParam' "thimura/haskell") -- @ -- -- >>> listsShow (ListNameParam "thimura/haskell")@@ -859,14 +859,14 @@ -- First, you should upload media with 'mediaUpload': -- -- @--- res1 <- 'call' '$' 'mediaUpload' ('MediaFromFile' \"\/path\/to\/upload\/file1.png\")--- res2 <- 'call' '$' 'mediaUpload' ('MediaRequestBody' \"file2.png\" \"[.. file body ..]\")+-- res1 <- 'call' twInfo mgr '$' 'mediaUpload' ('MediaFromFile' \"\/path\/to\/upload\/file1.png\")+-- res2 <- 'call' twInfo mgr '$' 'mediaUpload' ('MediaRequestBody' \"file2.png\" \"[.. file body ..]\") -- @ -- -- and then collect the resulting media IDs and update your status by calling 'update': -- -- @--- 'call' '$' 'update' \"Hello World\" '&' 'mediaIds' '?~' ['mediaId' res1, 'mediaId' res2]+-- 'call' twInfo mgr '$' 'update' \"Hello World\" '&' 'mediaIds' '?~' ['mediaId' res1, 'mediaId' res2] -- @ -- -- See: <https://dev.twitter.com/docs/api/multiple-media-extended-entities>
Web/Twitter/Conduit/Base.hs view
@@ -1,12 +1,10 @@ {-# LANGUAGE OverloadedStrings #-} {-# LANGUAGE FlexibleContexts #-}-{-# LANGUAGE TemplateHaskell #-} {-# LANGUAGE ConstraintKinds #-} {-# LANGUAGE RecordWildCards #-}  module Web.Twitter.Conduit.Base-       ( api-       , getResponse+       ( getResponse        , call        , call'        , callWithResponse@@ -21,43 +19,37 @@        , makeRequest        , sinkJSON        , sinkFromJSON-       , showBS        ) where -import Web.Twitter.Conduit.Monad+import Web.Twitter.Conduit.Cursor import Web.Twitter.Conduit.Parameters import Web.Twitter.Conduit.Request import Web.Twitter.Conduit.Response-import Web.Twitter.Conduit.Cursor+import Web.Twitter.Conduit.Types import Web.Twitter.Types.Lens -import qualified Network.HTTP.Conduit as HTTP-import Network.HTTP.Client.MultipartFormData-import qualified Network.HTTP.Types as HT-import qualified Data.Conduit as C-import qualified Data.Conduit.List as CL-+import Control.Lens+import Control.Monad.IO.Class+import Control.Monad.Trans.Class (lift)+import Control.Monad.Trans.Resource (MonadResource, MonadThrow, monadThrow) import Data.Aeson import Data.Aeson.Lens+import Data.ByteString (ByteString)+import qualified Data.Conduit as C import qualified Data.Conduit.Attoparsec as CA-import qualified Data.Text as T+import qualified Data.Conduit.List as CL 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 Control.Monad.Logger-import Control.Lens+import Network.HTTP.Client.MultipartFormData+import qualified Network.HTTP.Conduit as HTTP+import qualified Network.HTTP.Types as HT import Unsafe.Coerce+import Web.Authenticate.OAuth (signOAuth)  type TwitterBaseM m = ( MonadResource m-                      , MonadLogger m                       ) -makeRequest :: (MonadThrow m, MonadIO m)-            => APIRequest apiName responseType-            -> m HTTP.Request+makeRequest :: APIRequest apiName responseType+            -> IO HTTP.Request makeRequest (APIRequestGet u pa) = makeRequest' "GET" u (makeSimpleQuery pa) makeRequest (APIRequestPost u pa) = makeRequest' "POST" u (makeSimpleQuery pa) makeRequest (APIRequestPostMultipart u param prt) =@@ -66,11 +58,10 @@     body = prt ++ partParam     partParam = Prelude.map (uncurry partBS . over _1 T.decodeUtf8) (makeSimpleQuery param) -makeRequest' :: MonadThrow m-             => HT.Method -- ^ HTTP request method (GET or POST)+makeRequest' :: HT.Method -- ^ HTTP request method (GET or POST)              -> String -- ^ API Resource URL              -> HT.SimpleQuery -- ^ Query-             -> m HTTP.Request+             -> IO HTTP.Request makeRequest' m url query = do     req <- HTTP.parseUrl url     return $ req { HTTP.method = m@@ -78,26 +69,14 @@                  , 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 =-    getResponse =<< makeRequest' m url query--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+getResponse :: MonadResource m+            => TWInfo+            -> HTTP.Manager+            -> HTTP.Request+            -> m (Response (C.ResumableSource m ByteString))+getResponse TWInfo{..} mgr req = do+    signedReq <- signOAuth (twOAuth twToken) (twCredential twToken) $ req { HTTP.proxy = twProxy }     res <- HTTP.http signedReq mgr-    $(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@@ -107,7 +86,7 @@ endpoint :: String endpoint = "https://api.twitter.com/1.1/" -getValue :: (MonadLogger m, MonadThrow m)+getValue :: MonadThrow m          => Response (C.ResumableSource m ByteString)          -> m (Response Value) getValue res = do@@ -131,7 +110,7 @@   where     sci = HT.statusCode responseStatus -getValueOrThrow :: (MonadThrow m, MonadLogger m, FromJSON a)+getValueOrThrow :: (MonadThrow m, FromJSON a)                 => Response (C.ResumableSource m ByteString)                 -> m (Response a) getValueOrThrow res = do@@ -143,37 +122,92 @@         Success r -> return $ res' { responseBody = r }         Error err -> monadThrow $ FromJSONError err -call :: (TwitterBaseM m, FromJSON responseType)-     => APIRequest apiName responseType-     -> TW m responseType+-- | Perform an 'APIRequest' and then provide the response which is mapped to a suitable type of+-- <http://hackage.haskell.org/package/twitter-types twitter-types>.+--+-- Example:+--+-- @+-- 'HTTP.withManager' $ \\mgr -\> do+--      user <- 'call' twInfo mgr $ 'accountVerifyCredentials'+--      'liftIO' $ print user+-- @+--+-- If you need raw JSON value which is parsed by <http://hackage.haskell.org/package/aeson aeson>,+-- use 'call'' to obtain it.+call :: (MonadResource m, FromJSON responseType)+     => TWInfo -- ^ Twitter Setting+     -> HTTP.Manager+     -> APIRequest apiName responseType+     -> m responseType call = call' -call' :: (TwitterBaseM m, FromJSON value)-      => APIRequest apiName responseType-      -> TW m value-call' = fmap responseBody . callWithResponse'+-- | Perform an 'APIRequest' and then provide the response.+-- The response of this function is not restrict to @responseType@,+-- so you can choose an arbitrarily type of FromJSON instances.+call' :: (MonadResource m, FromJSON value)+      => TWInfo -- ^ Twitter Setting+      -> HTTP.Manager+      -> APIRequest apiName responseType+      -> m value+call' info mgr req = responseBody `fmap` callWithResponse' info mgr req -callWithResponse :: (TwitterBaseM m, FromJSON responseType)-                 => APIRequest apiName responseType-                 -> TW m (Response responseType)+-- | Perform an 'APIRequest' and then provide the 'Response'.+--+-- Example:+--+-- @+-- res \<- 'HTTP.withManager' $ \\mgr -\> do+--     'callWithResponse' twInfo mgr $ 'accountVerifyCredentials'+-- 'print' $ 'responseStatus' res+-- 'print' $ 'responseHeaders' res+-- 'print' $ 'responseBody' res+-- @+callWithResponse :: (MonadResource m, FromJSON responseType)+                 => TWInfo -- ^ Twitter Setting+                 -> HTTP.Manager+                 -> APIRequest apiName responseType+                 -> m (Response responseType) callWithResponse = callWithResponse' -callWithResponse' :: (TwitterBaseM m, FromJSON value)-                  => APIRequest apiName responseType-                  -> TW m (Response value)-callWithResponse' req = getValueOrThrow =<< getResponse =<< makeRequest req+-- | Perform an 'APIRequest' and then provide the 'Response'.+-- The response of this function is not restrict to @responseType@,+-- so you can choose an arbitrarily type of FromJSON instances.+--+-- Example:+--+-- @+-- res \<- 'HTTP.withManager' $ \\mgr -\> do+--     'callWithResponse'' twInfo mgr $ 'accountVerifyCredentials'+-- 'print' $ 'responseStatus' res+-- 'print' $ 'responseHeaders' res+-- 'print' $ 'responseBody' (res :: Value)+-- @+callWithResponse' :: (MonadResource m, FromJSON value)+                  => TWInfo+                  -> HTTP.Manager+                  -> APIRequest apiName responseType+                  -> m (Response value)+callWithResponse' info mgr req = do+    res <- getResponse info mgr =<< liftIO (makeRequest req)+    getValueOrThrow res -sourceWithMaxId :: ( TwitterBaseM m+-- | A wrapper function to perform multiple API request with changing @max_id@ parameter.+--+-- This function cooperate with instances of 'HasMaxIdParam'.+sourceWithMaxId :: ( MonadResource m                    , FromJSON responseType                    , AsStatus responseType                    , HasMaxIdParam (APIRequest apiName [responseType])                    )-                => APIRequest apiName [responseType]-                -> C.Source (TW m) responseType-sourceWithMaxId = loop+                => TWInfo -- ^ Twitter Setting+                -> HTTP.Manager+                -> APIRequest apiName [responseType]+                -> C.Source m responseType+sourceWithMaxId info mgr = loop   where     loop req = do-        res <- lift $ call req+        res <- lift $ call info mgr req         case getMinId res of             Just mid -> do                 CL.sourceList res@@ -181,15 +215,22 @@             Nothing -> CL.sourceList res     getMinId = minimumOf (traverse . status_id) -sourceWithMaxId' :: ( TwitterBaseM m+-- | A wrapper function to perform multiple API request with changing @max_id@ parameter.+-- The response of this function is not restrict to @responseType@,+-- so you can choose an arbitrarily type of FromJSON instances.+--+-- This function cooperate with instances of 'HasMaxIdParam'.+sourceWithMaxId' :: ( MonadResource m                     , HasMaxIdParam (APIRequest apiName [responseType])                     )-                 => APIRequest apiName [responseType]-                 -> C.Source (TW m) Value-sourceWithMaxId' = loop+                 => TWInfo -- ^ Twitter Setting+                 -> HTTP.Manager+                 -> APIRequest apiName [responseType]+                 -> C.Source m Value+sourceWithMaxId' info mgr = loop   where     loop req = do-        res <- lift $ call' req+        res <- lift $ call' info mgr req         case getMinId res of             Just mid -> do                 CL.sourceList res@@ -197,29 +238,41 @@             Nothing -> CL.sourceList res     getMinId = minimumOf (traverse . key "id" . _Integer) -sourceWithCursor :: ( TwitterBaseM m+-- | A wrapper function to perform multiple API request with changing @cursor@ parameter.+--+-- This function cooperate with instances of 'HasCursorParam'.+sourceWithCursor :: ( MonadResource m                     , FromJSON responseType                     , CursorKey ck                     , HasCursorParam (APIRequest apiName (WithCursor ck responseType))                     )-                 => APIRequest apiName (WithCursor ck responseType)-                 -> C.Source (TW m) responseType-sourceWithCursor req = loop (-1)+                 => TWInfo -- ^ Twitter Setting+                 -> HTTP.Manager+                 -> APIRequest apiName (WithCursor ck responseType)+                 -> C.Source m responseType+sourceWithCursor info mgr req = loop (-1)   where     loop 0 = CL.sourceNull     loop cur = do-        res <- lift $ call $ req & cursor ?~ cur+        res <- lift $ call info mgr $ req & cursor ?~ cur         CL.sourceList $ contents res         loop $ nextCursor res -sourceWithCursor' :: ( TwitterBaseM m+-- | A wrapper function to perform multiple API request with changing @cursor@ parameter.+-- The response of this function is not restrict to @responseType@,+-- so you can choose an arbitrarily type of FromJSON instances.+--+-- This function cooperate with instances of 'HasCursorParam'.+sourceWithCursor' :: ( MonadResource m                      , FromJSON responseType                      , CursorKey ck                      , HasCursorParam (APIRequest apiName (WithCursor ck responseType))                      )-                  => APIRequest apiName (WithCursor ck responseType)-                  -> C.Source (TW m) Value-sourceWithCursor' req = loop (-1)+                  => TWInfo -- ^ Twitter Setting+                  -> HTTP.Manager+                  -> APIRequest apiName (WithCursor ck responseType)+                  -> C.Source m Value+sourceWithCursor' info mgr req = loop (-1)   where     relax :: FromJSON value           => APIRequest apiName (WithCursor ck responseType)@@ -227,27 +280,19 @@     relax = unsafeCoerce     loop 0 = CL.sourceNull     loop cur = do-        res <- lift $ call $ relax $ req & cursor ?~ cur+        res <- lift $ call info mgr $ relax $ req & cursor ?~ cur         CL.sourceList $ contents res         loop $ nextCursor res  sinkJSON :: ( MonadThrow m-            , MonadLogger m             ) => C.Consumer ByteString m Value-sinkJSON = do-    js <- CA.sinkParser json-    $(logDebug) $ T.pack $ "Response JSON: " ++ show js-    return js+sinkJSON = CA.sinkParser json  sinkFromJSON :: ( FromJSON a                 , MonadThrow m-                , MonadLogger m                 ) => C.Consumer ByteString m a sinkFromJSON = do     v <- sinkJSON     case fromJSON v of         Error err -> monadThrow $ FromJSONError err         Success r -> return r--showBS :: Show a => a -> ByteString-showBS = S8.pack . show
Web/Twitter/Conduit/Monad.hs view
@@ -1,82 +1,64 @@ {-# LANGUAGE FlexibleContexts #-}+{-# LANGUAGE CPP #-}  module Web.Twitter.Conduit.Monad-       ( TW-       , TWToken (..)-       , TWInfo (..)-       , setCredential+       (+       -- * How to use this library+       -- $howto++       -- * Re-exports+         module Web.Twitter.Conduit.Api+       , module Web.Twitter.Conduit.Cursor+       , module Web.Twitter.Conduit.Parameters+       , module Web.Twitter.Conduit.Request+       , module Web.Twitter.Conduit.Response+       , module Web.Twitter.Conduit.Status+       , module Web.Twitter.Conduit.Stream+       , module Web.Twitter.Conduit.Types++       -- * 'Web.Twitter.Conduit.Monad'+       , Base.TwitterBaseM+       , TW        , runTW        , runTWManager-       , getProxy-       , getManager-       , signOAuthTW-       , twitterOAuth-       )-       where+       , call+       , call'+       , callWithResponse+       , callWithResponse'+       , sourceWithMaxId+       , sourceWithMaxId'+       , sourceWithCursor+       , sourceWithCursor'+       ) where -import Web.Authenticate.OAuth-import Network.HTTP.Conduit-import Data.Default+import Web.Twitter.Conduit.Api+import qualified Web.Twitter.Conduit.Base as Base+import Web.Twitter.Conduit.Cursor+import Web.Twitter.Conduit.Parameters+import Web.Twitter.Conduit.Request+import Web.Twitter.Conduit.Response+import Web.Twitter.Conduit.Status+import Web.Twitter.Conduit.Stream+import Web.Twitter.Conduit.Types+import qualified Network.HTTP.Conduit as HTTP import Control.Monad.IO.Class import Control.Monad.Trans.Reader import Control.Monad.Trans.Resource+import Data.Aeson+import Web.Twitter.Types.Lens+import qualified Data.Conduit as C+import Control.Monad.Trans.Class (lift) +#ifdef HLINT+{-# ANN module "HLint: ignore Use import/export shortcut" #-}+#endif+ -- $setup -- >>> :set -XOverloadedStrings  type TW m = ReaderT TWEnv m -data TWToken = TWToken-    { twOAuth :: OAuth-    , twCredential :: Credential-    } deriving Show-instance Default TWToken where-    def = TWToken twitterOAuth (Credential [])--data TWInfo = TWInfo-    { twToken :: TWToken-    , twProxy :: Maybe Proxy-    } deriving Show-instance Default TWInfo where-    def = TWInfo-        { twToken = def-        , twProxy = Nothing-        }--twitterOAuth :: OAuth-twitterOAuth =-    def { oauthServerName = "twitter"-        , oauthRequestUri = "https://api.twitter.com/oauth/request_token"-        , oauthAccessTokenUri = "https://api.twitter.com/oauth/access_token"-        , oauthAuthorizeUri = "https://api.twitter.com/oauth/authorize"-        , oauthConsumerKey = error "You MUST specify oauthConsumerKey parameter."-        , oauthConsumerSecret = error "You MUST specify oauthConsumerSecret parameter."-        , oauthSignatureMethod = HMACSHA1-        , oauthCallback = Nothing-        }--data TWEnv = TWEnv-    { twInfo :: TWInfo-    , twManager :: Manager-    }---- | set OAuth keys and Credentials to TWInfo.------ >>> let proxy = Proxy "localhost" 8080--- >>> let twinfo = def { twProxy = Just proxy }--- >>> let oauth = twitterOAuth { oauthConsumerKey = "consumer_key", oauthConsumerSecret = "consumer_secret" }--- >>> let credential = Credential [("oauth_token","...")]--- >>> let twinfo2 = setCredential oauth credential twinfo--- >>> oauthConsumerKey . twOAuth . twToken $ twinfo2--- "consumer_key"--- >>> twProxy twinfo2 == Just proxy--- True-setCredential :: OAuth -> Credential -> TWInfo -> TWInfo-setCredential oa cred env-  = TWInfo-    { twToken = TWToken oa cred-    , twProxy = twProxy env-    }+data TWEnv = TWEnv TWInfo HTTP.Manager  -- | create a new http-conduit manager and run TW monad. --@@ -87,20 +69,73 @@ runTW :: ( MonadBaseControl IO m          , MonadIO m          ) => TWInfo -> TW (ResourceT m) a -> m a-runTW info st = withManager $ \mgr -> runTWManager info mgr st+runTW info st = HTTP.withManager $ \mgr -> runTWManager info mgr st -runTWManager :: MonadBaseControl IO m => TWInfo -> Manager -> TW (ResourceT m) a -> ResourceT m a+runTWManager :: MonadBaseControl IO m => TWInfo -> HTTP.Manager -> TW (ResourceT m) a -> ResourceT m a runTWManager info mgr st = runReaderT st $ TWEnv info mgr -getProxy ::Monad m => TW m (Maybe Proxy)-getProxy = asks (twProxy . twInfo)+call :: (MonadResource m, FromJSON responseType)+     => APIRequest apiName responseType+     -> TW m responseType+call = call' -getManager :: Monad m => TW m Manager-getManager = asks twManager+call' :: (MonadResource m, FromJSON value)+      => APIRequest apiName responseType+      -> TW m value+call' req = do+    TWEnv info mgr <- ask+    lift $ Base.call' info mgr req -signOAuthTW :: MonadIO m-            => Request-            -> TW m Request-signOAuthTW req = do-    TWToken oa cred <- asks (twToken . twInfo)-    signOAuth oa cred req+callWithResponse :: (MonadResource m, FromJSON responseType)+                 => APIRequest apiName responseType+                 -> TW m (Response responseType)+callWithResponse = callWithResponse'++callWithResponse' :: (MonadResource m, FromJSON value)+                  => APIRequest apiName responseType+                  -> TW m (Response value)+callWithResponse' req = do+    TWEnv info mgr <- ask+    lift $ Base.callWithResponse' info mgr req++sourceWithMaxId :: ( MonadResource m+                   , FromJSON responseType+                   , AsStatus responseType+                   , HasMaxIdParam (APIRequest apiName [responseType])+                   )+                => APIRequest apiName [responseType]+                -> C.Source (TW m) responseType+sourceWithMaxId req = do+    TWEnv info mgr <- lift ask+    Base.sourceWithMaxId info mgr req++sourceWithMaxId' :: ( MonadResource m+                    , HasMaxIdParam (APIRequest apiName [responseType])+                    )+                 => APIRequest apiName [responseType]+                 -> C.Source (TW m) Value+sourceWithMaxId' req = do+    TWEnv info mgr <- lift ask+    Base.sourceWithMaxId' info mgr req++sourceWithCursor :: ( MonadResource m+                    , FromJSON responseType+                    , CursorKey ck+                    , HasCursorParam (APIRequest apiName (WithCursor ck responseType))+                    )+                 => APIRequest apiName (WithCursor ck responseType)+                 -> C.Source (TW m) responseType+sourceWithCursor req = do+    TWEnv info mgr <- lift ask+    Base.sourceWithCursor info mgr req++sourceWithCursor' :: ( MonadResource m+                     , FromJSON responseType+                     , CursorKey ck+                     , HasCursorParam (APIRequest apiName (WithCursor ck responseType))+                     )+                  => APIRequest apiName (WithCursor ck responseType)+                  -> C.Source (TW m) Value+sourceWithCursor' req = do+    TWEnv info mgr <- lift ask+    Base.sourceWithCursor' info mgr req
Web/Twitter/Conduit/Status.hs view
@@ -156,7 +156,7 @@ -- You can perform a search query using 'call': -- -- @--- res <- 'call' '$' 'retweetsId' 1234567890+-- res <- 'call' twInfo mgr '$' 'retweetsId' 1234567890 -- @ -- -- >>> retweetsId 1234567890@@ -177,7 +177,7 @@ -- You can perform a search query using 'call': -- -- @--- res <- 'call' '$' 'showId' 1234567890+-- res <- 'call' twInfo mgr '$' 'showId' 1234567890 -- @ -- -- >>> showId 1234567890@@ -199,7 +199,7 @@ -- You can perform a search query using 'call': -- -- @--- res <- 'call' '$' 'destroyId' 1234567890+-- res <- 'call' twInfo mgr '$' 'destroyId' 1234567890 -- @ -- -- >>> destroyId 1234567890@@ -218,7 +218,7 @@ -- You can perform a search query using 'call': -- -- @--- res <- 'call' '$' 'update' \"Hello World\"+-- res <- 'call' twInfo mgr '$' 'update' \"Hello World\" -- @ -- -- >>> update "Hello World"@@ -243,7 +243,7 @@ -- You can perform a search query using 'call': -- -- @--- res <- 'call' '$' 'retweetId' 1234567890+-- res <- 'call' twInfo mgr '$' 'retweetId' 1234567890 -- @ -- -- >>> retweetId 1234567890@@ -261,7 +261,7 @@ -- You can perform a search query using 'call': -- -- @--- res <- 'call' '$' 'updateWithMedia' \"Hello World\" ('MediaFromFile' \"/home/thimura/test.jpeg\")+-- res <- 'call' twInfo mgr '$' 'updateWithMedia' \"Hello World\" ('MediaFromFile' \"/home/thimura/test.jpeg\") -- @ -- -- >>> updateWithMedia "Hello World" (MediaFromFile "/home/fuga/test.jpeg")@@ -289,7 +289,7 @@ -- You can perform a request using 'call': -- -- @--- res <- 'call' '$' 'lookup' [20, 432656548536401920]+-- res <- 'call' twInfo mgr '$' 'lookup' [20, 432656548536401920] -- @ -- -- >>> lookup [10]
Web/Twitter/Conduit/Stream.hs view
@@ -22,8 +22,8 @@        , stream'   ) where +import Web.Twitter.Conduit.Types import Web.Twitter.Conduit.Base-import Web.Twitter.Conduit.Monad import Web.Twitter.Types import Web.Twitter.Conduit.Parameters import Web.Twitter.Conduit.Parameters.TH@@ -36,6 +36,8 @@ import qualified Data.Text as T import Control.Monad.IO.Class import Data.Aeson+import Control.Monad.Trans.Resource (MonadResource)+import qualified Network.HTTP.Conduit as HTTP  #if MIN_VERSION_conduit(1,0,16) ($=+) :: MonadIO m@@ -49,16 +51,20 @@     return $ CI.ResumableSource (src C.$= cndt) finalizer #endif -stream :: (TwitterBaseM m, FromJSON responseType)-       => APIRequest apiName responseType-       -> TW m (C.ResumableSource (TW m) responseType)+stream :: (MonadResource m, FromJSON responseType)+       => TWInfo+       -> HTTP.Manager+       -> APIRequest apiName responseType+       -> m (C.ResumableSource m responseType) stream = stream' -stream' :: (TwitterBaseM m, FromJSON value)-        => APIRequest apiName responseType-        -> TW m (C.ResumableSource (TW m) value)-stream' req = do-    rsrc <- getResponse =<< makeRequest req+stream' :: (MonadResource m, FromJSON value)+        => TWInfo+        -> HTTP.Manager+        -> APIRequest apiName responseType+        -> m (C.ResumableSource m value)+stream' info mgr req = do+    rsrc <- getResponse info mgr =<< liftIO (makeRequest req)     responseBody rsrc $=+ CL.sequence sinkFromJSON  data Userstream
+ Web/Twitter/Conduit/Types.hs view
@@ -0,0 +1,57 @@+module Web.Twitter.Conduit.Types+       ( TWToken (..)+       , TWInfo (..)+       , twitterOAuth+       , setCredential+       ) where++import Data.Default+import Web.Authenticate.OAuth+import Network.HTTP.Conduit++data TWToken = TWToken+    { twOAuth :: OAuth+    , twCredential :: Credential+    } deriving (Show, Eq)+instance Default TWToken where+    def = TWToken twitterOAuth (Credential [])++data TWInfo = TWInfo+    { twToken :: TWToken+    , twProxy :: Maybe Proxy+    } deriving (Show, Eq)+instance Default TWInfo where+    def = TWInfo+        { twToken = def+        , twProxy = Nothing+        }++twitterOAuth :: OAuth+twitterOAuth =+    def { oauthServerName = "twitter"+        , oauthRequestUri = "https://api.twitter.com/oauth/request_token"+        , oauthAccessTokenUri = "https://api.twitter.com/oauth/access_token"+        , oauthAuthorizeUri = "https://api.twitter.com/oauth/authorize"+        , oauthConsumerKey = error "You MUST specify oauthConsumerKey parameter."+        , oauthConsumerSecret = error "You MUST specify oauthConsumerSecret parameter."+        , oauthSignatureMethod = HMACSHA1+        , oauthCallback = Nothing+        }++-- | set OAuth keys and Credentials to TWInfo.+--+-- >>> let proxy = Proxy "localhost" 8080+-- >>> let twinfo = def { twProxy = Just proxy }+-- >>> let oauth = twitterOAuth { oauthConsumerKey = "consumer_key", oauthConsumerSecret = "consumer_secret" }+-- >>> let credential = Credential [("oauth_token","...")]+-- >>> let twinfo2 = setCredential oauth credential twinfo+-- >>> oauthConsumerKey . twOAuth . twToken $ twinfo2+-- "consumer_key"+-- >>> twProxy twinfo2 == Just proxy+-- True+setCredential :: OAuth -> Credential -> TWInfo -> TWInfo+setCredential oa cred env+  = TWInfo+    { twToken = TWToken oa cred+    , twProxy = twProxy env+    }
sample/Common.hs view
@@ -6,19 +6,15 @@  import Web.Twitter.Conduit -import Web.Authenticate.OAuth as OA-import qualified Network.URI as URI-import Network.HTTP.Conduit-import qualified Data.Map as M+import Control.Applicative+import Control.Lens import qualified Data.ByteString.Char8 as S8 import qualified Data.CaseInsensitive as CI-import Control.Applicative-import Control.Monad.IO.Class-import Control.Monad.Base-import Control.Monad.Trans.Resource+import qualified Data.Map as M+import Network.HTTP.Conduit+import qualified Network.URI as URI import System.Environment-import Control.Monad.Logger-import Control.Lens+import Web.Authenticate.OAuth as OA  getOAuthTokens :: IO (OAuth, Credential) getOAuthTokens = do@@ -51,12 +47,8 @@     parsePort (':':xs) = read xs     parsePort xs       = error $ "port number parse failed " ++ xs -runTwitterFromEnv :: (MonadIO m, MonadBaseControl IO m) => TW (ResourceT m) a -> m a-runTwitterFromEnv task = do-    pr <- liftBase getProxyEnv-    (oa, cred) <- liftBase getOAuthTokens-    let env = (setCredential oa cred def) { twProxy = pr }-    runTW env task--runTwitterFromEnv' :: (MonadIO m, MonadBaseControl IO m) => TW (ResourceT (NoLoggingT m)) a -> m a-runTwitterFromEnv' = runNoLoggingT . runTwitterFromEnv+getTWInfoFromEnv :: IO TWInfo+getTWInfoFromEnv = do+    pr <- getProxyEnv+    (oa, cred) <- getOAuthTokens+    return $ (setCredential oa cred def) { twProxy = pr }
sample/fav.hs view
@@ -2,17 +2,21 @@  module Main where -import Control.Monad.IO.Class import Web.Twitter.Conduit-import System.Environment import Common+ import Control.Lens+import Control.Monad.IO.Class+import Network.HTTP.Conduit+import System.Environment  main :: IO ()-main = runTwitterFromEnv' $ do+main = do     [statusIdStr] <- liftIO getArgs+    twInfo <- getTWInfoFromEnv     let sId = read statusIdStr-    targetStatus <- call $ showId sId-    liftIO . putStrLn $ "Favorite Tweet: " ++ targetStatus ^. to show-    res <- call $ favoritesCreate sId-    liftIO $ print res+    withManager $ \mgr -> do+        targetStatus <- call twInfo mgr $ showId sId+        liftIO . putStrLn $ "Favorite Tweet: " ++ targetStatus ^. to show+        res <- call twInfo mgr $ favoritesCreate sId+        liftIO $ print res
sample/oauth_callback.hs view
@@ -9,7 +9,7 @@  import Web.Scotty import qualified Network.HTTP.Types as HT-import Web.Twitter.Conduit hiding (text, lookup)+import Web.Twitter.Conduit hiding (lookup) import Web.Authenticate.OAuth (OAuth(..), Credential(..)) import qualified Web.Authenticate.OAuth as OA import qualified Network.HTTP.Conduit as HTTP
sample/oauth_pin.hs view
@@ -11,7 +11,6 @@ import Web.Twitter.Conduit hiding (lookup) import Web.Authenticate.OAuth as OA import Network.HTTP.Conduit-import qualified Data.Conduit as C import qualified Data.ByteString.Char8 as S8 import Data.Maybe import Data.Monoid
sample/oslist.hs view
@@ -1,21 +1,26 @@ {-# LANGUAGE OverloadedStrings #-} module Main where +import Web.Twitter.Conduit hiding (map)+import Common++import Control.Monad.IO.Class import qualified Data.Conduit as C import qualified Data.Conduit.List as CL import qualified Data.Map as M-import Control.Monad.IO.Class+import Network.HTTP.Conduit import System.Environment -import Web.Twitter.Conduit-import Common- main :: IO ()-main = runTwitterFromEnv' $ do+main = do     [screenName] <- liftIO getArgs+    twInfo <- getTWInfoFromEnv     let sn = ScreenNameParam screenName-    folids <- sourceWithCursor (followersIds sn) C.$$ CL.consume-    friids <- sourceWithCursor (friendsIds sn) C.$$ CL.consume++    (folids, friids) <- withManager $ \mgr -> do+        folids <- sourceWithCursor twInfo mgr (followersIds sn) C.$$ CL.consume+        friids <- sourceWithCursor twInfo mgr (friendsIds sn) C.$$ CL.consume+        return (folids, friids)      let folmap = M.fromList $ map (flip (,) True) folids         os = filter (\uid -> M.notMember uid folmap) friids
sample/post.hs view
@@ -1,18 +1,21 @@ {-# LANGUAGE OverloadedStrings #-} module Main where +import Web.Twitter.Conduit hiding (map)+import Common++import Control.Applicative+import Data.Monoid import qualified Data.Text as T import qualified Data.Text.IO as T-import Data.Monoid-import Control.Applicative-import Control.Monad.IO.Class-import Web.Twitter.Conduit+import Network.HTTP.Conduit import System.Environment-import Common  main :: IO ()-main = runTwitterFromEnv' $ do-    status <- T.concat . map T.pack <$> liftIO getArgs-    liftIO $ T.putStrLn $ "Post message: " <> status-    res <- call $ update status-    liftIO $ print res+main = do+    status <- T.concat . map T.pack <$> getArgs+    T.putStrLn $ "Post message: " <> status+    twInfo <- getTWInfoFromEnv+    res <- withManager $ \mgr -> do+        call twInfo mgr $ update status+    print res
sample/postWithMedia.hs view
@@ -1,15 +1,18 @@ {-# LANGUAGE OverloadedStrings #-} module Main where -import qualified Data.Text as T-import Control.Monad.IO.Class import Web.Twitter.Conduit-import System.Environment import Common +import qualified Data.Text as T+import Network.HTTP.Conduit+import System.Environment+ main :: IO ()-main = runTwitterFromEnv' $ do-    [status, filepath] <- liftIO getArgs-    liftIO $ putStrLn $ "Post message: " ++ status-    res <- call $ updateWithMedia (T.pack status) (MediaFromFile filepath)-    liftIO $ print res+main = do+    [status, filepath] <- getArgs+    putStrLn $ "Post message: " ++ status+    twInfo <- getTWInfoFromEnv+    res <- withManager $ \mgr -> do+        call twInfo mgr $ updateWithMedia (T.pack status) (MediaFromFile filepath)+    print res
sample/postWithMultipleMedia.hs view
@@ -1,27 +1,32 @@ {-# LANGUAGE OverloadedStrings #-} module Main where -import qualified Data.Text as T import Web.Twitter.Conduit+import Web.Twitter.Types.Lens+import Common++import Control.Lens+import Control.Monad+import Control.Monad.IO.Class+import qualified Data.Text as T+import Network.HTTP.Conduit import System.Environment import System.Exit (exitFailure) import System.IO-import Control.Lens-import Control.Monad.IO.Class-import Control.Monad-import Common  main :: IO ()-main = runTwitterFromEnv' $ do-    (status:filepathList) <- liftIO getArgs-    when (length filepathList > 4) $ liftIO $ do+main = do+    (status:filepathList) <- getArgs+    when (length filepathList > 4) $ do         hPutStrLn stderr $ "You can upload upto 4 images in a single tweet, but we got " ++ show (length filepathList) ++ " images. abort."         exitFailure-    uploadedMediaList <- forM filepathList $ \filepath -> do-        liftIO $ putStrLn $ "Upload media: " ++ filepath-        ret <- call $ mediaUpload (MediaFromFile filepath)-        liftIO $ putStrLn $ "Upload completed: media_id: " ++ ret ^. mediaId . to show ++ ", filepath: " ++ filepath-        return ret-    liftIO $ putStrLn $ "Post message: " ++ status-    res <- call $ update (T.pack status) & mediaIds ?~ (uploadedMediaList ^.. traversed .  mediaId)-    liftIO $ print res+    twInfo <- getTWInfoFromEnv+    withManager $ \mgr -> do+        uploadedMediaList <- forM filepathList $ \filepath -> do+            liftIO . putStrLn $ "Upload media: " ++ filepath+            ret <- call twInfo mgr $ mediaUpload (MediaFromFile filepath)+            liftIO . putStrLn $ "Upload completed: media_id: " ++ ret ^. uploadedMediaId . to show ++ ", filepath: " ++ filepath+            return ret+        liftIO $ putStrLn $ "Post message: " ++ status+        res <- call twInfo mgr $ update (T.pack status) & mediaIds ?~ (uploadedMediaList ^.. traversed .  uploadedMediaId)+        liftIO $ print res
sample/search.hs view
@@ -1,19 +1,23 @@ {-# LANGUAGE OverloadedStrings #-} module Main where -import Control.Monad.IO.Class-import System.Environment- import Web.Twitter.Conduit+import Web.Twitter.Types.Lens import Common-import qualified Data.Text as T+ import Control.Lens+import Control.Monad.IO.Class+import qualified Data.Text as T+import Network.HTTP.Conduit+import System.Environment  main :: IO ()-main = runTwitterFromEnv' $ do-    [keyword] <- liftIO getArgs+main = do+    [keyword] <- getArgs -    res <- call . search $ T.pack keyword+    twInfo <- getTWInfoFromEnv++    res <- withManager $ \mgr -> call twInfo mgr $ search $ T.pack keyword     let metadata = res ^. searchResultSearchMetadata     liftIO . putStrLn $ "search completed in: " ++ metadata ^. searchMetadataCompletedIn . to show     liftIO . putStrLn $ "search result max id: " ++ metadata ^. searchMetadataMaxId . to show
sample/simple.hs view
@@ -5,21 +5,21 @@  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-import Network.HTTP.Conduit+import Control.Monad.IO.Class+import Control.Monad.Trans.Control+import Control.Monad.Trans.Resource+import qualified Data.ByteString.Char8 as B8 import qualified Data.Conduit as C import qualified Data.Conduit.List as CL+import Data.Default import qualified Data.Text as T import qualified Data.Text.IO as T-import qualified Data.ByteString.Char8 as B8-import Data.Default-import Control.Monad.Logger-import Control.Monad.Trans.Control-import Control.Monad.Trans.Resource-import Control.Monad.IO.Class+import Network.HTTP.Conduit import System.IO (hFlush, stdout)+import Web.Authenticate.OAuth (OAuth(..), Credential(..))+import qualified Web.Authenticate.OAuth as OA  tokens :: OAuth tokens = twitterOAuth@@ -38,11 +38,10 @@     pin <- getPIN url     OA.getAccessToken oauth (OA.insert "oauth_verifier" (B8.pack pin) cred) mgr -withCredential :: (MonadLogger m, MonadBaseControl IO m, MonadIO m) => TW (ResourceT m) a -> m a-withCredential task = do-    cred <- liftIO $ withManager $ \mgr -> authorize tokens getPIN mgr-    let env = setCredential tokens cred def-    runTW env task+getTWInfo :: IO TWInfo+getTWInfo = do+    cred <- withManager $ \mgr -> authorize tokens getPIN mgr+    return $ setCredential tokens cred def   where     getPIN url = liftIO $ do         putStrLn $ "browse URL: " ++ url@@ -51,14 +50,16 @@         getLine  main :: IO ()-main = runNoLoggingT . withCredential $ do-    liftIO . putStrLn $ "# your home timeline (up to 100 tweets):"-    sourceWithMaxId homeTimeline-        C.$= CL.isolate 100-        C.$$ CL.mapM_ $ \status -> liftIO $ do-            T.putStrLn $ T.concat [ T.pack . show $ status ^. statusId-                                  , ": "-                                  , status ^. statusUser . userScreenName-                                  , ": "-                                  , status ^. statusText-                                  ]+main = do+    twInfo <- getTWInfo+    putStrLn $ "# your home timeline (up to 100 tweets):"+    withManager $ \mgr -> do+        sourceWithMaxId twInfo mgr homeTimeline+            C.$= CL.isolate 100+            C.$$ CL.mapM_ $ \status -> liftIO $ do+                T.putStrLn $ T.concat [ T.pack . show $ status ^. statusId+                                      , ": "+                                      , status ^. statusUser . userScreenName+                                      , ": "+                                      , status ^. statusText+                                      ]
− sample/unfav.hs
@@ -1,17 +0,0 @@-{-# LANGUAGE OverloadedStrings #-}-module Main where--import Control.Monad.IO.Class-import Web.Twitter.Conduit-import System.Environment-import Common-import Control.Lens--main :: IO ()-main = runTwitterFromEnv' $ do-    [statusIdStr] <- liftIO getArgs-    let sId = read statusIdStr-    targetStatus <- call $ showId sId-    liftIO . putStrLn $ "Unfavorite Tweet: " ++ targetStatus ^. to show-    res <- call $ favoritesDestroy sId-    liftIO $ print res
sample/userstream.hs view
@@ -2,24 +2,24 @@ {-# LANGUAGE RecordWildCards #-} {-# LANGUAGE PatternGuards #-} -import qualified Data.Conduit as C-import qualified Data.Conduit.List as CL-import qualified Data.Text.IO as T-import qualified Data.Text as T-import System.Process+import Web.Twitter.Conduit+import Web.Twitter.Types.Lens+import Common++import Control.Applicative+import Control.Lens import Control.Monad import Control.Monad.IO.Class-import Control.Applicative-import System.FilePath-import System.Directory import Data.Conduit+import qualified Data.Conduit as C import qualified Data.Conduit.Binary as CB+import qualified Data.Conduit.List as CL+import qualified Data.Text as T+import qualified Data.Text.IO as T import Network.HTTP.Conduit as HTTP--import Web.Twitter.Conduit-import Web.Twitter.Types.Lens-import Common-import Control.Lens+import System.Directory+import System.FilePath+import System.Process  ensureDirectoryExist :: FilePath -> IO FilePath ensureDirectoryExist dir = do@@ -33,9 +33,11 @@ iconPath = (</> "icons") <$> confdir >>= ensureDirectoryExist  main :: IO ()-main = runTwitterFromEnv' $ do-    src <- stream userstream-    src C.$$+- CL.mapM_ (^! act (liftIO . printTL))+main = do+    twInfo <- getTWInfoFromEnv+    withManager $ \mgr -> do+        src <- stream twInfo mgr userstream+        src C.$$+- CL.mapM_ (^! act (liftIO . printTL))  showStatus :: AsStatus s => s -> T.Text showStatus s = T.concat [ s ^. user . userScreenName
tests/ApiSpec.hs view
@@ -3,22 +3,22 @@  module ApiSpec where +import Control.Lens import Data.Conduit import qualified Data.Conduit.List as CL-import Web.Twitter.Conduit (call, sourceWithCursor)+import Network.HTTP.Conduit+import System.IO.Unsafe+import TestUtils+import Web.Twitter.Conduit (call, sourceWithCursor, TWInfo) import Web.Twitter.Conduit.Api import Web.Twitter.Conduit.Lens import qualified Web.Twitter.Conduit.Parameters as Param import Web.Twitter.Types.Lens-import Control.Lens-import TestUtils  import Test.Hspec -import System.IO.Unsafe--self :: User-self = unsafePerformIO . run . call $ accountVerifyCredentials+twInfo :: TWInfo+twInfo = unsafePerformIO getTWInfo  spec :: Spec spec = do@@ -34,26 +34,26 @@ integrated = do     describe "friendsIds" $ do         it "returns a cursored collection of users IDs" $ do-            res <- run . call $ friendsIds (Param.ScreenNameParam "thimura")+            res <- withManager $ \mgr -> call twInfo mgr $ friendsIds (Param.ScreenNameParam "thimura")             res ^. contents . to length `shouldSatisfy` (> 0)          it "iterate with sourceWithCursor" $ do-            friends <- run $ do-                let src = sourceWithCursor $ friendsIds (Param.ScreenNameParam "thimura")+            friends <- withManager $ \mgr -> do+                let src = sourceWithCursor twInfo mgr $ friendsIds (Param.ScreenNameParam "thimura")                 src $$ CL.consume             length friends `shouldSatisfy` (>= 0)      describe "listsMembers" $ do         it "returns a cursored collection of the member of specified list" $ do-            res <- run . call $ listsMembers (Param.ListNameParam "thimura/haskell")+            res <- withManager $ \mgr -> call twInfo mgr $ listsMembers (Param.ListNameParam "thimura/haskell")             res ^. contents . to length `shouldSatisfy` (>= 0)          it "should raise error when specified list does not exists" $ do-            let action = run . call $ listsMembers (Param.ListNameParam "thimura/haskell_ne")+            let action = withManager $ \mgr -> call twInfo mgr $ listsMembers (Param.ListNameParam "thimura/haskell_ne")             action `shouldThrow` anyException          it "iterate with sourceWithCursor" $ do-            members <- run $ do-                let src = sourceWithCursor $ listsMembers (Param.ListNameParam "thimura/haskell")+            members <- withManager $ \mgr -> do+                let src = sourceWithCursor twInfo mgr $ listsMembers (Param.ListNameParam "thimura/haskell")                 src $$ CL.consume             members ^.. traversed . userScreenName `shouldContain` ["Hackage"]
tests/StatusSpec.hs view
@@ -3,21 +3,26 @@  module StatusSpec where +import Control.Lens import Data.Conduit import qualified Data.Conduit.List as CL-import Web.Twitter.Conduit (call, accountVerifyCredentials, sourceWithMaxId)-import Web.Twitter.Conduit.Status as Status+import Network.HTTP.Conduit+import System.IO.Unsafe+import Web.Twitter.Conduit (call, accountVerifyCredentials, sourceWithMaxId, TWInfo) import qualified Web.Twitter.Conduit.Parameters as Param+import Web.Twitter.Conduit.Status as Status import Web.Twitter.Types.Lens-import Control.Lens-import TestUtils +import TestUtils import Test.Hspec -import System.IO.Unsafe +twInfo :: TWInfo+twInfo = unsafePerformIO getTWInfo+ self :: User-self = unsafePerformIO . run . call $ accountVerifyCredentials+self = unsafePerformIO $ withManager $ \mgr -> do+    call twInfo mgr $ accountVerifyCredentials  spec :: Spec spec = do@@ -33,7 +38,7 @@ integrated = do     describe "mentionsTimeline" $ do         it "returns the 20 most resent mentions for user" $ do-            res <- run $ call mentionsTimeline+            res <- withManager $ \mgr -> call twInfo mgr mentionsTimeline             length res `shouldSatisfy` (> 0)             let mentionsScreenName = res ^.. traversed . statusEntities . _Just . enUserMentions . traversed . entityBody . userEntityUserScreenName             mentionsScreenName `shouldSatisfy` allOf folded (== (self ^. userScreenName))@@ -41,17 +46,18 @@      describe "userTimeline" $ do         it "returns the 20 most recent tweets posted by the user indicated by ScreenNameParam" $ do-            res <- run . call $ userTimeline (Param.ScreenNameParam "thimura")+            res <- withManager $ \mgr -> call twInfo mgr $ userTimeline (Param.ScreenNameParam "thimura")             length res `shouldSatisfy` (== 20)             res `shouldSatisfy` (allOf folded (^. statusUser . userScreenName . to (== "thimura")))         it "returns the recent tweets which include RTs when specified include_rts option" $ do-            res <- run . call+            res <- withManager $ \mgr -> call twInfo mgr                    $ userTimeline (Param.ScreenNameParam "thimura")                    & Param.count ?~ 100 & Param.includeRts ?~ True             res `shouldSatisfy` (anyOf (folded . statusRetweetedStatus . _Just . statusUser . userScreenName) (/= "thimura"))         it "iterate with sourceWithMaxId" $ do-            tl <- run $ do-                let src = sourceWithMaxId $ userTimeline (Param.ScreenNameParam "thimura") & Param.count ?~ 200+            tl <- withManager $ \mgr -> do+                let src = sourceWithMaxId twInfo mgr $+                          userTimeline (Param.ScreenNameParam "thimura") & Param.count ?~ 200                 src $$ CL.isolate 600 =$ CL.consume             length tl `shouldSatisfy` (== 600) @@ -60,12 +66,12 @@      describe "homeTimeline" $ do         it "returns the most recent tweets in home timeline" $ do-            res <- run $ call homeTimeline+            res <- withManager $ \mgr -> call twInfo mgr homeTimeline             length res `shouldSatisfy` (> 0)      describe "showId" $ do         it "works for the known tweets" $ do-            res <- run . call $ showId 477833886768959488+            res <- withManager $ \mgr -> call twInfo mgr $ showId 477833886768959488             res ^. statusId `shouldBe` 477833886768959488             res ^. statusText `shouldBe` "真紅かわいいはアレセイア"             res ^. statusCreatedAt `shouldBe` "Sat Jun 14 15:24:10 +0000 2014"@@ -73,15 +79,15 @@      describe "update & destroyId" $ do         it "posts new tweet and destroy it" $ do-            res1 <- run . call $ update "おまえの明日が、今日よりもずっと、楽しい事で溢れているようにと、祈っているよ"+            res1 <- withManager $ \mgr -> call twInfo mgr $ update "おまえの明日が、今日よりもずっと、楽しい事で溢れているようにと、祈っているよ"             res1 ^. statusUser . userScreenName `shouldBe` self ^. userScreenName -            res2 <- run . call $ destroyId (res1 ^. statusId)+            res2 <- withManager $ \mgr -> call twInfo mgr $ destroyId (res1 ^. statusId)             res2 ^. statusId `shouldBe` res1 ^. statusId      describe "lookup" $ do         it "works for the known tweets" $ do-            res <- run . call $ Status.lookup [438691466345340928, 477757405942411265]+            res <- withManager $ \mgr -> call twInfo mgr $ Status.lookup [438691466345340928, 477757405942411265]             length res `shouldSatisfy` (== 2)             (res !! 0) ^. statusId `shouldBe` 438691466345340928             (res !! 1) ^. statusId `shouldBe` 477757405942411265
tests/TestUtils.hs view
@@ -3,7 +3,7 @@ {-# LANGUAGE FlexibleContexts #-} {-# LANGUAGE CPP #-} -module TestUtils (runTwitterFromEnv, run) where+module TestUtils (getTWInfo) where  import Web.Twitter.Conduit @@ -14,11 +14,8 @@ import qualified Data.ByteString.Char8 as S8 import qualified Data.CaseInsensitive as CI import Control.Applicative-import Control.Monad.IO.Class import Control.Monad.Base-import Control.Monad.Trans.Resource import System.Environment-import Control.Monad.Logger import Control.Lens  getOAuthTokens :: IO (OAuth, Credential)@@ -52,17 +49,8 @@     parsePort (':':xs) = read xs     parsePort xs       = error $ "port number parse failed " ++ xs -runTwitterFromEnv :: (MonadIO m, MonadBaseControl IO m) => TW (ResourceT m) a -> m a-runTwitterFromEnv task = do+getTWInfo :: IO TWInfo+getTWInfo = do     pr <- liftBase getProxyEnv     (oa, cred) <- liftBase getOAuthTokens-    let env = (setCredential oa cred def) { twProxy = pr }-    runTW env task--#ifdef USE_DEBUG_OUTPUT-run :: (MonadIO m, MonadBaseControl IO m) => TW (ResourceT (LoggingT m)) a -> m a-run = runStderrLoggingT . runTwitterFromEnv-#else-run :: (MonadIO m, MonadBaseControl IO m) => TW (ResourceT (NoLoggingT m)) a -> m a-run = runNoLoggingT . runTwitterFromEnv-#endif+    return $ (setCredential oa cred def) { twProxy = pr }
twitter-conduit.cabal view
@@ -1,5 +1,5 @@ name:              twitter-conduit-version:           0.0.8.1+version:           0.1.0 license:           BSD3 license-file:      LICENSE author:            HATTORI Hiroki, Hideyuki Tanaka, Takahiro HIMURA@@ -43,10 +43,6 @@   description: build samples   default: False -flag use-debug-output-  description: use debug output when running testsuites-  default: False- flag run-integrated-test   description: use debug output when running testsuites   default: False@@ -62,7 +58,6 @@     , resourcet >= 1.0     , conduit >= 1.1     , conduit-extra >= 1.1-    , monad-logger     , http-types     , http-conduit >= 2.0 && < 2.2     , http-client >= 0.3@@ -87,6 +82,7 @@   exposed-modules:     Web.Twitter.Conduit     Web.Twitter.Conduit.Lens+    Web.Twitter.Conduit.Types     Web.Twitter.Conduit.Api     Web.Twitter.Conduit.Stream     Web.Twitter.Conduit.Status@@ -122,8 +118,6 @@   type: exitcode-stdio-1.0   main-is: spec_main.hs   hs-source-dirs: tests, .-  if flag(use-debug-output)-    CPP-Options: -DUSE_DEBUG_OUTPUT    if flag(run-integrated-test)     CPP-Options: -DRUN_INTEGRATED_TEST@@ -147,7 +141,6 @@     , http-types     , http-conduit     , http-client-    , monad-logger     , authenticate-oauth     , case-insensitive     , containers@@ -188,7 +181,6 @@       , resourcet       , conduit       , http-conduit-      , monad-logger       , authenticate-oauth       , twitter-types       , twitter-types-lens@@ -220,7 +212,6 @@       , conduit       , conduit-extra       , http-conduit-      , monad-logger       , authenticate-oauth       , twitter-conduit       , twitter-types