Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Script upgrades and updated CONTRIBUTING.md and README.md #576

Merged
merged 24 commits into from
Apr 29, 2021
Merged
Show file tree
Hide file tree
Changes from 5 commits
Commits
Show all changes
24 commits
Select commit Hold shift + click to select a range
84ad016
Updated README and CONTRIBUTING
Thomas-Boi Apr 24, 2021
df35733
Added check for devicon object when peeking
Thomas-Boi Apr 24, 2021
330fcd4
Added PR template
Thomas-Boi Apr 24, 2021
035cbf1
Added a script to create release messages
Thomas-Boi Apr 26, 2021
2e9c01f
Updated CONTRIBUTING about new script
Thomas-Boi Apr 26, 2021
f8d931d
Update .github/PULL_REQUEST_TEMPLATE/new_icon.md
Thomas-Boi Apr 26, 2021
086fa4a
Update .github/scripts/build_assets/arg_getters.py
Thomas-Boi Apr 26, 2021
056fc89
Update .github/workflows/get_release_message.yml
Thomas-Boi Apr 26, 2021
738e69b
Update gulpfile.js
Thomas-Boi Apr 26, 2021
6c029ea
Update .github/PULL_REQUEST_TEMPLATE/new_feature.md
Thomas-Boi Apr 26, 2021
a07cb17
Update .github/PULL_REQUEST_TEMPLATE/new_feature.md
Thomas-Boi Apr 26, 2021
a563506
Added a way for peek bot to comment error
Thomas-Boi Apr 26, 2021
1015ae1
Merge branch 'thomas/feature/variousUpgrades' of https://github.com/d…
Thomas-Boi Apr 26, 2021
a7f967f
Merge branch 'develop' into thomas/feature/variousUpgrades
Panquesito7 Apr 27, 2021
e622923
Update CONTRIBUTING.md
Thomas-Boi Apr 27, 2021
1905ac9
Update .github/scripts/get_release_message.py
Thomas-Boi Apr 27, 2021
a398068
Update .github/scripts/get_release_message.py
Thomas-Boi Apr 27, 2021
2a3ee3a
Update .github/PULL_REQUEST_TEMPLATE/new_feature.md
Thomas-Boi Apr 27, 2021
fb3fc67
Clean up and updated CONTRIBUTING
Thomas-Boi Apr 28, 2021
b85ba90
Updated CONTRIBUTING
Thomas-Boi Apr 28, 2021
9b6847a
Add set up steps for release message workflow
Thomas-Boi Apr 28, 2021
52fa4c4
Refactored peek workflow
Thomas-Boi Apr 28, 2021
ea662d3
Added requests library
Thomas-Boi Apr 28, 2021
001b136
Reformat devicon object error messages
Thomas-Boi Apr 28, 2021
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
9 changes: 9 additions & 0 deletions .github/PULL_REQUEST_TEMPLATE/new_feature.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
## This PR adds...

*List your features here and their reasons for creation*
Thomas-Boi marked this conversation as resolved.
Show resolved Hide resolved

## Notes

*List anything note-worthy here (potential issues, this needs merge to `master` before working etc...)*
Thomas-Boi marked this conversation as resolved.
Show resolved Hide resolved

*Don't forget to link any issues that this PR will solved.*
9 changes: 9 additions & 0 deletions .github/PULL_REQUEST_TEMPLATE/new_icon.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
**Double check these details before you open a PR**

