Feature date added 998 (#1003)

* Implemented --date-added, #998

* Added --date-added-from-photo

* Fixed typehint
This commit is contained in:
Rhet Turnbull
2023-02-25 14:38:49 -08:00
committed by GitHub
parent 0e1613f134
commit 94f484e9ec
7 changed files with 390 additions and 24 deletions

View File

@@ -4,7 +4,11 @@ import datetime
import pathlib
import time
from tests.parse_timewarp_output import CompareValues, InspectValues
from tests.parse_timewarp_output import (
CompareValues,
InspectValues,
InspectValuesDateAdded,
)
TEST_LIBRARY_TIMEWARP = "tests/TestTimeWarp-10.15.7.photoslibrary"
@@ -393,4 +397,55 @@ CATALINA_PHOTOS_5 = {
"GMT-0400",
),
},
"date_added": {
# 20230120_010203-0400.jpg
"uuid": "5285C4E2-BB1A-49DF-AEF5-246AA337ACAB",
"data": [
(
"2022-01-01",
InspectValuesDateAdded(
"20230120_010203-0400.jpg",
"5285C4E2-BB1A-49DF-AEF5-246AA337ACAB",
"2023-01-19 21:02:03-0800"
if not is_dst()
else "2023-01-19 20:02:03-0700",
"2023-01-20 01:02:03-0400",
"-0400",
"GMT-0400",
"2022-01-01 00:00:00-0800"
if not is_dst()
else "2022-01-01 00:00:00-0700",
),
),
(
"2022-01-01 01:02:03",
InspectValuesDateAdded(
"20230120_010203-0400.jpg",
"5285C4E2-BB1A-49DF-AEF5-246AA337ACAB",
"2023-01-19 21:02:03-0800"
if not is_dst()
else "2023-01-19 20:02:03-0700",
"2023-01-20 01:02:03-0400",
"-0400",
"GMT-0400",
"2022-01-01 01:02:03-0800"
if not is_dst()
else "2022-01-01 01:02:03-0700",
),
),
],
},
"date_added_from_photo": {
# 20230120_010203-0400.jpg
"uuid": "5285C4E2-BB1A-49DF-AEF5-246AA337ACAB",
"expected": InspectValuesDateAdded(
"20230120_010203-0400.jpg",
"5285C4E2-BB1A-49DF-AEF5-246AA337ACAB",
"2023-01-19 21:02:03-0800" if not is_dst() else "2023-01-19 20:02:03-0700",
"2023-01-20 01:02:03-0400",
"-0400",
"GMT-0400",
"2023-01-19 21:02:03-0800" if not is_dst() else "2023-01-19 20:02:03-0700",
),
},
}

View File

@@ -7,7 +7,11 @@ import datetime
import pathlib
import time
from tests.parse_timewarp_output import CompareValues, InspectValues
from tests.parse_timewarp_output import (
CompareValues,
InspectValues,
InspectValuesDateAdded,
)
TEST_LIBRARY_TIMEWARP = "tests/TestTimeWarp-13.1.0.photoslibrary"
@@ -396,4 +400,55 @@ VENTURA_PHOTOS_5 = {
"GMT-0400",
),
},
"date_added": {
# 20230120_010203-0400.jpg
"uuid": "5285C4E2-BB1A-49DF-AEF5-246AA337ACAB",
"data": [
(
"2022-01-01",
InspectValuesDateAdded(
"20230120_010203-0400.jpg",
"5285C4E2-BB1A-49DF-AEF5-246AA337ACAB",
"2023-01-19 21:02:03-0800"
if not is_dst()
else "2023-01-19 20:02:03-0700",
"2023-01-20 01:02:03-0400",
"-0400",
"GMT-0400",
"2022-01-01 00:00:00-0800"
if not is_dst()
else "2022-01-01 00:00:00-0700",
),
),
(
"2022-01-01 01:02:03",
InspectValuesDateAdded(
"20230120_010203-0400.jpg",
"5285C4E2-BB1A-49DF-AEF5-246AA337ACAB",
"2023-01-19 21:02:03-0800"
if not is_dst()
else "2023-01-19 20:02:03-0700",
"2023-01-20 01:02:03-0400",
"-0400",
"GMT-0400",
"2022-01-01 01:02:03-0800"
if not is_dst()
else "2022-01-01 01:02:03-0700",
),
),
],
},
"date_added_from_photo": {
# 20230120_010203-0400.jpg
"uuid": "5285C4E2-BB1A-49DF-AEF5-246AA337ACAB",
"expected": InspectValuesDateAdded(
"20230120_010203-0400.jpg",
"5285C4E2-BB1A-49DF-AEF5-246AA337ACAB",
"2023-01-19 21:02:03-0800" if not is_dst() else "2023-01-19 20:02:03-0700",
"2023-01-20 01:02:03-0400",
"-0400",
"GMT-0400",
"2023-01-19 21:02:03-0800" if not is_dst() else "2023-01-19 20:02:03-0700",
),
},
}

