From b7ae338d2f42ec0e6ed9fb9ed3c986fbf6c64266 Mon Sep 17 00:00:00 2001 From: Thomas Bui Date: Fri, 8 Jan 2021 12:07:47 -0800 Subject: [PATCH] Create a monthly script that checks all svgs --- .github/scripts/build_assets/arg_getters.py | 17 +++++--- .github/scripts/build_assets/filehandler.py | 43 +++++++++++++++---- .../svg_checker.py} | 40 +---------------- .github/scripts/check_all_icons.py | 18 -------- .github/scripts/check_svgs_monthly.py | 27 ++++++++++++ .github/scripts/check_svgs_on_pr.py | 30 +++++++++++++ .github/workflows/check_svgs_monthly.yml | 35 +++++++++++++++ .../{check_svgs.yml => check_svgs_on_pr.yml} | 21 ++++++--- 8 files changed, 156 insertions(+), 75 deletions(-) rename .github/scripts/{check_svgs.py => build_assets/svg_checker.py} (67%) delete mode 100644 .github/scripts/check_all_icons.py create mode 100644 .github/scripts/check_svgs_monthly.py create mode 100644 .github/scripts/check_svgs_on_pr.py create mode 100644 .github/workflows/check_svgs_monthly.yml rename .github/workflows/{check_svgs.yml => check_svgs_on_pr.yml} (73%) diff --git a/.github/scripts/build_assets/arg_getters.py b/.github/scripts/build_assets/arg_getters.py index 4e1d59c0..afff14f0 100644 --- a/.github/scripts/build_assets/arg_getters.py +++ b/.github/scripts/build_assets/arg_getters.py @@ -40,15 +40,22 @@ def get_selenium_runner_args(peek_mode=False): return parser.parse_args() -def get_check_svgs_args(): +def get_check_svgs_on_pr_args(): """ - Get the commandline arguments for the chec_svgs.py. + Get the commandline arguments for the check_svgs_on_pr.py. """ - parser = ArgumentParser(description="Check the SVGs to ensure their attributes are correct.") - parser.add_argument("icomoon_json_path", - help="The path to the icomoon.json aka the selection.json created by Icomoon", + parser = ArgumentParser(description="Check the SVGs to ensure their attributes are correct. Run whenever a PR is opened") + parser.add_argument("files_changed_json_path", + help="The path to the files.json created by the gh-action-get-changed-files@2.1.4", action=PathResolverAction) + return parser.parse_args() + +def get_check_svgs_monthly_args(): + """ + Get the commandline arguments for the check_svgs_monthly.py. + """ + parser = ArgumentParser(description="Check the SVGs to ensure their attributes are correct. Run monthly.") parser.add_argument("devicon_json_path", help="The path to the devicon.json", action=PathResolverAction) diff --git a/.github/scripts/build_assets/filehandler.py b/.github/scripts/build_assets/filehandler.py index 496a5e0b..788f4a2f 100644 --- a/.github/scripts/build_assets/filehandler.py +++ b/.github/scripts/build_assets/filehandler.py @@ -6,7 +6,7 @@ import os import re -def find_new_icons(devicon_json_path: str, icomoon_json_path: str) -> List[dict]: +def find_new_icons(devicon_json_path: str, icomoon_json_path: str): """ Find the newly added icons by finding the difference between the devicon.json and the icomoon.json. @@ -14,11 +14,8 @@ def find_new_icons(devicon_json_path: str, icomoon_json_path: str) -> List[dict] :param icomoon_json_path: a path to the iconmoon.json. :return: a list of the new icons as JSON objects. """ - with open(devicon_json_path) as json_file: - devicon_json = json.load(json_file) - - with open(icomoon_json_path) as json_file: - icomoon_json = json.load(json_file) + devicon_json = get_json_file_content(devicon_json_path) + icomoon_json = get_json_file_content(icomoon_json_path) new_icons = [] for icon in devicon_json: @@ -28,7 +25,17 @@ def find_new_icons(devicon_json_path: str, icomoon_json_path: str) -> List[dict] return new_icons -def is_not_in_icomoon_json(icon, icomoon_json) -> bool: +def get_json_file_content(json_path: str): + """ + Get the json content of the json_path. + :param: json_path, the path to the json file. + :return: a dict representing the file content. + """ + with open(json_path) as json_file: + return json.load(json_file) + + +def is_not_in_icomoon_json(icon, icomoon_json): """ Checks whether the icon's name is not in the icomoon_json. :param icon: the icon object we are searching for. @@ -45,7 +52,7 @@ def is_not_in_icomoon_json(icon, icomoon_json) -> bool: def get_svgs_paths(new_icons: List[dict], icons_folder_path: str, - icon_versions_only: bool=False, as_str: bool=True) -> List[str] or List[Path]: + icon_versions_only: bool=False, as_str: bool=True): """ Get all the suitable svgs file path listed in the devicon.json. :param new_icons, a list containing the info on the new icons. @@ -199,3 +206,23 @@ def create_screenshot_folder(dir, screenshot_name: str="screenshots/"): print(f"{screenshot_folder} already exist. Script will do nothing.") finally: return str(screenshot_folder) + +def get_added_modified_svgs(files_changed_json_path: str): + """ + Get the svgs added and modified from the files_changed_json_path. + :param: the path to the files.json created by the gh-action-get-changed-files@2.1.4 + :return: a list of the svg file paths that were added/modified in this pr. + """ + files_dict = get_json_file_content(files_changed_json_path) + svgs = [] + for file in files_dict["added"]: + path = Path(file) + if path.suffix.lower() == ".svg": + svgs.append(file) + + for file in files_dict["modified"]: + path = Path(file) + if path.suffix.lower() == ".svg": + svgs.append(file) + + return svgs diff --git a/.github/scripts/check_svgs.py b/.github/scripts/build_assets/svg_checker.py similarity index 67% rename from .github/scripts/check_svgs.py rename to .github/scripts/build_assets/svg_checker.py index 460ee353..75a78f61 100644 --- a/.github/scripts/check_svgs.py +++ b/.github/scripts/build_assets/svg_checker.py @@ -1,42 +1,8 @@ from typing import List -import sys import xml.etree.ElementTree as et -import time from pathlib import Path -# pycharm complains that build_assets is an unresolved ref -# don't worry about it, the script still runs -from build_assets import filehandler, arg_getters -from build_assets import github_env - - -def main(): - """ - Check the quality of the svgs. - If any error is found, set an environmental variable called ERR_MSGS - that will contains the error messages. - """ - args = arg_getters.get_check_svgs_args() - new_icons = filehandler.find_new_icons(args.devicon_json_path, args.icomoon_json_path) - - if len(new_icons) == 0: - sys.exit("No files need to be uploaded. Ending script...") - - # print list of new icons - print("SVGs being checked:", *new_icons, sep = "\n", end='\n\n') - - time.sleep(1) # do this so the logs stay clean - try: - # check the svgs - svgs = filehandler.get_svgs_paths(new_icons, args.icons_folder_path, as_str=False) - check_svgs(svgs) - print("All SVGs found were good.\nTask completed.") - except Exception as e: - github_env.set_env_var("ERR_MSGS", str(e)) - sys.exit(str(e)) - - def check_svgs(svg_file_paths: List[Path]): """ Check the width, height, viewBox and style of each svgs passed in. @@ -84,8 +50,4 @@ def check_svgs(svg_file_paths: List[Path]): err_msgs.append("\n".join(err_msg)) if len(err_msgs) > 0: - raise Exception("Errors found in these files:\n" + "\n\n".join(err_msgs)) - - -if __name__ == "__main__": - main() + raise Exception("Errors found in these files:\n" + "\n\n".join(err_msgs)) \ No newline at end of file diff --git a/.github/scripts/check_all_icons.py b/.github/scripts/check_all_icons.py deleted file mode 100644 index 914e7c49..00000000 --- a/.github/scripts/check_all_icons.py +++ /dev/null @@ -1,18 +0,0 @@ -from pathlib import Path -import json - - -# pycharm complains that build_assets is an unresolved ref -# don't worry about it, the script still runs -from build_assets import filehandler - - -if __name__ == "__main__": - """ - Use as a cmd line script to check all the icons of the devicon.json. - """ - devicon_json_path = str(Path("./devicon.json").resolve()) - icons_folder_path = str(Path("./icons").resolve()) - with open(devicon_json_path) as json_file: - devicon_json = json.load(json_file) - svgs = filehandler.get_svgs_paths(devicon_json, icons_folder_path) \ No newline at end of file diff --git a/.github/scripts/check_svgs_monthly.py b/.github/scripts/check_svgs_monthly.py new file mode 100644 index 00000000..042f282c --- /dev/null +++ b/.github/scripts/check_svgs_monthly.py @@ -0,0 +1,27 @@ +from pathlib import Path +import json +import sys + +# pycharm complains that build_assets is an unresolved ref +# don't worry about it, the script still runs +from build_assets import filehandler, arg_getters +from build_assets import svg_checker + + +def main(): + """ + Check the quality of the svgs of the whole icons folder. + """ + args = arg_getters.get_check_svgs_monthly_args() + + try: + devicon_json = filehandler.get_json_file_content(args.devicon_json_path) + svgs = filehandler.get_svgs_paths(devicon_json, args.icons_folder_path) + svg_checker.check_svgs(svgs) + print("All SVGs found were good. Task completed.") + except Exception as e: + sys.exit(str(e)) + + +if __name__ == "__main__": + main() \ No newline at end of file diff --git a/.github/scripts/check_svgs_on_pr.py b/.github/scripts/check_svgs_on_pr.py new file mode 100644 index 00000000..add1baa8 --- /dev/null +++ b/.github/scripts/check_svgs_on_pr.py @@ -0,0 +1,30 @@ +import sys +import time + + +# pycharm complains that build_assets is an unresolved ref +# don't worry about it, the script still runs +from build_assets import filehandler, arg_getters +from build_assets import github_env, svg_checker + + +def main(): + """ + Check the quality of the svgs. + If any error is found, set an environmental variable called SVG_ERR_MSGS + that will contains the error messages. + """ + args = arg_getters.get_check_svgs_on_pr_args() + try: + # check the svgs + svgs = filehandler.get_added_modified_svgs(args.files_changed_json_path) + print("SVGs to check: ", *svgs, sep='\n') + svg_checker.check_svgs(svgs) + print("All SVGs found were good. Task completed.") + except Exception as e: + github_env.set_env_var("SVG_ERR_MSGS", str(e)) + sys.exit(str(e)) + + +if __name__ == "__main__": + main() diff --git a/.github/workflows/check_svgs_monthly.yml b/.github/workflows/check_svgs_monthly.yml new file mode 100644 index 00000000..49f284af --- /dev/null +++ b/.github/workflows/check_svgs_monthly.yml @@ -0,0 +1,35 @@ +name: Check SVGs Monthly +on: workflow_dispatch + # schedule: + # - cron: '0 0 1 * *' +jobs: + check_develop: + name: Check the SVGs' quality in the `develop` branch + runs-on: ubuntu-18.04 + steps: + - uses: actions/checkout@v2 + with: + ref: develop + - name: Setup Python v3.8 + uses: actions/setup-python@v2 + with: + python-version: 3.8 + - name: Install dependencies + run: python -m pip install --upgrade pip + - name: Run the check_svg script + run: > + python ./.github/scripts/check_svgs_monthly.py ./devicon.json ./icons + check_master: + name: Check the SVGs' quality in the `master` branch + runs-on: ubuntu-18.04 + steps: + - uses: actions/checkout@v2 # check out default branch, which is master + - name: Setup Python v3.8 + uses: actions/setup-python@v2 + with: + python-version: 3.8 + - name: Install dependencies + run: python -m pip install --upgrade pip + - name: Run the check_svg script + run: > + python ./.github/scripts/check_svgs.py ./icomoon.json ./devicon.json ./icons \ No newline at end of file diff --git a/.github/workflows/check_svgs.yml b/.github/workflows/check_svgs_on_pr.yml similarity index 73% rename from .github/workflows/check_svgs.yml rename to .github/workflows/check_svgs_on_pr.yml index b3fe2925..5058eeea 100644 --- a/.github/workflows/check_svgs.yml +++ b/.github/workflows/check_svgs_on_pr.yml @@ -1,20 +1,32 @@ -name: Check SVGs -on: pull_request +name: Check SVGs On PR +on: + pull_request: + paths: + - '**.svg' # runs only when a svg is added in the PR jobs: check: name: Check the SVGs' quality runs-on: ubuntu-18.04 steps: +<<<<<<< HEAD:.github/workflows/check_svgs.yml - uses: actions/checkout@v2 +======= + - uses: actions/checkout@v2 # check out the merge branch of the PR and base +>>>>>>> 132dff5... Create a monthly script that checks all svgs:.github/workflows/check_svgs_on_pr.yml - name: Setup Python v3.8 uses: actions/setup-python@v2 with: python-version: 3.8 - name: Install dependencies run: python -m pip install --upgrade pip + - name: Find files added in this PR + uses: lots0logs/gh-action-get-changed-files@2.1.4 + with: + token: ${{ secrets.GITHUB_TOKEN }} - name: Run the check_svg script + shell: bash run: > - python ./.github/scripts/check_svgs.py ./icomoon.json ./devicon.json ./icons + python ./.github/scripts/check_svgs_on_pr.py $HOME/files.json - name: Comment on the PR about the result - Success if: success() uses: github-actions-up-and-running/pr-comment@v1.0.1 @@ -30,7 +42,6 @@ jobs: with: repo-token: ${{ secrets.GITHUB_TOKEN }} message: ${{ env.MESSAGE }} - - name: Comment on the PR about the result - Failed if: failure() uses: github-actions-up-and-running/pr-comment@v1.0.1 @@ -55,4 +66,4 @@ jobs: PS. One day, I will be smart enough to fix these errors for you :persevere:. Until then, I can only point them out. with: repo-token: ${{ secrets.GITHUB_TOKEN }} - message: ${{ format(env.MESSAGE, env.ERR_MSGS)}} + message: ${{ format(env.MESSAGE, env.SVG_ERR_MSGS)}}