)]}'
{"/PATCHSET_LEVEL":[{"author":{"_account_id":9816,"name":"Takashi Kajinami","email":"kajinamit@oss.nttdata.com","username":"kajinamit"},"change_message_id":"d9ab8f1a091e39f168c5f19030a449986869a78f","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":2,"id":"5901714a_4603902f","updated":"2025-02-03 11:41:52.000000000","message":"The overall direction looks good. A few suggestions inline.","commit_id":"1265788a83a035a1e7237a4f562d78466cb9a1fe"},{"author":{"_account_id":16137,"name":"Tobias Urdin","email":"tobias.urdin@binero.com","username":"tobasco"},"change_message_id":"4dcf03f9666b5d8dfc97a3490ccdc7b9694dc3fa","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":3,"id":"451ca288_7c63c8a6","updated":"2025-02-07 08:31:40.000000000","message":"Thanks! Updated based on your recommendations","commit_id":"aa1f012c21d4033afbec05fd06c114dc161c668e"},{"author":{"_account_id":16137,"name":"Tobias Urdin","email":"tobias.urdin@binero.com","username":"tobasco"},"change_message_id":"0df0424b03fe9fa4b4b045b10b268b89491b0fea","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":4,"id":"aa7f3221_86a632d2","updated":"2025-02-27 10:04:23.000000000","message":"Thanks! updated based on your feedback","commit_id":"26b19a7dc9aace1bf26fbca020263cd99c5a3a23"},{"author":{"_account_id":28522,"name":"Hervé Beraud","email":"herveberaud.pro@gmail.com","username":"hberaud"},"change_message_id":"c0f169b24151551509ab73f7e6f8bda8bda96def","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":5,"id":"8eb61ec3_e46d798e","updated":"2025-05-06 09:19:40.000000000","message":"I\u0027d suggest to add a release note, but it could be done with a follow up patch, else LGTM","commit_id":"a5b7323fa4b2af13f4349d775c7ac5a3e111cda1"}],"taskflow/formatters.py":[{"author":{"_account_id":9816,"name":"Takashi Kajinami","email":"kajinamit@oss.nttdata.com","username":"kajinamit"},"change_message_id":"b5c05eb4438e2eeef602a78e22d650c3d14eeb26","unresolved":true,"context_lines":[{"line_number":74,"context_line":"    def _handle_outputs_keys(self, data):"},{"line_number":75,"context_line":"        if not isinstance(data, dict) or len(self._hide_outputs_keys) \u003d\u003d 0:"},{"line_number":76,"context_line":"            return data"},{"line_number":77,"context_line":""},{"line_number":78,"context_line":"        for k in self._hide_outputs_keys:"},{"line_number":79,"context_line":"            if k in data:"},{"line_number":80,"context_line":"                data[k] \u003d \u0027***\u0027"}],"source_content_type":"text/x-python","patch_set":1,"id":"2951042d_f2b798ca","line":77,"updated":"2024-10-23 11:17:59.000000000","message":"Should we create a copied instance by `dict(data)` or `copy.deepcopy(data)` to avid manipulating the original instance ?","commit_id":"3a2c28441e5017011b740a840fcc2bbfe785ac67"},{"author":{"_account_id":16137,"name":"Tobias Urdin","email":"tobias.urdin@binero.com","username":"tobasco"},"change_message_id":"2e962764a036c9d2a5c428c8724a1e09bdbcc902","unresolved":false,"context_lines":[{"line_number":74,"context_line":"    def _handle_outputs_keys(self, data):"},{"line_number":75,"context_line":"        if not isinstance(data, dict) or len(self._hide_outputs_keys) \u003d\u003d 0:"},{"line_number":76,"context_line":"            return data"},{"line_number":77,"context_line":""},{"line_number":78,"context_line":"        for k in self._hide_outputs_keys:"},{"line_number":79,"context_line":"            if k in data:"},{"line_number":80,"context_line":"                data[k] \u003d \u0027***\u0027"}],"source_content_type":"text/x-python","patch_set":1,"id":"79d36226_4032c0dc","line":77,"in_reply_to":"2951042d_f2b798ca","updated":"2024-10-24 07:37:08.000000000","message":"probably a good idea","commit_id":"3a2c28441e5017011b740a840fcc2bbfe785ac67"},{"author":{"_account_id":9816,"name":"Takashi Kajinami","email":"kajinamit@oss.nttdata.com","username":"kajinamit"},"change_message_id":"d9ab8f1a091e39f168c5f19030a449986869a78f","unresolved":true,"context_lines":[{"line_number":67,"context_line":"    }"},{"line_number":68,"context_line":""},{"line_number":69,"context_line":"    def __init__(self, engine, hide_inputs_outputs_of\u003d(),"},{"line_number":70,"context_line":"                 hide_outputs_keys\u003d()):"},{"line_number":71,"context_line":"        self._hide_inputs_outputs_of \u003d hide_inputs_outputs_of"},{"line_number":72,"context_line":"        self._hide_outputs_keys \u003d hide_outputs_keys"},{"line_number":73,"context_line":"        self._engine \u003d engine"}],"source_content_type":"text/x-python","patch_set":2,"id":"a471a031_7860db6f","line":70,"range":{"start_line":70,"start_character":17,"end_line":70,"end_character":34},"updated":"2025-02-03 11:41:52.000000000","message":"This parameter behaves differently from the existing hide_inputs_outputs_of, which can be confusing. Can we rename it to `mask_inputs_keys` ?","commit_id":"1265788a83a035a1e7237a4f562d78466cb9a1fe"},{"author":{"_account_id":16137,"name":"Tobias Urdin","email":"tobias.urdin@binero.com","username":"tobasco"},"change_message_id":"4dcf03f9666b5d8dfc97a3490ccdc7b9694dc3fa","unresolved":false,"context_lines":[{"line_number":67,"context_line":"    }"},{"line_number":68,"context_line":""},{"line_number":69,"context_line":"    def __init__(self, engine, hide_inputs_outputs_of\u003d(),"},{"line_number":70,"context_line":"                 hide_outputs_keys\u003d()):"},{"line_number":71,"context_line":"        self._hide_inputs_outputs_of \u003d hide_inputs_outputs_of"},{"line_number":72,"context_line":"        self._hide_outputs_keys \u003d hide_outputs_keys"},{"line_number":73,"context_line":"        self._engine \u003d engine"}],"source_content_type":"text/x-python","patch_set":2,"id":"6945bd5b_69de56b9","line":70,"range":{"start_line":70,"start_character":17,"end_line":70,"end_character":34},"in_reply_to":"a471a031_7860db6f","updated":"2025-02-07 08:31:40.000000000","message":"Done","commit_id":"1265788a83a035a1e7237a4f562d78466cb9a1fe"},{"author":{"_account_id":9816,"name":"Takashi Kajinami","email":"kajinamit@oss.nttdata.com","username":"kajinamit"},"change_message_id":"d9ab8f1a091e39f168c5f19030a449986869a78f","unresolved":true,"context_lines":[{"line_number":72,"context_line":"        self._hide_outputs_keys \u003d hide_outputs_keys"},{"line_number":73,"context_line":"        self._engine \u003d engine"},{"line_number":74,"context_line":""},{"line_number":75,"context_line":"    def _handle_outputs_keys(self, data):"},{"line_number":76,"context_line":"        if not isinstance(data, dict) or len(self._hide_outputs_keys) \u003d\u003d 0:"},{"line_number":77,"context_line":"            return data"},{"line_number":78,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"daa9cbf5_63697a20","line":75,"range":{"start_line":75,"start_character":8,"end_line":75,"end_character":28},"updated":"2025-02-03 11:41:52.000000000","message":"If we rename the parameter then we can rename this to `_mask_outputs_keys`.","commit_id":"1265788a83a035a1e7237a4f562d78466cb9a1fe"},{"author":{"_account_id":16137,"name":"Tobias Urdin","email":"tobias.urdin@binero.com","username":"tobasco"},"change_message_id":"4dcf03f9666b5d8dfc97a3490ccdc7b9694dc3fa","unresolved":false,"context_lines":[{"line_number":72,"context_line":"        self._hide_outputs_keys \u003d hide_outputs_keys"},{"line_number":73,"context_line":"        self._engine \u003d engine"},{"line_number":74,"context_line":""},{"line_number":75,"context_line":"    def _handle_outputs_keys(self, data):"},{"line_number":76,"context_line":"        if not isinstance(data, dict) or len(self._hide_outputs_keys) \u003d\u003d 0:"},{"line_number":77,"context_line":"            return data"},{"line_number":78,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"bc2edec8_15b9af34","line":75,"range":{"start_line":75,"start_character":8,"end_line":75,"end_character":28},"in_reply_to":"daa9cbf5_63697a20","updated":"2025-02-07 08:31:40.000000000","message":"Done","commit_id":"1265788a83a035a1e7237a4f562d78466cb9a1fe"},{"author":{"_account_id":9816,"name":"Takashi Kajinami","email":"kajinamit@oss.nttdata.com","username":"kajinamit"},"change_message_id":"d9ab8f1a091e39f168c5f19030a449986869a78f","unresolved":true,"context_lines":[{"line_number":73,"context_line":"        self._engine \u003d engine"},{"line_number":74,"context_line":""},{"line_number":75,"context_line":"    def _handle_outputs_keys(self, data):"},{"line_number":76,"context_line":"        if not isinstance(data, dict) or len(self._hide_outputs_keys) \u003d\u003d 0:"},{"line_number":77,"context_line":"            return data"},{"line_number":78,"context_line":""},{"line_number":79,"context_line":"        result \u003d copy.deepcopy(data)"}],"source_content_type":"text/x-python","patch_set":2,"id":"bc36732f_f11fffbd","line":76,"range":{"start_line":76,"start_character":15,"end_line":76,"end_character":37},"updated":"2025-02-03 11:41:52.000000000","message":"If you intend to handle None then I think\n\n`if not self._hide_output_keys or not data:`\n\ncan be a simpler approach.\n(I prefer checking a static data first so swapped the order, too)","commit_id":"1265788a83a035a1e7237a4f562d78466cb9a1fe"},{"author":{"_account_id":16137,"name":"Tobias Urdin","email":"tobias.urdin@binero.com","username":"tobasco"},"change_message_id":"4dcf03f9666b5d8dfc97a3490ccdc7b9694dc3fa","unresolved":false,"context_lines":[{"line_number":73,"context_line":"        self._engine \u003d engine"},{"line_number":74,"context_line":""},{"line_number":75,"context_line":"    def _handle_outputs_keys(self, data):"},{"line_number":76,"context_line":"        if not isinstance(data, dict) or len(self._hide_outputs_keys) \u003d\u003d 0:"},{"line_number":77,"context_line":"            return data"},{"line_number":78,"context_line":""},{"line_number":79,"context_line":"        result \u003d copy.deepcopy(data)"}],"source_content_type":"text/x-python","patch_set":2,"id":"95922aac_68b8f007","line":76,"range":{"start_line":76,"start_character":15,"end_line":76,"end_character":37},"in_reply_to":"bc36732f_f11fffbd","updated":"2025-02-07 08:31:40.000000000","message":"Done","commit_id":"1265788a83a035a1e7237a4f562d78466cb9a1fe"},{"author":{"_account_id":9816,"name":"Takashi Kajinami","email":"kajinamit@oss.nttdata.com","username":"kajinamit"},"change_message_id":"d9ab8f1a091e39f168c5f19030a449986869a78f","unresolved":false,"context_lines":[{"line_number":76,"context_line":"        if not isinstance(data, dict) or len(self._hide_outputs_keys) \u003d\u003d 0:"},{"line_number":77,"context_line":"            return data"},{"line_number":78,"context_line":""},{"line_number":79,"context_line":"        result \u003d copy.deepcopy(data)"},{"line_number":80,"context_line":"        for k in self._hide_outputs_keys:"},{"line_number":81,"context_line":"            if k in result:"},{"line_number":82,"context_line":"                result[k] \u003d \u0027***\u0027"}],"source_content_type":"text/x-python","patch_set":2,"id":"2dda7ff8_19d3f7a6","line":79,"range":{"start_line":79,"start_character":8,"end_line":79,"end_character":36},"updated":"2025-02-03 11:41:52.000000000","message":"One minor concern is that this duplicates the instance regardless of the existence of the sensitive keys, but I guess it\u0027s ok assuming we don\u0027t expect very huge data (such as ~ 100MiB) here.","commit_id":"1265788a83a035a1e7237a4f562d78466cb9a1fe"},{"author":{"_account_id":9816,"name":"Takashi Kajinami","email":"kajinamit@oss.nttdata.com","username":"kajinamit"},"change_message_id":"dd6b96145a864286be24f60cb5d7472c0b38422f","unresolved":true,"context_lines":[{"line_number":67,"context_line":"    }"},{"line_number":68,"context_line":""},{"line_number":69,"context_line":"    def __init__(self, engine, hide_inputs_outputs_of\u003d(),"},{"line_number":70,"context_line":"                 mask_inputs_keys\u003d()):"},{"line_number":71,"context_line":"        self._hide_inputs_outputs_of \u003d hide_inputs_outputs_of"},{"line_number":72,"context_line":"        self._mask_inputs_keys \u003d mask_inputs_keys"},{"line_number":73,"context_line":"        self._engine \u003d engine"}],"source_content_type":"text/x-python","patch_set":3,"id":"4ec30a3d_5c42e6d1","line":70,"range":{"start_line":70,"start_character":17,"end_line":70,"end_character":33},"updated":"2025-02-13 14:36:46.000000000","message":"Sorry I had to take some time to understand the existing terminology correctly.\n\nBased on the following description in doc, I think we should have separate keys for requires(input) and provides(output).\n\nhttps://docs.openstack.org/taskflow/latest/user/atoms.html\n\n```\nAn atom is expected to name desired input values (requirements) and name outputs (provided values).\n```\n\nIMO the better interface may look like\n```\n    def __init__(self, engine, hide_inputs_outputs_of\u003d(),\n                 mask_inputs_keys\u003d(), mask_outputs_keys\u003d()):\n        self._hide_inputs_outputs_of \u003d hide_inputs_outputs_of\n        self._mask_inputs_keys \u003d mask_inputs_keys\n        self._mask_outputs_keys \u003d mask_outputs_keys\n```\n\nand you may need to define the mask function like\n\n```\n    def _mask_keys(self, data, mask_keys):\n        if not data or not isinstance(data, dict):\n            return data\n        result \u003d copy.deepcopy(data)\n        for k in mask_keys:\n            if k in result:\n                result[k] \u003d \u0027***\u0027\n        return result\n```\n\nand then use it with the appropriate keys set.\n\n```\n                if requires_found:\n                    atom_attrs[\u0027requires\u0027] \u003d self._mask_keys(\n                        requires, self._mask_input_keys)\n                ...\n                if provides_found:\n                    atom_attrs[\u0027provides\u0027] \u003d self._mask_keys(\n                        provides, self._mask_output_keys)\n```","commit_id":"aa1f012c21d4033afbec05fd06c114dc161c668e"},{"author":{"_account_id":16137,"name":"Tobias Urdin","email":"tobias.urdin@binero.com","username":"tobasco"},"change_message_id":"0df0424b03fe9fa4b4b045b10b268b89491b0fea","unresolved":false,"context_lines":[{"line_number":67,"context_line":"    }"},{"line_number":68,"context_line":""},{"line_number":69,"context_line":"    def __init__(self, engine, hide_inputs_outputs_of\u003d(),"},{"line_number":70,"context_line":"                 mask_inputs_keys\u003d()):"},{"line_number":71,"context_line":"        self._hide_inputs_outputs_of \u003d hide_inputs_outputs_of"},{"line_number":72,"context_line":"        self._mask_inputs_keys \u003d mask_inputs_keys"},{"line_number":73,"context_line":"        self._engine \u003d engine"}],"source_content_type":"text/x-python","patch_set":3,"id":"5e451db8_7fbb20d7","line":70,"range":{"start_line":70,"start_character":17,"end_line":70,"end_character":33},"in_reply_to":"3da97941_e0bedfb9","updated":"2025-02-27 10:04:23.000000000","message":"Done","commit_id":"aa1f012c21d4033afbec05fd06c114dc161c668e"},{"author":{"_account_id":9816,"name":"Takashi Kajinami","email":"kajinamit@oss.nttdata.com","username":"kajinamit"},"change_message_id":"e85429437fc7413bd3aff1efd76ea8afd3c49767","unresolved":true,"context_lines":[{"line_number":67,"context_line":"    }"},{"line_number":68,"context_line":""},{"line_number":69,"context_line":"    def __init__(self, engine, hide_inputs_outputs_of\u003d(),"},{"line_number":70,"context_line":"                 mask_inputs_keys\u003d()):"},{"line_number":71,"context_line":"        self._hide_inputs_outputs_of \u003d hide_inputs_outputs_of"},{"line_number":72,"context_line":"        self._mask_inputs_keys \u003d mask_inputs_keys"},{"line_number":73,"context_line":"        self._engine \u003d engine"}],"source_content_type":"text/x-python","patch_set":3,"id":"c6dd03c1_32647726","line":70,"range":{"start_line":70,"start_character":17,"end_line":70,"end_character":33},"in_reply_to":"4ec30a3d_5c42e6d1","updated":"2025-02-13 14:38:03.000000000","message":"I noticed I made a few typos in the last snippet and it should look like\n\n```\n                if requires_found:\n                    atom_attrs[\u0027requires\u0027] \u003d self._mask_keys(\n                        requires, self._mask_inputs_keys)\n                ...\n                if provides_found:\n                    atom_attrs[\u0027provides\u0027] \u003d self._mask_keys(\n                        provides, self._mask_outputs_keys)\n```","commit_id":"aa1f012c21d4033afbec05fd06c114dc161c668e"},{"author":{"_account_id":9816,"name":"Takashi Kajinami","email":"kajinamit@oss.nttdata.com","username":"kajinamit"},"change_message_id":"b4852f988b8ba70b6bdfdfb3a2881454cdc54c7c","unresolved":true,"context_lines":[{"line_number":67,"context_line":"    }"},{"line_number":68,"context_line":""},{"line_number":69,"context_line":"    def __init__(self, engine, hide_inputs_outputs_of\u003d(),"},{"line_number":70,"context_line":"                 mask_inputs_keys\u003d()):"},{"line_number":71,"context_line":"        self._hide_inputs_outputs_of \u003d hide_inputs_outputs_of"},{"line_number":72,"context_line":"        self._mask_inputs_keys \u003d mask_inputs_keys"},{"line_number":73,"context_line":"        self._engine \u003d engine"}],"source_content_type":"text/x-python","patch_set":3,"id":"3da97941_e0bedfb9","line":70,"range":{"start_line":70,"start_character":17,"end_line":70,"end_character":33},"in_reply_to":"c6dd03c1_32647726","updated":"2025-02-13 14:39:07.000000000","message":"or if we are not aware of any actual use case where we have to hide any keys in provides then we can probably skip implementing the mask for output keys.","commit_id":"aa1f012c21d4033afbec05fd06c114dc161c668e"}]}
