Still working on issue #208

This commit is contained in:
Rhet Turnbull
2020-09-04 12:47:27 -07:00
parent c2fecc9d30
commit 58b3869a7c
3 changed files with 70 additions and 24 deletions

View File

@@ -23,7 +23,12 @@ from pathvalidate import (
import osxphotos
from ._constants import _EXIF_TOOL_URL, _PHOTOS_4_VERSION, _UNKNOWN_PLACE, UNICODE_FORMAT
from ._constants import (
_EXIF_TOOL_URL,
_PHOTOS_4_VERSION,
_UNKNOWN_PLACE,
UNICODE_FORMAT,
)
from ._export_db import ExportDB, ExportDBInMemory
from ._version import __version__
from .datetime_formatter import DateTimeFormatter
@@ -45,6 +50,7 @@ def verbose(*args, **kwargs):
if VERBOSE:
click.echo(*args, **kwargs)
def normalize_unicode(value):
""" normalize unicode data """
if value is not None:
@@ -57,6 +63,7 @@ def normalize_unicode(value):
else:
return None
def get_photos_db(*db_options):
""" Return path to photos db, select first non-None db_options
If no db_options are non-None, try to find library to use in
@@ -605,9 +612,9 @@ def keywords(ctx, cli_obj, db, json_, photos_library):
photosdb = osxphotos.PhotosDB(dbfile=db)
keywords = {"keywords": photosdb.keywords_as_dict}
if json_ or cli_obj.json:
click.echo(json.dumps(keywords))
click.echo(json.dumps(keywords, ensure_ascii=False))
else:
click.echo(yaml.dump(keywords, sort_keys=False))
click.echo(yaml.dump(keywords, sort_keys=False, allow_unicode=True))
@cli.command()
@@ -634,9 +641,9 @@ def albums(ctx, cli_obj, db, json_, photos_library):
albums["shared albums"] = photosdb.albums_shared_as_dict
if json_ or cli_obj.json:
click.echo(json.dumps(albums))
click.echo(json.dumps(albums, ensure_ascii=False))
else:
click.echo(yaml.dump(albums, sort_keys=False))
click.echo(yaml.dump(albums, sort_keys=False, allow_unicode=True))
@cli.command()
@@ -660,9 +667,9 @@ def persons(ctx, cli_obj, db, json_, photos_library):
photosdb = osxphotos.PhotosDB(dbfile=db)
persons = {"persons": photosdb.persons_as_dict}
if json_ or cli_obj.json:
click.echo(json.dumps(persons))
click.echo(json.dumps(persons, ensure_ascii=False))
else:
click.echo(yaml.dump(persons, sort_keys=False))
click.echo(yaml.dump(persons, sort_keys=False, allow_unicode=True))
@cli.command()
@@ -686,9 +693,9 @@ def labels(ctx, cli_obj, db, json_, photos_library):
photosdb = osxphotos.PhotosDB(dbfile=db)
labels = {"labels": photosdb.labels_as_dict}
if json_ or cli_obj.json:
click.echo(json.dumps(labels))
click.echo(json.dumps(labels, ensure_ascii=False))
else:
click.echo(yaml.dump(labels, sort_keys=False))
click.echo(yaml.dump(labels, sort_keys=False, allow_unicode=True))
@cli.command()
@@ -746,9 +753,9 @@ def info(ctx, cli_obj, db, json_, photos_library):
info["persons"] = persons
if cli_obj.json or json_:
click.echo(json.dumps(info))
click.echo(json.dumps(info, ensure_ascii=False))
else:
click.echo(yaml.dump(info, sort_keys=False))
click.echo(yaml.dump(info, sort_keys=False, allow_unicode=True))
@cli.command()
@@ -796,9 +803,9 @@ def places(ctx, cli_obj, db, json_, photos_library):
# below needed for to make CliRunner work for testing
cli_json = cli_obj.json if cli_obj is not None else None
if json_ or cli_json:
click.echo(json.dumps(places))
click.echo(json.dumps(places, ensure_ascii=False))
else:
click.echo(yaml.dump(places, sort_keys=False))
click.echo(yaml.dump(places, sort_keys=False, allow_unicode=True))
@cli.command()
@@ -861,7 +868,7 @@ def _list_libraries(json_=False, error=True):
"system_library": sys_lib,
"last_library": last_lib,
}
click.echo(json.dumps(libs))
click.echo(json.dumps(libs, ensure_ascii=False))
else:
last_lib_flag = sys_lib_flag = False
@@ -1884,7 +1891,7 @@ def _query(
description = normalize_unicode(description)
place = normalize_unicode(place)
label = normalize_unicode(label)
if album:
photos = get_photos_by_attribute(photos, "albums", album, ignore_case)

View File

@@ -1,3 +1,3 @@
""" version info """
__version__ = "0.33.8"
__version__ = "0.33.9"

View File

@@ -307,14 +307,26 @@ ALBUMS_JSON = {
"albums": {
"Raw": 4,
"Pumpkin Farm": 3,
"AlbumInFolder": 2,
"Test Album": 2,
"AlbumInFolder": 2,
"I have a deleted twin": 1,
"2018-10 - Sponsion, Museum, Frühstück, Römermuseum": 1,
"EmptyAlbum": 0,
},
"shared albums": {},
}
ALBUMS_STR = """albums:
Raw: 4
Pumpkin Farm: 3
Test Album: 2
AlbumInFolder: 2
I have a deleted twin: 1
2018-10 - Sponsion, Museum, Frühstück, Römermuseum: 1
EmptyAlbum: 0
shared albums: {}
"""
PERSONS_JSON = {"persons": {"Katie": 3, "Suzy": 2, "_UNKNOWN_": 1, "Maria": 2}}
UUID_EXPECTED_FROM_FILE = [
@@ -1817,6 +1829,7 @@ def test_export_album():
files = glob.glob("*")
assert sorted(files) == sorted(CLI_EXPORT_FILENAMES_ALBUM)
def test_export_album_unicode_name():
"""Test export of an album with non-English characters in name """
import glob
@@ -1830,14 +1843,19 @@ def test_export_album_unicode_name():
with runner.isolated_filesystem():
result = runner.invoke(
export,
[os.path.join(cwd, PHOTOS_DB_15_6), ".", "--album", "2018-10 - Sponsion, Museum, Frühstück, Römermuseum", "-V"],
[
os.path.join(cwd, PHOTOS_DB_15_6),
".",
"--album",
"2018-10 - Sponsion, Museum, Frühstück, Römermuseum",
"-V",
],
)
assert result.exit_code == 0
files = glob.glob("*")
assert sorted(files) == sorted(CLI_EXPORT_FILENAMES_ALBUM_UNICODE)
def test_export_album_deleted_twin():
"""Test export of an album where album of same name has been deleted """
import glob
@@ -2790,7 +2808,9 @@ def test_export_touch_files_update():
in result.output
)
for fname, mtime in zip(CLI_EXPORT_BY_DATE_NEED_TOUCH, CLI_EXPORT_BY_DATE_NEED_TOUCH_TIMES):
for fname, mtime in zip(
CLI_EXPORT_BY_DATE_NEED_TOUCH, CLI_EXPORT_BY_DATE_NEED_TOUCH_TIMES
):
st = os.stat(fname)
assert int(st.st_mtime) != int(mtime)
@@ -2811,7 +2831,9 @@ def test_export_touch_files_update():
in result.output
)
for fname, mtime in zip(CLI_EXPORT_BY_DATE_NEED_TOUCH, CLI_EXPORT_BY_DATE_NEED_TOUCH_TIMES):
for fname, mtime in zip(
CLI_EXPORT_BY_DATE_NEED_TOUCH, CLI_EXPORT_BY_DATE_NEED_TOUCH_TIMES
):
st = os.stat(fname)
assert int(st.st_mtime) == int(mtime)
@@ -3085,9 +3107,26 @@ def test_keywords():
json_got = json.loads(result.output)
assert json_got == KEYWORDS_JSON
# TODO: this fails with result.exit_code == 1 but I think this has to
# do with how pytest is invoking the command
# def test_albums_str():
# """Test osxphotos albums string output """
# import json
# import osxphotos
# import os
# import os.path
# from osxphotos.__main__ import albums
def test_albums():
"""Test osxphotos albums """
# runner = CliRunner()
# cwd = os.getcwd()
# result = runner.invoke(albums, ["--db", os.path.join(cwd, PHOTOS_DB_15_6), ])
# assert result.exit_code == 0
# assert result.output == ALBUMS_STR
def test_albums_json():
"""Test osxphotos albums json output """
import json
import osxphotos
import os
@@ -3097,7 +3136,7 @@ def test_albums():
runner = CliRunner()
cwd = os.getcwd()
result = runner.invoke(
albums, ["--db", os.path.join(cwd, PHOTOS_DB_15_5), "--json"]
albums, ["--db", os.path.join(cwd, PHOTOS_DB_15_6), "--json"]
)
assert result.exit_code == 0