Skip to content

Commit 9599487

Browse files
committed
Add autoscaling test
1 parent 04470d2 commit 9599487

File tree

3 files changed

+40
-17
lines changed

3 files changed

+40
-17
lines changed

.github/workflows/ci.yml

+1-4
Original file line numberDiff line numberDiff line change
@@ -23,10 +23,7 @@ jobs:
2323
python-version: ${{ matrix.python }}
2424

2525
- name: Install dependencies
26-
run: pip install .
27-
28-
- name: Install Mypy
29-
run: pip install mypy
26+
run: pip install -e '.[test]'
3027

3128
- name: Static analysis
3229
run: mypy ./src

pyproject.toml

+6-2
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ requires = ["setuptools >= 61.0"]
33
build-backend = "setuptools.build_meta"
44

55
[project]
6-
name = "PyBloomer"
6+
name = "OkBloomer"
77
version = "0.0.1"
88
requires-python = ">= 3.10"
99
dependencies = [
@@ -12,10 +12,14 @@ dependencies = [
1212
authors = [
1313
{name = "Andrew DalPino", email = "support@andrewdalpino.com"},
1414
]
15-
description = "PyBloomer is an implementation of the OkBloomer algorithm, an autoscaling Bloom filter with ultra-low memory footprint for Python."
15+
description = "PyBloomer is an Python implementation of the OkBloomer algorithm, an autoscaling Bloom filter with ultra-low memory footprint."
1616
readme = "README.md"
1717
license = {text = "MIT"}
1818

19+
[project.optional-dependencies]
20+
dev = ["mypy"]
21+
test = ["mypy"]
22+
1923
[project.urls]
2024
Homepage = "https://github.com/andrewdalpino/PyBloomer"
2125
Documentation = "https://github.com/andrewdalpino/PyBloomer/README.md"

tests/test_bloom_filter.py

+33-11
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,12 @@
11
import unittest
2+
import random
3+
import string
24

35
import pybloomer
46

57
class TestBloomFilter(unittest.TestCase):
68
def test_basic(self):
7-
filter = pybloomer.BloomFilter(
8-
max_false_positive_rate=0.01,
9-
num_hashes=4,
10-
layer_size=32000000,
11-
)
9+
filter = pybloomer.BloomFilter()
1210

1311
self.assertEqual(filter.false_positive_rate, 0)
1412

@@ -26,12 +24,10 @@ def test_basic(self):
2624
self.assertTrue(filter.exists('bar'))
2725
self.assertGreater(filter.false_positive_rate, 0)
2826

27+
self.assertFalse(filter.exists('baz'))
28+
2929
def test_exists_or_insert(self):
30-
filter = pybloomer.BloomFilter(
31-
max_false_positive_rate=0.01,
32-
num_hashes=4,
33-
layer_size=32000000,
34-
)
30+
filter = pybloomer.BloomFilter()
3531

3632
self.assertFalse(filter.exists_or_insert('foo'))
3733

@@ -43,4 +39,30 @@ def test_exists_or_insert(self):
4339

4440
self.assertFalse(filter.exists_or_insert('baz'))
4541

46-
self.assertTrue(filter.exists_or_insert('baz'))
42+
self.assertTrue(filter.exists_or_insert('baz'))
43+
44+
def test_autoscaling(self):
45+
random.seed(0)
46+
47+
filter = pybloomer.BloomFilter(
48+
max_false_positive_rate=0.01,
49+
num_hashes=4,
50+
layer_size=320000,
51+
)
52+
53+
self.assertEqual(filter.num_layers, 1)
54+
55+
filter.insert('foo')
56+
57+
for i in range(0, 100000):
58+
filter.insert(''.join(random.choice(string.ascii_letters) for j in range(20)))
59+
60+
filter.insert('bar')
61+
62+
self.assertEqual(filter.num_layers, 3)
63+
self.assertLessEqual(filter.false_positive_rate, 0.01)
64+
self.assertLessEqual(filter.utilization, 1.0)
65+
66+
self.assertTrue(filter.exists('foo'))
67+
self.assertTrue(filter.exists('bar'))
68+
self.assertFalse(filter.exists('father'))

0 commit comments

Comments
 (0)