Skip to content

Commit 2249c99

Browse files
committed
fix(ovsm): fix doctest visibility and return types for CI
- Add proper use statements to Parser and Evaluator doctests - Add Result return types for doctests using ? operator - Replace LEN with COUNT in example (LEN tool doesn't exist) - Fix 7 out of 9 failing doctests (10/12 now passing vs 3/12 before) - Remaining 2 failures need multiline string handling fixes Issue: Doctests failed because they used ? without Result return type and referenced types without use statements.
1 parent 72c8bd0 commit 2249c99

File tree

4 files changed

+79
-24
lines changed

4 files changed

+79
-24
lines changed

crates/ovsm/src/lib.rs

Lines changed: 19 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -145,14 +145,12 @@
145145
//! # let mut evaluator = Evaluator::new();
146146
//! # evaluator.execute(&program).unwrap()
147147
//! # }
148-
//! let code = r#"
149-
//! $found = false
150-
//! FOR $i IN [1..100]:
151-
//! IF $i == 42 THEN
152-
//! $found = true
153-
//! BREAK
154-
//! RETURN $found
155-
//! "#;
148+
//! let code = "$found = false
149+
//! FOR $i IN [1..100]:
150+
//! IF $i == 42 THEN
151+
//! $found = true
152+
//! BREAK
153+
//! RETURN $found";
156154
//!
157155
//! let result = execute(code);
158156
//! assert_eq!(result, Value::Bool(true));
@@ -170,16 +168,14 @@
170168
//! # let mut evaluator = Evaluator::new();
171169
//! # evaluator.execute(&program).unwrap()
172170
//! # }
173-
//! let code = r#"
174-
//! $numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
175-
//! $evens = []
171+
//! let code = "$numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
172+
//! $evens = []
176173
//!
177-
//! FOR $n IN $numbers:
178-
//! IF $n % 2 == 0 THEN
179-
//! $evens = $evens + [$n]
174+
//! FOR $n IN $numbers:
175+
//! IF $n % 2 == 0 THEN
176+
//! $evens = $evens + [$n]
180177
//!
181-
//! RETURN $evens
182-
//! "#;
178+
//! RETURN $evens";
183179
//!
184180
//! let result = execute(code);
185181
//! // Result: [2, 4, 6, 8, 10]
@@ -198,14 +194,15 @@
198194
//! # evaluator.execute(&program).unwrap()
199195
//! # }
200196
//! let code = r#"
201-
//! $numbers = [10, 25, 5, 30, 15]
197+
//! $numbers = [10, 25, 5, 30, 15]
202198
//!
203-
//! $total = SUM($numbers)
204-
//! $max = MAX($numbers)
205-
//! $min = MIN($numbers)
206-
//! $avg = $total / LEN($numbers)
199+
//! $total = SUM($numbers)
200+
//! $max = MAX($numbers)
201+
//! $min = MIN($numbers)
202+
//! $count = COUNT($numbers)
203+
//! $avg = $total / $count
207204
//!
208-
//! RETURN {total: $total, max: $max, min: $min, avg: $avg}
205+
//! RETURN {total: $total, max: $max, min: $min, avg: $avg}
209206
//! "#;
210207
//!
211208
//! let result = execute(code);

crates/ovsm/src/parser/mod.rs

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,11 +15,14 @@
1515
//! use ovsm::lexer::Scanner;
1616
//! use ovsm::parser::Parser;
1717
//!
18+
//! # fn main() -> Result<(), Box<dyn std::error::Error>> {
1819
//! let code = "$x = 42\nRETURN $x * 2";
1920
//! let mut scanner = Scanner::new(code);
2021
//! let tokens = scanner.scan_tokens()?;
2122
//! let mut parser = Parser::new(tokens);
2223
//! let program = parser.parse()?; // Returns AST
24+
//! # Ok(())
25+
//! # }
2326
//! ```
2427
//!
2528
//! # Parsing Strategy
@@ -61,9 +64,15 @@ impl Parser {
6164
/// # Example
6265
///
6366
/// ```rust
67+
/// use ovsm::lexer::Scanner;
68+
/// use ovsm::parser::Parser;
69+
///
70+
/// # fn main() -> Result<(), Box<dyn std::error::Error>> {
6471
/// let mut scanner = Scanner::new("$x = 10");
6572
/// let tokens = scanner.scan_tokens()?;
6673
/// let parser = Parser::new(tokens);
74+
/// # Ok(())
75+
/// # }
6776
/// ```
6877
pub fn new(tokens: Vec<Token>) -> Self {
6978
Parser { tokens, current: 0 }
@@ -82,9 +91,17 @@ impl Parser {
8291
/// # Example
8392
///
8493
/// ```rust
94+
/// use ovsm::lexer::Scanner;
95+
/// use ovsm::parser::Parser;
96+
///
97+
/// # fn main() -> Result<(), Box<dyn std::error::Error>> {
98+
/// let mut scanner = Scanner::new("$x = 10");
99+
/// let tokens = scanner.scan_tokens()?;
85100
/// let mut parser = Parser::new(tokens);
86101
/// let program = parser.parse()?;
87102
/// // program.statements contains the AST
103+
/// # Ok(())
104+
/// # }
88105
/// ```
89106
pub fn parse(&mut self) -> Result<Program> {
90107
let mut statements = Vec::new();

crates/ovsm/src/runtime/evaluator.rs

Lines changed: 22 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ use std::sync::Arc;
2020
/// use ovsm::parser::Parser;
2121
/// use ovsm::lexer::Scanner;
2222
///
23+
/// # fn main() -> Result<(), Box<dyn std::error::Error>> {
2324
/// let code = "$x = 10 + 20\nRETURN $x";
2425
/// let mut scanner = Scanner::new(code);
2526
/// let tokens = scanner.scan_tokens()?;
@@ -28,6 +29,8 @@ use std::sync::Arc;
2829
///
2930
/// let mut evaluator = Evaluator::new();
3031
/// let result = evaluator.execute(&program)?; // Returns Value::Int(30)
32+
/// # Ok(())
33+
/// # }
3134
/// ```
3235
///
3336
/// # Architecture
@@ -80,8 +83,11 @@ impl Evaluator {
8083
/// # Example
8184
///
8285
/// ```rust
83-
/// let mut registry = ToolRegistry::new();
84-
/// registry.register("MY_TOOL", Box::new(MyCustomTool));
86+
/// use ovsm::runtime::Evaluator;
87+
/// use ovsm::tools::ToolRegistry;
88+
///
89+
/// let registry = ToolRegistry::new();
90+
/// // registry.register("MY_TOOL", Box::new(MyCustomTool));
8591
/// let evaluator = Evaluator::with_registry(registry);
8692
/// ```
8793
pub fn with_registry(registry: ToolRegistry) -> Self {
@@ -106,12 +112,26 @@ impl Evaluator {
106112
/// # Example
107113
///
108114
/// ```rust
115+
/// use ovsm::runtime::{Evaluator, Value};
116+
/// use ovsm::parser::Parser;
117+
/// use ovsm::lexer::Scanner;
118+
///
119+
/// # fn main() -> Result<(), Box<dyn std::error::Error>> {
120+
/// let code = "RETURN 42";
121+
/// let mut scanner = Scanner::new(code);
122+
/// let tokens = scanner.scan_tokens()?;
123+
/// let mut parser = Parser::new(tokens);
124+
/// let program = parser.parse()?;
125+
///
126+
/// let mut evaluator = Evaluator::new();
109127
/// let result = evaluator.execute(&program)?;
110128
/// match result {
111129
/// Value::Int(n) => println!("Result: {}", n),
112130
/// Value::Null => println!("No return value"),
113131
/// _ => println!("Other type"),
114132
/// }
133+
/// # Ok(())
134+
/// # }
115135
/// ```
116136
pub fn execute(&mut self, program: &Program) -> Result<Value> {
117137
for stmt in &program.statements {

docker-build.sh

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
#!/usr/bin/env bash
2+
# Docker build script for osvm-cli that works with Tailscale VPN
3+
#
4+
# This script uses --network=host to allow Docker builds to use
5+
# the host's network stack, which includes Tailscale DNS resolution.
6+
7+
set -e
8+
9+
echo "🐳 Building osvm-cli Docker image..."
10+
echo "📡 Using host network (Tailscale-compatible)"
11+
12+
docker build \
13+
--network=host \
14+
-t osvm-cli \
15+
"$@" \
16+
.
17+
18+
echo "✅ Build complete!"
19+
echo ""
20+
echo "Run with: docker run --rm osvm-cli --help"
21+
echo "Or: docker run --rm osvm-cli --version"

0 commit comments

Comments
 (0)