Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions python/conftest.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
"""
Pytest configuration for building the C extension before tests.
"""

import sys
import subprocess
from pathlib import Path
Expand Down
110 changes: 55 additions & 55 deletions python/coverage.xml
Original file line number Diff line number Diff line change
@@ -1,12 +1,12 @@
<?xml version="1.0" ?>
<coverage version="7.8.2" timestamp="1751690296947" lines-valid="524" lines-covered="381" line-rate="0.7271" branches-valid="176" branches-covered="103" branch-rate="0.5852" complexity="0">
<!-- Generated by coverage.py: https://coverage.readthedocs.io/en/7.8.2 -->
<coverage version="7.10.5" timestamp="1755964741075" lines-valid="524" lines-covered="426" line-rate="0.813" branches-valid="176" branches-covered="122" branch-rate="0.6932" complexity="0">
<!-- Generated by coverage.py: https://coverage.readthedocs.io/en/7.10.5 -->
<!-- Based on https://raw.githubusercontent.com/cobertura/web/master/htdocs/xml/coverage-04.dtd -->
<sources>
<source>/Users/kentb/Dropbox/Mac/Documents/augment-projects/BPlusTree3/python/bplustree</source>
<source>/home/runner/work/BPlusTree3/BPlusTree3/python/bplustree</source>
</sources>
<packages>
<package name="." line-rate="0.7271" branch-rate="0.5852" complexity="0">
<package name="." line-rate="0.813" branch-rate="0.6932" complexity="0">
<classes>
<class name="__init__.py" filename="__init__.py" complexity="0" line-rate="0.1299" branch-rate="0">
<methods/>
Expand Down Expand Up @@ -90,7 +90,7 @@
<line number="133" hits="1"/>
</lines>
</class>
<class name="bplus_tree.py" filename="bplus_tree.py" complexity="0" line-rate="0.83" branch-rate="0.6867">
<class name="bplus_tree.py" filename="bplus_tree.py" complexity="0" line-rate="0.9306" branch-rate="0.8133">
<methods/>
<lines>
<line number="8" hits="1"/>
Expand All @@ -116,31 +116,31 @@
<line number="76" hits="1"/>
<line number="78" hits="1"/>
<line number="79" hits="1"/>
<line number="94" hits="0"/>
<line number="95" hits="0"/>
<line number="96" hits="0"/>
<line number="94" hits="1"/>
<line number="95" hits="1"/>
<line number="96" hits="1"/>
<line number="98" hits="1"/>
<line number="100" hits="0"/>
<line number="101" hits="0" branch="true" condition-coverage="0% (0/2)" missing-branches="102,103"/>
<line number="100" hits="1"/>
<line number="101" hits="1" branch="true" condition-coverage="50% (1/2)" missing-branches="102"/>
<line number="102" hits="0"/>
<line number="103" hits="0"/>
<line number="107" hits="0" branch="true" condition-coverage="0% (0/2)" missing-branches="exit,108"/>
<line number="108" hits="0"/>
<line number="110" hits="0" branch="true" condition-coverage="0% (0/2)" missing-branches="107,111"/>
<line number="111" hits="0"/>
<line number="112" hits="0"/>
<line number="103" hits="1"/>
<line number="107" hits="1" branch="true" condition-coverage="100% (2/2)"/>
<line number="108" hits="1"/>
<line number="110" hits="1" branch="true" condition-coverage="100% (2/2)"/>
<line number="111" hits="1"/>
<line number="112" hits="1"/>
<line number="114" hits="1"/>
<line number="121" hits="0" branch="true" condition-coverage="0% (0/2)" missing-branches="127,131"/>
<line number="127" hits="0"/>
<line number="128" hits="0"/>
<line number="129" hits="0"/>
<line number="131" hits="0"/>
<line number="132" hits="0"/>
<line number="121" hits="1" branch="true" condition-coverage="100% (2/2)"/>
<line number="127" hits="1"/>
<line number="128" hits="1"/>
<line number="129" hits="1"/>
<line number="131" hits="1"/>
<line number="132" hits="1"/>
<line number="134" hits="1"/>
<line number="136" hits="0"/>
<line number="137" hits="0" branch="true" condition-coverage="0% (0/2)" missing-branches="138,139"/>
<line number="138" hits="0"/>
<line number="139" hits="0"/>
<line number="136" hits="1"/>
<line number="137" hits="1" branch="true" condition-coverage="100% (2/2)"/>
<line number="138" hits="1"/>
<line number="139" hits="1"/>
<line number="141" hits="1"/>
<line number="148" hits="1"/>
<line number="151" hits="1" branch="true" condition-coverage="100% (2/2)"/>
Expand Down Expand Up @@ -204,8 +204,8 @@
<line number="272" hits="1"/>
<line number="273" hits="1"/>
<line number="274" hits="1"/>
<line number="275" hits="1" branch="true" condition-coverage="50% (1/2)" missing-branches="276"/>
<line number="276" hits="0"/>
<line number="275" hits="1" branch="true" condition-coverage="100% (2/2)"/>
<line number="276" hits="1"/>
<line number="279" hits="1" branch="true" condition-coverage="100% (2/2)"/>
<line number="281" hits="1"/>
<line number="286" hits="1" branch="true" condition-coverage="100% (2/2)"/>
Expand All @@ -219,36 +219,36 @@
<line number="301" hits="1"/>
<line number="302" hits="1"/>
<line number="305" hits="1"/>
<line number="308" hits="1" branch="true" condition-coverage="50% (1/2)" missing-branches="315"/>
<line number="308" hits="1" branch="true" condition-coverage="100% (2/2)"/>
<line number="309" hits="1"/>
<line number="310" hits="1" branch="true" condition-coverage="100% (2/2)"/>
<line number="311" hits="1"/>
<line number="312" hits="1"/>
<line number="315" hits="1" branch="true" condition-coverage="50% (1/2)" missing-branches="316"/>
<line number="316" hits="0"/>
<line number="317" hits="0" branch="true" condition-coverage="0% (0/2)" missing-branches="318,322"/>
<line number="318" hits="0"/>
<line number="319" hits="0"/>
<line number="315" hits="1" branch="true" condition-coverage="100% (2/2)"/>
<line number="316" hits="1"/>
<line number="317" hits="1" branch="true" condition-coverage="100% (2/2)"/>
<line number="318" hits="1"/>
<line number="319" hits="1"/>
<line number="322" hits="1" branch="true" condition-coverage="100% (2/2)"/>
<line number="323" hits="1"/>
<line number="325" hits="1"/>
<line number="327" hits="0"/>
<line number="328" hits="0"/>
<line number="330" hits="0" branch="true" condition-coverage="0% (0/2)" missing-branches="332,337"/>
<line number="332" hits="0"/>
<line number="334" hits="0"/>
<line number="337" hits="0"/>
<line number="338" hits="0"/>
<line number="339" hits="0"/>
<line number="327" hits="1"/>
<line number="328" hits="1"/>
<line number="330" hits="1" branch="true" condition-coverage="100% (2/2)"/>
<line number="332" hits="1"/>
<line number="334" hits="1"/>
<line number="337" hits="1"/>
<line number="338" hits="1"/>
<line number="339" hits="1"/>
<line number="341" hits="1"/>
<line number="343" hits="1"/>
<line number="344" hits="1"/>
<line number="346" hits="1" branch="true" condition-coverage="50% (1/2)" missing-branches="353"/>
<line number="346" hits="1" branch="true" condition-coverage="100% (2/2)"/>
<line number="348" hits="1"/>
<line number="350" hits="1"/>
<line number="353" hits="0"/>
<line number="354" hits="0"/>
<line number="355" hits="0"/>
<line number="353" hits="1"/>
<line number="354" hits="1"/>
<line number="355" hits="1"/>
<line number="357" hits="1"/>
<line number="359" hits="1"/>
<line number="362" hits="1" branch="true" condition-coverage="50% (1/2)" missing-branches="363"/>
Expand All @@ -257,20 +257,20 @@
<line number="367" hits="0"/>
<line number="372" hits="1" branch="true" condition-coverage="100% (2/2)"/>
<line number="374" hits="1"/>
<line number="376" hits="1" branch="true" condition-coverage="50% (1/2)" missing-branches="391"/>
<line number="376" hits="1" branch="true" condition-coverage="100% (2/2)"/>
<line number="378" hits="1"/>
<line number="379" hits="1" branch="true" condition-coverage="50% (1/2)" missing-branches="388"/>
<line number="381" hits="1"/>
<line number="383" hits="1"/>
<line number="384" hits="1"/>
<line number="388" hits="0"/>
<line number="391" hits="0"/>
<line number="394" hits="0"/>
<line number="395" hits="0" branch="true" condition-coverage="0% (0/2)" missing-branches="397,404"/>
<line number="397" hits="0"/>
<line number="398" hits="0"/>
<line number="400" hits="0"/>
<line number="401" hits="0"/>
<line number="391" hits="1"/>
<line number="394" hits="1"/>
<line number="395" hits="1" branch="true" condition-coverage="50% (1/2)" missing-branches="404"/>
<line number="397" hits="1"/>
<line number="398" hits="1"/>
<line number="400" hits="1"/>
<line number="401" hits="1"/>
<line number="404" hits="0"/>
<line number="406" hits="1" branch="true" condition-coverage="50% (1/2)" missing-branches="442"/>
<line number="408" hits="1"/>
Expand Down Expand Up @@ -326,7 +326,7 @@
<line number="493" hits="1"/>
<line number="494" hits="1"/>
<line number="496" hits="1"/>
<line number="512" hits="0"/>
<line number="512" hits="1"/>
<line number="514" hits="1"/>
<line number="517" hits="1"/>
<line number="518" hits="1"/>
Expand Down
8 changes: 4 additions & 4 deletions python/setup.py
Original file line number Diff line number Diff line change
Expand Up @@ -100,10 +100,10 @@ def get_long_description():
author="Kent Beck",
author_email="[email protected]",
url="https://github.com/KentBeck/BPlusTree3",
project_urls={
"Homepage": "https://github.com/KentBeck/BPlusTree3",
"Documentation": "https://github.com/KentBeck/BPlusTree3/tree/main/python",
"Repository": "https://github.com/KentBeck/BPlusTree3",
project_urls={
"Homepage": "https://github.com/KentBeck/BPlusTree3",
"Documentation": "https://github.com/KentBeck/BPlusTree3/tree/main/python",
"Repository": "https://github.com/KentBeck/BPlusTree3",
"Issues": "https://github.com/KentBeck/BPlusTree3/issues",
"Changelog": "https://github.com/KentBeck/BPlusTree3/blob/main/python/CHANGELOG.md",
},
Expand Down
1 change: 1 addition & 0 deletions python/tests/test_c_extension.py
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@

try:
import bplustree_c

HAS_C_EXTENSION = True
except ImportError as e:
pytest.skip(f"C extension not available: {e}", allow_module_level=True)
Expand Down
1 change: 1 addition & 0 deletions python/tests/test_c_extension_comprehensive.py
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@

try:
import bplustree_c

HAS_C_EXTENSION = True
except ImportError as e:
pytest.skip(f"C extension not available: {e}", allow_module_level=True)
Expand Down
3 changes: 3 additions & 0 deletions python/tests/test_dictionary_api.py
Original file line number Diff line number Diff line change
Expand Up @@ -12,13 +12,16 @@
try:
# Try to import from installed package first
import bplustree

BPlusTreeMap = bplustree.BPlusTreeMap
except ImportError:
# Fall back to local import if package not installed
import sys
import os

sys.path.insert(0, os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
import bplustree

BPlusTreeMap = bplustree.BPlusTreeMap


Expand Down
6 changes: 4 additions & 2 deletions python/tests/test_docstyle.py
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,9 @@ def test_pydocstyle_conformance():
stderr=subprocess.STDOUT,
text=True,
)

# For now, just warn about violations instead of failing
if result.returncode != 0:
pytest.skip(f"Docstyle violations found (non-failing for now):\n{result.stdout}")
pytest.skip(
f"Docstyle violations found (non-failing for now):\n{result.stdout}"
)
6 changes: 5 additions & 1 deletion python/tests/test_iterator_modification_safety.py
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@

try:
import bplustree_c

HAS_C_EXTENSION = True
except ImportError:
HAS_C_EXTENSION = False
Expand Down Expand Up @@ -308,7 +309,9 @@ def test_modification_counter_wrapping(self):
next(keys_iter)
tree[i + 10000] = "trigger_invalidation"

with pytest.raises(RuntimeError, match="tree changed size during iteration"):
with pytest.raises(
RuntimeError, match="tree changed size during iteration"
):
next(keys_iter)

# Final iteration should work
Expand All @@ -335,4 +338,5 @@ def test_modification_counter_wrapping(self):
except Exception as e:
print(f"❌ Test failed: {e}")
import traceback

traceback.print_exc()
10 changes: 7 additions & 3 deletions python/tests/test_no_segfaults.py
Original file line number Diff line number Diff line change
Expand Up @@ -261,10 +261,14 @@ def test_no_segfaults():
print("🎉 NO SEGFAULTS! C extension is memory-safe.")
else:
print("🚨 CRITICAL: Fix all issues before proceeding!")
assert False, f"CRITICAL: {failed} segfault tests failed - must fix immediately!"

assert (
False
), f"CRITICAL: {failed} segfault tests failed - must fix immediately!"

# Explicitly assert success
assert failed == 0, f"CRITICAL: {failed} segfault tests failed - must fix immediately!"
assert (
failed == 0
), f"CRITICAL: {failed} segfault tests failed - must fix immediately!"


if __name__ == "__main__":
Expand Down
9 changes: 8 additions & 1 deletion python/tests/test_node_split_minimal.py
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@

try:
import bplustree_c

HAS_C_EXTENSION = True
except ImportError as e:
pytest.skip(f"C extension not available: {e}", allow_module_level=True)
Expand Down Expand Up @@ -39,7 +40,13 @@ def test_single_node_split_maintains_order():
print(f"Expected: [0, 1, 2, 3, 4]")

# THE CRITICAL TEST: keys must be sorted
assert keys == [0, 1, 2, 3, 4], f"Keys not in sorted order after single node split. Got: {keys}"
assert keys == [
0,
1,
2,
3,
4,
], f"Keys not in sorted order after single node split. Got: {keys}"
print("✅ PASSED: Keys in correct order after split")


Expand Down
Loading
Loading