)]}'
{"api-ref/source/parameters.yaml":[{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"3f52ba72d46d6b8581c0268bc5bcb3c96ec391de","unresolved":false,"context_lines":[{"line_number":104,"context_line":"conditions_join_type:"},{"line_number":105,"context_line":"  description: |"},{"line_number":106,"context_line":"    Boolean algebra operator. Set on introspection rule and used to determine"},{"line_number":107,"context_line":"    how to connect rule\u0027s conditions."},{"line_number":108,"context_line":"  in: body"},{"line_number":109,"context_line":"  required: false"},{"line_number":110,"context_line":"  type: string"}],"source_content_type":"text/x-yaml","patch_set":7,"id":"9f560f44_9bd1d426","line":107,"updated":"2020-08-04 10:41:48.000000000","message":"Let\u0027s specify accepted values","commit_id":"01afca672ae191bfc3608633ad2a7664b5e0c09f"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"354a0db0f3b7903838eb87fc25a833cc96a42059","unresolved":false,"context_lines":[{"line_number":104,"context_line":"conditions_join_type:"},{"line_number":105,"context_line":"  description: |"},{"line_number":106,"context_line":"    Boolean algebra operator. Set on introspection rule and used to determine"},{"line_number":107,"context_line":"    how to connect rule\u0027s conditions."},{"line_number":108,"context_line":"  in: body"},{"line_number":109,"context_line":"  required: false"},{"line_number":110,"context_line":"  type: string"}],"source_content_type":"text/x-yaml","patch_set":7,"id":"9f560f44_2fc92258","line":107,"in_reply_to":"9f560f44_15728cad","updated":"2020-08-07 15:19:25.000000000","message":"Yep, right here. See around for examples.","commit_id":"01afca672ae191bfc3608633ad2a7664b5e0c09f"},{"author":{"_account_id":31258,"name":"Zygimantas Matonis","email":"zygimantas.matonis@cern.ch","username":"gudrutis"},"change_message_id":"1d354a3bba09f318debd86e0fbb7c5918fcfefda","unresolved":false,"context_lines":[{"line_number":104,"context_line":"conditions_join_type:"},{"line_number":105,"context_line":"  description: |"},{"line_number":106,"context_line":"    Boolean algebra operator. Set on introspection rule and used to determine"},{"line_number":107,"context_line":"    how to connect rule\u0027s conditions."},{"line_number":108,"context_line":"  in: body"},{"line_number":109,"context_line":"  required: false"},{"line_number":110,"context_line":"  type: string"}],"source_content_type":"text/x-yaml","patch_set":7,"id":"9f560f44_15728cad","line":107,"in_reply_to":"9f560f44_9bd1d426","updated":"2020-08-06 08:26:33.000000000","message":"I should specify them in the \u0027description\u0027 section, right?","commit_id":"01afca672ae191bfc3608633ad2a7664b5e0c09f"}],"api-ref/source/samples/api-v1-create-rule-request.json":[{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"3f52ba72d46d6b8581c0268bc5bcb3c96ec391de","unresolved":false,"context_lines":[{"line_number":23,"context_line":"         \"field\":\"node://driver_info.deploy_kernel\""},{"line_number":24,"context_line":"      }"},{"line_number":25,"context_line":"   ],"},{"line_number":26,"context_line":"   \"scope\":\"Delivery_1\","},{"line_number":27,"context_line":"   \"conditions_join_type\":\"and\","},{"line_number":28,"context_line":"   \"invert_conditions_outcome\":\"False\""},{"line_number":29,"context_line":"}"}],"source_content_type":"application/json","patch_set":7,"id":"9f560f44_7bce8082","line":26,"updated":"2020-08-04 10:41:48.000000000","message":"nit: space after :","commit_id":"01afca672ae191bfc3608633ad2a7664b5e0c09f"}],"api-ref/source/samples/api-v1-create-rule-response.json":[{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"3f52ba72d46d6b8581c0268bc5bcb3c96ec391de","unresolved":false,"context_lines":[{"line_number":34,"context_line":"  ],"},{"line_number":35,"context_line":"  \"uuid\": \"7459bf7c-9ff9-43a8-ba9f-48542ecda66c\","},{"line_number":36,"context_line":"  \"scope\": \"\","},{"line_number":37,"context_line":"  \"conditions_join_type\":\"and\" ,"},{"line_number":38,"context_line":"  \"invert_conditions_outcome\":\"False\""},{"line_number":39,"context_line":"}"}],"source_content_type":"application/json","patch_set":7,"id":"9f560f44_dbc7cc63","line":37,"updated":"2020-08-04 10:41:48.000000000","message":"nit: space after :","commit_id":"01afca672ae191bfc3608633ad2a7664b5e0c09f"}],"doc/source/user/usage.rst":[{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"3f52ba72d46d6b8581c0268bc5bcb3c96ec391de","unresolved":false,"context_lines":[{"line_number":106,"context_line":"Conditions join type"},{"line_number":107,"context_line":"^^^^^^^^^^^^^^^^^^^^"},{"line_number":108,"context_line":""},{"line_number":109,"context_line":"``conditions_join_type`` is a variable set on introspection rule. It tells if"},{"line_number":110,"context_line":"all, any or strictly not all conditions needs to pass in order for rule to be"},{"line_number":111,"context_line":"applied. It can be set to logical operands such as:"},{"line_number":112,"context_line":""}],"source_content_type":"text/x-rst","patch_set":7,"id":"9f560f44_bbc49860","line":109,"updated":"2020-08-04 10:41:48.000000000","message":"Let\u0027s shorten it by removing _type","commit_id":"01afca672ae191bfc3608633ad2a7664b5e0c09f"},{"author":{"_account_id":31258,"name":"Zygimantas Matonis","email":"zygimantas.matonis@cern.ch","username":"gudrutis"},"change_message_id":"1d354a3bba09f318debd86e0fbb7c5918fcfefda","unresolved":false,"context_lines":[{"line_number":106,"context_line":"Conditions join type"},{"line_number":107,"context_line":"^^^^^^^^^^^^^^^^^^^^"},{"line_number":108,"context_line":""},{"line_number":109,"context_line":"``conditions_join_type`` is a variable set on introspection rule. It tells if"},{"line_number":110,"context_line":"all, any or strictly not all conditions needs to pass in order for rule to be"},{"line_number":111,"context_line":"applied. It can be set to logical operands such as:"},{"line_number":112,"context_line":""}],"source_content_type":"text/x-rst","patch_set":7,"id":"9f560f44_d552d412","line":109,"in_reply_to":"9f560f44_bbc49860","updated":"2020-08-06 08:26:33.000000000","message":"ok","commit_id":"01afca672ae191bfc3608633ad2a7664b5e0c09f"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"3f52ba72d46d6b8581c0268bc5bcb3c96ec391de","unresolved":false,"context_lines":[{"line_number":112,"context_line":""},{"line_number":113,"context_line":"* ``and`` (the default) only if all conditions are true apply the rule,"},{"line_number":114,"context_line":"* ``or`` if all or any of the conditions are true apply the rule,"},{"line_number":115,"context_line":"* ``xor`` if some but not all conditions are true apply the rule."},{"line_number":116,"context_line":""},{"line_number":117,"context_line":"Invert conditions outcome"},{"line_number":118,"context_line":"^^^^^^^^^^^^^^^^^^^^^^^^^"}],"source_content_type":"text/x-rst","patch_set":7,"id":"9f560f44_1ba304b4","line":115,"updated":"2020-08-04 10:41:48.000000000","message":"xor with multiple arguments is True if an odd number of arguments is True. This is quite confusing, I\u0027d suggest removing it for now.","commit_id":"01afca672ae191bfc3608633ad2a7664b5e0c09f"},{"author":{"_account_id":31258,"name":"Zygimantas Matonis","email":"zygimantas.matonis@cern.ch","username":"gudrutis"},"change_message_id":"1d354a3bba09f318debd86e0fbb7c5918fcfefda","unresolved":false,"context_lines":[{"line_number":112,"context_line":""},{"line_number":113,"context_line":"* ``and`` (the default) only if all conditions are true apply the rule,"},{"line_number":114,"context_line":"* ``or`` if all or any of the conditions are true apply the rule,"},{"line_number":115,"context_line":"* ``xor`` if some but not all conditions are true apply the rule."},{"line_number":116,"context_line":""},{"line_number":117,"context_line":"Invert conditions outcome"},{"line_number":118,"context_line":"^^^^^^^^^^^^^^^^^^^^^^^^^"}],"source_content_type":"text/x-rst","patch_set":7,"id":"9f560f44_352190a0","line":115,"in_reply_to":"9f560f44_1ba304b4","updated":"2020-08-06 08:26:33.000000000","message":"ok, agreed","commit_id":"01afca672ae191bfc3608633ad2a7664b5e0c09f"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"3f52ba72d46d6b8581c0268bc5bcb3c96ec391de","unresolved":false,"context_lines":[{"line_number":117,"context_line":"Invert conditions outcome"},{"line_number":118,"context_line":"^^^^^^^^^^^^^^^^^^^^^^^^^"},{"line_number":119,"context_line":""},{"line_number":120,"context_line":"When set to ``true``, ``invert_conditions_outcome`` negates the outcome of"},{"line_number":121,"context_line":"conditions after they have been evaluated and connected using"},{"line_number":122,"context_line":"``conditions_join_type``. By default, it is set to ``false``."},{"line_number":123,"context_line":""}],"source_content_type":"text/x-rst","patch_set":7,"id":"9f560f44_fba730bc","line":120,"updated":"2020-08-04 10:41:48.000000000","message":"I\u0027m a bit undecided about this one, initially I thought about having \"condition_join\": \"not and\" or \"not or\". It may be a bit confusing, but I find it easier to reason about than two fields.","commit_id":"01afca672ae191bfc3608633ad2a7664b5e0c09f"},{"author":{"_account_id":31258,"name":"Zygimantas Matonis","email":"zygimantas.matonis@cern.ch","username":"gudrutis"},"change_message_id":"dc25f8e73ff5a174eef27d7562fac21ea2d2a260","unresolved":false,"context_lines":[{"line_number":117,"context_line":"Invert conditions outcome"},{"line_number":118,"context_line":"^^^^^^^^^^^^^^^^^^^^^^^^^"},{"line_number":119,"context_line":""},{"line_number":120,"context_line":"When set to ``true``, ``invert_conditions_outcome`` negates the outcome of"},{"line_number":121,"context_line":"conditions after they have been evaluated and connected using"},{"line_number":122,"context_line":"``conditions_join_type``. By default, it is set to ``false``."},{"line_number":123,"context_line":""}],"source_content_type":"text/x-rst","patch_set":7,"id":"9f560f44_f74d2a3b","line":120,"in_reply_to":"9f560f44_2f25a209","updated":"2020-08-10 15:43:02.000000000","message":"I see what you did here and I agree that it would work, but is it really a big problem introducing 2 new parameters instead of 1? This way we make sure enough flexibility to write any kind of condition. Being able to write it in 2 ways sounds better in my opinion.","commit_id":"01afca672ae191bfc3608633ad2a7664b5e0c09f"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"90596b191c101d4f9c1abaca4ccfbe11559f2c82","unresolved":false,"context_lines":[{"line_number":117,"context_line":"Invert conditions outcome"},{"line_number":118,"context_line":"^^^^^^^^^^^^^^^^^^^^^^^^^"},{"line_number":119,"context_line":""},{"line_number":120,"context_line":"When set to ``true``, ``invert_conditions_outcome`` negates the outcome of"},{"line_number":121,"context_line":"conditions after they have been evaluated and connected using"},{"line_number":122,"context_line":"``conditions_join_type``. By default, it is set to ``false``."},{"line_number":123,"context_line":""}],"source_content_type":"text/x-rst","patch_set":7,"id":"9f560f44_2f25a209","line":120,"in_reply_to":"9f560f44_bec90aad","updated":"2020-08-07 15:26:53.000000000","message":"Good point.\n\nI wonder how annoying it would be to skip this option completely and just rely on conditions_join + invert of a single condition (e.g. NOT(x AND y) is (NOT x) OR (NOT y)). It\u0027s just slightly more to type but avoids introducing a new parameter to keep in the head.","commit_id":"01afca672ae191bfc3608633ad2a7664b5e0c09f"},{"author":{"_account_id":31258,"name":"Zygimantas Matonis","email":"zygimantas.matonis@cern.ch","username":"gudrutis"},"change_message_id":"1d354a3bba09f318debd86e0fbb7c5918fcfefda","unresolved":false,"context_lines":[{"line_number":117,"context_line":"Invert conditions outcome"},{"line_number":118,"context_line":"^^^^^^^^^^^^^^^^^^^^^^^^^"},{"line_number":119,"context_line":""},{"line_number":120,"context_line":"When set to ``true``, ``invert_conditions_outcome`` negates the outcome of"},{"line_number":121,"context_line":"conditions after they have been evaluated and connected using"},{"line_number":122,"context_line":"``conditions_join_type``. By default, it is set to ``false``."},{"line_number":123,"context_line":""}],"source_content_type":"text/x-rst","patch_set":7,"id":"9f560f44_bec90aad","line":120,"in_reply_to":"9f560f44_fba730bc","updated":"2020-08-06 08:26:33.000000000","message":"I think the reasoning behind this was that \"not or\"/ \"not and\" implies/ would be read as:\n\n- \u0027not or\u0027 https://en.wikipedia.org/wiki/Logical_NOR\n- \u0027not and\u0027 https://en.wikipedia.org/wiki/NAND_logic\n\nThis not exactly what we want because translating\nQ\u003d NOT(T AND T)\n\nusing NOR or NAND is not straightforward","commit_id":"01afca672ae191bfc3608633ad2a7664b5e0c09f"}],"ironic_inspector/enums.py":[{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"3f52ba72d46d6b8581c0268bc5bcb3c96ec391de","unresolved":false,"context_lines":[{"line_number":12,"context_line":"# limitations under the License."},{"line_number":13,"context_line":""},{"line_number":14,"context_line":""},{"line_number":15,"context_line":"class RuleConditionJoinEnum(object):"},{"line_number":16,"context_line":"    AND \u003d \"and\""},{"line_number":17,"context_line":"    OR \u003d \"or\""},{"line_number":18,"context_line":"    XOR \u003d \"xor\""}],"source_content_type":"text/x-python","patch_set":7,"id":"9f560f44_5ba9fc8d","line":15,"updated":"2020-08-04 10:41:48.000000000","message":"Maybe use built-in Python enum base class?","commit_id":"01afca672ae191bfc3608633ad2a7664b5e0c09f"},{"author":{"_account_id":31258,"name":"Zygimantas Matonis","email":"zygimantas.matonis@cern.ch","username":"gudrutis"},"change_message_id":"8696f2612627bbd12c3413c3a14f67519fd006aa","unresolved":false,"context_lines":[{"line_number":12,"context_line":"# limitations under the License."},{"line_number":13,"context_line":""},{"line_number":14,"context_line":""},{"line_number":15,"context_line":"class RuleConditionJoinEnum(object):"},{"line_number":16,"context_line":"    AND \u003d \"and\""},{"line_number":17,"context_line":"    OR \u003d \"or\""},{"line_number":18,"context_line":"    XOR \u003d \"xor\""}],"source_content_type":"text/x-python","patch_set":7,"id":"9f560f44_20ef62e9","line":15,"in_reply_to":"9f560f44_0f825ec8","updated":"2020-08-10 11:04:26.000000000","message":"Where am I supposed to declare my Enum then? \nIn rules.py? Personally, I am though to keep enums in separate class/file","commit_id":"01afca672ae191bfc3608633ad2a7664b5e0c09f"},{"author":{"_account_id":31258,"name":"Zygimantas Matonis","email":"zygimantas.matonis@cern.ch","username":"gudrutis"},"change_message_id":"1d354a3bba09f318debd86e0fbb7c5918fcfefda","unresolved":false,"context_lines":[{"line_number":12,"context_line":"# limitations under the License."},{"line_number":13,"context_line":""},{"line_number":14,"context_line":""},{"line_number":15,"context_line":"class RuleConditionJoinEnum(object):"},{"line_number":16,"context_line":"    AND \u003d \"and\""},{"line_number":17,"context_line":"    OR \u003d \"or\""},{"line_number":18,"context_line":"    XOR \u003d \"xor\""}],"source_content_type":"text/x-python","patch_set":7,"id":"9f560f44_b22db6a9","line":15,"in_reply_to":"9f560f44_5ba9fc8d","updated":"2020-08-06 08:26:33.000000000","message":"Wanted to make it more backward compatible.\nThen again, if we are supporting python3.6 and onwards, you are right, there is no need for this \u0027hack\u0027","commit_id":"01afca672ae191bfc3608633ad2a7664b5e0c09f"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"90596b191c101d4f9c1abaca4ccfbe11559f2c82","unresolved":false,"context_lines":[{"line_number":12,"context_line":"# limitations under the License."},{"line_number":13,"context_line":""},{"line_number":14,"context_line":""},{"line_number":15,"context_line":"class RuleConditionJoinEnum(object):"},{"line_number":16,"context_line":"    AND \u003d \"and\""},{"line_number":17,"context_line":"    OR \u003d \"or\""},{"line_number":18,"context_line":"    XOR \u003d \"xor\""}],"source_content_type":"text/x-python","patch_set":7,"id":"9f560f44_0f825ec8","line":15,"in_reply_to":"9f560f44_b22db6a9","updated":"2020-08-07 15:26:53.000000000","message":"We don\u0027t support Python \u003c 3.6.\n\nAnd by the way, I\u0027m not sure adding a new file is justified here, unless we plan to move other enums here.","commit_id":"01afca672ae191bfc3608633ad2a7664b5e0c09f"}],"ironic_inspector/main.py":[{"author":{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]},"tag":"autogenerated:zuul:check","change_message_id":"b429b41049e4391f75a3904e4d782de96e0fd4c8","unresolved":false,"context_lines":[{"line_number":15,"context_line":"import os"},{"line_number":16,"context_line":"import random"},{"line_number":17,"context_line":"import re"},{"line_number":18,"context_line":"import json"},{"line_number":19,"context_line":""},{"line_number":20,"context_line":"import flask"},{"line_number":21,"context_line":"from oslo_utils import strutils"}],"source_content_type":"text/x-python","patch_set":4,"id":"bf51134e_195d1215","line":18,"updated":"2020-07-22 17:48:57.000000000","message":"pep8: H306: imports not in alphabetical order (re, json)","commit_id":"7c69a2d733ac3f4b5a49b7720af9c8893ce5705d"},{"author":{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]},"tag":"autogenerated:zuul:check","change_message_id":"b429b41049e4391f75a3904e4d782de96e0fd4c8","unresolved":false,"context_lines":[{"line_number":432,"context_line":"            raise utils.Error("},{"line_number":433,"context_line":"                _(\"Invalid scope: the length of the scope should be within \""},{"line_number":434,"context_line":"                  \"255 characters\"), code\u003d400)"},{"line_number":435,"context_line":"        # TODO-zm check extra arguments are valid"},{"line_number":436,"context_line":"        join_type \u003d body.get(\u0027conditions_join_type\u0027)"},{"line_number":437,"context_line":"        if join_type and join_type not in JoinEnum.all():"},{"line_number":438,"context_line":"            raise utils.Error("}],"source_content_type":"text/x-python","patch_set":4,"id":"bf51134e_7999aece","line":435,"updated":"2020-07-22 17:48:57.000000000","message":"pep8: H101: Use TODO(NAME)","commit_id":"7c69a2d733ac3f4b5a49b7720af9c8893ce5705d"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"3f52ba72d46d6b8581c0268bc5bcb3c96ec391de","unresolved":false,"context_lines":[{"line_number":30,"context_line":"from ironic_inspector.conductor import manager"},{"line_number":31,"context_line":"import ironic_inspector.conf"},{"line_number":32,"context_line":"from ironic_inspector.conf import opts as conf_opts"},{"line_number":33,"context_line":"from ironic_inspector.enums import RuleConditionJoinEnum as JoinEnum"},{"line_number":34,"context_line":"from ironic_inspector import node_cache"},{"line_number":35,"context_line":"from ironic_inspector import process"},{"line_number":36,"context_line":"from ironic_inspector import rules"}],"source_content_type":"text/x-python","patch_set":7,"id":"9f560f44_3baec897","line":33,"updated":"2020-08-04 10:41:48.000000000","message":"please import modules, not items (dunno why pep8 doesn\u0027t complain)","commit_id":"01afca672ae191bfc3608633ad2a7664b5e0c09f"},{"author":{"_account_id":31258,"name":"Zygimantas Matonis","email":"zygimantas.matonis@cern.ch","username":"gudrutis"},"change_message_id":"dc25f8e73ff5a174eef27d7562fac21ea2d2a260","unresolved":false,"context_lines":[{"line_number":30,"context_line":"from ironic_inspector.conductor import manager"},{"line_number":31,"context_line":"import ironic_inspector.conf"},{"line_number":32,"context_line":"from ironic_inspector.conf import opts as conf_opts"},{"line_number":33,"context_line":"from ironic_inspector.enums import RuleConditionJoinEnum as JoinEnum"},{"line_number":34,"context_line":"from ironic_inspector import node_cache"},{"line_number":35,"context_line":"from ironic_inspector import process"},{"line_number":36,"context_line":"from ironic_inspector import rules"}],"source_content_type":"text/x-python","patch_set":7,"id":"9f560f44_97a94e91","line":33,"in_reply_to":"9f560f44_2f6ac218","updated":"2020-08-10 15:43:02.000000000","message":"I disagree, having full \u0027RuleConditionJoinEnum\u0027 is a mouthful, but prevents from any kind of ambiguity.\nThough writing this I realized that there is a low chance \nwe will introduce another kind of conditional join...","commit_id":"01afca672ae191bfc3608633ad2a7664b5e0c09f"},{"author":{"_account_id":31258,"name":"Zygimantas Matonis","email":"zygimantas.matonis@cern.ch","username":"gudrutis"},"change_message_id":"1d354a3bba09f318debd86e0fbb7c5918fcfefda","unresolved":false,"context_lines":[{"line_number":30,"context_line":"from ironic_inspector.conductor import manager"},{"line_number":31,"context_line":"import ironic_inspector.conf"},{"line_number":32,"context_line":"from ironic_inspector.conf import opts as conf_opts"},{"line_number":33,"context_line":"from ironic_inspector.enums import RuleConditionJoinEnum as JoinEnum"},{"line_number":34,"context_line":"from ironic_inspector import node_cache"},{"line_number":35,"context_line":"from ironic_inspector import process"},{"line_number":36,"context_line":"from ironic_inspector import rules"}],"source_content_type":"text/x-python","patch_set":7,"id":"9f560f44_f5d4384a","line":33,"in_reply_to":"9f560f44_3baec897","updated":"2020-08-06 08:26:33.000000000","message":"If you say so, but in this case, I won\u0027t be able to shorten\nthe `RuleConditionJoinEnum` to `JoinEnum`, it will become\n`enums.RuleConditionJoinEnum`\n\nor I should do as in line 39 and assign it to JOIN_ENUM?","commit_id":"01afca672ae191bfc3608633ad2a7664b5e0c09f"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"90596b191c101d4f9c1abaca4ccfbe11559f2c82","unresolved":false,"context_lines":[{"line_number":30,"context_line":"from ironic_inspector.conductor import manager"},{"line_number":31,"context_line":"import ironic_inspector.conf"},{"line_number":32,"context_line":"from ironic_inspector.conf import opts as conf_opts"},{"line_number":33,"context_line":"from ironic_inspector.enums import RuleConditionJoinEnum as JoinEnum"},{"line_number":34,"context_line":"from ironic_inspector import node_cache"},{"line_number":35,"context_line":"from ironic_inspector import process"},{"line_number":36,"context_line":"from ironic_inspector import rules"}],"source_content_type":"text/x-python","patch_set":7,"id":"9f560f44_2f6ac218","line":33,"in_reply_to":"9f560f44_f5d4384a","updated":"2020-08-07 15:26:53.000000000","message":"I\u0027m fine with `enums.ConditionsJoinEnum` (I think \"Rule\" can be dropped)","commit_id":"01afca672ae191bfc3608633ad2a7664b5e0c09f"}],"ironic_inspector/rules.py":[{"author":{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]},"tag":"autogenerated:zuul:check","change_message_id":"f1dafe9d7805a9abcd3611af717f96d783514e5e","unresolved":false,"context_lines":[{"line_number":126,"context_line":"    def description(self):"},{"line_number":127,"context_line":"        return self._description or self._uuid"},{"line_number":128,"context_line":""},{"line_number":129,"context_line":"    def check_conditions(self, node_info, data):"},{"line_number":130,"context_line":"        \"\"\"Check if conditions are true for a given node."},{"line_number":131,"context_line":""},{"line_number":132,"context_line":"        :param node_info: a NodeInfo object"}],"source_content_type":"text/x-python","patch_set":3,"id":"ff570b3c_8a307b58","line":129,"updated":"2020-05-29 17:33:29.000000000","message":"pep8: C901 \u0027IntrospectionRule.check_conditions\u0027 is too complex (20)","commit_id":"03148c80f6c233179922dbb9a8549bda6fe6e8d2"},{"author":{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]},"tag":"autogenerated:zuul:check","change_message_id":"f1dafe9d7805a9abcd3611af717f96d783514e5e","unresolved":false,"context_lines":[{"line_number":187,"context_line":"            if not n_of_cond_true and n_of_cond_false:"},{"line_number":188,"context_line":"                return True"},{"line_number":189,"context_line":"            else:"},{"line_number":190,"context_line":"                return False   "},{"line_number":191,"context_line":"        elif self._conditions_join \u003d\u003d \"or\":"},{"line_number":192,"context_line":"            if n_of_cond_true: "},{"line_number":193,"context_line":"                return True"}],"source_content_type":"text/x-python","patch_set":3,"id":"ff570b3c_ea31375b","line":190,"updated":"2020-05-29 17:33:29.000000000","message":"pep8: W291 trailing whitespace","commit_id":"03148c80f6c233179922dbb9a8549bda6fe6e8d2"},{"author":{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]},"tag":"autogenerated:zuul:check","change_message_id":"f1dafe9d7805a9abcd3611af717f96d783514e5e","unresolved":false,"context_lines":[{"line_number":189,"context_line":"            else:"},{"line_number":190,"context_line":"                return False   "},{"line_number":191,"context_line":"        elif self._conditions_join \u003d\u003d \"or\":"},{"line_number":192,"context_line":"            if n_of_cond_true: "},{"line_number":193,"context_line":"                return True"},{"line_number":194,"context_line":"            else:"},{"line_number":195,"context_line":"                return False"}],"source_content_type":"text/x-python","patch_set":3,"id":"ff570b3c_ca36f351","line":192,"updated":"2020-05-29 17:33:29.000000000","message":"pep8: W291 trailing whitespace","commit_id":"03148c80f6c233179922dbb9a8549bda6fe6e8d2"},{"author":{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]},"tag":"autogenerated:zuul:check","change_message_id":"f1dafe9d7805a9abcd3611af717f96d783514e5e","unresolved":false,"context_lines":[{"line_number":194,"context_line":"            else:"},{"line_number":195,"context_line":"                return False"},{"line_number":196,"context_line":"        elif self._conditions_join \u003d\u003d \"not_or\":"},{"line_number":197,"context_line":"            if n_of_cond_true: "},{"line_number":198,"context_line":"                return False"},{"line_number":199,"context_line":"            else:"},{"line_number":200,"context_line":"                return True"}],"source_content_type":"text/x-python","patch_set":3,"id":"ff570b3c_2a3faf25","line":197,"updated":"2020-05-29 17:33:29.000000000","message":"pep8: W291 trailing whitespace","commit_id":"03148c80f6c233179922dbb9a8549bda6fe6e8d2"},{"author":{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]},"tag":"autogenerated:zuul:check","change_message_id":"f1dafe9d7805a9abcd3611af717f96d783514e5e","unresolved":false,"context_lines":[{"line_number":205,"context_line":"                return False"},{"line_number":206,"context_line":"        else:"},{"line_number":207,"context_line":"            LOG.debug(\u0027Unknown condition join type - %s, ignoring rule\u0027,"},{"line_number":208,"context_line":"                self._conditions_join, node_info\u003dnode_info, data\u003ddata)"},{"line_number":209,"context_line":"            return False"},{"line_number":210,"context_line":""},{"line_number":211,"context_line":"    def apply_actions(self, node_info, data\u003dNone):"}],"source_content_type":"text/x-python","patch_set":3,"id":"ff570b3c_0a3c6b2d","line":208,"updated":"2020-05-29 17:33:29.000000000","message":"pep8: E128 continuation line under-indented for visual indent","commit_id":"03148c80f6c233179922dbb9a8549bda6fe6e8d2"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"3f52ba72d46d6b8581c0268bc5bcb3c96ec391de","unresolved":false,"context_lines":[{"line_number":197,"context_line":"        check_conditions_dict \u003d {"},{"line_number":198,"context_line":"            # t - n_of_cond_true (number of conditions that evaluate true)"},{"line_number":199,"context_line":"            # f - n_of_cond_false (number of conditions that evaluate false)"},{"line_number":200,"context_line":"            JoinEnum.AND: lambda t, f: True if t and not f else False,"},{"line_number":201,"context_line":"            JoinEnum.OR: lambda t, f: True if t else False,"},{"line_number":202,"context_line":"            JoinEnum.XOR: lambda t, f: True if t and f else f"},{"line_number":203,"context_line":"        }"}],"source_content_type":"text/x-python","patch_set":7,"id":"9f560f44_9b96f44b","line":200,"updated":"2020-08-04 10:41:48.000000000","message":"This should be a method on JoinEnum, I think.","commit_id":"01afca672ae191bfc3608633ad2a7664b5e0c09f"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"90596b191c101d4f9c1abaca4ccfbe11559f2c82","unresolved":false,"context_lines":[{"line_number":197,"context_line":"        check_conditions_dict \u003d {"},{"line_number":198,"context_line":"            # t - n_of_cond_true (number of conditions that evaluate true)"},{"line_number":199,"context_line":"            # f - n_of_cond_false (number of conditions that evaluate false)"},{"line_number":200,"context_line":"            JoinEnum.AND: lambda t, f: True if t and not f else False,"},{"line_number":201,"context_line":"            JoinEnum.OR: lambda t, f: True if t else False,"},{"line_number":202,"context_line":"            JoinEnum.XOR: lambda t, f: True if t and f else f"},{"line_number":203,"context_line":"        }"}],"source_content_type":"text/x-python","patch_set":7,"id":"9f560f44_cfc98626","line":200,"in_reply_to":"9f560f44_754dc83c","updated":"2020-08-07 15:26:53.000000000","message":"With my Rust experience, I see no problem in enums having methods :)","commit_id":"01afca672ae191bfc3608633ad2a7664b5e0c09f"},{"author":{"_account_id":31258,"name":"Zygimantas Matonis","email":"zygimantas.matonis@cern.ch","username":"gudrutis"},"change_message_id":"1d354a3bba09f318debd86e0fbb7c5918fcfefda","unresolved":false,"context_lines":[{"line_number":197,"context_line":"        check_conditions_dict \u003d {"},{"line_number":198,"context_line":"            # t - n_of_cond_true (number of conditions that evaluate true)"},{"line_number":199,"context_line":"            # f - n_of_cond_false (number of conditions that evaluate false)"},{"line_number":200,"context_line":"            JoinEnum.AND: lambda t, f: True if t and not f else False,"},{"line_number":201,"context_line":"            JoinEnum.OR: lambda t, f: True if t else False,"},{"line_number":202,"context_line":"            JoinEnum.XOR: lambda t, f: True if t and f else f"},{"line_number":203,"context_line":"        }"}],"source_content_type":"text/x-python","patch_set":7,"id":"9f560f44_754dc83c","line":200,"in_reply_to":"9f560f44_9b96f44b","updated":"2020-08-06 08:26:33.000000000","message":"In my previous workplaces, enums always were plain. But if you say this is ok, sure.","commit_id":"01afca672ae191bfc3608633ad2a7664b5e0c09f"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"3f52ba72d46d6b8581c0268bc5bcb3c96ec391de","unresolved":false,"context_lines":[{"line_number":202,"context_line":"            JoinEnum.XOR: lambda t, f: True if t and f else f"},{"line_number":203,"context_line":"        }"},{"line_number":204,"context_line":""},{"line_number":205,"context_line":"        if self._conditions_join_type not in check_conditions_dict:"},{"line_number":206,"context_line":"            LOG.info("},{"line_number":207,"context_line":"                \u0027Unknown condition join type - %s, ignoring rule \"%s\"\u0027,"},{"line_number":208,"context_line":"                self._conditions_join_type, self.description,"}],"source_content_type":"text/x-python","patch_set":7,"id":"9f560f44_7b93205c","line":205,"updated":"2020-08-04 10:41:48.000000000","message":"This cannot happen because of API validations","commit_id":"01afca672ae191bfc3608633ad2a7664b5e0c09f"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"90596b191c101d4f9c1abaca4ccfbe11559f2c82","unresolved":false,"context_lines":[{"line_number":202,"context_line":"            JoinEnum.XOR: lambda t, f: True if t and f else f"},{"line_number":203,"context_line":"        }"},{"line_number":204,"context_line":""},{"line_number":205,"context_line":"        if self._conditions_join_type not in check_conditions_dict:"},{"line_number":206,"context_line":"            LOG.info("},{"line_number":207,"context_line":"                \u0027Unknown condition join type - %s, ignoring rule \"%s\"\u0027,"},{"line_number":208,"context_line":"                self._conditions_join_type, self.description,"}],"source_content_type":"text/x-python","patch_set":7,"id":"9f560f44_0f5b7e86","line":205,"in_reply_to":"9f560f44_1248e284","updated":"2020-08-07 15:26:53.000000000","message":"I think so","commit_id":"01afca672ae191bfc3608633ad2a7664b5e0c09f"},{"author":{"_account_id":31258,"name":"Zygimantas Matonis","email":"zygimantas.matonis@cern.ch","username":"gudrutis"},"change_message_id":"1d354a3bba09f318debd86e0fbb7c5918fcfefda","unresolved":false,"context_lines":[{"line_number":202,"context_line":"            JoinEnum.XOR: lambda t, f: True if t and f else f"},{"line_number":203,"context_line":"        }"},{"line_number":204,"context_line":""},{"line_number":205,"context_line":"        if self._conditions_join_type not in check_conditions_dict:"},{"line_number":206,"context_line":"            LOG.info("},{"line_number":207,"context_line":"                \u0027Unknown condition join type - %s, ignoring rule \"%s\"\u0027,"},{"line_number":208,"context_line":"                self._conditions_join_type, self.description,"}],"source_content_type":"text/x-python","patch_set":7,"id":"9f560f44_1248e284","line":205,"in_reply_to":"9f560f44_7b93205c","updated":"2020-08-06 08:26:33.000000000","message":"So I should drop it or not?","commit_id":"01afca672ae191bfc3608633ad2a7664b5e0c09f"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"3f52ba72d46d6b8581c0268bc5bcb3c96ec391de","unresolved":false,"context_lines":[{"line_number":272,"context_line":"            LOG.debug(\u0027Rule \"%s\" is global and will be applied if conditions \u0027"},{"line_number":273,"context_line":"                      \u0027are met.\u0027, self._description)"},{"line_number":274,"context_line":"            return True"},{"line_number":275,"context_line":"        if self._scope \u003d\u003d node_info.node().properties.get(\u0027inspection_scope\u0027):"},{"line_number":276,"context_line":"            LOG.debug(\u0027Rule \"%s\" and node have a matching scope \"%s and will \u0027"},{"line_number":277,"context_line":"                      \u0027be applied if conditions are met.\u0027, self._description,"},{"line_number":278,"context_line":"                      self._scope)"}],"source_content_type":"text/x-python","patch_set":7,"id":"9f560f44_db9cec6b","line":275,"updated":"2020-08-04 10:41:48.000000000","message":"This is a nice fix, but it\u0027s unrelated to conditions joining, so let\u0027s separate it","commit_id":"01afca672ae191bfc3608633ad2a7664b5e0c09f"},{"author":{"_account_id":31258,"name":"Zygimantas Matonis","email":"zygimantas.matonis@cern.ch","username":"gudrutis"},"change_message_id":"1d354a3bba09f318debd86e0fbb7c5918fcfefda","unresolved":false,"context_lines":[{"line_number":272,"context_line":"            LOG.debug(\u0027Rule \"%s\" is global and will be applied if conditions \u0027"},{"line_number":273,"context_line":"                      \u0027are met.\u0027, self._description)"},{"line_number":274,"context_line":"            return True"},{"line_number":275,"context_line":"        if self._scope \u003d\u003d node_info.node().properties.get(\u0027inspection_scope\u0027):"},{"line_number":276,"context_line":"            LOG.debug(\u0027Rule \"%s\" and node have a matching scope \"%s and will \u0027"},{"line_number":277,"context_line":"                      \u0027be applied if conditions are met.\u0027, self._description,"},{"line_number":278,"context_line":"                      self._scope)"}],"source_content_type":"text/x-python","patch_set":7,"id":"9f560f44_92987275","line":275,"in_reply_to":"9f560f44_db9cec6b","updated":"2020-08-06 08:26:33.000000000","message":"Ok, I will create a separate MR for this.","commit_id":"01afca672ae191bfc3608633ad2a7664b5e0c09f"}],"ironic_inspector/test/unit/test_main.py":[{"author":{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]},"tag":"autogenerated:zuul:check","change_message_id":"b429b41049e4391f75a3904e4d782de96e0fd4c8","unresolved":false,"context_lines":[{"line_number":499,"context_line":""},{"line_number":500,"context_line":"        res \u003d self.app.post(\u0027/v1/rules\u0027, data\u003djson.dumps(data))"},{"line_number":501,"context_line":"        self.assertEqual(201, res.status_code)"},{"line_number":502,"context_line":"        #TODO-zm"},{"line_number":503,"context_line":"        create_mock.assert_called_once_with(conditions_json\u003d\u0027cond\u0027,"},{"line_number":504,"context_line":"                                            actions_json\u003d\u0027act\u0027,"},{"line_number":505,"context_line":"                                            uuid\u003dself.uuid,"}],"source_content_type":"text/x-python","patch_set":4,"id":"bf51134e_39b7363d","line":502,"updated":"2020-07-22 17:48:57.000000000","message":"pep8: E265 block comment should start with \u0027# \u0027","commit_id":"7c69a2d733ac3f4b5a49b7720af9c8893ce5705d"},{"author":{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]},"tag":"autogenerated:zuul:check","change_message_id":"b429b41049e4391f75a3904e4d782de96e0fd4c8","unresolved":false,"context_lines":[{"line_number":499,"context_line":""},{"line_number":500,"context_line":"        res \u003d self.app.post(\u0027/v1/rules\u0027, data\u003djson.dumps(data))"},{"line_number":501,"context_line":"        self.assertEqual(201, res.status_code)"},{"line_number":502,"context_line":"        #TODO-zm"},{"line_number":503,"context_line":"        create_mock.assert_called_once_with(conditions_json\u003d\u0027cond\u0027,"},{"line_number":504,"context_line":"                                            actions_json\u003d\u0027act\u0027,"},{"line_number":505,"context_line":"                                            uuid\u003dself.uuid,"}],"source_content_type":"text/x-python","patch_set":4,"id":"bf51134e_19b2324a","line":502,"updated":"2020-07-22 17:48:57.000000000","message":"pep8: H101: Use TODO(NAME)","commit_id":"7c69a2d733ac3f4b5a49b7720af9c8893ce5705d"},{"author":{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]},"tag":"autogenerated:zuul:check","change_message_id":"b429b41049e4391f75a3904e4d782de96e0fd4c8","unresolved":false,"context_lines":[{"line_number":523,"context_line":"        res \u003d self.app.post(\u0027/v1/rules\u0027, data\u003djson.dumps(data),"},{"line_number":524,"context_line":"                            headers\u003dheaders)"},{"line_number":525,"context_line":"        self.assertEqual(200, res.status_code)"},{"line_number":526,"context_line":"        #TODO-zm"},{"line_number":527,"context_line":"        create_mock.assert_called_once_with(conditions_json\u003d\u0027cond\u0027,"},{"line_number":528,"context_line":"                                            actions_json\u003d\u0027act\u0027,"},{"line_number":529,"context_line":"                                            uuid\u003dself.uuid,"}],"source_content_type":"text/x-python","patch_set":4,"id":"bf51134e_79824e54","line":526,"updated":"2020-07-22 17:48:57.000000000","message":"pep8: E265 block comment should start with \u0027# \u0027","commit_id":"7c69a2d733ac3f4b5a49b7720af9c8893ce5705d"},{"author":{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]},"tag":"autogenerated:zuul:check","change_message_id":"b429b41049e4391f75a3904e4d782de96e0fd4c8","unresolved":false,"context_lines":[{"line_number":523,"context_line":"        res \u003d self.app.post(\u0027/v1/rules\u0027, data\u003djson.dumps(data),"},{"line_number":524,"context_line":"                            headers\u003dheaders)"},{"line_number":525,"context_line":"        self.assertEqual(200, res.status_code)"},{"line_number":526,"context_line":"        #TODO-zm"},{"line_number":527,"context_line":"        create_mock.assert_called_once_with(conditions_json\u003d\u0027cond\u0027,"},{"line_number":528,"context_line":"                                            actions_json\u003d\u0027act\u0027,"},{"line_number":529,"context_line":"                                            uuid\u003dself.uuid,"}],"source_content_type":"text/x-python","patch_set":4,"id":"bf51134e_5985ca58","line":526,"updated":"2020-07-22 17:48:57.000000000","message":"pep8: H101: Use TODO(NAME)","commit_id":"7c69a2d733ac3f4b5a49b7720af9c8893ce5705d"}],"ironic_inspector/test/unit/test_rules.py":[{"author":{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]},"tag":"autogenerated:zuul:check","change_message_id":"b429b41049e4391f75a3904e4d782de96e0fd4c8","unresolved":false,"context_lines":[{"line_number":15,"context_line":"\"\"\"Tests for introspection rules.\"\"\""},{"line_number":16,"context_line":"from unittest import mock"},{"line_number":17,"context_line":""},{"line_number":18,"context_line":"import sqlalchemy"},{"line_number":19,"context_line":"from oslo_utils import uuidutils"},{"line_number":20,"context_line":""},{"line_number":21,"context_line":"from ironic_inspector import db"}],"source_content_type":"text/x-python","patch_set":4,"id":"bf51134e_599caabe","line":18,"updated":"2020-07-22 17:48:57.000000000","message":"pep8: F401 \u0027sqlalchemy\u0027 imported but unused","commit_id":"7c69a2d733ac3f4b5a49b7720af9c8893ce5705d"},{"author":{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]},"tag":"autogenerated:zuul:check","change_message_id":"b429b41049e4391f75a3904e4d782de96e0fd4c8","unresolved":false,"context_lines":[{"line_number":16,"context_line":"from unittest import mock"},{"line_number":17,"context_line":""},{"line_number":18,"context_line":"import sqlalchemy"},{"line_number":19,"context_line":"from oslo_utils import uuidutils"},{"line_number":20,"context_line":""},{"line_number":21,"context_line":"from ironic_inspector import db"},{"line_number":22,"context_line":"from ironic_inspector.plugins import base as plugins_base"}],"source_content_type":"text/x-python","patch_set":4,"id":"bf51134e_b9a34600","line":19,"updated":"2020-07-22 17:48:57.000000000","message":"pep8: H306: imports not in alphabetical order (sqlalchemy, oslo_utils.uuidutils)","commit_id":"7c69a2d733ac3f4b5a49b7720af9c8893ce5705d"},{"author":{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]},"tag":"autogenerated:zuul:check","change_message_id":"b429b41049e4391f75a3904e4d782de96e0fd4c8","unresolved":false,"context_lines":[{"line_number":23,"context_line":"from ironic_inspector import rules"},{"line_number":24,"context_line":"from ironic_inspector.test import base as test_base"},{"line_number":25,"context_line":"from ironic_inspector import utils"},{"line_number":26,"context_line":"from ironic_inspector.enums import RuleConditionJoinEnum as JoinEnum"},{"line_number":27,"context_line":""},{"line_number":28,"context_line":""},{"line_number":29,"context_line":"class BaseTest(test_base.NodeTest):"}],"source_content_type":"text/x-python","patch_set":4,"id":"bf51134e_99a6420f","line":26,"updated":"2020-07-22 17:48:57.000000000","message":"pep8: H306: imports not in alphabetical order (ironic_inspector.utils, ironic_inspector.enums.ruleconditionjoinenum)","commit_id":"7c69a2d733ac3f4b5a49b7720af9c8893ce5705d"},{"author":{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]},"tag":"autogenerated:zuul:check","change_message_id":"b429b41049e4391f75a3904e4d782de96e0fd4c8","unresolved":false,"context_lines":[{"line_number":212,"context_line":"                         rule_json)"},{"line_number":213,"context_line":""},{"line_number":214,"context_line":"    def test_non_allowed_condition_join(self):"},{"line_number":215,"context_line":"        self.assertRaises("},{"line_number":216,"context_line":"            Exception, rules.create,"},{"line_number":217,"context_line":"            self.conditions_json, self.actions_json,"},{"line_number":218,"context_line":"            conditions_join_type\u003d\"Not in enum\""}],"source_content_type":"text/x-python","patch_set":4,"id":"bf51134e_f9ac9eef","line":215,"updated":"2020-07-22 17:48:57.000000000","message":"pep8: H202: assertRaises Exception too broad","commit_id":"7c69a2d733ac3f4b5a49b7720af9c8893ce5705d"},{"author":{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]},"tag":"autogenerated:zuul:check","change_message_id":"b429b41049e4391f75a3904e4d782de96e0fd4c8","unresolved":false,"context_lines":[{"line_number":225,"context_line":"        pass"},{"line_number":226,"context_line":""},{"line_number":227,"context_line":"    def test_non_allowed_condition_invert(self):"},{"line_number":228,"context_line":"        self.assertRaises("},{"line_number":229,"context_line":"            Exception, rules.create,"},{"line_number":230,"context_line":"            self.conditions_json, self.actions_json,"},{"line_number":231,"context_line":"            invert_conditions_outcome\u003d\"Not boolean\""}],"source_content_type":"text/x-python","patch_set":4,"id":"bf51134e_d9a71a09","line":228,"updated":"2020-07-22 17:48:57.000000000","message":"pep8: H202: assertRaises Exception too broad","commit_id":"7c69a2d733ac3f4b5a49b7720af9c8893ce5705d"}]}
