Skip to content

Commit d287453

Browse files
committed
refactor(storage): consolidate AsyncWorkspace into Workspace
BREAKING CHANGE: Removed AsyncWorkspace in favor of unified Workspace that provides async functionality directly. - Replace all AsyncWorkspace references with Workspace across the codebase - Update examples to use Workspace instead of AsyncWorkspace - Modify client builder, engine, and workspace modules accordingly - Update pipeline executor and persist stage to use new Workspace type - Export Workspace instead of AsyncWorkspace in public API This change simplifies the storage API by removing the distinction between sync and async workspace implementations, as Workspace now provides async capabilities natively.
1 parent 1d662cb commit d287453

13 files changed

Lines changed: 349 additions & 989 deletions

File tree

.github/workflows/ci.yml

Lines changed: 16 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -59,15 +59,29 @@ jobs:
5959
- uses: actions/checkout@v4
6060
- uses: dtolnay/rust-toolchain@stable
6161
- uses: Swatinem/rust-cache@v2
62-
- run: cargo doc --no-deps --all-features
62+
- name: Check documentation build
63+
run: cargo doc --no-deps --all-features
6364
env:
6465
RUSTDOCFLAGS: -D warnings
6566

67+
doctest:
68+
name: Doc Tests
69+
runs-on: ubuntu-latest
70+
steps:
71+
- uses: actions/checkout@v4
72+
- uses: dtolnay/rust-toolchain@stable
73+
- uses: Swatinem/rust-cache@v2
74+
- name: Run documentation tests
75+
run: cargo test --doc --all-features
76+
continue-on-error: true # Allow doctest failures initially
77+
env:
78+
OPENAI_API_KEY: ${{ secrets.OPENAI_API_KEY }}
79+
6680
# Release build check
6781
build:
6882
name: Build
6983
runs-on: ubuntu-latest
70-
needs: [check, fmt, clippy, test]
84+
needs: [check, fmt, clippy, test, docs]
7185
steps:
7286
- uses: actions/checkout@v4
7387
- uses: dtolnay/rust-toolchain@stable

examples/storage_async.rs

Lines changed: 0 additions & 100 deletions
This file was deleted.

examples/storage_backend.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ use std::sync::{Arc, RwLock};
1717

1818
use vectorless::Result;
1919
use vectorless::document::DocumentTree;
20-
use vectorless::storage::{AsyncWorkspace, DocumentMeta, PersistedDocument, StorageBackend};
20+
use vectorless::storage::{Workspace, DocumentMeta, PersistedDocument, StorageBackend};
2121

