SYMBOL INDEX (674 symbols across 68 files) FILE: scripts/compile_compatibility.py function content_checker (line 10) | def content_checker(filepath): FILE: scripts/compile_matrix.py function _stats (line 7) | def _stats(files): function _matrix (line 17) | def _matrix(files, special): function print_breakdowns (line 45) | def print_breakdowns(folder, special_content_checker, special_pair): FILE: scripts/compile_tzlc.py function special_content_checker (line 9) | def special_content_checker(expected_content): FILE: src/foundation/__init__.py class VersionInfo (line 22) | class VersionInfo(NamedTuple): function version_info_formatted (line 36) | def version_info_formatted() -> str: function bytes_decode (line 46) | def bytes_decode(encoding: str) -> Callable[[bytes], str]: function wrap_param_in_exception (line 57) | def wrap_param_in_exception(caption: str, func: Callable[[T_in], T_out])... function flat_dict (line 90) | def flat_dict(input: Iterable[Mapping[T_in, T_out]]) -> Mapping[T_in, T_... function split_with_alternatives (line 101) | def split_with_alternatives(splitter: Container[_T], inp: Iterable[_T]) ... function two_tuple (line 118) | def two_tuple(k: _T, v: _T2) -> Tuple[_T, _T2]: function unique_sequence (line 126) | def unique_sequence(inp: Iterable[_T]) -> Sequence[_T]: FILE: src/foundation/core/__init__.py function compose (line 13) | def compose( function identity (line 28) | def identity(value: _T_inv) -> _T_inv: function constant (line 35) | def constant(value: _T_inv) -> Callable[[_T_contra], _T_inv]: function pipe (line 46) | def pipe( function apply_reverse (line 55) | def apply_reverse(input: _T_contra) -> Callable[[Callable[[_T_contra], _... function curry2 (line 77) | def curry2( function uncurry2 (line 101) | def uncurry2( function curry3 (line 125) | def curry3( function fst (line 140) | def fst(t: Tuple[_T_inv, _T2_contra]) -> _T_inv: function snd (line 148) | def snd(t: Tuple[_T_contra, _T_inv]) -> _T_inv: function flip (line 156) | def flip( function compact2 (line 174) | def compact2( function expand2 (line 185) | def expand2( function pipe2 (line 194) | def pipe2( function arrow (line 209) | def arrow( function partial_1_1 (line 219) | def partial_1_1( function partial_2_1 (line 234) | def partial_2_1( function filter_ (line 249) | def filter_(f: Callable[[_T_contra], bool], p1: Iterable[_T_contra]) -> ... function filter_guarded (line 259) | def filter_guarded( function map_ (line 271) | def map_(f: Callable[[_T_contra], _T_co], p1: Iterable[_T_contra]) -> It... function tee_ (line 281) | def tee_(inp: Iterable[_T_contra]) -> Tuple[Iterable[_T_contra], Iterabl... function zip_longest_ (line 295) | def zip_longest_( function unzip (line 307) | def unzip( function chain_from_iterable (line 325) | def chain_from_iterable(inp: Iterable[Iterable[_T_inv]]) -> Iterable[_T_... function skip (line 329) | def skip(inp: int, p1: Iterable[_T_co]) -> Iterable[_T_co]: function take (line 340) | def take(inp: int, p1: Iterable[_T_co]) -> Iterable[_T_co]: FILE: src/foundation/core/optional/__init__.py function bind (line 9) | def bind( function lift2 (line 52) | def lift2( function lift3 (line 86) | def lift3( function fromMaybe (line 102) | def fromMaybe(default: _Tin) -> Callable[[_Tin | None], _Tin]: FILE: src/foundation/http.py function cookie_to_pair (line 14) | def cookie_to_pair(cookie: Cookie) -> Tuple[str, str | None]: function cookie_str_to_dict (line 26) | def cookie_str_to_dict(cookie_header: str) -> Mapping[str, str]: function is_streaming_response (line 34) | def is_streaming_response(response: Response) -> bool: function response_body (line 42) | def response_body(response: Response) -> Any: function request_body (line 52) | def request_body(request: PreparedRequest) -> Any: function response_to_har_entry (line 61) | def response_to_har_entry(response: Response) -> Mapping[str, Any]: FILE: src/foundation/json.py function extract_context (line 18) | def extract_context(context: Context, pair: Tuple[str, T1]) -> Tuple[Con... function first (line 29) | def first(input: Iterable[T1]) -> T1 | StopIteration: function first_or_default (line 35) | def first_or_default(input: Iterable[T1], default: T2) -> T1 | T2: function first_matching_rule (line 48) | def first_matching_rule(context: Context, rules: Sequence[Rule]) -> Rule... function _apply_rules_internal (line 59) | def _apply_rules_internal(input: Any, context: Context, rules: Sequence[... function _ (line 65) | def _(input: str, context: Context, rules: Sequence[Rule]) -> str | None: function _ (line 76) | def _(input: Tuple[str, Any], context: Context, rules: Sequence[Rule]) -... function apply_rules (line 91) | def apply_rules(context: Context, rules: Sequence[Rule], input: Any) -> ... function _ (line 96) | def _(input: Sequence[Any], context: Context, rules: Sequence[Rule]) -> ... function _ (line 116) | def _(input: Mapping[str, Any], context: Context, rules: Sequence[Rule])... function re_compile_flag (line 135) | def re_compile_flag(flags: re.RegexFlag, input: str) -> re.Pattern[str]: FILE: src/foundation/predicates.py function and_ (line 8) | def and_(f1: Callable[[T], bool], f2: Callable[[T], bool]) -> Callable[[... function or_ (line 24) | def or_(f1: Callable[[T], bool], f2: Callable[[T], bool]) -> Callable[[T... function not_ (line 40) | def not_(f: Callable[[T], bool]) -> Callable[[T], bool]: function xor_ (line 53) | def xor_(f1: Callable[[T], bool], f2: Callable[[T], bool]) -> Callable[[... function always_true (line 69) | def always_true(_: T) -> bool: function always_false (line 80) | def always_false(_: T) -> bool: function eq_pred (line 91) | def eq_pred(expected: T) -> Callable[[T], bool]: function ne_pred (line 103) | def ne_pred(expected: T) -> Callable[[T], bool]: function in_pred (line 115) | def in_pred(container: list[T] | set[T] | tuple[T, ...]) -> Callable[[T]... function not_in_pred (line 127) | def not_in_pred(container: list[T] | set[T] | tuple[T, ...]) -> Callable... FILE: src/foundation/string.py function obfuscate (line 7) | def obfuscate(_input: Any) -> str: function _ (line 12) | def _(input: str) -> str: FILE: src/foundation/string_utils.py function strip (line 8) | def strip(s: str) -> str: function lower (line 17) | def lower(s: str) -> str: function upper (line 26) | def upper(s: str) -> str: function endswith (line 35) | def endswith(suffix: str | tuple[str, ...]) -> Callable[[str], bool]: function startswith (line 50) | def startswith(prefix: str) -> Callable[[str], bool]: function contains (line 62) | def contains(substring: str) -> Callable[[str], bool]: function eq (line 74) | def eq(expected: str) -> Callable[[str], bool]: function replace (line 86) | def replace(old: str, new: str) -> Callable[[str], str]: function split (line 96) | def split(separator: str) -> Callable[[str], list[str]]: function join (line 106) | def join(separator: str) -> Callable[[list[str]], str]: function is_empty (line 116) | def is_empty(s: str) -> bool: function is_not_empty (line 127) | def is_not_empty(s: str) -> bool: function replace_extension (line 147) | def replace_extension(new_ext: str) -> Callable[[str], str]: FILE: src/icloudpd/authentication.py function prompt_int_range (line 15) | def prompt_int_range(message: str, default: str, min_val: int, max_val: ... function prompt_string (line 31) | def prompt_string(message: str) -> str: function is_empty_string (line 37) | def is_empty_string(input: str) -> bool: function is_valid_device_index (line 42) | def is_valid_device_index(input: str, device_count: int, alphabet: str) ... function is_valid_six_digit_code (line 51) | def is_valid_six_digit_code(input: str) -> bool: function echo (line 56) | def echo(message: str) -> None: function authenticator (line 61) | def authenticator( function request_2sa (line 120) | def request_2sa(icloud: PyiCloudService, logger: logging.Logger) -> None: function request_2fa (line 152) | def request_2fa(icloud: PyiCloudService, logger: logging.Logger) -> None: function request_2fa_web (line 240) | def request_2fa_web( FILE: src/icloudpd/autodelete.py function delete_file (line 20) | def delete_file(logger: logging.Logger, path: str) -> bool: function delete_file_dry_run (line 27) | def delete_file_dry_run(logger: logging.Logger, path: str) -> bool: function autodelete_photos (line 33) | def autodelete_photos( FILE: src/icloudpd/base.py function build_filename_cleaner (line 86) | def build_filename_cleaner(keep_unicode: bool) -> Callable[[str], str]: function lp_filename_concatinator (line 104) | def lp_filename_concatinator(filename: str) -> str: function lp_filename_original (line 119) | def lp_filename_original(filename: str) -> str: function ask_password_in_console (line 127) | def ask_password_in_console(_user: str) -> str | None: function get_password_from_webui (line 131) | def get_password_from_webui( function update_password_status_in_webui (line 159) | def update_password_status_in_webui(status_exchange: StatusExchange, _u:... function update_auth_error_in_webui (line 163) | def update_auth_error_in_webui(status_exchange: StatusExchange, error: s... function dummy_password_writter (line 174) | def dummy_password_writter(_u: str, _p: str) -> None: function keyring_password_writter (line 178) | def keyring_password_writter(logger: Logger) -> Callable[[str, str], None]: function skip_created_generator (line 188) | def skip_created_generator( function ensure_tzinfo (line 202) | def ensure_tzinfo(tz: datetime.tzinfo, input: datetime.datetime) -> date... function create_logger (line 211) | def create_logger(config: GlobalConfig) -> logging.Logger: function run_with_configs (line 236) | def run_with_configs(global_config: GlobalConfig, user_configs: Sequence... function _process_all_users_once (line 312) | def _process_all_users_once( function notificator_builder (line 463) | def notificator_builder( function offset_to_datetime (line 501) | def offset_to_datetime(offset: Any) -> datetime.datetime: function _ (line 506) | def _(offset: datetime.datetime) -> datetime.datetime: function _ (line 511) | def _(offset: datetime.timedelta) -> datetime.datetime: function where_builder (line 515) | def where_builder( function skip_created_before_message (line 546) | def skip_created_before_message( function skip_created_after_message (line 555) | def skip_created_after_message( function download_builder (line 564) | def download_builder( function delete_photo (line 808) | def delete_photo( function delete_photo_dry_run (line 843) | def delete_photo_dry_run( function dump_responses (line 858) | def dump_responses(dumper: Callable[[Any], None], responses: List[Mappin... function asset_type_skip_message (line 865) | def asset_type_skip_message( function core_single_run (line 875) | def core_single_run( FILE: src/icloudpd/cli.py function map_align_raw_to_enum (line 27) | def map_align_raw_to_enum(align_raw_str: str) -> RawTreatmentPolicy: function add_options_for_user (line 37) | def add_options_for_user(parser: argparse.ArgumentParser) -> argparse.Ar... function add_user_option (line 262) | def add_user_option(parser: argparse.ArgumentParser) -> argparse.Argumen... function parse_mfa_provider (line 280) | def parse_mfa_provider(provider: str) -> MFAProvider: function add_global_options (line 293) | def add_global_options(parser: argparse.ArgumentParser) -> argparse.Argu... function log_level (line 364) | def log_level(inp: str) -> LogLevel: function parse_timestamp_or_timedelta_tz_error (line 375) | def parse_timestamp_or_timedelta_tz_error( function format_help_for_parser_ (line 389) | def format_help_for_parser_(parser: argparse.ArgumentParser) -> str: function format_help (line 393) | def format_help() -> str: function map_to_config (line 431) | def map_to_config(user_ns: argparse.Namespace) -> UserConfig: function parse (line 478) | def parse(args: Sequence[str]) -> Tuple[GlobalConfig, Sequence[UserConfi... function cli (line 536) | def cli() -> int: function validate_folder_structure (line 612) | def validate_folder_structure(folder_structure: str) -> str: FILE: src/icloudpd/config.py class _DefaultConfig (line 16) | class _DefaultConfig: class UserConfig (line 56) | class UserConfig(_DefaultConfig): class GlobalConfig (line 62) | class GlobalConfig: FILE: src/icloudpd/counter.py class Counter (line 6) | class Counter: method __init__ (line 7) | def __init__(self, value: int = 0): method increment (line 12) | def increment(self) -> None: method reset (line 16) | def reset(self) -> None: method value (line 20) | def value(self) -> int: FILE: src/icloudpd/download.py function update_mtime (line 23) | def update_mtime(created: datetime.datetime, download_path: str) -> None: function set_utime (line 37) | def set_utime(download_path: str, created_date: datetime.datetime) -> None: function mkdirs_for_path (line 46) | def mkdirs_for_path(logger: logging.Logger, download_path: str) -> bool: function mkdirs_for_path_dry_run (line 62) | def mkdirs_for_path_dry_run(logger: logging.Logger, download_path: str) ... function download_response_to_path (line 73) | def download_response_to_path( function download_response_to_path_dry_run (line 90) | def download_response_to_path_dry_run( function download_media (line 106) | def download_media( FILE: src/icloudpd/email_notifications.py function send_2sa_notification (line 9) | def send_2sa_notification( FILE: src/icloudpd/exif_datetime.py function get_photo_exif (line 10) | def get_photo_exif(logger: logging.Logger, path: str) -> str | None: function set_photo_exif (line 20) | def set_photo_exif(logger: logging.Logger, path: str, date: str) -> None: FILE: src/icloudpd/filename_policies.py function build_filename_with_policies (line 15) | def build_filename_with_policies( function create_filename_builder (line 29) | def create_filename_builder( FILE: src/icloudpd/log_level.py class LogLevel (line 4) | class LogLevel(Enum): method __str__ (line 9) | def __str__(self) -> str: FILE: src/icloudpd/logger.py class IPDLogger (line 9) | class IPDLogger(logging.Logger): method __init__ (line 12) | def __init__(self, name: str, level: int = INFO): method set_tqdm (line 17) | def set_tqdm(self, tdqm: Any) -> None: method set_tqdm_description (line 21) | def set_tqdm_description(self, desc: str, loglevel: int = INFO) -> None: method tqdm_write (line 28) | def tqdm_write(self, message: str, loglevel: int = INFO) -> None: function setup_logger (line 36) | def setup_logger() -> logging.Logger: FILE: src/icloudpd/mfa_provider.py class MFAProvider (line 4) | class MFAProvider(Enum): method __str__ (line 8) | def __str__(self) -> str: FILE: src/icloudpd/password_provider.py class PasswordProvider (line 4) | class PasswordProvider(Enum): method __str__ (line 10) | def __str__(self) -> str: FILE: src/icloudpd/paths.py function remove_unicode_chars (line 6) | def remove_unicode_chars(value: str) -> str: function clean_filename (line 12) | def clean_filename(filename: str) -> str: function local_download_path (line 23) | def local_download_path(filename: str, download_dir: str) -> str: FILE: src/icloudpd/progress.py class Progress (line 4) | class Progress: method __init__ (line 5) | def __init__(self) -> None: method waiting (line 16) | def waiting(self) -> int: method waiting (line 20) | def waiting(self, waiting: int) -> None: method photos_count (line 25) | def photos_count(self) -> int: method photos_count (line 29) | def photos_count(self, photos_count: int) -> None: method photos_counter (line 37) | def photos_counter(self) -> int: method photos_counter (line 41) | def photos_counter(self, photos_counter: int) -> None: method reset (line 48) | def reset(self) -> None: FILE: src/icloudpd/server/__init__.py function serve_app (line 11) | def serve_app(logger: Logger, _status_exchange: StatusExchange) -> None: FILE: src/icloudpd/status.py class Status (line 9) | class Status(Enum): method __str__ (line 18) | def __str__(self) -> str: class StatusExchange (line 22) | class StatusExchange: method __init__ (line 23) | def __init__(self) -> None: method get_status (line 33) | def get_status(self) -> Status: method replace_status (line 37) | def replace_status(self, expected_status: Status, new_status: Status) ... method set_payload (line 45) | def set_payload(self, payload: str) -> bool: method get_payload (line 57) | def get_payload(self) -> str | None: method set_error (line 69) | def set_error(self, error: str) -> bool: method get_error (line 82) | def get_error(self) -> str | None: method get_progress (line 93) | def get_progress(self) -> Progress: method set_global_config (line 97) | def set_global_config(self, global_config: GlobalConfig) -> None: method get_global_config (line 101) | def get_global_config(self) -> GlobalConfig | None: method set_user_configs (line 105) | def set_user_configs(self, user_configs: Sequence[UserConfig]) -> None: method get_user_configs (line 109) | def get_user_configs(self) -> Sequence[UserConfig]: method set_current_user (line 113) | def set_current_user(self, username: str) -> None: method get_current_user (line 117) | def get_current_user(self) -> str | None: method clear_current_user (line 121) | def clear_current_user(self) -> None: FILE: src/icloudpd/string_helpers.py function truncate_middle (line 8) | def truncate_middle(string: str, length: int) -> str: function parse_timedelta (line 22) | def parse_timedelta( function parse_timestamp (line 37) | def parse_timestamp( function parse_timestamp_or_timedelta (line 51) | def parse_timestamp_or_timedelta( function splitlines (line 62) | def splitlines(inp: str) -> Sequence[str]: FILE: src/icloudpd/xmp_sidecar.py class XMPMetadata (line 20) | class XMPMetadata(NamedTuple): function generate_xmp_file (line 37) | def generate_xmp_file( function build_metadata (line 79) | def build_metadata(asset_record: dict[str, Any]) -> XMPMetadata: function generate_xml (line 193) | def generate_xml(metadata: XMPMetadata) -> ElementTree.Element: FILE: src/pyicloud_ipd/asset_version.py function add_suffix_to_filename (line 34) | def add_suffix_to_filename(suffix: str, filename: str) -> str: function calculate_version_filename (line 40) | def calculate_version_filename( class AssetVersion (line 76) | class AssetVersion: method __init__ (line 77) | def __init__(self, size: int, url: str, type: str, checksum: str) -> N... method __eq__ (line 83) | def __eq__(self, other: object) -> bool: function calculate_asset_version_filename (line 90) | def calculate_asset_version_filename( FILE: src/pyicloud_ipd/base.py function origin_referer_headers (line 58) | def origin_referer_headers(input: str) -> Dict[str, str]: class TrustedPhoneContextProvider (line 62) | class TrustedPhoneContextProvider(NamedTuple): class PyiCloudService (line 67) | class PyiCloudService: method __init__ (line 78) | def __init__( method use_rules (line 283) | def use_rules(self, rules: Sequence[Rule]) -> Generator[Sequence[Rule]... method authenticate (line 291) | def authenticate(self, force_refresh: bool = False) -> None: method _authenticate_with_token (line 337) | def _authenticate_with_token(self) -> None: method _authenticate_srp (line 377) | def _authenticate_srp(self, password: str) -> None: method _authenticate_raw_password (line 519) | def _authenticate_raw_password(self, password: str) -> None: method _validate_token (line 557) | def _validate_token(self) -> Dict[str, Any]: method _get_auth_headers (line 588) | def _get_auth_headers(self, overrides: Dict[str, str] | None = None) -... method cookiejar_path (line 616) | def cookiejar_path(self) -> str: method session_path (line 624) | def session_path(self) -> str: method requires_2sa (line 632) | def requires_2sa(self) -> bool: method requires_2fa (line 639) | def requires_2fa(self) -> bool: method is_trusted_session (line 648) | def is_trusted_session(self) -> bool: method trusted_devices (line 653) | def trusted_devices(self) -> Sequence[Dict[str, Any]]: method send_request (line 661) | def send_request(self, request: PreparedRequest) -> Response: method get_oauth_session (line 664) | def get_oauth_session(self) -> AuthenticatedSession: method get_trusted_phone_numbers (line 671) | def get_trusted_phone_numbers(self) -> Sequence[TrustedDevice]: method send_2fa_code_sms (line 697) | def send_2fa_code_sms(self, device_id: int) -> bool: method send_verification_code (line 729) | def send_verification_code(self, device: Dict[str, Any]) -> bool: method validate_verification_code (line 737) | def validate_verification_code(self, device: Dict[str, Any], code: str... method validate_2fa_code_sms (line 761) | def validate_2fa_code_sms(self, device_id: int, code: str) -> bool: method validate_2fa_code (line 794) | def validate_2fa_code(self, code: str) -> bool: method trust_session (line 831) | def trust_session(self) -> bool: method _get_webservice_url (line 859) | def _get_webservice_url(self, ws_key: str) -> str: method photos (line 866) | def photos(self) -> PhotosService: method __unicode__ (line 873) | def __unicode__(self) -> str: method __str__ (line 876) | def __str__(self) -> str: method __repr__ (line 880) | def __repr__(self) -> str: FILE: src/pyicloud_ipd/cmdline.py function main (line 19) | def main(args: Sequence[str] | None = None) -> NoReturn: FILE: src/pyicloud_ipd/exceptions.py class PyiCloudException (line 1) | class PyiCloudException(Exception): class PyiCloudAPIResponseException (line 8) | class PyiCloudAPIResponseException(PyiCloudException): method __init__ (line 11) | def __init__(self, reason: str, code: str | None = None): class PyiCloudServiceNotActivatedException (line 21) | class PyiCloudServiceNotActivatedException(PyiCloudAPIResponseException): class PyiCloudServiceUnavailableException (line 27) | class PyiCloudServiceUnavailableException(PyiCloudException): class PyiCloudConnectionErrorException (line 33) | class PyiCloudConnectionErrorException(PyiCloudException): class PyiCloudFailedLoginException (line 40) | class PyiCloudFailedLoginException(PyiCloudException): class PyiCloudFailedMFAException (line 46) | class PyiCloudFailedMFAException(PyiCloudException): class PyiCloud2SARequiredException (line 52) | class PyiCloud2SARequiredException(PyiCloudException): method __init__ (line 55) | def __init__(self, apple_id: str): class PyiCloudNoStoredPasswordAvailableException (line 60) | class PyiCloudNoStoredPasswordAvailableException(PyiCloudException): class PyiCloudNoDevicesException (line 67) | class PyiCloudNoDevicesException(PyiCloudException): class PyiCloudConnectionException (line 74) | class PyiCloudConnectionException(PyiCloudException): class PyiCloudAPIResponseError (line 78) | class PyiCloudAPIResponseError(PyiCloudException): method __init__ (line 79) | def __init__(self, reason: str, code: (int | None)): class PyiCloud2SARequiredError (line 89) | class PyiCloud2SARequiredError(PyiCloudException): method __init__ (line 90) | def __init__(self, url: str): class NoStoredPasswordAvailable (line 95) | class NoStoredPasswordAvailable(PyiCloudException): class PyiCloudServiceNotActivatedErrror (line 99) | class PyiCloudServiceNotActivatedErrror(PyiCloudAPIResponseError): FILE: src/pyicloud_ipd/file_match.py class FileMatchPolicy (line 4) | class FileMatchPolicy(Enum): method __str__ (line 8) | def __str__(self) -> str: FILE: src/pyicloud_ipd/item_type.py class AssetItemType (line 4) | class AssetItemType(Enum): method __str__ (line 8) | def __str__(self) -> str: FILE: src/pyicloud_ipd/live_photo_mov_filename_policy.py class LivePhotoMovFilenamePolicy (line 4) | class LivePhotoMovFilenamePolicy(Enum): method __str__ (line 8) | def __str__(self) -> str: FILE: src/pyicloud_ipd/raw_policy.py class RawTreatmentPolicy (line 4) | class RawTreatmentPolicy(Enum): method __str__ (line 9) | def __str__(self) -> str: FILE: src/pyicloud_ipd/services/photos.py function apply_file_match_policy (line 35) | def apply_file_match_policy( function apply_filename_cleaner (line 62) | def apply_filename_cleaner(filename_cleaner: Callable[[str], str]) -> Ca... function generate_fingerprint_filename (line 80) | def generate_fingerprint_filename(asset_id: str, item_type_extension: st... function filename_with_fallback (line 96) | def filename_with_fallback(asset_id: str, item_type_extension: str) -> C... function download_asset (line 115) | def download_asset(session: Session, url: str, start: int = 0) -> Response: function apply_raw_policy (line 131) | def apply_raw_policy( class PhotoLibrary (line 166) | class PhotoLibrary: method __init__ (line 273) | def __init__( method albums (line 304) | def albums(self) -> Dict[str, "PhotoAlbum"]: method _fetch_folders (line 351) | def _fetch_folders(self) -> Sequence[Dict[str, Any]]: method all (line 368) | def all(self) -> "PhotoAlbum": method recently_deleted (line 381) | def recently_deleted(self) -> "PhotoAlbum": class PhotosService (line 394) | class PhotosService(PhotoLibrary): method __init__ (line 400) | def __init__(self, service_root: str, session: PyiCloudSession, params... method private_libraries (line 424) | def private_libraries(self) -> Dict[str, PhotoLibrary]: method shared_libraries (line 431) | def shared_libraries(self) -> Dict[str, PhotoLibrary]: method _fetch_libraries (line 437) | def _fetch_libraries(self, library_type: str) -> Dict[str, PhotoLibrary]: method get_service_endpoint (line 463) | def get_service_endpoint(self, library_type: str) -> str: class PhotoAlbum (line 467) | class PhotoAlbum: method __init__ (line 468) | def __init__( method title (line 496) | def title(self) -> str: method __iter__ (line 499) | def __iter__(self) -> Generator["PhotoAsset", Any, None]: method __len__ (line 502) | def __len__(self) -> int: method photos_request (line 515) | def photos_request(self) -> Response: method photos (line 524) | def photos(self) -> Generator["PhotoAsset", Any, None]: method increment_offset (line 558) | def increment_offset(self, value: int) -> None: method _count_query_gen (line 561) | def _count_query_gen(self, obj_type: str) -> Dict[str, Any]: method _list_query_gen (line 582) | def _list_query_gen( method __unicode__ (line 713) | def __unicode__(self) -> str: method __str__ (line 716) | def __str__(self) -> str: method __repr__ (line 720) | def __repr__(self) -> str: class PhotoAsset (line 724) | class PhotoAsset: method __init__ (line 725) | def __init__(self, master_record: Dict[str, Any], asset_record: Dict[s... method id (line 769) | def id(self) -> str: method calculate_filename (line 772) | def calculate_filename(self) -> str | None: method filename (line 828) | def filename(self) -> str: method size (line 844) | def size(self) -> int: method created (line 848) | def created(self) -> datetime: method asset_date (line 860) | def asset_date(self) -> datetime: method added_date (line 870) | def added_date(self) -> datetime: method dimensions (line 877) | def dimensions(self) -> Tuple[int, int]: method item_type (line 884) | def item_type(self) -> AssetItemType | None: method item_type_extension (line 906) | def item_type_extension(self) -> str: method calculate_version_filename (line 915) | def calculate_version_filename( method versions (line 933) | def versions(self) -> Dict[VersionSize, AssetVersion]: method versions_with_raw_policy (line 970) | def versions_with_raw_policy( method download (line 984) | def download(self, session: Session, url: str, start: int = 0) -> Resp... method __repr__ (line 988) | def __repr__(self) -> str: FILE: src/pyicloud_ipd/session.py class PyiCloudPasswordFilter (line 32) | class PyiCloudPasswordFilter(logging.Filter): method __init__ (line 33) | def __init__(self, password: str): method filter (line 37) | def filter(self, record: logging.LogRecord) -> bool: class PyiCloudSession (line 46) | class PyiCloudSession(Session): method __init__ (line 49) | def __init__( method observe (line 56) | def observe(self, response: Response) -> Response: method request (line 62) | def request(self, method: str, url, **kwargs): # type: ignore method _raise_error (line 154) | def _raise_error(self, code: str, reason: str) -> NoReturn: FILE: src/pyicloud_ipd/sms.py class _SMSParser (line 6) | class _SMSParser(HTMLParser): method __init__ (line 7) | def __init__(self) -> None: method handle_starttag (line 13) | def handle_starttag(self, tag: str, attrs: List[Tuple[str, str | None]... method handle_endtag (line 20) | def handle_endtag(self, tag: str) -> None: method handle_data (line 24) | def handle_data(self, data: str) -> None: class TrustedDevice (line 29) | class TrustedDevice(Protocol): method id (line 31) | def id(self) -> int: ... method obfuscated_number (line 33) | def obfuscated_number(self) -> str: ... class _InternalTrustedDevice (line 36) | class _InternalTrustedDevice(NamedTuple): function _map_to_trusted_device (line 41) | def _map_to_trusted_device(device: Mapping[str, Any]) -> TrustedDevice |... class _Response (line 49) | class _Response(Protocol): method status_code (line 51) | def status_code(self) -> int: ... method text (line 53) | def text(self) -> str: ... function parse_trusted_phone_numbers_response (line 56) | def parse_trusted_phone_numbers_response(response: _Response) -> Sequenc... function parse_trusted_phone_numbers_payload (line 63) | def parse_trusted_phone_numbers_payload(content: str) -> Sequence[Truste... class AuthenticatedSession (line 77) | class AuthenticatedSession(NamedTuple): function _oauth_const_headers (line 83) | def _oauth_const_headers() -> Mapping[str, str]: function _oauth_redirect_header (line 92) | def _oauth_redirect_header(domain: str) -> Mapping[str, str]: function _oauth_headers (line 100) | def _oauth_headers(auth_session: AuthenticatedSession) -> Mapping[str, s... function _auth_url (line 110) | def _auth_url(domain: str) -> str: class _DomainProvider (line 118) | class _DomainProvider(Protocol): method domain (line 120) | def domain(self) -> str: ... class _OAuthSessionProvider (line 123) | class _OAuthSessionProvider(Protocol): method oauth_session (line 125) | def oauth_session(self) -> AuthenticatedSession: ... class _TrustedPhoneContextProvider (line 128) | class _TrustedPhoneContextProvider(_DomainProvider, _OAuthSessionProvide... class Request (line 131) | class Request(Protocol): method method (line 133) | def method(self) -> str: ... method url (line 135) | def url(self) -> str: ... method headers (line 137) | def headers(self) -> Mapping[str, str]: ... method data (line 139) | def data(self) -> str | None: ... method json (line 141) | def json(self) -> Mapping[str, Any] | None: ... class _InternalRequest (line 144) | class _InternalRequest(NamedTuple): function build_trusted_phone_numbers_request (line 152) | def build_trusted_phone_numbers_request(context: _TrustedPhoneContextPro... function build_send_sms_code_request (line 169) | def build_send_sms_code_request(context: _TrustedPhoneContextProvider, d... function build_verify_sms_code_request (line 190) | def build_verify_sms_code_request( FILE: src/pyicloud_ipd/utils.py function password_exists_in_keyring (line 38) | def password_exists_in_keyring(username: str) -> bool: function get_password_from_keyring (line 45) | def get_password_from_keyring(username: str) -> str | None: function store_password_in_keyring (line 60) | def store_password_in_keyring(username: str, password: str) -> None: function delete_password_in_keyring (line 71) | def delete_password_in_keyring(username: str) -> None: function underscore_to_camelcase (line 78) | def underscore_to_camelcase(word: str, initial_capital: bool = False) ->... function size_to_suffix (line 97) | def size_to_suffix(size: VersionSize) -> str: function disambiguate_filenames (line 101) | def disambiguate_filenames( function throw_on_503 (line 201) | def throw_on_503(response: Response) -> Response: function handle_connection_error (line 213) | def handle_connection_error(func: F) -> F: FILE: src/pyicloud_ipd/version_size.py class AssetVersionSize (line 4) | class AssetVersionSize(Enum): method __str__ (line 11) | def __str__(self) -> str: class LivePhotoVersionSize (line 15) | class LivePhotoVersionSize(Enum): method __str__ (line 20) | def __str__(self) -> str: FILE: tests/helpers/__init__.py class TestResult (line 19) | class TestResult: method __init__ (line 22) | def __init__( method stdout_bytes (line 36) | def stdout_bytes(self) -> bytes: method __repr__ (line 39) | def __repr__(self) -> str: function print_result_exception (line 43) | def print_result_exception(result: TestResult) -> TestResult: function path_from_project_root (line 54) | def path_from_project_root(file_name: str) -> str: function recreate_path (line 59) | def recreate_path(path_name: str) -> None: function create_files (line 66) | def create_files(data_dir: str, files_to_create: Sequence[Tuple[str, str... function combine_file_lists (line 84) | def combine_file_lists( class AssertEquality (line 97) | class AssertEquality(Protocol): method __call__ (line 98) | def __call__(self, __first: _T, __second: _T, __msg: str) -> None: ... function assert_files (line 101) | def assert_files( function clean_boolean_args (line 121) | def clean_boolean_args(params: Sequence[str]) -> list[str]: function run_main_env (line 168) | def run_main_env( function run_with_cassette (line 305) | def run_with_cassette(cassette_path: str, f: Callable[[_T_contra], _T_co... function run_cassette (line 310) | def run_cassette( function run_icloudpd_test (line 324) | def run_icloudpd_test( FILE: tests/test_authentication.py class AuthenticationTestCase (line 25) | class AuthenticationTestCase(TestCase): method inject_fixtures (line 27) | def inject_fixtures(self) -> None: method test_failed_auth (line 33) | def test_failed_auth(self) -> None: method test_fallback_raw_password (line 62) | def test_fallback_raw_password(self) -> None: method test_successful_token_validation (line 89) | def test_successful_token_validation(self) -> None: method test_password_prompt_2sa (line 114) | def test_password_prompt_2sa(self) -> None: method test_password_prompt_2fa (line 150) | def test_password_prompt_2fa(self) -> None: method test_parse_trusted_phone_numbers_payload_valid (line 189) | def test_parse_trusted_phone_numbers_payload_valid(self) -> None: method test_parse_trusted_phone_numbers_payload_minimal (line 198) | def test_parse_trusted_phone_numbers_payload_minimal(self) -> None: method test_parse_trusted_phone_numbers_payload_missing_node0 (line 205) | def test_parse_trusted_phone_numbers_payload_missing_node0(self) -> None: method test_parse_trusted_phone_numbers_payload_missing_node1 (line 210) | def test_parse_trusted_phone_numbers_payload_missing_node1(self) -> None: method test_parse_trusted_phone_numbers_payload_missing_node2 (line 215) | def test_parse_trusted_phone_numbers_payload_missing_node2(self) -> None: method test_parse_trusted_phone_numbers_payload_missing_node3 (line 220) | def test_parse_trusted_phone_numbers_payload_missing_node3(self) -> None: method test_parse_trusted_phone_numbers_payload_empty_list (line 225) | def test_parse_trusted_phone_numbers_payload_empty_list(self) -> None: method test_parse_trusted_phone_numbers_payload_invalid_missing_id (line 230) | def test_parse_trusted_phone_numbers_payload_invalid_missing_id(self) ... method test_parse_trusted_phone_numbers_payload_invalid_missing_number (line 235) | def test_parse_trusted_phone_numbers_payload_invalid_missing_number(se... method test_non_2fa (line 240) | def test_non_2fa(self) -> None: method test_failed_auth_503 (line 267) | def test_failed_auth_503(self) -> None: method test_failed_auth_503_watch (line 294) | def test_failed_auth_503_watch(self) -> None: method test_connection_error (line 329) | def test_connection_error(self) -> None: method test_timeout_error (line 369) | def test_timeout_error(self) -> None: method test_timeout (line 409) | def test_timeout(self) -> None: class _TrustedDevice (line 450) | class _TrustedDevice(NamedTuple): FILE: tests/test_autodelete_photos.py class AutodeletePhotosTestCase (line 28) | class AutodeletePhotosTestCase(TestCase): method inject_fixtures (line 30) | def inject_fixtures(self) -> None: method test_autodelete_invalid_creation_date (line 35) | def test_autodelete_invalid_creation_date(self) -> None: method test_download_autodelete_photos (line 144) | def test_download_autodelete_photos(self) -> None: method test_autodelete_photos (line 242) | def test_autodelete_photos(self) -> None: method test_retry_delete_after_download_session_error (line 351) | def test_retry_delete_after_download_session_error(self) -> None: method test_retry_fail_delete_after_download_session_error (line 447) | def test_retry_fail_delete_after_download_session_error(self) -> None: method test_retry_delete_after_download_internal_error (line 540) | def test_retry_delete_after_download_internal_error(self) -> None: method test_retry_fail_delete_after_download_internal_error (line 622) | def test_retry_fail_delete_after_download_internal_error(self) -> None: method test_autodelete_photos_dry_run (line 698) | def test_autodelete_photos_dry_run(self) -> None: method test_autodelete_photos_folder_none (line 812) | def test_autodelete_photos_folder_none(self) -> None: method test_autodelete_photos_lp (line 903) | def test_autodelete_photos_lp(self) -> None: method test_autodelete_photos_lp_heic (line 995) | def test_autodelete_photos_lp_heic(self) -> None: FILE: tests/test_cli.py class CliTestCase (line 28) | class CliTestCase(TestCase): method inject_fixtures (line 30) | def inject_fixtures(self, caplog: pytest.LogCaptureFixture) -> None: method test_cli_help (line 35) | def test_cli_help(self) -> None: method test_cli_parser (line 72) | def test_cli_parser(self) -> None: method test_cli (line 393) | def test_cli(self) -> None: method test_log_levels (line 397) | def test_log_levels(self) -> None: method test_tqdm (line 431) | def test_tqdm(self) -> None: method test_unicode_directory (line 453) | def test_unicode_directory(self) -> None: method test_missing_directory (line 476) | def test_missing_directory(self) -> None: method test_missing_directory_param (line 500) | def test_missing_directory_param(self) -> None: method test_conflict_options_delete_after_download_and_auto_delete (line 518) | def test_conflict_options_delete_after_download_and_auto_delete(self) ... method test_conflict_options_delete_after_download_and_keep_icloud_recent_days (line 536) | def test_conflict_options_delete_after_download_and_keep_icloud_recent... FILE: tests/test_download_live_photos.py class DownloadLivePhotoTestCase (line 14) | class DownloadLivePhotoTestCase(TestCase): method inject_fixtures (line 16) | def inject_fixtures(self) -> None: method test_lp_filename_generator (line 20) | def test_lp_filename_generator(self) -> None: method test_skip_existing_downloads_for_live_photos (line 31) | def test_skip_existing_downloads_for_live_photos(self) -> None: method test_skip_existing_live_photodownloads (line 65) | def test_skip_existing_live_photodownloads(self) -> None: method test_skip_existing_live_photo_print_filenames (line 107) | def test_skip_existing_live_photo_print_filenames(self) -> None: FILE: tests/test_download_live_photos_id.py class DownloadLivePhotoNameIDTestCase (line 13) | class DownloadLivePhotoNameIDTestCase(TestCase): method inject_fixtures (line 15) | def inject_fixtures(self) -> None: method test_skip_existing_downloads_for_live_photos_name_id7 (line 19) | def test_skip_existing_downloads_for_live_photos_name_id7(self) -> None: method test_skip_existing_live_photodownloads_name_id7 (line 53) | def test_skip_existing_live_photodownloads_name_id7(self) -> None: method test_skip_existing_live_photo_print_filenames_name_id7 (line 95) | def test_skip_existing_live_photo_print_filenames_name_id7(self) -> None: FILE: tests/test_download_photos.py class DownloadPhotoTestCase (line 34) | class DownloadPhotoTestCase(TestCase): method inject_fixtures (line 36) | def inject_fixtures(self) -> None: method test_download_and_skip_existing_photos (line 40) | def test_download_and_skip_existing_photos(self) -> None: method test_download_photos_and_set_exif (line 117) | def test_download_photos_and_set_exif(self) -> None: method test_download_photos_and_get_exif_exceptions (line 194) | def test_download_photos_and_get_exif_exceptions(self) -> None: method test_skip_existing_downloads (line 245) | def test_skip_existing_downloads(self) -> None: method test_until_found (line 291) | def test_until_found(self) -> None: method test_handle_io_error (line 392) | def test_handle_io_error(self) -> None: method test_handle_session_error_during_download (line 435) | def test_handle_session_error_during_download(self) -> None: method test_handle_session_error_during_photo_iteration (line 496) | def test_handle_session_error_during_photo_iteration(self) -> None: method test_handle_albums_error (line 557) | def test_handle_albums_error(self) -> None: method test_missing_size (line 601) | def test_missing_size(self) -> None: method test_size_fallback_to_original (line 668) | def test_size_fallback_to_original(self) -> None: method test_adjusted_size_fallback_to_original (line 724) | def test_adjusted_size_fallback_to_original(self) -> None: method test_force_size (line 782) | def test_force_size(self) -> None: method test_download_two_sizes_with_force_size (line 834) | def test_download_two_sizes_with_force_size(self) -> None: method test_invalid_creation_date (line 899) | def test_invalid_creation_date(self) -> None: method test_creation_date_without_century (line 955) | def test_creation_date_without_century(self) -> None: method test_creation_date_prior_1970 (line 1011) | def test_creation_date_prior_1970(self) -> None: method test_missing_item_type (line 1059) | def test_missing_item_type(self) -> None: method test_missing_item_type_value (line 1087) | def test_missing_item_type_value(self) -> None: method test_download_and_dedupe_existing_photos (line 1115) | def test_download_and_dedupe_existing_photos(self) -> None: method test_download_photos_and_set_exif_exceptions (line 1209) | def test_download_photos_and_set_exif_exceptions(self) -> None: method test_download_chinese (line 1263) | def test_download_chinese(self) -> None: method test_download_one_recent_live_photo (line 1311) | def test_download_one_recent_live_photo(self) -> None: method test_download_one_recent_live_photo_chinese (line 1366) | def test_download_one_recent_live_photo_chinese(self) -> None: method test_download_and_delete_after (line 1423) | def test_download_and_delete_after(self) -> None: method test_download_and_not_delete_after_when_exists (line 1465) | def test_download_and_not_delete_after_when_exists(self) -> None: method test_download_and_delete_after_fail (line 1507) | def test_download_and_delete_after_fail(self) -> None: method test_download_over_old_original_photos (line 1543) | def test_download_over_old_original_photos(self) -> None: method test_download_normalized_names (line 1604) | def test_download_normalized_names(self) -> None: method test_handle_internal_error_during_download (line 1643) | def test_handle_internal_error_during_download(self) -> None: method test_handle_internal_error_during_photo_iteration (line 1692) | def test_handle_internal_error_during_photo_iteration(self) -> None: method test_handle_io_error_mkdir (line 1741) | def test_handle_io_error_mkdir(self) -> None: method test_dry_run (line 1775) | def test_dry_run(self) -> None: method test_download_after_delete_dry_run (line 1819) | def test_download_after_delete_dry_run(self) -> None: method test_download_raw_photos (line 1869) | def test_download_raw_photos(self) -> None: method test_download_two_sizes (line 1911) | def test_download_two_sizes(self) -> None: method test_download_raw_alt_photos (line 1954) | def test_download_raw_alt_photos(self) -> None: method test_download_raw_photos_policy_alt_with_adj (line 2004) | def test_download_raw_photos_policy_alt_with_adj(self) -> None: method test_download_raw_photos_policy_orig (line 2052) | def test_download_raw_photos_policy_orig(self) -> None: method test_download_raw_photos_policy_as_is (line 2102) | def test_download_raw_photos_policy_as_is(self) -> None: method test_download_bad_filename_base64_encoding (line 2152) | def test_download_bad_filename_base64_encoding(self) -> None: method test_download_bad_filename_utf8_encoding (line 2192) | def test_download_bad_filename_utf8_encoding(self) -> None: method test_download_filename_string_encoding (line 2232) | def test_download_filename_string_encoding(self) -> None: method test_download_from_shared_library (line 2270) | def test_download_from_shared_library(self) -> None: method test_download_and_skip_old (line 2301) | def test_download_and_skip_old(self) -> None: method test_download_and_skip_new (line 2386) | def test_download_and_skip_new(self) -> None: method test_resume_download (line 2454) | def test_resume_download(self) -> None: FILE: tests/test_download_photos_id.py class DownloadPhotoNameIDTestCase (line 30) | class DownloadPhotoNameIDTestCase(TestCase): method inject_fixtures (line 32) | def inject_fixtures(self) -> None: method test_download_and_skip_existing_photos_name_id7 (line 36) | def test_download_and_skip_existing_photos_name_id7(self) -> None: method test_download_photos_and_set_exif_name_id7 (line 113) | def test_download_photos_and_set_exif_name_id7(self) -> None: method test_download_photos_and_get_exif_exceptions_name_id7 (line 190) | def test_download_photos_and_get_exif_exceptions_name_id7(self) -> None: method test_skip_existing_downloads_name_id7 (line 241) | def test_skip_existing_downloads_name_id7(self) -> None: method test_until_found_name_id7 (line 287) | def test_until_found_name_id7(self) -> None: method test_handle_io_error_name_id7 (line 384) | def test_handle_io_error_name_id7(self) -> None: method test_handle_session_error_during_download_name_id7 (line 427) | def test_handle_session_error_during_download_name_id7(self) -> None: method test_handle_session_error_during_photo_iteration_name_id7 (line 488) | def test_handle_session_error_during_photo_iteration_name_id7(self) ->... method test_handle_albums_error_name_id7 (line 549) | def test_handle_albums_error_name_id7(self) -> None: method test_missing_size_name_id7 (line 593) | def test_missing_size_name_id7(self) -> None: method test_size_fallback_to_original_name_id7 (line 668) | def test_size_fallback_to_original_name_id7(self) -> None: method test_adjusted_size_fallback_to_original_name_id7 (line 724) | def test_adjusted_size_fallback_to_original_name_id7(self) -> None: method test_force_size_name_id7 (line 786) | def test_force_size_name_id7(self) -> None: method test_invalid_creation_date_name_id7 (line 838) | def test_invalid_creation_date_name_id7(self) -> None: method test_creation_date_without_century_name_id7 (line 894) | def test_creation_date_without_century_name_id7(self) -> None: method test_creation_date_prior_1970_name_id7 (line 948) | def test_creation_date_prior_1970_name_id7(self) -> None: method test_missing_item_type_name_id7 (line 998) | def test_missing_item_type_name_id7(self) -> None: method test_missing_item_type_value_name_id7 (line 1028) | def test_missing_item_type_value_name_id7(self) -> None: method test_download_and_dedupe_existing_photos_name_id7 (line 1058) | def test_download_and_dedupe_existing_photos_name_id7(self) -> None: method test_download_photos_and_set_exif_exceptions_name_id7 (line 1127) | def test_download_photos_and_set_exif_exceptions_name_id7(self) -> None: method test_download_chinese_name_id7 (line 1181) | def test_download_chinese_name_id7(self) -> None: method test_download_one_recent_live_photo_name_id7 (line 1229) | def test_download_one_recent_live_photo_name_id7(self) -> None: method test_download_one_recent_live_photo_chinese_name_id7 (line 1284) | def test_download_one_recent_live_photo_chinese_name_id7(self) -> None: method test_download_and_delete_after_name_id7 (line 1341) | def test_download_and_delete_after_name_id7(self) -> None: method test_download_and_not_delete_after_when_exists_name_id7 (line 1383) | def test_download_and_not_delete_after_when_exists_name_id7(self) -> N... method test_download_and_delete_after_fail_name_id7 (line 1427) | def test_download_and_delete_after_fail_name_id7(self) -> None: method test_download_over_old_original_photos_name_id7 (line 1463) | def test_download_over_old_original_photos_name_id7(self) -> None: method test_download_normalized_names_name_id7 (line 1524) | def test_download_normalized_names_name_id7(self) -> None: method test_handle_internal_error_during_download_name_id7 (line 1563) | def test_handle_internal_error_during_download_name_id7(self) -> None: method test_handle_internal_error_during_photo_iteration_name_id7 (line 1612) | def test_handle_internal_error_during_photo_iteration_name_id7(self) -... method test_handle_io_error_mkdir_name_id7 (line 1661) | def test_handle_io_error_mkdir_name_id7(self) -> None: method test_dry_run_name_id7 (line 1695) | def test_dry_run_name_id7(self) -> None: method test_download_after_delete_dry_run_name_id7 (line 1739) | def test_download_after_delete_dry_run_name_id7(self) -> None: method test_download_raw_photos_name_id7 (line 1792) | def test_download_raw_photos_name_id7(self) -> None: method test_download_two_sizes_name_id7 (line 1834) | def test_download_two_sizes_name_id7(self) -> None: method test_download_raw_alt_photos_name_id7 (line 1880) | def test_download_raw_alt_photos_name_id7(self) -> None: method test_download_raw_photos_policy_alt_with_adj_name_id7 (line 1930) | def test_download_raw_photos_policy_alt_with_adj_name_id7(self) -> None: method test_download_raw_photos_policy_orig_name_id7 (line 1978) | def test_download_raw_photos_policy_orig_name_id7(self) -> None: method test_download_raw_photos_policy_as_is_name_id7 (line 2028) | def test_download_raw_photos_policy_as_is_name_id7(self) -> None: method test_download_bad_filename_base64_encoding_name_id7 (line 2078) | def test_download_bad_filename_base64_encoding_name_id7(self) -> None: method test_download_bad_filename_utf8_encoding_name_id7 (line 2118) | def test_download_bad_filename_utf8_encoding_name_id7(self) -> None: method test_download_filename_string_encoding_name_id7 (line 2158) | def test_download_filename_string_encoding_name_id7(self) -> None: method test_download_and_skip_old_name_id7 (line 2196) | def test_download_and_skip_old_name_id7(self) -> None: method test_download_and_skip_new_name_id7 (line 2283) | def test_download_and_skip_new_name_id7(self) -> None: FILE: tests/test_download_videos.py class DownloadVideoTestCase (line 13) | class DownloadVideoTestCase(TestCase): method inject_fixtures (line 15) | def inject_fixtures(self) -> None: method test_download_and_skip_existing_videos (line 19) | def test_download_and_skip_existing_videos(self) -> None: FILE: tests/test_email_notifications.py class EmailNotificationsTestCase (line 12) | class EmailNotificationsTestCase(TestCase): method inject_fixtures (line 14) | def inject_fixtures(self) -> None: method test_2sa_required_email_notification (line 20) | def test_2sa_required_email_notification(self) -> None: method test_2sa_notification_without_smtp_login_and_tls (line 68) | def test_2sa_notification_without_smtp_login_and_tls(self) -> None: method test_2sa_required_notification_script (line 112) | def test_2sa_required_notification_script(self) -> None: method test_2sa_required_email_notification_from (line 141) | def test_2sa_required_email_notification_from(self) -> None: FILE: tests/test_filenames.py function create_mock_photo_asset (line 11) | def create_mock_photo_asset(base_filename: str = "IMG_1") -> Any: class PathsTestCase (line 43) | class PathsTestCase(TestCase): method test_disambiguate_filenames_all_diff (line 44) | def test_disambiguate_filenames_all_diff(self) -> None: method test_disambiguate_filenames_keep_orgraw_alt_adj (line 78) | def test_disambiguate_filenames_keep_orgraw_alt_adj(self) -> None: method test_disambiguate_filenames_keep_latest (line 119) | def test_disambiguate_filenames_keep_latest(self) -> None: method test_disambiguate_filenames_keep_org_adj_diff (line 147) | def test_disambiguate_filenames_keep_org_adj_diff(self) -> None: method test_disambiguate_filenames_keep_org_alt_diff (line 179) | def test_disambiguate_filenames_keep_org_alt_diff(self) -> None: method test_disambiguate_filenames_keep_all_when_org_adj_same (line 211) | def test_disambiguate_filenames_keep_all_when_org_adj_same(self) -> None: method test_disambiguate_filenames_keep_org_alt_missing (line 256) | def test_disambiguate_filenames_keep_org_alt_missing(self) -> None: method test_disambiguate_filenames_keep_alt_missing (line 287) | def test_disambiguate_filenames_keep_alt_missing(self) -> None: method test_disambiguate_filenames_keep_adj_alt_missing (line 314) | def test_disambiguate_filenames_keep_adj_alt_missing(self) -> None: FILE: tests/test_folder_structure.py class FolderStructureTestCase (line 15) | class FolderStructureTestCase(TestCase): method inject_fixtures (line 17) | def inject_fixtures(self) -> None: method test_default_folder_structure (line 22) | def test_default_folder_structure(self) -> None: method test_folder_structure_none (line 81) | def test_folder_structure_none(self) -> None: method test_folder_structure_de_posix (line 125) | def test_folder_structure_de_posix(self) -> None: method test_folder_structure_bad_format (line 181) | def test_folder_structure_bad_format(self) -> None: FILE: tests/test_http.py class TestHttpUtils (line 16) | class TestHttpUtils(unittest.TestCase): method test_is_streaming_response_with_closed_connection (line 19) | def test_is_streaming_response_with_closed_connection(self) -> None: method test_is_streaming_response_with_open_connection (line 29) | def test_is_streaming_response_with_open_connection(self) -> None: method test_is_streaming_response_with_no_raw_attribute (line 39) | def test_is_streaming_response_with_no_raw_attribute(self) -> None: method test_is_streaming_response_with_exception (line 48) | def test_is_streaming_response_with_exception(self) -> None: method test_response_to_har_entry_with_json_response (line 58) | def test_response_to_har_entry_with_json_response(self) -> None: method test_response_to_har_entry_with_stream_response (line 82) | def test_response_to_har_entry_with_stream_response(self) -> None: class HttpTestRequestHandler (line 106) | class HttpTestRequestHandler(BaseHTTPRequestHandler): method log_message (line 109) | def log_message(self, format: str, *args: Any) -> None: # noqa: ARG002 method do_GET (line 113) | def do_GET(self) -> None: class TestHttpIntegration (line 184) | class TestHttpIntegration(unittest.TestCase): method setUpClass (line 193) | def setUpClass(cls) -> None: method tearDownClass (line 208) | def tearDownClass(cls) -> None: method test_response_to_har_entry_with_real_json_response (line 213) | def test_response_to_har_entry_with_real_json_response(self) -> None: method test_response_to_har_entry_with_real_text_response (line 238) | def test_response_to_har_entry_with_real_text_response(self) -> None: method test_response_to_har_entry_with_real_streaming_response (line 263) | def test_response_to_har_entry_with_real_streaming_response(self) -> N... method test_streaming_vs_non_streaming_behavior (line 290) | def test_streaming_vs_non_streaming_behavior(self) -> None: method test_response_to_har_entry_with_large_streaming_response (line 312) | def test_response_to_har_entry_with_large_streaming_response(self) -> ... FILE: tests/test_issue_1220_only_print_filenames_dedup_bug.py class Issue1220OnlyPrintFilenamesDeduplicationBugTest (line 25) | class Issue1220OnlyPrintFilenamesDeduplicationBugTest(TestCase): method inject_fixtures (line 29) | def inject_fixtures(self) -> None: method test_only_print_filenames_should_not_download_during_deduplication (line 33) | def test_only_print_filenames_should_not_download_during_deduplication... FILE: tests/test_json_rules.py class AppleRuleTestCase (line 7) | class AppleRuleTestCase(TestCase): method test_str_match (line 8) | def test_str_match(self) -> None: method test_str_not_match (line 15) | def test_str_not_match(self) -> None: method test_str_match_for_none (line 22) | def test_str_match_for_none(self) -> None: method test_tuple_match (line 29) | def test_tuple_match(self) -> None: method test_list_match (line 35) | def test_list_match(self) -> None: method test_list_match_each (line 41) | def test_list_match_each(self) -> None: method test_json_match (line 47) | def test_json_match(self) -> None: method test_json_match_by_leaf (line 53) | def test_json_match_by_leaf(self) -> None: method test_json_update_object_in_list (line 59) | def test_json_update_object_in_list(self) -> None: method test_json_drop_object_in_list (line 65) | def test_json_drop_object_in_list(self) -> None: method test_json_dict_drop (line 71) | def test_json_dict_drop(self) -> None: method test_json_list_drop (line 77) | def test_json_list_drop(self) -> None: FILE: tests/test_keep_icloud_mode.py class KeepICloudModeTestCases (line 11) | class KeepICloudModeTestCases(TestCase): method inject_fixtures (line 13) | def inject_fixtures(self) -> None: method test_wide_range_keep_icloud_recent_days (line 17) | def test_wide_range_keep_icloud_recent_days(self) -> None: method test_narrow_range_keep_icloud_recent_days (line 62) | def test_narrow_range_keep_icloud_recent_days(self) -> None: method test_keep_icloud_recent_days_delete_all (line 106) | def test_keep_icloud_recent_days_delete_all(self) -> None: method test_keep_icloud_recent_days_1_keeps_today (line 151) | def test_keep_icloud_recent_days_1_keeps_today(self) -> None: method test_keep_icloud_recent_days_delete_existing (line 195) | def test_keep_icloud_recent_days_delete_existing(self) -> None: method test_keep_icloud_recent_days_keeps_some (line 251) | def test_keep_icloud_recent_days_keeps_some(self) -> None: method test_keep_icloud_recent_days_delete_existing_dry_run (line 307) | def test_keep_icloud_recent_days_delete_existing_dry_run(self) -> None: method test_keep_icloud_recent_days_with_skip_videos (line 353) | def test_keep_icloud_recent_days_with_skip_videos(self) -> None: FILE: tests/test_listing_albums.py class ListingAlbumsTestCase (line 13) | class ListingAlbumsTestCase(TestCase): method inject_fixtures (line 15) | def inject_fixtures(self) -> None: method test_listing_albums (line 19) | def test_listing_albums(self) -> None: FILE: tests/test_listing_libraries.py class ListingLibraryTestCase (line 13) | class ListingLibraryTestCase(TestCase): method inject_fixtures (line 15) | def inject_fixtures(self) -> None: method test_listing_library (line 19) | def test_listing_library(self) -> None: method test_listing_library_error (line 43) | def test_listing_library_error(self) -> None: FILE: tests/test_listing_recent_photos.py class ListingRecentPhotosTestCase (line 14) | class ListingRecentPhotosTestCase(TestCase): method inject_fixtures (line 16) | def inject_fixtures(self) -> None: method test_listing_recent_photos (line 20) | def test_listing_recent_photos(self) -> None: method test_listing_photos_does_not_create_folders (line 72) | def test_listing_photos_does_not_create_folders(self) -> None: method test_listing_recent_photos_with_missing_filenameEnc (line 99) | def test_listing_recent_photos_with_missing_filenameEnc(self) -> None: method test_listing_recent_photos_with_missing_downloadURL (line 147) | def test_listing_recent_photos_with_missing_downloadURL(self) -> None: FILE: tests/test_logger.py class LoggerTestCase (line 12) | class LoggerTestCase(TestCase): method test_logger_output (line 15) | def test_logger_output(self) -> None: method test_logger_tqdm_fallback (line 38) | def test_logger_tqdm_fallback(self) -> None: FILE: tests/test_session_connection_errors.py class ConnectionTestHandler (line 21) | class ConnectionTestHandler(BaseHTTPRequestHandler): method do_GET (line 26) | def do_GET(self) -> None: method do_POST (line 47) | def do_POST(self) -> None: method log_message (line 51) | def log_message(self, format: str, *args: Any) -> None: # noqa: ARG002 class TestPyiCloudSessionConnectionErrors (line 56) | class TestPyiCloudSessionConnectionErrors(unittest.TestCase): method setUp (line 59) | def setUp(self) -> None: method tearDown (line 81) | def tearDown(self) -> None: method _find_free_port (line 88) | def _find_free_port(self) -> int: method _start_server (line 96) | def _start_server(self, error_type: str = "normal") -> None: method test_normal_request (line 106) | def test_normal_request(self) -> None: method test_connection_error_handling (line 113) | def test_connection_error_handling(self) -> None: method test_timeout_error_handling (line 123) | def test_timeout_error_handling(self) -> None: method test_builtin_timeout_error_handling (line 138) | def test_builtin_timeout_error_handling(self) -> None: method test_new_connection_error_handling (line 150) | def test_new_connection_error_handling(self) -> None: method test_other_exceptions_pass_through (line 164) | def test_other_exceptions_pass_through(self) -> None: method test_all_http_methods_covered (line 177) | def test_all_http_methods_covered(self) -> None: FILE: tests/test_string_helpers.py class TruncateMiddleTestCase (line 12) | class TruncateMiddleTestCase(TestCase): method test_truncate_middle (line 13) | def test_truncate_middle(self) -> None: class ParseTimestampeOrTimeDeltaTestCase (line 28) | class ParseTimestampeOrTimeDeltaTestCase(TestCase): method test_totality (line 29) | def test_totality(self) -> None: method test_naive (line 37) | def test_naive(self) -> None: method test_naive_311plus (line 51) | def test_naive_311plus(self) -> None: method test_aware (line 57) | def test_aware(self) -> None: method test_aware_311plus (line 70) | def test_aware_311plus(self) -> None: method test_timestamp_invalid (line 79) | def test_timestamp_invalid(self) -> None: method test_delta_totality (line 83) | def test_delta_totality(self) -> None: method test_delta (line 94) | def test_delta(self) -> None: method test_delta_invalid (line 98) | def test_delta_invalid(self) -> None: FILE: tests/test_two_step_auth.py class TwoStepAuthTestCase (line 17) | class TwoStepAuthTestCase(TestCase): method inject_fixtures (line 19) | def inject_fixtures(self) -> None: method test_2sa_flow_invalid_code (line 24) | def test_2sa_flow_invalid_code(self) -> None: method test_2sa_flow_valid_code (line 52) | def test_2sa_flow_valid_code(self) -> None: method test_2sa_flow_failed_send_code (line 88) | def test_2sa_flow_failed_send_code(self) -> None: method test_2fa_flow_invalid_code (line 124) | def test_2fa_flow_invalid_code(self) -> None: method test_2fa_flow_valid_code (line 152) | def test_2fa_flow_valid_code(self) -> None: method test_2fa_flow_valid_code_zero_lead (line 189) | def test_2fa_flow_valid_code_zero_lead(self) -> None: FILE: tests/test_xmp_sidecar.py class BuildXMPMetadata (line 9) | class BuildXMPMetadata(TestCase): method test_build_metadata (line 10) | def test_build_metadata(self) -> None: