Feature date added 998 (#1003)
* Implemented --date-added, #998 * Added --date-added-from-photo * Fixed typehint
This commit is contained in:
@@ -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",
|
||||
),
|
||||
},
|
||||
}
|
||||
|
||||
@@ -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",
|
||||
),
|
||||
},
|
||||
}
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user