)]}'
{
  "commit": "dd6550f18477105f362e44cb4868d9007e340d83",
  "tree": "85392569c7b88ad9ec9474917c018c2dda298a54",
  "parents": [
    "6f27511a35baa7d0de302e504cb161cf0af2f2bf"
  ],
  "author": {
    "name": "Charles OuGuo",
    "email": "shaldengeki@gmail.com",
    "time": "Mon Jul 14 19:57:52 2025 -0400"
  },
  "committer": {
    "name": "GitHub",
    "email": "noreply@github.com",
    "time": "Mon Jul 14 23:57:52 2025 +0000"
  },
  "message": "feat(gazelle): Gazelle plugin generates py_proto_library (#3057)\n\nFixes https://github.com/bazel-contrib/rules_python/issues/2994.\n\nPlease go over this with a fine-toothed comb! This is my first\ncontribution to `rules_python` / the gazelle plugin, and while I\u0027ve\nworked in Gazelle before, I\u0027m pretty unfamiliar with the Python plugin\u0027s\narchitecture.\n\nThis adds support in the Gazelle plugin for generating\n`py_proto_library` rules automatically, if there are any `proto_library`\nrules detected in a given package. We do this via a new Gazelle\ndirective, `python_generate_proto`, which defaults to `true`, and\ncontrols whether these rules are generated.\n\nSee the tests in `testdata/directive_python_generate_proto` for\nexamples.\n\nBy default, we source the `py_proto_library` rule from the `@protobuf`\nrepository. I think this the intended long-term home of the rule? Users\nare expected to use `gazelle:map_kind` to change this if need be.\n\nI haven\u0027t done anything here to support resolution of imports of\n`py_proto_library`. I think this is worth landing first, to save folks\nfrom having to maintain these by hand. But this should lay the\nfoundation for resolving that in\nhttps://github.com/bazel-contrib/rules_python/issues/1703.\n\n---------\n\nCo-authored-by: Douglas Thor \u003cdougthor42@users.noreply.github.com\u003e",
  "tree_diff": [
    {
      "type": "modify",
      "old_id": "834a2c1a39395781da9f085d0cad19f3d15d2300",
      "old_mode": 33188,
      "old_path": "CHANGELOG.md",
      "new_id": "e74f14b1db972bbe9dff74bf0c454cdae8dddc32",
      "new_mode": 33188,
      "new_path": "CHANGELOG.md"
    },
    {
      "type": "modify",
      "old_id": "969cb8e9f7ff1fd06e46a14c0045c8510cb02671",
      "old_mode": 33188,
      "old_path": "examples/bzlmod/py_proto_library/BUILD.bazel",
      "new_id": "daea41036596e1e2cffa3583821954020d018544",
      "new_mode": 33188,
      "new_path": "examples/bzlmod/py_proto_library/BUILD.bazel"
    },
    {
      "type": "modify",
      "old_id": "785d90d01e718736735c7c7222f244198753e0ce",
      "old_mode": 33188,
      "old_path": "examples/bzlmod/py_proto_library/example.com/another_proto/BUILD.bazel",
      "new_id": "29f08c21cabdc2427e4292c3bf5579babacf389e",
      "new_mode": 33188,
      "new_path": "examples/bzlmod/py_proto_library/example.com/another_proto/BUILD.bazel"
    },
    {
      "type": "modify",
      "old_id": "72af6722196de5ea7efac66a3f550cf15982f3e4",
      "old_mode": 33188,
      "old_path": "examples/bzlmod/py_proto_library/example.com/proto/BUILD.bazel",
      "new_id": "1f8e8f28189bc873f7c40deaa10a5f7f957fe071",
      "new_mode": 33188,
      "new_path": "examples/bzlmod/py_proto_library/example.com/proto/BUILD.bazel"
    },
    {
      "type": "modify",
      "old_id": "d782fb296d96831ec81d21859f1045cba68f26e3",
      "old_mode": 33188,
      "old_path": "examples/py_proto_library/BUILD.bazel",
      "new_id": "b57c528511d69487894ed8a5ec087d5df3f6bc0c",
      "new_mode": 33188,
      "new_path": "examples/py_proto_library/BUILD.bazel"
    },
    {
      "type": "modify",
      "old_id": "3d841554e9a1f815a3bbcab2124b2ffd7f2278df",
      "old_mode": 33188,
      "old_path": "examples/py_proto_library/example.com/another_proto/BUILD.bazel",
      "new_id": "55e83a209a0d16fc1a916dcd2cfc4eb822df904d",
      "new_mode": 33188,
      "new_path": "examples/py_proto_library/example.com/another_proto/BUILD.bazel"
    },
    {
      "type": "modify",
      "old_id": "f84454f531f1075d2165ddc4333f43298fbbf123",
      "old_mode": 33188,
      "old_path": "examples/py_proto_library/example.com/proto/BUILD.bazel",
      "new_id": "fdf2e6fe328d4e5544fc2d00528b470781d73b99",
      "new_mode": 33188,
      "new_path": "examples/py_proto_library/example.com/proto/BUILD.bazel"
    },
    {
      "type": "modify",
      "old_id": "3dc8e12a0a391f193c1aeea10394422271415292",
      "old_mode": 33188,
      "old_path": "gazelle/README.md",
      "new_id": "35a1e4f70135363a5a968383fd4e8b919108996f",
      "new_mode": 33188,
      "new_path": "gazelle/README.md"
    },
    {
      "type": "modify",
      "old_id": "8e8216ddd425cfaf2a3db44ba05e8d9a54b21a94",
      "old_mode": 33188,
      "old_path": "gazelle/python/BUILD.bazel",
      "new_id": "1a7c54f4b25f9c6546ea5310801e2e69e56618e2",
      "new_mode": 33188,
      "new_path": "gazelle/python/BUILD.bazel"
    },
    {
      "type": "modify",
      "old_id": "db80fc1a229d921830c510e3dc8b98b7cc9aa246",
      "old_mode": 33188,
      "old_path": "gazelle/python/configure.go",
      "new_id": "7131be283d0c1d4ef2c328d509877b35b092d9c6",
      "new_mode": 33188,
      "new_path": "gazelle/python/configure.go"
    },
    {
      "type": "modify",
      "old_id": "c1edec4731b7b434c5ff6dbdb4a271edd7774bf6",
      "old_mode": 33188,
      "old_path": "gazelle/python/generate.go",
      "new_id": "343743559fbb96e9eca2024d99e0e19fb2673f40",
      "new_mode": 33188,
      "new_path": "gazelle/python/generate.go"
    },
    {
      "type": "modify",
      "old_id": "ff3f6ce829e46761701b9eb97f5642ad38a68a00",
      "old_mode": 33188,
      "old_path": "gazelle/python/kinds.go",
      "new_id": "a4ce572aaacf43b680cfed1e09a506abde9d80cd",
      "new_mode": 33188,
      "new_path": "gazelle/python/kinds.go"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "54261f47ca78c2ca42a159fa5bb1c662b801593b",
      "new_mode": 33188,
      "new_path": "gazelle/python/testdata/directive_python_generate_proto/README.md"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "faff6af87ac0ef60c3f9dacae80ca00b08118b58",
      "new_mode": 33188,
      "new_path": "gazelle/python/testdata/directive_python_generate_proto/WORKSPACE"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "36dd656b39e5bc20d7483645c4bd79ddeeffaa1c",
      "new_mode": 33188,
      "new_path": "gazelle/python/testdata/directive_python_generate_proto/test.yaml"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "9784aafc17b58918a4443d3be70e1baf4ed956ca",
      "new_mode": 33188,
      "new_path": "gazelle/python/testdata/directive_python_generate_proto/test1_default_with_proto/BUILD.in"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "9784aafc17b58918a4443d3be70e1baf4ed956ca",
      "new_mode": 33188,
      "new_path": "gazelle/python/testdata/directive_python_generate_proto/test1_default_with_proto/BUILD.out"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "fe2af27aa6fb6f86b01f01c75a115f887143a181",
      "new_mode": 33188,
      "new_path": "gazelle/python/testdata/directive_python_generate_proto/test1_default_with_proto/foo.proto"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "0a869d0fd5043a20f48d509b0550b8fae1e3ec86",
      "new_mode": 33188,
      "new_path": "gazelle/python/testdata/directive_python_generate_proto/test2_default_without_proto/BUILD.in"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "0a869d0fd5043a20f48d509b0550b8fae1e3ec86",
      "new_mode": 33188,
      "new_path": "gazelle/python/testdata/directive_python_generate_proto/test2_default_without_proto/BUILD.out"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "62fd4be661426ff8091f2d1b89220fc56bfa57c9",
      "new_mode": 33188,
      "new_path": "gazelle/python/testdata/directive_python_generate_proto/test3_disabled_with_proto/BUILD.in"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "62fd4be661426ff8091f2d1b89220fc56bfa57c9",
      "new_mode": 33188,
      "new_path": "gazelle/python/testdata/directive_python_generate_proto/test3_disabled_with_proto/BUILD.out"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "022e29ae693935d2b849417b57da915c5dadf56a",
      "new_mode": 33188,
      "new_path": "gazelle/python/testdata/directive_python_generate_proto/test3_disabled_with_proto/foo.proto"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "b283b5fb51286662e5de707a4ef9b4dfcfea876b",
      "new_mode": 33188,
      "new_path": "gazelle/python/testdata/directive_python_generate_proto/test4_disabled_without_proto/BUILD.in"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "b283b5fb51286662e5de707a4ef9b4dfcfea876b",
      "new_mode": 33188,
      "new_path": "gazelle/python/testdata/directive_python_generate_proto/test4_disabled_without_proto/BUILD.out"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "4713404b19cec05fd6b4486ccaa84c45dc32be87",
      "new_mode": 33188,
      "new_path": "gazelle/python/testdata/directive_python_generate_proto/test5_enabled_with_proto/BUILD.in"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "686252f27c793aff7497599e5c1034721c1d21a7",
      "new_mode": 33188,
      "new_path": "gazelle/python/testdata/directive_python_generate_proto/test5_enabled_with_proto/BUILD.out"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "fe2af27aa6fb6f86b01f01c75a115f887143a181",
      "new_mode": 33188,
      "new_path": "gazelle/python/testdata/directive_python_generate_proto/test5_enabled_with_proto/foo.proto"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "ce3eec6001bcccd9fa22828b4a9739d713efdc40",
      "new_mode": 33188,
      "new_path": "gazelle/python/testdata/directive_python_generate_proto/test6_enabled_without_proto/BUILD.in"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "ce3eec6001bcccd9fa22828b4a9739d713efdc40",
      "new_mode": 33188,
      "new_path": "gazelle/python/testdata/directive_python_generate_proto/test6_enabled_without_proto/BUILD.out"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "686252f27c793aff7497599e5c1034721c1d21a7",
      "new_mode": 33188,
      "new_path": "gazelle/python/testdata/directive_python_generate_proto/test7_removes_when_unnecessary/BUILD.in"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "ce3eec6001bcccd9fa22828b4a9739d713efdc40",
      "new_mode": 33188,
      "new_path": "gazelle/python/testdata/directive_python_generate_proto/test7_removes_when_unnecessary/BUILD.out"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "f14ed4fc2d916e890afd5e80c36ee697af6b76f1",
      "new_mode": 33188,
      "new_path": "gazelle/python/testdata/directive_python_generate_proto/test8_disabled_ignores_py_proto_library/BUILD.in"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "f14ed4fc2d916e890afd5e80c36ee697af6b76f1",
      "new_mode": 33188,
      "new_path": "gazelle/python/testdata/directive_python_generate_proto/test8_disabled_ignores_py_proto_library/BUILD.out"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "022e29ae693935d2b849417b57da915c5dadf56a",
      "new_mode": 33188,
      "new_path": "gazelle/python/testdata/directive_python_generate_proto/test8_disabled_ignores_py_proto_library/foo.proto"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "4713404b19cec05fd6b4486ccaa84c45dc32be87",
      "new_mode": 33188,
      "new_path": "gazelle/python/testdata/directive_python_generate_proto_bzlmod_protobuf/BUILD.in"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "dab84a67779ed93bd9440411c565225c7771b7c2",
      "new_mode": 33188,
      "new_path": "gazelle/python/testdata/directive_python_generate_proto_bzlmod_protobuf/BUILD.out"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "66d64afe034d7b17cbf6a7a22044c711f9f1900a",
      "new_mode": 33188,
      "new_path": "gazelle/python/testdata/directive_python_generate_proto_bzlmod_protobuf/MODULE.bazel"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "2d91ccff56d954a5fc1d768fc2c817d1ae799527",
      "new_mode": 33188,
      "new_path": "gazelle/python/testdata/directive_python_generate_proto_bzlmod_protobuf/README.md"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "e69de29bb2d1d6434b8b29ae775ad8c2e48c5391",
      "new_mode": 33188,
      "new_path": "gazelle/python/testdata/directive_python_generate_proto_bzlmod_protobuf/WORKSPACE"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "fe2af27aa6fb6f86b01f01c75a115f887143a181",
      "new_mode": 33188,
      "new_path": "gazelle/python/testdata/directive_python_generate_proto_bzlmod_protobuf/foo.proto"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "36dd656b39e5bc20d7483645c4bd79ddeeffaa1c",
      "new_mode": 33188,
      "new_path": "gazelle/python/testdata/directive_python_generate_proto_bzlmod_protobuf/test.yaml"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "4713404b19cec05fd6b4486ccaa84c45dc32be87",
      "new_mode": 33188,
      "new_path": "gazelle/python/testdata/directive_python_generate_proto_bzlmod_protobuf_renamed/BUILD.in"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "686252f27c793aff7497599e5c1034721c1d21a7",
      "new_mode": 33188,
      "new_path": "gazelle/python/testdata/directive_python_generate_proto_bzlmod_protobuf_renamed/BUILD.out"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "9ab4c175aadeae4123e9d04cecc7e419d76025dd",
      "new_mode": 33188,
      "new_path": "gazelle/python/testdata/directive_python_generate_proto_bzlmod_protobuf_renamed/MODULE.bazel"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "7900d49084e93148a911e400b96b87d954ac825d",
      "new_mode": 33188,
      "new_path": "gazelle/python/testdata/directive_python_generate_proto_bzlmod_protobuf_renamed/README.md"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "e69de29bb2d1d6434b8b29ae775ad8c2e48c5391",
      "new_mode": 33188,
      "new_path": "gazelle/python/testdata/directive_python_generate_proto_bzlmod_protobuf_renamed/WORKSPACE"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "fe2af27aa6fb6f86b01f01c75a115f887143a181",
      "new_mode": 33188,
      "new_path": "gazelle/python/testdata/directive_python_generate_proto_bzlmod_protobuf_renamed/foo.proto"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "36dd656b39e5bc20d7483645c4bd79ddeeffaa1c",
      "new_mode": 33188,
      "new_path": "gazelle/python/testdata/directive_python_generate_proto_bzlmod_protobuf_renamed/test.yaml"
    },
    {
      "type": "modify",
      "old_id": "8bf79cbc15d63967b74214187242f4f5aebc5bdd",
      "old_mode": 33188,
      "old_path": "gazelle/pythonconfig/pythonconfig.go",
      "new_id": "b76e1f92ec67e328476ce1e6db3754b0f30fb5d6",
      "new_mode": 33188,
      "new_path": "gazelle/pythonconfig/pythonconfig.go"
    }
  ]
}
