diff --git a/src/components/aibuddy/assets/AIBuddy.js b/src/components/aibuddy/assets/AIBuddy.js index 1552e9a..74f3580 100644 --- a/src/components/aibuddy/assets/AIBuddy.js +++ b/src/components/aibuddy/assets/AIBuddy.js @@ -39,7 +39,9 @@ function bindAIBuddy(elementId) { event.preventDefault(); makeAIRequest(); } + }); + document.addEventListener('keyup', (event) => { if (event.key === 'Shift') { const currentTime = new Date().getTime(); if (currentTime - lastShiftPress <= doublePressDelay) { diff --git a/src/workflow/DefaultDataPresenter.py b/src/workflow/DefaultDataPresenter.py index 526c893..85928e5 100644 --- a/src/workflow/DefaultDataPresenter.py +++ b/src/workflow/DefaultDataPresenter.py @@ -45,7 +45,7 @@ class DefaultDataPresenter(DataPresenter): mappings[key] = key elif key.endswith(".*"): # all fields in a sub-object - if value != "*": + if value != "*" and value != "": raise ValueError("Only '*' is accepted when renaming wildcard.") obj_path = key[:-2] sub_obj = data.get(obj_path) @@ -86,6 +86,8 @@ class DefaultDataPresenter(DataPresenter): for mapping in self._split_definitions: if "=" in mapping: key, value = [s.strip() for s in mapping.split('=', 1)] + if not value: + value = key.split(".")[-1] mappings[key] = value else: mappings[mapping] = mapping diff --git a/tests/test_default_data_presenter.py b/tests/test_default_data_presenter.py index 0269658..bf28475 100644 --- a/tests/test_default_data_presenter.py +++ b/tests/test_default_data_presenter.py @@ -14,6 +14,18 @@ def test_i_can_present_static_mappings(): assert actual == Expando({"renamed_1": "value1", "field2": "value2"}) # field3 is removed +def test_i_can_present_implicit_renaming(): + mappings_def = "root.field1=" + presenter = DefaultDataPresenter("comp_id", mappings_def) + as_dict = {"root": {"field1": "value1"}} + data = Expando(as_dict) + + actual = presenter.present(data) + + assert isinstance(actual, Expando) + assert actual.as_dict() == {"field1": "value1"} + + def test_the_latter_mappings_take_precedence(): mappings_def = "field1 = renamed_1 , field1 " presenter = DefaultDataPresenter("comp_id", mappings_def) @@ -105,6 +117,23 @@ def test_i_can_present_dynamic_mappings_with_sub_fields_and_renames(): "field4": "value4"} +def test_i_can_present_dynamic_mappings_with_sub_fields_and_implicit_renames(): + mappings_def = "root.sub_field.*=" + presenter = DefaultDataPresenter("comp_id", mappings_def) + as_dict = {"root": {"field1": "value1", + "field2": "value2", + "sub_field": {"field3": "value3", + "field4": "value4" + }}} + data = Expando(as_dict) + + actual = presenter.present(data) + + assert isinstance(actual, Expando) + assert actual.as_dict() == {"field3": "value3", + "field4": "value4"} + + def test_i_can_present_dynamic_mappings_and_rename_them(): mappings_def = "*=*" # does not really have effects as '*' only goes down one level presenter = DefaultDataPresenter("comp_id", mappings_def)