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 +18/−23
- Web/Twitter/Conduit/Api.hs +35/−35
- Web/Twitter/Conduit/Base.hs +136/−91
- Web/Twitter/Conduit/Monad.hs +111/−76
- Web/Twitter/Conduit/Status.hs +7/−7
- Web/Twitter/Conduit/Stream.hs +15/−9
- Web/Twitter/Conduit/Types.hs +57/−0
- sample/Common.hs +11/−19
- sample/fav.hs +11/−7
- sample/oauth_callback.hs +1/−1
- sample/oauth_pin.hs +0/−1
- sample/oslist.hs +12/−7
- sample/post.hs +13/−10
- sample/postWithMedia.hs +11/−8
- sample/postWithMultipleMedia.hs +21/−16
- sample/search.hs +11/−7
- sample/simple.hs +26/−25
- sample/unfav.hs +0/−17
- sample/userstream.hs +18/−16
- tests/ApiSpec.hs +14/−14
- tests/StatusSpec.hs +22/−16
- tests/TestUtils.hs +4/−16
- twitter-conduit.cabal +2/−11
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