Refactored ExportResults (#786)
This commit is contained in:
@@ -245,6 +245,36 @@ class StagedFiles:
|
|||||||
class ExportResults:
|
class ExportResults:
|
||||||
"""Results class which holds export results for export"""
|
"""Results class which holds export results for export"""
|
||||||
|
|
||||||
|
__slots__ = [
|
||||||
|
"_datetime",
|
||||||
|
"converted_to_jpeg",
|
||||||
|
"deleted_directories",
|
||||||
|
"deleted_files",
|
||||||
|
"error",
|
||||||
|
"exif_updated",
|
||||||
|
"exiftool_error",
|
||||||
|
"exiftool_warning",
|
||||||
|
"exported",
|
||||||
|
"exported_album",
|
||||||
|
"metadata_changed",
|
||||||
|
"missing",
|
||||||
|
"missing_album",
|
||||||
|
"new",
|
||||||
|
"sidecar_exiftool_skipped",
|
||||||
|
"sidecar_exiftool_written",
|
||||||
|
"sidecar_json_skipped",
|
||||||
|
"sidecar_json_written",
|
||||||
|
"sidecar_xmp_skipped",
|
||||||
|
"sidecar_xmp_written",
|
||||||
|
"skipped",
|
||||||
|
"skipped_album",
|
||||||
|
"to_touch",
|
||||||
|
"touched",
|
||||||
|
"updated",
|
||||||
|
"xattr_skipped",
|
||||||
|
"xattr_written",
|
||||||
|
]
|
||||||
|
|
||||||
def __init__(
|
def __init__(
|
||||||
self,
|
self,
|
||||||
converted_to_jpeg=None,
|
converted_to_jpeg=None,
|
||||||
@@ -254,11 +284,11 @@ class ExportResults:
|
|||||||
exif_updated=None,
|
exif_updated=None,
|
||||||
exiftool_error=None,
|
exiftool_error=None,
|
||||||
exiftool_warning=None,
|
exiftool_warning=None,
|
||||||
exported_album=None,
|
|
||||||
exported=None,
|
exported=None,
|
||||||
|
exported_album=None,
|
||||||
metadata_changed=None,
|
metadata_changed=None,
|
||||||
missing_album=None,
|
|
||||||
missing=None,
|
missing=None,
|
||||||
|
missing_album=None,
|
||||||
new=None,
|
new=None,
|
||||||
sidecar_exiftool_skipped=None,
|
sidecar_exiftool_skipped=None,
|
||||||
sidecar_exiftool_written=None,
|
sidecar_exiftool_written=None,
|
||||||
@@ -266,8 +296,8 @@ class ExportResults:
|
|||||||
sidecar_json_written=None,
|
sidecar_json_written=None,
|
||||||
sidecar_xmp_skipped=None,
|
sidecar_xmp_skipped=None,
|
||||||
sidecar_xmp_written=None,
|
sidecar_xmp_written=None,
|
||||||
skipped_album=None,
|
|
||||||
skipped=None,
|
skipped=None,
|
||||||
|
skipped_album=None,
|
||||||
to_touch=None,
|
to_touch=None,
|
||||||
touched=None,
|
touched=None,
|
||||||
updated=None,
|
updated=None,
|
||||||
@@ -275,36 +305,22 @@ class ExportResults:
|
|||||||
xattr_written=None,
|
xattr_written=None,
|
||||||
):
|
):
|
||||||
|
|
||||||
self.datetime = datetime.now().isoformat()
|
local_vars = locals()
|
||||||
|
self._datetime = datetime.now().isoformat()
|
||||||
|
for attr in self.attributes:
|
||||||
|
setattr(self, attr, local_vars.get(attr) or [])
|
||||||
|
|
||||||
self.converted_to_jpeg = converted_to_jpeg or []
|
@property
|
||||||
self.deleted_directories = deleted_directories or []
|
def attributes(self) -> t.List[str]:
|
||||||
self.deleted_files = deleted_files or []
|
"""Return list of attributes tracked by ExportResults"""
|
||||||
self.error = error or []
|
return [attr for attr in self.__slots__ if not attr.startswith("_")]
|
||||||
self.exif_updated = exif_updated or []
|
|
||||||
self.exiftool_error = exiftool_error or []
|
|
||||||
self.exiftool_warning = exiftool_warning or []
|
|
||||||
self.exported = exported or []
|
|
||||||
self.exported_album = exported_album or []
|
|
||||||
self.metadata_changed = metadata_changed or []
|
|
||||||
self.missing = missing or []
|
|
||||||
self.missing_album = missing_album or []
|
|
||||||
self.new = new or []
|
|
||||||
self.sidecar_exiftool_skipped = sidecar_exiftool_skipped or []
|
|
||||||
self.sidecar_exiftool_written = sidecar_exiftool_written or []
|
|
||||||
self.sidecar_json_skipped = sidecar_json_skipped or []
|
|
||||||
self.sidecar_json_written = sidecar_json_written or []
|
|
||||||
self.sidecar_xmp_skipped = sidecar_xmp_skipped or []
|
|
||||||
self.sidecar_xmp_written = sidecar_xmp_written or []
|
|
||||||
self.skipped = skipped or []
|
|
||||||
self.skipped_album = skipped_album or []
|
|
||||||
self.to_touch = to_touch or []
|
|
||||||
self.touched = touched or []
|
|
||||||
self.updated = updated or []
|
|
||||||
self.xattr_skipped = xattr_skipped or []
|
|
||||||
self.xattr_written = xattr_written or []
|
|
||||||
|
|
||||||
def all_files(self):
|
@property
|
||||||
|
def datetime(self) -> str:
|
||||||
|
"""Return datetime when ExportResults was created"""
|
||||||
|
return self._datetime
|
||||||
|
|
||||||
|
def all_files(self) -> t.List[str]:
|
||||||
"""return all filenames contained in results"""
|
"""return all filenames contained in results"""
|
||||||
files = (
|
files = (
|
||||||
self.exported
|
self.exported
|
||||||
@@ -326,65 +342,23 @@ class ExportResults:
|
|||||||
files += [x[0] for x in self.exiftool_error]
|
files += [x[0] for x in self.exiftool_error]
|
||||||
files += [x[0] for x in self.error]
|
files += [x[0] for x in self.error]
|
||||||
|
|
||||||
files = list(set(files))
|
return list(set(files))
|
||||||
return files
|
|
||||||
|
|
||||||
def __iadd__(self, other):
|
def __iadd__(self, other) -> "ExportResults":
|
||||||
self.exported += other.exported
|
if type(other) != ExportResults:
|
||||||
self.new += other.new
|
raise TypeError("Can only add ExportResults to ExportResults")
|
||||||
self.updated += other.updated
|
|
||||||
self.skipped += other.skipped
|
|
||||||
self.exif_updated += other.exif_updated
|
|
||||||
self.touched += other.touched
|
|
||||||
self.to_touch += other.to_touch
|
|
||||||
self.converted_to_jpeg += other.converted_to_jpeg
|
|
||||||
self.sidecar_json_written += other.sidecar_json_written
|
|
||||||
self.sidecar_json_skipped += other.sidecar_json_skipped
|
|
||||||
self.sidecar_exiftool_written += other.sidecar_exiftool_written
|
|
||||||
self.sidecar_exiftool_skipped += other.sidecar_exiftool_skipped
|
|
||||||
self.sidecar_xmp_written += other.sidecar_xmp_written
|
|
||||||
self.sidecar_xmp_skipped += other.sidecar_xmp_skipped
|
|
||||||
self.missing += other.missing
|
|
||||||
self.error += other.error
|
|
||||||
self.exiftool_warning += other.exiftool_warning
|
|
||||||
self.exiftool_error += other.exiftool_error
|
|
||||||
self.deleted_files += other.deleted_files
|
|
||||||
self.deleted_directories += other.deleted_directories
|
|
||||||
self.exported_album += other.exported_album
|
|
||||||
self.skipped_album += other.skipped_album
|
|
||||||
self.missing_album += other.missing_album
|
|
||||||
self.metadata_changed += other.metadata_changed
|
|
||||||
|
|
||||||
|
for attribute in self.attributes:
|
||||||
|
setattr(
|
||||||
|
self, attribute, getattr(self, attribute) + getattr(other, attribute)
|
||||||
|
)
|
||||||
return self
|
return self
|
||||||
|
|
||||||
def __str__(self):
|
def __str__(self) -> str:
|
||||||
return (
|
return (
|
||||||
"ExportResults("
|
"ExportResults("
|
||||||
+ f"datetime={self.datetime}"
|
+ f"datetime={self._datetime}, "
|
||||||
+ f",exported={self.exported}"
|
+ ", ".join([f"{attr}={getattr(self, attr)}" for attr in self.attributes])
|
||||||
+ f",new={self.new}"
|
|
||||||
+ f",updated={self.updated}"
|
|
||||||
+ f",skipped={self.skipped}"
|
|
||||||
+ f",exif_updated={self.exif_updated}"
|
|
||||||
+ f",touched={self.touched}"
|
|
||||||
+ f",to_touch={self.to_touch}"
|
|
||||||
+ f",converted_to_jpeg={self.converted_to_jpeg}"
|
|
||||||
+ f",sidecar_json_written={self.sidecar_json_written}"
|
|
||||||
+ f",sidecar_json_skipped={self.sidecar_json_skipped}"
|
|
||||||
+ f",sidecar_exiftool_written={self.sidecar_exiftool_written}"
|
|
||||||
+ f",sidecar_exiftool_skipped={self.sidecar_exiftool_skipped}"
|
|
||||||
+ f",sidecar_xmp_written={self.sidecar_xmp_written}"
|
|
||||||
+ f",sidecar_xmp_skipped={self.sidecar_xmp_skipped}"
|
|
||||||
+ f",missing={self.missing}"
|
|
||||||
+ f",error={self.error}"
|
|
||||||
+ f",exiftool_warning={self.exiftool_warning}"
|
|
||||||
+ f",exiftool_error={self.exiftool_error}"
|
|
||||||
+ f",deleted_files={self.deleted_files}"
|
|
||||||
+ f",deleted_directories={self.deleted_directories}"
|
|
||||||
+ f",exported_album={self.exported_album}"
|
|
||||||
+ f",skipped_album={self.skipped_album}"
|
|
||||||
+ f",missing_album={self.missing_album}"
|
|
||||||
+ f",metadata_changed={self.metadata_changed}"
|
|
||||||
+ ")"
|
+ ")"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|||||||
@@ -3,53 +3,13 @@
|
|||||||
import pytest
|
import pytest
|
||||||
from osxphotos.photoexporter import ExportResults
|
from osxphotos.photoexporter import ExportResults
|
||||||
|
|
||||||
EXPORT_RESULT_ATTRIBUTES = [
|
EXPORT_RESULT_ATTRIBUTES = ExportResults().attributes
|
||||||
"exported",
|
|
||||||
"new",
|
|
||||||
"updated",
|
|
||||||
"skipped",
|
|
||||||
"exif_updated",
|
|
||||||
"touched",
|
|
||||||
"converted_to_jpeg",
|
|
||||||
"sidecar_json_written",
|
|
||||||
"sidecar_json_skipped",
|
|
||||||
"sidecar_exiftool_written",
|
|
||||||
"sidecar_exiftool_skipped",
|
|
||||||
"sidecar_xmp_written",
|
|
||||||
"sidecar_xmp_skipped",
|
|
||||||
"missing",
|
|
||||||
"error",
|
|
||||||
"exiftool_warning",
|
|
||||||
"exiftool_error",
|
|
||||||
"deleted_files",
|
|
||||||
"deleted_directories",
|
|
||||||
]
|
|
||||||
|
|
||||||
|
|
||||||
def test_exportresults_init():
|
def test_exportresults_init():
|
||||||
results = ExportResults()
|
results = ExportResults()
|
||||||
assert results.exported == []
|
for x in EXPORT_RESULT_ATTRIBUTES:
|
||||||
assert results.new == []
|
assert getattr(results, x) == []
|
||||||
assert results.updated == []
|
|
||||||
assert results.skipped == []
|
|
||||||
assert results.exif_updated == []
|
|
||||||
assert results.touched == []
|
|
||||||
assert results.converted_to_jpeg == []
|
|
||||||
assert results.sidecar_json_written == []
|
|
||||||
assert results.sidecar_json_skipped == []
|
|
||||||
assert results.sidecar_exiftool_written == []
|
|
||||||
assert results.sidecar_exiftool_skipped == []
|
|
||||||
assert results.sidecar_xmp_written == []
|
|
||||||
assert results.sidecar_xmp_skipped == []
|
|
||||||
assert results.missing == []
|
|
||||||
assert results.error == []
|
|
||||||
assert results.exiftool_warning == []
|
|
||||||
assert results.exiftool_error == []
|
|
||||||
assert results.deleted_files == []
|
|
||||||
assert results.deleted_directories == []
|
|
||||||
assert results.exported_album == []
|
|
||||||
assert results.skipped_album == []
|
|
||||||
assert results.missing_album == []
|
|
||||||
|
|
||||||
|
|
||||||
def test_exportresults_iadd():
|
def test_exportresults_iadd():
|
||||||
@@ -95,14 +55,32 @@ def test_exportresults_iadd():
|
|||||||
def test_all_files():
|
def test_all_files():
|
||||||
"""test ExportResults.all_files()"""
|
"""test ExportResults.all_files()"""
|
||||||
results = ExportResults()
|
results = ExportResults()
|
||||||
for x in EXPORT_RESULT_ATTRIBUTES:
|
all_file_attributes = [
|
||||||
|
"converted_to_jpeg",
|
||||||
|
"exif_updated",
|
||||||
|
"exported",
|
||||||
|
"missing",
|
||||||
|
"new",
|
||||||
|
"sidecar_exiftool_skipped",
|
||||||
|
"sidecar_exiftool_written",
|
||||||
|
"sidecar_json_skipped",
|
||||||
|
"sidecar_json_written",
|
||||||
|
"sidecar_xmp_skipped",
|
||||||
|
"sidecar_xmp_written",
|
||||||
|
"skipped",
|
||||||
|
"touched",
|
||||||
|
"updated",
|
||||||
|
]
|
||||||
|
for x in all_file_attributes:
|
||||||
setattr(results, x, [f"{x}1"])
|
setattr(results, x, [f"{x}1"])
|
||||||
results.exiftool_warning = [("exiftool_warning1", "foo")]
|
results.exiftool_warning = [("exiftool_warning1", "foo")]
|
||||||
results.exiftool_error = [("exiftool_error1", "foo")]
|
results.exiftool_error = [("exiftool_error1", "foo")]
|
||||||
results.error = [("error1", "foo")]
|
results.error = [("error1", "foo")]
|
||||||
results.deleted_files = ["deleted_files1"]
|
|
||||||
results.deleted_directories = ["deleted_directories1"]
|
|
||||||
|
|
||||||
assert sorted(
|
assert sorted(results.all_files()) == sorted(
|
||||||
results.all_files() + results.deleted_files + results.deleted_directories
|
[
|
||||||
) == sorted([f"{x}1" for x in EXPORT_RESULT_ATTRIBUTES])
|
f"{x}1"
|
||||||
|
for x in all_file_attributes
|
||||||
|
+ ["error", "exiftool_warning", "exiftool_error"]
|
||||||
|
]
|
||||||
|
)
|
||||||
|
|||||||
Reference in New Issue
Block a user