From 5b4e287d6f2d804101763400bb22c3d82e899fc7 Mon Sep 17 00:00:00 2001 From: sukanya <sukanya.k@niveussolutions.com> Date: Fri, 21 Mar 2025 10:35:31 +0530 Subject: [PATCH] first commit --- __init__.py | 0 __pycache__/__init__.cpython-310.pyc | Bin 0 -> 148 bytes __pycache__/config.cpython-310.pyc | Bin 0 -> 508 bytes __pycache__/process_data.cpython-310.pyc | Bin 0 -> 2931 bytes ..._process_data.cpython-310-pytest-8.3.5.pyc | Bin 0 -> 7192 bytes config.json | 29 ++++++ config.py | 31 +++++++ data/HinduInput.xlsx | Bin 0 -> 7851 bytes data/HinduInput1.xlsx | Bin 0 -> 10736 bytes data/Jan16.xlsx | Bin 0 -> 20594 bytes data/Jan16_1.xlsx | Bin 0 -> 17617 bytes data/evldec17.xlsx | Bin 0 -> 5582 bytes data/speak2.xlsx | Bin 0 -> 5948 bytes main.py | 7 ++ process_data.py | 87 ++++++++++++++++++ pytest.ini | 2 + requirements.txt | 2 + sonar-project.properties | 11 +++ tests/__init__.py | 0 tests/__pycache__/__init__.cpython-310.pyc | Bin 0 -> 154 bytes ...st_api_client.cpython-310-pytest-8.3.5.pyc | Bin 0 -> 2672 bytes ...cel_operation.cpython-310-pytest-8.3.5.pyc | Bin 0 -> 3632 bytes ...yload_mapping.cpython-310-pytest-8.3.5.pyc | Bin 0 -> 2706 bytes ...ts_api_client.cpython-310-pytest-8.3.5.pyc | Bin 0 -> 1951 bytes tests/test_api_client.py | 44 +++++++++ tests/test_excel_operation.py | 49 ++++++++++ tests/test_payload_mapping.py | 53 +++++++++++ utils/__init__.py | 2 + utils/__pycache__/__init__.cpython-310.pyc | Bin 0 -> 259 bytes utils/__pycache__/api_client.cpython-310.pyc | Bin 0 -> 555 bytes .../excel_operations.cpython-310.pyc | Bin 0 -> 759 bytes .../payload_mapping.cpython-310.pyc | Bin 0 -> 645 bytes ...st_api_client.cpython-310-pytest-8.3.5.pyc | Bin 0 -> 2672 bytes ...cel_operation.cpython-310-pytest-8.3.5.pyc | Bin 0 -> 3632 bytes ...yload_mapping.cpython-310-pytest-8.3.5.pyc | Bin 0 -> 2706 bytes ...t_unpack_data.cpython-310-pytest-8.3.5.pyc | Bin 0 -> 3266 bytes ...ts_api_client.cpython-310-pytest-8.3.5.pyc | Bin 0 -> 1940 bytes utils/__pycache__/unpack_data.cpython-310.pyc | Bin 0 -> 994 bytes utils/api_client.py | 18 ++++ utils/excel_operations.py | 17 ++++ utils/payload_mapping.py | 46 +++++++++ utils/unpack_data.py | 25 +++++ 42 files changed, 423 insertions(+) create mode 100644 __init__.py create mode 100644 __pycache__/__init__.cpython-310.pyc create mode 100644 __pycache__/config.cpython-310.pyc create mode 100644 __pycache__/process_data.cpython-310.pyc create mode 100644 __pycache__/test_process_data.cpython-310-pytest-8.3.5.pyc create mode 100644 config.json create mode 100644 config.py create mode 100644 data/HinduInput.xlsx create mode 100644 data/HinduInput1.xlsx create mode 100644 data/Jan16.xlsx create mode 100644 data/Jan16_1.xlsx create mode 100644 data/evldec17.xlsx create mode 100644 data/speak2.xlsx create mode 100644 main.py create mode 100644 process_data.py create mode 100644 pytest.ini create mode 100644 requirements.txt create mode 100644 sonar-project.properties create mode 100644 tests/__init__.py create mode 100644 tests/__pycache__/__init__.cpython-310.pyc create mode 100644 tests/__pycache__/test_api_client.cpython-310-pytest-8.3.5.pyc create mode 100644 tests/__pycache__/test_excel_operation.cpython-310-pytest-8.3.5.pyc create mode 100644 tests/__pycache__/test_payload_mapping.cpython-310-pytest-8.3.5.pyc create mode 100644 tests/__pycache__/tests_api_client.cpython-310-pytest-8.3.5.pyc create mode 100644 tests/test_api_client.py create mode 100644 tests/test_excel_operation.py create mode 100644 tests/test_payload_mapping.py create mode 100644 utils/__init__.py create mode 100644 utils/__pycache__/__init__.cpython-310.pyc create mode 100644 utils/__pycache__/api_client.cpython-310.pyc create mode 100644 utils/__pycache__/excel_operations.cpython-310.pyc create mode 100644 utils/__pycache__/payload_mapping.cpython-310.pyc create mode 100644 utils/__pycache__/test_api_client.cpython-310-pytest-8.3.5.pyc create mode 100644 utils/__pycache__/test_excel_operation.cpython-310-pytest-8.3.5.pyc create mode 100644 utils/__pycache__/test_payload_mapping.cpython-310-pytest-8.3.5.pyc create mode 100644 utils/__pycache__/test_unpack_data.cpython-310-pytest-8.3.5.pyc create mode 100644 utils/__pycache__/tests_api_client.cpython-310-pytest-8.3.5.pyc create mode 100644 utils/__pycache__/unpack_data.cpython-310.pyc create mode 100644 utils/api_client.py create mode 100644 utils/excel_operations.py create mode 100644 utils/payload_mapping.py create mode 100644 utils/unpack_data.py diff --git a/__init__.py b/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/__pycache__/__init__.cpython-310.pyc b/__pycache__/__init__.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..44df40220e6d47f62b93fcb297f1b3ebe46ef011 GIT binary patch literal 148 zcmd1j<>g{vU|^W@^>#XleheazF(U&5g98HtLoo{j149Z!FoPze-%5rekT8PyWv-u* zpPQ;*TAW&>?~<Qfnwy$eQmpThnU_+kAC#JyQj%X@lv$GMT9KTZqaPoinU`4-AFo$X Yd5gm)H$SB`C)EyQU@;Q|0|N^K0B1EKt^fc4 literal 0 HcmV?d00001 diff --git a/__pycache__/config.cpython-310.pyc b/__pycache__/config.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..89f86a3be7f575f426db597c83e1ee380c036e7a GIT binary patch literal 508 zcmd1j<>g{vU|^8RIhFpAnStRkh=Ytd7#J8F7#J9eD;O9UQW#Pga~Pr+QW;a2Qka{W z`gx<6QW+L7r!p;MjA99ANMU4QU}0!xW@O0YFk~o}EN5h70KrHGMut?D6c$N_DArV# z6jn)wD7I9V6gEkQDE3sA6n065D2`N?6b?y-D9%)t6i!KoD6UkN6fQ}IDDD)-U<OU@ zmmoL!RdFZh=cQ$)>tz+^=iOo~y2b7o;29qp<a0~F(=Q-2B;GZ`+0`fB&C|#AmY{!V z2$~QdRLH~C(Zw|=_?D!be~_<ZNQkRTe2{B!fWKd`YjC`?f2d!`EztnSNFRSkmv}c% zS09()_}~!75Kre@A`ok!f-aGMj=rAGnmo5yzz$-`FG$V11$AS5T4qk_EtZ`8#FSfX z&i;OGp6*4=3=9lKEFgjvM6iJfb`Svy<swc728NXkMf@NE5b?`YKO;XkRll@2wMgG3 zKe;qFHLs*t-y<_GrBpvCH8G_mzq}~3B-OPdIW<Qg8Zrfyw>WHa^HWN5QtcQ)@g~N= Vz`!BM!_31d^Phu-gAoRK7y<Dld;9<Z literal 0 HcmV?d00001 diff --git a/__pycache__/process_data.cpython-310.pyc b/__pycache__/process_data.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..a3c6b5ea023cd1de63ed081aa210f6a00ee9472c GIT binary patch literal 2931 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 YG$+*#lzEFmwGaoB45J7m4+ydV0RHCKtpET3 literal 0 HcmV?d00001 diff --git a/__pycache__/test_process_data.cpython-310-pytest-8.3.5.pyc b/__pycache__/test_process_data.cpython-310-pytest-8.3.5.pyc new file mode 100644 index 0000000000000000000000000000000000000000..7d0e17374174aef97fa0e0810d72c3318cd2458c GIT binary patch literal 7192 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 KPneBSfDr)l5sOy< literal 0 HcmV?d00001 diff --git a/config.json b/config.json new file mode 100644 index 0000000..6861120 --- /dev/null +++ b/config.json @@ -0,0 +1,29 @@ +{ + "API_URL": "https://step-fastapi-email-pro-qa-1054173481485.asia-south1.run.app/evaluate_email", + "INPUT_EXCEL_FILE": "/home/user/Documents/Hindu/ReadtowriteExcel/data/HinduInput1.xlsx", + "OUTPUT_EXCEL_FILE": "data/evldec17.xlsx", + + "OUTPUT_HEADERS": [ + "Cefr Level", + "Scenario", + "Scenario Question", + "Subject", + "Email Content" + ], + + "FORMATTED_RESPONSES_COUNT": 1, + + "PAYLOAD_FIELDS_STATIC": { + "user_id": 7600001, + "question_id": 100456, + "answer_id": 120000789 + }, + + "INPUT_FIELDS_DYNAMIC": { + "Cefr Level": "cefr_level", + "Scenario": "scenario", + "Scenario Question": "scenario_question", + "Subject": "subject", + "Email Content": "email_content" + } +} diff --git a/config.py b/config.py new file mode 100644 index 0000000..c41a51f --- /dev/null +++ b/config.py @@ -0,0 +1,31 @@ +# # config.py +# +# API_URL = "https://step-fastapi-email-pro-qa-1054173481485.asia-south1.run.app/evaluate_email" +# INPUT_EXCEL_FILE = "data/Jan16_1.xlsx" +# OUTPUT_EXCEL_FILE = "data/evldec17.xlsx" +# #Headers means out headers to display in excel sheet +# HEADERS = [ +# "Cefr Level", +# "Scenario", +# "Scenario Question", +# "Subject", +# "Email Content" +# ] +# +# # Response configuration +# FORMATTED_RESPONSES_COUNT = 3 + +import json + +# Load configuration from JSON +with open("config.json", "r") as config_file: + CONFIG = json.load(config_file) + +# Extract values dynamically +API_URL = CONFIG["API_URL"] +INPUT_EXCEL_FILE = CONFIG["INPUT_EXCEL_FILE"] +OUTPUT_EXCEL_FILE = CONFIG["OUTPUT_EXCEL_FILE"] +OUTPUT_HEADERS = CONFIG["OUTPUT_HEADERS"] +FORMATTED_RESPONSES_COUNT = CONFIG["FORMATTED_RESPONSES_COUNT"] +PAYLOAD_FIELDS_STATIC = CONFIG["PAYLOAD_FIELDS_STATIC"] # Static fields (user_id, question_id, etc.) +INPUT_FIELDS_DYNAMIC = CONFIG["INPUT_FIELDS_DYNAMIC"] # Mapping for dynamic unpacking diff --git a/data/HinduInput.xlsx b/data/HinduInput.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..e0a142fb1b268bf7ffb9bb91d9f2b65ef1b4d9ca GIT binary patch literal 7851 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 literal 0 HcmV?d00001 diff --git a/data/HinduInput1.xlsx b/data/HinduInput1.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..e9df0b042a5f525634084a3d79209c91d1adbe31 GIT binary patch literal 10736 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 literal 0 HcmV?d00001 diff --git a/data/Jan16.xlsx b/data/Jan16.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..b8d7521ff0b49fbdc79b833ee365e8117c03f012 GIT binary patch literal 20594 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 CR++{C literal 0 HcmV?d00001 diff --git a/data/Jan16_1.xlsx b/data/Jan16_1.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..e3b3c060ee4e368a8d5413ddfb8bdabd76ff8b43 GIT binary patch literal 17617 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 literal 0 HcmV?d00001 diff --git a/data/evldec17.xlsx b/data/evldec17.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..5f85c34eeb6d2322cb6be0cc9cfca1e94c80b1a8 GIT binary patch literal 5582 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 TQozZ;$zaFCz)%Gm&tm`p-6q{( literal 0 HcmV?d00001 diff --git a/data/speak2.xlsx b/data/speak2.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..950c2b1d8a78ac56a096ae4a390da1346cd96ea6 GIT binary patch literal 5948 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 literal 0 HcmV?d00001 diff --git a/main.py b/main.py new file mode 100644 index 0000000..5824937 --- /dev/null +++ b/main.py @@ -0,0 +1,7 @@ +# main.py +from process_data import process_rows + +if __name__ == "__main__": + print("Starting the data processing...") + process_rows() + print("Processing completed!") diff --git a/process_data.py b/process_data.py new file mode 100644 index 0000000..ee1366c --- /dev/null +++ b/process_data.py @@ -0,0 +1,87 @@ +# process_data.py + +import time +from config import API_URL, INPUT_EXCEL_FILE, OUTPUT_EXCEL_FILE, OUTPUT_HEADERS, FORMATTED_RESPONSES_COUNT +from utils import load_excel, save_excel, create_output_workbook +from utils.unpack_data import unpack_input_data # Import the new unpack function +from utils.api_client import send_api_request +#pands data format + + +def process_rows(): + # Load input workbook + workbook = load_excel(INPUT_EXCEL_FILE) + sheet = workbook.active + + # Generate dynamic output headers + output_headers = OUTPUT_HEADERS + [ + f"Formatted Response{i + 1}" for i in range(FORMATTED_RESPONSES_COUNT) + ] + [ + f"Response Time{i + 1} (seconds)" for i in range(FORMATTED_RESPONSES_COUNT) + ] + + # Create output workbook + output_workbook = create_output_workbook(output_headers) + output_sheet = output_workbook.active + + for row_index, row in enumerate(sheet.iter_rows(min_row=2, values_only=True), start=2): + if all(cell is None for cell in row): + print(f"Skipping empty row {row_index}") + continue + + # Map input columns to header keys dynamically + input_data = {header: row[i] for i, header in enumerate(OUTPUT_HEADERS)} + + # Check if all required fields are present + if any(value is None for value in input_data.values()): + print(f"Skipping row {row_index}: Missing required data") + continue + + print(f"Processing row {row_index}") + + # Unpack input data and prepare the payload + payload = unpack_input_data(input_data) + + responses = [] + response_times = [] + + for _ in range(FORMATTED_RESPONSES_COUNT): + try: + response, response_time = send_api_request(API_URL, payload) + + # Check if the response is an actual response object and contains status_code + if isinstance(response, dict): # The response is likely the JSON data + formatted_response = "Response:\n" + for key, value in response.items(): + if isinstance(value, str) and "\n" in value: + formatted_response += f"{key.capitalize()}:\n{value.strip()}\n" + else: + formatted_response += f"{key.capitalize()}: {value}\n" + formatted_response += "-" * 50 + responses.append(formatted_response) + else: + # If the response doesn't contain JSON, handle error (may need to add a check here) + error_response = f"Error: Invalid response format received\n" + responses.append(error_response) + + response_times.append(response_time) + except Exception as e: + # Handle unexpected exceptions + error_message = f"Exception occurred: {str(e)}" + responses.append(error_message) + response_times.append(0) + + time.sleep(1) + + # Append data to the output sheet + output_row = list(input_data.values()) + [ + responses[i] if i < len(responses) else "N/A" for i in range(FORMATTED_RESPONSES_COUNT) + ] + [ + response_times[i] if i < len(response_times) else 0 for i in range(FORMATTED_RESPONSES_COUNT) + ] + + output_sheet.append(output_row) + + # Save the output workbook + save_excel(output_workbook, OUTPUT_EXCEL_FILE) + print(f"Responses saved in {OUTPUT_EXCEL_FILE}") diff --git a/pytest.ini b/pytest.ini new file mode 100644 index 0000000..03f586d --- /dev/null +++ b/pytest.ini @@ -0,0 +1,2 @@ +[pytest] +pythonpath = . \ No newline at end of file diff --git a/requirements.txt b/requirements.txt new file mode 100644 index 0000000..f376ed8 --- /dev/null +++ b/requirements.txt @@ -0,0 +1,2 @@ +openpyxl +requests diff --git a/sonar-project.properties b/sonar-project.properties new file mode 100644 index 0000000..da772ba --- /dev/null +++ b/sonar-project.properties @@ -0,0 +1,11 @@ +# Required metadata +sonar.projectKey=my-project-key +sonar.projectName=My Python Project +sonar.projectVersion=1.0 + +# Path to source directories +sonar.sources=. + +# Language-specific configuration +sonar.language=py +sonar.sourceEncoding=UTF-8 diff --git a/tests/__init__.py b/tests/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/tests/__pycache__/__init__.cpython-310.pyc b/tests/__pycache__/__init__.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..1964e52297c51b701839ab20ec864b3bd5b221a1 GIT binary patch literal 154 zcmd1j<>g{vU|>*vdnX-4KL!!Vn2~{j!GVE+p_qk%fgyz<m_d`#ZzV$!NEku<venPX z&rQ`YElw@ccgasK%}vcKDc1MM%u6ZN4@yl;DakJ{$}CBBtw>JI(Jx6YE-BWJkI&4@ eEQycTE2zB1VUwGmQks)$2Qs#piGhKEg#iE(&?J}u literal 0 HcmV?d00001 diff --git a/tests/__pycache__/test_api_client.cpython-310-pytest-8.3.5.pyc b/tests/__pycache__/test_api_client.cpython-310-pytest-8.3.5.pyc new file mode 100644 index 0000000000000000000000000000000000000000..36526a09f50af7813b17a2e4c48c112c3267d9eb GIT binary patch literal 2672 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 literal 0 HcmV?d00001 diff --git a/tests/__pycache__/test_excel_operation.cpython-310-pytest-8.3.5.pyc b/tests/__pycache__/test_excel_operation.cpython-310-pytest-8.3.5.pyc new file mode 100644 index 0000000000000000000000000000000000000000..7b9cb75a4d4fa43460d59804d22240654c475aac GIT binary patch literal 3632 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 literal 0 HcmV?d00001 diff --git a/tests/__pycache__/test_payload_mapping.cpython-310-pytest-8.3.5.pyc b/tests/__pycache__/test_payload_mapping.cpython-310-pytest-8.3.5.pyc new file mode 100644 index 0000000000000000000000000000000000000000..b8e2430f2a0d2ed7bddb726c78e5bcfba017e44a GIT binary patch literal 2706 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 G4+j9_Ak0tz literal 0 HcmV?d00001 diff --git a/tests/__pycache__/tests_api_client.cpython-310-pytest-8.3.5.pyc b/tests/__pycache__/tests_api_client.cpython-310-pytest-8.3.5.pyc new file mode 100644 index 0000000000000000000000000000000000000000..abe196ebf00ba77038141ba18c850e83909aba3b GIT binary patch literal 1951 zcmd1j<>g{vU|_KSdOJOgg@NHQh=Yt-7#J8F7#J9e^B5QyQW#Pga~Pr+!8B7YGZO<N zLoQ1cD<edPEs6~+!yd(+!jQt0!;#Aw#mUH!!kogA!<EY&#m&f&%9+C2%$UlV!q&`~ z!k)s>!qCjv%oxQ35l`Vv;R1<7@un~aGiY+Z1i8ddlkpa7L1IaA#!Ds!1_n*WTLQ(Y zc`5OU1)1?hsfDGf#U)j|P)4y{L4I*b6=z9iZmJ%LNCs&EnF7Mx3=9nH3=9m;ApaOK zGBDIIW--(<r7)&2r7+K7s$t4vjAuw;NnuTAs$qy{N@1&I2Dvelv6iKTxrVuhrI{&) zsg|{t4W^@(y@s`hJ)5bPqlTk6yo6-|YYJx#M;c=a7f3vfX(3ArcM019_Js^(48=Aj zEDJblSQj!DIhL?2-~_Sq7*n{xZ1#nWDLiwS#29KhQ+QMOYB)0)#TaV2O1Mf`7I4>a zEo5wFY+_7dU}31`sAW&#uVt@cgWEe9#a^}=cCftyaC<Aj_OdNxEUE?D#kP<!k1<66 z%qGoVhF}IwLBCt<#ihx~sl~-r+`);t1v#k-DTyVCnoPIYic1npN{er?fcTj&m>C!{ zUokT<{1VS7DJdwn($`O|0ISza&d=3PEXcgYoSj;Ei?u8<r!;jX<1Z##+m(z}LaG`C zl?Ix{3bwWiAf~Zq@h#q>)Z&8tyyDb&kjX2VZZQ{B8h{AnUwnzh#i>OlV5O#-#UMe` zB4!2#1|&_ObfC#|i>D~Hq_ik69&Fz&maO9Zyj$GGnJKC9scC7c$t6Xgq<)Lbp`fxP zwYVfcvFMgyd~#w=PJB^nK~ZvkZb4#E>Mb6Jg39=$(#)Ka%)H`TY&rSKi8;l$B;t!R z@=J44z)IuObMliCbK>(7b5n0|#uq21rGiYj#peiiYG!_(Yf({t(JkTlwEUvn#FF^b zih`WPyu^~s{5(zWTb#N1$=UHBH$$1A6n%>qED8&UTg;_JIk(sg5-W4^6H|)#7#J9e zL_nVA200HBBu2N8IED}o#6lBfj@e3vB25MchF`Aw8Tq-X`lZFGMfxuJ$)&lec_qdA z9+`P5rTRgsi76%d<wcn#sjd~tsX6+f5Gsa{;Cz^zlbM=VqE}FPOBN&*kDfu}p-F}f zl=B1_7#P@C_!zmES(rE&`55b%Y8Z>O85kIn89})eiaC)ps|+IpLkU9`;{v7>#)XVE z4Drk<Otp-lf+dr&mZ^lLhOveToH?0mSuz=FS!<YUShJaG*=pE|eM(ptu%)opu%$7k zuz|$E*@L}=eE|nJTN;+IF5s+TUdUKvR>Hb~3&hG}OkoGJSr;;<aDcNVJE&-?VFzbR zjuP$?)&)E@97x%ct(G-~yOy<v1#WK#ioGl~tYCY2;P&Q%?PXcWSX2bIiv^r5dBAMa z>;+{@UcV}C#{f?Sx5Uhx(xTKN4p5Q+1z{1WcrOB#d_}w<F>qSp2eE`egfNHz1v@zX zX!73TfR&`TxKb;UQwu<;viO!j5Tu|5#XeZ5NF1aQlw*n{KrBfRAq66&L4*v5kOdKP zAVMBgZgUnXg4oI+LIp&CodQa>MXDgK8i-H_5gH%@lqkU|vq%e+vZb-7t5i@{0=b}= zhk=2C51OJXKq*QeWGUY*4p?q20y*!NWIQB)>p^l!W`3StQ7SlP-{OP|-C~D|fjxJN z4Wgw;2jmdm(!9(PkYn^fS+WRJzuXciEy>I&)&tc@kemQ6OTcNm2;>ZiKhS){VUwGm eQks)$2MYdTP;4kMa4_;P@-VV7v4KbdK1KljL=e*e literal 0 HcmV?d00001 diff --git a/tests/test_api_client.py b/tests/test_api_client.py new file mode 100644 index 0000000..3306641 --- /dev/null +++ b/tests/test_api_client.py @@ -0,0 +1,44 @@ +import os +import pytest +import requests +from unittest.mock import patch +from utils.api_client import send_api_request + +@patch("requests.post") +@patch("time.time") +def test_send_api_request_success(mock_time, mock_post): + # Mock API response + mock_response = mock_post.return_value + mock_response.json.return_value = {"status": "success", "data": "Sample data"} + + # Mock timing for response calculation + mock_time.side_effect = [1000, 1002] # Start and end time (2 seconds response time) + + url = "https://step-fastapi-email-pro-qa-1054173481485.asia-south1.run.app/evaluate_email" + payload = { + "user_id": 7600001, + "question_id": 100456, + "answer_id": 120000789, + "cefr_level": "C1", + "subject": "Subject: Project Feedback", + "scenario": "addressing issue or giving feedback", + "scenario_question": "You are a team leader in a company, and one of your team members recently completed an important project. You need to provide feedback on their work, talking about both the positives and the areas for improvement. The goal is to note their hard work, encourage them, and give guidance for future projects.", + "email_content": "Hi Emma, I wanted to say a big thank you for all your hard work on the Marketing Campaign Launch project. It was a big project, and you did a great job!..." + } + + response_data, response_time = send_api_request(url, payload) + + assert response_data == {"status": "success", "data": "Sample data"} + assert response_time == 2 + +@patch("requests.post") +def test_send_api_request_error(mock_post): + # Simulate request failure + mock_post.side_effect = requests.exceptions.RequestException("API Failure") + + url = "https://step-fastapi-email-pro-qa-1054173481485.asia-south1.run.app/evaluate_email" + payload = {} + response_data, response_time = send_api_request(url, payload) + + assert response_data == {} + assert response_time == 0 diff --git a/tests/test_excel_operation.py b/tests/test_excel_operation.py new file mode 100644 index 0000000..76759db --- /dev/null +++ b/tests/test_excel_operation.py @@ -0,0 +1,49 @@ +import pytest +import openpyxl +from utils.excel_operations import load_excel, save_excel, create_output_workbook +import os + +@pytest.fixture +def sample_workbook(tmp_path): + """Create a sample workbook for testing.""" + file_path = tmp_path / "test.xlsx" + workbook = openpyxl.Workbook() + sheet = workbook.active + sheet.append(["Name", "Age", "City"]) + sheet.append(["John Doe", 30, "New York"]) + workbook.save(file_path) + return file_path + +def test_load_excel(sample_workbook): + """Test loading an existing Excel file.""" + workbook = load_excel(sample_workbook) + sheet = workbook.active + + assert sheet.cell(row=1, column=1).value == "Name" + assert sheet.cell(row=2, column=1).value == "John Doe" + +def test_save_excel(tmp_path): + """Test saving an Excel file.""" + workbook = openpyxl.Workbook() + sheet = workbook.active + sheet.append(["Product", "Price"]) + sheet.append(["Laptop", 1200]) + + file_path = tmp_path / "output.xlsx" + save_excel(workbook, file_path) + + # Verify the file is created and data is saved correctly + loaded_workbook = openpyxl.load_workbook(file_path) + loaded_sheet = loaded_workbook.active + + assert loaded_sheet.cell(row=1, column=1).value == "Product" + assert loaded_sheet.cell(row=2, column=2).value == 1200 + +def test_create_output_workbook(): + """Test creating a new workbook with headers.""" + headers = ["ID", "Name", "Department"] + workbook = create_output_workbook(headers) + sheet = workbook.active + + assert sheet.cell(row=1, column=1).value == "ID" + assert sheet.cell(row=1, column=3).value == "Department" diff --git a/tests/test_payload_mapping.py b/tests/test_payload_mapping.py new file mode 100644 index 0000000..3647c49 --- /dev/null +++ b/tests/test_payload_mapping.py @@ -0,0 +1,53 @@ +import pytest +from utils.payload_mapping import get_payload_mapping +from config import PAYLOAD_FIELDS_STATIC + + +def test_get_payload_mapping_complete_data(): + input_data = { + "cefr_level": "c1", + "scenario": "addressing issue or giving feedback", + "scenario_question": "You are a team leader providing project feedback.", + "subject": "Subject: Project Feedback", + "email_content": "Hi Emma, great work on the project!" + } + + expected_payload = PAYLOAD_FIELDS_STATIC.copy() + expected_payload.update(input_data) + + assert get_payload_mapping(input_data) == expected_payload + + +def test_get_payload_mapping_partial_data(): + input_data = { + "cefr_level": "b1", + "email_content": "Reminder: Please submit your report." + } + + expected_payload = PAYLOAD_FIELDS_STATIC.copy() + expected_payload.update(input_data) + + assert get_payload_mapping(input_data) == expected_payload + + +def test_get_payload_mapping_empty_data(): + input_data = {} + + expected_payload = PAYLOAD_FIELDS_STATIC.copy() + + assert get_payload_mapping(input_data) == expected_payload + + +def test_get_payload_mapping_overwrite_static_fields(): + input_data = { + "user_id": 7600001, # Attempt to overwrite static field + "email_content": "Custom content for testing." + } + + expected_payload = PAYLOAD_FIELDS_STATIC.copy() + expected_payload["email_content"] = "Custom content for testing." + + # Static fields should not change + expected_payload["user_id"] = PAYLOAD_FIELDS_STATIC["user_id"] + + assert get_payload_mapping(input_data) == expected_payload diff --git a/utils/__init__.py b/utils/__init__.py new file mode 100644 index 0000000..e0a55c6 --- /dev/null +++ b/utils/__init__.py @@ -0,0 +1,2 @@ +# utils/__init__.py +from .excel_operations import load_excel, save_excel, create_output_workbook diff --git a/utils/__pycache__/__init__.cpython-310.pyc b/utils/__pycache__/__init__.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..231ff3a54ded608ca0d7c36f6b9be25382f43f63 GIT binary patch literal 259 zcmd1j<>g{vU|{&>-khGuz`*br#6iYP3=9ko3=9m#5)2FsDGVu$ISjdsQH;4vQB1ka zQOt}CDNMl(n#?a585kHenQw9B<R_-Yr&c7V=G@{cPAp4>vc-~%QWHy3<MT^P3Q9}j z%kzt}lk)Sk{WMu_34m3{=NF_FC6;97=M@)$>?~qtU|=X>VPIfb$xy@wVuOfZw)z?Q zxvBc4#i>R5F8Rr&xv6<2#rhtZc`2p(L8*x;CHdt=nI);NAP4A|mSpA>>&M4u=4F<| a$LkeT-r}&y%}*)KNwotxw-{uP1S0^S-bS4O literal 0 HcmV?d00001 diff --git a/utils/__pycache__/api_client.cpython-310.pyc b/utils/__pycache__/api_client.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..3108cdc02a3096ae411dab7b07bdace4eb16733a GIT binary patch literal 555 zcmd1j<>g{vU|{eHZcZ0rVqka-;vi!t1_lNP1_p*=83qQ16owSW9EK<e%^1a)!j!_? z!Vtxj!Whh;$?_7U&o3FI1H=MhHU<U;konFa6ABm@7^);n7#1)rWT<5-Va#HxVW?qD zVeDn9Wrm2>Fi9}fveYmyU|z^j!;;1n&JfJN!cf9eY0k({%gV@5C0xRq!c@Xm!`jR^ zn_(_fGb1BICPNA{NF^IXBtr^AEo&WXFqAH5EN9SU@zZ3y#gbK=pI0U97~rW8lv-Gt zT3n*wT2z!@WTjBV$iTp$$$pEaBr`Yl7Do|8w)hrHL4I*b5y&gII9)4}QwvHm^Yd=8 z78GUXmE2-3E-BJvyTx2ulyi%{Ah9whKQZMNS8+*VQAs?^oZ^D~yyDbbyhW)H7DR$E zbtOX)KLZ29FMIur{M=Oi(&E%2eV6>?(%jU%l45<2%)FFR{h-vul#=}NqRf(1kli`@ zr6rj;#rlZ_neoXvnW=dtdIgoY1d3DhQsO~kP)CEpx>$sPfq{vUgNcukhmnt&k4cD8 zgps3x>0gl`$e+wbEDQ_`Ma&=qBmi~_5+T6Az;KJhCO1E&G$+*#6g0&kQ#qJ87<rfg Dya|Xn literal 0 HcmV?d00001 diff --git a/utils/__pycache__/excel_operations.cpython-310.pyc b/utils/__pycache__/excel_operations.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..aee0c5ade75a793ad4e109f3ea75860fe74af5ed GIT binary patch literal 759 zcmd1j<>g{vU|>+oK9&BMk%8ech=Yuo7#J8F7#J9eRTvl;QW#Pga~Pr+QkYVhTNt7k zQ&>`1TNt94QrJ@1TNt94Qy7C8G&x>^^!p_<f+#2kv6&ed7@R>Sfh;UxSio4run?r4 zu}a$~KQToiF;Bs@A~`ijAuTf}RUt7iMWHCQq_ikcp(G<!p*+7RJ1IXuTThee7Ds+T zYF<HQMb0hWoczR;c$l0f<1J2*-uQyVl8luMMXU@A48L6UGxBp&^-GIWi}YRclS^|` z^Gb^KJu>rBO7(+M6H`j^%ZoBgQo%OsmzHGa6zivgToIpNkXn>jl9``ZtXEKZiwkTM zScV1U2T-tZF%_{hFfb&8*ie5mfY@-4@-Z+l)G#bys9{{l$jAT=9HuIn;KZ_26hA4H z<SQhCeXZxG$#{#UII%1h<V~2ria<7keFGub7#J9Cae-9DgB`>Ha}Xa>5h!d?LLTH8 z5C(_53<CoLDC8G1)H2pEW--+=)i5n!2E_v-Lk%P@)SQb_6H8JR5*6}N%i+Nej*i5X z6orh`#FW&cVm(ckB9K>aafCx7<`!FGa!F=c>Mgd!f`Zh%6iwz^JW$2)d5O8HMVug4 zvleHhrj|gw0g9d?uwTTI!FI;ymzETimcZka2jnl1=Qx<y7`Yf(7>fiL7#N^7gM%LI hU9c#UkqC1+Y;yBcN^?@}K*_HdY!V{}69)?q3jiabvl;*Z literal 0 HcmV?d00001 diff --git a/utils/__pycache__/payload_mapping.cpython-310.pyc b/utils/__pycache__/payload_mapping.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..1ea7b6d76b6eb27bb775def279c43c93e2548db0 GIT binary patch literal 645 zcmd1j<>g{vU|<N#IhAh2#=!6x#6iYP3=9ko3=9m#5)2FsDGVu$ISjdsQH+cXDNHHM zEeugiDJ;PZnyfEDdNdhti3T`E`uID##JhRA`nUwg2ZuO@cseIDf~27sWFj*I1A{Zj zR51nyh7yJaj0+iR8EY69Fx4<DWMpKhVGL%_WK3jYWMJS@P*70tO)Mx@$jmD!Em25G zEJ;)-$yX@JNL46Etjx(zOi?H<DJo4aDJ@D>C`v6X%`8eyQAnx;t8fhPR7k1JOU%to zPRz-v)Z+ph=U9|pYz1b43<sMV4>ngLB{R81(@G&EBUJ&!%*@YAEUHvU&d)1J%*@No zOGh?Lp){``F*!Rm1<7Sl3xZNhN{jN4>;M@CF*Z3rw;(6A1mXCi)WnoZkdKm56^c{y zN<d7I=Ntn(^}ue_WG(^)*)5jj{DR6`Y^4P$i6yC;Ot-iY4!^|?4T_ZvMeGa=48L6T zGxBp&^-GIWi}YRclS^|`^Gb^KJu>rBO7(+M6H`j^%ZoBgQe7*OQ*-o7OEPnc^`R!j z=Oz{uWag#o6;$35PERd~M-!I=#Tpv}0|N&)7c&b}5hnu!gP$hzEw<$RytK@8uv5W; iV22<P91IK$w>WHa^HWN5QtdzqqL_t&fq_SwhY0{8v#rDc literal 0 HcmV?d00001 diff --git a/utils/__pycache__/test_api_client.cpython-310-pytest-8.3.5.pyc b/utils/__pycache__/test_api_client.cpython-310-pytest-8.3.5.pyc new file mode 100644 index 0000000000000000000000000000000000000000..b731e60c28aed7c98b131f10999c9ddddcbc07df GIT binary patch literal 2672 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 literal 0 HcmV?d00001 diff --git a/utils/__pycache__/test_excel_operation.cpython-310-pytest-8.3.5.pyc b/utils/__pycache__/test_excel_operation.cpython-310-pytest-8.3.5.pyc new file mode 100644 index 0000000000000000000000000000000000000000..c7e7edb22b4a8c0b2006baeb7df32c4aca28b7a9 GIT binary patch literal 3632 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 literal 0 HcmV?d00001 diff --git a/utils/__pycache__/test_payload_mapping.cpython-310-pytest-8.3.5.pyc b/utils/__pycache__/test_payload_mapping.cpython-310-pytest-8.3.5.pyc new file mode 100644 index 0000000000000000000000000000000000000000..8037ab1f8e54a6fc3da3b652201f15bbba453ec4 GIT binary patch literal 2706 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 G;Q#>EnaoZA literal 0 HcmV?d00001 diff --git a/utils/__pycache__/test_unpack_data.cpython-310-pytest-8.3.5.pyc b/utils/__pycache__/test_unpack_data.cpython-310-pytest-8.3.5.pyc new file mode 100644 index 0000000000000000000000000000000000000000..299a011a22e4dc30f8e83fe59df3f592d7b88dbe GIT binary patch literal 3266 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 literal 0 HcmV?d00001 diff --git a/utils/__pycache__/tests_api_client.cpython-310-pytest-8.3.5.pyc b/utils/__pycache__/tests_api_client.cpython-310-pytest-8.3.5.pyc new file mode 100644 index 0000000000000000000000000000000000000000..4371551a407444531af35da580e629513e93bea3 GIT binary patch literal 1940 zcmd1j<>g{vU|?YSc01jdg@NHQh=Yt-7#J8F7#J9e^B5QyQW#Pga~Pr+!8B7YGZO<N zLoQ1cD<edPEs6~+!yd(+!jQt0!;#Aw#R-;U&f&`Cj^buyNaajnX=Y62Okr(iOkqo5 zZ((R=Y-Wt&frzJYq;P^nqIgpngBdirUV>cWr^$GWwIH!1IYX22mOyc8UP^poL1uhW zYGG+=aY+>~lu@i#kY8L<#aWV>o2myQl9@odp_rS2fq|WYfx#K%6(dFlh8o5!hFYc+ z#uTO$<~d9?Oj(Ta3@I!rtm#ZO4Dn1UY_-fO>?s_XjI}H!%r(q4EX_<YOtq}FY%m?Q z>@}=4?Ac7U95o!p;Uz2!SW`G_IMNtXxIp4*Obc03xJ%d;urFjNV<@&MVOhXY!@7{M z$gzZF0Vjx+$C$zmX0tD3OyQZsB*sw7nZldGSHqdfD8^9BRl-%mvVgmWYawGZV-sTv z0}DefM=g5_e=U0r8{FQ>DE6||u!HRtfZJOEwwG-oV^J;GF1Ce?d5kFnU^Z#?G6XYd z3i{n*FD^|^PAx93;to#CEyzh#NJ%V7)MUEFR$P);Qd)eA1;o#M!OXyr`HGo=;g@(u zNl8JmmA-yz1z5daa(=FUVnOCD=IqqUTdZY?Ii;y98GkX^+OA}*5>nMDs5H<lR<N~I z05Od<i*NB3r4|?D=M|^MgG^q@bc?y5(f~vl|Kdw5E>0~f0V_4tECvahz68ZNk|t0( z(B!$rQ<Pd#T9g+Lw(k~8R&jpbE$-sXl+^gtw6xUZk|JgX28LT)4h5AZsl_GniAA>r z<C7C}a^j0p3yPBSa|;rSQg87%6ja71m1gFYWabs$V#~=-PRuF3B@thokzbmV0#+KI zo|B)Hm=m9un45ZwGrl-6Efr+KEj~xEQ#14PT#JhGi*5<Wr{x#rCYHpfRutqU<|US7 z=I3d0-{Q>8PtJ}9xf#j?rRZC{U{P2&++r>*%DKf}kXV_MpO{j_%fP@;Bm#0hH^_OA zAThdy#4&_$AQqY+bIevU6lpRrF#K}W&&bbB)h{hhEz)<%PcF?(%_}L^_sGmkDb){3 zO-w1tFE7e0Np-DAPR-FTEy>I&)(3@CF*qM4=VYelmFN{z-jW3g#-nG@cxaMg1?4;e z1_lN;7CuHUW)>z6Mn1+mrW(c~Z3YI0WJYL41yP*HnN^07fuV#Ui*W%{3gbe?8isi0 z6sB6n6y_9`OvYNK5|$dq8YXb&WUgh&WT<7WVXk4#W~ybYVJr42VO_wM!dk<Y#+bqe z5(j4w_7e659N=teSi-u1vxa#gW06@2>jEwiD~~aS9n5B3$e6+b&X(*coGDy2?BHz4 zQNmrqx`3yK11Vdw)v~5=*Rs~I!0qiov6rQW6>KjL+}>QUy(|kEi;BQ@v4FEB5137w zy`XH#>sQ6?7~rYkmYA7ST9jG@D&~qfK<NS$jzys2y@&_I1*a805K9n52!RMtu!GZ& zChsi{SV?+|E43mywE&bVi*E@8K?+(>?1P1h#6cQCIi^Sg#F7LNQXoPaM96>$Sr8!y zBIFqu7&JMH6hUld5TODhz)k@r+agsER}Dm{g9r@}0ZNqMlv$(&O4-ub(^V=cD}mfn z4DuZxG(}Z_Qj|W(QodUpu-sY%a^5Y;cu4-%gXEIT{5-v)RB+0^#R(U>#SRq%d+rt+ zL`#tl$RWI?d6^|3$LN8wWD&Tm;R4k~kURh`MZl@K2;=~W577L=VUwGmQks)$2MYLN WP!uRJa4_;P@-VV7vVlkeK1KlGunm;} literal 0 HcmV?d00001 diff --git a/utils/__pycache__/unpack_data.cpython-310.pyc b/utils/__pycache__/unpack_data.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..536a455ec684288462331114e7d4f4c481b62146 GIT binary patch literal 994 zcmd1j<>g{vU|^8RIh8(#nStRkh=Yuo7#J8F7#J9eRTvl;QW#Pga~N_NqZk=MY^EHh zT;?cdMursT6qXi-D3%n~U<OULmmvL`jJHHQ{Q^Qm;@v!5eO!X$T_XJ)eLbBu8E*-v zr<TMQBv$6+C#J;bCKeQA=A|byf;2%f3j+fKD+2?AGss>a1_p*qhFZoFh6RiZ8C)1* z`C^!AnQED97#1+qFr_dqWLm(ykfDaLhS`RpkgbFzg(-!(g`tLV0V_y#Gh;Jjkx~jv zFhdDj4P!H7FoPy*q7Wkk1DAq=f<kCsL1J=tu|j5EL1~FXN@7W(LP}*`Vs2(~Vopw_ zLTPbkUb=!;u)m*fN@`kWUTTU0)ValaTwntni_(j&z$}n)U}NIJ#%QEuCYNYhDTHLC zDu9@o`FV*&l?uuEc_oRNc_3qp63db8)kxJ#*V9o*E6UGRaIHvA&C!Hf5tLd|T9k)m z3&=Qy{2~Rv{Jd0%1qDT^1&KweDGJa)RY=P(QYgttRd5XOR47U<EKMygf$31lOan_5 z<(DgD7AvIY7L-)#fqig`0VNVZ5zh>Y01%d7U|?uus9}g@uVt)ZOkv1o3S(eoC}c_j z1t?PyD8l?!GH5d0V$w6X#afn_Q<_=?ia{{(%RxUQKQ~psv^cd$-z7h}G&eP`q*&i0 zGcTo7KPWXZr6j++D6=FL>}~zhlFXc9{ZequfWuO+pz;={O?qlxYDGbjohZmTAp4ja z#2Bhnpz07IuV<5!pPZOeY^Mj;;-|@81oF)-*36RB+~Qlz>8T~RSc^-FG7D}oC+6hb zVgoz4xCrE3O_p0+2-9xyLM%v40XyXucPc1q;?puyb5d?`LxVd$JGBz*Q3%1oz`$@z z5TY+0VHC*C#XJlQ3@ls%%wmjU%q)x?%tgWs3=Dpnthd;b^YhX&(;@B@1&4ti%y?*; n13M3_0b&n4e2c&~a@geNr<CTT+JSOXF&hH|0}lfaBM%b*AutJ5 literal 0 HcmV?d00001 diff --git a/utils/api_client.py b/utils/api_client.py new file mode 100644 index 0000000..b0fdf29 --- /dev/null +++ b/utils/api_client.py @@ -0,0 +1,18 @@ +# utils/api_client.py + +import requests +import time + +def send_api_request(url, payload): + try: + # Assuming it's a POST request + start_time = time.time() + response = requests.post(url, json=payload) + response_time = time.time() - start_time + + # Assuming response.json() gives us the actual data as a dictionary + return response.json(), response_time + + except Exception as e: + print(f"API Request Error: {str(e)}") + return {}, 0 # Return an empty dict and 0 time on error diff --git a/utils/excel_operations.py b/utils/excel_operations.py new file mode 100644 index 0000000..8602302 --- /dev/null +++ b/utils/excel_operations.py @@ -0,0 +1,17 @@ +# utils/excel_operations.py +import openpyxl + +def load_excel(file_path): + """Load an Excel file and return the workbook.""" + return openpyxl.load_workbook(file_path) + +def save_excel(workbook, file_path): + """Save the workbook to a file.""" + workbook.save(file_path) + +def create_output_workbook(headers_name): + """Create a new workbook and add headers.""" + workbook = openpyxl.Workbook() + sheet = workbook.active + sheet.append(headers_name) + return workbook diff --git a/utils/payload_mapping.py b/utils/payload_mapping.py new file mode 100644 index 0000000..b8aa874 --- /dev/null +++ b/utils/payload_mapping.py @@ -0,0 +1,46 @@ +# # utils/payload_mapping.py +# +# def get_payload_mapping(cefr_level, scenario, scenario_question, subject, email_content): +# """ +# Maps input data to the payload structure required by the API with fixed user_id, question_id, and answer_id. +# +# Args: +# cefr_level (str): The CEFR level of the input data. +# scenario (str): The scenario description. +# scenario_question (str): The scenario question. +# subject (str): The subject or topic. +# email_content (str): The email content. +# +# Returns: +# dict: The payload ready to be sent to the API. +# """ +# return { +# "cefr_level": cefr_level, +# "user_id": 7600001, # Static user ID +# "question_id": 100456, # Static question ID +# "answer_id": 120000789, # Static answer ID +# "scenario": scenario, +# "scenario_question": scenario_question, +# "subject": subject, +# "email_content": email_content +# } + +from config import PAYLOAD_FIELDS_STATIC + +def get_payload_mapping(input_data): + """ + Maps input data to the payload structure required by the API dynamically. + + Args: + input_data (dict): The dictionary containing dynamically unpacked input data. + + Returns: + dict: The complete payload ready to be sent to the API. + """ + # Start with manually configured static fields from config.json + payload = PAYLOAD_FIELDS_STATIC.copy() # Ensuring we don't modify the original dictionary + + # Add dynamically unpacked fields + payload.update(input_data) + + return payload diff --git a/utils/unpack_data.py b/utils/unpack_data.py new file mode 100644 index 0000000..48d7df6 --- /dev/null +++ b/utils/unpack_data.py @@ -0,0 +1,25 @@ +from config import INPUT_FIELDS_DYNAMIC +from utils.payload_mapping import get_payload_mapping + +def unpack_input_data(input_data): + """ + Unpacks input data dynamically using JSON-defined mappings. + + Args: + input_data (dict): The dictionary containing raw input data (e.g., from Excel). + + Returns: + dict or None: The prepared payload for the API request or None if the row is empty. + """ + unpacked_data = {} + + # Loop through INPUT_FIELDS mapping from config.json to dynamically unpack data + for excel_field, payload_key in INPUT_FIELDS_DYNAMIC.items(): + unpacked_data[payload_key] = input_data.get(excel_field, "").strip() # Strip whitespace + + # Check if all unpacked values are empty + if all(value == "" for value in unpacked_data.values()): + return None # Skip empty rows + + # Pass valid data to get_payload_mapping + return get_payload_mapping(unpacked_data) -- GitLab