diff --git a/dobble/__main__.py b/dobble/__main__.py index 1c90d11..2ab438e 100644 --- a/dobble/__main__.py +++ b/dobble/__main__.py @@ -8,10 +8,11 @@ from dobble.steps import pdf from dobble.steps import preprocess from dobble.steps import svg_to_png +from dobble.utils.asserts import assert_eq from dobble.utils.asserts import assert_isdir -from dobble.utils.asserts import assert_len from dobble.utils.file import create_new_folder from dobble.utils.file import list_image_files +from dobble.utils.file import list_svg_files from dobble.utils.profiling import LogScopeTime from dobble.utils.profiling import Profiling @@ -45,8 +46,11 @@ def main(symbols_folder: str, card_size_cm: Diameter of the output Dobble cards to print """ assert_isdir(symbols_folder) - assert_len(list_image_files(symbols_folder), 31 if junior_size else 57, - msg=f"Invalid number of symbols in input folder {symbols_folder}") + num_rasterized = len(list_image_files(symbols_folder)) + num_svg = len(list_svg_files(symbols_folder)) + assert_eq(num_rasterized+num_svg, 31 if junior_size else 57, + msg=f"Invalid number of symbols in input folder {symbols_folder}. " + f"Got {num_rasterized} rasterized and {num_svg} SVG images.") create_new_folder(output_folder) diff --git a/dobble/steps/svg_to_png.py b/dobble/steps/svg_to_png.py index 92d3680..b372f5b 100644 --- a/dobble/steps/svg_to_png.py +++ b/dobble/steps/svg_to_png.py @@ -1,13 +1,14 @@ # /usr/bin/python3 """Convert any SVG images to PNG format.""" -import glob import os import imagesize from tqdm import tqdm from dobble.utils.file import copy_file +from dobble.utils.file import create_new_folder from dobble.utils.file import list_image_files +from dobble.utils.file import list_svg_files from dobble.utils.logger import logger from dobble.utils.profiling import profile @@ -37,6 +38,8 @@ def main(images_folder: str, out_images_folder: Output folder containing the rasterized images largest_svg_side_pix: Size of the largest image side (in pix) when rasterizing a SVG image """ + create_new_folder(out_images_folder) + # Copy the already rasterized images to the output folder rasterized_image_names = list_image_files(images_folder) for img_name in rasterized_image_names: @@ -44,9 +47,10 @@ def main(images_folder: str, os.path.join(out_images_folder, img_name)) # Rasterize SVG images - svg_files = glob.glob(os.path.join(images_folder, '*.svg')) - for in_path in tqdm(svg_files, desc="SVG to PNG"): - out_path = os.path.join(out_images_folder, os.path.basename(in_path).replace('.svg', '.png')) - convert_svg_to_png(in_path, out_path, largest_svg_side_pix) + svg_names = list_svg_files(images_folder) + for svg_name in tqdm(svg_names, desc="SVG to PNG"): + convert_svg_to_png(os.path.join(images_folder, svg_name), + os.path.join(out_images_folder, svg_name.replace('.svg', '.png')), + largest_svg_side_pix) - logger.info(f"{len(svg_files)} SVG images have been rasterized to PNG") + logger.info(f"{len(svg_names)} SVG images have been rasterized to PNG") diff --git a/dobble/test/test_main.py b/dobble/test/test_main.py index c5238b6..ccf0035 100644 --- a/dobble/test/test_main.py +++ b/dobble/test/test_main.py @@ -4,26 +4,59 @@ from dobble.__main__ import main from dobble.utils.asserts import assert_isfile +from dobble.utils.file import create_new_folder from dobble.utils.paths import ASSETS_DIR from dobble.utils.paths import TEST_DIR def test_normal_main() -> None: """Test normal main.""" - output_folder = os.path.join(TEST_DIR, 'result_normal') + # GIVEN + symbols_folder = os.path.join(ASSETS_DIR, 'symbols_examples') - main(symbols_folder=os.path.join(ASSETS_DIR, 'symbols_examples'), - output_folder=output_folder) + # WHEN + output_folder = os.path.join(TEST_DIR, 'result_normal') + main(symbols_folder=symbols_folder, output_folder=output_folder) + # THEN assert_isfile(os.path.join(output_folder, '4_print', "cards.pdf")) def test_junior_main() -> None: """Test junior main.""" + # GIVEN + symbols_folder = os.path.join(ASSETS_DIR, 'symbols_examples_junior') + + # WHEN output_folder = os.path.join(TEST_DIR, 'result_junior') + main(symbols_folder=symbols_folder, output_folder=output_folder, junior_size=True) + + # THEN + assert_isfile(os.path.join(output_folder, '4_print', "cards.pdf")) - main(symbols_folder=os.path.join(ASSETS_DIR, 'symbols_examples_junior'), - output_folder=output_folder, - junior_size=True) +def test_junior_main_with_svg() -> None: + """Test junior main but with only SVG images.""" + # GIVEN + output_folder = os.path.join(TEST_DIR, 'result_junior_svg') + symbols_folder = os.path.join(TEST_DIR, 'svg_junior_symbols') + create_new_folder(symbols_folder) + + for k in range(31): + path = os.path.join(symbols_folder, f"symbol_{k}.svg") + color = 'red' if k % 2 == 0 else 'blue' + with open(path, 'w') as f: + f.write(f""" + + + +{k} + + +""") + + # WHEN + main(symbols_folder=symbols_folder, output_folder=output_folder, junior_size=True) + + # THEN assert_isfile(os.path.join(output_folder, '4_print', "cards.pdf")) diff --git a/dobble/utils/file.py b/dobble/utils/file.py index 18c1f6d..6b4df4a 100644 --- a/dobble/utils/file.py +++ b/dobble/utils/file.py @@ -37,6 +37,13 @@ def list_image_files(images_folder: str) -> list[str]: if f.name.lower().endswith(image_extensions)] +def list_svg_files(images_folder: str) -> list[str]: + """List SVG files.""" + return [f.name + for f in os.scandir(images_folder) + if f.name.lower().endswith('.svg')] + + def copy_file(input_path: str, output_path: str) -> None: """Copy file or folder in other folder.""" make_sure_folder_exists(output_path)