* Initial implementation of new textx parser for template * Implemented parser as singleton * Moved grammar to .tx file * Added filter templates * Added filter templates * Added tests for nested templates * Added tests for filter+path_sep * Added tests for filter+path_sep * Added punctuation templates * Added hook for --replace-keywords * Updated docs for phototemplate * Updated docs for phototemplate * Updated tests data * Updated tests data * Updated docs for phototemplate * Version bump * Updated CLI help * Fixed template processing for boolean, default
49 lines
1.2 KiB
Python
49 lines
1.2 KiB
Python
"""Selectively mock a PhotoInfo object"""
|
|
|
|
from osxphotos import PhotoInfo
|
|
|
|
|
|
class PhotoInfoMock(PhotoInfo):
|
|
def __init__(self, photo, **kwargs):
|
|
self._photo = photo
|
|
self._db = photo._db
|
|
self._info = photo._info
|
|
|
|
for kw in kwargs:
|
|
if hasattr(photo, kw):
|
|
setattr(self, f"_mock_{kw}", kwargs[kw])
|
|
else:
|
|
raise ValueError(f"Not a PhotoInfo attribute: {kw}")
|
|
|
|
@property
|
|
def hdr(self):
|
|
return (
|
|
self._mock_hdr
|
|
if getattr(self, "_mock_hdr", None) is not None
|
|
else self._photo.hdr
|
|
)
|
|
|
|
@property
|
|
def hasadjustments(self):
|
|
return (
|
|
self._mock_hasadjustments
|
|
if getattr(self, "_mock_hasadjustments", None) is not None
|
|
else self._photo.hasadjustments
|
|
)
|
|
|
|
@property
|
|
def keywords(self):
|
|
return (
|
|
self._mock_keywords
|
|
if getattr(self, "_mock_keywords", None) is not None
|
|
else self._photo.keywords
|
|
)
|
|
|
|
@property
|
|
def title(self):
|
|
return (
|
|
self._mock_title
|
|
if getattr(self, "_mock_title", None) is not None
|
|
else self._photo.title
|
|
)
|