From 71d4db3baa78af4cb633af189a9e4743cb53a36e Mon Sep 17 00:00:00 2001 From: iamwatchdogs Date: Sat, 19 Oct 2024 00:03:02 +0530 Subject: [PATCH 1/3] Updated logging scripts updated the scripts to proper log the contributions made within files whose parent directory is .github and to make sure the same is reflected within deployed pages, updated the scripts that update the markdown files. --- .github/scripts/convert_to_html_tables.py | 91 ++++++- .github/scripts/update_contributors_log.py | 294 +++++++++++++-------- .github/scripts/update_index_md.py | 65 ++++- 3 files changed, 345 insertions(+), 105 deletions(-) diff --git a/.github/scripts/convert_to_html_tables.py b/.github/scripts/convert_to_html_tables.py index e1976c0..6bad0ea 100644 --- a/.github/scripts/convert_to_html_tables.py +++ b/.github/scripts/convert_to_html_tables.py @@ -21,6 +21,18 @@ class UpdateFileContent: REPO_NAME = None def __init__(self, FILE_PATH, condition=None): + """ + Constructor method of UpdateFileContent class. + + Parameters + ---------- + FILE_PATH : str + Path of the file to be updated. + condition : callable, optional + Condition to filter the contributors based on. + Defaults to None, which means no filtering. + + """ # Displaying starting Message print(f'\n--- Updating {FILE_PATH} ---\n') @@ -40,6 +52,14 @@ def __init__(self, FILE_PATH, condition=None): def get_lines(self): + """ + Reads the lines from the file located at `self.FILE_PATH`. + + Returns + ------- + list + List of lines read from the file. + """ # Reading lines from the file with open(self.FILE_PATH, 'r') as file: @@ -48,6 +68,17 @@ def get_lines(self): return lines def write_lines_into_file(self): + """ + Writes the lines to the file located at `self.FILE_PATH`. + + Parameters + ---------- + None + + Returns + ------- + None + """ # Updating the target file with open(self.FILE_PATH, 'w') as file: @@ -57,6 +88,23 @@ def write_lines_into_file(self): print(f"Updated '{self.FILE_PATH}' Successfully") def find_table_points(self, search_type): + """ + Finds the starting and ending points of a table in the file located at + `self.FILE_PATH` based on the `search_type`. + + Parameters + ---------- + search_type : str + Valid values are 'contributors' and 'table-of-content'. + + Returns + ------- + tuple + A tuple of `(table_starting_point, table_ending_point)` where + `table_starting_point` is the index of the line where the table + starts and `table_ending_point` is the index of the line where the + table ends. + """ # Setting default return values table_starting_point = None @@ -97,6 +145,16 @@ def find_table_points(self, search_type): return (table_starting_point, table_ending_point) def update_table_of_contributors(self, condition): + """ + Update the table of contributors based on the condition. + + Parameters + ---------- + condition : callable + A function that takes one argument (i.e., the core contribution) + and returns True if the contribution should be included in the table, or + False otherwise. If None, then all core contributions are included. + """ # Calculating stating and ending points of the targeted table table_of_contributors_start, table_of_contributors_end = self.find_table_points('contributors') @@ -135,7 +193,7 @@ def update_table_of_contributors(self, condition): # Processing core contribution core_contribution = details['core'] if condition is None: - core_contribution_output = f'{core_contribution}' + core_contribution_output = f'{core_contribution}' if core_contribution != 'Repo' else core_contribution # Processing pull-requests pull_requests = details['pull-request-number'] @@ -150,6 +208,12 @@ def update_table_of_contributors(self, condition): demo_path_output = f'./{core_contribution}/{specificity}' if title == 'root' or title == '{init}': demo_path_output = f'/{self.REPO_NAME}/' + elif title == '{workflows}': + demo_path_output = f'/{self.REPO_NAME}/.github/workflows' + elif title == '{scripts}': + demo_path_output = f'/{self.REPO_NAME}/.github/scripts' + elif title == '{others}': + demo_path_output = f'/{self.REPO_NAME}/.github/others' # Appending all data together updated_lines.append('\t\n') @@ -184,6 +248,22 @@ def update_table_of_contributors(self, condition): print('Successfully updated the contributor details !!!...') def update_table_of_content(self, condition): + """ + Update the table of content in the markdown file based on the specified condition. + + Args: + condition (callable): A function that takes one argument (i.e., the core contribution) + and returns True if the contribution should be included in the table, or + False otherwise. If None, then all core contributions are included. + + The method calculates the starting and ending points of the targeted table and + initializes necessary variables to store the table of content. It processes the + data from `self.DATA` to extract and organize the content by core and specificity. + The extracted data is sorted and used to update the markdown file with a structured + list of links representing the table of content. The links are formatted based on + whether a condition is given. Finally, the method updates the markdown lines and + prints a success message upon completion. + """ # Calculating stating and ending points of the targeted table table_of_content_start, table_of_content_end = self.find_table_points('table-of-content') @@ -248,6 +328,15 @@ def update_table_of_content(self, condition): def main(): + """ + The main function of the script is responsible for updating the root index file and the index files of `Theory` and `Solved-Problems` directories. + + The function takes in environment variables `REPO_NAME` and uses it to fetch the required data from the contributors log file. + + The function then updates the root index file and the index files of `Theory` and `Solved-Problems` directories using the fetched data. + + The function also prints out a success message at the end. + """ # Retrieving Environmental variables REPO_NAME = os.environ.get('REPO_NAME') diff --git a/.github/scripts/update_contributors_log.py b/.github/scripts/update_contributors_log.py index 2fb45f8..7b2c001 100644 --- a/.github/scripts/update_contributors_log.py +++ b/.github/scripts/update_contributors_log.py @@ -15,127 +15,215 @@ > GitHub action variable: ${{ github.event.pull_request.number }} ''' + def get_contribution_title(CURRENT_PR): - - # Setting default value - contribution_title = 'root' - path = contribution_title + """ + This function extracts the contribution title from the provided current pull request. + + Parameters: + - CURRENT_PR (dict): The current pull request information. + + Returns: + tuple: A tuple containing the contribution title and the path. + """ + + # Setting default value + contribution_title = 'root' + path = contribution_title + + # Iterating through the "files" list + for files in CURRENT_PR["files"]: + if '/' in files["path"]: + contribution_title = files["path"] + path = contribution_title + break + + if contribution_title == 'root': + return (contribution_title, path) + + if '.github/workflows' in path: + contribution_title = '{workflows}' + elif '.github/scripts' in path: + contribution_title = '{scripts}' + elif '.github' in path: + contribution_title = '{others}' + else: + splitted_title = contribution_title.split('/') + contribution_title = splitted_title[-2] if '.' in contribution_title else splitted_title[-1] + + return (contribution_title, path) + - # Iterating through the "files" list - for files in CURRENT_PR["files"]: - if '/' in files["path"]: - contribution_title = files["path"] - path = contribution_title - break +def get_contributor_name(CURRENT_PR): + """ + This function extracts the contributor name from the provided current pull request. - # If we find a directory - if contribution_title != 'root': - splitted_title = contribution_title.split('/') - contribution_title = splitted_title[-2] if '.' in contribution_title else splitted_title[-1] + Parameters: + - CURRENT_PR (dict): The current pull request information. - return (contribution_title, path) + Returns: + str: The contributor name. + """ + return CURRENT_PR["author"]["login"] -def get_contributor_name(CURRENT_PR): - return CURRENT_PR["author"]["login"] def get_core_type(CONTRIBUTION_TITLE, USED_PATH): - return USED_PATH.split('/')[0] if CONTRIBUTION_TITLE != 'root' else 'Repo' + """ + Determines the core type of the contribution based on the contribution title and used path. -def get_specificity(CONTRIBUTION_TITLE, USED_PATH): - return USED_PATH.split('/')[1] if CONTRIBUTION_TITLE != 'root' else 'Maintenance' + Parameters: + - CONTRIBUTION_TITLE (str): The title of the contribution, which can be a specific directory or a special identifier. + - USED_PATH (str): The file path associated with the contribution. -def get_demo_path(CURRENT_PR, CONTRIBUTION_TITLE, CORE_TYPE, SPECIFICITY): + Returns: + str: 'Repo' if the contribution title is one of the special identifiers ('root', '{workflows}', '{scripts}', '{others}'), + otherwise, the first segment of the used path is returned as the core type. + """ + if CONTRIBUTION_TITLE in ['root', '{workflows}', '{scripts}', '{others}']: + return 'Repo' + return USED_PATH.split('/')[0] - # Getting required values - REPO_NAME = os.environ.get('REPO_NAME') - # Handling a base case - if CONTRIBUTION_TITLE == 'root': - return f'https://github.com/{REPO_NAME}/' +def get_specificity(CONTRIBUTION_TITLE, USED_PATH): + """ + Determines the specificity of the contribution based on the contribution title and used path. - # Setting default value - demo_path = f'https://github.com/{REPO_NAME}/tree/main/{CORE_TYPE}/{SPECIFICITY}' - found_required_path = False + Parameters: + - CONTRIBUTION_TITLE (str): The title of the contribution, can be a specific directory or a special identifier. + - USED_PATH (str): The file path associated with the contribution. - # Iterating through the "files" list - for files in CURRENT_PR["files"]: - path = files["path"] - if "index.html" in path: - demo_path = path - found_required_path = True - break - elif path.lower().endswith('index.md') or path.lower().endswith('readme.md'): - demo_path = path - found_required_path = True + Returns: + str: The specificity of the contribution, extracted from the used path. + """ + if CONTRIBUTION_TITLE in ['root', '{workflows}', '{scripts}', '{others}']: + return 'Maintenance' + return USED_PATH.split('/')[1] - # Modifying demo path as a route - if found_required_path: - demo_path = '/'.join(demo_path.split('/')[:-1]) - # Checking out for spaces: - if ' ' in demo_path: - demo_path = '%20'.join(demo_path.split()) +def get_demo_path(CURRENT_PR, CONTRIBUTION_TITLE, CORE_TYPE, SPECIFICITY): + """ + Generates the demo path of the contribution based on the provided pull request information. + + Parameters: + - CURRENT_PR (dict): The current pull request information. + - CONTRIBUTION_TITLE (str): The title of the contribution. + - CORE_TYPE (str): The core type of the contribution. + - SPECIFICITY (str): The specificity of the contribution. + + Returns: + str: The generated demo path of the contribution. + """ + + # Getting required values + REPO_NAME = os.environ.get('REPO_NAME') + + # Handling a base cases + if CONTRIBUTION_TITLE == 'root': + return f'https://github.com/{REPO_NAME}/' + elif CONTRIBUTION_TITLE == '{workflow}': + return f'https://github.com/{REPO_NAME}/.github/workflows' + elif CONTRIBUTION_TITLE == '{scripts}': + return f'https://github.com/{REPO_NAME}/.github/scripts' + elif CONTRIBUTION_TITLE == '{others}': + return f'https://github.com/{REPO_NAME}/.github' + + # Setting default value + demo_path = f'https://github.com/{REPO_NAME}/tree/main/{CORE_TYPE}/{SPECIFICITY}' + found_required_path = False + + # Iterating through the "files" list + for files in CURRENT_PR["files"]: + path = files["path"] + if "index.html" in path: + demo_path = path + found_required_path = True + break + elif path.lower().endswith('index.md') or path.lower().endswith('readme.md'): + demo_path = path + found_required_path = True + + # Modifying demo path as a route + if found_required_path: + demo_path = '/'.join(demo_path.split('/')[:-1]) + + # Checking out for spaces: + if ' ' in demo_path: + demo_path = '%20'.join(demo_path.split()) + + return demo_path - return demo_path def main(): - + """ + The main function of the script is responsible for updating the contributors log file. + + The function takes in environment variables `REPO_NAME` and `PR_NUMBER` and uses it to fetch the required data from the current PR and the Contributors log file. + + The function then updates the Contributors log file either by appending a new entry or updating an existing one. + + The function also prints out a success message at the end. + """ + # Setting file paths - PR_DETAILS_FILE_PATH = 'pr.json' - CONTRIBUTION_LOG_FILE_PATH = '.github/data/contributors-log.json' - - # Reading contents from the current pr - with open(PR_DETAILS_FILE_PATH, 'r') as json_file: - CURRENT_PR = json.load(json_file) - - # Getting required value for update - CONTRIBUTION_TITLE, USED_PATH = get_contribution_title(CURRENT_PR) - CONTRIBUTOR_NAME = get_contributor_name(CURRENT_PR) - CORE_TYPE = get_core_type(CONTRIBUTION_TITLE, USED_PATH) - SPECIFICITY = get_specificity(CONTRIBUTION_TITLE, USED_PATH) - PR_NUMBER = os.environ.get('PR_NUMBER') - DEMO_PATH = get_demo_path(CURRENT_PR, CONTRIBUTION_TITLE, CORE_TYPE, SPECIFICITY) - - # Creating a new dict objects for JSON conversion - existing_data = None - new_data = { - CONTRIBUTION_TITLE: { - "contributor-name": [CONTRIBUTOR_NAME], - "core": CORE_TYPE, - "specificity": SPECIFICITY, - "pull-request-number": [PR_NUMBER], - "demo-path": DEMO_PATH - } - } - - # Processing the data dumps - operation_name = None - if os.path.exists(CONTRIBUTION_LOG_FILE_PATH): - - # Reading existing Log file - with open(CONTRIBUTION_LOG_FILE_PATH, 'r') as json_file: - existing_data = json.load(json_file) - - # performing updation or addition based on `PROJECT_TITLE` - if CONTRIBUTION_TITLE in existing_data: - if CONTRIBUTOR_NAME not in existing_data[CONTRIBUTION_TITLE]["contributor-name"]: - existing_data[CONTRIBUTION_TITLE]["contributor-name"].append(CONTRIBUTOR_NAME) - if PR_NUMBER not in existing_data[CONTRIBUTION_TITLE]["pull-request-number"]: - existing_data[CONTRIBUTION_TITLE]["pull-request-number"].append(PR_NUMBER) - operation_name = 'Updated' - else: - existing_data.update(new_data) - operation_name = 'Appended data to' - else: - existing_data = new_data - operation_name = 'Created' - - # Dumping the data into log file - with open(CONTRIBUTION_LOG_FILE_PATH, 'w') as json_file: - json.dump(existing_data, json_file, indent=2) - - # Output message - print(f'Successfully {operation_name} the log file') + PR_DETAILS_FILE_PATH = 'pr.json' + CONTRIBUTION_LOG_FILE_PATH = '.github/data/contributors-log.json' + + # Reading contents from the current pr + with open(PR_DETAILS_FILE_PATH, 'r') as json_file: + CURRENT_PR = json.load(json_file) + + # Getting required value for update + CONTRIBUTION_TITLE, USED_PATH = get_contribution_title(CURRENT_PR) + CONTRIBUTOR_NAME = get_contributor_name(CURRENT_PR) + CORE_TYPE = get_core_type(CONTRIBUTION_TITLE, USED_PATH) + SPECIFICITY = get_specificity(CONTRIBUTION_TITLE, USED_PATH) + PR_NUMBER = os.environ.get('PR_NUMBER') + DEMO_PATH = get_demo_path( + CURRENT_PR, CONTRIBUTION_TITLE, CORE_TYPE, SPECIFICITY) + + # Creating a new dict objects for JSON conversion + existing_data = None + new_data = { + CONTRIBUTION_TITLE: { + "contributor-name": [CONTRIBUTOR_NAME], + "core": CORE_TYPE, + "specificity": SPECIFICITY, + "pull-request-number": [PR_NUMBER], + "demo-path": DEMO_PATH + } + } + + # Processing the data dumps + operation_name = None + if os.path.exists(CONTRIBUTION_LOG_FILE_PATH): + + # Reading existing Log file + with open(CONTRIBUTION_LOG_FILE_PATH, 'r') as json_file: + existing_data = json.load(json_file) + + # performing updation or addition based on `PROJECT_TITLE` + if CONTRIBUTION_TITLE in existing_data: + if CONTRIBUTOR_NAME not in existing_data[CONTRIBUTION_TITLE]["contributor-name"]: + existing_data[CONTRIBUTION_TITLE]["contributor-name"].append( + CONTRIBUTOR_NAME) + if PR_NUMBER not in existing_data[CONTRIBUTION_TITLE]["pull-request-number"]: + existing_data[CONTRIBUTION_TITLE]["pull-request-number"].append( + PR_NUMBER) + operation_name = 'Updated' + else: + existing_data.update(new_data) + operation_name = 'Appended data to' + else: + existing_data = new_data + operation_name = 'Created' + + # Dumping the data into log file + with open(CONTRIBUTION_LOG_FILE_PATH, 'w') as json_file: + json.dump(existing_data, json_file, indent=2) + + # Output message + print(f'Successfully {operation_name} the log file') + if __name__ == '__main__': - main() \ No newline at end of file + main() diff --git a/.github/scripts/update_index_md.py b/.github/scripts/update_index_md.py index 10b2f20..2ea582c 100644 --- a/.github/scripts/update_index_md.py +++ b/.github/scripts/update_index_md.py @@ -21,6 +21,16 @@ class UpdateFileContent: REPO_NAME = None def __init__(self, FILE_PATH, condition=None): + """ + Initializes required variables and updates target file based on data. + + Updates the file located at `FILE_PATH` with contributor and content + tables. If `condition` is not `None`, it will be used to filter out + core contributions when updating the content table. + + :arg FILE_PATH: Path to the file to be updated. + :arg condition: Optional condition to filter out core contributions. + """ # Displaying starting Message print(f'\n--- Updating {FILE_PATH} ---\n') @@ -40,6 +50,11 @@ def __init__(self, FILE_PATH, condition=None): def get_lines(self): + """ + Reads lines from the file located at `self.FILE_PATH` and returns them. + + :return: List of lines read from the file. + """ # Reading lines from the file with open(self.FILE_PATH, 'r') as file: @@ -48,6 +63,12 @@ def get_lines(self): return lines def write_lines_into_file(self): + """ + Writes the lines in `self.lines` to the file located at `self.FILE_PATH` + and prints a success message. + + :return: None + """ # Updating the target file with open(self.FILE_PATH, 'w') as file: @@ -57,6 +78,17 @@ def write_lines_into_file(self): print(f"Updated '{self.FILE_PATH}' Successfully") def find_table_points(self, search_type): + """ + Finds the starting and ending points of a table in the file located at + `self.FILE_PATH` based on the `search_type`. + + :arg search_type: Type of table to search for. Valid values are + `contributors` and `table-of-content`. + :return: A tuple of `(table_starting_point, table_ending_point)` where + `table_starting_point` is the index of the line where the table + starts and `table_ending_point` is the index of the line where the + table ends. + """ # Setting default return values table_starting_point = None @@ -97,6 +129,14 @@ def find_table_points(self, search_type): return (table_starting_point, table_ending_point) def update_table_of_contributors(self, condition): + """ + Update the table of contributors based on the condition. + + Args: + condition (callable): A function that takes one argument (i.e., the core contribution) + and returns True if the contribution should be included in the table, or + False otherwise. If None, then all core contributions are included. + """ # Calculating stating and ending points of the targeted table table_of_contributors_start, table_of_contributors_end = self.find_table_points('contributors') @@ -133,7 +173,7 @@ def update_table_of_contributors(self, condition): # Processing core contribution core_contribution = details['core'] if condition is None: - core_contribution_output = f'[{core_contribution}]({core_contribution} "goto {core_contribution}")' + core_contribution_output = f'[{core_contribution}]({core_contribution} "goto {core_contribution}")' if core_contribution != 'Repo' else 'Repo' # Processing pull-requests pull_requests = details['pull-request-number'] @@ -148,6 +188,12 @@ def update_table_of_contributors(self, condition): demo_path_output = f'[./{core_contribution}/{specificity}/]({demo_path} "view the result of {title}")' if title == 'root' or title == '{init}': demo_path_output = f'[/{self.REPO_NAME}/]({demo_path} "view the result of {title}")' + elif title == '{workflows}': + demo_path_output = f'[/{self.REPO_NAME}/.github/workflows]({demo_path} "view the result of {title}")' + elif title == '{scripts}': + demo_path_output = f'[/{self.REPO_NAME}/.github/scripts]({demo_path} "view the result of {title}")' + elif title == '{others}': + demo_path_output = f'[/{self.REPO_NAME}/.github]({demo_path} "view the result of {title}")' # Appending all data together if condition is None: @@ -171,6 +217,14 @@ def update_table_of_contributors(self, condition): print('Successfully updated the contributor details !!!...') def update_table_of_content(self, condition): + """ + Update the table of content based on the specified condition. + + Args: + condition (callable): A function that takes one argument (i.e., the core contribution) + and returns True if the contribution should be included in the table, or + False otherwise. If None, then all core contributions are included. + """ # Calculating stating and ending points of the targeted table table_of_content_start, table_of_content_end = self.find_table_points('table-of-content') @@ -234,6 +288,15 @@ def update_table_of_content(self, condition): def main(): + """ + The main function of the script is responsible for updating the root index file and the index files of `Theory` and `Solved-Problems` directories. + + The function takes in environment variables `REPO_NAME` and uses it to fetch the required data from the contributors log file. + + The function then updates the root index file and the index files of `Theory` and `Solved-Problems` directories using the fetched data. + + The function also prints out a success message at the end. + """ # Retrieving Environmental variables REPO_NAME = os.environ.get('REPO_NAME') From b116536d31ee469256a0761e16663f24540785f1 Mon Sep 17 00:00:00 2001 From: iamwatchdogs Date: Sat, 19 Oct 2024 00:18:17 +0530 Subject: [PATCH 2/3] Updated linting workflow --- .github/workflows/linting.yml | 155 +++++++++++++++++----------------- 1 file changed, 78 insertions(+), 77 deletions(-) diff --git a/.github/workflows/linting.yml b/.github/workflows/linting.yml index 1204313..a39226a 100644 --- a/.github/workflows/linting.yml +++ b/.github/workflows/linting.yml @@ -1,16 +1,17 @@ name: linter on: - pull_request: + pull_request: branches: [main] + paths-ignore: ['.github/**', '**.md'] permissions: - contents: read - packages: read - statuses: write + contents: read + packages: read + statuses: write jobs: - checkout: + checkout: name: checkout runs-on: ubuntu-latest outputs: @@ -20,101 +21,101 @@ jobs: needs_python_linting: ${{ steps.check_extension.outputs.python }} needs_other_linting: ${{ steps.check_extension.outputs.other }} steps: - - name: Checking out the repo - uses: actions/checkout@v4.1.1 - - name: Setup Python - uses: actions/setup-python@v4.7.1 - - name: Fetching PR Details - run: | + - name: Checking out the repo + uses: actions/checkout@v4.1.1 + - name: Setup Python + uses: actions/setup-python@v4.7.1 + - name: Fetching PR Details + run: | touch pr.json gh pr view $PR_NUMBER --json files > pr.json - env: - PR_NUMBER: ${{ github.event.pull_request.number }} - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - - name: Checking file extensions - id: check_extension - uses: jannekem/run-python-script-action@v1 - with: - script: | - import os - import json + env: + PR_NUMBER: ${{ github.event.pull_request.number }} + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + - name: Checking file extensions + id: check_extension + uses: jannekem/run-python-script-action@v1 + with: + script: | + import os + import json - # Setting default variables - checks = { lang:'false' for lang in ['c_cpp', 'java', 'javascript', 'python', 'other'] } - c_cpp_ext = ['.c', '.cpp', '.h', '.hpp', '.cc', '.hh', '.cxx', '.hxx'] + # Setting default variables + checks = { lang:'false' for lang in ['c_cpp', 'java', 'javascript', 'python', 'other'] } + c_cpp_ext = ['.c', '.cpp', '.h', '.hpp', '.cc', '.hh', '.cxx', '.hxx'] - # Reading contents of PR - with open('pr.json','r') as json_file: - data = json.load(json_file) + # Reading contents of PR + with open('pr.json','r') as json_file: + data = json.load(json_file) - # Iterating over data - for file in data["files"]: - path = file["path"] - - # Ending loop if all are 'true' - if all([val == 'true' for val in checks.values()]): - break + # Iterating over data + for file in data["files"]: + path = file["path"] + + # Ending loop if all are 'true' + if all([val == 'true' for val in checks.values()]): + break - # Checking for extensions - if os.path.exists(path): - for key,value in checks.items(): - if value == 'true': - continue - if any([path.endswith(ext) for ext in c_cpp_ext]): - checks['c_cpp']='true' - elif path.endswith('.java'): - checks['java']='true' - elif path.endswith('.js'): - checks['javascript']='true' - elif path.endswith('.py'): - checks['python']='true' - elif '.' in path.split('/')[-1] and not path.endswith('.md'): - checks['other']='true' + # Checking for extensions + if os.path.exists(path): + for key,value in checks.items(): + if value == 'true': + continue + if any([path.endswith(ext) for ext in c_cpp_ext]): + checks['c_cpp']='true' + elif path.endswith('.java'): + checks['java']='true' + elif path.endswith('.js'): + checks['javascript']='true' + elif path.endswith('.py'): + checks['python']='true' + elif '.' in path.split('/')[-1] and not (path.startswith('.github') or path.endswith('.md')): + checks['other']='true' - # Setting output variables based on file extensions - for lang,val in checks.items(): - os.system(f'echo "{lang}={val}" >> "$GITHUB_OUTPUT"') + # Setting output variables based on file extensions + for lang,val in checks.items(): + os.system(f'echo "{lang}={val}" >> "$GITHUB_OUTPUT"') - c-cpp-linter: + c-cpp-linter: needs: [checkout] if: ${{ needs.checkout.outputs.needs_c_cpp_linting == 'true' }} uses: Grow-with-Open-Source/C-CPP-Projects/.github/workflows/c-cpp-linter.yml@main - java-linter: + java-linter: needs: [checkout] if: ${{ needs.checkout.outputs.needs_java_linting == 'true' }} uses: Grow-with-Open-Source/Java-Projects/.github/workflows/java-linter.yml@main - javascript-linter: + javascript-linter: needs: [checkout] if: ${{ needs.checkout.outputs.needs_javascript_linting == 'true' }} uses: Grow-with-Open-Source/Javascript-Projects/.github/workflows/javascript-linter.yml@main - python-linter: + python-linter: needs: [checkout] if: ${{ needs.checkout.outputs.needs_python_linting == 'true' }} uses: Grow-with-Open-Source/Python-Projects/.github/workflows/python-linter.yml@main - - other-linter: - needs: [checkout, c-cpp-linter, java-linter, javascript-linter, python-linter] - if: ${{ - always() && - needs.checkout.outputs.needs_other_linting == 'true' || - ((needs.c-cpp-linter.result == 'skipped' || needs.checkout.outputs.needs_c_cpp_linting == 'false') && - (needs.java-linter.result == 'skipped' || needs.checkout.outputs.needs_java_linting == 'false') && - (needs.javascript-linter.result == 'skipped' || needs.checkout.outputs.needs_javascript_linting == 'false') && - (needs.python-linter.result == 'skipped' || needs.checkout.outputs.needs_python_linting == 'false')) - }} + + other-linter: + needs: + [checkout, c-cpp-linter, java-linter, javascript-linter, python-linter] + if: ${{ + always() && + needs.checkout.outputs.needs_other_linting == 'true' || + ((needs.c-cpp-linter.result == 'skipped' || needs.checkout.outputs.needs_c_cpp_linting == 'false') && + (needs.java-linter.result == 'skipped' || needs.checkout.outputs.needs_java_linting == 'false') && + (needs.javascript-linter.result == 'skipped' || needs.checkout.outputs.needs_javascript_linting == 'false') && + (needs.python-linter.result == 'skipped' || needs.checkout.outputs.needs_python_linting == 'false')) + }} runs-on: ubuntu-latest + steps: - - name: Checking out the repo - uses: actions/checkout@v4.1.1 - with: - fetch-depth: 0 - ref: ${{ github.event.pull_request.head.ref }} - - name: Super Linter - uses: super-linter/super-linter@v5.4.3 - env: - VALIDATE_ALL_CODEBASE: false - DEFAULT_BRANCH: main + - name: Checkout code + uses: actions/checkout@v4 + with: + fetch-depth: 0 + + - name: Super-linter + uses: super-linter/super-linter@v7.1.0 # x-release-please-version + env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} From e71163943d46e31e67efca4cc8fbcc1403ebd912 Mon Sep 17 00:00:00 2001 From: iamwatchdogs Date: Sat, 19 Oct 2024 00:20:18 +0530 Subject: [PATCH 3/3] Added automation workflows Added auto-assigner, auto-commenter, auto-labeler and stale automation workflows. --- .github/auto-assign-config.yml | 26 +++++++++++++++ .github/workflows/auto-assigner.yml | 19 +++++++++++ .github/workflows/auto-commenter.yml | 28 ++++++++++++++++ .github/workflows/auto-labeler.yml | 50 ++++++++++++++++++++++++++++ .github/workflows/stale.yml | 25 ++++++++++++++ 5 files changed, 148 insertions(+) create mode 100644 .github/auto-assign-config.yml create mode 100644 .github/workflows/auto-assigner.yml create mode 100644 .github/workflows/auto-commenter.yml create mode 100644 .github/workflows/auto-labeler.yml create mode 100644 .github/workflows/stale.yml diff --git a/.github/auto-assign-config.yml b/.github/auto-assign-config.yml new file mode 100644 index 0000000..b3d46a4 --- /dev/null +++ b/.github/auto-assign-config.yml @@ -0,0 +1,26 @@ +# Set to true to add reviewers to pull requests +addReviewers: true + +# Set to true to add assignees to pull requests +addAssignees: author + +# A list of reviewers to be added to pull requests (GitHub user name) +reviewers: + - iamwatchdogs + +# A number of reviewers added to the pull request +# Set 0 to add all the reviewers (default: 0) +numberOfReviewers: 1 + +# A list of assignees, overrides reviewers if set +# assignees: +# - assigneeA + +# A number of assignees to add to the pull request +# Set to 0 to add all of the assignees. +# Uses numberOfReviewers if unset. +# numberOfAssignees: 2 + +# A list of keywords to be skipped the process that add reviewers if pull requests include it +# skipKeywords: +# - wip \ No newline at end of file diff --git a/.github/workflows/auto-assigner.yml b/.github/workflows/auto-assigner.yml new file mode 100644 index 0000000..cc28ae9 --- /dev/null +++ b/.github/workflows/auto-assigner.yml @@ -0,0 +1,19 @@ +name: Auto Assign + +on: + pull_request_target: + types: [opened, ready_for_review] + issues: + types: [opened] + +permissions: + issues: write + pull-requests: write + +jobs: + auto-assign: + runs-on: ubuntu-latest + steps: + - uses: kentaro-m/auto-assign-action@v1.2.5 + with: + configuration-path: '.github/auto-assign-config.yml' \ No newline at end of file diff --git a/.github/workflows/auto-commenter.yml b/.github/workflows/auto-commenter.yml new file mode 100644 index 0000000..cbfee37 --- /dev/null +++ b/.github/workflows/auto-commenter.yml @@ -0,0 +1,28 @@ +name: Auto-commenter + +on: + pull_request_target: + types: [opened, closed] + +permissions: + id-token: write + issues: write + pull-requests: write + +jobs: + automated-message: + runs-on: ubuntu-latest + steps: + - uses: wow-actions/auto-comment@v1 + with: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + pullRequestOpened: | + 👋 @{{ author }} + Thank you for raising your pull request. + Please make sure you have followed our contributing guidelines. We will review it as soon as possible. + + pullRequestClosed: | + 👋 @{{ author }} This PR is closed. If you think there's been a mistake, please contact the maintainer @iamwatchdogs. + + pullRequestMerged: | + Thank you for contributing @{{ author }}. Make sure to check your contribution on [GitHub Pages](https://grow-with-open-source.github.io/DSA/ "view contributions"). \ No newline at end of file diff --git a/.github/workflows/auto-labeler.yml b/.github/workflows/auto-labeler.yml new file mode 100644 index 0000000..bc68a4f --- /dev/null +++ b/.github/workflows/auto-labeler.yml @@ -0,0 +1,50 @@ +name: hacktoberfest-labeler + +on: + pull_request_target: + types: [opened, reopened, closed] + + +permissions: + contents: read + pull-requests: write + +jobs: + auto-labeler: + runs-on: ubuntu-latest + steps: + - name: Check for hacktoberfest season + id: check-month + run: | + current_month=$(date +'%m') + if [ "$current_month" == "10" ]; then + echo "is_october=true" >> $GITHUB_OUTPUT + else + echo "is_october=false" >> $GITHUB_OUTPUT + fi + + - name: Creating config file + env: + ACTION: ${{ github.event.action }} + run: | + touch ./hacktoberfest-labeler.yml + + if [ "$ACTION" != "closed" ]; then + echo "hacktoberfest:" > hacktoberfest-labeler.yml + else + echo "hacktoberfest-accepted:" > hacktoberfest-labeler.yml + fi + echo "- changed-files:" >> hacktoberfest-labeler.yml + echo " - any-glob-to-any-file: '**'" >> hacktoberfest-labeler.yml + + echo "Created the config file:" + echo "------------------------" + cat ./hacktoberfest-labeler.yml + + - name: Label the PRs + if: steps.check-month.outputs.is_october == 'true' || + github.event.pull_request.merged == 'true' && + contains(github.event.pull_request.labels.*.name, 'hacktoberfest') + uses: actions/labeler@v5.0.0 + with: + configuration-path: ./hacktoberfest-labeler.yml \ No newline at end of file diff --git a/.github/workflows/stale.yml b/.github/workflows/stale.yml new file mode 100644 index 0000000..fc66c4b --- /dev/null +++ b/.github/workflows/stale.yml @@ -0,0 +1,25 @@ +name: close-stale-issue-and-prs + +on: + schedule: + - cron: '30 1 * * *' + +permissions: + contents: write + issues: write + pull-requests: write + +jobs: + stale: + runs-on: ubuntu-latest + steps: + - uses: actions/stale@v8 + with: + stale-issue-message: 'This issue is stale because it has been open 30 days with no activity. Remove stale label or comment or this will be closed in 5 days.' + stale-pr-message: 'This PR is stale because it has been open 45 days with no activity. Remove stale label or comment or this will be closed in 10 days.' + close-issue-message: 'This issue was closed because it has been stalled for 5 days with no activity.' + close-pr-message: 'This PR was closed because it has been stalled for 10 days with no activity.' + days-before-issue-stale: 30 + days-before-pr-stale: 45 + days-before-issue-close: 5 + days-before-pr-close: 10 \ No newline at end of file