# -*- coding: utf-8 -*-"""Manage the AWS environment that ``s3pathlib`` dealing with."""importtypingasTtry:importboto3exceptImportError:# pragma: no coverpassexcept:# pragma: no coverraiseifT.TYPE_CHECKING:# pragma: no coverfrommypy_boto3_s3importS3Clientfrommypy_boto3_stsimportSTSClientimportbotocore
[docs]classContext:""" A globally available context object managing AWS SDK credentials. TODO: use singleton pattern to create context object """def__init__(self):self.boto_ses:T.Optional["boto3.session.Session"]=Noneself._aws_region:T.Optional[str]=Noneself._aws_account_id:T.Optional[str]=Noneself._s3_client:T.Optional["S3Client"]=Noneself._sts_client:T.Optional["STSClient"]=None# try to create default sessiontry:self.boto_ses=boto3.session.Session()except:# pragma: no coverpass
[docs]defattach_boto_session(self,boto_ses:"boto3.session.Session"):""" Attach a custom boto session, also remove caches. """self.boto_ses=boto_sesself._s3_client=Noneself._sts_client=Noneself._aws_account_id=Noneself._aws_region=None
[docs]defattach_s3_client(self,s3_client:"S3Client"):""" Attach a custom s3 client. """self._s3_client=s3_client
[docs]defattach_sts_client(self,sts_client:"STSClient"):""" Attach a custom sts client. """self._sts_client=sts_client
@propertydefs3_client(self)->"S3Client":""" Access the s3 client. https://boto3.amazonaws.com/v1/documentation/api/latest/reference/services/s3.html#client """ifself._s3_clientisNone:self._s3_client=self.boto_ses.client("s3")returnself._s3_client@propertydefsts_client(self)->"STSClient":""" Access the s3 client. https://boto3.amazonaws.com/v1/documentation/api/latest/reference/services/s3.html#client """ifself._sts_clientisNone:self._sts_client=self.boto_ses.client("sts")returnself._sts_client@propertydefaws_account_id(self)->str:""" The AWS Account ID of the current boto session. """ifself._aws_account_idisNone:self._aws_account_id=self.sts_client.get_caller_identity()["Account"]returnself._aws_account_id@propertydefaws_region(self)->str:""" The AWS Region of the current boto session. """ifself._aws_regionisNone:self._aws_region=self.boto_ses.region_namereturnself._aws_region