Using anchors and aliases for transcluded content
Creating an “Array of Dictionaries” table with YAML anchors as row identifiers
---
person_table:
- &person001
fname: homer
lname: simpson
role: dad
age: 33
- &person002
fname: marge
lname: simpson
role: mom
age: 34
- &person003
fname: peter
lname: griffin
role: dad
age: 34
Problem
- developer wishes to express a table structure in YAML, where each row is referenced by a compact row identifier
Solution
- use YAML anchors, by assigning an anchor identifier to each row in the table
- in YAML, reusable “transclusion identifiers” are called anchors and aliases
- in YAML, reusable “transclusion identifiers” consist of alphanumeric tokens preceeded by an ampersand or asterisk
Rationale
- YAML anchors and aliases allow for increased data normalization
- YAML anchors and aliases enforce
DRY
(Don’t repeat yourself) - in this example, a table structure can be designed and preserved which closely coincides with a database
Pitfalls
- YAML anchors must be declared before they can be referenced by aliases
- YAML anchors must be unique throughout the document
- failure to specify unique anchors will cause an error on
yaml.load()
- not all YAML parsers reliably support anchors and aliases
See also
Using YAML aliases to cross-reference rows from a YAML table
---
person_table:
- &person001
fname: homer
lname: simpson
role: dad
age: 33
- &person002
fname: marge
lname: simpson
role: mom
age: 34
- &person003
fname: peter
lname: griffin
role: dad
age: 34
motto_table:
- &motto001
person: *person001
motto: >
D'oh!! YAML is too complicated!
- &motto002
person: *person002
motto: >
Bart! Listen to your father!
- &motto003
person: *person003
motto: >
Hey! YAML is freakin' sweet!
Problem
- developer wishes to cross-reference rows-with-anchors from one table and link to them with rows-as-aliases in another table
Solution
- use YAML aliases, which cross-reference pre-defined anchors from another table
- in YAML, reusable “transclusion identifiers” are called anchors and aliases
- in YAML, reusable “transclusion identifiers” consist of alphanumeric tokens preceeded by an ampersand or asterisk
Rationale
- YAML anchors and aliases allow for increased data normalization
- YAML anchors and aliases enforce
DRY
(Don’t repeat yourself) - in this example, a table structure can be designed and preserved which closely coincides with a database
- in this example, data entry and file sizes can be reduced
Pitfalls
- in this specific example,
yaml.load()
will produce nested dictionaries- this is referred to as the “nested dictionaries problem”
- under the person name-value pair, the value for person will be a sub-dictionary
- this may be undesirable, because it breaks the uniformity of the table structure
- failure to correctly specify aliases will result in missing data
- (typos will create broken cross-references)
- YAML does not support file transclusion by reference, so all aliases and anchors must exist in the same yaml file
- not all YAML parsers reliably support anchors and aliases
See also
Using YAML merge-keys to cross-reference rows from another YAML table
---
person_table:
- &person001
fname: homer
lname: simpson
role: dad
age: 33
- &person002
fname: marge
lname: simpson
role: mom
age: 34
- &person003
fname: peter
lname: griffin
role: dad
age: 34
motto_table:
- &motto001
<<: *person001
motto: >
D'oh!! YAML is too complicated!
- &motto002
<<: *person002
motto: >
Bart! Listen to your father!
- &motto003
<<: *person003
motto: >
Hey! YAML is freakin' sweet!
Problem
- developer wishes to cross-reference rows-with-anchors from one table and link to them with rows-as-aliases in another table
- developer wishes to avoid creating the “nested dictionaries problem”
Solution
- use YAML aliases, with YAML merge keys
- in YAML, reusable “transclusion identifiers” are called anchors and aliases
- in YAML, reusable “transclusion identifiers” consist of alphanumeric tokens preceeded by an ampersand or asterisk
Rationale
- YAML anchors and aliases allow for increased data normalization
- YAML anchors and aliases enforce
DRY
(Don’t repeat yourself) - in this example, a table structure can be designed and preserved which closely coincides with a database
- in this example, data entry and file sizes can be reduced
Pitfalls
- in this specific example,
yaml.load()
will produce nested dictionaries- under the person name-value pair, the value for person will be a sub-dictionary
- this may be undesirable, because it breaks the uniformity of the table structure
- failure to correctly specify aliases will result in missing data
- (typos will create broken cross-references)
- YAML does not support file transclusion by reference, so all aliases and anchors must exist in the same yaml file
- not all YAML parsers reliably support anchors and aliases