diff --git a/deckhand/control/revision_documents.py b/deckhand/control/revision_documents.py index e4309d4d..e590213b 100644 --- a/deckhand/control/revision_documents.py +++ b/deckhand/control/revision_documents.py @@ -113,7 +113,8 @@ class RenderedDocumentsResource(api_base.BaseResource): # been pre-validated during ingestion. Documents are post-validated # below, regardless. document_layering = layering.DocumentLayering( - documents, substitution_sources, validate=False) + documents, substitution_sources=substitution_sources, + validate=False) rendered_documents = document_layering.render() except (errors.InvalidDocumentLayer, errors.InvalidDocumentParent, diff --git a/deckhand/engine/document_wrapper.py b/deckhand/engine/document_wrapper.py index b1e6dc60..a7970d8e 100644 --- a/deckhand/engine/document_wrapper.py +++ b/deckhand/engine/document_wrapper.py @@ -39,15 +39,18 @@ class DocumentDict(dict): @property def schema(self): - return self.get('schema') or '' + schema = self.get('schema') + return schema if schema is not None else '' @property def metadata(self): - return self.get('metadata') or {} + metadata = self.get('metadata') + return metadata if metadata is not None else {} @property def data(self): - return self.get('data') or {} + data = self.get('data') + return data if data is not None else {} @data.setter def data(self, value): diff --git a/deckhand/tests/functional/gabbits/chained-substitution.yaml b/deckhand/tests/functional/gabbits/chained-substitution.yaml new file mode 100644 index 00000000..cacdc41a --- /dev/null +++ b/deckhand/tests/functional/gabbits/chained-substitution.yaml @@ -0,0 +1,51 @@ +# Tests to verify "chained" substitution from document A -> B -> C +# +# 1. Purges existing data to ensure test isolation +# 2. Creates a new revision with documents in it. +# 3. Verifies first substitution (A -> B) +# 4. Verifies second substitution (B -> C) + +defaults: + request_headers: + content-type: application/x-yaml + response_headers: + content-type: application/x-yaml + +tests: + - name: purge + desc: Begin testing from known state. + DELETE: /api/v1.0/revisions + status: 204 + response_headers: null + + - name: create + desc: Create documents. + PUT: /api/v1.0/buckets/mop/documents + status: 200 + data: <@resources/chained-substitution.yaml + + - name: verify_intermediate_substitution + desc: Check for chained substitution + GET: /api/v1.0/revisions/$RESPONSE['$.[0].status.revision']/rendered-documents + query_parameters: + sort: schema + status: 200 + query_parameters: + schema: example/Middle/v1 + response_multidoc_jsonpaths: + $.`len`: 1 + $.[0].data: + mid_key: original-data + + - name: verify_final_substitution + desc: Check for chained substitution + GET: /api/v1.0/revisions/$RESPONSE['$.[0].status.revision']/rendered-documents + query_parameters: + sort: schema + status: 200 + query_parameters: + schema: example/Dest/v1 + response_multidoc_jsonpaths: + $.`len`: 1 + $.[0].data: + dest_key: original-data diff --git a/deckhand/tests/functional/gabbits/resources/chained-substitution.yaml b/deckhand/tests/functional/gabbits/resources/chained-substitution.yaml new file mode 100644 index 00000000..6e159e1b --- /dev/null +++ b/deckhand/tests/functional/gabbits/resources/chained-substitution.yaml @@ -0,0 +1,50 @@ +--- +schema: deckhand/LayeringPolicy/v1 +metadata: + schema: metadata/Control/v1 + name: layering-policy +data: + layerOrder: + - one +--- +schema: example/Source/v1 +metadata: + schema: metadata/Document/v1 + name: source + layeringDefinition: + abstract: false + layer: one +data: original-data +--- +schema: example/Middle/v1 +metadata: + schema: metadata/Document/v1 + name: middle + layeringDefinition: + abstract: false + layer: one + substitutions: + - src: + schema: example/Source/v1 + name: source + path: . + dest: + path: .mid_key +data: {} +--- +schema: example/Dest/v1 +metadata: + schema: metadata/Document/v1 + name: dest + layeringDefinition: + abstract: false + layer: one + substitutions: + - src: + schema: example/Middle/v1 + name: middle + path: .mid_key + dest: + path: .dest_key +data: {} +...