Flake8 for docs, test, bin

This commit is contained in:
Jamie Hardt
2025-01-05 12:16:16 -08:00
parent 2adff6dd01
commit 2be779fe53
4 changed files with 87 additions and 82 deletions

View File

@@ -1,5 +1,5 @@
[flake8] [flake8]
per-file-ignores = per-file-ignores =
pycmx/__init__.py: F401 pycmx/__init__.py: F401
tests/__init__.py: F401

View File

@@ -36,9 +36,9 @@ def output_cmx(outfile, out_list):
outfile.write("TITLE: SCENE LIST\r\n") outfile.write("TITLE: SCENE LIST\r\n")
outfile.write("FCM: NON-DROP FRAME\r\n") outfile.write("FCM: NON-DROP FRAME\r\n")
for o in out_list: for i, o in enumerate(out_list):
line = "%03i AX V C 00:00:00:00 00:00:00:00 %s %s\r\n" % ( line = '%03i AX V C ' % (i)
0, o['start'], o['end']) line += '00:00:00:00 00:00:00:00 %s %s\r\n' % (o['start'], o['end'])
outfile.write(line) outfile.write(line)
outfile.write("* FROM CLIP NAME: %s\r\n" % (o['scene'])) outfile.write("* FROM CLIP NAME: %s\r\n" % (o['scene']))
@@ -85,15 +85,20 @@ def scene_list(infile, outfile, out_format, pattern):
def scene_list_cli(): def scene_list_cli():
parser = argparse.ArgumentParser( parser = argparse.ArgumentParser(
description='Read video events from an input CMX EDL and output events merged into scenes.') description='Read video events from an input CMX EDL and output '
parser.add_argument('-o', '--outfile', default=sys.stdout, type=argparse.FileType('w'), 'events merged into scenes.')
parser.add_argument('-o', '--outfile', default=sys.stdout,
type=argparse.FileType('w'),
help='Output file. Default is stdout.') help='Output file. Default is stdout.')
parser.add_argument('-f', '--format', default='cmx', type=str, parser.add_argument('-f', '--format', default='cmx', type=str,
help='Output format. Options are cols and cmx, cmx is the default.') help='Output format. Options are cols and cmx, cmx '
'is the default.')
parser.add_argument('-p', '--pattern', default='V?([A-Z]*[0-9]+)', parser.add_argument('-p', '--pattern', default='V?([A-Z]*[0-9]+)',
help='RE pattern for extracting scene name from clip name. The default is "V?([A-Z]*[0-9]+)". ' + help='RE pattern for extracting scene name from clip '
'name. The default is "V?([A-Z]*[0-9]+)". ' +
'This pattern will be matched case-insensitively.') 'This pattern will be matched case-insensitively.')
parser.add_argument('input_edl', default=sys.stdin, type=argparse.FileType('r'), nargs='?', parser.add_argument('input_edl', default=sys.stdin,
type=argparse.FileType('r'), nargs='?',
help='Input file. Default is stdin.') help='Input file. Default is stdin.')
args = parser.parse_args() args = parser.parse_args()

View File

@@ -12,22 +12,20 @@
# add these directories to sys.path here. If the directory is relative to the # add these directories to sys.path here. If the directory is relative to the
# documentation root, use os.path.abspath to make it absolute, like shown here. # documentation root, use os.path.abspath to make it absolute, like shown here.
# #
import os import os
import sys import sys
sys.path.insert(0, os.path.abspath('../..')) sys.path.insert(0, os.path.abspath('../..'))
import pycmx
# -- Project information ----------------------------------------------------- # -- Project information -----------------------------------------------------
project = u'pycmx' project = u'pycmx'
copyright = u'(c) 2023, Jamie Hardt' copyright = u'(c) 2025, Jamie Hardt'
author = u'Jamie Hardt' author = u'Jamie Hardt'
# The short X.Y version # The short X.Y version
version = pycmx.__version__
# The full version, including alpha/beta/rc tags # The full version, including alpha/beta/rc tags
release = pycmx.__version__
# -- General configuration --------------------------------------------------- # -- General configuration ---------------------------------------------------

View File

