def setUp(self): new_dota_dir() self.manager = ModManager() # self.real_method = self.manager._dota_path # self.manager._dota_path = Mock(return_value = mkdtemp()) self.mod1_folder = join(self.manager._d2mp_path(), "mod1") self.mod1_info_file = join(self.mod1_folder, "addoninfo.txt") self.mod2_folder = join(self.manager._d2mp_path(), "mod2") self.mod2_info_file = join(self.mod2_folder, "addoninfo.txt") self.mod_to_delete_folder = join(self.manager._d2mp_path(), "mod_to_delete") self.mod_to_delete_info_file = join(self.mod2_folder, "addoninfo.txt") self.mods = [basename(f) for f in [self.mod1_folder, self.mod2_folder]] for folder in [ self.mod1_folder, self.mod2_folder, self.mod_to_delete_folder ]: if not isdir(folder): os.mkdir(folder) for f in [ self.mod1_info_file, self.mod2_info_file, self.mod_to_delete_info_file ]: if not isfile(f): open(f, "w").close() shutil.rmtree(self.manager._mod_path())
def _init_message(self): man = ModManager() return { "msg": "init", "SteamIDs": man.steam_ids(), "Mods": man.mods_as_json(), "Version": man.get_version(), }
def _init_message(self): man = ModManager() return { "msg": "init", "SteamIDs": man.steam_ids(), "Mods": man.mods_as_json(), "Version": man.VERSION, }
def setUp(self): new_dota_dir() ModManager.install_mod = Mock(side_effect=self.send_reply) XSocketsClient.start = Mock() ConnectionManager.send = Mock() self.manager = ModManager() self.con = ConnectionManager() self.manager.signals.message.connect(self.con.send)
def setUp(self): new_dota_dir() self.manager = ModManager() # self.real_method = self.manager._dota_path # self.manager._dota_path = Mock(return_value = mkdtemp()) self.mod1_folder = join(self.manager._d2mp_path(), "mod1") self.mod1_info_file = join(self.mod1_folder, "addoninfo.txt") self.mod2_folder = join(self.manager._d2mp_path(), "mod2") self.mod2_info_file = join(self.mod2_folder, "addoninfo.txt") self.mod_to_delete_folder = join(self.manager._d2mp_path(), "mod_to_delete") self.mod_to_delete_info_file = join(self.mod2_folder, "addoninfo.txt") self.mods = [basename(f) for f in [self.mod1_folder, self.mod2_folder]] for folder in [self.mod1_folder, self.mod2_folder, self.mod_to_delete_folder]: if not isdir(folder): os.mkdir(folder) for f in [self.mod1_info_file, self.mod2_info_file, self.mod_to_delete_info_file]: if not isfile(f): open(f, "w").close() shutil.rmtree(self.manager._mod_path())
class ModInstallTest(TestCase): def send_reply(self, *args, **kwargs): self.manager.signals.message.emit("ready") def setUp(self): new_dota_dir() ModManager.install_mod = Mock(side_effect=self.send_reply) XSocketsClient.start = Mock() ConnectionManager.send = Mock() self.manager = ModManager() self.con = ConnectionManager() self.manager.signals.message.connect(self.con.send) def tearDown(self): shutil.rmtree(self.manager._d2mp_path()) def test_install_mod(self): self.con.handle_command({ "msg": "installmod", "url": "someurl", "Mod": { "name": "mod_name", "version": "mod_version" } }) self.manager.install_mod.assert_called_with("mod_name", "mod_version", "someurl") self.con.send.assert_called_with("ready")
def setUp(self): new_dota_dir() ModManager.install_mod = Mock(side_effect = self.send_reply) XSocketsClient.start = Mock() ConnectionManager.send = Mock() self.manager = ModManager() self.con = ConnectionManager() self.manager.signals.message.connect(self.con.send)
class ModInstallTest(TestCase): def send_reply(self, *args, **kwargs): self.manager.signals.message.emit("ready") def setUp(self): new_dota_dir() ModManager.install_mod = Mock(side_effect = self.send_reply) XSocketsClient.start = Mock() ConnectionManager.send = Mock() self.manager = ModManager() self.con = ConnectionManager() self.manager.signals.message.connect(self.con.send) def tearDown(self): shutil.rmtree(self.manager._d2mp_path()) def test_install_mod(self): self.con.handle_command({"msg": "installmod", "url":"someurl", "Mod": {"name":"mod_name", "version":"mod_version" }}) self.manager.install_mod.assert_called_with("mod_name", "mod_version", "someurl") self.con.send.assert_called_with("ready")
def _command_install_mod(self, content): url = content["url"] mod_name = content["Mod"]["name"] version = content["Mod"]["version"] self.message.emit("Installing Mod %s v%s" % (mod_name, version)) ModManager().install_mod(mod_name, version, url)
def _create_mod_manager(self): self.manager = ModManager() self.manager.mod_game_info() self.manager.signals.message.connect(self.show_message_from_mod_manager) self.manager.signals.error.connect(self.show_error_from_mod_manager)
def show_mod_list(self): self.show_message("Mod List", ModManager().mod_names_as_string())
class ModTest(TestCase): def test_singleton(self): man1 = ModManager() man2 = ModManager() self.assertEqual(man1, man2) def setUp(self): new_dota_dir() self.manager = ModManager() # self.real_method = self.manager._dota_path # self.manager._dota_path = Mock(return_value = mkdtemp()) self.mod1_folder = join(self.manager._d2mp_path(), "mod1") self.mod1_info_file = join(self.mod1_folder, "addoninfo.txt") self.mod2_folder = join(self.manager._d2mp_path(), "mod2") self.mod2_info_file = join(self.mod2_folder, "addoninfo.txt") self.mod_to_delete_folder = join(self.manager._d2mp_path(), "mod_to_delete") self.mod_to_delete_info_file = join(self.mod2_folder, "addoninfo.txt") self.mods = [basename(f) for f in [self.mod1_folder, self.mod2_folder]] for folder in [self.mod1_folder, self.mod2_folder, self.mod_to_delete_folder]: if not isdir(folder): os.mkdir(folder) for f in [self.mod1_info_file, self.mod2_info_file, self.mod_to_delete_info_file]: if not isfile(f): open(f, "w").close() shutil.rmtree(self.manager._mod_path()) def tearDown(self): shutil.rmtree(self.manager._d2mp_path()) # self.manager._dota_path = self.real_method def test_mod_names(self): for mod in self.mods: self.assertIn(mod, self.manager.mod_names_as_string(), "mods \"%s\" was not in the mod list!" %(mod)) def test_setting_mod(self): mod1_name, mod2_name = self.mods self.assertNotIn(mod2_name, os.listdir(self.manager._mod_path()), "mod2 should NOT be active now") self.assertNotIn(mod1_name, os.listdir(self.manager._mod_path()), "mod1 should NOT be active now") self.manager.set_mod(mod1_name) self.assertIn(mod1_name, self.manager.get_active_mod(), "mod1 should be active now") self.assertNotIn(mod2_name, os.listdir(self.manager._mod_path()), "mod2 should NOT be active now") self.manager.set_mod(mod2_name) self.assertIn(mod2_name, self.manager.get_active_mod(), "mod2 should be active now") self.assertNotIn(mod1_name, os.listdir(self.manager._mod_path()), "mod1 should NOT be active now") def test_active_mod(self): mod1_name, mod2_name = self.mods self.assertIsNone(self.manager.get_active_mod(), "there should be no active mod") self.manager.set_mod(mod1_name) self.assertEqual(mod1_name, self.manager.get_active_mod(), "mod1 should be active") self.manager.set_mod(mod2_name) self.assertEqual(mod2_name, self.manager.get_active_mod(), "mod1 should be active") self.manager.delete_mods() self.assertIsNone(self.manager.get_active_mod(), "there should be no active mod") def test_deleting_mod(self): mod_name = basename(self.mod_to_delete_folder) self.assertIn(mod_name, os.listdir(self.manager._d2mp_path()), "mod should be in d2mp folder") self.assertIn(mod_name, self.manager.mod_names(), "mod should be in cache") self.manager.delete_mod(mod_name) self.assertNotIn(mod_name, os.listdir(self.manager._d2mp_path()), "mod should NOT be in d2mp folder") self.assertNotIn(mod_name, self.manager.mod_names(), "mod should NOT be in cache") def test_delete_all_mods(self): mod1, mod2 = self.mods mod3 = basename(self.mod_to_delete_folder) for mod in [mod1, mod2, mod3]: self.assertIn(mod, os.listdir(self.manager._d2mp_path()), "all mods should be present") self.assertIn(mod, self.manager.mod_names(), "all mods should be present in cache") self.manager.delete_mods() self.assertTrue(len(os.listdir(self.manager._d2mp_path())) == 0, "no mods should be present in d2mp folder anymore") self.assertTrue(len(os.listdir(self.manager._mod_path())) == 0, "no mods should be present in mod folder anymore") self.assertTrue(len(self.manager._mods()) == 0, "no mods should be present in cache anymore")
def setUp(self): self.dota_info_normal = """ "GameInfo" { game "DOTA 2" gamelogo 1 type multiplayer_only nomodels 1 nohimodel 1 nocrosshair 0 GameData "dota.fgd" SupportsDX8 0 FileSystem { SteamAppId 816 ToolsAppId 211 SearchPaths { Game |gameinfo_path|. Game platform } } }""" self.dota_info_modded = """ "GameInfo" { game "DOTA 2" gamelogo 1 type multiplayer_only nomodels 1 nohimodel 1 nocrosshair 0 GameData "dota.fgd" SupportsDX8 0 FileSystem { SteamAppId 816 ToolsAppId 211 SearchPaths { Game |gameinfo_path|. Game platform Game |gameinfo_path|addons\d2moddin } } }""" new_dota_dir() self.manager = ModManager() # self.real_method = self.manager._dota_path # self.manager._dota_path = Mock(return_value = mkdtemp()) dota_subdir = join(self.manager._dota_path(), "dota") if not isdir(dota_subdir): mkdir(dota_subdir) write_to_file(self.manager.dota_info_file(), self.dota_info_normal)
class GameInfoTest(TestCase): def setUp(self): self.dota_info_normal = """ "GameInfo" { game "DOTA 2" gamelogo 1 type multiplayer_only nomodels 1 nohimodel 1 nocrosshair 0 GameData "dota.fgd" SupportsDX8 0 FileSystem { SteamAppId 816 ToolsAppId 211 SearchPaths { Game |gameinfo_path|. Game platform } } }""" self.dota_info_modded = """ "GameInfo" { game "DOTA 2" gamelogo 1 type multiplayer_only nomodels 1 nohimodel 1 nocrosshair 0 GameData "dota.fgd" SupportsDX8 0 FileSystem { SteamAppId 816 ToolsAppId 211 SearchPaths { Game |gameinfo_path|. Game platform Game |gameinfo_path|addons\d2moddin } } }""" new_dota_dir() self.manager = ModManager() # self.real_method = self.manager._dota_path # self.manager._dota_path = Mock(return_value = mkdtemp()) dota_subdir = join(self.manager._dota_path(), "dota") if not isdir(dota_subdir): mkdir(dota_subdir) write_to_file(self.manager.dota_info_file(), self.dota_info_normal) # def tearDown(self): # self.manager._dota_path = self.real_method def test_is_modded_tester(self): write_to_file(self.manager.dota_info_file(), self.dota_info_normal) self.assertFalse(self.manager.is_modded(), "should NOT be modded") write_to_file(self.manager.dota_info_file(), self.dota_info_modded) self.assertTrue(self.manager.is_modded(), "should be modded") def test_mod_game_info(self): self.assertFalse(self.manager.is_modded(), "game info schould NOT be modded at the beginning") self.manager.mod_game_info() self.assertTrue(self.manager.is_modded(), "game info schould be modded now") def test_unmod_game_info(self): self.manager.mod_game_info() self.assertTrue(self.manager.is_modded(), "game info schould be modded at the beginning") self.manager.unmod_game_info() self.assertFalse(self.manager.is_modded(), "game info schould NOT be modded anymore")
def _command_del_mod(self, content): mod_name = content["Mod"]["name"] version = content["Mod"]["version"] self.message.emit("Uninstalling Mod %s v%s" % (mod_name, version)) ModManager().delete_mod(mod_name, version)
def _command_set_mod(self, content): ModManager().set_mod(content["Mod"]["name"])
def uninstall(self): ModManager().delete_mods() # ModManager().uninstall_d2mp() self.exit()
class SingleApplication(QApplication): def __init__(self, *args): QApplication.__init__(self, *args) self._memory = QSharedMemory(self) self._memory.setKey("d2mp") if self._memory.attach(): self._running = True else: self._running = False if not self._memory.create(1): raise RuntimeError(self._memory.errorString().toLocal8Bit().data()) def is_running(self): return self._running def exec_(self): self._create_tray_icon() self._create_mod_manager() self._start_file_watcher() self._create_socket() Settings() return super(SingleApplication, self).exec_() def _create_mod_manager(self): self.manager = ModManager() self.manager.mod_game_info() self.manager.signals.message.connect(self.show_message_from_mod_manager) self.manager.signals.error.connect(self.show_error_from_mod_manager) def _create_socket(self): self.socket = ConnectionManager() self.manager.signals.contact_server.connect(self.socket.send) self.socket.message.connect(self.show_message_from_socket) self.socket.error.connect(self.show_error_from_socket) @property def _watcher_file_name(self): return "d2mp.pid" def _start_file_watcher(self): self.watcher = QFileSystemWatcher() self.watcher_file_path = join(abspath("."), self._watcher_file_name) log.DEBUG("creating watcher file: %s" %(self.watcher_file_path)) write_to_file(self.watcher_file_path, "Delete this file to shutdown D2MP\n") self.watcher.addPath(abspath(".")) self.watcher.directoryChanged.connect(self._watcher_changed_callback) def _watcher_changed_callback(self, val): if self._watcher_file_name not in os.listdir(val): secs = 3 self.show_message("Shutdown", "Watcher file was deleted. D2MP will shotdown in %d seconds." %(secs)) sleep(secs) self.exit() def _create_tray_icon(self): self.tray = QSystemTrayIcon(self) self.tray.setToolTip("D2Moddin Manager") self.tray.setIcon(QIcon(SETTINGS['icon'])) traymenu = QMenu() traymenu.addAction("Restart", self.restart) traymenu.addAction("Uninstall", self.uninstall) traymenu.addAction("Preferences", UIManager().open_preferences) traymenu.addAction("Show mod list", self.show_mod_list) traymenu.addSeparator() traymenu.addAction("Exit", self.exit) self.tray.setContextMenu(traymenu) self.tray.show() def restart(self): python = sys.executable args = set(sys.argv) args.add("restart") os.execl(python, python, *list(sys.argv)) self.exit() def uninstall(self): ModManager().delete_mods() # ModManager().uninstall_d2mp() self.exit() def exit(self): # do some cleanup return super(SingleApplication, self).exit() def show_mod_list(self): self.show_message("Mod List", ModManager().mod_names_as_string()) def show_message_from_socket(self, message): self.show_message("Server message", message) def show_error_from_socket(self, message): self.show_message("Server error", message, QSystemTrayIcon.Critical) def show_message_from_mod_manager(self, message): self.show_message("ModManager message", message) def show_error_from_mod_manager(self, message): self.show_message("ModManager error", message, QSystemTrayIcon.Critical) def show_message(self, title, message, icon = QSystemTrayIcon.Information): self.tray.showMessage(title, message, icon)
class ModTest(TestCase): def test_singleton(self): man1 = ModManager() man2 = ModManager() self.assertEqual(man1, man2) def setUp(self): new_dota_dir() self.manager = ModManager() # self.real_method = self.manager._dota_path # self.manager._dota_path = Mock(return_value = mkdtemp()) self.mod1_folder = join(self.manager._d2mp_path(), "mod1") self.mod1_info_file = join(self.mod1_folder, "addoninfo.txt") self.mod2_folder = join(self.manager._d2mp_path(), "mod2") self.mod2_info_file = join(self.mod2_folder, "addoninfo.txt") self.mod_to_delete_folder = join(self.manager._d2mp_path(), "mod_to_delete") self.mod_to_delete_info_file = join(self.mod2_folder, "addoninfo.txt") self.mods = [basename(f) for f in [self.mod1_folder, self.mod2_folder]] for folder in [ self.mod1_folder, self.mod2_folder, self.mod_to_delete_folder ]: if not isdir(folder): os.mkdir(folder) for f in [ self.mod1_info_file, self.mod2_info_file, self.mod_to_delete_info_file ]: if not isfile(f): open(f, "w").close() shutil.rmtree(self.manager._mod_path()) def tearDown(self): shutil.rmtree(self.manager._d2mp_path()) # self.manager._dota_path = self.real_method def test_mod_names(self): for mod in self.mods: self.assertIn(mod, self.manager.mod_names_as_string(), "mods \"%s\" was not in the mod list!" % (mod)) def test_setting_mod(self): mod1_name, mod2_name = self.mods self.assertNotIn(mod2_name, os.listdir(self.manager._mod_path()), "mod2 should NOT be active now") self.assertNotIn(mod1_name, os.listdir(self.manager._mod_path()), "mod1 should NOT be active now") self.manager.set_mod(mod1_name) self.assertIn(mod1_name, self.manager.get_active_mod(), "mod1 should be active now") self.assertNotIn(mod2_name, os.listdir(self.manager._mod_path()), "mod2 should NOT be active now") self.manager.set_mod(mod2_name) self.assertIn(mod2_name, self.manager.get_active_mod(), "mod2 should be active now") self.assertNotIn(mod1_name, os.listdir(self.manager._mod_path()), "mod1 should NOT be active now") def test_active_mod(self): mod1_name, mod2_name = self.mods self.assertIsNone(self.manager.get_active_mod(), "there should be no active mod") self.manager.set_mod(mod1_name) self.assertEqual(mod1_name, self.manager.get_active_mod(), "mod1 should be active") self.manager.set_mod(mod2_name) self.assertEqual(mod2_name, self.manager.get_active_mod(), "mod1 should be active") self.manager.delete_mods() self.assertIsNone(self.manager.get_active_mod(), "there should be no active mod") def test_deleting_mod(self): mod_name = basename(self.mod_to_delete_folder) self.assertIn(mod_name, os.listdir(self.manager._d2mp_path()), "mod should be in d2mp folder") self.assertIn(mod_name, self.manager.mod_names(), "mod should be in cache") self.manager.delete_mod(mod_name) self.assertNotIn(mod_name, os.listdir(self.manager._d2mp_path()), "mod should NOT be in d2mp folder") self.assertNotIn(mod_name, self.manager.mod_names(), "mod should NOT be in cache") def test_delete_all_mods(self): mod1, mod2 = self.mods mod3 = basename(self.mod_to_delete_folder) for mod in [mod1, mod2, mod3]: self.assertIn(mod, os.listdir(self.manager._d2mp_path()), "all mods should be present") self.assertIn(mod, self.manager.mod_names(), "all mods should be present in cache") self.manager.delete_mods() self.assertTrue( len(os.listdir(self.manager._d2mp_path())) == 0, "no mods should be present in d2mp folder anymore") self.assertTrue( len(os.listdir(self.manager._mod_path())) == 0, "no mods should be present in mod folder anymore") self.assertTrue( len(self.manager._mods()) == 0, "no mods should be present in cache anymore")
def command(cmd): if sys.platform == "darwin": return call(["open", ModManager().steam_exe(), "steam://%s" % cmd]) else: return call([ModManager().steam_exe(), "steam://%s" % cmd])
def test_singleton(self): man1 = ModManager() man2 = ModManager() self.assertEqual(man1, man2)