packages feed

antiope-s3 7.4.5 → 7.5.0

raw patch · 8 files changed

+74/−8 lines, 8 filesPVP ok

version bump matches the API change (PVP)

API changes (from Hackage documentation)

+ Antiope.S3: Downloaded :: UTCTime -> S3Uri -> a -> DownloadResult a
+ Antiope.S3: NotFound :: S3Uri -> DownloadResult a
+ Antiope.S3: NotModified :: S3Uri -> DownloadResult a
+ Antiope.S3: data DownloadResult a
+ Antiope.S3: data UTCTime
+ Antiope.S3.Lazy: Downloaded :: UTCTime -> S3Uri -> a -> DownloadResult a
+ Antiope.S3.Lazy: NotFound :: S3Uri -> DownloadResult a
+ Antiope.S3.Lazy: NotModified :: S3Uri -> DownloadResult a
+ Antiope.S3.Lazy: S3Uri :: BucketName -> ObjectKey -> S3Uri
+ Antiope.S3.Lazy: data BucketName
+ Antiope.S3.Lazy: data DownloadResult a
+ Antiope.S3.Lazy: data ObjectKey
+ Antiope.S3.Lazy: data S3Uri
+ Antiope.S3.Lazy: data UTCTime
+ Antiope.S3.Lazy: downloadIfModifiedSince :: (MonadAWS m, MonadResource m) => S3Uri -> Maybe UTCTime -> m (DownloadResult ByteString)
+ Antiope.S3.Lazy: unsafeDownloadIfModifiedSince :: (MonadAWS m, MonadResource m) => BucketName -> ObjectKey -> Maybe UTCTime -> m (UTCTime, ByteString)
+ Antiope.S3.Strict: Downloaded :: UTCTime -> S3Uri -> a -> DownloadResult a
+ Antiope.S3.Strict: NotFound :: S3Uri -> DownloadResult a
+ Antiope.S3.Strict: NotModified :: S3Uri -> DownloadResult a
+ Antiope.S3.Strict: S3Uri :: BucketName -> ObjectKey -> S3Uri
+ Antiope.S3.Strict: data BucketName
+ Antiope.S3.Strict: data DownloadResult a
+ Antiope.S3.Strict: data ObjectKey
+ Antiope.S3.Strict: data S3Uri
+ Antiope.S3.Strict: data UTCTime
+ Antiope.S3.Strict: downloadIfModifiedSince :: (MonadAWS m, MonadUnliftIO m) => S3Uri -> Maybe UTCTime -> m (DownloadResult ByteString)
+ Antiope.S3.Types: Downloaded :: UTCTime -> S3Uri -> a -> DownloadResult a
+ Antiope.S3.Types: NotFound :: S3Uri -> DownloadResult a
+ Antiope.S3.Types: NotModified :: S3Uri -> DownloadResult a
+ Antiope.S3.Types: data DownloadResult a
+ Antiope.S3.Types: instance GHC.Base.Functor Antiope.S3.Types.DownloadResult
+ Antiope.S3.Types: instance GHC.Classes.Eq a => GHC.Classes.Eq (Antiope.S3.Types.DownloadResult a)
+ Antiope.S3.Types: instance GHC.Classes.Ord a => GHC.Classes.Ord (Antiope.S3.Types.DownloadResult a)
+ Antiope.S3.Types: instance GHC.Show.Show a => GHC.Show.Show (Antiope.S3.Types.DownloadResult a)

Files

