Skip to content

Commit

Permalink
feat: add file upload support
Browse files Browse the repository at this point in the history
  • Loading branch information
HoKim98 committed Jul 23, 2024
1 parent 41a6524 commit ba47d9d
Show file tree
Hide file tree
Showing 22 changed files with 633 additions and 34 deletions.
23 changes: 17 additions & 6 deletions Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -41,9 +41,7 @@ blocks_in_conditions = "allow" # opentelemetry tracing macro would be noisy
[workspace.dependencies]
ark-core = { git = "https://github.com/ulagbulag/OpenARK" }
ark-core-k8s = { git = "https://github.com/ulagbulag/OpenARK" }
dash-pipe-provider = { git = "https://github.com/ulagbulag/OpenARK", default-features = false, features = [
"full",
] }
dash-pipe-provider = { git = "https://github.com/ulagbulag/OpenARK", default-features = false }

actix-cors = { version = "0.7" }
actix-web = { version = "4.8", default-features = false, features = ["macros"] }
Expand All @@ -53,7 +51,9 @@ async-trait = { version = "0.1" }
base64 = { version = "0.22" }
browser-panic-hook = { version = "0.2" }
built = { version = "0.7", features = ["chrono", "dependency-tree", "git2"] }
byte-unit = { version = "5.1" }
clap = { version = "4.5", features = ["derive", "env", "string"] }
csv = { version = "1.3" }
futures = { version = "0.3" }
garde = { version = "0.20", features = ["derive", "regex", "serde", "unicode"] }
gloo-net = { version = "0.6", default-features = false, features = [
Expand All @@ -68,8 +68,8 @@ inflector = { package = "Inflector", version = "0.11" }
itertools = { version = "0.13" }
js-sys = { version = "0.3", default-features = false }
k8s-openapi = { version = "0.22", features = ["latest", "schemars"] }
kube = { version = "0.92", default-features = false }
kube-core = { version = "0.92", default-features = false }
kube = { version = "0.93", default-features = false }
kube-core = { version = "0.93", default-features = false }
mime = { version = "0.3", default-features = false }
once_cell = { version = "1.19" }
patternfly-yew = { version = "0.6", default-features = false, features = [
Expand All @@ -83,6 +83,7 @@ serde = { version = "1.0", default-features = false }
serde_json = { version = "1.0", default-features = false }
serde_yml = { version = "0.0", default-features = false }
sha2 = { version = "0.10" }
strum = { version = "0.26" }
thiserror = { version = "1.0", default-features = false }
tokio = { version = "1.38", default-features = false }
tracing = { version = "0.1" }
Expand All @@ -91,7 +92,17 @@ tracing-subscriber-wasm = { version = "0.1" }
url = { version = "2.5" }
uuid = { version = "1.10", default-features = false, features = ["serde"] }
wasm-streams = { version = "0.4" }
web-sys = { version = "0.3", features = ["MediaQueryList", "Url", "Window"] }
web-sys = { version = "0.3", features = [
"FileList",
"MediaQueryList",
"Url",
"Window",
] }
yew = { version = "0.21", features = ["csr"] }
yew-markdown = { git = "https://github.com/ulagbulag/yew-markdown" }
yew-hooks = { version = "0.3" }
yew-nested-router = { version = "0.7" }

[patch.crates-io]
# FIXME: Wait a PR to be merged: https://github.com/kube-rs/kube/pull/1549
kube = { git = "https://github.com/ulagbulag/kube", branch = "fix/add-missing-client-feature-cfg" }
7 changes: 7 additions & 0 deletions crates/cassette-core/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -31,9 +31,15 @@ stream = ["dep:anyhow", "dep:wasm-streams"]
examples = []
mock-release = []

# plugins

## Connected Data Lake (CDL)
cdl = []

[dependencies]
actix-web = { workspace = true, optional = true }
anyhow = { workspace = true, optional = true }
csv = { workspace = true }
garde = { workspace = true }
gloo-net = { workspace = true, optional = true }
k8s-openapi = { workspace = true }
Expand All @@ -42,6 +48,7 @@ patternfly-yew = { workspace = true, optional = true }
schemars = { workspace = true, features = ["derive"] }
serde = { workspace = true, features = ["derive", "rc"] }
serde_json = { workspace = true }
strum = { workspace = true, features = ["derive"] }
tracing = { workspace = true, optional = true }
uuid = { workspace = true }
wasm-streams = { workspace = true, optional = true }
Expand Down
16 changes: 16 additions & 0 deletions crates/cassette-core/src/cassette.rs
Original file line number Diff line number Diff line change
Expand Up @@ -360,6 +360,15 @@ pub struct CassetteTaskHandle<T> {
item: Rc<T>,
}

#[cfg(feature = "ui")]
impl<T> ops::Deref for CassetteTaskHandle<T> {
type Target = Rc<T>;

fn deref(&self) -> &Self::Target {
&self.item
}
}

#[cfg(feature = "ui")]
impl<T> Clone for CassetteTaskHandle<T> {
fn clone(&self) -> Self {
Expand All @@ -371,6 +380,13 @@ impl<T> Clone for CassetteTaskHandle<T> {
}
}

#[cfg(feature = "ui")]
impl<T> PartialEq for CassetteTaskHandle<T> {
fn eq(&self, other: &Self) -> bool {
self.id == other.id && Rc::ptr_eq(&self.item, &other.item)
}
}

#[cfg(feature = "ui")]
impl<T> IntoPropValue<T> for CassetteTaskHandle<T>
where
Expand Down
15 changes: 15 additions & 0 deletions crates/cassette-core/src/data/cdl.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
use schemars::JsonSchema;
use serde::{Deserialize, Serialize};

#[derive(Clone, Debug, PartialEq, Serialize, Deserialize, JsonSchema)]
pub struct CdlTable {}

impl CdlTable {
pub fn is_empty(&self) -> bool {
todo!()
}

pub fn len(&self) -> usize {
todo!()
}
}
29 changes: 29 additions & 0 deletions crates/cassette-core/src/data/csv.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
use std::io::Read;

use anyhow::Result;
use schemars::JsonSchema;
use serde::{Deserialize, Serialize};
use serde_json::Value;

#[derive(Clone, Debug, PartialEq, Serialize, Deserialize, JsonSchema)]
pub struct CsvTable {
pub records: Vec<Value>,
}

impl CsvTable {
pub(super) fn from_reader(reader: impl Read) -> Result<Self> {
::csv::Reader::from_reader(reader)
.into_deserialize()
.map(|record| record.map_err(Into::into))
.collect::<Result<_>>()
.map(|records| Self { records })
}

pub fn is_empty(&self) -> bool {
self.records.is_empty()
}

pub fn len(&self) -> usize {
self.records.len()
}
}
4 changes: 4 additions & 0 deletions crates/cassette-core/src/data/mod.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
#[cfg(feature = "cdl")]
pub mod cdl;
pub mod csv;
pub mod table;
70 changes: 70 additions & 0 deletions crates/cassette-core/src/data/table.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,70 @@
use anyhow::{bail, Result};
use schemars::JsonSchema;
use serde::{Deserialize, Serialize};
use strum::{Display, EnumString};

#[derive(Clone, Debug, PartialEq, Serialize, Deserialize, JsonSchema)]
pub struct DataTable<Data = DataTableSource> {
pub name: String,
pub data: Data,
}

#[derive(Clone, Debug, PartialEq, Serialize, Deserialize, JsonSchema)]
#[serde(tag = "kind", content = "data", rename_all = "SCREAMING_SNAKE_CASE")]
pub enum DataTableSource {
Cdl(super::cdl::CdlTable),
Csv(super::csv::CsvTable),
Raw(Vec<u8>),
}

impl DataTableSource {
pub fn is_empty(&self) -> bool {
match self {
DataTableSource::Cdl(data) => data.is_empty(),
DataTableSource::Csv(data) => data.is_empty(),
DataTableSource::Raw(data) => data.is_empty(),
}
}

pub fn len(&self) -> usize {
match self {
DataTableSource::Cdl(data) => data.len(),
DataTableSource::Csv(data) => data.len(),
DataTableSource::Raw(data) => data.len(),
}
}
}

#[derive(
Copy,
Clone,
Debug,
Display,
EnumString,
PartialEq,
Eq,
PartialOrd,
Ord,
Hash,
Serialize,
Deserialize,
JsonSchema,
)]
#[serde(rename_all = "SCREAMING_SNAKE_CASE")]
pub enum DataTableSourceType {
Cdl,
Csv,
Raw,
}

impl DataTableSourceType {
pub fn parse_bytes(&self, bytes: Vec<u8>) -> Result<DataTableSource> {
match self {
Self::Cdl => bail!("Unsupported data type: {self}"),
Self::Csv => {
super::csv::CsvTable::from_reader(bytes.as_slice()).map(DataTableSource::Csv)
}
Self::Raw => Ok(DataTableSource::Raw(bytes)),
}
}
}
2 changes: 2 additions & 0 deletions crates/cassette-core/src/lib.rs
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
pub mod cassette;
pub mod components;
#[cfg(feature = "ui")]
pub mod data;
pub mod document;
pub mod net;
pub mod result;
Expand Down
1 change: 1 addition & 0 deletions crates/cassette-core/src/net/service.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@

2 changes: 1 addition & 1 deletion crates/cassette-loader-file/build.rs
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ const OUT_SRC: &str = "examples.yaml";

fn main() {
static EXAMPLES: Dir<'_> = include_dir!("examples");
println!("cargo:rerun-if-changed=./examples");
println!("cargo:rerun-if-changed=../../examples");

let contents = EXAMPLES
.files()
Expand Down
4 changes: 2 additions & 2 deletions crates/cassette-plugin-cdl-api/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@ workspace = true
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html

[features]
default = ["default-tls"]
default = []

# TLS
default-tls = ["openssl-tls"]
Expand All @@ -32,5 +32,5 @@ cassette-core = { path = "../cassette-core", features = ["api"] }

actix-web = { workspace = true }
anyhow = { workspace = true }
dash-pipe-provider = { workspace = true }
dash-pipe-provider = { workspace = true, features = ["kafka", "storage"] }
tracing = { workspace = true }
7 changes: 2 additions & 5 deletions crates/cassette-plugin-cdl-catalog/src/lib.rs
Original file line number Diff line number Diff line change
@@ -1,8 +1,5 @@
use cassette_core::{
cassette::CassetteContext,
components::ComponentRenderer,
prelude::*,
task::{TaskResult, TaskState},
cassette::CassetteContext, components::ComponentRenderer, prelude::*, task::TaskResult,
};
use serde::{Deserialize, Serialize};
use yew::prelude::*;
Expand All @@ -16,7 +13,7 @@ pub struct Spec {}
pub struct State {}

impl ComponentRenderer<Spec> for State {
fn render(self, ctx: &mut CassetteContext, spec: Spec) -> TaskResult<Option<Self>> {
fn render(self, _ctx: &mut CassetteContext, spec: Spec) -> TaskResult<Option<Self>> {
let Spec {} = spec;

// TODO: to be implemented
Expand Down
7 changes: 2 additions & 5 deletions crates/cassette-plugin-cdl-dataset-browser/src/lib.rs
Original file line number Diff line number Diff line change
@@ -1,8 +1,5 @@
use cassette_core::{
cassette::CassetteContext,
components::ComponentRenderer,
prelude::*,
task::{TaskResult, TaskState},
cassette::CassetteContext, components::ComponentRenderer, prelude::*, task::TaskResult,
};
use serde::{Deserialize, Serialize};
use yew::prelude::*;
Expand All @@ -16,7 +13,7 @@ pub struct Spec {}
pub struct State {}

impl ComponentRenderer<Spec> for State {
fn render(self, ctx: &mut CassetteContext, spec: Spec) -> TaskResult<Option<Self>> {
fn render(self, _ctx: &mut CassetteContext, spec: Spec) -> TaskResult<Option<Self>> {
let Spec {} = spec;

// TODO: to be implemented
Expand Down
7 changes: 2 additions & 5 deletions crates/cassette-plugin-cdl-dataset-stream-reader/src/lib.rs
Original file line number Diff line number Diff line change
@@ -1,8 +1,5 @@
use cassette_core::{
cassette::CassetteContext,
components::ComponentRenderer,
prelude::*,
task::{TaskResult, TaskState},
cassette::CassetteContext, components::ComponentRenderer, prelude::*, task::TaskResult,
};
use serde::{Deserialize, Serialize};
use yew::prelude::*;
Expand All @@ -16,7 +13,7 @@ pub struct Spec {}
pub struct State {}

impl ComponentRenderer<Spec> for State {
fn render(self, ctx: &mut CassetteContext, spec: Spec) -> TaskResult<Option<Self>> {
fn render(self, _ctx: &mut CassetteContext, spec: Spec) -> TaskResult<Option<Self>> {
let Spec {} = spec;

// TODO: to be implemented
Expand Down
1 change: 1 addition & 0 deletions crates/cassette-plugin-cdl-zone/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -23,5 +23,6 @@ workspace = true
cassette-core = { path = "../cassette-core", features = ["ui"] }
cassette-plugin-cdl-core = { path = "../cassette-plugin-cdl-core" }

patternfly-yew = { workspace = true }
serde = { workspace = true, features = ["derive"] }
yew = { workspace = true }
Loading

0 comments on commit ba47d9d

Please sign in to comment.