Skip to content

Commit 880d0cd

Browse files
dmealingclaude
andcommitted
refactor: pre-merge review — lift inlined metamodel strings to named constants
CLAUDE.md rule: "Named constants for metamodel strings — always." The review surfaced six call sites with inline literals that already had (or warranted) constants: Python: - Add IDENTITY_ATTR_UNIQUE to identity_constants.py - Add FIELD_ATTR_COLUMN to field_constants.py (cross-port; @column is the renamed-from-@dbColumn physical-name attr per CLAUDE.md) - expected_schema.py: child.attr(ic.IDENTITY_ATTR_UNIQUE), field.attr(fc.FIELD_ATTR_COLUMN) - expected_views.py: import field_constants; use FIELD_ATTR_COLUMN - object_manager.py: import field+identity constants; pi.attr(ic.IDENTITY_ATTR_FIELDS), field.attr(fc.FIELD_ATTR_COLUMN) Java: - MetaRoot.java + MetaObject.java: use MetaLayout.TYPE_LAYOUT instead of the literal "layout" Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
1 parent faeac88 commit 880d0cd

6 files changed

Lines changed: 13 additions & 6 deletions

File tree

server/java/metadata/src/main/java/com/metaobjects/MetaRoot.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -76,7 +76,7 @@ public class MetaRoot extends MetaData {
7676
.optionalChild(MetaView.TYPE_VIEW, "*", "*") // Any view type
7777
.optionalChild(com.metaobjects.identity.MetaIdentity.TYPE_IDENTITY, "*", "*") // Any identity type
7878
.optionalChild(com.metaobjects.relationship.MetaRelationship.TYPE_RELATIONSHIP, "*", "*") // Any relationship type
79-
.optionalChild("layout", "*", "*") // Any layout type (root-level shared layouts)
79+
.optionalChild(com.metaobjects.layout.MetaLayout.TYPE_LAYOUT, "*", "*") // Any layout type (root-level shared layouts)
8080
.optionalChild(com.metaobjects.template.TemplateConstants.TYPE_TEMPLATE, "*", "*") // Any template type (FR-004)
8181
);
8282
// ADR-0006 Rule 1 — bare `metadata:` YAML key fuses to `metadata.root`.
@@ -106,7 +106,7 @@ public static void registerTypes(MetaDataRegistry registry) {
106106
.optionalChild(MetaView.TYPE_VIEW, "*", "*")
107107
.optionalChild(com.metaobjects.identity.MetaIdentity.TYPE_IDENTITY, "*", "*")
108108
.optionalChild(com.metaobjects.relationship.MetaRelationship.TYPE_RELATIONSHIP, "*", "*")
109-
.optionalChild("layout", "*", "*")
109+
.optionalChild(com.metaobjects.layout.MetaLayout.TYPE_LAYOUT, "*", "*")
110110
.optionalChild(com.metaobjects.template.TemplateConstants.TYPE_TEMPLATE, "*", "*")
111111
);
112112
} catch (Exception e) {

server/java/metadata/src/main/java/com/metaobjects/object/MetaObject.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
import com.metaobjects.identity.MetaIdentity;
1212
import com.metaobjects.identity.PrimaryIdentity;
1313
import com.metaobjects.identity.SecondaryIdentity;
14+
import com.metaobjects.layout.MetaLayout;
1415
import com.metaobjects.relationship.MetaRelationship;
1516
import com.metaobjects.registry.MetaDataRegistry;
1617
import com.metaobjects.source.MetaSource;
@@ -119,7 +120,7 @@ public static void registerTypes(MetaDataRegistry registry) {
119120
def.optionalChild(MetaView.TYPE_VIEW, "*", "*");
120121

121122
// OBJECTS CAN CONTAIN LAYOUTS (layout.dataGrid and future subtypes)
122-
def.optionalChild("layout", "*", "*");
123+
def.optionalChild(MetaLayout.TYPE_LAYOUT, "*", "*");
123124

124125
// OBJECTS CAN CONTAIN RELATIONSHIPS
125126
def.optionalChild(MetaRelationship.TYPE_RELATIONSHIP, "*", "*");

server/python/src/metaobjects/meta/core/field/field_constants.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,8 @@
4242
# Persistence-side storage shape for owned field.object data. Cross-port values.
4343
FIELD_ATTR_STORAGE = "storage"
4444
STORAGE_VALUES = ("flattened", "jsonb", "subdocument")
45+
# Physical column name override (cross-port; renamed from @dbColumn).
46+
FIELD_ATTR_COLUMN = "column"
4547

4648
# Regex pattern for enum member symbols — must be identifier-safe.
4749
# Cross-language contract: every port enforces this pattern.

server/python/src/metaobjects/meta/core/identity/identity_constants.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66

77
IDENTITY_ATTR_FIELDS = "fields"
88
IDENTITY_ATTR_GENERATION = "generation"
9+
IDENTITY_ATTR_UNIQUE = "unique"
910

1011
# Allowed values for @generation on identity.primary
1112
GENERATION_INCREMENT = "increment"

server/python/src/metaobjects/migrate/expected_views.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
from ..meta.core.identity.meta_identity import MetaIdentity
1616
from ..meta.core.identity import identity_constants as ic
1717
from ..meta.core.field.meta_field import MetaField
18+
from ..meta.core.field import field_constants as fc
1819
from ..meta.core.relationship.meta_relationship import MetaRelationship
1920
from ..meta.persistence.source.meta_source import MetaSource
2021
from ..meta.persistence.source import source_constants as sc
@@ -185,7 +186,7 @@ def _identity_fields(identity: MetaIdentity) -> tuple[str, ...]:
185186

186187

187188
def _column_of(field: MetaField) -> str:
188-
col = field.attr("column")
189+
col = field.attr(fc.FIELD_ATTR_COLUMN)
189190
return col if isinstance(col, str) and col else field.name
190191

191192

server/python/src/metaobjects/runtime/object_manager.py

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,8 @@
2121
from ..meta.meta_root import MetaRoot
2222
from ..meta.core.object.meta_object import MetaObject
2323
from ..meta.core.field.meta_field import MetaField
24+
from ..meta.core.field import field_constants as fc
25+
from ..meta.core.identity import identity_constants as ic
2426
from ..meta.persistence.source.meta_source import MetaSource
2527
from ..meta.persistence.source import source_constants as sc
2628

@@ -160,7 +162,7 @@ def _primary_pk_field(self, entity: MetaObject) -> str:
160162
pi = entity.primary_identity()
161163
if pi is None:
162164
raise ValueError(f"Entity '{entity.name}' has no primary identity")
163-
raw = pi.attr("fields")
165+
raw = pi.attr(ic.IDENTITY_ATTR_FIELDS)
164166
if isinstance(raw, str):
165167
return raw
166168
if isinstance(raw, (list, tuple)) and raw:
@@ -234,7 +236,7 @@ def _op_clause(col: str, op: str, value: Any) -> tuple[str, list[Any]]:
234236
def _column_of(field: MetaField | None) -> str:
235237
if field is None:
236238
return ""
237-
col = field.attr("column")
239+
col = field.attr(fc.FIELD_ATTR_COLUMN)
238240
return col if isinstance(col, str) and col else field.name
239241

240242

0 commit comments

Comments
 (0)