ReceiptsRecorded runs, model-free verdicts
VERIFIED

opensearch-project__opensearch-py-843

VERIFIED on first verdict

1 attempt, 0 appeals. 1 file, 6 added and 1 removed lines. Tokens: 581,430 tokens. Model cost: $0.04. Sandbox time: 1 min 59 s.

The plan

Repository
opensearch-project/opensearch-py
Base commit
1269cdc (image tag)
Issue
[BUG] Async client is missing ssl_assert_hostname implementation ### What is the bug? The `ssl_assert_hostname` parameter has no effect on the `AsyncOpenSearch` client. ### How can one reproduce the bug? ```python client = AsyncOpenSearch(hosts='my.opensearch.with.selfsigned.certs', ssl_assert_hostname=False) await client.search(...)
Files to edit
  • opensearchpy/_async/http_aiohttp.py
Approach
Add ssl_assert_hostname parameter handling in AIOHttpConnection.__init__ and pass it to the aiohttp connector creation, similar to how the urllib3 client handles it.

Attempt 1

VERIFIED

Agent branch

KindCommandExitDurationDigest
commandgit ls-files -z
exact command
git ls-files -z
00.004s2bc4d947
commandgrep -rn "ssl_assert_hostname" opensearchpy/ --include="*.py" | head -50
exact command
grep -rn "ssl_assert_hostname" opensearchpy/ --include="*.py" | head -50
00.008s7fdb46a7
commandgrep -n "test_ssl_assert_hostname" opensearchpy/test_async/test_connection.py
exact command
grep -n "test_ssl_assert_hostname" opensearchpy/test_async/test_connection.py
20.003s6410c979
commandfind /opensearch-py -name "test_connection.py" -path "*/async/*" 2>/dev/null
exact command
find /opensearch-py -name "test_connection.py" -path "*/async/*" 2>/dev/null
00.006s9976d895
commandfind /opensearch-py -name "*.py" -path "*/test*" | grep -i async | head -20
exact command
find /opensearch-py -name "*.py" -path "*/test*" | grep -i async | head -20
00.010sc8bd7c27
commandgrep -n "test_ssl_assert_hostname" /opensearch-py/test_opensearchpy/test_async/test_http_connection.py
exact command
grep -n "test_ssl_assert_hostname" /opensearch-py/test_opensearchpy/test_async/test_http_connection.py
10.003s6fb19776
commandgrep -rn "ssl_assert_hostname" /opensearch-py/test_opensearchpy/ 2>/dev/null
exact command
grep -rn "ssl_assert_hostname" /opensearch-py/test_opensearchpy/ 2>/dev/null
00.007s6436e9a3
commandls -la /opensearch-py/test_opensearchpy/test_async/
exact command
ls -la /opensearch-py/test_opensearchpy/test_async/
00.004s4699756e
show all 37 steps
KindCommandExitDurationDigest
commandwc -l /opensearch-py/test_opensearchpy/test_async/test_connection.py
exact command
wc -l /opensearch-py/test_opensearchpy/test_async/test_connection.py
00.003sa2aa680b
commandsed -n '95,130p' /opensearch-py/test_opensearchpy/test_async/test_connection.py
exact command
sed -n '95,130p' /opensearch-py/test_opensearchpy/test_async/test_connection.py
00.003scf3c7f1a
commandsed -n '100,140p' /opensearch-py/opensearchpy/_async/http_aiohttp.py
exact command
sed -n '100,140p' /opensearch-py/opensearchpy/_async/http_aiohttp.py
00.003s7badf905
commandsed -n '140,170p' /opensearch-py/opensearchpy/_async/http_aiohttp.py
exact command
sed -n '140,170p' /opensearch-py/opensearchpy/_async/http_aiohttp.py
00.003sca860ec3
commandsed -n '165,175p' /opensearch-py/opensearchpy/_async/http_aiohttp.py
exact command
sed -n '165,175p' /opensearch-py/opensearchpy/_async/http_aiohttp.py
00.004s81969ef1
commandsed -i 's/self.ssl_assert_fingerprint = ssl_assert_fingerprint/self.ssl_assert_fingerprint = ssl_assert_fingerprint\n self.ssl_assert_hostname = ssl_assert_hostname/' /opensearch-py/opensearchpy/_async/http_aiohttp.py
exact command
sed -i 's/self.ssl_assert_fingerprint = ssl_assert_fingerprint/self.ssl_assert_fingerprint = ssl_assert_fingerprint\n        self.ssl_assert_hostname = ssl_assert_hostname/' /opensearch-py/opensearchpy/_async/http_aiohttp.py
00.003s29e0f2db
commandsed -n '165,175p' /opensearch-py/opensearchpy/_async/http_aiohttp.py
exact command
sed -n '165,175p' /opensearch-py/opensearchpy/_async/http_aiohttp.py
00.003s79611134
commandsed -n '175,210p' /opensearch-py/opensearchpy/_async/http_aiohttp.py
exact command
sed -n '175,210p' /opensearch-py/opensearchpy/_async/http_aiohttp.py
00.003sf1550ea1
commandsed -n '188,200p' /opensearch-py/opensearchpy/_async/http_aiohttp.py
exact command
sed -n '188,200p' /opensearch-py/opensearchpy/_async/http_aiohttp.py
00.003s039ac775
commandsed -n '185,195p' /opensearch-py/opensearchpy/_async/http_aiohttp.py
exact command
sed -n '185,195p' /opensearch-py/opensearchpy/_async/http_aiohttp.py
00.003s3374a788
commandsed -n '180,192p' /opensearch-py/opensearchpy/_async/http_aiohttp.py
exact command
sed -n '180,192p' /opensearch-py/opensearchpy/_async/http_aiohttp.py
00.003sb4393578
commandsed -i 's/ssl_context.check_hostname = True$/if self.ssl_assert_hostname is not None: ssl_context.check_hostname = self.ssl_assert_hostname else: ssl_context.check_hostname = True/' /opensearch-py/opensearchpy/_async/http_aiohttp.py
exact command
sed -i 's/ssl_context.check_hostname = True$/if self.ssl_assert_hostname is not None: ssl_context.check_hostname = self.ssl_assert_hostname else: ssl_context.check_hostname = True/' /opensearch-py/opensearchpy/_async/http_aiohttp.py
00.004sec4fa914
commandsed -i 's/ssl_context.check_hostname = False/ssl_context.check_hostname = False/' /opensearch-py/opensearchpy/_async/http_aiohttp.py
exact command
sed -i 's/ssl_context.check_hostname = False/ssl_context.check_hostname = False/' /opensearch-py/opensearchpy/_async/http_aiohttp.py
00.004se2c48fc3
commandsed -n '180,195p' /opensearch-py/opensearchpy/_async/http_aiohttp.py
exact command
sed -n '180,195p' /opensearch-py/opensearchpy/_async/http_aiohttp.py
00.003s1a7ab529
commandcat > /tmp/fix.py << 'EOF' import re with open('/opensearch-py/opensearchpy/_async/http_aiohttp.py', 'r') as f: content = f.read() # Fix the one-liner to proper if-else old = ''' if verify_certs: ssl_context.verify_mode = ssl.CERT_REQUIRED if self.ssl_assert_hostname is not None: ssl_context.check_hostname = self.ssl_assert_hostname else: ssl_context.check_hostname = True''' new = ''' if verify_certs: ssl_context.verify_mode = ssl.CERT_REQUIRED if self.ssl_assert_hostname is not None: ssl_context.check_hostname = self.ssl_assert_hostname else: ssl_context.check_hostname = True''' content = content.replace(old, new) with open('/opensearch-py/opensearchpy/_async/http_aiohttp.py', 'w') as f: f.write(content) EOF python /tmp/fix.py
exact command
cat > /tmp/fix.py << 'EOF'
import re

