Skip to content

Conversation

@jsmid1
Copy link
Collaborator

@jsmid1 jsmid1 commented Nov 12, 2025

This PR implements automation for Nexus plugin UI checks.

Issue: RHTAP-5669

Summary by CodeRabbit

  • New Features

    • Added Nexus registry UI support with repository heading and table header checks; registry plugin now validates table headers for supported providers.
  • UI

    • Registry tables include additional column headers: Version, Artifact, Repository Type, Checksum, Modified, Size (visible across supported providers).
  • Tests

    • UI tests updated to hide the Quick Start side panel during CI and Image Registry flows for more stable verification.

@jsmid1 jsmid1 requested a review from xinredhat as a code owner November 12, 2025 08:53
@coderabbitai
Copy link

coderabbitai bot commented Nov 12, 2025

Walkthrough

Adds Nexus UI support and registry header constants: introduces NexusUiPlugin, makes table-header checks abstract in BaseRegistryPlugin, updates Quay implementation to the new API, extends RegistryPO with Nexus column/label constants, and adds Quick Start dismissal steps in tests.

Changes

Cohort / File(s) Summary
Page Object Enhancements
src/ui/page-objects/registryPo.ts
Added column header and label constants: versionColumnHeader, artifactColumnHeader, repositoryTypeColumnHeader, checksumColumnHeader, modifiedColumnHeader, and nexusRepositoryPrefix.
Registry Plugin API / Base
src/ui/plugins/registry/baseRegistryPlugin.ts, src/ui/plugins/registry/registryPlugin.ts
Removed concrete checkTableColumnHeaders implementation from base; replaced abstract checkVulnerabilities(page) with abstract checkTableColumnHeaders(page) and removed checkVulnerabilities from the public interface.
Nexus Registry Implementation
src/ui/plugins/registry/nexusUiPlugin.ts, src/ui/plugins/registry/registryUiFactory.ts
Added NexusUiPlugin (constructor, checkRepositoryHeading, stub checkRepositoryLink, checkTableColumnHeaders) and wired factory to return it for ImageRegistryType.NEXUS.
Quay Plugin Updates
src/ui/plugins/registry/quayUiPlugin.ts
Removed quayProvider field; now uses this.registry and implements checkTableColumnHeaders(page) to assert Quay-specific headers via RegistryPO.
Test Flow Updates
tests/ui/component.test.ts
Inserted hideQuickStartIfVisible(page) steps (wrapped in test.step with a 20s timeout) to dismiss Quick Start during CI and Image Registry flows.

Sequence Diagram(s)

sequenceDiagram
    autonumber
    participant Test as E2E Test
    participant Factory as RegistryUiFactory
    participant Plugin as RegistryUiPlugin (Quay/Nexus)
    participant PO as RegistryPO

    Test->>Factory: createRegistryUiPlugin(registry)
    Factory-->>Plugin: returns provider-specific Plugin
    Note right of Plugin: Provider-specific checks
    Test->>Plugin: checkRepositoryHeading(page)
    Plugin->>PO: query heading using prefix + registry identifiers
    PO-->>Plugin: heading element
    Plugin-->>Test: assert visible

    Test->>Plugin: checkTableColumnHeaders(page)
    Plugin->>PO: query provider-specific header labels
    PO-->>Plugin: header elements
    Plugin-->>Test: assert all headers visible
Loading

Estimated code review effort

🎯 3 (Moderate) | ⏱️ ~25 minutes

  • Verify all RegistryPlugin implementations (Quay, Nexus, others) implement the new abstract checkTableColumnHeaders signature.
  • Confirm RegistryPO header strings exactly match UI text/selectors for Nexus and Quay to avoid brittle assertions.
  • Review NexusUiPlugin.checkRepositoryLink() stub to ensure tests do not assume link behavior yet.
  • Check test step placement and timeouts around hideQuickStartIfVisible() to reduce CI flakiness.

Possibly related PRs

Suggested reviewers

  • xinredhat
  • Katka92

Pre-merge checks and finishing touches

