Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
37 commits
Select commit Hold shift + click to select a range
8bbd49c
Bump ini from 1.3.5 to 1.3.8
dependabot[bot] Dec 12, 2020
e0d3525
Merge pull request #387 from devicons/dependabot/npm_and_yarn/ini-1.3.8
Thomas-Boi Dec 12, 2020
4272e67
Moved gh pages into master branch
Thomas-Boi Dec 13, 2020
f2720f5
Moved index.html into docs/
Thomas-Boi Dec 13, 2020
31703d8
Move browerconfig and CNAME into docs/
Thomas-Boi Dec 14, 2020
99495cc
Added missing icons from the devicon.dev site
Thomas-Boi Dec 15, 2020
8ebba86
Merge pull request #394 from devicons/TB_ghPage
amacado Dec 15, 2020
ab0cba5
Add the public-upload-to-imgur action
Thomas-Boi Dec 19, 2020
f51bda7
Added pr comment action
Thomas-Boi Dec 19, 2020
426d950
Finalize new peek action workflow
Thomas-Boi Dec 19, 2020
4ec9d85
Updated the workflow yaml to use the new repo
Thomas-Boi Dec 28, 2020
3544e15
Merge pull request #398 from devicons/TB_actionTest
amacado Dec 28, 2020
f97406d
implementing method for copying the resulting build files (and source…
amacado Dec 28, 2020
843c073
use devicon icons for buttons
amacado Dec 28, 2020
3f38ec5
fetch latest release via github api and use it for showing the header…
amacado Dec 28, 2020
eb6884d
Added zoomed in snapshot for peek scripts
Thomas-Boi Dec 29, 2020
0c3fe80
close scope of icon styles
Dec 29, 2020
44617e7
Fix typo in icon-request issue template to add label automatically, C…
EnisMulic Dec 29, 2020
e5fd851
Fix markdown formating
EnisMulic Dec 29, 2020
cb03303
Merge pull request #406 from EnisMulic/fix/issue_template
amacado Dec 29, 2020
8a5ff05
Various bug fixes and reference update
Thomas-Boi Dec 29, 2020
c388503
Refactored take screenshot and remove color functions
Thomas-Boi Dec 29, 2020
a9eb51a
Various bug fixes and added ability to comment multiple files
Thomas-Boi Dec 30, 2020
c2e297b
fix ceylon and electron
Dec 30, 2020
6feea6f
fix ceylon and electron
Dec 30, 2020
0326a73
fix haskell
Dec 30, 2020
2dea2f4
Merge remote-tracking branch 'origin/develop' into amacado/feature/39…
amacado Dec 30, 2020
63fb4fd
resetting /docs/dist idea of storing icons in docs folder
amacado Dec 30, 2020
6e8588d
revert devicon.min.css
amacado Dec 30, 2020
c798e67
update resource links to raw githubusercontent
amacado Dec 30, 2020
1eee121
Merge pull request #403 from rawdanowiczdev/classes-to-fill
Thomas-Boi Dec 30, 2020
ca2f948
Merge pull request #401 from devicons/amacado/feature/395-auto-update…
Thomas-Boi Dec 30, 2020
a84cd46
Added comments and script now fail if can't find icon name
Thomas-Boi Dec 30, 2020
e51fb1c
Fixed error with logging
Thomas-Boi Dec 30, 2020
799878e
Update handling outputs in build_icons.yml
Thomas-Boi Dec 30, 2020
34a1866
Merge pull request #412 from devicons/TB_peekUpgrade
Thomas-Boi Dec 30, 2020
8a20c80
Added testing files
Thomas-Boi Dec 31, 2020
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion .github/ISSUE_TEMPLATE/icon-request.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
name: Icon request
about: Requesting a new icon or changes to an existing icon
title: 'Icon request: [NAME]'
labels: 'request: icon'
labels: 'request:icon'
assignees: ''

---
Expand Down
65 changes: 38 additions & 27 deletions .github/scripts/build_assets/SeleniumRunner.py
Original file line number Diff line number Diff line change
Expand Up @@ -118,10 +118,13 @@ def upload_icomoon(self, icomoon_json_path: str):

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...")
Expand All @@ -133,17 +136,20 @@ def upload_svgs(self, svgs: List[str]):

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.click_on_just_added_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']"))
Expand Down Expand Up @@ -191,45 +197,50 @@ def test_for_possible_alert(self, wait_period: float, btn_text: str):
)
dismiss_btn.click()
except SeleniumTimeoutException:
pass
pass # nothing found => everything is good

