-
Notifications
You must be signed in to change notification settings - Fork 1.6k
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
# Description Similar to #9979 # User-Facing Changes `random decimal` will now raise a warning and can be removed in an upcoming release. New command is named `random float` # Tests + Formatting Tests updated and improved.
- Loading branch information
1 parent
1fb4f9e
commit d53b0a9
Showing
7 changed files
with
171 additions
and
28 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,122 @@ | ||
use nu_engine::CallExt; | ||
use nu_protocol::ast::Call; | ||
use nu_protocol::engine::{Command, EngineState, Stack}; | ||
use nu_protocol::{ | ||
Category, Example, PipelineData, Range, ShellError, Signature, Span, SyntaxShape, Type, Value, | ||
}; | ||
use rand::prelude::{thread_rng, Rng}; | ||
use std::cmp::Ordering; | ||
|
||
#[derive(Clone)] | ||
pub struct SubCommand; | ||
|
||
impl Command for SubCommand { | ||
fn name(&self) -> &str { | ||
"random float" | ||
} | ||
|
||
fn signature(&self) -> Signature { | ||
Signature::build("random float") | ||
.input_output_types(vec![(Type::Nothing, Type::Float)]) | ||
.allow_variants_without_examples(true) | ||
.optional("range", SyntaxShape::Range, "Range of values") | ||
.category(Category::Random) | ||
} | ||
|
||
fn usage(&self) -> &str { | ||
"Generate a random float within a range [min..max]." | ||
} | ||
|
||
fn search_terms(&self) -> Vec<&str> { | ||
vec!["generate"] | ||
} | ||
|
||
fn run( | ||
&self, | ||
engine_state: &EngineState, | ||
stack: &mut Stack, | ||
call: &Call, | ||
_input: PipelineData, | ||
) -> Result<PipelineData, ShellError> { | ||
float(engine_state, stack, call) | ||
} | ||
|
||
fn examples(&self) -> Vec<Example> { | ||
vec![ | ||
Example { | ||
description: "Generate a default float value between 0 and 1", | ||
example: "random float", | ||
result: None, | ||
}, | ||
Example { | ||
description: "Generate a random float less than or equal to 500", | ||
example: "random float ..500", | ||
result: None, | ||
}, | ||
Example { | ||
description: "Generate a random float greater than or equal to 100000", | ||
example: "random float 100000..", | ||
result: None, | ||
}, | ||
Example { | ||
description: "Generate a random float between 1.0 and 1.1", | ||
example: "random float 1.0..1.1", | ||
result: None, | ||
}, | ||
] | ||
} | ||
} | ||
|
||
fn float( | ||
engine_state: &EngineState, | ||
stack: &mut Stack, | ||
call: &Call, | ||
) -> Result<PipelineData, ShellError> { | ||
let span = call.head; | ||
let range: Option<Range> = call.opt(engine_state, stack, 0)?; | ||
|
||
let (min, max) = if let Some(r) = range { | ||
if r.is_end_inclusive() { | ||
(r.from.as_float()?, r.to.as_float()?) | ||
} else if r.to.as_float()? >= 1.0 { | ||
(r.from.as_float()?, r.to.as_float()? - 1.0) | ||
} else { | ||
(0.0, 0.0) | ||
} | ||
} else { | ||
(0.0, 1.0) | ||
}; | ||
|
||
match min.partial_cmp(&max) { | ||
Some(Ordering::Greater) => Err(ShellError::InvalidRange { | ||
left_flank: min.to_string(), | ||
right_flank: max.to_string(), | ||
span, | ||
}), | ||
Some(Ordering::Equal) => Ok(PipelineData::Value( | ||
Value::float(min, Span::new(64, 64)), | ||
None, | ||
)), | ||
_ => { | ||
let mut thread_rng = thread_rng(); | ||
let result: f64 = thread_rng.gen_range(min..max); | ||
|
||
Ok(PipelineData::Value( | ||
Value::float(result, Span::new(64, 64)), | ||
None, | ||
)) | ||
} | ||
} | ||
} | ||
|
||
#[cfg(test)] | ||
mod test { | ||
use super::*; | ||
|
||
#[test] | ||
fn test_examples() { | ||
use crate::test_examples; | ||
|
||
test_examples(SubCommand {}) | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file was deleted.
Oops, something went wrong.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,26 @@ | ||
use nu_test_support::nu; | ||
|
||
#[test] | ||
fn generates_a_float() { | ||
let actual = nu!("random float 42..43"); | ||
|
||
// Attention: this relies on the string output | ||
assert!(actual.out.starts_with("42") || actual.out.starts_with("43")); | ||
let actual = nu!("random float 42..43 | describe"); | ||
|
||
assert_eq!(actual.out, "float") | ||
} | ||
|
||
#[test] | ||
fn generates_55() { | ||
let actual = nu!("random float 55..55"); | ||
|
||
assert!(actual.out.contains("55")); | ||
} | ||
|
||
#[test] | ||
fn generates_0() { | ||
let actual = nu!("random float ..<1"); | ||
|
||
assert!(actual.out.contains('0')); | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,7 +1,7 @@ | ||
mod bool; | ||
mod chars; | ||
mod decimal; | ||
mod dice; | ||
mod float; | ||
mod integer; | ||
#[cfg(feature = "uuid_crate")] | ||
mod uuid; |