✅ Passed checks (3 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The title accurately describes the main change: implementing checks for a Nexus plugin with a specific issue reference.
Docstring Coverage ✅ Passed No functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check.
✨ Finishing touches
  • 📝 Generate docstrings
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Post copyable unit tests in a comment

📜 Recent review details

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 4106eb8 and e811c64.

📒 Files selected for processing (7)
  • src/ui/page-objects/registryPo.ts (2 hunks)
  • src/ui/plugins/registry/baseRegistryPlugin.ts (1 hunks)
  • src/ui/plugins/registry/nexusUiPlugin.ts (1 hunks)
  • src/ui/plugins/registry/quayUiPlugin.ts (2 hunks)
  • src/ui/plugins/registry/registryPlugin.ts (0 hunks)
  • src/ui/plugins/registry/registryUiFactory.ts (2 hunks)
  • tests/ui/component.test.ts (1 hunks)
💤 Files with no reviewable changes (1)
  • src/ui/plugins/registry/registryPlugin.ts
🚧 Files skipped from review as they are similar to previous changes (2)
  • src/ui/page-objects/registryPo.ts
  • src/ui/plugins/registry/registryUiFactory.ts
🧰 Additional context used
📓 Path-based instructions (3)
tests/**

⚙️ CodeRabbit configuration file

Focus on test coverage, maintainability, proper test structure, test isolation, mock usage, async test patterns, and test stability. Ensure tests are deterministic and properly clean up after themselves.

Files:

  • tests/ui/component.test.ts
**/*.test.ts

⚙️ CodeRabbit configuration file

Ensure comprehensive test coverage, proper assertions, test isolation, async pattern correctness, mock usage, and test maintainability. Review for potential flaky tests and race conditions.

Files:

  • tests/ui/component.test.ts
src/ui/**

⚙️ CodeRabbit configuration file

Focus on page object pattern implementation, element selection strategies, UI test stability, maintainability, proper wait conditions, error handling, and flaky test prevention. Ensure tests are resilient to UI changes.

Files:

  • src/ui/plugins/registry/baseRegistryPlugin.ts
  • src/ui/plugins/registry/quayUiPlugin.ts
  • src/ui/plugins/registry/nexusUiPlugin.ts
🧬 Code graph analysis (3)
tests/ui/component.test.ts (1)
src/ui/commonUi.ts (1)
  • hideQuickStartIfVisible (22-39)
src/ui/plugins/registry/quayUiPlugin.ts (1)
src/ui/page-objects/registryPo.ts (1)
  • RegistryPO (8-39)
src/ui/plugins/registry/nexusUiPlugin.ts (2)
src/rhtap/core/integration/registry/imageRegistry.ts (1)
  • ImageRegistry (9-28)
src/ui/page-objects/registryPo.ts (1)
  • RegistryPO (8-39)
🔇 Additional comments (9)
tests/ui/component.test.ts (1)

148-150: LGTM! Good test stability improvement.

Adding the Quick Start panel dismissal here maintains consistency with the CI and Docs test flows and prevents potential UI interference during registry checks.

src/ui/plugins/registry/quayUiPlugin.ts (3)

8-10: LGTM! Clean refactor.

Removing the redundant quayProvider field and using the inherited this.registry eliminates duplication and aligns with the base class design.


12-20: LGTM!

Repository heading and link checks correctly reference this.registry from the base class.


22-29: Implementation looks correct.

The column header checks use proper Playwright assertions and centralized constants. The implementation correctly fulfills the abstract method contract from BaseRegistryPlugin.

src/ui/plugins/registry/baseRegistryPlugin.ts (1)

65-65: Interface change aligns with test requirements.

Replacing the abstract checkVulnerabilities method with checkTableColumnHeaders reflects the priority shift in UI validation. The vulnerability check is deferred in tests due to scan timing (as noted in component.test.ts lines 173-175), while table header verification provides immediate UI validation.

src/ui/plugins/registry/nexusUiPlugin.ts (4)

6-10: LGTM! Clean implementation.

The constructor properly extends BaseRegistryPlugin and the previous review concern about the redundant nexusProvider field has been addressed—the implementation correctly uses the inherited this.registry field.


12-14: LGTM!

The repository heading check properly uses the Nexus-specific prefix and correctly accesses registry metadata through the inherited base class field.


16-19: LGTM! Appropriate stub implementation.

The no-op implementation with an explanatory comment properly handles the unsupported Nexus repository link feature while fulfilling the interface contract.


21-28: LGTM!

The table column header verification correctly checks all six Nexus-specific headers using proper Playwright assertions and centralized constants.

Tip

📝 Customizable high-level summaries are now available in beta!

You can now customize how CodeRabbit generates the high-level summary in your pull requests — including its content, structure, tone, and formatting.

  • Provide your own instructions using the high_level_summary_instructions setting.
  • Format the summary however you like (bullet lists, tables, multi-section layouts, contributor stats, etc.).
  • Use high_level_summary_in_walkthrough to move the summary from the description to the walkthrough section.

Example instruction:

"Divide the high-level summary into five sections:

  1. 📝 Description — Summarize the main change in 50–60 words, explaining what was done.
  2. 📓 References — List relevant issues, discussions, documentation, or related PRs.
  3. 📦 Dependencies & Requirements — Mention any new/updated dependencies, environment variable changes, or configuration updates.
  4. 📊 Contributor Summary — Include a Markdown table showing contributions:
    | Contributor | Lines Added | Lines Removed | Files Changed |
  5. ✔️ Additional Notes — Add any extra reviewer context.
    Keep each section concise (under 200 words) and use bullet or numbered lists for clarity."

Note: This feature is currently in beta for Pro-tier users, and pricing will be announced later.


Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

@coderabbitai coderabbitai bot added enhancement New feature or request testing ui-testing labels Nov 12, 2025
Copy link

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (1)
src/ui/plugins/registry/quayUiPlugin.ts (1)

33-61: Remove orphaned checkVulnerabilities method from QuayUiPlugin (lines 33–61).

The method is dead code—never called in active test flows (the test reference at lines 173–175 is explicitly commented out), not part of the abstract contract in BaseRegistryPlugin, and absent from other registry plugins like NexusUiPlugin. The commented note indicates the security scan timing dependency is temporary, but without an active test requirement, this implementation should be removed to maintain a clean, maintainable test interface aligned with the updated contract pattern (e.g., checkTableColumnHeaders).

🧹 Nitpick comments (2)
tests/ui/component.test.ts (1)

148-150: Consider adding waitForPageLoad before hiding the Quick Start panel.

The CI (lines 78-83) and Docs (lines 104-113) test flows call waitForPageLoad after navigation and before hiding the Quick Start panel, but this Image Registry test skips that step. While hideQuickStartIfVisible has its own wait logic, maintaining consistency across test flows improves predictability and reduces flaky test risk.

Apply this diff to align with the established pattern:

       await page.goto(`${component.getComponentUrl()}/image-registry`, {
         timeout: 20000,
       });
+      await waitForPageLoad(page, component.getCoreComponent().getName());
 
       await test.step('Hide Quick start side panel', async () => {
         await hideQuickStartIfVisible(page);
       }, { timeout: 20000 });
src/ui/plugins/registry/nexusUiPlugin.ts (1)

18-21: Document the no-op method more explicitly.

Since Nexus repository links are not yet supported, consider adding a TODO comment or issue reference to track this missing functionality for future implementation.

     // eslint-disable-next-line no-unused-vars
     async checkRepositoryLink(_page: Page): Promise<void> {
-        // Skipped: Nexus repository link is not supported yet
+        // TODO: Implement Nexus repository link verification once supported
+        // Skipping this check for now as the Nexus UI plugin does not yet expose repository links
     }
📜 Review details

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 3c30183 and 7f5232e.

📒 Files selected for processing (7)
  • src/ui/page-objects/registryPo.ts (2 hunks)
  • src/ui/plugins/registry/baseRegistryPlugin.ts (1 hunks)
  • src/ui/plugins/registry/nexusUiPlugin.ts (1 hunks)
  • src/ui/plugins/registry/quayUiPlugin.ts (1 hunks)
  • src/ui/plugins/registry/registryPlugin.ts (0 hunks)
  • src/ui/plugins/registry/registryUiFactory.ts (2 hunks)
  • tests/ui/component.test.ts (1 hunks)
💤 Files with no reviewable changes (1)
  • src/ui/plugins/registry/registryPlugin.ts
🧰 Additional context used
📓 Path-based instructions (3)
src/ui/**

⚙️ CodeRabbit configuration file

Focus on page object pattern implementation, element selection strategies, UI test stability, maintainability, proper wait conditions, error handling, and flaky test prevention. Ensure tests are resilient to UI changes.

Files:

  • src/ui/plugins/registry/baseRegistryPlugin.ts
  • src/ui/page-objects/registryPo.ts
  • src/ui/plugins/registry/registryUiFactory.ts
  • src/ui/plugins/registry/quayUiPlugin.ts
  • src/ui/plugins/registry/nexusUiPlugin.ts
tests/**

⚙️ CodeRabbit configuration file

Focus on test coverage, maintainability, proper test structure, test isolation, mock usage, async test patterns, and test stability. Ensure tests are deterministic and properly clean up after themselves.

Files:

  • tests/ui/component.test.ts
**/*.test.ts

⚙️ CodeRabbit configuration file

Ensure comprehensive test coverage, proper assertions, test isolation, async pattern correctness, mock usage, and test maintainability. Review for potential flaky tests and race conditions.

Files:

  • tests/ui/component.test.ts
🧠 Learnings (1)
📚 Learning: 2025-07-31T07:43:28.355Z
Learnt from: rhopp
Repo: redhat-appstudio/tssc-test PR: 72
File: package.json:15-15
Timestamp: 2025-07-31T07:43:28.355Z
Learning: In the tssc-test project, the `test:ui` script intentionally does not include the `generate-config` step. This is expected behavior because UI tests are designed to run in scenarios where the project-configs.json file already exists - either from prior E2E test execution or from manual template creation in RHDH.

Applied to files:

  • tests/ui/component.test.ts
🧬 Code graph analysis (4)
src/ui/plugins/registry/registryUiFactory.ts (1)
src/ui/plugins/registry/nexusUiPlugin.ts (1)
  • NexusUiPlugin (6-31)
src/ui/plugins/registry/quayUiPlugin.ts (1)
src/ui/page-objects/registryPo.ts (1)
  • RegistryPO (8-39)
src/ui/plugins/registry/nexusUiPlugin.ts (2)
src/rhtap/core/integration/registry/imageRegistry.ts (1)
  • ImageRegistry (9-28)
src/ui/page-objects/registryPo.ts (1)
  • RegistryPO (8-39)
tests/ui/component.test.ts (1)
src/ui/commonUi.ts (1)
  • hideQuickStartIfVisible (22-39)
🔇 Additional comments (6)
src/ui/page-objects/registryPo.ts (2)

17-22: LGTM!

The Nexus column header constants follow the established naming convention and align with the existing Quay header structure.


37-37: LGTM!

The Nexus repository prefix constant is consistent with the existing quayRepositoryPrefix pattern.

src/ui/plugins/registry/registryUiFactory.ts (1)

11-11: LGTM!

The Nexus integration follows the established factory pattern and maintains consistency with the existing QUAY implementation.

Also applies to: 29-30

src/ui/plugins/registry/quayUiPlugin.ts (1)

24-31: LGTM!

The table header validation correctly implements the abstract method from BaseRegistryPlugin and uses appropriate role-based selectors with RegistryPO constants for all six Quay-specific column headers.

src/ui/plugins/registry/baseRegistryPlugin.ts (1)

65-65: LGTM!

Replacing checkVulnerabilities with checkTableColumnHeaders as the abstract method aligns the base interface with the new testing approach and is consistently implemented by both Quay and Nexus plugins.

src/ui/plugins/registry/nexusUiPlugin.ts (1)

23-30: LGTM!

The table column header validation correctly verifies all six Nexus-specific headers using RegistryPO constants and role-based selectors. The implementation aligns with the abstract method contract from BaseRegistryPlugin.

@jsmid1 jsmid1 force-pushed the RHTAP-5669 branch 2 times, most recently from 78d2ff9 to 4106eb8 Compare November 12, 2025 13:43
Copy link

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 0

🧹 Nitpick comments (3)
src/ui/plugins/registry/quayUiPlugin.ts (1)

22-29: Consider using Promise.all for parallel assertions.

While the sequential await pattern works, running all six column header assertions in parallel would improve test performance and reduce potential timeout issues.

 async checkTableColumnHeaders(page: Page): Promise<void> {
-    await expect(page.getByRole('columnheader', { name: RegistryPO.tagColumnHeader })).toBeVisible();
-    await expect(page.getByRole('columnheader', { name: RegistryPO.lastModifiedColumnHeader })).toBeVisible();
-    await expect(page.getByRole('columnheader', { name: RegistryPO.securityScanColumnHeader })).toBeVisible();
-    await expect(page.getByRole('columnheader', { name: RegistryPO.sizeColumnHeader })).toBeVisible();
-    await expect(page.getByRole('columnheader', { name: RegistryPO.expiresColumnHeader })).toBeVisible();
-    await expect(page.getByRole('columnheader', { name: RegistryPO.manifestColumnHeader })).toBeVisible();
+    await Promise.all([
+        expect(page.getByRole('columnheader', { name: RegistryPO.tagColumnHeader })).toBeVisible(),
+        expect(page.getByRole('columnheader', { name: RegistryPO.lastModifiedColumnHeader })).toBeVisible(),
+        expect(page.getByRole('columnheader', { name: RegistryPO.securityScanColumnHeader })).toBeVisible(),
+        expect(page.getByRole('columnheader', { name: RegistryPO.sizeColumnHeader })).toBeVisible(),
+        expect(page.getByRole('columnheader', { name: RegistryPO.expiresColumnHeader })).toBeVisible(),
+        expect(page.getByRole('columnheader', { name: RegistryPO.manifestColumnHeader })).toBeVisible()
+    ]);
 }
src/ui/plugins/registry/nexusUiPlugin.ts (2)

16-19: Track the stubbed repository link check.

The method is appropriately stubbed with a clear explanation, but this functionality gap should be tracked to ensure it's implemented when Nexus repository links are supported.

Would you like me to open an issue to track the implementation of checkRepositoryLink for Nexus?


21-28: Consider using Promise.all for parallel assertions.

Similar to the Quay plugin, running all six column header assertions in parallel would improve test performance and resilience.

 async checkTableColumnHeaders(page: Page): Promise<void> {
-    await expect(page.getByRole('columnheader', { name: RegistryPO.versionColumnHeader })).toBeVisible();
-    await expect(page.getByRole('columnheader', { name: RegistryPO.artifactColumnHeader })).toBeVisible();
-    await expect(page.getByRole('columnheader', { name: RegistryPO.repositoryTypeColumnHeader })).toBeVisible();
-    await expect(page.getByRole('columnheader', { name: RegistryPO.checksumColumnHeader })).toBeVisible();
-    await expect(page.getByRole('columnheader', { name: RegistryPO.modifiedColumnHeader })).toBeVisible();
-    await expect(page.getByRole('columnheader', { name: RegistryPO.sizeColumnHeader })).toBeVisible();
+    await Promise.all([
+        expect(page.getByRole('columnheader', { name: RegistryPO.versionColumnHeader })).toBeVisible(),
+        expect(page.getByRole('columnheader', { name: RegistryPO.artifactColumnHeader })).toBeVisible(),
+        expect(page.getByRole('columnheader', { name: RegistryPO.repositoryTypeColumnHeader })).toBeVisible(),
+        expect(page.getByRole('columnheader', { name: RegistryPO.checksumColumnHeader })).toBeVisible(),
+        expect(page.getByRole('columnheader', { name: RegistryPO.modifiedColumnHeader })).toBeVisible(),
+        expect(page.getByRole('columnheader', { name: RegistryPO.sizeColumnHeader })).toBeVisible()
+    ]);
 }
📜 Review details

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 78d2ff9 and 4106eb8.

📒 Files selected for processing (7)
  • src/ui/page-objects/registryPo.ts (2 hunks)
  • src/ui/plugins/registry/baseRegistryPlugin.ts (1 hunks)
  • src/ui/plugins/registry/nexusUiPlugin.ts (1 hunks)
  • src/ui/plugins/registry/quayUiPlugin.ts (2 hunks)
  • src/ui/plugins/registry/registryPlugin.ts (0 hunks)
  • src/ui/plugins/registry/registryUiFactory.ts (2 hunks)
  • tests/ui/component.test.ts (1 hunks)
💤 Files with no reviewable changes (1)
  • src/ui/plugins/registry/registryPlugin.ts
🚧 Files skipped from review as they are similar to previous changes (2)
  • src/ui/page-objects/registryPo.ts
  • tests/ui/component.test.ts
🧰 Additional context used
📓 Path-based instructions (1)
src/ui/**

⚙️ CodeRabbit configuration file

Focus on page object pattern implementation, element selection strategies, UI test stability, maintainability, proper wait conditions, error handling, and flaky test prevention. Ensure tests are resilient to UI changes.

Files:

  • src/ui/plugins/registry/registryUiFactory.ts
  • src/ui/plugins/registry/quayUiPlugin.ts
  • src/ui/plugins/registry/baseRegistryPlugin.ts
  • src/ui/plugins/registry/nexusUiPlugin.ts
🧬 Code graph analysis (3)
src/ui/plugins/registry/registryUiFactory.ts (1)
src/ui/plugins/registry/nexusUiPlugin.ts (1)
  • NexusUiPlugin (6-29)
src/ui/plugins/registry/quayUiPlugin.ts (1)
src/ui/page-objects/registryPo.ts (1)
  • RegistryPO (8-39)
src/ui/plugins/registry/nexusUiPlugin.ts (2)
src/rhtap/core/integration/registry/imageRegistry.ts (1)
  • ImageRegistry (9-28)
src/ui/page-objects/registryPo.ts (1)
  • RegistryPO (8-39)
🔇 Additional comments (5)
src/ui/plugins/registry/baseRegistryPlugin.ts (1)

65-65: LGTM! Well-designed abstraction.

The refactoring to make checkTableColumnHeaders abstract allows each registry plugin to define its own table structure while maintaining shared functionality in the base class. Both Quay and Nexus implementations properly implement this method.

src/ui/plugins/registry/registryUiFactory.ts (1)

11-11: LGTM! Consistent factory pattern.

The Nexus plugin integration follows the established factory pattern consistently with the existing Quay implementation.

Also applies to: 29-30

src/ui/plugins/registry/quayUiPlugin.ts (1)

13-13: Good refactoring to use inherited registry field.

The change from quayProvider to this.registry properly leverages the inherited field from BaseRegistryPlugin, eliminating duplication and improving maintainability.

Also applies to: 17-17, 57-57

src/ui/plugins/registry/nexusUiPlugin.ts (2)

6-10: LGTM! Clean class structure.

The constructor properly delegates to the base class and relies on the inherited registry field without duplication.


12-14: LGTM! Proper use of page object constants.

The repository heading check correctly uses the RegistryPO constants and inherited registry accessors.

@konflux-ci-qe-bot
Copy link

@jsmid1: The following test has Failed, say /retest to rerun failed tests.

PipelineRun Name Status Rerun command Build Log Test Log
e2e-4.19-ws2wl Failed /retest View Pipeline Log View Test Logs

Inspecting Test Artifacts

To inspect your test artifacts, follow these steps:

  1. Install ORAS (see the ORAS installation guide).
  2. Download artifacts with the following commands:
mkdir -p oras-artifacts
cd oras-artifacts
oras pull quay.io/konflux-test-storage/rhtap-team/rhtap-cli:e2e-4.19-ws2wl

Test results analysis

<not enabled>

OCI Artifact Browser URL

<not enabled>

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants