From 40dc7d32f2365c66df1d405c1bfa3f579e11f13c Mon Sep 17 00:00:00 2001 From: Rhet Turnbull Date: Sat, 13 Jun 2020 15:06:27 -0700 Subject: [PATCH] Extende --ignore-case to --person, --keyword, --album, closes #162 --- osxphotos/__main__.py | 57 +++++++-- osxphotos/_version.py | 2 +- tests/test_cli.py | 292 +++++++++++++++++++++++++++++++++++++++++- 3 files changed, 334 insertions(+), 17 deletions(-) diff --git a/osxphotos/__main__.py b/osxphotos/__main__.py index e4bdd08f..6d1edcd1 100644 --- a/osxphotos/__main__.py +++ b/osxphotos/__main__.py @@ -322,7 +322,7 @@ def query_options(f): "-i", "--ignore-case", is_flag=True, - help="Case insensitive search for title, description, or place. Does not apply to keyword, person, or album.", + help="Case insensitive search for title, description, place, keyword, person, or album.", ), o("--edited", is_flag=True, help="Search for photos that have been edited."), o( @@ -1644,16 +1644,55 @@ def _query( photosdb = osxphotos.PhotosDB(dbfile=db) photos = photosdb.photos( - keywords=keyword, - persons=person, - albums=album, - uuid=uuid, - images=isphoto, - movies=ismovie, - from_date=from_date, - to_date=to_date, + uuid=uuid, images=isphoto, movies=ismovie, from_date=from_date, to_date=to_date ) + if album: + photos_album = [] + if ignore_case: + # case-insensitive + for a in album: + a = a.lower() + photos_album.extend( + p for p in photos if a in [album.lower() for album in p.albums] + ) + else: + for a in album: + photos_album.extend(p for p in photos if a in p.albums) + photos = photos_album + + if keyword: + photos_keyword = [] + if ignore_case: + # case-insensitive + for k in keyword: + k = k.lower() + photos_keyword.extend( + p + for p in photos + if k in [keyword.lower() for keyword in p.keywords] + ) + else: + for k in keyword: + photos_keyword.extend(p for p in photos if k in p.keywords) + photos = photos_keyword + + if person: + photos_person = [] + if ignore_case: + # case-insensitive + for prsn in person: + prsn = prsn.lower() + photos_person.extend( + p + for p in photos + if prsn in [person_.lower() for person_ in p.persons] + ) + else: + for prsn in person: + photos_person.extend(p for p in photos if prsn in p.persons) + photos = photos_person + if folder: # search for photos in an album in folder # finds photos that have albums whose top level folder matches folder diff --git a/osxphotos/_version.py b/osxphotos/_version.py index ec950c4c..ce7c4b2e 100644 --- a/osxphotos/_version.py +++ b/osxphotos/_version.py @@ -1,3 +1,3 @@ """ version info """ -__version__ = "0.29.16" +__version__ = "0.29.17" diff --git a/tests/test_cli.py b/tests/test_cli.py index cda217e0..4b65a2aa 100644 --- a/tests/test_cli.py +++ b/tests/test_cli.py @@ -249,7 +249,6 @@ def test_osxphotos_help_2(): runner = CliRunner() result = runner.invoke(cli, ["help", "persons"]) - output = result.output assert result.exit_code == 0 assert "Print out persons (faces) found in the Photos library." in result.output @@ -261,7 +260,6 @@ def test_osxphotos_help_3(): runner = CliRunner() result = runner.invoke(cli, ["help", "foo"]) - output = result.output assert result.exit_code == 0 assert "Invalid command: foo" in result.output @@ -516,14 +514,296 @@ def test_query_date(): ], ) assert result.exit_code == 0 - import logging - - logging.warning(result.output) json_got = json.loads(result.output) assert len(json_got) == 4 +def test_query_keyword_1(): + """Test query --keyword """ + import json + import osxphotos + import os + import os.path + from osxphotos.__main__ import query + + runner = CliRunner() + cwd = os.getcwd() + result = runner.invoke( + query, + ["--json", "--db", os.path.join(cwd, PHOTOS_DB_15_5), "--keyword", "Kids"], + ) + assert result.exit_code == 0 + json_got = json.loads(result.output) + assert len(json_got) == 4 + + +def test_query_keyword_2(): + """Test query --keyword with lower case keyword""" + import json + import osxphotos + import os + import os.path + from osxphotos.__main__ import query + + runner = CliRunner() + cwd = os.getcwd() + result = runner.invoke( + query, + ["--json", "--db", os.path.join(cwd, PHOTOS_DB_15_5), "--keyword", "kids"], + ) + assert result.exit_code == 0 + json_got = json.loads(result.output) + assert len(json_got) == 0 + + +def test_query_keyword_3(): + """Test query --keyword with lower case keyword and --ignore-case""" + import json + import osxphotos + import os + import os.path + from osxphotos.__main__ import query + + runner = CliRunner() + cwd = os.getcwd() + result = runner.invoke( + query, + [ + "--json", + "--db", + os.path.join(cwd, PHOTOS_DB_15_5), + "--keyword", + "kids", + "--ignore-case", + ], + ) + assert result.exit_code == 0 + json_got = json.loads(result.output) + assert len(json_got) == 4 + + +def test_query_keyword_4(): + """Test query with more than one --keyword""" + import json + import osxphotos + import os + import os.path + from osxphotos.__main__ import query + + runner = CliRunner() + cwd = os.getcwd() + result = runner.invoke( + query, + [ + "--json", + "--db", + os.path.join(cwd, PHOTOS_DB_15_5), + "--keyword", + "Kids", + "--keyword", + "wedding", + ], + ) + assert result.exit_code == 0 + json_got = json.loads(result.output) + assert len(json_got) == 6 + + +def test_query_person_1(): + """Test query --person""" + import json + import osxphotos + import os + import os.path + from osxphotos.__main__ import query + + runner = CliRunner() + cwd = os.getcwd() + result = runner.invoke( + query, + ["--json", "--db", os.path.join(cwd, PHOTOS_DB_15_5), "--person", "Katie"], + ) + assert result.exit_code == 0 + json_got = json.loads(result.output) + assert len(json_got) == 3 + + +def test_query_person_2(): + """Test query --person with lower case person""" + import json + import osxphotos + import os + import os.path + from osxphotos.__main__ import query + + runner = CliRunner() + cwd = os.getcwd() + result = runner.invoke( + query, + ["--json", "--db", os.path.join(cwd, PHOTOS_DB_15_5), "--person", "katie"], + ) + assert result.exit_code == 0 + json_got = json.loads(result.output) + assert len(json_got) == 0 + + +def test_query_person_3(): + """Test query --person with lower case person and --ignore-case""" + import json + import osxphotos + import os + import os.path + from osxphotos.__main__ import query + + runner = CliRunner() + cwd = os.getcwd() + result = runner.invoke( + query, + [ + "--json", + "--db", + os.path.join(cwd, PHOTOS_DB_15_5), + "--person", + "katie", + "--ignore-case", + ], + ) + assert result.exit_code == 0 + json_got = json.loads(result.output) + assert len(json_got) == 3 + + +def test_query_person_4(): + """Test query with multiple --person""" + import json + import osxphotos + import os + import os.path + from osxphotos.__main__ import query + + runner = CliRunner() + cwd = os.getcwd() + result = runner.invoke( + query, + [ + "--json", + "--db", + os.path.join(cwd, PHOTOS_DB_15_5), + "--person", + "Katie", + "--person", + "Maria", + ], + ) + assert result.exit_code == 0 + json_got = json.loads(result.output) + assert len(json_got) == 4 + + +def test_query_album_1(): + """Test query --album""" + import json + import osxphotos + import os + import os.path + from osxphotos.__main__ import query + + runner = CliRunner() + cwd = os.getcwd() + result = runner.invoke( + query, + [ + "--json", + "--db", + os.path.join(cwd, PHOTOS_DB_15_5), + "--album", + "Pumpkin Farm", + ], + ) + assert result.exit_code == 0 + json_got = json.loads(result.output) + assert len(json_got) == 3 + + +def test_query_album_2(): + """Test query --album with lower case album""" + import json + import osxphotos + import os + import os.path + from osxphotos.__main__ import query + + runner = CliRunner() + cwd = os.getcwd() + result = runner.invoke( + query, + [ + "--json", + "--db", + os.path.join(cwd, PHOTOS_DB_15_5), + "--album", + "pumpkin farm", + ], + ) + assert result.exit_code == 0 + json_got = json.loads(result.output) + assert len(json_got) == 0 + + +def test_query_album_3(): + """Test query --album with lower case album and --ignore-case""" + import json + import osxphotos + import os + import os.path + from osxphotos.__main__ import query + + runner = CliRunner() + cwd = os.getcwd() + result = runner.invoke( + query, + [ + "--json", + "--db", + os.path.join(cwd, PHOTOS_DB_15_5), + "--album", + "pumpkin farm", + "--ignore-case", + ], + ) + assert result.exit_code == 0 + json_got = json.loads(result.output) + assert len(json_got) == 3 + + +def test_query_album_4(): + """Test query with multipl --album""" + import json + import osxphotos + import os + import os.path + from osxphotos.__main__ import query + + runner = CliRunner() + cwd = os.getcwd() + result = runner.invoke( + query, + [ + "--json", + "--db", + os.path.join(cwd, PHOTOS_DB_15_5), + "--album", + "Pumpkin Farm", + "--album", + "Raw", + ], + ) + assert result.exit_code == 0 + json_got = json.loads(result.output) + assert len(json_got) == 7 + + def test_export_sidecar(): import glob import os @@ -1260,8 +1540,6 @@ def test_export_sidecar_keyword_template(): "EXIF:ModifyDate": "2020:04:11 12:34:16"}]""" )[0] - import logging - json_file = open("Pumkins2.json", "r") json_got = json.load(json_file)[0] json_file.close()