Conditional Translating
The Problem
Sometimes your data will include hints for conditionally translating values. For example, this employee data indicates whether or not a person’s address must be censored in reports:
[
{
"name": "Robert Pringles",
"address": {
"planet": "Earth",
"secret": true
}
},
{
"name": "Daniel Sausage",
"address": {
"planet": "Mars",
"secret": false
}
},
{
"name": "Charlie Marmalade",
"address": {
"planet": "Pluto",
"secret": true
}
}
]
We’ll achieve this by passing a translator into the Address column and interrogating the record’s values to decide whether or not to censor the address.
Code Sample
This code is similar to the Translating example but note that the translator function now interrogates the state.record
to check if the address should be censored before deciding which value to return.
from rolumns import Columns, Source, TranslationState
from rolumns.renderers import RowsRenderer
def censor(state: TranslationState) -> str:
if not state.record["address"]["secret"]:
return state.value
return (
state.value[0]
+ "".join(["*" * (len(state.value) - 2)])
+ state.value[-1]
)
data = [
{
"name": "Robert Pringles",
"address": {
"planet": "Earth",
"secret": True
}
},
{
"name": "Daniel Sausage",
"address": {
"planet": "Mars",
"secret": False
}
},
{
"name": "Charlie Marmalade",
"address": {
"planet": "Pluto",
"secret": True
}
}
]
columns = Columns()
columns.add("Name", "name")
columns.add("Address", Source(path="address.planet", translator=censor))
renderer = RowsRenderer(columns)
rows = renderer.render(data)
print(list(rows))
Result
[['Name', 'Address'],
['Robert Pringles', 'E***h'],
['Daniel Sausage', 'Mars'],
['Charlie Marmalade', 'P***o']]