mirror of
https://github.com/gristlabs/grist-core.git
synced 2024-10-27 20:44:07 +00:00
(core) Fix bug with column renames when using **kwargs with lookupOne or lookupRecords.
Summary: Presence of **kwargs syntax led to a Python error when handling column renames. This change fixes it by ignoring **kwargs in lookup methods. Test Plan: Added a test case Reviewers: jarek Reviewed By: jarek Differential Revision: https://phab.getgrist.com/D4247
This commit is contained in:
parent
5c35501654
commit
3fc221f3e2
@ -433,7 +433,7 @@ def parse_grist_names(builder):
|
||||
func = node.parent.func
|
||||
if isinstance(func, astroid.nodes.Attribute) and func.attrname in _lookup_method_names:
|
||||
obj = infer(func.expr)
|
||||
if _is_table(obj):
|
||||
if _is_table(obj) and node.arg is not None: # Skip **kwargs, which have arg value of None
|
||||
start = atok.get_text_range(node)[0]
|
||||
end = start + len(node.arg)
|
||||
if code_text[start:end] == node.arg:
|
||||
|
@ -446,3 +446,73 @@ class TestRenames(test_engine.EngineTestCase):
|
||||
[13, "New Haven", people_rec(2), "Alice"],
|
||||
[14, "West Haven", people_rec(0), ""],
|
||||
])
|
||||
|
||||
def test_rename_lookup_kwargs(self):
|
||||
# Renaming causes no errors for `Table.lookupOne(**kwargs)` and for `.lookupRecords`. We can't
|
||||
# rename, but we test that this syntax does not cause errors.
|
||||
self.load_sample(self.sample)
|
||||
self.add_column("Address", "people", formula=(
|
||||
"args={'addr': $id}\n" +
|
||||
"People.lookupOne(city=$city, **args)"
|
||||
))
|
||||
self.add_column("Address", "people2", formula="People.lookupRecords(**{'addr': $id})")
|
||||
|
||||
# Verify the data, to make sure we got these formulas right, and that they still work later.
|
||||
people_table = self.engine.tables['People']
|
||||
people_rec = people_table.Record
|
||||
people_recset = people_table.RecordSet
|
||||
expected_data = [
|
||||
["id", "city", "people", "people2"],
|
||||
[11, "New York", people_rec(4), people_recset([4])],
|
||||
[12, "Colombia", people_rec(1), people_recset([1, 3])],
|
||||
[13, "New Haven", people_rec(2), people_recset([2])],
|
||||
[14, "West Haven", people_rec(0), people_recset([])],
|
||||
]
|
||||
|
||||
self.assertTableData("Address", cols="all", data=expected_data)
|
||||
|
||||
out_actions = self.apply_user_action(["RenameColumn", "People", "addr", "ADDRESS"])
|
||||
# The new formulas aren't affected but cause no errors on rename.
|
||||
self.assertPartialOutActions(out_actions, { "stored": [
|
||||
["RenameColumn", "People", "addr", "ADDRESS"],
|
||||
["ModifyColumn", "People", "city", {"formula": "$ADDRESS.city"}],
|
||||
["BulkUpdateRecord", "_grist_Tables_column", [23, 24], {
|
||||
"colId": ["ADDRESS", "city"],
|
||||
"formula": ["", "$ADDRESS.city"]
|
||||
}],
|
||||
# But since the new formulas aren't affected, we get errors in the cells, as expected.
|
||||
["BulkUpdateRecord", "Address", [11, 12, 13, 14],
|
||||
{"people": [["E", "KeyError"], ["E", "KeyError"], ["E", "KeyError"], ["E", "KeyError"]]}],
|
||||
["BulkUpdateRecord", "Address", [11, 12, 13, 14],
|
||||
{"people2": [["E", "KeyError"], ["E", "KeyError"], ["E", "KeyError"], ["E", "KeyError"]]}],
|
||||
]})
|
||||
|
||||
# Let's fix the cell errors to make the next check more meaningful.
|
||||
self.modify_column("Address", "people", formula=(
|
||||
"args={'ADDRESS': $id}\n" +
|
||||
"People.lookupOne(city=$city, **args)"
|
||||
))
|
||||
self.modify_column("Address", "people2", formula="People.lookupRecords(**{'ADDRESS': $id})")
|
||||
|
||||
# Data should again be correct.
|
||||
self.assertTableData("Address", cols="all", data=expected_data)
|
||||
|
||||
# Another rename that should affect the regular keyword argument.
|
||||
out_actions = self.apply_user_action(["RenameColumn", "People", "city", "ciudad"])
|
||||
self.assertPartialOutActions(out_actions, { "stored": [
|
||||
["RenameColumn", "People", "city", "ciudad"],
|
||||
["ModifyColumn", "Address", "people", {"formula": (
|
||||
"args={'ADDRESS': $id}\n" +
|
||||
"People.lookupOne(ciudad=$city, **args)"
|
||||
)}],
|
||||
["BulkUpdateRecord", "_grist_Tables_column", [24, 25], {
|
||||
"colId": ["ciudad", "people"],
|
||||
"formula": ["$ADDRESS.city", (
|
||||
"args={'ADDRESS': $id}\n" +
|
||||
"People.lookupOne(ciudad=$city, **args)"
|
||||
)]
|
||||
}],
|
||||
]})
|
||||
|
||||
# Data should again be correct.
|
||||
self.assertTableData("Address", cols="all", data=expected_data)
|
||||
|
Loading…
Reference in New Issue
Block a user