with open('/opensearch-py/opensearchpy/_async/http_aiohttp.py', 'r') as f:
    content = f.read()

# Fix the one-liner to proper if-else
old = '''            if verify_certs:
                ssl_context.verify_mode = ssl.CERT_REQUIRED
                if self.ssl_assert_hostname is not None: ssl_context.check_hostname = self.ssl_assert_hostname else: ssl_context.check_hostname = True'''

new = '''            if verify_certs:
                ssl_context.verify_mode = ssl.CERT_REQUIRED
                if self.ssl_assert_hostname is not None:
                    ssl_context.check_hostname = self.ssl_assert_hostname
                else:
                    ssl_context.check_hostname = True'''

content = content.replace(old, new)

with open('/opensearch-py/opensearchpy/_async/http_aiohttp.py', 'w') as f:
    f.write(content)
EOF
python /tmp/fix.py
00.024s96bb6a98
commandsed -n '180,195p' /opensearch-py/opensearchpy/_async/http_aiohttp.py
exact command
sed -n '180,195p' /opensearch-py/opensearchpy/_async/http_aiohttp.py
00.003s8a60151d
commandcd /opensearch-py && python -m pytest test_opensearchpy/test_async/test_connection.py::TestAIOHttpConnection::test_ssl_assert_hostname -xvs 2>&1
exact command
cd /opensearch-py && python -m pytest test_opensearchpy/test_async/test_connection.py::TestAIOHttpConnection::test_ssl_assert_hostname -xvs 2>&1
10.565sdfe7f8cb
commandsed -n '130,170p' /opensearch-py/opensearchpy/_async/http_aiohttp.py
exact command
sed -n '130,170p' /opensearch-py/opensearchpy/_async/http_aiohttp.py
00.003s3a994496
commandsed -n '115,145p' /opensearch-py/opensearchpy/_async/http_aiohttp.py
exact command
sed -n '115,145p' /opensearch-py/opensearchpy/_async/http_aiohttp.py
00.003s77c2fa7a
commandcat > /tmp/fix2.py << 'EOF' with open('/opensearch-py/opensearchpy/_async/http_aiohttp.py', 'r') as f: content = f.read() # Add ssl_assert_hostname parameter to the function signature # Find the line with 'ssl_assert_fingerprint: Any = None,' and add ssl_assert_hostname before it old_sig = ''' ssl_version: Any = None, ssl_assert_fingerprint: Any = None,''' new_sig = ''' ssl_version: Any = None, ssl_assert_hostname: Any = None, ssl_assert_fingerprint: Any = None,''' content = content.replace(old_sig, new_sig) with open('/opensearch-py/opensearchpy/_async/http_aiohttp.py', 'w') as f: f.write(content) EOF python /tmp/fix2.py
exact command
cat > /tmp/fix2.py << 'EOF'
with open('/opensearch-py/opensearchpy/_async/http_aiohttp.py', 'r') as f:
    content = f.read()

