From 977ed78ce9e27f85c18f5c3fa5d4f96fbebef162 Mon Sep 17 00:00:00 2001 From: Clement Escoffier Date: Tue, 19 Nov 2024 17:24:08 +0100 Subject: [PATCH] Rework the working group page - Add icons for the board, proposal and chat when defined - Fix the completion date for the completed working groups --- _data/wg.yaml | 119 ++++++++++-------- _includes/working-group-band.html | 17 ++- _sass/layouts/working-groups.scss | 28 ++++- working-groups/main.java | 147 ++++++++++++++++------ working-groups/templates/wg.yaml.template | 4 + 5 files changed, 213 insertions(+), 102 deletions(-) diff --git a/_data/wg.yaml b/_data/wg.yaml index aa373e890e0..3c7bb9727c5 100644 --- a/_data/wg.yaml +++ b/_data/wg.yaml @@ -1,54 +1,5 @@ --- working-groups: - - title: "WebSocket Next" - board-url: "https://github.com/orgs/quarkusio/projects/26" - short-description: WebSocket-Next related tasks - readme: | -

The WebSocket Next focus group aims to improve our WebSocket experience.

-

Recently, we delivered a new approach to dealing with WebSocket (both for the server and client). This was the first step. There are still a few areas to improve, such as documentation, security, observability, and testability. The goal of this focus group is to track these efforts.

- - status: on track - completed: false - last-activity: 2024-11-19 - last-update: | - ### Telemetry - https://github.com/quarkusio/quarkus/pull/41956 was merged last week. @michalvavrik is going to send a pull request with Micrometer support this week. - - ### Performance - Two problems were addressed in Vert.x: https://github.com/eclipse-vertx/vert.x/pull/5358 and https://github.com/eclipse-vertx/vert.x/pull/5348. - The CDI request context is only activated if needed: https://github.com/quarkusio/quarkus/pull/43915. - - I hope that WS Next will be feature-complete at the time of 3.17 release. - point-of-contact: "@mkouba (@Martin Kouba on Zulip)" - discussion: https://github.com/quarkusio/quarkus/discussions/38473 - - title: "Test classloading" - board-url: "https://github.com/orgs/quarkusio/projects/30" - short-description: The goal of this working group is to rewrite Quarkus's test classloading, so that tests are run in the same classloader as the application under tests, and Quarkus extensions can do "Quarkus-y" manipulations of test classes. - readme: | -

At the moment, Quarkus tests are invoked using one classloader, and then executed in a different classloader. This mostly works well, but means some use cases don't work: extensions cannot manipulate test classes in the same way that they do normal application classes. For example, anything run via a JUnit @TestTemplate test case will see the un-transformed class.

-

