Implemented PersonInfo, closes #181

This commit is contained in:
Rhet Turnbull
2020-07-17 22:06:37 -07:00
parent 091e7b8f2e
commit 3f19276c5c
66 changed files with 558 additions and 63 deletions

View File

@@ -3,8 +3,8 @@
<plist version="1.0">
<dict>
<key>PhotoAnalysisGraphLastBackgroundGraphRebuildJobDate</key>
<date>2020-04-25T23:54:43Z</date>
<date>2020-07-16T04:41:20Z</date>
<key>PhotoAnalysisGraphLastBackgroundMemoryGenerationJobDate</key>
<date>2020-07-06T16:39:04Z</date>
<date>2020-07-16T04:41:20Z</date>
</dict>
</plist>

View File

@@ -3,7 +3,7 @@
<plist version="1.0">
<dict>
<key>IncrementalPersonProcessingStage</key>
<integer>0</integer>
<integer>4</integer>
<key>PersonBuilderLastMinimumFaceGroupSizeForCreatingMergeCandidates</key>
<integer>15</integer>
<key>PersonBuilderMergeCandidatesEnabled</key>

View File

@@ -11,6 +11,6 @@
<key>PLLastRevGeoForcedProviderOutOfDateCheckVersionKey</key>
<integer>1</integer>
<key>PLLastRevGeoVerFileFetchDateKey</key>
<date>2020-07-06T16:39:09Z</date>
<date>2020-07-16T04:41:16Z</date>
</dict>
</plist>

View File

@@ -3,7 +3,7 @@
<plist version="1.0">
<dict>
<key>LastHistoryRowId</key>
<integer>664</integer>
<integer>707</integer>
<key>LibraryBuildTag</key>
<string>D8C4AAA1-3AB6-4A65-BEBD-99CC3E5D433E</string>
<key>LibrarySchemaVersion</key>

View File

@@ -9,7 +9,7 @@
<key>HistoricalMarker</key>
<dict>
<key>LastHistoryRowId</key>
<integer>664</integer>
<integer>707</integer>
<key>LibraryBuildTag</key>
<string>D8C4AAA1-3AB6-4A65-BEBD-99CC3E5D433E</string>
<key>LibrarySchemaVersion</key>
@@ -24,7 +24,7 @@
<key>SnapshotCompletedDate</key>
<date>2019-07-27T13:16:43Z</date>
<key>SnapshotLastValidated</key>
<date>2020-07-06T16:39:02Z</date>
<date>2020-07-16T04:41:16Z</date>
<key>SnapshotTables</key>
<dict/>
</dict>

View File

@@ -7,7 +7,7 @@
<key>hostuuid</key>
<string>9575E48B-8D5F-5654-ABAC-4431B1167324</string>
<key>pid</key>
<integer>1743</integer>
<integer>3125</integer>
<key>processname</key>
<string>photolibraryd</string>
<key>uid</key>

View File