@@ -2,112 +2,114 @@ from unittest import TestCase
import pycmx import pycmx
class TestParse(TestCase): class TestParse(TestCase):
files = ["INS4_R1_010417.edl" , files = ["INS4_R1_010417.edl",
"INS4_R1_DX_092117.edl", "INS4_R1_DX_092117.edl",
"STP R1 v082517.edl", "STP R1 v082517.edl",
"ToD_R4_LOCK3.1_030618_Video.edl", "ToD_R4_LOCK3.1_030618_Video.edl",
"TEST.edl", "TEST.edl",
"test_edl_cdl.edl", "test_edl_cdl.edl",
"INS4_R1_DX_092117.edl" "INS4_R1_DX_092117.edl"
] ]
def test_event_counts(self): def test_event_counts(self):
counts = [ 287, 466, 250 , 376, 120 , 3 , 466 ] counts = [287, 466, 250, 376, 120, 3, 466]
for fn, count in zip(type(self).files, counts): for fn, count in zip(type(self).files, counts):
with open("tests/edls/" + fn ,'r') as f: with open("tests/edls/" + fn, 'r') as f:
edl = pycmx.parse_cmx3600(f) edl = pycmx.parse_cmx3600(f)
actual = len( list( edl.events )) actual = len(list(edl.events))
self.assertTrue( actual == count , self.assertTrue(actual == count,
"expected %i in file %s but found %i" % (count, fn, actual)) "expected %i in file %s but found %i"
% (count, fn, actual))
def test_list_sanity(self): def test_list_sanity(self):
for fn in type(self).files: for fn in type(self).files:
with open("tests/edls/" + fn ,'r') as f: with open("tests/edls/" + fn, 'r') as f:
edl = pycmx.parse_cmx3600(f) edl = pycmx.parse_cmx3600(f)
self.assertTrue( type(edl.title) is str ) self.assertTrue(type(edl.title) is str)
self.assertTrue( len(edl.title) > 0 ) self.assertTrue(len(edl.title) > 0)
def test_event_sanity(self): def test_event_sanity(self):
for fn in type(self).files: for fn in type(self).files:
path = "tests/edls/" + fn path = "tests/edls/" + fn
with open(path ,'r') as f: with open(path, 'r') as f:
edl = pycmx.parse_cmx3600(f) edl = pycmx.parse_cmx3600(f)
for index, event in enumerate(edl.events): for index, event in enumerate(edl.events):
self.assertTrue( len(event.edits) > 0 ) self.assertTrue(len(event.edits) > 0)
self.assertTrue( event.number == index + 1 ) self.assertTrue(event.number == index + 1)
def test_events(self): def test_events(self):
with open("tests/edls/TEST.edl",'r') as f: with open("tests/edls/TEST.edl", 'r') as f:
edl = pycmx.parse_cmx3600(f) edl = pycmx.parse_cmx3600(f)
events = list( edl.events ) events = list(edl.events)
self.assertEqual( events[0].number , 1) self.assertEqual(events[0].number, 1)
self.assertEqual( events[0].edits[0].source , "OY_HEAD_") self.assertEqual(events[0].edits[0].source, "OY_HEAD_")
self.assertEqual( events[0].edits[0].clip_name , "HEAD LEADER MONO") self.assertEqual(events[0].edits[0].clip_name, "HEAD LEADER MONO")
self.assertEqual( events[0].edits[0].source_file , "OY_HEAD_LEADER.MOV") self.assertEqual(
self.assertEqual( events[0].edits[0].source_in , "00:00:00:00") events[0].edits[0].source_file, "OY_HEAD_LEADER.MOV")
self.assertEqual( events[0].edits[0].source_out , "00:00:00:00") self.assertEqual(events[0].edits[0].source_in, "00:00:00:00")
self.assertEqual( events[0].edits[0].record_in , "01:00:00:00") self.assertEqual(events[0].edits[0].source_out, "00:00:00:00")
self.assertEqual( events[0].edits[0].record_out , "01:00:08:00") self.assertEqual(events[0].edits[0].record_in, "01:00:00:00")
self.assertTrue( events[0].edits[0].transition.kind == pycmx.Transition.Cut) self.assertEqual(events[0].edits[0].record_out, "01:00:08:00")
self.assertTrue(
events[0].edits[0].transition.kind == pycmx.Transition.Cut)
def test_channel_map(self): def test_channel_map(self):
with open("tests/edls/TEST.edl",'r') as f: with open("tests/edls/TEST.edl", 'r') as f:
edl = pycmx.parse_cmx3600(f) edl = pycmx.parse_cmx3600(f)
events = list( edl.events ) events = list(edl.events)
self.assertFalse( events[0].edits[0].channels.video) self.assertFalse(events[0].edits[0].channels.video)
self.assertFalse( events[0].edits[0].channels.a1) self.assertFalse(events[0].edits[0].channels.a1)
self.assertTrue( events[0].edits[0].channels.a2) self.assertTrue(events[0].edits[0].channels.a2)
self.assertTrue( events[2].edits[0].channels.get_audio_channel(7) ) self.assertTrue(events[2].edits[0].channels.get_audio_channel(7))
self.assertTrue( events[2].edits[0].channels.audio) self.assertTrue(events[2].edits[0].channels.audio)
def test_multi_edit_events(self): def test_multi_edit_events(self):
with open("tests/edls/TEST.edl",'r') as f: with open("tests/edls/TEST.edl", 'r') as f:
edl = pycmx.parse_cmx3600(f) edl = pycmx.parse_cmx3600(f)
events = list( edl.events ) events = list(edl.events)
self.assertEqual( events[42].number , 43) self.assertEqual(events[42].number, 43)
self.assertEqual( len(events[42].edits), 2) self.assertEqual(len(events[42].edits), 2)
self.assertEqual( events[42].edits[0].source , "TC_R1_V1") self.assertEqual(events[42].edits[0].source, "TC_R1_V1")
self.assertEqual( events[42].edits[0].clip_name , "TC R1 V1.2 TEMP1 FX ST.WAV") self.assertEqual(events[42].edits[0].clip_name,
self.assertEqual( events[42].edits[0].source_in , "00:00:00:00") "TC R1 V1.2 TEMP1 FX ST.WAV")
self.assertEqual( events[42].edits[0].source_out , "00:00:00:00") self.assertEqual(events[42].edits[0].source_in, "00:00:00:00")
self.assertEqual( events[42].edits[0].record_in , "01:08:56:09") self.assertEqual(events[42].edits[0].source_out, "00:00:00:00")
self.assertEqual( events[42].edits[0].record_out , "01:08:56:09") self.assertEqual(events[42].edits[0].record_in, "01:08:56:09")
self.assertTrue( events[42].edits[0].transition.kind == pycmx.Transition.Cut) self.assertEqual(events[42].edits[0].record_out, "01:08:56:09")
self.assertTrue(
events[42].edits[0].transition.kind == pycmx.Transition.Cut)
self.assertEqual( events[42].edits[1].source , "TC_R1_V6") self.assertEqual(events[42].edits[1].source, "TC_R1_V6")
self.assertEqual( events[42].edits[1].clip_name , "TC R1 V6 TEMP2 ST FX.WAV") self.assertEqual(events[42].edits[1].clip_name,
self.assertEqual( events[42].edits[1].source_in , "00:00:00:00") "TC R1 V6 TEMP2 ST FX.WAV")
self.assertEqual( events[42].edits[1].source_out , "00:00:00:00") self.assertEqual(events[42].edits[1].source_in, "00:00:00:00")
self.assertEqual( events[42].edits[1].record_in , "01:08:56:09") self.assertEqual(events[42].edits[1].source_out, "00:00:00:00")
self.assertEqual( events[42].edits[1].record_out , "01:08:56:11") self.assertEqual(events[42].edits[1].record_in, "01:08:56:09")
self.assertTrue( events[42].edits[1].transition.kind == pycmx.Transition.Dissolve) self.assertEqual(events[42].edits[1].record_out, "01:08:56:11")
self.assertTrue(
events[42].edits[1].transition.kind ==
pycmx.Transition.Dissolve)
def test_line_numbers(self): def test_line_numbers(self):
with open("tests/edls/ToD_R4_LOCK3.1_030618_Video.edl") as f: with open("tests/edls/ToD_R4_LOCK3.1_030618_Video.edl") as f:
edl = pycmx.parse_cmx3600(f) edl = pycmx.parse_cmx3600(f)
events = list( edl.events ) events = list(edl.events)
self.assertEqual( events[0].edits[0].line_number, 2) self.assertEqual(events[0].edits[0].line_number, 2)
self.assertEqual( events[14].edits[0].line_number, 45) self.assertEqual(events[14].edits[0].line_number, 45)
self.assertEqual( events[180].edits[0].line_number, 544) self.assertEqual(events[180].edits[0].line_number, 544)
def test_transition_name(self): def test_transition_name(self):
with open("tests/edls/test_25.edl","r") as f: with open("tests/edls/test_25.edl", "r") as f:
edl = pycmx.parse_cmx3600(f) edl = pycmx.parse_cmx3600(f)
events = list(edl.events) events = list(edl.events)
self.assertEqual( events[4].edits[1].transition.name , "CROSS DISSOLVE" ) self.assertEqual(
events[4].edits[1].transition.name, "CROSS DISSOLVE")
# add test for edit_list.channels