def test_cli_verbose_short_opts(temp_file): from osxmetadata import OSXMetaData, Tag from osxmetadata.__main__ import cli TESTDIR = None source_file = NamedTemporaryFile(dir=TESTDIR) source_filename = source_file.name meta_source = OSXMetaData(source_filename) meta_source.tags = [Tag("bar")] meta_source.keywords = ["foo"] meta_source.findercomment = "Bar" meta_source.comment = "Foo" runner = CliRunner() result = runner.invoke( cli, [ "-X", "-s", "keywords", "test", "-l", "-g", "keywords", "-c", "keywords", "-r", "keywords", "test", "-u", "keywords", "foo", "-m", "keywords", "tags", "-V", "-B", "-f", source_filename, temp_file, ], ) assert result.exit_code == 0 output = result.output assert "Processing file" in output assert "No metadata to wipe from" in output assert "Copying attributes from" in output assert "Copying com.apple.metadata:_kMDItemUserTags" in output assert "Copying com.apple.metadata:kMDItemComment" in output assert "Copying com.apple.metadata:kMDItemKeywords" in output assert "Copying com.apple.metadata:kMDItemFinderComment" in output assert "Clearing keywords" in output assert "Setting keywords=test" in output assert "Updating keywords=foo" in output assert "Removing keywords" in output assert "Mirroring keywords tags" in output assert "Backing up attribute data" in output source_file.close()
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_cli_mirror(temp_file): import datetime from osxmetadata import OSXMetaData, Tag from osxmetadata.__main__ import cli runner = CliRunner() result = runner.invoke( cli, [ "--set", "comment", "Foo", "--set", "findercomment", "Bar", "--set", "keywords", "foo", "--set", "tags", "bar", "--list", temp_file, ], ) assert result.exit_code == 0 meta = OSXMetaData(temp_file) assert meta.tags == [Tag("bar")] assert meta.keywords == ["foo"] assert meta.findercomment == "Bar" assert meta.comment == "Foo" result = runner.invoke( cli, [ "--mirror", "keywords", "tags", "--mirror", "comment", "findercomment", temp_file, ], ) assert result.exit_code == 0 assert meta.keywords == ["bar", "foo"] assert meta.tags == [Tag("bar"), Tag("foo")] assert meta.findercomment == "Bar" assert meta.comment == "Bar"
def test_cli_walk(temp_dir): """test --walk""" import os import pathlib from osxmetadata import OSXMetaData, Tag from osxmetadata.__main__ import cli dirname = pathlib.Path(temp_dir) os.makedirs(dirname / "temp" / "subfolder1") os.makedirs(dirname / "temp" / "subfolder2") create_file(dirname / "temp" / "temp1.txt") create_file(dirname / "temp" / "subfolder1" / "sub1.txt") runner = CliRunner() result = runner.invoke(cli, ["--set", "tags", "FOO", "--walk", temp_dir]) assert result.exit_code == 0 md = OSXMetaData(dirname / "temp" / "subfolder1" / "sub1.txt") assert md.tags == [Tag("FOO")] md = OSXMetaData(dirname / "temp" / "subfolder2") assert md.tags == [Tag("FOO")]
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_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_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_finderinfo_colorid(temp_file): from osxmetadata import OSXMetaData, Tag from osxmetadata.constants import _MAX_FINDER_COLOR from osxmetadata.findertags import get_tag_color_name meta = OSXMetaData(temp_file) # check each color combo. Setting 0 doesn't work -- the attribute gets deleted for color_id in range(_MAX_FINDER_COLOR + 1, _MAX_FINDER_COLOR + 1): meta.finderinfo.color = color_id color_got = meta.finderinfo.color assert color_got == color_id color_name = get_tag_color_name(color_id) assert meta.tags == [Tag(color_name, color_id)]
def test_cli_backup_restore(temp_file): 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", temp_file]) assert result.exit_code == 0 assert meta.tags == [Tag("Foo"), Tag("Bar")] assert meta.comment == "Hello World!"
def test_tags_clear(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.clear_attribute(attribute) tags = meta.get_attribute(attribute) assert tags == []
def test_tags(temp_file): from osxmetadata import OSXMetaData, Tag # update tags meta = OSXMetaData(temp_file) tagset = [Tag("Test"), Tag("Green")] meta.tags.extend(tagset) assert meta.tags == tagset # extend meta.tags.extend([Tag("Foo")]) assert meta.tags == [Tag("Test"), Tag("Green"), Tag("Foo")] # add tags meta.tags.append(Tag("Hello")) assert meta.tags != tagset assert meta.tags == [Tag("Test"), Tag("Green"), Tag("Foo"), Tag("Hello")] # __iadd__ meta.tags += [Tag("Bar")] assert meta.tags == [ Tag("Test"), Tag("Green"), Tag("Foo"), Tag("Hello"), Tag("Bar"), ] # __repr__ # TODO # remove tags meta.tags.remove(Tag("Test")) assert meta.tags == [Tag("Green"), Tag("Foo"), Tag("Hello"), Tag("Bar")] # remove tag that doesn't exist, raises KeyError with pytest.raises(ValueError): assert meta.tags.remove(Tag("FooBar")) # len assert len(meta.tags) == 4 # clear tags meta.tags.clear() assert meta.tags == []
def test_cli_wipe_2(temp_file): # test wipe then set from osxmetadata import OSXMetaData, Tag from osxmetadata.__main__ import cli runner = CliRunner() result = runner.invoke( cli, [ "--set", "comment", "Foo", "--set", "findercomment", "Bar", "--set", "keywords", "foo", "--set", "tags", "bar", "--list", temp_file, ], ) assert result.exit_code == 0 meta = OSXMetaData(temp_file) assert meta.tags == [Tag("bar")] assert meta.keywords == ["foo"] assert meta.findercomment == "Bar" assert meta.comment == "Foo" result = runner.invoke( cli, ["--wipe", "--set", "comment", "Hello World!", temp_file] ) assert result.exit_code == 0 assert meta.tags == [] assert meta.keywords == [] assert meta.findercomment is None assert meta.comment == "Hello World!"
def test_cli_copy_from_2(temp_file): # test copy from source file with setting etc from osxmetadata import OSXMetaData, Tag from osxmetadata.__main__ import cli TESTDIR = None source_file = NamedTemporaryFile(dir=TESTDIR) source_filename = source_file.name meta_source = OSXMetaData(source_filename) meta_source.tags = [Tag("bar")] meta_source.keywords = ["foo"] meta_source.findercomment = "Bar" meta_source.comment = "Foo" runner = CliRunner() result = runner.invoke( cli, [ "--copyfrom", source_filename, temp_file, "--set", "tags", "FOOBAR", "--append", "findercomment", "Foo", ], ) assert result.exit_code == 0 meta = OSXMetaData(temp_file) assert meta.tags == [Tag("FOOBAR")] assert meta.keywords == ["foo"] assert meta.findercomment == "BarFoo" assert meta.comment == "Foo" source_file.close()
def test_finderinfo_stationarypad_set_get_clear(temp_file): """Test ability to set_attribute, get_attribute, clear_attribute on finderinfo""" from osxmetadata import OSXMetaData, Tag meta = OSXMetaData(temp_file) assert meta.finderinfo.stationarypad == 0 meta.finderinfo.stationarypad = True assert meta.finderinfo.stationarypad assert {"stationarypad": True}.items() <= meta.get_attribute("finderinfo").items() meta.set_attribute("finderinfo", {"stationarypad": True}) assert meta.finderinfo.stationarypad meta.clear_attribute("finderinfo") assert not meta.finderinfo.stationarypad meta.finderinfo.stationarypad = None assert not meta.finderinfo.stationarypad # test string to bool meta.finderinfo.stationarypad = "True" assert meta.finderinfo.stationarypad
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_cli_backup_restore(temp_file): import pathlib from osxmetadata import ATTRIBUTES, OSXMetaData, Tag from osxmetadata.__main__ import cli from osxmetadata.constants import ( _BACKUP_FILENAME, FINDER_COLOR_GREEN, FINDER_COLOR_NONE, ) runner = CliRunner() result = runner.invoke( cli, [ "--set", "tags", "Foo", "--set", "tags", "Bar", "--set", "comment", "Hello World!", "--list", "--set", "finderinfo", "color:green", temp_file, ], ) assert result.exit_code == 0 output = parse_cli_output(result.stdout) assert output["tags"] == "['Foo', 'Bar', 'Green,Green']" meta = OSXMetaData(temp_file) assert meta.get_attribute("tags") == [ Tag("Foo"), Tag("Bar"), Tag("Green", FINDER_COLOR_GREEN), ] assert meta.get_attribute("comment") == "Hello World!" assert meta.finderinfo.color == FINDER_COLOR_GREEN # 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") meta.clear_attribute("finderinfo") assert meta.tags == [] assert meta.comment is None assert meta.finderinfo.color == FINDER_COLOR_NONE result = runner.invoke(cli, ["--restore", temp_file]) assert result.exit_code == 0 assert meta.tags == [ Tag("Foo"), Tag("Bar"), Tag("Green", FINDER_COLOR_GREEN) ] assert meta.comment == "Hello World!" assert meta.finderinfo.color == FINDER_COLOR_GREEN
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_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_cli_1(temp_file): import datetime from osxmetadata import OSXMetaData, kMDItemDownloadedDate from osxmetadata.__main__ import cli runner = CliRunner() result = runner.invoke( cli, [ "--set", "description", "Foo", "--append", "description", "Bar", "--list", temp_file, ], ) assert result.exit_code == 0 output = parse_cli_output(result.stdout) assert output["description"] == "FooBar" meta = OSXMetaData(temp_file) assert meta.description == "FooBar" result = runner.invoke( cli, [ "--update", "keywords", "foo", "--update", "keywords", "bar", "--remove", "keywords", "foo", "--list", temp_file, ], ) assert result.exit_code == 0 output = parse_cli_output(result.stdout) assert output["keywords"] == "['bar']" meta = OSXMetaData(temp_file) assert meta.keywords == ["bar"] dt = "2020-02-23" result = runner.invoke(cli, ["--set", "downloadeddate", dt, "--list", temp_file]) assert result.exit_code == 0 output = parse_cli_output(result.stdout) assert output["downloadeddate"] == "['2020-02-23T00:00:00']" expected_dt = datetime.datetime.fromisoformat(dt) meta = OSXMetaData(temp_file) assert meta.get_attribute(kMDItemDownloadedDate) == [expected_dt] assert meta.downloadeddate == [expected_dt] result = runner.invoke(cli, ["--clear", "description", temp_file]) assert result.exit_code == 0 meta = OSXMetaData(temp_file) assert meta.description 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_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_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"