Skip to content

Commit dde86b9

Browse files
authored
feature gate csv functionality (apache#312)
* feature gate csv functionality * mock read_csv example * clippy * mock read_csv_infer_schema example * add tests of --no-default-features to CI
1 parent f042191 commit dde86b9

File tree

10 files changed

+73
-57
lines changed

10 files changed

+73
-57
lines changed

.github/workflows/rust.yml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -112,6 +112,8 @@ jobs:
112112
cd arrow
113113
# re-run tests on arrow workspace with additional features
114114
cargo test --features=prettyprint
115+
# run test on arrow with minimal set of features
116+
cargo test --no-default-features
115117
cargo run --example builders
116118
cargo run --example dynamic_types
117119
cargo run --example read_csv

arrow/Cargo.toml

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -41,8 +41,8 @@ serde_derive = "1.0"
4141
serde_json = { version = "1.0", features = ["preserve_order"] }
4242
indexmap = "1.6"
4343
rand = "0.7"
44-
csv = "1.1"
4544
num = "0.4"
45+
csv_crate = { version = "1.1", optional = true, package="csv" }
4646
regex = "1.3"
4747
lazy_static = "1.4"
4848
packed_simd = { version = "0.3.4", optional = true, package = "packed_simd_2" }
@@ -54,8 +54,9 @@ lexical-core = "^0.7"
5454
multiversion = "0.6.1"
5555

5656
[features]
57-
default = []
57+
default = ["csv"]
5858
avx512 = []
59+
csv = ["csv_crate"]
5960
simd = ["packed_simd"]
6061
prettyprint = ["prettytable-rs"]
6162
# this is only intended to be used in single-threaded programs: it verifies that

arrow/benches/csv_writer.rs

Lines changed: 34 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -21,45 +21,49 @@ extern crate criterion;
2121
use criterion::*;
2222

2323
use arrow::array::*;
24+
#[cfg(feature = "csv")]
2425
use arrow::csv;
2526
use arrow::datatypes::*;
2627
use arrow::record_batch::RecordBatch;
2728
use std::fs::File;
2829
use std::sync::Arc;
2930

3031
fn record_batches_to_csv() {
31-
let schema = Schema::new(vec![
32-
Field::new("c1", DataType::Utf8, false),
33-
Field::new("c2", DataType::Float64, true),
34-
Field::new("c3", DataType::UInt32, false),
35-
Field::new("c3", DataType::Boolean, true),
36-
]);
32+
#[cfg(feature = "csv")]
33+
{
34+
let schema = Schema::new(vec![
35+
Field::new("c1", DataType::Utf8, false),
36+
Field::new("c2", DataType::Float64, true),
37+
Field::new("c3", DataType::UInt32, false),
38+
Field::new("c3", DataType::Boolean, true),
39+
]);
3740

38-
let c1 = StringArray::from(vec![
39-
"Lorem ipsum dolor sit amet",
40-
"consectetur adipiscing elit",
41-
"sed do eiusmod tempor",
42-
]);
43-
let c2 = PrimitiveArray::<Float64Type>::from(vec![
44-
Some(123.564532),
45-
None,
46-
Some(-556132.25),
47-
]);
48-
let c3 = PrimitiveArray::<UInt32Type>::from(vec![3, 2, 1]);
49-
let c4 = BooleanArray::from(vec![Some(true), Some(false), None]);
41+
let c1 = StringArray::from(vec![
42+
"Lorem ipsum dolor sit amet",
43+
"consectetur adipiscing elit",
44+
"sed do eiusmod tempor",
45+
]);
46+
let c2 = PrimitiveArray::<Float64Type>::from(vec![
47+
Some(123.564532),
48+
None,
49+
Some(-556132.25),
50+
]);
51+
let c3 = PrimitiveArray::<UInt32Type>::from(vec![3, 2, 1]);
52+
let c4 = BooleanArray::from(vec![Some(true), Some(false), None]);
5053

51-
let b = RecordBatch::try_new(
52-
Arc::new(schema),
53-
vec![Arc::new(c1), Arc::new(c2), Arc::new(c3), Arc::new(c4)],
54-
)
55-
.unwrap();
56-
let file = File::create("target/bench_write_csv.csv").unwrap();
57-
let mut writer = csv::Writer::new(file);
58-
let batches = vec![&b, &b, &b, &b, &b, &b, &b, &b, &b, &b, &b];
59-
#[allow(clippy::unit_arg)]
60-
criterion::black_box(for batch in batches {
61-
writer.write(batch).unwrap()
62-
});
54+
let b = RecordBatch::try_new(
55+
Arc::new(schema),
56+
vec![Arc::new(c1), Arc::new(c2), Arc::new(c3), Arc::new(c4)],
57+
)
58+
.unwrap();
59+
let file = File::create("target/bench_write_csv.csv").unwrap();
60+
let mut writer = csv::Writer::new(file);
61+
let batches = vec![&b, &b, &b, &b, &b, &b, &b, &b, &b, &b, &b];
62+
#[allow(clippy::unit_arg)]
63+
criterion::black_box(for batch in batches {
64+
writer.write(batch).unwrap()
65+
});
66+
}
6367
}
6468

6569
fn criterion_benchmark(c: &mut Criterion) {

arrow/examples/read_csv.rs

Lines changed: 16 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -20,24 +20,29 @@ extern crate arrow;
2020
use std::fs::File;
2121
use std::sync::Arc;
2222

23+
#[cfg(feature = "csv")]
2324
use arrow::csv;
2425
use arrow::datatypes::{DataType, Field, Schema};
2526
#[cfg(feature = "prettyprint")]
2627
use arrow::util::pretty::print_batches;
2728

2829
fn main() {
29-
let schema = Schema::new(vec![
30-
Field::new("city", DataType::Utf8, false),
31-
Field::new("lat", DataType::Float64, false),
32-
Field::new("lng", DataType::Float64, false),
33-
]);
30+
#[cfg(feature = "csv")]
31+
{
32+
let schema = Schema::new(vec![
33+
Field::new("city", DataType::Utf8, false),
34+
Field::new("lat", DataType::Float64, false),
35+
Field::new("lng", DataType::Float64, false),
36+
]);
3437

35-
let file = File::open("test/data/uk_cities.csv").unwrap();
38+
let file = File::open("test/data/uk_cities.csv").unwrap();
3639

37-
let mut csv = csv::Reader::new(file, Arc::new(schema), false, None, 1024, None, None);
38-
let _batch = csv.next().unwrap().unwrap();
39-
#[cfg(feature = "prettyprint")]
40-
{
41-
print_batches(&[_batch]).unwrap();
40+
let mut csv =
41+
csv::Reader::new(file, Arc::new(schema), false, None, 1024, None, None);
42+
let _batch = csv.next().unwrap().unwrap();
43+
#[cfg(feature = "prettyprint")]
44+
{
45+
print_batches(&[_batch]).unwrap();
46+
}
4247
}
4348
}

arrow/examples/read_csv_infer_schema.rs

Lines changed: 12 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -17,20 +17,24 @@
1717

1818
extern crate arrow;
1919

20+
#[cfg(feature = "csv")]
2021
use arrow::csv;
2122
#[cfg(feature = "prettyprint")]
2223
use arrow::util::pretty::print_batches;
2324
use std::fs::File;
2425

2526
fn main() {
26-
let file = File::open("test/data/uk_cities_with_headers.csv").unwrap();
27-
let builder = csv::ReaderBuilder::new()
28-
.has_header(true)
29-
.infer_schema(Some(100));
30-
let mut csv = builder.build(file).unwrap();
31-
let _batch = csv.next().unwrap().unwrap();
32-
#[cfg(feature = "prettyprint")]
27+
#[cfg(feature = "csv")]
3328
{
34-
print_batches(&[_batch]).unwrap();
29+
let file = File::open("test/data/uk_cities_with_headers.csv").unwrap();
30+
let builder = csv::ReaderBuilder::new()
31+
.has_header(true)
32+
.infer_schema(Some(100));
33+
let mut csv = builder.build(file).unwrap();
34+
let _batch = csv.next().unwrap().unwrap();
35+
#[cfg(feature = "prettyprint")]
36+
{
37+
print_batches(&[_batch]).unwrap();
38+
}
3539
}
3640
}

arrow/src/csv/reader.rs

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -49,16 +49,14 @@ use std::fs::File;
4949
use std::io::{Read, Seek, SeekFrom};
5050
use std::sync::Arc;
5151

52-
use csv as csv_crate;
53-
5452
use crate::array::{
5553
ArrayRef, BooleanArray, DictionaryArray, PrimitiveArray, StringArray,
5654
};
5755
use crate::datatypes::*;
5856
use crate::error::{ArrowError, Result};
5957
use crate::record_batch::RecordBatch;
6058

61-
use self::csv_crate::{ByteRecord, StringRecord};
59+
use csv_crate::{ByteRecord, StringRecord};
6260

6361
lazy_static! {
6462
static ref DECIMAL_RE: Regex = Regex::new(r"^-?(\d+\.\d+)$").unwrap();

arrow/src/csv/writer.rs

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -65,8 +65,6 @@
6565
//! }
6666
//! ```
6767
68-
use csv as csv_crate;
69-
7068
use std::io::Write;
7169

7270
use crate::datatypes::*;

arrow/src/error.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,6 @@
1919
use std::fmt::{Debug, Display, Formatter};
2020
use std::io::Write;
2121

22-
use csv as csv_crate;
2322
use std::error::Error;
2423

2524
/// Many different operations in the `arrow` crate return this error type.
@@ -59,6 +58,7 @@ impl From<::std::io::Error> for ArrowError {
5958
}
6059
}
6160

61+
#[cfg(feature = "csv")]
6262
impl From<csv_crate::Error> for ArrowError {
6363
fn from(error: csv_crate::Error) -> Self {
6464
match error.kind() {

arrow/src/lib.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -149,6 +149,7 @@ pub mod bitmap;
149149
pub mod buffer;
150150
mod bytes;
151151
pub mod compute;
152+
#[cfg(feature = "csv")]
152153
pub mod csv;
153154
pub mod datatypes;
154155
pub mod error;

arrow/src/util/string_writer.rs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,8 @@
2323
//! Example:
2424
//!
2525
//! ```
26+
//! #[cfg(feature = "csv")]
27+
//! {
2628
//! use arrow::array::*;
2729
//! use arrow::csv;
2830
//! use arrow::datatypes::*;
@@ -58,6 +60,7 @@
5860
//! let sw = StringWriter::new();
5961
//! let mut writer = csv::Writer::new(sw);
6062
//! writer.write(&batch).unwrap();
63+
//! }
6164
//! ```
6265
6366
use std::io::{Error, ErrorKind, Result, Write};

0 commit comments

Comments
 (0)