def test_str_attribute(temp_file, attribute): """test set_attribute, get_attribute, etc""" from osxmetadata import OSXMetaData from osxmetadata.constants import _FINDER_COMMENT_NAMES meta = OSXMetaData(temp_file) expected = 2 meta.set_attribute(attribute, expected) got = meta.get_attribute(attribute) assert expected == got expected += 1 meta.append_attribute(attribute, 1) assert meta.get_attribute(attribute) == expected meta.clear_attribute(attribute) assert meta.get_attribute(attribute) is None with pytest.raises(TypeError): meta.set_attribute(attribute, "") with pytest.raises(TypeError): meta.update_attribute(attribute, "foo") with pytest.raises(TypeError): meta.discard_attribute(attribute, "foo") with pytest.raises(TypeError): meta.remove_attribute(attribute, "foo")
def test_download_date_tz_4(temp_file): """ test tz_aware property """ from osxmetadata import OSXMetaData from osxmetadata.datetime_utils import datetime_naive_to_local import datetime meta = OSXMetaData(temp_file) dt = datetime.datetime.now() # test tz_aware assert not meta.tz_aware meta.tz_aware = True assert meta.tz_aware # test tz_aware dt_tz = datetime_naive_to_local(dt) meta.downloadeddate = dt_tz assert meta.downloadeddate == [dt_tz] assert meta.get_attribute("downloadeddate") == [dt_tz] # test timezone == UTC dld = meta.downloadeddate[0] tz = dld.tzinfo.tzname(dld) assert tz == "UTC" # turn tz_aware off meta.tz_aware = False assert meta.downloadeddate == [dt] assert meta.get_attribute("downloadeddate") == [dt] assert meta.downloadeddate[0].tzinfo is None
def test_finder_comments_2(temp_file): """ test get/set attribute """ from osxmetadata import OSXMetaData from osxmetadata.constants import kMDItemFinderComment attribute = kMDItemFinderComment meta = OSXMetaData(temp_file) fc = "This is my new comment" meta.set_attribute(attribute, fc) assert meta.findercomment == fc meta.findercomment += ", foo" fc += ", foo" assert meta.findercomment == fc # set finder comment to "" results in null string but not deleted meta.set_attribute(attribute, "") assert meta.get_attribute(attribute) == "" meta.set_attribute(attribute, "foo") assert meta.get_attribute(attribute) == "foo" # set finder comment to None deletes it meta.set_attribute(attribute, "") assert meta.get_attribute(attribute) == "" meta.clear_attribute(attribute) assert meta.get_attribute(attribute) == None # can we set findercomment after is was set to None? meta.set_attribute(attribute, "bar") assert meta.get_attribute(attribute) == "bar"
def test_tags_3(temp_file): from osxmetadata import OSXMetaData, Tag from osxmetadata.constants import kMDItemUserTags attribute = kMDItemUserTags # update tags meta = OSXMetaData(temp_file) tagset = [Tag("Test"), Tag("Green")] meta.set_attribute(attribute, tagset) tags = meta.get_attribute(attribute) assert tags == tagset meta.update_attribute(attribute, [Tag("Foo")]) tags = meta.get_attribute(attribute) assert tags == [Tag("Test"), Tag("Green"), Tag("Foo")] meta.remove_attribute(attribute, Tag("Foo")) tags = meta.get_attribute(attribute) assert tags == [Tag("Test"), Tag("Green")] meta.update_attribute(attribute, [Tag("Foo")]) tags = meta.get_attribute(attribute) assert tags == [Tag("Test"), Tag("Green"), Tag("Foo")] meta.clear_attribute(attribute) tags = meta.get_attribute(attribute) assert len(tags) == 0
def test_cli_backup_restore_2(temp_file): # test set during restore import pathlib from osxmetadata import OSXMetaData, ATTRIBUTES, Tag from osxmetadata.constants import _BACKUP_FILENAME from osxmetadata.__main__ import cli runner = CliRunner() result = runner.invoke( cli, [ "--set", "tags", "Foo", "--set", "tags", "Bar", "--set", "comment", "Hello World!", "--list", temp_file, ], ) assert result.exit_code == 0 output = parse_cli_output(result.stdout) assert output["tags"] == "['Foo', 'Bar']" meta = OSXMetaData(temp_file) assert meta.get_attribute("tags") == [Tag("Foo"), Tag("Bar")] assert meta.get_attribute("comment") == "Hello World!" # test creation of backup file result = runner.invoke(cli, ["--backup", temp_file]) assert result.exit_code == 0 backup_file = pathlib.Path(pathlib.Path(temp_file).parent) / _BACKUP_FILENAME assert backup_file.exists() # clear the attributes to see if they can be restored meta.clear_attribute("tags") meta.clear_attribute("comment") assert meta.tags == [] assert meta.comment == None result = runner.invoke( cli, [ "--restore", "--append", "tags", "Flooz", "--set", "keywords", "FooBar", temp_file, ], ) assert result.exit_code == 0 assert meta.tags == [Tag("Foo"), Tag("Bar"), Tag("Flooz")] assert meta.comment == "Hello World!" assert meta.keywords == ["FooBar"]
def test_str_attribute(temp_file, attribute): """test set_attribute, get_attribute, etc""" from osxmetadata import OSXMetaData from osxmetadata.constants import _FINDER_COMMENT_NAMES meta = OSXMetaData(temp_file) expected = datetime.datetime(2021, 7, 8) meta.set_attribute(attribute, expected) got = meta.get_attribute(attribute) assert expected == got meta.clear_attribute(attribute) assert meta.get_attribute(attribute) == None # test setting empty string meta.set_attribute(attribute, "") assert meta.get_attribute(attribute) is None with pytest.raises(TypeError): meta.update_attribute(attribute, "foo") with pytest.raises(TypeError): meta.discard_attribute(attribute, "foo") with pytest.raises(TypeError): meta.remove_attribute(attribute, "foo")
def test_str_attribute(temp_file, attribute): """test set_attribute, get_attribute, etc""" from osxmetadata import OSXMetaData from osxmetadata.constants import _FINDER_COMMENT_NAMES meta = OSXMetaData(temp_file) expected = True meta.set_attribute(attribute, expected) got = meta.get_attribute(attribute) assert expected == got meta.set_attribute(attribute, not expected) assert not meta.get_attribute(attribute) meta.clear_attribute(attribute) assert meta.get_attribute(attribute) is None # test setting empty string # setting finder comment to empty string clears it # but other fields get set to empty string # this mirrors the way finder comments work in mdls meta.set_attribute(attribute, "") assert not meta.get_attribute(attribute) with pytest.raises(AttributeError): meta.update_attribute(attribute, "foo") with pytest.raises(TypeError): meta.discard_attribute(attribute, "foo") with pytest.raises(TypeError): meta.remove_attribute(attribute, "foo")
def test_finder_comments_2(temp_file): """ test get/set attribute """ from osxmetadata import OSXMetaData from osxmetadata.constants import kMDItemFinderComment attribute = kMDItemFinderComment meta = OSXMetaData(temp_file) fc = "This is my new comment" meta.set_attribute(attribute, fc) assert meta.findercomment == fc meta.findercomment += ", foo" fc += ", foo" assert meta.findercomment == fc # set finder comment to "" deletes it as this mirrors mdls and Finder meta.set_attribute(attribute, "") assert meta.get_attribute(attribute) is None meta.set_attribute(attribute, "foo") assert meta.get_attribute(attribute) == "foo" # set finder comment to None deletes it meta.set_attribute(attribute, None) assert meta.get_attribute(attribute) is None meta.clear_attribute(attribute) assert meta.get_attribute(attribute) is None # can we set findercomment after is was set to None? meta.set_attribute(attribute, "bar") assert meta.get_attribute(attribute) == "bar"
def test_tags_4(temp_file): """ Test various list methods """ from osxmetadata import OSXMetaData, Tag from osxmetadata.constants import _kMDItemUserTags attribute = _kMDItemUserTags # update tags meta = OSXMetaData(temp_file) tagset = [Tag("Test"), Tag("Green"), Tag("Foo")] meta.tags = tagset assert meta.tags == tagset assert meta.get_attribute(attribute) == tagset idx = meta.tags.index(Tag("Green")) assert idx == 1 count = meta.tags.count(Tag("Test")) assert count == 1 count = meta.tags.count(Tag("Bar")) assert count == 0 meta.tags.sort() assert meta.tags == [Tag("Foo"), Tag("Green"), Tag("Test")] assert meta.get_attribute(attribute) == [ Tag("Foo"), Tag("Green"), Tag("Test") ] meta.tags.sort(reverse=True) assert meta.tags == [Tag("Test"), Tag("Green"), Tag("Foo")] assert meta.get_attribute(attribute) == [ Tag("Test"), Tag("Green"), Tag("Foo") ] # sort by key meta.tags.sort(key=lambda tag: len(tag)) assert meta.tags == [Tag("Foo"), Tag("Test"), Tag("Green")] assert meta.get_attribute(attribute) == [ Tag("Foo"), Tag("Test"), Tag("Green") ] # todo: reverse not working # meta.tags.reverse() # assert meta.tags == [Tag("Green"), Tag("Test"), Tag("Foo")] # assert meta.get_attribute(attribute) == [Tag("Green"), Tag("Test"), Tag("Foo")] # tag_expected = Tag("Test") # tag_got = meta.tags.pop(1) # assert tag_got == tag_expected # assert meta.tags == [Tag("Green"), Tag("Foo")] # assert meta.get_attribute(attribute) == [Tag("Green"), Tag("Foo")] tag_expected = Tag("Test") tag_got = meta.tags.pop(1) assert tag_got == tag_expected assert meta.tags == [Tag("Foo"), Tag("Green")] assert meta.get_attribute(attribute) == [Tag("Foo"), Tag("Green")]
def test_tag_on_directory(): import tempfile from osxmetadata import OSXMetaData, Tag tempdir = tempfile.TemporaryDirectory(prefix="osxmetadata") md = OSXMetaData(tempdir.name) md.tags = [Tag("Red")] assert md.get_attribute("tags") == [Tag("Red")] md.tags.remove(Tag("Red")) assert md.get_attribute("tags") == []
def test_duedate(temp_file): """test functions on one of the datetime attributes""" from osxmetadata import OSXMetaData meta = OSXMetaData(temp_file) meta.duedate = "2021-07-08" assert meta.duedate == datetime.datetime(2021, 7, 8) assert meta.get_attribute("duedate") == datetime.datetime(2021, 7, 8) meta.duedate = None assert meta.duedate is None assert meta.get_attribute("duedate") is None meta.duedate = datetime.datetime(2021, 7, 8) assert meta.duedate == datetime.datetime(2021, 7, 8) assert meta.get_attribute("duedate") == datetime.datetime(2021, 7, 8)
def test_cli_downloadeddate(temp_file): # pass ISO 8601 format with timezone, get back naive local time import datetime from osxmetadata import OSXMetaData, kMDItemDownloadedDate from osxmetadata.datetime_utils import ( datetime_naive_to_utc, datetime_utc_to_local, datetime_remove_tz, ) from osxmetadata.__main__ import cli runner = CliRunner() dt = "2020-02-23:00:00:00+00:00" # UTC time utc_time = datetime.datetime.fromisoformat(dt) local_time = datetime_remove_tz(datetime_utc_to_local(utc_time)) result = runner.invoke(cli, ["--set", "downloadeddate", dt, "--list", temp_file]) assert result.exit_code == 0 output = parse_cli_output(result.stdout) assert output["downloadeddate"] == f"['{local_time.isoformat()}']" meta = OSXMetaData(temp_file) meta.tz_aware = True assert meta.get_attribute(kMDItemDownloadedDate) == [utc_time] assert meta.downloadeddate == [utc_time]
def test_finderinfo_color_set_get_clear(temp_file): """Test ability to set_attribute, get_attribute, clear_attribute on finderinfo""" from osxmetadata import OSXMetaData, Tag from osxmetadata.constants import FINDER_COLOR_GREEN, FINDER_COLOR_BLUE from osxmetadata.findertags import get_tag_color_name meta = OSXMetaData(temp_file) assert meta.finderinfo.color == 0 meta.finderinfo.color = FINDER_COLOR_GREEN assert meta.finderinfo.color == FINDER_COLOR_GREEN assert {"color": FINDER_COLOR_GREEN}.items() <= meta.get_attribute( "finderinfo" ).items() meta.set_attribute("finderinfo", {"color": FINDER_COLOR_BLUE}) assert meta.finderinfo.color == FINDER_COLOR_BLUE meta.clear_attribute("finderinfo") assert meta.finderinfo.color == 0 meta.finderinfo.color = FINDER_COLOR_GREEN meta.finderinfo.color = None assert meta.finderinfo.color == 0 meta.finderinfo.color = FINDER_COLOR_GREEN meta.finderinfo = None assert meta.finderinfo.color == 0
def test_list_attribute(temp_file, attribute): """test set_attribute, get_attribute, etc for list items""" from osxmetadata import OSXMetaData meta = OSXMetaData(temp_file) expected = ["Foo"] meta.set_attribute(attribute, expected) got = meta.get_attribute(attribute) assert expected == got expected += ["Bar"] meta.append_attribute(attribute, ["Bar"]) assert meta.get_attribute(attribute) == expected expected.remove("Bar") meta.remove_attribute(attribute, "Bar") assert meta.get_attribute(attribute) == expected with pytest.raises(ValueError): meta.remove_attribute(attribute, "Bar") expected += ["Flooz"] meta.update_attribute(attribute, ["Flooz"]) assert meta.get_attribute(attribute) == expected meta.discard_attribute(attribute, "foo") assert meta.get_attribute(attribute) == expected meta.clear_attribute(attribute) assert meta.get_attribute(attribute) is None expected = ["Foo"] meta.set_attribute(attribute, expected) got = meta.get_attribute(attribute) assert expected == got
def test_str_attribute_2(temp_file, attribute): """test getting and setting attribute by name""" from osxmetadata import OSXMetaData meta = OSXMetaData(temp_file) setattr(meta, attribute, True) test_attr = getattr(meta, attribute) assert test_attr assert meta.get_attribute(attribute)
def test_list_attribute_2(temp_file, attribute): """test getting and setting attribute by name""" from osxmetadata import OSXMetaData meta = OSXMetaData(temp_file) setattr(meta, attribute, ["Foo", "Bar"]) test_attr = getattr(meta, attribute) assert test_attr == ["Foo", "Bar"] assert meta.get_attribute(attribute) == ["Foo", "Bar"]
def test_download_date(temp_file): from osxmetadata import OSXMetaData import datetime meta = OSXMetaData(temp_file) dt = datetime.datetime.now() meta.downloadeddate = dt assert meta.downloadeddate == [dt] assert meta.get_attribute("downloadeddate") == [dt]
def test_str_attribute_2(temp_file, attribute): """test getting and setting attribute by name""" from osxmetadata import OSXMetaData meta = OSXMetaData(temp_file) setattr(meta, attribute, datetime.datetime(2021, 7, 8)) test_attr = getattr(meta, attribute) assert test_attr == datetime.datetime(2021, 7, 8) assert meta.get_attribute(attribute) == datetime.datetime(2021, 7, 8)
def test_download_where_from(temp_file): from osxmetadata import OSXMetaData meta = OSXMetaData(temp_file) expected = ["http://google.com", "https://apple.com"] meta.wherefroms = expected wf = meta.wherefroms assert sorted(wf) == sorted(expected) assert sorted(meta.get_attribute("wherefroms")) == sorted(expected)
def test_stationary(temp_file): """test string functions on one of the bool attributes""" from osxmetadata import OSXMetaData meta = OSXMetaData(temp_file) meta.stationary = True assert meta.stationary assert meta.get_attribute("stationary") meta.stationary = not meta.stationary assert not meta.stationary assert not meta.get_attribute("stationary") meta.stationary = None assert meta.stationary is None assert meta.get_attribute("stationary") is None meta.stationary = True assert meta.stationary assert meta.get_attribute("stationary")
def test_description(temp_file): """ test string functions on one of the str attributes """ from osxmetadata import OSXMetaData meta = OSXMetaData(temp_file) meta.description = "Foo" assert meta.description == "Foo" assert meta.get_attribute("description") == "Foo" meta.description += " Bar" assert meta.description == "Foo Bar" assert meta.get_attribute("description") == "Foo Bar" meta.description = None assert meta.description == None assert meta.get_attribute("description") == None meta.description = "Foo" assert meta.description == "Foo" assert meta.get_attribute("description") == "Foo"
def test_rating(temp_file): """test int functions on one of the int attributes""" from osxmetadata import OSXMetaData meta = OSXMetaData(temp_file) meta.rating = 4 assert meta.rating == 4 assert meta.get_attribute("rating") == 4 meta.rating += 1 assert meta.rating == 5 assert meta.get_attribute("rating") == 5 meta.rating = None assert meta.rating is None assert meta.get_attribute("rating") is None meta.rating = 5 assert meta.rating == 5 assert meta.get_attribute("rating") == 5
def test_download_date_tz_1B(temp_file): """ set naive time but return tz_aware """ from osxmetadata import OSXMetaData from osxmetadata.datetime_utils import datetime_naive_to_local import datetime meta = OSXMetaData(temp_file, tz_aware=True) dt = datetime.datetime.now() meta.downloadeddate = dt dt_tz = datetime_naive_to_local(dt) assert meta.downloadeddate == [dt_tz] assert meta.get_attribute("downloadeddate") == [dt_tz]
def test_download_date_tz_3(temp_file): """ set tz_aware and return naive """ from osxmetadata import OSXMetaData from osxmetadata.datetime_utils import datetime_naive_to_local import datetime meta = OSXMetaData(temp_file, tz_aware=False) dt = datetime.datetime.now() dt_tz = datetime_naive_to_local(dt) meta.downloadeddate = dt_tz assert meta.downloadeddate == [dt] assert meta.get_attribute("downloadeddate") == [dt]
def test_list_attributes(temp_file, attribute): from osxmetadata import ATTRIBUTES, OSXMetaData, Tag from osxmetadata.__main__ import cli from osxmetadata.constants import _TAGS_NAMES runner = CliRunner() result = runner.invoke(cli, [ "--set", attribute, "Foo", "--set", attribute, "Bar", "--list", temp_file ]) assert result.exit_code == 0 output = parse_cli_output(result.stdout) attr_short_name = ATTRIBUTES[attribute].name assert output[attr_short_name] == "['Foo', 'Bar']" meta = OSXMetaData(temp_file) if attribute in [*_TAGS_NAMES]: assert meta.get_attribute(attribute) == [Tag("Foo"), Tag("Bar")] else: assert meta.get_attribute(attribute) == ["Foo", "Bar"] result = runner.invoke( cli, [ "--append", attribute, "Green", "--remove", attribute, "Foo", "--list", temp_file, ], ) assert result.exit_code == 0 output = parse_cli_output(result.stdout) attr_short_name = ATTRIBUTES[attribute].name if attr_short_name == "tags": assert output[attr_short_name] == "['Bar', 'Green,Green']" else: assert output[attr_short_name] == "['Bar', 'Green']"
def test_stationarypad(temp_file): """Test stationarypad attribute""" from osxmetadata import OSXMetaData meta = OSXMetaData(temp_file) assert not meta.stationarypad meta.stationarypad = True assert meta.stationarypad meta.stationarypad = 0 assert not meta.stationarypad meta.stationarypad = 1 assert meta.stationarypad meta.stationarypad = False assert not meta.stationarypad assert not meta.get_attribute("stationarypad") meta.set_attribute("stationarypad", True) assert meta.get_attribute("stationarypad")
def test_datetime_list_attributes(temp_file, attribute): from osxmetadata import OSXMetaData, ATTRIBUTES from osxmetadata.__main__ import cli dt = datetime.datetime.now() dt_str = dt.isoformat() runner = CliRunner() result = runner.invoke(cli, ["--set", attribute, dt_str, "--list", temp_file]) assert result.exit_code == 0 output = parse_cli_output(result.stdout) attr_short_name = ATTRIBUTES[attribute].name assert output[attr_short_name] == f"['{dt_str}']" meta = OSXMetaData(temp_file) assert meta.get_attribute(attribute) == [dt]
def test_str_attributes(temp_file, attribute): from osxmetadata import OSXMetaData, ATTRIBUTES from osxmetadata.__main__ import cli runner = CliRunner() result = runner.invoke( cli, ["--set", attribute, "Foo", "--append", attribute, "Bar", "--list", temp_file], ) assert result.exit_code == 0 output = parse_cli_output(result.stdout) attr_short_name = ATTRIBUTES[attribute].name assert output[attr_short_name] == "FooBar" meta = OSXMetaData(temp_file) assert meta.get_attribute(attribute) == "FooBar"
def test_restore(temp_file): from osxmetadata import OSXMetaData, Tag, kMDItemComment meta = OSXMetaData(temp_file) meta.tags = [Tag("foo"), Tag("bar")] meta.set_attribute(kMDItemComment, "Hello World!") attr_dict = meta._to_dict() meta.tags = [] meta.clear_attribute(kMDItemComment) assert meta.tags == [] assert meta.comment is None meta._restore_attributes(attr_dict) assert meta.tags == [Tag("foo"), Tag("bar")] assert meta.get_attribute(kMDItemComment) == "Hello World!"
def test_finderinfo_stationarypad_and_color(temp_file): """Test ability to modify color and stationary pad independently""" from osxmetadata import OSXMetaData, Tag from osxmetadata.constants import ( FINDER_COLOR_GREEN, FINDER_COLOR_BLUE, FINDER_COLOR_NONE, ) meta = OSXMetaData(temp_file) assert meta.finderinfo.stationarypad == 0 assert meta.finderinfo.color == FINDER_COLOR_NONE meta.finderinfo.stationarypad = True assert meta.finderinfo.stationarypad assert meta.finderinfo.color == FINDER_COLOR_NONE meta.finderinfo.color = FINDER_COLOR_GREEN assert meta.finderinfo.color == FINDER_COLOR_GREEN assert meta.finderinfo.stationarypad meta.finderinfo.stationarypad = False assert not meta.finderinfo.stationarypad assert meta.finderinfo.color == FINDER_COLOR_GREEN assert { "color": FINDER_COLOR_GREEN, "stationarypad": False, }.items() <= meta.get_attribute("finderinfo").items() meta.set_attribute("finderinfo", {"stationarypad": True}) assert meta.finderinfo.stationarypad assert meta.finderinfo.color == FINDER_COLOR_GREEN meta.set_attribute("finderinfo", {"color": FINDER_COLOR_BLUE}) assert meta.finderinfo.color == FINDER_COLOR_BLUE assert meta.finderinfo.stationarypad meta.finderinfo = {"color": FINDER_COLOR_GREEN} assert meta.finderinfo.color == FINDER_COLOR_GREEN assert meta.finderinfo.stationarypad meta.finderinfo = {"stationarypad": False} assert meta.finderinfo.color == FINDER_COLOR_GREEN assert not meta.finderinfo.stationarypad