packages feed

eurofxref 0.1.2 → 0.2.0

raw patch · 3 files changed

+35/−32 lines, 3 filesdep +conduitdep +http-conduitdep +monad-controldep −enumeratordep −http-enumeratordep ~containersdep ~failuredep ~hexpatPVP ok

version bump matches the API change (PVP)

Dependencies added: conduit, http-conduit, monad-control

Dependencies removed: enumerator, http-enumerator

Dependency ranges changed: containers, failure, hexpat, http-types, mtl, time

API changes (from Hackage documentation)

- Financial.EuroFXRef: europeanCentralBankDaily :: Failure HttpException m => m (Request m)
+ Financial.EuroFXRef: europeanCentralBankDaily :: Failure HttpException m => m (Request m')
- Financial.EuroFXRef: fetchFrom :: (Failure EuropeanCentralBankException m, Failure HttpException m, MonadIO m, Read a) => Request m -> m (Rates a)
+ Financial.EuroFXRef: fetchFrom :: (Failure EuropeanCentralBankException m, Failure HttpException m, MonadResource m, MonadBaseControl IO m, Read a) => Request m -> Manager -> m (Rates a)

Files

Financial/EuroFXRef.hs view
@@ -27,15 +27,13 @@ import Control.Exception import Control.Failure import Control.Monad.State.Strict-import qualified Data.ByteString as B-import Data.Enumerator (Iteratee (..), run_)-import Data.Enumerator.List (consume)+import Control.Monad.Trans.Control+import Data.Conduit (MonadResource, runResourceT, ResourceT) import qualified Data.Map as M-import Data.Monoid import Data.Time.Calendar import Data.Time.Clock import Data.Typeable-import Network.HTTP.Enumerator as HTTP+import Network.HTTP.Conduit as HTTP import Network.HTTP.Types as HTTP import Text.XML.Expat.Tree @@ -92,42 +90,39 @@ parseEuropeanCentralBank _ = Left "element expected at top level"  -- | The URL for the European Central Bank's free daily reference rates.-europeanCentralBankDaily :: Failure HttpException m => m (HTTP.Request m)+europeanCentralBankDaily :: Failure HttpException m => m (HTTP.Request m') europeanCentralBankDaily = parseUrl "http://www.ecb.int/stats/eurofxref/eurofxref-daily.xml"  -- | Fetch today's currency rates from the specified URL. -- -- Throws a 'EuropeanCentralBankException' for failures at HTTP and above, -- or 'IOException' for network-level failures.-fetchFrom :: (Failure EuropeanCentralBankException m, Failure HttpException m, MonadIO m, Read a) =>+fetchFrom :: (Failure EuropeanCentralBankException m, Failure HttpException m,+              MonadResource m, MonadBaseControl IO m, Read a) =>              HTTP.Request m+          -> HTTP.Manager           -> m (Rates a)-fetchFrom req = do-    mgr <- liftIO newManager-    run_ $ httpRedirect req processResponse mgr--processResponse :: (Failure EuropeanCentralBankException m, Read a) =>-                   HTTP.Status-                -> ResponseHeaders-                -> Iteratee B.ByteString m (Rates a)-processResponse status@(Status statusCode _) headers = do-    body <- mconcat <$> consume-    case statusCode of+fetchFrom req mgr = do+    res <- httpLbs req mgr+    let body = responseBody res+    case statusCode (responseStatus res) of         200 -> do-            case parse' defaultParseOptions body of-                Left err -> lift $ failure $ ECBXMLParseException err-                Right xml ->+            case parse defaultParseOptions body of+                (_, Just err) -> failure $ ECBXMLParseException err+                (xml, _) ->                     case parseEuropeanCentralBank xml of-                        Left err -> lift $ failure $ ECBParseException err+                        Left err -> failure $ ECBParseException err                         Right rates -> return rates-        _ -> lift $ failure $ ECBHttpStatusException status+        _ -> failure $ ECBHttpStatusException (responseStatus res)  -- | Fetch today's currency rates from European Central Bank server. -- 'IO' works for @m@ and 'Double' for @a@. -- -- Throws a 'EuropeanCentralBankException' for failures at HTTP and above, -- or 'IOException' for network-level failures.-fetch :: (Failure EuropeanCentralBankException m, Failure HttpException m, MonadIO m, Read a) =>+fetch :: (Failure EuropeanCentralBankException m, Failure HttpException m,+          MonadIO m, Read a) =>          m (Rates a)-fetch = fetchFrom =<< europeanCentralBankDaily-+fetch = do+    req <- europeanCentralBankDaily+    liftIO $ withManager $ fetchFrom req
eurofxref.cabal view
@@ -1,5 +1,5 @@ name: eurofxref-version: 0.1.2+version: 0.2.0 cabal-version: >=1.6 build-type: Simple license: BSD3@@ -20,10 +20,18 @@ data-files: example.hs  Library-    build-depends: base >=4 && <5, bytestring == 0.9.*, containers >= 0.2 && < 0.5,-                   enumerator >= 0.4.7 && < 0.5, failure == 0.1.*, http-enumerator == 0.6.*,-                   http-types == 0.6.*, hexpat >= 0.19.6 && < 0.20, mtl < 2.1,-                   time == 1.2.*+    build-depends:+        base >=4 && <5,+        bytestring == 0.9.*,+        containers >= 0.2 && < 0.6,+        failure >= 0.1,+        monad-control == 0.3.*,+        conduit == 0.5.*,+        http-conduit == 1.5.*,+        http-types >= 0.6.0 && < 0.8.0,+        hexpat >= 0.20.0 && < 0.21,+        mtl >= 2.0.0.0 && < 2.2.0.0,+        time >= 1.2.0.0 && < 1.5.0.0     exposed-modules: Financial.CurrencyRates, Financial.EuroFXRef     exposed: True     buildable: True
example.hs view
@@ -1,5 +1,5 @@ import Financial.EuroFXRef-import Network.HTTP.Enumerator (parseUrl)+import Network.HTTP.Conduit (parseUrl) import Control.Applicative import Control.Exception import Control.Monad