Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
10 changes: 7 additions & 3 deletions dobble/__main__.py
Original file line number Diff line number Diff line change
Expand Up @@ -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

Expand Down Expand Up @@ -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)

Expand Down
16 changes: 10 additions & 6 deletions dobble/steps/svg_to_png.py
Original file line number Diff line number Diff line change
@@ -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

Expand Down Expand Up @@ -37,16 +38,19 @@ 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:
copy_file(os.path.join(images_folder, img_name),
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")
45 changes: 39 additions & 6 deletions dobble/test/test_main.py
Original file line number Diff line number Diff line change
Expand Up @@ -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"""
<svg width="200" height="200" xmlns="http://www.w3.org/2000/svg">
<rect width="100%" height="100%" fill="white"/>
<text x="50%" y="50%" font-size="100" text-anchor="middle" dominant-baseline="central" fill="{color}">
{k}
</text>
</svg>
""")

# 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"))
7 changes: 7 additions & 0 deletions dobble/utils/file.py
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand Down