From 03b4119ccf8cf1996e86562f9ace9523d7fcdb56 Mon Sep 17 00:00:00 2001 From: Jamie Hardt Date: Thu, 17 Sep 2026 15:05:58 -0700 Subject: [PATCH] Ruff fixes --- pyproject.toml | 14 -------------- src/pycmx/channel_map.py | 4 ++-- src/pycmx/event.py | 29 +++++++++++++++-------------- src/pycmx/parse_cmx_statements.py | 12 +++++++----- src/pycmx/transition.py | 6 +++--- src/pycmx/util.py | 4 +++- tests/test_issue_19.py | 1 + tests/test_parse.py | 30 +++++++++++++++++------------- 8 files changed, 48 insertions(+), 52 deletions(-) diff --git a/pyproject.toml b/pyproject.toml index 454af67..3e8027c 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -13,7 +13,6 @@ keywords = [ requires-python = '>3.8' classifiers = [ 'Development Status :: 5 - Production/Stable', - 'License :: OSI Approved :: MIT License', 'Topic :: Multimedia', 'Topic :: Multimedia :: Video', 'Topic :: Text Processing', @@ -60,19 +59,6 @@ indent-width = 4 [tool.ruff.format] docstring-code-line-length = 88 -# [tool.pylint] -# max-line-length = 88 -# disable = [ -# "C0103", # (invalid-name) -# "C0114", # (missing-module-docstring) -# "C0115", # (missing-class-docstring) -# "C0116", # (missing-function-docstring) -# "R0903", # (too-few-public-methods) -# "R0913", # (too-many-arguments) -# "W0105", # (pointless-string-statement) -# ] -# - [build-system] requires = ["uv_build>=0.9.18,<0.12"] build-backend = "uv_build" diff --git a/src/pycmx/channel_map.py b/src/pycmx/channel_map.py index a38aea8..d6ad19e 100644 --- a/src/pycmx/channel_map.py +++ b/src/pycmx/channel_map.py @@ -12,8 +12,8 @@ class ChannelMap: Represents a set of all the channels to which an event applies. """ - def __init__(self, v=False, audio_channels=set()): - self._audio_channel_set = audio_channels + def __init__(self, v=False, audio_channels=None): + self._audio_channel_set = audio_channels or set() self.v = v self._chan_map: dict[str, tuple] = { "V": (True, False, False), diff --git a/src/pycmx/event.py b/src/pycmx/event.py index 9ba6f5d..27650ed 100644 --- a/src/pycmx/event.py +++ b/src/pycmx/event.py @@ -1,7 +1,8 @@ # pycmx # (c) 2023-2025 Jamie Hardt +from __future__ import annotations -from typing import Any, Generator, List, Optional, Tuple +from typing import Any, Generator from .edit import Edit from .statements import ( @@ -33,7 +34,7 @@ class Event: return int(self._edit_statements()[0].event) @property - def edits(self) -> List[Edit]: + def edits(self) -> list[Edit]: """ Returns the edits. Most events will have a single edit, a single event will have multiple edits when a dissolve, wipe or key transition needs @@ -55,14 +56,14 @@ class Event: # The list the_zip contains one element for each initialization # parameter in Edit() - the_zip: List[List[Any]] = [edits_audio] + the_zip: list[list[Any]] = [edits_audio] # If there are two Clip Name statements and two edits, we look for # "FROM" and "TO" clip name lines. Otherwise we just look for on # each per edit. if len(edits_audio) == 2: - start_name: Optional[StmtClipName] = None - end_name: Optional[StmtClipName] = None + start_name: StmtClipName | None = None + end_name: StmtClipName | None = None for clip_name in clip_names: if clip_name.affect == "from": @@ -91,7 +92,7 @@ class Event: # attach effects name to last event try: trans_statement = self._trans_name_statements()[0] - trans_names: List[Optional[Any]] = [None] * (len(edits_audio) - 1) + trans_names: list[Any] = [None] * (len(edits_audio) - 1) trans_names.append(trans_statement) the_zip.append(trans_names) except IndexError: @@ -120,21 +121,21 @@ class Event: if type(s) is StmtUnrecognized: yield s - def _trans_name_statements(self) -> List[StmtEffectsName]: + def _trans_name_statements(self) -> list[StmtEffectsName]: return [s for s in self.statements if type(s) is StmtEffectsName] - def _edit_statements(self) -> List[StmtEvent]: + def _edit_statements(self) -> list[StmtEvent]: return [s for s in self.statements if type(s) is StmtEvent] - def _clip_name_statements(self) -> List[StmtClipName]: + def _clip_name_statements(self) -> list[StmtClipName]: return [s for s in self.statements if type(s) is StmtClipName] - def _source_file_statements(self) -> List[StmtSourceFile]: + def _source_file_statements(self) -> list[StmtSourceFile]: return [s for s in self.statements if type(s) is StmtSourceFile] def _statements_with_audio_ext( self, - ) -> Generator[Tuple[StmtEvent, Optional[StmtAudioExt]], None, None]: + ) -> Generator[tuple[StmtEvent, StmtAudioExt | None], None, None]: if len(self.statements) == 1 and type(self.statements[0]) is StmtEvent: yield (self.statements[0], None) @@ -146,11 +147,11 @@ class Event: elif type(s1) is StmtEvent: yield (s1, None) - def _asc_sop_statement(self) -> Optional[StmtCdlSop]: + def _asc_sop_statement(self) -> StmtCdlSop | None: return next((s for s in self.statements if type(s) is StmtCdlSop), None) - def _asc_sat_statement(self) -> Optional[StmtCdlSat]: + def _asc_sat_statement(self) -> StmtCdlSat | None: return next((s for s in self.statements if type(s) is StmtCdlSat), None) - def _frmc_statement(self) -> Optional[StmtFrmc]: + def _frmc_statement(self) -> StmtFrmc | None: return next((s for s in self.statements if type(s) is StmtFrmc), None) diff --git a/src/pycmx/parse_cmx_statements.py b/src/pycmx/parse_cmx_statements.py index ca43397..c7839a2 100644 --- a/src/pycmx/parse_cmx_statements.py +++ b/src/pycmx/parse_cmx_statements.py @@ -1,8 +1,10 @@ # pycmx # (c) 2018-2025 Jamie Hardt +from __future__ import annotations + import re -from typing import List, TextIO +from typing import TextIO from .cdl import AscSopComponents, Rgb from .statements import ( @@ -24,7 +26,7 @@ from .statements import ( from .util import collimate -def parse_cmx3600_statements(file: TextIO, tolerant: bool = False) -> List[object]: +def parse_cmx3600_statements(file: TextIO, tolerant: bool = False) -> list[object]: """ Return a list of every statement in the file argument. """ @@ -35,7 +37,7 @@ def parse_cmx3600_statements(file: TextIO, tolerant: bool = False) -> List[objec ] -def _edl_column_widths(event_field_length, source_field_length) -> List[int]: +def _edl_column_widths(event_field_length, source_field_length) -> list[int]: return [ event_field_length, 2, @@ -154,7 +156,7 @@ def _parse_remark(line, line_number) -> object: v: list[list[str]] = [[a[0] for a in b] for b in v1] - if len(v) != 3 or any([len(a) != 3 for a in v]): + if len(v) != 3 or any(len(a) != 3 for a in v): return StmtRemark(line, line_number) else: @@ -267,7 +269,7 @@ def _parse_columns_for_standard_form( raise EventFormError() return StmtEvent( - event=column_strings[0], + event=int(column_strings[0]), source=column_strings[2].strip(), channels=channels, trans=trans, diff --git a/src/pycmx/transition.py b/src/pycmx/transition.py index a36c2c0..2c2ff1a 100644 --- a/src/pycmx/transition.py +++ b/src/pycmx/transition.py @@ -1,7 +1,7 @@ # pycmx # (c) 2023 Jamie Hardt -from typing import Optional +from __future__ import annotations class Transition: @@ -22,7 +22,7 @@ class Transition: self.name = name @property - def kind(self) -> Optional[str]: + def kind(self) -> str | None: """ Return the kind of transition: Cut, Wipe, etc. """ @@ -64,7 +64,7 @@ class Transition: return int(self.operand) @property - def wipe_number(self) -> Optional[int]: + def wipe_number(self) -> int | None: "Wipes are identified by a particular number." if self.wipe: return int(self.transition[1:]) diff --git a/src/pycmx/util.py b/src/pycmx/util.py index 78ee6d2..7068d5e 100644 --- a/src/pycmx/util.py +++ b/src/pycmx/util.py @@ -3,8 +3,10 @@ # Utility functions +from __future__ import annotations -def collimate(a_string, column_widths): + +def collimate(a_string, column_widths) -> list[str]: """ Split a list-type thing, like a string, into slices that are column_widths length. diff --git a/tests/test_issue_19.py b/tests/test_issue_19.py index ff1aa25..bd63462 100644 --- a/tests/test_issue_19.py +++ b/tests/test_issue_19.py @@ -1,3 +1,4 @@ +# ruff: noqa: SIM115 from unittest import TestCase from pycmx import parse_cmx3600 diff --git a/tests/test_parse.py b/tests/test_parse.py index 15102a4..b7d007b 100644 --- a/tests/test_parse.py +++ b/tests/test_parse.py @@ -4,38 +4,42 @@ import pycmx class TestParse(TestCase): - files = [ - "INS4_R1_010417.edl", - "INS4_R1_DX_092117.edl", - "STP R1 v082517.edl", - "ToD_R4_LOCK3.1_030618_Video.edl", - "TEST.edl", - "test_edl_cdl.edl", - "INS4_R1_DX_092117.edl", - ] + + def setUp(self) -> None: + self.files = [ + "INS4_R1_010417.edl", + "INS4_R1_DX_092117.edl", + "STP R1 v082517.edl", + "ToD_R4_LOCK3.1_030618_Video.edl", + "TEST.edl", + "test_edl_cdl.edl", + "INS4_R1_DX_092117.edl", + ] + + return super().setUp() def test_event_counts(self): counts = [287, 466, 250, 376, 120, 3, 466] - for fn, count in zip(type(self).files, counts): + for fn, count in zip(self.files, counts): with open("tests/edls/" + fn, "r") as f: edl = pycmx.parse_cmx3600(f) actual = len(list(edl.events)) self.assertTrue( actual == count, - "expected %i in file %s but found %i" % (count, fn, actual), + f"expected {count} in file {fn} but found {actual}" ) def test_list_sanity(self): - for fn in type(self).files: + for fn in self.files: with open("tests/edls/" + fn, "r") as f: edl = pycmx.parse_cmx3600(f) self.assertTrue(type(edl.title) is str) self.assertTrue(len(edl.title) > 0) def test_event_sanity(self): - for fn in type(self).files: + for fn in self.files: path = "tests/edls/" + fn with open(path, "r") as f: edl = pycmx.parse_cmx3600(f)