mirror of
https://github.com/nushell/nushell.git
synced 2025-06-03 08:36:32 +02:00
All of the dataframe commands ported over with no issues... ### 11 tests are commented out (for now) So 100 of the original 111 tests are passing with only 11 tests being ignored for now.. As per our conversation in the core team meeting on Wednesday I took @jntrnr suggestion and just commented out the tests dealing with [IntoDatetime](https://github.com/nushell/nushell/blob/main/crates/nu-command/src/conversions/into/mod.rs) Later on we can move this functionality out of nu-command if we decide it makes sense... ### The following tests were ignored... ```rust modified: crates/nu-cmd-dataframe/src/dataframe/series/date/get_day.rs modified: crates/nu-cmd-dataframe/src/dataframe/series/date/get_hour.rs modified: crates/nu-cmd-dataframe/src/dataframe/series/date/get_minute.rs modified: crates/nu-cmd-dataframe/src/dataframe/series/date/get_month.rs modified: crates/nu-cmd-dataframe/src/dataframe/series/date/get_nanosecond.rs modified: crates/nu-cmd-dataframe/src/dataframe/series/date/get_ordinal.rs modified: crates/nu-cmd-dataframe/src/dataframe/series/date/get_second.rs modified: crates/nu-cmd-dataframe/src/dataframe/series/date/get_week.rs modified: crates/nu-cmd-dataframe/src/dataframe/series/date/get_weekday.rs modified: crates/nu-cmd-dataframe/src/dataframe/series/date/get_year.rs modified: crates/nu-cmd-dataframe/src/dataframe/series/string/strftime.rs ```
133 lines
4.3 KiB
Rust
133 lines
4.3 KiB
Rust
use nu_engine::CallExt;
|
|
use nu_protocol::{
|
|
ast::Call,
|
|
engine::{Command, EngineState, Stack},
|
|
Category, Example, PipelineData, ShellError, Signature, Span, SyntaxShape, Type, Value,
|
|
};
|
|
|
|
use super::super::values::{Axis, Column, NuDataFrame};
|
|
|
|
#[derive(Clone)]
|
|
pub struct AppendDF;
|
|
|
|
impl Command for AppendDF {
|
|
fn name(&self) -> &str {
|
|
"dfr append"
|
|
}
|
|
|
|
fn usage(&self) -> &str {
|
|
"Appends a new dataframe."
|
|
}
|
|
|
|
fn signature(&self) -> Signature {
|
|
Signature::build(self.name())
|
|
.required("other", SyntaxShape::Any, "dataframe to be appended")
|
|
.switch("col", "appends in col orientation", Some('c'))
|
|
.input_type(Type::Custom("dataframe".into()))
|
|
.output_type(Type::Custom("dataframe".into()))
|
|
.category(Category::Custom("dataframe".into()))
|
|
}
|
|
|
|
fn examples(&self) -> Vec<Example> {
|
|
vec![
|
|
Example {
|
|
description: "Appends a dataframe as new columns",
|
|
example: r#"let a = ([[a b]; [1 2] [3 4]] | dfr into-df);
|
|
$a | dfr append $a"#,
|
|
result: Some(
|
|
NuDataFrame::try_from_columns(vec![
|
|
Column::new(
|
|
"a".to_string(),
|
|
vec![Value::test_int(1), Value::test_int(3)],
|
|
),
|
|
Column::new(
|
|
"b".to_string(),
|
|
vec![Value::test_int(2), Value::test_int(4)],
|
|
),
|
|
Column::new(
|
|
"a_x".to_string(),
|
|
vec![Value::test_int(1), Value::test_int(3)],
|
|
),
|
|
Column::new(
|
|
"b_x".to_string(),
|
|
vec![Value::test_int(2), Value::test_int(4)],
|
|
),
|
|
])
|
|
.expect("simple df for test should not fail")
|
|
.into_value(Span::test_data()),
|
|
),
|
|
},
|
|
Example {
|
|
description: "Appends a dataframe merging at the end of columns",
|
|
example: r#"let a = ([[a b]; [1 2] [3 4]] | dfr into-df);
|
|
$a | dfr append $a --col"#,
|
|
result: Some(
|
|
NuDataFrame::try_from_columns(vec![
|
|
Column::new(
|
|
"a".to_string(),
|
|
vec![
|
|
Value::test_int(1),
|
|
Value::test_int(3),
|
|
Value::test_int(1),
|
|
Value::test_int(3),
|
|
],
|
|
),
|
|
Column::new(
|
|
"b".to_string(),
|
|
vec![
|
|
Value::test_int(2),
|
|
Value::test_int(4),
|
|
Value::test_int(2),
|
|
Value::test_int(4),
|
|
],
|
|
),
|
|
])
|
|
.expect("simple df for test should not fail")
|
|
.into_value(Span::test_data()),
|
|
),
|
|
},
|
|
]
|
|
}
|
|
|
|
fn run(
|
|
&self,
|
|
engine_state: &EngineState,
|
|
stack: &mut Stack,
|
|
call: &Call,
|
|
input: PipelineData,
|
|
) -> Result<PipelineData, ShellError> {
|
|
command(engine_state, stack, call, input)
|
|
}
|
|
}
|
|
|
|
fn command(
|
|
engine_state: &EngineState,
|
|
stack: &mut Stack,
|
|
call: &Call,
|
|
input: PipelineData,
|
|
) -> Result<PipelineData, ShellError> {
|
|
let other: Value = call.req(engine_state, stack, 0)?;
|
|
|
|
let axis = if call.has_flag("col") {
|
|
Axis::Column
|
|
} else {
|
|
Axis::Row
|
|
};
|
|
let df_other = NuDataFrame::try_from_value(other)?;
|
|
let df = NuDataFrame::try_from_pipeline(input, call.head)?;
|
|
|
|
df.append_df(&df_other, axis, call.head)
|
|
.map(|df| PipelineData::Value(NuDataFrame::into_value(df, call.head), None))
|
|
}
|
|
|
|
#[cfg(test)]
|
|
mod test {
|
|
use super::super::super::test_dataframe::test_dataframe;
|
|
use super::*;
|
|
|
|
#[test]
|
|
fn test_examples() {
|
|
test_dataframe(vec![Box::new(AppendDF {})])
|
|
}
|
|
}
|