fix: apply CodeRabbit auto-fixes

Fixed 3 file(s) based on 3 unresolved review comments.

Co-authored-by: CodeRabbit <noreply@coderabbit.ai>
This commit is contained in:
coderabbitai[bot]
2026-03-11 17:39:10 +00:00
committed by GitHub
parent f6ab7fdb07
commit 10a80cb395
3 changed files with 39 additions and 54 deletions

View File

@@ -82,7 +82,7 @@ pre-commit run --files <changed files>
```bash ```bash
sudo apt update sudo apt update
sudo apt install ffmpeg curl sudo apt install ffmpeg
``` ```
## License ## License
@@ -97,4 +97,4 @@ MIT License © 2025 Ismo Vuorinen
[lm-l]: https://opensource.org/licenses/MIT [lm-l]: https://opensource.org/licenses/MIT
[sample]: https://www.youtube.com/watch?v=SnywvnjHpUk [sample]: https://www.youtube.com/watch?v=SnywvnjHpUk
<!-- vim: set sw=2 ts=2 tw=72 fo=cqt wm=0 et: --> <!-- vim: set sw=2 ts=2 tw=72 fo=cqt wm=0 et: -->

View File

@@ -365,11 +365,14 @@ class AeonViewHelpers:
logging.error(AeonViewMessages.INVALID_IMAGE_EXTENSION) logging.error(AeonViewMessages.INVALID_IMAGE_EXTENSION)
return None return None
if url.endswith(".png"): url_lower = url.lower()
if url_lower.endswith(".jpeg"):
return ".jpeg"
if url_lower.endswith(".png"):
return ".png" return ".png"
if url.endswith(".gif"): if url_lower.endswith(".gif"):
return ".gif" return ".gif"
if url.endswith(".webp"): if url_lower.endswith(".webp"):
return ".webp" return ".webp"
return ".jpg" return ".jpg"
@@ -397,6 +400,7 @@ class AeonViewHelpers:
""" """
return [ return [
"ffmpeg", "ffmpeg",
"-y",
"-framerate", "-framerate",
str(fps), str(fps),
"-pattern_type", "-pattern_type",
@@ -531,4 +535,4 @@ if __name__ == "__main__":
app = AeonViewApp() app = AeonViewApp()
app.run() app.run()
# vim: set tw=100 fo=cqt wm=0 et: # vim: set tw=100 fo=cqt wm=0 et:

View File

@@ -51,8 +51,10 @@ def test_mkdir_p_creates_directory():
@pytest.mark.parametrize("ext", ["jpg", "png", "gif", "webp"]) @pytest.mark.parametrize("ext", ["jpg", "png", "gif", "webp"])
def test_get_extension_valid(ext): def test_get_extension_valid(ext):
assert AeonViewHelpers.get_extension( assert (
f"{default_image_domain}.{ext}") == f".{ext}" AeonViewHelpers.get_extension(f"{default_image_domain}.{ext}")
== f".{ext}"
)
def test_get_extension_invalid(): def test_get_extension_invalid():
@@ -110,23 +112,20 @@ def test_get_image_paths_invalid_url():
with pytest.raises(SystemExit), mock.patch("aeonview.logging.error"): with pytest.raises(SystemExit), mock.patch("aeonview.logging.error"):
aeon_view_images = AeonViewImages(default_test_path, "invalid-url") aeon_view_images = AeonViewImages(default_test_path, "invalid-url")
aeon_view_images.get_image_paths( aeon_view_images.get_image_paths(
"invalid-url", "invalid-url", default_test_path, datetime(2025, 4, 10)
default_test_path,
datetime(2025, 4, 10)
) )
def test_get_image_paths_invalid_date(): def test_get_image_paths_invalid_date():
with pytest.raises(SystemExit), mock.patch("aeonview.logging.error"): with pytest.raises(SystemExit), mock.patch("aeonview.logging.error"):
aeon_view_images = AeonViewImages( aeon_view_images = AeonViewImages(
default_test_path, default_test_path, f"{default_image_domain}.jpg"
f"{default_image_domain}.jpg"
) )
# noinspection PyTypeChecker # noinspection PyTypeChecker
aeon_view_images.get_image_paths( aeon_view_images.get_image_paths(
f"{default_image_domain}.jpg", f"{default_image_domain}.jpg",
default_test_path, default_test_path,
"invalid-date" # pyright: ignore [reportArgumentType] "invalid-date", # pyright: ignore [reportArgumentType]
) )
@@ -153,9 +152,7 @@ def test_download_image_success(mock_get):
destination = Path(temp_file.name) destination = Path(temp_file.name)
avi.download_image(destination) avi.download_image(destination)
mock_get.assert_called_once_with( mock_get.assert_called_once_with(
f"{default_image_domain}.jpg", f"{default_image_domain}.jpg", stream=True, timeout=10
stream=True,
timeout=10
) )
assert destination.exists() assert destination.exists()
@@ -179,11 +176,7 @@ def test_generate_daily_video(mock_subprocess_run):
with tempfile.TemporaryDirectory() as tmp: with tempfile.TemporaryDirectory() as tmp:
project_path = Path(tmp).resolve() project_path = Path(tmp).resolve()
args = argparse.Namespace( args = argparse.Namespace(
simulate=False, simulate=False, fps=10, day="01", month="04", year="2025"
fps=10,
day="01",
month="04",
year="2025"
) )
avv = AeonViewVideos(project_path, args) avv = AeonViewVideos(project_path, args)
# Create input directory so the existence check passes # Create input directory so the existence check passes
@@ -193,7 +186,10 @@ def test_generate_daily_video(mock_subprocess_run):
avv.generate_daily_video() avv.generate_daily_video()
last_call_args = log.call_args_list[-1][0] last_call_args = log.call_args_list[-1][0]
assert last_call_args[0] == "%s: %s" assert last_call_args[0] == "%s: %s"
assert last_call_args[1] == AeonViewMessages.VIDEO_GENERATION_SUCCESS assert (
last_call_args[1]
== AeonViewMessages.VIDEO_GENERATION_SUCCESS
)
assert last_call_args[2] == ( assert last_call_args[2] == (
project_path / "vid" / "2025-04" / "01.mp4" project_path / "vid" / "2025-04" / "01.mp4"
) )
@@ -204,11 +200,7 @@ def test_generate_daily_video(mock_subprocess_run):
@mock.patch("aeonview.AeonViewHelpers.mkdir_p") @mock.patch("aeonview.AeonViewHelpers.mkdir_p")
def test_generate_daily_video_simulate(mock_mkdir_p): def test_generate_daily_video_simulate(mock_mkdir_p):
args = argparse.Namespace( args = argparse.Namespace(
simulate=True, simulate=True, fps=10, day="01", month="04", year="2025"
fps=10,
day="01",
month="04",
year="2025"
) )
avv = AeonViewVideos(default_test_path, args) avv = AeonViewVideos(default_test_path, args)
avv.generate_daily_video() avv.generate_daily_video()
@@ -217,11 +209,7 @@ def test_generate_daily_video_simulate(mock_mkdir_p):
def test_generate_monthly_video_not_implemented(): def test_generate_monthly_video_not_implemented():
args = argparse.Namespace( args = argparse.Namespace(
simulate=False, simulate=False, fps=10, day="01", month="04", year="2025"
fps=10,
day="01",
month="04",
year="2025"
) )
avv = AeonViewVideos(default_test_path, args) avv = AeonViewVideos(default_test_path, args)
with pytest.raises(NotImplementedError): with pytest.raises(NotImplementedError):
@@ -230,19 +218,17 @@ def test_generate_monthly_video_not_implemented():
def test_generate_yearly_video_not_implemented(): def test_generate_yearly_video_not_implemented():
args = argparse.Namespace( args = argparse.Namespace(
simulate=False, simulate=False, fps=10, day="01", month="04", year="2025"
fps=10,
day="01",
month="04",
year="2025"
) )
avv = AeonViewVideos(default_test_path, args) avv = AeonViewVideos(default_test_path, args)
with pytest.raises(NotImplementedError): with pytest.raises(NotImplementedError):
avv.generate_yearly_video(Path(tempfile.gettempdir())) avv.generate_yearly_video(Path(tempfile.gettempdir()))
@mock.patch("sys.argv", ["aeonview.py", "--mode", "image", "--url", @mock.patch(
f"{default_image_domain}.jpg"]) "sys.argv",
["aeonview.py", "--mode", "image", "--url", f"{default_image_domain}.jpg"],
)
def test_parse_arguments_image_mode(): def test_parse_arguments_image_mode():
args, _ = AeonViewHelpers.parse_arguments() args, _ = AeonViewHelpers.parse_arguments()
assert args.mode == "image" assert args.mode == "image"
@@ -250,8 +236,10 @@ def test_parse_arguments_image_mode():
assert args.dest == default_dest assert args.dest == default_dest
@mock.patch("sys.argv", ["aeonview.py", "--mode", "video", "--project", @mock.patch(
f"{default_project}"]) "sys.argv",
["aeonview.py", "--mode", "video", "--project", f"{default_project}"],
)
def test_parse_arguments_video_mode(): def test_parse_arguments_video_mode():
args, _ = AeonViewHelpers.parse_arguments() args, _ = AeonViewHelpers.parse_arguments()
assert args.mode == "video" assert args.mode == "video"
@@ -276,8 +264,7 @@ def test_parse_arguments_fps():
@mock.patch( @mock.patch(
"sys.argv", "sys.argv", ["aeonview.py", "--mode", "video", "--generate", "2023-10-01"]
["aeonview.py", "--mode", "video", "--generate", "2023-10-01"]
) )
def test_parse_arguments_generate_date(): def test_parse_arguments_generate_date():
args, _ = AeonViewHelpers.parse_arguments() args, _ = AeonViewHelpers.parse_arguments()
@@ -310,11 +297,7 @@ def test_image_simulation(mock_download_image, mock_mkdir_p):
args = mock.MagicMock() args = mock.MagicMock()
args.simulate = True args.simulate = True
args.date = "2025-04-10 12:30:45" args.date = "2025-04-10 12:30:45"
avi = AeonViewImages( avi = AeonViewImages(default_test_path, f"{default_image_domain}.jpg", args)
default_test_path,
f"{default_image_domain}.jpg",
args
)
with mock.patch("aeonview.logging.info") as log: with mock.patch("aeonview.logging.info") as log:
avi.get_current_image() avi.get_current_image()
mock_mkdir_p.assert_not_called() mock_mkdir_p.assert_not_called()
@@ -347,8 +330,7 @@ def test_video_simulation(mock_subprocess_run, mock_mkdir_p):
def test_setup_logger_verbose(mock_basic_config): def test_setup_logger_verbose(mock_basic_config):
AeonViewHelpers.setup_logger(verbose=True) AeonViewHelpers.setup_logger(verbose=True)
mock_basic_config.assert_called_once_with( mock_basic_config.assert_called_once_with(
level=logging.DEBUG, level=logging.DEBUG, format="[%(levelname)s] %(message)s"
format="[%(levelname)s] %(message)s"
) )
@@ -356,6 +338,5 @@ def test_setup_logger_verbose(mock_basic_config):
def test_setup_logger_non_verbose(mock_basic_config): def test_setup_logger_non_verbose(mock_basic_config):
AeonViewHelpers.setup_logger(verbose=False) AeonViewHelpers.setup_logger(verbose=False)
mock_basic_config.assert_called_once_with( mock_basic_config.assert_called_once_with(
level=logging.INFO, level=logging.INFO, format="[%(levelname)s] %(message)s"
format="[%(levelname)s] %(message)s" )
)