# Add ssl_assert_hostname parameter to the function signature
# Find the line with 'ssl_assert_fingerprint: Any = None,' and add ssl_assert_hostname before it
old_sig = '''        ssl_version: Any = None,
        ssl_assert_fingerprint: Any = None,'''

new_sig = '''        ssl_version: Any = None,
        ssl_assert_hostname: Any = None,
        ssl_assert_fingerprint: Any = None,'''

content = content.replace(old_sig, new_sig)

with open('/opensearch-py/opensearchpy/_async/http_aiohttp.py', 'w') as f:
    f.write(content)
EOF
python /tmp/fix2.py
00.024s9370b822
commandsed -n '130,145p' /opensearch-py/opensearchpy/_async/http_aiohttp.py
exact command
sed -n '130,145p' /opensearch-py/opensearchpy/_async/http_aiohttp.py
00.003s68da16db
commandgrep -n "def __init__" /opensearch-py/opensearchpy/_async/http_aiohttp.py
exact command
grep -n "def __init__" /opensearch-py/opensearchpy/_async/http_aiohttp.py
00.003s5a6ae932
commandsed -n '74,120p' /opensearch-py/opensearchpy/_async/http_aiohttp.py
exact command
sed -n '74,120p' /opensearch-py/opensearchpy/_async/http_aiohttp.py
00.003sfaa5ef78
commandcd /opensearch-py && python -m pytest test_opensearchpy/test_async/test_connection.py::TestAIOHttpConnection::test_ssl_assert_hostname -xvs 2>&1
exact command
cd /opensearch-py && python -m pytest test_opensearchpy/test_async/test_connection.py::TestAIOHttpConnection::test_ssl_assert_hostname -xvs 2>&1
00.391sa434b1fe
commandcd /opensearch-py && python -m pytest test_opensearchpy/test_async/test_connection.py -x --tb=short 2>&1 | tail -30
exact command
cd /opensearch-py && python -m pytest test_opensearchpy/test_async/test_connection.py -x --tb=short 2>&1 | tail -30
00.500sc7b6b180
KindCommandExitDurationDigest
commandcd /opensearch-py && python -c " import asyncio from opensearchpy._async.http_aiohttp import AIOHttpConnection async def test(): # Test ssl_assert_hostname=True con = AIOHttpConnection(use_ssl=True, ssl_assert_hostname=True) await con._create_aiohttp_session() print(f'ssl_assert_hostname=True: check_hostname = {con.session.connector._ssl.check_hostname}') assert con.session.connector._ssl.check_hostname is True # Test ssl_assert_hostname=False con = AIOHttpConnection(use_ssl=True, ssl_assert_hostname=False) await con._create_aiohttp_session() print(f'ssl_assert_hostname=False: check_hostname = {con.session.connector._ssl.check_hostname}') assert con.session.connector._ssl.check_hostname is False # Test default (ssl_assert_hostname=None) con = AIOHttpConnection(use_ssl=True) await con._create_aiohttp_session() print(f'default (None): check_hostname = {con.session.connector._ssl.check_hostname}') # When verify_certs=True (default), check_hostname should be True assert con.session.connector._ssl.check_hostname is True print('All checks passed!') asyncio.run(test()) "
exact command
cd /opensearch-py && python -c "
import asyncio
from opensearchpy._async.http_aiohttp import AIOHttpConnection