View File

@@ -1,12 +1,34 @@
""" Parse --inspect and --compare-exif output for testing"""
from __future__ import annotations
from collections import namedtuple
from typing import List
# filename, uuid, photo time (local), photo time, timezone offset, timezone name
InspectValues = namedtuple(
"InspectValues",
["filename", "uuid", "date_local", "date_tz", "tz_offset", "tz_name"],
[
"filename",
"uuid",
"date_local",
"date_tz",
"tz_offset",
"tz_name",
],
)
InspectValuesDateAdded = namedtuple(
"InspectValues",
[
"filename",
"uuid",
"date_local",
"date_tz",
"tz_offset",
"tz_name",
"date_added",
],
)
CompareValues = namedtuple(
@@ -22,7 +44,9 @@ CompareValues = namedtuple(
)
def parse_inspect_output(output: str) -> List[InspectValues]:
def parse_inspect_output(
output: str, date_added: bool = False
) -> List[InspectValues] | List[InspectValuesDateAdded]:
"""Parse output of --inspect and return list of InspectValues named tuple"""
lines = [line for line in output.split("\n") if line.strip()]
@@ -32,7 +56,12 @@ def parse_inspect_output(output: str) -> List[InspectValues]:
for line in lines:
parts = line.split(",")
parts = [part.strip() for part in parts]
values.append(InspectValues(*parts))
if not date_added:
# remove date added
parts.pop()
values.append(InspectValues(*parts))
else:
values.append(InspectValuesDateAdded(*parts))
return values

View File

@@ -1,5 +1,6 @@
""" Tests which require user interaction to run for osxphotos timewarp command """
import datetime
import os
import time
@@ -9,7 +10,11 @@ from click.testing import CliRunner
from osxphotos import PhotosDB
from osxphotos.exiftool import ExifTool
from tests.conftest import get_os_version
from tests.parse_timewarp_output import parse_compare_exif, parse_inspect_output
from tests.parse_timewarp_output import (
InspectValuesDateAdded,
parse_compare_exif,
parse_inspect_output,
)
# set timezone to avoid issues with comparing dates
os.environ["TZ"] = "US/Pacific"
@@ -1055,3 +1060,61 @@ def test_parse_date_tz(photoslib, suspend_capture):
assert output_values[0].date_local == expected.date_local
assert output_values[0].date_tz == expected.date_tz
assert output_values[0].tz_offset == expected.tz_offset
@pytest.mark.timewarp
@pytest.mark.parametrize(
"date_added,expected",
TEST_DATA["date_added"]["data"],
)
def test_date_added(
photoslib, suspend_capture, date_added: str, expected: InspectValuesDateAdded
):
"""Test --date-added"""
from osxphotos.cli.timewarp import timewarp
runner = CliRunner()
result = runner.invoke(
timewarp,
[
"--date-added",
date_added,
"--force",
],
terminal_width=TERMINAL_WIDTH,
)
assert result.exit_code == 0
result = runner.invoke(
timewarp,
["--inspect", "--plain", "--force"],
terminal_width=TERMINAL_WIDTH,
)
output_values = parse_inspect_output(result.output, date_added=True)
assert output_values[0].date_added == expected.date_added
@pytest.mark.timewarp
def test_date_added_from_photo(photoslib, suspend_capture):
"""Test --date-added-from-photo"""
from osxphotos.cli.timewarp import timewarp
runner = CliRunner()
result = runner.invoke(
timewarp,
[
"--date-added-from-photo",
"--force",
],
terminal_width=TERMINAL_WIDTH,
)
assert result.exit_code == 0
result = runner.invoke(
timewarp,
["--inspect", "--plain", "--force"],
terminal_width=TERMINAL_WIDTH,
)
output_values = parse_inspect_output(result.output, date_added=True)
expected = TEST_DATA["date_added_from_photo"]["expected"]
assert output_values[0].date_added == expected.date_added