Compare commits
2 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
d51d7a41e4 | ||
|
|
60c926fea5 |
@@ -4,6 +4,15 @@ All notable changes to this project will be documented in this file. Dates are d
|
|||||||
|
|
||||||
Generated by [`auto-changelog`](https://github.com/CookPete/auto-changelog).
|
Generated by [`auto-changelog`](https://github.com/CookPete/auto-changelog).
|
||||||
|
|
||||||
|
#### [v0.41.7](https://github.com/RhetTbull/osxphotos/compare/v0.41.6...v0.41.7)
|
||||||
|
|
||||||
|
> 3 April 2021
|
||||||
|
|
||||||
|
- Bump pygments from 2.6.1 to 2.7.4 [`#408`](https://github.com/RhetTbull/osxphotos/pull/408)
|
||||||
|
- Removed logging.debug code [`e21a78c`](https://github.com/RhetTbull/osxphotos/commit/e21a78c2b39ee82610394b447a9aa697e489c3e4)
|
||||||
|
- Added test for #409 [`db27aac`](https://github.com/RhetTbull/osxphotos/commit/db27aac14bbaff0b2db44f8b2d41022ebcad18a7)
|
||||||
|
- Update phototemplate.py [`d174547`](https://github.com/RhetTbull/osxphotos/commit/d17454772cebbd6edd5d8e0f04e80feecbdb2355)
|
||||||
|
|
||||||
#### [v0.41.6](https://github.com/RhetTbull/osxphotos/compare/v0.41.5...v0.41.6)
|
#### [v0.41.6](https://github.com/RhetTbull/osxphotos/compare/v0.41.5...v0.41.6)
|
||||||
|
|
||||||
> 28 March 2021
|
> 28 March 2021
|
||||||
|
|||||||
@@ -203,6 +203,11 @@ Options:
|
|||||||
searches top level folders (e.g. does not look
|
searches top level folders (e.g. does not look
|
||||||
at subfolders)
|
at subfolders)
|
||||||
|
|
||||||
|
--name FILENAME Search for photos with filename matching
|
||||||
|
FILENAME. If more than one --name options is
|
||||||
|
specified, they are treated as "OR", e.g. find
|
||||||
|
photos matching any FILENAME.
|
||||||
|
|
||||||
--uuid UUID Search for photos with UUID(s).
|
--uuid UUID Search for photos with UUID(s).
|
||||||
--uuid-from-file FILE Search for photos with UUID(s) loaded from
|
--uuid-from-file FILE Search for photos with UUID(s) loaded from
|
||||||
FILE. Format is a single UUID per line. Lines
|
FILE. Format is a single UUID per line. Lines
|
||||||
|
|||||||
@@ -1,3 +1,3 @@
|
|||||||
""" version info """
|
""" version info """
|
||||||
|
|
||||||
__version__ = "0.41.7"
|
__version__ = "0.41.8"
|
||||||
|
|||||||
@@ -238,6 +238,15 @@ def query_options(f):
|
|||||||
'If more than one folder, treated as "OR", e.g. find photos in any FOLDER. '
|
'If more than one folder, treated as "OR", e.g. find photos in any FOLDER. '
|
||||||
"Only searches top level folders (e.g. does not look at subfolders)",
|
"Only searches top level folders (e.g. does not look at subfolders)",
|
||||||
),
|
),
|
||||||
|
o(
|
||||||
|
"--name",
|
||||||
|
metavar="FILENAME",
|
||||||
|
default=None,
|
||||||
|
multiple=True,
|
||||||
|
help="Search for photos with filename matching FILENAME. "
|
||||||
|
'If more than one --name options is specified, they are treated as "OR", '
|
||||||
|
"e.g. find photos matching any FILENAME. ",
|
||||||
|
),
|
||||||
o(
|
o(
|
||||||
"--uuid",
|
"--uuid",
|
||||||
metavar="UUID",
|
metavar="UUID",
|
||||||
@@ -871,6 +880,7 @@ def export(
|
|||||||
album,
|
album,
|
||||||
folder,
|
folder,
|
||||||
uuid,
|
uuid,
|
||||||
|
name,
|
||||||
uuid_from_file,
|
uuid_from_file,
|
||||||
title,
|
title,
|
||||||
no_title,
|
no_title,
|
||||||
@@ -1020,6 +1030,7 @@ def export(
|
|||||||
person = cfg.person
|
person = cfg.person
|
||||||
album = cfg.album
|
album = cfg.album
|
||||||
folder = cfg.folder
|
folder = cfg.folder
|
||||||
|
name = cfg.name
|
||||||
uuid = cfg.uuid
|
uuid = cfg.uuid
|
||||||
uuid_from_file = cfg.uuid_from_file
|
uuid_from_file = cfg.uuid_from_file
|
||||||
title = cfg.title
|
title = cfg.title
|
||||||
@@ -1421,6 +1432,7 @@ def export(
|
|||||||
burst_photos=export_bursts,
|
burst_photos=export_bursts,
|
||||||
# skip missing bursts if using --download-missing by itself as AppleScript otherwise causes errors
|
# skip missing bursts if using --download-missing by itself as AppleScript otherwise causes errors
|
||||||
missing_bursts=(download_missing and use_photokit) or not download_missing,
|
missing_bursts=(download_missing and use_photokit) or not download_missing,
|
||||||
|
name=name,
|
||||||
)
|
)
|
||||||
|
|
||||||
if photos:
|
if photos:
|
||||||
@@ -1645,6 +1657,7 @@ def query(
|
|||||||
person,
|
person,
|
||||||
album,
|
album,
|
||||||
folder,
|
folder,
|
||||||
|
name,
|
||||||
uuid,
|
uuid,
|
||||||
uuid_from_file,
|
uuid_from_file,
|
||||||
title,
|
title,
|
||||||
@@ -1718,6 +1731,7 @@ def query(
|
|||||||
person,
|
person,
|
||||||
album,
|
album,
|
||||||
folder,
|
folder,
|
||||||
|
name,
|
||||||
uuid,
|
uuid,
|
||||||
uuid_from_file,
|
uuid_from_file,
|
||||||
edited,
|
edited,
|
||||||
@@ -1851,6 +1865,7 @@ def query(
|
|||||||
is_reference=is_reference,
|
is_reference=is_reference,
|
||||||
in_album=in_album,
|
in_album=in_album,
|
||||||
not_in_album=not_in_album,
|
not_in_album=not_in_album,
|
||||||
|
name=name,
|
||||||
)
|
)
|
||||||
|
|
||||||
# below needed for to make CliRunner work for testing
|
# below needed for to make CliRunner work for testing
|
||||||
@@ -2028,6 +2043,7 @@ def _query(
|
|||||||
not_in_album=False,
|
not_in_album=False,
|
||||||
burst_photos=None,
|
burst_photos=None,
|
||||||
missing_bursts=None,
|
missing_bursts=None,
|
||||||
|
name=None,
|
||||||
):
|
):
|
||||||
"""Run a query against PhotosDB to extract the photos based on user supply criteria used by query and export commands
|
"""Run a query against PhotosDB to extract the photos based on user supply criteria used by query and export commands
|
||||||
|
|
||||||
@@ -2094,30 +2110,38 @@ def _query(
|
|||||||
if title:
|
if title:
|
||||||
# search title field for text
|
# search title field for text
|
||||||
# if more than one, find photos with all title values in title
|
# if more than one, find photos with all title values in title
|
||||||
|
photo_list = []
|
||||||
if ignore_case:
|
if ignore_case:
|
||||||
# case-insensitive
|
# case-insensitive
|
||||||
for t in title:
|
for t in title:
|
||||||
t = t.lower()
|
t = t.lower()
|
||||||
photos = [p for p in photos if p.title and t in p.title.lower()]
|
photo_list.extend(
|
||||||
|
[p for p in photos if p.title and t in p.title.lower()]
|
||||||
|
)
|
||||||
else:
|
else:
|
||||||
for t in title:
|
for t in title:
|
||||||
photos = [p for p in photos if p.title and t in p.title]
|
photo_list.extend([p for p in photos if p.title and t in p.title])
|
||||||
|
photos = photo_list
|
||||||
elif no_title:
|
elif no_title:
|
||||||
photos = [p for p in photos if not p.title]
|
photos = [p for p in photos if not p.title]
|
||||||
|
|
||||||
if description:
|
if description:
|
||||||
# search description field for text
|
# search description field for text
|
||||||
# if more than one, find photos with all description values in description
|
# if more than one, find photos with all description values in description
|
||||||
|
photo_list = []
|
||||||
if ignore_case:
|
if ignore_case:
|
||||||
# case-insensitive
|
# case-insensitive
|
||||||
for d in description:
|
for d in description:
|
||||||
d = d.lower()
|
d = d.lower()
|
||||||
photos = [
|
photo_list.extend(
|
||||||
p for p in photos if p.description and d in p.description.lower()
|
[p for p in photos if p.description and d in p.description.lower()]
|
||||||
]
|
)
|
||||||
else:
|
else:
|
||||||
for d in description:
|
for d in description:
|
||||||
photos = [p for p in photos if p.description and d in p.description]
|
photo_list.extend(
|
||||||
|
[p for p in photos if p.description and d in p.description]
|
||||||
|
)
|
||||||
|
photos = photo_list
|
||||||
elif no_description:
|
elif no_description:
|
||||||
photos = [p for p in photos if not p.description]
|
photos = [p for p in photos if not p.description]
|
||||||
|
|
||||||
@@ -2292,6 +2316,28 @@ def _query(
|
|||||||
seen_uuids[p.uuid] = p
|
seen_uuids[p.uuid] = p
|
||||||
photos = list(seen_uuids.values())
|
photos = list(seen_uuids.values())
|
||||||
|
|
||||||
|
if name:
|
||||||
|
# search filename fields for text
|
||||||
|
# if more than one, find photos with all title values in filename
|
||||||
|
photo_list = []
|
||||||
|
if ignore_case:
|
||||||
|
# case-insensitive
|
||||||
|
for n in name:
|
||||||
|
n = n.lower()
|
||||||
|
photo_list.extend(
|
||||||
|
[
|
||||||
|
p
|
||||||
|
for p in photos
|
||||||
|
if n in p.filename.lower() or n in p.original_filename.lower()
|
||||||
|
]
|
||||||
|
)
|
||||||
|
else:
|
||||||
|
for n in name:
|
||||||
|
photo_list.extend(
|
||||||
|
[p for p in photos if n in p.filename or n in p.original_filename]
|
||||||
|
)
|
||||||
|
photos = photo_list
|
||||||
|
|
||||||
return photos
|
return photos
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -5699,3 +5699,72 @@ def test_export_burst_folder_album():
|
|||||||
path = folder_album / filename
|
path = folder_album / filename
|
||||||
assert path.is_file()
|
assert path.is_file()
|
||||||
|
|
||||||
|
|
||||||
|
def test_query_name():
|
||||||
|
""" test query --name """
|
||||||
|
import json
|
||||||
|
import os
|
||||||
|
import os.path
|
||||||
|
import osxphotos
|
||||||
|
from osxphotos.cli import query
|
||||||
|
|
||||||
|
runner = CliRunner()
|
||||||
|
cwd = os.getcwd()
|
||||||
|
result = runner.invoke(
|
||||||
|
query,
|
||||||
|
["--json", "--db", os.path.join(cwd, PHOTOS_DB_15_7), "--name", "DSC03584"],
|
||||||
|
)
|
||||||
|
assert result.exit_code == 0
|
||||||
|
json_got = json.loads(result.output)
|
||||||
|
|
||||||
|
assert len(json_got) == 1
|
||||||
|
assert json_got[0]["original_filename"] == "DSC03584.dng"
|
||||||
|
|
||||||
|
|
||||||
|
def test_query_name_i():
|
||||||
|
""" test query --name -i """
|
||||||
|
import json
|
||||||
|
import os
|
||||||
|
import os.path
|
||||||
|
import osxphotos
|
||||||
|
from osxphotos.cli import query
|
||||||
|
|
||||||
|
runner = CliRunner()
|
||||||
|
cwd = os.getcwd()
|
||||||
|
result = runner.invoke(
|
||||||
|
query,
|
||||||
|
[
|
||||||
|
"--json",
|
||||||
|
"--db",
|
||||||
|
os.path.join(cwd, PHOTOS_DB_15_7),
|
||||||
|
"--name",
|
||||||
|
"dsc03584",
|
||||||
|
"-i",
|
||||||
|
],
|
||||||
|
)
|
||||||
|
assert result.exit_code == 0
|
||||||
|
json_got = json.loads(result.output)
|
||||||
|
|
||||||
|
assert len(json_got) == 1
|
||||||
|
assert json_got[0]["original_filename"] == "DSC03584.dng"
|
||||||
|
|
||||||
|
|
||||||
|
def test_export_name():
|
||||||
|
""" test export --name """
|
||||||
|
import glob
|
||||||
|
import os
|
||||||
|
import os.path
|
||||||
|
import osxphotos
|
||||||
|
from osxphotos.cli import export
|
||||||
|
|
||||||
|
runner = CliRunner()
|
||||||
|
cwd = os.getcwd()
|
||||||
|
# pylint: disable=not-context-manager
|
||||||
|
with runner.isolated_filesystem():
|
||||||
|
result = runner.invoke(
|
||||||
|
export, [os.path.join(cwd, PHOTOS_DB_15_7), ".", "-V", "--name", "DSC03584"]
|
||||||
|
)
|
||||||
|
assert result.exit_code == 0
|
||||||
|
files = glob.glob("*")
|
||||||
|
assert len(files) == 1
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user