- [] PR does not match another non-stale PR currently opened
- [] PR name matches the format *new icon: <i>Icon name</i> (<i>versions separated by comma</i>)* as seen [here](https://github.com/devicons/devicon/blob/develop/CONTRIBUTING.md#overview)
- [] Your icons are put in a folder as seen [here](https://github.com/devicons/devicon/blob/develop/CONTRIBUTING.md#organizational-guidelines)
- [] SVG matches the standards laid out [here](https://github.com/devicons/devicon/blob/develop/CONTRIBUTING.md#svgStandards)
- [] A new object is added in the `devicon.json` as seen [here](https://github.com/devicons/devicon/blob/develop/CONTRIBUTING.md#-updating-the-deviconjson-)
Thomas-Boi marked this conversation as resolved.
Show resolved Hide resolved

Refer to the [`CONTRIBUTING.md`](https://github.com/devicons/devicon/blob/develop/CONTRIBUTING.md#contributing-to-devicon) for more details.
Thomas-Boi marked this conversation as resolved.
Show resolved Hide resolved
37 changes: 0 additions & 37 deletions .github/drafts/check_devicon_object.py

This file was deleted.

11 changes: 11 additions & 0 deletions .github/scripts/build_assets/arg_getters.py
Original file line number Diff line number Diff line change
Expand Up @@ -67,4 +67,15 @@ def get_check_svgs_monthly_args():
parser.add_argument("icons_folder_path",
help="The path to the icons folder",
action=PathResolverAction)
return parser.parse_args()


def get_release_message_args():
"""
Get the commandline arguments for the check_svgs_monthly.py.
Thomas-Boi marked this conversation as resolved.
Show resolved Hide resolved
"""
parser = ArgumentParser(description="Create a text containing the icons and features added since last release.")
parser.add_argument("token",
help="The GitHub token to access the GitHub REST API.",
type=str)
return parser.parse_args()
Thomas-Boi marked this conversation as resolved.
Show resolved Hide resolved
75 changes: 75 additions & 0 deletions .github/scripts/get_release_message.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,75 @@
import requests
from build_assets import arg_getters
import re

def main():
print("Please wait a few seconds...")
args = arg_getters.get_release_message_args()
queryPath = "https://api.github.com/repos/devicons/devicon/pulls?accept=application/vnd.github.v3+json&state=closed&per_page=100"
stopPattern = r"^(r|R)elease v"
headers = {
"Authorization": f"token {args.token}"
}

response = requests.get(queryPath, headers=headers)
if response.status_code != 200:
Thomas-Boi marked this conversation as resolved.
Show resolved Hide resolved
print(f"Can't query the GitHub API. Status code is {response.status_code}")
return

data = response.json()
newIcons = []
features = []

for pullData in data:
if re.search(stopPattern, pullData["title"]):
break

authors = findAllAuthors(pullData, headers)
markdown = f"- [{pullData['title']}]({pullData['html_url']}) by {authors}."

if isFeatureIcon(pullData):
newIcons.append(markdown)
else:
features.append(markdown)

thankYou = "A huge thanks to all our maintainers and contributors for making this release possible!"
iconTitle = "**{} New Icons**\n".format(len(newIcons))
featureTitle = "**{} New Features**\n".format(len(features))
finalString = "{0}\n\n {1}{2}\n\n {3}{4}".format(thankYou,
iconTitle, "\n".join(newIcons), featureTitle, "\n".join(features))

print("--------------Here is the build message--------------\n", finalString)


"""
Check whether the pullData is a feature:icon PR.
:param pullData
:return true if the pullData has a label named "feature:icon"
"""
def isFeatureIcon(pullData):
for label in pullData["labels"]:
if label["name"] == "feature:icon":
return True
return False


"""
Find all the authors of a PR based on its commits.
:param pullData - the data of a pull request.
"""
def findAllAuthors(pullData, authHeader):
response = requests.get(pullData["commits_url"], headers=authHeader)
if response.status_code != 200:
Thomas-Boi marked this conversation as resolved.
Show resolved Hide resolved
print(f"Can't query the GitHub API. Status code is {response.status_code}")
print("Response is: ", response.text)
return

commits = response.json()
authors = set() # want unique authors only
for commit in commits:
authors.add("@" + commit["author"]["login"])
return ", ".join(list(authors))


if __name__ == "__main__":
main()
86 changes: 71 additions & 15 deletions .github/scripts/icomoon_peek.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,6 @@
import re
import sys
from selenium.common.exceptions import TimeoutException
import xml.etree.ElementTree as et

# pycharm complains that build_assets is an unresolved ref
# don't worry about it, the script still runs
Expand All @@ -15,27 +14,25 @@ def main():
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:
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 a new icon entry is added in the devicon.json and the PR title matches the convention here: \n" \
# get only the icon object that has the name matching the pr title
filtered_icon = find_object_added_in_this_pr(new_icons, args.pr_title)

if filtered_icon == None:
message = "No proper icon found matching the icon name in the PR's title.\n" \
Thomas-Boi marked this conversation as resolved.
Show resolved Hide resolved
"Ensure that a new icon entry is properly added in the devicon.json and 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')
print("Icon being checked:", filtered_icon, sep = "\n", end='\n\n')

runner = None
try:
runner = SeleniumRunner(args.download_path, args.geckodriver_path, args.headless)
svgs = filehandler.get_svgs_paths(filtered_icons, args.icons_folder_path, True)
svgs = filehandler.get_svgs_paths([filtered_icon], args.icons_folder_path, True)
screenshot_folder = filehandler.create_screenshot_folder("./")
runner.upload_svgs(svgs, screenshot_folder)
print("Task completed.")
Expand All @@ -52,19 +49,78 @@ 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"
:return a dictionary with the "name"
entry's value matching the name in the pr_title.
If none can be found, return an empty list.
If none can be found, return None.
"""
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]
icon = [icon for icon in icons if icon["name"] == icon_name][0]
check_devicon_object(icon, icon_name)
return icon
except IndexError: # there are no match in the findall()
return []
return None
except ValueError as e:
print(e)
return None


def check_devicon_object(icon: dict, icon_name: str):
"""
Check that the devicon object added is up to standard.
:return a string containing the error messages if any.
"""
err_msgs = []
try:
if type(icon["name"]) != icon_name:
err_msgs.append("'name' value is not: " + icon_name)
except KeyError:
err_msgs.append("Missing key: 'name'.")

try:
for tag in icon["tags"]:
if type(tag) != str:
raise TypeError()
except TypeError:
err_msgs.append("'tags' must be an array of strings, not: " + str(icon["tags"]))
except KeyError:
err_msgs.append("Missing key: 'tags'.")

try:
if type(icon["versions"]) != dict:
err_msgs.append("'versions' must be an object.")
except KeyError:
err_msgs.append("Missing key: 'versions'.")

try:
if type(icon["versions"]["svg"]) != list or len(icon["versions"]["svg"]) == 0:
err_msgs.append("Must contain at least 1 svg version in a list.")
except KeyError:
err_msgs.append("Missing key: 'svg' in 'versions'.")

try:
if type(icon["versions"]["font"]) != list or len(icon["versions"]["svg"]) == 0:
err_msgs.append("Must contain at least 1 font version in a list.")
except KeyError:
err_msgs.append("Missing key: 'font' in 'versions'.")

try:
if type(icon["color"]) != str or "#" not in icon["color"]:
err_msgs.append("'color' must be a string in the format '#abcdef'")
except KeyError:
err_msgs.append("Missing key: 'color'.")

try:
if type(icon["aliases"]) != list:
err_msgs.append("'aliases' must be an array.")
except KeyError:
err_msgs.append("Missing key: 'aliases'.")

if len(err_msgs) > 0:
message = f"Error found in 'devicon.json' for '{icon_name}' entry: \n" + "\n".join(err_msgs) + "\n"
raise ValueError(message)
return ""

if __name__ == "__main__":
main()
11 changes: 11 additions & 0 deletions .github/workflows/get_release_message.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
name: Get Release Message
on: workflow_dispatch
jobs:
build:
name: Get Fonts From Icomoon
runs-on: ubuntu-18.04
steps:
- name: Run the get_release_message.py
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
run: python ./.github/scripts/get_release_message.py $GITHUB_TOKEN
Thomas-Boi marked this conversation as resolved.
Show resolved Hide resolved
30 changes: 21 additions & 9 deletions CONTRIBUTING.md
Original file line number Diff line number Diff line change
Expand Up @@ -40,6 +40,7 @@ First of all, thanks for taking the time to contribute! This project can only gr
<li>Include the name of the Icon in the pull request title in this format: <code>new icon: <i>Icon name</i> (<i>versions</i>)</code> </li>
<li><i>Optional</i>: Add images of the new svg(s) to the description of the pull request. This would help speed up the review process </li>
<li><i>Optional</i>: Reference the issues regarding the new icon. </li>
<li>A bot will check your SVGs. If there are any errors, please fix them as instructed.</li>
<li>Wait for a maintainer to review your changes. They will run a script to check your icons.</li>
<li>If there are no issues, they will accept your pull request and merge it using <a href="https://github.com/devicons/devicon/discussions/470">squash merging</a>. If there are any problems, they will let you know and give you a chance to fix it.</li>
</ol>
Expand Down Expand Up @@ -91,7 +92,6 @@ First of all, thanks for taking the time to contribute! This project can only gr
<li>Each <code>.svg</code> file contains one version of an icon in a <code>0 0 128 128</code> viewbox. You can use a service like <a href="https://www.iloveimg.com/resize-image/resize-svg">resize-image</a> for scaling the svg.</li>
<li>The <code>svg</code> element does not need the <code>height</code> and <code>width</code> attributes. However, if you do use it, ensure their values are either <code>"128"</code> or <code>"128px"</code>. Ex: <code>height="128"</code></li>
<li>Each <code>.svg</code> must use the <code>fill</code> attribute instead of using <code>classes</code> for colors. See <a href="https://github.com/devicons/devicon/issues/407">here</a> for more details.</li>
<li>The naming convention for the svg file is the following: <code>(Technology name)-(original|plain|line)(-wordmark?).</code></li>
amacado marked this conversation as resolved.
Show resolved Hide resolved
</ul>

<hr>
Expand Down Expand Up @@ -310,19 +310,19 @@ As an example, let's assume you have created the svgs for Redhat and Amazon Web

<hr>
<h2 id='buildScript'>The Build Script: how it works and its quirks</h2>
<p>To make adding icons easier for repo maintainers, we rely on GitHub Actions, Python, Selenium, and Gulp to automate our tasks.</p>
<p>We rely on GitHub Actions, Python, Selenium, Imgur, and Gulp to automate our tasks. Please feel free to take a look at the workflow files. The codes should be clear enough to follow along.</p>
<p>So far, the tasks in the build script are:</p>
<ul>
<li>Upload svgs to <a href="https://icomoon.io/app/#/select">icomoon.io</a> and get the icons back. For details, see <a href="https://github.com/devicons/devicon/issues/252"> the original disscussion</a>, <a href="https://github.com/devicons/devicon/pull/268">this PR that introduce the feature</a> and <a href="https://github.com/devicons/devicon/issues/300">the final changes to it.</a></li>
<li>Preview what an svg would look like as an icon using the upload svgs script (see <a href="https://github.com/devicons/devicon/pull/412">this</a></li>
<li>Build, combine, and minify CSS files. For details, see <a href="https://github.com/devicons/devicon/pull/290">this</a></li>
<li>Send screenshots to Imgur and upload it to a PR. See <a href="https://github.com/devicons/devicon/pull/398">the PR for the Imgur action</a> and <a href="https://github.com/devicons/devicon/pull/481"> the PR for uploading the pictures to a PR</a>
<li>Upload svgs to <a href="https://icomoon.io/app/#/select">icomoon.io</a> and get the icons back. For details, see <a href="https://github.com/devicons/devicon/issues/252"> the original disscussion</a>, <a href="https://github.com/devicons/devicon/pull/268">this PR that introduce the feature</a> and <a href="https://github.com/devicons/devicon/issues/300">the final changes to it.</a> Used by <b>peek-bot</b> and <b>build-bot</b>.</li>
<li>Preview what an svg would look like as an icon using the upload svgs script (see <a href="https://github.com/devicons/devicon/pull/412">this</a>). Used by <b>peek-bot</b>.</li>
<li>Build, combine, and minify CSS files. For details, see <a href="https://github.com/devicons/devicon/pull/290">this</a>. Used by <b>build-bot</b>.</li>
<li>Send screenshots to Imgur and upload it to a PR. See <a href="https://github.com/devicons/devicon/pull/398">the PR for the Imgur action</a> and <a href="https://github.com/devicons/devicon/pull/481"> the PR for uploading the pictures to a PR. Used by <b>peek-bot</b> and <b>build-bot</b>.</a>
<li>Ensure code quality is up to standard</li>
<li>Comment on the PR so maintainers don't have to manually upload icon result.</li>
<li>Comment on the PR so maintainers don't have to manually upload icon result. Used by <b>peek-bot</b> and <b>build-bot</b>.</li>
<li>Publishing a new release to <a href="https://www.npmjs.com/package/devicon">npm</a>; See <a href="https://github.com/devicons/devicon/issues/288">#288</a></li>
</ul>

<p>There are some quirks and bugs that the build scripts might run into. Listed below are the common ones and their solution</p>
<p>There are some quirks and bugs that the build scripts might run into. Listed below are the common ones and their solutions</p>
<ol>
<li><b>No connection could be made because the target machine actively refused it. (os error 10061)</b>
<ul>
Expand Down Expand Up @@ -379,7 +379,19 @@ We are running a Discord server. You can go here to talk, discuss, and more with
<li>Push the branch <code>draft-release</code></li>
<li>Manually trigger the workflow <code><a href="https://github.com/devicons/devicon/actions/workflows/build_icons.yml">build_icons.yml</a></code> (which has a <code>workflow_dispatch</code> event trigger) and select the branch <code>draft-release</code> as target branch. This will build a font version of all icons using icomoon and automatically creates a pull request to merge the build result back into <code>draft-release</code></li>
<li>Review and approve the auto-create pull request created by the action of the step above</li>
<li>Create a pull request towards <code>development</code>. Mention the release number in the pull request title (like "Build preparation for release v<i>MAJOR</i>.<i>MINOR</i>.<i>PATCH</i>) and add information about all new icons, fixes, features and enhancements in the description of the pull request. Take the commits as a guideline. It's also a good idea to mention and thank all contributions who participated in the release (take description of <code><a href="https://github.com/devicons/devicon/pull/504">#504</a></code> as an example).</li>
<li>Create a pull request towards <code>development</code>. Mention the release number in the pull request title (like "Build preparation for release v<i>MAJOR</i>.<i>MINOR</i>.<i>PATCH</i>).
<ul>
<li>
Add information about all new icons, fixes, features and enhancements in the description of the pull request.
</li>
<li>
Take the PRs/commits as a guideline. It's also a good idea to mention and thank all contributions who participated in the release (take description of <code><a href="https://github.com/devicons/devicon/pull/504">#504</a></code> as an example).
</li>
<li>
Rather than doing it manually, you can instead run <code>python ./.github/scripts/get_release_message.py $GITHUB_TOKEN</code> locally. Pass in your GitHub Personal Access Token for <code>$GITHUB_TOKEN</code> and you should see the messages. Next release, you can trigger this script in the GitHub Actions tab.
Thomas-Boi marked this conversation as resolved.
Show resolved Hide resolved
</li>
</ul>
</li>
<li>Wait for review and approval of the pull request (you can perform a squash-merge)</li>
<li>Once merged create a pull request with BASE <code>master</code> and HEAD <code>development</code>. Copy the description of the earlier pull request.</li>
<li>Since it was already approved in the 'development' stage a maintainer is allowed to merge it (<b>DON'T</b> perform a squash-merge).</li>
Expand Down
5 changes: 4 additions & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -68,8 +68,11 @@
<sub>
All product names, logos, and brands are property of their respective owners. All company, product and service
names used in this website are for identification purposes only. Use of these names, logos, and brands does not
imply endorsement.
imply endorsement. Usage of these logos should be done according to the company/brand/service's brand policy.
</sub>
<p>
Thank you to our contributors and the <a href="https://icomoon.io/#home">IcoMoon app</a>. Devicon would not be possible without you.
</p>


<h2 id="getting-started">Getting started</h2>
Expand Down