)]}'
{
  "commit": "95a1e83a1a2ff3021469f4bced7e700fb8c3d808",
  "tree": "ed299421d48148978488f21a7f9a57522943d4af",
  "parents": [
    "6c275f379ca279b2bb9bb5992e9037e232ca0a1c"
  ],
  "author": {
    "name": "Abseil Team",
    "email": "absl-team@google.com",
    "time": "Mon Oct 27 04:46:53 2025 -0700"
  },
  "committer": {
    "name": "Copybara-Service",
    "email": "copybara-worker@google.com",
    "time": "Tue Oct 28 20:13:23 2025 -0700"
  },
  "message": "Add a `@parameterized.named_product` which combines both `named_parameters` and `product` together.\n\nNamed Parameterized Test Cases of a Cartesian Product\n\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\n\nBoth `named_parameters` and `product` have useful features.\nHowever, when using both, it can be difficult to ensure that generated test\ncases retain useful names.\n\nHere, we combine both approaches to create parameterized tests with both\ngenerated permutations and human-readable names.\n\nExample:\n```python\n    @parameterized.named_product(\n        [\n          dict(\n              testcase_name\u003d\u0027five_mod_three_is_2\u0027,\n              num\u003d5,\n              modulo\u003d3,\n              expected\u003d2,\n          ),\n          dict(\n              testcase_name\u003d\u0027seven_mod_four_is_3\u0027,\n              num\u003d7,\n              modulo\u003d4,\n              expected\u003d3,\n          ),\n        ],\n        [\n            dict(testcase_name\u003d\u0027int\u0027, dtype\u003dint),\n            dict(testcase_name\u003d\u0027float\u0027, dtype\u003dfloat),\n        ]\n    )\n    def testModuloResult(self, num, modulo, expected, dtype):\n      self.assertEqual(expected, dtype(num) % modulo)\n\n  This would generate the test cases:\n\n    testModuloResult_five_mod_three_is_2_int\n    testModuloResult_five_mod_three_is_2_float\n    testModuloResult_seven_mod_four_is_3_int\n    testModuloResult_seven_mod_four_is_3_float\n```\n\nPiperOrigin-RevId: 824463104\n",
  "tree_diff": [
    {
      "type": "modify",
      "old_id": "f56d566fc877b57fd14b1b039cdaeff5c5ff37cd",
      "old_mode": 33188,
      "old_path": "CHANGELOG.md",
      "new_id": "b3e1fe3e73cedd29e84360fd5ad10e00efc496f6",
      "new_mode": 33188,
      "new_path": "CHANGELOG.md"
    },
    {
      "type": "modify",
      "old_id": "1ee91258a702aa6db489edc0d276492f3afd5386",
      "old_mode": 33188,
      "old_path": "absl/testing/parameterized.py",
      "new_id": "df6a7488119de36887b654286896d4d242eda170",
      "new_mode": 33188,
      "new_path": "absl/testing/parameterized.py"
    },
    {
      "type": "modify",
      "old_id": "4c0249273ed3b035345fd563eca6db622d606c2f",
      "old_mode": 33188,
      "old_path": "absl/testing/tests/parameterized_test.py",
      "new_id": "d236d1c5d9fbeba9d6f8196f6f787179f0f92507",
      "new_mode": 33188,
      "new_path": "absl/testing/tests/parameterized_test.py"
    }
  ]
}