antiope-s3.cabal view
@@ -1,7 +1,7 @@ cabal-version: 2.4  name:                   antiope-s3-version:                7.4.5+version:                7.5.0 synopsis:               Please see the README on Github at <https://github.com/arbor/antiope#readme> description:            Please see the README on Github at <https://github.com/arbor/antiope#readme>. category:               Services
src/Antiope/S3.hs view
@@ -17,13 +17,15 @@ , Region(..) , BucketName(..) , ObjectKey(..)+, DownloadResult(..) , ETag(..) , S3Uri(..)+, UTCTime ) where  import Antiope.Core.Error           (handle404ToNone) import Antiope.S3.Internal-import Antiope.S3.Types             (S3Uri (S3Uri, objectKey))+import Antiope.S3.Types             (DownloadResult (..), S3Uri (S3Uri, objectKey)) import Conduit import Control.Lens import Control.Monad@@ -33,6 +35,7 @@ import Data.Maybe                   (catMaybes, isJust) import Data.Monoid                  ((<>)) import Data.Text                    as T (Text, pack, unpack)+import Data.Time.Clock              (UTCTime) import Network.AWS                  (MonadAWS) import Network.AWS.Data.Body        (_streamBody) import Network.AWS.Data.Text        (toText)
src/Antiope/S3/Lazy.hs view
@@ -1,27 +1,39 @@ {-# LANGUAGE DataKinds           #-}+{-# LANGUAGE LambdaCase          #-} {-# LANGUAGE ScopedTypeVariables #-} {-# LANGUAGE TypeApplications    #-}  module Antiope.S3.Lazy   ( unsafeDownload   , unsafeDownloadRequest+  , unsafeDownloadIfModifiedSince   , download   , downloadRequest   , downloadFromS3Uri+  , downloadIfModifiedSince   , listObjectsV2   , listS3Uris   , dlistObjectsV2   , dlistS3Uris   , s3UriToListObjectsV2+  , DownloadResult (..)+  , S3Uri(..)+  , AWS.BucketName+  , AWS.ObjectKey+  , UTCTime   ) where  import Antiope.Core.Error import Antiope.S3.GetObject-import Antiope.S3.Types             (S3Uri (S3Uri), s3UriToListObjectsV2)+import Antiope.S3.Types             (DownloadResult (..), S3Uri (S3Uri), s3UriToListObjectsV2) import Control.Lens import Control.Monad.IO.Unlift import Control.Monad.Trans.Resource+import Data.Maybe                   (fromMaybe)+import Data.Time.Clock              (UTCTime)+import Data.Time.Clock.POSIX        (posixSecondsToUTCTime) import Network.AWS                  (MonadAWS)+import Network.HTTP.Types.Status    (Status (..))  import qualified Antiope.S3.Internal  as I import qualified Data.ByteString.Lazy as LBS@@ -42,6 +54,33 @@   -> AWS.ObjectKey   -> m LBS.ByteString unsafeDownload bucketName objectKey = unsafeDownloadRequest (AWS.getObject bucketName objectKey)++unsafeDownloadIfModifiedSince :: (MonadAWS m, MonadResource m)+  => AWS.BucketName+  -> AWS.ObjectKey+  -> Maybe UTCTime+  -> m (UTCTime, LBS.ByteString)+unsafeDownloadIfModifiedSince bkt obj since = do+  let req = AWS.getObject bkt obj & AWS.goIfModifiedSince .~ since+  resp <- AWS.send req+  -- in practice AWS will never return Nothing for the timestamp, but the API allows it+  let modified = fromMaybe (posixSecondsToUTCTime 0) (resp ^. AWS.gorsLastModified)+  body <- lazyByteString (resp ^. AWS.gorsBody)+  pure (modified, body)++downloadIfModifiedSince :: (MonadAWS m, MonadResource m)+  => S3Uri+  -> Maybe UTCTime+  -> m (DownloadResult LBS.ByteString)+downloadIfModifiedSince uri@(S3Uri bucketName objectKey) since =+  handleServiceError+    (unsafeDownloadIfModifiedSince bucketName objectKey since)+    (\(ts, bs) -> Downloaded ts uri bs)+    (\case+        Status 404 _ -> Just $ NotFound uri+        Status 304 _ -> Just $ NotModified uri+        _            -> Nothing+    )  downloadRequest :: (MonadAWS m, MonadResource m)   => AWS.GetObject
src/Antiope/S3/Strict.hs view
@@ -3,18 +3,25 @@ module Antiope.S3.Strict   ( unsafeDownload   , download+  , downloadIfModifiedSince   , downloadFromS3Uri-   , unsafeDownloadMap   , downloadMap   , downloadMapFromS3Uri+  , DownloadResult (..)+  , S3Uri(..)+  , AWS.BucketName+  , AWS.ObjectKey+  , UTCTime   ) where  import Antiope.Core                 ()-import Antiope.S3.Types             (S3Uri)+import Antiope.S3.Types             (DownloadResult, S3Uri)+import Control.DeepSeq              (force) import Control.Monad                ((<$!>)) import Control.Monad.Trans.AWS      hiding (send) import Control.Monad.Trans.Resource+import Data.Time.Clock              (UTCTime) import Network.AWS                  (MonadAWS)  import qualified Antiope.S3.Lazy      as LBS@@ -33,6 +40,13 @@   -> AWS.ObjectKey   -> m (Maybe BS.ByteString) download bucketName objectKey = runResourceT $  (LBS.toStrict <$!>) <$!> LBS.download bucketName objectKey++downloadIfModifiedSince :: (MonadAWS m, MonadUnliftIO m)+  => S3Uri+  -> Maybe UTCTime+  -> m (DownloadResult BS.ByteString)+downloadIfModifiedSince uri since =+  runResourceT $ fmap (force . LBS.toStrict) <$!> LBS.downloadIfModifiedSince uri since  downloadFromS3Uri :: (MonadAWS m, MonadUnliftIO m)   => S3Uri
src/Antiope/S3/Types.hs view
@@ -1,5 +1,6 @@ {-# LANGUAGE DataKinds         #-} {-# LANGUAGE DeriveAnyClass    #-}+{-# LANGUAGE DeriveFunctor     #-} {-# LANGUAGE DeriveGeneric     #-} {-# LANGUAGE OverloadedStrings #-} {-# LANGUAGE TypeApplications  #-}@@ -9,6 +10,7 @@   , X.ObjectKey(..)   , X.ETag(..)   , S3Uri(..)+  , DownloadResult(..)   , readBucketName   , readWhile   , dirname@@ -26,6 +28,7 @@ import Data.Generics.Product.Any import Data.List import Data.Semigroup            ((<>))+import Data.Time.Clock           (UTCTime) import GHC.Generics import Network.AWS.Data import Network.AWS.S3            (BucketName (..), ObjectKey (..))@@ -39,6 +42,13 @@ import qualified Network.AWS.S3                  as AWS import qualified Network.AWS.S3.Types            as X import qualified Text.ParserCombinators.ReadPrec as RP++data DownloadResult a+  = NotFound S3Uri+  | NotModified S3Uri+  | Downloaded UTCTime S3Uri a+  deriving (Show, Ord, Eq, Functor)+  data S3Uri = S3Uri   { bucket    :: BucketName
test/Antiope/S3/MessagesSpec.hs view
@@ -15,7 +15,7 @@ import qualified Hedgehog.Gen   as Gen import qualified Hedgehog.Range as Range -{-# ANN module ("HLint: Ignore Redundant do" :: String) #-}+{-# ANN module ("HLint: ignore Redundant do" :: String) #-}  genUTCTime :: MonadGen m => m UTCTime genUTCTime = do
test/Antiope/S3/TypesSpec.hs view
@@ -6,7 +6,7 @@ import Hedgehog import Test.Hspec -{-# ANN module ("HLint: Ignore Redundant do" :: String) #-}+{-# ANN module ("HLint: ignore Redundant do" :: String) #-}  spec :: Spec spec = describe "Antiope.TypesSpec" $ do
test/Antiope/S3Spec.hs view
@@ -12,7 +12,7 @@ import qualified Antiope.S3.Lazy            as LBS import qualified Data.ByteString.Lazy.Char8 as LBS -{-# ANN module ("HLint: Ignore Redundant do" :: String) #-}+{-# ANN module ("HLint: ignore Redundant do" :: String) #-}  spec :: Spec spec = describe "Antiope.S3Spec" $ do