)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":26340,"name":"Ilya Etingof","email":"etingof@gmail.com","username":"etingof"},"change_message_id":"fb8ff1e02914d30210b049ade1064a54059031a8","unresolved":false,"context_lines":[{"line_number":4,"context_line":"Commit:     Aija Jaunteva \u003ccode@clusums.eu\u003e"},{"line_number":5,"context_line":"CommitDate: 2018-06-08 14:06:39 +0300"},{"line_number":6,"context_line":""},{"line_number":7,"context_line":"Introduces BIOS API"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"Adds `system` resource to have reference to `bios`."},{"line_number":10,"context_line":""}],"source_content_type":"text/x-gerrit-commit-message","patch_set":4,"id":"5f7c97a3_198d8b7b","line":7,"range":{"start_line":7,"start_character":0,"end_line":7,"end_character":10},"updated":"2018-06-08 17:28:51.000000000","message":"nit: Introduce, not introduces","commit_id":"0ef22bc867e7d88fd5ad3ed70ed60a721c3c2253"},{"author":{"_account_id":27909,"name":"Aija Jauntēva","email":"code@clusums.eu","username":"ajya"},"change_message_id":"f58a89f78e96d7e48e887462cb982cea308314df","unresolved":false,"context_lines":[{"line_number":4,"context_line":"Commit:     Aija Jaunteva \u003ccode@clusums.eu\u003e"},{"line_number":5,"context_line":"CommitDate: 2018-06-08 14:06:39 +0300"},{"line_number":6,"context_line":""},{"line_number":7,"context_line":"Introduces BIOS API"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"Adds `system` resource to have reference to `bios`."},{"line_number":10,"context_line":""}],"source_content_type":"text/x-gerrit-commit-message","patch_set":4,"id":"5f7c97a3_17e9aae1","line":7,"range":{"start_line":7,"start_character":0,"end_line":7,"end_character":10},"in_reply_to":"5f7c97a3_198d8b7b","updated":"2018-06-11 20:57:06.000000000","message":"Done","commit_id":"0ef22bc867e7d88fd5ad3ed70ed60a721c3c2253"}],"releasenotes/notes/add-bios-bf69ac56c4ae8f50.yaml":[{"author":{"_account_id":26340,"name":"Ilya Etingof","email":"etingof@gmail.com","username":"etingof"},"change_message_id":"fb8ff1e02914d30210b049ade1064a54059031a8","unresolved":false,"context_lines":[{"line_number":1,"context_line":"---"},{"line_number":2,"context_line":"features:"},{"line_number":3,"context_line":"  - |"},{"line_number":4,"context_line":"    Adds the \"Bios\" resource to the library."}],"source_content_type":"text/x-yaml","patch_set":4,"id":"5f7c97a3_39df2767","line":4,"range":{"start_line":4,"start_character":4,"end_line":4,"end_character":8},"updated":"2018-06-08 17:28:51.000000000","message":"May be \u0027Adds Redfish \"Bios\" resource support\u0027 ? Or \u0027modelling\u0027?","commit_id":"0ef22bc867e7d88fd5ad3ed70ed60a721c3c2253"},{"author":{"_account_id":27909,"name":"Aija Jauntēva","email":"code@clusums.eu","username":"ajya"},"change_message_id":"f58a89f78e96d7e48e887462cb982cea308314df","unresolved":false,"context_lines":[{"line_number":1,"context_line":"---"},{"line_number":2,"context_line":"features:"},{"line_number":3,"context_line":"  - |"},{"line_number":4,"context_line":"    Adds the \"Bios\" resource to the library."}],"source_content_type":"text/x-yaml","patch_set":4,"id":"5f7c97a3_c68aa7ba","line":4,"range":{"start_line":4,"start_character":4,"end_line":4,"end_character":8},"in_reply_to":"5f7c97a3_39df2767","updated":"2018-06-11 20:57:06.000000000","message":"I was inspired by Ethernet Interface release note and kept the same style.\nSo maybe keep with this so release notes are consistent?\n \nI\u0027m not sure if mentioning Redfish is worth it, because everything in sushy is Redfish by default and it was not mentioned in Ethernet Interface release note.\n\nIf I were reading release notes and in Bios it would say Redfish, and in Ethernet Interface it would not say Redfish, then I would start wondering if Ethernet Interface is not part of Redfish.","commit_id":"0ef22bc867e7d88fd5ad3ed70ed60a721c3c2253"},{"author":{"_account_id":27909,"name":"Aija Jauntēva","email":"code@clusums.eu","username":"ajya"},"change_message_id":"c4f38b63ab1e25b58a37584b81f73c647cd3064f","unresolved":false,"context_lines":[{"line_number":1,"context_line":"---"},{"line_number":2,"context_line":"features:"},{"line_number":3,"context_line":"  - |"},{"line_number":4,"context_line":"    Adds the \"Bios\" resource to the library."}],"source_content_type":"text/x-yaml","patch_set":4,"id":"5f7c97a3_f8f12de0","line":4,"range":{"start_line":4,"start_character":4,"end_line":4,"end_character":8},"in_reply_to":"5f7c97a3_485978fa","updated":"2018-06-18 22:00:31.000000000","message":":) Would \"Adds support for the \"Bios\" resource to the library\" be better?","commit_id":"0ef22bc867e7d88fd5ad3ed70ed60a721c3c2253"},{"author":{"_account_id":27909,"name":"Aija Jauntēva","email":"code@clusums.eu","username":"ajya"},"change_message_id":"87f40d6097e3f6ed1027c666e44f4fe24b339259","unresolved":false,"context_lines":[{"line_number":1,"context_line":"---"},{"line_number":2,"context_line":"features:"},{"line_number":3,"context_line":"  - |"},{"line_number":4,"context_line":"    Adds the \"Bios\" resource to the library."}],"source_content_type":"text/x-yaml","patch_set":4,"id":"5f7c97a3_cc70b8a7","line":4,"range":{"start_line":4,"start_character":4,"end_line":4,"end_character":8},"in_reply_to":"5f7c97a3_4d06061f","updated":"2018-06-21 19:26:10.000000000","message":"Done","commit_id":"0ef22bc867e7d88fd5ad3ed70ed60a721c3c2253"},{"author":{"_account_id":26340,"name":"Ilya Etingof","email":"etingof@gmail.com","username":"etingof"},"change_message_id":"bd18d1ce316065333090e4f0cdb27f7ef13b32b9","unresolved":false,"context_lines":[{"line_number":1,"context_line":"---"},{"line_number":2,"context_line":"features:"},{"line_number":3,"context_line":"  - |"},{"line_number":4,"context_line":"    Adds the \"Bios\" resource to the library."}],"source_content_type":"text/x-yaml","patch_set":4,"id":"5f7c97a3_485978fa","line":4,"range":{"start_line":4,"start_character":4,"end_line":4,"end_character":8},"in_reply_to":"5f7c97a3_c68aa7ba","updated":"2018-06-14 10:52:53.000000000","message":"Fair enough.\n\nThough, reading it literally, we do not really add the \"resource\" to the library because resource is something that Redfish server presents us to work with. What we add is the code and the API to deal with server-side resource.\n\nDid I mention that I am nitpicking all the way? ;-)","commit_id":"0ef22bc867e7d88fd5ad3ed70ed60a721c3c2253"},{"author":{"_account_id":26340,"name":"Ilya Etingof","email":"etingof@gmail.com","username":"etingof"},"change_message_id":"bdfd5013bcc643172f8be4885cb5bdd2c6db707c","unresolved":false,"context_lines":[{"line_number":1,"context_line":"---"},{"line_number":2,"context_line":"features:"},{"line_number":3,"context_line":"  - |"},{"line_number":4,"context_line":"    Adds the \"Bios\" resource to the library."}],"source_content_type":"text/x-yaml","patch_set":4,"id":"5f7c97a3_4d06061f","line":4,"range":{"start_line":4,"start_character":4,"end_line":4,"end_character":8},"in_reply_to":"5f7c97a3_f8f12de0","updated":"2018-06-19 15:54:26.000000000","message":"Sounds good to me! Though BIOS should be in all caps I think","commit_id":"0ef22bc867e7d88fd5ad3ed70ed60a721c3c2253"}],"sushy/resources/system/bios.py":[{"author":{"_account_id":26340,"name":"Ilya Etingof","email":"etingof@gmail.com","username":"etingof"},"change_message_id":"fb8ff1e02914d30210b049ade1064a54059031a8","unresolved":false,"context_lines":[{"line_number":23,"context_line":"LOG \u003d logging.getLogger(__name__)"},{"line_number":24,"context_line":""},{"line_number":25,"context_line":""},{"line_number":26,"context_line":"class ActionsField(base.CompositeField):"},{"line_number":27,"context_line":"    change_password \u003d common.ActionField(\u0027#Bios.ChangePassword\u0027)"},{"line_number":28,"context_line":"    reset_bios \u003d common.ActionField(\u0027#Bios.ResetBios\u0027)"},{"line_number":29,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"5f7c97a3_594a2327","line":26,"range":{"start_line":26,"start_character":6,"end_line":26,"end_character":18},"updated":"2018-06-08 17:28:51.000000000","message":"Did you move this to some other patch? Let\u0027s rebase then?\n\nOr do I confuse it with some other field? Sorry for that then ;-)","commit_id":"0ef22bc867e7d88fd5ad3ed70ed60a721c3c2253"},{"author":{"_account_id":26340,"name":"Ilya Etingof","email":"etingof@gmail.com","username":"etingof"},"change_message_id":"bd18d1ce316065333090e4f0cdb27f7ef13b32b9","unresolved":false,"context_lines":[{"line_number":23,"context_line":"LOG \u003d logging.getLogger(__name__)"},{"line_number":24,"context_line":""},{"line_number":25,"context_line":""},{"line_number":26,"context_line":"class ActionsField(base.CompositeField):"},{"line_number":27,"context_line":"    change_password \u003d common.ActionField(\u0027#Bios.ChangePassword\u0027)"},{"line_number":28,"context_line":"    reset_bios \u003d common.ActionField(\u0027#Bios.ResetBios\u0027)"},{"line_number":29,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"5f7c97a3_08e2a001","line":26,"range":{"start_line":26,"start_character":6,"end_line":26,"end_character":18},"in_reply_to":"5f7c97a3_48bb06e4","updated":"2018-06-14 10:52:53.000000000","message":"Done","commit_id":"0ef22bc867e7d88fd5ad3ed70ed60a721c3c2253"},{"author":{"_account_id":27909,"name":"Aija Jauntēva","email":"code@clusums.eu","username":"ajya"},"change_message_id":"f58a89f78e96d7e48e887462cb982cea308314df","unresolved":false,"context_lines":[{"line_number":23,"context_line":"LOG \u003d logging.getLogger(__name__)"},{"line_number":24,"context_line":""},{"line_number":25,"context_line":""},{"line_number":26,"context_line":"class ActionsField(base.CompositeField):"},{"line_number":27,"context_line":"    change_password \u003d common.ActionField(\u0027#Bios.ChangePassword\u0027)"},{"line_number":28,"context_line":"    reset_bios \u003d common.ActionField(\u0027#Bios.ResetBios\u0027)"},{"line_number":29,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"5f7c97a3_48bb06e4","line":26,"range":{"start_line":26,"start_character":6,"end_line":26,"end_character":18},"in_reply_to":"5f7c97a3_594a2327","updated":"2018-06-11 20:57:06.000000000","message":"This is different field. The field that you are thinking is used inside this class. \nMaybe better name for this class would be BiosActionsField, but I\u0027m keeping this name as other resources (e.g. system, manager) use the same name - ActionsField for their specific Actions sub-element.","commit_id":"0ef22bc867e7d88fd5ad3ed70ed60a721c3c2253"},{"author":{"_account_id":27909,"name":"Aija Jauntēva","email":"code@clusums.eu","username":"ajya"},"change_message_id":"f58a89f78e96d7e48e887462cb982cea308314df","unresolved":false,"context_lines":[{"line_number":31,"context_line":"class _BiosBase(base.ResourceBase):"},{"line_number":32,"context_line":""},{"line_number":33,"context_line":"    identity \u003d base.Field(\u0027Id\u0027, required\u003dTrue)"},{"line_number":34,"context_line":"    \"\"\"The Ethernet Interface identity string\"\"\""},{"line_number":35,"context_line":""},{"line_number":36,"context_line":"    name \u003d base.Field(\u0027Name\u0027)"},{"line_number":37,"context_line":"    \"\"\"The name of the resource or array element\"\"\""}],"source_content_type":"text/x-python","patch_set":4,"id":"5f7c97a3_267fdb17","line":34,"range":{"start_line":34,"start_character":11,"end_line":34,"end_character":29},"updated":"2018-06-11 20:57:06.000000000","message":"fixed this copy-paste too","commit_id":"0ef22bc867e7d88fd5ad3ed70ed60a721c3c2253"},{"author":{"_account_id":26340,"name":"Ilya Etingof","email":"etingof@gmail.com","username":"etingof"},"change_message_id":"bd18d1ce316065333090e4f0cdb27f7ef13b32b9","unresolved":false,"context_lines":[{"line_number":31,"context_line":"class _BiosBase(base.ResourceBase):"},{"line_number":32,"context_line":""},{"line_number":33,"context_line":"    identity \u003d base.Field(\u0027Id\u0027, required\u003dTrue)"},{"line_number":34,"context_line":"    \"\"\"The Ethernet Interface identity string\"\"\""},{"line_number":35,"context_line":""},{"line_number":36,"context_line":"    name \u003d base.Field(\u0027Name\u0027)"},{"line_number":37,"context_line":"    \"\"\"The name of the resource or array element\"\"\""}],"source_content_type":"text/x-python","patch_set":4,"id":"5f7c97a3_a8ecccf3","line":34,"range":{"start_line":34,"start_character":11,"end_line":34,"end_character":29},"in_reply_to":"5f7c97a3_267fdb17","updated":"2018-06-14 10:52:53.000000000","message":"Done","commit_id":"0ef22bc867e7d88fd5ad3ed70ed60a721c3c2253"},{"author":{"_account_id":26340,"name":"Ilya Etingof","email":"etingof@gmail.com","username":"etingof"},"change_message_id":"fb8ff1e02914d30210b049ade1064a54059031a8","unresolved":false,"context_lines":[{"line_number":34,"context_line":"    \"\"\"The Ethernet Interface identity string\"\"\""},{"line_number":35,"context_line":""},{"line_number":36,"context_line":"    name \u003d base.Field(\u0027Name\u0027)"},{"line_number":37,"context_line":"    \"\"\"The name of the resource or array element\"\"\""},{"line_number":38,"context_line":""},{"line_number":39,"context_line":"    description \u003d base.Field(\u0027Description\u0027)"},{"line_number":40,"context_line":"    \"\"\"Description\"\"\""}],"source_content_type":"text/x-python","patch_set":4,"id":"5f7c97a3_99551bc5","line":37,"range":{"start_line":37,"start_character":32,"end_line":37,"end_character":48},"updated":"2018-06-08 17:28:51.000000000","message":"This is confusing a bit. Could you rephrase?","commit_id":"0ef22bc867e7d88fd5ad3ed70ed60a721c3c2253"},{"author":{"_account_id":27909,"name":"Aija Jauntēva","email":"code@clusums.eu","username":"ajya"},"change_message_id":"f58a89f78e96d7e48e887462cb982cea308314df","unresolved":false,"context_lines":[{"line_number":34,"context_line":"    \"\"\"The Ethernet Interface identity string\"\"\""},{"line_number":35,"context_line":""},{"line_number":36,"context_line":"    name \u003d base.Field(\u0027Name\u0027)"},{"line_number":37,"context_line":"    \"\"\"The name of the resource or array element\"\"\""},{"line_number":38,"context_line":""},{"line_number":39,"context_line":"    description \u003d base.Field(\u0027Description\u0027)"},{"line_number":40,"context_line":"    \"\"\"Description\"\"\""}],"source_content_type":"text/x-python","patch_set":4,"id":"5f7c97a3_c8f8767d","line":37,"range":{"start_line":37,"start_character":32,"end_line":37,"end_character":48},"in_reply_to":"5f7c97a3_99551bc5","updated":"2018-06-11 20:57:06.000000000","message":"removed, was copy-paste from the spec","commit_id":"0ef22bc867e7d88fd5ad3ed70ed60a721c3c2253"},{"author":{"_account_id":26340,"name":"Ilya Etingof","email":"etingof@gmail.com","username":"etingof"},"change_message_id":"bd18d1ce316065333090e4f0cdb27f7ef13b32b9","unresolved":false,"context_lines":[{"line_number":34,"context_line":"    \"\"\"The Ethernet Interface identity string\"\"\""},{"line_number":35,"context_line":""},{"line_number":36,"context_line":"    name \u003d base.Field(\u0027Name\u0027)"},{"line_number":37,"context_line":"    \"\"\"The name of the resource or array element\"\"\""},{"line_number":38,"context_line":""},{"line_number":39,"context_line":"    description \u003d base.Field(\u0027Description\u0027)"},{"line_number":40,"context_line":"    \"\"\"Description\"\"\""}],"source_content_type":"text/x-python","patch_set":4,"id":"5f7c97a3_c8e7c80e","line":37,"range":{"start_line":37,"start_character":32,"end_line":37,"end_character":48},"in_reply_to":"5f7c97a3_c8f8767d","updated":"2018-06-14 10:52:53.000000000","message":"Done","commit_id":"0ef22bc867e7d88fd5ad3ed70ed60a721c3c2253"},{"author":{"_account_id":26340,"name":"Ilya Etingof","email":"etingof@gmail.com","username":"etingof"},"change_message_id":"fb8ff1e02914d30210b049ade1064a54059031a8","unresolved":false,"context_lines":[{"line_number":37,"context_line":"    \"\"\"The name of the resource or array element\"\"\""},{"line_number":38,"context_line":""},{"line_number":39,"context_line":"    description \u003d base.Field(\u0027Description\u0027)"},{"line_number":40,"context_line":"    \"\"\"Description\"\"\""},{"line_number":41,"context_line":""},{"line_number":42,"context_line":"    attribute_registry \u003d base.Field(\u0027AttributeRegistry\u0027)"},{"line_number":43,"context_line":"    \"\"\"The Resource ID of the Attribute Registry"}],"source_content_type":"text/x-python","patch_set":4,"id":"5f7c97a3_19690b8b","line":40,"range":{"start_line":40,"start_character":7,"end_line":40,"end_character":18},"updated":"2018-06-08 17:28:51.000000000","message":"Description of what? Let\u0027s try to be more literate ;-)","commit_id":"0ef22bc867e7d88fd5ad3ed70ed60a721c3c2253"},{"author":{"_account_id":26340,"name":"Ilya Etingof","email":"etingof@gmail.com","username":"etingof"},"change_message_id":"bd18d1ce316065333090e4f0cdb27f7ef13b32b9","unresolved":false,"context_lines":[{"line_number":37,"context_line":"    \"\"\"The name of the resource or array element\"\"\""},{"line_number":38,"context_line":""},{"line_number":39,"context_line":"    description \u003d base.Field(\u0027Description\u0027)"},{"line_number":40,"context_line":"    \"\"\"Description\"\"\""},{"line_number":41,"context_line":""},{"line_number":42,"context_line":"    attribute_registry \u003d base.Field(\u0027AttributeRegistry\u0027)"},{"line_number":43,"context_line":"    \"\"\"The Resource ID of the Attribute Registry"}],"source_content_type":"text/x-python","patch_set":4,"id":"5f7c97a3_88bf90ce","line":40,"range":{"start_line":40,"start_character":7,"end_line":40,"end_character":18},"in_reply_to":"5f7c97a3_08b3ce9b","updated":"2018-06-14 10:52:53.000000000","message":"Done","commit_id":"0ef22bc867e7d88fd5ad3ed70ed60a721c3c2253"},{"author":{"_account_id":27909,"name":"Aija Jauntēva","email":"code@clusums.eu","username":"ajya"},"change_message_id":"f58a89f78e96d7e48e887462cb982cea308314df","unresolved":false,"context_lines":[{"line_number":37,"context_line":"    \"\"\"The name of the resource or array element\"\"\""},{"line_number":38,"context_line":""},{"line_number":39,"context_line":"    description \u003d base.Field(\u0027Description\u0027)"},{"line_number":40,"context_line":"    \"\"\"Description\"\"\""},{"line_number":41,"context_line":""},{"line_number":42,"context_line":"    attribute_registry \u003d base.Field(\u0027AttributeRegistry\u0027)"},{"line_number":43,"context_line":"    \"\"\"The Resource ID of the Attribute Registry"}],"source_content_type":"text/x-python","patch_set":4,"id":"5f7c97a3_08b3ce9b","line":40,"range":{"start_line":40,"start_character":7,"end_line":40,"end_character":18},"in_reply_to":"5f7c97a3_19690b8b","updated":"2018-06-11 20:57:06.000000000","message":"updated docstring with text from Redfish documentation","commit_id":"0ef22bc867e7d88fd5ad3ed70ed60a721c3c2253"},{"author":{"_account_id":26340,"name":"Ilya Etingof","email":"etingof@gmail.com","username":"etingof"},"change_message_id":"fb8ff1e02914d30210b049ade1064a54059031a8","unresolved":false,"context_lines":[{"line_number":41,"context_line":""},{"line_number":42,"context_line":"    attribute_registry \u003d base.Field(\u0027AttributeRegistry\u0027)"},{"line_number":43,"context_line":"    \"\"\"The Resource ID of the Attribute Registry"},{"line_number":44,"context_line":"    for the BIOS Attributes resource"},{"line_number":45,"context_line":"    \"\"\""},{"line_number":46,"context_line":""},{"line_number":47,"context_line":"    _attributes \u003d base.Field(\u0027Attributes\u0027)"}],"source_content_type":"text/x-python","patch_set":4,"id":"5f7c97a3_79f59fca","line":44,"range":{"start_line":44,"start_character":0,"end_line":44,"end_character":4},"updated":"2018-06-08 17:28:51.000000000","message":"Does this render well? Just to be sure Sphinx does not try to split this apart or add extra spaces.","commit_id":"0ef22bc867e7d88fd5ad3ed70ed60a721c3c2253"},{"author":{"_account_id":27909,"name":"Aija Jauntēva","email":"code@clusums.eu","username":"ajya"},"change_message_id":"f58a89f78e96d7e48e887462cb982cea308314df","unresolved":false,"context_lines":[{"line_number":41,"context_line":""},{"line_number":42,"context_line":"    attribute_registry \u003d base.Field(\u0027AttributeRegistry\u0027)"},{"line_number":43,"context_line":"    \"\"\"The Resource ID of the Attribute Registry"},{"line_number":44,"context_line":"    for the BIOS Attributes resource"},{"line_number":45,"context_line":"    \"\"\""},{"line_number":46,"context_line":""},{"line_number":47,"context_line":"    _attributes \u003d base.Field(\u0027Attributes\u0027)"}],"source_content_type":"text/x-python","patch_set":4,"id":"5f7c97a3_ebaa0cd0","line":44,"range":{"start_line":44,"start_character":0,"end_line":44,"end_character":4},"in_reply_to":"5f7c97a3_79f59fca","updated":"2018-06-11 20:57:06.000000000","message":"for now Sphinx did not render this at all, because this is part of private class (_BiosBase). I have got rid of _BiosBase (see comments at the end about it), will check this in next patch update.","commit_id":"0ef22bc867e7d88fd5ad3ed70ed60a721c3c2253"},{"author":{"_account_id":27909,"name":"Aija Jauntēva","email":"code@clusums.eu","username":"ajya"},"change_message_id":"82d179e1d8cf87ad22cad8ee2d557c873ebe1cad","unresolved":false,"context_lines":[{"line_number":41,"context_line":""},{"line_number":42,"context_line":"    attribute_registry \u003d base.Field(\u0027AttributeRegistry\u0027)"},{"line_number":43,"context_line":"    \"\"\"The Resource ID of the Attribute Registry"},{"line_number":44,"context_line":"    for the BIOS Attributes resource"},{"line_number":45,"context_line":"    \"\"\""},{"line_number":46,"context_line":""},{"line_number":47,"context_line":"    _attributes \u003d base.Field(\u0027Attributes\u0027)"}],"source_content_type":"text/x-python","patch_set":4,"id":"5f7c97a3_8ae82016","line":44,"range":{"start_line":44,"start_character":0,"end_line":44,"end_character":4},"in_reply_to":"5f7c97a3_79f59fca","updated":"2018-06-12 10:26:35.000000000","message":"this renders ok, see http://logs.openstack.org/90/570890/5/check/build-openstack-sphinx-docs/caab0f3/html/reference/api/sushy.resources.system.bios.html#module-sushy.resources.system.bios","commit_id":"0ef22bc867e7d88fd5ad3ed70ed60a721c3c2253"},{"author":{"_account_id":26340,"name":"Ilya Etingof","email":"etingof@gmail.com","username":"etingof"},"change_message_id":"bd18d1ce316065333090e4f0cdb27f7ef13b32b9","unresolved":false,"context_lines":[{"line_number":41,"context_line":""},{"line_number":42,"context_line":"    attribute_registry \u003d base.Field(\u0027AttributeRegistry\u0027)"},{"line_number":43,"context_line":"    \"\"\"The Resource ID of the Attribute Registry"},{"line_number":44,"context_line":"    for the BIOS Attributes resource"},{"line_number":45,"context_line":"    \"\"\""},{"line_number":46,"context_line":""},{"line_number":47,"context_line":"    _attributes \u003d base.Field(\u0027Attributes\u0027)"}],"source_content_type":"text/x-python","patch_set":4,"id":"5f7c97a3_48b5f8eb","line":44,"range":{"start_line":44,"start_character":0,"end_line":44,"end_character":4},"in_reply_to":"5f7c97a3_8ae82016","updated":"2018-06-14 10:52:53.000000000","message":"Done","commit_id":"0ef22bc867e7d88fd5ad3ed70ed60a721c3c2253"},{"author":{"_account_id":26340,"name":"Ilya Etingof","email":"etingof@gmail.com","username":"etingof"},"change_message_id":"bd18d1ce316065333090e4f0cdb27f7ef13b32b9","unresolved":false,"context_lines":[{"line_number":41,"context_line":""},{"line_number":42,"context_line":"    attribute_registry \u003d base.Field(\u0027AttributeRegistry\u0027)"},{"line_number":43,"context_line":"    \"\"\"The Resource ID of the Attribute Registry"},{"line_number":44,"context_line":"    for the BIOS Attributes resource"},{"line_number":45,"context_line":"    \"\"\""},{"line_number":46,"context_line":""},{"line_number":47,"context_line":"    _attributes \u003d base.Field(\u0027Attributes\u0027)"}],"source_content_type":"text/x-python","patch_set":4,"id":"5f7c97a3_28b2fc06","line":44,"range":{"start_line":44,"start_character":0,"end_line":44,"end_character":4},"in_reply_to":"5f7c97a3_ebaa0cd0","updated":"2018-06-14 10:52:53.000000000","message":"Done","commit_id":"0ef22bc867e7d88fd5ad3ed70ed60a721c3c2253"},{"author":{"_account_id":26340,"name":"Ilya Etingof","email":"etingof@gmail.com","username":"etingof"},"change_message_id":"fb8ff1e02914d30210b049ade1064a54059031a8","unresolved":false,"context_lines":[{"line_number":45,"context_line":"    \"\"\""},{"line_number":46,"context_line":""},{"line_number":47,"context_line":"    _attributes \u003d base.Field(\u0027Attributes\u0027)"},{"line_number":48,"context_line":"    \"\"\"Manufacturer/provider specific list of BIOS attributes\"\"\""},{"line_number":49,"context_line":""},{"line_number":50,"context_line":""},{"line_number":51,"context_line":"class Bios(_BiosBase):"}],"source_content_type":"text/x-python","patch_set":4,"id":"5f7c97a3_39fba7be","line":48,"range":{"start_line":48,"start_character":7,"end_line":48,"end_character":37},"updated":"2018-06-08 17:28:51.000000000","message":"May be just \"Vendor-specific\"?","commit_id":"0ef22bc867e7d88fd5ad3ed70ed60a721c3c2253"},{"author":{"_account_id":26340,"name":"Ilya Etingof","email":"etingof@gmail.com","username":"etingof"},"change_message_id":"bd18d1ce316065333090e4f0cdb27f7ef13b32b9","unresolved":false,"context_lines":[{"line_number":45,"context_line":"    \"\"\""},{"line_number":46,"context_line":""},{"line_number":47,"context_line":"    _attributes \u003d base.Field(\u0027Attributes\u0027)"},{"line_number":48,"context_line":"    \"\"\"Manufacturer/provider specific list of BIOS attributes\"\"\""},{"line_number":49,"context_line":""},{"line_number":50,"context_line":""},{"line_number":51,"context_line":"class Bios(_BiosBase):"}],"source_content_type":"text/x-python","patch_set":4,"id":"5f7c97a3_08cb8071","line":48,"range":{"start_line":48,"start_character":7,"end_line":48,"end_character":37},"in_reply_to":"5f7c97a3_2b7004a4","updated":"2018-06-14 10:52:53.000000000","message":"Done","commit_id":"0ef22bc867e7d88fd5ad3ed70ed60a721c3c2253"},{"author":{"_account_id":27909,"name":"Aija Jauntēva","email":"code@clusums.eu","username":"ajya"},"change_message_id":"f58a89f78e96d7e48e887462cb982cea308314df","unresolved":false,"context_lines":[{"line_number":45,"context_line":"    \"\"\""},{"line_number":46,"context_line":""},{"line_number":47,"context_line":"    _attributes \u003d base.Field(\u0027Attributes\u0027)"},{"line_number":48,"context_line":"    \"\"\"Manufacturer/provider specific list of BIOS attributes\"\"\""},{"line_number":49,"context_line":""},{"line_number":50,"context_line":""},{"line_number":51,"context_line":"class Bios(_BiosBase):"}],"source_content_type":"text/x-python","patch_set":4,"id":"5f7c97a3_2b7004a4","line":48,"range":{"start_line":48,"start_character":7,"end_line":48,"end_character":37},"in_reply_to":"5f7c97a3_39fba7be","updated":"2018-06-11 20:57:06.000000000","message":"That was taken from spec, but \"vendor-specific\" is shorter :)\n\nUpdated for the public property, for this private removed docstring to avoid duplication.","commit_id":"0ef22bc867e7d88fd5ad3ed70ed60a721c3c2253"},{"author":{"_account_id":26340,"name":"Ilya Etingof","email":"etingof@gmail.com","username":"etingof"},"change_message_id":"fb8ff1e02914d30210b049ade1064a54059031a8","unresolved":false,"context_lines":[{"line_number":51,"context_line":"class Bios(_BiosBase):"},{"line_number":52,"context_line":""},{"line_number":53,"context_line":"    settings \u003d settings.SettingsField()"},{"line_number":54,"context_line":"    \"\"\"Status and any errors of attribute updates\"\"\""},{"line_number":55,"context_line":""},{"line_number":56,"context_line":"    _actions \u003d ActionsField(\u0027Actions\u0027)"},{"line_number":57,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"5f7c97a3_5921c34c","line":54,"range":{"start_line":54,"start_character":7,"end_line":54,"end_character":49},"updated":"2018-06-08 17:28:51.000000000","message":"Could we rephrase that? I am not sure what exactly do you mean here.","commit_id":"0ef22bc867e7d88fd5ad3ed70ed60a721c3c2253"},{"author":{"_account_id":27909,"name":"Aija Jauntēva","email":"code@clusums.eu","username":"ajya"},"change_message_id":"c4f38b63ab1e25b58a37584b81f73c647cd3064f","unresolved":false,"context_lines":[{"line_number":51,"context_line":"class Bios(_BiosBase):"},{"line_number":52,"context_line":""},{"line_number":53,"context_line":"    settings \u003d settings.SettingsField()"},{"line_number":54,"context_line":"    \"\"\"Status and any errors of attribute updates\"\"\""},{"line_number":55,"context_line":""},{"line_number":56,"context_line":"    _actions \u003d ActionsField(\u0027Actions\u0027)"},{"line_number":57,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"5f7c97a3_3515704a","line":54,"range":{"start_line":54,"start_character":7,"end_line":54,"end_character":49},"in_reply_to":"5f7c97a3_08f5c082","updated":"2018-06-18 22:00:31.000000000","message":"still need to expose settings field to user because it will contain update status and errors if update was not successful. \n\nI\u0027m proposing to make settings private and \"override\" its name for sushy users:\n\n def attribute_apply_status(self):\n     return _settings\n\nDoes this make sense?","commit_id":"0ef22bc867e7d88fd5ad3ed70ed60a721c3c2253"},{"author":{"_account_id":26340,"name":"Ilya Etingof","email":"etingof@gmail.com","username":"etingof"},"change_message_id":"bdfd5013bcc643172f8be4885cb5bdd2c6db707c","unresolved":false,"context_lines":[{"line_number":51,"context_line":"class Bios(_BiosBase):"},{"line_number":52,"context_line":""},{"line_number":53,"context_line":"    settings \u003d settings.SettingsField()"},{"line_number":54,"context_line":"    \"\"\"Status and any errors of attribute updates\"\"\""},{"line_number":55,"context_line":""},{"line_number":56,"context_line":"    _actions \u003d ActionsField(\u0027Actions\u0027)"},{"line_number":57,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"5f7c97a3_03f69fd9","line":54,"range":{"start_line":54,"start_character":7,"end_line":54,"end_character":49},"in_reply_to":"5f7c97a3_3515704a","updated":"2018-06-19 15:54:26.000000000","message":"To me this sounds like an overengineering. ;)\n\nI think that just exposing the whole settings object but naming it in a clearer way (to give user a hint what is inside) would be more usable in the end.\n\nAlternatively, we could over-engineer it differently like introducing the `status` and `errors` properties to the `Bios` object effectively proxying just these two calls to the underlying `settings` object.","commit_id":"0ef22bc867e7d88fd5ad3ed70ed60a721c3c2253"},{"author":{"_account_id":27909,"name":"Aija Jauntēva","email":"code@clusums.eu","username":"ajya"},"change_message_id":"f58a89f78e96d7e48e887462cb982cea308314df","unresolved":false,"context_lines":[{"line_number":51,"context_line":"class Bios(_BiosBase):"},{"line_number":52,"context_line":""},{"line_number":53,"context_line":"    settings \u003d settings.SettingsField()"},{"line_number":54,"context_line":"    \"\"\"Status and any errors of attribute updates\"\"\""},{"line_number":55,"context_line":""},{"line_number":56,"context_line":"    _actions \u003d ActionsField(\u0027Actions\u0027)"},{"line_number":57,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"5f7c97a3_cb0cf043","line":54,"range":{"start_line":54,"start_character":7,"end_line":54,"end_character":49},"in_reply_to":"5f7c97a3_5921c34c","updated":"2018-06-11 20:57:06.000000000","message":"rephrased. \n\nNow I\u0027m thinking if \"settings\" is good name for this attribute. Its origin is Settings resource as it is called in Redfish spec and it holds URI to pending settings object + results of updating settings. But sushy user will not interact with settings object through this property, but will use only results of settings updates. So for sushy user this would be more like \"settings_update_status\". \n\nWhat do you think, does it make sense to have\n\n settings_update_status \u003d settings.SettingsField()\n\nAnd at the same time I\u0027m (as a developer, not sushy end-user) still using this property as settings object. For example in `set_attributes` does it make sense that status has settings object?\n\n self.settings_update_status._settings_object_idref.resource_uri\n\nMaybe `settings_update` is ok?","commit_id":"0ef22bc867e7d88fd5ad3ed70ed60a721c3c2253"},{"author":{"_account_id":26340,"name":"Ilya Etingof","email":"etingof@gmail.com","username":"etingof"},"change_message_id":"bd18d1ce316065333090e4f0cdb27f7ef13b32b9","unresolved":false,"context_lines":[{"line_number":51,"context_line":"class Bios(_BiosBase):"},{"line_number":52,"context_line":""},{"line_number":53,"context_line":"    settings \u003d settings.SettingsField()"},{"line_number":54,"context_line":"    \"\"\"Status and any errors of attribute updates\"\"\""},{"line_number":55,"context_line":""},{"line_number":56,"context_line":"    _actions \u003d ActionsField(\u0027Actions\u0027)"},{"line_number":57,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"5f7c97a3_08f5c082","line":54,"range":{"start_line":54,"start_character":7,"end_line":54,"end_character":49},"in_reply_to":"5f7c97a3_cb0cf043","updated":"2018-06-14 10:52:53.000000000","message":"If this object effectively holds the most recent version of device\u0027s state (wrt BIOS info), would it make sense to name it as such? Like `committed_settings` or `saved_settings` or `server_settings`? To contrast this with some `pending_settings` which are basically client-side intention to eventually commit to the server.\n\nOR, do we need to expose `settings` at all? What if we just copy the avpairs from `settings` to `attributes` on successful update?\n\nIn other words, does it bring any value to the user to see two versions of avpairs - pre-commit and post-commit? Plus the update URI?","commit_id":"0ef22bc867e7d88fd5ad3ed70ed60a721c3c2253"},{"author":{"_account_id":26340,"name":"Ilya Etingof","email":"etingof@gmail.com","username":"etingof"},"change_message_id":"fb8ff1e02914d30210b049ade1064a54059031a8","unresolved":false,"context_lines":[{"line_number":59,"context_line":""},{"line_number":60,"context_line":"    @property"},{"line_number":61,"context_line":"    def attributes(self):"},{"line_number":62,"context_line":"        \"\"\"Manufacturer/provider specific list of current BIOS attributes\"\"\""},{"line_number":63,"context_line":"        return self._attributes"},{"line_number":64,"context_line":""},{"line_number":65,"context_line":"    def set_attribute(self, key, value):"}],"source_content_type":"text/x-python","patch_set":4,"id":"5f7c97a3_19ecabf2","line":62,"range":{"start_line":62,"start_character":42,"end_line":62,"end_character":73},"updated":"2018-06-08 17:28:51.000000000","message":"Is this a list of key-value pairs? The data structure being served is not clear.","commit_id":"0ef22bc867e7d88fd5ad3ed70ed60a721c3c2253"},{"author":{"_account_id":26340,"name":"Ilya Etingof","email":"etingof@gmail.com","username":"etingof"},"change_message_id":"fb8ff1e02914d30210b049ade1064a54059031a8","unresolved":false,"context_lines":[{"line_number":59,"context_line":""},{"line_number":60,"context_line":"    @property"},{"line_number":61,"context_line":"    def attributes(self):"},{"line_number":62,"context_line":"        \"\"\"Manufacturer/provider specific list of current BIOS attributes\"\"\""},{"line_number":63,"context_line":"        return self._attributes"},{"line_number":64,"context_line":""},{"line_number":65,"context_line":"    def set_attribute(self, key, value):"}],"source_content_type":"text/x-python","patch_set":4,"id":"5f7c97a3_39e967e2","line":62,"range":{"start_line":62,"start_character":50,"end_line":62,"end_character":57},"updated":"2018-06-08 17:28:51.000000000","message":"may be: current -\u003e effective?","commit_id":"0ef22bc867e7d88fd5ad3ed70ed60a721c3c2253"},{"author":{"_account_id":27909,"name":"Aija Jauntēva","email":"code@clusums.eu","username":"ajya"},"change_message_id":"f58a89f78e96d7e48e887462cb982cea308314df","unresolved":false,"context_lines":[{"line_number":59,"context_line":""},{"line_number":60,"context_line":"    @property"},{"line_number":61,"context_line":"    def attributes(self):"},{"line_number":62,"context_line":"        \"\"\"Manufacturer/provider specific list of current BIOS attributes\"\"\""},{"line_number":63,"context_line":"        return self._attributes"},{"line_number":64,"context_line":""},{"line_number":65,"context_line":"    def set_attribute(self, key, value):"}],"source_content_type":"text/x-python","patch_set":4,"id":"5f7c97a3_662713b8","line":62,"range":{"start_line":62,"start_character":42,"end_line":62,"end_character":73},"in_reply_to":"5f7c97a3_19ecabf2","updated":"2018-06-11 20:57:06.000000000","message":"updated to include \"key-value\"","commit_id":"0ef22bc867e7d88fd5ad3ed70ed60a721c3c2253"},{"author":{"_account_id":27909,"name":"Aija Jauntēva","email":"code@clusums.eu","username":"ajya"},"change_message_id":"f58a89f78e96d7e48e887462cb982cea308314df","unresolved":false,"context_lines":[{"line_number":59,"context_line":""},{"line_number":60,"context_line":"    @property"},{"line_number":61,"context_line":"    def attributes(self):"},{"line_number":62,"context_line":"        \"\"\"Manufacturer/provider specific list of current BIOS attributes\"\"\""},{"line_number":63,"context_line":"        return self._attributes"},{"line_number":64,"context_line":""},{"line_number":65,"context_line":"    def set_attribute(self, key, value):"}],"source_content_type":"text/x-python","patch_set":4,"id":"5f7c97a3_862caf99","line":62,"range":{"start_line":62,"start_character":50,"end_line":62,"end_character":57},"in_reply_to":"5f7c97a3_39e967e2","updated":"2018-06-11 20:57:06.000000000","message":"updated","commit_id":"0ef22bc867e7d88fd5ad3ed70ed60a721c3c2253"},{"author":{"_account_id":26340,"name":"Ilya Etingof","email":"etingof@gmail.com","username":"etingof"},"change_message_id":"bd18d1ce316065333090e4f0cdb27f7ef13b32b9","unresolved":false,"context_lines":[{"line_number":59,"context_line":""},{"line_number":60,"context_line":"    @property"},{"line_number":61,"context_line":"    def attributes(self):"},{"line_number":62,"context_line":"        \"\"\"Manufacturer/provider specific list of current BIOS attributes\"\"\""},{"line_number":63,"context_line":"        return self._attributes"},{"line_number":64,"context_line":""},{"line_number":65,"context_line":"    def set_attribute(self, key, value):"}],"source_content_type":"text/x-python","patch_set":4,"id":"5f7c97a3_48341849","line":62,"range":{"start_line":62,"start_character":42,"end_line":62,"end_character":73},"in_reply_to":"5f7c97a3_662713b8","updated":"2018-06-14 10:52:53.000000000","message":"Done","commit_id":"0ef22bc867e7d88fd5ad3ed70ed60a721c3c2253"},{"author":{"_account_id":26340,"name":"Ilya Etingof","email":"etingof@gmail.com","username":"etingof"},"change_message_id":"bd18d1ce316065333090e4f0cdb27f7ef13b32b9","unresolved":false,"context_lines":[{"line_number":59,"context_line":""},{"line_number":60,"context_line":"    @property"},{"line_number":61,"context_line":"    def attributes(self):"},{"line_number":62,"context_line":"        \"\"\"Manufacturer/provider specific list of current BIOS attributes\"\"\""},{"line_number":63,"context_line":"        return self._attributes"},{"line_number":64,"context_line":""},{"line_number":65,"context_line":"    def set_attribute(self, key, value):"}],"source_content_type":"text/x-python","patch_set":4,"id":"5f7c97a3_e83e4427","line":62,"range":{"start_line":62,"start_character":50,"end_line":62,"end_character":57},"in_reply_to":"5f7c97a3_862caf99","updated":"2018-06-14 10:52:53.000000000","message":"Done","commit_id":"0ef22bc867e7d88fd5ad3ed70ed60a721c3c2253"},{"author":{"_account_id":26340,"name":"Ilya Etingof","email":"etingof@gmail.com","username":"etingof"},"change_message_id":"fb8ff1e02914d30210b049ade1064a54059031a8","unresolved":false,"context_lines":[{"line_number":62,"context_line":"        \"\"\"Manufacturer/provider specific list of current BIOS attributes\"\"\""},{"line_number":63,"context_line":"        return self._attributes"},{"line_number":64,"context_line":""},{"line_number":65,"context_line":"    def set_attribute(self, key, value):"},{"line_number":66,"context_line":"        \"\"\"Update an attribute. Check `settings` to monitor update status\"\"\""},{"line_number":67,"context_line":"        self._conn.patch(self.settings._settings_object_idref.resource_uri,"},{"line_number":68,"context_line":"                         data\u003d{\u0027Attributes\u0027: {key: value}})"}],"source_content_type":"text/x-python","patch_set":4,"id":"5f7c97a3_b9ab3786","line":65,"range":{"start_line":65,"start_character":8,"end_line":65,"end_character":21},"updated":"2018-06-08 17:28:51.000000000","message":"Just thinking outloud: would it make sense to offer a settable `attributes` property instead of this \"setter\" method? Like:\n\n    bios.attributes \u003d {\u0027key\u0027: value}\n\nor\n\n    bios.attributes[\u0027key\u0027] \u003d value\n\nSo the API would be symmetrical and based on well-understood dict API...","commit_id":"0ef22bc867e7d88fd5ad3ed70ed60a721c3c2253"},{"author":{"_account_id":26340,"name":"Ilya Etingof","email":"etingof@gmail.com","username":"etingof"},"change_message_id":"bd18d1ce316065333090e4f0cdb27f7ef13b32b9","unresolved":false,"context_lines":[{"line_number":62,"context_line":"        \"\"\"Manufacturer/provider specific list of current BIOS attributes\"\"\""},{"line_number":63,"context_line":"        return self._attributes"},{"line_number":64,"context_line":""},{"line_number":65,"context_line":"    def set_attribute(self, key, value):"},{"line_number":66,"context_line":"        \"\"\"Update an attribute. Check `settings` to monitor update status\"\"\""},{"line_number":67,"context_line":"        self._conn.patch(self.settings._settings_object_idref.resource_uri,"},{"line_number":68,"context_line":"                         data\u003d{\u0027Attributes\u0027: {key: value}})"}],"source_content_type":"text/x-python","patch_set":4,"id":"5f7c97a3_689554e3","line":65,"range":{"start_line":65,"start_character":8,"end_line":65,"end_character":21},"in_reply_to":"5f7c97a3_37e62618","updated":"2018-06-14 10:52:53.000000000","message":"\u003e mapping approach `attributes[\u0027key\u0027]` would require new class inheriting from dict or other \n\nMay be just making `Field` derivative complying with the mapping API would suffice? By adding a few mapping API methods to the subclass/mixin of `Field` that is.\n\n\u003e Maybe this would require extending base module to support dictionary-like fields in sushy, although atm I\u0027m not aware of any other case where such data structure is used - another thing to check out.\n\nThis looks like an overkill to me. This way you are risking to grow old before your patch get merged. ;)","commit_id":"0ef22bc867e7d88fd5ad3ed70ed60a721c3c2253"},{"author":{"_account_id":27909,"name":"Aija Jauntēva","email":"code@clusums.eu","username":"ajya"},"change_message_id":"c4f38b63ab1e25b58a37584b81f73c647cd3064f","unresolved":false,"context_lines":[{"line_number":62,"context_line":"        \"\"\"Manufacturer/provider specific list of current BIOS attributes\"\"\""},{"line_number":63,"context_line":"        return self._attributes"},{"line_number":64,"context_line":""},{"line_number":65,"context_line":"    def set_attribute(self, key, value):"},{"line_number":66,"context_line":"        \"\"\"Update an attribute. Check `settings` to monitor update status\"\"\""},{"line_number":67,"context_line":"        self._conn.patch(self.settings._settings_object_idref.resource_uri,"},{"line_number":68,"context_line":"                         data\u003d{\u0027Attributes\u0027: {key: value}})"}],"source_content_type":"text/x-python","patch_set":4,"id":"5f7c97a3_0c97c747","line":65,"range":{"start_line":65,"start_character":8,"end_line":65,"end_character":21},"in_reply_to":"5f7c97a3_689554e3","updated":"2018-06-18 22:00:31.000000000","message":"I\u0027ve implemented one way to allow `attributes[\u0027key\u0027]` that replaces `set_attribute`. See details on the main comment because this introduce some new concepts to sushy.","commit_id":"0ef22bc867e7d88fd5ad3ed70ed60a721c3c2253"},{"author":{"_account_id":27909,"name":"Aija Jauntēva","email":"code@clusums.eu","username":"ajya"},"change_message_id":"f58a89f78e96d7e48e887462cb982cea308314df","unresolved":false,"context_lines":[{"line_number":62,"context_line":"        \"\"\"Manufacturer/provider specific list of current BIOS attributes\"\"\""},{"line_number":63,"context_line":"        return self._attributes"},{"line_number":64,"context_line":""},{"line_number":65,"context_line":"    def set_attribute(self, key, value):"},{"line_number":66,"context_line":"        \"\"\"Update an attribute. Check `settings` to monitor update status\"\"\""},{"line_number":67,"context_line":"        self._conn.patch(self.settings._settings_object_idref.resource_uri,"},{"line_number":68,"context_line":"                         data\u003d{\u0027Attributes\u0027: {key: value}})"}],"source_content_type":"text/x-python","patch_set":4,"id":"5f7c97a3_37e62618","line":65,"range":{"start_line":65,"start_character":8,"end_line":65,"end_character":21},"in_reply_to":"5f7c97a3_b9ab3786","updated":"2018-06-11 20:57:06.000000000","message":"yes, it could be handy.\n\nActually the first approach would allow batch updating - update several attributes with one HTTP call. \nI have added attributes.setter to support this (and new tests) at the same time keeping the old set_attributes to allow updating 1 attribute with simpler syntax(?). But maybe this is not necessary and could confuse users? \n\nmapping approach `attributes[\u0027key\u0027]` would require new class inheriting from dict or other mapping that is aware of connection, uri to update, and _pending_settings_resource to invalidate. I have to try this out to see how it looks. Maybe this would require extending base module to support dictionary-like fields in sushy, although atm I\u0027m not aware of any other case where such data structure is used - another thing to check out.","commit_id":"0ef22bc867e7d88fd5ad3ed70ed60a721c3c2253"},{"author":{"_account_id":26340,"name":"Ilya Etingof","email":"etingof@gmail.com","username":"etingof"},"change_message_id":"fb8ff1e02914d30210b049ade1064a54059031a8","unresolved":false,"context_lines":[{"line_number":66,"context_line":"        \"\"\"Update an attribute. Check `settings` to monitor update status\"\"\""},{"line_number":67,"context_line":"        self._conn.patch(self.settings._settings_object_idref.resource_uri,"},{"line_number":68,"context_line":"                         data\u003d{\u0027Attributes\u0027: {key: value}})"},{"line_number":69,"context_line":"        if (self._pending_settings_resource is not None):"},{"line_number":70,"context_line":"            self._pending_settings_resource.invalidate()"},{"line_number":71,"context_line":""},{"line_number":72,"context_line":"    @property"}],"source_content_type":"text/x-python","patch_set":4,"id":"5f7c97a3_997f5b16","line":69,"range":{"start_line":69,"start_character":44,"end_line":69,"end_character":55},"updated":"2018-06-08 17:28:51.000000000","message":"Can we do just `if self._pending_settings_resource:`?","commit_id":"0ef22bc867e7d88fd5ad3ed70ed60a721c3c2253"},{"author":{"_account_id":26340,"name":"Ilya Etingof","email":"etingof@gmail.com","username":"etingof"},"change_message_id":"fb8ff1e02914d30210b049ade1064a54059031a8","unresolved":false,"context_lines":[{"line_number":66,"context_line":"        \"\"\"Update an attribute. Check `settings` to monitor update status\"\"\""},{"line_number":67,"context_line":"        self._conn.patch(self.settings._settings_object_idref.resource_uri,"},{"line_number":68,"context_line":"                         data\u003d{\u0027Attributes\u0027: {key: value}})"},{"line_number":69,"context_line":"        if (self._pending_settings_resource is not None):"},{"line_number":70,"context_line":"            self._pending_settings_resource.invalidate()"},{"line_number":71,"context_line":""},{"line_number":72,"context_line":"    @property"}],"source_content_type":"text/x-python","patch_set":4,"id":"5f7c97a3_199a6b6e","line":69,"range":{"start_line":69,"start_character":11,"end_line":69,"end_character":12},"updated":"2018-06-08 17:28:51.000000000","message":"Parenthesis not needed","commit_id":"0ef22bc867e7d88fd5ad3ed70ed60a721c3c2253"},{"author":{"_account_id":27909,"name":"Aija Jauntēva","email":"code@clusums.eu","username":"ajya"},"change_message_id":"f58a89f78e96d7e48e887462cb982cea308314df","unresolved":false,"context_lines":[{"line_number":66,"context_line":"        \"\"\"Update an attribute. Check `settings` to monitor update status\"\"\""},{"line_number":67,"context_line":"        self._conn.patch(self.settings._settings_object_idref.resource_uri,"},{"line_number":68,"context_line":"                         data\u003d{\u0027Attributes\u0027: {key: value}})"},{"line_number":69,"context_line":"        if (self._pending_settings_resource is not None):"},{"line_number":70,"context_line":"            self._pending_settings_resource.invalidate()"},{"line_number":71,"context_line":""},{"line_number":72,"context_line":"    @property"}],"source_content_type":"text/x-python","patch_set":4,"id":"5f7c97a3_e63fa3b2","line":69,"range":{"start_line":69,"start_character":11,"end_line":69,"end_character":12},"in_reply_to":"5f7c97a3_199a6b6e","updated":"2018-06-11 20:57:06.000000000","message":"removed parenthesis","commit_id":"0ef22bc867e7d88fd5ad3ed70ed60a721c3c2253"},{"author":{"_account_id":26340,"name":"Ilya Etingof","email":"etingof@gmail.com","username":"etingof"},"change_message_id":"bd18d1ce316065333090e4f0cdb27f7ef13b32b9","unresolved":false,"context_lines":[{"line_number":66,"context_line":"        \"\"\"Update an attribute. Check `settings` to monitor update status\"\"\""},{"line_number":67,"context_line":"        self._conn.patch(self.settings._settings_object_idref.resource_uri,"},{"line_number":68,"context_line":"                         data\u003d{\u0027Attributes\u0027: {key: value}})"},{"line_number":69,"context_line":"        if (self._pending_settings_resource is not None):"},{"line_number":70,"context_line":"            self._pending_settings_resource.invalidate()"},{"line_number":71,"context_line":""},{"line_number":72,"context_line":"    @property"}],"source_content_type":"text/x-python","patch_set":4,"id":"5f7c97a3_8898f01a","line":69,"range":{"start_line":69,"start_character":44,"end_line":69,"end_character":55},"in_reply_to":"5f7c97a3_867a6f85","updated":"2018-06-14 10:52:53.000000000","message":"Done","commit_id":"0ef22bc867e7d88fd5ad3ed70ed60a721c3c2253"},{"author":{"_account_id":27909,"name":"Aija Jauntēva","email":"code@clusums.eu","username":"ajya"},"change_message_id":"f58a89f78e96d7e48e887462cb982cea308314df","unresolved":false,"context_lines":[{"line_number":66,"context_line":"        \"\"\"Update an attribute. Check `settings` to monitor update status\"\"\""},{"line_number":67,"context_line":"        self._conn.patch(self.settings._settings_object_idref.resource_uri,"},{"line_number":68,"context_line":"                         data\u003d{\u0027Attributes\u0027: {key: value}})"},{"line_number":69,"context_line":"        if (self._pending_settings_resource is not None):"},{"line_number":70,"context_line":"            self._pending_settings_resource.invalidate()"},{"line_number":71,"context_line":""},{"line_number":72,"context_line":"    @property"}],"source_content_type":"text/x-python","patch_set":4,"id":"5f7c97a3_867a6f85","line":69,"range":{"start_line":69,"start_character":44,"end_line":69,"end_character":55},"in_reply_to":"5f7c97a3_997f5b16","updated":"2018-06-11 20:57:06.000000000","message":"Done","commit_id":"0ef22bc867e7d88fd5ad3ed70ed60a721c3c2253"},{"author":{"_account_id":26340,"name":"Ilya Etingof","email":"etingof@gmail.com","username":"etingof"},"change_message_id":"bd18d1ce316065333090e4f0cdb27f7ef13b32b9","unresolved":false,"context_lines":[{"line_number":66,"context_line":"        \"\"\"Update an attribute. Check `settings` to monitor update status\"\"\""},{"line_number":67,"context_line":"        self._conn.patch(self.settings._settings_object_idref.resource_uri,"},{"line_number":68,"context_line":"                         data\u003d{\u0027Attributes\u0027: {key: value}})"},{"line_number":69,"context_line":"        if (self._pending_settings_resource is not None):"},{"line_number":70,"context_line":"            self._pending_settings_resource.invalidate()"},{"line_number":71,"context_line":""},{"line_number":72,"context_line":"    @property"}],"source_content_type":"text/x-python","patch_set":4,"id":"5f7c97a3_489e5806","line":69,"range":{"start_line":69,"start_character":11,"end_line":69,"end_character":12},"in_reply_to":"5f7c97a3_e63fa3b2","updated":"2018-06-14 10:52:53.000000000","message":"Done","commit_id":"0ef22bc867e7d88fd5ad3ed70ed60a721c3c2253"},{"author":{"_account_id":26340,"name":"Ilya Etingof","email":"etingof@gmail.com","username":"etingof"},"change_message_id":"fb8ff1e02914d30210b049ade1064a54059031a8","unresolved":false,"context_lines":[{"line_number":73,"context_line":"    def pending_attributes(self):"},{"line_number":74,"context_line":"        \"\"\"Pending BIOS attributes"},{"line_number":75,"context_line":""},{"line_number":76,"context_line":"        For these attributes to take effect, restart of system is"},{"line_number":77,"context_line":"        necessary"},{"line_number":78,"context_line":"        \"\"\""},{"line_number":79,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"5f7c97a3_597d431a","line":76,"range":{"start_line":76,"start_character":56,"end_line":76,"end_character":62},"updated":"2018-06-08 17:28:51.000000000","message":"May be \"system restart is required\"?\n\nAlso, may be highlight the fact that these attributes have been committed (?) to the node already?","commit_id":"0ef22bc867e7d88fd5ad3ed70ed60a721c3c2253"},{"author":{"_account_id":27909,"name":"Aija Jauntēva","email":"code@clusums.eu","username":"ajya"},"change_message_id":"f58a89f78e96d7e48e887462cb982cea308314df","unresolved":false,"context_lines":[{"line_number":73,"context_line":"    def pending_attributes(self):"},{"line_number":74,"context_line":"        \"\"\"Pending BIOS attributes"},{"line_number":75,"context_line":""},{"line_number":76,"context_line":"        For these attributes to take effect, restart of system is"},{"line_number":77,"context_line":"        necessary"},{"line_number":78,"context_line":"        \"\"\""},{"line_number":79,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"5f7c97a3_c6b70721","line":76,"range":{"start_line":76,"start_character":56,"end_line":76,"end_character":62},"in_reply_to":"5f7c97a3_597d431a","updated":"2018-06-11 20:57:06.000000000","message":"Updated. Proposing to use \u0027submitted\u0027 instead of \u0027committed\u0027.","commit_id":"0ef22bc867e7d88fd5ad3ed70ed60a721c3c2253"},{"author":{"_account_id":26340,"name":"Ilya Etingof","email":"etingof@gmail.com","username":"etingof"},"change_message_id":"bd18d1ce316065333090e4f0cdb27f7ef13b32b9","unresolved":false,"context_lines":[{"line_number":73,"context_line":"    def pending_attributes(self):"},{"line_number":74,"context_line":"        \"\"\"Pending BIOS attributes"},{"line_number":75,"context_line":""},{"line_number":76,"context_line":"        For these attributes to take effect, restart of system is"},{"line_number":77,"context_line":"        necessary"},{"line_number":78,"context_line":"        \"\"\""},{"line_number":79,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"5f7c97a3_e87644d8","line":76,"range":{"start_line":76,"start_character":56,"end_line":76,"end_character":62},"in_reply_to":"5f7c97a3_c6b70721","updated":"2018-06-14 10:52:53.000000000","message":"As I read it `submitted` means that we send the data up there but we do not know if it\u0027s accepted or not. With `committed` we are sure the data is accepted by the server.\n\nSo which case we want to communicate to the reader?","commit_id":"0ef22bc867e7d88fd5ad3ed70ed60a721c3c2253"},{"author":{"_account_id":27909,"name":"Aija Jauntēva","email":"code@clusums.eu","username":"ajya"},"change_message_id":"c4f38b63ab1e25b58a37584b81f73c647cd3064f","unresolved":false,"context_lines":[{"line_number":73,"context_line":"    def pending_attributes(self):"},{"line_number":74,"context_line":"        \"\"\"Pending BIOS attributes"},{"line_number":75,"context_line":""},{"line_number":76,"context_line":"        For these attributes to take effect, restart of system is"},{"line_number":77,"context_line":"        necessary"},{"line_number":78,"context_line":"        \"\"\""},{"line_number":79,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"5f7c97a3_156cf4ce","line":76,"range":{"start_line":76,"start_character":56,"end_line":76,"end_character":62},"in_reply_to":"5f7c97a3_e87644d8","updated":"2018-06-18 22:00:31.000000000","message":"ok, changed to \"committed\"","commit_id":"0ef22bc867e7d88fd5ad3ed70ed60a721c3c2253"},{"author":{"_account_id":26340,"name":"Ilya Etingof","email":"etingof@gmail.com","username":"etingof"},"change_message_id":"fb8ff1e02914d30210b049ade1064a54059031a8","unresolved":false,"context_lines":[{"line_number":77,"context_line":"        necessary"},{"line_number":78,"context_line":"        \"\"\""},{"line_number":79,"context_line":""},{"line_number":80,"context_line":"        if self._pending_settings_resource is None:"},{"line_number":81,"context_line":"            self._pending_settings_resource \u003d _BiosBase("},{"line_number":82,"context_line":"                self._conn,"},{"line_number":83,"context_line":"                self.settings._settings_object_idref.resource_uri,"}],"source_content_type":"text/x-python","patch_set":4,"id":"5f7c97a3_39a5e79f","line":80,"range":{"start_line":80,"start_character":43,"end_line":80,"end_character":50},"updated":"2018-06-08 17:28:51.000000000","message":"ditto","commit_id":"0ef22bc867e7d88fd5ad3ed70ed60a721c3c2253"},{"author":{"_account_id":26340,"name":"Ilya Etingof","email":"etingof@gmail.com","username":"etingof"},"change_message_id":"bd18d1ce316065333090e4f0cdb27f7ef13b32b9","unresolved":false,"context_lines":[{"line_number":77,"context_line":"        necessary"},{"line_number":78,"context_line":"        \"\"\""},{"line_number":79,"context_line":""},{"line_number":80,"context_line":"        if self._pending_settings_resource is None:"},{"line_number":81,"context_line":"            self._pending_settings_resource \u003d _BiosBase("},{"line_number":82,"context_line":"                self._conn,"},{"line_number":83,"context_line":"                self.settings._settings_object_idref.resource_uri,"}],"source_content_type":"text/x-python","patch_set":4,"id":"5f7c97a3_0872a0e3","line":80,"range":{"start_line":80,"start_character":43,"end_line":80,"end_character":50},"in_reply_to":"5f7c97a3_260a7bd0","updated":"2018-06-14 10:52:53.000000000","message":"Done","commit_id":"0ef22bc867e7d88fd5ad3ed70ed60a721c3c2253"},{"author":{"_account_id":27909,"name":"Aija Jauntēva","email":"code@clusums.eu","username":"ajya"},"change_message_id":"f58a89f78e96d7e48e887462cb982cea308314df","unresolved":false,"context_lines":[{"line_number":77,"context_line":"        necessary"},{"line_number":78,"context_line":"        \"\"\""},{"line_number":79,"context_line":""},{"line_number":80,"context_line":"        if self._pending_settings_resource is None:"},{"line_number":81,"context_line":"            self._pending_settings_resource \u003d _BiosBase("},{"line_number":82,"context_line":"                self._conn,"},{"line_number":83,"context_line":"                self.settings._settings_object_idref.resource_uri,"}],"source_content_type":"text/x-python","patch_set":4,"id":"5f7c97a3_260a7bd0","line":80,"range":{"start_line":80,"start_character":43,"end_line":80,"end_character":50},"in_reply_to":"5f7c97a3_39a5e79f","updated":"2018-06-11 20:57:06.000000000","message":"changed to \"if not\"","commit_id":"0ef22bc867e7d88fd5ad3ed70ed60a721c3c2253"},{"author":{"_account_id":26340,"name":"Ilya Etingof","email":"etingof@gmail.com","username":"etingof"},"change_message_id":"fb8ff1e02914d30210b049ade1064a54059031a8","unresolved":false,"context_lines":[{"line_number":78,"context_line":"        \"\"\""},{"line_number":79,"context_line":""},{"line_number":80,"context_line":"        if self._pending_settings_resource is None:"},{"line_number":81,"context_line":"            self._pending_settings_resource \u003d _BiosBase("},{"line_number":82,"context_line":"                self._conn,"},{"line_number":83,"context_line":"                self.settings._settings_object_idref.resource_uri,"},{"line_number":84,"context_line":"                redfish_version\u003dself.redfish_version)"}],"source_content_type":"text/x-python","patch_set":4,"id":"5f7c97a3_799fdf4f","line":81,"range":{"start_line":81,"start_character":46,"end_line":81,"end_character":55},"updated":"2018-06-08 17:28:51.000000000","message":"Why is it `_BiosBase`, not `Bios`? It\u0027s just confusing to me a bit that we inherit from `_BiosBase` and instantiate it as well from the subclass...","commit_id":"0ef22bc867e7d88fd5ad3ed70ed60a721c3c2253"},{"author":{"_account_id":27909,"name":"Aija Jauntēva","email":"code@clusums.eu","username":"ajya"},"change_message_id":"f58a89f78e96d7e48e887462cb982cea308314df","unresolved":false,"context_lines":[{"line_number":78,"context_line":"        \"\"\""},{"line_number":79,"context_line":""},{"line_number":80,"context_line":"        if self._pending_settings_resource is None:"},{"line_number":81,"context_line":"            self._pending_settings_resource \u003d _BiosBase("},{"line_number":82,"context_line":"                self._conn,"},{"line_number":83,"context_line":"                self.settings._settings_object_idref.resource_uri,"},{"line_number":84,"context_line":"                redfish_version\u003dself.redfish_version)"}],"source_content_type":"text/x-python","patch_set":4,"id":"5f7c97a3_8666ef50","line":81,"range":{"start_line":81,"start_character":46,"end_line":81,"end_character":55},"in_reply_to":"5f7c97a3_799fdf4f","updated":"2018-06-11 20:57:06.000000000","message":"I wanted to distinguish between BIOS resource and BIOS/Settings resource. Where BIOS/Settings (aka _BiosBase) resource does not have Actions, @Redfish.Settings properties.\nAnd as it was not intended for sushy user to interact with it directly, made it private. \nBut I guess this is not necessary and works ok, if there is only Bios. \nRemoved `_BiosBase` and put its attributes back in `Bios`.","commit_id":"0ef22bc867e7d88fd5ad3ed70ed60a721c3c2253"},{"author":{"_account_id":26340,"name":"Ilya Etingof","email":"etingof@gmail.com","username":"etingof"},"change_message_id":"bd18d1ce316065333090e4f0cdb27f7ef13b32b9","unresolved":false,"context_lines":[{"line_number":78,"context_line":"        \"\"\""},{"line_number":79,"context_line":""},{"line_number":80,"context_line":"        if self._pending_settings_resource is None:"},{"line_number":81,"context_line":"            self._pending_settings_resource \u003d _BiosBase("},{"line_number":82,"context_line":"                self._conn,"},{"line_number":83,"context_line":"                self.settings._settings_object_idref.resource_uri,"},{"line_number":84,"context_line":"                redfish_version\u003dself.redfish_version)"}],"source_content_type":"text/x-python","patch_set":4,"id":"5f7c97a3_c877c8d0","line":81,"range":{"start_line":81,"start_character":46,"end_line":81,"end_character":55},"in_reply_to":"5f7c97a3_8666ef50","updated":"2018-06-14 10:52:53.000000000","message":"Done","commit_id":"0ef22bc867e7d88fd5ad3ed70ed60a721c3c2253"},{"author":{"_account_id":26340,"name":"Ilya Etingof","email":"etingof@gmail.com","username":"etingof"},"change_message_id":"fb8ff1e02914d30210b049ade1064a54059031a8","unresolved":false,"context_lines":[{"line_number":116,"context_line":"    def reset_bios(self):"},{"line_number":117,"context_line":"        \"\"\"Reset the BIOS attributes to default\"\"\""},{"line_number":118,"context_line":""},{"line_number":119,"context_line":"        target_uri \u003d self._get_reset_bios_action_element().target_uri"},{"line_number":120,"context_line":""},{"line_number":121,"context_line":"        LOG.debug(\u0027Resetting BIOS attributes %s ...\u0027, self.identity)"},{"line_number":122,"context_line":"        self._conn.post(target_uri)"}],"source_content_type":"text/x-python","patch_set":4,"id":"5f7c97a3_1944abb7","line":119,"range":{"start_line":119,"start_character":56,"end_line":119,"end_character":69},"updated":"2018-06-08 17:28:51.000000000","message":"This does not look pretty to me.","commit_id":"0ef22bc867e7d88fd5ad3ed70ed60a721c3c2253"},{"author":{"_account_id":27909,"name":"Aija Jauntēva","email":"code@clusums.eu","username":"ajya"},"change_message_id":"f58a89f78e96d7e48e887462cb982cea308314df","unresolved":false,"context_lines":[{"line_number":116,"context_line":"    def reset_bios(self):"},{"line_number":117,"context_line":"        \"\"\"Reset the BIOS attributes to default\"\"\""},{"line_number":118,"context_line":""},{"line_number":119,"context_line":"        target_uri \u003d self._get_reset_bios_action_element().target_uri"},{"line_number":120,"context_line":""},{"line_number":121,"context_line":"        LOG.debug(\u0027Resetting BIOS attributes %s ...\u0027, self.identity)"},{"line_number":122,"context_line":"        self._conn.post(target_uri)"}],"source_content_type":"text/x-python","patch_set":4,"id":"5f7c97a3_9c43a0b0","line":119,"range":{"start_line":119,"start_character":56,"end_line":119,"end_character":69},"in_reply_to":"5f7c97a3_1944abb7","updated":"2018-06-11 20:57:06.000000000","message":"same approach used in system.py, ln 183, manager.py ln 175","commit_id":"0ef22bc867e7d88fd5ad3ed70ed60a721c3c2253"},{"author":{"_account_id":26340,"name":"Ilya Etingof","email":"etingof@gmail.com","username":"etingof"},"change_message_id":"bd18d1ce316065333090e4f0cdb27f7ef13b32b9","unresolved":false,"context_lines":[{"line_number":116,"context_line":"    def reset_bios(self):"},{"line_number":117,"context_line":"        \"\"\"Reset the BIOS attributes to default\"\"\""},{"line_number":118,"context_line":""},{"line_number":119,"context_line":"        target_uri \u003d self._get_reset_bios_action_element().target_uri"},{"line_number":120,"context_line":""},{"line_number":121,"context_line":"        LOG.debug(\u0027Resetting BIOS attributes %s ...\u0027, self.identity)"},{"line_number":122,"context_line":"        self._conn.post(target_uri)"}],"source_content_type":"text/x-python","patch_set":4,"id":"5f7c97a3_085b8053","line":119,"range":{"start_line":119,"start_character":56,"end_line":119,"end_character":69},"in_reply_to":"5f7c97a3_9c43a0b0","updated":"2018-06-14 10:52:53.000000000","message":"g","commit_id":"0ef22bc867e7d88fd5ad3ed70ed60a721c3c2253"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"f72b638540ff8687f1935d57ff66dbbcf40a08bf","unresolved":false,"context_lines":[{"line_number":52,"context_line":"    _actions \u003d ActionsField(\u0027Actions\u0027)"},{"line_number":53,"context_line":""},{"line_number":54,"context_line":"    _pending_settings_resource \u003d None"},{"line_number":55,"context_line":""},{"line_number":56,"context_line":"    @property"},{"line_number":57,"context_line":"    def attributes(self):"},{"line_number":58,"context_line":"        \"\"\"Vendor-specific key-value list of effective BIOS attributes\"\"\""}],"source_content_type":"text/x-python","patch_set":5,"id":"5f7c97a3_36fc640b","line":55,"updated":"2018-06-18 09:38:42.000000000","message":"should we maybe override invalidate() to set _pending_setting_resource to None? Or at least update refresh() to also update it?","commit_id":"ab6dc9ef2d7864e9d9c4be95fd27787a013f9e42"},{"author":{"_account_id":27909,"name":"Aija Jauntēva","email":"code@clusums.eu","username":"ajya"},"change_message_id":"c4f38b63ab1e25b58a37584b81f73c647cd3064f","unresolved":false,"context_lines":[{"line_number":52,"context_line":"    _actions \u003d ActionsField(\u0027Actions\u0027)"},{"line_number":53,"context_line":""},{"line_number":54,"context_line":"    _pending_settings_resource \u003d None"},{"line_number":55,"context_line":""},{"line_number":56,"context_line":"    @property"},{"line_number":57,"context_line":"    def attributes(self):"},{"line_number":58,"context_line":"        \"\"\"Vendor-specific key-value list of effective BIOS attributes\"\"\""}],"source_content_type":"text/x-python","patch_set":5,"id":"5f7c97a3_8c83d7cb","line":55,"in_reply_to":"5f7c97a3_36fc640b","updated":"2018-06-18 22:00:31.000000000","message":"can you please elaborate on this? \nCurrently my understanding is that if user does not touch pending resources it will be None. \nOnce user touches it, we need to keep track of it when user commits attributes. \nWhen user commits new attributes, this resource is invalidated and when the next time user will access it, it will be refreshed (all this happens inside `pending_attributes` property)\nOr it\u0027s not how it works?","commit_id":"ab6dc9ef2d7864e9d9c4be95fd27787a013f9e42"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"f72b638540ff8687f1935d57ff66dbbcf40a08bf","unresolved":false,"context_lines":[{"line_number":55,"context_line":""},{"line_number":56,"context_line":"    @property"},{"line_number":57,"context_line":"    def attributes(self):"},{"line_number":58,"context_line":"        \"\"\"Vendor-specific key-value list of effective BIOS attributes\"\"\""},{"line_number":59,"context_line":"        return self._attributes"},{"line_number":60,"context_line":""},{"line_number":61,"context_line":"    @attributes.setter"}],"source_content_type":"text/x-python","patch_set":5,"id":"5f7c97a3_5601e003","line":58,"updated":"2018-06-18 09:38:42.000000000","message":"Maybe insert a note that updating this dict directly will not work correctly?","commit_id":"ab6dc9ef2d7864e9d9c4be95fd27787a013f9e42"},{"author":{"_account_id":27909,"name":"Aija Jauntēva","email":"code@clusums.eu","username":"ajya"},"change_message_id":"c4f38b63ab1e25b58a37584b81f73c647cd3064f","unresolved":false,"context_lines":[{"line_number":55,"context_line":""},{"line_number":56,"context_line":"    @property"},{"line_number":57,"context_line":"    def attributes(self):"},{"line_number":58,"context_line":"        \"\"\"Vendor-specific key-value list of effective BIOS attributes\"\"\""},{"line_number":59,"context_line":"        return self._attributes"},{"line_number":60,"context_line":""},{"line_number":61,"context_line":"    @attributes.setter"}],"source_content_type":"text/x-python","patch_set":5,"id":"5f7c97a3_570b0c21","line":58,"in_reply_to":"5f7c97a3_5601e003","updated":"2018-06-18 22:00:31.000000000","message":"added here and for `attributes` setter.","commit_id":"ab6dc9ef2d7864e9d9c4be95fd27787a013f9e42"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"f72b638540ff8687f1935d57ff66dbbcf40a08bf","unresolved":false,"context_lines":[{"line_number":74,"context_line":""},{"line_number":75,"context_line":"        Check `settings` to monitor update status"},{"line_number":76,"context_line":"        \"\"\""},{"line_number":77,"context_line":"        self._conn.patch(self.settings._settings_object_idref.resource_uri,"},{"line_number":78,"context_line":"                         data\u003d{\u0027Attributes\u0027: {key: value}})"},{"line_number":79,"context_line":"        if self._pending_settings_resource:"},{"line_number":80,"context_line":"            self._pending_settings_resource.invalidate()"}],"source_content_type":"text/x-python","patch_set":5,"id":"5f7c97a3_f6058c11","line":77,"updated":"2018-06-18 09:38:42.000000000","message":"to avoid accessing the private attribute, this should be self.settings.set_settings (see the parent patch)","commit_id":"ab6dc9ef2d7864e9d9c4be95fd27787a013f9e42"},{"author":{"_account_id":27909,"name":"Aija Jauntēva","email":"code@clusums.eu","username":"ajya"},"change_message_id":"c4f38b63ab1e25b58a37584b81f73c647cd3064f","unresolved":false,"context_lines":[{"line_number":74,"context_line":""},{"line_number":75,"context_line":"        Check `settings` to monitor update status"},{"line_number":76,"context_line":"        \"\"\""},{"line_number":77,"context_line":"        self._conn.patch(self.settings._settings_object_idref.resource_uri,"},{"line_number":78,"context_line":"                         data\u003d{\u0027Attributes\u0027: {key: value}})"},{"line_number":79,"context_line":"        if self._pending_settings_resource:"},{"line_number":80,"context_line":"            self._pending_settings_resource.invalidate()"}],"source_content_type":"text/x-python","patch_set":5,"id":"5f7c97a3_4c1dbf75","line":77,"in_reply_to":"5f7c97a3_f6058c11","updated":"2018-06-18 22:00:31.000000000","message":"I did this, but now I noticed that `pending_attributes` property need to access the URI to load the future setting resource :/ so it is still accessing private field.\n\nI don\u0027t see a way around this - if exposing resource_uri as public property, then sushy-user can access this anyway, and no reason to hide it in first place? \nOr maybe expose it to avoid levels, e.g., \n  \n  settings.resource_uri\n\ninstead of \n\n  settings._settings_object_idref.resource_uri\n\n?","commit_id":"ab6dc9ef2d7864e9d9c4be95fd27787a013f9e42"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"f72b638540ff8687f1935d57ff66dbbcf40a08bf","unresolved":false,"context_lines":[{"line_number":92,"context_line":"                self._conn,"},{"line_number":93,"context_line":"                self.settings._settings_object_idref.resource_uri,"},{"line_number":94,"context_line":"                redfish_version\u003dself.redfish_version)"},{"line_number":95,"context_line":"        self._pending_settings_resource.refresh(force\u003dFalse)"},{"line_number":96,"context_line":"        return self._pending_settings_resource._attributes"},{"line_number":97,"context_line":""},{"line_number":98,"context_line":"    def _get_reset_bios_action_element(self):"}],"source_content_type":"text/x-python","patch_set":5,"id":"5f7c97a3_160b6824","line":95,"updated":"2018-06-18 09:38:42.000000000","message":"nit: this should go to the \"else\" block","commit_id":"ab6dc9ef2d7864e9d9c4be95fd27787a013f9e42"},{"author":{"_account_id":27909,"name":"Aija Jauntēva","email":"code@clusums.eu","username":"ajya"},"change_message_id":"c4f38b63ab1e25b58a37584b81f73c647cd3064f","unresolved":false,"context_lines":[{"line_number":92,"context_line":"                self._conn,"},{"line_number":93,"context_line":"                self.settings._settings_object_idref.resource_uri,"},{"line_number":94,"context_line":"                redfish_version\u003dself.redfish_version)"},{"line_number":95,"context_line":"        self._pending_settings_resource.refresh(force\u003dFalse)"},{"line_number":96,"context_line":"        return self._pending_settings_resource._attributes"},{"line_number":97,"context_line":""},{"line_number":98,"context_line":"    def _get_reset_bios_action_element(self):"}],"source_content_type":"text/x-python","patch_set":5,"id":"5f7c97a3_2caf232c","line":95,"in_reply_to":"5f7c97a3_160b6824","updated":"2018-06-18 22:00:31.000000000","message":"keeping the style used in other properties, e.g., `system.ethernet_interfaces`\n\nI can update this in another cleanup patch with other issues that have been identified here where I\u0027m re-using existing sushy patterns to align the style across the project","commit_id":"ab6dc9ef2d7864e9d9c4be95fd27787a013f9e42"},{"author":{"_account_id":26340,"name":"Ilya Etingof","email":"etingof@gmail.com","username":"etingof"},"change_message_id":"136170d29d5cad834d3295884a89db13ed39f6b2","unresolved":false,"context_lines":[{"line_number":24,"context_line":"LOG \u003d logging.getLogger(__name__)"},{"line_number":25,"context_line":""},{"line_number":26,"context_line":""},{"line_number":27,"context_line":"class AttributeDict(dict):"},{"line_number":28,"context_line":"    \"\"\"Extension to BIOS attribute collection"},{"line_number":29,"context_line":""},{"line_number":30,"context_line":"    This allows users to update BIOS attributes using dictionary syntax"}],"source_content_type":"text/x-python","patch_set":6,"id":"5f7c97a3_78a4cb4b","line":27,"range":{"start_line":27,"start_character":20,"end_line":27,"end_character":24},"updated":"2018-06-20 12:28:26.000000000","message":"Should we also prohibit key deletion?","commit_id":"28fdf468ed8c8856fecfb9ec020e278b0881b3f9"},{"author":{"_account_id":27909,"name":"Aija Jauntēva","email":"code@clusums.eu","username":"ajya"},"change_message_id":"87f40d6097e3f6ed1027c666e44f4fe24b339259","unresolved":false,"context_lines":[{"line_number":24,"context_line":"LOG \u003d logging.getLogger(__name__)"},{"line_number":25,"context_line":""},{"line_number":26,"context_line":""},{"line_number":27,"context_line":"class AttributeDict(dict):"},{"line_number":28,"context_line":"    \"\"\"Extension to BIOS attribute collection"},{"line_number":29,"context_line":""},{"line_number":30,"context_line":"    This allows users to update BIOS attributes using dictionary syntax"}],"source_content_type":"text/x-python","patch_set":6,"id":"5f7c97a3_62fabfba","line":27,"range":{"start_line":27,"start_character":20,"end_line":27,"end_character":24},"in_reply_to":"5f7c97a3_78a4cb4b","updated":"2018-06-21 19:26:10.000000000","message":"NA anymore as AttributeDict approach is removed","commit_id":"28fdf468ed8c8856fecfb9ec020e278b0881b3f9"},{"author":{"_account_id":26340,"name":"Ilya Etingof","email":"etingof@gmail.com","username":"etingof"},"change_message_id":"136170d29d5cad834d3295884a89db13ed39f6b2","unresolved":false,"context_lines":[{"line_number":27,"context_line":"class AttributeDict(dict):"},{"line_number":28,"context_line":"    \"\"\"Extension to BIOS attribute collection"},{"line_number":29,"context_line":""},{"line_number":30,"context_line":"    This allows users to update BIOS attributes using dictionary syntax"},{"line_number":31,"context_line":"    that commits changes using Redfish Settings object"},{"line_number":32,"context_line":"    \"\"\""},{"line_number":33,"context_line":""}],"source_content_type":"text/x-python","patch_set":6,"id":"5f7c97a3_d8e4ffe2","line":30,"range":{"start_line":30,"start_character":65,"end_line":30,"end_character":71},"updated":"2018-06-20 12:28:26.000000000","message":"nit: I think they refer to as `dictionary protocol` or `mapping protocol`","commit_id":"28fdf468ed8c8856fecfb9ec020e278b0881b3f9"},{"author":{"_account_id":27909,"name":"Aija Jauntēva","email":"code@clusums.eu","username":"ajya"},"change_message_id":"87f40d6097e3f6ed1027c666e44f4fe24b339259","unresolved":false,"context_lines":[{"line_number":27,"context_line":"class AttributeDict(dict):"},{"line_number":28,"context_line":"    \"\"\"Extension to BIOS attribute collection"},{"line_number":29,"context_line":""},{"line_number":30,"context_line":"    This allows users to update BIOS attributes using dictionary syntax"},{"line_number":31,"context_line":"    that commits changes using Redfish Settings object"},{"line_number":32,"context_line":"    \"\"\""},{"line_number":33,"context_line":""}],"source_content_type":"text/x-python","patch_set":6,"id":"5f7c97a3_2c612cd4","line":30,"range":{"start_line":30,"start_character":65,"end_line":30,"end_character":71},"in_reply_to":"5f7c97a3_d8e4ffe2","updated":"2018-06-21 19:26:10.000000000","message":"NA anymore","commit_id":"28fdf468ed8c8856fecfb9ec020e278b0881b3f9"},{"author":{"_account_id":26340,"name":"Ilya Etingof","email":"etingof@gmail.com","username":"etingof"},"change_message_id":"136170d29d5cad834d3295884a89db13ed39f6b2","unresolved":false,"context_lines":[{"line_number":37,"context_line":"        self._etag \u003d etag"},{"line_number":38,"context_line":"        dict.__init__(self, inpt)"},{"line_number":39,"context_line":""},{"line_number":40,"context_line":"    def __setitem__(self, key, value):"},{"line_number":41,"context_line":"        \"\"\"Commits attribute update to the system."},{"line_number":42,"context_line":""},{"line_number":43,"context_line":"        The underlying dictionary is not changed here, because BIOS"}],"source_content_type":"text/x-python","patch_set":6,"id":"5f7c97a3_1804b77d","line":40,"range":{"start_line":40,"start_character":8,"end_line":40,"end_character":19},"updated":"2018-06-20 12:28:26.000000000","message":"If we also override `update()`, then we could commit many avpairs one-shot.","commit_id":"28fdf468ed8c8856fecfb9ec020e278b0881b3f9"},{"author":{"_account_id":26340,"name":"Ilya Etingof","email":"etingof@gmail.com","username":"etingof"},"change_message_id":"136170d29d5cad834d3295884a89db13ed39f6b2","unresolved":false,"context_lines":[{"line_number":37,"context_line":"        self._etag \u003d etag"},{"line_number":38,"context_line":"        dict.__init__(self, inpt)"},{"line_number":39,"context_line":""},{"line_number":40,"context_line":"    def __setitem__(self, key, value):"},{"line_number":41,"context_line":"        \"\"\"Commits attribute update to the system."},{"line_number":42,"context_line":""},{"line_number":43,"context_line":"        The underlying dictionary is not changed here, because BIOS"}],"source_content_type":"text/x-python","patch_set":6,"id":"5f7c97a3_d8b5df7f","line":40,"range":{"start_line":40,"start_character":26,"end_line":40,"end_character":29},"updated":"2018-06-20 12:28:26.000000000","message":"What happens if we set a non-existing key? Should we prohibit that (by looking up the dict of attributes we received from server) the and raise KeyError?","commit_id":"28fdf468ed8c8856fecfb9ec020e278b0881b3f9"},{"author":{"_account_id":27909,"name":"Aija Jauntēva","email":"code@clusums.eu","username":"ajya"},"change_message_id":"87f40d6097e3f6ed1027c666e44f4fe24b339259","unresolved":false,"context_lines":[{"line_number":37,"context_line":"        self._etag \u003d etag"},{"line_number":38,"context_line":"        dict.__init__(self, inpt)"},{"line_number":39,"context_line":""},{"line_number":40,"context_line":"    def __setitem__(self, key, value):"},{"line_number":41,"context_line":"        \"\"\"Commits attribute update to the system."},{"line_number":42,"context_line":""},{"line_number":43,"context_line":"        The underlying dictionary is not changed here, because BIOS"}],"source_content_type":"text/x-python","patch_set":6,"id":"5f7c97a3_07d44b1e","line":40,"range":{"start_line":40,"start_character":8,"end_line":40,"end_character":19},"in_reply_to":"5f7c97a3_1804b77d","updated":"2018-06-21 19:26:10.000000000","message":"NA anymore","commit_id":"28fdf468ed8c8856fecfb9ec020e278b0881b3f9"},{"author":{"_account_id":27909,"name":"Aija Jauntēva","email":"code@clusums.eu","username":"ajya"},"change_message_id":"87f40d6097e3f6ed1027c666e44f4fe24b339259","unresolved":false,"context_lines":[{"line_number":37,"context_line":"        self._etag \u003d etag"},{"line_number":38,"context_line":"        dict.__init__(self, inpt)"},{"line_number":39,"context_line":""},{"line_number":40,"context_line":"    def __setitem__(self, key, value):"},{"line_number":41,"context_line":"        \"\"\"Commits attribute update to the system."},{"line_number":42,"context_line":""},{"line_number":43,"context_line":"        The underlying dictionary is not changed here, because BIOS"}],"source_content_type":"text/x-python","patch_set":6,"id":"5f7c97a3_fd63e017","line":40,"range":{"start_line":40,"start_character":26,"end_line":40,"end_character":29},"in_reply_to":"5f7c97a3_d8b5df7f","updated":"2018-06-21 19:26:10.000000000","message":"NA anymore","commit_id":"28fdf468ed8c8856fecfb9ec020e278b0881b3f9"},{"author":{"_account_id":26340,"name":"Ilya Etingof","email":"etingof@gmail.com","username":"etingof"},"change_message_id":"136170d29d5cad834d3295884a89db13ed39f6b2","unresolved":false,"context_lines":[{"line_number":40,"context_line":"    def __setitem__(self, key, value):"},{"line_number":41,"context_line":"        \"\"\"Commits attribute update to the system."},{"line_number":42,"context_line":""},{"line_number":43,"context_line":"        The underlying dictionary is not changed here, because BIOS"},{"line_number":44,"context_line":"        attributes cannot be updated directly as system restart is"},{"line_number":45,"context_line":"        necessary."},{"line_number":46,"context_line":"        :param key: Attribute name"}],"source_content_type":"text/x-python","patch_set":6,"id":"5f7c97a3_382c1300","line":43,"range":{"start_line":43,"start_character":12,"end_line":43,"end_character":33},"updated":"2018-06-20 12:28:26.000000000","message":"I feel like this sentence assumes the knowledge of the implementation. May be just note that updates are not immediate so they happen by that point in time?","commit_id":"28fdf468ed8c8856fecfb9ec020e278b0881b3f9"},{"author":{"_account_id":27909,"name":"Aija Jauntēva","email":"code@clusums.eu","username":"ajya"},"change_message_id":"87f40d6097e3f6ed1027c666e44f4fe24b339259","unresolved":false,"context_lines":[{"line_number":40,"context_line":"    def __setitem__(self, key, value):"},{"line_number":41,"context_line":"        \"\"\"Commits attribute update to the system."},{"line_number":42,"context_line":""},{"line_number":43,"context_line":"        The underlying dictionary is not changed here, because BIOS"},{"line_number":44,"context_line":"        attributes cannot be updated directly as system restart is"},{"line_number":45,"context_line":"        necessary."},{"line_number":46,"context_line":"        :param key: Attribute name"}],"source_content_type":"text/x-python","patch_set":6,"id":"5f7c97a3_82e59b0c","line":43,"range":{"start_line":43,"start_character":12,"end_line":43,"end_character":33},"in_reply_to":"5f7c97a3_382c1300","updated":"2018-06-21 19:26:10.000000000","message":"NA anymore","commit_id":"28fdf468ed8c8856fecfb9ec020e278b0881b3f9"},{"author":{"_account_id":26340,"name":"Ilya Etingof","email":"etingof@gmail.com","username":"etingof"},"change_message_id":"136170d29d5cad834d3295884a89db13ed39f6b2","unresolved":false,"context_lines":[{"line_number":57,"context_line":"    reset_bios \u003d common.ActionField(\u0027#Bios.ResetBios\u0027)"},{"line_number":58,"context_line":""},{"line_number":59,"context_line":""},{"line_number":60,"context_line":"class Bios(utils.Observer, base.ResourceBase):"},{"line_number":61,"context_line":""},{"line_number":62,"context_line":"    identity \u003d base.Field(\u0027Id\u0027, required\u003dTrue)"},{"line_number":63,"context_line":"    \"\"\"The Bios resource identity string\"\"\""}],"source_content_type":"text/x-python","patch_set":6,"id":"5f7c97a3_430000ac","line":60,"range":{"start_line":60,"start_character":11,"end_line":60,"end_character":25},"updated":"2018-06-20 12:28:26.000000000","message":"Do we really, really need multiple inheritance here? Would it simplify matters if we would just have `Bios` object holding a reference to the `Observer` object?","commit_id":"28fdf468ed8c8856fecfb9ec020e278b0881b3f9"},{"author":{"_account_id":27909,"name":"Aija Jauntēva","email":"code@clusums.eu","username":"ajya"},"change_message_id":"87f40d6097e3f6ed1027c666e44f4fe24b339259","unresolved":false,"context_lines":[{"line_number":57,"context_line":"    reset_bios \u003d common.ActionField(\u0027#Bios.ResetBios\u0027)"},{"line_number":58,"context_line":""},{"line_number":59,"context_line":""},{"line_number":60,"context_line":"class Bios(utils.Observer, base.ResourceBase):"},{"line_number":61,"context_line":""},{"line_number":62,"context_line":"    identity \u003d base.Field(\u0027Id\u0027, required\u003dTrue)"},{"line_number":63,"context_line":"    \"\"\"The Bios resource identity string\"\"\""}],"source_content_type":"text/x-python","patch_set":6,"id":"5f7c97a3_289fbdb4","line":60,"range":{"start_line":60,"start_character":11,"end_line":60,"end_character":25},"in_reply_to":"5f7c97a3_430000ac","updated":"2018-06-21 19:26:10.000000000","message":"NA anymore","commit_id":"28fdf468ed8c8856fecfb9ec020e278b0881b3f9"},{"author":{"_account_id":26340,"name":"Ilya Etingof","email":"etingof@gmail.com","username":"etingof"},"change_message_id":"136170d29d5cad834d3295884a89db13ed39f6b2","unresolved":false,"context_lines":[{"line_number":104,"context_line":""},{"line_number":105,"context_line":"    @property"},{"line_number":106,"context_line":"    def attributes(self):"},{"line_number":107,"context_line":"        \"\"\"Vendor-specific key-value list of effective BIOS attributes"},{"line_number":108,"context_line":""},{"line_number":109,"context_line":"        Updates to this property will not be applied directly. They will"},{"line_number":110,"context_line":"        be committed to the server first and will be available in"}],"source_content_type":"text/x-python","patch_set":6,"id":"5f7c97a3_584d4fc2","line":107,"range":{"start_line":107,"start_character":37,"end_line":107,"end_character":41},"updated":"2018-06-20 12:28:26.000000000","message":"Well, it\u0027s not exactly the `list` in Python sense, right? may be dict-like object?","commit_id":"28fdf468ed8c8856fecfb9ec020e278b0881b3f9"},{"author":{"_account_id":27909,"name":"Aija Jauntēva","email":"code@clusums.eu","username":"ajya"},"change_message_id":"87f40d6097e3f6ed1027c666e44f4fe24b339259","unresolved":false,"context_lines":[{"line_number":104,"context_line":""},{"line_number":105,"context_line":"    @property"},{"line_number":106,"context_line":"    def attributes(self):"},{"line_number":107,"context_line":"        \"\"\"Vendor-specific key-value list of effective BIOS attributes"},{"line_number":108,"context_line":""},{"line_number":109,"context_line":"        Updates to this property will not be applied directly. They will"},{"line_number":110,"context_line":"        be committed to the server first and will be available in"}],"source_content_type":"text/x-python","patch_set":6,"id":"5f7c97a3_68b05541","line":107,"range":{"start_line":107,"start_character":37,"end_line":107,"end_character":41},"in_reply_to":"5f7c97a3_584d4fc2","updated":"2018-06-21 19:26:10.000000000","message":"replaced with dict","commit_id":"28fdf468ed8c8856fecfb9ec020e278b0881b3f9"},{"author":{"_account_id":26340,"name":"Ilya Etingof","email":"etingof@gmail.com","username":"etingof"},"change_message_id":"136170d29d5cad834d3295884a89db13ed39f6b2","unresolved":false,"context_lines":[{"line_number":115,"context_line":"        return self._attribute_dict"},{"line_number":116,"context_line":""},{"line_number":117,"context_line":"    @attributes.setter"},{"line_number":118,"context_line":"    def attributes(self, value):"},{"line_number":119,"context_line":"        \"\"\"Update a list of key-value attribute pairs."},{"line_number":120,"context_line":""},{"line_number":121,"context_line":"        Updates to this property will not be applied directly. They will"}],"source_content_type":"text/x-python","patch_set":6,"id":"5f7c97a3_18935702","line":118,"range":{"start_line":118,"start_character":8,"end_line":118,"end_character":18},"updated":"2018-06-20 12:28:26.000000000","message":"Alternatively, may be we could offer slightly different way to use this API? Like:\n\n    bios \u003d Bios()\n    bios.attributes.update(foo\u003d\u0027bar\u0027, bar\u003d\u0027foo\u0027)\n\nThe property setter won\u0027t be needed + we would update many attributes at once.","commit_id":"28fdf468ed8c8856fecfb9ec020e278b0881b3f9"},{"author":{"_account_id":27909,"name":"Aija Jauntēva","email":"code@clusums.eu","username":"ajya"},"change_message_id":"87f40d6097e3f6ed1027c666e44f4fe24b339259","unresolved":false,"context_lines":[{"line_number":115,"context_line":"        return self._attribute_dict"},{"line_number":116,"context_line":""},{"line_number":117,"context_line":"    @attributes.setter"},{"line_number":118,"context_line":"    def attributes(self, value):"},{"line_number":119,"context_line":"        \"\"\"Update a list of key-value attribute pairs."},{"line_number":120,"context_line":""},{"line_number":121,"context_line":"        Updates to this property will not be applied directly. They will"}],"source_content_type":"text/x-python","patch_set":6,"id":"5f7c97a3_c2fab375","line":118,"range":{"start_line":118,"start_character":8,"end_line":118,"end_character":18},"in_reply_to":"5f7c97a3_18935702","updated":"2018-06-21 19:26:10.000000000","message":"NA anymore","commit_id":"28fdf468ed8c8856fecfb9ec020e278b0881b3f9"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"40515af39ffc61a04a5fbd8966f9fd0b7d968733","unresolved":false,"context_lines":[{"line_number":141,"context_line":"        if not self._pending_settings_resource:"},{"line_number":142,"context_line":"            self._pending_settings_resource \u003d Bios("},{"line_number":143,"context_line":"                self._conn,"},{"line_number":144,"context_line":"                self._settings._settings_object_idref.resource_uri,"},{"line_number":145,"context_line":"                redfish_version\u003dself.redfish_version)"},{"line_number":146,"context_line":"        self._pending_settings_resource.refresh(force\u003dFalse)"},{"line_number":147,"context_line":"        return self._pending_settings_resource._attributes"}],"source_content_type":"text/x-python","patch_set":6,"id":"5f7c97a3_f36c6208","line":144,"updated":"2018-06-21 14:29:47.000000000","message":"we should not access private methods of _settions_object, maybe expose as self._session.resource_uri propery?","commit_id":"28fdf468ed8c8856fecfb9ec020e278b0881b3f9"},{"author":{"_account_id":27909,"name":"Aija Jauntēva","email":"code@clusums.eu","username":"ajya"},"change_message_id":"87f40d6097e3f6ed1027c666e44f4fe24b339259","unresolved":false,"context_lines":[{"line_number":141,"context_line":"        if not self._pending_settings_resource:"},{"line_number":142,"context_line":"            self._pending_settings_resource \u003d Bios("},{"line_number":143,"context_line":"                self._conn,"},{"line_number":144,"context_line":"                self._settings._settings_object_idref.resource_uri,"},{"line_number":145,"context_line":"                redfish_version\u003dself.redfish_version)"},{"line_number":146,"context_line":"        self._pending_settings_resource.refresh(force\u003dFalse)"},{"line_number":147,"context_line":"        return self._pending_settings_resource._attributes"}],"source_content_type":"text/x-python","patch_set":6,"id":"5f7c97a3_e80ea5e2","line":144,"in_reply_to":"5f7c97a3_f36c6208","updated":"2018-06-21 19:26:10.000000000","message":"exposed and updated","commit_id":"28fdf468ed8c8856fecfb9ec020e278b0881b3f9"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"40515af39ffc61a04a5fbd8966f9fd0b7d968733","unresolved":false,"context_lines":[{"line_number":147,"context_line":"        return self._pending_settings_resource._attributes"},{"line_number":148,"context_line":""},{"line_number":149,"context_line":"    @property"},{"line_number":150,"context_line":"    def attribute_apply_status(self):"},{"line_number":151,"context_line":"        \"\"\"Monitor status of last attribute update\"\"\""},{"line_number":152,"context_line":"        return self._settings"},{"line_number":153,"context_line":""}],"source_content_type":"text/x-python","patch_set":6,"id":"5f7c97a3_9375eece","line":150,"updated":"2018-06-21 14:29:47.000000000","message":"s/apply/application/ ? even better will be pending_attributes_status","commit_id":"28fdf468ed8c8856fecfb9ec020e278b0881b3f9"},{"author":{"_account_id":27909,"name":"Aija Jauntēva","email":"code@clusums.eu","username":"ajya"},"change_message_id":"87f40d6097e3f6ed1027c666e44f4fe24b339259","unresolved":false,"context_lines":[{"line_number":147,"context_line":"        return self._pending_settings_resource._attributes"},{"line_number":148,"context_line":""},{"line_number":149,"context_line":"    @property"},{"line_number":150,"context_line":"    def attribute_apply_status(self):"},{"line_number":151,"context_line":"        \"\"\"Monitor status of last attribute update\"\"\""},{"line_number":152,"context_line":"        return self._settings"},{"line_number":153,"context_line":""}],"source_content_type":"text/x-python","patch_set":6,"id":"5f7c97a3_28325da8","line":150,"in_reply_to":"5f7c97a3_9375eece","updated":"2018-06-21 19:26:10.000000000","message":"NA for now as decided to not expose this yet","commit_id":"28fdf468ed8c8856fecfb9ec020e278b0881b3f9"},{"author":{"_account_id":26340,"name":"Ilya Etingof","email":"etingof@gmail.com","username":"etingof"},"change_message_id":"136170d29d5cad834d3295884a89db13ed39f6b2","unresolved":false,"context_lines":[{"line_number":148,"context_line":""},{"line_number":149,"context_line":"    @property"},{"line_number":150,"context_line":"    def attribute_apply_status(self):"},{"line_number":151,"context_line":"        \"\"\"Monitor status of last attribute update\"\"\""},{"line_number":152,"context_line":"        return self._settings"},{"line_number":153,"context_line":""},{"line_number":154,"context_line":"    def _get_reset_bios_action_element(self):"}],"source_content_type":"text/x-python","patch_set":6,"id":"5f7c97a3_184a7782","line":151,"range":{"start_line":151,"start_character":11,"end_line":151,"end_character":18},"updated":"2018-06-20 12:28:26.000000000","message":"The description is not helpful to me. I just don\nd understand that \u0027monitor\u0027 means for me.","commit_id":"28fdf468ed8c8856fecfb9ec020e278b0881b3f9"},{"author":{"_account_id":27909,"name":"Aija Jauntēva","email":"code@clusums.eu","username":"ajya"},"change_message_id":"87f40d6097e3f6ed1027c666e44f4fe24b339259","unresolved":false,"context_lines":[{"line_number":148,"context_line":""},{"line_number":149,"context_line":"    @property"},{"line_number":150,"context_line":"    def attribute_apply_status(self):"},{"line_number":151,"context_line":"        \"\"\"Monitor status of last attribute update\"\"\""},{"line_number":152,"context_line":"        return self._settings"},{"line_number":153,"context_line":""},{"line_number":154,"context_line":"    def _get_reset_bios_action_element(self):"}],"source_content_type":"text/x-python","patch_set":6,"id":"5f7c97a3_e8278562","line":151,"range":{"start_line":151,"start_character":11,"end_line":151,"end_character":18},"in_reply_to":"5f7c97a3_184a7782","updated":"2018-06-21 19:26:10.000000000","message":"NA for now as decided to not expose this yet","commit_id":"28fdf468ed8c8856fecfb9ec020e278b0881b3f9"}],"sushy/resources/system/system.py":[{"author":{"_account_id":26340,"name":"Ilya Etingof","email":"etingof@gmail.com","username":"etingof"},"change_message_id":"fb8ff1e02914d30210b049ade1064a54059031a8","unresolved":false,"context_lines":[{"line_number":296,"context_line":"    def bios(self):"},{"line_number":297,"context_line":"        \"\"\"Property to reference `Bios` instance"},{"line_number":298,"context_line":""},{"line_number":299,"context_line":"        It is set once when the first time it is queried. On refresh,"},{"line_number":300,"context_line":"        this property is marked as stale (greedy-refresh not done)."},{"line_number":301,"context_line":"        Here the actual refresh of the sub-resource happens, if stale."},{"line_number":302,"context_line":"        \"\"\""}],"source_content_type":"text/x-python","patch_set":4,"id":"5f7c97a3_191d8bbd","line":299,"range":{"start_line":299,"start_character":8,"end_line":299,"end_character":13},"updated":"2018-06-08 17:28:51.000000000","message":"\"It is\" is a bit confusing. What is \"it\"?","commit_id":"0ef22bc867e7d88fd5ad3ed70ed60a721c3c2253"},{"author":{"_account_id":27909,"name":"Aija Jauntēva","email":"code@clusums.eu","username":"ajya"},"change_message_id":"f58a89f78e96d7e48e887462cb982cea308314df","unresolved":false,"context_lines":[{"line_number":296,"context_line":"    def bios(self):"},{"line_number":297,"context_line":"        \"\"\"Property to reference `Bios` instance"},{"line_number":298,"context_line":""},{"line_number":299,"context_line":"        It is set once when the first time it is queried. On refresh,"},{"line_number":300,"context_line":"        this property is marked as stale (greedy-refresh not done)."},{"line_number":301,"context_line":"        Here the actual refresh of the sub-resource happens, if stale."},{"line_number":302,"context_line":"        \"\"\""}],"source_content_type":"text/x-python","patch_set":4,"id":"5f7c97a3_e60c8343","line":299,"range":{"start_line":299,"start_character":8,"end_line":299,"end_character":13},"in_reply_to":"5f7c97a3_191d8bbd","updated":"2018-06-11 20:57:06.000000000","message":"This is copy-paste from already existing docstrings for `processors` and `ethernet_interfaces` to keep the same style and because they behave the same way. \n\nShould this patch fix `processors` and `ethernet_interfaces` docstrings too as I aim for consistency for all 3 docstrings?","commit_id":"0ef22bc867e7d88fd5ad3ed70ed60a721c3c2253"},{"author":{"_account_id":26340,"name":"Ilya Etingof","email":"etingof@gmail.com","username":"etingof"},"change_message_id":"bd18d1ce316065333090e4f0cdb27f7ef13b32b9","unresolved":false,"context_lines":[{"line_number":296,"context_line":"    def bios(self):"},{"line_number":297,"context_line":"        \"\"\"Property to reference `Bios` instance"},{"line_number":298,"context_line":""},{"line_number":299,"context_line":"        It is set once when the first time it is queried. On refresh,"},{"line_number":300,"context_line":"        this property is marked as stale (greedy-refresh not done)."},{"line_number":301,"context_line":"        Here the actual refresh of the sub-resource happens, if stale."},{"line_number":302,"context_line":"        \"\"\""}],"source_content_type":"text/x-python","patch_set":4,"id":"5f7c97a3_a8036c0f","line":299,"range":{"start_line":299,"start_character":8,"end_line":299,"end_character":13},"in_reply_to":"5f7c97a3_e60c8343","updated":"2018-06-14 10:52:53.000000000","message":"\u003e Should this patch fix `processors` and `ethernet_interfaces` docstrings too as I aim for consistency for all 3 docstrings?\n\nOh, God, no! Do not do that!\n\nA followup patch improving code style at all such places at once would be a much better option.","commit_id":"0ef22bc867e7d88fd5ad3ed70ed60a721c3c2253"},{"author":{"_account_id":26340,"name":"Ilya Etingof","email":"etingof@gmail.com","username":"etingof"},"change_message_id":"fb8ff1e02914d30210b049ade1064a54059031a8","unresolved":false,"context_lines":[{"line_number":297,"context_line":"        \"\"\"Property to reference `Bios` instance"},{"line_number":298,"context_line":""},{"line_number":299,"context_line":"        It is set once when the first time it is queried. On refresh,"},{"line_number":300,"context_line":"        this property is marked as stale (greedy-refresh not done)."},{"line_number":301,"context_line":"        Here the actual refresh of the sub-resource happens, if stale."},{"line_number":302,"context_line":"        \"\"\""},{"line_number":303,"context_line":"        if self._bios is None:"}],"source_content_type":"text/x-python","patch_set":4,"id":"5f7c97a3_59278313","line":300,"range":{"start_line":300,"start_character":57,"end_line":300,"end_character":60},"updated":"2018-06-08 17:28:51.000000000","message":"is not done","commit_id":"0ef22bc867e7d88fd5ad3ed70ed60a721c3c2253"},{"author":{"_account_id":26340,"name":"Ilya Etingof","email":"etingof@gmail.com","username":"etingof"},"change_message_id":"fb8ff1e02914d30210b049ade1064a54059031a8","unresolved":false,"context_lines":[{"line_number":297,"context_line":"        \"\"\"Property to reference `Bios` instance"},{"line_number":298,"context_line":""},{"line_number":299,"context_line":"        It is set once when the first time it is queried. On refresh,"},{"line_number":300,"context_line":"        this property is marked as stale (greedy-refresh not done)."},{"line_number":301,"context_line":"        Here the actual refresh of the sub-resource happens, if stale."},{"line_number":302,"context_line":"        \"\"\""},{"line_number":303,"context_line":"        if self._bios is None:"}],"source_content_type":"text/x-python","patch_set":4,"id":"5f7c97a3_7924bf0d","line":300,"range":{"start_line":300,"start_character":48,"end_line":300,"end_character":49},"updated":"2018-06-08 17:28:51.000000000","message":"nit: dash needed?","commit_id":"0ef22bc867e7d88fd5ad3ed70ed60a721c3c2253"},{"author":{"_account_id":27909,"name":"Aija Jauntēva","email":"code@clusums.eu","username":"ajya"},"change_message_id":"c4f38b63ab1e25b58a37584b81f73c647cd3064f","unresolved":false,"context_lines":[{"line_number":297,"context_line":"        \"\"\"Property to reference `Bios` instance"},{"line_number":298,"context_line":""},{"line_number":299,"context_line":"        It is set once when the first time it is queried. On refresh,"},{"line_number":300,"context_line":"        this property is marked as stale (greedy-refresh not done)."},{"line_number":301,"context_line":"        Here the actual refresh of the sub-resource happens, if stale."},{"line_number":302,"context_line":"        \"\"\""},{"line_number":303,"context_line":"        if self._bios is None:"}],"source_content_type":"text/x-python","patch_set":4,"id":"5f7c97a3_b84df53c","line":300,"range":{"start_line":300,"start_character":48,"end_line":300,"end_character":49},"in_reply_to":"5f7c97a3_7924bf0d","updated":"2018-06-18 22:00:31.000000000","message":"keeping the existing style","commit_id":"0ef22bc867e7d88fd5ad3ed70ed60a721c3c2253"},{"author":{"_account_id":26340,"name":"Ilya Etingof","email":"etingof@gmail.com","username":"etingof"},"change_message_id":"fb8ff1e02914d30210b049ade1064a54059031a8","unresolved":false,"context_lines":[{"line_number":298,"context_line":""},{"line_number":299,"context_line":"        It is set once when the first time it is queried. On refresh,"},{"line_number":300,"context_line":"        this property is marked as stale (greedy-refresh not done)."},{"line_number":301,"context_line":"        Here the actual refresh of the sub-resource happens, if stale."},{"line_number":302,"context_line":"        \"\"\""},{"line_number":303,"context_line":"        if self._bios is None:"},{"line_number":304,"context_line":"            self._bios \u003d bios.Bios("}],"source_content_type":"text/x-python","patch_set":4,"id":"5f7c97a3_997e7be1","line":301,"range":{"start_line":301,"start_character":8,"end_line":301,"end_character":12},"updated":"2018-06-08 17:28:51.000000000","message":"nit: \"Here\" is not clear to me. Could you rephrase may be?","commit_id":"0ef22bc867e7d88fd5ad3ed70ed60a721c3c2253"},{"author":{"_account_id":27909,"name":"Aija Jauntēva","email":"code@clusums.eu","username":"ajya"},"change_message_id":"c4f38b63ab1e25b58a37584b81f73c647cd3064f","unresolved":false,"context_lines":[{"line_number":298,"context_line":""},{"line_number":299,"context_line":"        It is set once when the first time it is queried. On refresh,"},{"line_number":300,"context_line":"        this property is marked as stale (greedy-refresh not done)."},{"line_number":301,"context_line":"        Here the actual refresh of the sub-resource happens, if stale."},{"line_number":302,"context_line":"        \"\"\""},{"line_number":303,"context_line":"        if self._bios is None:"},{"line_number":304,"context_line":"            self._bios \u003d bios.Bios("}],"source_content_type":"text/x-python","patch_set":4,"id":"5f7c97a3_185669d0","line":301,"range":{"start_line":301,"start_character":8,"end_line":301,"end_character":12},"in_reply_to":"5f7c97a3_997e7be1","updated":"2018-06-18 22:00:31.000000000","message":"keeping the existing style","commit_id":"0ef22bc867e7d88fd5ad3ed70ed60a721c3c2253"},{"author":{"_account_id":26340,"name":"Ilya Etingof","email":"etingof@gmail.com","username":"etingof"},"change_message_id":"136170d29d5cad834d3295884a89db13ed39f6b2","unresolved":false,"context_lines":[{"line_number":296,"context_line":"    def bios(self):"},{"line_number":297,"context_line":"        \"\"\"Property to reference `Bios` instance"},{"line_number":298,"context_line":""},{"line_number":299,"context_line":"        It is set once when the first time it is queried. On refresh,"},{"line_number":300,"context_line":"        this property is marked as stale (greedy-refresh not done)."},{"line_number":301,"context_line":"        Here the actual refresh of the sub-resource happens, if stale."},{"line_number":302,"context_line":"        \"\"\""}],"source_content_type":"text/x-python","patch_set":6,"id":"5f7c97a3_b806e320","line":299,"range":{"start_line":299,"start_character":8,"end_line":299,"end_character":57},"updated":"2018-06-20 12:28:26.000000000","message":"Is this an implementation detail which the end user never notices?","commit_id":"28fdf468ed8c8856fecfb9ec020e278b0881b3f9"},{"author":{"_account_id":26340,"name":"Ilya Etingof","email":"etingof@gmail.com","username":"etingof"},"change_message_id":"136170d29d5cad834d3295884a89db13ed39f6b2","unresolved":false,"context_lines":[{"line_number":296,"context_line":"    def bios(self):"},{"line_number":297,"context_line":"        \"\"\"Property to reference `Bios` instance"},{"line_number":298,"context_line":""},{"line_number":299,"context_line":"        It is set once when the first time it is queried. On refresh,"},{"line_number":300,"context_line":"        this property is marked as stale (greedy-refresh not done)."},{"line_number":301,"context_line":"        Here the actual refresh of the sub-resource happens, if stale."},{"line_number":302,"context_line":"        \"\"\""}],"source_content_type":"text/x-python","patch_set":6,"id":"5f7c97a3_58054f13","line":299,"range":{"start_line":299,"start_character":58,"end_line":299,"end_character":69},"updated":"2018-06-20 12:28:26.000000000","message":"What is that `refresh`? When and how it happens is not apparent to me while I am reading this docstring.\n\nIf I am your user and I consider reading from this `.bios` property, what do you like to to know? ;-)","commit_id":"28fdf468ed8c8856fecfb9ec020e278b0881b3f9"},{"author":{"_account_id":27909,"name":"Aija Jauntēva","email":"code@clusums.eu","username":"ajya"},"change_message_id":"87f40d6097e3f6ed1027c666e44f4fe24b339259","unresolved":false,"context_lines":[{"line_number":296,"context_line":"    def bios(self):"},{"line_number":297,"context_line":"        \"\"\"Property to reference `Bios` instance"},{"line_number":298,"context_line":""},{"line_number":299,"context_line":"        It is set once when the first time it is queried. On refresh,"},{"line_number":300,"context_line":"        this property is marked as stale (greedy-refresh not done)."},{"line_number":301,"context_line":"        Here the actual refresh of the sub-resource happens, if stale."},{"line_number":302,"context_line":"        \"\"\""}],"source_content_type":"text/x-python","patch_set":6,"id":"5f7c97a3_28c01d50","line":299,"range":{"start_line":299,"start_character":58,"end_line":299,"end_character":69},"in_reply_to":"5f7c97a3_58054f13","updated":"2018-06-21 19:26:10.000000000","message":"this is the very same copy-paste from sibling properties - ethernet_interfaces, processors. Will revisit in a separate cleanup","commit_id":"28fdf468ed8c8856fecfb9ec020e278b0881b3f9"},{"author":{"_account_id":27909,"name":"Aija Jauntēva","email":"code@clusums.eu","username":"ajya"},"change_message_id":"87f40d6097e3f6ed1027c666e44f4fe24b339259","unresolved":false,"context_lines":[{"line_number":296,"context_line":"    def bios(self):"},{"line_number":297,"context_line":"        \"\"\"Property to reference `Bios` instance"},{"line_number":298,"context_line":""},{"line_number":299,"context_line":"        It is set once when the first time it is queried. On refresh,"},{"line_number":300,"context_line":"        this property is marked as stale (greedy-refresh not done)."},{"line_number":301,"context_line":"        Here the actual refresh of the sub-resource happens, if stale."},{"line_number":302,"context_line":"        \"\"\""}],"source_content_type":"text/x-python","patch_set":6,"id":"5f7c97a3_c8b08900","line":299,"range":{"start_line":299,"start_character":8,"end_line":299,"end_character":57},"in_reply_to":"5f7c97a3_b806e320","updated":"2018-06-21 19:26:10.000000000","message":"same as above","commit_id":"28fdf468ed8c8856fecfb9ec020e278b0881b3f9"}],"sushy/tests/unit/resources/system/test_bios.py":[{"author":{"_account_id":26340,"name":"Ilya Etingof","email":"etingof@gmail.com","username":"etingof"},"change_message_id":"fb8ff1e02914d30210b049ade1064a54059031a8","unresolved":false,"context_lines":[{"line_number":26,"context_line":"    def setUp(self):"},{"line_number":27,"context_line":"        super(BiosTestCase, self).setUp()"},{"line_number":28,"context_line":"        self.conn \u003d mock.Mock()"},{"line_number":29,"context_line":"        bios_json \u003d None"},{"line_number":30,"context_line":"        bios_settings_json \u003d None"},{"line_number":31,"context_line":"        with open(\u0027sushy/tests/unit/json_samples/bios.json\u0027, \u0027r\u0027) as f:"},{"line_number":32,"context_line":"            bios_json \u003d json.loads(f.read())"},{"line_number":33,"context_line":"        with open(\u0027sushy/tests/unit/json_samples/bios_settings.json\u0027,"}],"source_content_type":"text/x-python","patch_set":4,"id":"5f7c97a3_b9ea5771","line":30,"range":{"start_line":29,"start_character":8,"end_line":30,"end_character":33},"updated":"2018-06-08 17:28:51.000000000","message":"Why do you need these assignments?","commit_id":"0ef22bc867e7d88fd5ad3ed70ed60a721c3c2253"},{"author":{"_account_id":27909,"name":"Aija Jauntēva","email":"code@clusums.eu","username":"ajya"},"change_message_id":"f58a89f78e96d7e48e887462cb982cea308314df","unresolved":false,"context_lines":[{"line_number":26,"context_line":"    def setUp(self):"},{"line_number":27,"context_line":"        super(BiosTestCase, self).setUp()"},{"line_number":28,"context_line":"        self.conn \u003d mock.Mock()"},{"line_number":29,"context_line":"        bios_json \u003d None"},{"line_number":30,"context_line":"        bios_settings_json \u003d None"},{"line_number":31,"context_line":"        with open(\u0027sushy/tests/unit/json_samples/bios.json\u0027, \u0027r\u0027) as f:"},{"line_number":32,"context_line":"            bios_json \u003d json.loads(f.read())"},{"line_number":33,"context_line":"        with open(\u0027sushy/tests/unit/json_samples/bios_settings.json\u0027,"}],"source_content_type":"text/x-python","patch_set":4,"id":"5f7c97a3_e111cd54","line":30,"range":{"start_line":29,"start_character":8,"end_line":30,"end_character":33},"in_reply_to":"5f7c97a3_b9ea5771","updated":"2018-06-11 20:57:06.000000000","message":"removed","commit_id":"0ef22bc867e7d88fd5ad3ed70ed60a721c3c2253"},{"author":{"_account_id":26340,"name":"Ilya Etingof","email":"etingof@gmail.com","username":"etingof"},"change_message_id":"bd18d1ce316065333090e4f0cdb27f7ef13b32b9","unresolved":false,"context_lines":[{"line_number":26,"context_line":"    def setUp(self):"},{"line_number":27,"context_line":"        super(BiosTestCase, self).setUp()"},{"line_number":28,"context_line":"        self.conn \u003d mock.Mock()"},{"line_number":29,"context_line":"        bios_json \u003d None"},{"line_number":30,"context_line":"        bios_settings_json \u003d None"},{"line_number":31,"context_line":"        with open(\u0027sushy/tests/unit/json_samples/bios.json\u0027, \u0027r\u0027) as f:"},{"line_number":32,"context_line":"            bios_json \u003d json.loads(f.read())"},{"line_number":33,"context_line":"        with open(\u0027sushy/tests/unit/json_samples/bios_settings.json\u0027,"}],"source_content_type":"text/x-python","patch_set":4,"id":"5f7c97a3_6bff8e00","line":30,"range":{"start_line":29,"start_character":8,"end_line":30,"end_character":33},"in_reply_to":"5f7c97a3_e111cd54","updated":"2018-06-14 10:52:53.000000000","message":"Done","commit_id":"0ef22bc867e7d88fd5ad3ed70ed60a721c3c2253"},{"author":{"_account_id":26340,"name":"Ilya Etingof","email":"etingof@gmail.com","username":"etingof"},"change_message_id":"fb8ff1e02914d30210b049ade1064a54059031a8","unresolved":false,"context_lines":[{"line_number":28,"context_line":"        self.conn \u003d mock.Mock()"},{"line_number":29,"context_line":"        bios_json \u003d None"},{"line_number":30,"context_line":"        bios_settings_json \u003d None"},{"line_number":31,"context_line":"        with open(\u0027sushy/tests/unit/json_samples/bios.json\u0027, \u0027r\u0027) as f:"},{"line_number":32,"context_line":"            bios_json \u003d json.loads(f.read())"},{"line_number":33,"context_line":"        with open(\u0027sushy/tests/unit/json_samples/bios_settings.json\u0027,"},{"line_number":34,"context_line":"                  \u0027r\u0027) as f:"}],"source_content_type":"text/x-python","patch_set":4,"id":"5f7c97a3_19f90b4d","line":31,"range":{"start_line":31,"start_character":61,"end_line":31,"end_character":64},"updated":"2018-06-08 17:28:51.000000000","message":"\u0027r\u0027 is not needed","commit_id":"0ef22bc867e7d88fd5ad3ed70ed60a721c3c2253"},{"author":{"_account_id":27909,"name":"Aija Jauntēva","email":"code@clusums.eu","username":"ajya"},"change_message_id":"f58a89f78e96d7e48e887462cb982cea308314df","unresolved":false,"context_lines":[{"line_number":28,"context_line":"        self.conn \u003d mock.Mock()"},{"line_number":29,"context_line":"        bios_json \u003d None"},{"line_number":30,"context_line":"        bios_settings_json \u003d None"},{"line_number":31,"context_line":"        with open(\u0027sushy/tests/unit/json_samples/bios.json\u0027, \u0027r\u0027) as f:"},{"line_number":32,"context_line":"            bios_json \u003d json.loads(f.read())"},{"line_number":33,"context_line":"        with open(\u0027sushy/tests/unit/json_samples/bios_settings.json\u0027,"},{"line_number":34,"context_line":"                  \u0027r\u0027) as f:"}],"source_content_type":"text/x-python","patch_set":4,"id":"5f7c97a3_819fb9b2","line":31,"range":{"start_line":31,"start_character":61,"end_line":31,"end_character":64},"in_reply_to":"5f7c97a3_19f90b4d","updated":"2018-06-11 20:57:06.000000000","message":"here I used the same pattern as in already existing tests to be consistent across the project.\n\nI can update this, but to keep consistency should other parts of the project updated here or in separate patch? (see test_system, test_processor, test_ethernet_interfaces)","commit_id":"0ef22bc867e7d88fd5ad3ed70ed60a721c3c2253"},{"author":{"_account_id":26340,"name":"Ilya Etingof","email":"etingof@gmail.com","username":"etingof"},"change_message_id":"bd18d1ce316065333090e4f0cdb27f7ef13b32b9","unresolved":false,"context_lines":[{"line_number":28,"context_line":"        self.conn \u003d mock.Mock()"},{"line_number":29,"context_line":"        bios_json \u003d None"},{"line_number":30,"context_line":"        bios_settings_json \u003d None"},{"line_number":31,"context_line":"        with open(\u0027sushy/tests/unit/json_samples/bios.json\u0027, \u0027r\u0027) as f:"},{"line_number":32,"context_line":"            bios_json \u003d json.loads(f.read())"},{"line_number":33,"context_line":"        with open(\u0027sushy/tests/unit/json_samples/bios_settings.json\u0027,"},{"line_number":34,"context_line":"                  \u0027r\u0027) as f:"}],"source_content_type":"text/x-python","patch_set":4,"id":"5f7c97a3_6b28ee84","line":31,"range":{"start_line":31,"start_character":61,"end_line":31,"end_character":64},"in_reply_to":"5f7c97a3_819fb9b2","updated":"2018-06-14 10:52:53.000000000","message":"No-no, do not touch irrelevant pieces within *this* patch. Do a followup or an independent patch against current master.","commit_id":"0ef22bc867e7d88fd5ad3ed70ed60a721c3c2253"},{"author":{"_account_id":26340,"name":"Ilya Etingof","email":"etingof@gmail.com","username":"etingof"},"change_message_id":"fb8ff1e02914d30210b049ade1064a54059031a8","unresolved":false,"context_lines":[{"line_number":29,"context_line":"        bios_json \u003d None"},{"line_number":30,"context_line":"        bios_settings_json \u003d None"},{"line_number":31,"context_line":"        with open(\u0027sushy/tests/unit/json_samples/bios.json\u0027, \u0027r\u0027) as f:"},{"line_number":32,"context_line":"            bios_json \u003d json.loads(f.read())"},{"line_number":33,"context_line":"        with open(\u0027sushy/tests/unit/json_samples/bios_settings.json\u0027,"},{"line_number":34,"context_line":"                  \u0027r\u0027) as f:"},{"line_number":35,"context_line":"            bios_settings_json \u003d json.loads(f.read())"}],"source_content_type":"text/x-python","patch_set":4,"id":"5f7c97a3_39f6475f","line":32,"range":{"start_line":32,"start_character":24,"end_line":32,"end_character":44},"updated":"2018-06-08 17:28:51.000000000","message":"Can be `json.load(f)`","commit_id":"0ef22bc867e7d88fd5ad3ed70ed60a721c3c2253"},{"author":{"_account_id":27909,"name":"Aija Jauntēva","email":"code@clusums.eu","username":"ajya"},"change_message_id":"f58a89f78e96d7e48e887462cb982cea308314df","unresolved":false,"context_lines":[{"line_number":29,"context_line":"        bios_json \u003d None"},{"line_number":30,"context_line":"        bios_settings_json \u003d None"},{"line_number":31,"context_line":"        with open(\u0027sushy/tests/unit/json_samples/bios.json\u0027, \u0027r\u0027) as f:"},{"line_number":32,"context_line":"            bios_json \u003d json.loads(f.read())"},{"line_number":33,"context_line":"        with open(\u0027sushy/tests/unit/json_samples/bios_settings.json\u0027,"},{"line_number":34,"context_line":"                  \u0027r\u0027) as f:"},{"line_number":35,"context_line":"            bios_settings_json \u003d json.loads(f.read())"}],"source_content_type":"text/x-python","patch_set":4,"id":"5f7c97a3_41a52102","line":32,"range":{"start_line":32,"start_character":24,"end_line":32,"end_character":44},"in_reply_to":"5f7c97a3_39f6475f","updated":"2018-06-11 20:57:06.000000000","message":"same comment as above","commit_id":"0ef22bc867e7d88fd5ad3ed70ed60a721c3c2253"},{"author":{"_account_id":26340,"name":"Ilya Etingof","email":"etingof@gmail.com","username":"etingof"},"change_message_id":"bd18d1ce316065333090e4f0cdb27f7ef13b32b9","unresolved":false,"context_lines":[{"line_number":29,"context_line":"        bios_json \u003d None"},{"line_number":30,"context_line":"        bios_settings_json \u003d None"},{"line_number":31,"context_line":"        with open(\u0027sushy/tests/unit/json_samples/bios.json\u0027, \u0027r\u0027) as f:"},{"line_number":32,"context_line":"            bios_json \u003d json.loads(f.read())"},{"line_number":33,"context_line":"        with open(\u0027sushy/tests/unit/json_samples/bios_settings.json\u0027,"},{"line_number":34,"context_line":"                  \u0027r\u0027) as f:"},{"line_number":35,"context_line":"            bios_settings_json \u003d json.loads(f.read())"}],"source_content_type":"text/x-python","patch_set":4,"id":"5f7c97a3_2b1e765e","line":32,"range":{"start_line":32,"start_character":24,"end_line":32,"end_character":44},"in_reply_to":"5f7c97a3_41a52102","updated":"2018-06-14 10:52:53.000000000","message":"Done","commit_id":"0ef22bc867e7d88fd5ad3ed70ed60a721c3c2253"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"40515af39ffc61a04a5fbd8966f9fd0b7d968733","unresolved":false,"context_lines":[{"line_number":64,"context_line":"    def test_set_attribute(self):"},{"line_number":65,"context_line":"        self.sys_bios.attributes[\u0027ProcTurboMode\u0027] \u003d \u0027Disabled\u0027"},{"line_number":66,"context_line":"        self.assertEqual(\u0027Enabled\u0027,"},{"line_number":67,"context_line":"                         self.sys_bios.attributes[\u0027ProcTurboMode\u0027])"},{"line_number":68,"context_line":"        self.sys_bios._conn.patch.assert_called_once_with("},{"line_number":69,"context_line":"            \u0027/redfish/v1/Systems/437XR1138R2/BIOS/Settings\u0027,"},{"line_number":70,"context_line":"            data\u003d{\u0027Attributes\u0027: {\u0027ProcTurboMode\u0027: \u0027Disabled\u0027}},"}],"source_content_type":"text/x-python","patch_set":6,"id":"5f7c97a3_d367e623","line":67,"updated":"2018-06-21 14:29:47.000000000","message":"oh, this looks really confusing.. we\u0027re changing something that looks like a dictionary, but it does not change. To be honest, I\u0027d prefer we stop doing this magic around dicts, observes and notifications, and just use current_attributes/pending_attributes/pending_attibutes_status/set_attributes","commit_id":"28fdf468ed8c8856fecfb9ec020e278b0881b3f9"},{"author":{"_account_id":27909,"name":"Aija Jauntēva","email":"code@clusums.eu","username":"ajya"},"change_message_id":"87f40d6097e3f6ed1027c666e44f4fe24b339259","unresolved":false,"context_lines":[{"line_number":64,"context_line":"    def test_set_attribute(self):"},{"line_number":65,"context_line":"        self.sys_bios.attributes[\u0027ProcTurboMode\u0027] \u003d \u0027Disabled\u0027"},{"line_number":66,"context_line":"        self.assertEqual(\u0027Enabled\u0027,"},{"line_number":67,"context_line":"                         self.sys_bios.attributes[\u0027ProcTurboMode\u0027])"},{"line_number":68,"context_line":"        self.sys_bios._conn.patch.assert_called_once_with("},{"line_number":69,"context_line":"            \u0027/redfish/v1/Systems/437XR1138R2/BIOS/Settings\u0027,"},{"line_number":70,"context_line":"            data\u003d{\u0027Attributes\u0027: {\u0027ProcTurboMode\u0027: \u0027Disabled\u0027}},"}],"source_content_type":"text/x-python","patch_set":6,"id":"5f7c97a3_88ce1181","line":67,"in_reply_to":"5f7c97a3_d367e623","updated":"2018-06-21 19:26:10.000000000","message":"NA, as removed the magic.","commit_id":"28fdf468ed8c8856fecfb9ec020e278b0881b3f9"}],"sushy/tests/unit/resources/system/test_system.py":[{"author":{"_account_id":26340,"name":"Ilya Etingof","email":"etingof@gmail.com","username":"etingof"},"change_message_id":"fb8ff1e02914d30210b049ade1064a54059031a8","unresolved":false,"context_lines":[{"line_number":384,"context_line":"    def test_bios(self):"},{"line_number":385,"context_line":"        self.conn.get.return_value.json.reset_mock()"},{"line_number":386,"context_line":"        bios_return_value \u003d None"},{"line_number":387,"context_line":"        with open(\u0027sushy/tests/unit/json_samples/bios.json\u0027, \u0027r\u0027) as f:"},{"line_number":388,"context_line":"            bios_return_value \u003d json.loads(f.read())"},{"line_number":389,"context_line":"        self.conn.get.return_value.json.side_effect \u003d [bios_return_value]"},{"line_number":390,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"5f7c97a3_f9cbef1a","line":387,"range":{"start_line":387,"start_character":58,"end_line":387,"end_character":65},"updated":"2018-06-08 17:28:51.000000000","message":"This is default and can be omitted","commit_id":"0ef22bc867e7d88fd5ad3ed70ed60a721c3c2253"},{"author":{"_account_id":27909,"name":"Aija Jauntēva","email":"code@clusums.eu","username":"ajya"},"change_message_id":"f58a89f78e96d7e48e887462cb982cea308314df","unresolved":false,"context_lines":[{"line_number":384,"context_line":"    def test_bios(self):"},{"line_number":385,"context_line":"        self.conn.get.return_value.json.reset_mock()"},{"line_number":386,"context_line":"        bios_return_value \u003d None"},{"line_number":387,"context_line":"        with open(\u0027sushy/tests/unit/json_samples/bios.json\u0027, \u0027r\u0027) as f:"},{"line_number":388,"context_line":"            bios_return_value \u003d json.loads(f.read())"},{"line_number":389,"context_line":"        self.conn.get.return_value.json.side_effect \u003d [bios_return_value]"},{"line_number":390,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"5f7c97a3_e1db0d7a","line":387,"range":{"start_line":387,"start_character":58,"end_line":387,"end_character":65},"in_reply_to":"5f7c97a3_f9cbef1a","updated":"2018-06-11 20:57:06.000000000","message":"same question as in test_bios.py about consistency","commit_id":"0ef22bc867e7d88fd5ad3ed70ed60a721c3c2253"},{"author":{"_account_id":26340,"name":"Ilya Etingof","email":"etingof@gmail.com","username":"etingof"},"change_message_id":"fb8ff1e02914d30210b049ade1064a54059031a8","unresolved":false,"context_lines":[{"line_number":385,"context_line":"        self.conn.get.return_value.json.reset_mock()"},{"line_number":386,"context_line":"        bios_return_value \u003d None"},{"line_number":387,"context_line":"        with open(\u0027sushy/tests/unit/json_samples/bios.json\u0027, \u0027r\u0027) as f:"},{"line_number":388,"context_line":"            bios_return_value \u003d json.loads(f.read())"},{"line_number":389,"context_line":"        self.conn.get.return_value.json.side_effect \u003d [bios_return_value]"},{"line_number":390,"context_line":""},{"line_number":391,"context_line":"        self.assertIsNone(self.sys_inst._bios)"}],"source_content_type":"text/x-python","patch_set":4,"id":"5f7c97a3_79d7dfc0","line":388,"range":{"start_line":388,"start_character":32,"end_line":388,"end_character":52},"updated":"2018-06-08 17:28:51.000000000","message":"Can also do:\n\n    json.load(f)","commit_id":"0ef22bc867e7d88fd5ad3ed70ed60a721c3c2253"},{"author":{"_account_id":27909,"name":"Aija Jauntēva","email":"code@clusums.eu","username":"ajya"},"change_message_id":"c4f38b63ab1e25b58a37584b81f73c647cd3064f","unresolved":false,"context_lines":[{"line_number":385,"context_line":"        self.conn.get.return_value.json.reset_mock()"},{"line_number":386,"context_line":"        bios_return_value \u003d None"},{"line_number":387,"context_line":"        with open(\u0027sushy/tests/unit/json_samples/bios.json\u0027, \u0027r\u0027) as f:"},{"line_number":388,"context_line":"            bios_return_value \u003d json.loads(f.read())"},{"line_number":389,"context_line":"        self.conn.get.return_value.json.side_effect \u003d [bios_return_value]"},{"line_number":390,"context_line":""},{"line_number":391,"context_line":"        self.assertIsNone(self.sys_inst._bios)"}],"source_content_type":"text/x-python","patch_set":4,"id":"5f7c97a3_b86655bb","line":388,"range":{"start_line":388,"start_character":32,"end_line":388,"end_character":52},"in_reply_to":"5f7c97a3_79d7dfc0","updated":"2018-06-18 22:00:31.000000000","message":"keeping existing style","commit_id":"0ef22bc867e7d88fd5ad3ed70ed60a721c3c2253"}],"sushy/utils.py":[{"author":{"_account_id":26340,"name":"Ilya Etingof","email":"etingof@gmail.com","username":"etingof"},"change_message_id":"136170d29d5cad834d3295884a89db13ed39f6b2","unresolved":false,"context_lines":[{"line_number":109,"context_line":""},{"line_number":110,"context_line":""},{"line_number":111,"context_line":"class Observer(object):"},{"line_number":112,"context_line":"    \"\"\"Observer that will hold instances that will watch for events\"\"\""},{"line_number":113,"context_line":""},{"line_number":114,"context_line":"    _observers \u003d []"},{"line_number":115,"context_line":""}],"source_content_type":"text/x-python","patch_set":6,"id":"5f7c97a3_a390f497","line":112,"range":{"start_line":112,"start_character":21,"end_line":112,"end_character":25},"updated":"2018-06-20 12:28:26.000000000","message":"nit: I think present tense is traditionally used","commit_id":"28fdf468ed8c8856fecfb9ec020e278b0881b3f9"},{"author":{"_account_id":27909,"name":"Aija Jauntēva","email":"code@clusums.eu","username":"ajya"},"change_message_id":"87f40d6097e3f6ed1027c666e44f4fe24b339259","unresolved":false,"context_lines":[{"line_number":109,"context_line":""},{"line_number":110,"context_line":""},{"line_number":111,"context_line":"class Observer(object):"},{"line_number":112,"context_line":"    \"\"\"Observer that will hold instances that will watch for events\"\"\""},{"line_number":113,"context_line":""},{"line_number":114,"context_line":"    _observers \u003d []"},{"line_number":115,"context_line":""}],"source_content_type":"text/x-python","patch_set":6,"id":"5f7c97a3_08a0c1a4","line":112,"range":{"start_line":112,"start_character":21,"end_line":112,"end_character":25},"in_reply_to":"5f7c97a3_a390f497","updated":"2018-06-21 19:26:10.000000000","message":"NA as removed this approach","commit_id":"28fdf468ed8c8856fecfb9ec020e278b0881b3f9"},{"author":{"_account_id":26340,"name":"Ilya Etingof","email":"etingof@gmail.com","username":"etingof"},"change_message_id":"136170d29d5cad834d3295884a89db13ed39f6b2","unresolved":false,"context_lines":[{"line_number":111,"context_line":"class Observer(object):"},{"line_number":112,"context_line":"    \"\"\"Observer that will hold instances that will watch for events\"\"\""},{"line_number":113,"context_line":""},{"line_number":114,"context_line":"    _observers \u003d []"},{"line_number":115,"context_line":""},{"line_number":116,"context_line":"    def __init__(self):"},{"line_number":117,"context_line":"        self._observers.append(self)"}],"source_content_type":"text/x-python","patch_set":6,"id":"5f7c97a3_c33e508a","line":114,"range":{"start_line":114,"start_character":4,"end_line":114,"end_character":14},"updated":"2018-06-20 12:28:26.000000000","message":"Why do we need more than one instance of the `Observer` class? I do not see how those instances can be different from each other?","commit_id":"28fdf468ed8c8856fecfb9ec020e278b0881b3f9"},{"author":{"_account_id":27909,"name":"Aija Jauntēva","email":"code@clusums.eu","username":"ajya"},"change_message_id":"87f40d6097e3f6ed1027c666e44f4fe24b339259","unresolved":false,"context_lines":[{"line_number":111,"context_line":"class Observer(object):"},{"line_number":112,"context_line":"    \"\"\"Observer that will hold instances that will watch for events\"\"\""},{"line_number":113,"context_line":""},{"line_number":114,"context_line":"    _observers \u003d []"},{"line_number":115,"context_line":""},{"line_number":116,"context_line":"    def __init__(self):"},{"line_number":117,"context_line":"        self._observers.append(self)"}],"source_content_type":"text/x-python","patch_set":6,"id":"5f7c97a3_e8aa2582","line":114,"range":{"start_line":114,"start_character":4,"end_line":114,"end_character":14},"in_reply_to":"5f7c97a3_c33e508a","updated":"2018-06-21 19:26:10.000000000","message":"NA as removed this approach","commit_id":"28fdf468ed8c8856fecfb9ec020e278b0881b3f9"},{"author":{"_account_id":26340,"name":"Ilya Etingof","email":"etingof@gmail.com","username":"etingof"},"change_message_id":"136170d29d5cad834d3295884a89db13ed39f6b2","unresolved":false,"context_lines":[{"line_number":114,"context_line":"    _observers \u003d []"},{"line_number":115,"context_line":""},{"line_number":116,"context_line":"    def __init__(self):"},{"line_number":117,"context_line":"        self._observers.append(self)"},{"line_number":118,"context_line":"        self._observables \u003d {}"},{"line_number":119,"context_line":""},{"line_number":120,"context_line":"    def register(self, event_name, callback):"}],"source_content_type":"text/x-python","patch_set":6,"id":"5f7c97a3_a36234d8","line":117,"range":{"start_line":117,"start_character":0,"end_line":117,"end_character":36},"updated":"2018-06-20 12:28:26.000000000","message":"This is arguably better to have in `__new__()`","commit_id":"28fdf468ed8c8856fecfb9ec020e278b0881b3f9"},{"author":{"_account_id":27909,"name":"Aija Jauntēva","email":"code@clusums.eu","username":"ajya"},"change_message_id":"87f40d6097e3f6ed1027c666e44f4fe24b339259","unresolved":false,"context_lines":[{"line_number":114,"context_line":"    _observers \u003d []"},{"line_number":115,"context_line":""},{"line_number":116,"context_line":"    def __init__(self):"},{"line_number":117,"context_line":"        self._observers.append(self)"},{"line_number":118,"context_line":"        self._observables \u003d {}"},{"line_number":119,"context_line":""},{"line_number":120,"context_line":"    def register(self, event_name, callback):"}],"source_content_type":"text/x-python","patch_set":6,"id":"5f7c97a3_a890ad4f","line":117,"range":{"start_line":117,"start_character":0,"end_line":117,"end_character":36},"in_reply_to":"5f7c97a3_a36234d8","updated":"2018-06-21 19:26:10.000000000","message":"NA as removed this approach","commit_id":"28fdf468ed8c8856fecfb9ec020e278b0881b3f9"},{"author":{"_account_id":26340,"name":"Ilya Etingof","email":"etingof@gmail.com","username":"etingof"},"change_message_id":"136170d29d5cad834d3295884a89db13ed39f6b2","unresolved":false,"context_lines":[{"line_number":120,"context_line":"    def register(self, event_name, callback):"},{"line_number":121,"context_line":"        \"\"\"Register this observer for an event"},{"line_number":122,"context_line":""},{"line_number":123,"context_line":"        :param event_name: Event identifyer"},{"line_number":124,"context_line":"        :param callback: Function to execute when event occurrs"},{"line_number":125,"context_line":"        \"\"\""},{"line_number":126,"context_line":"        self._observables[event_name] \u003d callback"}],"source_content_type":"text/x-python","patch_set":6,"id":"5f7c97a3_e3f34c08","line":123,"range":{"start_line":123,"start_character":33,"end_line":123,"end_character":43},"updated":"2018-06-20 12:28:26.000000000","message":"typo","commit_id":"28fdf468ed8c8856fecfb9ec020e278b0881b3f9"},{"author":{"_account_id":27909,"name":"Aija Jauntēva","email":"code@clusums.eu","username":"ajya"},"change_message_id":"87f40d6097e3f6ed1027c666e44f4fe24b339259","unresolved":false,"context_lines":[{"line_number":120,"context_line":"    def register(self, event_name, callback):"},{"line_number":121,"context_line":"        \"\"\"Register this observer for an event"},{"line_number":122,"context_line":""},{"line_number":123,"context_line":"        :param event_name: Event identifyer"},{"line_number":124,"context_line":"        :param callback: Function to execute when event occurrs"},{"line_number":125,"context_line":"        \"\"\""},{"line_number":126,"context_line":"        self._observables[event_name] \u003d callback"}],"source_content_type":"text/x-python","patch_set":6,"id":"5f7c97a3_8287dbb6","line":123,"range":{"start_line":123,"start_character":33,"end_line":123,"end_character":43},"in_reply_to":"5f7c97a3_e3f34c08","updated":"2018-06-21 19:26:10.000000000","message":"NA as removed this approach","commit_id":"28fdf468ed8c8856fecfb9ec020e278b0881b3f9"},{"author":{"_account_id":26340,"name":"Ilya Etingof","email":"etingof@gmail.com","username":"etingof"},"change_message_id":"136170d29d5cad834d3295884a89db13ed39f6b2","unresolved":false,"context_lines":[{"line_number":121,"context_line":"        \"\"\"Register this observer for an event"},{"line_number":122,"context_line":""},{"line_number":123,"context_line":"        :param event_name: Event identifyer"},{"line_number":124,"context_line":"        :param callback: Function to execute when event occurrs"},{"line_number":125,"context_line":"        \"\"\""},{"line_number":126,"context_line":"        self._observables[event_name] \u003d callback"},{"line_number":127,"context_line":""}],"source_content_type":"text/x-python","patch_set":6,"id":"5f7c97a3_c3f09000","line":124,"range":{"start_line":124,"start_character":56,"end_line":124,"end_character":63},"updated":"2018-06-20 12:28:26.000000000","message":"typo","commit_id":"28fdf468ed8c8856fecfb9ec020e278b0881b3f9"},{"author":{"_account_id":27909,"name":"Aija Jauntēva","email":"code@clusums.eu","username":"ajya"},"change_message_id":"87f40d6097e3f6ed1027c666e44f4fe24b339259","unresolved":false,"context_lines":[{"line_number":121,"context_line":"        \"\"\"Register this observer for an event"},{"line_number":122,"context_line":""},{"line_number":123,"context_line":"        :param event_name: Event identifyer"},{"line_number":124,"context_line":"        :param callback: Function to execute when event occurrs"},{"line_number":125,"context_line":"        \"\"\""},{"line_number":126,"context_line":"        self._observables[event_name] \u003d callback"},{"line_number":127,"context_line":""}],"source_content_type":"text/x-python","patch_set":6,"id":"5f7c97a3_2299271e","line":124,"range":{"start_line":124,"start_character":56,"end_line":124,"end_character":63},"in_reply_to":"5f7c97a3_c3f09000","updated":"2018-06-21 19:26:10.000000000","message":"NA as removed this approach","commit_id":"28fdf468ed8c8856fecfb9ec020e278b0881b3f9"},{"author":{"_account_id":26340,"name":"Ilya Etingof","email":"etingof@gmail.com","username":"etingof"},"change_message_id":"136170d29d5cad834d3295884a89db13ed39f6b2","unresolved":false,"context_lines":[{"line_number":126,"context_line":"        self._observables[event_name] \u003d callback"},{"line_number":127,"context_line":""},{"line_number":128,"context_line":""},{"line_number":129,"context_line":"class Event(object):"},{"line_number":130,"context_line":"    \"\"\"Event that will notify Observers\"\"\""},{"line_number":131,"context_line":""},{"line_number":132,"context_line":"    def __init__(self, name):"}],"source_content_type":"text/x-python","patch_set":6,"id":"5f7c97a3_a36c749d","line":129,"range":{"start_line":129,"start_character":6,"end_line":129,"end_character":11},"updated":"2018-06-20 12:28:26.000000000","message":"Why do we need the dedicated `Event` class? The only thing it does - it holds the name of the event as a string.","commit_id":"28fdf468ed8c8856fecfb9ec020e278b0881b3f9"},{"author":{"_account_id":27909,"name":"Aija Jauntēva","email":"code@clusums.eu","username":"ajya"},"change_message_id":"87f40d6097e3f6ed1027c666e44f4fe24b339259","unresolved":false,"context_lines":[{"line_number":126,"context_line":"        self._observables[event_name] \u003d callback"},{"line_number":127,"context_line":""},{"line_number":128,"context_line":""},{"line_number":129,"context_line":"class Event(object):"},{"line_number":130,"context_line":"    \"\"\"Event that will notify Observers\"\"\""},{"line_number":131,"context_line":""},{"line_number":132,"context_line":"    def __init__(self, name):"}],"source_content_type":"text/x-python","patch_set":6,"id":"5f7c97a3_42f8e348","line":129,"range":{"start_line":129,"start_character":6,"end_line":129,"end_character":11},"in_reply_to":"5f7c97a3_a36c749d","updated":"2018-06-21 19:26:10.000000000","message":"NA as removed this approach","commit_id":"28fdf468ed8c8856fecfb9ec020e278b0881b3f9"}]}
