)]}'
{"ironic/common/inspect_inventory.py":[{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"c4d7ebedcc8b501a681ed58ebdb1e95ff5bde09f","unresolved":false,"context_lines":[{"line_number":11,"context_line":"    frequency: float  # in MHz"},{"line_number":12,"context_line":"    count: int"},{"line_number":13,"context_line":"    flags: List[str] \u003d field(default_factory\u003dlist)"},{"line_number":14,"context_line":"    thread_count: Optional[int] \u003d None"},{"line_number":15,"context_line":""},{"line_number":16,"context_line":""},{"line_number":17,"context_line":"@dataclass"}],"source_content_type":"text/x-python","patch_set":1,"id":"ee5c2d17_7dd740ce","line":14,"updated":"2025-03-18 13:40:52.000000000","message":"fyi - because I recently learned this - if you add the `annotations` import from `__future__`, you get to use the nicer (IMO) Python 3.10+ syntax instead.\n\n```suggestion\n    thread_count: int | None \u003d None\n```\n\n(`ruff` with the `U` checks enabled can auto-fix this for you, which is how I learned 😅)","commit_id":"d1afac55cbdaba61e40303c92ddaaecf114e7d7d"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"c4d7ebedcc8b501a681ed58ebdb1e95ff5bde09f","unresolved":false,"context_lines":[{"line_number":18,"context_line":"class MemoryInfo:"},{"line_number":19,"context_line":"    \"\"\"Gaterhed Memory information.\"\"\""},{"line_number":20,"context_line":"    physical_mb: int"},{"line_number":21,"context_line":"    usable_mb: Optional[int] \u003d None"},{"line_number":22,"context_line":"    total_kb: Optional[int] \u003d None"},{"line_number":23,"context_line":""},{"line_number":24,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"1f86372a_fa202dcf","line":21,"updated":"2025-03-18 13:40:52.000000000","message":"Was going to suggest you might want [`NotRequired`](https://typing.python.org/en/latest/spec/typeddict.html#required-notrequired) here, before realising these are dataclasses, not typeddicts.","commit_id":"d1afac55cbdaba61e40303c92ddaaecf114e7d7d"}],"ironic/common/inspection.py":[{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"c8f19d9cae8c725b87d78924aa28d39bbac48655","unresolved":true,"context_lines":[],"source_content_type":"","patch_set":5,"id":"468d7f51_0eac27cc","updated":"2025-06-26 13:14:26.000000000","message":"Strictly speaking, the inventory format is not limited to inspection. Especially if we decide down the road to use the same file in IPA, it may be beneficial to call it something else (inventory_types?)","commit_id":"7d917e93b0ed06bf3635c96d6a32ff55b78f1255"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"c8f19d9cae8c725b87d78924aa28d39bbac48655","unresolved":true,"context_lines":[{"line_number":10,"context_line":"# License for the specific language governing permissions and limitations"},{"line_number":11,"context_line":"# under the License."},{"line_number":12,"context_line":""},{"line_number":13,"context_line":"from dataclasses import asdict"},{"line_number":14,"context_line":"from dataclasses import dataclass"},{"line_number":15,"context_line":"from dataclasses import field"},{"line_number":16,"context_line":"from datetime import datetime"}],"source_content_type":"text/x-python","patch_set":5,"id":"c501e1bb_2abb5982","line":13,"updated":"2025-06-26 13:14:26.000000000","message":"nit: we tend to prefer importing modules, not specific items","commit_id":"7d917e93b0ed06bf3635c96d6a32ff55b78f1255"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"c8f19d9cae8c725b87d78924aa28d39bbac48655","unresolved":true,"context_lines":[{"line_number":17,"context_line":"from typing import Optional"},{"line_number":18,"context_line":""},{"line_number":19,"context_line":""},{"line_number":20,"context_line":"@dataclass"},{"line_number":21,"context_line":"class _InspectionDict:"},{"line_number":22,"context_line":"    \"\"\"Provides methods to maintain dict compatibility for the data."},{"line_number":23,"context_line":""}],"source_content_type":"text/x-python","patch_set":5,"id":"674c63a0_59f29beb","line":20,"updated":"2025-06-26 13:14:26.000000000","message":"nit: I don\u0027t think you need the decorator on the base class","commit_id":"7d917e93b0ed06bf3635c96d6a32ff55b78f1255"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"c8f19d9cae8c725b87d78924aa28d39bbac48655","unresolved":true,"context_lines":[{"line_number":18,"context_line":""},{"line_number":19,"context_line":""},{"line_number":20,"context_line":"@dataclass"},{"line_number":21,"context_line":"class _InspectionDict:"},{"line_number":22,"context_line":"    \"\"\"Provides methods to maintain dict compatibility for the data."},{"line_number":23,"context_line":""},{"line_number":24,"context_line":"    Existing data has been handled as a dict and since hooks/plugins"}],"source_content_type":"text/x-python","patch_set":5,"id":"c0fb9d49_1072cc26","line":21,"updated":"2025-06-26 13:14:26.000000000","message":"I wonder if you can use abc.MutableMapping as the base class to reduce the number of methods you need to provide. I don\u0027t know if it plays well with dataclasses.","commit_id":"7d917e93b0ed06bf3635c96d6a32ff55b78f1255"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"c8f19d9cae8c725b87d78924aa28d39bbac48655","unresolved":true,"context_lines":[{"line_number":61,"context_line":"    model_name: str"},{"line_number":62,"context_line":"    architecture: str"},{"line_number":63,"context_line":"    count: int"},{"line_number":64,"context_line":"    frequency: Optional[str] \u003d None  # string-ified decimal in MHz"},{"line_number":65,"context_line":"    socket_count: Optional[int] \u003d None"},{"line_number":66,"context_line":"    flags: list[str] \u003d field(default_factory\u003dlist)"},{"line_number":67,"context_line":"    thread_count: Optional[int] \u003d None"}],"source_content_type":"text/x-python","patch_set":5,"id":"820da084_d94b7bf4","line":64,"updated":"2025-06-26 13:14:26.000000000","message":"Should we use this chance to force it to an int?","commit_id":"7d917e93b0ed06bf3635c96d6a32ff55b78f1255"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"c8f19d9cae8c725b87d78924aa28d39bbac48655","unresolved":true,"context_lines":[{"line_number":70,"context_line":"@dataclass"},{"line_number":71,"context_line":"class MemoryInfo(_InspectionDict):"},{"line_number":72,"context_line":"    \"\"\"Gathered Memory information.\"\"\""},{"line_number":73,"context_line":"    physical_mb: int"},{"line_number":74,"context_line":"    usable_mb: Optional[int] \u003d None"},{"line_number":75,"context_line":"    total_kb: Optional[int] \u003d None"},{"line_number":76,"context_line":""}],"source_content_type":"text/x-python","patch_set":5,"id":"575de2e9_2da6fc98","line":73,"updated":"2025-06-26 13:14:26.000000000","message":"This one is optional, but the absent value is 0, not None. Sigh.","commit_id":"7d917e93b0ed06bf3635c96d6a32ff55b78f1255"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"c8f19d9cae8c725b87d78924aa28d39bbac48655","unresolved":true,"context_lines":[{"line_number":95,"context_line":"    size_bytes: int"},{"line_number":96,"context_line":"    model: str"},{"line_number":97,"context_line":"    vendor: str"},{"line_number":98,"context_line":"    rotational: bool"},{"line_number":99,"context_line":"    serial: Optional[str] \u003d None"},{"line_number":100,"context_line":"    wwn: Optional[str] \u003d None"},{"line_number":101,"context_line":"    wwn_with_extension: Optional[str] \u003d None"}],"source_content_type":"text/x-python","patch_set":5,"id":"81ae41c4_608c8c2a","line":98,"updated":"2025-06-26 13:14:26.000000000","message":"I wonder how much we care about 3rd party hardware managers, which may not provide all of these fields.","commit_id":"7d917e93b0ed06bf3635c96d6a32ff55b78f1255"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"c8f19d9cae8c725b87d78924aa28d39bbac48655","unresolved":true,"context_lines":[{"line_number":111,"context_line":"    version: str"},{"line_number":112,"context_line":"    settings: dict[str, str] \u003d field(default_factory\u003ddict)"},{"line_number":113,"context_line":"    vendor: Optional[str] \u003d None"},{"line_number":114,"context_line":"    date: Optional[datetime] \u003d None"},{"line_number":115,"context_line":""},{"line_number":116,"context_line":""},{"line_number":117,"context_line":"@dataclass"}],"source_content_type":"text/x-python","patch_set":5,"id":"ab8bb88b_e3fca6b6","line":114,"updated":"2025-06-26 13:14:26.000000000","message":"This looks like a version of the firmware structure under SystemVendorInfo, but the fields are different.","commit_id":"7d917e93b0ed06bf3635c96d6a32ff55b78f1255"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"c8f19d9cae8c725b87d78924aa28d39bbac48655","unresolved":true,"context_lines":[{"line_number":117,"context_line":"@dataclass"},{"line_number":118,"context_line":"class SystemVendorInfo(_InspectionDict):"},{"line_number":119,"context_line":"    \"\"\"Gathered System vendor information.\"\"\""},{"line_number":120,"context_line":"    system_uuid: str"},{"line_number":121,"context_line":"    product_name: Optional[str] \u003d None"},{"line_number":122,"context_line":"    serial_number: Optional[str] \u003d None"},{"line_number":123,"context_line":"    manufacturer: Optional[str] \u003d None"}],"source_content_type":"text/x-python","patch_set":5,"id":"0366a8c2_4c7814fc","line":120,"updated":"2025-06-26 13:14:26.000000000","message":"Unless I\u0027m looking at a wrong place, this structure does not match what IPA returns. It has a firmware sub-structure but no system_uuid.","commit_id":"7d917e93b0ed06bf3635c96d6a32ff55b78f1255"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"c8f19d9cae8c725b87d78924aa28d39bbac48655","unresolved":true,"context_lines":[{"line_number":127,"context_line":"class BootInfo(_InspectionDict):"},{"line_number":128,"context_line":"    \"\"\"Gathered Boot device information.\"\"\""},{"line_number":129,"context_line":"    current_boot_mode: str  # BIOS or UEFI"},{"line_number":130,"context_line":"    boot_devices: list[str] \u003d field(default_factory\u003dlist)"},{"line_number":131,"context_line":"    pxe_interface: Optional[str] \u003d None"},{"line_number":132,"context_line":""},{"line_number":133,"context_line":""}],"source_content_type":"text/x-python","patch_set":5,"id":"ebbf4b51_7e1f94b7","line":130,"updated":"2025-06-26 13:14:26.000000000","message":"Boot devices is not a thing?","commit_id":"7d917e93b0ed06bf3635c96d6a32ff55b78f1255"}]}