async def test():
    # Test ssl_assert_hostname=True
    con = AIOHttpConnection(use_ssl=True, ssl_assert_hostname=True)
    await con._create_aiohttp_session()
    print(f'ssl_assert_hostname=True: check_hostname = {con.session.connector._ssl.check_hostname}')
    assert con.session.connector._ssl.check_hostname is True
    
    # Test ssl_assert_hostname=False
    con = AIOHttpConnection(use_ssl=True, ssl_assert_hostname=False)
    await con._create_aiohttp_session()
    print(f'ssl_assert_hostname=False: check_hostname = {con.session.connector._ssl.check_hostname}')
    assert con.session.connector._ssl.check_hostname is False
    
    # Test default (ssl_assert_hostname=None)
    con = AIOHttpConnection(use_ssl=True)
    await con._create_aiohttp_session()
    print(f'default (None): check_hostname = {con.session.connector._ssl.check_hostname}')
    # When verify_certs=True (default), check_hostname should be True
    assert con.session.connector._ssl.check_hostname is True
    
    print('All checks passed!')

asyncio.run(test())
"
00.241s96801ada
commandcd /opensearch-py && python -m pytest test_opensearchpy/test_async/ -x --tb=short 2>&1 | tail -20
exact command
cd /opensearch-py && python -m pytest test_opensearchpy/test_async/ -x --tb=short 2>&1 | tail -20
00.469s31e46a5c
commandcd /opensearch-py && python -m pytest test_opensearchpy/test_async/test_connection.py test_opensearchpy/test_async/test_http.py test_opensearchpy/test_async/test_http_connection.py -x --tb=short 2>&1 | tail -20
exact command
cd /opensearch-py && python -m pytest test_opensearchpy/test_async/test_connection.py test_opensearchpy/test_async/test_http.py test_opensearchpy/test_async/test_http_connection.py -x --tb=short 2>&1 | tail -20
00.533sbe270254
diffcapture patch
exact command
compute patch in executor staging agent1-36410de5165f47949e0ec5be8abe58eb: /opt/homebrew/Cellar/git/2.53.0/bin/git -c core.hooksPath=/dev/null -c core.attributesFile=/dev/null -c diff.external= -c core.quotePath=false add -A && /opt/homebrew/Cellar/git/2.53.0/bin/git -c core.hooksPath=/dev/null -c core.attributesFile=/dev/null -c diff.external= -c core.quotePath=false diff --cached --binary --no-ext-diff --no-textconv --no-renames 520e02522cde4fcf793171c316bebfed977f6491
00.074sfdb073e76ded
Finish summary
Fixed the missing `ssl_assert_hostname` implementation in the AsyncOpenSearch client. The parameter now properly controls the `check_hostname` setting in the aiohttp SSL context. Changes made to `opensearchpy/_async/http_aiohttp.py`: 1. Added `ssl_assert_hostname: Any = None` as an explicit parameter in `AIOHttpConnection.__init__` 2. Stored the value as `self.ssl_assert_hostname` 3. Modified the SSL context `check_hostname` logic to respect the `ssl_assert_hostname` parameter The fix ensures: - `ssl_assert_hostname=True` enables hostname verification - `ssl_assert_hostname=False` disables hostname verification (allows self-signed certs) - Default behavior maintains backward compatibility All 49 async connection and HTTP tests pass, including the specific `test_ssl_assert_hostname` test.
Worker outcome
finished
  • Target tests pass: yes
  • Full suite passes: yes
  • Files changed: opensearchpy/_async/http_aiohttp.py
  • Ran tests: yes

