Keep global registrations out of item-local composition
This commit is contained in:
@@ -319,7 +319,7 @@ func composeAcquiredInputWithPolicies(input assembledInput, lower collectionPoli
|
||||
if len(scope.contributions) == 1 && scope.contributions[0].role == importRoleMain && scope.contributions[0].pendingItem != nil {
|
||||
main := scope.contributions[0]
|
||||
localScope := cloneAcquisitionScope(*main.pendingItem)
|
||||
if diagnostics := traversal.composePendingItems(&localScope, policy); len(diagnostics) != 0 {
|
||||
if diagnostics := traversal.composePendingItems(&localScope); len(diagnostics) != 0 {
|
||||
return nil, prependCompositionDiagnosticPaths(diagnostics, main.destination.Index(0))
|
||||
}
|
||||
documents := make([]*document.Node, 0, len(localScope.contributions))
|
||||
@@ -405,7 +405,7 @@ func composeAcquiredScopeWithPolicy(
|
||||
accounting: accounting, limits: defaultImportLimits(), rule: rule,
|
||||
versionState: versionState, importGraph: graph.clone(),
|
||||
}
|
||||
if diagnostics := traversal.composePendingItems(scope, policy); len(diagnostics) != 0 {
|
||||
if diagnostics := traversal.composePendingItems(scope); len(diagnostics) != 0 {
|
||||
return nil, diagnostics
|
||||
}
|
||||
documents := make([]*document.Node, 0, len(scope.contributions))
|
||||
@@ -765,22 +765,25 @@ func (s *importTraversal) scheduleAcquisitionScopes(scope *acquisitionScope) {
|
||||
}
|
||||
}
|
||||
|
||||
func (s *importTraversal) composePendingItems(scope *acquisitionScope, policy sequencePolicy) []Diagnostic {
|
||||
func (s *importTraversal) composePendingItems(scope *acquisitionScope) []Diagnostic {
|
||||
for index := range scope.contributions {
|
||||
contribution := &scope.contributions[index]
|
||||
if contribution.pendingItem == nil {
|
||||
continue
|
||||
}
|
||||
itemScope := contribution.pendingItem
|
||||
if diagnostics := s.composePendingItems(itemScope, policy); len(diagnostics) != 0 {
|
||||
if diagnostics := s.composePendingItems(itemScope); len(diagnostics) != 0 {
|
||||
return projectItemDiagnosticPaths(diagnostics, *scope, contribution.destination, index)
|
||||
}
|
||||
documents := make([]*document.Node, 0, len(itemScope.contributions))
|
||||
for _, nested := range itemScope.contributions {
|
||||
documents = append(documents, nested.document)
|
||||
}
|
||||
// An item scope is below a sequence index. Application selectors match
|
||||
// mapping-only effective paths, so none can apply inside this scope.
|
||||
// Its YAML declarations remain relative to the owning record.
|
||||
completed, diagnostics := composeDocumentsWithCollectionPolicy(
|
||||
policy, itemScope.collectionPolicies,
|
||||
sequencePolicy{}, itemScope.collectionPolicies,
|
||||
acquiredSequenceDeclarations(*itemScope), documents...,
|
||||
)
|
||||
if len(diagnostics) != 0 {
|
||||
|
||||
@@ -93,7 +93,7 @@ func TestPendingItemCompositionProjectsNestedIdentityDiagnostics(t *testing.T) {
|
||||
}}}
|
||||
|
||||
traversal := importTraversal{accounting: &importAccounting{}, limits: defaultImportLimits()}
|
||||
diagnostics := traversal.composePendingItems(&outer, sequencePolicy{})
|
||||
diagnostics := traversal.composePendingItems(&outer)
|
||||
if len(diagnostics) != 1 {
|
||||
t.Fatalf("diagnostics = %#v, want one conflict", diagnostics)
|
||||
}
|
||||
@@ -105,7 +105,7 @@ func TestPendingItemCompositionProjectsNestedIdentityDiagnostics(t *testing.T) {
|
||||
}
|
||||
}
|
||||
|
||||
func TestPendingItemCompositionAppliesApplicationIdentityConstraints(t *testing.T) {
|
||||
func TestPendingItemCompositionAppliesOuterApplicationIdentityConstraints(t *testing.T) {
|
||||
t.Parallel()
|
||||
|
||||
itemScope := acquisitionScope{contributions: []acquiredContribution{{
|
||||
@@ -116,15 +116,15 @@ func TestPendingItemCompositionAppliesApplicationIdentityConstraints(t *testing.
|
||||
destination: Keys("items"), pendingItem: &itemScope,
|
||||
}}}
|
||||
policy, diagnostics := compileSequenceIdentityPolicy([]sequenceIdentityRegistration{{
|
||||
selector: sequenceIdentitySelector{literalSequenceSelector("prompts")}, identityFields: []string{"id"},
|
||||
selector: sequenceIdentitySelector{literalSequenceSelector("items")}, identityFields: []string{"id"},
|
||||
}})
|
||||
if len(diagnostics) != 0 {
|
||||
t.Fatalf("compile application identity: %#v", diagnostics)
|
||||
}
|
||||
|
||||
traversal := importTraversal{accounting: &importAccounting{}, limits: defaultImportLimits()}
|
||||
diagnostics = traversal.composePendingItems(&outer, policy)
|
||||
if len(diagnostics) != 1 || diagnostics[0].Code != CodeComposeInvalid || diagnostics[0].Path.String() != "/items/0/prompts/0/id" {
|
||||
_, diagnostics = composeAcquiredScopeWithPolicy(&outer, collectionPolicyScope{}, policy,
|
||||
newImportInclusionGraph(), nil, nil, nil, &importAccounting{})
|
||||
if len(diagnostics) != 1 || diagnostics[0].Code != CodeComposeInvalid || diagnostics[0].Path.String() != "/items/0/id" {
|
||||
t.Fatalf("application identity diagnostics = %#v", diagnostics)
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user