From bce2073fa6090e07e4fd25720c348eb474834c6b Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Wed, 20 Aug 2025 08:43:47 +0000 Subject: [PATCH 1/3] Initial plan From 89c6176a5bd3f528be3767bf4ea6f11610be097a Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Wed, 20 Aug 2025 08:47:13 +0000 Subject: [PATCH 2/3] Initial analysis of repository structure and identification of critical bugs Co-authored-by: rmanela <175689398+rmanela@users.noreply.github.com> --- __pycache__/main.cpython-312.pyc | Bin 0 -> 337 bytes __pycache__/part1.cpython-312.pyc | Bin 0 -> 4441 bytes __pycache__/part2.cpython-312.pyc | Bin 0 -> 5961 bytes 3 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 __pycache__/main.cpython-312.pyc create mode 100644 __pycache__/part1.cpython-312.pyc create mode 100644 __pycache__/part2.cpython-312.pyc diff --git a/__pycache__/main.cpython-312.pyc b/__pycache__/main.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..26a7b9220ef7f7b54c3d545170083a68cabc8452 GIT binary patch literal 337 zcmX@j%ge<81ftzbGZdH@7#@Q-Fu)9Dd{zT8rZc24v@k?5q%x*3W@|7o6mc>!q%x#1 zt!9L%Vq~afu4L9^Nrv*lqAWlXWXfj+ATgbx1TL4tSi>-zVJ@<622CcvDi)7S9R*Fs zTdV~|nRz8Z21{OIZfY?|pTaNp+{Da0y@JYH9AMe_jLaf7paeS*7YhK128JgroEhAn}XC zCO1E&G$+-rhzH08SzW9MBt9@RGBSSRV`7y2z{9}8(@}MaS@I^3j=ahu{(+f+MG9;L E02?zz*8l(j literal 0 HcmV?d00001 diff --git a/__pycache__/part1.cpython-312.pyc b/__pycache__/part1.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..8ad8a99d3e064965afbc7eed7f1fe8ed71c5531d GIT binary patch literal 4441 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 Ld4Y&cY_I+U{&a(c literal 0 HcmV?d00001 From 6aec1a16911205755ce9a47e0fd0db09c8158f88 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Wed, 20 Aug 2025 08:52:20 +0000 Subject: [PATCH 3/3] Fix critical bugs: type conversion errors, variable shadowing, PDF generation logic, and typos Co-authored-by: rmanela <175689398+rmanela@users.noreply.github.com> --- .gitignore | 71 ++++++++++++++++++++++++ __pycache__/main.cpython-312.pyc | Bin 337 -> 0 bytes __pycache__/part1.cpython-312.pyc | Bin 4441 -> 0 bytes __pycache__/part2.cpython-312.pyc | Bin 5961 -> 0 bytes part1.py | 35 +++++++----- part2.py | 88 +++++++++++++++++------------- 6 files changed, 143 insertions(+), 51 deletions(-) create mode 100644 .gitignore delete mode 100644 __pycache__/main.cpython-312.pyc delete mode 100644 __pycache__/part1.cpython-312.pyc delete mode 100644 __pycache__/part2.cpython-312.pyc diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..b823c27 --- /dev/null +++ b/.gitignore @@ -0,0 +1,71 @@ +# Python cache files +__pycache__/ +*.py[cod] +*$py.class + +# Distribution / packaging +.Python +build/ +develop-eggs/ +dist/ +downloads/ +eggs/ +.eggs/ +lib/ +lib64/ +parts/ +sdist/ +var/ +wheels/ +*.egg-info/ +.installed.cfg +*.egg + +# PyInstaller +*.manifest +*.spec + +# Installer logs +pip-log.txt +pip-delete-this-directory.txt + +# Unit test / coverage reports +htmlcov/ +.tox/ +.coverage +.coverage.* +.cache +nosetests.xml +coverage.xml +*.cover +.hypothesis/ +.pytest_cache/ + +# Flask instance folder +instance/ + +# Environment variables +.env +.venv +env/ +venv/ +ENV/ +env.bak/ +venv.bak/ + +# IDE +.vscode/ +.idea/ +*.swp +*.swo +*~ + +# OS +.DS_Store +Thumbs.db + +# Project specific +uploads/ +*.pdf +*.xlsx +*.xls \ No newline at end of file diff --git a/__pycache__/main.cpython-312.pyc b/__pycache__/main.cpython-312.pyc deleted file mode 100644 index 26a7b9220ef7f7b54c3d545170083a68cabc8452..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 337 zcmX@j%ge<81ftzbGZdH@7#@Q-Fu)9Dd{zT8rZc24v@k?5q%x*3W@|7o6mc>!q%x#1 zt!9L%Vq~afu4L9^Nrv*lqAWlXWXfj+ATgbx1TL4tSi>-zVJ@<622CcvDi)7S9R*Fs zTdV~|nRz8Z21{OIZfY?|pTaNp+{Da0y@JYH9AMe_jLaf7paeS*7YhK128JgroEhAn}XC zCO1E&G$+-rhzH08SzW9MBt9@RGBSSRV`7y2z{9}8(@}MaS@I^3j=ahu{(+f+MG9;L E02?zz*8l(j diff --git a/__pycache__/part1.cpython-312.pyc b/__pycache__/part1.cpython-312.pyc deleted file mode 100644 index 8ad8a99d3e064965afbc7eed7f1fe8ed71c5531d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4441 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 Ld4Y&cY_I+U{&a(c diff --git a/part1.py b/part1.py index c6ef0e3..7febb1d 100644 --- a/part1.py +++ b/part1.py @@ -41,21 +41,30 @@ def report_file(): doch = [] for sh in range(len(sheets)): letters = read_numeric_values_from_excel(request.json['filePath'], sheets[sh]['name'], sheets[sh]['columnLetters']) - sum = 0 + total = 0 print(letters) - numbers = list(filter(lambda x: int(x) != None, letters)) + numbers = [] + for x in letters: + try: + num = float(x) # Use float to handle both int and decimal numbers + numbers.append(num) + except (ValueError, TypeError): + continue # Skip non-numeric values print('numbers', numbers) - if sheets[sh]['active'] == 'sum': - for i in numbers: - sum += i - else: - index = 0 - for i in numbers: - sum += i - index += 1 - sum /= index - doch.append({"sheetName": sheets[sh]['name'], "active": sheets[sh]['active'], "answer": sum}) - report_pdf_file(doch) + if sheets[sh]['active'] == 'sum': + for i in numbers: + total += i + else: + index = 0 + for i in numbers: + total += i + index += 1 + if index > 0: + total /= index + else: + total = 0 # Handle case with no numeric values + doch.append({"sheetName": sheets[sh]['name'], "active": sheets[sh]['active'], "answer": total}) + report_pdf_file(doch) return doch def report_pdf_file(doch): diff --git a/part2.py b/part2.py index 0c47781..12b3b20 100644 --- a/part2.py +++ b/part2.py @@ -27,21 +27,24 @@ def upload_file(): } return obj1 -def sum_excel_values(file_path): - wb = load_workbook(file_path) - total_sum = 0 - for sheet in wb.sheetnames: - ws = wb[sheet] - for row in ws.iter_rows(values_only=True): - for cell in row: - if cell is not None: - total_sum += int(cell) +def sum_excel_values(file_path): + wb = load_workbook(file_path) + total_sum = 0 + for sheet in wb.sheetnames: + ws = wb[sheet] + for row in ws.iter_rows(values_only=True): + for cell in row: + if cell is not None: + try: + total_sum += float(cell) # Use float to handle both int and decimal numbers + except (ValueError, TypeError): + continue # Skip non-numeric values return total_sum -@app.route('/field_sum', methods=['POST']) -def sum_of_values_field_in_excel(): - file_path = request.json['filePath'] - sum = sum_excel_values(file_path) - return {'sum': sum} +@app.route('/field_sum', methods=['POST']) +def sum_of_values_field_in_excel(): + file_path = request.json['filePath'] + total = sum_excel_values(file_path) + return {'sum': total} def plot_excel_sheets_sum(file_path): wb = load_workbook(file_path) @@ -50,10 +53,13 @@ def plot_excel_sheets_sum(file_path): for sheet in wb.sheetnames: ws = wb[sheet] sheet_sum = 0 - for row in ws.iter_rows(values_only=True): - for cell in row: - if cell is not None: - sheet_sum += int(cell) + for row in ws.iter_rows(values_only=True): + for cell in row: + if cell is not None: + try: + sheet_sum += float(cell) # Use float to handle both int and decimal numbers + except (ValueError, TypeError): + continue # Skip non-numeric values sums.append(sheet_sum) sheet_names.append(sheet) plt.bar(sheet_names, sums) @@ -69,25 +75,31 @@ def plot_excel(): plot_excel_sheets_sum(file_path) return {"successfully": 100} -def avarage_excel_values(file_path): - wb = load_workbook(file_path) - total_sum = [] - for sheet in wb.sheetnames: - ws = wb[sheet] - sum = 0 - for row in ws.iter_rows(values_only=True): - for cell in row: - if cell is not None: - sum += int(cell) - total_sum.append(sum) - sum = 0 - for i in total_sum: - sum += i - return sum / len(total_sum) -@app.route('/average', methods=['POST']) -def average_of_sheets(): - file_path = request.json['filePath'] - avg = avarage_excel_values(file_path) +def average_excel_values(file_path): + wb = load_workbook(file_path) + total_sum = [] + for sheet in wb.sheetnames: + ws = wb[sheet] + sheet_total = 0 + for row in ws.iter_rows(values_only=True): + for cell in row: + if cell is not None: + try: + sheet_total += float(cell) # Use float to handle both int and decimal numbers + except (ValueError, TypeError): + continue # Skip non-numeric values + total_sum.append(sheet_total) + overall_total = 0 + for i in total_sum: + overall_total += i + if len(total_sum) > 0: + return overall_total / len(total_sum) + else: + return 0 # Handle case with no sheets +@app.route('/average', methods=['POST']) +def average_of_sheets(): + file_path = request.json['filePath'] + avg = average_excel_values(file_path) return {'average': avg} @@ -101,7 +113,7 @@ def doch_pdf_total(): print(names) sums = plot_excel_sheets_sum(file_path)['sums'] print(sums) - avg = avarage_excel_values(file_path) + avg = average_excel_values(file_path) print(avg) obj_pdf = { 'file_name': file_name,