From c8c9b8b8f8d0f809f579123d51bb704743e38fbe Mon Sep 17 00:00:00 2001 From: Airah Yusuff Date: Wed, 17 Sep 2025 01:49:55 +0100 Subject: [PATCH 01/12] update automation script to not skip any row because it already uses first row as headers row by default --- tools/run_automation.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tools/run_automation.sh b/tools/run_automation.sh index baf613e1..54b77703 100644 --- a/tools/run_automation.sh +++ b/tools/run_automation.sh @@ -11,4 +11,4 @@ pip install -r requirements.txt # Example: samples/mentors.xlsx samples/mentors.yml a # mode "a" for APPEND new mentors from the xlsx table to the existing mentors.yml # mode "w" for WRITE all mentors from the xlsx table to mentors.yml -python3 automation.py samples/mentors.xlsx ../_data/mentors.yml a 1 \ No newline at end of file +python3 automation.py samples/mentors.xlsx ../_data/mentors.yml a 0 \ No newline at end of file From 8a68a1bea04b0c6e886ec63f2f9f60d8f3c5f501 Mon Sep 17 00:00:00 2001 From: Airah Yusuff Date: Wed, 17 Sep 2025 03:49:23 +0100 Subject: [PATCH 02/12] update mentor_addition automation tool for use during long-term reg. versus default (ad-hoc) periods --- tools/README.md | 3 +- ...py => automation_add_or_update_mentors.py} | 75 +++++++++++------- tools/run_automation.sh | 7 +- tools/samples/mentors.xlsx | Bin 10673 -> 12599 bytes tools/tests/automation_functional_test.py | 2 +- tools/tests/mentorship_type_test.py | 2 +- 6 files changed, 56 insertions(+), 33 deletions(-) rename tools/{automation.py => automation_add_or_update_mentors.py} (87%) diff --git a/tools/README.md b/tools/README.md index 6c1f332b..ce29fbcd 100644 --- a/tools/README.md +++ b/tools/README.md @@ -13,7 +13,7 @@ python 3.11 or above ### How to Execute on Mac -#### A) `automation.py` +#### A) `automation_add_or_update_mentors.py` ```shell sh run_automation.sh @@ -21,6 +21,7 @@ sh run_automation.sh **Note:** - Ensure to update `mentors.xslx` with the new spreadsheet containing the mentors to be added, **OR** - adjust the `FILE_PATH_MENTORS_XLSX` parameter in [the script](run_automation.sh) to match the file path for the new spreadsheet. +- adjust the `CURRENT_PERIOD` parameter in [the script](run_automation.sh) if running during long-term registration period (use "long-term") #### B) `download_image.py` diff --git a/tools/automation.py b/tools/automation_add_or_update_mentors.py similarity index 87% rename from tools/automation.py rename to tools/automation_add_or_update_mentors.py index 63dd549a..3fb72241 100644 --- a/tools/automation.py +++ b/tools/automation_add_or_update_mentors.py @@ -9,6 +9,7 @@ import textwrap from enum import Enum +import numpy as np import pandas as pd from ruamel.yaml import YAML from ruamel.yaml.scalarstring import LiteralScalarString @@ -130,24 +131,27 @@ def get_multiline_string(long_text_arg): multiline_str = LiteralScalarString(textwrap.dedent(long_text_arg)) return multiline_str -def get_sort(mentorship_type, num_mentee): +def get_sort(mentorship_type, num_mentee, current_period): """ Get mentor's sort value + Rules: https://docs.google.com/document/d/1GwlleBNScHCQ3K8rgvYIB3upIr1BylgWjGR2jxwYWtI/edit?usp=sharing """ - if mentorship_type == TYPE_BOTH or mentorship_type == type_long_term[0]: - if num_mentee > 2: - return 600 - if num_mentee == 2: - return 550 - if num_mentee == 1: - return 500 - return 200 - if mentorship_type == type_ad_hoc[0]: - #todo: (if availability == next month) then adjust the sort value: - return 100 - - return 10 + if current_period == "long-term": + if mentorship_type == TYPE_BOTH or mentorship_type == type_long_term[0]: + if num_mentee > 2: + return 500 + if num_mentee == 2: + return 200 + if num_mentee == 1: + return 100 + return 10 + return 10 + + if current_period == "default" and mentorship_type == type_long_term[0]: + return 10 + + return 500 def get_mentorship_type(mentorship_type_str): """ @@ -237,13 +241,24 @@ def read_yml_file(file_path): return yml_dict +def get_num_mentee_from_row(mentor_row, default): + """ + Extract num_mentee from mentor_row, or use default if invalid. + """ + val = mentor_row.iloc[44] + + return ( + int(val) if pd.notna(val) and isinstance(val, (int, np.integer)) + else default + ) def xlsx_to_yaml_parser(mentor_row, mentor_index, + current_period, mentor_disabled=False, mentor_sort=0, mentor_matched=False, - num_mentee=1): + num_mentee=0): """ Prepare mentor's excel data for yaml format """ @@ -259,7 +274,9 @@ def xlsx_to_yaml_parser(mentor_row, mentor_type = get_mentorship_type(mentor_row.iloc[4]) if mentor_sort == 0: - mentor_sort = get_sort(mentor_type, num_mentee) + num_mentee = get_num_mentee_from_row(mentor_row, num_mentee) + + mentor_sort = get_sort(mentor_type, num_mentee, current_period) if not pd.isna(mentor_row.iloc[9]): mentor_position = f"{mentor_row.iloc[8].strip()}, {mentor_row.iloc[9].strip()}" @@ -329,7 +346,7 @@ def get_yml_data(yml_file_path): return df_yml_data -def get_all_mentors_in_yml_format(yml_file_path, xlsx_file_path, skip_rows=0): +def get_all_mentors_in_yml_format(yml_file_path, xlsx_file_path, current_period, skip_rows=0): """ Read all mentors from Excel sheet: - if mentor is in current mentors.yml, use existing values for index, disabled, sort, matched and num_mentee. @@ -356,6 +373,7 @@ def get_all_mentors_in_yml_format(yml_file_path, xlsx_file_path, skip_rows=0): if not df_yml_row.empty: mentor = xlsx_to_yaml_parser(df_mentors.iloc[row], df_yml_row['Index'].item(), + current_period, df_yml_row['Disabled'].item(), df_yml_row['Sort'].item(), df_yml_row['Matched'].item(), @@ -363,7 +381,8 @@ def get_all_mentors_in_yml_format(yml_file_path, xlsx_file_path, skip_rows=0): logging.info(f"For {mentor_name} use index, disabled and sort from mentors.yml file") else: mentor = xlsx_to_yaml_parser(df_mentors.iloc[row], - new_index) + new_index, + current_period) new_index += 1 mentors.append(mentor) @@ -372,7 +391,7 @@ def get_all_mentors_in_yml_format(yml_file_path, xlsx_file_path, skip_rows=0): return mentors -def get_new_mentors_in_yml_format(yml_file_path, xlsx_file_path, skip_rows=1): +def get_new_mentors_in_yml_format(yml_file_path, xlsx_file_path, current_period, skip_rows=1): """ Read just new mentors from Excel sheet: - start reading xlsx Mentors from the row 1 (from the date 03/04/2024) @@ -397,7 +416,7 @@ def get_new_mentors_in_yml_format(yml_file_path, xlsx_file_path, skip_rows=1): mentor_name = df_mentors.iloc[row].values[2].strip().lower() if df_yml.loc[df_yml.Name == mentor_name].empty: - mentor = xlsx_to_yaml_parser(df_mentors.iloc[row], new_index) + mentor = xlsx_to_yaml_parser(df_mentors.iloc[row], new_index, current_period) new_index += 1 mentors.append(mentor) @@ -411,25 +430,27 @@ def get_new_mentors_in_yml_format(yml_file_path, xlsx_file_path, skip_rows=1): def run_automation(): logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(levelname)s - %(message)s') - if len(sys.argv) == 5: + if len(sys.argv) == 6: xlsx_file_path = sys.argv[1] yml_file_path = sys.argv[2] - mode = WriteMode(sys.argv[3]) - skip_rows = int(sys.argv[4]) + current_period = sys.argv[3] + mode = WriteMode(sys.argv[4]) + skip_rows = int(sys.argv[5]) - logging.info("Params: xlsx: %s yml: %s mode: %s skip_rows: %s", xlsx_file_path, yml_file_path, mode, skip_rows) + logging.info("Params: xlsx: %s yml: %s current_period: %s mode: %s skip_rows: %s", xlsx_file_path, yml_file_path, current_period, mode, skip_rows) else: xlsx_file_path = "samples/mentors.xlsx" yml_file_path = "samples/mentors.yml" + current_period = "default" mode = WriteMode.APPEND skip_rows = 0 - logging.info("Default values: xlsx: %s yml:: %s mode: %s", xlsx_file_path, yml_file_path, mode) + logging.info("Default values: xlsx: %s yml:: %s current_period: %s mode: %s", xlsx_file_path, yml_file_path, current_period, mode) if mode == WriteMode.APPEND: logging.info("Appending option selected.") - list_of_mentors = get_new_mentors_in_yml_format(yml_file_path, xlsx_file_path, skip_rows=skip_rows) + list_of_mentors = get_new_mentors_in_yml_format(yml_file_path, xlsx_file_path, current_period, skip_rows=skip_rows) logging.info("New Mentors size: %d", len(list_of_mentors)) @@ -439,7 +460,7 @@ def run_automation(): elif mode == WriteMode.WRITE: logging.info("Recreate yml - Write option selected.") - list_of_mentors = get_all_mentors_in_yml_format(yml_file_path, xlsx_file_path, skip_rows=skip_rows) + list_of_mentors = get_all_mentors_in_yml_format(yml_file_path, xlsx_file_path, current_period, skip_rows=skip_rows) write_yml_file(yml_file_path, list_of_mentors, WriteMode.WRITE) diff --git a/tools/run_automation.sh b/tools/run_automation.sh index 54b77703..601ecae9 100644 --- a/tools/run_automation.sh +++ b/tools/run_automation.sh @@ -7,8 +7,9 @@ source myenv/bin/activate # Install packages pip install -r requirements.txt -# Enter the parameters: FILE_PATH_MENTORS_XLSX FILE_PATH_MENTORS_YML MODE SKIP_ROWS -# Example: samples/mentors.xlsx samples/mentors.yml a +# Enter the parameters: FILE_PATH_MENTORS_XLSX FILE_PATH_MENTORS_YML CURRENT_PERIOD MODE SKIP_ROWS +# Example: samples/mentors.xlsx samples/mentors.yml a default # mode "a" for APPEND new mentors from the xlsx table to the existing mentors.yml # mode "w" for WRITE all mentors from the xlsx table to mentors.yml -python3 automation.py samples/mentors.xlsx ../_data/mentors.yml a 0 \ No newline at end of file +# CURRENT_PERIOD: default or long-term (use long-term if currently during long-term registration period) +python3 automation_add_or_update_mentors.py samples/mentors.xlsx ../_data/mentors.yml default a 0 \ No newline at end of file diff --git a/tools/samples/mentors.xlsx b/tools/samples/mentors.xlsx index 87917e99cf84fb0d15081cacd0dbbe4fdc5a319b..02bc2ff3d74ea7eb8d166f312f79f7d7b13005d6 100644 GIT binary patch literal 12599 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 diff --git a/tools/tests/automation_functional_test.py b/tools/tests/automation_functional_test.py index 12bc585b..0bc0618d 100644 --- a/tools/tests/automation_functional_test.py +++ b/tools/tests/automation_functional_test.py @@ -3,7 +3,7 @@ import sys import pytest from file_utils import TOOLS_PATH -from automation import run_automation, read_yml_file, WriteMode +from tools.automation_add_or_update_mentors import run_automation, read_yml_file, WriteMode MENTOR_2 = "Mentor2 Name" MENTOR_3 = "Mentor3 Name" diff --git a/tools/tests/mentorship_type_test.py b/tools/tests/mentorship_type_test.py index 7aa84c49..487b4f6f 100644 --- a/tools/tests/mentorship_type_test.py +++ b/tools/tests/mentorship_type_test.py @@ -1,5 +1,5 @@ import unittest -from automation import get_mentorship_type, type_ad_hoc, type_long_term, TYPE_BOTH +from tools.automation_add_or_update_mentors import get_mentorship_type, type_ad_hoc, type_long_term, TYPE_BOTH class TestMentorAutomation(unittest.TestCase): AD_HOC_1 = "Ad-Hoc Format" From 9fcadd990b2e22d856792510073777db81b958fa Mon Sep 17 00:00:00 2001 From: Airah Yusuff Date: Wed, 17 Sep 2025 04:04:25 +0100 Subject: [PATCH 03/12] update download_image automation script for generics --- tools/download_image.py | 4 ++-- tools/run_download_automation.sh | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/tools/download_image.py b/tools/download_image.py index 71b2374a..d8c94a64 100644 --- a/tools/download_image.py +++ b/tools/download_image.py @@ -32,8 +32,8 @@ def download_image(url, mentor_name): def run_automation(): if len(sys.argv) == 3: - url = sys.argv[1] - mentor_name = sys.argv[2] + mentor_name = sys.argv[1] + url = sys.argv[2] image_path = download_image(url, mentor_name) if image_path: print(f"Image saved to {image_path}") diff --git a/tools/run_download_automation.sh b/tools/run_download_automation.sh index 36502860..c04001a0 100644 --- a/tools/run_download_automation.sh +++ b/tools/run_download_automation.sh @@ -8,4 +8,4 @@ source myenv/bin/activate pip install -r requirements.txt # Enter the parameters: IMAGE_URL MENTOR_NAME -python3 download_image.py "https://media.licdn.com/dms/image/v2/D4E03AQFLzC76FGXhiQ/profile-displayphoto-shrink_400_400/profile-displayphoto-shrink_400_400/0/1711114395505?e=1729728000&v=beta&t=P3FN1bSt0aMtt42YyJfiZCRxSqOPllf8U7O9jr2Ki_U" "Samuela Smolorz" \ No newline at end of file +python3 download_image.py "Mentor Name" "image_url_here" \ No newline at end of file From ffab2146bf3b5cd0591448e3647e5e285443eff5 Mon Sep 17 00:00:00 2001 From: Airah Yusuff Date: Wed, 17 Sep 2025 04:05:37 +0100 Subject: [PATCH 04/12] add two new mentors (using run_automation + run_download_automation scripts) --- _data/mentors.yml | 77 ++++++++++++++++++++ assets/images/mentors/anh_vu.jpeg | Bin 0 -> 19093 bytes assets/images/mentors/mudit_maheshwari.jpeg | Bin 0 -> 55674 bytes 3 files changed, 77 insertions(+) create mode 100644 assets/images/mentors/anh_vu.jpeg create mode 100644 assets/images/mentors/mudit_maheshwari.jpeg diff --git a/_data/mentors.yml b/_data/mentors.yml index 9dde8b19..a8ced126 100644 --- a/_data/mentors.yml +++ b/_data/mentors.yml @@ -2891,3 +2891,80 @@ Technology architecture & strategy; Career growth & soft skills; Navigating the job market and building a professional brand; Effective communication in technical teams network: - linkedin: https://www.linkedin.com/in/morar-antonela + +- name: Mudit Maheshwari + disabled: false + matched: false + sort: 500 + num_mentee: 4 + hours: 2 + type: both + index: 85 + location: London, United Kingdom + position: Quality Automation Specialist, NatWest Group + bio: | + I’m a Quality Engineer with over six years of experience in test automation, passionate about building reliable, high-quality software that delivers a great user experience. I specialise in designing and maintaining automation frameworks using modern tools like Cypress, Playwright, and TypeScript, and I enjoy collaborating closely with developers to embed quality into every stage of delivery. I’m motivated by solving complex problems, mentoring others, and continuously improving processes. Outside of work, I’m deeply interested in investing and financial technology, + image: | + assets/images/mentors/mudit_maheshwari.jpeg + languages: English + availability: [9, 10] + skills: + experience: 5-7 Years + years: 7 + mentee: | + Passionate , Patient , Hunger to learn + areas: + - QA + - DevOps + - Fullstack Developer + - Data Science + - Data Engineering + languages: Javascript, Java, C++, C + focus: + - Grow from beginner to mid-level + - Grow beyond senior level + - Change specialisation within IT + - Grow from mid-level to senior-level + - Switch from IC to management position + extra: | + Resume Review , Latest testing tools, Top trending tech + network: + - linkedin: https://www.linkedin.com/in/maheshwarimudit/ + - medium: https://medium.com/@mudit94 + +- name: Anh Vu + disabled: false + matched: false + sort: 500 + num_mentee: 3 + hours: 3 + type: both + index: 86 + location: California, USA + position: Senior DevOps Engineer, Donors Choose + bio: | + I am a DevOps engineer with nearly a decade of hands-on experience specializing in infrastructure as code, with a strong focus on Terraform adoption and migration of critical production systems—including core web applications and secure bastion hosts. I have extensive experience designing and implementing scalable, containerized environments using Docker, AWS, and Kubernetes. Additionally, I’ve developed and maintained robust CI/CD pipelines using Jenkins, often building team-wide workflows and standards that have been adopted across engineering organizations. + image: | + assets/images/mentors/anh_vu.jpeg # TODO: Run download_image script to actually download the image + languages: English + availability: [9, 10, 11] + skills: + experience: 7-10 Years + years: 10 + mentee: | + Self starters, emotionally intelligent, women of color. + areas: + - DevOps + - Distributed Systems + - Network Engineering + - Project Management + - Security + languages: Python + focus: + - Grow from mid-level to senior-level + - Grow from beginner to mid-level + - Switch career to IT + extra: | + Prep for technical interview, resume feedback, technical mentorship, navigating interpersonal relationships in the workplace, career development. + network: + - linkedin: https://www.linkedin.com/in/anh-vu-5484bbab/ diff --git a/assets/images/mentors/anh_vu.jpeg b/assets/images/mentors/anh_vu.jpeg new file mode 100644 index 0000000000000000000000000000000000000000..db153e0b35271474c592fce7fb66b37b22bf5016 GIT binary patch literal 19093 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 literal 0 HcmV?d00001 diff --git a/assets/images/mentors/mudit_maheshwari.jpeg b/assets/images/mentors/mudit_maheshwari.jpeg new file mode 100644 index 0000000000000000000000000000000000000000..21e631cbf74a5193e173b01d47ef5140a4e5d471 GIT binary patch literal 55674 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 A&Hw-a literal 0 HcmV?d00001 From e94534c8ddc7b9e8f6fb221b51071fb3d284b44a Mon Sep 17 00:00:00 2001 From: Airah Yusuff Date: Wed, 17 Sep 2025 13:09:03 +0100 Subject: [PATCH 05/12] remove comment after mentor image available + rename script --- _data/mentors.yml | 2 +- tools/{run_automation.sh => run_mentor_add_automation.sh} | 0 2 files changed, 1 insertion(+), 1 deletion(-) rename tools/{run_automation.sh => run_mentor_add_automation.sh} (100%) diff --git a/_data/mentors.yml b/_data/mentors.yml index a8ced126..78ba5df4 100644 --- a/_data/mentors.yml +++ b/_data/mentors.yml @@ -2945,7 +2945,7 @@ bio: | I am a DevOps engineer with nearly a decade of hands-on experience specializing in infrastructure as code, with a strong focus on Terraform adoption and migration of critical production systems—including core web applications and secure bastion hosts. I have extensive experience designing and implementing scalable, containerized environments using Docker, AWS, and Kubernetes. Additionally, I’ve developed and maintained robust CI/CD pipelines using Jenkins, often building team-wide workflows and standards that have been adopted across engineering organizations. image: | - assets/images/mentors/anh_vu.jpeg # TODO: Run download_image script to actually download the image + assets/images/mentors/anh_vu.jpeg languages: English availability: [9, 10, 11] skills: diff --git a/tools/run_automation.sh b/tools/run_mentor_add_automation.sh similarity index 100% rename from tools/run_automation.sh rename to tools/run_mentor_add_automation.sh From 77fed88eadd00dca8378cd3ef24755cd93a9858d Mon Sep 17 00:00:00 2001 From: Airah Yusuff Date: Wed, 17 Sep 2025 13:14:22 +0100 Subject: [PATCH 06/12] minor fixes --- tools/tests/automation_functional_test.py | 2 +- tools/tests/mentorship_type_test.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/tools/tests/automation_functional_test.py b/tools/tests/automation_functional_test.py index 0bc0618d..e44235aa 100644 --- a/tools/tests/automation_functional_test.py +++ b/tools/tests/automation_functional_test.py @@ -3,7 +3,7 @@ import sys import pytest from file_utils import TOOLS_PATH -from tools.automation_add_or_update_mentors import run_automation, read_yml_file, WriteMode +from automation_add_or_update_mentors import run_automation, read_yml_file, WriteMode MENTOR_2 = "Mentor2 Name" MENTOR_3 = "Mentor3 Name" diff --git a/tools/tests/mentorship_type_test.py b/tools/tests/mentorship_type_test.py index 487b4f6f..27e4edb4 100644 --- a/tools/tests/mentorship_type_test.py +++ b/tools/tests/mentorship_type_test.py @@ -1,5 +1,5 @@ import unittest -from tools.automation_add_or_update_mentors import get_mentorship_type, type_ad_hoc, type_long_term, TYPE_BOTH +from automation_add_or_update_mentors import get_mentorship_type, type_ad_hoc, type_long_term, TYPE_BOTH class TestMentorAutomation(unittest.TestCase): AD_HOC_1 = "Ad-Hoc Format" From 0d3c2a12b8d6735e4e3faf256a16b88423a727c9 Mon Sep 17 00:00:00 2001 From: Airah Yusuff Date: Wed, 17 Sep 2025 13:19:04 +0100 Subject: [PATCH 07/12] add more updates --- tools/README.md | 7 ++++--- tools/run_automation.bat | 2 +- tools/tests/automation_functional_test.py | 2 +- 3 files changed, 6 insertions(+), 5 deletions(-) diff --git a/tools/README.md b/tools/README.md index ce29fbcd..fd32b907 100644 --- a/tools/README.md +++ b/tools/README.md @@ -1,11 +1,12 @@ ## How to Run Python Scripts -There are two automation scripts: -1) `automation.py`: appends new mentors in `samples/mentors.xslx` to `_data/mentor.yml` +1) `automation_add_or_update_mentors.py`: appends new mentors in `samples/mentors.xslx` to `_data/mentor.yml` 2) `download_image.py`: downloads image from a specified URL and saves in `assets/images/mentors` -3) `automation_create_mentor_spreadsheets.py`: creates spreadhseets for each longterm mentor with filenames like `WCC - Long Term - MentorName.xlsx`. All the files are saved in a folder named `Long Term Mentors`. It uses the data from `Mentorship Programme long-term Registration Form for Mentees (Responses).xlsx` sheetname `Revised Mentees`as input. +3) `meetup_import.py`: imports new upcoming events from the WCC MeetUp page using the iCal feed: https://www.meetup.com/women-coding-community/events/ical/ + +4) `automation_create_mentor_spreadsheets.py`: creates spreadhseets for each longterm mentor with filenames like `WCC - Long Term - MentorName.xlsx`. All the files are saved in a folder named `Long Term Mentors`. It uses the data from `Mentorship Programme long-term Registration Form for Mentees (Responses).xlsx` sheetname `Revised Mentees`as input. ### Dependencies diff --git a/tools/run_automation.bat b/tools/run_automation.bat index 586bbd30..36dbe037 100644 --- a/tools/run_automation.bat +++ b/tools/run_automation.bat @@ -15,5 +15,5 @@ echo Example: mentors_test.xlsx mentors_test.yml a 1 echo MODE: a - to append new mentors from the xlsx table to mentors.yml echo MODE: w - to create a new mentors.yml file with all mentors that are in the xlsx table echo SKIP_ROWS: To start XLSX in the line 1 -python automation.py samples/mentors.xlsx samples/mentors.yml a 1 +python automation_add_or_update_mentors.py samples/mentors.xlsx samples/mentors.yml a 1 @echo on \ No newline at end of file diff --git a/tools/tests/automation_functional_test.py b/tools/tests/automation_functional_test.py index e44235aa..41e5f841 100644 --- a/tools/tests/automation_functional_test.py +++ b/tools/tests/automation_functional_test.py @@ -13,7 +13,7 @@ def test_write_mentors_skip_zero_rows(monkeypatch): with tempfile.NamedTemporaryFile(suffix='yml', delete=False) as tmpfile: tmp_filename = tmpfile.name - test_args = ['automation.py', os.path.join(TOOLS_PATH, "samples", "mentors.xlsx"), tmp_filename, WriteMode.WRITE, '0'] + test_args = ['automation_add_or_update_mentors.py', os.path.join(TOOLS_PATH, "samples", "mentors.xlsx"), tmp_filename, WriteMode.WRITE, '0'] monkeypatch.setattr(sys, 'argv', test_args) run_automation() From 901e85f1bc7b29fe759a798934556e8e4e8f108a Mon Sep 17 00:00:00 2001 From: Airah Yusuff Date: Wed, 17 Sep 2025 13:43:28 +0100 Subject: [PATCH 08/12] update python tests workflow --- .github/workflows/pull_request.yml | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/.github/workflows/pull_request.yml b/.github/workflows/pull_request.yml index 2eb9a3ce..0ca24a24 100644 --- a/.github/workflows/pull_request.yml +++ b/.github/workflows/pull_request.yml @@ -47,4 +47,6 @@ jobs: pip install -r requirements.txt - name: Run pytest - run: pytest tools + run: | + cd tools + pytest From 6b816e2ee988a6051752f708f77a94ae72b32fc1 Mon Sep 17 00:00:00 2001 From: Airah Yusuff Date: Wed, 17 Sep 2025 13:53:21 +0100 Subject: [PATCH 09/12] fix #2: update test + wip logging for second failing --- tools/tests/automation_functional_test.py | 2 +- tools/tests/file_utils_test.py | 3 +++ 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/tools/tests/automation_functional_test.py b/tools/tests/automation_functional_test.py index 41e5f841..9f170e8e 100644 --- a/tools/tests/automation_functional_test.py +++ b/tools/tests/automation_functional_test.py @@ -13,7 +13,7 @@ def test_write_mentors_skip_zero_rows(monkeypatch): with tempfile.NamedTemporaryFile(suffix='yml', delete=False) as tmpfile: tmp_filename = tmpfile.name - test_args = ['automation_add_or_update_mentors.py', os.path.join(TOOLS_PATH, "samples", "mentors.xlsx"), tmp_filename, WriteMode.WRITE, '0'] + test_args = ['automation_add_or_update_mentors.py', os.path.join(TOOLS_PATH, "samples", "mentors.xlsx"), tmp_filename, "default", WriteMode.WRITE, '0'] monkeypatch.setattr(sys, 'argv', test_args) run_automation() diff --git a/tools/tests/file_utils_test.py b/tools/tests/file_utils_test.py index 283db815..c7be74d9 100644 --- a/tools/tests/file_utils_test.py +++ b/tools/tests/file_utils_test.py @@ -1,8 +1,11 @@ +import logging from file_utils import * def test_get_project_path_is_correct(): path = get_project_path() + + logging.info("project path: ", path) assert path.endswith("WomenCodingCommunity.github.io") or path.endswith("WomenCodingCommunity.github.io\\") From df62079414ca717e5999eeec8353556b35bc146b Mon Sep 17 00:00:00 2001 From: Airah Yusuff Date: Sat, 20 Sep 2025 10:00:28 +0100 Subject: [PATCH 10/12] script updates for clarity --- tools/automation_add_or_update_mentors.py | 33 +++++++++++++++-------- 1 file changed, 22 insertions(+), 11 deletions(-) diff --git a/tools/automation_add_or_update_mentors.py b/tools/automation_add_or_update_mentors.py index 3fb72241..aa525e82 100644 --- a/tools/automation_add_or_update_mentors.py +++ b/tools/automation_add_or_update_mentors.py @@ -38,6 +38,10 @@ IMAGE_FILE_PATH = "assets/images/mentors" IMAGE_SUFFIX = ".jpeg" +# Mentorship cycle periods +LONG_TERM_REG_PERIOD = "long-term" # long-term registrations period only +DEFAULT_PERIOD = "default" # rest of the cycle, ad-hoc periods + class WriteMode(Enum): # Create new a file @@ -131,27 +135,34 @@ def get_multiline_string(long_text_arg): multiline_str = LiteralScalarString(textwrap.dedent(long_text_arg)) return multiline_str + +def is_available_for_long_term(mentorship_type): + return mentorship_type == TYPE_BOTH or mentorship_type == type_long_term[0] + + +def is_long_term_only(mentorship_type): + return mentorship_type == type_long_term[0] + + def get_sort(mentorship_type, num_mentee, current_period): """ Get mentor's sort value Rules: https://docs.google.com/document/d/1GwlleBNScHCQ3K8rgvYIB3upIr1BylgWjGR2jxwYWtI/edit?usp=sharing """ - if current_period == "long-term": - if mentorship_type == TYPE_BOTH or mentorship_type == type_long_term[0]: - if num_mentee > 2: - return 500 - if num_mentee == 2: - return 200 - if num_mentee == 1: - return 100 - return 10 + if current_period == LONG_TERM_REG_PERIOD and is_available_for_long_term(mentorship_type): + if num_mentee > 2: + return 500 + if num_mentee == 2: + return 200 + if num_mentee == 1: + return 100 return 10 - if current_period == "default" and mentorship_type == type_long_term[0]: + if current_period == DEFAULT_PERIOD and is_long_term_only(mentorship_type): return 10 - return 500 + return 100 def get_mentorship_type(mentorship_type_str): """ From 6b774d9e75b9d8559afe66c1e38741aca25f78d9 Mon Sep 17 00:00:00 2001 From: Airah Yusuff Date: Sat, 20 Sep 2025 10:00:54 +0100 Subject: [PATCH 11/12] fix test workflow issues --- .github/workflows/pull_request.yml | 4 +--- tools/README.md | 6 +++--- tools/{run_automation.bat => run_mentor_automation.bat} | 6 +++--- ...un_mentor_add_automation.sh => run_mentor_automation.sh} | 0 4 files changed, 7 insertions(+), 9 deletions(-) rename tools/{run_automation.bat => run_mentor_automation.bat} (79%) rename tools/{run_mentor_add_automation.sh => run_mentor_automation.sh} (100%) diff --git a/.github/workflows/pull_request.yml b/.github/workflows/pull_request.yml index 0ca24a24..2eb9a3ce 100644 --- a/.github/workflows/pull_request.yml +++ b/.github/workflows/pull_request.yml @@ -47,6 +47,4 @@ jobs: pip install -r requirements.txt - name: Run pytest - run: | - cd tools - pytest + run: pytest tools diff --git a/tools/README.md b/tools/README.md index fd32b907..220e8e71 100644 --- a/tools/README.md +++ b/tools/README.md @@ -17,12 +17,12 @@ python 3.11 or above #### A) `automation_add_or_update_mentors.py` ```shell -sh run_automation.sh +sh run_mentor_automation.sh ``` **Note:** - Ensure to update `mentors.xslx` with the new spreadsheet containing the mentors to be added, **OR** -- adjust the `FILE_PATH_MENTORS_XLSX` parameter in [the script](run_automation.sh) to match the file path for the new spreadsheet. -- adjust the `CURRENT_PERIOD` parameter in [the script](run_automation.sh) if running during long-term registration period (use "long-term") +- adjust the `FILE_PATH_MENTORS_XLSX` parameter in [the script](run_mentor_automation.sh) to match the file path for the new spreadsheet. +- adjust the `CURRENT_PERIOD` parameter in [the script](run_mentor_automation.sh) if running during long-term registration period (use "long-term") #### B) `download_image.py` diff --git a/tools/run_automation.bat b/tools/run_mentor_automation.bat similarity index 79% rename from tools/run_automation.bat rename to tools/run_mentor_automation.bat index 36dbe037..d201d7f6 100644 --- a/tools/run_automation.bat +++ b/tools/run_mentor_automation.bat @@ -10,10 +10,10 @@ echo Installing dependencies... pip install -r requirements.txt setlocal -echo Enter arguments for Python script: FILE_PATH_MENTORS_XLSX FILE_PATH_MENTORS_YML MODE SKIP_ROWS -echo Example: mentors_test.xlsx mentors_test.yml a 1 +echo Enter arguments for Python script: FILE_PATH_MENTORS_XLSX FILE_PATH_MENTORS_YML CURRENT_PERIOD MODE SKIP_ROWS +echo Example: mentors_test.xlsx mentors_test.yml default a 1 echo MODE: a - to append new mentors from the xlsx table to mentors.yml echo MODE: w - to create a new mentors.yml file with all mentors that are in the xlsx table echo SKIP_ROWS: To start XLSX in the line 1 -python automation_add_or_update_mentors.py samples/mentors.xlsx samples/mentors.yml a 1 +python automation_add_or_update_mentors.py samples/mentors.xlsx samples/mentors.yml default a 1 @echo on \ No newline at end of file diff --git a/tools/run_mentor_add_automation.sh b/tools/run_mentor_automation.sh similarity index 100% rename from tools/run_mentor_add_automation.sh rename to tools/run_mentor_automation.sh From e7e9287b953055de57964033de9fb5a9bb3750eb Mon Sep 17 00:00:00 2001 From: Airah Yusuff Date: Sat, 20 Sep 2025 10:12:28 +0100 Subject: [PATCH 12/12] cleanup --- tools/run_mentor_automation.sh | 2 +- tools/tests/file_utils_test.py | 3 --- 2 files changed, 1 insertion(+), 4 deletions(-) diff --git a/tools/run_mentor_automation.sh b/tools/run_mentor_automation.sh index 601ecae9..94a9b3cf 100644 --- a/tools/run_mentor_automation.sh +++ b/tools/run_mentor_automation.sh @@ -8,7 +8,7 @@ source myenv/bin/activate pip install -r requirements.txt # Enter the parameters: FILE_PATH_MENTORS_XLSX FILE_PATH_MENTORS_YML CURRENT_PERIOD MODE SKIP_ROWS -# Example: samples/mentors.xlsx samples/mentors.yml a default +# Example: samples/mentors.xlsx samples/mentors.yml default a 0 # mode "a" for APPEND new mentors from the xlsx table to the existing mentors.yml # mode "w" for WRITE all mentors from the xlsx table to mentors.yml # CURRENT_PERIOD: default or long-term (use long-term if currently during long-term registration period) diff --git a/tools/tests/file_utils_test.py b/tools/tests/file_utils_test.py index c7be74d9..283db815 100644 --- a/tools/tests/file_utils_test.py +++ b/tools/tests/file_utils_test.py @@ -1,11 +1,8 @@ -import logging from file_utils import * def test_get_project_path_is_correct(): path = get_project_path() - - logging.info("project path: ", path) assert path.endswith("WomenCodingCommunity.github.io") or path.endswith("WomenCodingCommunity.github.io\\")