diff --git a/nulrdcscripts/tools/errortool/README.md b/nulrdcscripts/tools/errortool/README.md new file mode 100644 index 0000000..8975006 --- /dev/null +++ b/nulrdcscripts/tools/errortool/README.md @@ -0,0 +1,21 @@ +Version Date: 11/5/2024 + +Document Owner: Sophia Francis + +Software Used: None + +# Description +This is a script that is used to run a tkinter window that allows for data collection for video materials either in the capture or QC phase. + +# Installation Instructions +This script runs through poetry and can be installed and updated from it. + +## Usage + +``` +poetry run errorgui +``` + +Notes: + +The CSV will be saved to the location in the params.py file. You can change where the default folder is here and it will be titled with the project id number. \ No newline at end of file diff --git a/nulrdcscripts/tools/errortool/__init__.py b/nulrdcscripts/tools/errortool/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/nulrdcscripts/tools/errortool/main.py b/nulrdcscripts/tools/errortool/main.py new file mode 100644 index 0000000..37f8062 --- /dev/null +++ b/nulrdcscripts/tools/errortool/main.py @@ -0,0 +1,696 @@ +# Many thanks to Code First with Hala on Youtube for her video Tkinter Data Entry Form tutorial for beginners - Python GUI project [responsive layout] +import os +import openpyxl +import tkinter as tkin +from tkinter import scrolledtext, messagebox +from nulrdcscripts.tools.errortool.params import args + + +def main(): + window = tkin.Tk() + window.title("Error Entry Form") + + frame = tkin.Frame(window) + frame.pack() + + def enter_data(): + + video_id = video_id_entry.get() + video_title = video_title_entry.get() + project_id = project_id_entry.get() + + if video_id and video_title and project_id: + runtime = run_time_entry.get() + audiobuzz = audiobuzz_check_var.get() + audiocrackle = audiocrackle_check_var.get() + audiodistortion = audiodistortion_check_var.get() + audiodrop = audiodrop_check_var.get() + audiomuffled = audiomuffled_check_var.get() + audionoise = audionoise_check_var.get() + bearding = bearding_check_var.get() + carrierleak = carrier_leak_check_var.get() + colorsmear = color_smearing_check_var.get() + creased = creased_check_var.get() + chromnoise = chromnoise_check_var.get() + crosstalk = crosstalk_check_var.get() + crushed = crushed_check_var.get() + dihedralmal = dihedral_check_var.get() + dotcrawl = dotcrawl_check_var.get() + dropouts = dropouts_check_var.get() + egli = egli_check_var.get() + fluorescentstrobe = fluorescent_check_var.get() + ghosting = ghost_check_var.get() + headclogging = headclog_check_var.get() + hHold = horiHold_check_var.get() + hueError = hueError_check_var.get() + humTrouble = hum_check_var.get() + incTVStand = incomp_TVStand_var.get() + incFam = incomp_inFam_var.get() + expanshrink = expanshrink_check_var.get() + longPlay = longPlay_check_var.get() + lossColor = losscolor_check_var.get() + moire = moire_check_var.get() + scratchwear = scratchwear_check_var.get() + shiftedheadswitch = shiftheadswitch_check_var.get() + skew = skew_check_var.get() + stickyshed = stick_check_var.get() + stiction = stiction_check_var.get() + scpe = scpe_check_var.get() + tapeDeform = deform_check_var.get() + tapeMisalign = misalign_check_var.get() + quilting = quilting_check_var.get() + ringing = ringing_check_var.get() + tBCError = tBCError_check_var.get() + tracking = track_check_var.get() + vgae = vgae_check_var.get() + ycdelay = ycdelay_check_var.get() + ven = ven_check_var.get() + vhold = vhold_check_var.get() + vPictJump = vPictJump_check_var.get() + vsync = vsync_check_var.get() + visibleFrame = visibleFrameLine_check_var.get() + additionalNotes = notes_entry.get("1.0", tkin.END) + + video_errors = [ + audiobuzz, + audiocrackle, + audiodrop, + audiodistortion, + audiomuffled, + audionoise, + bearding, + carrierleak, + colorsmear, + creased, + chromnoise, + crosstalk, + crushed, + dihedralmal, + dotcrawl, + dropouts, + egli, + fluorescentstrobe, + ghosting, + headclogging, + hHold, + hueError, + humTrouble, + incTVStand, + incFam, + expanshrink, + longPlay, + lossColor, + moire, + scratchwear, + shiftedheadswitch, + skew, + stickyshed, + stiction, + scpe, + tapeDeform, + tapeMisalign, + quilting, + ringing, + tBCError, + tracking, + vgae, + ycdelay, + ven, + vhold, + vPictJump, + vsync, + visibleFrame, + additionalNotes, + ] + errors = "; ".join([x for x in video_errors if x != "Absent"]) + + file_output = os.path.abspath(args.output_path) + xlsx_file = os.path.abspath((file_output + "/" + project_id + ".xlsx")) + if not os.path.exists(xlsx_file): # if there is no is no xlsx file already named this + wb=openpyxl.Workbook() + sheet=wb.active + heading=["Project ID","Video ID","Video Title","Run Time (Mins)", "Log"] + sheet.append(heading) + wb.save(xlsx_file) + wb=openpyxl.load_workbook(xlsx_file) + sheet=wb.active + sheet.append([project_id,video_id,video_title,runtime,errors]) + wb.save(xlsx_file) + + + else: + tkin.messagebox.showwarning( + title="Error", + message="You have not entered a project id, a video id, and/or a video title. Please re-enter data.", + ) + + # Saving video Information + + # Setting up labels + video_info_frame = tkin.LabelFrame( + frame, text="Video Information", padx=20, pady=20 + ) + video_info_frame.pack(fill=tkin.BOTH, expand=True) + video_title = tkin.Label(video_info_frame, text="Video Title") + video_title.grid(row=0, column=0) + video_id = tkin.Label(video_info_frame, text="Video Identifier") + video_id.grid(row=0, column=1) + project_id = tkin.Label(video_info_frame, text="Project ID") + project_id.grid(row=0, column=2) + run_time = tkin.Label(video_info_frame, text="Runtime (Mins)") + run_time.grid(row=0, column=3) + + # Setting up entry boxes + + video_title_entry = tkin.Entry(video_info_frame) + video_id_entry = tkin.Entry(video_info_frame) + project_id_entry = tkin.Entry(video_info_frame) + run_time_entry = tkin.Spinbox(video_info_frame, from_="0", to="500") + video_title_entry.grid(row=1, column=0) + video_id_entry.grid(row=1, column=1) + project_id_entry.grid(row=1, column=2) + run_time_entry.grid(row=1, column=3) + + for widget in video_info_frame.winfo_children(): + widget.grid_configure(padx=10, pady=5) + + # Saving video errors + errors_frame = tkin.LabelFrame(frame, text="Errors Present", padx=20, pady=20) + errors_frame.pack(fill=tkin.BOTH, expand=True) + audiobuzz_check_var = tkin.StringVar(value="Absent") + audiobuzz_check = tkin.Checkbutton( + errors_frame, + text="Audio Buzz/Hum", + variable=audiobuzz_check_var, + onvalue="Audio Buzz/Hum", + offvalue="Absent", + ) + audiocrackle_check_var = tkin.StringVar(value="Absent") + audiocrackle_check = tkin.Checkbutton( + errors_frame, + text="Audio Crackle", + variable=audiocrackle_check_var, + onvalue="Audio Crackle", + offvalue="Absent", + ) + audiodistortion_check_var = tkin.StringVar(value="Absent") + audiodistortion_check = tkin.Checkbutton( + errors_frame, + text="Audio Distortion", + variable=audiodistortion_check_var, + onvalue="Audio Distortion", + offvalue="Absent", + ) + audiodrop_check_var = tkin.StringVar(value="Absent") + audiodrop_check = tkin.Checkbutton( + errors_frame, + text="Audio Dropout", + variable=audiodrop_check_var, + onvalue="Audio Dropout", + offvalue="Absent", + ) + audiomuffled_check_var = tkin.StringVar(value="Absent") + audiomuffled_check = tkin.Checkbutton( + errors_frame, + text="Audio Muffled", + variable=audiomuffled_check_var, + onvalue="Audio Muffled", + offvalue="Absent", + ) + audionoise_check_var = tkin.StringVar(value="Absent") + audionoise_check = tkin.Checkbutton( + errors_frame, + text="Audio Noise", + variable=audionoise_check_var, + onvalue="Audio Noise", + offvalue="Absent", + ) + bearding_check_var = tkin.StringVar(value="Absent") + bearding_check = tkin.Checkbutton( + errors_frame, + text="Bearding", + variable=bearding_check_var, + onvalue="Bearding", + offvalue="Absent", + ) + carrier_leak_check_var = tkin.StringVar(value="Absent") + carrier_leak_check = tkin.Checkbutton( + errors_frame, + text="Carrier Leak", + variable=carrier_leak_check_var, + onvalue="Carrier Leak", + offvalue="Absent", + ) + color_smearing_check_var = tkin.StringVar(value="Absent") + color_smearing_check = tkin.Checkbutton( + errors_frame, + text="Color Smearing", + variable=color_smearing_check_var, + onvalue="Color Smearing", + offvalue="Absent", + ) + creased_check_var = tkin.StringVar(value="Absent") + creased_check = tkin.Checkbutton( + errors_frame, + text="Creased or Crumpled Tape", + variable=creased_check_var, + onvalue="Creased or Crumpled Tape", + offvalue="Absent", + ) + chromnoise_check_var = tkin.StringVar(value="Absent") + chromnoise_check = tkin.Checkbutton( + errors_frame, + text="Chrominance Noise", + variable=chromnoise_check_var, + onvalue="Chrominance Noise", + offvalue="Absent", + ) + crosstalk_check_var = tkin.StringVar(value="Absent") + crosstalk_check = tkin.Checkbutton( + errors_frame, + text="Crosstalk", + variable=crosstalk_check_var, + onvalue="Crosstalk", + offvalue="Absent", + ) + crushed_check_var = tkin.StringVar(value="Absent") + crushed_check = tkin.Checkbutton( + errors_frame, + text="Chrushed Setup", + variable=crushed_check_var, + onvalue="Crushed Setup", + offvalue="Absent", + ) + dihedral_check_var = tkin.StringVar(value="Absent") + dihedral_check = tkin.Checkbutton( + errors_frame, + text="Dihedral Maladjustment", + variable=dihedral_check_var, + onvalue="Dihedral Maladjustment", + offvalue="Absent", + ) + dotcrawl_check_var = tkin.StringVar(value="Absent") + dotcrawl_check = tkin.Checkbutton( + errors_frame, + text="Dot Crawl", + variable=dotcrawl_check_var, + onvalue="Dot Crawl", + offvalue="Absent", + ) + dropouts_check_var = tkin.StringVar(value="Absent") + dropouts_check = tkin.Checkbutton( + errors_frame, + text="Dropouts and Dropout Compensation", + variable=dropouts_check_var, + onvalue="Dropouts & Dropout Compensation", + offvalue="Absent", + ) + egli_check_var = tkin.StringVar(value="Absent") + egli_check = tkin.Checkbutton( + errors_frame, + text="Electrical Ground Loop Interference", + variable=egli_check_var, + onvalue="Electrical Ground Loop Interference", + offvalue="Absent", + ) + fluorescent_check_var = tkin.StringVar(value="Absent") + fluorescent_check = tkin.Checkbutton( + errors_frame, + text="Fluorescent Strobing", + variable=fluorescent_check_var, + onvalue="Fluorescent Strobing", + offvalue="Absent", + ) + ghost_check_var = tkin.StringVar(value="Absent") + ghost_check = tkin.Checkbutton( + errors_frame, + text="Ghosting", + variable=ghost_check_var, + onvalue="Ghosting", + offvalue="Absent", + ) + headclog_check_var = tkin.StringVar(value="Absent") + headclog_check = tkin.Checkbutton( + errors_frame, + text="Headclogging", + variable=headclog_check_var, + onvalue="Headclogging", + offvalue="Absent", + ) + horiHold_check_var = tkin.StringVar(value="Absent") + horiHold_check = tkin.Checkbutton( + errors_frame, + text="Horizontal Hold", + variable=horiHold_check_var, + onvalue="Horizontal Hold", + offvalue="Absent", + ) + hueError_check_var = tkin.StringVar(value="Absent") + hueError_check = tkin.Checkbutton( + errors_frame, + text="Hue Error NTSC", + variable=hueError_check_var, + onvalue="Hue Error", + offvalue="Absent", + ) + hum_check_var = tkin.StringVar(value="Absent") + hum_check = tkin.Checkbutton( + errors_frame, + text="Hum Trouble", + variable=hum_check_var, + onvalue="Hum Trouble", + offvalue="Absent", + ) + incomp_TVStand_var = tkin.StringVar(value="Absent") + incomp_TVStand = tkin.Checkbutton( + errors_frame, + text="Incompatibility TV Standards", + variable=incomp_TVStand_var, + onvalue="Incompatibility in TV Standards", + offvalue="Absent", + ) + incomp_inFam_var = tkin.StringVar(value="Absent") + incomp_inFam = tkin.Checkbutton( + errors_frame, + text="Incompatibility in family of formats", + variable=incomp_inFam_var, + onvalue="Incompatibility in Family of Formats", + offvalue="Absent", + ) + expanshrink_check_var = tkin.StringVar(value="Absent") + expanshrink_check = tkin.Checkbutton( + errors_frame, + text="Tape Expansion or Shrinkage", + variable=expanshrink_check_var, + onvalue="Tape Expansion or Shrinkage", + offvalue="Absent", + ) + longPlay_check_var = tkin.StringVar(value="Absent") + longPlay_check = tkin.Checkbutton( + errors_frame, + text="Long Play", + variable=longPlay_check_var, + onvalue="Long Play", + offvalue="Absent", + ) + losscolor_check_var = tkin.StringVar(value="Absent") + losscolor_check = tkin.Checkbutton( + errors_frame, + text="Loss of Color Lock", + variable=losscolor_check_var, + onvalue="Loss of Color Lock", + offvalue="Absent", + ) + moire_check_var = tkin.StringVar(value="Absent") + moire_check = tkin.Checkbutton( + errors_frame, + text="Moire Effect", + variable=moire_check_var, + onvalue="Moire Effect", + offvalue="Absent", + ) + scratchwear_check_var = tkin.StringVar(value="Absent") + scratchwear_check = tkin.Checkbutton( + errors_frame, + text="Scratches and Tape Wear", + variable=scratchwear_check_var, + onvalue="Scratches and Tape Wear", + offvalue="Absent", + ) + shiftheadswitch_check_var = tkin.StringVar(value="Absent") + shiftheadswitch_check = tkin.Checkbutton( + errors_frame, + text="Shifted Head Switching Point", + variable=shiftheadswitch_check_var, + onvalue="Headswitching Noise", + offvalue="Absent", + ) + skew_check_var = tkin.StringVar(value="Absent") + skew_check = tkin.Checkbutton( + errors_frame, + text="Skew Error", + variable=skew_check_var, + onvalue="Skew Error", + offvalue="Absent", + ) + stick_check_var = tkin.StringVar(value="Absent") + stick_check = tkin.Checkbutton( + errors_frame, + text="Sticky Tape Syndrome", + variable=stick_check_var, + onvalue="Sticky Tape Syndrome", + offvalue="Absent", + ) + stiction_check_var = tkin.StringVar(value="Absent") + stiction_check = tkin.Checkbutton( + errors_frame, + text="Stiction", + variable=stiction_check_var, + onvalue="Stiction", + offvalue="Absent", + ) + scpe_check_var = tkin.StringVar(value="Absent") + scpe_check = tkin.Checkbutton( + errors_frame, + text="Subcarrier Phase Error", + variable=scpe_check_var, + onvalue="Subcarrier Phase Error", + offvalue="Absent", + ) + deform_check_var = tkin.StringVar(value="Absent") + deform_check = tkin.Checkbutton( + errors_frame, + text="Tape Deformation", + variable=deform_check_var, + onvalue="Tape Deformation", + offvalue="Absent", + ) + misalign_check_var = tkin.StringVar(value="Absent") + misalign_check = tkin.Checkbutton( + errors_frame, + text="Tape Misalignment", + variable=misalign_check_var, + onvalue="Tape Misalignment", + offvalue="Absent", + ) + quilting_check_var = tkin.StringVar(value="Absent") + quilting_check = tkin.Checkbutton( + errors_frame, + text="Quilting", + variable=quilting_check_var, + onvalue="Quilting", + offvalue="Absent", + ) + ringing_check_var = tkin.StringVar(value="Absent") + ringing_check = tkin.Checkbutton( + errors_frame, + text="Ringing", + variable=ringing_check_var, + onvalue="Ringing", + offvalue="Absent", + ) + tBCError_check_var = tkin.StringVar(value="Absent") + tBCError_check = tkin.Checkbutton( + errors_frame, + text="TBC Error", + variable=tBCError_check_var, + onvalue="TBC Error", + offvalue="Absent", + ) + track_check_var = tkin.StringVar(value="Absent") + track_check = tkin.Checkbutton( + errors_frame, + text="Tracking Error", + variable=track_check_var, + onvalue="Tracking Error", + offvalue="Absent", + ) + vgae_check_var = tkin.StringVar(value="Absent") + vgae_check = tkin.Checkbutton( + errors_frame, + text="Vacuum Guide Adjustment Error", + variable=vgae_check_var, + onvalue="Vacuum Guide Adjustment Error", + offvalue="Absent", + ) + ycdelay_check_var = tkin.StringVar(value="Absent") + ycdelay_check = tkin.Checkbutton( + errors_frame, + text="Y/C Delay Error", + variable=ycdelay_check_var, + onvalue="Y/C Delay Error", + offvalue="Absent", + ) + ven_check_var = tkin.StringVar(value="Absent") + ven_check = tkin.Checkbutton( + errors_frame, + text="Venetian-Blind Effect PAL", + variable=ven_check_var, + onvalue="Venetian-Blind Effect", + offvalue="Absent", + ) + vhold_check_var = tkin.StringVar(value="Absent") + vhold_check = tkin.Checkbutton( + errors_frame, + text="Vertical Hold", + variable=vhold_check_var, + onvalue="Vertical Hold", + offvalue="Absent", + ) + vPictJump_check_var = tkin.StringVar(value="Absent") + vPictJump_check = tkin.Checkbutton( + errors_frame, + text="Vertical Picture Jumping", + variable=vPictJump_check_var, + onvalue="Vertical Picture Jumping", + offvalue="Absent", + ) + vsync_check_var = tkin.StringVar(value="Absent") + vsync_check = tkin.Checkbutton( + errors_frame, + text="Vertical Synchronization Error", + variable=vsync_check_var, + onvalue="VSync Error", + offvalue="Absent", + ) + visibleFrameLine_check_var = tkin.StringVar(value="Absent") + visibleFrameLine_check = tkin.Checkbutton( + errors_frame, + text="Visible Frame Line", + variable=visibleFrameLine_check_var, + onvalue="Visible Frame Line", + offvalue="Absent", + ) + + audiobuzz_check.grid(row=1, column=0) + audiocrackle_check.grid(row=2, column=0) + audiodistortion_check.grid(row=3, column=0) + audiodrop_check.grid(row=4, column=0) + audiomuffled_check.grid(row=5, column=0) + audionoise_check.grid(row=6, column=0) + bearding_check.grid(row=7, column=0) + carrier_leak_check.grid(row=8, column=0) + color_smearing_check.grid(row=9, column=0) + creased_check.grid(row=10, column=0) + chromnoise_check.grid(row=11, column=0) + crosstalk_check.grid(row=12, column=0) + crushed_check.grid(row=1, column=1) + dihedral_check.grid(row=2, column=1) + dotcrawl_check.grid(row=3, column=1) + dropouts_check.grid(row=4, column=1) + egli_check.grid(row=5, column=1) + fluorescent_check.grid(row=6, column=1) + ghost_check.grid(row=7, column=1) + headclog_check.grid(row=8, column=1) + horiHold_check.grid(row=9, column=1) + hueError_check.grid(row=10, column=1) + hum_check.grid(row=11, column=1) + incomp_TVStand.grid(row=12, column=1) + incomp_inFam.grid(row=1, column=2) + expanshrink_check.grid(row=2, column=2) + longPlay_check.grid(row=3, column=2) + losscolor_check.grid(row=4, column=2) + moire_check.grid(row=5, column=2) + scratchwear_check.grid(row=6, column=2) + shiftheadswitch_check.grid(row=7, column=2) + skew_check.grid(row=8, column=2) + stick_check.grid(row=9, column=2) + stiction_check.grid(row=10, column=2) + scpe_check.grid(row=11, column=2) + deform_check.grid(row=12, column=2) + misalign_check.grid(row=1, column=3) + quilting_check.grid(row=2, column=3) + ringing_check.grid(row=3, column=3) + tBCError_check.grid(row=4, column=3) + track_check.grid(row=5, column=3) + vgae_check.grid(row=6, column=3) + ycdelay_check.grid(row=7, column=3) + ven_check.grid(row=8, column=3) + vhold_check.grid(row=9, column=3) + vPictJump_check.grid(row=10, column=3) + vsync_check.grid(row=11, column=3) + visibleFrameLine_check.grid(row=12, column=3) + + for widget in errors_frame.winfo_children(): + widget.grid_configure(padx=10, pady=5, sticky="NW") + + # Setting up freeform entry + + notes_entry_frame = tkin.LabelFrame( + frame, text=" Additional Notes", padx=20, pady=20 + ) + notes_entry_frame.pack(fill=tkin.BOTH, expand=True) + notes_entry = tkin.scrolledtext.ScrolledText(notes_entry_frame) + notes_entry.pack(fill=tkin.BOTH, expand=True) + + # Button setup + submit_button = tkin.Button( + frame, text="Submit Error Report", padx=20, pady=20, command=enter_data + ) + submit_button.pack(fill="x", padx=10, pady=10) + + # Reset Button + def reset_form(): + project_id_entry.delete(0, tkin.END) + video_id_entry.delete(0, tkin.END) + video_title_entry.delete(0, tkin.END) + run_time_entry.delete(0, tkin.END) + audiobuzz_check.deselect() + audiocrackle_check.deselect() + audiodistortion_check.deselect() + audiodrop_check.deselect() + audiomuffled_check.deselect() + audionoise_check.deselect() + bearding_check.deselect() + carrier_leak_check.deselect() + color_smearing_check.deselect() + creased_check.deselect() + chromnoise_check.deselect() + crosstalk_check.deselect() + crushed_check.deselect() + dihedral_check.deselect() + dotcrawl_check.deselect() + dropouts_check.deselect() + egli_check.deselect() + ghost_check.deselect() + headclog_check.deselect() + horiHold_check.deselect() + hueError_check.deselect() + hum_check.deselect() + incomp_TVStand.deselect() + incomp_inFam.deselect() + expanshrink_check.deselect() + longPlay_check.deselect() + losscolor_check.deselect() + moire_check.deselect() + scratchwear_check.deselect() + shiftheadswitch_check.deselect() + skew_check.deselect() + stick_check.deselect() + stiction_check.deselect() + scpe_check.deselect() + deform_check.deselect() + misalign_check.deselect() + quilting_check.deselect() + ringing_check.deselect() + tBCError_check.deselect() + track_check.deselect() + vgae_check.deselect() + ycdelay_check.deselect() + ven_check.deselect() + vhold_check.deselect() + vPictJump_check.deselect() + vsync_check.deselect() + visibleFrameLine_check.deselect() + notes_entry.delete(1.0, tkin.END) + + reset_button = tkin.Button( + frame, text="Reset Form", padx=20, pady=20, command=reset_form + ) + reset_button.pack(fill="x", padx=10, pady=10) + + window.mainloop() + + +if __name__ == "__main__": + main() diff --git a/nulrdcscripts/tools/errortool/params.py b/nulrdcscripts/tools/errortool/params.py new file mode 100644 index 0000000..51e91f5 --- /dev/null +++ b/nulrdcscripts/tools/errortool/params.py @@ -0,0 +1,14 @@ +import argparse + +parser = argparse.ArgumentParser() + +parser.add_argument( + "--output", + "-o", + action="store", + dest="output_path", + default = "Z:\\RDC\\ACTIVE_AV\\errorReports", + type=str, + help="full path to output folder", +) +args = parser.parse_args() \ No newline at end of file diff --git a/poetry.lock b/poetry.lock index ef2fcc5..bebe8c5 100644 --- a/poetry.lock +++ b/poetry.lock @@ -1,7 +1,228 @@ # This file is automatically @generated by Poetry 1.7.0 and should not be changed by hand. -package = [] + +[[package]] +name = "et-xmlfile" +version = "2.0.0" +description = "An implementation of lxml.xmlfile for the standard library" +optional = false +python-versions = ">=3.8" +files = [ + {file = "et_xmlfile-2.0.0-py3-none-any.whl", hash = "sha256:7a91720bc756843502c3b7504c77b8fe44217c85c537d85037f0f536151b2caa"}, + {file = "et_xmlfile-2.0.0.tar.gz", hash = "sha256:dab3f4764309081ce75662649be815c4c9081e88f0837825f90fd28317d4da54"}, +] + +[[package]] +name = "numpy" +version = "2.1.3" +description = "Fundamental package for array computing in Python" +optional = false +python-versions = ">=3.10" +files = [ + {file = "numpy-2.1.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:c894b4305373b9c5576d7a12b473702afdf48ce5369c074ba304cc5ad8730dff"}, + {file = "numpy-2.1.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:b47fbb433d3260adcd51eb54f92a2ffbc90a4595f8970ee00e064c644ac788f5"}, + {file = "numpy-2.1.3-cp310-cp310-macosx_14_0_arm64.whl", hash = "sha256:825656d0743699c529c5943554d223c021ff0494ff1442152ce887ef4f7561a1"}, + {file = "numpy-2.1.3-cp310-cp310-macosx_14_0_x86_64.whl", hash = "sha256:6a4825252fcc430a182ac4dee5a505053d262c807f8a924603d411f6718b88fd"}, + {file = "numpy-2.1.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e711e02f49e176a01d0349d82cb5f05ba4db7d5e7e0defd026328e5cfb3226d3"}, + {file = "numpy-2.1.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:78574ac2d1a4a02421f25da9559850d59457bac82f2b8d7a44fe83a64f770098"}, + {file = "numpy-2.1.3-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:c7662f0e3673fe4e832fe07b65c50342ea27d989f92c80355658c7f888fcc83c"}, + {file = "numpy-2.1.3-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:fa2d1337dc61c8dc417fbccf20f6d1e139896a30721b7f1e832b2bb6ef4eb6c4"}, + {file = "numpy-2.1.3-cp310-cp310-win32.whl", hash = "sha256:72dcc4a35a8515d83e76b58fdf8113a5c969ccd505c8a946759b24e3182d1f23"}, + {file = "numpy-2.1.3-cp310-cp310-win_amd64.whl", hash = "sha256:ecc76a9ba2911d8d37ac01de72834d8849e55473457558e12995f4cd53e778e0"}, + {file = "numpy-2.1.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:4d1167c53b93f1f5d8a139a742b3c6f4d429b54e74e6b57d0eff40045187b15d"}, + {file = "numpy-2.1.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:c80e4a09b3d95b4e1cac08643f1152fa71a0a821a2d4277334c88d54b2219a41"}, + {file = "numpy-2.1.3-cp311-cp311-macosx_14_0_arm64.whl", hash = "sha256:576a1c1d25e9e02ed7fa5477f30a127fe56debd53b8d2c89d5578f9857d03ca9"}, + {file = "numpy-2.1.3-cp311-cp311-macosx_14_0_x86_64.whl", hash = "sha256:973faafebaae4c0aaa1a1ca1ce02434554d67e628b8d805e61f874b84e136b09"}, + {file = "numpy-2.1.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:762479be47a4863e261a840e8e01608d124ee1361e48b96916f38b119cfda04a"}, + {file = "numpy-2.1.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bc6f24b3d1ecc1eebfbf5d6051faa49af40b03be1aaa781ebdadcbc090b4539b"}, + {file = "numpy-2.1.3-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:17ee83a1f4fef3c94d16dc1802b998668b5419362c8a4f4e8a491de1b41cc3ee"}, + {file = "numpy-2.1.3-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:15cb89f39fa6d0bdfb600ea24b250e5f1a3df23f901f51c8debaa6a5d122b2f0"}, + {file = "numpy-2.1.3-cp311-cp311-win32.whl", hash = "sha256:d9beb777a78c331580705326d2367488d5bc473b49a9bc3036c154832520aca9"}, + {file = "numpy-2.1.3-cp311-cp311-win_amd64.whl", hash = "sha256:d89dd2b6da69c4fff5e39c28a382199ddedc3a5be5390115608345dec660b9e2"}, + {file = "numpy-2.1.3-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:f55ba01150f52b1027829b50d70ef1dafd9821ea82905b63936668403c3b471e"}, + {file = "numpy-2.1.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:13138eadd4f4da03074851a698ffa7e405f41a0845a6b1ad135b81596e4e9958"}, + {file = "numpy-2.1.3-cp312-cp312-macosx_14_0_arm64.whl", hash = "sha256:a6b46587b14b888e95e4a24d7b13ae91fa22386c199ee7b418f449032b2fa3b8"}, + {file = "numpy-2.1.3-cp312-cp312-macosx_14_0_x86_64.whl", hash = "sha256:0fa14563cc46422e99daef53d725d0c326e99e468a9320a240affffe87852564"}, + {file = "numpy-2.1.3-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8637dcd2caa676e475503d1f8fdb327bc495554e10838019651b76d17b98e512"}, + {file = "numpy-2.1.3-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2312b2aa89e1f43ecea6da6ea9a810d06aae08321609d8dc0d0eda6d946a541b"}, + {file = "numpy-2.1.3-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:a38c19106902bb19351b83802531fea19dee18e5b37b36454f27f11ff956f7fc"}, + {file = "numpy-2.1.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:02135ade8b8a84011cbb67dc44e07c58f28575cf9ecf8ab304e51c05528c19f0"}, + {file = "numpy-2.1.3-cp312-cp312-win32.whl", hash = "sha256:e6988e90fcf617da2b5c78902fe8e668361b43b4fe26dbf2d7b0f8034d4cafb9"}, + {file = "numpy-2.1.3-cp312-cp312-win_amd64.whl", hash = "sha256:0d30c543f02e84e92c4b1f415b7c6b5326cbe45ee7882b6b77db7195fb971e3a"}, + {file = "numpy-2.1.3-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:96fe52fcdb9345b7cd82ecd34547fca4321f7656d500eca497eb7ea5a926692f"}, + {file = "numpy-2.1.3-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:f653490b33e9c3a4c1c01d41bc2aef08f9475af51146e4a7710c450cf9761598"}, + {file = "numpy-2.1.3-cp313-cp313-macosx_14_0_arm64.whl", hash = "sha256:dc258a761a16daa791081d026f0ed4399b582712e6fc887a95af09df10c5ca57"}, + {file = "numpy-2.1.3-cp313-cp313-macosx_14_0_x86_64.whl", hash = "sha256:016d0f6f5e77b0f0d45d77387ffa4bb89816b57c835580c3ce8e099ef830befe"}, + {file = "numpy-2.1.3-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c181ba05ce8299c7aa3125c27b9c2167bca4a4445b7ce73d5febc411ca692e43"}, + {file = "numpy-2.1.3-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5641516794ca9e5f8a4d17bb45446998c6554704d888f86df9b200e66bdcce56"}, + {file = "numpy-2.1.3-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:ea4dedd6e394a9c180b33c2c872b92f7ce0f8e7ad93e9585312b0c5a04777a4a"}, + {file = "numpy-2.1.3-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:b0df3635b9c8ef48bd3be5f862cf71b0a4716fa0e702155c45067c6b711ddcef"}, + {file = "numpy-2.1.3-cp313-cp313-win32.whl", hash = "sha256:50ca6aba6e163363f132b5c101ba078b8cbd3fa92c7865fd7d4d62d9779ac29f"}, + {file = "numpy-2.1.3-cp313-cp313-win_amd64.whl", hash = "sha256:747641635d3d44bcb380d950679462fae44f54b131be347d5ec2bce47d3df9ed"}, + {file = "numpy-2.1.3-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:996bb9399059c5b82f76b53ff8bb686069c05acc94656bb259b1d63d04a9506f"}, + {file = "numpy-2.1.3-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:45966d859916ad02b779706bb43b954281db43e185015df6eb3323120188f9e4"}, + {file = "numpy-2.1.3-cp313-cp313t-macosx_14_0_arm64.whl", hash = "sha256:baed7e8d7481bfe0874b566850cb0b85243e982388b7b23348c6db2ee2b2ae8e"}, + {file = "numpy-2.1.3-cp313-cp313t-macosx_14_0_x86_64.whl", hash = "sha256:a9f7f672a3388133335589cfca93ed468509cb7b93ba3105fce780d04a6576a0"}, + {file = "numpy-2.1.3-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d7aac50327da5d208db2eec22eb11e491e3fe13d22653dce51b0f4109101b408"}, + {file = "numpy-2.1.3-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4394bc0dbd074b7f9b52024832d16e019decebf86caf909d94f6b3f77a8ee3b6"}, + {file = "numpy-2.1.3-cp313-cp313t-musllinux_1_1_x86_64.whl", hash = "sha256:50d18c4358a0a8a53f12a8ba9d772ab2d460321e6a93d6064fc22443d189853f"}, + {file = "numpy-2.1.3-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:14e253bd43fc6b37af4921b10f6add6925878a42a0c5fe83daee390bca80bc17"}, + {file = "numpy-2.1.3-cp313-cp313t-win32.whl", hash = "sha256:08788d27a5fd867a663f6fc753fd7c3ad7e92747efc73c53bca2f19f8bc06f48"}, + {file = "numpy-2.1.3-cp313-cp313t-win_amd64.whl", hash = "sha256:2564fbdf2b99b3f815f2107c1bbc93e2de8ee655a69c261363a1172a79a257d4"}, + {file = "numpy-2.1.3-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:4f2015dfe437dfebbfce7c85c7b53d81ba49e71ba7eadbf1df40c915af75979f"}, + {file = "numpy-2.1.3-pp310-pypy310_pp73-macosx_14_0_x86_64.whl", hash = "sha256:3522b0dfe983a575e6a9ab3a4a4dfe156c3e428468ff08ce582b9bb6bd1d71d4"}, + {file = "numpy-2.1.3-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c006b607a865b07cd981ccb218a04fc86b600411d83d6fc261357f1c0966755d"}, + {file = "numpy-2.1.3-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:e14e26956e6f1696070788252dcdff11b4aca4c3e8bd166e0df1bb8f315a67cb"}, + {file = "numpy-2.1.3.tar.gz", hash = "sha256:aa08e04e08aaf974d4458def539dece0d28146d866a39da5639596f4921fd761"}, +] + +[[package]] +name = "openpyxl" +version = "3.1.5" +description = "A Python library to read/write Excel 2010 xlsx/xlsm files" +optional = false +python-versions = ">=3.8" +files = [ + {file = "openpyxl-3.1.5-py2.py3-none-any.whl", hash = "sha256:5282c12b107bffeef825f4617dc029afaf41d0ea60823bbb665ef3079dc79de2"}, + {file = "openpyxl-3.1.5.tar.gz", hash = "sha256:cf0e3cf56142039133628b5acffe8ef0c12bc902d2aadd3e0fe5878dc08d1050"}, +] + +[package.dependencies] +et-xmlfile = "*" + +[[package]] +name = "pandas" +version = "2.2.3" +description = "Powerful data structures for data analysis, time series, and statistics" +optional = false +python-versions = ">=3.9" +files = [ + {file = "pandas-2.2.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:1948ddde24197a0f7add2bdc4ca83bf2b1ef84a1bc8ccffd95eda17fd836ecb5"}, + {file = "pandas-2.2.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:381175499d3802cde0eabbaf6324cce0c4f5d52ca6f8c377c29ad442f50f6348"}, + {file = "pandas-2.2.3-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:d9c45366def9a3dd85a6454c0e7908f2b3b8e9c138f5dc38fed7ce720d8453ed"}, + {file = "pandas-2.2.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:86976a1c5b25ae3f8ccae3a5306e443569ee3c3faf444dfd0f41cda24667ad57"}, + {file = "pandas-2.2.3-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:b8661b0238a69d7aafe156b7fa86c44b881387509653fdf857bebc5e4008ad42"}, + {file = "pandas-2.2.3-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:37e0aced3e8f539eccf2e099f65cdb9c8aa85109b0be6e93e2baff94264bdc6f"}, + {file = "pandas-2.2.3-cp310-cp310-win_amd64.whl", hash = "sha256:56534ce0746a58afaf7942ba4863e0ef81c9c50d3f0ae93e9497d6a41a057645"}, + {file = "pandas-2.2.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:66108071e1b935240e74525006034333f98bcdb87ea116de573a6a0dccb6c039"}, + {file = "pandas-2.2.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:7c2875855b0ff77b2a64a0365e24455d9990730d6431b9e0ee18ad8acee13dbd"}, + {file = "pandas-2.2.3-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:cd8d0c3be0515c12fed0bdbae072551c8b54b7192c7b1fda0ba56059a0179698"}, + {file = "pandas-2.2.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c124333816c3a9b03fbeef3a9f230ba9a737e9e5bb4060aa2107a86cc0a497fc"}, + {file = "pandas-2.2.3-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:63cc132e40a2e084cf01adf0775b15ac515ba905d7dcca47e9a251819c575ef3"}, + {file = "pandas-2.2.3-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:29401dbfa9ad77319367d36940cd8a0b3a11aba16063e39632d98b0e931ddf32"}, + {file = "pandas-2.2.3-cp311-cp311-win_amd64.whl", hash = "sha256:3fc6873a41186404dad67245896a6e440baacc92f5b716ccd1bc9ed2995ab2c5"}, + {file = "pandas-2.2.3-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:b1d432e8d08679a40e2a6d8b2f9770a5c21793a6f9f47fdd52c5ce1948a5a8a9"}, + {file = "pandas-2.2.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:a5a1595fe639f5988ba6a8e5bc9649af3baf26df3998a0abe56c02609392e0a4"}, + {file = "pandas-2.2.3-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:5de54125a92bb4d1c051c0659e6fcb75256bf799a732a87184e5ea503965bce3"}, + {file = "pandas-2.2.3-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fffb8ae78d8af97f849404f21411c95062db1496aeb3e56f146f0355c9989319"}, + {file = "pandas-2.2.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:6dfcb5ee8d4d50c06a51c2fffa6cff6272098ad6540aed1a76d15fb9318194d8"}, + {file = "pandas-2.2.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:062309c1b9ea12a50e8ce661145c6aab431b1e99530d3cd60640e255778bd43a"}, + {file = "pandas-2.2.3-cp312-cp312-win_amd64.whl", hash = "sha256:59ef3764d0fe818125a5097d2ae867ca3fa64df032331b7e0917cf5d7bf66b13"}, + {file = "pandas-2.2.3-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:f00d1345d84d8c86a63e476bb4955e46458b304b9575dcf71102b5c705320015"}, + {file = "pandas-2.2.3-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:3508d914817e153ad359d7e069d752cdd736a247c322d932eb89e6bc84217f28"}, + {file = "pandas-2.2.3-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:22a9d949bfc9a502d320aa04e5d02feab689d61da4e7764b62c30b991c42c5f0"}, + {file = "pandas-2.2.3-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f3a255b2c19987fbbe62a9dfd6cff7ff2aa9ccab3fc75218fd4b7530f01efa24"}, + {file = "pandas-2.2.3-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:800250ecdadb6d9c78eae4990da62743b857b470883fa27f652db8bdde7f6659"}, + {file = "pandas-2.2.3-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:6374c452ff3ec675a8f46fd9ab25c4ad0ba590b71cf0656f8b6daa5202bca3fb"}, + {file = "pandas-2.2.3-cp313-cp313-win_amd64.whl", hash = "sha256:61c5ad4043f791b61dd4752191d9f07f0ae412515d59ba8f005832a532f8736d"}, + {file = "pandas-2.2.3-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:3b71f27954685ee685317063bf13c7709a7ba74fc996b84fc6821c59b0f06468"}, + {file = "pandas-2.2.3-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:38cf8125c40dae9d5acc10fa66af8ea6fdf760b2714ee482ca691fc66e6fcb18"}, + {file = "pandas-2.2.3-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:ba96630bc17c875161df3818780af30e43be9b166ce51c9a18c1feae342906c2"}, + {file = "pandas-2.2.3-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1db71525a1538b30142094edb9adc10be3f3e176748cd7acc2240c2f2e5aa3a4"}, + {file = "pandas-2.2.3-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:15c0e1e02e93116177d29ff83e8b1619c93ddc9c49083f237d4312337a61165d"}, + {file = "pandas-2.2.3-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:ad5b65698ab28ed8d7f18790a0dc58005c7629f227be9ecc1072aa74c0c1d43a"}, + {file = "pandas-2.2.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:bc6b93f9b966093cb0fd62ff1a7e4c09e6d546ad7c1de191767baffc57628f39"}, + {file = "pandas-2.2.3-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:5dbca4c1acd72e8eeef4753eeca07de9b1db4f398669d5994086f788a5d7cc30"}, + {file = "pandas-2.2.3-cp39-cp39-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:8cd6d7cc958a3910f934ea8dbdf17b2364827bb4dafc38ce6eef6bb3d65ff09c"}, + {file = "pandas-2.2.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:99df71520d25fade9db7c1076ac94eb994f4d2673ef2aa2e86ee039b6746d20c"}, + {file = "pandas-2.2.3-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:31d0ced62d4ea3e231a9f228366919a5ea0b07440d9d4dac345376fd8e1477ea"}, + {file = "pandas-2.2.3-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:7eee9e7cea6adf3e3d24e304ac6b8300646e2a5d1cd3a3c2abed9101b0846761"}, + {file = "pandas-2.2.3-cp39-cp39-win_amd64.whl", hash = "sha256:4850ba03528b6dd51d6c5d273c46f183f39a9baf3f0143e566b89450965b105e"}, + {file = "pandas-2.2.3.tar.gz", hash = "sha256:4f18ba62b61d7e192368b84517265a99b4d7ee8912f8708660fb4a366cc82667"}, +] + +[package.dependencies] +numpy = [ + {version = ">=1.22.4", markers = "python_version < \"3.11\""}, + {version = ">=1.23.2", markers = "python_version == \"3.11\""}, + {version = ">=1.26.0", markers = "python_version >= \"3.12\""}, +] +python-dateutil = ">=2.8.2" +pytz = ">=2020.1" +tzdata = ">=2022.7" + +[package.extras] +all = ["PyQt5 (>=5.15.9)", "SQLAlchemy (>=2.0.0)", "adbc-driver-postgresql (>=0.8.0)", "adbc-driver-sqlite (>=0.8.0)", "beautifulsoup4 (>=4.11.2)", "bottleneck (>=1.3.6)", "dataframe-api-compat (>=0.1.7)", "fastparquet (>=2022.12.0)", "fsspec (>=2022.11.0)", "gcsfs (>=2022.11.0)", "html5lib (>=1.1)", "hypothesis (>=6.46.1)", "jinja2 (>=3.1.2)", "lxml (>=4.9.2)", "matplotlib (>=3.6.3)", "numba (>=0.56.4)", "numexpr (>=2.8.4)", "odfpy (>=1.4.1)", "openpyxl (>=3.1.0)", "pandas-gbq (>=0.19.0)", "psycopg2 (>=2.9.6)", "pyarrow (>=10.0.1)", "pymysql (>=1.0.2)", "pyreadstat (>=1.2.0)", "pytest (>=7.3.2)", "pytest-xdist (>=2.2.0)", "python-calamine (>=0.1.7)", "pyxlsb (>=1.0.10)", "qtpy (>=2.3.0)", "s3fs (>=2022.11.0)", "scipy (>=1.10.0)", "tables (>=3.8.0)", "tabulate (>=0.9.0)", "xarray (>=2022.12.0)", "xlrd (>=2.0.1)", "xlsxwriter (>=3.0.5)", "zstandard (>=0.19.0)"] +aws = ["s3fs (>=2022.11.0)"] +clipboard = ["PyQt5 (>=5.15.9)", "qtpy (>=2.3.0)"] +compression = ["zstandard (>=0.19.0)"] +computation = ["scipy (>=1.10.0)", "xarray (>=2022.12.0)"] +consortium-standard = ["dataframe-api-compat (>=0.1.7)"] +excel = ["odfpy (>=1.4.1)", "openpyxl (>=3.1.0)", "python-calamine (>=0.1.7)", "pyxlsb (>=1.0.10)", "xlrd (>=2.0.1)", "xlsxwriter (>=3.0.5)"] +feather = ["pyarrow (>=10.0.1)"] +fss = ["fsspec (>=2022.11.0)"] +gcp = ["gcsfs (>=2022.11.0)", "pandas-gbq (>=0.19.0)"] +hdf5 = ["tables (>=3.8.0)"] +html = ["beautifulsoup4 (>=4.11.2)", "html5lib (>=1.1)", "lxml (>=4.9.2)"] +mysql = ["SQLAlchemy (>=2.0.0)", "pymysql (>=1.0.2)"] +output-formatting = ["jinja2 (>=3.1.2)", "tabulate (>=0.9.0)"] +parquet = ["pyarrow (>=10.0.1)"] +performance = ["bottleneck (>=1.3.6)", "numba (>=0.56.4)", "numexpr (>=2.8.4)"] +plot = ["matplotlib (>=3.6.3)"] +postgresql = ["SQLAlchemy (>=2.0.0)", "adbc-driver-postgresql (>=0.8.0)", "psycopg2 (>=2.9.6)"] +pyarrow = ["pyarrow (>=10.0.1)"] +spss = ["pyreadstat (>=1.2.0)"] +sql-other = ["SQLAlchemy (>=2.0.0)", "adbc-driver-postgresql (>=0.8.0)", "adbc-driver-sqlite (>=0.8.0)"] +test = ["hypothesis (>=6.46.1)", "pytest (>=7.3.2)", "pytest-xdist (>=2.2.0)"] +xml = ["lxml (>=4.9.2)"] + +[[package]] +name = "python-dateutil" +version = "2.9.0.post0" +description = "Extensions to the standard Python datetime module" +optional = false +python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,>=2.7" +files = [ + {file = "python-dateutil-2.9.0.post0.tar.gz", hash = "sha256:37dd54208da7e1cd875388217d5e00ebd4179249f90fb72437e91a35459a0ad3"}, + {file = "python_dateutil-2.9.0.post0-py2.py3-none-any.whl", hash = "sha256:a8b2bc7bffae282281c8140a97d3aa9c14da0b136dfe83f850eea9a5f7470427"}, +] + +[package.dependencies] +six = ">=1.5" + +[[package]] +name = "pytz" +version = "2024.2" +description = "World timezone definitions, modern and historical" +optional = false +python-versions = "*" +files = [ + {file = "pytz-2024.2-py2.py3-none-any.whl", hash = "sha256:31c7c1817eb7fae7ca4b8c7ee50c72f93aa2dd863de768e1ef4245d426aa0725"}, + {file = "pytz-2024.2.tar.gz", hash = "sha256:2aa355083c50a0f93fa581709deac0c9ad65cca8a9e9beac660adcbd493c798a"}, +] + +[[package]] +name = "six" +version = "1.16.0" +description = "Python 2 and 3 compatibility utilities" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*" +files = [ + {file = "six-1.16.0-py2.py3-none-any.whl", hash = "sha256:8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254"}, + {file = "six-1.16.0.tar.gz", hash = "sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926"}, +] + +[[package]] +name = "tzdata" +version = "2024.2" +description = "Provider of IANA time zone data" +optional = false +python-versions = ">=2" +files = [ + {file = "tzdata-2024.2-py2.py3-none-any.whl", hash = "sha256:a48093786cdcde33cad18c2555e8532f34422074448fbc874186f0abd79565cd"}, + {file = "tzdata-2024.2.tar.gz", hash = "sha256:7d85cc416e9382e69095b7bdf4afd9e3880418a2413feec7069d533d6b4e31cc"}, +] [metadata] lock-version = "2.0" python-versions = "^3.10" -content-hash = "17ca553b0bb9298a6ed528dd21e544ca433179192dba32a9920168e1c199d74f" +content-hash = "5e2d3a8adecb5a8b0c75e1b7968e3a066917a3ef179ab291a2072d2cd8487bf4" diff --git a/pyproject.toml b/pyproject.toml index 0c061f4..fdd6cac 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "nul-rdc-scripts" -version = "0.4.1" +version = "0.5.0" description = "Scripts for NUL RDC Digitization Team" authors = [ "Northwestern University Libraries ", @@ -14,6 +14,8 @@ readme = "README.md" [tool.poetry.dependencies] python = "^3.10" +pandas = "^2.2.3" +openpyxl = "^3.1.5" [tool.poetry.dev-dependencies] @@ -27,6 +29,7 @@ spectrograms = 'nulrdcscripts.tools.spectrogramgeneration.main:main' md5 = 'nulrdcscripts.tools.md5generation.main:main' trim = 'nulrdcscripts.tools.videotrimmer.main:main' micro = 'nulrdcscripts.ingestMicro.ingest:main' +errorgui='nulrdcscripts.tools.errortool.main:main' [build-system] requires = ["poetry-core>=1.0.0"] build-backend = "poetry.core.masonry.api"