@@ -25,7 +25,7 @@ ALBUMS = [
"Pumpkin Farm",
"Test Album",
"AlbumInFolder",
"Raw"
"Raw",
] # Note: there are 2 albums named "Test Album" for testing duplicate album names
KEYWORDS_DICT = {
"Kids": 4,
@@ -110,14 +110,14 @@ def test_init4():
def test_init5(mocker):
# test failed get_last_library_path
import osxphotos
def bad_library():
return None
# get_last_library actually in utils but need to patch it in photosdb because it's imported into photosdb
# because of the layout of photosdb/ need to patch it this way...don't really understand why, but it works
mocker.patch("osxphotos.photosdb.photosdb.get_last_library_path", new=bad_library)
with pytest.raises(Exception):
assert osxphotos.PhotosDB()
@@ -127,7 +127,7 @@ def test_db_len():
photosdb = osxphotos.PhotosDB(dbfile=PHOTOS_DB)
# assert photosdb.db_version in osxphotos._TESTED_DB_VERSIONS
assert len(photosdb) == 12
assert len(photosdb) == 12
def test_db_version():
@@ -379,7 +379,7 @@ def test_count():
photosdb = osxphotos.PhotosDB(dbfile=PHOTOS_DB)
photos = photosdb.photos()
assert len(photos) == 12
assert len(photos) == 12
def test_keyword_2():
@@ -782,7 +782,7 @@ def test_from_to_date():
photosdb = osxphotos.PhotosDB(PHOTOS_DB)
photos = photosdb.photos(from_date=dt.datetime(2018, 10, 28))
assert len(photos) ==6
assert len(photos) == 6
photos = photosdb.photos(to_date=dt.datetime(2018, 10, 28))
assert len(photos) == 6

View File

@@ -81,12 +81,13 @@ UUID_PUMPKIN_FARM = [
]
ALBUM_SORT_ORDER = [
"1EB2B765-0765-43BA-A90C-0D0580E6172C",
"F12384F6-CD17-4151-ACBA-AE0E3688539E",
"D79B8D77-BFFC-460B-9312-034F2877D35B",
"1EB2B765-0765-43BA-A90C-0D0580E6172C",
"F12384F6-CD17-4151-ACBA-AE0E3688539E",
"D79B8D77-BFFC-460B-9312-034F2877D35B",
]
ALBUM_KEY_PHOTO = "D79B8D77-BFFC-460B-9312-034F2877D35B"
def test_init1():
# test named argument
import osxphotos
@@ -223,6 +224,7 @@ def test_albums_as_dict():
assert albums["Pumpkin Farm"] == 3
assert albums == ALBUM_DICT
def test_album_sort_order():
import osxphotos
@@ -233,6 +235,7 @@ def test_album_sort_order():
uuids = [p.uuid for p in photos]
assert uuids == ALBUM_SORT_ORDER
def test_album_empty_album():
import osxphotos
@@ -241,6 +244,7 @@ def test_album_empty_album():
photos = album.photos
assert photos == []
def test_attributes():
import datetime
import osxphotos
@@ -583,6 +587,7 @@ def test_album_folder_name():
photos = photosdb.photos(albums=["Pumpkin Farm"])
assert sorted(p.uuid for p in photos) == sorted(UUID_PUMPKIN_FARM)
def test_multi_person():
import osxphotos
@@ -590,7 +595,8 @@ def test_multi_person():
photos = photosdb.photos(persons=["Katie", "Suzy"])
assert len(photos) == 3
def test_get_db_path():
import osxphotos
@@ -1068,4 +1074,3 @@ def test_date_modified_invalid():
assert len(photos) == 1
p = photos[0]
assert p.date_modified is None

View File

@@ -231,12 +231,18 @@ CLI_EXIFTOOL = {
LABELS_JSON = {
"labels": {
"Plant": 5,
"Plant": 7,
"Outdoor": 4,
"Sky": 3,
"Tree": 2,
"Sky": 2,
"Outdoor": 2,
"Art": 2,
"Foliage": 2,
"People": 2,
"Agriculture": 2,
"Farm": 2,
"Food": 2,
"Vegetable": 2,
"Pumpkin": 2,
"Waterways": 1,
"River": 1,
"Cloudy": 1,
@@ -254,6 +260,10 @@ LABELS_JSON = {
"Vase": 1,
"Container": 1,
"Camera": 1,
"Child": 1,
"Clothing": 1,
"Jeans": 1,
"Straw Hay": 1,
}
}
@@ -971,7 +981,7 @@ def test_query_label_4():
)
assert result.exit_code == 0
json_got = json.loads(result.output)
assert len(json_got) == 6
assert len(json_got) == 8
def test_query_deleted_deleted_only():

View File

@@ -825,4 +825,3 @@ def test_xmp_sidecar_gps():
sorted(xmp_expected_lines), sorted(xmp_got_lines)
):
assert line_expected == line_got

View File

@@ -57,4 +57,3 @@ def test_cloudasset_3():
photos = photosdb.photos(uuid=[UUID_DICT["not_cloudasset"]])
assert not photos[0].iscloudasset

View File

@@ -57,4 +57,3 @@ def test_cloudasset_3():
photos = photosdb.photos(uuid=[UUID_DICT["not_cloudasset"]])
assert not photos[0].iscloudasset

View File

@@ -26,4 +26,3 @@ def test_not_modified():
photosdb = osxphotos.PhotosDB(dbfile=PHOTOS_DB)
photos = photosdb.photos(uuid=[UUID_DICT["not_modified"]])
assert photos[0].date_modified is None

View File

@@ -27,4 +27,3 @@ def test_modified():
# photosdb = osxphotos.PhotosDB(dbfile=PHOTOS_DB)
# photos = photosdb.photos(uuid=[UUID_DICT["not_modified"]])
# assert photos[0].date_modified is None

View File

@@ -554,4 +554,3 @@ def test_date_modified_invalid():
assert len(photos) == 1
p = photos[0]
assert p.date_modified is None

150
tests/test_personinfo.py Normal file
View File

@@ -0,0 +1,150 @@
""" Test PersonInfo class """
import pytest
PHOTOS_DB_5 = "tests/Test-10.15.5.photoslibrary"
PHOTOS_DB_4 = "tests/Test-10.14.6.photoslibrary"
UUID_DICT = {
"katie_5": "0FFCE0A2-BE93-4661-A783-957BE54072E4",
"katie_4": "D%zgor6TRmGng5V75UBy5A",
}
PHOTO_DICT = {
"katie_5": [
"1EB2B765-0765-43BA-A90C-0D0580E6172C",
"F12384F6-CD17-4151-ACBA-AE0E3688539E",
"D79B8D77-BFFC-460B-9312-034F2877D35B",
],
"katie_4": [
"8SOE9s0XQVGsuq4ONohTng",
"HrK3ZQdlQ7qpDA0FgOYXLA",
"15uNd7%8RguTEgNPKHfTWw",
],
}
KEY_DICT = {
"katie_5": "F12384F6-CD17-4151-ACBA-AE0E3688539E",
"katie_4": "8SOE9s0XQVGsuq4ONohTng",
}
STR_DICT = {
"katie_5": "PersonInfo(name=Katie, display_name=Katie, uuid=0FFCE0A2-BE93-4661-A783-957BE54072E4, facecount=3)",
"katie_4": "PersonInfo(name=Katie, display_name=Katie, uuid=D%zgor6TRmGng5V75UBy5A, facecount=3)",
}
JSON_DICT = {
"katie_5": {
"uuid": "0FFCE0A2-BE93-4661-A783-957BE54072E4",
"name": "Katie",
"displayname": "Katie",
"keyface": 2,
"facecount": 3,
"keyphoto": "F12384F6-CD17-4151-ACBA-AE0E3688539E",
},
"katie_4": {
"uuid": "D%zgor6TRmGng5V75UBy5A",
"name": "Katie",
"displayname": "Katie",
"keyface": 7,
"facecount": 3,
"keyphoto": "8SOE9s0XQVGsuq4ONohTng",
},
}
@pytest.fixture
def photosdb5():
import osxphotos
return osxphotos.PhotosDB(dbfile=PHOTOS_DB_5)
@pytest.fixture
def photosdb4():
import osxphotos
return osxphotos.PhotosDB(dbfile=PHOTOS_DB_4)
def test_person_info_photosdb_v5(photosdb5):
""" Test PersonInfo object """
import json
test_key = "katie_5"
katie = [p for p in photosdb5.person_info if p.uuid == UUID_DICT[test_key]][0]
assert katie.facecount == 3
assert katie.name == "Katie"
assert katie.display_name == "Katie"
photos = katie.photos
assert len(photos) == 3
uuid = [p.uuid for p in photos]
assert sorted(uuid) == sorted(PHOTO_DICT[test_key])
assert str(katie) == STR_DICT[test_key]
assert json.loads(katie.json()) == JSON_DICT[test_key]
def test_person_info_photosinfo_v5(photosdb5):
""" Test PersonInfo object """
import json
test_key = "katie_5"
photo = photosdb5.photos(uuid=[KEY_DICT[test_key]])[0]
assert "Katie" in photo.persons
person_info = photo.person_info
assert len(person_info) == 2
katie = [p for p in person_info if p.name == "Katie"][0]
assert katie.facecount == 3
assert katie.name == "Katie"
assert katie.display_name == "Katie"
photos = katie.photos
assert len(photos) == 3
uuid = [p.uuid for p in photos]
assert sorted(uuid) == sorted(PHOTO_DICT[test_key])
assert katie.keyphoto.uuid == KEY_DICT[test_key]
assert str(katie) == STR_DICT[test_key]
assert json.loads(katie.json()) == JSON_DICT[test_key]
def test_person_info_photosdb_v4(photosdb4):
""" Test PersonInfo object """
import json
test_key = "katie_4"
katie = [p for p in photosdb4.person_info if p.uuid == UUID_DICT[test_key]][0]
assert katie.facecount == 3
assert katie.name == "Katie"
assert katie.display_name == "Katie"
photos = katie.photos
assert len(photos) == 3
uuid = [p.uuid for p in photos]
assert sorted(uuid) == sorted(PHOTO_DICT[test_key])
assert katie.keyphoto.uuid == KEY_DICT[test_key]
assert json.loads(katie.json()) == JSON_DICT[test_key]
def test_person_info_photosinfo_v4(photosdb4):
""" Test PersonInfo object """
import json
test_key = "katie_4"
photo = photosdb4.photos(uuid=[KEY_DICT[test_key]])[0]
assert "Katie" in photo.persons
person_info = photo.person_info
assert len(person_info) == 2
katie = [p for p in person_info if p.name == "Katie"][0]
assert katie.facecount == 3
assert katie.name == "Katie"
assert katie.display_name == "Katie"
photos = katie.photos
assert len(photos) == 3
uuid = [p.uuid for p in photos]
assert sorted(uuid) == sorted(PHOTO_DICT[test_key])
assert katie.keyphoto.uuid == KEY_DICT[test_key]
assert json.loads(katie.json()) == JSON_DICT[test_key]

View File

@@ -87,6 +87,7 @@ def test_place_str():
"field16=[], street_address=[], body_of_water=[])', country_code='GB')"
)
def test_place_as_dict():
# test PlaceInfo.as_dict()
import osxphotos