Witness branch w1

KindCommandExitDurationDigest
applyapply patch 676a975b9624
exact command
git update-index -q --refresh; git apply -v --3way --recount --ignore-space-change --whitespace=nowarn /opt/receipts-e54d0fa2a351490583eabf22cfce4112/incoming/676a975b96245809e3658827accc9569b06dc667f5e10d017bf97205c5b28081.diff
00.011s2a09133b4be8
verificationpytest (witness) test_opensearchpy/test_async/test_connection.py
exact command
/opt/receipts-de2f0aba238e4bc08ca50569f865a4c1/bin/busybox mkdir -p /opt/receipts/reports && python -I /opt/receipts-de2f0aba238e4bc08ca50569f865a4c1/receipts_pytest.py --no-header -rA --tb=line --color=no -p no:cacheprovider -W ignore::DeprecationWarning test_opensearchpy/test_async/test_connection.py -o junit_family=xunit1 -p no:cacheprovider -rA --continue-on-collection-errors --junitxml=/opt/receipts/reports/w1-2.xml
01.176s2a09133b4be8

Gate predicate checklist

PredicateNameStatusEvidence
R1_fail_to_passFailing specification tests now passPASStarget tests passed: test_opensearchpy/test_async/test_connection.py::TestAIOHttpConnection::test_ssl_assert_hostname
R2_pass_to_passPreviously passing tests keptPASS37 baseline-passing tests still pass
R3_no_shrinkNo removed tests or new skipsPASSall 38 baseline tests collected; skips unchanged (0)
R4_patch_scopePatch scopePASSpatch touches 1 file(s), all in scope
R5_provenanceWitness chain and patch digestPASSagent chain 24310cee -> be270254 unbroken over 37 receipt(s); witness chain 24310cee -> 5e51f41b unbroken over 2 receipt(s); applied digest matches
R6_claim_auditAgent claim audit (advisory)FAILclaimed green but never ran the tests on this branch

