def test_simple_addqres(config, test_resources): runner = CliRunner() # Generate a qrc file named res and update config file runner.invoke(pyqtcli, ["new", "qrc"]) # Test addqres with default option result = runner.invoke(pyqtcli, ["addqres", "res.qrc", "resources"]) assert result.exit_code == 0 # Parse qrc file qrcfile = read_qrc("res.qrc") # Check qresource has been added qrcfile.get_qresource("/resources") # Check file subelements in qresource resources = qrcfile.list_resources("/resources") for root, dirs, files in os.walk("resources"): for f in files: assert os.path.join(root, f) in resources assert len(resources) == test_resources # Check res_folder has been added to dirs variable of config file config.read() config.get_dirs("res.qrc") == ["resources"]
def test_simple_rmqres(config, test_resources): runner = CliRunner() # Generate a qrc file named res and update config file runner.invoke(pyqtcli, ["new", "qrc"]) # Add resources folder config file and qrc runner.invoke(pyqtcli, ["addqres", "res.qrc", "resources"]) # Remove resources folder config file and qrc result = runner.invoke(pyqtcli, ["rmqres", "res.qrc", "resources", "-v"]) # Parse qrc file qrcfile = read_qrc("res.qrc") # Check qresource has been deleted with pytest.raises(QresourceError) as e: qrcfile.get_qresource("/resources") assert format_msg(str(e.value)) == ( "Error: No <qresource> node corresponding to '/resources' prefix" ) # Check res_folder has been removed from dirs variable of config file config.read() assert config.get_dirs("res.qrc") == [] assert format_msg(result.output) == v.info( "Resources folder: \'resources\' has been removed in res.qrc.\n" )
def addqres(config, qrc_path, res_folders, alias, verbose): """ Add <qresource> element with a prefix attribute set to the base name of the given folder of resources. All resources contained in this folder are recorded in qresource as <file> subelement. Args: config (:class:`PyqtcliConfig`): PyqtcliConfig object representing project config file. qrc_path (str): Path to the qrc file that need to add the qresource nodes corresponding to `res_folders`. res_folders (tuple): Paths to folders of resources to record. alias (bool): If True, aliases will be generated while resources are recorded. verbose (bool): Boolean determining if messages will be displayed. """ qrc_file = read_qrc(qrc_path) recorded_dirs = config.get_dirs(qrc_file.name) # Remove duplication in res_folders with a set res_folders = set(res_folders) # Process each resource folders passed for folder in res_folders: # rel_path => relative path of folder from project directory rel_path = os.path.relpath(folder, config.dir_path) # Check if given resources folder has already been recorded if rel_path in recorded_dirs: v.warning("You have already added \'{}\' to {}.".format( folder, qrc_file.name)) continue # Add folder to dirs variable in the config file try: config.add_dirs(qrc_file.name, rel_path, commit=False) except PyqtcliConfigError: v.error("{} isn't part of the project.".format(qrc_path)) raise click.Abort() # Add qresource to qrc file prefix = get_prefix(folder) qrc_file.add_qresource(prefix) fill_qresource(qrc_file, folder, prefix) v.info("qresource with prefix: \'{}\' has been recorded in {}.".format( prefix, qrc_path), verbose) qrc_file.build() config.save() if alias: write_alias([qrc_file.path], verbose)
def test_addqres_two_times(config, test_resources): runner = CliRunner() # Copy resources dir to make another resource folder in another directory os.mkdir("test") shutil.copytree("resources", "test/other_res") # Generate a qrc file named res and update config file runner.invoke(pyqtcli, ["new", "qrc", "res.qrc"]) # Create to qresources in res.qrc runner.invoke(pyqtcli, ["addqres", "res.qrc", "resources"]) runner.invoke(pyqtcli, ["addqres", "-a", "res.qrc", "test/other_res"]) # Parse qrc file qrcfile = read_qrc("res.qrc") # Check qresources has been added qrcfile.get_qresource("/resources") qrcfile.get_qresource("/other_res") # Check file subelements in qresource "/resources" resources = qrcfile.list_resources("/resources") for root, dirs, files in os.walk("resources"): for f in files: assert os.path.join(root, f) in resources assert len(resources) == test_resources # Check file subelements in qresource "/other_res" resources = qrcfile.list_resources("/other_res") for root, dirs, files in os.walk("test/other_res"): for f in files: assert os.path.join(root, f) in resources assert len(resources) == test_resources # Check resources' alias in other_res qresource files = qrcfile.list_files("/other_res") for resource in files: assert os.path.basename(resource.text) == resource.attrib["alias"] # Check that the two res folders have been added to dirs variable of # config file config.read() assert sorted(config.get_dirs("res.qrc")) == sorted(["resources", "test/other_res"])
def test_new_qrc_from_folder(config, test_resources): runner = CliRunner() # launch makerc command runner.invoke(pyqtcli, ["new", "qrc", "test.qrc", "resources"]) assert os.path.isfile("test.qrc") qrc = read_qrc("test.qrc") # Check qresources and their prefix attribute corresponding to # directories of the first level of resources folder first_dirs = [ "/" + d for d in os.listdir("resources") if os.path.isdir(os.path.join("resources", d)) ] first_dirs.append("/") for qresource in qrc.qresources: assert qresource.attrib.get("prefix", None) in first_dirs directory = first_dirs.pop( first_dirs.index(qresource.attrib.get("prefix")) ) # Get all resources files contained in the current qresource res = qrc.list_resources(qresource.attrib["prefix"]) # Special case for root directory to not get into sub directories if directory == "/": resources = [ os.path.join("resources", r) for r in os.listdir("resources") if os.path.isfile(os.path.join("resources", r)) ] for resource in resources: assert resource in res continue # Search if resource files have been recorded correctly in other # directories for root, dirs, files in os.walk("resources" + directory): for file_path in files: assert os.path.join(root, file_path) in res # Verify if all dirs have been checked assert first_dirs == []
def test_read_qrc(): qrc = ( QRCTestFile("res") .add_qresource().add_file("file.txt") .add_qresource("/images").add_file("logo.png").add_file("fg.bmp") .build() ) r_qrc = read_qrc("res.qrc") # check qrc content is the same assert str(qrc) == str(r_qrc) # Check that the list of qresource is identical for qres, r_qres in zip(qrc.qresources, r_qrc.qresources): assert qres.attrib == r_qres.attrib
def test_complex_addqres(config, test_resources): runner = CliRunner() # Make a new dir to complicate path between resources folder and qrc file os.mkdir("test") shutil.move("resources", "test") # Generate a qrc file named res and update config file runner.invoke(pyqtcli, ["new", "qrc", "../res.qrc"]) result = runner.invoke(pyqtcli, ["addqres", "-a", "-v", "../res.qrc", "test/resources"]) assert result.exit_code == 0 # Get in res.qrc directory os.chdir("..") # Parse qrc file qrcfile = read_qrc("res.qrc") # Check qresource has been added qrcfile.get_qresource("/resources") # Check file subelements in qresource resources = qrcfile.list_resources("/resources") for root, dirs, files in os.walk("test/resources"): for f in files: assert os.path.join(root, f) in resources assert len(resources) == test_resources # Check res_folder has been added to dirs variable of config file config.read() assert config.get_dirs("res.qrc") == ["test/resources"] # Check resources' alias files = qrcfile.list_files("/resources") for resource in files: assert os.path.basename(resource.text) == resource.attrib["alias"]
def test_rmqres_with_multiple_res_folders_separately(config, test_resources): runner = CliRunner() # Copy resources dir to make another resource folder in another directory os.mkdir("test") shutil.copytree("resources", "test/other_res") # Generate a qrc file named res and update config file runner.invoke(pyqtcli, ["new", "qrc"]) # Add resources folder config file and qrc runner.invoke( pyqtcli, ["addqres", "res.qrc", "resources", "test/other_res"]) # Remove resources folder config file and qrc runner.invoke(pyqtcli, ["rmqres", "res.qrc", "resources"]) runner.invoke(pyqtcli, ["rmqres", "res.qrc", "test/other_res"]) # Parse qrc file qrcfile = read_qrc("res.qrc") # Check qresources has been deleted with pytest.raises(QresourceError) as e: qrcfile.get_qresource("/resource") assert format_msg(str(e.value)) == ( "Error: No <qresource> node corresponding to '/resource' prefix" ) # Check qresources has been deleted with pytest.raises(QresourceError) as e: qrcfile.get_qresource("/other_res") assert format_msg(str(e.value)) == ( "Error: No <qresource> node corresponding to '/other_res' prefix" ) # Check res_folder has been removed from dirs variable of config file config.read() assert config.get_dirs("res.qrc") == []
def rmqres(config, qrc_path, res_folders, verbose): """ Remove a <qresource> element with a prefix attribute set to the base name of the given folder of resources. All <file> subelements are removed too. Args: config (:class:`PyqtcliConfig`): PyqtcliConfig object representing project config file. qrc_path (str): Path to the qrc file that need to remove the qresource nodes corresponding to `res_folders`. res_folders (tuple): Paths to folders of resources to remove. verbose (bool): Boolean determining if messages will be displayed. """ qrcfile = read_qrc(qrc_path) # Remove duplication in res_folders with a set res_folders = set(res_folders) folders = [os.path.relpath(f, config.dir_path) for f in res_folders] # remove folder to dirs variable in the config file try: config.rm_dirs(qrcfile.name, folders, commit=False) except PyqtcliConfigError: v.error("{} isn't part of the project.".format(qrc_path)) raise click.Abort() for folder in folders: # Remove qresource to qrc file prefix = get_prefix(folder) qrcfile.remove_qresource(prefix) v.info("Resources folder: \'{}\' has been removed in {}.".format( folder, qrc_path), verbose) config.save() qrcfile.build()
def test_read_qrc_on_nonexistent_qrc(): with pytest.raises(QRCFileError) as e: read_qrc("res.qrc") assert str(e.value) == "Error: Qrc file \'res.qrc\' does not exist."