{
  "appeals": 1,
  "budgets": {
    "baseline_limit_s": 600,
    "verification_timeout_s": 600,
    "worker": {
      "max_completion_tokens": 96000,
      "max_turns": 60,
      "max_wall_seconds": 1500.0,
      "prompt_token_budget": 160000
    }
  },
  "issue": "Python 2: OxBTrees allow types as keys; Python 3 does not\nConsider:\r\n```python\r\nclass Old:\r\n    pass\r\n\r\nclass New(object):\r\n    pass\r\n\r\nfrom BTrees import family64\r\nbt = family64.OO.BTree()\r\n```\r\n\r\nOn Python 3, both `Old` and `New`, which are types, cannot go in the tree because they have default comparison:\r\n```pycon\r\n>>> bt[Old] = 1\r\nTraceback (most recent call last):\r\n  File \"<stdin>\", line 1, in <module>\r\nTypeError: Object has default comparison\r\n>>> bt[New] = 1\r\nTraceback (most recent call last):\r\n  File \"<stdin>\", line 1, in <module>\r\nTypeError: Object has default comparison\r\n```\r\n\r\nUnder Python 2, however, the default comparison is only detected for old-style classes; new style `type` apparently doesn't have default comparison that we can detect:\r\n```pycon\r\n>>> bt[Old] = 1\r\nTraceback (most recent call last):\r\n  File \"<stdin>\", line 1, in <module>\r\nTypeError: Object has default comparison\r\n>>> bt[New] = 1\r\n```\r\n\r\nType ordering in Python 2 [is based on address](https://github.com/python/cpython/blob/8d21aa21f2cbc6d50aab3f420bb23be1d081dac4/Objects/typeobject.c#L669-L679), making it not suitable for use in a BTree. It emits a warning if you run Python with the `-3` argument.\r\n\r\nCan we try harder (or just special case) to find that `type` objects shouldn't be used as keys?",
  "source": {
    "image": "docker.io/swerebenchv2/zopefoundation-btrees:163-02bcfde",
    "platform": "linux/amd64",
    "python": "python",
    "setup": [
      "python -c 'import base64; from pathlib import Path; Path('\"'\"'/tmp/receipts-zopefoundation__btrees-163-test.patch'\"'\"').write_bytes(base64.b64decode('\"'\"'ZGlmZiAtLWdpdCBhL3NyYy9CVHJlZXMvdGVzdHMvY29tbW9uLnB5IGIvc3JjL0JUcmVlcy90ZXN0cy9jb21tb24ucHkKaW5kZXggM2RiNzIwNC4uMmEzNGMzYyAxMDA2NDQKLS0tIGEvc3JjL0JUcmVlcy90ZXN0cy9jb21tb24ucHkKKysrIGIvc3JjL0JUcmVlcy90ZXN0cy9jb21tb24ucHkKQEAgLTExNDMsNiArMTE0MywzMiBAQCBjbGFzcyBNYXBwaW5nQmFzZShCYXNlKTogIyBweWxpbnQ6ZGlzYWJsZT10b28tbWFueS1wdWJsaWMtbWV0aG9kcwogICAgIGRlZiB0ZXN0X2Fzc2lnbl92YWx1ZV90eXBlX05vbmUoc2VsZik6CiAgICAgICAgIHNlbGYuX190ZXN0X3ZhbHVlKE5vbmUpCiAKKyAgICBkZWYgdGVzdE5ld1N0eWxlQ2xhc3NBc0tleU5vdEFsbG93ZWQoc2VsZik6CisgICAgICAgIG0gPSBzZWxmLl9tYWtlT25lKCkKKyAgICAgICAgY2xhc3MgTmV3KG9iamVjdCk6CisgICAgICAgICAgICBwYXNzCisKKyAgICAgICAgd2l0aCBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IpOgorICAgICAgICAgICAgbVtOZXddID0gc2VsZi5nZXRUd29WYWx1ZXMoKVswXQorCisgICAgZGVmIHRlc3RPbGRTdHlsZUNsYXNzQXNLZXlOb3RBTGxvd2VkKHNlbGYpOgorICAgICAgICBtID0gc2VsZi5fbWFrZU9uZSgpCisgICAgICAgIGNsYXNzIE9sZDogIyBQeXRob24gMjogT2xkIHN0eWxlIGNsYXNzCisgICAgICAgICAgICBwYXNzCisKKyAgICAgICAgd2l0aCBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IpOgorICAgICAgICAgICAgbVtPbGRdID0gc2VsZi5nZXRUd29WYWx1ZXMoKVswXQorCisgICAgZGVmIHRlc3ROZXdTdHlsZUNsYXNzV2l0aEN1c3RvbU1ldGFDbGFzc05vdEFsbG93ZWQoc2VsZik6CisKKyAgICAgICAgY2xhc3MgTWV0YSh0eXBlKToKKyAgICAgICAgICAgIHBhc3MKKworICAgICAgICBjbHMgPSBNZXRhKCdDbGFzcycsIChvYmplY3QsKSwge30pCisgICAgICAgIG0gPSBzZWxmLl9tYWtlT25lKCkKKyAgICAgICAgd2l0aCBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IpOgorICAgICAgICAgICAgbVtjbHNdID0gc2VsZi5nZXRUd29WYWx1ZXMoKVswXQorCiAgICAgZGVmIHRlc3RFbXB0eUZpcnN0QnVja2V0UmVwb3J0ZWRCeUd1aWRvKHNlbGYpOgogICAgICAgICAjIFRoaXMgd2FzIGZvciBJbnRlZ2VyIGtleXMKICAgICAgICAgZnJvbSAuLl9jb21wYXQgaW1wb3J0IHhyYW5nZQpkaWZmIC0tZ2l0IGEvc3JjL0JUcmVlcy90ZXN0cy90ZXN0X09PQlRyZWUucHkgYi9zcmMvQlRyZWVzL3Rlc3RzL3Rlc3RfT09CVHJlZS5weQppbmRleCA3OWU0Mjg5Li4wOTRlMzI4IDEwMDY0NAotLS0gYS9zcmMvQlRyZWVzL3Rlc3RzL3Rlc3RfT09CVHJlZS5weQorKysgYi9zcmMvQlRyZWVzL3Rlc3RzL3Rlc3RfT09CVHJlZS5weQpAQCAtMjUsOSArMjUsMTAgQEAgY2xhc3MgT09CVHJlZVRlc3QoQlRyZWVUZXN0cyk6CiAgICAgICAgICAgICAgICAgICAgICAgICAgWyh5LCB4KSBmb3IgeCwgeSBpbiByZXZlcnNlZChJVEVNU1syMjpdKV0pCiAKICAgICBkZWYgdGVzdFJlamVjdERlZmF1bHRDb21wYXJpc29uT25TZXQoc2VsZik6Ci0gICAgICAgICMgQ2hlY2sgdGhhdCBwYXNzaW5nIGludCBrZXlzIHcgZGVmYXVsdCBjb21wYXJpc29uIGZhaWxzLgotICAgICAgICAjIE9ubHkgYXBwbGllcyB0byBuZXctc3R5bGUgY2xhc3MgaW5zdGFuY2VzLiBPbGQtc3R5bGUKLSAgICAgICAgIyBpbnN0YW5jZXMgYXJlIHRvbyBoYXJkIHRvIGludHJvc3BlY3QuCisgICAgICAgICMgQ2hlY2sgdGhhdCBwYXNzaW5nIGluIGtleXMgdyBkZWZhdWx0IGNvbXBhcmlzb24gZmFpbHMuIE9ubHkKKyAgICAgICAgIyBhcHBsaWVzIHRvIG5ldy1zdHlsZSBjbGFzcyBpbnN0YW5jZXMgaWYgd2UncmUgdXNpbmcgdGhlIEMKKyAgICAgICAgIyBleHRlbnNpb25zOyBvbGQtc3R5bGUgaW5zdGFuY2VzIGFyZSB0b28gaGFyZCB0byBpbnRyb3NwZWN0CisgICAgICAgICMgaW4gQy4KIAogICAgICAgICAjIFRoaXMgaXMgd2hpdGUgYm94IGJlY2F1c2Ugd2Uga25vdyB0aGF0IHRoZSBjaGVjayBpcyBiZWluZwogICAgICAgICAjIHVzZWQgaW4gYSBmdW5jdGlvbiB0aGF0J3MgdXNlZCBpbiBsb3RzIG9mIHBsYWNlcy4KQEAgLTM2LDEzICszNywyMiBAQCBjbGFzcyBPT0JUcmVlVGVzdChCVHJlZVRlc3RzKToKICAgICAgICAgZnJvbSAuLl9jb21wYXQgaW1wb3J0IFBZMgogICAgICAgICB0ID0gc2VsZi5fbWFrZU9uZSgpCiAKKyAgICAgICAgY2xhc3MgT2xkU3R5bGU6CisgICAgICAgICAgICBwYXNzCisKKyAgICAgICAgaWYgc2VsZi5fZ2V0VGFyZ2V0Q2xhc3MoKSBpcyBPT0JUcmVlLk9PQlRyZWVQeSBvciBub3QgUFkyOgorICAgICAgICAgICAgd2l0aCBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IpOgorICAgICAgICAgICAgICAgIHRbT2xkU3R5bGUoKV0gPSAxCisKICAgICAgICAgY2xhc3MgQyhvYmplY3QpOgogICAgICAgICAgICAgcGFzcwogCiAgICAgICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yKSBhcyByYWlzaW5nOgogICAgICAgICAgICAgdFtDKCldID0gMQogCi0gICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmFpc2luZy5leGNlcHRpb24uYXJnc1swXSwgIk9iamVjdCBoYXMgZGVmYXVsdCBjb21wYXJpc29uIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgKKyAgICAgICAgICAgIHJhaXNpbmcuZXhjZXB0aW9uLmFyZ3NbMF0sCisgICAgICAgICAgICAiT2JqZWN0IG9mIGNsYXNzIEMgaGFzIGRlZmF1bHQgY29tcGFyaXNvbiIpCiAKICAgICAgICAgaWYgUFkyOiAjIHdlIG9ubHkgY2hlY2sgZm9yIF9fY21wX18gb24gUHl0aG9uMgogCkBAIC02MCw2ICs3MCwxNCBAQCBjbGFzcyBPT0JUcmVlVGVzdChCVHJlZVRlc3RzKToKIAogICAgICAgICBjID0gV2l0aF9fX2x0X18oKQogICAgICAgICB0W2NdID0gMQorICAgICAgICB0LmNsZWFyKCkKKworICAgICAgICBjbGFzcyBXaXRoX19fbHRfX09sZDoKKyAgICAgICAgICAgIGRlZiBfX2x0X18oKmFyZ3MpOgorICAgICAgICAgICAgICAgIHJldHVybiAxCisKKyAgICAgICAgYyA9IFdpdGhfX19sdF9fT2xkKCkKKyAgICAgICAgdFtjXSA9IDEKIAogICAgICAgICB0LmNsZWFyKCkKIApAQCAtNzMsNiArOTEsMTYgQEAgY2xhc3MgT09CVHJlZVRlc3QoQlRyZWVUZXN0cyk6CiAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKEtleUVycm9yLCB0Ll9fZ2V0aXRlbV9fLCBDKCkpCiAgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UoQygpIGluIHQpCiAKKworICAgIGRlZiB0ZXN0TmV3U3R5bGVDbGFzc1dpdGhDdXN0b21NZXRhQ2xhc3NBbGxvd2VkKHNlbGYpOgorICAgICAgICBjbGFzcyBNZXRhKHR5cGUpOgorICAgICAgICAgICAgZGVmIF9fbHRfXyhjbHMsIG90aGVyKToKKyAgICAgICAgICAgICAgICByZXR1cm4gMQorCisgICAgICAgIGNscyA9IE1ldGEoJ0NsYXNzJywgKG9iamVjdCwpLCB7fSkKKyAgICAgICAgbSA9IHNlbGYuX21ha2VPbmUoKQorICAgICAgICBtW2Nsc10gPSBzZWxmLmdldFR3b1ZhbHVlcygpWzBdCisKICAgICBkZWYgdGVzdF9Ob25lX2lzX3NtYWxsZXN0KHNlbGYpOgogICAgICAgICB0ID0gc2VsZi5fbWFrZU9uZSgpCiAgICAgICAgIGZvciBpIGluIHJhbmdlKDk5OSk6ICMgTWFrZSBzdXJlIHdlIG11bHRpcGxlIGJ1Y2tldHMK'\"'\"'))'",
      "git apply /tmp/receipts-zopefoundation__btrees-163-test.patch"
    ],
    "workdir": "/BTrees"
  },
  "spec_paths": [
    "src/BTrees/tests/common.py",
    "src/BTrees/tests/test_OOBTree.py"
  ],
  "spec_tests": [
    "src/BTrees/tests/test_OOBTree.py::TestAutoOOBTreeOOBTreeTest::testNewStyleClassWithCustomMetaClassAllowed",
    "src/BTrees/tests/test_OOBTree.py::TestAutoOOBTreeOOBTreeTest::testRejectDefaultComparisonOnSet"
  ],
  "suite_scope": "--no-header -rA --tb=line --color=no -p no:cacheprovider -W ignore::DeprecationWarning src/BTrees/tests/common.py src/BTrees/tests/test_OOBTree.py"
}