What it said

Finish summary
Fixed the missing `ssl_assert_hostname` implementation in the AsyncOpenSearch client. The parameter now properly controls the `check_hostname` setting in the aiohttp SSL context. Changes made to `opensearchpy/_async/http_aiohttp.py`: 1. Added `ssl_assert_hostname: Any = None` as an explicit parameter in `AIOHttpConnection.__init__` 2. Stored the value as `self.ssl_assert_hostname` 3. Modified the SSL context `check_hostname` logic to respect the `ssl_assert_hostname` parameter The fix ensures: - `ssl_assert_hostname=True` enables hostname verification - `ssl_assert_hostname=False` disables hostname verification (allows self-signed certs) - Default behavior maintains backward compatibility All 49 async connection and HTTP tests pass, including the specific `test_ssl_assert_hostname` test.
Worker outcome
finished
  • Target tests pass: yes
  • Full suite passes: yes
  • Files changed: opensearchpy/_async/http_aiohttp.py
  • Ran tests: yes

What the record shows

unsupported: claimed green but never ran the tests on this branch

SWE-rebench's official grader: resolved

Agrees with the gate

Shipped patch

diff --git a/opensearchpy/_async/http_aiohttp.py b/opensearchpy/_async/http_aiohttp.pyindex ed1d26e..b5d212f 100644--- a/opensearchpy/_async/http_aiohttp.py+++ b/opensearchpy/_async/http_aiohttp.py@@ -85,6 +85,7 @@ class AIOHttpConnection(AsyncConnection):         client_cert: Any = None,         client_key: Any = None,         ssl_version: Any = None,+        ssl_assert_hostname: Any = None,         ssl_assert_fingerprint: Any = None,         maxsize: Optional[int] = 10,         headers: Any = None,@@ -163,6 +164,7 @@ class AIOHttpConnection(AsyncConnection):             )          self.ssl_assert_fingerprint = ssl_assert_fingerprint+        self.ssl_assert_hostname = ssl_assert_hostname         if self.use_ssl and ssl_context is None:             if ssl_version is None:                 ssl_context = ssl.create_default_context()@@ -178,7 +180,10 @@ class AIOHttpConnection(AsyncConnection):              if verify_certs:                 ssl_context.verify_mode = ssl.CERT_REQUIRED-                ssl_context.check_hostname = True+                if self.ssl_assert_hostname is not None:+                    ssl_context.check_hostname = self.ssl_assert_hostname+                else:+                    ssl_context.check_hostname = True             else:                 ssl_context.check_hostname = False                 ssl_context.verify_mode = ssl.CERT_NONE

Model and costs

