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_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(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_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_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_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_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_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_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_cli_backup_restore_all(temp_file): """Test --backup/--restore with --all""" import pathlib from osxmetadata import ATTRIBUTES, OSXMetaData, Tag from osxmetadata.__main__ import cli from osxmetadata.constants import _BACKUP_FILENAME runner = CliRunner() result = runner.invoke( cli, [ "--set", "tags", "Foo", "--set", "tags", "Bar", "--set", "comment", "Hello World!", "--list", temp_file, ], ) assert result.exit_code == 0 meta = OSXMetaData(temp_file) # set a value osxmetadata doesn't know about meta._attrs.set("com.foo.bar", b"FOOBAR") # backup result = runner.invoke(cli, ["--backup", "--all", temp_file]) assert result.exit_code == 0 # clear the attributes to see if they can be restored meta.clear_attribute("tags") meta.clear_attribute("comment") meta._attrs.remove("com.foo.bar") assert meta.tags == [] assert meta.comment is None assert "com.foo.bar" not in meta._list_attributes() # first run restore without --all result = runner.invoke(cli, ["--restore", temp_file]) assert result.exit_code == 0 assert meta.tags == [Tag("Foo"), Tag("Bar")] assert meta.comment == "Hello World!" with pytest.raises(KeyError): assert meta._attrs["com.foo.bar"] == b"FOOBAR" # next run restore with --all result = runner.invoke(cli, ["--restore", "--all", temp_file]) assert result.exit_code == 0 assert meta.tags == [Tag("Foo"), Tag("Bar")] assert meta.comment == "Hello World!" assert meta._attrs["com.foo.bar"] == b"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_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_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