Skip to content

Commit

Permalink
Fix --field-order opt parsing.
Browse files Browse the repository at this point in the history
It was parsing the enum value instead of the name.

Fixes #33
  • Loading branch information
JuniorIsAJitterbug committed Jan 22, 2024
1 parent e32e8dc commit aeb02d4
Show file tree
Hide file tree
Showing 2 changed files with 71 additions and 1 deletion.
17 changes: 16 additions & 1 deletion src/tbc_video_export/opts/opts_ffmpeg.py
Original file line number Diff line number Diff line change
Expand Up @@ -133,7 +133,7 @@ def add_ffmpeg_opts(config: Config, parent: argparse.ArgumentParser) -> None:

ffmpeg_opts.add_argument(
"--field-order",
type=FieldOrder,
type=_TypeFieldOrder(parent),
choices=list(FieldOrder),
default=FieldOrder.TFF,
metavar="order",
Expand Down Expand Up @@ -250,6 +250,21 @@ def __call__(
parser.exit()


class _TypeFieldOrder:
"""Return FieldOrder value if it exists."""

def __init__(self, parser: argparse.ArgumentParser) -> None:
self._parser = parser

def __call__(self, value: str) -> FieldOrder:
try:
return FieldOrder[value.upper()]
except KeyError:
self._parser.error(
f"argument --field-order: invalid FieldOrder value: '{value}'"
)


def _check_metadata_file_exists(value: str) -> Path:
"""Return metadata path if it exists."""
if (path := Path(value)).is_file():
Expand Down
55 changes: 55 additions & 0 deletions tests/test_wrappers_ffmpeg.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,9 @@

import unittest
from functools import partial
from io import StringIO
from pathlib import Path
from unittest.mock import patch

from tbc_video_export.common.enums import TBCType
from tbc_video_export.common.file_helper import FileHelper
Expand Down Expand Up @@ -137,6 +139,59 @@ def test_ffmpeg_metadata_opts(self) -> None: # noqa: D102
self.assertTrue({"-metadata", "foo=bar"}.issubset(cmd))
self.assertTrue({"-metadata", "bar=foo"}.issubset(cmd))

def test_ffmpeg_default_field_order_opt(self) -> None: # noqa: D102
_, opts = self.parse_opts([str(self.path), "pal_svideo"])
self.files = FileHelper(opts, self.config)
state = ProgramState(opts, self.config, self.files)

ffmpeg_wrapper = WrapperFFmpeg(
state,
WrapperConfig[tuple[Pipe], None](
state.current_export_mode,
TBCType.CHROMA,
input_pipes=(self.pipe, self.pipe),
output_pipes=None,
),
)

cmd = ffmpeg_wrapper.command.data

self.assertTrue(any("setfield=tff" in cmds for cmds in cmd))

def test_ffmpeg_field_order_opt(self) -> None: # noqa: D102
_, opts = self.parse_opts(
[str(self.path), "pal_svideo", "--field-order", "bff"]
)
self.files = FileHelper(opts, self.config)
state = ProgramState(opts, self.config, self.files)

ffmpeg_wrapper = WrapperFFmpeg(
state,
WrapperConfig[tuple[Pipe], None](
state.current_export_mode,
TBCType.CHROMA,
input_pipes=(self.pipe, self.pipe),
output_pipes=None,
),
)

cmd = ffmpeg_wrapper.command.data

self.assertTrue(any("setfield=bff" in cmds for cmds in cmd))

@patch("sys.stderr", new_callable=StringIO)
def test_ffmpeg_field_order_invalid_opt(self, mock_stderr: StringIO) -> None: # noqa: D102
# invalid option
with self.assertRaises(SystemExit):
_, __ = self.parse_opts(
[str(self.path), "pal_svideo", "--field-order", "invalid"]
)

self.assertRegex(
mock_stderr.getvalue(),
r"error: argument --field-order: invalid FieldOrder value: 'invalid'",
)


if __name__ == "__main__":
unittest.main()

0 comments on commit aeb02d4

Please sign in to comment.