Extende --ignore-case to --person, --keyword, --album, closes #162
This commit is contained in:
@@ -322,7 +322,7 @@ def query_options(f):
|
|||||||
"-i",
|
"-i",
|
||||||
"--ignore-case",
|
"--ignore-case",
|
||||||
is_flag=True,
|
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("--edited", is_flag=True, help="Search for photos that have been edited."),
|
||||||
o(
|
o(
|
||||||
@@ -1644,16 +1644,55 @@ def _query(
|
|||||||
|
|
||||||
photosdb = osxphotos.PhotosDB(dbfile=db)
|
photosdb = osxphotos.PhotosDB(dbfile=db)
|
||||||
photos = photosdb.photos(
|
photos = photosdb.photos(
|
||||||
keywords=keyword,
|
uuid=uuid, images=isphoto, movies=ismovie, from_date=from_date, to_date=to_date
|
||||||
persons=person,
|
|
||||||
albums=album,
|
|
||||||
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:
|
if folder:
|
||||||
# search for photos in an album in folder
|
# search for photos in an album in folder
|
||||||
# finds photos that have albums whose top level folder matches folder
|
# finds photos that have albums whose top level folder matches folder
|
||||||
|
|||||||
@@ -1,3 +1,3 @@
|
|||||||
""" version info """
|
""" version info """
|
||||||
|
|
||||||
__version__ = "0.29.16"
|
__version__ = "0.29.17"
|
||||||
|
|||||||
@@ -249,7 +249,6 @@ def test_osxphotos_help_2():
|
|||||||
|
|
||||||
runner = CliRunner()
|
runner = CliRunner()
|
||||||
result = runner.invoke(cli, ["help", "persons"])
|
result = runner.invoke(cli, ["help", "persons"])
|
||||||
output = result.output
|
|
||||||
assert result.exit_code == 0
|
assert result.exit_code == 0
|
||||||
assert "Print out persons (faces) found in the Photos library." in result.output
|
assert "Print out persons (faces) found in the Photos library." in result.output
|
||||||
|
|
||||||
@@ -261,7 +260,6 @@ def test_osxphotos_help_3():
|
|||||||
|
|
||||||
runner = CliRunner()
|
runner = CliRunner()
|
||||||
result = runner.invoke(cli, ["help", "foo"])
|
result = runner.invoke(cli, ["help", "foo"])
|
||||||
output = result.output
|
|
||||||
assert result.exit_code == 0
|
assert result.exit_code == 0
|
||||||
assert "Invalid command: foo" in result.output
|
assert "Invalid command: foo" in result.output
|
||||||
|
|
||||||
@@ -516,14 +514,296 @@ def test_query_date():
|
|||||||
],
|
],
|
||||||
)
|
)
|
||||||
assert result.exit_code == 0
|
assert result.exit_code == 0
|
||||||
import logging
|
|
||||||
|
|
||||||
logging.warning(result.output)
|
|
||||||
|
|
||||||
json_got = json.loads(result.output)
|
json_got = json.loads(result.output)
|
||||||
assert len(json_got) == 4
|
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():
|
def test_export_sidecar():
|
||||||
import glob
|
import glob
|
||||||
import os
|
import os
|
||||||
@@ -1260,8 +1540,6 @@ def test_export_sidecar_keyword_template():
|
|||||||
"EXIF:ModifyDate": "2020:04:11 12:34:16"}]"""
|
"EXIF:ModifyDate": "2020:04:11 12:34:16"}]"""
|
||||||
)[0]
|
)[0]
|
||||||
|
|
||||||
import logging
|
|
||||||
|
|
||||||
json_file = open("Pumkins2.json", "r")
|
json_file = open("Pumkins2.json", "r")
|
||||||
json_got = json.load(json_file)[0]
|
json_got = json.load(json_file)[0]
|
||||||
json_file.close()
|
json_file.close()
|
||||||
|
|||||||
Reference in New Issue
Block a user