jekyll-report-dashboard 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -0
- data/404.html +11 -0
- data/_data/coverage/thresholds.yml +11 -0
- data/_includes/coverage-summary.html +36 -0
- data/_includes/footer.html +35 -0
- data/_includes/head.html +6 -0
- data/_includes/header.html +40 -0
- data/_includes/playwright-branch-list.html +28 -0
- data/_includes/playwright-stat.html +6 -0
- data/_includes/playwright-summary.html +51 -0
- data/_includes/release-note.html +29 -0
- data/_layouts/default.html +20 -0
- data/_layouts/page.html +14 -0
- data/_layouts/playwright-branch.html +17 -0
- data/_layouts/post.html +25 -0
- data/_layouts/release-note.html +7 -0
- data/_plugins/coverage-results-filter.rb +15 -0
- data/_plugins/icon-filter.rb +22 -0
- data/_plugins/key-list-filter.rb +14 -0
- data/_plugins/playwright-branch-index-generator.rb +28 -0
- data/_plugins/playwright-results-filter.rb +36 -0
- data/assets/css/styles.css +292 -0
- data/coverage.markdown +14 -0
- data/index.markdown +48 -0
- data/playwright-branches.markdown +11 -0
- data/playwright-reports.markdown +26 -0
- data/releases.markdown +9 -0
- metadata +81 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: dfa8bb49712438107cedcba73dc2e12b2f973e44184b7741a7b8e7eeb27eb3d3
|
4
|
+
data.tar.gz: fd85df1b4a0865ce4e662a71a8efecf15f2c891ac6c5029f37eb51cf35f9cd24
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 60ed5d2135f8f7c97ae4e26ad7665e4c6006fe4179f3e3becea3ba6cef155fb61f95452d377f831a008ccd07d08227319a32596ade37458682d211e28968d00e
|
7
|
+
data.tar.gz: 2e47a6fe3f85cc2f0442b5ec8c8da0d0f0cc01bff55948fb6a2aa64f5d20eab79095efd8076668d4d78066a1a69ceb5b8c54640b69b897abe1693a818f2640b8
|
data/404.html
ADDED
@@ -0,0 +1,11 @@
|
|
1
|
+
---
|
2
|
+
permalink: /404.html
|
3
|
+
layout: default
|
4
|
+
---
|
5
|
+
|
6
|
+
<div class="my-3 mx-auto max-w-[37.5rem] text-center">
|
7
|
+
<h1 class="my-8 text-6xl leading-none tracking-tighter">404</h1>
|
8
|
+
|
9
|
+
<p><strong>Page not found :(</strong></p>
|
10
|
+
<p>The requested page could not be found.</p>
|
11
|
+
</div>
|
@@ -0,0 +1,36 @@
|
|
1
|
+
{% if include.total %}
|
2
|
+
<!-- if total was included, display the summary -->
|
3
|
+
<div class="mt-4 @container flex flex-row gap-2">
|
4
|
+
<!-- loop through the keys in total -->
|
5
|
+
{% for stat in include.total %}
|
6
|
+
<!-- assign the key to name -->
|
7
|
+
{% assign name = stat[0] %}
|
8
|
+
<!-- the coverage summary includes a field called "branchesTrue", but we want to skip it because it's a duplicate of "branches" -->
|
9
|
+
{% if name != "branchesTrue" %}
|
10
|
+
<!-- assign the value to values -->
|
11
|
+
{% assign values = stat[1] %}
|
12
|
+
<div class="w-full px-1 py-2 @md:px-2 @md:py-4 leading-none border rounded-sm border-outline flex flex-col items-center gap-4 @sm:gap-8 @md:gap-10">
|
13
|
+
<div class="font-medium text-sm @sm:text-base @md:text-lg @lg:text-xl">
|
14
|
+
<!-- Liquid provides a helper method to capitalize text -->
|
15
|
+
{{ name | capitalize }}
|
16
|
+
</div>
|
17
|
+
<!-- use the custom coverage_status filter with the stat name to get the correct styling for the percent -->
|
18
|
+
<div class="font-bold text-xl @sm:text-2xl @md:text-3xl @lg:text-4xl {{ values.pct | coverage_status: name }}">
|
19
|
+
<!-- Liquid provides a helper method for rounding floats to a number -->
|
20
|
+
{{ values.pct | round: 1 }}%
|
21
|
+
</div>
|
22
|
+
<div class="font-light text-xs @sm:text-base @md:text-base @lg:text-lg">
|
23
|
+
{{ values.covered }} / {{ values.total }}
|
24
|
+
</div>
|
25
|
+
</div>
|
26
|
+
{% endif %}
|
27
|
+
{% endfor %}
|
28
|
+
</div>
|
29
|
+
<div class="flex justify-end mt-4 min-h-4">
|
30
|
+
<!-- Liquid provides a helper method that will create the link relative to the baseurl set in _config.yml -->
|
31
|
+
<a href="{{ '/coverage' | relative_url }}" target="_blank">View Full Report</a>
|
32
|
+
</div>
|
33
|
+
{% else %}
|
34
|
+
<!-- if the total was not included, display a message that there is nothing to display -->
|
35
|
+
<div>There is currently no coverage report for {{ include.branch }}.</div>
|
36
|
+
{% endif %}
|
@@ -0,0 +1,35 @@
|
|
1
|
+
<footer class="border-t border-outline">
|
2
|
+
<data href="{{ "/" | relative_url }}"></data>
|
3
|
+
|
4
|
+
<div class="wrapper my-4 sm:grid sm:grid-rows-3">
|
5
|
+
|
6
|
+
<h2 class="text-lg sm:row-start-1">{{ site.title | escape }}</h2>
|
7
|
+
|
8
|
+
<div class="text-sm text-secondary sm:row-start-2 sm:row-span-2 sm:grid sm:grid-cols-4">
|
9
|
+
<div class="sm:col-start-1">
|
10
|
+
<ul class="mb-4 ml-0 list-none sm:m-0">
|
11
|
+
<li>
|
12
|
+
{%- if site.author -%}
|
13
|
+
{{ site.author | escape }}
|
14
|
+
{%- else -%}
|
15
|
+
{{ site.title | escape }}
|
16
|
+
{%- endif -%}
|
17
|
+
</li>
|
18
|
+
{%- if site.email -%}
|
19
|
+
<li>
|
20
|
+
<a href="mailto:{{ site.email }}">{{ site.email }}</a>
|
21
|
+
</li>
|
22
|
+
{%- endif -%}
|
23
|
+
</ul>
|
24
|
+
</div>
|
25
|
+
|
26
|
+
<div class="sm:col-start-2"></div>
|
27
|
+
|
28
|
+
<div class="sm:col-start-3 sm:col-span-2">
|
29
|
+
<p>{{- site.description | escape -}}</p>
|
30
|
+
</div>
|
31
|
+
</div>
|
32
|
+
|
33
|
+
</div>
|
34
|
+
|
35
|
+
</footer>
|
data/_includes/head.html
ADDED
@@ -0,0 +1,40 @@
|
|
1
|
+
<header class="border-t-4 border-t-tertiary border-b border-b-outline" role="banner">
|
2
|
+
|
3
|
+
<div class="wrapper relative flex flex-row justify-between items-center">
|
4
|
+
{%- assign default_paths = site.pages | map: "path" -%}
|
5
|
+
{%- assign page_paths = site.nav_pages | default: default_paths -%}
|
6
|
+
<a
|
7
|
+
class="text-secondary hover:text-primary text-2xl/14 font-light tracking-tighter"
|
8
|
+
rel="author"
|
9
|
+
href="{{ "/" | relative_url }}">{{ site.title | escape }}</a>
|
10
|
+
|
11
|
+
{%- if page_paths -%}
|
12
|
+
<nav class="absolute top-2 right-4 border border-outline rounded-md bg-light-primary md:relative md:top-auto md:right-auto md:border-none">
|
13
|
+
<input
|
14
|
+
type="checkbox"
|
15
|
+
id="nav-trigger"
|
16
|
+
class="hidden peer" />
|
17
|
+
<label for="nav-trigger" class="w-9 h-9 z-2 float-right flex justify-center items-center cursor-pointer md:hidden">
|
18
|
+
<span class="w-5 h-4 leading-0 md:hidden">
|
19
|
+
<svg
|
20
|
+
viewBox="0 0 18 15"
|
21
|
+
width="18px"
|
22
|
+
height="15px"
|
23
|
+
class="fill-secondary">
|
24
|
+
<path d="M18,1.484c0,0.82-0.665,1.484-1.484,1.484H1.484C0.665,2.969,0,2.304,0,1.484l0,0C0,0.665,0.665,0,1.484,0 h15.032C17.335,0,18,0.665,18,1.484L18,1.484z M18,7.516C18,8.335,17.335,9,16.516,9H1.484C0.665,9,0,8.335,0,7.516l0,0 c0-0.82,0.665-1.484,1.484-1.484h15.032C17.335,6.031,18,6.696,18,7.516L18,7.516z M18,13.516C18,14.335,17.335,15,16.516,15H1.484 C0.665,15,0,14.335,0,13.516l0,0c0-0.82,0.665-1.483,1.484-1.483h15.032C17.335,12.031,18,12.695,18,13.516L18,13.516z" />
|
25
|
+
</svg>
|
26
|
+
</span>
|
27
|
+
</label>
|
28
|
+
|
29
|
+
<div class="hidden clear-both peer-checked:flex flex-col items-end px-4 pb-4 gap-2 md:flex md:flex-row md:p-0 md:gap-5 md:justify-end md:items-center">
|
30
|
+
{%- for path in page_paths -%}
|
31
|
+
{%- assign my_page = site.pages | where: "path", path | first -%}
|
32
|
+
{%- if my_page.title -%}
|
33
|
+
<a class="text-primary cursor-pointer leading-[24px]" href="{{ my_page.url | relative_url }}">{{ my_page.title | escape }}</a>
|
34
|
+
{%- endif -%}
|
35
|
+
{%- endfor -%}
|
36
|
+
</div>
|
37
|
+
</nav>
|
38
|
+
{%- endif -%}
|
39
|
+
</div>
|
40
|
+
</header>
|
@@ -0,0 +1,28 @@
|
|
1
|
+
{% if site.data.playwright-reports.branches.size > 0 %}
|
2
|
+
<!-- if there are branches in the data, display the summaries for the branches -->
|
3
|
+
{% for branch in site.data.playwright-reports.branches %}
|
4
|
+
<!-- loop through the branches and assign the key as the branch_name -->
|
5
|
+
{% assign branch_name = branch[0] %}
|
6
|
+
<!-- capture creates a link using the branch_name -->
|
7
|
+
{% capture branch_link %}/playwright-reports/branches/{{branch_name}}{% endcapture %}
|
8
|
+
<div class="mt-8 flex flex-row justify-between items-end">
|
9
|
+
<h3 class="mb-0">{{ branch_name }}</h3>
|
10
|
+
<!-- Liquid provides a helper method that will create the link relative to the baseurl set in _config.yml -->
|
11
|
+
<a href="{{ branch_link | relative_url }}">View Previous Runs</a>
|
12
|
+
</div>
|
13
|
+
|
14
|
+
<!-- use the custom key_list filter to get all of the run_ids in the branch, then reverse the list and get the first one -->
|
15
|
+
{% assign latest_run_id = site.data.playwright-reports.branches[branch_name] | key_list | reverse | first %}
|
16
|
+
{% assign data = site.data.playwright-reports.branches[branch_name][latest_run_id] %}
|
17
|
+
<!-- capture creates a link to the actual report file-->
|
18
|
+
{% capture report_link %}/playwright-reports/branches/{{branch_name}}/{{latest_run_id}}.html{% endcapture %}
|
19
|
+
<!--
|
20
|
+
Include the html snippet in `_includes/playwright-summary.html` with the parameters the `branch_name` variable as `branch`,
|
21
|
+
the `latest_run_id` variable as `run_id`, the `data` variable as `data`, and the `report_link` variable as `url`.
|
22
|
+
-->
|
23
|
+
{% include playwright-summary.html branch=branch_name run_id=latest_run_id data=data url=report_link %}
|
24
|
+
{% endfor %}
|
25
|
+
{% else %}
|
26
|
+
<!-- if there are no branches in the data, display a message that there is nothing to display -->
|
27
|
+
<div>There are currently no branch reports.</div>
|
28
|
+
{% endif %}
|
@@ -0,0 +1,6 @@
|
|
1
|
+
<div class="min-w-min py-2 px-12 @md:px-2 text-xs text-left @md:text-center border border-outline first:rounded-t-md last:rounded-b-md @md:first:rounded-tr-none @md:first:rounded-l-md @md:last:rounded-bl-none @md:last:rounded-r-md">
|
2
|
+
<span>{{ include.label }}</span>
|
3
|
+
<span class="ml-2 min-w-4 px-2 inline @sm:block @md:inline text-center bg-highlight border border-transparent rounded-3xl">
|
4
|
+
{{ include.value }}
|
5
|
+
</span>
|
6
|
+
</div>
|
@@ -0,0 +1,51 @@
|
|
1
|
+
{% if include.data %}
|
2
|
+
<!-- use the custom normalize_playwright filter to get the status, total number of tests, errors, and test statistics from the data -->
|
3
|
+
{% assign results = include.data | normalize_playwright %}
|
4
|
+
<!-- if the data was included, display the summary -->
|
5
|
+
<div class="@container flex flex-col mb-8">
|
6
|
+
<div class="mt-4 py-1 @sm:py-2 px-2 @sm:px-4 font-light text-[0.6rem] @sm:text-xs text-tertiary border border-outline border-b-0 rounded-t-md bg-highlight flex flex-row justify-between">
|
7
|
+
<!-- if the run_id was included, display it in the header of the summary -->
|
8
|
+
{% if include.run_id %}
|
9
|
+
<!-- capture also creates strings with variables, create the url back to the run -->
|
10
|
+
{% capture run_link %}{{ site.github_url }}/actions/runs/{{ include.run_id }}{% endcapture %}
|
11
|
+
<!-- no relative_url necessary here because the link it outside of the app -->
|
12
|
+
<span>Run Id: <a href="{{ run_link }}" target="_blank">{{ include.run_id }}</a></span>
|
13
|
+
{% else %}
|
14
|
+
<span></span>
|
15
|
+
{% endif %}
|
16
|
+
<!-- Liquid provides a helper method for formatting dates -->
|
17
|
+
<span>Run At: {{ results.startTime | date: "%Y-%m-%d %H:%M %Z" }}</span>
|
18
|
+
</div>
|
19
|
+
<div class="pt-2 @sm:pt-4 pb-1 @sm:pb-2 text-xs @sm:text-sm leading-normal border border-outline rounded-b-md flex items-center justify-around">
|
20
|
+
<!-- style the icon according to the report status and use the custom status_icon filter to return the correct svg -->
|
21
|
+
<span class="w-10 @sm:w-12 h-10 @sm:h-12 {{results.status}}">{{ results.status | status_icon }}</span>
|
22
|
+
<div class="py-1 @md:py-2 w-2/3 @sm:w-4/5">
|
23
|
+
{% if results.status == "warn" %}
|
24
|
+
<!-- if there are errors, there won't be any test statistics, so only display the errors -->
|
25
|
+
<div class="py-1 @md:py-2 px-0 font-mono flex flex-col gap-4">
|
26
|
+
{% for error in results.errors %}
|
27
|
+
<!-- loop through the errors and display the messages -->
|
28
|
+
<div class="py-1 @md:py-2 px-2 @md:px-4 border rounded-md border-outline flex flex-wrap">{{ error.message }}</div>
|
29
|
+
{% endfor %}
|
30
|
+
</div>
|
31
|
+
{% else %}
|
32
|
+
<!-- if there are no errors, display the test statistics -->
|
33
|
+
<div class="min-w-full font-medium leading-8 grid grid-cols-1 grid-rows-5 @lg:grid-cols-5 @lg:grid-rows-1 justify-center">
|
34
|
+
{% include playwright-stat.html label="All" value=results.total %}
|
35
|
+
{% include playwright-stat.html label="Passed" value=results.expected %}
|
36
|
+
{% include playwright-stat.html label="Failed" value=results.unexpected %}
|
37
|
+
{% include playwright-stat.html label="Flaky" value=results.flaky %}
|
38
|
+
{% include playwright-stat.html label="Skipped" value=results.skipped %}
|
39
|
+
</div>
|
40
|
+
{% endif %}
|
41
|
+
|
42
|
+
<!-- Liquid provides a helper method that will create the link relative to the baseurl set in _config.yml -->
|
43
|
+
<span class="pt-1 @sm:pt-2 float-right min-h-4 text-xs @sm:text-sm"><a href="{{ include.url | relative_url }}" target="_blank">View Full Report</a></span>
|
44
|
+
</div>
|
45
|
+
</div>
|
46
|
+
</div>
|
47
|
+
{% else %}
|
48
|
+
<!-- if the data was not included, display a message that there is nothing to display -->
|
49
|
+
|
50
|
+
<div>There is currently no report for {{ include.branch }}</div>
|
51
|
+
{% endif %}
|
@@ -0,0 +1,29 @@
|
|
1
|
+
<article class="@container border border-outline rounded-sm p-4 my-8">
|
2
|
+
<header class="block mb-8">
|
3
|
+
<a class="text-primary font-semibold leading-14" href="{{ include.post.html_url }}">
|
4
|
+
<h1 class="text-3xl md:text-4xl font-semibold leading-14">{{ include.post.tag | escape }}</h1>
|
5
|
+
</a>
|
6
|
+
<div class="text-sm text-tertiary border-b border-outline pb-6 leading-normal break-words flex flex-row flex-wrap items-end">
|
7
|
+
<div class="mr-6 mb-2">
|
8
|
+
{% if include.post.author_avatar %}
|
9
|
+
<img class="h-5 w-5 rounded-sm inline-block box-border leading-none overflow-hidden align-middle" src="{{ include.post.author_avatar }}" alt="@{{ include.post.author }}" />
|
10
|
+
{% endif %}
|
11
|
+
{% if include.post.author_link %}
|
12
|
+
<a class="decoration-inherit text-current font-bold" href="{{ include.post.author_link }}">{{ include.post.author }}</a>
|
13
|
+
{% else %}
|
14
|
+
<span class="font-bold">{{ include.post.author }}</span>
|
15
|
+
{% endif %}
|
16
|
+
released this
|
17
|
+
{%- assign date_format = site.minima.date_format | default: "%b %-d, %Y" -%}
|
18
|
+
{% assign pdate = include.post.published_at | date_to_xmlschema %}
|
19
|
+
<time datetime="{{ pdate }}">
|
20
|
+
{{ pdate | date: date_format }}
|
21
|
+
</time>
|
22
|
+
</div>
|
23
|
+
</div>
|
24
|
+
</header>
|
25
|
+
|
26
|
+
<div class="gh-markdown-content mb-8">
|
27
|
+
{{ include.content }}
|
28
|
+
</div>
|
29
|
+
</article>
|
@@ -0,0 +1,20 @@
|
|
1
|
+
<!DOCTYPE html>
|
2
|
+
<html lang="{{ page.lang | default: site.lang | default: "en" }}">
|
3
|
+
|
4
|
+
{%- include head.html -%}
|
5
|
+
|
6
|
+
<body>
|
7
|
+
|
8
|
+
{%- include header.html -%}
|
9
|
+
|
10
|
+
<main class="py-8" aria-label="Content">
|
11
|
+
<div class="wrapper">
|
12
|
+
{{ content }}
|
13
|
+
</div>
|
14
|
+
</main>
|
15
|
+
|
16
|
+
{%- include footer.html -%}
|
17
|
+
|
18
|
+
</body>
|
19
|
+
|
20
|
+
</html>
|
data/_layouts/page.html
ADDED
@@ -0,0 +1,17 @@
|
|
1
|
+
---
|
2
|
+
layout: page
|
3
|
+
---
|
4
|
+
|
5
|
+
<!-- use the custom key_list filter to get the run ids for the branch and sort them by newest to oldest -->
|
6
|
+
{% assign run_ids = site.data.playwright-reports.branches[page.branch] | key_list | reverse %}
|
7
|
+
{% for run_id in run_ids %}
|
8
|
+
<!-- loop through the run ids -->
|
9
|
+
{% assign data = site.data.playwright-reports.branches[page.branch][run_id] %}
|
10
|
+
<!-- capture creates a link using the page.branch variable and the run id -->
|
11
|
+
{% capture report_link %}/playwright-reports/branches/{{page.branch}}/{{run_id}}.html{% endcapture %}
|
12
|
+
<!--
|
13
|
+
Include the html snippet in `_includes/playwright-summary.html` with the parameters the `page.branch` variable as `branch`,
|
14
|
+
the `run_id` variable as `run_id`, the `data` variable as `data`, and the `report_link` variable as `url`.
|
15
|
+
-->
|
16
|
+
{% include playwright-summary.html branch=page.branch run_id=run_id data=data url=report_link %}
|
17
|
+
{% endfor %}
|
data/_layouts/post.html
ADDED
@@ -0,0 +1,25 @@
|
|
1
|
+
---
|
2
|
+
layout: default
|
3
|
+
---
|
4
|
+
<article>
|
5
|
+
|
6
|
+
<header class="mb-8">
|
7
|
+
<h1 class="tracking-[-1px] leading-none">{{ page.title | escape }}</h1>
|
8
|
+
|
9
|
+
<p class="text-sm text-tertiary">
|
10
|
+
<time datetime="{{ page.date | date_to_xmlschema }}">
|
11
|
+
{%- assign date_format = site.minima.date_format | default: "%b %-d, %Y" -%}
|
12
|
+
{{ page.date | date: date_format }}
|
13
|
+
</time>
|
14
|
+
{%- if page.author -%}
|
15
|
+
• <span>{{ page.author }}</span>
|
16
|
+
{%- endif -%}
|
17
|
+
</p>
|
18
|
+
</header>
|
19
|
+
|
20
|
+
<div class="mb-8">
|
21
|
+
{{ content }}
|
22
|
+
</div>
|
23
|
+
|
24
|
+
<a class="u-url" href="{{ page.url | relative_url }}" hidden></a>
|
25
|
+
</article>
|
@@ -0,0 +1,15 @@
|
|
1
|
+
module Jekyll
|
2
|
+
module CoverageResultFilter
|
3
|
+
def coverage_status(input, name)
|
4
|
+
if input >= @context.registers[:site].data["coverage"]["thresholds"]["pass"][name]
|
5
|
+
"pass"
|
6
|
+
elsif input >= @context.registers[:site].data["coverage"]["thresholds"]["fail"][name]
|
7
|
+
"warn"
|
8
|
+
else
|
9
|
+
"fail"
|
10
|
+
end
|
11
|
+
end
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
15
|
+
Liquid::Template.register_filter(Jekyll::CoverageResultFilter)
|
@@ -0,0 +1,22 @@
|
|
1
|
+
module Jekyll
|
2
|
+
module IconFilter
|
3
|
+
def status_icon(input)
|
4
|
+
case input
|
5
|
+
when "pass"
|
6
|
+
"<svg aria-hidden='true' fill='currentColor' height='100%' width='100%' viewBox='0 0 16 16' version='1.1'>
|
7
|
+
<path fillRule='evenodd' d='M13.78 4.22a.75.75 0 010 1.06l-7.25 7.25a.75.75 0 01-1.06 0L2.22 9.28a.75.75 0 011.06-1.06L6 10.94l6.72-6.72a.75.75 0 011.06 0z'></path>
|
8
|
+
</svg>"
|
9
|
+
when "fail"
|
10
|
+
"<svg aria-hidden='true' fill='currentColor' height='100%' width='100%' viewBox='0 0 16 16' version='1.1'>
|
11
|
+
<path fillRule='evenodd' d='M3.72 3.72a.75.75 0 011.06 0L8 6.94l3.22-3.22a.75.75 0 111.06 1.06L9.06 8l3.22 3.22a.75.75 0 11-1.06 1.06L8 9.06l-3.22 3.22a.75.75 0 01-1.06-1.06L6.94 8 3.72 4.78a.75.75 0 010-1.06z'></path>
|
12
|
+
</svg>"
|
13
|
+
when "warn"
|
14
|
+
"<svg aria-hidden='true' fill='currentColor' height='100%' width='100%' viewBox='0 0 16 16' version='1.1'>
|
15
|
+
<path fillRule='evenodd' d='M8.22 1.754a.25.25 0 00-.44 0L1.698 13.132a.25.25 0 00.22.368h12.164a.25.25 0 00.22-.368L8.22 1.754zm-1.763-.707c.659-1.234 2.427-1.234 3.086 0l6.082 11.378A1.75 1.75 0 0114.082 15H1.918a1.75 1.75 0 01-1.543-2.575L6.457 1.047zM9 11a1 1 0 11-2 0 1 1 0 012 0zm-.25-5.25a.75.75 0 00-1.5 0v2.5a.75.75 0 001.5 0v-2.5z'></path>
|
16
|
+
</svg>"
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
Liquid::Template.register_filter(Jekyll::IconFilter)
|
@@ -0,0 +1,28 @@
|
|
1
|
+
module Jekyll
|
2
|
+
class BranchIndex < Page
|
3
|
+
def initialize(site, base, dir, branch)
|
4
|
+
@site = site
|
5
|
+
@base = base
|
6
|
+
@dir = dir
|
7
|
+
@name = 'index.html'
|
8
|
+
|
9
|
+
self.process(@name)
|
10
|
+
self.read_yaml(File.join(base, '_layouts'), 'playwright-branch.html')
|
11
|
+
self.data['branch'] = branch
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
15
|
+
class BranchIndexGenerator < Generator
|
16
|
+
safe true
|
17
|
+
|
18
|
+
def generate(site)
|
19
|
+
if site.layouts.key? 'playwright-branch'
|
20
|
+
dir = "/playwright-reports/branches"
|
21
|
+
site.data["playwright-reports"]["branches"].each_key do |branch|
|
22
|
+
Jekyll.logger.info "Branch Index: Generating index for #{branch}"
|
23
|
+
site.pages << BranchIndex.new(site, site.source, File.join(dir, branch), branch)
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
@@ -0,0 +1,36 @@
|
|
1
|
+
module Jekyll
|
2
|
+
module PlaywrightResultFilter
|
3
|
+
def normalize_playwright(input)
|
4
|
+
status = playwright_status(input)
|
5
|
+
total = playwright_total(input)
|
6
|
+
stats = input["stats"]
|
7
|
+
stats["errors"] = input["errors"]
|
8
|
+
stats["total"] = total
|
9
|
+
stats["status"] = status
|
10
|
+
stats
|
11
|
+
end
|
12
|
+
|
13
|
+
def playwright_total(input)
|
14
|
+
if input["errors"].size > 0
|
15
|
+
0
|
16
|
+
else
|
17
|
+
input["stats"]["expected"] + input["stats"]["unexpected"] + input["stats"]["skipped"] + input["stats"]["flaky"]
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
def playwright_status(input)
|
22
|
+
if input["stats"]["unexpected"] > 0
|
23
|
+
# if the unexpected results is greater than one, return fail
|
24
|
+
"fail"
|
25
|
+
elsif input["errors"].size == 0
|
26
|
+
# if there are no unexpected results and no errors, return pass
|
27
|
+
"pass"
|
28
|
+
else
|
29
|
+
# otherwise if there are errors, return error
|
30
|
+
"warn"
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
Liquid::Template.register_filter(Jekyll::PlaywrightResultFilter)
|
@@ -0,0 +1,292 @@
|
|
1
|
+
---
|
2
|
+
# This yaml frontmatter is required for jekyll to process the file
|
3
|
+
---
|
4
|
+
|
5
|
+
@import "tailwindcss";
|
6
|
+
|
7
|
+
@layer utilities {
|
8
|
+
}
|
9
|
+
|
10
|
+
@theme {
|
11
|
+
--color-primary: var(--color-gray-900);
|
12
|
+
--color-secondary: var(--color-gray-700);
|
13
|
+
--color-tertiary: var(--color-gray-500);
|
14
|
+
|
15
|
+
--color-light-primary: #fdfdfd;
|
16
|
+
--color-highlight: var(--color-gray-100);
|
17
|
+
--color-outline: var(--color-gray-300);
|
18
|
+
|
19
|
+
--breakpoint-sm: 40rem; /* 640px */
|
20
|
+
--breakpoint-md: 48rem; /* 768px */
|
21
|
+
--breakpoint-lg: 64rem; /* 1024px */
|
22
|
+
--breakpoint-xl: 80rem; /* 1280px */
|
23
|
+
--breakpoint-2xl: 96rem; /* 1536px */
|
24
|
+
|
25
|
+
--font-body:
|
26
|
+
ui-sans-serif, system-ui, sans-serif, Helvetica, Roboto,
|
27
|
+
"Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji";
|
28
|
+
}
|
29
|
+
|
30
|
+
@layer components {
|
31
|
+
body {
|
32
|
+
color: var(--color-primary);
|
33
|
+
background-color: var(--color-light-primary);
|
34
|
+
min-height: 100vh;
|
35
|
+
display: flex;
|
36
|
+
flex-direction: column;
|
37
|
+
}
|
38
|
+
|
39
|
+
h1,
|
40
|
+
h2,
|
41
|
+
h3,
|
42
|
+
h4,
|
43
|
+
h5,
|
44
|
+
h6,
|
45
|
+
p,
|
46
|
+
blockquote,
|
47
|
+
pre,
|
48
|
+
ul,
|
49
|
+
ol,
|
50
|
+
dl,
|
51
|
+
figure {
|
52
|
+
margin-bottom: 15px;
|
53
|
+
}
|
54
|
+
|
55
|
+
main {
|
56
|
+
display: block;
|
57
|
+
}
|
58
|
+
|
59
|
+
img {
|
60
|
+
max-width: 100%;
|
61
|
+
vertical-align: middle;
|
62
|
+
}
|
63
|
+
|
64
|
+
a {
|
65
|
+
color: var(--color-sky-700);
|
66
|
+
text-decoration: none;
|
67
|
+
}
|
68
|
+
|
69
|
+
a:visited {
|
70
|
+
color: var(--color-sky-900);
|
71
|
+
text-decoration: none;
|
72
|
+
}
|
73
|
+
|
74
|
+
a:hover {
|
75
|
+
text-decoration: underline;
|
76
|
+
}
|
77
|
+
|
78
|
+
h1 {
|
79
|
+
font-size: 36px;
|
80
|
+
}
|
81
|
+
|
82
|
+
h2 {
|
83
|
+
font-size: 28px;
|
84
|
+
}
|
85
|
+
|
86
|
+
h3 {
|
87
|
+
font-size: 22px;
|
88
|
+
}
|
89
|
+
|
90
|
+
h4 {
|
91
|
+
font-size: 18px;
|
92
|
+
}
|
93
|
+
|
94
|
+
@media (width >= 40rem) {
|
95
|
+
h1 {
|
96
|
+
font-size: 42px;
|
97
|
+
}
|
98
|
+
|
99
|
+
h2 {
|
100
|
+
font-size: 32px;
|
101
|
+
}
|
102
|
+
|
103
|
+
h3 {
|
104
|
+
font-size: 26px;
|
105
|
+
}
|
106
|
+
|
107
|
+
h4 {
|
108
|
+
font-size: 20px;
|
109
|
+
}
|
110
|
+
}
|
111
|
+
|
112
|
+
table {
|
113
|
+
margin-bottom: 30px;
|
114
|
+
width: 100%;
|
115
|
+
text-align: left;
|
116
|
+
color: var(--color-primary);
|
117
|
+
border-collapse: collapse;
|
118
|
+
border: 1px solid var(--color-outline);
|
119
|
+
}
|
120
|
+
table tr:nth-child(even) {
|
121
|
+
background-color: var(--color-highlight);
|
122
|
+
}
|
123
|
+
table th,
|
124
|
+
table td {
|
125
|
+
padding: 9.999999999px 15px;
|
126
|
+
}
|
127
|
+
table th {
|
128
|
+
background-color: var(--color-highlight);
|
129
|
+
border: 1px solid var(--color-outline);
|
130
|
+
border-bottom-color: var(--color-outline);
|
131
|
+
}
|
132
|
+
table td {
|
133
|
+
border: 1px solid var(--color-outline);
|
134
|
+
}
|
135
|
+
|
136
|
+
ul {
|
137
|
+
list-style-type: disc;
|
138
|
+
margin-left: 30px;
|
139
|
+
}
|
140
|
+
|
141
|
+
li {
|
142
|
+
display: list-item;
|
143
|
+
}
|
144
|
+
|
145
|
+
blockquote {
|
146
|
+
font-size: 1em;
|
147
|
+
font-weight: normal;
|
148
|
+
font-style: normal;
|
149
|
+
border-left-color: var(--color-outline);
|
150
|
+
border-left-style: solid;
|
151
|
+
border-left-width: 4px;
|
152
|
+
box-sizing: border-box;
|
153
|
+
color: var(--color-secondary);
|
154
|
+
display: block;
|
155
|
+
margin-bottom: 1em;
|
156
|
+
overflow-wrap: break-word;
|
157
|
+
padding: 0 1em;
|
158
|
+
}
|
159
|
+
|
160
|
+
p > code {
|
161
|
+
padding: 0.2em 0.4em;
|
162
|
+
margin: 0;
|
163
|
+
font-size: 0.85em;
|
164
|
+
white-space: break-spaces;
|
165
|
+
background-color: var(--color-highlight);
|
166
|
+
border: 1px solid var(--color-highlight);
|
167
|
+
border-radius: 6px;
|
168
|
+
}
|
169
|
+
|
170
|
+
pre {
|
171
|
+
padding: 1em;
|
172
|
+
overflow: auto;
|
173
|
+
font-size: 0.85em;
|
174
|
+
line-height: 1.45em;
|
175
|
+
background-color: var(--color-highlight);
|
176
|
+
border: 1px solid var(--color-highlight);
|
177
|
+
border-radius: 6px;
|
178
|
+
word-wrap: normal;
|
179
|
+
margin-top: 0;
|
180
|
+
margin-bottom: 1rem;
|
181
|
+
box-sizing: border-box;
|
182
|
+
|
183
|
+
> code {
|
184
|
+
display: inline;
|
185
|
+
padding: 0;
|
186
|
+
margin: 0;
|
187
|
+
overflow: visible;
|
188
|
+
line-height: inherit;
|
189
|
+
word-wrap: normal;
|
190
|
+
word-break: normal;
|
191
|
+
white-space: pre;
|
192
|
+
border: 0;
|
193
|
+
background-color: transparent;
|
194
|
+
}
|
195
|
+
}
|
196
|
+
|
197
|
+
.wrapper {
|
198
|
+
max-width: 30rem;
|
199
|
+
margin: 0 auto;
|
200
|
+
padding: 0 1rem;
|
201
|
+
|
202
|
+
@media (width >= 26rem) {
|
203
|
+
max-width: 24rem; /* 384px, container @sm */
|
204
|
+
}
|
205
|
+
@media (width >= 40rem) {
|
206
|
+
max-width: 36rem; /* 576px, container @xl */
|
207
|
+
}
|
208
|
+
@media (width >= 48rem) {
|
209
|
+
max-width: 42rem; /* 672px, container @2xl */
|
210
|
+
}
|
211
|
+
@media (width >= 64rem) {
|
212
|
+
max-width: 56rem; /* 896px, container @4xl */
|
213
|
+
padding: 0 2rem;
|
214
|
+
}
|
215
|
+
}
|
216
|
+
|
217
|
+
.pass {
|
218
|
+
color: var(--color-green-700);
|
219
|
+
}
|
220
|
+
|
221
|
+
.fail {
|
222
|
+
color: var(--color-red-600);
|
223
|
+
}
|
224
|
+
|
225
|
+
.warn {
|
226
|
+
color: var(--color-amber-400);
|
227
|
+
}
|
228
|
+
|
229
|
+
.gh-markdown-content {
|
230
|
+
width: 100%;
|
231
|
+
overflow-x: auto;
|
232
|
+
|
233
|
+
p,
|
234
|
+
li {
|
235
|
+
word-wrap: break-word;
|
236
|
+
word-break: break-word;
|
237
|
+
overflow-wrap: break-word;
|
238
|
+
}
|
239
|
+
|
240
|
+
table {
|
241
|
+
overflow: auto;
|
242
|
+
}
|
243
|
+
|
244
|
+
h1,
|
245
|
+
h2,
|
246
|
+
h3,
|
247
|
+
h4,
|
248
|
+
h5,
|
249
|
+
h6 {
|
250
|
+
margin-top: 1.5rem;
|
251
|
+
margin-bottom: 1rem;
|
252
|
+
font-weight: 600;
|
253
|
+
}
|
254
|
+
|
255
|
+
h1 {
|
256
|
+
font-size: 2rem;
|
257
|
+
line-height: 2.5rem;
|
258
|
+
padding-bottom: 0.6rem;
|
259
|
+
border-bottom: 1px solid var(--color-outline);
|
260
|
+
}
|
261
|
+
|
262
|
+
h2 {
|
263
|
+
font-size: 1.5rem;
|
264
|
+
line-height: 1.25rem;
|
265
|
+
padding-bottom: 0.45rem;
|
266
|
+
border-bottom: 1px solid var(--color-outline);
|
267
|
+
}
|
268
|
+
|
269
|
+
h3 {
|
270
|
+
font-size: 1.25rem;
|
271
|
+
line-height: 1.25rem;
|
272
|
+
}
|
273
|
+
|
274
|
+
h4 {
|
275
|
+
font-size: 1rem;
|
276
|
+
line-height: 1.25rem;
|
277
|
+
}
|
278
|
+
|
279
|
+
h5 {
|
280
|
+
font-size: 0.875rem;
|
281
|
+
line-height: 1.25rem;
|
282
|
+
}
|
283
|
+
|
284
|
+
h6 {
|
285
|
+
font-size: 0.85rem;
|
286
|
+
line-height: 1.25rem;
|
287
|
+
color: var(--color-secondary);
|
288
|
+
}
|
289
|
+
}
|
290
|
+
}
|
291
|
+
|
292
|
+
@plugin "@tailwindcss/typography";
|
data/coverage.markdown
ADDED
@@ -0,0 +1,14 @@
|
|
1
|
+
---
|
2
|
+
layout: page
|
3
|
+
# the header for the page
|
4
|
+
title: "Code Coverage Report"
|
5
|
+
# the link to page https://jekyllrb.com/docs/permalinks/
|
6
|
+
permalink: coverage-report/
|
7
|
+
---
|
8
|
+
|
9
|
+
<div>
|
10
|
+
<!-- Get the data from the `total` field in `_data/coverage/coverage-summary.json` and assign it to a variable called `total`. -->
|
11
|
+
{% assign total = site.data.coverage.coverage-summary.total %}
|
12
|
+
<!-- Include the html snippet in `_includes/coverage-summary.html` with the parameters "main" as `branch` and the totals from the data as `total`. -->
|
13
|
+
{% include coverage-summary.html branch="main" total=total %}
|
14
|
+
</div>
|
data/index.markdown
ADDED
@@ -0,0 +1,48 @@
|
|
1
|
+
---
|
2
|
+
layout: default
|
3
|
+
---
|
4
|
+
|
5
|
+
<div class="md:grid md:grid-cols-3 md:gap-8 md:items-start md:justify-center">
|
6
|
+
<div class="md:col-start-1 md:col-span-2">
|
7
|
+
<div class="">
|
8
|
+
<h2 class="md:mt-0">Main</h2>
|
9
|
+
|
10
|
+
<h3>Code Coverage</h3>
|
11
|
+
<!--
|
12
|
+
Jekyll provides access to YAML, JSON, CSV, and TSV in the `_data` directory using `site.data`. It supports retrieving data nested in directories, files, and objects. https://jekyllrb.com/docs/datafiles/
|
13
|
+
|
14
|
+
Get the data from the `total` field in `_data/coverage/coverage-summary.json` and assign it to a variable called `total`.
|
15
|
+
-->
|
16
|
+
{% assign total = site.data.coverage.coverage-summary.total %}
|
17
|
+
<!--
|
18
|
+
Jekyll uses includes to create reusable snippets of html code. Data can be passed through to the snippet using parameters. https://jekyllrb.com/docs/includes/
|
19
|
+
|
20
|
+
Include the html snippet in `_includes/coverage-summary.html` with the parameters "main" as `branch` and the totals from the data as `total`.
|
21
|
+
-->
|
22
|
+
{% include coverage-summary.html branch="main" total=total %}
|
23
|
+
|
24
|
+
<!-- Playwright dashboard added earlier -->
|
25
|
+
<h3>Playwright</h3>
|
26
|
+
<!-- Get the data from `_data/playwright-reports/main.json` and assign it to a variable called `data`. -->
|
27
|
+
{% assign data = site.data.playwright-reports.main %}
|
28
|
+
<!-- Jekyll uses Liquid filters to provide helper functions. https://jekyllrb.com/docs/liquid/filters/ -->
|
29
|
+
<!--
|
30
|
+
Include the html snippet in `_includes/playwright-summary.html` with the parameters "main" as `branch`,
|
31
|
+
the data variable as `data`, and "/playwright-reports/main.html" as `url`.
|
32
|
+
-->
|
33
|
+
{% include playwright-summary.html branch="main" data=data url="/playwright-reports/main.html" %}
|
34
|
+
</div>
|
35
|
+
|
36
|
+
<div class="">
|
37
|
+
<h2>Latest Reports from Branches</h2>
|
38
|
+
<!-- Include the html snippet from `_includes/playwright-branch-list.html` -->
|
39
|
+
{% include playwright-branch-list.html %}
|
40
|
+
</div>
|
41
|
+
</div>
|
42
|
+
|
43
|
+
<div class="md:mt-[-2rem] md:col-start-3">
|
44
|
+
{% for post in site.categories["release"] limit: 3 %}
|
45
|
+
{% include release-note.html post=post content=post.content %}
|
46
|
+
{% endfor %}
|
47
|
+
</div>
|
48
|
+
</div>
|
@@ -0,0 +1,11 @@
|
|
1
|
+
---
|
2
|
+
# the header for the page
|
3
|
+
title: "Playwright Reports for Branches"
|
4
|
+
# the link to page https://jekyllrb.com/docs/permalinks/
|
5
|
+
permalink: playwright-reports/branches/
|
6
|
+
---
|
7
|
+
|
8
|
+
<div>
|
9
|
+
<!-- Include the html snippet in `_includes/playwright-branch-list.html` -->
|
10
|
+
{% include playwright-branch-list.html %}
|
11
|
+
</div>
|
@@ -0,0 +1,26 @@
|
|
1
|
+
---
|
2
|
+
layout: page
|
3
|
+
# the header for the page
|
4
|
+
title: "Playwright Reports"
|
5
|
+
# the link to page https://jekyllrb.com/docs/permalinks/
|
6
|
+
permalink: playwright-reports/
|
7
|
+
---
|
8
|
+
|
9
|
+
<div>
|
10
|
+
<h2>Main
|
11
|
+
</h2>
|
12
|
+
<!-- Get the data from `_data/playwright-reports/main.json` and assign it to a variable called `data`. -->
|
13
|
+
{% assign data = site.data.playwright-reports.main %}
|
14
|
+
<!--
|
15
|
+
Include the html snippet in `_includes/playwright-summary.html` with the parameters "main" as `branch`,
|
16
|
+
the data variable as `data`, and "/playwright-reports/main.html" as `url`.
|
17
|
+
-->
|
18
|
+
{% include playwright-summary.html branch="main" data=data url="/playwright-reports/main.html" %}
|
19
|
+
|
20
|
+
<div class="mt-8">
|
21
|
+
<h2>Latest Reports from Branches
|
22
|
+
</h2>
|
23
|
+
<!-- Include the html snippet in `_includes/playwright-branch-list.html` -->
|
24
|
+
{% include playwright-branch-list.html %}
|
25
|
+
</div>
|
26
|
+
</div>
|
data/releases.markdown
ADDED
metadata
ADDED
@@ -0,0 +1,81 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: jekyll-report-dashboard
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.1.0
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Tiffany Forkner
|
8
|
+
bindir: bin
|
9
|
+
cert_chain: []
|
10
|
+
date: 2025-03-26 00:00:00.000000000 Z
|
11
|
+
dependencies:
|
12
|
+
- !ruby/object:Gem::Dependency
|
13
|
+
name: bundler
|
14
|
+
requirement: !ruby/object:Gem::Requirement
|
15
|
+
requirements:
|
16
|
+
- - ">="
|
17
|
+
- !ruby/object:Gem::Version
|
18
|
+
version: '0'
|
19
|
+
type: :development
|
20
|
+
prerelease: false
|
21
|
+
version_requirements: !ruby/object:Gem::Requirement
|
22
|
+
requirements:
|
23
|
+
- - ">="
|
24
|
+
- !ruby/object:Gem::Version
|
25
|
+
version: '0'
|
26
|
+
email:
|
27
|
+
- tforkner@fearless.com
|
28
|
+
executables: []
|
29
|
+
extensions: []
|
30
|
+
extra_rdoc_files: []
|
31
|
+
files:
|
32
|
+
- 404.html
|
33
|
+
- _data/coverage/thresholds.yml
|
34
|
+
- _includes/coverage-summary.html
|
35
|
+
- _includes/footer.html
|
36
|
+
- _includes/head.html
|
37
|
+
- _includes/header.html
|
38
|
+
- _includes/playwright-branch-list.html
|
39
|
+
- _includes/playwright-stat.html
|
40
|
+
- _includes/playwright-summary.html
|
41
|
+
- _includes/release-note.html
|
42
|
+
- _layouts/default.html
|
43
|
+
- _layouts/page.html
|
44
|
+
- _layouts/playwright-branch.html
|
45
|
+
- _layouts/post.html
|
46
|
+
- _layouts/release-note.html
|
47
|
+
- _plugins/coverage-results-filter.rb
|
48
|
+
- _plugins/icon-filter.rb
|
49
|
+
- _plugins/key-list-filter.rb
|
50
|
+
- _plugins/playwright-branch-index-generator.rb
|
51
|
+
- _plugins/playwright-results-filter.rb
|
52
|
+
- assets/css/styles.css
|
53
|
+
- coverage.markdown
|
54
|
+
- index.markdown
|
55
|
+
- playwright-branches.markdown
|
56
|
+
- playwright-reports.markdown
|
57
|
+
- releases.markdown
|
58
|
+
homepage: https://github.com/FearlessSolutions/jekyll-report-dashboard
|
59
|
+
licenses:
|
60
|
+
- MIT
|
61
|
+
metadata:
|
62
|
+
plugin_type: theme
|
63
|
+
rdoc_options: []
|
64
|
+
require_paths:
|
65
|
+
- lib
|
66
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
67
|
+
requirements:
|
68
|
+
- - "~>"
|
69
|
+
- !ruby/object:Gem::Version
|
70
|
+
version: 3.4.2
|
71
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
72
|
+
requirements:
|
73
|
+
- - ">="
|
74
|
+
- !ruby/object:Gem::Version
|
75
|
+
version: '0'
|
76
|
+
requirements: []
|
77
|
+
rubygems_version: 3.6.3
|
78
|
+
specification_version: 4
|
79
|
+
summary: Jekyll theme for displaying software project reports (e.g. Playwright reports,
|
80
|
+
code coverage reports, GitHub release notes)
|
81
|
+
test_files: []
|