Coverage for src/mactime/constants.py: 77%
39 statements
« prev ^ index » next coverage.py v7.6.12, created at 2025-02-24 19:31 +0100
« prev ^ index » next coverage.py v7.6.12, created at 2025-02-24 19:31 +0100
1from __future__ import annotations
2from __future__ import annotations
3from __future__ import annotations
4from __future__ import annotations
6import os
7from datetime import datetime
8from datetime import timedelta
9from decimal import Decimal
10from enum import Flag
11from enum import StrEnum
12from enum import auto
13from typing import Final
16MODIFIED_NAME: Final[str] = "modified"
17CREATED_NAME: Final[str] = "created"
18CHANGED_NAME: Final[str] = "changed"
19ADDED_NAME: Final[str] = "added"
20ACCESSED_NAME: Final[str] = "accessed"
21BACKED_UP_NAME: Final[str] = "backed_up"
22OPENED_NAME: Final[str] = "opened"
24PathType = str | os.PathLike
26NANOSECONDS_IN_SECOND = Decimal("1e9")
29# Constants (from macOS attr/attribute headers)
30# taken from https://docs.rs/libc/latest/aarch64-apple-ios/src/libc/unix/bsd/apple/mod.rs.html
31ATTR_CMN_CRTIME = 0x00000200 # Finder's Date Created
32ATTR_CMN_MODTIME = 0x00000400 # Finder's Date Modified & st_mtime
33ATTR_CMN_CHGTIME = 0x00000800 # st_ctime (last attr modification time)
34ATTR_CMN_ACCTIME = 0x00001000 # st_atime
35ATTR_CMN_BKUPTIME = 0x00002000
36ATTR_CMN_ADDEDTIME = 0x10000000 # Finder's Date Added
37ATTR_CMN_RETURNED_ATTRS = 0x80000000
38ATTR_BIT_MAP_COUNT = 5
41FSOPT_NOFOLLOW = 0x1
43NAME_TO_SHORTHAND = {
44 MODIFIED_NAME: "m",
45 CREATED_NAME: "c",
46 CHANGED_NAME: "g",
47 ADDED_NAME: "d",
48 ACCESSED_NAME: "a",
49 BACKED_UP_NAME: "b",
50 OPENED_NAME: "o",
51}
52SHORTHAND_TO_NAME = {v: k for k, v in NAME_TO_SHORTHAND.items()}
53ATTR_NAME_ARG_CHOICES = {**NAME_TO_SHORTHAND, **SHORTHAND_TO_NAME}
54ATTR_TO_NAME_MAP = {
55 ATTR_CMN_CRTIME: CREATED_NAME,
56 ATTR_CMN_MODTIME: MODIFIED_NAME,
57 ATTR_CMN_CHGTIME: CHANGED_NAME,
58 ATTR_CMN_ACCTIME: ACCESSED_NAME,
59 ATTR_CMN_BKUPTIME: BACKED_UP_NAME,
60 ATTR_CMN_ADDEDTIME: ADDED_NAME,
61}
62assert sorted(ATTR_TO_NAME_MAP) == list(ATTR_TO_NAME_MAP), "Attrs must be ordered."
64NAME_TO_ATTR_MAP: dict[str, int] = {
65 name: attr for attr, name in ATTR_TO_NAME_MAP.items()
66}
67WRITABLE_NAMES = NAME_TO_ATTR_MAP.keys() - {OPENED_NAME, BACKED_UP_NAME, CHANGED_NAME}
69EPOCH = datetime.fromtimestamp(0)
70TIME_ALIASES = {
71 "now": datetime.now,
72 "yesterday": lambda: (datetime.now() - timedelta(days=1)).replace(
73 microsecond=0, second=0, minute=0, hour=0
74 ),
75 "epoch": lambda: EPOCH,
76}