Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Rename random decimal to random float #10320

Merged
merged 1 commit into from
Sep 12, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
1 change: 1 addition & 0 deletions crates/nu-command/src/default_context.rs
Original file line number Diff line number Diff line change
Expand Up @@ -367,6 +367,7 @@ pub fn add_shell_command_context(mut engine_state: EngineState) -> EngineState {
RandomChars,
RandomDecimal,
RandomDice,
RandomFloat,
RandomInteger,
RandomUuid,
};
Expand Down
24 changes: 19 additions & 5 deletions crates/nu-command/src/random/decimal.rs
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,11 @@ impl Command for SubCommand {
}

fn usage(&self) -> &str {
"Generate a random decimal within a range [min..max]."
"deprecated: Generate a random float within a range [min..max]."
}

fn extra_usage(&self) -> &str {
"Use `random float` instead"
}

fn search_terms(&self) -> Vec<&str> {
Expand All @@ -38,28 +42,38 @@ impl Command for SubCommand {
call: &Call,
_input: PipelineData,
) -> Result<PipelineData, ShellError> {
nu_protocol::report_error_new(
engine_state,
&ShellError::GenericError(
"Deprecated command".into(),
"`random decimal` is deprecated and will be removed in 0.86.".into(),
Some(call.head),
Some("Use `random float instead".into()),
vec![],
),
);
decimal(engine_state, stack, call)
}

fn examples(&self) -> Vec<Example> {
vec![
Example {
description: "Generate a default decimal value between 0 and 1",
description: "Generate a default float value between 0 and 1",
example: "random decimal",
result: None,
},
Example {
description: "Generate a random decimal less than or equal to 500",
description: "Generate a random float less than or equal to 500",
example: "random decimal ..500",
result: None,
},
Example {
description: "Generate a random decimal greater than or equal to 100000",
description: "Generate a random float greater than or equal to 100000",
example: "random decimal 100000..",
result: None,
},
Example {
description: "Generate a random decimal between 1.0 and 1.1",
description: "Generate a random float between 1.0 and 1.1",
example: "random decimal 1.0..1.1",
result: None,
},
Expand Down
122 changes: 122 additions & 0 deletions crates/nu-command/src/random/float.rs
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 {})
}
}
2 changes: 2 additions & 0 deletions crates/nu-command/src/random/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ mod bool;
mod chars;
mod decimal;
mod dice;
mod float;
mod integer;
mod random_;
mod uuid;
Expand All @@ -10,6 +11,7 @@ pub use self::bool::SubCommand as RandomBool;
pub use self::chars::SubCommand as RandomChars;
pub use self::decimal::SubCommand as RandomDecimal;
pub use self::dice::SubCommand as RandomDice;
pub use self::float::SubCommand as RandomFloat;
pub use self::integer::SubCommand as RandomInteger;
pub use self::uuid::SubCommand as RandomUuid;
pub use random_::RandomCommand as Random;
22 changes: 0 additions & 22 deletions crates/nu-command/tests/commands/random/decimal.rs

This file was deleted.

26 changes: 26 additions & 0 deletions crates/nu-command/tests/commands/random/float.rs
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'));
}
2 changes: 1 addition & 1 deletion crates/nu-command/tests/commands/random/mod.rs
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;