It also means we have extra user-facing complexity, such as the QuarkusTest*Callbacks](https://quarkus.io/guides/getting-started-testing#enrichment-via-quarkustestcallback):

-
-

While it is possible to use JUnit Jupiter callback interfaces like BeforeEachCallback, you might run into classloading issues because Quarkus has to run tests in a custom classloader which JUnit is not aware of.

-
-

A final benefit is a reduction in the internal complexity of our code. Hopping between classloaders during test execution takes a lot of work, and adds a lot of code! It also is brittle in places. For example, because the hop between classloaders relies on serialization in some cases, it's becoming harder to do as the JVM tightens up security restrictions. We used to rely on xstream, but that stopped working in Java 17. In https://github.com/quarkusio/quarkus/pull/40601, @dmlloyd moved us to use the JBoss Serializer, which works better, but might still be affected by future restrictions on class access.

-

The goal of this working group is to allow test classes to fully participate in the 'quarkification' of classes. The mechanism for this is probably just to load the test classes with the classloader we intend to run them with, so that JUnit sees the 'correct' version of the class.

- - status: on track - completed: false - last-activity: 2024-11-19 - last-update: | - A few pre-existing issues have been added to this project, since we're pretty confident the rewrite will either fix them, or unlock the next step for the fix. - - Progress on the main work item has been delayed by conferences! - point-of-contact: "@holly-cummins (@Holly Cummins on Zulip)" - discussion: https://github.com/quarkusio/quarkus/discussions/41867 - title: "Roq :: Quarkus SSG" board-url: "https://github.com/orgs/quarkiverse/projects/6" short-description: Allow Static Site Generation with Quarkus. @@ -70,17 +21,18 @@ working-groups:

This is a great opportunity to participate in fun effort and be involved with the Quarkus community, if anyone is interested in being a part of this, please reach out to me 🚀

status: complete completed: true - last-activity: 2024-11-18 + last-activity: 2024-11-19 + last-update-date: 2024-11-18 last-update: | ROQ has been released! See https://www.youtube.com/live/hrF1a5sKqBI to see ROQ in action. deliverable: Quarkus Insight point-of-contact: "@ia3andy" - discussion: https://github.com/quarkusio/quarkus/discussions/41309 + proposal: https://github.com/quarkusio/quarkus/discussions/41309 - title: "Enhanced TLS support" board-url: "https://github.com/orgs/quarkusio/projects/24" short-description: Track the progress around the new TLS configuration centralization and new features (like Let's Encrypt, Cert-Manager, and local experience...) @@ -91,18 +43,71 @@ working-groups: status: complete completed: true - last-activity: 2024-11-18 + last-activity: 2024-11-19 + last-update-date: 2024-09-29 last-update: | This working group is complete! That does not mean that no work will be done around TLS, but what was defined in the initial scope of the working group has been completed. Enhancements and bug fixes will follow. deliverable: Quarkus Insight point-of-contact: "@cescoffier (@Clement Escoffier on Zulip)" - discussion: https://github.com/quarkusio/quarkus/discussions/41024 + proposal: https://github.com/quarkusio/quarkus/discussions/41024 + - title: "WebSocket Next" + board-url: "https://github.com/orgs/quarkusio/projects/26" + short-description: WebSocket-Next related tasks + readme: | +

The WebSocket Next focus group aims to improve our WebSocket experience.

+

Recently, we delivered a new approach to dealing with WebSocket (both for the server and client). This was the first step. There are still a few areas to improve, such as documentation, security, observability, and testability. The goal of this focus group is to track these efforts.

+ + status: on track + completed: false + last-activity: 2024-11-19 + last-update-date: 2024-11-05 + last-update: | + ### Telemetry + https://github.com/quarkusio/quarkus/pull/41956 was merged last week. @michalvavrik is going to send a pull request with Micrometer support this week. + + ### Performance + Two problems were addressed in Vert.x: https://github.com/eclipse-vertx/vert.x/pull/5358 and https://github.com/eclipse-vertx/vert.x/pull/5348. + The CDI request context is only activated if needed: https://github.com/quarkusio/quarkus/pull/43915. + + I hope that WS Next will be feature-complete at the time of 3.17 release. + point-of-contact: "@mkouba (@Martin Kouba on Zulip)" + proposal: https://github.com/quarkusio/quarkus/discussions/38473 + - title: "Test classloading" + board-url: "https://github.com/orgs/quarkusio/projects/30" + short-description: The goal of this working group is to rewrite Quarkus's test classloading, so that tests are run in the same classloader as the application under tests, and Quarkus extensions can do "Quarkus-y" manipulations of test classes. + readme: | +

At the moment, Quarkus tests are invoked using one classloader, and then executed in a different classloader. This mostly works well, but means some use cases don't work: extensions cannot manipulate test classes in the same way that they do normal application classes. For example, anything run via a JUnit @TestTemplate test case will see the un-transformed class.

+

It also means we have extra user-facing complexity, such as the QuarkusTest*Callbacks](https://quarkus.io/guides/getting-started-testing#enrichment-via-quarkustestcallback):

+
+

While it is possible to use JUnit Jupiter callback interfaces like BeforeEachCallback, you might run into classloading issues because Quarkus has to run tests in a custom classloader which JUnit is not aware of.

+
+

A final benefit is a reduction in the internal complexity of our code. Hopping between classloaders during test execution takes a lot of work, and adds a lot of code! It also is brittle in places. For example, because the hop between classloaders relies on serialization in some cases, it's becoming harder to do as the JVM tightens up security restrictions. We used to rely on xstream, but that stopped working in Java 17. In https://github.com/quarkusio/quarkus/pull/40601, @dmlloyd moved us to use the JBoss Serializer, which works better, but might still be affected by future restrictions on class access.

+

The goal of this working group is to allow test classes to fully participate in the 'quarkification' of classes. The mechanism for this is probably just to load the test classes with the classloader we intend to run them with, so that JUnit sees the 'correct' version of the class.

+ + status: on track + completed: false + last-activity: 2024-11-19 + last-update-date: 2024-10-29 + last-update: | + A few pre-existing issues have been added to this project, since we're pretty confident the rewrite will either fix them, or unlock the next step for the fix. + + Progress on the main work item has been delayed by conferences! + point-of-contact: "@holly-cummins (@Holly Cummins on Zulip)" + proposal: https://github.com/quarkusio/quarkus/discussions/41867 + discussion: https://quarkusio.zulipchat.com/#narrow/channel/187038-dev/topic/WG.20.2330.20Test.20Classloading.20chatter/ - title: "Quarkus 3.15 LTS" board-url: "https://github.com/orgs/quarkusio/projects/28" short-description: This WG focuses on defining the issues we would like to have in the next-to-be LTS (Quarkus 3.14/3.15) @@ -117,6 +122,7 @@ working-groups: status: on track completed: false last-activity: 2024-11-13 + last-update-date: 2024-10-28 last-update: | Everything is fine for now. @@ -139,6 +145,7 @@ working-groups: status: on track completed: false last-activity: 2024-10-31 + last-update-date: 2024-09-27 last-update: | There is a first draft https://github.com/quarkusio/quarkus/pull/42316 The PR introduces a CLI plugin that generates a Dockerfile. @@ -179,6 +186,7 @@ working-groups: status: on track completed: false last-activity: 2024-10-28 + last-update-date: 2024-10-28 last-update: | Still on track. In the last period, we organized an international manhunt to find the owner of the quarkus.dev DNS name :-) We were able to identify the owner, and everything is fine. `quarkus.io` and `quarkus.dev` should be transferred to the foundation at some point. @@ -194,6 +202,7 @@ working-groups: status: on track completed: false last-activity: 2024-10-03 + last-update-date: 2024-10-29 last-update: | The main missing piece for now is the Asciidoctor -> Markdown transformer. I did a first try with some regexp-based parser but it was too limited for some of the content we have (mostly complex tables). I have another lead as someone actually wrote a Java Asciidoctor parser. The only problem is that the HTML transformation is intertwined with the parser. I need to split them and then create a Markdown document from there. Making slow progress as time permits. diff --git a/_includes/working-group-band.html b/_includes/working-group-band.html index 55f70641a32..7cb15f31589 100644 --- a/_includes/working-group-band.html +++ b/_includes/working-group-band.html @@ -21,12 +21,19 @@ {% if item.point-of-contact %}

Point of Contact: {{ item.point-of-contact }}

{% endif %} + + {% endunless %} @@ -46,7 +53,7 @@

Completed working groups

Description: {{ item.short-description }}

-

Completed on: {{ item.last-activity | date: '%B %d, %Y' }}

+

Completed on: {{ item.last-update-date | date: '%B %d, %Y' }}

{% if item.deliverable %}

Deliverable: {{ item.deliverable }}

{% endif %} diff --git a/_sass/layouts/working-groups.scss b/_sass/layouts/working-groups.scss index 8a8a46523aa..f0b23080aed 100644 --- a/_sass/layouts/working-groups.scss +++ b/_sass/layouts/working-groups.scss @@ -25,14 +25,12 @@ } .card-header { - padding-bottom: 5px; border-bottom: 1px solid var(--card-outline); - height: 2rem + height: fit-content } .card-body { - padding: 1rem 0rem; - height: 15rem; + padding: 1rem 0rem; } .card-completed { @@ -42,11 +40,28 @@ .card-footer { padding-top: 10px; border-top: 1px solid var(--card-outline); + + .icons { + display: flex; + height: 10vh; + align-items: center; + align-content: flex-start; + font-size: xx-large; + text-align: center; + vertical-align: bottom; + color: var(--card-outline); + justify-content: center; + flex-wrap: nowrap; + flex-direction: row; + } } + + .card-title { font-size: 1.25rem; font-weight: 400; + margin-bottom: 0.5rem; } .card-text { @@ -62,10 +77,15 @@ position: relative; word-wrap: break-word; background-clip: border-box; + align-items: start; padding: 1rem; border-radius: 10px; border: 1px solid var(--card-outline); width: calc(100% - 2rem); + grid-column: span 4; + justify-content: center; + justify-items: stretch; + align-content: space-between; grid-column: span 4; diff --git a/working-groups/main.java b/working-groups/main.java index 0d9810d1b39..e4c95656ba1 100644 --- a/working-groups/main.java +++ b/working-groups/main.java @@ -24,9 +24,34 @@ import java.util.Map; import java.util.concurrent.Callable; import java.util.concurrent.ExecutionException; - +import java.util.concurrent.atomic.AtomicReference; + +import org.commonmark.node.AbstractVisitor; +import org.commonmark.node.BlockQuote; +import org.commonmark.node.BulletList; +import org.commonmark.node.Code; +import org.commonmark.node.CustomBlock; +import org.commonmark.node.CustomNode; +import org.commonmark.node.Document; +import org.commonmark.node.Emphasis; +import org.commonmark.node.FencedCodeBlock; +import org.commonmark.node.HardLineBreak; +import org.commonmark.node.Heading; +import org.commonmark.node.HtmlBlock; +import org.commonmark.node.HtmlInline; +import org.commonmark.node.Image; +import org.commonmark.node.IndentedCodeBlock; +import org.commonmark.node.Link; +import org.commonmark.node.LinkReferenceDefinition; +import org.commonmark.node.ListItem; import org.commonmark.node.Node; +import org.commonmark.node.OrderedList; import org.commonmark.node.Paragraph; +import org.commonmark.node.SoftLineBreak; +import org.commonmark.node.StrongEmphasis; +import org.commonmark.node.Text; +import org.commonmark.node.ThematicBreak; +import org.commonmark.node.Visitor; import org.commonmark.parser.Parser; import org.commonmark.renderer.html.HtmlRenderer; import org.eclipse.microprofile.config.inject.ConfigProperty; @@ -119,10 +144,9 @@ public List getAllProjectsForOrganization(String org) throws ExecutionExc } """, variables); - - System.out.println("Response: " + response); + System.out.println("Response: " + response); System.out.println("Errors: " + response.getErrors()); - System.out.println("Data:\n" + response.getData()); + System.out.println("Data:\n" + response.getData()); JsonArray array = response.getData().getJsonObject("organization").getJsonObject("projectsV2") .getJsonArray("nodes"); for (JsonValue value : array) { @@ -201,67 +225,105 @@ public String getReadme() { private static boolean isMetadata(String singular, String plural, String line) { var l = line.toLowerCase().trim(); - return l.startsWith("* " + singular.toLowerCase() + ":") - || l.startsWith("* " + plural.toLowerCase() + ":"); + return l.startsWith("* " + singular.toLowerCase() + ":") + || l.startsWith("* " + plural.toLowerCase() + ":"); + } + + private static boolean isMetadata(String singular, String line) { + var l = line.toLowerCase().trim(); + return l.startsWith("* " + singular.toLowerCase() + ":"); } public String getDeliverable() { String line = longDescription().lines() - .filter(s -> isMetadata("Deliverable", "Deliverables", s)) - .findFirst() - .orElse(null); - + .filter(s -> isMetadata("Deliverable", "Deliverables", s)) + .findFirst() + .orElse(null); + if (line != null) { var content = line.substring(line.indexOf(":") + 1).trim(); Parser parser = Parser.builder().build(); - Node document = parser.parse(content); + Node document = parser.parse(content); HtmlRenderer renderer = HtmlRenderer.builder() - .omitSingleParagraphP(true) - .escapeHtml(false) - .sanitizeUrls(true) - .build(); + .omitSingleParagraphP(true) + .escapeHtml(false) + .sanitizeUrls(true) + .build(); return renderer.render(document); - } + } return null; } public String getPointOfContact() { String line = longDescription().lines() - .filter(s -> isMetadata("Point of contact", "Points of contact", s)) - .findFirst() - .orElse(null); - + .filter(s -> isMetadata("Point of contact", "Points of contact", s)) + .findFirst() + .orElse(null); + if (line != null) { var content = line.substring(line.indexOf(":") + 1).trim(); Parser parser = Parser.builder().build(); - Node document = parser.parse(content); + Node document = parser.parse(content); HtmlRenderer renderer = HtmlRenderer.builder() - .omitSingleParagraphP(true) - .build(); + .omitSingleParagraphP(true) + .build(); return renderer.render(document); - } + } + + return null; + } + + public String getProposal() { + String line = longDescription().lines() + .filter(s -> isMetadata("Proposal", s)) + .findFirst() + .orElse(null); + + if (line != null) { + var content = line.substring(line.indexOf(":") + 1).trim(); + Parser parser = Parser.builder().build(); + Node document = parser.parse(content); + HtmlRenderer renderer = HtmlRenderer.builder() + .omitSingleParagraphP(true) + .build(); + return renderer.render(document); + } return null; } public String getDiscussionLink() { String line = longDescription().lines() - .filter(s -> isMetadata("Discussion", "Discussions", s)) - .findFirst() - .orElse(null); - - if (line != null) { - var content = line.substring(line.indexOf(":") + 1).trim(); - Parser parser = Parser.builder().build(); - Node document = parser.parse(content); - HtmlRenderer renderer = HtmlRenderer.builder() - .omitSingleParagraphP(true) - .build(); - return renderer.render(document); - } + .filter(s -> isMetadata("Discussion", s)) + .findFirst() + .orElse(null); + + if (line != null) { + var content = line.substring(line.indexOf(":") + 1).trim(); + Parser parser = Parser.builder().build(); + Node document = parser.parse(content); + AtomicReference dest = new AtomicReference<>(); + document.accept(new AbstractVisitor() { + + @Override + public void visit(Link link) { + dest.compareAndSet(null, link.getDestination()); + } + + }); + + if (dest.get() != null) { + return dest.get(); + } else { + HtmlRenderer renderer = HtmlRenderer.builder() + .omitSingleParagraphP(true) + .build(); + return renderer.render(document); + } + } - return null; + return null; } public String getIndentedReadme() { @@ -338,6 +400,15 @@ public String getBadgeText() { record Update(String id, String body, String bodyHtml, String status, Instant updateAt) { + public String getUpdateDate() { + LocalDateTime dateTime = LocalDateTime.ofInstant(updateAt, ZoneId.of("UTC")); + + // Define the formatter + DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd"); + + // Format the LocalDateTime + return dateTime.format(formatter); + } } } diff --git a/working-groups/templates/wg.yaml.template b/working-groups/templates/wg.yaml.template index d3bfe6645e9..caaee2e7071 100644 --- a/working-groups/templates/wg.yaml.template +++ b/working-groups/templates/wg.yaml.template @@ -10,6 +10,7 @@ working-groups: completed: {board.isCompleted()} last-activity: {board.getLastActivityDate()} {#if board.getLastUpdate() && board.getLastUpdate().body.trim()} + last-update-date: {board.getLastUpdate().getUpdateDate()} last-update: | {board.getIndentedLastUpdate().raw} {/if} @@ -19,6 +20,9 @@ working-groups: {#if board.getPointOfContact()} point-of-contact: "{board.getPointOfContact().raw}" {/if} + {#if board.getProposal()} + proposal: {board.getProposal().raw} + {/if} {#if board.getDiscussionLink()} discussion: {board.getDiscussionLink().raw} {/if}