2222
/// A simple in-memory backend with logging.
2323
///
@@ -107,7 +107,7 @@ async fn main() -> vectorless::Result<()> {
107107

108108
// 2. Create workspace with custom backend
109109
println!("2. Creating workspace with custom backend...");
110-
let workspace = AsyncWorkspace::with_backend(backend).await?;
110+
let workspace = Workspace::with_backend(backend).await?;
111111
println!(" ✓ Workspace created\n");
112112

113113
// 3. Add a document (watch the logging)

examples/storage_workspace.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@
1616
//! ```
1717
1818
use vectorless::document::DocumentTree;
19-
use vectorless::storage::{AsyncWorkspace, DocumentMeta, PersistedDocument};
19+
use vectorless::storage::{Workspace, DocumentMeta, PersistedDocument};
2020

2121
#[tokio::main]
2222
async fn main() -> vectorless::Result<()> {
@@ -27,7 +27,7 @@ async fn main() -> vectorless::Result<()> {
2727

2828
// 1. Create a workspace with custom cache size
2929
println!("1. Creating workspace at '{}'...", workspace_path);
30-
let workspace = AsyncWorkspace::with_cache_size(workspace_path, 100)
30+
let workspace = Workspace::with_cache_size(workspace_path, 100)
3131
.await
3232
.map_err(|e| vectorless::Error::Workspace(e.to_string()))?;
3333
println!(" ✓ Workspace created\n");

src/client/builder.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@ use std::path::PathBuf;
3737

3838
use crate::config::{Config, ConfigLoader, RetrievalConfig};
3939
use crate::retrieval::PipelineRetriever;
40-
use crate::storage::AsyncWorkspace;
40+
use crate::storage::Workspace;
4141

4242
use super::engine::Engine;
4343
use super::events::EventEmitter;
@@ -424,7 +424,7 @@ impl EngineBuilder {
424424
.as_ref()
425425
.unwrap_or(&config.storage.workspace_dir);
426426

427-
let workspace = AsyncWorkspace::new(workspace_path)
427+
let workspace = Workspace::new(workspace_path)
428428
.await
429429
.map_err(|e| BuildError::Workspace(e.to_string()))?;
430430

src/client/engine.rs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,7 @@ use crate::config::Config;
5454
use crate::error::Result;
5555
use crate::index::PipelineExecutor;
5656
use crate::retrieval::{PipelineRetriever, RetrieveOptions};
57-
use crate::storage::AsyncWorkspace;
57+
use crate::storage::Workspace;
5858
use crate::{DocumentTree, Error};
5959

6060
use super::context::ClientContext;
@@ -108,7 +108,7 @@ impl Engine {
108108
/// Note: Prefer using [`Engine::builder()`] for more control.
109109
async fn new() -> Result<Self> {
110110
let config = Config::default();
111-
let workspace = AsyncWorkspace::new("./workspace")
111+
let workspace = Workspace::new("./workspace")
112112
.await
113113
.map_err(|e| Error::Workspace(e.to_string()))?;
114114
Self::with_components(
@@ -127,7 +127,7 @@ impl Engine {
127127
/// Create a new client with the given components.
128128
pub(crate) async fn with_components(
129129
config: Config,
130-
workspace: AsyncWorkspace,
130+
workspace: Workspace,
131131
retriever: PipelineRetriever,
132132
executor: PipelineExecutor,
133133
) -> Result<Self> {
@@ -299,7 +299,7 @@ impl Engine {
299299
Some(ws) => ws.clone(),
300300
None => {
301301
// Create a temporary workspace if none configured
302-
let async_ws = AsyncWorkspace::new("./temp_workspace")
302+
let async_ws = Workspace::new("./temp_workspace")
303303
.await
304304
.expect("Failed to create temp workspace");
305305
WorkspaceClient::new(async_ws).await

src/client/workspace.rs

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ use std::sync::Arc;
2828
use tracing::{debug, info, warn};
2929

3030
use crate::error::Result;
31-
use crate::storage::{AsyncWorkspace, PersistedDocument};
31+
use crate::storage::{Workspace, PersistedDocument};
3232

3333
use super::events::{EventEmitter, WorkspaceEvent};
3434
use super::types::DocumentInfo;
@@ -45,7 +45,7 @@ use super::types::DocumentInfo;
4545
#[derive(Clone)]
4646
pub struct WorkspaceClient {
4747
/// Workspace storage.
48-
workspace: Arc<AsyncWorkspace>,
48+
workspace: Arc<Workspace>,
4949

5050
/// Event emitter.
5151
events: EventEmitter,
@@ -75,7 +75,7 @@ impl Default for WorkspaceClientConfig {
7575

7676
impl WorkspaceClient {
7777
/// Create a new workspace client.
78-
pub async fn new(workspace: AsyncWorkspace) -> Self {
78+
pub async fn new(workspace: Workspace) -> Self {
7979
Self {
8080
workspace: Arc::new(workspace),
8181
events: EventEmitter::new(),
@@ -96,7 +96,7 @@ impl WorkspaceClient {
9696
}
9797

9898
/// Create from an existing workspace Arc.
99-
pub(crate) fn from_arc(workspace: Arc<AsyncWorkspace>, events: EventEmitter) -> Self {
99+
pub(crate) fn from_arc(workspace: Arc<Workspace>, events: EventEmitter) -> Self {
100100
Self {
101101
workspace,
102102
events,
@@ -285,7 +285,7 @@ impl WorkspaceClient {
285285
}
286286

287287
/// Get the underlying workspace Arc (for advanced use).
288-
pub(crate) fn inner(&self) -> Arc<AsyncWorkspace> {
288+
pub(crate) fn inner(&self) -> Arc<Workspace> {
289289
Arc::clone(&self.workspace)
290290
}
291291
}
@@ -306,15 +306,15 @@ mod tests {
306306
#[tokio::test]
307307
async fn test_workspace_client_creation() {
308308
let backend = StdArc::new(MemoryBackend::new());
309-
let workspace = AsyncWorkspace::with_backend(backend).await.unwrap();
309+
let workspace = Workspace::with_backend(backend).await.unwrap();
310310
let client = WorkspaceClient::new(workspace).await;
311311
assert!(client.is_empty().await);
312312
}
313313

314314
#[tokio::test]
315315
async fn test_workspace_stats() {
316316
let backend = StdArc::new(MemoryBackend::new());
317-
let workspace = AsyncWorkspace::with_backend(backend).await.unwrap();
317+
let workspace = Workspace::with_backend(backend).await.unwrap();
318318
let client = WorkspaceClient::new(workspace).await;
319319

320320
let stats = client.stats().await.unwrap();

src/index/pipeline/executor.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -136,7 +136,7 @@ impl PipelineExecutor {
136136
}
137137

138138
/// Add persistence stage with async workspace.
139-
pub fn with_persistence(mut self, workspace: crate::storage::AsyncWorkspace) -> Self {
139+
pub fn with_persistence(mut self, workspace: crate::storage::Workspace) -> Self {
140140
self.orchestrator = self
141141
.orchestrator
142142
.stage_with_priority(PersistStage::with_workspace(workspace), 80);

src/index/stages/persist.rs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8,15 +8,15 @@ use std::time::Instant;
88
use tracing::info;
99

1010
use crate::error::Result;
11-
use crate::storage::{AsyncWorkspace, DocumentMeta as StorageMeta, PersistedDocument};
11+
use crate::storage::{Workspace, DocumentMeta as StorageMeta, PersistedDocument};
1212

1313
use super::{IndexStage, StageResult};
1414
use crate::index::pipeline::IndexContext;
1515

1616
/// Persist stage - saves indexed document to storage.
1717
pub struct PersistStage {
1818
/// Optional workspace for persistence.
19-
workspace: Option<AsyncWorkspace>,
19+
workspace: Option<Workspace>,
2020
}
2121

2222
impl PersistStage {
@@ -26,7 +26,7 @@ impl PersistStage {
2626
}
2727

2828
/// Create with workspace.
29-
pub fn with_workspace(workspace: AsyncWorkspace) -> Self {
29+
pub fn with_workspace(workspace: Workspace) -> Self {
3030
Self {
3131
workspace: Some(workspace),
3232
}

src/lib.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -167,7 +167,7 @@ pub use retrieval::{
167167
};
168168

169169
// Storage
170-
pub use storage::{AsyncWorkspace, DocumentMeta as StorageDocumentMeta, PersistedDocument};
170+
pub use storage::{Workspace, DocumentMeta as StorageDocumentMeta, PersistedDocument};
171171

172172
// Throttle
173173
pub use throttle::{ConcurrencyConfig, ConcurrencyController, RateLimiter};

0 commit comments

Comments
 (0)