-
Couldn't load subscription status.
- Fork 0
Add portable metaobject definitions and references to Shopify Toolkit schema dump #25
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
base: main
Are you sure you want to change the base?
Conversation
Convert metaobject definition IDs to types in schema dumps to make them
portable across different Shopify stores. Store-specific GIDs are now
replaced with metaobject types that can be resolved in any store.
Changes:
- Add get_metaobject_definition_type_by_gid() method to resolve GIDs to types
- Update schema dump to convert metaobject_definition_id validations to metaobject_definition_type
- Enhance create_metafield and update_metafield to resolve types back to GIDs
- Add precise validation matching for metaobject reference fields only
- Support both single and array values for list.metaobject_reference fields
- Include MetaobjectStatements in Schema module for type resolution
Before:
create_metafield :products, :color, :metaobject_reference,
validations: [{name: "metaobject_definition_id", value: "gid://shopify/MetaobjectDefinition/123"}]
After:
create_metafield :products, :color, :metaobject_reference,
validations: [{name: "metaobject_definition_type", value: "color_pattern"}]
This enables schema files to be shared between different Shopify stores
without manual ID updates, as long as the metaobject types exist.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Pull Request Overview
Adds support for including metaobject definitions and portable metaobject reference validations in the schema dump to enable cross-store portability.
- Introduces dumping of metaobject definitions before metafields.
- Converts metaobject definition GID-based validations to portable type-based validations in both dump and load paths.
- Adds bidirectional conversion logic (GIDs <-> types) and associated tests for one direction.
Reviewed Changes
Copilot reviewed 4 out of 4 changed files in this pull request and generated 5 comments.
| File | Description |
|---|---|
| spec/shopify_toolkit/schema_spec.rb | Adds test fixtures and specs for dumping metaobject definitions and converting validations from GIDs to types. |
| lib/shopify_toolkit/schema.rb | Adds metaobject fetching, schema generation with metaobjects, validation conversion, and type detection helpers. |
| lib/shopify_toolkit/metaobject_statements.rb | Adds helper to resolve a metaobject type from a GID for reverse validation conversion. |
| lib/shopify_toolkit/metafield_statements.rb | Adds conversion from metaobject types back to GIDs when creating/updating metafields, plus duplicate type check logic. |
Tip: Customize your code reviews with copilot-instructions.md. Create the file or learn how to get started.
| expected_schema = | ||
| ( | ||
| if RUBY_VERSION.to_f < 3.4 | ||
| SCHEMA_FIXTURE_BEFORE_RUBY_3_4 | ||
| else | ||
| SCHEMA_FIXTURE | ||
| end | ||
| ) |
Copilot
AI
Oct 15, 2025
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Version comparison using RUBY_VERSION.to_f is unsafe for multi-digit minor versions (e.g. '3.10' becomes 3.1). Use Gem::Version: if Gem::Version.new(RUBY_VERSION) < Gem::Version.new('3.4') instead.
| # Process validations to convert metaobject types to GIDs (only for metaobject reference fields) | ||
| if options[:validations] && is_metaobject_reference_type?(type) | ||
| options[:validations] = convert_validations_types_to_gids(options[:validations]) | ||
| end | ||
|
|
||
| # Skip creation if metafield already exists | ||
| if get_metafield_gid(owner_type, key, namespace: namespace) |
Copilot
AI
Oct 15, 2025
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Validation conversion occurs before the existence check; if the metafield already exists and a referenced metaobject type is missing, this can raise unnecessarily. Move the conversion logic after the early-return existence check.
| # Process validations to convert metaobject types to GIDs (only for metaobject reference fields) | ||
| if options[:validations] && options[:type] && is_metaobject_reference_type?(options[:type]) | ||
| options[:validations] = convert_validations_types_to_gids(options[:validations]) | ||
| end | ||
|
|
||
| unless get_metafield_gid(owner_type, key, namespace: namespace) | ||
| say "Metafield #{namespace}:#{key} not found for #{owner_type}, skipping update" |
Copilot
AI
Oct 15, 2025
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Validation conversion (which can raise on missing types) is performed before confirming the metafield exists. Move the conversion inside the branch after the existence check to avoid unnecessary errors when skipping.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I think some of the copilot suggestions for extraction could make sense, but feel free to postpone them to the future
There was a problem hiding this 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 6 out of 6 changed files in this pull request and generated 2 comments.
Tip: Customize your code reviews with copilot-instructions.md. Create the file or learn how to get started.
3eb2ee9 to
5bfb288
Compare
There was a problem hiding this 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 6 out of 6 changed files in this pull request and generated 6 comments.
Tip: Customize your code reviews with copilot-instructions.md. Create the file or learn how to get started.
Add support for dumping metaobject definitions in schema files with portable
cross-store references. Metaobjects are now included before metafields in
the schema dump output.
Changes:
- Add fetch_metaobject_definitions() method to retrieve metaobject schema
- Include create_metaobject_definition calls in schema dump output
- Convert metaobject references within metaobject fields to portable types
- Update schema dump header to mention metaobjects
- Order metaobjects before metafields in dump output
- Handle metaobject field definitions, access controls, and capabilities
- Skip default values (required: false, empty descriptions) for cleaner output
Schema now generates:
create_metaobject_definition :color_pattern,
name: "Color Pattern",
field_definitions: [{key: :name, type: :single_line_text_field, ...}],
access: {admin: true, storefront: false}
create_metafield :products, :color, :metaobject_reference,
validations: [{name: "metaobject_definition_type", value: "color_pattern"}]
This completes the portable schema dump feature by including both
metaobjects and metafields with cross-store compatible references.
Separates the parsing of metaobjects and metafields schema definition
Extracts frequently used methods for handling metaobjects into a shared module.
Updates the metaobject creation logic to correctly handle and process metaobject reference fields
Updates the schema dump functionality to accept and process multiple metaobject_definition_ids
5bfb288 to
3aede8b
Compare
There was a problem hiding this 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 6 out of 6 changed files in this pull request and generated 5 comments.
Tip: Customize your code reviews with copilot-instructions.md. Create the file or learn how to get started.
| def convert_validations_gids_to_types(validations, metafield_type) | ||
| return validations unless validations&.any? && is_metaobject_reference_type?(metafield_type) | ||
|
|
||
| validations.filter_map do |validation| | ||
| convert_metaobject_validation_to_type(validation) | ||
| end | ||
| end | ||
|
|
||
| private |
Copilot
AI
Oct 23, 2025
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
[nitpick] The convert_validations_gids_to_types method is marked as public but convert_metaobject_validation_to_type and related helper methods are private. This creates an inconsistent API where public methods depend on private implementation details. Consider making this method private as well since it appears to be an internal helper called by generate_schema_content.
| type = get_metaobject_definition_type_by_gid(gid) | ||
|
|
||
| if type.nil? | ||
| puts "Warning: Metafield validation references unknown metaobject GID #{gid} - excluding from portable schema" |
Copilot
AI
Oct 23, 2025
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Direct use of puts bypasses the Rails logger. Use logger.warn instead for consistency with the rest of the codebase and proper log level handling.
| puts "Warning: Metafield validation references unknown metaobject GID #{gid} - excluding from portable schema" | |
| logger.warn "Metafield validation references unknown metaobject GID #{gid} - excluding from portable schema" |
| "# GraphQL | ||
| query GetMetaobjectDefinitionID($type: String!) { | ||
| metaobjectDefinitionByType(type: $type) { | ||
| id | ||
| } | ||
| }", |
Copilot
AI
Oct 23, 2025
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
The comment # GraphQL should be inside the string as part of the GraphQL query, not a Ruby comment. Change to \"query GetMetaobjectDefinitionID($type: String!) { without the # GraphQL prefix.
| "# GraphQL | ||
| query GetMetaobjectDefinitionType($id: ID!) { | ||
| metaobjectDefinition(id: $id) { | ||
| type | ||
| } | ||
| }", |
Copilot
AI
Oct 23, 2025
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
The comment # GraphQL should be inside the string as part of the GraphQL query, not a Ruby comment. Change to \"query GetMetaobjectDefinitionType($id: ID!) { without the # GraphQL prefix.
Description
This PR implements support for dumping Shopify Metaobject definitions and references in the schema files, enabling schema portability across different Shopify stores.
Key Enhancements
Metaobject Definitions Dump
fetch_metaobject_definitions()to retrieve metaobject schemas.create_metaobject_definitioncalls in the schema dump output.Portable References
metaobject_definition_id) to portable metaobject types (metaobject_definition_type) in schema dumps.list.metaobject_referencefields.Example Before
Example After
With this update, schema files can be shared between stores without manual ID changes, as long as the relevant metaobject types exist.