)]}'
{"/PATCHSET_LEVEL":[{"author":{"_account_id":10342,"name":"Jay Faulkner","display_name":"JayF","email":"jay@jvf.cc","username":"JayF","status":"youtube.com/@oss-gr / podcast.gr-oss.io"},"change_message_id":"6b31f058f49f712411f1c9eb99711c85afe25157","unresolved":true,"context_lines":[],"source_content_type":"","patch_set":1,"id":"388dad4c_04b64fc3","updated":"2026-01-21 19:29:39.000000000","message":"I\u0027m not 100% sure this should ever merge, but it\u0027s a useful doc to have for our impending MLH fellow.","commit_id":"43d9d2da26d8d918cd5f00fc51c5de05f461f434"}],"doc/source/contributor/type-annotation-guide.rst":[{"author":{"_account_id":10342,"name":"Jay Faulkner","display_name":"JayF","email":"jay@jvf.cc","username":"JayF","status":"youtube.com/@oss-gr / podcast.gr-oss.io"},"change_message_id":"6b31f058f49f712411f1c9eb99711c85afe25157","unresolved":true,"context_lines":[{"line_number":11,"context_line":"---------------"},{"line_number":12,"context_line":""},{"line_number":13,"context_line":"1. **Gradual Migration**: One file or module at a time, not the entire codebase"},{"line_number":14,"context_line":"   at once. This keeps reviews small and progress steady."},{"line_number":15,"context_line":""},{"line_number":16,"context_line":"2. **Code First, Tests Second**: Type the code that tests exercise first."},{"line_number":17,"context_line":""}],"source_content_type":"text/x-rst","patch_set":1,"id":"9de83ea4_851fa190","line":14,"updated":"2026-01-21 19:29:39.000000000","message":"Maybe helpful to mention here that the changes should depend on each other but be very small. (Especially for larger projects; we\u0027ll be constantly fighting merge conflicts)","commit_id":"43d9d2da26d8d918cd5f00fc51c5de05f461f434"},{"author":{"_account_id":10342,"name":"Jay Faulkner","display_name":"JayF","email":"jay@jvf.cc","username":"JayF","status":"youtube.com/@oss-gr / podcast.gr-oss.io"},"change_message_id":"6b31f058f49f712411f1c9eb99711c85afe25157","unresolved":true,"context_lines":[{"line_number":22,"context_line":"   functionality. Annotations are ignored at runtime in Python."},{"line_number":23,"context_line":""},{"line_number":24,"context_line":"5. **Reviewable**: Each migration should be a separate, reviewable change."},{"line_number":25,"context_line":""},{"line_number":26,"context_line":"Prerequisites"},{"line_number":27,"context_line":"-------------"},{"line_number":28,"context_line":""}],"source_content_type":"text/x-rst","patch_set":1,"id":"6b42159e_35cb16bc","line":25,"updated":"2026-01-21 19:29:39.000000000","message":"6. **Non-Disruptive**: Modules in a high state of flux, with many open changes, should not have types added to them until the current feature push is completed.\n\n(just something to reflect: coordinate with people, please don\u0027t make e.g. Alain rebase an entire stack of standalone patches)","commit_id":"43d9d2da26d8d918cd5f00fc51c5de05f461f434"},{"author":{"_account_id":10342,"name":"Jay Faulkner","display_name":"JayF","email":"jay@jvf.cc","username":"JayF","status":"youtube.com/@oss-gr / podcast.gr-oss.io"},"change_message_id":"6b31f058f49f712411f1c9eb99711c85afe25157","unresolved":true,"context_lines":[{"line_number":40,"context_line":"Configuration Files"},{"line_number":41,"context_line":"~~~~~~~~~~~~~~~~~~~"},{"line_number":42,"context_line":""},{"line_number":43,"context_line":"Add the following to ``pyproject.toml`` (or create ``mypy.ini``):"},{"line_number":44,"context_line":""},{"line_number":45,"context_line":".. code-block:: toml"},{"line_number":46,"context_line":""}],"source_content_type":"text/x-rst","patch_set":1,"id":"9de5a041_4a9d5063","line":43,"updated":"2026-01-21 19:29:39.000000000","message":"I would suggest just making a pilot change to ironic-prometheus-exporter with these structural pieces for typing, and then suggest in the doc that the MLH fellow use those as templates for future projects. (alternatively; just point them at openstacksdk as the example)","commit_id":"43d9d2da26d8d918cd5f00fc51c5de05f461f434"},{"author":{"_account_id":10342,"name":"Jay Faulkner","display_name":"JayF","email":"jay@jvf.cc","username":"JayF","status":"youtube.com/@oss-gr / podcast.gr-oss.io"},"change_message_id":"6b31f058f49f712411f1c9eb99711c85afe25157","unresolved":true,"context_lines":[{"line_number":90,"context_line":"   # Generate .pyi stub files (doesn\u0027t modify source)"},{"line_number":91,"context_line":"   stubgen -p ironic.common.utils -o stubs/"},{"line_number":92,"context_line":""},{"line_number":93,"context_line":"   # Review generated stubs in stubs/ironic/common/utils.pyi"},{"line_number":94,"context_line":""},{"line_number":95,"context_line":"**Note**: Generated stubs are often incomplete or wrong. Review them carefully."},{"line_number":96,"context_line":""}],"source_content_type":"text/x-rst","patch_set":1,"id":"bc4ee4d6_507b6768","line":93,"updated":"2026-01-21 19:29:39.000000000","message":"Make a specific note: we don\u0027t want to commit the stub files, but instead use them as a starting point for edits in step 3","commit_id":"43d9d2da26d8d918cd5f00fc51c5de05f461f434"},{"author":{"_account_id":10342,"name":"Jay Faulkner","display_name":"JayF","email":"jay@jvf.cc","username":"JayF","status":"youtube.com/@oss-gr / podcast.gr-oss.io"},"change_message_id":"6b31f058f49f712411f1c9eb99711c85afe25157","unresolved":true,"context_lines":[{"line_number":102,"context_line":"- Add return types: ``-\u003e bool``"},{"line_number":103,"context_line":"- Use ``typing`` module for complex types: ``List[str]``, ``Dict[str, Any]``,"},{"line_number":104,"context_line":"  ``Optional[str]``"},{"line_number":105,"context_line":"- Use ``TYPE_CHECKING`` for forward references if needed"},{"line_number":106,"context_line":""},{"line_number":107,"context_line":"Step 4: Validate with Type Checker"},{"line_number":108,"context_line":"^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^"}],"source_content_type":"text/x-rst","patch_set":1,"id":"714b5ddf_8915c9a9","line":105,"updated":"2026-01-21 19:29:39.000000000","message":"reword: \"Add any imports specific to type-checking only under if TYPE_CHECKING:\". Maybe provide an OSS example link?","commit_id":"43d9d2da26d8d918cd5f00fc51c5de05f461f434"},{"author":{"_account_id":10342,"name":"Jay Faulkner","display_name":"JayF","email":"jay@jvf.cc","username":"JayF","status":"youtube.com/@oss-gr / podcast.gr-oss.io"},"change_message_id":"6b31f058f49f712411f1c9eb99711c85afe25157","unresolved":true,"context_lines":[{"line_number":189,"context_line":""},{"line_number":190,"context_line":"   from __future__ import annotations"},{"line_number":191,"context_line":""},{"line_number":192,"context_line":"   from typing import Optional"},{"line_number":193,"context_line":"   import re"},{"line_number":194,"context_line":""},{"line_number":195,"context_line":"   def is_valid_datapath_id(datapath_id: str) -\u003e bool:"}],"source_content_type":"text/x-rst","patch_set":1,"id":"0123cd9b_bda4634f","line":192,"updated":"2026-01-21 19:29:39.000000000","message":"why not if TYPE_CHECKING?","commit_id":"43d9d2da26d8d918cd5f00fc51c5de05f461f434"}]}
