Author: Michael R. Crusoe <crusoe@debian.org>
Description: Safer type usage for systems without boto{,3} installed
Forwarded: https://github.com/DataBiosphere/toil/pull/4288

Partial cherry-pick from https://github.com/DataBiosphere/toil/commit/3d23bc5be5bee796571f3bb7514b19f628a87b3a
--- toil.orig/src/toil/lib/aws/utils.py
+++ toil/src/toil/lib/aws/utils.py
@@ -291,7 +291,7 @@
 def bucket_location_to_region(location: Optional[str]) -> str:
     return "us-east-1" if location == "" or location is None else location
 
-def get_object_for_url(url: ParseResult, existing: Optional[bool] = None) -> Object:
+def get_object_for_url(url: ParseResult, existing: Optional[bool] = None) -> "Object":
         """
         Extracts a key (object) from a given parsed s3:// URL.
 
--- toil.orig/src/toil/test/server/serverTest.py
+++ toil/src/toil/test/server/serverTest.py
@@ -181,12 +181,15 @@
     Base class for tests that need a bucket.
     """
 
-    from mypy_boto3_s3 import S3ServiceResource
-    from mypy_boto3_s3.service_resource import Bucket
+    try:
+        from mypy_boto3_s3 import S3ServiceResource
+        from mypy_boto3_s3.service_resource import Bucket
+    except ImportError:
+        pass
 
     region: Optional[str]
-    s3_resource: Optional[S3ServiceResource]
-    bucket: Optional[Bucket]
+    s3_resource: Optional["S3ServiceResource"]
+    bucket: Optional["Bucket"]
     bucket_name: Optional[str]
 
     @classmethod
