)]}'
{
  "commit": "20ac9bc5b185cf7944727a60d65fd870de90ebef",
  "tree": "5b7fdea06e997d0ed8dfa0150aaa901221b788c6",
  "parents": [
    "c0b5075df0e8f61f83bf55dcbaa5c2912d248c70"
  ],
  "author": {
    "name": "Richard Levasseur",
    "email": "rlevasseur@google.com",
    "time": "Sat Mar 15 17:30:39 2025 -0700"
  },
  "committer": {
    "name": "GitHub",
    "email": "noreply@github.com",
    "time": "Sun Mar 16 00:30:39 2025 +0000"
  },
  "message": "feat(rules): allow deriving custom rules from core rules (#2666)\n\nThis exposes public functions for creating builders for py_binary,\npy_test, and py_library.\nIt also adds some docs and examples for how to use them.\n\nI\u0027m calling this a \"volatile\" API -- it\u0027s public, but the pieces that\ncomprise\nit (e.g. all the rule args, attributes, the attribute args, etc) are\nlikely to change\nin various ways, and not all modifications to them can be supported in a\nbackward\ncompatible way. Hence the \"volatile\" term:\n* hold it gently and its fine\n* shake it a bit and its probably fine\n* shake it moderately and something may or may not blow up\n* shake it a lot and something will certainly blow up.\n\nWork towards https://github.com/bazelbuild/rules_python/issues/1647\n\n---------\n\nCo-authored-by: Ignas Anikevicius \u003c240938+aignas@users.noreply.github.com\u003e",
  "tree_diff": [
    {
      "type": "modify",
      "old_id": "9029794ffc067601d8e4ff8bc604428ee76fe75a",
      "old_mode": 33188,
      "old_path": "CHANGELOG.md",
      "new_id": "c5bf986216876d5c95650e3680f077aef5789b6d",
      "new_mode": 33188,
      "new_path": "CHANGELOG.md"
    },
    {
      "type": "modify",
      "old_id": "e19c22113f3495c2ceb980ff5f212c1e414fc1cd",
      "old_mode": 33188,
      "old_path": "docs/BUILD.bazel",
      "new_id": "09de21b86a0309c96e30f6ef2c1161f31a5bf933",
      "new_mode": 33188,
      "new_path": "docs/BUILD.bazel"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "b79f5f70610bbd0cdebdb3c20fb5f7cdda2a6334",
      "new_mode": 33188,
      "new_path": "docs/_includes/volatile_api.md"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "dbd63e5a4f40f1f0124abf2168777ad0ecd28f5e",
      "new_mode": 33188,
      "new_path": "docs/extending.md"
    },
    {
      "type": "modify",
      "old_id": "dd2e147c18c94043105066f2c785dd536963aaf0",
      "old_mode": 33188,
      "old_path": "docs/index.md",
      "new_id": "04a7688850f2cc5fda5d8585c68af58f2ae55427",
      "new_mode": 33188,
      "new_path": "docs/index.md"
    },
    {
      "type": "modify",
      "old_id": "1df6877ef874a0f629e6954ceeffed9e2e53c6d1",
      "old_mode": 33188,
      "old_path": "python/api/BUILD.bazel",
      "new_id": "f0e04948acb5ce6ccc5bdd2b28e858a546462eac",
      "new_mode": 33188,
      "new_path": "python/api/BUILD.bazel"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "4715c0f481b6f3263492b32eae650dbf66f5d67f",
      "new_mode": 33188,
      "new_path": "python/api/executables.bzl"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "c4ad598e3fac4c69da9b06dde0e14fb0835e4d94",
      "new_mode": 33188,
      "new_path": "python/api/libraries.bzl"
    },
    {
      "type": "modify",
      "old_id": "b7e52a35aad74fcd7bf74b673ca78547a0b63c5f",
      "old_mode": 33188,
      "old_path": "python/private/BUILD.bazel",
      "new_id": "8b07fbd877753cf400af9c612a1513300ec960ac",
      "new_mode": 33188,
      "new_path": "python/private/BUILD.bazel"
    },
    {
      "type": "modify",
      "old_id": "acd1d4039481eb372b8a142d45bf2764ef54dfc3",
      "old_mode": 33188,
      "old_path": "python/private/attr_builders.bzl",
      "new_id": "efcbfa6e5b53c534cf501644a69b299fde332352",
      "new_mode": 33188,
      "new_path": "python/private/attr_builders.bzl"
    },
    {
      "type": "modify",
      "old_id": "0e1912cf0c80128ae0b463accb50eed149850a60",
      "old_mode": 33188,
      "old_path": "python/private/py_binary_rule.bzl",
      "new_id": "38e3a697c7b6d75517230603f1ad1e7da624f555",
      "new_mode": 33188,
      "new_path": "python/private/py_binary_rule.bzl"
    },
    {
      "type": "modify",
      "old_id": "f85f242bbaba932287a4a3ea552e1c167efbf3d9",
      "old_mode": 33188,
      "old_path": "python/private/py_executable.bzl",
      "new_id": "bcbff70bec295482445332dc7975250165e2b5f9",
      "new_mode": 33188,
      "new_path": "python/private/py_executable.bzl"
    },
    {
      "type": "modify",
      "old_id": "a774104dd2331cd31546f27a22360810d816850c",
      "old_mode": 33188,
      "old_path": "python/private/py_library.bzl",
      "new_id": "7b024a0f07384bd8f6a07343b2c4b5f46e05bee2",
      "new_mode": 33188,
      "new_path": "python/private/py_library.bzl"
    },
    {
      "type": "modify",
      "old_id": "44382a76d6b4a6dfa1b9b42d8f2b78d530878143",
      "old_mode": 33188,
      "old_path": "python/private/py_library_rule.bzl",
      "new_id": "ac256bccc1b7d16be3a680ee231ad66b7156d764",
      "new_mode": 33188,
      "new_path": "python/private/py_library_rule.bzl"
    },
    {
      "type": "modify",
      "old_id": "72e8bab805e6c1d58120ea166de83fd7ac121a76",
      "old_mode": 33188,
      "old_path": "python/private/py_test_rule.bzl",
      "new_id": "f21fdc7557f0cc30e82a7916470da293bf5c4f81",
      "new_mode": 33188,
      "new_path": "python/private/py_test_rule.bzl"
    },
    {
      "type": "modify",
      "old_id": "6d9fb3f964e30b40ba64985565a93be0250cbd3e",
      "old_mode": 33188,
      "old_path": "python/private/rule_builders.bzl",
      "new_id": "4607285949bd73cd259b3107a115f2943b610682",
      "new_mode": 33188,
      "new_path": "python/private/rule_builders.bzl"
    },
    {
      "type": "modify",
      "old_id": "d1e3b8e9c8d64d33d1ae29878caa48124dda45d4",
      "old_mode": 33188,
      "old_path": "tests/support/sh_py_run_test.bzl",
      "new_id": "7b3b617da1f7eb5ad1bca8bae8ae3af16597fb2c",
      "new_mode": 33188,
      "new_path": "tests/support/sh_py_run_test.bzl"
    }
  ]
}
