From 18b3b19e44bc4c9bca87e3a2ca2835b529648838 Mon Sep 17 00:00:00 2001 From: Vibhu Agarwal Date: Sun, 13 Dec 2020 01:12:35 +0530 Subject: [PATCH] Added black as code-formatter (#30) * Added black and flake8 as dev-dependencies * Updated requirements.txt * Apply black formatting * Update README.md --- Attendance_app.py | 590 ++++++++++++++++++++++++++++--------------- README.md | 2 +- capture.py | 10 +- excel.py | 72 +++--- face_detect.py | 25 +- face_train.py | 27 +- main_file.py | 124 +++++---- poetry.lock | 293 +++++++++++++++++++++- pyproject.toml | 2 + requirements.txt | 625 ++++++++++------------------------------------ students_list.py | 56 +++-- 11 files changed, 1004 insertions(+), 822 deletions(-) diff --git a/Attendance_app.py b/Attendance_app.py index 880c62a..ae051f5 100644 --- a/Attendance_app.py +++ b/Attendance_app.py @@ -17,12 +17,12 @@ from students_list import StudentsList from main_file import MainFile -class_codes = ['Marauders'] -manager_id = 'ADMIN' -manager_pass = 'ubuntu' +class_codes = ["Marauders"] +manager_id = "ADMIN" +manager_pass = "ubuntu" -current_class = 'Marauders' -if current_class != 'Marauders': +current_class = "Marauders" +if current_class != "Marauders": current_class_obj = MainFile(current_class) FaceTrainObj = FaceTrain(current_class) else: @@ -34,9 +34,9 @@ normal_height = 1080 x, y = pyautogui.size() -percentage_width = x/(normal_width/100) -percentage_height = y/(normal_height/100) -scale_factor = ((percentage_width + percentage_height)/2)/100 +percentage_width = x / (normal_width / 100) +percentage_height = y / (normal_height / 100) +scale_factor = ((percentage_width + percentage_height) / 2) / 100 title_fontsize = int(30 * scale_factor) minimum_size = 24 @@ -48,16 +48,16 @@ class SampleApp(tk.Tk): - def __init__(self, *args, **kwargs): tk.Tk.__init__(self, *args, **kwargs) - self.title_font = tkfont.Font(family='Helvetica', size=18, - weight="bold", slant="italic") - geo = str(int(0.43 * x)) + 'x' + str(int(0.52 * y)) + self.title_font = tkfont.Font( + family="Helvetica", size=18, weight="bold", slant="italic" + ) + geo = str(int(0.43 * x)) + "x" + str(int(0.52 * y)) self.geometry(geo) self.resizable(False, False) - self.title('Attendance Management App') + self.title("Attendance Management App") self.protocol("WM_DELETE_WINDOW", self.on_closing) # The container is where we'll stack a bunch of frames # on top of each other, then the one we want visible @@ -70,8 +70,13 @@ def __init__(self, *args, **kwargs): self.createInitialDirectories() self.frames = {} - for F in (StartPage, StudentPanelPage, ManagerPanelPage, - CreateNewBatchPage, AddStudentPage): + for F in ( + StartPage, + StudentPanelPage, + ManagerPanelPage, + CreateNewBatchPage, + AddStudentPage, + ): page_name = F.__name__ frame = F(parent=container, controller=self) @@ -86,10 +91,10 @@ def __init__(self, *args, **kwargs): def createInitialDirectories(self): - temp_dir = os.path.join(os.getcwd(), 'images', '.temp') + temp_dir = os.path.join(os.getcwd(), "images", ".temp") temp_dir_exists = os.path.isdir(temp_dir) - extras_dir = os.path.join(os.getcwd(), 'extras') + extras_dir = os.path.join(os.getcwd(), "extras") extras_dir_exists = os.path.isdir(extras_dir) studs_list_dir = os.path.join(os.getcwd(), "student's list") @@ -102,22 +107,22 @@ def createInitialDirectories(self): if not studs_list_dir_exists: os.makedirs(studs_list_dir) - classes_file = os.path.join(os.getcwd(), 'extras', 'classes.xlsx') + classes_file = os.path.join(os.getcwd(), "extras", "classes.xlsx") try: global class_codes, current_class - class_codes = set(['Marauders']) + class_codes = set(["Marauders"]) wb = load_workbook(classes_file) ws = wb.active - number_of_classes = ws['A1'].value + number_of_classes = ws["A1"].value if number_of_classes != 0: - current_class = ws['A2'].value + current_class = ws["A2"].value for i in range(2, number_of_classes + 2): - class_codes.add(ws['A' + str(i)].value) + class_codes.add(ws["A" + str(i)].value) except: wb = Workbook() wb.guess_types = True ws = wb.active - ws['A1'] = 0 + ws["A1"] = 0 wb.save(classes_file) def show_frame(self, page_name): @@ -136,7 +141,7 @@ def validate(self, page_name, c_code, id, pwd): global current_class current_class = c_code print("current class", current_class) - if current_class != 'Marauders': + if current_class != "Marauders": # frame.lb_class_code.config(text="Batch Code : {}".format(current_class)) # frame.lb_class_code['text']="Batch Code : {}".format(current_class) StudentsList(current_class).make_pkl_file() @@ -146,88 +151,118 @@ def validate(self, page_name, c_code, id, pwd): elif page_name == "StudentPanelPage": global current_class_obj current_class_obj = MainFile(current_class) - elif current_class == 'Marauders' and page_name == 'StudentPanelPage': - messagebox.showerror('Error', 'Only Manager Panel is valid for this class-code') + elif current_class == "Marauders" and page_name == "StudentPanelPage": + messagebox.showerror( + "Error", "Only Manager Panel is valid for this class-code" + ) return else: - frame = self.frames['CreateNewBatchPage'] + frame = self.frames["CreateNewBatchPage"] frame.tkraise() else: - messagebox.showerror('Error', 'Incorrect Credentials !!') + messagebox.showerror("Error", "Incorrect Credentials !!") class StartPage(tk.Frame): - def __init__(self, parent, controller): tk.Frame.__init__(self, parent) self.controller = controller - self.bkg = '#222629' - self.text_color = '#65CCB8' + self.bkg = "#222629" + self.text_color = "#65CCB8" StartPage.config(self, bg=self.bkg) entry_width = int(30 * scale_factor) min_entrywidth = 25 entry_width = max(entry_width, min_entrywidth) - self.label = tk.Label(self, width=25, text="Attendance Management", - bg=self.bkg, fg="#F8E9A1", - font=("Times", title_fontsize)) + self.label = tk.Label( + self, + width=25, + text="Attendance Management", + bg=self.bkg, + fg="#F8E9A1", + font=("Times", title_fontsize), + ) self.label.place(x=130 * scale_factor, y=40 * scale_factor) - self.lb_class = tk.Label(self, text="CLASS-CODE: ", bg=self.bkg, - fg=self.text_color, - font=("Courier", text_fontsize)) + self.lb_class = tk.Label( + self, + text="CLASS-CODE: ", + bg=self.bkg, + fg=self.text_color, + font=("Courier", text_fontsize), + ) self.lb_class.place(x=170 * scale_factor, y=155 * scale_factor) self.tv_class = tk.Entry(self, width=entry_width) self.tv_class.focus() self.tv_class.place(x=340 * scale_factor, y=160 * scale_factor) - self.lb_username = tk.Label(self, text="USERNAME : ", bg=self.bkg, - fg=self.text_color, - font=("Courier", text_fontsize)) + self.lb_username = tk.Label( + self, + text="USERNAME : ", + bg=self.bkg, + fg=self.text_color, + font=("Courier", text_fontsize), + ) self.lb_username.place(x=183 * scale_factor, y=210 * scale_factor) self.tv_username = tk.Entry(self, width=entry_width) self.tv_username.place(x=340 * scale_factor, y=215 * scale_factor) - self.lb_pass = tk.Label(self, text="PASSWORD : ", bg=self.bkg, - fg=self.text_color, - font=("Courier", text_fontsize)) + self.lb_pass = tk.Label( + self, + text="PASSWORD : ", + bg=self.bkg, + fg=self.text_color, + font=("Courier", text_fontsize), + ) self.lb_pass.place(x=183 * scale_factor, y=265 * scale_factor) self.tv_pass = tk.Entry(self, show="*", width=entry_width) self.tv_pass.place(x=340 * scale_factor, y=270 * scale_factor) - self.showbtn = tk.Button(self, text="SHOW", bg="#ed3833", - command=self.show, width=2, - font=("", 8)) # 32ff6a + self.showbtn = tk.Button( + self, text="SHOW", bg="#ed3833", command=self.show, width=2, font=("", 8) + ) # 32ff6a self.show = False - self.showbtn.place(x=(340 * scale_factor) + (entry_width * 9), - y=270*scale_factor) + self.showbtn.place( + x=(340 * scale_factor) + (entry_width * 9), y=270 * scale_factor + ) bt_width = int(16 * scale_factor) min_width = 12 bt_width = max(min_width, bt_width) self.button1 = tk.Button( - self, bg="#45056e", fg=self.text_color, - text="Go to\nStudent Portal", width=bt_width, height=3, + self, + bg="#45056e", + fg=self.text_color, + text="Go to\nStudent Portal", + width=bt_width, + height=3, font=("", 15), command=lambda: self.doWork( "StudentPanelPage", self.tv_class.get(), self.tv_username.get(), - self.tv_pass.get() - )) + self.tv_pass.get(), + ), + ) self.button2 = tk.Button( - self, bg="#5f1854", fg=self.text_color, + self, + bg="#5f1854", + fg=self.text_color, text="Go to\nManager Portal", - width=bt_width, height=3, font=("", 15), + width=bt_width, + height=3, + font=("", 15), command=lambda: self.doWork( "ManagerPanelPage", self.tv_class.get(), self.tv_username.get(), - self.tv_pass.get() - )) + self.tv_pass.get(), + ), + ) self.button1.place(x=140 * scale_factor, y=340 * scale_factor) self.button2.place(x=410 * scale_factor, y=340 * scale_factor) - self.bt_exit = tk.Button(self, bg="red", fg="yellow", text="Exit", - width=10, command=self.exit) + self.bt_exit = tk.Button( + self, bg="red", fg="yellow", text="Exit", width=10, command=self.exit + ) self.bt_exit.place(x=340 * scale_factor, y=490 * scale_factor) def show(self): @@ -252,28 +287,46 @@ def exit(self): class StudentPanelPage(tk.Frame): - def __init__(self, parent, controller): tk.Frame.__init__(self, parent) self.controller = controller - self.bkg = '#222629' - self.text_color = '#65CCB8' + self.bkg = "#222629" + self.text_color = "#65CCB8" StudentPanelPage.config(self, bg=self.bkg) - label = tk.Label(self, width=25, text="Student Portal", bg=self.bkg, - fg="#F8E9A1", font=("Times", title_fontsize)) + label = tk.Label( + self, + width=25, + text="Student Portal", + bg=self.bkg, + fg="#F8E9A1", + font=("Times", title_fontsize), + ) label.place(x=130 * scale_factor, y=40 * scale_factor) - bt_mark = tk.Button(self, bg="#45056e", fg=self.text_color, - text="Mark my\n ATTENDANCE", font=("", 18), - width=16, height=7, command=self.doWork) + bt_mark = tk.Button( + self, + bg="#45056e", + fg=self.text_color, + text="Mark my\n ATTENDANCE", + font=("", 18), + width=16, + height=7, + command=self.doWork, + ) bt_mark.place(x=215 * scale_factor, y=150 * scale_factor) - bt_back = tk.Button(self, bg="#af0404", fg="yellow", text="Back", - width=10, command=lambda: controller.show_frame( - "StartPage")) + bt_back = tk.Button( + self, + bg="#af0404", + fg="yellow", + text="Back", + width=10, + command=lambda: controller.show_frame("StartPage"), + ) bt_back.place(x=115 * scale_factor, y=485 * scale_factor) - bt_exit = tk.Button(self, bg="#af0404", fg="yellow", text="Exit", - width=10, command=self.exit) + bt_exit = tk.Button( + self, bg="#af0404", fg="yellow", text="Exit", width=10, command=self.exit + ) bt_exit.place(x=520 * scale_factor, y=485 * scale_factor) def doWork(self): @@ -286,17 +339,22 @@ def exit(self): class ManagerPanelPage(tk.Frame): - def __init__(self, parent, controller): tk.Frame.__init__(self, parent) self.controller = controller - self.bkg = '#222629' - self.text_color = '#65CCB8' + self.bkg = "#222629" + self.text_color = "#65CCB8" ManagerPanelPage.config(self, bg=self.bkg) global current_class - label = tk.Label(self, width=25, text="Manager Portal", bg=self.bkg, - fg="#F8E9A1", font=("Times", title_fontsize)) + label = tk.Label( + self, + width=25, + text="Manager Portal", + bg=self.bkg, + fg="#F8E9A1", + font=("Times", title_fontsize), + ) label.place(x=130 * scale_factor, y=40 * scale_factor) bt_ht = int(5 * scale_factor) @@ -305,55 +363,86 @@ def __init__(self, parent, controller): bt_width = int(15 * scale_factor) min_width = 12 bt_width = max(min_width, bt_width) - bt_train = tk.Button(self, text="Train the\n Recogniser", - bg="#45056e", fg=self.text_color, width=bt_width, - height=bt_ht, font=("", 15), command=self.doWork) + bt_train = tk.Button( + self, + text="Train the\n Recogniser", + bg="#45056e", + fg=self.text_color, + width=bt_width, + height=bt_ht, + font=("", 15), + command=self.doWork, + ) bt_train.place(x=130 * scale_factor, y=160 * scale_factor) - bt_addstud = tk.Button(self, text="Add a student\n to this class", - bg="#3b0944", width=bt_width, - fg=self.text_color, height=bt_ht, - font=("", 15), command=self.addStudent) + bt_addstud = tk.Button( + self, + text="Add a student\n to this class", + bg="#3b0944", + width=bt_width, + fg=self.text_color, + height=bt_ht, + font=("", 15), + command=self.addStudent, + ) bt_addstud.place(x=430 * scale_factor, y=160 * scale_factor) - bt_view_register = tk.Button(self, text="View\nAttendance\nRegister", - width=bt_width, bg="#581845", - fg=self.text_color, height=bt_ht, - font=("", 15), command=self.viewRegister) + bt_view_register = tk.Button( + self, + text="View\nAttendance\nRegister", + width=bt_width, + bg="#581845", + fg=self.text_color, + height=bt_ht, + font=("", 15), + command=self.viewRegister, + ) bt_view_register.place(x=265 * scale_factor, y=320 * scale_factor) - bt_back = tk.Button(self, bg="#af0404", fg="yellow", text="Back", - width=10, command=lambda: controller.show_frame( - "StartPage")) + bt_back = tk.Button( + self, + bg="#af0404", + fg="yellow", + text="Back", + width=10, + command=lambda: controller.show_frame("StartPage"), + ) bt_back.place(x=115 * scale_factor, y=485 * scale_factor) - bt_exit = tk.Button(self, bg="#af0404", fg="yellow", text="Exit", - width=10, command=self.exit) + bt_exit = tk.Button( + self, bg="#af0404", fg="yellow", text="Exit", width=10, command=self.exit + ) bt_exit.place(x=520 * scale_factor, y=485 * scale_factor) def viewRegister(self): global current_class - atten_register = os.path.join(os.getcwd(), 'extras', current_class, f'{current_class}.xlsx') + atten_register = os.path.join( + os.getcwd(), "extras", current_class, f"{current_class}.xlsx" + ) try: - opener = 'open' if sys.platform == 'darwin' else 'xdg-open' + opener = "open" if sys.platform == "darwin" else "xdg-open" subprocess.call([opener, atten_register]) except (subprocess.CalledProcessError, OSError): os.startfile(atten_register) def addStudent(self): global current_class - students_list_file = os.path.join(os.getcwd(), "student's list", f'{current_class}.xlsx') + students_list_file = os.path.join( + os.getcwd(), "student's list", f"{current_class}.xlsx" + ) self.controller.show_frame("AddStudentPage") def doWork(self): global FaceTrainObj, current_class - if current_class == 'Marauders': - wb = load_workbook(os.path.join(os.getcwd(), 'extras', 'classes.xlsx')) + if current_class == "Marauders": + wb = load_workbook(os.path.join(os.getcwd(), "extras", "classes.xlsx")) ws = wb.active - number_of_classes = ws['A1'].value + number_of_classes = ws["A1"].value if number_of_classes == 0: - messagebox.showerror('Error', 'No class in the database yet') + messagebox.showerror("Error", "No class in the database yet") return else: - messagebox.showerror('Error', 'Please login again with a valid class-code') - current_class = ws['A2'].value + messagebox.showerror( + "Error", "Please login again with a valid class-code" + ) + current_class = ws["A2"].value return FaceTrainObj.main() @@ -364,56 +453,103 @@ def exit(self): class CreateNewBatchPage(tk.Frame): - def __init__(self, parent, controller): tk.Frame.__init__(self, parent) self.controller = controller - self.bkg = '#222629' - self.text_color = '#65CCB8' + self.bkg = "#222629" + self.text_color = "#65CCB8" CreateNewBatchPage.config(self, bg=self.bkg) - self.label = tk.Label(self, width=25, text="Create a new Batch", - bg=self.bkg, fg="#F8E9A1", - font=("Times", title_fontsize)) + self.label = tk.Label( + self, + width=25, + text="Create a new Batch", + bg=self.bkg, + fg="#F8E9A1", + font=("Times", title_fontsize), + ) self.label.place(x=130 * scale_factor, y=40 * scale_factor) entry_width = int(30 * scale_factor) min_entrywidth = 23 entry_width = max(min_entrywidth, entry_width) - self.lb_class = tk.Label(self, text="CLASS-CODE: ", bg=self.bkg, - fg=self.text_color, - font=("Courier", text_fontsize)) + self.lb_class = tk.Label( + self, + text="CLASS-CODE: ", + bg=self.bkg, + fg=self.text_color, + font=("Courier", text_fontsize), + ) self.lb_class.place(x=320 * scale_factor, y=140 * scale_factor) - self.tv_class = tk.Entry(self, width=entry_width, font=("", 16), - justify='center') + self.tv_class = tk.Entry( + self, width=entry_width, font=("", 16), justify="center" + ) self.tv_class.focus() self.tv_class.place(x=190 * scale_factor, y=175 * scale_factor) - self.lb_number = tk.Label(self, text="NUMBER OF STUDENTS: ", - bg=self.bkg, fg=self.text_color, - font=("Courier", text_fontsize)) + self.lb_number = tk.Label( + self, + text="NUMBER OF STUDENTS: ", + bg=self.bkg, + fg=self.text_color, + font=("Courier", text_fontsize), + ) self.lb_number.place(x=265 * scale_factor, y=240 * scale_factor) - vcmd = (self.controller.register(self.validate_number_field), - '%d', '%i', '%P', '%s', '%S', '%v', '%V', '%W') - self.tv_number = tk.Entry(self, width=entry_width, font=("", 16), - justify='center', validate='key', - validatecommand=vcmd) + vcmd = ( + self.controller.register(self.validate_number_field), + "%d", + "%i", + "%P", + "%s", + "%S", + "%v", + "%V", + "%W", + ) + self.tv_number = tk.Entry( + self, + width=entry_width, + font=("", 16), + justify="center", + validate="key", + validatecommand=vcmd, + ) self.tv_number.place(x=190 * scale_factor, y=275 * scale_factor) - bt_new_batch = tk.Button(self, bg="#45056e", fg=self.text_color, - text="ADD BATCH", width=16, height=2, - font=("", 15), command=self.create_new_batch) + bt_new_batch = tk.Button( + self, + bg="#45056e", + fg=self.text_color, + text="ADD BATCH", + width=16, + height=2, + font=("", 15), + command=self.create_new_batch, + ) bt_new_batch.place(x=237 * scale_factor, y=350 * scale_factor) - bt_back = tk.Button(self, bg="#ed3833", fg="yellow", text="Back", - width=10, command=lambda: controller.show_frame( - "StartPage")) + bt_back = tk.Button( + self, + bg="#ed3833", + fg="yellow", + text="Back", + width=10, + command=lambda: controller.show_frame("StartPage"), + ) bt_back.place(x=340 * scale_factor, y=490 * scale_factor) - def validate_number_field(self, action, index, value_if_allowed, - prior_value, text, validation_type, - trigger_type, widget_name): - if text in '0123456789': + def validate_number_field( + self, + action, + index, + value_if_allowed, + prior_value, + text, + validation_type, + trigger_type, + widget_name, + ): + if text in "0123456789": try: int(value_if_allowed) return True @@ -427,166 +563,215 @@ def create_new_batch(self): class_name = self.tv_class.get() number_of_studs = int(self.tv_number.get()) - batchexists = os.path.exists(os.path.join(os.getcwd(), 'extras', class_name)) + batchexists = os.path.exists(os.path.join(os.getcwd(), "extras", class_name)) if batchexists: - messagebox.showerror('Error', 'This batch name already exists') + messagebox.showerror("Error", "This batch name already exists") return if number_of_studs < 1 or number_of_studs > 99: - messagebox.showerror('Error', "Number of students not in allowed range!") + messagebox.showerror("Error", "Number of students not in allowed range!") return - images_dir = os.path.join(os.getcwd(), 'images', class_name) - unrecog_studs_dir = os.path.join(os.getcwd(), 'images', class_name, - 'unrecognized students') + images_dir = os.path.join(os.getcwd(), "images", class_name) + unrecog_studs_dir = os.path.join( + os.getcwd(), "images", class_name, "unrecognized students" + ) os.makedirs(unrecog_studs_dir) for i in range(number_of_studs): - os.makedirs(os.path.join(images_dir, 's' + str(i).zfill(2))) + os.makedirs(os.path.join(images_dir, "s" + str(i).zfill(2))) - studs_list_file = os.path.join(os.getcwd(), "student's list", f'{class_name}.xlsx') + studs_list_file = os.path.join( + os.getcwd(), "student's list", f"{class_name}.xlsx" + ) wb = Workbook() wb.guess_types = True ws = wb.active - ws['A1'] = 0 - ws['B1'] = number_of_studs + ws["A1"] = 0 + ws["B1"] = number_of_studs wb.save(studs_list_file) - classes_file = os.path.join(os.getcwd(), 'extras', 'classes.xlsx') + classes_file = os.path.join(os.getcwd(), "extras", "classes.xlsx") wb = load_workbook(classes_file) ws = wb.active - row = ws['A1'].value - ws['A1'] = row + 1 - ws['A' + str(row + 2)] = class_name + row = ws["A1"].value + ws["A1"] = row + 1 + ws["A" + str(row + 2)] = class_name wb.save(classes_file) sl = StudentsList(class_name) sl.make_pkl_file() - atten_reg_dir = os.path.join(os.getcwd(), 'extras', class_name) + atten_reg_dir = os.path.join(os.getcwd(), "extras", class_name) os.makedirs(atten_reg_dir) wb = excel.attendance_workbook(class_name) - messagebox.showinfo("Batch Successfully Created", - "All the necessary Directories and Files created" - f"for Batch-Code {class_name}") + messagebox.showinfo( + "Batch Successfully Created", + "All the necessary Directories and Files created" + f"for Batch-Code {class_name}", + ) class_codes.add(class_name) self.tv_class.delete(0, END) self.tv_number.delete(0, END) self.tv_number.insert(0, "") - self.controller.show_frame('StartPage') + self.controller.show_frame("StartPage") class AddStudentPage(tk.Frame): """docstring for AddStudentPage""" + def __init__(self, parent, controller): tk.Frame.__init__(self, parent) self.controller = controller - self.bkg = '#222629' - self.text_color = '#65CCB8' + self.bkg = "#222629" + self.text_color = "#65CCB8" AddStudentPage.config(self, bg=self.bkg) - self.label = tk.Label(self, width=25, text="Add a new Student", - bg=self.bkg, fg="#F8E9A1", - font=("Times", title_fontsize)) + self.label = tk.Label( + self, + width=25, + text="Add a new Student", + bg=self.bkg, + fg="#F8E9A1", + font=("Times", title_fontsize), + ) self.label.place(x=130 * scale_factor, y=40 * scale_factor) - self.lb_name = tk.Label(self, text="Name of Student: ", - bg=self.bkg, fg=self.text_color, - font=("Courier", text_fontsize)) + self.lb_name = tk.Label( + self, + text="Name of Student: ", + bg=self.bkg, + fg=self.text_color, + font=("Courier", text_fontsize), + ) self.lb_name.place(x=285 * scale_factor, y=175 * scale_factor) entry_width = int(30 * scale_factor) min_entrywidth = 23 entry_width = max(min_entrywidth, entry_width) - self.tv_name = tk.Entry(self, width=entry_width, justify='center', - font=("", 16)) + self.tv_name = tk.Entry( + self, width=entry_width, justify="center", font=("", 16) + ) self.tv_name.focus() self.tv_name.place(x=180 * scale_factor, y=210 * scale_factor) - self.bt_addstud = tk.Button(self, bg="#45056e", fg=self.text_color, - text="ADD STUDENT", width=16, height=2, - font=("", 15), command=self.doWork) + self.bt_addstud = tk.Button( + self, + bg="#45056e", + fg=self.text_color, + text="ADD STUDENT", + width=16, + height=2, + font=("", 15), + command=self.doWork, + ) self.bt_addstud.place(x=245 * scale_factor, y=300 * scale_factor) - self.bt_back = tk.Button(self, bg="#af0404", fg="yellow", text="Back", - width=10, - command=lambda: controller.show_frame( - "ManagerPanelPage")) + self.bt_back = tk.Button( + self, + bg="#af0404", + fg="yellow", + text="Back", + width=10, + command=lambda: controller.show_frame("ManagerPanelPage"), + ) self.bt_back.place(x=115 * scale_factor, y=485 * scale_factor) - self.bt_exit = tk.Button(self, bg="#af0404", fg="yellow", - text="Exit", width=10, command=self.exit) + self.bt_exit = tk.Button( + self, bg="#af0404", fg="yellow", text="Exit", width=10, command=self.exit + ) self.bt_exit.place(x=520 * scale_factor, y=485 * scale_factor) def doWork(self): global current_class - students_list_file = os.path.join(os.getcwd(), "student's list", f'{current_class}.xlsx') + students_list_file = os.path.join( + os.getcwd(), "student's list", f"{current_class}.xlsx" + ) wb = load_workbook(students_list_file) ws = wb.active - total_studs = ws['B1'].value - currently_studs = ws['A1'].value + total_studs = ws["B1"].value + currently_studs = ws["A1"].value if currently_studs == total_studs: - messagebox.showinfo("Batch Full", "No more accomodation for any new student") + messagebox.showinfo( + "Batch Full", "No more accomodation for any new student" + ) return - ws['A1'] = currently_studs + 1 + ws["A1"] = currently_studs + 1 row_here = currently_studs + 2 student_name = self.tv_name.get() - ws['A' + str(row_here)] = student_name + ws["A" + str(row_here)] = student_name roll_no = currently_studs roll_no = str(roll_no).zfill(2) - ws['B' + str(row_here)] = current_class + roll_no + ws["B" + str(row_here)] = current_class + roll_no wb.save(students_list_file) sl = StudentsList(current_class) sl.make_pkl_file() - atten_reg = os.path.join(os.getcwd(), 'extras', current_class, f'{current_class}.xlsx') + atten_reg = os.path.join( + os.getcwd(), "extras", current_class, f"{current_class}.xlsx" + ) wb = load_workbook(atten_reg) today = datetime.now().date() - month = today.strftime('%B') + month = today.strftime("%B") try: # If current month exists ws = wb[month] row_here = excel.gap + int(roll_no) - ws.merge_cells(start_row=row_here, start_column=3, - end_row=row_here, end_column=4) + ws.merge_cells( + start_row=row_here, start_column=3, end_row=row_here, end_column=4 + ) ws.cell(row=row_here, column=1, value=str(int(roll_no) + 1)) - fill_roll = excel.PatternFill(fgColor='A5EFAF', fill_type='solid') - fill_name = excel.PatternFill(fgColor='E9EFA5', fill_type='solid') - ws.cell(row=row_here, column=2, - value=current_class + roll_no).fill = fill_roll - ws.cell(row=row_here, column=3, - value=student_name).fill = fill_name - cellrange = 'A' + str(row_here) + ':AN' + str(row_here) + fill_roll = excel.PatternFill(fgColor="A5EFAF", fill_type="solid") + fill_name = excel.PatternFill(fgColor="E9EFA5", fill_type="solid") + ws.cell( + row=row_here, column=2, value=current_class + roll_no + ).fill = fill_roll + ws.cell(row=row_here, column=3, value=student_name).fill = fill_name + cellrange = "A" + str(row_here) + ":AN" + str(row_here) excel.set_border(ws, cellrange) first_date_column = excel.get_column_letter(excel.date_column) days_in_month = monthrange(today.year, today.month)[1] - last_date_column = excel.get_column_letter(excel.date_column + days_in_month - 1) + last_date_column = excel.get_column_letter( + excel.date_column + days_in_month - 1 + ) sum_cell_column = excel.date_column + days_in_month + 1 - fill_total = excel.PatternFill(fgColor='25F741', fill_type='solid') - ws.cell(row=row_here, column=sum_cell_column, - value="=SUM(" + first_date_column + str(row_here) + ":" + - last_date_column + str(row_here) + ")").fill = fill_total + fill_total = excel.PatternFill(fgColor="25F741", fill_type="solid") + ws.cell( + row=row_here, + column=sum_cell_column, + value="=SUM(" + + first_date_column + + str(row_here) + + ":" + + last_date_column + + str(row_here) + + ")", + ).fill = fill_total wb.save(atten_reg) except: # If current month does not exist wb = excel.attendance_workbook(current_class) - image_dir = os.path.join(os.getcwd(), 'images', current_class, 's' + roll_no) - messagebox.showinfo('Student Added', - f"{student_name} admitted!\n" - "Click OK to proceed for capturing training images. " - "Make sure that your surroundings are well lit") + image_dir = os.path.join(os.getcwd(), "images", current_class, "s" + roll_no) + messagebox.showinfo( + "Student Added", + f"{student_name} admitted!\n" + "Click OK to proceed for capturing training images. " + "Make sure that your surroundings are well lit", + ) i = 5 face_detected_right = False - xml_file = os.path.join(os.getcwd(), 'haarcascade_frontalface_default.xml') + xml_file = os.path.join(os.getcwd(), "haarcascade_frontalface_default.xml") while i > 0: while face_detected_right is False: img_path, frame = capture() face_detected_right = detect_faces(xml_file, frame) img_path = os.path.join( - os.getcwd(), 'images', current_class, - "s"+str(roll_no).zfill(2), - os.path.basename(img_path) + os.getcwd(), + "images", + current_class, + "s" + str(roll_no).zfill(2), + os.path.basename(img_path), ) cv2.imwrite(img_path, frame) cv2.destroyAllWindows() @@ -594,8 +779,9 @@ def doWork(self): i = i - 1 if i == 0: messagebox.showinfo("Message", "Training images added successfully!") - messagebox.showinfo('Enrollment Number', - f'Roll Number of student: {current_class + roll_no}') + messagebox.showinfo( + "Enrollment Number", f"Roll Number of student: {current_class + roll_no}" + ) self.tv_name.delete(0, END) def exit(self): diff --git a/README.md b/README.md index ac9c69e..5763dd3 100644 --- a/README.md +++ b/README.md @@ -1,7 +1,7 @@ # [Attendance-Management-using-Face-Recognition](https://github.com/Marauders-9998/Attendance-Management-using-Face-Recognition) -[![Open Issues](https://img.shields.io/github/issues/Marauders-9998/Attendance-Management-using-Face-Recognition?style=for-the-badge&logo=github)](https://github.com/Marauders-9998/Attendance-Management-using-Face-Recognition/issues) [![Forks](https://img.shields.io/github/forks/Marauders-9998/Attendance-Management-using-Face-Recognition?style=for-the-badge&logo=github)](https://github.com/Marauders-9998/Attendance-Management-using-Face-Recognition/network/members) [![Stars](https://img.shields.io/github/stars/Marauders-9998/Attendance-Management-using-Face-Recognition?style=for-the-badge&logo=reverbnation)](https://github.com/Marauders-9998/Attendance-Management-using-Face-Recognition/stargazers) ![Made with Python](https://img.shields.io/badge/Made%20with-Python-blueviolet?style=for-the-badge&logo=python) [![Slack](https://img.shields.io/badge/Slack-Chat-informational?style=for-the-badge&logo=slack)](https://join.slack.com/t/marauders9998/shared_invite/zt-jwafycfo-2yu9tnWlkHcwRX0fdIclpQ) +[![Open Issues](https://img.shields.io/github/issues/Marauders-9998/Attendance-Management-using-Face-Recognition?style=for-the-badge&logo=github)](https://github.com/Marauders-9998/Attendance-Management-using-Face-Recognition/issues) [![Forks](https://img.shields.io/github/forks/Marauders-9998/Attendance-Management-using-Face-Recognition?style=for-the-badge&logo=github)](https://github.com/Marauders-9998/Attendance-Management-using-Face-Recognition/network/members) [![Stars](https://img.shields.io/github/stars/Marauders-9998/Attendance-Management-using-Face-Recognition?style=for-the-badge&logo=reverbnation)](https://github.com/Marauders-9998/Attendance-Management-using-Face-Recognition/stargazers) ![Made with Python](https://img.shields.io/badge/Made%20with-Python-blueviolet?style=for-the-badge&logo=python) [![Code style: black](https://img.shields.io/badge/code%20style-black-000000.svg?style=for-the-badge)](https://github.com/psf/black) [![Slack](https://img.shields.io/badge/Slack-Chat-informational?style=for-the-badge&logo=slack)](https://join.slack.com/t/marauders9998/shared_invite/zt-jwafycfo-2yu9tnWlkHcwRX0fdIclpQ) ## Objective This desktop application aims to simplify the process of Attendance Management of different classes and batches using Face Recognition and user-friendly GUI. The management of data and marking of attendance is carried out in Excel files. diff --git a/capture.py b/capture.py index 9382af5..e7ed914 100644 --- a/capture.py +++ b/capture.py @@ -3,7 +3,7 @@ from tkinter import messagebox import cv2 -xml_file = os.path.join(os.getcwd(), 'haarcascade_frontalface_default.xml') +xml_file = os.path.join(os.getcwd(), "haarcascade_frontalface_default.xml") def detect_faces(cascade_xml, bgr_img, scaleFactor=1.1): @@ -17,7 +17,9 @@ def detect_faces(cascade_xml, bgr_img, scaleFactor=1.1): cv2.rectangle(img, (x, y), (x + w, y + h), (0, 255, 0), 2) cv2.imshow("Training Image", img) cv2.waitKey(0) - response = messagebox.askyesno("Verify", "Has you face been properly detected and marked ?") + response = messagebox.askyesno( + "Verify", "Has you face been properly detected and marked ?" + ) cv2.destroyAllWindows() return response @@ -43,7 +45,7 @@ def capture(): elif k % 256 == 32: # SPACE pressed img_name = str(datetime.now().strftime("%Y%m%d_%H%M%S")) - img_name = os.path.join(os.getcwd(), 'images', ".temp", img_name + '.jpg') + img_name = os.path.join(os.getcwd(), "images", ".temp", img_name + ".jpg") cv2.imwrite(img_name, frame) break @@ -53,5 +55,5 @@ def capture(): return img_name, frame -if __name__ == '__main__': +if __name__ == "__main__": pass diff --git a/excel.py b/excel.py index 9f3f5ac..a864b50 100644 --- a/excel.py +++ b/excel.py @@ -8,19 +8,19 @@ from students_list import StudentsList HEADING_FONT = Font(size=20, bold=True) -ALIGNMENT = Alignment(horizontal='center', vertical='center') -FILL_DATE = PatternFill(fgColor='AFA5EF', fill_type='solid') -FILL_ROLL = PatternFill(fgColor='A5EFAF', fill_type='solid') -FILL_NAME = PatternFill(fgColor='E9EFA5', fill_type='solid') -FILL_TOTAL = PatternFill(fgColor='25F741', fill_type='solid') -FILL_ABSENT = PatternFill(fgColor='FF1010', fill_type='solid') -FILL_PRESENT = PatternFill(fgColor='10FF10', fill_type='solid') +ALIGNMENT = Alignment(horizontal="center", vertical="center") +FILL_DATE = PatternFill(fgColor="AFA5EF", fill_type="solid") +FILL_ROLL = PatternFill(fgColor="A5EFAF", fill_type="solid") +FILL_NAME = PatternFill(fgColor="E9EFA5", fill_type="solid") +FILL_TOTAL = PatternFill(fgColor="25F741", fill_type="solid") +FILL_ABSENT = PatternFill(fgColor="FF1010", fill_type="solid") +FILL_PRESENT = PatternFill(fgColor="10FF10", fill_type="solid") GAP = 5 DATE_COLUMN = 5 -NAMES = ['Marauders'] -ROLLS = ['000001'] +NAMES = ["Marauders"] +ROLLS = ["000001"] NUMBER_OF_STUDENTS = len(NAMES) @@ -30,11 +30,11 @@ def todays_date(): def month(): - return todays_date().strftime('%B') + return todays_date().strftime("%B") def make_file_name(class_name): - return join(getcwd(), 'extras', class_name, class_name + '.xlsx') + return join(getcwd(), "extras", class_name, class_name + ".xlsx") def current_month_exists(wb): @@ -47,7 +47,7 @@ def current_month_exists(wb): def set_border(ws, cell_range): rows = ws[cell_range] - side = Side(border_style='thin', color="FF000000") + side = Side(border_style="thin", color="FF000000") rows = list(rows) max_y = len(rows) - 1 @@ -58,7 +58,7 @@ def set_border(ws, cell_range): left=cell.border.left, right=cell.border.right, top=cell.border.top, - bottom=cell.border.bottom + bottom=cell.border.bottom, ) if pos_x == 0: border.left = side @@ -78,22 +78,22 @@ def createWorksheet(wb): global NAMES, ROLLS, NUMBER_OF_STUDENTS manth = month() ws = wb.create_sheet(manth) - ws.merge_cells('A1:AN2') - heading = 'Attendance Record for ' + manth - heading = heading + ' ' * 50 + heading + ' ' * 50 + heading - ws['A1'] = heading - ws['A1'].font = HEADING_FONT - ws['A1'].alignment = ALIGNMENT + ws.merge_cells("A1:AN2") + heading = "Attendance Record for " + manth + heading = heading + " " * 50 + heading + " " * 50 + heading + ws["A1"] = heading + ws["A1"].font = HEADING_FONT + ws["A1"].alignment = ALIGNMENT # ws.sheet_properties.tabColor = 'FFFF66' - ws['A3'] = 'S.No' - ws['B3'] = 'Enrollment' - ws['B3'].fill = FILL_ROLL - ws.merge_cells('C3:D3') - ws['C3'] = 'Name' - ws['C3'].fill = FILL_NAME - - cellrange = 'A' + str(GAP - 1) + ':AN' + str(GAP - 1) + ws["A3"] = "S.No" + ws["B3"] = "Enrollment" + ws["B3"].fill = FILL_ROLL + ws.merge_cells("C3:D3") + ws["C3"] = "Name" + ws["C3"].fill = FILL_NAME + + cellrange = "A" + str(GAP - 1) + ":AN" + str(GAP - 1) set_border(ws, cellrange) for i in range(NUMBER_OF_STUDENTS): ws.merge_cells(start_row=GAP + i, start_column=3, end_row=GAP + i, end_column=4) @@ -101,7 +101,7 @@ def createWorksheet(wb): ws.cell(row=GAP + i, column=2, value=ROLLS[i]).fill = FILL_ROLL ws.cell(row=GAP + i, column=3, value=NAMES[i]).fill = FILL_NAME - cellrange = 'A' + str(GAP + i) + ':AN' + str(GAP + i) + cellrange = "A" + str(GAP + i) + ":AN" + str(GAP + i) set_border(ws, cellrange) today = todays_date() first_day = date(today.year, today.month, 1) @@ -115,9 +115,17 @@ def createWorksheet(wb): sum_cell_column = DATE_COLUMN + days_in_month + 1 ws.cell(row=3, column=sum_cell_column, value="Total").fill = FILL_TOTAL for i in range(NUMBER_OF_STUDENTS): - ws.cell(row=GAP + i, column=sum_cell_column, - value="=SUM(" + first_date_column + str(GAP + i) + ":" + last_date_column + str( - GAP + i) + ")").fill = FILL_TOTAL + ws.cell( + row=GAP + i, + column=sum_cell_column, + value="=SUM(" + + first_date_column + + str(GAP + i) + + ":" + + last_date_column + + str(GAP + i) + + ")", + ).fill = FILL_TOTAL def mark_absent(wb, studs_absent, class_name): @@ -158,5 +166,5 @@ def attendance_workbook(class_name): return wb -if __name__ == '__main__': +if __name__ == "__main__": pass diff --git a/face_detect.py b/face_detect.py index 92498ac..2e1da87 100644 --- a/face_detect.py +++ b/face_detect.py @@ -6,8 +6,10 @@ class FaceDetect: def __init__(self, class_name): self.class_name = class_name - self.xml_file = os.path.join(os.getcwd(), 'haarcascade_frontalface_default.xml') - self.face_recognizer_file = os.path.join(os.getcwd(), 'extras', self.class_name, 'face_recognizer_file.xml') + self.xml_file = os.path.join(os.getcwd(), "haarcascade_frontalface_default.xml") + self.face_recognizer_file = os.path.join( + os.getcwd(), "extras", self.class_name, "face_recognizer_file.xml" + ) # detect faces on one image def detect_faces(self, clf, bgr_img, scaleFactor=1.1): @@ -21,7 +23,10 @@ def recognize(self, image_path, identity): try: face_recognizer.read(self.face_recognizer_file) except: - messagebox.showerror('Error', "The class has no data to recongnize from\nor has not been trained yet") + messagebox.showerror( + "Error", + "The class has no data to recongnize from\nor has not been trained yet", + ) return "No Training Data" test_img = cv2.imread(image_path) test_img_gray = cv2.cvtColor(test_img, cv2.COLOR_BGR2GRAY) @@ -30,18 +35,26 @@ def recognize(self, image_path, identity): students_in_pic = set() for (x, y, w, h) in all_detected: - label, conf = face_recognizer.predict(test_img_gray[y:y + w, x:x + h]) + label, conf = face_recognizer.predict(test_img_gray[y: y + w, x: x + h]) # print(conf) cv2.waitKey(0) label_text = identity[label] students_in_pic.add(identity[label]) cv2.rectangle(test_img, (x, y), (x + w, y + h), (0, 255, 0), 2) - cv2.putText(test_img, label_text, (x, y - 5), cv2.FONT_HERSHEY_PLAIN, 1.0, (0, 255, 0), 2) + cv2.putText( + test_img, + label_text, + (x, y - 5), + cv2.FONT_HERSHEY_PLAIN, + 1.0, + (0, 255, 0), + 2, + ) cv2.imshow("Students in this picture", test_img) cv2.waitKey(0) cv2.destroyAllWindows() return list(students_in_pic) -if __name__ == '__main__': +if __name__ == "__main__": pass diff --git a/face_train.py b/face_train.py index af268d5..9ff3e30 100644 --- a/face_train.py +++ b/face_train.py @@ -6,10 +6,9 @@ class FaceTrain: - def __init__(self, class_name): self.class_name = class_name - self.xml_file = os.path.join(os.getcwd(), 'haarcascade_frontalface_default.xml') + self.xml_file = os.path.join(os.getcwd(), "haarcascade_frontalface_default.xml") def face_detect(self, image): img = image.copy() @@ -20,10 +19,10 @@ def face_detect(self, image): return None, None else: (x, y, w, h) = faces[0] - return gray[y:y + w, x:x + h], faces[0] + return gray[y: y + w, x: x + h], faces[0] def prepare_training_data(self): - training_data_dir = os.path.join(os.getcwd(), 'images', self.class_name) + training_data_dir = os.path.join(os.getcwd(), "images", self.class_name) dirs = os.listdir(training_data_dir) faces = [] labels = [] @@ -33,13 +32,17 @@ def prepare_training_data(self): try: label = int(dir_name.replace("s", "")) except: - messagebox.showerror("Error", - "Unable to prepare training data for " + dir_name + "\nfolder in images directory does not follow the naming scheme") + messagebox.showerror( + "Error", + "Unable to prepare training data for " + + dir_name + + "\nfolder in images directory does not follow the naming scheme", + ) continue subject_dir_path = os.path.join(training_data_dir, dir_name) images = os.listdir(subject_dir_path) for image_name in images: - if image_name.startswith('.'): + if image_name.startswith("."): continue img = cv2.imread(os.path.join(subject_dir_path, image_name)) face, rect = self.face_detect(img) @@ -60,11 +63,15 @@ def main(self): face_recognizer = cv2.face.LBPHFaceRecognizer_create() face_recognizer.train(faces, np.array(labels)) - face_recognizer_file = os.path.join(os.getcwd(), 'extras', self.class_name, 'face_recognizer_file.xml') + face_recognizer_file = os.path.join( + os.getcwd(), "extras", self.class_name, "face_recognizer_file.xml" + ) face_recognizer.save(face_recognizer_file) - messagebox.showinfo("Training Successful", "Trained for {} images".format(len(faces))) + messagebox.showinfo( + "Training Successful", "Trained for {} images".format(len(faces)) + ) -if __name__ == '__main__': +if __name__ == "__main__": pass diff --git a/main_file.py b/main_file.py index 8e8e72b..a6a0b7d 100644 --- a/main_file.py +++ b/main_file.py @@ -11,61 +11,85 @@ root = tkinter.Tk() root.withdraw() + class MainFile: - def __init__(self, class_name): - self.i = 0 - self.class_name = class_name - - def capture_and_mark(self): - sl = StudentsList(self.class_name) - students, roll_numbers = sl.load_pkl_file() + def __init__(self, class_name): + self.i = 0 + self.class_name = class_name + + def capture_and_mark(self): + sl = StudentsList(self.class_name) + students, roll_numbers = sl.load_pkl_file() + + FaceDetectObj = FaceDetect(self.class_name) + + Yes = True + No = False + Cancel = None + + i = 0 + while i <= 2: + captured_image = None + frame = None - FaceDetectObj = FaceDetect(self.class_name) + students_present = [] + while len(students_present) == 0: + captured_image, frame = capture() + students_present = FaceDetectObj.recognize(captured_image, roll_numbers) + if students_present == "No Training Data": + return - Yes = True - No = False - Cancel = None + try: + name_student_present = students[roll_numbers.index(students_present[0])] + except: + messagebox.showerror( + "Error", + "Recognized student not in database\nUnable to mark attendance", + ) + return - i = 0 - while i <= 2: - captured_image=None - frame=None - - students_present = [] - while len(students_present) == 0: - captured_image, frame = capture() - students_present = FaceDetectObj.recognize(captured_image, roll_numbers) - if students_present == "No Training Data": - return + response = messagebox.askyesnocancel( + "Confirm your identity", + students_present[0] + "\n" + name_student_present, + ) - try: - name_student_present = students[roll_numbers.index(students_present[0])] - except: - messagebox.showerror("Error", "Recognized student not in database\nUnable to mark attendance") - return + if response is Yes: + wb = excel.attendance_workbook(self.class_name) + excel.mark_present(wb, students_present, self.class_name) + img_path = os.path.join( + os.getcwd(), + "images", + self.class_name, + "s" + students_present[0][-2:], + os.path.basename(captured_image), + ) + cv2.imwrite(img_path, frame) + os.remove(captured_image) + messagebox.showinfo( + "Attendance Confirmation", "Your attendance is marked!" + ) + break + elif response is Cancel: + break + elif response is No: + if i == 2: + img_path = os.path.join( + os.getcwd(), + "images", + self.class_name, + "unrecognized students", + os.path.basename(captured_image), + ) + cv2.imwrite(img_path, frame) + messagebox.showinfo( + "Unrecognized Student", + "You were not recognized as any student of this class.\nYour attendance will be marked later if you really are", + ) + cv2.imwrite(img_path, frame) + os.remove(captured_image) - response = messagebox.askyesnocancel("Confirm your identity", students_present[0]+'\n'+name_student_present) - - if response is Yes: - wb = excel.attendance_workbook(self.class_name) - excel.mark_present(wb, students_present, self.class_name) - img_path=os.path.join(os.getcwd(), 'images', self.class_name, "s"+students_present[0][-2:],os.path.basename(captured_image)) - cv2.imwrite(img_path,frame) - os.remove(captured_image) - messagebox.showinfo("Attendance Confirmation", "Your attendance is marked!") - break - elif response is Cancel: - break - elif response is No: - if i == 2: - img_path=os.path.join(os.getcwd(), 'images',self.class_name,"unrecognized students", os.path.basename(captured_image)) - cv2.imwrite(img_path,frame) - messagebox.showinfo("Unrecognized Student", "You were not recognized as any student of this class.\nYour attendance will be marked later if you really are") - cv2.imwrite(img_path,frame) - os.remove(captured_image) + i += 1 - i += 1 -if __name__ == '__main__': - pass - +if __name__ == "__main__": + pass diff --git a/poetry.lock b/poetry.lock index e43d185..0fda4eb 100644 --- a/poetry.lock +++ b/poetry.lock @@ -1,3 +1,50 @@ +[[package]] +name = "appdirs" +version = "1.4.4" +description = "A small Python module for determining appropriate platform-specific dirs, e.g. a \"user data dir\"." +category = "dev" +optional = false +python-versions = "*" + +[[package]] +name = "black" +version = "20.8b1" +description = "The uncompromising code formatter." +category = "dev" +optional = false +python-versions = ">=3.6" + +[package.dependencies] +appdirs = "*" +click = ">=7.1.2" +dataclasses = {version = ">=0.6", markers = "python_version < \"3.7\""} +mypy-extensions = ">=0.4.3" +pathspec = ">=0.6,<1" +regex = ">=2020.1.8" +toml = ">=0.10.1" +typed-ast = ">=1.4.0" +typing-extensions = ">=3.7.4" + +[package.extras] +colorama = ["colorama (>=0.4.3)"] +d = ["aiohttp (>=3.3.2)", "aiohttp-cors"] + +[[package]] +name = "click" +version = "7.1.2" +description = "Composable command line interface toolkit" +category = "dev" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" + +[[package]] +name = "dataclasses" +version = "0.8" +description = "A backport of the dataclasses module for Python 3.6" +category = "dev" +optional = false +python-versions = ">=3.6, <3.7" + [[package]] name = "et-xmlfile" version = "1.0.1" @@ -6,6 +53,35 @@ category = "main" optional = false python-versions = "*" +[[package]] +name = "flake8" +version = "3.8.4" +description = "the modular source code checker: pep8 pyflakes and co" +category = "dev" +optional = false +python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,>=2.7" + +[package.dependencies] +importlib-metadata = {version = "*", markers = "python_version < \"3.8\""} +mccabe = ">=0.6.0,<0.7.0" +pycodestyle = ">=2.6.0a1,<2.7.0" +pyflakes = ">=2.2.0,<2.3.0" + +[[package]] +name = "importlib-metadata" +version = "3.1.1" +description = "Read metadata from Python packages" +category = "dev" +optional = false +python-versions = ">=3.6" + +[package.dependencies] +zipp = ">=0.5" + +[package.extras] +docs = ["sphinx", "jaraco.packaging (>=3.2)", "rst.linker (>=1.9)"] +testing = ["pytest (>=3.5,!=3.7.3)", "pytest-checkdocs (>=1.2.3)", "pytest-flake8", "pytest-cov", "jaraco.test (>=3.2.0)", "packaging", "pep517", "pyfakefs", "flufl.flake8", "pytest-black (>=0.3.7)", "pytest-mypy", "importlib-resources (>=1.3)"] + [[package]] name = "jdcal" version = "1.4.1" @@ -14,6 +90,14 @@ category = "main" optional = false python-versions = "*" +[[package]] +name = "mccabe" +version = "0.6.1" +description = "McCabe checker, plugin for flake8" +category = "dev" +optional = false +python-versions = "*" + [[package]] name = "mouseinfo" version = "0.1.3" @@ -31,6 +115,14 @@ pyperclip = "*" python3-Xlib = {version = "*", markers = "platform_system == \"Linux\" and python_version >= \"3.0\""} rubicon-objc = {version = "*", markers = "platform_system == \"Darwin\""} +[[package]] +name = "mypy-extensions" +version = "0.4.3" +description = "Experimental type system extensions for programs checked with the mypy typechecker." +category = "dev" +optional = false +python-versions = "*" + [[package]] name = "numpy" version = "1.19.4" @@ -62,6 +154,14 @@ python-versions = ">=3.6," et-xmlfile = "*" jdcal = "*" +[[package]] +name = "pathspec" +version = "0.8.1" +description = "Utility library for gitignore style pattern matching of file paths." +category = "dev" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" + [[package]] name = "pillow" version = "8.0.1" @@ -88,6 +188,22 @@ pyscreeze = ">=0.1.21" python3-Xlib = {version = "*", markers = "platform_system == \"Linux\" and python_version >= \"3.0\""} PyTweening = ">=1.0.1" +[[package]] +name = "pycodestyle" +version = "2.6.0" +description = "Python style guide checker" +category = "dev" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" + +[[package]] +name = "pyflakes" +version = "2.2.0" +description = "passive checker of Python programs" +category = "dev" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" + [[package]] name = "pygetwindow" version = "0.0.9" @@ -1738,6 +1854,14 @@ category = "main" optional = false python-versions = "*" +[[package]] +name = "regex" +version = "2020.11.13" +description = "Alternative regular expression module, to replace re." +category = "dev" +optional = false +python-versions = "*" + [[package]] name = "rubicon-objc" version = "0.4.0" @@ -1746,22 +1870,89 @@ category = "main" optional = false python-versions = ">=3.5" +[[package]] +name = "toml" +version = "0.10.2" +description = "Python Library for Tom's Obvious, Minimal Language" +category = "dev" +optional = false +python-versions = ">=2.6, !=3.0.*, !=3.1.*, !=3.2.*" + +[[package]] +name = "typed-ast" +version = "1.4.1" +description = "a fork of Python 2 and 3 ast modules with type comment support" +category = "dev" +optional = false +python-versions = "*" + +[[package]] +name = "typing-extensions" +version = "3.7.4.3" +description = "Backported and Experimental Type Hints for Python 3.5+" +category = "dev" +optional = false +python-versions = "*" + +[[package]] +name = "zipp" +version = "3.4.0" +description = "Backport of pathlib-compatible object wrapper for zip files" +category = "dev" +optional = false +python-versions = ">=3.6" + +[package.extras] +docs = ["sphinx", "jaraco.packaging (>=3.2)", "rst.linker (>=1.9)"] +testing = ["pytest (>=3.5,!=3.7.3)", "pytest-checkdocs (>=1.2.3)", "pytest-flake8", "pytest-cov", "jaraco.test (>=3.2.0)", "jaraco.itertools", "func-timeout", "pytest-black (>=0.3.7)", "pytest-mypy"] + [metadata] lock-version = "1.1" python-versions = "^3.6" -content-hash = "94a92226a439e8c086159a1d0e725cd5c2df75d59337e19e80b190a17e7c0e6b" +content-hash = "d3761de8bf013a581c79cb2e493eb47ef1c3282d8866713cadaac664f6789e27" [metadata.files] +appdirs = [ + {file = "appdirs-1.4.4-py2.py3-none-any.whl", hash = "sha256:a841dacd6b99318a741b166adb07e19ee71a274450e68237b4650ca1055ab128"}, + {file = "appdirs-1.4.4.tar.gz", hash = "sha256:7d5d0167b2b1ba821647616af46a749d1c653740dd0d2415100fe26e27afdf41"}, +] +black = [ + {file = "black-20.8b1.tar.gz", hash = "sha256:1c02557aa099101b9d21496f8a914e9ed2222ef70336404eeeac8edba836fbea"}, +] +click = [ + {file = "click-7.1.2-py2.py3-none-any.whl", hash = "sha256:dacca89f4bfadd5de3d7489b7c8a566eee0d3676333fbb50030263894c38c0dc"}, + {file = "click-7.1.2.tar.gz", hash = "sha256:d2b5255c7c6349bc1bd1e59e08cd12acbbd63ce649f2588755783aa94dfb6b1a"}, +] +dataclasses = [ + {file = "dataclasses-0.8-py3-none-any.whl", hash = "sha256:0201d89fa866f68c8ebd9d08ee6ff50c0b255f8ec63a71c16fda7af82bb887bf"}, + {file = "dataclasses-0.8.tar.gz", hash = "sha256:8479067f342acf957dc82ec415d355ab5edb7e7646b90dc6e2fd1d96ad084c97"}, +] et-xmlfile = [ {file = "et_xmlfile-1.0.1.tar.gz", hash = "sha256:614d9722d572f6246302c4491846d2c393c199cfa4edc9af593437691683335b"}, ] +flake8 = [ + {file = "flake8-3.8.4-py2.py3-none-any.whl", hash = "sha256:749dbbd6bfd0cf1318af27bf97a14e28e5ff548ef8e5b1566ccfb25a11e7c839"}, + {file = "flake8-3.8.4.tar.gz", hash = "sha256:aadae8761ec651813c24be05c6f7b4680857ef6afaae4651a4eccaef97ce6c3b"}, +] +importlib-metadata = [ + {file = "importlib_metadata-3.1.1-py3-none-any.whl", hash = "sha256:6112e21359ef8f344e7178aa5b72dc6e62b38b0d008e6d3cb212c5b84df72013"}, + {file = "importlib_metadata-3.1.1.tar.gz", hash = "sha256:b0c2d3b226157ae4517d9625decf63591461c66b3a808c2666d538946519d170"}, +] jdcal = [ {file = "jdcal-1.4.1-py2.py3-none-any.whl", hash = "sha256:1abf1305fce18b4e8aa248cf8fe0c56ce2032392bc64bbd61b5dff2a19ec8bba"}, {file = "jdcal-1.4.1.tar.gz", hash = "sha256:472872e096eb8df219c23f2689fc336668bdb43d194094b5cc1707e1640acfc8"}, ] +mccabe = [ + {file = "mccabe-0.6.1-py2.py3-none-any.whl", hash = "sha256:ab8a6258860da4b6677da4bd2fe5dc2c659cff31b3ee4f7f5d64e79735b80d42"}, + {file = "mccabe-0.6.1.tar.gz", hash = "sha256:dd8d182285a0fe56bace7f45b5e7d1a6ebcbf524e8f3bd87eb0f125271b8831f"}, +] mouseinfo = [ {file = "MouseInfo-0.1.3.tar.gz", hash = "sha256:2c62fb8885062b8e520a3cce0a297c657adcc08c60952eb05bc8256ef6f7f6e7"}, ] +mypy-extensions = [ + {file = "mypy_extensions-0.4.3-py2.py3-none-any.whl", hash = "sha256:090fedd75945a69ae91ce1303b5824f428daf5a028d2f6ab8a299250a846f15d"}, + {file = "mypy_extensions-0.4.3.tar.gz", hash = "sha256:2d82818f5bb3e369420cb3c4060a7970edba416647068eb4c5343488a6c604a8"}, +] numpy = [ {file = "numpy-1.19.4-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:e9b30d4bd69498fc0c3fe9db5f62fffbb06b8eb9321f92cc970f2969be5e3949"}, {file = "numpy-1.19.4-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:fedbd128668ead37f33917820b704784aff695e0019309ad446a6d0b065b57e4"}, @@ -1824,6 +2015,10 @@ openpyxl = [ {file = "openpyxl-3.0.5-py2.py3-none-any.whl", hash = "sha256:f7d666b569f729257082cf7ddc56262431878f602dcc2bc3980775c59439cdab"}, {file = "openpyxl-3.0.5.tar.gz", hash = "sha256:18e11f9a650128a12580a58e3daba14e00a11d9e907c554a17ea016bf1a2c71b"}, ] +pathspec = [ + {file = "pathspec-0.8.1-py2.py3-none-any.whl", hash = "sha256:aa0cb481c4041bf52ffa7b0d8fa6cd3e88a2ca4879c533c9153882ee2556790d"}, + {file = "pathspec-0.8.1.tar.gz", hash = "sha256:86379d6b86d75816baba717e64b1a3a3469deb93bb76d613c9ce79edc5cb68fd"}, +] pillow = [ {file = "Pillow-8.0.1-cp36-cp36m-macosx_10_10_x86_64.whl", hash = "sha256:b63d4ff734263ae4ce6593798bcfee6dbfb00523c82753a3a03cbc05555a9cc3"}, {file = "Pillow-8.0.1-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:5f9403af9c790cc18411ea398a6950ee2def2a830ad0cfe6dc9122e6d528b302"}, @@ -1857,6 +2052,14 @@ pillow = [ pyautogui = [ {file = "PyAutoGUI-0.9.52.tar.gz", hash = "sha256:a486cb6b818bcbcdf98b48d010c7cee964134fa394b756e8ce6e50d43b58ecc8"}, ] +pycodestyle = [ + {file = "pycodestyle-2.6.0-py2.py3-none-any.whl", hash = "sha256:2295e7b2f6b5bd100585ebcb1f616591b652db8a741695b3d8f5d28bdc934367"}, + {file = "pycodestyle-2.6.0.tar.gz", hash = "sha256:c58a7d2815e0e8d7972bf1803331fb0152f867bd89adf8a01dfd55085434192e"}, +] +pyflakes = [ + {file = "pyflakes-2.2.0-py2.py3-none-any.whl", hash = "sha256:0d94e0e05a19e57a99444b6ddcf9a6eb2e5c68d3ca1e98e90707af8152c90a92"}, + {file = "pyflakes-2.2.0.tar.gz", hash = "sha256:35b2d75ee967ea93b55750aa9edbbf72813e06a66ba54438df2cfac9e3c27fc8"}, +] pygetwindow = [ {file = "PyGetWindow-0.0.9.tar.gz", hash = "sha256:17894355e7d2b305cd832d717708384017c1698a90ce24f6f7fbf0242dd0a688"}, ] @@ -2373,7 +2576,95 @@ python3-xlib = [ pytweening = [ {file = "PyTweening-1.0.3.zip", hash = "sha256:4b608a570f4dccf2201e898f643c2a12372eb1d71a3dbc7e778771b603ca248b"}, ] +regex = [ + {file = "regex-2020.11.13-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:8b882a78c320478b12ff024e81dc7d43c1462aa4a3341c754ee65d857a521f85"}, + {file = "regex-2020.11.13-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:a63f1a07932c9686d2d416fb295ec2c01ab246e89b4d58e5fa468089cab44b70"}, + {file = "regex-2020.11.13-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:6e4b08c6f8daca7d8f07c8d24e4331ae7953333dbd09c648ed6ebd24db5a10ee"}, + {file = "regex-2020.11.13-cp36-cp36m-manylinux2010_i686.whl", hash = "sha256:bba349276b126947b014e50ab3316c027cac1495992f10e5682dc677b3dfa0c5"}, + {file = "regex-2020.11.13-cp36-cp36m-manylinux2010_x86_64.whl", hash = "sha256:56e01daca75eae420bce184edd8bb341c8eebb19dd3bce7266332258f9fb9dd7"}, + {file = "regex-2020.11.13-cp36-cp36m-manylinux2014_aarch64.whl", hash = "sha256:6a8ce43923c518c24a2579fda49f093f1397dad5d18346211e46f134fc624e31"}, + {file = "regex-2020.11.13-cp36-cp36m-manylinux2014_i686.whl", hash = "sha256:1ab79fcb02b930de09c76d024d279686ec5d532eb814fd0ed1e0051eb8bd2daa"}, + {file = "regex-2020.11.13-cp36-cp36m-manylinux2014_x86_64.whl", hash = "sha256:9801c4c1d9ae6a70aeb2128e5b4b68c45d4f0af0d1535500884d644fa9b768c6"}, + {file = "regex-2020.11.13-cp36-cp36m-win32.whl", hash = "sha256:49cae022fa13f09be91b2c880e58e14b6da5d10639ed45ca69b85faf039f7a4e"}, + {file = "regex-2020.11.13-cp36-cp36m-win_amd64.whl", hash = "sha256:749078d1eb89484db5f34b4012092ad14b327944ee7f1c4f74d6279a6e4d1884"}, + {file = "regex-2020.11.13-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:b2f4007bff007c96a173e24dcda236e5e83bde4358a557f9ccf5e014439eae4b"}, + {file = "regex-2020.11.13-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:38c8fd190db64f513fe4e1baa59fed086ae71fa45083b6936b52d34df8f86a88"}, + {file = "regex-2020.11.13-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:5862975b45d451b6db51c2e654990c1820523a5b07100fc6903e9c86575202a0"}, + {file = "regex-2020.11.13-cp37-cp37m-manylinux2010_i686.whl", hash = "sha256:262c6825b309e6485ec2493ffc7e62a13cf13fb2a8b6d212f72bd53ad34118f1"}, + {file = "regex-2020.11.13-cp37-cp37m-manylinux2010_x86_64.whl", hash = "sha256:bafb01b4688833e099d79e7efd23f99172f501a15c44f21ea2118681473fdba0"}, + {file = "regex-2020.11.13-cp37-cp37m-manylinux2014_aarch64.whl", hash = "sha256:e32f5f3d1b1c663af7f9c4c1e72e6ffe9a78c03a31e149259f531e0fed826512"}, + {file = "regex-2020.11.13-cp37-cp37m-manylinux2014_i686.whl", hash = "sha256:3bddc701bdd1efa0d5264d2649588cbfda549b2899dc8d50417e47a82e1387ba"}, + {file = "regex-2020.11.13-cp37-cp37m-manylinux2014_x86_64.whl", hash = "sha256:02951b7dacb123d8ea6da44fe45ddd084aa6777d4b2454fa0da61d569c6fa538"}, + {file = "regex-2020.11.13-cp37-cp37m-win32.whl", hash = "sha256:0d08e71e70c0237883d0bef12cad5145b84c3705e9c6a588b2a9c7080e5af2a4"}, + {file = "regex-2020.11.13-cp37-cp37m-win_amd64.whl", hash = "sha256:1fa7ee9c2a0e30405e21031d07d7ba8617bc590d391adfc2b7f1e8b99f46f444"}, + {file = "regex-2020.11.13-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:baf378ba6151f6e272824b86a774326f692bc2ef4cc5ce8d5bc76e38c813a55f"}, + {file = "regex-2020.11.13-cp38-cp38-manylinux1_i686.whl", hash = "sha256:e3faaf10a0d1e8e23a9b51d1900b72e1635c2d5b0e1bea1c18022486a8e2e52d"}, + {file = "regex-2020.11.13-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:2a11a3e90bd9901d70a5b31d7dd85114755a581a5da3fc996abfefa48aee78af"}, + {file = "regex-2020.11.13-cp38-cp38-manylinux2010_i686.whl", hash = "sha256:d1ebb090a426db66dd80df8ca85adc4abfcbad8a7c2e9a5ec7513ede522e0a8f"}, + {file = "regex-2020.11.13-cp38-cp38-manylinux2010_x86_64.whl", hash = "sha256:b2b1a5ddae3677d89b686e5c625fc5547c6e492bd755b520de5332773a8af06b"}, + {file = "regex-2020.11.13-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:2c99e97d388cd0a8d30f7c514d67887d8021541b875baf09791a3baad48bb4f8"}, + {file = "regex-2020.11.13-cp38-cp38-manylinux2014_i686.whl", hash = "sha256:c084582d4215593f2f1d28b65d2a2f3aceff8342aa85afd7be23a9cad74a0de5"}, + {file = "regex-2020.11.13-cp38-cp38-manylinux2014_x86_64.whl", hash = "sha256:a3d748383762e56337c39ab35c6ed4deb88df5326f97a38946ddd19028ecce6b"}, + {file = "regex-2020.11.13-cp38-cp38-win32.whl", hash = "sha256:7913bd25f4ab274ba37bc97ad0e21c31004224ccb02765ad984eef43e04acc6c"}, + {file = "regex-2020.11.13-cp38-cp38-win_amd64.whl", hash = "sha256:6c54ce4b5d61a7129bad5c5dc279e222afd00e721bf92f9ef09e4fae28755683"}, + {file = "regex-2020.11.13-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:1862a9d9194fae76a7aaf0150d5f2a8ec1da89e8b55890b1786b8f88a0f619dc"}, + {file = "regex-2020.11.13-cp39-cp39-manylinux1_i686.whl", hash = "sha256:4902e6aa086cbb224241adbc2f06235927d5cdacffb2425c73e6570e8d862364"}, + {file = "regex-2020.11.13-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:7a25fcbeae08f96a754b45bdc050e1fb94b95cab046bf56b016c25e9ab127b3e"}, + {file = "regex-2020.11.13-cp39-cp39-manylinux2010_i686.whl", hash = "sha256:d2d8ce12b7c12c87e41123997ebaf1a5767a5be3ec545f64675388970f415e2e"}, + {file = "regex-2020.11.13-cp39-cp39-manylinux2010_x86_64.whl", hash = "sha256:f7d29a6fc4760300f86ae329e3b6ca28ea9c20823df123a2ea8693e967b29917"}, + {file = "regex-2020.11.13-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:717881211f46de3ab130b58ec0908267961fadc06e44f974466d1887f865bd5b"}, + {file = "regex-2020.11.13-cp39-cp39-manylinux2014_i686.whl", hash = "sha256:3128e30d83f2e70b0bed9b2a34e92707d0877e460b402faca908c6667092ada9"}, + {file = "regex-2020.11.13-cp39-cp39-manylinux2014_x86_64.whl", hash = "sha256:8f6a2229e8ad946e36815f2a03386bb8353d4bde368fdf8ca5f0cb97264d3b5c"}, + {file = "regex-2020.11.13-cp39-cp39-win32.whl", hash = "sha256:f8f295db00ef5f8bae530fc39af0b40486ca6068733fb860b42115052206466f"}, + {file = "regex-2020.11.13-cp39-cp39-win_amd64.whl", hash = "sha256:a15f64ae3a027b64496a71ab1f722355e570c3fac5ba2801cafce846bf5af01d"}, + {file = "regex-2020.11.13.tar.gz", hash = "sha256:83d6b356e116ca119db8e7c6fc2983289d87b27b3fac238cfe5dca529d884562"}, +] rubicon-objc = [ {file = "rubicon-objc-0.4.0.tar.gz", hash = "sha256:a54be431be212c95106b3f9dbb3903fd96683caca926613ba7dd8b4605cb87cc"}, {file = "rubicon_objc-0.4.0-py3-none-any.whl", hash = "sha256:010a567ecc1c5891ce1edee7b7b305648b8bc97fb3da4c5745d20c4b5fadf45f"}, ] +toml = [ + {file = "toml-0.10.2-py2.py3-none-any.whl", hash = "sha256:806143ae5bfb6a3c6e736a764057db0e6a0e05e338b5630894a5f779cabb4f9b"}, + {file = "toml-0.10.2.tar.gz", hash = "sha256:b3bda1d108d5dd99f4a20d24d9c348e91c4db7ab1b749200bded2f839ccbe68f"}, +] +typed-ast = [ + {file = "typed_ast-1.4.1-cp35-cp35m-manylinux1_i686.whl", hash = "sha256:73d785a950fc82dd2a25897d525d003f6378d1cb23ab305578394694202a58c3"}, + {file = "typed_ast-1.4.1-cp35-cp35m-manylinux1_x86_64.whl", hash = "sha256:aaee9905aee35ba5905cfb3c62f3e83b3bec7b39413f0a7f19be4e547ea01ebb"}, + {file = "typed_ast-1.4.1-cp35-cp35m-win32.whl", hash = "sha256:0c2c07682d61a629b68433afb159376e24e5b2fd4641d35424e462169c0a7919"}, + {file = "typed_ast-1.4.1-cp35-cp35m-win_amd64.whl", hash = "sha256:4083861b0aa07990b619bd7ddc365eb7fa4b817e99cf5f8d9cf21a42780f6e01"}, + {file = "typed_ast-1.4.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:269151951236b0f9a6f04015a9004084a5ab0d5f19b57de779f908621e7d8b75"}, + {file = "typed_ast-1.4.1-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:24995c843eb0ad11a4527b026b4dde3da70e1f2d8806c99b7b4a7cf491612652"}, + {file = "typed_ast-1.4.1-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:fe460b922ec15dd205595c9b5b99e2f056fd98ae8f9f56b888e7a17dc2b757e7"}, + {file = "typed_ast-1.4.1-cp36-cp36m-manylinux2014_aarch64.whl", hash = "sha256:fcf135e17cc74dbfbc05894ebca928ffeb23d9790b3167a674921db19082401f"}, + {file = "typed_ast-1.4.1-cp36-cp36m-win32.whl", hash = "sha256:4e3e5da80ccbebfff202a67bf900d081906c358ccc3d5e3c8aea42fdfdfd51c1"}, + {file = "typed_ast-1.4.1-cp36-cp36m-win_amd64.whl", hash = "sha256:249862707802d40f7f29f6e1aad8d84b5aa9e44552d2cc17384b209f091276aa"}, + {file = "typed_ast-1.4.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:8ce678dbaf790dbdb3eba24056d5364fb45944f33553dd5869b7580cdbb83614"}, + {file = "typed_ast-1.4.1-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:c9e348e02e4d2b4a8b2eedb48210430658df6951fa484e59de33ff773fbd4b41"}, + {file = "typed_ast-1.4.1-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:bcd3b13b56ea479b3650b82cabd6b5343a625b0ced5429e4ccad28a8973f301b"}, + {file = "typed_ast-1.4.1-cp37-cp37m-manylinux2014_aarch64.whl", hash = "sha256:f208eb7aff048f6bea9586e61af041ddf7f9ade7caed625742af423f6bae3298"}, + {file = "typed_ast-1.4.1-cp37-cp37m-win32.whl", hash = "sha256:d5d33e9e7af3b34a40dc05f498939f0ebf187f07c385fd58d591c533ad8562fe"}, + {file = "typed_ast-1.4.1-cp37-cp37m-win_amd64.whl", hash = "sha256:0666aa36131496aed8f7be0410ff974562ab7eeac11ef351def9ea6fa28f6355"}, + {file = "typed_ast-1.4.1-cp38-cp38-macosx_10_15_x86_64.whl", hash = "sha256:d205b1b46085271b4e15f670058ce182bd1199e56b317bf2ec004b6a44f911f6"}, + {file = "typed_ast-1.4.1-cp38-cp38-manylinux1_i686.whl", hash = "sha256:6daac9731f172c2a22ade6ed0c00197ee7cc1221aa84cfdf9c31defeb059a907"}, + {file = "typed_ast-1.4.1-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:498b0f36cc7054c1fead3d7fc59d2150f4d5c6c56ba7fb150c013fbc683a8d2d"}, + {file = "typed_ast-1.4.1-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:7e4c9d7658aaa1fc80018593abdf8598bf91325af6af5cce4ce7c73bc45ea53d"}, + {file = "typed_ast-1.4.1-cp38-cp38-win32.whl", hash = "sha256:715ff2f2df46121071622063fc7543d9b1fd19ebfc4f5c8895af64a77a8c852c"}, + {file = "typed_ast-1.4.1-cp38-cp38-win_amd64.whl", hash = "sha256:fc0fea399acb12edbf8a628ba8d2312f583bdbdb3335635db062fa98cf71fca4"}, + {file = "typed_ast-1.4.1-cp39-cp39-macosx_10_15_x86_64.whl", hash = "sha256:d43943ef777f9a1c42bf4e552ba23ac77a6351de620aa9acf64ad54933ad4d34"}, + {file = "typed_ast-1.4.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:92c325624e304ebf0e025d1224b77dd4e6393f18aab8d829b5b7e04afe9b7a2c"}, + {file = "typed_ast-1.4.1-cp39-cp39-manylinux1_i686.whl", hash = "sha256:d648b8e3bf2fe648745c8ffcee3db3ff903d0817a01a12dd6a6ea7a8f4889072"}, + {file = "typed_ast-1.4.1-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:fac11badff8313e23717f3dada86a15389d0708275bddf766cca67a84ead3e91"}, + {file = "typed_ast-1.4.1-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:0d8110d78a5736e16e26213114a38ca35cb15b6515d535413b090bd50951556d"}, + {file = "typed_ast-1.4.1-cp39-cp39-win32.whl", hash = "sha256:b52ccf7cfe4ce2a1064b18594381bccf4179c2ecf7f513134ec2f993dd4ab395"}, + {file = "typed_ast-1.4.1-cp39-cp39-win_amd64.whl", hash = "sha256:3742b32cf1c6ef124d57f95be609c473d7ec4c14d0090e5a5e05a15269fb4d0c"}, + {file = "typed_ast-1.4.1.tar.gz", hash = "sha256:8c8aaad94455178e3187ab22c8b01a3837f8ee50e09cf31f1ba129eb293ec30b"}, +] +typing-extensions = [ + {file = "typing_extensions-3.7.4.3-py2-none-any.whl", hash = "sha256:dafc7639cde7f1b6e1acc0f457842a83e722ccca8eef5270af2d74792619a89f"}, + {file = "typing_extensions-3.7.4.3-py3-none-any.whl", hash = "sha256:7cb407020f00f7bfc3cb3e7881628838e69d8f3fcab2f64742a5e76b2f841918"}, + {file = "typing_extensions-3.7.4.3.tar.gz", hash = "sha256:99d4073b617d30288f569d3f13d2bd7548c3a7e4c8de87db09a9d29bb3a4a60c"}, +] +zipp = [ + {file = "zipp-3.4.0-py3-none-any.whl", hash = "sha256:102c24ef8f171fd729d46599845e95c7ab894a4cf45f5de11a44cc7444fb1108"}, + {file = "zipp-3.4.0.tar.gz", hash = "sha256:ed5eee1974372595f9e416cc7bbeeb12335201d8081ca8a0743c954d4446e5cb"}, +] diff --git a/pyproject.toml b/pyproject.toml index 49f043c..b546573 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -13,6 +13,8 @@ PyAutoGUI = "^0.9.52" opencv-contrib-python = "^4.4.0" [tool.poetry.dev-dependencies] +flake8 = "^3.8.4" +black = "^20.8b1" [build-system] requires = ["poetry-core>=1.0.0"] diff --git a/requirements.txt b/requirements.txt index dc8a016..ae7d9ac 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,489 +1,136 @@ -et-xmlfile==1.0.1; python_version >= "3.6" \ - --hash=sha256:614d9722d572f6246302c4491846d2c393c199cfa4edc9af593437691683335b -jdcal==1.4.1; python_version >= "3.6" \ - --hash=sha256:1abf1305fce18b4e8aa248cf8fe0c56ce2032392bc64bbd61b5dff2a19ec8bba \ - --hash=sha256:472872e096eb8df219c23f2689fc336668bdb43d194094b5cc1707e1640acfc8 -mouseinfo==0.1.3 \ - --hash=sha256:2c62fb8885062b8e520a3cce0a297c657adcc08c60952eb05bc8256ef6f7f6e7 -numpy==1.19.4; python_version >= "3.6" \ - --hash=sha256:e9b30d4bd69498fc0c3fe9db5f62fffbb06b8eb9321f92cc970f2969be5e3949 \ - --hash=sha256:fedbd128668ead37f33917820b704784aff695e0019309ad446a6d0b065b57e4 \ - --hash=sha256:8ece138c3a16db8c1ad38f52eb32be6086cc72f403150a79336eb2045723a1ad \ - --hash=sha256:64324f64f90a9e4ef732be0928be853eee378fd6a01be21a0a8469c4f2682c83 \ - --hash=sha256:ad6f2ff5b1989a4899bf89800a671d71b1612e5ff40866d1f4d8bcf48d4e5764 \ - --hash=sha256:d6c7bb82883680e168b55b49c70af29b84b84abb161cbac2800e8fcb6f2109b6 \ - --hash=sha256:13d166f77d6dc02c0a73c1101dd87fdf01339febec1030bd810dcd53fff3b0f1 \ - --hash=sha256:448ebb1b3bf64c0267d6b09a7cba26b5ae61b6d2dbabff7c91b660c7eccf2bdb \ - --hash=sha256:27d3f3b9e3406579a8af3a9f262f5339005dd25e0ecf3cf1559ff8a49ed5cbf2 \ - --hash=sha256:16c1b388cc31a9baa06d91a19366fb99ddbe1c7b205293ed072211ee5bac1ed2 \ - --hash=sha256:e5b6ed0f0b42317050c88022349d994fe72bfe35f5908617512cd8c8ef9da2a9 \ - --hash=sha256:18bed2bcb39e3f758296584337966e68d2d5ba6aab7e038688ad53c8f889f757 \ - --hash=sha256:fe45becb4c2f72a0907c1d0246ea6449fe7a9e2293bb0e11c4e9a32bb0930a15 \ - --hash=sha256:6d7593a705d662be5bfe24111af14763016765f43cb6923ed86223f965f52387 \ - --hash=sha256:6ae6c680f3ebf1cf7ad1d7748868b39d9f900836df774c453c11c5440bc15b36 \ - --hash=sha256:9eeb7d1d04b117ac0d38719915ae169aa6b61fca227b0b7d198d43728f0c879c \ - --hash=sha256:cb1017eec5257e9ac6209ac172058c430e834d5d2bc21961dceeb79d111e5909 \ - --hash=sha256:edb01671b3caae1ca00881686003d16c2209e07b7ef8b7639f1867852b948f7c \ - --hash=sha256:f29454410db6ef8126c83bd3c968d143304633d45dc57b51252afbd79d700893 \ - --hash=sha256:ec149b90019852266fec2341ce1db513b843e496d5a8e8cdb5ced1923a92faab \ - --hash=sha256:1aeef46a13e51931c0b1cf8ae1168b4a55ecd282e6688fdb0a948cc5a1d5afb9 \ - --hash=sha256:08308c38e44cc926bdfce99498b21eec1f848d24c302519e64203a8da99a97db \ - --hash=sha256:5734bdc0342aba9dfc6f04920988140fb41234db42381cf7ccba64169f9fe7ac \ - --hash=sha256:09c12096d843b90eafd01ea1b3307e78ddd47a55855ad402b157b6c4862197ce \ - --hash=sha256:e452dc66e08a4ce642a961f134814258a082832c78c90351b75c41ad16f79f63 \ - --hash=sha256:a5d897c14513590a85774180be713f692df6fa8ecf6483e561a6d47309566f37 \ - --hash=sha256:a09f98011236a419ee3f49cedc9ef27d7a1651df07810ae430a6b06576e0b414 \ - --hash=sha256:50e86c076611212ca62e5a59f518edafe0c0730f7d9195fec718da1a5c2bb1fc \ - --hash=sha256:f0d3929fe88ee1c155129ecd82f981b8856c5d97bcb0d5f23e9b4242e79d1de3 \ - --hash=sha256:c42c4b73121caf0ed6cd795512c9c09c52a7287b04d105d112068c1736d7c753 \ - --hash=sha256:8cac8790a6b1ddf88640a9267ee67b1aee7a57dfa2d2dd33999d080bc8ee3a0f \ - --hash=sha256:4377e10b874e653fe96985c05feed2225c912e328c8a26541f7fc600fb9c637b \ - --hash=sha256:2a2740aa9733d2e5b2dfb33639d98a64c3b0f24765fed86b0fd2aec07f6a0a08 \ - --hash=sha256:141ec3a3300ab89c7f2b0775289954d193cc8edb621ea05f99db9cb181530512 -opencv-contrib-python==4.4.0.46; python_version >= "3.6" \ - --hash=sha256:03ac8e26168ff47913eae6599a18677dc59c63dce79302da4d3463ed152d9181 \ - --hash=sha256:fda8d9c1cb7c0e52e9513a5f03a4374cf158ed8d1294e7a627b191e213a37d22 \ - --hash=sha256:ad14a6ee335e17d0e5872129433b85cb1c4e9eccf9e2fe1845d9673640cb7947 \ - --hash=sha256:5669e35eb8ca6c90463a62c384f2591ec9dd4c0451d80a79c3cd0640f982b410 \ - --hash=sha256:1e5524d439e35300d16b63e665f1723815ddc3589faedfd04befd8a8a7a68258 \ - --hash=sha256:0e339f6642bd9795b76bb60ef6bb1dfc26fc37fe740e53efe3f548d4c4eadfb2 \ - --hash=sha256:189747be0c23e4eb969d7e2646330659ba96b762706f747c494385c6c1ad271b \ - --hash=sha256:92af26ec3e3c28ce3b212defa8fdaf351cca5a79bf8381d1a226f7306ebc679a \ - --hash=sha256:4df2964163ff9b9ec7847a3292044903c4e0b569a5fd2cb21bdf289118ee93e0 \ - --hash=sha256:7bd5784347a7129965a6a877306575c25ad8ba3f51ddf1072258d7c900f2c0ad \ - --hash=sha256:c8a05a5786cc5a0f74ccc4d9e1f436edc2d0630718d066c78c4094abba1c2f41 \ - --hash=sha256:4ee37623947bb21cc76a7a263a849aa51eeda5889f2ee8fe614f7ee5f0d8a9c8 \ - --hash=sha256:b843462a8e0d0b51941c5b164226825640941355d83ecd731e72365be00e387f \ - --hash=sha256:baf98e86f0651e3230829e13698bddc657e66dbc8a75410dd67d416b66f25be8 \ - --hash=sha256:242e00a67776de26417d92881a4de3ffd0f4b11827ff358af8827c289583e62e \ - --hash=sha256:e00b1a18aa6e59418741dd3378a0838805aefe33906b31280a53ba04155a1f77 \ - --hash=sha256:48fab212b52ab9734b68ed9ef5b967faa031aed4f985b89edc52315342590770 \ - --hash=sha256:b3faa83874f32ae380ab822a12d1f8af652fb70dbaff01b8986f732df628ee6b \ - --hash=sha256:7ff3a3e7076ddc5872918c9ab75b52631f131e7d9db0ab06a03a0fca692d0769 \ - --hash=sha256:e5af77c29bc3b775358fd3c7305643409386beb7862931a1c10dca63e2ba40b2 -openpyxl==3.0.5; python_version >= "3.6" \ - --hash=sha256:f7d666b569f729257082cf7ddc56262431878f602dcc2bc3980775c59439cdab \ - --hash=sha256:18e11f9a650128a12580a58e3daba14e00a11d9e907c554a17ea016bf1a2c71b -pillow==8.0.1; python_version >= "3.6" \ - --hash=sha256:b63d4ff734263ae4ce6593798bcfee6dbfb00523c82753a3a03cbc05555a9cc3 \ - --hash=sha256:5f9403af9c790cc18411ea398a6950ee2def2a830ad0cfe6dc9122e6d528b302 \ - --hash=sha256:6b4a8fd632b4ebee28282a9fef4c341835a1aa8671e2770b6f89adc8e8c2703c \ - --hash=sha256:cc3ea6b23954da84dbee8025c616040d9aa5eaf34ea6895a0a762ee9d3e12e11 \ - --hash=sha256:d8a96747df78cda35980905bf26e72960cba6d355ace4780d4bdde3b217cdf1e \ - --hash=sha256:7ba0ba61252ab23052e642abdb17fd08fdcfdbbf3b74c969a30c58ac1ade7cd3 \ - --hash=sha256:795e91a60f291e75de2e20e6bdd67770f793c8605b553cb6e4387ce0cb302e09 \ - --hash=sha256:0a2e8d03787ec7ad71dc18aec9367c946ef8ef50e1e78c71f743bc3a770f9fae \ - --hash=sha256:006de60d7580d81f4a1a7e9f0173dc90a932e3905cc4d47ea909bc946302311a \ - --hash=sha256:bd7bf289e05470b1bc74889d1466d9ad4a56d201f24397557b6f65c24a6844b8 \ - --hash=sha256:95edb1ed513e68bddc2aee3de66ceaf743590bf16c023fb9977adc4be15bd3f0 \ - --hash=sha256:e38d58d9138ef972fceb7aeec4be02e3f01d383723965bfcef14d174c8ccd039 \ - --hash=sha256:d3d07c86d4efa1facdf32aa878bd508c0dc4f87c48125cc16b937baa4e5b5e11 \ - --hash=sha256:fbd922f702582cb0d71ef94442bfca57624352622d75e3be7a1e7e9360b07e72 \ - --hash=sha256:92c882b70a40c79de9f5294dc99390671e07fc0b0113d472cbea3fde15db1792 \ - --hash=sha256:7c9401e68730d6c4245b8e361d3d13e1035cbc94db86b49dc7da8bec235d0015 \ - --hash=sha256:6c1aca8231625115104a06e4389fcd9ec88f0c9befbabd80dc206c35561be271 \ - --hash=sha256:cc9ec588c6ef3a1325fa032ec14d97b7309db493782ea8c304666fb10c3bd9a7 \ - --hash=sha256:eb472586374dc66b31e36e14720747595c2b265ae962987261f044e5cce644b5 \ - --hash=sha256:0eeeae397e5a79dc088d8297a4c2c6f901f8fb30db47795113a4a605d0f1e5ce \ - --hash=sha256:81f812d8f5e8a09b246515fac141e9d10113229bc33ea073fec11403b016bcf3 \ - --hash=sha256:895d54c0ddc78a478c80f9c438579ac15f3e27bf442c2a9aa74d41d0e4d12544 \ - --hash=sha256:2fb113757a369a6cdb189f8df3226e995acfed0a8919a72416626af1a0a71140 \ - --hash=sha256:59e903ca800c8cfd1ebe482349ec7c35687b95e98cefae213e271c8c7fffa021 \ - --hash=sha256:5abd653a23c35d980b332bc0431d39663b1709d64142e3652890df4c9b6970f6 \ - --hash=sha256:4b0ef2470c4979e345e4e0cc1bbac65fda11d0d7b789dbac035e4c6ce3f98adb \ - --hash=sha256:8de332053707c80963b589b22f8e0229f1be1f3ca862a932c1bcd48dafb18dd8 \ - --hash=sha256:11c5c6e9b02c9dac08af04f093eb5a2f84857df70a7d4a6a6ad461aca803fb9e -pyautogui==0.9.52 \ - --hash=sha256:a486cb6b818bcbcdf98b48d010c7cee964134fa394b756e8ce6e50d43b58ecc8 -pygetwindow==0.0.9 \ - --hash=sha256:17894355e7d2b305cd832d717708384017c1698a90ce24f6f7fbf0242dd0a688 -pymsgbox==1.0.9 \ - --hash=sha256:2194227de8bff7a3d6da541848705a155dcbb2a06ee120d9f280a1d7f51263ff -pyobjc-core==6.2.2 \ - --hash=sha256:38e7b15a042439dadd18b28b78229e52fb882460fc16ddbae342b9972d5a827c \ - --hash=sha256:73938398559b718595076fce4921022f21983dd85ebace3ecbe6182697abe164 \ - --hash=sha256:60d0c57de915b6ed91a9a26e3bdefdcaeb1288623c69f291338208c5a227d190 \ - --hash=sha256:be312b7a0edb45dd8ea68e70f2b411b59677d4ceb513c48eace73cb78dbfd85f \ - --hash=sha256:47a89171d218905dbf13011b1a7d698c246cb66fb5f14119bc0d9e039d0486fa -pyobjc-framework-accounts==6.2.2; python_version >= "3.6" and platform_system == "Darwin" and platform_release >= "14.0" \ - --hash=sha256:9ecf1d03f856617b3ace091bd844ab8ae3f6122ed83cffd4a2c067da19ea2386 \ - --hash=sha256:2dfe6c2d02f0f4d8912cf5dffd66812789daff5e46ac08675505ac1a9979c442 -pyobjc-framework-addressbook==6.2.2; python_version >= "3.6" and platform_system == "Darwin" \ - --hash=sha256:d6f410dc4ac0465b678b2c3d04c870fad387019a5aa2cb27101f43e488e935f0 \ - --hash=sha256:6b17571fe93b20a1649928a644013ef6daf3d4835d7ff4f1cc1fca8070f29513 -pyobjc-framework-adsupport==6.2.2; python_version >= "3.6" and platform_system == "Darwin" and platform_release >= "18.0" \ - --hash=sha256:91851a170b1b2bd9392bdb6cf4cbb9e449950596b5244d4d8098933ab68c5b87 \ - --hash=sha256:92fc08e7089568f67b8bab11aabc60c9287f1aefefee0736ea580d8ff37bccfd -pyobjc-framework-applescriptkit==6.2.2; python_version >= "3.6" and platform_system == "Darwin" \ - --hash=sha256:fa7821d67503997db4e6b77f0d3e855a6564a627e2e2f3e99a83110365971492 \ - --hash=sha256:4d81cc4d0703cc4ad8a4e4e38958e1ccb1fad951efc801b6753883d4f76c984b -pyobjc-framework-applescriptobjc==6.2.2; python_version >= "3.6" and platform_system == "Darwin" and platform_release >= "10.0" \ - --hash=sha256:581c51e102a266c57bccd3c56625e5fe9f9069c88f9b6510e3f6bf47cc92ddb2 \ - --hash=sha256:7466ef8b6726f66eae102c77d59fdce3961b4b74a87f331f14683092203d2609 -pyobjc-framework-applicationservices==6.2.2; python_version >= "3.6" and platform_system == "Darwin" \ - --hash=sha256:f9d74f1d72713180638fc441c072eaaa8e59ccabb04bac18b21d137e9c0cb5e6 \ - --hash=sha256:9018463ad698e6bb4f4dfb01cd3157b521b68ace447df8cceff17c2b99d0ebc9 -pyobjc-framework-authenticationservices==6.2.2; python_version >= "3.6" and platform_system == "Darwin" and platform_release >= "19.0" \ - --hash=sha256:a5229d9a7d878e8287a518a1ad9f7e4a2efccd19d952561498292f3e0037a08d \ - --hash=sha256:45ae3dc42f233bb810d94da2438821ac2849ad0fa7eb0f4cf25f4d4c77326381 -pyobjc-framework-automaticassessmentconfiguration==6.2.2; python_version >= "3.6" and platform_system == "Darwin" and platform_release >= "19.0" \ - --hash=sha256:9b9488f23e31ec4b217777eae4f46e64d85479c0b0250c59aaa7b47342462a83 \ - --hash=sha256:07650b5975ade6cf21e65eba74029fecceb36982fd2b9896b2bc282a2964988e -pyobjc-framework-automator==6.2.2; python_version >= "3.6" and platform_system == "Darwin" \ - --hash=sha256:bd071eb8d9a3286b92713afb24792e5b777c6deb57c1deaca4236503256b5971 \ - --hash=sha256:53d257d6a0ae7fa78d9c2d7cfbdb27b5bcf87576c3be0f2d61d560f34e00ab5b -pyobjc-framework-avfoundation==6.2.2; python_version >= "3.6" and platform_system == "Darwin" and platform_release >= "16.0" \ - --hash=sha256:9d347c71b99f900770b7fb93881fa30a43d61bd8b9390b432878acff0edfe2fb \ - --hash=sha256:f7ab7f751127af71b99e043c4bfb028e7f5cd62675c211d878ef1d6a6096ff01 -pyobjc-framework-avkit==6.2.2; python_version >= "3.6" and platform_system == "Darwin" and platform_release >= "13.0" \ - --hash=sha256:3095b626fd9a50efe22af67597f0af8e4409f47edf4527b355822c074c28a122 \ - --hash=sha256:2b3dfe6c2aa4bb084e4d82c8633bf3c40be18f32c698caae4e806124d9eb5739 -pyobjc-framework-businesschat==6.2.2; python_version >= "3.6" and platform_system == "Darwin" and platform_release >= "18.0" \ - --hash=sha256:7772ca33d394adfd85685a80371d367d09098ebb3fb0712d1649f504e05975a6 \ - --hash=sha256:ad520cc0790acb3adfaf606ac930e9b822faf1066afb3b4b2df18fd66666e32c -pyobjc-framework-calendarstore==6.2.2; python_version >= "3.6" and platform_system == "Darwin" and platform_release >= "9.0" \ - --hash=sha256:1ec03bc5bbef9cdbf4e8520774da28d1f6d0e1581905f15d639211926ec5f884 \ - --hash=sha256:c5c215cc2ed762d94e8f40b18ff907561e2dc604acd2d40d370fb5edd2ccb7d7 -pyobjc-framework-cfnetwork==6.2.2; python_version >= "3.6" and platform_system == "Darwin" \ - --hash=sha256:fbf1064e642a593f1001c86f9497a1b0627d8583354576e95f8e1e240a3cd553 \ - --hash=sha256:2dab65518831570efb830b9005c6775ae040de7c70a0c5b2110c86f5cd45b905 -pyobjc-framework-cloudkit==6.2.2; python_version >= "3.6" and platform_system == "Darwin" and platform_release >= "14.0" \ - --hash=sha256:351335710aed1f04cb73b3d4a983835a8b40f04b625937c81a13a52a5dfe9313 \ - --hash=sha256:1a730fcf1f09bf914011e4534cbfa8f25c7a4f598754a0076140537434f8e66d -pyobjc-framework-cocoa==6.2.2 \ - --hash=sha256:75821b98fb789d240bea7034c4f96396b2eac3e7b02428b4be9101fc899b7fc3 \ - --hash=sha256:779299f73b8b5a1dd0973b3b16bd706e1f67df44edfb3f3ca6e5e873591c0efc \ - --hash=sha256:45e3011efbd8ab4eb4c7ee1f55a8b5ecb41cf66fa797aff0e9454060781645a0 \ - --hash=sha256:2a5ab2e33cafe577592c31b2663f3b23f6e142fd717c8cf3826394a380cc4353 \ - --hash=sha256:6f5e1d59f6e1f4be40dedf051925b8d90c561657c9ec2453652af033fe5c2bf0 -pyobjc-framework-collaboration==6.2.2; python_version >= "3.6" and platform_system == "Darwin" and platform_release >= "9.0" \ - --hash=sha256:3751f1895b2e1cc92674fbdad2b64f6cce1cb5aab50730b7bb8c6c282c76b7ec \ - --hash=sha256:f703b36dba48b73f81695fd8908a82e5d7c292e7a2cab2142dbb979bff0b8ef3 -pyobjc-framework-colorsync==6.2.2; python_version >= "3.6" and platform_system == "Darwin" and platform_release >= "17.0" \ - --hash=sha256:c87f186ad71af827fa11799318680167de292de580f2da0c9bfb3097ab61523f \ - --hash=sha256:a2010756da26940001f4162588927d5cab3da559f0d06f0b7f1d3ffea91deed0 -pyobjc-framework-contacts==6.2.2; python_version >= "3.6" and platform_system == "Darwin" and platform_release >= "15.0" \ - --hash=sha256:92dcd6bd63e07214fcb20b37906b0bd468cb94dc317d3ae8f140a712eea83c2d \ - --hash=sha256:78dd356c81edf32b341595121a6192a0a5c66de97068a0c825200c50f1319cf4 -pyobjc-framework-contactsui==6.2.2; python_version >= "3.6" and platform_system == "Darwin" and platform_release >= "15.0" \ - --hash=sha256:b6a649ebae15d7cb36a06003fbd0cb5fa948f5ce92652a753b1cb1beda47e409 \ - --hash=sha256:a66628723ea5cee14e0fe983db2f550e96c1be5d4a8809a6f0596629ba40fe4e -pyobjc-framework-coreaudio==6.2.2; python_version >= "3.6" and platform_system == "Darwin" \ - --hash=sha256:a9259be2ed59e436c75b76d3ca918330c3c91ddb1e8358ff3bc1a76c2e7bda04 \ - --hash=sha256:2193854657219a10f5967b8f1dc4ae3139522e48b2f0ca4235a57957cb287e00 \ - --hash=sha256:109bd194283a77983c817d121e1b47b1fea5a2122267e00ec62e902227f388ce \ - --hash=sha256:7fa34ba6bc3a69d08ca3964a8223a48a0ac60ae6961a0e5854e66cfa5eb28d57 \ - --hash=sha256:7733d9be922f3de5801143247ed25cbd443dcf04717e9d2fc94e40b8be24e569 -pyobjc-framework-coreaudiokit==6.2.2; python_version >= "3.6" and platform_system == "Darwin" \ - --hash=sha256:5df22ce5dab4c02676825c4c30024d693efc81e04d822c5bf4e02d6baea75dd7 \ - --hash=sha256:6ad19c1194b4bbbc35118420400822e0640450ca02289f41f839020581d1da02 -pyobjc-framework-corebluetooth==6.2.2; python_version >= "3.6" and platform_system == "Darwin" and platform_release >= "14.0" \ - --hash=sha256:4454375b76ec1487dcc24f09ee8a2db8c284de548ce67c41bd489e93093e4896 \ - --hash=sha256:b6be6eac503ceeae04027824773f2ca317dc824a8ac89b8908412624cc6a83c8 -pyobjc-framework-coredata==6.2.2; python_version >= "3.6" and platform_system == "Darwin" and platform_release >= "14.0" \ - --hash=sha256:ae89b11608ffa13d2b8475274c63ab7d22e856978dd3a70a5c21893085c6fdcb \ - --hash=sha256:6e71a881d7f51165d96527a28f6a597fe63e87036efcc08f73fc993cb0785c77 -pyobjc-framework-corehaptics==6.2.2; python_version >= "3.6" and platform_system == "Darwin" and platform_release >= "19.0" \ - --hash=sha256:21f9a9ea2295258220056f9152e8fd996ac8b2f33b110b662ab525304ede95c5 \ - --hash=sha256:209767b1a4daba13bb13cdc6bf8fbd75f5de422105217461662fd79fc3496838 -pyobjc-framework-corelocation==6.2.2; python_version >= "3.6" and platform_system == "Darwin" and platform_release >= "14.0" \ - --hash=sha256:237722c1a9d90ce1fc0cc7b988375a816e9489bec2e0ddc6c83205ed1e7eb8bf \ - --hash=sha256:fe5900e5d3d7cb9e7652fc9389d92edf71da2f57b305edf9dc0642bcdfaf56da -pyobjc-framework-coremedia==6.2.2; python_version >= "3.6" and platform_system == "Darwin" and platform_release >= "19.0" \ - --hash=sha256:962d0bb705a7c3934a37e5e128c82e153fe9261246897d366bc5b5c6f3de2a69 \ - --hash=sha256:cece414593e301cd3c24959bc2ff375d0891a6c051b2bc0d0fbf1c53bc637a08 -pyobjc-framework-coremediaio==6.2.2; python_version >= "3.6" and platform_system == "Darwin" and platform_release >= "11.0" \ - --hash=sha256:2e656a6d101e7ee3fa213636c879e22f78230631b800029d243f1ba04cdef9df \ - --hash=sha256:49e4cd70d295895da0032594d5f40d0be6c19a3d749c6a9fb27ad8225a1a1463 -pyobjc-framework-coreml==6.2.2; python_version >= "3.6" and platform_system == "Darwin" and platform_release >= "17.0" \ - --hash=sha256:c7d11d7b590556a811c6139d603f2cb0c17e3bf92b5f1d01b711b10f87fc8ada \ - --hash=sha256:ca87242e73a4d0a9ab8db210893dda08402e44bcdd917d209a707346c579e15c -pyobjc-framework-coremotion==6.2.2; python_version >= "3.6" and platform_system == "Darwin" and platform_release >= "19.0" \ - --hash=sha256:121612fc4d6aa0b13af8dcf3623175e543c38960f916ad06739fefad9f1c71e3 \ - --hash=sha256:2a32cc8a7a5aa3a6fb4f6f3a44fb82fa69755bba6d1d24a4b7269ef102669be5 -pyobjc-framework-coreservices==6.2.2; python_version >= "3.6" and platform_system == "Darwin" and platform_release >= "9.0" \ - --hash=sha256:00c3106fa9541385a280856a07ec13498efb9f22a7d58979753c98f993e15ae8 \ - --hash=sha256:d00e5fe9759a312f7a508771ee8dbb57433c9519e8675c77a07b18bad59820b9 -pyobjc-framework-corespotlight==6.2.2; python_version >= "3.6" and platform_system == "Darwin" and platform_release >= "17.0" \ - --hash=sha256:bb8f21db764a141ed97423869883700ab567253c73158f002548eec9a1e2a151 \ - --hash=sha256:26123a2cf9bc3b627346a7a58c2ce257e4b4f7baa5aead7df8b43ab402e2379b -pyobjc-framework-coretext==6.2.2; python_version >= "3.6" and platform_system == "Darwin" \ - --hash=sha256:944fda1bd9c2827e36907216a930fcaf429788132616bed3d687ba0e80405d34 \ - --hash=sha256:0a5f2288b1e29d93d00d708d0e10d8ca49af1116772d48d0623cc62ffad12918 -pyobjc-framework-corewlan==6.2.2; python_version >= "3.6" and platform_system == "Darwin" and platform_release >= "10.0" \ - --hash=sha256:49d14a82541f0ddbf5ecfd7d1fec9a2103e4a76964e0840f21257c7043a6c4d5 \ - --hash=sha256:10a6d761c90fee293b5638375a095214673b5d14fca9d494f287ea9d0168148d -pyobjc-framework-cryptotokenkit==6.2.2; python_version >= "3.6" and platform_system == "Darwin" and platform_release >= "14.0" \ - --hash=sha256:a7ee19dfae514ff6871648cb182b33d50fb2a19a44475e7e9c93cab7078a76d7 \ - --hash=sha256:a71a366a38255ed3867119c37c7c853000e8dc4839f74186a7c2930952b63d17 -pyobjc-framework-devicecheck==6.2.2; python_version >= "3.6" and platform_system == "Darwin" and platform_release >= "19.0" \ - --hash=sha256:eec96526096f4b5d6f447bac4d88587a8b1d0281e8378665c08a55d0a28ae7b8 \ - --hash=sha256:e4ef8cd4f30f0149e53efb6ee0a0324b6db9ec35530893182facfa496ed60fa9 -pyobjc-framework-dictionaryservices==6.2.2; python_version >= "3.6" and platform_system == "Darwin" and platform_release >= "9.0" \ - --hash=sha256:be01129d642ac516622c1f4998fec37a7969b992271757aadaeeef2b3d601bdc \ - --hash=sha256:a99797dfa22687e27a41fda42def812bb4f45ed99c5d4a254a54338ee15b77e6 -pyobjc-framework-discrecording==6.2.2; python_version >= "3.6" and platform_system == "Darwin" \ - --hash=sha256:445a18666d126da878d456558a43dd43990dcee9516cddb9807a37d60a6327d8 \ - --hash=sha256:dd0b9b2d58de77caa700396d73a9358fea7de2c2fe1c9e061f20b3f0833b4cac -pyobjc-framework-discrecordingui==6.2.2; python_version >= "3.6" and platform_system == "Darwin" \ - --hash=sha256:569a462566538c737c57c41987e8bafd07fa4cd91eb668b846dd18dbf2aa68fd \ - --hash=sha256:b9937c119f0bc021187f0e2c923972feee0a64b7e32d99736c6013e9e0d15043 -pyobjc-framework-diskarbitration==6.2.2; python_version >= "3.6" and platform_system == "Darwin" \ - --hash=sha256:efcf0e270d4a28f61fc12fa04204d61fb70ff3eaa975606a8e8cf7efba0bcd2c \ - --hash=sha256:18ddc54b99c55f1970f3f50a1a2e3760931ca039350f015ce92e9f2bd256f48f -pyobjc-framework-dvdplayback==6.2.2; python_version >= "3.6" and platform_system == "Darwin" \ - --hash=sha256:13d456dddeeec5bee406b701ace1c2f977dded7ea79b65f83d2699a3d2618513 \ - --hash=sha256:4daa2fa86842101231adc793a2951badaf068630268be7c1f82b7507fed6eb46 -pyobjc-framework-eventkit==6.2.2; python_version >= "3.6" and platform_system == "Darwin" and platform_release >= "12.0" \ - --hash=sha256:da75124d740f4f993461773e4f40f7be5f5da544e21dc7b037fa64a5eb2071c2 \ - --hash=sha256:10b4c1971dc8d0fcd7dac3f5f2f956fdd102c88dded8f21733c843e6e04798a6 -pyobjc-framework-exceptionhandling==6.2.2; python_version >= "3.6" and platform_system == "Darwin" \ - --hash=sha256:e65a43a809f792fd27280fb6dcc8e11726571aa3bfd9650aedd0f17f229383f4 \ - --hash=sha256:9e2c345a5de0b6451d4e8b257be798f7cc555c15c29c3dcdef1131127e7e9f73 -pyobjc-framework-executionpolicy==6.2.2; python_version >= "3.6" and platform_system == "Darwin" and platform_release >= "19.0" \ - --hash=sha256:7dc7565531140a408dd26fabb3274176e0e7f7f718f4fe6518e5b64f0988213b \ - --hash=sha256:5f6278f196b53834c04e74a7c36c50f94e7cd8964bfa2dcd8db2eef534e72c77 -pyobjc-framework-externalaccessory==6.2.2; python_version >= "3.6" and platform_system == "Darwin" and platform_release >= "17.0" \ - --hash=sha256:7a1e93f54c40b6d277c8b0579b497ae4b42e0704388ccf4bd44b7caee0d63fec \ - --hash=sha256:7e716b7be0d86e0a3892646f74b3fe7a06c4584839fbd6e07784ac95ab5b68b3 -pyobjc-framework-fileprovider==6.2.2; python_version >= "3.6" and platform_system == "Darwin" and platform_release >= "19.0" \ - --hash=sha256:1502e27999dcc489502a02ca2bf8620c9e93e7f65007041605ce5da12d777be8 \ - --hash=sha256:619a12a186e2ac5264bf2b6ebbbcdee6d355a1c60521a40b1db90b0a892808b5 -pyobjc-framework-fileproviderui==6.2.2; python_version >= "3.6" and platform_system == "Darwin" and platform_release >= "19.0" \ - --hash=sha256:1b22dc8a1dad2e8569aa46f4e978c05028425528ba466a6b3cb47115a68492b6 \ - --hash=sha256:efec0801d67a006feb404a60ab3966bbc6e933856f368b3565304a44e9ab0299 -pyobjc-framework-findersync==6.2.2; python_version >= "3.6" and platform_system == "Darwin" and platform_release >= "14.0" \ - --hash=sha256:3a31aec9bfcb97374550a8689b6379983aa21753a07f9d9d9fae8083b205d629 \ - --hash=sha256:5b72a80e4a262cb0525dc9e96d2791d86343c37c8a76583afe5141c3a6c0b153 -pyobjc-framework-fsevents==6.2.2; python_version >= "3.6" and platform_system == "Darwin" and platform_release >= "9.0" \ - --hash=sha256:8e2cdfb48e1bca53dc67fc4b219a891ec6c07b2a422f7e3da0ce4ccff258f2b7 \ - --hash=sha256:d92526e5f0a1763088dd609072b7337a9e58ea698697a1500ad95409c32b64ce -pyobjc-framework-gamecenter==6.2.2; python_version >= "3.6" and platform_system == "Darwin" and platform_release >= "12.0" \ - --hash=sha256:d961ac6ea9a39f55d8e5b3726794adc0fc88df4117631509a1372ffb2dad5a5c \ - --hash=sha256:f9cffd8d1c88d890c7e9a359d4d37eccbad384096cd223811cf9c23fa283e168 -pyobjc-framework-gamecontroller==6.2.2; python_version >= "3.6" and platform_system == "Darwin" and platform_release >= "13.0" \ - --hash=sha256:6d96356e00c63437871cec3d881b849a2d635ef29a240bfa07ee74fbe5ce048e \ - --hash=sha256:368f1ffad8aefe6378477157e941a853053a380984e1854206f3dbefc86dafb6 -pyobjc-framework-gamekit==6.2.2; python_version >= "3.6" and platform_system == "Darwin" and platform_release >= "12.0" \ - --hash=sha256:1d9c8d54a5b803076cf39140db5626e7d1a3233c8f45e5c222e455bae857dd93 \ - --hash=sha256:610166712a08ebd25c0a990ed2c2a8288db5f7d25ead352488ae2dfbe6b169ee -pyobjc-framework-gameplaykit==6.2.2; python_version >= "3.6" and platform_system == "Darwin" and platform_release >= "15.0" \ - --hash=sha256:b7b4752090d7fbbb92af8123d65fc7a1c3a751f048bdff0109e418654d4edfa5 \ - --hash=sha256:6229038def1269260da5a3743151366bebef20d0c0369a2c9f8fd811f1f1906e -pyobjc-framework-imagecapturecore==6.2.2; python_version >= "3.6" and platform_system == "Darwin" and platform_release >= "10.0" \ - --hash=sha256:7540191fb1941452ce17502fcc83896437150c3c084e26c346c00a34360cc2f8 \ - --hash=sha256:1789726d4421dfac49920a2a385c31a756dfcc009baf3b123265a0582a85f5f1 -pyobjc-framework-imserviceplugin==6.2.2; python_version >= "3.6" and platform_system == "Darwin" and platform_release >= "11.0" \ - --hash=sha256:756afb6d6c5f6adaf86f3c61268fd506adf16698cd0800cc708c859130ca43ca \ - --hash=sha256:e70ae537c5f628a3be96b6112ceaeb44744d8cea8c761c0c86cdc848db3503a4 -pyobjc-framework-inputmethodkit==6.2.2; python_version >= "3.6" and platform_system == "Darwin" and platform_release >= "9.0" \ - --hash=sha256:5de9d3fd0a260d53a567294d0713adec7c0d32dc6db0c7b32606932e3398eb60 \ - --hash=sha256:b0167d9b0cdca5b329dd5fd50c5a797e5f073a3b23b09201e91ae82a0a646696 -pyobjc-framework-installerplugins==6.2.2; python_version >= "3.6" and platform_system == "Darwin" \ - --hash=sha256:309c21c10d9a61206cc71238cf4d44a382362688a8983a390020903b649b55c9 \ - --hash=sha256:38a509c661e2b592b75870ac3da746208505898b6faa0a8c338d1512aa309b40 -pyobjc-framework-instantmessage==6.2.2; python_version >= "3.6" and platform_system == "Darwin" and platform_release >= "9.0" \ - --hash=sha256:c1043d4c9ab1aaf53941ec9a6e05d6c2dd46fdc2a5aeb79f8f40097616aefb99 \ - --hash=sha256:41d933dcbd0fe758f12a4bc384b16fc0718e2f1c45043fe4c5f0c971c20433cc -pyobjc-framework-intents==6.2.2; python_version >= "3.6" and platform_system == "Darwin" and platform_release >= "16.0" \ - --hash=sha256:fa85f74e13b350d1331ed65548edfa9271308b90decac6c440a7d34cafff5057 \ - --hash=sha256:c272fe36404b18199b08bced8acb2f63b0f1b61f35a0b8fa37a6cd46f2b1a1c4 -pyobjc-framework-interfacebuilderkit==6.2.2; platform_release >= "9.0" and platform_release < "11.0" and python_version >= "3.6" and platform_system == "Darwin" \ - --hash=sha256:5a600137127aad32f73d5a4f98e9356a5d782e01fdbd7deba8cef1f44db1a748 \ - --hash=sha256:9e6813d4be3d7defb1ec962906042e31a961d7299bd0d4f14a488392acbc5b3b -pyobjc-framework-iosurface==6.2.2; python_version >= "3.6" and platform_system == "Darwin" and platform_release >= "10.0" \ - --hash=sha256:e97af910e2dc6fb7918f503c03b6f66cb99f477d968502dd9c96b4fdb86cba92 \ - --hash=sha256:04be56c8be967dcbce31d0d5babec19107536db566590962b228894a620eefff -pyobjc-framework-ituneslibrary==6.2.2; python_version >= "3.6" and platform_system == "Darwin" and platform_release >= "10.0" \ - --hash=sha256:3e5f6f6013cd333954fc3439a044181b7179b379a2868103ed067e3f964bafb2 \ - --hash=sha256:61038c8c65ba9d804ad831c64e0874095e0557a2826bfec920e5153f869197fc -pyobjc-framework-latentsemanticmapping==6.2.2; python_version >= "3.6" and platform_system == "Darwin" \ - --hash=sha256:48d20ca24540c1385d64a898a4aa87be398e707232a9ea01a3432a4a78ebcf5e \ - --hash=sha256:5f6ce54438f755e87c7dbc6a7baf1c92cef7d09c994873793bd0caf1973f5823 -pyobjc-framework-launchservices==6.2.2; python_version >= "3.6" and platform_system == "Darwin" \ - --hash=sha256:d9c2ae16a113adaa5b8a86481402a6dceb381c1419d33bf5b98fa615975beda2 \ - --hash=sha256:edc09a001f343b459c130a8518e18b9b7b5006428e152d4dc711e52d5ad76b12 -pyobjc-framework-libdispatch==6.2.2; python_version >= "3.6" and platform_system == "Darwin" and platform_release >= "12.0" \ - --hash=sha256:a69aa6d4b6d396c9006ee9b10b2cfb678005ba4f68e3306e58bb7f92b39d3a24 \ - --hash=sha256:d8c2d74565e0a0fdf68bfeb2a26bccbbcf326f7dbb165fec4d429501959e81ff \ - --hash=sha256:aa2543dcab0d5694381619852bfad78d83e3673054c4e72134f7cf15c1c2ad7b \ - --hash=sha256:a1430080682893dd39a4ba415f4ab889a3d2c3f50156476052de872bc26bc711 \ - --hash=sha256:6e30681fd6a20c53f569e454e80a4ecb58aeca1ee79e42733c3901917fcd8627 -pyobjc-framework-linkpresentation==6.2.2; python_version >= "3.6" and platform_system == "Darwin" and platform_release >= "19.0" \ - --hash=sha256:3f01e167aebc07a1db3d2d4fbb5dfaf70d8e5f07596148027243101c1d049835 \ - --hash=sha256:f941a701b38f248a8aea281eb1dde8a23891824da563e9ed1a88a56c1f5b0489 -pyobjc-framework-localauthentication==6.2.2; python_version >= "3.6" and platform_system == "Darwin" and platform_release >= "14.0" \ - --hash=sha256:8f4ab9fe232ad583061ed161568253445aab55c41df293bfbe1605cabe80818d \ - --hash=sha256:d547c15770d5c5774815beae4b8a2c133a453cd2d7cb0eea21d2abf44e39a055 -pyobjc-framework-mapkit==6.2.2; python_version >= "3.6" and platform_system == "Darwin" and platform_release >= "13.0" \ - --hash=sha256:2b7ceaf77c9b9126ac71b2d7549e997047d34375e48ca91a3099ae32e1d342f7 \ - --hash=sha256:0968591c62439aaa01a88d0fdef906313338c103264b63c21f5a66b5fb6e8f4f -pyobjc-framework-mediaaccessibility==6.2.2; python_version >= "3.6" and platform_system == "Darwin" and platform_release >= "13.0" \ - --hash=sha256:893245c1731aa4a5b8568adb78025bed3c5c1e314e27f663a6f35db23175d0df \ - --hash=sha256:2c2b3feabe241bf93811a0bd586af6120e92705201a54ab2868e66d6725093ea -pyobjc-framework-medialibrary==6.2.2; python_version >= "3.6" and platform_system == "Darwin" and platform_release >= "13.0" \ - --hash=sha256:6c2e76290903ae25dc591e86a489283f79ae1aad67de8b31c88ca3ede3de27dc \ - --hash=sha256:d312618aa9bec856f9c22d1f95330f1c63212e342235f4c7be673fcac9f747c6 -pyobjc-framework-mediaplayer==6.2.2; python_version >= "3.6" and platform_system == "Darwin" and platform_release >= "16.0" \ - --hash=sha256:8b2e8d432a71c9f265d1db69ebe22b98a34f93543083369f07d694f3a6a3d6f4 \ - --hash=sha256:fc9272dbb6fecf82165ae99aec2a9105478316a475b88b120ecb86e74e5465d0 -pyobjc-framework-mediatoolbox==6.2.2; python_version >= "3.6" and platform_system == "Darwin" and platform_release >= "13.0" \ - --hash=sha256:742140302bf848fb25971fe0922269088ca498346d1fa5d078260aa976cb63c5 \ - --hash=sha256:1160fe5fe0425ae7d0adb462d260700bf26e15b54ef268868b0017f2ff24e4b9 -pyobjc-framework-message==6.2.2; python_version >= "3.6" and platform_system == "Darwin" and platform_release < "13.0" \ - --hash=sha256:8128d1bec5204e808fbb867f6a96fe3a26b94b93613bbe5f9d2dc0c0d994a33b \ - --hash=sha256:ebe14dfabd34f8af8f255bff110113fdbbf33c2aaf384264f00cbbadcddb9137 -pyobjc-framework-metal==6.2.2; python_version >= "3.6" and platform_system == "Darwin" and platform_release >= "15.0" \ - --hash=sha256:ca916bc103aeec79507c4d79ce35e853f109e0581965293eaedb9e517d8db2e8 \ - --hash=sha256:77dd2c2c0a7e3cc04121c07af8bbe48daadd22b5517e3a70ad619fcc9b1ea66a -pyobjc-framework-metalkit==6.2.2; python_version >= "3.6" and platform_system == "Darwin" and platform_release >= "15.0" \ - --hash=sha256:825fc2e49f61df8ddf9ac74035c0aae696eaa9b8f797a107ba8bdd824f0312aa \ - --hash=sha256:02aa2ac1c2b0efcbe361c4796a3c1083029726faa7a0b2ac1412fb86bf033c98 -pyobjc-framework-modelio==6.2.2; python_version >= "3.6" and platform_system == "Darwin" and platform_release >= "15.0" \ - --hash=sha256:fae52369376bfe9d197abc36bdd84d934aec058cdd0a1afa9cad533d975f70cb \ - --hash=sha256:171f8803e39cd6cb9262347931077c8eecb583cbfaecaf5c9fec17d877f8654b -pyobjc-framework-multipeerconnectivity==6.2.2; python_version >= "3.6" and platform_system == "Darwin" and platform_release >= "14.0" \ - --hash=sha256:8545d8210e645aa9752d07eafdea006972e9efc3575083368768f8ac872711cc \ - --hash=sha256:a9672361448d42d16b12763e573c8d768e7de1b10e4a9dbaa521ab1527dd03ba -pyobjc-framework-naturallanguage==6.2.2; python_version >= "3.6" and platform_system == "Darwin" and platform_release >= "18.0" \ - --hash=sha256:45ffea5d3b8ff9c85c4bf3e6de1714daae675ac3fd1abd957a0e57af8f90a260 \ - --hash=sha256:056326f51e242aaf33978bf09974b8cca1dc13903b944a28c4481317626038a9 -pyobjc-framework-netfs==6.2.2; python_version >= "3.6" and platform_system == "Darwin" and platform_release >= "10.0" \ - --hash=sha256:7f385f9d7ecab82800ccda7c6684e9c4e1cf932f78c0c75f5daa1ec469a51086 \ - --hash=sha256:9934f64fcb06fb372166f1f08f5b84ef363dfd98467e6f4b32569d65fefb9ed5 -pyobjc-framework-network==6.2.2; python_version >= "3.6" and platform_system == "Darwin" and platform_release >= "18.0" \ - --hash=sha256:91eed661d55293ed935a24c83a1745fa966b443d280ad85b41ec7046621917b6 \ - --hash=sha256:89de1d32f0435b69d6183fc2991b543f8a894f46ad22391c42cfa5a45794c330 -pyobjc-framework-networkextension==6.2.2; python_version >= "3.6" and platform_system == "Darwin" and platform_release >= "15.0" \ - --hash=sha256:1d413d445e6736c5594615260816d1ebbf04e5d202c988be3042f842e172f76e \ - --hash=sha256:ef6c7dda2efdf61ec32fb4c79b017996d37fa5f274b06e9cfb950ef62c10f197 -pyobjc-framework-notificationcenter==6.2.2; python_version >= "3.6" and platform_system == "Darwin" and platform_release >= "14.0" \ - --hash=sha256:79241e13b692f126544e149c3316ac766092e573e47f62f80b28a6c1060a05a1 \ - --hash=sha256:dd1d8a9a81d4ac29f1f0c12ba46884536622ed89b2e22bff8b82d1a4080cf17e -pyobjc-framework-opendirectory==6.2.2; python_version >= "3.6" and platform_system == "Darwin" and platform_release >= "10.0" \ - --hash=sha256:c78b403848be3f72528845818d767e29db425f391602f41c76a873fb9a133d50 \ - --hash=sha256:dce16813f5b72fd6fb536c289ae6d6e618843af9ed44dba57c5d6f7bbabd8e09 -pyobjc-framework-osakit==6.2.2; python_version >= "3.6" and platform_system == "Darwin" \ - --hash=sha256:8a7432023304d7b6b5b130182e29d9b67294ec73d2b0572966186db6bee9f61b \ - --hash=sha256:4ec4f0589fa863a0b0c242f5bc4f13e306d1b0412bd650bba4b36e924c1c87c3 -pyobjc-framework-oslog==6.2.2; python_version >= "3.6" and platform_system == "Darwin" and platform_release >= "19.0" \ - --hash=sha256:574b05bdfb6913c0089c937af9f1fd8a88810701ed86e7bca4385376f47fe487 \ - --hash=sha256:087839d1db5df76a922b054ea67262f4b9a132935129619d44e938426fa8081f -pyobjc-framework-pencilkit==6.2.2; python_version >= "3.6" and platform_system == "Darwin" and platform_release >= "19.0" \ - --hash=sha256:2edb6e88f9d0093cf20a6b20bd8b646d918d246f1a9b523d176ba360c47f6e91 \ - --hash=sha256:305fa33989294c97e0ec70ac9c9782883f40fbe3c45452a8f9fdd04e743b100f -pyobjc-framework-photos==6.2.2; python_version >= "3.6" and platform_system == "Darwin" and platform_release >= "15.0" \ - --hash=sha256:6dd3598f9f3428641d8f95c5d64b87a5d83ee95a7cb5937284514626042cf275 \ - --hash=sha256:ffff560b7eb4f5abdacbae1d7568c02abd9cd63c30591b5328887d3b01572c39 -pyobjc-framework-photosui==6.2.2; python_version >= "3.6" and platform_system == "Darwin" and platform_release >= "15.0" \ - --hash=sha256:6129cd970cba8f37dd8ee1c57484b7263470b7faf0a20341e5bb99b0ecf911f2 \ - --hash=sha256:65f975301c3d9b193e56c0a60a1e0ecfd38a376f6b72abfd31a05a905f5e389c -pyobjc-framework-preferencepanes==6.2.2; python_version >= "3.6" and platform_system == "Darwin" \ - --hash=sha256:8bda7a9cb9cd2844dedc79869fd7cd9275b7bf9c4845cf6ab6d64205172b4376 \ - --hash=sha256:5e6cf700e0315c9ae75b56c4c528af6607044f147f2dcd58e0af7954955b2eaa -pyobjc-framework-pubsub==6.2.2; platform_release >= "9.0" and platform_release < "18.0" and python_version >= "3.6" and platform_system == "Darwin" \ - --hash=sha256:519f6402a10f666f624cdcbbed35ec3919da5d0be77fb56d92e1b5be12f35ef1 \ - --hash=sha256:5307d630572905cbfeecf120875104d21f714cd32d7ce24c209edd1a72c0ffa6 -pyobjc-framework-pushkit==6.2.2; python_version >= "3.6" and platform_system == "Darwin" and platform_release >= "19.0" \ - --hash=sha256:6454d70fb0140b7943027ae9e33f1bfd0a6dbd6c6a24b37e0e4a3f6a884c3c82 \ - --hash=sha256:0018f99f713f1b2387db21f9a25e129bf90e9d2e55dd613051d2066fdb15226c -pyobjc-framework-qtkit==6.2.2; platform_release >= "9.0" and platform_release < "19.0" and python_version >= "3.6" and platform_system == "Darwin" \ - --hash=sha256:fa750f227d6f32a5314d80b261fe77fa085ada31cf8865e4bfbbe828d22f84a2 \ - --hash=sha256:ce01d41a21e4d6feaa2c00c6f022660aad5548bcf78bc3414e426e9f93eabef2 -pyobjc-framework-quartz==6.2.2 \ - --hash=sha256:5a56cfc0289061eaf33f04e3c73e749e04f177b0c1ee8749aa46e87d1e897cda \ - --hash=sha256:56d183dc32b11f15ceb0833a2a24953d1212264f07c274e2b8878e691eb72472 \ - --hash=sha256:a57c7f50286d96ee7b9051c657a8607f0449949891cf0697be3efac76a97be7e \ - --hash=sha256:552b15eb409f87d34870345feabe6695375a031d8c4063f175dbaa3422005160 \ - --hash=sha256:15f3c7b50d0543f66b927e28cd336c1a6962d58c9808799f49dcf30e4a1a13c2 -pyobjc-framework-quicklookthumbnailing==6.2.2; python_version >= "3.6" and platform_system == "Darwin" and platform_release >= "19.0" \ - --hash=sha256:2a34eb83813a2aa5fbe072cbe03d5557b8e80449fbc788e7008994b22417d580 \ - --hash=sha256:fb66393583f4e3a3a7b56d0d209d5dd590f59c3133d5ccd5a9fced3b314e9d44 -pyobjc-framework-safariservices==6.2.2; python_version >= "3.6" and platform_system == "Darwin" and platform_release >= "15.0" \ - --hash=sha256:396a7fca2d5ff039a9031b9d1f54080a334e26b2cf10664e5568b49487c32e9a \ - --hash=sha256:9624e27795b28419486a461b2a5f84e100eb4c1ce74fca88d31c4133c77329b9 -pyobjc-framework-scenekit==6.2.2; python_version >= "3.6" and platform_system == "Darwin" and platform_release >= "11.0" \ - --hash=sha256:b0a0a5866220aa9972248556f9a09e4f14f316870f9f4e12c3d666594a7cb33b \ - --hash=sha256:991fa198396af69200dad314258c3f3aeec7028a0a09e50333c0e4d392c0626d -pyobjc-framework-screensaver==6.2.2; python_version >= "3.6" and platform_system == "Darwin" \ - --hash=sha256:f0479f1c6ce1bdbc8723a9194b9ee9a3c87ddd82dbc16e59dc1bb9a58326453b \ - --hash=sha256:eb057b5c1c6a82c5ba9e7c64c93f07ffed18b8e4432c7c56da4df97940bba5b1 -pyobjc-framework-scriptingbridge==6.2.2; python_version >= "3.6" and platform_system == "Darwin" and platform_release >= "9.0" \ - --hash=sha256:f3f659351f6686ebabafce955a2d55e4f32c791c755f27641b37b5cd9974c037 \ - --hash=sha256:a0e03297e404bbdbcc4a51a1dfa271ce9b9a7dd9a123ae5e9b303668be246e6a -pyobjc-framework-searchkit==6.2.2; python_version >= "3.6" and platform_system == "Darwin" \ - --hash=sha256:2830e820a6edff87712973f015e888188b1a16256e58bec10497725da1a907f3 \ - --hash=sha256:1bb41f5c7c1a0885d7039acc024c4ec94140b639b27f3302ce4c8162f096e3ca -pyobjc-framework-security==6.2.2; python_version >= "3.6" and platform_system == "Darwin" \ - --hash=sha256:c53d9f6d83edeb9a55e793f01a6d1b7d8d1a6a23f023db05cac86cde327f829c \ - --hash=sha256:1c38a5df00e1547431ab072ba0e4e942c43da14be505cac9502a8c6fde6671ac -pyobjc-framework-securityfoundation==6.2.2; python_version >= "3.6" and platform_system == "Darwin" \ - --hash=sha256:dd2a8f0ca051d756a8c7a7272de7d44e426ba76a417b947fc49cc3c3c8427aa3 \ - --hash=sha256:b9b01a4228dadf82d86feabcea8c08facaadf59fbe22a0881025db88318916e9 -pyobjc-framework-securityinterface==6.2.2; python_version >= "3.6" and platform_system == "Darwin" \ - --hash=sha256:f5e379789cedc96908e9be021033d2228dd36c30dc804e59495854e443db8e16 \ - --hash=sha256:3645e11780b45ec819354e593895f7eb7c81ac968fb3e3984dfafe0ea4fbc0bf -pyobjc-framework-servernotification==6.2.2; platform_release >= "10.0" and platform_release < "13.0" and python_version >= "3.6" and platform_system == "Darwin" \ - --hash=sha256:e7a745f9d43fed99d1b06b2e06cc0e651aaca74a7905fbe3860f27f6e485801a \ - --hash=sha256:9bbbfaaa3023318a11faa0bf246e64bd13c380bb08b31fab61d83487383e17a6 -pyobjc-framework-servicemanagement==6.2.2; python_version >= "3.6" and platform_system == "Darwin" and platform_release >= "10.0" \ - --hash=sha256:c2483005f132c8ec6912662505d2962d72e37f966388d482a87c1344c25eedd4 \ - --hash=sha256:20690aa93a8476d6b6b7693679c8288383cef45c6483a79a0880e69f86acab59 -pyobjc-framework-social==6.2.2; python_version >= "3.6" and platform_system == "Darwin" and platform_release >= "12.0" \ - --hash=sha256:95a4e33bbe30c7fa627dc8f5a5b726a8354ea24005ddffacb2d477648b263077 \ - --hash=sha256:7331dd9084728d8b5df53bb38ccc77672e45c52726020e63e7c1c00263a85fcd -pyobjc-framework-soundanalysis==6.2.2; python_version >= "3.6" and platform_system == "Darwin" and platform_release >= "19.0" \ - --hash=sha256:31a3d3e6c12468f5840c7ea66f2b571bd3443634868e57f6038c9e60b07fd43b \ - --hash=sha256:80edaa071e9d880751bc67293679a235cf6083b713f0a362a29376f42efb5370 -pyobjc-framework-speech==6.2.2; python_version >= "3.6" and platform_system == "Darwin" and platform_release >= "19.0" \ - --hash=sha256:6ff32726896b56dbf26990dbf1cadd64c2066865331ba926ff580a837f9a57d9 \ - --hash=sha256:95b8c6cc380ca33835343ec66b3d97279a03ed1eeb5609f0e5178a53aa61b146 -pyobjc-framework-spritekit==6.2.2; python_version >= "3.6" and platform_system == "Darwin" and platform_release >= "15.0" \ - --hash=sha256:5523cd33bb3b906fbb354a4bfd910629863014004aab0ed1764083fdf5c91eeb \ - --hash=sha256:c63c700f03cae3861895d9d78fae2bd477d1440f8595ece2dde68b140ac2dc75 -pyobjc-framework-storekit==6.2.2; python_version >= "3.6" and platform_system == "Darwin" and platform_release >= "11.0" \ - --hash=sha256:3fdbcd185c4452f102af9e1d9e3d37757f5afcdac6ef315bc0f73f2a9db8146d \ - --hash=sha256:0e64ae84c4b8af354b51a5f784f1e2b4eb2f51ec1a9969775e676543901e81df -pyobjc-framework-syncservices==6.2.2; python_version >= "3.6" and platform_system == "Darwin" \ - --hash=sha256:645490178ee95d9bb554cde8e9180e6c490ed112f3691a3fe258b34a9b5d3deb \ - --hash=sha256:fc4c00da0cb2f838e798c88208994eee5cdc4fc2ce11fbd72189acff96a89ae6 -pyobjc-framework-systemconfiguration==6.2.2; python_version >= "3.6" and platform_system == "Darwin" \ - --hash=sha256:1611f6c561669beff0bad18a9f4fe0724424acc92ed47cc8fc3949532402c95d \ - --hash=sha256:cef76b15fe09f3a3457a1de97cdcd619953d22b416f46c74b927909bf988f361 -pyobjc-framework-systemextensions==6.2.2; python_version >= "3.6" and platform_system == "Darwin" and platform_release >= "19.0" \ - --hash=sha256:386586e9d7d87a9b8ccb267d62fb7f950de063f890c89c7e4728f22289a892fe \ - --hash=sha256:35e06352764f5b2c6fc10c589990feb56c6ae0efdc35cf6e9c63a49cba741ff2 -pyobjc-framework-usernotifications==6.2.2; python_version >= "3.6" and platform_system == "Darwin" and platform_release >= "18.0" \ - --hash=sha256:40b0cad22ba3f55ed1d25248abcfcb2f3c15064c3c00027e3dcf8ce7be832b22 \ - --hash=sha256:aba54a959e129e186467ea5f55e47484cd7244507a0494d73c28906b3c44fdcd -pyobjc-framework-videosubscriberaccount==6.2.2; python_version >= "3.6" and platform_system == "Darwin" and platform_release >= "18.0" \ - --hash=sha256:2a4d38e6a5b2de5493c5836b24de06a288b7ed1973a36a209553b789d466774a \ - --hash=sha256:0d73209cca77d5e63f783914942766cac94cf06c59467ad085dc62c3edadbb0d -pyobjc-framework-videotoolbox==6.2.2; python_version >= "3.6" and platform_system == "Darwin" and platform_release >= "12.0" \ - --hash=sha256:ae60fcfc3f9e8c2e38882b34c87df71b5585c2a7e37dfbf3a23e32c406f95e86 \ - --hash=sha256:0336cc8bcdff16ab6f537286334339cb390731b3d98aa9810e34727ee2155674 -pyobjc-framework-vision==6.2.2; python_version >= "3.6" and platform_system == "Darwin" and platform_release >= "17.0" \ - --hash=sha256:dc03fea57cc52ba15a2b39be6e834cfd49a6e28daf9b862a578a8002a6fc5207 \ - --hash=sha256:b78028ab15c3758af1a2f3f82b69880b7db481a29ab6defe0fcf839f39c83554 -pyobjc-framework-webkit==6.2.2; python_version >= "3.6" and platform_system == "Darwin" \ - --hash=sha256:87e9409ace6d2e29c776bd76df75fe922a1f2a225eef815640c6047d25da8dab \ - --hash=sha256:b04e08ad08720a87934ba57005fb561d081fbb7f4c12b20e78d0e740e433d06f -pyobjc-framework-xgridfoundation==6.2.2; python_version >= "3.6" and platform_system == "Darwin" and platform_release < "12.0" \ - --hash=sha256:02033b88ed90133f1e17fe3c6c0c305b698ea701e9ed8967bce186e69b1e6c7c \ - --hash=sha256:27f44ff1f2776d4596b5d99076d2458c1576d7cc73b8c1f740eab4f7256836e7 -pyobjc==6.2.2; python_version >= "3.6" and platform_system == "Darwin" \ - --hash=sha256:dc2e4fb96bc48770c1b5810eb65bf446c50fbf2faf6a6a398c31556b404e015c \ - --hash=sha256:d5b87e9fa4cc9b51bf37f9a461887e2d8b9ae7e6bb45675f8edbe35ea6770455 -pyperclip==1.8.1 \ - --hash=sha256:9abef1e79ce635eb62309ecae02dfb5a3eb952fa7d6dce09c1aef063f81424d3 -pyrect==0.1.4 \ - --hash=sha256:3b2fa7353ce32a11aa6b0a15495968d2a763423c8947ae248b92c037def4e202 -pyscreeze==0.1.26 \ - --hash=sha256:224963114176208eee13b0b984de1f5fdc11b7393ce48ad2b52390dc8855d346 -python3-xlib==0.15; platform_system == "Linux" and python_version >= "3.0" \ - --hash=sha256:dc4245f3ae4aa5949c1d112ee4723901ade37a96721ba9645f2bfa56e5b383f8 -pytweening==1.0.3 \ - --hash=sha256:4b608a570f4dccf2201e898f643c2a12372eb1d71a3dbc7e778771b603ca248b -rubicon-objc==0.4.0; python_version >= "3.5" and platform_system == "Darwin" \ - --hash=sha256:a54be431be212c95106b3f9dbb3903fd96683caca926613ba7dd8b4605cb87cc \ - --hash=sha256:010a567ecc1c5891ce1edee7b7b305648b8bc97fb3da4c5745d20c4b5fadf45f +et-xmlfile==1.0.1; python_version >= "3.6" +jdcal==1.4.1; python_version >= "3.6" +mouseinfo==0.1.3 +numpy==1.19.4; python_version >= "3.6" +opencv-contrib-python==4.4.0.46; python_version >= "3.6" +openpyxl==3.0.5; python_version >= "3.6" +pillow==8.0.1; python_version >= "3.6" +pyautogui==0.9.52 +pygetwindow==0.0.9 +pymsgbox==1.0.9 +pyobjc-core==6.2.2 +pyobjc-framework-accounts==6.2.2; python_version >= "3.6" and platform_system == "Darwin" and platform_release >= "14.0" +pyobjc-framework-addressbook==6.2.2; python_version >= "3.6" and platform_system == "Darwin" +pyobjc-framework-adsupport==6.2.2; python_version >= "3.6" and platform_system == "Darwin" and platform_release >= "18.0" +pyobjc-framework-applescriptkit==6.2.2; python_version >= "3.6" and platform_system == "Darwin" +pyobjc-framework-applescriptobjc==6.2.2; python_version >= "3.6" and platform_system == "Darwin" and platform_release >= "10.0" +pyobjc-framework-applicationservices==6.2.2; python_version >= "3.6" and platform_system == "Darwin" +pyobjc-framework-authenticationservices==6.2.2; python_version >= "3.6" and platform_system == "Darwin" and platform_release >= "19.0" +pyobjc-framework-automaticassessmentconfiguration==6.2.2; python_version >= "3.6" and platform_system == "Darwin" and platform_release >= "19.0" +pyobjc-framework-automator==6.2.2; python_version >= "3.6" and platform_system == "Darwin" +pyobjc-framework-avfoundation==6.2.2; python_version >= "3.6" and platform_system == "Darwin" and platform_release >= "16.0" +pyobjc-framework-avkit==6.2.2; python_version >= "3.6" and platform_system == "Darwin" and platform_release >= "13.0" +pyobjc-framework-businesschat==6.2.2; python_version >= "3.6" and platform_system == "Darwin" and platform_release >= "18.0" +pyobjc-framework-calendarstore==6.2.2; python_version >= "3.6" and platform_system == "Darwin" and platform_release >= "9.0" +pyobjc-framework-cfnetwork==6.2.2; python_version >= "3.6" and platform_system == "Darwin" +pyobjc-framework-cloudkit==6.2.2; python_version >= "3.6" and platform_system == "Darwin" and platform_release >= "14.0" +pyobjc-framework-cocoa==6.2.2 +pyobjc-framework-collaboration==6.2.2; python_version >= "3.6" and platform_system == "Darwin" and platform_release >= "9.0" +pyobjc-framework-colorsync==6.2.2; python_version >= "3.6" and platform_system == "Darwin" and platform_release >= "17.0" +pyobjc-framework-contacts==6.2.2; python_version >= "3.6" and platform_system == "Darwin" and platform_release >= "15.0" +pyobjc-framework-contactsui==6.2.2; python_version >= "3.6" and platform_system == "Darwin" and platform_release >= "15.0" +pyobjc-framework-coreaudio==6.2.2; python_version >= "3.6" and platform_system == "Darwin" +pyobjc-framework-coreaudiokit==6.2.2; python_version >= "3.6" and platform_system == "Darwin" +pyobjc-framework-corebluetooth==6.2.2; python_version >= "3.6" and platform_system == "Darwin" and platform_release >= "14.0" +pyobjc-framework-coredata==6.2.2; python_version >= "3.6" and platform_system == "Darwin" and platform_release >= "14.0" +pyobjc-framework-corehaptics==6.2.2; python_version >= "3.6" and platform_system == "Darwin" and platform_release >= "19.0" +pyobjc-framework-corelocation==6.2.2; python_version >= "3.6" and platform_system == "Darwin" and platform_release >= "14.0" +pyobjc-framework-coremedia==6.2.2; python_version >= "3.6" and platform_system == "Darwin" and platform_release >= "19.0" +pyobjc-framework-coremediaio==6.2.2; python_version >= "3.6" and platform_system == "Darwin" and platform_release >= "11.0" +pyobjc-framework-coreml==6.2.2; python_version >= "3.6" and platform_system == "Darwin" and platform_release >= "17.0" +pyobjc-framework-coremotion==6.2.2; python_version >= "3.6" and platform_system == "Darwin" and platform_release >= "19.0" +pyobjc-framework-coreservices==6.2.2; python_version >= "3.6" and platform_system == "Darwin" and platform_release >= "9.0" +pyobjc-framework-corespotlight==6.2.2; python_version >= "3.6" and platform_system == "Darwin" and platform_release >= "17.0" +pyobjc-framework-coretext==6.2.2; python_version >= "3.6" and platform_system == "Darwin" +pyobjc-framework-corewlan==6.2.2; python_version >= "3.6" and platform_system == "Darwin" and platform_release >= "10.0" +pyobjc-framework-cryptotokenkit==6.2.2; python_version >= "3.6" and platform_system == "Darwin" and platform_release >= "14.0" +pyobjc-framework-devicecheck==6.2.2; python_version >= "3.6" and platform_system == "Darwin" and platform_release >= "19.0" +pyobjc-framework-dictionaryservices==6.2.2; python_version >= "3.6" and platform_system == "Darwin" and platform_release >= "9.0" +pyobjc-framework-discrecording==6.2.2; python_version >= "3.6" and platform_system == "Darwin" +pyobjc-framework-discrecordingui==6.2.2; python_version >= "3.6" and platform_system == "Darwin" +pyobjc-framework-diskarbitration==6.2.2; python_version >= "3.6" and platform_system == "Darwin" +pyobjc-framework-dvdplayback==6.2.2; python_version >= "3.6" and platform_system == "Darwin" +pyobjc-framework-eventkit==6.2.2; python_version >= "3.6" and platform_system == "Darwin" and platform_release >= "12.0" +pyobjc-framework-exceptionhandling==6.2.2; python_version >= "3.6" and platform_system == "Darwin" +pyobjc-framework-executionpolicy==6.2.2; python_version >= "3.6" and platform_system == "Darwin" and platform_release >= "19.0" +pyobjc-framework-externalaccessory==6.2.2; python_version >= "3.6" and platform_system == "Darwin" and platform_release >= "17.0" +pyobjc-framework-fileprovider==6.2.2; python_version >= "3.6" and platform_system == "Darwin" and platform_release >= "19.0" +pyobjc-framework-fileproviderui==6.2.2; python_version >= "3.6" and platform_system == "Darwin" and platform_release >= "19.0" +pyobjc-framework-findersync==6.2.2; python_version >= "3.6" and platform_system == "Darwin" and platform_release >= "14.0" +pyobjc-framework-fsevents==6.2.2; python_version >= "3.6" and platform_system == "Darwin" and platform_release >= "9.0" +pyobjc-framework-gamecenter==6.2.2; python_version >= "3.6" and platform_system == "Darwin" and platform_release >= "12.0" +pyobjc-framework-gamecontroller==6.2.2; python_version >= "3.6" and platform_system == "Darwin" and platform_release >= "13.0" +pyobjc-framework-gamekit==6.2.2; python_version >= "3.6" and platform_system == "Darwin" and platform_release >= "12.0" +pyobjc-framework-gameplaykit==6.2.2; python_version >= "3.6" and platform_system == "Darwin" and platform_release >= "15.0" +pyobjc-framework-imagecapturecore==6.2.2; python_version >= "3.6" and platform_system == "Darwin" and platform_release >= "10.0" +pyobjc-framework-imserviceplugin==6.2.2; python_version >= "3.6" and platform_system == "Darwin" and platform_release >= "11.0" +pyobjc-framework-inputmethodkit==6.2.2; python_version >= "3.6" and platform_system == "Darwin" and platform_release >= "9.0" +pyobjc-framework-installerplugins==6.2.2; python_version >= "3.6" and platform_system == "Darwin" +pyobjc-framework-instantmessage==6.2.2; python_version >= "3.6" and platform_system == "Darwin" and platform_release >= "9.0" +pyobjc-framework-intents==6.2.2; python_version >= "3.6" and platform_system == "Darwin" and platform_release >= "16.0" +pyobjc-framework-interfacebuilderkit==6.2.2; platform_release >= "9.0" and platform_release < "11.0" and python_version >= "3.6" and platform_system == "Darwin" +pyobjc-framework-iosurface==6.2.2; python_version >= "3.6" and platform_system == "Darwin" and platform_release >= "10.0" +pyobjc-framework-ituneslibrary==6.2.2; python_version >= "3.6" and platform_system == "Darwin" and platform_release >= "10.0" +pyobjc-framework-latentsemanticmapping==6.2.2; python_version >= "3.6" and platform_system == "Darwin" +pyobjc-framework-launchservices==6.2.2; python_version >= "3.6" and platform_system == "Darwin" +pyobjc-framework-libdispatch==6.2.2; python_version >= "3.6" and platform_system == "Darwin" and platform_release >= "12.0" +pyobjc-framework-linkpresentation==6.2.2; python_version >= "3.6" and platform_system == "Darwin" and platform_release >= "19.0" +pyobjc-framework-localauthentication==6.2.2; python_version >= "3.6" and platform_system == "Darwin" and platform_release >= "14.0" +pyobjc-framework-mapkit==6.2.2; python_version >= "3.6" and platform_system == "Darwin" and platform_release >= "13.0" +pyobjc-framework-mediaaccessibility==6.2.2; python_version >= "3.6" and platform_system == "Darwin" and platform_release >= "13.0" +pyobjc-framework-medialibrary==6.2.2; python_version >= "3.6" and platform_system == "Darwin" and platform_release >= "13.0" +pyobjc-framework-mediaplayer==6.2.2; python_version >= "3.6" and platform_system == "Darwin" and platform_release >= "16.0" +pyobjc-framework-mediatoolbox==6.2.2; python_version >= "3.6" and platform_system == "Darwin" and platform_release >= "13.0" +pyobjc-framework-message==6.2.2; python_version >= "3.6" and platform_system == "Darwin" and platform_release < "13.0" +pyobjc-framework-metal==6.2.2; python_version >= "3.6" and platform_system == "Darwin" and platform_release >= "15.0" +pyobjc-framework-metalkit==6.2.2; python_version >= "3.6" and platform_system == "Darwin" and platform_release >= "15.0" +pyobjc-framework-modelio==6.2.2; python_version >= "3.6" and platform_system == "Darwin" and platform_release >= "15.0" +pyobjc-framework-multipeerconnectivity==6.2.2; python_version >= "3.6" and platform_system == "Darwin" and platform_release >= "14.0" +pyobjc-framework-naturallanguage==6.2.2; python_version >= "3.6" and platform_system == "Darwin" and platform_release >= "18.0" +pyobjc-framework-netfs==6.2.2; python_version >= "3.6" and platform_system == "Darwin" and platform_release >= "10.0" +pyobjc-framework-network==6.2.2; python_version >= "3.6" and platform_system == "Darwin" and platform_release >= "18.0" +pyobjc-framework-networkextension==6.2.2; python_version >= "3.6" and platform_system == "Darwin" and platform_release >= "15.0" +pyobjc-framework-notificationcenter==6.2.2; python_version >= "3.6" and platform_system == "Darwin" and platform_release >= "14.0" +pyobjc-framework-opendirectory==6.2.2; python_version >= "3.6" and platform_system == "Darwin" and platform_release >= "10.0" +pyobjc-framework-osakit==6.2.2; python_version >= "3.6" and platform_system == "Darwin" +pyobjc-framework-oslog==6.2.2; python_version >= "3.6" and platform_system == "Darwin" and platform_release >= "19.0" +pyobjc-framework-pencilkit==6.2.2; python_version >= "3.6" and platform_system == "Darwin" and platform_release >= "19.0" +pyobjc-framework-photos==6.2.2; python_version >= "3.6" and platform_system == "Darwin" and platform_release >= "15.0" +pyobjc-framework-photosui==6.2.2; python_version >= "3.6" and platform_system == "Darwin" and platform_release >= "15.0" +pyobjc-framework-preferencepanes==6.2.2; python_version >= "3.6" and platform_system == "Darwin" +pyobjc-framework-pubsub==6.2.2; platform_release >= "9.0" and platform_release < "18.0" and python_version >= "3.6" and platform_system == "Darwin" +pyobjc-framework-pushkit==6.2.2; python_version >= "3.6" and platform_system == "Darwin" and platform_release >= "19.0" +pyobjc-framework-qtkit==6.2.2; platform_release >= "9.0" and platform_release < "19.0" and python_version >= "3.6" and platform_system == "Darwin" +pyobjc-framework-quartz==6.2.2 +pyobjc-framework-quicklookthumbnailing==6.2.2; python_version >= "3.6" and platform_system == "Darwin" and platform_release >= "19.0" +pyobjc-framework-safariservices==6.2.2; python_version >= "3.6" and platform_system == "Darwin" and platform_release >= "15.0" +pyobjc-framework-scenekit==6.2.2; python_version >= "3.6" and platform_system == "Darwin" and platform_release >= "11.0" +pyobjc-framework-screensaver==6.2.2; python_version >= "3.6" and platform_system == "Darwin" +pyobjc-framework-scriptingbridge==6.2.2; python_version >= "3.6" and platform_system == "Darwin" and platform_release >= "9.0" +pyobjc-framework-searchkit==6.2.2; python_version >= "3.6" and platform_system == "Darwin" +pyobjc-framework-security==6.2.2; python_version >= "3.6" and platform_system == "Darwin" +pyobjc-framework-securityfoundation==6.2.2; python_version >= "3.6" and platform_system == "Darwin" +pyobjc-framework-securityinterface==6.2.2; python_version >= "3.6" and platform_system == "Darwin" +pyobjc-framework-servernotification==6.2.2; platform_release >= "10.0" and platform_release < "13.0" and python_version >= "3.6" and platform_system == "Darwin" +pyobjc-framework-servicemanagement==6.2.2; python_version >= "3.6" and platform_system == "Darwin" and platform_release >= "10.0" +pyobjc-framework-social==6.2.2; python_version >= "3.6" and platform_system == "Darwin" and platform_release >= "12.0" +pyobjc-framework-soundanalysis==6.2.2; python_version >= "3.6" and platform_system == "Darwin" and platform_release >= "19.0" +pyobjc-framework-speech==6.2.2; python_version >= "3.6" and platform_system == "Darwin" and platform_release >= "19.0" +pyobjc-framework-spritekit==6.2.2; python_version >= "3.6" and platform_system == "Darwin" and platform_release >= "15.0" +pyobjc-framework-storekit==6.2.2; python_version >= "3.6" and platform_system == "Darwin" and platform_release >= "11.0" +pyobjc-framework-syncservices==6.2.2; python_version >= "3.6" and platform_system == "Darwin" +pyobjc-framework-systemconfiguration==6.2.2; python_version >= "3.6" and platform_system == "Darwin" +pyobjc-framework-systemextensions==6.2.2; python_version >= "3.6" and platform_system == "Darwin" and platform_release >= "19.0" +pyobjc-framework-usernotifications==6.2.2; python_version >= "3.6" and platform_system == "Darwin" and platform_release >= "18.0" +pyobjc-framework-videosubscriberaccount==6.2.2; python_version >= "3.6" and platform_system == "Darwin" and platform_release >= "18.0" +pyobjc-framework-videotoolbox==6.2.2; python_version >= "3.6" and platform_system == "Darwin" and platform_release >= "12.0" +pyobjc-framework-vision==6.2.2; python_version >= "3.6" and platform_system == "Darwin" and platform_release >= "17.0" +pyobjc-framework-webkit==6.2.2; python_version >= "3.6" and platform_system == "Darwin" +pyobjc-framework-xgridfoundation==6.2.2; python_version >= "3.6" and platform_system == "Darwin" and platform_release < "12.0" +pyobjc==6.2.2; python_version >= "3.6" and platform_system == "Darwin" +pyperclip==1.8.1 +pyrect==0.1.4 +pyscreeze==0.1.26 +python3-xlib==0.15; platform_system == "Linux" and python_version >= "3.0" +pytweening==1.0.3 +rubicon-objc==0.4.0; python_version >= "3.5" and platform_system == "Darwin" diff --git a/students_list.py b/students_list.py index d9a10e3..4352d7e 100644 --- a/students_list.py +++ b/students_list.py @@ -10,57 +10,59 @@ names = [] rolls = [] + class StudentsList: - """ Stores the details of all students in a physical class + """Stores the details of all students in a physical class + + Attributes: + class_name: A string that contains the name of the physical class - Attributes: - class_name: A string that contains the name of the physical class - - Class variables: - names: A list that contains the name of all students. - rolls: A list that contains the roll number of all students. + Class variables: + names: A list that contains the name of all students. + rolls: A list that contains the roll number of all students. """ + def __init__(self, class_name): """ :param str class_name: name of the physical class of a student""" self.class_name = class_name def make_pkl_file(self): """ Create a Pickle(.pkl) file""" - pkl_file_path=Path(self.make_pkl_name()) + pkl_file_path = Path(self.make_pkl_name()) if pkl_file_path.exists(): os.remove(pkl_file_path) wb = load_workbook(self.make_xl_name()) ws = wb.active - number_of_studs = ws['A1'].value + number_of_studs = ws["A1"].value # Get the name and roll number of all the students. - for i in range(2, number_of_studs+2): - names.append(ws['A'+str(i)].value) - rolls.append(ws['B'+str(i)].value) - - with open(self.make_pkl_name(), 'wb') as f: + for i in range(2, number_of_studs + 2): + names.append(ws["A" + str(i)].value) + rolls.append(ws["B" + str(i)].value) + + with open(self.make_pkl_name(), "wb") as f: tupl = (names, rolls) - pickle.dump(tupl, f, protocol = pickle.HIGHEST_PROTOCOL) + pickle.dump(tupl, f, protocol=pickle.HIGHEST_PROTOCOL) def load_pkl_file(self): - """ Reads and returns the Pickle(.pkl) file containing data of the - physical class. + """Reads and returns the Pickle(.pkl) file containing data of the + physical class. """ - with open(self.make_pkl_name(), 'rb') as f: + with open(self.make_pkl_name(), "rb") as f: return pickle.load(f) def make_xl_name(self): - """ Returns the complete pathname of the Excel(.xlsx) file containing - data of the physical class. + """Returns the complete pathname of the Excel(.xlsx) file containing + data of the physical class. """ - return join(getcwd(), "student's list", self.class_name + '.xlsx') - + return join(getcwd(), "student's list", self.class_name + ".xlsx") + def make_pkl_name(self): - """ Returns the complete pathname of the Pickle(.pkl) file containing - data of the physical class. + """Returns the complete pathname of the Pickle(.pkl) file containing + data of the physical class. """ - return join(getcwd(), "student's list", self.class_name + '.pkl') + return join(getcwd(), "student's list", self.class_name + ".pkl") -if __name__ == '__main__': - pass +if __name__ == "__main__": + pass