def remove_color_from_icon(self):
def click_on_just_added_icon(self, screenshot_folder: str, index: int):
"""
Remove the color from the most recent uploaded icon.
:return: None.
Click on the most recently added icon so we can remove the colors
and take a snapshot if needed.
"""
try:
recently_uploaded_icon = WebDriverWait(self.driver, self.LONG_WAIT_IN_SEC).until(
ec.element_to_be_clickable((By.XPATH, "//div[@id='set0']//mi-box[1]//div"))
)
recently_uploaded_icon.click()
except Exception as e:
self.close()
raise e

try:
color_tab = WebDriverWait(self.driver, self.SHORT_WAIT_IN_SEC).until(
ec.element_to_be_clickable((By.CSS_SELECTOR, "div.overlayWindow i.icon-droplet"))
)
color_tab.click()
self.remove_color_from_icon()

remove_color_btn = self.driver \
.find_element_by_css_selector("div.overlayWindow i.icon-droplet-cross")
remove_color_btn.click()
except SeleniumTimeoutException:
pass
except Exception as e:
self.close()
raise e
if screenshot_folder:
screenshot_path = str(Path(screenshot_folder, f"screenshot_{index}.png").resolve())
self.driver.save_screenshot(screenshot_path)
print("Took screenshot and saved it at " + screenshot_path)

try:
close_btn = self.driver \
.find_element_by_css_selector("div.overlayWindow i.icon-close")
close_btn.click()
except Exception as e:
self.close()
raise e

def remove_color_from_icon(self):
"""
Remove the color from the most recent uploaded icon.
This is because some SVG have colors in them and we don't want to
force contributors to remove them in case people want the colored SVGs.
The color removal is also necessary so that the Icomoon-generated
icons fit within one font symbol/ligiature.
"""
color_tab = WebDriverWait(self.driver, self.SHORT_WAIT_IN_SEC).until(
ec.element_to_be_clickable((By.CSS_SELECTOR, "div.overlayWindow i.icon-droplet"))
)
color_tab.click()

remove_color_btn = self.driver \
.find_element_by_css_selector("div.overlayWindow i.icon-droplet-cross")
remove_color_btn.click()