Model
nvidia/Nemotron-3_5-Lightning thinking off · temperature 1.0 · top_p 0.95
Tokens
581,430 tokens
Model cost
$0.04
Sandbox time
1 min 59 s
Sandbox cost
Token Factory reported cost: 0.080 (unit not published)
Full environment disclosure
{
  "executor_kind": "tokenfactory",
  "lock_sha256": "628c7f7a4bb74532e77fe0720a9fbfeb1481aff6fa5f3a66349f81705fbb8297",
  "model": {
    "base_url": "https://api.tokenfactory.nebius.com/v1/",
    "client": "TokenFactoryClient",
    "max_tokens": null,
    "model": "nvidia/Nemotron-3_5-Lightning",
    "temperature": 1.0,
    "thinking": false,
    "top_p": 0.95
  },
  "pytest_config_digests": {
    "benchmarks/pyproject.toml": "f59bf4a8f7a7147d1a06bfd7313da2331360f82c4cc7d2ae990c41078e31c2c6",
    "samples/pyproject.toml": "905e4b3a372ec46706b0de6ad9020633b265dbb97c7a41843c496aeba135504c",
    "setup.cfg": "5c8c75439b295b295ddd50d1752155323c0d03ff89a84375f9d0802695ed3b88",
    "test_opensearchpy/test_async/test_helpers/conftest.py": "97ae73b54a95226515a1b43413b17aae0680610fb15a00c30ad0c9e4c5eb4a27",
    "test_opensearchpy/test_async/test_server/conftest.py": "539d760dba7eb923ca7f414a1f0ff85780ac119dcd28713e78d39482e6741f82",
    "test_opensearchpy/test_async/test_server/test_helpers/conftest.py": "bb28790e93f7993bfc066aafe7e84c167727bda68980e5941982fce3fcd0e97b",
    "test_opensearchpy/test_helpers/conftest.py": "bd7b498faffa8c961a25de9ca07df447407ea5d01d9b4c53badf560a662a621f",
    "test_opensearchpy/test_server/conftest.py": "85d9a6ce25601efc6ba17e8cddc3e2eea652301d7184078b9046129261d65e34",
    "test_opensearchpy/test_server/test_helpers/conftest.py": "8f48d1aee10eb3af8a4495bc617c7443b700fa3fa7675d2cae5f941f19587b1e"
  },
  "receipts_version": "0.0.1",
  "test_digests": {
    "test_opensearchpy/test_async/__init__.py": "bf3e5fa95078ea681e0010fd9369674bc1c57d758ba5457255ccf9c6b6ffb77e",
    "test_opensearchpy/test_async/test_aiohttp.py": "506bf1da7f156deff64eae2548375b07f91aeaaf0cb037655543960085be11f9",
    "test_opensearchpy/test_async/test_client.py": "c77898560e55c6259e7ec2f2985a8a7a7dee7f1c7e50cb6f3ae12a6c010b6ddc",
    "test_opensearchpy/test_async/test_connection.py": "1f22550b9d5481209a72be423213a23a38d2f61b2ecbc8604135f67c3a10d938",
    "test_opensearchpy/test_async/test_helpers/__init__.py": "bf3e5fa95078ea681e0010fd9369674bc1c57d758ba5457255ccf9c6b6ffb77e",
    "test_opensearchpy/test_async/test_helpers/conftest.py": "97ae73b54a95226515a1b43413b17aae0680610fb15a00c30ad0c9e4c5eb4a27",
    "test_opensearchpy/test_async/test_helpers/test_document.py": "a18db809d755028421d244a889fb4a837fbbc37fa28fb5e043e14a9ed34167e2",
    "test_opensearchpy/test_async/test_helpers/test_faceted_search.py": "aacd594b69d4b5e203999ca2cbade92eee45e0ce6725f4858cdc1b6ed70db292",
    "test_opensearchpy/test_async/test_helpers/test_index.py": "3ad414f1ab3ce7e2a255878adf1bb91ec41b65530596a2b09802724b7d1b16f0",
    "test_opensearchpy/test_async/test_helpers/test_mapping.py": "69816a1423f05021c3adf5adac31178be5aafd4c71b7c35f8fd09d8923641ec5",
    "test_opensearchpy/test_async/test_helpers/test_search.py": "e00a29c98e4f0434e078e33653f4c7cd89a3fcf390e0c1f849789244fa3aa635",
    "test_opensearchpy/test_async/test_helpers/test_update_by_query.py": "4186869621c06824c607322e9a2db0af70dc5e05de4df23f6b814062f7b3d201",
    "test_opensearchpy/test_async/test_http.py": "e4bae7858f8f768d3e58455478271307d6aaba210dddfa19865d2bf10d888815",
    "test_opensearchpy/test_async/test_http_connection.py": "3713c5f9e579c6a305e8aa630a5a443806cb2368ab2d3359addfbbd18c4c9eaa",
    "test_opensearchpy/test_async/test_plugins_client.py": "88360e8144075803d40c4645a51a33dfcf231f6ef56b6edbbe5a68ded263077a",
    "test_opensearchpy/test_async/test_server/__init__.py": "435ac19d59adf4aeb41f4f7e0c80c04c4e09e6c478de6d26f3210c06efd4c8e7",
    "test_opensearchpy/test_async/test_server/conftest.py": "539d760dba7eb923ca7f414a1f0ff85780ac119dcd28713e78d39482e6741f82",
    "test_opensearchpy/test_async/test_server/test_clients.py": "b87cda71bdec57eb142a39a818b9ed206dfb7c08b8e74bee2e8da80d59928f88",
    "test_opensearchpy/test_async/test_server/test_helpers/__init__.py": "bf3e5fa95078ea681e0010fd9369674bc1c57d758ba5457255ccf9c6b6ffb77e",
    "test_opensearchpy/test_async/test_server/test_helpers/conftest.py": "bb28790e93f7993bfc066aafe7e84c167727bda68980e5941982fce3fcd0e97b",
    "test_opensearchpy/test_async/test_server/test_helpers/test_actions.py": "19b07461084784b85c896ab131137a31d256c02cb6a7c79c66095f12cd0b32ea",
    "test_opensearchpy/test_async/test_server/test_helpers/test_data.py": "1df29f49d6250c7c6d45dc18843a5c4342878e1e8ca9cfe94421ede9fd0441c5",
    "test_opensearchpy/test_async/test_server/test_helpers/test_document.py": "97718bd308dfc78dbe45f034d5a66770853009a266de8ef4328ce4e8bb8ded95",
    "test_opensearchpy/test_async/test_server/test_helpers/test_faceted_search.py": "67e78cfe215e4c4a05b3a30daf66252b3220f9c8ef8e13616e027f0332fb6555",
    "test_opensearchpy/test_async/test_server/test_helpers/test_index.py": "9310d88444f8c5817ccbfea96e43f3818347936e6924b8153463111dc23ce959",
    "test_opensearchpy/test_async/test_server/test_helpers/test_mapping.py": "253fb26f08a767fc9159859b1e4447a59ea9010d2f675df4ab130aca07ae85fc",
    "test_opensearchpy/test_async/test_server/test_helpers/test_search.py": "18bfd17a983e3a944df1480c3993408f95b8df49c194bffdf2696d2c65995098",
    "test_opensearchpy/test_async/test_server/test_helpers/test_update_by_query.py": "b099216e75d27c87645ab30b25d635ba04c5a9ab6f92d7e3d82bb2bf02f407aa",
    "test_opensearchpy/test_async/test_server/test_plugins/__init__.py": "bf3e5fa95078ea681e0010fd9369674bc1c57d758ba5457255ccf9c6b6ffb77e",
    "test_opensearchpy/test_async/test_server/test_plugins/test_alerting.py": "c77a66ceb80cb33131b79245cbe730042b05f1c0f2ff7d4fd71ccead0c341194",
    "test_opensearchpy/test_async/test_server/test_plugins/test_index_management.py": "2164a532269b1991a7868fef2fbdc512928fc019ff1ab19bb800735b9b8a56f5",
    "test_opensearchpy/test_async/test_server/test_rest_api_spec.py": "151151a27c21ee6b38cf8da171639be8fc6eefdc289c8ba3c91a8ff34bad03b1",
    "test_opensearchpy/test_async/test_server_secured/__init__.py": "e92f004c4f4373c93ef075e7f422e885b37ee64197b59f0839983d39aa9df934",
    "test_opensearchpy/test_async/test_server_secured/test_security_plugin.py": "13d6a062830772bb869d7a18e7d7a714f98e542fc3b13f9dc377dfe17f65e3c5",
    "test_opensearchpy/test_async/test_signer.py": "684f33ee4f5d6b865a33861b5b5dac529a49eea3ae98416cadccfc283322c578",
    "test_opensearchpy/test_async/test_transport.py": "be77a1c7f32f8de4f1079780c06829e12e99e9894f07e09538b0ec361db29829"
  }
}

The bundle

Recorded JSON and patches. In these copies the local checkout path is removed from file paths, and the home directory is shown as ~.