1
0
mirror of https://github.com/konpa/devicon.git synced 2025-08-13 10:04:24 +02:00

Added zoomed in snapshot for peek scripts

This commit is contained in:
Thomas Bui
2020-12-28 18:32:49 -08:00
parent 4ec9d85805
commit eb6884db84
15 changed files with 159 additions and 28 deletions

View File

@@ -118,10 +118,13 @@ class SeleniumRunner:
print("JSON file uploaded.")
def upload_svgs(self, svgs: List[str]):
def upload_svgs(self, svgs: List[str], screenshot_folder: str=""):
"""
Upload the SVGs provided in folder_info
:param svgs: a list of svg Paths that we'll upload to icomoon.
:param screenshot_folder: the name of the screenshot_folder. If
the value is provided, it means the user want to take a screenshot
of each icon.
"""
try:
print("Uploading SVGs...")
@@ -133,17 +136,20 @@ class SeleniumRunner:
self.click_hamburger_input()
for svg in svgs:
for i in range(len(svgs)):
import_btn = self.driver.find_element_by_css_selector(
"li.file input[type=file]"
)
import_btn.send_keys(svg)
print(f"Uploaded {svg}")
import_btn.send_keys(svgs[i])
print(f"Uploaded {svgs[i]}")
self.test_for_possible_alert(self.SHORT_WAIT_IN_SEC, "Dismiss")
self.remove_color_from_icon()
self.remove_color_from_icon(screenshot_folder, i)
# take a screenshot of the icons that were just added
self.driver.save_screenshot("new_icons.png");
new_icons_path = str(Path(screenshot_folder, "new_icons.png").resolve())
self.driver.save_screenshot(new_icons_path);
# select all the svgs so that the newly added svg are part of the collection
self.click_hamburger_input()
select_all_button = WebDriverWait(self.driver, self.LONG_WAIT_IN_SEC).until(
ec.element_to_be_clickable((By.XPATH, "//button[text()='Select All']"))
@@ -191,11 +197,15 @@ class SeleniumRunner:
)
dismiss_btn.click()
except SeleniumTimeoutException:
pass
pass # nothing found => everything is good
def remove_color_from_icon(self):
def remove_color_from_icon(self, screenshot_folder: str, index: int):
"""
Remove the color from the most recent uploaded icon.
:param screenshot_folder: the name of the screenshot_folder. If
the value is provided, it means the user want to take a screenshot
of each icon.
:param index, index of the icon being uploaded. Used for naming the screenshot.
:return: None.
"""
try:
@@ -216,8 +226,11 @@ class SeleniumRunner:
remove_color_btn = self.driver \
.find_element_by_css_selector("div.overlayWindow i.icon-droplet-cross")
remove_color_btn.click()
except SeleniumTimeoutException:
pass
# take a screenshot before closing the pop up
if screenshot_folder:
screenshot_path = str(Path(screenshot_folder, f"screenshot_{index}.png").resolve())
self.driver.save_screenshot(screenshot_path)
except Exception as e:
self.close()
raise e

View File

@@ -145,3 +145,18 @@ def rename_extracted_files(extract_path: str):
os.replace(dict_["old"], dict_["new"])
print("Files renamed")
def create_screenshot_folder(dir, screenshot_name: str="screenshots"):
"""
Create a screenshots folder in the dir.
:param dir, the dir where we want to create the folder.
:param screenshot_name, the name of the screenshot folder.
:raise Exception if the dir provided is not a directory.
:return the string name of the screenshot folder.
"""
folder = Path(dir).resolve()
if not folder.is_dir():
raise Exception(f"This is not a dir: {str(folder)}. \ndir must be a valid directory")
folder.mkdir(screenshot_name, exist_ok=True)
return str(folder)

View File

@@ -1,8 +1,7 @@
from pathlib import Path
from argparse import ArgumentParser
from build_assets.PathResolverAction import PathResolverAction
def get_commandline_args():
def get_commandline_args(peek_mode=False):
parser = ArgumentParser(description="Upload svgs to Icomoon to create icon files.")
parser.add_argument("--headless",
@@ -26,8 +25,11 @@ def get_commandline_args():
action=PathResolverAction)
parser.add_argument("download_path",
help="The path where you'd like to download the Icomoon files to",
help="The download destination of the Icomoon files",
action=PathResolverAction)
if peek_mode:
parser.add_argument("--pr_title",
help="The title of the PR that we are peeking at")
return parser.parse_args()
return parser.parse_args()

View File

@@ -0,0 +1,16 @@
from typing import List
def generate_screenshot_markdown(img_urls: List[str]):
"""
Generate the markdown for the screenshots using the
img_urls then print it to the console.
:param img_urls are valid image links.
"""
template = "![Detailed Screenshot]({})"
return [template.format(img_url) for img_url in img_urls]
if __name__ == "__main__":
markdown = generate_screenshot_markdown()
print("\n\n".join(markdown)) # format it before printing

View File

@@ -1,3 +1,6 @@
from os import sep
from typing import List
import re
from selenium.common.exceptions import TimeoutException
# pycharm complains that build_assets is an unresolved ref
@@ -7,27 +10,50 @@ from build_assets import filehandler, util
def main():
args = util.get_commandline_args()
args = util.get_commandline_args(True)
new_icons = filehandler.find_new_icons(args.devicon_json_path, args.icomoon_json_path)
if len(new_icons) == 0:
print("No files need to be uploaded. Ending script...")
return
# get only the icon object that has the name matching the pr title
filtered_icons = find_object_added_in_this_pr(new_icons, args.pr_title)
# print list of new icons
print("List of new icons:", *new_icons, sep = "\n")
print("Icons being uploaded:", *filtered_icons, sep = "\n")
runner = None
try:
runner = SeleniumRunner(args.download_path, args.geckodriver_path, args.headless)
svgs = filehandler.get_svgs_paths(new_icons, args.icons_folder_path)
runner.upload_svgs(svgs)
screenshot_folder = filehandler.create_screenshot_folder("./")
runner.upload_svgs(svgs, screenshot_folder)
print("Task completed.")
except TimeoutException as e:
print("Selenium Time Out Error: ", e.stacktrace, sep='\n')
except Exception as e:
print(e)
print(e.stacktrace)
finally:
runner.close()
def find_object_added_in_this_pr(icons: List[dict], pr_title: str):
"""
Find the icon name from the PR title.
:param icons, a list of the font objects found in the devicon.json.
:pr_title, the title of the PR that this workflow was called on.
:return a list containing the dictionary with the "name"
entry's value matching the name in the pr_title.
If none can be found, return an empty list.
"""
try:
pattern = re.compile(r"(?<=^new icon: )\w+ (?=\(.+\))", re.I)
icon_name = pattern.findall(pr_title)[0].lower().strip() # should only have one match
return [icon for icon in icons if icon["name"] == icon_name]
except IndexError: # there are no match in the findall()
return []
if __name__ == "__main__":
main()