def download_icomoon_fonts(self, zip_path: Path):
"""
Download the icomoon.zip from icomoon.io.
Expand Down
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
from pathlib import Path
from argparse import ArgumentParser
from build_assets.PathResolverAction import PathResolverAction

def get_commandline_args():

def get_selenium_runner_args(peek_mode=False):
parser = ArgumentParser(description="Upload svgs to Icomoon to create icon files.")

parser.add_argument("--headless",
Expand All @@ -26,8 +26,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()
21 changes: 21 additions & 0 deletions .github/scripts/build_assets/filehandler.py
Original file line number Diff line number Diff line change
Expand Up @@ -145,3 +145,24 @@ 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")

screenshot_folder = Path(folder, screenshot_name)
try:
os.mkdir(screenshot_folder)
except FileExistsError:
print(f"{screenshot_folder} already exist. Script will do nothing.")
finally:
return str(screenshot_folder)
10 changes: 10 additions & 0 deletions .github/scripts/generate_screenshot_markdown.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
import json
import os


if __name__ == "__main__":
img_urls_list = json.loads(os.environ["IMG_URLS"])
template = "![Detailed Screenshot]({})"
markdown = [template.format(img_url) for img_url in img_urls_list]
print("\n\n".join(markdown))

4 changes: 2 additions & 2 deletions .github/scripts/icomoon_build.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,11 +4,11 @@
# pycharm complains that build_assets is an unresolved ref
# don't worry about it, the script still runs
from build_assets.SeleniumRunner import SeleniumRunner
from build_assets import filehandler, util
from build_assets import filehandler, arg_getters


def main():
args = util.get_commandline_args()
args = arg_getters.get_selenium_runner_args()
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...")
Expand Down
47 changes: 40 additions & 7 deletions .github/scripts/icomoon_peek.py
Original file line number Diff line number Diff line change
@@ -1,33 +1,66 @@
from typing import List
import re
import sys
from selenium.common.exceptions import TimeoutException

# pycharm complains that build_assets is an unresolved ref
# don't worry about it, the script still runs
from build_assets.SeleniumRunner import SeleniumRunner
from build_assets import filehandler, util
from build_assets import filehandler, arg_getters


def main():
args = util.get_commandline_args()
args = arg_getters.get_selenium_runner_args(True)
new_icons = filehandler.find_new_icons(args.devicon_json_path, args.icomoon_json_path)

# 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)

if len(new_icons) == 0:
print("No files need to be uploaded. Ending script...")
return
sys.exit("No files need to be uploaded. Ending script...")

if len(filtered_icons) == 0:
message = "No icons found matching the icon name in the PR's title.\n" \
"Ensure that the PR title matches the convention here: \n" \
"https://github.com/devicons/devicon/blob/master/CONTRIBUTING.md#overview.\n" \
"Ending script...\n"
sys.exit(message)

# print list of new icons
print("List of new icons:", *new_icons, sep = "\n")
print("Icons being uploaded:", *filtered_icons, sep = "\n", end='\n\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)
svgs = filehandler.get_svgs_paths(filtered_icons, args.icons_folder_path)
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()
33 changes: 23 additions & 10 deletions .github/workflows/build_icons.yml
Original file line number Diff line number Diff line change
Expand Up @@ -19,29 +19,42 @@ jobs:
pip install -r ./.github/scripts/requirements.txt
npm install
- name: Executing build and create fonts via icomoon
run: npm run build
run: >
python ./.github/scripts/icomoon_build.py
./.github/scripts/build_assets/geckodriver-v0.27.0-win64/geckodriver.exe ./icomoon.json
./devicon.json ./icons ./ --headless
- name: Upload geckodriver.log for debugging purposes
uses: actions/upload-artifact@v2
if: ${{failure()}}
if: failure()
with:
name: geckodriver-log
path: ./geckodriver.log
- name: Build devicon.min.css
if: success()
run: npm run build-css
- name: Upload screenshot of the newly made icons
uses: actions/upload-artifact@v2
if: ${{success()}}
id: imgur_step
uses: devicons/public-upload-to-imgur@v2
if: success()
with:
name: new_icons
path: ./new_icons.png
- name: Build devicon.min.css
if: ${{ success() }}
run: npm run build-css
client_id: ${{secrets.IMGUR_CLIENT_ID}}
- name: Create Pull Request
if: ${{ success() }}
if: success()
uses: peter-evans/create-pull-request@v3
env:
MESSAGE: |
Automated font-building task ran by GitHub Actions bot. This PR built new font files and devicon.css file.

Here are all the files that were built:

![Files Built]({0})

More information can be found in the GitHub Action logs for this workflow.
with:
branch: 'master-build-result'
base: 'master'
commit-message: 'Built new icons, icomoon.json and devicon.css'
title: 'bot:build new icons, icomoon.json and devicon.css'
body: 'Automated font-building task ran by GitHub Actions bot'
body: ${{ format(env.MESSAGE, fromJSON(steps.imgur_step.outputs.imgur_url)[0] ) }}
delete-branch: true
Loading