blob: 44a294f605121b934b204638922f4e222f9af081 [file] [view]
# AGENTS.md
This file provides guidance to AI coding agents (e.g., Claude Code, ChatGPT) when working with code in this repository.
While working on OpenDAL, please remember:
- Always use English in code and comments.
- Only add meaningful comments when the code's behavior is difficult to understand.
- Only add meaningful tests when they actually verify internal behaviors; otherwise, don't create them unless requested.
## Build and Development Commands
### Core Rust Development
- All cargo commands must be executed within the `core` directory.
- All changes to `core` must pass the clippy check and behavior tests.
- Don't change public API or behavior tests unless requested.
```bash
# Check code
cargo check
# Build
cargo build
# Run linter for all services.
cargo clippy --all-targets --all-features -- -D warnings
# Run linter for specific services.
cargo clippy --all-targets --features=services-s3 -- -D warnings
# Run tests (requires test features)
cargo test --features tests
# Run behavior tests
OPENDAL_TEST=s3 cargo test --features services-s3,tests behavior
# Run specific test
cargo test tests::it::services::fs
# Format code
cargo fmt
# Check formatting
cargo fmt --check
# Build documentation
cargo doc --lib --no-deps --all-features
# Run benchmarks
cargo bench
```
### Multi-package Operations
```bash
# Run command across all packages
./scripts/workspace.py cargo check
./scripts/workspace.py cargo fmt -- --check
```
### Code Generation and Release
```bash
# Generate bindings code
just generate python
just generate java
# Update version across project
just update-version
# Release process
just release
```
### Testing Setup
```bash
# Copy environment template for tests
cp .env.example .env
# Edit .env with your service credentials
```
## Architecture Overview
OpenDAL is a unified data access layer with a modular architecture:
### Core Structure
- **core/**: Main Rust library implementing the storage abstraction
- `src/services/`: 50+ storage service implementations (S3, Azure, GCS, etc.)
- `src/layers/`: Middleware for cross-cutting concerns (retry, metrics, tracing)
- `src/raw/`: Low-level traits and types for implementing backends
- `src/types/`: Core types and traits
### Service Implementation Pattern
Each service follows a consistent structure:
- `backend.rs`: Main service implementation with `Accessor` trait
- `config.rs`: Configuration and builder pattern
- `core.rs`: Core logic and HTTP client setup
- `writer.rs`, `reader.rs`, `lister.rs`: Operation implementations
- `error.rs`: Service-specific error handling
### Language Bindings
- **bindings/**: Language-specific bindings (Python, Java, Go, Node.js, etc.)
- Each binding has its own build system and contributing guide
- Generated code uses the `dev` crate for consistency
### Applications
- oli: moved to a separate repository (see docs: https://opendal.apache.org/docs/40-apps/oli)
- ofs: moved to a separate repository (see docs: https://opendal.apache.org/docs/40-apps/ofs)
- oay: removed from this repository
### Integrations
- **integrations/**: Ecosystem integrations (FUSE, WebDAV, object_store)
## Key Development Patterns
### Feature Flags
Services are feature-gated to reduce binary size:
```rust
// Enable specific services
[features]
services-s3 = []
services-azblob = []
```
### Layer System
Layers provide composable middleware:
```rust
op.layer(RetryLayer::new())
.layer(MetricsLayer::new())
.layer(LoggingLayer::new())
```
### Async-First Design
All core operations are async with blocking wrappers available:
```rust
// Async API
let data = op.read("path").await?;
// Blocking API
let data = op.blocking().read("path")?;
```
## Commit Message Format
Use conventional commits:
```
feat(services/gcs): Add start-after support for list
fix(services/s3): Ignore prefix if it's empty
docs: Add troubleshooting guide
ci: Update GitHub Actions workflow
refactor(core): Simplify error handling
```
## Pull Request Requirements
- Always follow OpenDAL's pull request template when creating a PR.
## Testing Approach
- Unit tests in `src/tests/`
- Behavior tests validate service implementations
- Integration tests require service credentials in `.env`
- CI runs tests across multiple platforms and Rust versions
## Common Tasks
### Adding a New Service
1. Create new module in `core/src/services/`
2. Implement `Accessor` trait
3. Add service feature flag in `Cargo.toml`
4. Add service tests in behavior test suite
5. Update documentation
### Debugging Service Issues
1. Enable debug logging: `RUST_LOG=debug`
2. Use tracing layer for detailed operation tracking
3. Check service-specific error types
4. Verify credentials and endpoint configuration
## Important Notes
- Minimum Rust version: 1.85 (MSRV)
- All services implement the same `Accessor` trait
- Use `just` for common development tasks
- Check CI workflows for platform-specific requirements
- Services are tested against real backends (credentials required)