View File

@@ -20,7 +20,17 @@ LABELS_DICT = {
"Tree",
],
# F12384F6-CD17-4151-ACBA-AE0E3688539E Pumkins1.jpg Can we carry this? Girls with pumpkins [] False
"F12384F6-CD17-4151-ACBA-AE0E3688539E": [],
"F12384F6-CD17-4151-ACBA-AE0E3688539E": [
"Vegetable",
"Pumpkin",
"Farm",
"Food",
"Outdoor",
"Agriculture",
"People",
"Plant",
"Straw Hay",
],
# D79B8D77-BFFC-460B-9312-034F2877D35B Pumkins2.jpg I found one! Girl holding pumpkin [] False
"D79B8D77-BFFC-460B-9312-034F2877D35B": [],
# D05A5FE3-15FB-49A1-A15D-AB3DA6F8B068 DSC03584.dng None RAW only [] False
@@ -49,7 +59,20 @@ LABELS_DICT = {
"Plant",
],
# 1EB2B765-0765-43BA-A90C-0D0580E6172C Pumpkins3.jpg None Kids in pumpkin field [] False
"1EB2B765-0765-43BA-A90C-0D0580E6172C": [],
"1EB2B765-0765-43BA-A90C-0D0580E6172C": [
"Child",
"Sky",
"Plant",
"People",
"Clothing",
"Jeans",
"Outdoor",
"Agriculture",
"Farm",
"Food",
"Vegetable",
"Pumpkin",
],
# DC99FBDD-7A52-4100-A5BB-344131646C30 St James Park.jpg St. James's Park None ['Tree', 'Plant', 'Waterways', 'River', 'Sky', 'Cloudy', 'Land', 'Water Body', 'Water', 'Outdoor'] False
"DC99FBDD-7A52-4100-A5BB-344131646C30": [
"Tree",
@@ -117,8 +140,33 @@ LABELS_NORMALIZED_DICT = {
],
# D79B8D77-BFFC-460B-9312-034F2877D35B Pumkins2.jpg I found one! Girl holding pumpkin [] False
"D79B8D77-BFFC-460B-9312-034F2877D35B": [],
# 1EB2B765-0765-43BA-A90C-0D0580E6172C Pumpkins3.jpg None Kids in pumpkin field [] False
"1EB2B765-0765-43BA-A90C-0D0580E6172C": [
"child",
"sky",
"plant",
"people",
"clothing",
"jeans",
"outdoor",
"agriculture",
"farm",
"food",
"vegetable",
"pumpkin",
],
# F12384F6-CD17-4151-ACBA-AE0E3688539E Pumkins1.jpg Can we carry this? Girls with pumpkins [] False
"F12384F6-CD17-4151-ACBA-AE0E3688539E": [],
"F12384F6-CD17-4151-ACBA-AE0E3688539E": [
"vegetable",
"pumpkin",
"farm",
"food",
"outdoor",
"agriculture",
"people",
"plant",
"straw hay",
],
# A1DD1F98-2ECD-431F-9AC9-5AFEFE2D3A5C Pumpkins4.jpg Pumpkin heads None [] True
"A1DD1F98-2ECD-431F-9AC9-5AFEFE2D3A5C": [],
}
@@ -155,6 +203,16 @@ LABELS = [
"Vase",
"Container",
"Camera",
"Child",
"People",
"Clothing",
"Jeans",
"Agriculture",
"Farm",
"Food",
"Vegetable",
"Pumpkin",
"Straw Hay",
]
LABELS_NORMALIZED = [
@@ -181,15 +239,31 @@ LABELS_NORMALIZED = [
"vase",
"container",
"camera",
"child",
"people",
"clothing",
"jeans",
"agriculture",
"farm",
"food",
"vegetable",
"pumpkin",
"straw hay",
]
LABELS_AS_DICT = {
"Plant": 5,
"Plant": 7,
"Outdoor": 4,
"Sky": 3,
"Tree": 2,
"Sky": 2,
"Outdoor": 2,
"Art": 2,
"Foliage": 2,
"People": 2,
"Agriculture": 2,
"Farm": 2,
"Food": 2,
"Vegetable": 2,
"Pumpkin": 2,
"Waterways": 1,
"River": 1,
"Cloudy": 1,
@@ -207,15 +281,25 @@ LABELS_AS_DICT = {
"Vase": 1,
"Container": 1,
"Camera": 1,
"Child": 1,
"Clothing": 1,
"Jeans": 1,
"Straw Hay": 1,
}
LABELS_NORMALIZED_AS_DICT = {
"plant": 5,
"plant": 7,
"outdoor": 4,
"sky": 3,
"tree": 2,
"sky": 2,
"outdoor": 2,
"art": 2,
"foliage": 2,
"people": 2,
"agriculture": 2,
"farm": 2,
"food": 2,
"vegetable": 2,
"pumpkin": 2,
"waterways": 1,
"river": 1,
"cloudy": 1,
@@ -233,6 +317,10 @@ LABELS_NORMALIZED_AS_DICT = {
"vase": 1,
"container": 1,
"camera": 1,
"child": 1,
"clothing": 1,
"jeans": 1,
"straw hay": 1,
}

View File

@@ -502,4 +502,3 @@ def test_subst_expand_inplace_3():
template, expand_inplace=True, inplace_sep="; "
)
assert sorted(rendered) == sorted(expected)