2828 Dict ,
2929 Iterable ,
3030 NoReturn ,
31- Optional ,
3231 Sequence ,
3332 Tuple ,
3433 TypeVar ,
35- Union ,
3634 cast ,
3735)
3836
@@ -146,17 +144,17 @@ def mfa_provider_generator(
146144 raise ValueError (f"mfa provider has unsupported value of '{ provider } '" )
147145
148146
149- def ask_password_in_console (_user : str ) -> Optional [ str ] :
150- return typing .cast (Optional [ str ] , click .prompt ("iCloud Password" , hide_input = True ))
147+ def ask_password_in_console (_user : str ) -> str | None :
148+ return typing .cast (str | None , click .prompt ("iCloud Password" , hide_input = True ))
151149 # return getpass.getpass(
152150 # f'iCloud Password for {_user}:'
153151 # )
154152
155153
156154def get_password_from_webui (
157155 logger : Logger , status_exchange : StatusExchange
158- ) -> Callable [[str ], Optional [ str ] ]:
159- def _intern (_user : str ) -> Optional [ str ] :
156+ ) -> Callable [[str ], str | None ]:
157+ def _intern (_user : str ) -> str | None :
160158 """Request two-factor authentication through Webui."""
161159 if not status_exchange .replace_status (Status .NO_INPUT_NEEDED , Status .NEED_PASSWORD ):
162160 logger .error ("Expected NO_INPUT_NEEDED, but got something else" )
@@ -216,8 +214,8 @@ def _intern(username: str, password: str) -> None:
216214
217215def password_provider_generator (
218216 _ctx : click .Context , _param : click .Parameter , providers : Sequence [str ]
219- ) -> Dict [str , Tuple [Callable [[str ], Optional [ str ] ], Callable [[str , str ], None ]]]:
220- def _map (provider : str ) -> Tuple [Callable [[str ], Optional [ str ] ], Callable [[str , str ], None ]]:
217+ ) -> Dict [str , Tuple [Callable [[str ], str | None ], Callable [[str , str ], None ]]]:
218+ def _map (provider : str ) -> Tuple [Callable [[str ], str | None ], Callable [[str , str ], None ]]:
221219 if provider == "webui" :
222220 return (ask_password_in_console , dummy_password_writter )
223221 if provider == "console" :
@@ -263,7 +261,7 @@ def file_match_policy_generator(
263261
264262def skip_created_before_generator (
265263 _ctx : click .Context , _param : click .Parameter , formatted : str
266- ) -> Optional [ Union [ datetime .datetime , datetime .timedelta ]] :
264+ ) -> datetime .datetime | datetime .timedelta | None :
267265 if formatted is None :
268266 return None
269267 result = parse_timestamp_or_timedelta (formatted )
@@ -606,16 +604,16 @@ def report_version(ctx: click.Context, _param: click.Parameter, value: bool) ->
606604 callback = report_version ,
607605)
608606def main (
609- directory : Optional [ str ] ,
607+ directory : str | None ,
610608 username : str ,
611- password : Optional [ str ] ,
609+ password : str | None ,
612610 auth_only : bool ,
613611 cookie_directory : str ,
614612 size : Sequence [AssetVersionSize ],
615613 live_photo_size : LivePhotoVersionSize ,
616- recent : Optional [ int ] ,
617- until_found : Optional [ int ] ,
618- album : Optional [ str ] ,
614+ recent : int | None ,
615+ until_found : int | None ,
616+ album : str | None ,
619617 list_albums : bool ,
620618 library : str ,
621619 list_libraries : bool ,
@@ -627,32 +625,30 @@ def main(
627625 only_print_filenames : bool ,
628626 folder_structure : str ,
629627 set_exif_datetime : bool ,
630- smtp_username : Optional [ str ] ,
631- smtp_password : Optional [ str ] ,
628+ smtp_username : str | None ,
629+ smtp_password : str | None ,
632630 smtp_host : str ,
633631 smtp_port : int ,
634632 smtp_no_tls : bool ,
635- notification_email : Optional [ str ] ,
636- notification_email_from : Optional [ str ] ,
633+ notification_email : str | None ,
634+ notification_email_from : str | None ,
637635 log_level : str ,
638636 no_progress_bar : bool ,
639- notification_script : Optional [ str ] ,
637+ notification_script : str | None ,
640638 threads_num : int ,
641639 delete_after_download : bool ,
642- keep_icloud_recent_days : Optional [ int ] ,
640+ keep_icloud_recent_days : int | None ,
643641 domain : str ,
644- watch_with_interval : Optional [ int ] ,
642+ watch_with_interval : int | None ,
645643 dry_run : bool ,
646644 filename_cleaner : Callable [[str ], str ],
647645 lp_filename_generator : Callable [[str ], str ],
648646 raw_policy : RawTreatmentPolicy ,
649- password_providers : Dict [
650- str , Tuple [Callable [[str ], Optional [str ]], Callable [[str , str ], None ]]
651- ],
647+ password_providers : Dict [str , Tuple [Callable [[str ], str | None ], Callable [[str , str ], None ]]],
652648 file_match_policy : FileMatchPolicy ,
653649 mfa_provider : MFAProvider ,
654650 use_os_locale : bool ,
655- skip_created_before : Optional [ Union [ datetime .datetime , datetime .timedelta ]] ,
651+ skip_created_before : datetime .datetime | datetime .timedelta | None ,
656652) -> NoReturn :
657653 """Download all iCloud photos to a local directory"""
658654
@@ -865,7 +861,7 @@ def download_builder(
865861 dry_run : bool ,
866862 file_match_policy : FileMatchPolicy ,
867863 xmp_sidecar : bool ,
868- skip_created_before : Optional [ Union [ datetime .datetime , datetime .timedelta ]] ,
864+ skip_created_before : datetime .datetime | datetime .timedelta | None ,
869865) -> Callable [[PyiCloudService ], Callable [[Counter , PhotoAsset ], bool ]]:
870866 """factory for downloader"""
871867
@@ -1206,43 +1202,41 @@ def composed(ex: Exception, retries: int) -> None:
12061202
12071203def core (
12081204 downloader : Callable [[PyiCloudService ], Callable [[Counter , PhotoAsset ], bool ]],
1209- directory : Optional [ str ] ,
1205+ directory : str | None ,
12101206 username : str ,
12111207 auth_only : bool ,
12121208 cookie_directory : str ,
12131209 primary_sizes : Sequence [AssetVersionSize ],
1214- recent : Optional [ int ] ,
1215- until_found : Optional [ int ] ,
1216- album : Optional [ str ] ,
1210+ recent : int | None ,
1211+ until_found : int | None ,
1212+ album : str | None ,
12171213 list_albums : bool ,
12181214 library : str ,
12191215 list_libraries : bool ,
12201216 skip_videos : bool ,
12211217 auto_delete : bool ,
12221218 only_print_filenames : bool ,
12231219 folder_structure : str ,
1224- smtp_username : Optional [ str ] ,
1225- smtp_password : Optional [ str ] ,
1220+ smtp_username : str | None ,
1221+ smtp_password : str | None ,
12261222 smtp_host : str ,
12271223 smtp_port : int ,
12281224 smtp_no_tls : bool ,
1229- notification_email : Optional [ str ] ,
1230- notification_email_from : Optional [ str ] ,
1225+ notification_email : str | None ,
1226+ notification_email_from : str | None ,
12311227 no_progress_bar : bool ,
1232- notification_script : Optional [ str ] ,
1228+ notification_script : str | None ,
12331229 delete_after_download : bool ,
1234- keep_icloud_recent_days : Optional [ int ] ,
1230+ keep_icloud_recent_days : int | None ,
12351231 domain : str ,
12361232 logger : logging .Logger ,
1237- watch_interval : Optional [ int ] ,
1233+ watch_interval : int | None ,
12381234 dry_run : bool ,
12391235 filename_cleaner : Callable [[str ], str ],
12401236 lp_filename_generator : Callable [[str ], str ],
12411237 raw_policy : RawTreatmentPolicy ,
12421238 file_match_policy : FileMatchPolicy ,
1243- password_providers : Dict [
1244- str , Tuple [Callable [[str ], Optional [str ]], Callable [[str , str ], None ]]
1245- ],
1239+ password_providers : Dict [str , Tuple [Callable [[str ], str | None ], Callable [[str , str ], None ]]],
12461240 mfa_provider : MFAProvider ,
12471241 status_exchange : StatusExchange ,
12481242) -> int :
@@ -1344,7 +1338,7 @@ def core(
13441338
13451339 photos .exception_handler = error_handler
13461340
1347- photos_count : Optional [ int ] = len (photos )
1341+ photos_count : int | None = len (photos )
13481342
13491343 photos_enumerator : Iterable [PhotoAsset ] = photos
13501344
0 commit comments