Skip to content

Commit 9c4fc4c

Browse files
authored
[1.x] Nest as for foreign reuse (#960) (#962)
1 parent 357ce24 commit 9c4fc4c

File tree

3 files changed

+40
-2
lines changed

3 files changed

+40
-2
lines changed

CHANGELOG.next.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,8 @@ Thanks, you're awesome :-) -->
3030

3131
#### Bugfixes
3232

33+
* Addressed issue where foreign reuses weren't using the user-supplied `as` value for their destination. #960
34+
3335
#### Added
3436

3537
#### Improvements

scripts/schema/finalizer.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -57,17 +57,19 @@ def perform_reuse(fields):
5757
schema = fields[schema_name]
5858
for reuse_entry in reuse_entries:
5959
# print(order, "{} => {}".format(schema_name, reuse_entry['full']))
60+
nest_as = reuse_entry['as']
6061
destination_schema_name = reuse_entry['full'].split('.')[0]
6162
destination_schema = fields[destination_schema_name]
6263
ensure_valid_reuse(schema, destination_schema)
6364

6465
new_field_details = copy.deepcopy(schema['field_details'])
66+
new_field_details['name'] = nest_as
6567
new_field_details['original_fieldset'] = schema_name
6668
new_field_details['intermediate'] = True
6769
reused_fields = copy.deepcopy(schema['fields'])
6870
set_original_fieldset(reused_fields, schema_name)
6971
destination_fields = field_group_at_path(reuse_entry['at'], fields)
70-
destination_fields[schema_name] = {
72+
destination_fields[nest_as] = {
7173
'field_details': new_field_details,
7274
'fields': reused_fields,
7375
}

scripts/tests/unit/test_schema_finalizer.py

Lines changed: 35 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,8 @@ def schema_process(self):
4747
'order': 2,
4848
'expected': [
4949
{'full': 'process.parent', 'at': 'process', 'as': 'parent'},
50+
{'full': 'reuse.process', 'at': 'reuse', 'as': 'process'},
51+
{'full': 'reuse.process.parent', 'at': 'reuse.process', 'as': 'parent'},
5052
]
5153
}
5254
},
@@ -143,30 +145,57 @@ def schema_server(self):
143145
}
144146
}
145147

148+
def schema_process_reuse(self):
149+
return {
150+
'reuse': {
151+
'schema_details': {
152+
'title': 'Reuse',
153+
'root': False
154+
},
155+
'field_details': {
156+
'name': 'Reuse',
157+
'node_name': 'Reuse',
158+
'short': 'reuse example',
159+
},
160+
'fields': {
161+
'pid': {
162+
'field_details': {
163+
'name': 'pid',
164+
'node_name': 'pid',
165+
}
166+
}
167+
}
168+
}
169+
}
170+
146171
# perform_reuse
147172

148173
def test_perform_reuse_with_foreign_reuse_and_self_reuse(self):
149-
fields = {**self.schema_user(), **self.schema_server(), **self.schema_process()}
174+
fields = {**self.schema_user(), **self.schema_server(), **self.schema_process(), **self.schema_process_reuse()}
150175
# If the test had multiple foreign destinations for user fields, we could compare them together instead
151176
finalizer.perform_reuse(fields)
152177
process_fields = fields['process']['fields']
153178
server_fields = fields['server']['fields']
154179
user_fields = fields['user']['fields']
180+
process_reuse_fields = fields['reuse']['fields']['process']['fields']
155181
# Expected reuse
156182
self.assertIn('parent', process_fields)
157183
self.assertIn('user', server_fields)
158184
self.assertIn('target', user_fields)
159185
self.assertIn('effective', user_fields)
186+
self.assertIn('parent', process_reuse_fields)
160187
# Sanity check for presence of leaf fields, after performing reuse
161188
self.assertIn('name', user_fields['target']['fields'])
162189
self.assertIn('name', user_fields['effective']['fields'])
163190
self.assertIn('name', server_fields['user']['fields'])
164191
self.assertIn('pid', process_fields['parent']['fields'])
192+
self.assertIn('pid', process_reuse_fields['parent']['fields'])
165193
# Ensure the parent field of reused fields is marked as intermediate
166194
self.assertTrue(server_fields['user']['field_details']['intermediate'])
167195
self.assertTrue(process_fields['parent']['field_details']['intermediate'])
168196
self.assertTrue(user_fields['target']['field_details']['intermediate'])
169197
self.assertTrue(user_fields['effective']['field_details']['intermediate'])
198+
self.assertTrue(process_reuse_fields['parent']['field_details']['intermediate'])
170199
# No unexpected cross-nesting
171200
self.assertNotIn('target', user_fields['target']['fields'])
172201
self.assertNotIn('target', user_fields['effective']['fields'])
@@ -176,6 +205,7 @@ def test_perform_reuse_with_foreign_reuse_and_self_reuse(self):
176205
self.assertIn('user.effective', fields['user']['schema_details']['nestings'])
177206
self.assertIn('user.target', fields['user']['schema_details']['nestings'])
178207
self.assertIn('server.user', fields['server']['schema_details']['nestings'])
208+
self.assertIn('reuse.process.parent', fields['reuse']['schema_details']['nestings'])
179209
# Attribute 'reused_here' lists nestings inside a destination schema
180210
self.assertIn({'full': 'process.parent', 'schema_name': 'process', 'short': 'short desc'},
181211
fields['process']['schema_details']['reused_here'])
@@ -185,6 +215,8 @@ def test_perform_reuse_with_foreign_reuse_and_self_reuse(self):
185215
fields['user']['schema_details']['reused_here'])
186216
self.assertIn({'full': 'server.user', 'schema_name': 'user', 'short': 'short desc'},
187217
fields['server']['schema_details']['reused_here'])
218+
self.assertIn({'full': 'reuse.process.parent', 'schema_name': 'process', 'short': 'short desc'},
219+
fields['reuse']['schema_details']['reused_here'])
188220
# Reused fields have an indication they're reused
189221
self.assertEqual(process_fields['parent']['field_details']['original_fieldset'], 'process',
190222
"The parent field of reused fields should have 'original_fieldset' populated")
@@ -193,6 +225,8 @@ def test_perform_reuse_with_foreign_reuse_and_self_reuse(self):
193225
self.assertEqual(server_fields['user']['field_details']['original_fieldset'], 'user',
194226
"The parent field of foreign reused fields should have 'original_fieldset' populated")
195227
self.assertEqual(server_fields['user']['fields']['name']['field_details']['original_fieldset'], 'user')
228+
self.assertEqual(process_reuse_fields['parent']['field_details']['original_fieldset'], 'process',
229+
"The parent field of reused fields should have 'original_fieldset' populated")
196230
# Original fieldset's fields must not be marked with 'original_fieldset='
197231
self.assertNotIn('original_fieldset', user_fields['name']['field_details'])
198232
self.assertNotIn('original_fieldset', process_fields['pid']['field_details'])

0 commit comments

Comments
 (0)