twitter-conduit 0.1.1.1 → 0.1.2
raw patch · 8 files changed
+101/−65 lines, 8 files
Files
- .travis.yml +27/−38
- ChangeLog.md +5/−0
- Web/Twitter/Conduit/Base.hs +8/−4
- Web/Twitter/Conduit/Monad.hs +1/−3
- Web/Twitter/Conduit/Stream.hs +33/−4
- tests/doctests.hs +12/−13
- tests/hlint.hs +9/−1
- twitter-conduit.cabal +6/−2
.travis.yml view
@@ -1,51 +1,39 @@-language: sh-sudo: required--env:- matrix:- - GHCVER=7.4.2- - GHCVER=7.6.3- - GHCVER=7.8.4- - GHCVER=7.10.1 CABAL_FLAGS="-frun-integrated-test"- global:- # HALCYON_AWS_ACCESS_KEY_ID- - secure: "PTnc4TbawOwE6Z3v9QP5TRVYKg7FXU4PKgMqRPOy7HRwCriF+v4CxkyFgI2Ve614z85dF3kq9qZrhtyRuTSTL/SAu17Tz57+XhH0laGDF/7/h637ZRxy0+OBv/EDO0z6cJ1+8ndAl+5fbblQ8nmn5fgPrVCfbNIpujcjOSfs8+4="- # HALCYON_AWS_SECRET_ACCESS_KEY- - secure: "RCLM7gnzb0b4WgYeDQ+z1cn+IvsJMaqldLppJRM/b+oBeH5v+IZ0BL4hRk187iZsXJdMADC6MAeEchcV0rTseit/zKQAk6fx7360Sv+MdlzNbVHSiO7LpwbKTOvMfIQ5hB/S8oTuC1qmY18JhShO1lE6RpFsitwNdENRZv85fuQ="-- # OAUTH_CONSUMER_KEY- - secure: "U3hh6wJf87tdZmwLtPyMQ0ci39ouKvTm/JCi0CCz2jaPvWZR+4Tt7aYV5WYqzjSmgfBOqKpXTpwFBcvvWRty8rI1b8OtrlljC1zUcgf/hsz3hfPtv+GKW/ldYnqg7znyeAdxWEF1a4JszKgOJaGMdX7zSpFewgwEq7T4jAlebLA="- # OAUTH_CONSUMER_SECRET- - secure: "I4BGd16zNQE3WjnwgdT7OM5sIIMtT9DMFPNdnWJPcgYndDovnFAUDoTomaGo0Wue4h64vGWl26f2Nm04i2upJXxkzFFtU5Az6cwUjzkOve1yqrkkyPFTXC8MLQYX3Zz8scQ8h1IJCn0Luu5HsHsool6IFZpiUovLZbDXmY44yH4="- # OAUTH_ACCESS_TOKEN- - secure: "dW2pYRplxJ7HmJEo3lMgLlzfdOylBvWiV4PJt1j4GMDPJBOu3RM0h3zNkkxDoS9D0wWRkBEH0iN2Bh08v2z7sJtF3f/kgLvPlOy5mNSYcozwMdHJRlJEcXaGULHbZ4p79lVIOdTAhY2WU2QdP7PEv0BiqqVcysnfK0TGkTa+KEc="- # OAUTH_ACCESS_SECRET- - secure: "I5hzi7sONDn8KJAhmkroHsGNJ2zUxYq2iGamTV9lgMUDH0bwpMx+guzfZr+fGesdlUphM0t+ZCh9YH8BoVJsjZ/db9u/lotg78DKp1QwhrWnISqWj6TIfXrSLPkBwY+xFtxl6Ihsjyl+ileiK5sb0C9mC+zXidgBqEM73miAokY="+sudo: false+language: c matrix:- allow_failures:- - env: GHCVER=7.4.2- - env: GHCVER=7.6.3+ include:+ - env: GHCVER=7.8.4 STACK_YAML=stack-lts-2.yml+ addons:+ apt:+ sources: [ hvr-ghc ]+ packages: [ ghc-7.8.4 ]+ - env: GHCVER=7.10.2 STACK_YAML=stack-lts-3.yml+ addons:+ apt:+ sources: [ hvr-ghc ]+ packages: [ ghc-7.10.2 ] before_install:- - eval "$( curl -sL https://github.com/mietek/halcyon/raw/master/setup.sh )"- - export HALCYON_GHC_VERSION=$GHCVER HALCYON_CABAL_VERSION=1.22.4.0- - export HALCYON_S3_BUCKET=himura-halcyon+ - mkdir -p ~/.local/bin+ - export PATH=~/.local/bin:$PATH+ - travis_retry curl -L https://github.com/commercialhaskell/stack/releases/download/v0.1.4.0/stack-0.1.4.0-x86_64-linux.tar.gz | tar xz -C ~/.local/bin+ - export PATH=/opt/ghc/$GHCVER/bin:$PATH install:- - HALCYON_SANDBOX_EXTRA_APPS="hpc-coveralls happy" HALCYON_SANDBOX_EXTRA_CONFIGURE_FLAGS="--enable-tests --only-dependencies $CABAL_FLAGS" halcyon build- - ln -s /app/sandbox/cabal.sandbox.config .+ - travis_wait stack --no-terminal --skip-ghc-check setup+ - travis_wait stack --no-terminal --skip-ghc-check test --only-snapshot script:- - cabal configure --enable-tests --enable-library-coverage $CABAL_FLAGS- - travis_wait run-cabal-test --cabal-name=cabal --show-details=always+ - travis_wait stack --no-terminal --skip-ghc-check test # tests source distribution package- - cabal sdist+ - mkdir -p ./.test-sdist+ - stack sdist 2>&1 | tee ./.test-sdist/sdist-log - | PKGNAME="$(cabal info . | awk '/^\*/{print $2}')"- SRCTGZ="${PKGNAME}.tar.gz"- cd dist/+ SRCTGZ=$(readlink -f $(awk '/^Wrote sdist tarball to / { print $5 }' sdist-log))+ cd ./.test-sdist if [ -f "$SRCTGZ" ]; then tar xvzf "$SRCTGZ" cd "$PKGNAME"@@ -57,5 +45,6 @@ fi fi -after_script:- - hpc-coveralls --exclude-dir=tests tests+cache:+ directories:+ - ~/.stack
ChangeLog.md view
@@ -1,3 +1,8 @@+## 0.1.2++* Streaming API: Support multiple filters (#41)+* Include parameters in body for POST requests (#40)+ ## 0.1.1.1 * Fix warnings on GHC 7.10
Web/Twitter/Conduit/Base.hs view
@@ -68,10 +68,14 @@ -> IO HTTP.Request makeRequest' m url query = do req <- HTTP.parseUrl url- return $ req { HTTP.method = m- , HTTP.queryString = HT.renderSimpleQuery False query- , HTTP.checkStatus = \_ _ _ -> Nothing- }+ let params = HT.renderSimpleQuery False query+ addParams =+ if m == "POST"+ then HTTP.urlEncodedBody query+ else \r -> r { HTTP.queryString = params }+ return $ addParams $ req { HTTP.method = m+ , HTTP.checkStatus = \_ _ _ -> Nothing+ } getResponse :: MonadResource m => TWInfo
Web/Twitter/Conduit/Monad.hs view
@@ -69,9 +69,7 @@ runTW :: ( MonadBaseControl IO m , MonadIO m ) => TWInfo -> TW (ResourceT m) a -> m a-runTW info st = do- mgr <- liftIO $ HTTP.newManager HTTP.tlsManagerSettings- runResourceT $ runTWManager info mgr st+runTW info st = HTTP.withManager $ \mgr -> runTWManager info mgr st runTWManager :: MonadBaseControl IO m => TWInfo -> HTTP.Manager -> TW (ResourceT m) a -> ResourceT m a runTWManager info mgr st = runReaderT st $ TWEnv info mgr
Web/Twitter/Conduit/Stream.hs view
@@ -11,6 +11,8 @@ Userstream , userstream , StatusesFilter+ , FilterParameter (..)+ , statusesFilter , statusesFilterByFollow , statusesFilterByTrack -- , statusesFilterByLocation@@ -33,6 +35,7 @@ import qualified Data.Conduit as C import qualified Data.Conduit.List as CL import qualified Data.Conduit.Internal as CI+import qualified Data.List as L import qualified Data.Text as T import Control.Monad.IO.Class import Data.Aeson@@ -77,18 +80,44 @@ , "replies" ] +-- https://dev.twitter.com/streaming/overview/request-parameters+data FilterParameter = Follow [UserId]+ | Track [T.Text]++-- | Returns statuses/filter.json API query data.+--+-- >>> statusesFilter [Follow [1,2,3]]+-- APIRequestPost "https://stream.twitter.com/1.1/statuses/filter.json" [("follow","1,2,3")]+-- >>> statusesFilter [Track ["haskell","functional"]]+-- APIRequestPost "https://stream.twitter.com/1.1/statuses/filter.json" [("track","haskell,functional")]+-- >>> statusesFilter [Follow [1,2,3],Track ["haskell","functional"]]+-- APIRequestPost "https://stream.twitter.com/1.1/statuses/filter.json" [("follow","1,2,3"),("track","haskell,functional")]+statusesFilter :: [FilterParameter] -> APIRequest StatusesFilter StreamingAPI+statusesFilter = APIRequestPost statusesFilterEndpoint . L.map paramToQueryItem++paramToQueryItem :: FilterParameter -> APIQueryItem+paramToQueryItem (Follow userIds) = ("follow", PVIntegerArray userIds)+paramToQueryItem (Track texts) = ("track", PVStringArray texts)+ statusesFilterEndpoint :: String statusesFilterEndpoint = "https://stream.twitter.com/1.1/statuses/filter.json" data StatusesFilter++-- | Returns statuses/filter.json API query data.+--+-- >>> statusesFilterByFollow [1,2,3]+-- APIRequestPost "https://stream.twitter.com/1.1/statuses/filter.json" [("follow","1,2,3")] statusesFilterByFollow :: [UserId] -> APIRequest StatusesFilter StreamingAPI-statusesFilterByFollow userIds =- APIRequestPost statusesFilterEndpoint [("follow", PVIntegerArray userIds)]+statusesFilterByFollow userIds = statusesFilter [Follow userIds] +-- | Returns statuses/filter.json API query data.+--+-- >>> statusesFilterByTrack "haskell"+-- APIRequestPost "https://stream.twitter.com/1.1/statuses/filter.json" [("track","haskell")] statusesFilterByTrack :: T.Text -- ^ keyword -> APIRequest StatusesFilter StreamingAPI-statusesFilterByTrack keyword =- APIRequestPost statusesFilterEndpoint [("track", PVString keyword)]+statusesFilterByTrack keyword = statusesFilter [Track [keyword]] deriveHasParamInstances ''StatusesFilter [ "language"
tests/doctests.hs view
@@ -2,19 +2,18 @@ import Build_doctests (deps) import Test.DocTest+import Data.Maybe+import System.Environment main = do- let sources =- [ "Web/Twitter/Conduit.hs"- ]-+ env <- getEnvironment+ let dist = fromMaybe "dist" $ lookup "HASKELL_DIST_DIR" env+ autogenDir = dist ++ "/build/autogen"+ args = [ "-i."+ , "-i" ++ autogenDir+ , "-optP-include"+ , "-optP" ++ autogenDir ++ "/cabal_macros.h"+ , "-hide-all-packages"+ ] ++ map ("-package=" ++) deps+ sources = ["Web/Twitter/Conduit.hs"] doctest $ args ++ sources- where- args = ( "-i."- : "-idist/build/autogen"- : "-optP-include"- : "-optPdist/build/autogen/cabal_macros.h"- : "-hide-all-packages"- : map ("-package=" ++) deps- )-
tests/hlint.hs view
@@ -1,6 +1,7 @@ module Main where import Control.Monad+import Data.Maybe import Language.Haskell.HLint import System.Environment import System.Exit@@ -8,5 +9,12 @@ main :: IO () main = do args <- getArgs- hints <- hlint $ ["Web", "--cpp-define=HLINT", "--cpp-ansi", "--cpp-file=dist/build/autogen/cabal_macros.h"] ++ args+ cabalMacros <- getCabalMacrosPath+ hints <- hlint $ ["Web", "--cpp-define=HLINT", "--cpp-ansi", "--cpp-file=" ++ cabalMacros] ++ args unless (null hints) exitFailure++getCabalMacrosPath :: IO FilePath+getCabalMacrosPath = do+ env <- getEnvironment+ let dist = fromMaybe "dist" $ lookup "HASKELL_DIST_DIR" env+ return $ dist ++ "/build/autogen/cabal_macros.h"
twitter-conduit.cabal view
@@ -1,5 +1,5 @@ name: twitter-conduit-version: 0.1.1.1+version: 0.1.2 license: BSD3 license-file: LICENSE author: HATTORI Hiroki, Hideyuki Tanaka, Takahiro HIMURA@@ -117,7 +117,7 @@ test-suite spec_main type: exitcode-stdio-1.0 main-is: spec_main.hs- hs-source-dirs: tests, .+ hs-source-dirs: tests if flag(run-integrated-test) CPP-Options: -DRUN_INTEGRATED_TEST@@ -147,6 +147,7 @@ , hspec , twitter-types >= 0.6 , twitter-types-lens >= 0.6+ , twitter-conduit if flag(network-uri) build-depends: network-uri >= 2.6@@ -222,6 +223,9 @@ build-depends: network-uri >= 2.6 else build-depends: network < 2.6++ other-modules:+ Common executable oauth_callback main-is: oauth_callback.hs