def test_pull_dir_client_to_server(self): """Copy dir from client to server""" h_register_dummy_user_device_client() client_folder = gen_paths.normalize_path( client_paths.LOCAL_CLIENT_DATA, "folder1") h_fill_dummy_dir(client_folder) actions = [ c_sync.create_action(gen_paths.normalize_path("folder1"), gen_paths.normalize_path(""), gen_json.ACTION_PULL, remote_abs_path=client_folder, is_directory=True) ] net_interface.server.execute_actions(actions) self.assertTrue( os.path.exists((path_utils.rel_user_path_to_abs("folder1", 1)))) self.assertTrue( os.path.exists( (path_utils.rel_user_path_to_abs("folder1/inner1", 1)))) self.assertTrue( os.path.exists( (path_utils.rel_user_path_to_abs("folder1/inner2", 1)))) self.assertTrue( os.path.exists((path_utils.rel_user_path_to_abs( "folder1/inner1/test_inner.txt", 1)))) self.assertTrue( os.path.exists( (path_utils.rel_user_path_to_abs("folder1/test.txt", 1))))
def move(rel_src_path: str, rel_dest_path: str) -> None: """paths are relative to users root folder (ROOT/user_X/). Folders that don't exist are created""" client_logger_sync().info( f"Move file: rel_src_path={rel_src_path}, rel_dest_path={rel_dest_path}" ) abs_src_path = path_utils.rel_user_path_to_abs(rel_src_path) abs_dest_path = path_utils.rel_user_path_to_abs(rel_dest_path) return gen_file_exchanges.move(abs_src_path, abs_dest_path)
def remove_file_dir(rel_path: str, only_empty: bool = False): client_logger_sync().info( f"Remove file/dir: rel_path={rel_path}, only_empty={only_empty}") abs_path = path_utils.rel_user_path_to_abs(rel_path) if os.path.isdir(abs_path): gen_file_exchanges.remove_dir(abs_path, only_empty) else: gen_file_exchanges.remove_file(abs_path)
def get_dir(rel_src_path: str, abs_dest_path: str) -> None: client_logger_sync().info( f"Get dir: rel_src_path={rel_src_path}, abs_dest_path={abs_dest_path}") abs_src_path = path_utils.rel_user_path_to_abs(rel_src_path) return gen_file_exchanges.get_dir( abs_src_path, abs_dest_path, net_interface.get_user().remote_functions.pull_file, net_interface.get_user().remote_functions.make_dirs)
def generate_content_of_folder(folder_name: str, only_files_list=False, user_id: int = -1): if user_id == -1: user_id = net_interface.get_user_id() abs_path = path_utils.rel_user_path_to_abs(folder_name, user_id) return gen_merge_folders.generate_content_of_folder( abs_path, only_files_list, folder_name)
def pull_dir(abs_client_path: str, rel_server_path: str) -> None: """Pulls a folder with all it files and subfolders from the client.""" client_logger_sync().info( f"Pull dir: abs_client_path={abs_client_path}, rel_server_path={rel_server_path}" ) client = net_interface.get_user() abs_server_path = path_utils.rel_user_path_to_abs(rel_server_path, client.user_id) os.makedirs(abs_server_path, exist_ok=True) client.remote_functions.get_dir(abs_client_path, abs_server_path)
def pull_file(abs_client_path: str, rel_server_path: str) -> None: """Pulls a file from the client and saves it at the server. The server path is relative to the users root folder. Folders that don't exist are created.""" client_logger_sync().info( f"Pull file: abs_client_path={abs_client_path}, rel_server_path={rel_server_path}" ) client = net_interface.get_user() abs_server_path = path_utils.rel_user_path_to_abs(rel_server_path, client.user_id) os.makedirs(os.path.split(abs_server_path)[0], exist_ok=True) file = client.remote_functions.get_file(abs_client_path, abs_server_path)
def test_merge_folders(self): c_json.init_file(empty=True) h_register_dummy_user_device_client() abs_local_path = normalize_path(c_paths.LOCAL_CLIENT_DATA, "folder1") h_create_empty(abs_local_path) dummy_content = {"folder_name": "folder1", "files": ["test.txt", "test2.txt"], "folders": [ {"folder_name": "inner1", "files": ["inner1_test.txt", "inner1_test2.txt"], "folders": []}, {"folder_name": "inner2", "files": ["inner2_test.txt", "inner2_test2.txt"], "folders": []} ]} h_create_files_folders(abs_local_path, dummy_content) interface.add_sync_folder(abs_local_path, "folder1") server_path = path_utils.rel_user_path_to_abs("folder1", 1) current_structure = gen_merge_folders.generate_content_of_folder(server_path, only_files_list=True, top_folder_name="folder1") expected_structure = dummy_content self.assertEqual(expected_structure, current_structure)
def test_prioritize_latest(self): f1_content = {"folder_name": "folder1", "files": ["f1.txt", "f2.txt"], "folders": []} f2_content = {"folder_name": "folder1", "files": ["f1.txt", "f2.txt", "f3.txt"], "folders": []} f1_path = os.path.join(c_paths.LOCAL_CLIENT_DATA, "folder1") f2_path = path_utils.rel_user_path_to_abs("folder1", 1) generator = self.h_test_merge_method(merge_folders.MergeMethods.PRIORITIZE_LATEST, f1_content, f2_content, f2_content) next(generator) with open(os.path.join(f1_path, "f1.txt"), "w") as f: f.write("New content in f1") with open(os.path.join(f2_path, "f2.txt"), "w") as f: f.write("New content in f2") next(generator) with open(os.path.join(f1_path, "f2.txt"), "r") as f: self.assertEqual("New content in f2", f.read().strip()) with open(os.path.join(f2_path, "f1.txt"), "r") as f: self.assertEqual("New content in f1", f.read().strip())
def test_pull_dir_server_to_client(self): """Copy dir from server to client""" h_register_dummy_user_device_client() server_folder = gen_paths.normalize_path( path_utils.rel_user_path_to_abs("folder1", 1)) client_folder = gen_paths.normalize_path( client_paths.LOCAL_CLIENT_DATA, "folder1") h_fill_dummy_dir(server_folder) net_interface.server.get_dir("folder1", client_folder) self.assertTrue(os.path.exists((os.path.join(client_folder)))) self.assertTrue(os.path.exists((os.path.join(client_folder, "inner1")))) self.assertTrue(os.path.exists((os.path.join(client_folder, "inner2")))) self.assertTrue( os.path.exists((os.path.join(client_folder, "inner1/test_inner.txt")))) self.assertTrue( os.path.exists((os.path.join(client_folder, "test.txt"))))
def h_test_merge_method(self, merge_method, f1_init_content, f2_init_content, expected_content): c_json.init_file(empty=True) h_register_dummy_user_device_client() abs_local_path = normalize_path(c_paths.LOCAL_CLIENT_DATA, "folder1") h_create_empty(abs_local_path) f1_path = os.path.join(c_paths.LOCAL_CLIENT_DATA, "folder1") f2_path = path_utils.rel_user_path_to_abs("folder1", 1) net_interface.server.add_folder(f2_init_content["folder_name"]) h_create_files_folders(f1_path, f1_init_content) h_create_files_folders(f2_path, f2_init_content) yield interface.add_sync_folder(abs_local_path, "folder1", merge_method=merge_method) f1_structure = gen_merge_folders.generate_content_of_folder(f1_path, only_files_list=True, top_folder_name=f1_init_content["folder_name"]) f2_structure = gen_merge_folders.generate_content_of_folder(f2_path, only_files_list=True, top_folder_name=f2_init_content["folder_name"]) self.assertEqual(expected_content, f2_structure) self.assertEqual(expected_content, f1_structure) yield
def make_dirs(rel_path: str, exist_ok: bool = True): client_logger_sync().info( f"Make dirs: rel_path={rel_path}, exist_ok={exist_ok}") abs_path = path_utils.rel_user_path_to_abs(rel_path) return gen_file_exchanges.make_dirs(abs_path, exist_ok)
def get_file(rel_src_path: str, abs_file_dest_path: str) -> net.File: client_logger_sync().info( f"Get file: rel_src_path={rel_src_path}, abs_file_dest_path={abs_file_dest_path}" ) abs_file_src_path = path_utils.rel_user_path_to_abs(rel_src_path) return gen_file_exchanges.get_file(abs_file_src_path, abs_file_dest_path)