antiope-s3 6.0.5 → 6.1.0
raw patch · 6 files changed
+123/−40 lines, 6 filesPVP ok
version bump matches the API change (PVP)
API changes (from Hackage documentation)
- Antiope.S3: downloadLBS :: (MonadAWS m, MonadResource m) => BucketName -> ObjectKey -> m ByteString
- Antiope.S3: downloadLBS' :: (MonadAWS m, MonadResource m) => BucketName -> ObjectKey -> m (Maybe ByteString)
- Antiope.S3: downloadS3Uri :: (MonadAWS m, MonadResource m) => S3Uri -> m (Maybe ByteString)
+ Antiope.S3.GetObject: getObject :: MonadAWS m => BucketName -> ObjectKey -> m (Rs GetObject)
+ Antiope.S3.GetObject: getObjectForS3Uri :: MonadAWS m => S3Uri -> m GetObjectResponse
+ Antiope.S3.GetObject: lazyByteString :: MonadResource m => RsBody -> m ByteString
+ Antiope.S3.Lazy: download :: (MonadAWS m, MonadResource m) => BucketName -> ObjectKey -> m (Maybe ByteString)
+ Antiope.S3.Lazy: downloadFromS3Uri :: (MonadAWS m, MonadResource m) => S3Uri -> m (Maybe ByteString)
+ Antiope.S3.Lazy: unsafeDownload :: (MonadAWS m, MonadResource m) => BucketName -> ObjectKey -> m ByteString
+ Antiope.S3.Strict: download :: (MonadAWS m, MonadUnliftIO m) => BucketName -> ObjectKey -> m (Maybe ByteString)
+ Antiope.S3.Strict: downloadFromS3Uri :: (MonadAWS m, MonadUnliftIO m) => S3Uri -> m (Maybe ByteString)
+ Antiope.S3.Strict: unsafeDownload :: (MonadAWS m, MonadUnliftIO m) => BucketName -> ObjectKey -> m ByteString
Files
- antiope-s3.cabal +6/−2
- src/Antiope/S3.hs +4/−36
- src/Antiope/S3/GetObject.hs +33/−0
- src/Antiope/S3/Lazy.hs +43/−0
- src/Antiope/S3/Strict.hs +35/−0
- test/Antiope/S3Spec.hs +2/−2
antiope-s3.cabal view
@@ -2,10 +2,10 @@ -- -- see: https://github.com/sol/hpack ----- hash: b7cf7304b5bae80126c4ada18b9c5026d495b4687dbf94483446682c5dd9ea72+-- hash: cb9253395f0d7044cd5476617e13b349681f71983576c96f9c54dc1fd444ecfc name: antiope-s3-version: 6.0.5+version: 6.1.0 description: Please see the README on Github at <https://github.com/arbor/antiope#readme> category: Services homepage: https://github.com/arbor/antiope#readme@@ -28,7 +28,10 @@ library exposed-modules: Antiope.S3+ Antiope.S3.GetObject Antiope.S3.Internal+ Antiope.S3.Lazy+ Antiope.S3.Strict Antiope.S3.Types other-modules: Paths_antiope_s3@@ -40,6 +43,7 @@ amazonka >=1.6 , amazonka-core >=1.6 , amazonka-s3 >=1.6+ , antiope-core , base >=4.7 && <5 , bytestring , conduit
src/Antiope/S3.hs view
@@ -2,10 +2,7 @@ {-# LANGUAGE TupleSections #-} module Antiope.S3-( downloadLBS-, downloadLBS'-, downloadS3Uri-, s3ObjectSource+( s3ObjectSource , putFile, putContent , putContent' , copySingle , fromS3Uri@@ -23,21 +20,17 @@ import Antiope.S3.Types (S3Uri (S3Uri)) import Control.Lens import Control.Monad-import Control.Monad.Catch (catch) import Control.Monad.Trans.AWS hiding (send) import Control.Monad.Trans.Resource-import Data.ByteString.Lazy (ByteString, empty) import Data.Conduit import Data.Conduit.Combinators as CC (concatMap)-import Data.Conduit.Lazy (lazyConsume) import Data.Conduit.List (unfoldM) import Data.Monoid ((<>)) import Data.Text as T (Text, pack, unpack)-import Network.AWS (Error (..), MonadAWS, ServiceError (..))+import Network.AWS (MonadAWS) import Network.AWS.Data import Network.AWS.Data.Body (_streamBody) import Network.AWS.S3-import Network.HTTP.Types.Status (Status (..)) import Network.URI (URI (..), URIAuth (..), parseURI, unEscapeString) import qualified Data.ByteString as BS@@ -55,31 +48,6 @@ let k = pack $ unEscapeString $ drop 1 $ puri & uriPath pure $ S3Uri (BucketName b) (ObjectKey k) -downloadLBS :: (MonadAWS m, MonadResource m)- => BucketName- -> ObjectKey- -> m ByteString-downloadLBS bucketName objectKey = do- resp <- AWS.send $ getObject bucketName objectKey- liftResourceT $ LBS.fromChunks <$> lazyConsume (_streamBody $ resp ^. gorsBody)--downloadLBS' :: (MonadAWS m, MonadResource m)- => BucketName- -> ObjectKey- -> m (Maybe ByteString)-downloadLBS' bucketName objectKey = do- ebs <- (Right <$> downloadLBS bucketName objectKey) `catch` \(err :: Error) -> case err of- (ServiceError (ServiceError' _ (Status 404 _) _ _ _ _)) -> return (Left empty)- _ -> throwM err- case ebs of- Right bs -> return (Just bs)- Left _ -> return Nothing--downloadS3Uri :: (MonadAWS m, MonadResource m)- => S3Uri- -> m (Maybe ByteString)-downloadS3Uri (S3Uri b k) = downloadLBS' b k- s3ObjectSource :: (MonadAWS m, MonadResource m) => BucketName -> ObjectKey@@ -101,13 +69,13 @@ putContent :: MonadAWS m => BucketName -> ObjectKey- -> ByteString+ -> LBS.ByteString -> m (Maybe ETag) putContent b k c = view porsETag <$> AWS.send (putObject b k (toBody c)) putContent' :: MonadAWS m => S3Uri- -> ByteString+ -> LBS.ByteString -> m (Maybe ETag) putContent' (S3Uri b k) = putContent b k
+ src/Antiope/S3/GetObject.hs view
@@ -0,0 +1,33 @@+{-# LANGUAGE ScopedTypeVariables #-}++module Antiope.S3.GetObject+ ( lazyByteString+ , getObject+ , getObjectForS3Uri+ ) where++import Antiope.S3.Types (S3Uri (S3Uri))+import Control.Monad.Trans.AWS hiding (send)+import Control.Monad.Trans.Resource+import Data.Conduit.Lazy (lazyConsume)+import Network.AWS (MonadAWS)+import Network.AWS.Data.Body (_streamBody)++import qualified Data.ByteString.Lazy as LBS+import qualified Network.AWS as AWS+import qualified Network.AWS.S3 as AWS++-- | Access the response body as a lazy bytestring+lazyByteString :: MonadResource m => RsBody -> m LBS.ByteString+lazyByteString rsBody = liftResourceT $ LBS.fromChunks <$> lazyConsume (_streamBody rsBody)++getObject :: MonadAWS m+ => AWS.BucketName+ -> AWS.ObjectKey+ -> m (AWS.Rs AWS.GetObject)+getObject bucketName objectKey = AWS.send $ AWS.getObject bucketName objectKey++getObjectForS3Uri :: MonadAWS m+ => S3Uri+ -> m AWS.GetObjectResponse+getObjectForS3Uri (S3Uri bucketName objectKey) = getObject bucketName objectKey
+ src/Antiope/S3/Lazy.hs view
@@ -0,0 +1,43 @@+{-# LANGUAGE ScopedTypeVariables #-}++module Antiope.S3.Lazy+ ( unsafeDownload+ , download+ , downloadFromS3Uri+ ) where++import Antiope.S3.GetObject+import Antiope.S3.Types (S3Uri (S3Uri))+import Control.Lens+import Control.Monad.Catch (catch)+import Control.Monad.Trans.Resource+import Network.AWS (Error (..), MonadAWS, ServiceError (..))+import Network.HTTP.Types.Status (Status (..))++import qualified Data.ByteString.Lazy as LBS+import qualified Network.AWS.S3 as AWS++unsafeDownload :: (MonadAWS m, MonadResource m)+ => AWS.BucketName+ -> AWS.ObjectKey+ -> m LBS.ByteString+unsafeDownload bucketName objectKey = do+ resp <- getObject bucketName objectKey+ lazyByteString (resp ^. AWS.gorsBody)++download :: (MonadAWS m, MonadResource m)+ => AWS.BucketName+ -> AWS.ObjectKey+ -> m (Maybe LBS.ByteString)+download bucketName objectKey = do+ ebs <- (Right <$> unsafeDownload bucketName objectKey) `catch` \(err :: Error) -> case err of+ (ServiceError (ServiceError' _ (Status 404 _) _ _ _ _)) -> return (Left LBS.empty)+ _ -> throwM err+ case ebs of+ Right bs -> return (Just bs)+ Left _ -> return Nothing++downloadFromS3Uri :: (MonadAWS m, MonadResource m)+ => S3Uri+ -> m (Maybe LBS.ByteString)+downloadFromS3Uri (S3Uri b k) = download b k
+ src/Antiope/S3/Strict.hs view
@@ -0,0 +1,35 @@+{-# LANGUAGE ScopedTypeVariables #-}++module Antiope.S3.Strict+ ( unsafeDownload+ , download+ , downloadFromS3Uri+ ) where++import Antiope.Core ()+import Antiope.S3.Types (S3Uri)+import Control.Monad.Trans.AWS hiding (send)+import Control.Monad.Trans.Resource+import Network.AWS (MonadAWS)++import qualified Antiope.S3.Lazy as LBS+import qualified Data.ByteString as BS+import qualified Data.ByteString.Lazy as LBS+import qualified Network.AWS.S3 as AWS++unsafeDownload :: (MonadAWS m, MonadUnliftIO m)+ => AWS.BucketName+ -> AWS.ObjectKey+ -> m BS.ByteString+unsafeDownload bucketName objectKey = runResourceT $ LBS.toStrict <$> LBS.unsafeDownload bucketName objectKey++download :: (MonadAWS m, MonadUnliftIO m)+ => AWS.BucketName+ -> AWS.ObjectKey+ -> m (Maybe BS.ByteString)+download bucketName objectKey = runResourceT $ fmap LBS.toStrict <$> LBS.download bucketName objectKey++downloadFromS3Uri :: (MonadAWS m, MonadUnliftIO m)+ => S3Uri+ -> m (Maybe BS.ByteString)+downloadFromS3Uri s3Uri = runResourceT $ fmap LBS.toStrict <$> LBS.downloadFromS3Uri s3Uri
test/Antiope/S3Spec.hs view
@@ -2,7 +2,6 @@ import Antiope.Core import Antiope.Env-import Antiope.S3 import Control.Monad.IO.Class import Data.Maybe (fromJust) import HaskellWorks.Hspec.Hedgehog@@ -10,6 +9,7 @@ import System.Environment (lookupEnv) import Test.Hspec +import qualified Antiope.S3.Lazy as LBS import qualified Data.ByteString.Lazy.Char8 as LBS {-# ANN module ("HLint: Ignore Redundant do" :: String) #-}@@ -22,7 +22,7 @@ Just remoteS3Uri -> do env <- liftIO $ mkEnv Oregon (const LBS.putStrLn) liftIO $ runResourceT $ do- mlbs <- runAws env $ downloadS3Uri (read remoteS3Uri)+ mlbs <- runAws env $ LBS.downloadFromS3Uri (read remoteS3Uri) let lbs = fromJust mlbs let !_ = LBS.take 10 lbs return ()