aws-arn 0.3.0.0 → 0.3.1.0
raw patch · 4 files changed
+158/−2 lines, 4 filesdep ~basedep ~tastydep ~textPVP ok
version bump matches the API change (PVP)
Dependency ranges changed: base, tasty, text
API changes (from Hackage documentation)
+ Network.AWS.ARN.S3: Bucket :: Text -> Bucket
+ Network.AWS.ARN.S3: Object :: Bucket -> Text -> Object
+ Network.AWS.ARN.S3: [$sel:bucket:Object] :: Object -> Bucket
+ Network.AWS.ARN.S3: [$sel:bucketName:Bucket] :: Bucket -> Text
+ Network.AWS.ARN.S3: [$sel:objectKey:Object] :: Object -> Text
+ Network.AWS.ARN.S3: _Bucket :: Prism' Text Bucket
+ Network.AWS.ARN.S3: _Object :: Prism' Text Object
+ Network.AWS.ARN.S3: data Object
+ Network.AWS.ARN.S3: instance Data.Hashable.Class.Hashable Network.AWS.ARN.S3.Bucket
+ Network.AWS.ARN.S3: instance Data.Hashable.Class.Hashable Network.AWS.ARN.S3.Object
+ Network.AWS.ARN.S3: instance GHC.Classes.Eq Network.AWS.ARN.S3.Bucket
+ Network.AWS.ARN.S3: instance GHC.Classes.Eq Network.AWS.ARN.S3.Object
+ Network.AWS.ARN.S3: instance GHC.Classes.Ord Network.AWS.ARN.S3.Bucket
+ Network.AWS.ARN.S3: instance GHC.Classes.Ord Network.AWS.ARN.S3.Object
+ Network.AWS.ARN.S3: instance GHC.Generics.Generic Network.AWS.ARN.S3.Bucket
+ Network.AWS.ARN.S3: instance GHC.Generics.Generic Network.AWS.ARN.S3.Object
+ Network.AWS.ARN.S3: instance GHC.Show.Show Network.AWS.ARN.S3.Bucket
+ Network.AWS.ARN.S3: instance GHC.Show.Show Network.AWS.ARN.S3.Object
+ Network.AWS.ARN.S3: newtype Bucket
+ Network.AWS.ARN.S3: parseBucket :: Text -> Maybe Bucket
+ Network.AWS.ARN.S3: parseObject :: Text -> Maybe Object
+ Network.AWS.ARN.S3: renderBucket :: Bucket -> Text
+ Network.AWS.ARN.S3: renderObject :: Object -> Text
Files
- CHANGELOG.md +4/−0
- aws-arn.cabal +4/−2
- src/Network/AWS/ARN/S3.hs +105/−0
- test/Network/AWS/ARN/S3/Test.hs +45/−0
CHANGELOG.md view
@@ -1,5 +1,9 @@ # Revision history for aws-arn +## 0.3.1.0 -- 2023-03-01++* Add `Network.AWS.ARN.S3` with support for S3 bucket and object ARNs.+ ## 0.3.0.0 -- 2022-10-14 * Reinstate the improper `Iso'`s from version 0.1.x; the 0.2.0.0
aws-arn.cabal view
@@ -1,6 +1,6 @@ cabal-version: 2.2 name: aws-arn-version: 0.3.0.0+version: 0.3.1.0 synopsis: Types and optics for manipulating Amazon Resource Names (ARNs) @@ -53,7 +53,7 @@ common deps build-depends:- , base >=4.12 && <4.17+ , base >=4.12 && <4.18 , deriving-compat >=0.5.10 && <0.7 , profunctors >=5.0 && <5.7 , tagged ^>=0.8@@ -65,6 +65,7 @@ Network.AWS.ARN Network.AWS.ARN.Internal.Lens Network.AWS.ARN.Lambda+ Network.AWS.ARN.S3 build-depends: hashable >=1.3.0.0 && <1.5 hs-source-dirs: src@@ -75,6 +76,7 @@ main-is: Main.hs other-modules: Network.AWS.ARN.Lambda.Test+ Network.AWS.ARN.S3.Test Network.AWS.ARN.Test hs-source-dirs: test
+ src/Network/AWS/ARN/S3.hs view
@@ -0,0 +1,105 @@+{-# LANGUAGE DeriveAnyClass #-}+{-# LANGUAGE DeriveGeneric #-}+{-# LANGUAGE DerivingStrategies #-}+{-# LANGUAGE DuplicateRecordFields #-}+{-# LANGUAGE NamedFieldPuns #-}+{-# LANGUAGE OverloadedStrings #-}+{-# OPTIONS_HADDOCK show-extensions #-}++-- |+--+-- Module : Network.AWS.ARN.S3+-- Copyright : (C) 2020-2023 Bellroy Pty Ltd+-- License : BSD-3-Clause+-- Maintainer : Bellroy Tech Team <haskell@bellroy.com>+-- Stability : experimental+module Network.AWS.ARN.S3+ ( -- * S3 Object+ Object (..),+ parseObject,+ renderObject,++ -- * S3 Bucket+ Bucket (..),+ parseBucket,+ renderBucket,++ -- ** Prisms+ _Object,+ _Bucket,+ )+where++import Data.Hashable (Hashable)+import Data.Text (Text)+import qualified Data.Text as T+import GHC.Generics (Generic)+import Network.AWS.ARN.Internal.Lens (Prism', prism')++-- $setup+-- >>> :set -XOverloadedStrings+-- >>> import Network.AWS.ARN.Internal.Lens ((^?))++-- | An AWS S3 object, made of a bucket and an object key.+--+-- >>> "bucket-name/my/object" ^? _Object+-- Just (Object {bucket = Bucket {bucketName = "bucket-name"}, objectKey = "my/object"})+--+-- >>> "bucket-name" ^? _Object+-- Nothing+--+-- >>> bucket <$> "bucket-name/my/object" ^? _Object+-- Just (Bucket {bucketName = "bucket-name"})+--+-- @since 0.3.1.0+data Object = Object+ { bucket :: Bucket,+ objectKey :: Text+ }+ deriving (Eq, Ord, Hashable, Show, Generic)++-- | @since 0.3.1.0+parseObject :: Text -> Maybe Object+parseObject t = case T.breakOn "/" t of+ ("", _) -> Nothing+ (_, "") -> Nothing+ (bucketName, object) -> Just $ Object (Bucket bucketName) (T.drop 1 object)++-- | @since 0.3.1.0+renderObject :: Object -> Text+renderObject Object {bucket, objectKey} =+ renderBucket bucket <> "/" <> objectKey++-- | @since 0.3.1.0+_Object :: Prism' Text Object+_Object = prism' renderObject parseObject++-- | An AWS S3 bucket, without an object key.+--+-- >>> "bucket-name" ^? _Bucket+-- Just (Bucket {bucketName = "bucket-name"})+--+-- >>> "bucket-name/my/object" ^? _Bucket+-- Nothing+--+-- >>> let b = Bucket "my-bucket" in renderObject . Object b <$> ["obj1", "obj2"]+-- ["my-bucket/obj1","my-bucket/obj2"]+--+-- @since 0.3.1.0+newtype Bucket = Bucket {bucketName :: Text}+ deriving stock (Eq, Ord, Show, Generic)+ deriving anyclass (Hashable)++-- | @since 0.3.1.0+parseBucket :: Text -> Maybe Bucket+parseBucket t = case T.breakOn "/" t of+ (bucket, "") -> Just $ Bucket bucket+ _ -> Nothing++-- | @since 0.3.1.0+renderBucket :: Bucket -> Text+renderBucket Bucket {bucketName} = bucketName++-- | @since 0.3.1.0+_Bucket :: Prism' Text Bucket+_Bucket = prism' renderBucket parseBucket
+ test/Network/AWS/ARN/S3/Test.hs view
@@ -0,0 +1,45 @@+{-# LANGUAGE NamedFieldPuns #-}+{-# LANGUAGE OverloadedStrings #-}++module Network.AWS.ARN.S3.Test where++import Data.Text (Text)+import Network.AWS.ARN.Internal.Lens (Lens', set, (^?))+import Network.AWS.ARN.S3+import Test.Tasty+import Test.Tasty.HUnit++test_all :: TestTree+test_all =+ testGroup+ "Network.AWS.ARN.S3"+ [ testGroup+ "Object"+ [ testGroup+ "parsing"+ [ testCase "s3 bucket" $+ "bucket-name" ^? _Object @?= Nothing,+ testCase "s3 bucket and object" $+ "bucket-name/my/object" ^? _Object @?= Just (Object (Bucket "bucket-name") "my/object")+ ],+ testGroup+ "updating"+ [ testCase "setting object key" $+ set (_Object . rObjectKey) "my/other/object" "bucket-name/my/object"+ @?= "bucket-name/my/other/object"+ ]+ ]+ , testGroup+ "S3 bucket"+ [ testGroup+ "parsing"+ [ testCase "s3 bucket" $+ "bucket-name" ^? _Bucket @?= Just (Bucket "bucket-name"),+ testCase "s3 bucket and object" $+ "bucket-name/my/object" ^? _Bucket @?= Nothing+ ]+ ]+ ]++rObjectKey :: Lens' Object Text+rObjectKey l r@Object {objectKey} = (\o -> r {objectKey = o}) <$> l objectKey