Skip to content

Commit 57b1dd3

Browse files
chore: bump version to 0.1.1
1 parent 2598208 commit 57b1dd3

File tree

15 files changed

+147
-113
lines changed

15 files changed

+147
-113
lines changed

CHANGELOG.md

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,16 @@
11
# CrossVector - Changelog
22

3+
## [0.1.1] - 2025-11-23
4+
5+
- Bumped package version to **0.1.1**.
6+
- Added beta warning and production‑risk notice in README.
7+
- Switched timestamps to float Unix timestamps (`created_timestamp`, `updated_timestamp`).
8+
- Introduced `VECTOR_STORE_TEXT` configuration option.
9+
- Fixed integration tests for AstraDB, ChromaDB, Milvus, and PGVector (table name handling, dimension parameter, score field).
10+
- Updated documentation (README, quickstart, schema, configuration) to reflect new features and usage.
11+
- Adjusted `.markdownlint.yaml` to disable MD060 table‑column‑style warnings.
12+
- Cleaned up imports and resolved lint errors (ruff E402).
13+
314
## Recent Updates (2025-11-23)
415

516
### GitHub Organization Update

README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -230,7 +230,7 @@ from crossvector.dbs.pgvector import PGVectorAdapter
230230

231231
adapter = PGVectorAdapter()
232232
adapter.initialize(
233-
table_name="my_vectors",
233+
collection_name="my_vectors",
234234
embedding_dimension=1536,
235235
metric="cosine",
236236
store_text=True # Optional

scripts/tests/test_chroma_cloud.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@
2424

2525
# Initialize or get collection
2626
try:
27+
adapter.drop_collection("test_vectors")
2728
adapter.initialize(collection_name="test_vectors", embedding_dimension=embedder.embedding_dimension)
2829
print("Created collection 'test_vectors'.")
2930
except Exception as e:

scripts/tests/test_integration.py

Lines changed: 23 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,8 @@
33
This script tests the unified VectorEngine interface across different databases.
44
"""
55

6+
import time
7+
68
from dotenv import load_dotenv
79

810
from crossvector import Document, SearchRequest, UpsertRequest, VectorEngine
@@ -36,57 +38,46 @@
3638
]
3739

3840

39-
def test_engine(db_name: str, db_adapter, embedding_adapter, collection_name: str, is_pgvector: bool = False):
41+
def test_engine(db_name: str, db_adapter, embedding_adapter, collection_name: str):
4042
"""Test VectorEngine with a specific database adapter."""
4143
print(f"\n{'=' * 80}")
4244
print(f"Testing {db_name} with {embedding_adapter.model_name}")
4345
print(f"{'=' * 80}")
4446

45-
# Initialize engine (PGVector uses table_name instead of collection_name)
46-
if is_pgvector:
47-
engine = VectorEngine(embedding_adapter=embedding_adapter, db_adapter=db_adapter, table_name=collection_name)
48-
else:
49-
engine = VectorEngine(
50-
embedding_adapter=embedding_adapter, db_adapter=db_adapter, collection_name=collection_name
51-
)
47+
engine = VectorEngine(embedding_adapter=embedding_adapter, db_adapter=db_adapter, collection_name=collection_name)
5248

5349
# Clean up existing data (if collection exists, drop it)
5450
try:
55-
if hasattr(db_adapter, "db") and collection_name in db_adapter.db.list_collection_names():
56-
db_adapter.db.drop_collection(collection_name)
57-
print(f"Dropped existing collection '{collection_name}'")
51+
engine.drop_collection(collection_name)
52+
time.sleep(1)
53+
print(f"Dropped existing collection '{collection_name}'")
5854
except Exception as e:
5955
print(f"Note: Could not drop collection (may not exist): {e}")
6056

6157
# Re-initialize after dropping
62-
if is_pgvector:
63-
engine = VectorEngine(embedding_adapter=embedding_adapter, db_adapter=db_adapter, table_name=collection_name)
64-
else:
65-
engine = VectorEngine(
66-
embedding_adapter=embedding_adapter, db_adapter=db_adapter, collection_name=collection_name
67-
)
58+
engine = VectorEngine(embedding_adapter=embedding_adapter, db_adapter=db_adapter, collection_name=collection_name)
6859

6960
# Test 1: Upsert documents
7061
print("\n1. Testing upsert...")
7162
result = engine.upsert(UpsertRequest(documents=test_docs))
72-
print(f"Inserted {result['count']} documents")
63+
print(f"Inserted {result['count']} documents")
7364

7465
# Test 2: Count documents
7566
print("\n2. Testing count...")
7667
count = engine.count()
77-
print(f"Total documents: {count}")
68+
print(f"Total documents: {count}")
7869
assert count == len(test_docs), f"Expected {len(test_docs)} documents, got {count}"
7970

8071
# Test 3: Get document by ID
8172
print("\n3. Testing get...")
8273
doc = engine.get("doc1")
83-
print(f"Retrieved document: {doc.get('text', 'N/A')[:50]}...")
74+
print(f"Retrieved document: {doc.get('text', 'N/A')[:50]}...")
8475
assert doc is not None, "Document not found"
8576

8677
# Test 4: Search
8778
print("\n4. Testing search...")
8879
results = engine.search(SearchRequest(query="AI and machine learning", limit=2))
89-
print(f"Found {len(results)} results")
80+
print(f"Found {len(results)} results")
9081
for i, result in enumerate(results, 1):
9182
score = result.get("score", "N/A")
9283
text = result.get("text", "N/A")
@@ -100,26 +91,26 @@ def test_engine(db_name: str, db_adapter, embedding_adapter, collection_name: st
10091
# Test 5: Delete one
10192
print("\n5. Testing delete_one...")
10293
deleted = engine.delete_one("doc1")
103-
print(f"Deleted {deleted} document(s)")
94+
print(f"Deleted {deleted} document(s)")
10495

10596
# Verify deletion
10697
count_after_delete = engine.count()
107-
print(f"Documents after deletion: {count_after_delete}")
98+
print(f"Documents after deletion: {count_after_delete}")
10899
assert count_after_delete == len(test_docs) - 1, (
109100
f"Expected {len(test_docs) - 1} documents, got {count_after_delete}"
110101
)
111102

112103
# Test 6: Delete many
113104
print("\n6. Testing delete_many...")
114105
deleted = engine.delete_many(["doc2", "doc3"])
115-
print(f"Deleted {deleted} document(s)")
106+
print(f"Deleted {deleted} document(s)")
116107

117108
# Verify all deleted
118109
final_count = engine.count()
119-
print(f"Final document count: {final_count}")
110+
print(f"Final document count: {final_count}")
120111
assert final_count == 0, f"Expected 0 documents, got {final_count}"
121112

122-
print(f"\n✅ All tests passed for {db_name}!")
113+
print(f"\nAll tests passed for {db_name}!")
123114

124115

125116
def main():
@@ -134,25 +125,25 @@ def main():
134125
try:
135126
test_engine("AstraDB", AstraDBAdapter(), openai_embedder, "test_crossvector_integration")
136127
except Exception as e:
137-
print(f"\n❌ AstraDB test failed: {e}")
128+
print(f"\nAstraDB test failed: {e}")
138129

139130
# Test ChromaDB
140131
try:
141132
test_engine("ChromaDB Cloud", ChromaDBAdapter(), openai_embedder, "test_crossvector_integration")
142133
except Exception as e:
143-
print(f"\n❌ ChromaDB test failed: {e}")
134+
print(f"\nChromaDB test failed: {e}")
144135

145136
# Test Milvus
146137
try:
147138
test_engine("Milvus", MilvusDBAdapter(), openai_embedder, "test_crossvector_integration")
148139
except Exception as e:
149-
print(f"\n❌ Milvus test failed: {e}")
140+
print(f"\nMilvus test failed: {e}")
150141

151142
# Test PGVector (if available)
152143
try:
153-
test_engine("PGVector", PGVectorAdapter(), openai_embedder, "test_crossvector_integration", is_pgvector=True)
144+
test_engine("PGVector", PGVectorAdapter(), openai_embedder, "test_crossvector_integration")
154145
except Exception as e:
155-
print(f"\n❌ PGVector test failed: {e}")
146+
print(f"\nPGVector test failed: {e}")
156147

157148
# Test with Gemini embeddings (optional)
158149
try:
@@ -163,7 +154,7 @@ def main():
163154

164155
test_engine("AstraDB with Gemini", AstraDBAdapter(), gemini_embedder, "test_crossvector_gemini")
165156
except Exception as e:
166-
print(f"\n❌ Gemini embedding test failed: {e}")
157+
print(f"\nGemini embedding test failed: {e}")
167158

168159
print("\n" + "=" * 80)
169160
print("Integration tests completed!")

scripts/tests/test_milvus.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@
2121
# 2. Insert into Milvus
2222
milvus = MilvusDBAdapter()
2323
milvus.initialize(collection_name="test_vectors", embedding_dimension=embedder.embedding_dimension)
24+
milvus.drop_collection("test_vectors")
2425

2526
docs = [
2627
{"_id": str(i), "vector": emb, "text": text, "metadata": {"source": "test"}}

scripts/tests/test_pgvector.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@
2323
# 2. Initialize PGVector
2424
pgvector = PGVectorAdapter()
2525
pgvector.drop_collection("test_vectors")
26-
pgvector.initialize(table_name="test_vectors", embedding_dimension=embedder.embedding_dimension)
26+
pgvector.initialize(collection_name="test_vectors", embedding_dimension=embedder.embedding_dimension)
2727

2828
# 3. Insert docs
2929
docs = [

src/crossvector/__init__.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
from .engine import VectorEngine
88
from .schema import Document, SearchRequest, UpsertRequest, VectorRequest
99

10-
__version__ = "0.1.0"
10+
__version__ = "0.1.1"
1111

1212
__all__ = [
1313
"VectorEngine",

src/crossvector/abc.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,7 @@ class VectorDBAdapter(ABC):
3838
"""
3939

4040
@abstractmethod
41-
def initialize(self, collection_name: str, embedding_dimension: int, metric: str = "cosine"):
41+
def initialize(self, collection_name: str, embedding_dimension: int, metric: str = "cosine", **kwargs):
4242
"""
4343
Initializes the database and ensures the collection is ready.
4444

src/crossvector/dbs/astradb.py

Lines changed: 14 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@
1313

1414
from crossvector.abc import VectorDBAdapter
1515
from crossvector.constants import VECTOR_METRIC_MAP, VectorMetric
16-
from crossvector.settings import settings
16+
from crossvector.settings import settings as api_settings
1717

1818
log = logging.getLogger(__name__)
1919

@@ -35,9 +35,9 @@ def client(self) -> DataAPIClient:
3535
Lazily initializes and returns the AstraDB DataAPIClient.
3636
"""
3737
if self._client is None:
38-
if not settings.ASTRA_DB_APPLICATION_TOKEN:
38+
if not api_settings.ASTRA_DB_APPLICATION_TOKEN:
3939
raise ValueError("ASTRA_DB_APPLICATION_TOKEN is not set. Please configure it in your .env file.")
40-
self._client = DataAPIClient(token=settings.ASTRA_DB_APPLICATION_TOKEN)
40+
self._client = DataAPIClient(token=api_settings.ASTRA_DB_APPLICATION_TOKEN)
4141
return self._client
4242

4343
@property
@@ -46,16 +46,18 @@ def db(self) -> Database:
4646
Lazily initializes and returns the AstraDB database instance.
4747
"""
4848
if self._db is None:
49-
if not settings.ASTRA_DB_API_ENDPOINT:
49+
if not api_settings.ASTRA_DB_API_ENDPOINT:
5050
raise ValueError("ASTRA_DB_API_ENDPOINT is not set. Please configure it in your .env file.")
51-
self._db = self.client.get_database(api_endpoint=settings.ASTRA_DB_API_ENDPOINT)
51+
self._db = self.client.get_database(api_endpoint=api_settings.ASTRA_DB_API_ENDPOINT)
5252
return self._db
5353

54-
def initialize(self, collection_name: str, embedding_dimension: int, metric: str = None, store_text: bool = True):
54+
def initialize(
55+
self, collection_name: str, embedding_dimension: int, metric: str = None, store_text: bool = None, **kwargs
56+
):
5557
"""
5658
Creates or retrieves an AstraDB collection with the proper vector configuration.
5759
"""
58-
self.store_text = store_text
60+
self.store_text = store_text or api_settings.VECTOR_STORE_TEXT
5961
if metric is None:
6062
metric = os.getenv("VECTOR_METRIC", VectorMetric.COSINE)
6163
self.get_collection(collection_name, embedding_dimension, metric)
@@ -99,6 +101,11 @@ def get_collection(
99101
log.error(f"Failed to initialize AstraDB collection: {e}", exc_info=True)
100102
raise
101103

104+
def drop_collection(self, collection_name: str) -> bool:
105+
self.db.drop_collection(collection_name)
106+
log.info(f"AstraDB collection '{collection_name}' dropped.")
107+
return True
108+
102109
def upsert(self, documents: List[Dict[str, Any]]):
103110
"""
104111
Inserts or updates multiple documents in the AstraDB collection.

src/crossvector/dbs/chroma.py

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
from chromadb.config import Settings
1212

1313
from crossvector.constants import VECTOR_METRIC_MAP, VectorMetric
14+
from crossvector.settings import settings as api_settings
1415

1516
log = logging.getLogger(__name__)
1617

@@ -92,13 +93,14 @@ def collection(self) -> chromadb.Collection:
9293
raise ValueError("Collection name and embedding dimension must be set. Call initialize().")
9394
return self.get_collection(self.collection_name, self.embedding_dimension)
9495

95-
def initialize(self, collection_name: str, embedding_dimension: int, metric: str = None, store_text: bool = True):
96+
def initialize(
97+
self, collection_name: str, embedding_dimension: int, metric: str = None, store_text: bool = None, **kwargs
98+
):
9699
"""
97100
Creates or retrieves a ChromaDB collection.
98101
"""
99-
import os
100102

101-
self.store_text = store_text
103+
self.store_text = store_text or api_settings.VECTOR_STORE_TEXT
102104
if metric is None:
103105
metric = os.getenv("VECTOR_METRIC", VectorMetric.COSINE)
104106
self.get_collection(collection_name, embedding_dimension, metric)
@@ -129,6 +131,11 @@ def get_collection(self, collection_name: str, embedding_dimension: int, metric:
129131
log.info(f"ChromaDB collection '{collection_name}' created.")
130132
return self._collection
131133

134+
def drop_collection(self, collection_name: str) -> bool:
135+
self.client.delete_collection(collection_name)
136+
log.info(f"ChromaDB collection '{collection_name}' dropped.")
137+
return True
138+
132139
def upsert(self, documents: List[Dict[str, Any]]):
133140
"""
134141
Inserts a batch of documents into the ChromaDB collection.

0 commit comments

Comments
 (0)