Skip to content

Conversation

@grokspawn
Copy link
Contributor

Description of the change:
Replaces #1814

Various type changes and refactoring necessary to make opm alpha render-template capable of detecting the template type from sniffing its schema, as well as name standardization across all template types and a new factory-based creation pattern.

This absolutely sacrifices stability of the API in favor of stability of the datatypes and callflows for future growth.

Motivation for the change:
Since we created a formal schema for the basic catalog template, it made much more sense for Template to be an interface for a creation/call pattern which was increasingly entrenched in users' tooling... so it was easy to put off. But since it was also largely a "move existing stuff around" activity (read: super simple operations with complex propagation and high potential for side effects), it seemed a great opportunity to see what Claude would do with it.

Reviewer Checklist

  • Implementation matches the proposed design, or proposal is updated to match implementation
  • Sufficient unit test coverage
  • Sufficient end-to-end test coverage
  • Docs updated or added to /docs
  • Commit messages sensible and descriptive

@openshift-ci
Copy link
Contributor

openshift-ci bot commented Nov 25, 2025

[APPROVALNOTIFIER] This PR is NOT APPROVED

This pull-request has been approved by:
Once this PR has been reviewed and has the lgtm label, please assign joelanford for approval. For more information see the Code Review Process.

The full list of commands accepted by this bot can be found here.

Needs approval from an approver in each of these files:

Approvers can indicate their approval by writing /approve in a comment
Approvers can cancel approval by writing /approve cancel in a comment

@codecov
Copy link

codecov bot commented Nov 25, 2025

Codecov Report

❌ Patch coverage is 59.39850% with 54 lines in your changes missing coverage. Please review.
✅ Project coverage is 57.57%. Comparing base (e7b9dee) to head (9e351fc).
⚠️ Report is 11 commits behind head on master.

Files with missing lines Patch % Lines
alpha/template/basic/basic.go 0.00% 29 Missing ⚠️
alpha/template/semver/semver.go 57.69% 11 Missing ⚠️
alpha/template/registry.go 18.18% 9 Missing ⚠️
alpha/template/template.go 94.00% 3 Missing ⚠️
alpha/template/schema.go 88.23% 1 Missing and 1 partial ⚠️
Additional details and impacted files
@@            Coverage Diff             @@
##           master    #1844      +/-   ##
==========================================
+ Coverage   57.52%   57.57%   +0.04%     
==========================================
  Files         136      138       +2     
  Lines       12934    13038     +104     
==========================================
+ Hits         7440     7506      +66     
- Misses       4339     4376      +37     
- Partials     1155     1156       +1     

☔ View full report in Codecov by Sentry.
📢 Have feedback on the report? Share it here.

🚀 New features to boost your workflow:
  • ❄️ Test Analytics: Detect flaky tests, report on failures, and find test suite problems.

Copy link

Copilot AI left a comment

Choose a reason for hiding this comment

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

Pull request overview

This PR refactors the template rendering system to support automatic template type detection based on schema fields, while still allowing explicit type specification. The changes consolidate the previously separate basic and semver subcommands into a unified render-template command that can auto-detect the template type from the input file's schema field.

Key Changes:

  • Introduced a common Template interface and factory pattern for all template types
  • Implemented schema-based auto-detection using a registry system
  • Unified the command structure from separate subcommands to a single command with optional type specification

Reviewed changes

Copilot reviewed 10 out of 10 changed files in this pull request and generated 7 comments.

Show a summary per file
File Description
cmd/opm/alpha/template/cmd.go Replaced separate subcommands with unified render-template command that accepts optional TYPE and FILE arguments
cmd/opm/alpha/template/render.go New file implementing unified rendering logic with auto-detection and explicit type specification support
cmd/opm/alpha/template/basic.go Removed - functionality moved to unified render.go
cmd/opm/alpha/template/semver.go Removed - functionality moved to unified render.go
alpha/template/template.go New file defining Template interface, TemplateFactory interface, and Registry for schema-based template creation
alpha/template/schema.go New file implementing schema detection from YAML/JSON input
alpha/template/basic/basic.go Refactored to implement new Template interface with factory pattern; renamed data struct to BasicTemplateData
alpha/template/semver/semver.go Refactored to implement new Template interface with factory pattern; moved type definitions from types.go and renamed to SemverTemplateData
alpha/template/semver/types.go Removed - content migrated into semver.go
alpha/template/semver/semver_test.go Updated test assertions to use SemverTemplateData and changed to ElementsMatch for order-independent comparison

💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

You can also share your feedback on Copilot code review for a chance to win a $100 gift card. Take the survey.

Copy link

Copilot AI left a comment

Choose a reason for hiding this comment

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

Pull request overview

Copilot reviewed 10 out of 10 changed files in this pull request and generated 8 comments.


💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

You can also share your feedback on Copilot code review for a chance to win a $100 gift card. Take the survey.

Copy link

Copilot AI left a comment

Choose a reason for hiding this comment

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

Pull request overview

Copilot reviewed 12 out of 12 changed files in this pull request and generated 5 comments.


💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

You can also share your feedback on Copilot code review for a chance to win a $100 gift card. Take the survey.

@grokspawn grokspawn force-pushed the template-autodetect branch 2 times, most recently from 745a3f7 to cd4bc48 Compare November 26, 2025 03:49
@grokspawn grokspawn requested a review from perdasilva November 26, 2025 04:14
}

return bt, nil
// RenderBundle implements the template.Template interface
Copy link

Choose a reason for hiding this comment

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

these docs lines are not very much helpful, can you expand for clarity?

"github.com/operator-framework/operator-registry/alpha/declcfg"
)

// BundleRenderer defines the function signature for rendering bundle images
Copy link

Choose a reason for hiding this comment

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

what is the semantic of string arg, what does it contain?

can you expand on the doc as well?

// BundleRenderer defines the function signature for rendering bundle images
type BundleRenderer func(context.Context, string) (*declcfg.DeclarativeConfig, error)

// Template defines the common interface for all template types
Copy link

Choose a reason for hiding this comment

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

please expand on what the template is?


// TemplateRegistry maintains a mapping of schema identifiers to template factories
type TemplateRegistry struct {
factories map[string]TemplateFactory
Copy link

Choose a reason for hiding this comment

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

how about to use set.Set type here?

Copy link
Contributor Author

Choose a reason for hiding this comment

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

We're mapping between the schema identifiers for templates supported by the factory, and the generator function stored in the factory, so a set would only make sense here if our type were self-expressing or we validated fitness characteristics before invoking it, whereas this approach allows us to invoke non-error returns.

Comment on lines +51 to +63
// and returns a reader that can be used to render the template. The returned reader includes
// both the data consumed during schema detection and the remaining unconsumed data.
Copy link

Choose a reason for hiding this comment

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

could returned reader be hidden inside the returned Template instance? can this reader be used independently?

Copy link
Contributor Author

Choose a reason for hiding this comment

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

It could be hidden in the template type, but it's arbitrary. The template is only interested in the reader as an input source, but it isn't inherently a template concern. It's just a general I/O one.

Signed-off-by: grokspawn <[email protected]>
@grokspawn
Copy link
Contributor Author

Thanks for the really detailed review @pedjak! I've included changes which hopefully resolve your concerns and address ambiguity in the PR. Please give it another once over when you have a chance.

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

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants