From 6e85896c71c24219eac13e3dbbd7eee1e7a8a043 Mon Sep 17 00:00:00 2001 From: Brad Heller Date: Thu, 5 Jun 2025 13:29:55 -0700 Subject: [PATCH 1/7] chore: Add contextual telemetry collection --- Cargo.lock | 14 ++++- Cargo.toml | 1 + crates/tower-telemetry/Cargo.toml | 2 +- crates/tower-telemetry/src/context.rs | 5 ++ crates/tower-telemetry/src/lib.rs | 4 +- crates/tower-telemetry/src/logging.rs | 84 ++++++++++++++++++++++----- 6 files changed, 92 insertions(+), 18 deletions(-) create mode 100644 crates/tower-telemetry/src/context.rs diff --git a/Cargo.lock b/Cargo.lock index 899b6704..759492a9 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2899,7 +2899,7 @@ checksum = "8df9b6e13f2d32c91b9bd719c00d1958837bc7dec474d94952798cc8e69eeec3" name = "tower-telemetry" version = "0.3.14" dependencies = [ - "log", + "tracing", ] [[package]] @@ -2921,9 +2921,21 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "784e0ac535deb450455cbfa28a6f0df145ea1bb7ae51b821cf5e7927fdcfbdd0" dependencies = [ "pin-project-lite", + "tracing-attributes", "tracing-core", ] +[[package]] +name = "tracing-attributes" +version = "0.1.28" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "395ae124c09f9e6918a2310af6038fba074bcf474ac352496d5910dd59a2226d" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.100", +] + [[package]] name = "tracing-core" version = "0.1.33" diff --git a/Cargo.toml b/Cargo.toml index decb66f7..5438fdf3 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -62,6 +62,7 @@ tower-cmd = { path = "crates/tower-cmd" } tower-package = { path = "crates/tower-package" } tower-runtime = { path = "crates/tower-runtime" } tower-telemetry = { path = "crates/tower-telemetry" } +tracing = { version = "0.1" } url = { version = "2", features = ["serde"] } webbrowser = "1" diff --git a/crates/tower-telemetry/Cargo.toml b/crates/tower-telemetry/Cargo.toml index 4a0c8460..cba648f2 100644 --- a/crates/tower-telemetry/Cargo.toml +++ b/crates/tower-telemetry/Cargo.toml @@ -7,4 +7,4 @@ rust-version = { workspace = true } license = { workspace = true } [dependencies] -log = { workspace = true } +tracing = { workspace = true } diff --git a/crates/tower-telemetry/src/context.rs b/crates/tower-telemetry/src/context.rs new file mode 100644 index 00000000..68918892 --- /dev/null +++ b/crates/tower-telemetry/src/context.rs @@ -0,0 +1,5 @@ + +pub struct Context { + /// run_id is the ID of the run in the current context. + run_id: Option, +} diff --git a/crates/tower-telemetry/src/lib.rs b/crates/tower-telemetry/src/lib.rs index b2d926f1..ad9b5360 100644 --- a/crates/tower-telemetry/src/lib.rs +++ b/crates/tower-telemetry/src/lib.rs @@ -1,2 +1,4 @@ pub mod logging; -pub use logging::RunContext; +pub mod context; + +pub use context::Context; diff --git a/crates/tower-telemetry/src/logging.rs b/crates/tower-telemetry/src/logging.rs index f56820f1..8b071526 100644 --- a/crates/tower-telemetry/src/logging.rs +++ b/crates/tower-telemetry/src/logging.rs @@ -1,23 +1,77 @@ -use log::kv::{Key, Value}; +use tracing::event; -pub struct RunContext { - run_id: String, +macro_rules! debug { + // Handle case with context, format string and arguments + ($ctx:expr, $fmt:expr, $($arg:tt)*) => { + if let Some(run_id) = $ctx.run_id { + event!(tracing::Level::DEBUG, runid = %run_id, "{}", format!($fmt, $($arg)*)); + } else { + event!(tracing::Level::DEBUG, "{}", format!($fmt, $($arg)*)); + } + }; + // Handle case with context and just a message (no formatting) + ($ctx:expr, $msg:expr) => { + if let Some(run_id) = $ctx.run_id { + event!(tracing::Level::DEBUG, runid = %run_id, $msg); + } else { + event!(tracing::Level::DEBUG, "{}", $msg); + } + }; } -impl log::kv::ToValue for RunContext { - fn to_value(&self) -> Value { - Value::from(self.run_id.as_str()) - } +macro_rules! info { + // Handle case with context, format string and arguments + ($ctx:expr, $fmt:expr, $($arg:tt)*) => { + if let Some(run_id) = $ctx.run_id { + event!(tracing::Level::INFO, runid = %run_id, "{}", format!($fmt, $($arg)*)); + } else { + event!(tracing::Level::INFO, "{}", format!($fmt, $($arg)*)); + } + }; + // Handle case with context and just a message (no formatting) + ($ctx:expr, $msg:expr) => { + if let Some(run_id) = $ctx.run_id { + event!(tracing::Level::INFO, runid = %run_id, $msg); + } else { + event!(tracing::Level::INFO, "{}", $msg); + } + }; } -impl log::kv::ToKey for RunContext { - fn to_key(&self) -> Key { - Key::from("tower.run_id") - } +macro_rules! warn { + // Handle case with context, format string and arguments + ($ctx:expr, $fmt:expr, $($arg:tt)*) => { + if let Some(run_id) = $ctx.run_id { + event!(tracing::Level::WARN, runid = %run_id, "{}", format!($fmt, $($arg)*)); + } else { + event!(tracing::Level::WARN, "{}", format!($fmt, $($arg)*)); + } + }; + // Handle case with context and just a message (no formatting) + ($ctx:expr, $msg:expr) => { + if let Some(run_id) = $ctx.run_id { + event!(tracing::Level::WARN, runid = %run_id, $msg); + } else { + event!(tracing::Level::WARN, "{}", $msg); + } + }; } -impl RunContext { - pub fn new(run_id: String) -> Self { - Self { run_id } - } +macro_rules! error { + // Handle case with context, format string and arguments + ($ctx:expr, $fmt:expr, $($arg:tt)*) => { + if let Some(run_id) = $ctx.run_id { + event!(tracing::Level::ERROR, runid = %run_id, "{}", format!($fmt, $($arg)*)); + } else { + event!(tracing::Level::ERROR, "{}", format!($fmt, $($arg)*)); + } + }; + // Handle case with context and just a message (no formatting) + ($ctx:expr, $msg:expr) => { + if let Some(run_id) = $ctx.run_id { + event!(tracing::Level::ERROR, runid = %run_id, $msg); + } else { + event!(tracing::Level::ERROR, "{}", $msg); + } + }; } From e6ed0b30049a6bfb56794658a3e41130ae9062df Mon Sep 17 00:00:00 2001 From: Brad Heller Date: Thu, 5 Jun 2025 14:37:00 -0700 Subject: [PATCH 2/7] chore: Move logging configuration into the telemetry package --- Cargo.lock | 199 ++++++++------------- Cargo.toml | 4 +- crates/config/Cargo.toml | 2 +- crates/config/src/error.rs | 4 +- crates/config/src/session.rs | 15 +- crates/config/src/towerfile.rs | 3 +- crates/tower-api/Cargo.toml | 2 +- crates/tower-cmd/Cargo.toml | 3 +- crates/tower-cmd/src/api.rs | 5 +- crates/tower-cmd/src/deploy.rs | 3 +- crates/tower-cmd/src/error.rs | 3 +- crates/tower-cmd/src/lib.rs | 12 +- crates/tower-cmd/src/output.rs | 13 +- crates/tower-cmd/src/run.rs | 11 +- crates/tower-cmd/src/secrets.rs | 9 +- crates/tower-cmd/src/session.rs | 5 +- crates/tower-cmd/src/teams.rs | 3 +- crates/tower-cmd/src/util/deploy.rs | 3 +- crates/tower-package/Cargo.toml | 5 +- crates/tower-package/src/error.rs | 5 +- crates/tower-package/src/lib.rs | 12 +- crates/tower-package/tests/package_test.rs | 13 +- crates/tower-runtime/Cargo.toml | 2 +- crates/tower-runtime/src/lib.rs | 3 +- crates/tower-runtime/src/local.rs | 35 ++-- crates/tower-telemetry/Cargo.toml | 1 + crates/tower-telemetry/src/context.rs | 18 +- crates/tower-telemetry/src/lib.rs | 28 +++ crates/tower-telemetry/src/logging.rs | 147 +++++++++------ crates/tower-version/Cargo.toml | 2 +- crates/tower-version/src/lib.rs | 4 +- 31 files changed, 296 insertions(+), 278 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 759492a9..19411dd5 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -52,15 +52,6 @@ dependencies = [ "subtle", ] -[[package]] -name = "aho-corasick" -version = "1.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e60d3430d3a69478ad0993f19238d2df97c507009a52b3c10addcd7f6bcb916" -dependencies = [ - "memchr", -] - [[package]] name = "android-tzdata" version = "0.1.1" @@ -377,7 +368,6 @@ dependencies = [ "clap", "dirs", "futures", - "log", "serde", "serde_json", "snafu", @@ -385,6 +375,7 @@ dependencies = [ "tokio", "toml", "tower-api", + "tower-telemetry", "url", ] @@ -653,29 +644,6 @@ version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c34f04666d835ff5d62e058c3995147c06f42fe86ff053337632bca83e42702d" -[[package]] -name = "env_filter" -version = "0.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "186e05a59d4c50738528153b83b0b0194d3a29507dfec16eccd4b342903397d0" -dependencies = [ - "log", - "regex", -] - -[[package]] -name = "env_logger" -version = "0.11.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "13c863f0904021b108aa8b2f55046443e6b1ebde8fd4a15c399893aae4fa069f" -dependencies = [ - "anstream", - "anstyle", - "env_filter", - "jiff", - "log", -] - [[package]] name = "equivalent" version = "1.0.2" @@ -1317,30 +1285,6 @@ version = "1.0.15" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4a5f13b858c8d314ee3e8f639011f7ccefe71f97f96e50151fb991f267928e2c" -[[package]] -name = "jiff" -version = "0.2.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e5ad87c89110f55e4cd4dc2893a9790820206729eaf221555f742d540b0724a0" -dependencies = [ - "jiff-static", - "log", - "portable-atomic", - "portable-atomic-util", - "serde", -] - -[[package]] -name = "jiff-static" -version = "0.2.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d076d5b64a7e2fe6f0743f02c43ca4a6725c0f904203bfe276a5b3e793103605" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.100", -] - [[package]] name = "jni" version = "0.21.1" @@ -1541,6 +1485,16 @@ dependencies = [ "memoffset", ] +[[package]] +name = "nu-ansi-term" +version = "0.46.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "77a8165726e8236064dbb45459242600304b42a5ea24ee2948e18e023bf7ba84" +dependencies = [ + "overload", + "winapi", +] + [[package]] name = "num-bigint-dig" version = "0.8.4" @@ -1594,15 +1548,6 @@ dependencies = [ "libm", ] -[[package]] -name = "num_threads" -version = "0.1.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5c7398b9c8b70908f6371f47ed36737907c87c52af34c268fed0bf0ceb92ead9" -dependencies = [ - "libc", -] - [[package]] name = "number_prefix" version = "0.4.0" @@ -1715,6 +1660,12 @@ version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "04744f49eae99ab78e0d5c0b603ab218f515ea8cfe5a456d7629ad883a3b6e7d" +[[package]] +name = "overload" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b15813163c1d831bf4a13c3610c05c0d03b39feb07f7e09fa234dac9b15aaf39" + [[package]] name = "parking_lot" version = "0.12.3" @@ -1820,15 +1771,6 @@ version = "1.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "350e9b48cbc6b0e028b0473b114454c6316e57336ee184ceab6e53f72c178b3e" -[[package]] -name = "portable-atomic-util" -version = "0.2.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d8a2f0d8d040d7848a709caf78912debcc3f33ee4b3cac47d73d1e1069e83507" -dependencies = [ - "portable-atomic", -] - [[package]] name = "powerfmt" version = "0.2.0" @@ -1946,35 +1888,6 @@ dependencies = [ "thiserror", ] -[[package]] -name = "regex" -version = "1.11.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b544ef1b4eac5dc2db33ea63606ae9ffcfac26c1416a2806ae0bf5f56b201191" -dependencies = [ - "aho-corasick", - "memchr", - "regex-automata", - "regex-syntax", -] - -[[package]] -name = "regex-automata" -version = "0.4.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "809e8dc61f6de73b46c85f4c96486310fe304c434cfa43669d7b40f711150908" -dependencies = [ - "aho-corasick", - "memchr", - "regex-syntax", -] - -[[package]] -name = "regex-syntax" -version = "0.8.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2b15c43186be67a4fd63bee50d0303afffcef381492ebe2c5d87f324e1b8815c" - [[package]] name = "reqwest" version = "0.12.15" @@ -2336,6 +2249,15 @@ dependencies = [ "digest", ] +[[package]] +name = "sharded-slab" +version = "0.1.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f40ca3c46823713e0d4209592e8d6e826aa57e928f09752619fc696c499637f6" +dependencies = [ + "lazy_static", +] + [[package]] name = "shlex" version = "1.3.0" @@ -2361,18 +2283,6 @@ dependencies = [ "rand_core", ] -[[package]] -name = "simple_logger" -version = "5.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e8c5dfa5e08767553704aa0ffd9d9794d527103c736aba9854773851fd7497eb" -dependencies = [ - "colored", - "log", - "time", - "windows-sys 0.48.0", -] - [[package]] name = "slab" version = "0.4.9" @@ -2606,6 +2516,16 @@ dependencies = [ "syn 2.0.100", ] +[[package]] +name = "thread_local" +version = "1.1.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b9ef9bad013ada3808854ceac7b46812a6465ba368859a37e2100283d2d719c" +dependencies = [ + "cfg-if", + "once_cell", +] + [[package]] name = "time" version = "0.3.41" @@ -2614,9 +2534,7 @@ checksum = "8a7619e19bc266e0f9c5e6686659d394bc57973859340060a69221e57dbc0c40" dependencies = [ "deranged", "itoa", - "libc", "num-conv", - "num_threads", "powerfmt", "serde", "time-core", @@ -2810,12 +2728,12 @@ dependencies = [ name = "tower-api" version = "0.3.14" dependencies = [ - "log", "reqwest", "serde", "serde_json", "serde_repr", "serde_with", + "tower-telemetry", "url", ] @@ -2834,14 +2752,12 @@ dependencies = [ "futures-util", "http", "indicatif", - "log", "promptly", "reqwest", "rpassword", "rsa", "serde", "serde_json", - "simple_logger", "snafu", "spinners", "tokio", @@ -2849,6 +2765,7 @@ dependencies = [ "tower-api", "tower-package", "tower-runtime", + "tower-telemetry", "tower-version", "webbrowser", ] @@ -2865,9 +2782,7 @@ version = "0.3.14" dependencies = [ "async-compression", "config", - "env_logger", "glob", - "log", "serde", "serde_json", "snafu", @@ -2876,6 +2791,7 @@ dependencies = [ "tokio-stream", "tokio-tar", "tokio-util", + "tower-telemetry", ] [[package]] @@ -2883,10 +2799,10 @@ name = "tower-runtime" version = "0.3.14" dependencies = [ "chrono", - "log", "snafu", "tokio", "tower-package", + "tower-telemetry", ] [[package]] @@ -2900,6 +2816,7 @@ name = "tower-telemetry" version = "0.3.14" dependencies = [ "tracing", + "tracing-subscriber", ] [[package]] @@ -2909,9 +2826,9 @@ dependencies = [ "anyhow", "chrono", "config", - "log", "reqwest", "serde_json", + "tower-telemetry", ] [[package]] @@ -2943,6 +2860,32 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e672c95779cf947c5311f83787af4fa8fffd12fb27e4993211a84bdfd9610f9c" dependencies = [ "once_cell", + "valuable", +] + +[[package]] +name = "tracing-log" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ee855f1f400bd0e5c02d150ae5de3840039a3f54b025156404e34c23c03f47c3" +dependencies = [ + "log", + "once_cell", + "tracing-core", +] + +[[package]] +name = "tracing-subscriber" +version = "0.3.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e8189decb5ac0fa7bc8b96b7cb9b2701d60d48805aca84a238004d665fcc4008" +dependencies = [ + "nu-ansi-term", + "sharded-slab", + "smallvec", + "thread_local", + "tracing-core", + "tracing-log", ] [[package]] @@ -3033,6 +2976,12 @@ version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "06abde3611657adf66d383f00b093d7faecc7fa57071cce2578660c9f1010821" +[[package]] +name = "valuable" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba73ea9cf16a25df0c8caa16c51acb937d5712a8429db78a3ee29d5dcacd3a65" + [[package]] name = "vcpkg" version = "0.2.15" diff --git a/Cargo.toml b/Cargo.toml index 5438fdf3..f144a738 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -26,13 +26,11 @@ colored = "2" config = { path = "crates/config" } crypto = { path = "crates/crypto" } dirs = "5" -env_logger = "*" futures = "0.3" futures-util = "0.3" glob = "0.3" http = "1.1" indicatif = "0.17" -log = { version = "0.4", features = ["kv"] } pem = "3" promptly = "0.3" rand = "0.8" @@ -46,7 +44,6 @@ rsa = "0.9" serde = "1" serde_json = "1.0" sha2 = "0.10" -simple_logger = "5" snafu = "0.7" spinners = "4" testutils = { path = "crates/testutils" } @@ -63,6 +60,7 @@ tower-package = { path = "crates/tower-package" } tower-runtime = { path = "crates/tower-runtime" } tower-telemetry = { path = "crates/tower-telemetry" } tracing = { version = "0.1" } +tracing-subscriber = { version = "0.3" } url = { version = "2", features = ["serde"] } webbrowser = "1" diff --git a/crates/config/Cargo.toml b/crates/config/Cargo.toml index 4c4c9499..a16d2f0e 100644 --- a/crates/config/Cargo.toml +++ b/crates/config/Cargo.toml @@ -11,7 +11,6 @@ chrono = { workspace = true } clap = { workspace = true } dirs = { workspace = true } futures = { workspace = true } -log = { workspace = true } serde = { workspace = true } serde_json = { workspace = true } snafu = { workspace = true } @@ -20,3 +19,4 @@ toml = { workspace = true } testutils = { workspace = true } url = { workspace = true } tower-api = { workspace = true } +tower-telemetry = { workspace = true } diff --git a/crates/config/src/error.rs b/crates/config/src/error.rs index df8627f1..3f4479dd 100644 --- a/crates/config/src/error.rs +++ b/crates/config/src/error.rs @@ -1,4 +1,5 @@ use snafu::prelude::*; +use tower_telemetry::debug; #[derive(Debug, Snafu)] pub enum Error { @@ -43,8 +44,7 @@ impl From for Error { impl From for Error { fn from(err: toml::de::Error) -> Self { - log::debug!("error parsing Towerfile TOMl: {}", err); - println!("error parsing Towerfile TOML: {}", err); + debug!("error parsing Towerfile TOMl: {}", err); Error::InvalidTowerfile } } diff --git a/crates/config/src/session.rs b/crates/config/src/session.rs index de58b30e..ca4203fd 100644 --- a/crates/config/src/session.rs +++ b/crates/config/src/session.rs @@ -7,6 +7,7 @@ use url::Url; use crate::error::Error; use tower_api::apis::default_api::describe_session; +use tower_telemetry::debug; const DEFAULT_TOWER_URL: &str = "https://api.tower.dev"; @@ -81,16 +82,16 @@ pub fn get_last_version_check_timestamp() -> DateTime { if let Ok(dt) = DateTime::parse_from_rfc3339(&last_version_check) { dt.into() } else { - log::debug!("Error parsing last version check timestamp: {}", last_version_check); + debug!("Error parsing last version check timestamp: {}", last_version_check); default } } else { - log::debug!("Error reading last version check timestamp"); + debug!("Error reading last version check timestamp"); default } }, Err(err) => { - log::debug!("Error finding config dir: {}", err); + debug!("Error finding config dir: {}", err); default } } @@ -102,11 +103,11 @@ pub fn set_last_version_check_timestamp(dt: DateTime) { let dt_str = dt.to_rfc3339(); if let Err(err) = fs::write(path.join("last_version_check.txt"), dt_str) { - log::debug!("Error writing last version check timestamp: {}", err); + debug!("Error writing last version check timestamp: {}", err); } }, Err(err) => { - log::debug!("Error finding config dir: {}", err); + debug!("Error finding config dir: {}", err); } } } @@ -294,13 +295,13 @@ impl Session { Ok(session) } tower_api::apis::default_api::DescribeSessionSuccess::UnknownValue(val) => { - log::error!("Unknown value while describing session: {}", val); + debug!("Unknown value while describing session: {}", val); Err(Error::UnknownDescribeSessionValue { value: val }) } } } Err(err) => { - log::error!("Error describing session: {}", err); + debug!("Error describing session: {}", err); Err(Error::DescribeSessionError { err }) } } diff --git a/crates/config/src/towerfile.rs b/crates/config/src/towerfile.rs index f9edd378..103bf3bb 100644 --- a/crates/config/src/towerfile.rs +++ b/crates/config/src/towerfile.rs @@ -1,6 +1,7 @@ use crate::Error; use serde::Deserialize; use std::path::PathBuf; +use tower_telemetry::debug; #[derive(Deserialize, Debug)] pub struct Parameter{ @@ -88,7 +89,7 @@ impl Towerfile { // We set the workspace to the directory of the Towerfile if it's not set because that's // the implicit behavior overall for legacy Towerfiles. if towerfile.app.workspace.as_os_str().is_empty() { - log::debug!("Setting workspace to the directory of the Towerfile"); + debug!("Setting workspace to the directory of the Towerfile"); towerfile.app.workspace = towerfile.file_path .parent() .map(|p| p.to_path_buf()) diff --git a/crates/tower-api/Cargo.toml b/crates/tower-api/Cargo.toml index b524ab77..6ed715af 100644 --- a/crates/tower-api/Cargo.toml +++ b/crates/tower-api/Cargo.toml @@ -7,10 +7,10 @@ rust-version = { workspace = true } license = { workspace = true } [dependencies] -log = { workspace = true } serde = { version = "^1.0", features = ["derive"] } serde_with = { version = "^3.8", default-features = false, features = ["base64", "std", "macros"] } serde_json = "^1.0" serde_repr = "^0.1" url = "^2.5" reqwest = { version = "^0.12", default-features = false, features = ["json", "multipart"] } +tower-telemetry = { workspace = true } diff --git a/crates/tower-cmd/Cargo.toml b/crates/tower-cmd/Cargo.toml index 9f57eb04..4a973752 100644 --- a/crates/tower-cmd/Cargo.toml +++ b/crates/tower-cmd/Cargo.toml @@ -15,14 +15,12 @@ crypto = { workspace = true } futures-util = { workspace = true } http = { workspace = true } indicatif = { workspace = true } -log = { workspace = true } promptly = { workspace = true } reqwest = { workspace = true } rpassword = { workspace = true } rsa = { workspace = true } serde = { workspace = true } serde_json = { workspace = true } -simple_logger = { workspace = true } snafu = { workspace = true } spinners = { workspace = true } tokio = { workspace = true } @@ -30,5 +28,6 @@ tokio-util = { workspace = true } tower-api = { workspace = true } tower-package = { workspace = true } tower-runtime = { workspace = true } +tower-telemetry = { workspace = true } tower-version = { path = "../tower-version" } webbrowser = { workspace = true } diff --git a/crates/tower-cmd/src/api.rs b/crates/tower-cmd/src/api.rs index 819b8efe..ef742d45 100644 --- a/crates/tower-cmd/src/api.rs +++ b/crates/tower-cmd/src/api.rs @@ -3,6 +3,7 @@ use config::Config; use http::StatusCode; use std::collections::HashMap; use tower_api::apis::ResponseContent; +use tower_telemetry::debug; /// Helper trait to extract the successful response data from API responses pub trait ResponseEntity { @@ -209,8 +210,8 @@ where { match api_call.await { Ok(response) => { - log::debug!("tower trace ID: {}", response.tower_trace_id); - log::debug!("Response from server: {}", response.content); + debug!("tower trace ID: {}", response.tower_trace_id); + debug!("Response from server: {}", response.content); if let Some(entity) = response.entity { if let Some(data) = entity.extract_data() { diff --git a/crates/tower-cmd/src/deploy.rs b/crates/tower-cmd/src/deploy.rs index 5c0a888b..2f238be8 100644 --- a/crates/tower-cmd/src/deploy.rs +++ b/crates/tower-cmd/src/deploy.rs @@ -5,6 +5,7 @@ use std::path::PathBuf; use crate::{output, util}; use tower_package::{Package, PackageSpec}; +use tower_telemetry::debug; use tower_api::apis::configuration::Configuration; pub fn deploy_cmd() -> Command { @@ -30,7 +31,7 @@ fn resolve_path(args: &ArgMatches) -> PathBuf { pub async fn do_deploy(config: Config, args: &ArgMatches) { // Determine the directory to build the package from let dir = resolve_path(args); - log::debug!("Building package from directory: {:?}", dir); + debug!("Building package from directory: {:?}", dir); let path = dir.join("Towerfile"); diff --git a/crates/tower-cmd/src/error.rs b/crates/tower-cmd/src/error.rs index 7ba35b0a..fab554d3 100644 --- a/crates/tower-cmd/src/error.rs +++ b/crates/tower-cmd/src/error.rs @@ -1,4 +1,5 @@ use snafu::prelude::*; +use tower_telemetry::debug; #[derive(Debug, Snafu)] pub enum Error { @@ -14,7 +15,7 @@ pub enum Error { impl From for Error { fn from(err: crypto::Error) -> Self { - log::debug!("cryptography error: {:?}", err); + debug!("cryptography error: {:?}", err); Self::CryptographyError } } diff --git a/crates/tower-cmd/src/lib.rs b/crates/tower-cmd/src/lib.rs index 76906b5c..1c5d4874 100644 --- a/crates/tower-cmd/src/lib.rs +++ b/crates/tower-cmd/src/lib.rs @@ -57,17 +57,11 @@ impl App { config.clone() }; - // Setup logging - simple_logger::SimpleLogger::new() - .with_module_level("rustyline", log::LevelFilter::Warn) - .env() - .init() - .unwrap(); - if config.debug { - log::set_max_level(log::LevelFilter::Debug); + // Set log level to "DEBUG" + tower_telemetry::enable_logging(tower_telemetry::LogLevel::Debug); } else { - log::set_max_level(log::LevelFilter::Info); + tower_telemetry::enable_logging(tower_telemetry::LogLevel::Warn); } // Check for newer version only if we successfully get a latest version diff --git a/crates/tower-cmd/src/output.rs b/crates/tower-cmd/src/output.rs index 1496c4bc..c60a11f0 100644 --- a/crates/tower-cmd/src/output.rs +++ b/crates/tower-cmd/src/output.rs @@ -13,6 +13,7 @@ use tower_api::{ }, models::ErrorModel, }; +use tower_telemetry::debug; const BANNER_TEXT: &str = include_str!("./banner.txt"); @@ -120,13 +121,13 @@ fn output_response_content_error(err: ResponseContent) { let error_model: ErrorModel = match serde_json::from_str(&err.content) { Ok(model) => model, Err(e) => { - log::debug!("Failed to parse error content as JSON: {}", e); - log::debug!("Raw error content: {}", err.content); + debug!("Failed to parse error content as JSON: {}", e); + debug!("Raw error content: {}", err.content); error("An unexpected error occurred while processing the response."); return; } }; - log::debug!("Error model (status: {}): {:?}", err.status, error_model); + debug!("Error model (status: {}): {:?}", err.status, error_model); match err.status { StatusCode::CONFLICT => { @@ -186,15 +187,15 @@ pub fn tower_error(err: ApiError) { output_response_content_error(resp); } ApiError::Reqwest(e) => { - log::debug!("Reqwest error: {:?}", e); + debug!("Reqwest error: {:?}", e); error("The Tower CLI wasn't able to talk to the Tower API! Are you offline? Try again later."); } ApiError::Serde(e) => { - log::debug!("Serde error: {:?}", e); + debug!("Serde error: {:?}", e); error("The Tower API returned something that the Tower CLI didn't understand. Maybe you need to upgrade Tower CLI?"); } ApiError::Io(e) => { - log::debug!("Io error: {:?}", e); + debug!("Io error: {:?}", e); error("An error happened while talking to the Tower API. You can try that again in a bit."); } } diff --git a/crates/tower-cmd/src/run.rs b/crates/tower-cmd/src/run.rs index 4b5385cb..d4c10452 100644 --- a/crates/tower-cmd/src/run.rs +++ b/crates/tower-cmd/src/run.rs @@ -4,6 +4,7 @@ use std::collections::HashMap; use std::path::PathBuf; use tower_package::{Package, PackageSpec}; use tower_runtime::{local::LocalApp, App, AppLauncher, OutputReceiver}; +use tower_telemetry::debug; use crate::{ output, @@ -52,7 +53,7 @@ pub async fn do_run(config: Config, args: &ArgMatches, cmd: Option<(&str, &ArgMa match res { Ok((local, path, params, app_name)) => { - log::debug!( + debug!( "Running app at {}, local: {}", path.to_str().unwrap(), local @@ -118,7 +119,7 @@ async fn do_run_local(config: Config, path: PathBuf, mut params: HashMap { spinner.failure(); - log::debug!("Failed to schedule run: {}", err); + debug!("Failed to schedule run: {}", err); output::tower_error(err); }, Ok(res) => { @@ -305,7 +306,7 @@ async fn get_catalogs(config: &Config, env: &str) -> Result Towerfile { Towerfile::from_path(path.clone()).unwrap_or_else(|err| { - log::debug!("Failed to load Towerfile from path `{:?}`: {}", path, err); + debug!("Failed to load Towerfile from path `{:?}`: {}", path, err); output::config_error(err); std::process::exit(1); }) @@ -323,7 +324,7 @@ async fn build_package(towerfile: &Towerfile) -> Package { } Err(err) => { spinner.failure(); - log::debug!("Failed to build package: {}", err); + debug!("Failed to build package: {}", err); output::package_error(err); std::process::exit(1); } diff --git a/crates/tower-cmd/src/secrets.rs b/crates/tower-cmd/src/secrets.rs index 1cfb16ca..ef47a0ea 100644 --- a/crates/tower-cmd/src/secrets.rs +++ b/crates/tower-cmd/src/secrets.rs @@ -11,6 +11,7 @@ use tower_api::{ }, models::CreateSecretResponse, }; +use tower_telemetry::debug; use crate::{ output, @@ -86,7 +87,7 @@ pub async fn do_list(config: Config, args: &ArgMatches) { let show = cmd::get_bool_flag(args, "show"); let env = cmd::get_string_flag(args, "environment"); - log::debug!("listing secrets, environment={} all={} show={}", env, all, show); + debug!("listing secrets, environment={} all={} show={}", env, all, show); if show { let (private_key, public_key) = crypto::generate_key_pair(); @@ -157,7 +158,7 @@ pub async fn do_create(config: Config, args: &ArgMatches) { output::success(&line); }, Err(err) => { - log::debug!("Failed to create secrets: {}", err); + debug!("Failed to create secrets: {}", err); spinner.failure(); } } @@ -165,7 +166,7 @@ pub async fn do_create(config: Config, args: &ArgMatches) { pub async fn do_delete(config: Config, args: &ArgMatches) { let (environment, name) = extract_secret_environment_and_name("delete", args.subcommand()); - log::debug!("deleting secret, environment={} name={}", environment, name); + debug!("deleting secret, environment={} name={}", environment, name); let mut spinner = output::spinner("Deleting secret..."); @@ -209,7 +210,7 @@ async fn encrypt_and_create_secret( api::create_secret(&config, name, environment, &encrypted_value, &preview).await }, Err(err) => { - log::debug!("failed to talk to tower api: {}", err); + debug!("failed to talk to tower api: {}", err); output::die("There was a problem with the Tower API! Please try again later."); } } diff --git a/crates/tower-cmd/src/session.rs b/crates/tower-cmd/src/session.rs index 75084060..bb847f7a 100644 --- a/crates/tower-cmd/src/session.rs +++ b/crates/tower-cmd/src/session.rs @@ -3,6 +3,7 @@ use clap::Command; use config::{Config, Session}; use tokio::{time, time::Duration}; use tower_api::models::CreateDeviceLoginTicketResponse; +use tower_telemetry::debug; use crate::api; @@ -33,7 +34,7 @@ async fn handle_device_login( ) { // Try to open the login URL in browser if let Err(err) = webbrowser::open(&claim.login_url) { - log::debug!("failed to open web browser: {}", err); + debug!("failed to open web browser: {}", err); let line = format!( "Please open the following URL in your browser: {}\n", @@ -41,7 +42,7 @@ async fn handle_device_login( ); output::write(&line); } else { - log::debug!("opened browser to {}", claim.login_url); + debug!("opened browser to {}", claim.login_url); } let mut spinner = output::spinner("Waiting for login..."); diff --git a/crates/tower-cmd/src/teams.rs b/crates/tower-cmd/src/teams.rs index cabdae3b..121bdf8b 100644 --- a/crates/tower-cmd/src/teams.rs +++ b/crates/tower-cmd/src/teams.rs @@ -1,6 +1,7 @@ use clap::{ArgMatches, Command}; use colored::*; use config::Config; +use tower_telemetry::debug; use crate::{ output, @@ -48,7 +49,7 @@ async fn refresh_session(config: &Config) -> config::Session { session }, Err(err) => { - log::debug!("Failed to refresh session: {}", err); + debug!("Failed to refresh session: {}", err); spinner.failure(); output::die("There was a problem talking to the Tower API. Try again later!"); diff --git a/crates/tower-cmd/src/util/deploy.rs b/crates/tower-cmd/src/util/deploy.rs index bd5a5353..1459902a 100644 --- a/crates/tower-cmd/src/util/deploy.rs +++ b/crates/tower-cmd/src/util/deploy.rs @@ -5,6 +5,7 @@ use std::sync::{Arc, Mutex}; use tokio::fs::File; use tokio_util::io::ReaderStream; use tower_package::Package; +use tower_telemetry::debug; use tower_api::apis::configuration::Configuration; use tower_api::apis::ResponseContent; @@ -86,7 +87,7 @@ pub async fn deploy_app_package( // Get the package file path let package_path = package.package_file_path.unwrap_or_else(|| { - log::debug!("No package file path found"); + debug!("No package file path found"); output::die("An error happened in Tower CLI that it couldn't recover from."); }); diff --git a/crates/tower-package/Cargo.toml b/crates/tower-package/Cargo.toml index e052d468..181c4f0d 100644 --- a/crates/tower-package/Cargo.toml +++ b/crates/tower-package/Cargo.toml @@ -10,7 +10,6 @@ license = { workspace = true } async-compression = { workspace = true } config = { workspace = true } glob = { workspace = true } -log = { workspace = true } serde = { workspace = true } serde_json = { workspace = true } snafu = { workspace = true } @@ -19,6 +18,4 @@ tokio = { workspace = true } tokio-stream = { workspace = true } tokio-tar = { workspace = true } tokio-util = { workspace = true } - -[dev-dependencies] -env_logger = { workspace = true } +tower-telemetry = { workspace = true } diff --git a/crates/tower-package/src/error.rs b/crates/tower-package/src/error.rs index d7c4e427..97cd1e77 100644 --- a/crates/tower-package/src/error.rs +++ b/crates/tower-package/src/error.rs @@ -1,4 +1,5 @@ use snafu::prelude::*; +use tower_telemetry::debug; #[derive(Debug, Snafu)] pub enum Error { @@ -14,14 +15,14 @@ pub enum Error { impl From for Error { fn from(err: std::io::Error) -> Self { - log::debug!("IO error: {}", err); + debug!("IO error: {}", err); Error::NoManifest } } impl From for Error { fn from(err: serde_json::Error) -> Self { - log::debug!("JSON error: {}", err); + debug!("JSON error: {}", err); Error::InvalidManifest } } diff --git a/crates/tower-package/src/lib.rs b/crates/tower-package/src/lib.rs index ee4c7513..8cce905c 100644 --- a/crates/tower-package/src/lib.rs +++ b/crates/tower-package/src/lib.rs @@ -13,6 +13,8 @@ use tmpdir::TmpDir; use async_compression::tokio::write::GzipEncoder; use async_compression::tokio::bufread::GzipDecoder; +use tower_telemetry::debug; + mod error; pub use error::Error; @@ -85,7 +87,7 @@ fn get_parameters(towerfile: &Towerfile) -> Vec { impl PackageSpec { pub fn from_towerfile(towerfile: &Towerfile) -> Self { - log::debug!("creating package spec from towerfile: {:?}", towerfile); + debug!("creating package spec from towerfile: {:?}", towerfile); let towerfile_path = towerfile.file_path.clone(); let base_dir = towerfile.app.workspace.clone(); @@ -154,7 +156,7 @@ impl Package { // The underlying package is just a TAR file with a special `MANIFEST` file that has also been // GZip'd. pub async fn build(spec: PackageSpec) -> Result { - log::debug!("building package from spec: {:?}", spec); + debug!("building package from spec: {:?}", spec); // we canonicalize this because we want to treat all paths in the same keyspace more or // less. @@ -162,7 +164,7 @@ impl Package { let tmp_dir = TmpDir::new("tower-package").await?; let package_path = tmp_dir.to_path_buf().join("package.tar"); - log::debug!("building package at: {:?}", package_path); + debug!("building package at: {:?}", package_path); let file = File::create(package_path.clone()).await?; let gzip = GzipEncoder::new(file); @@ -171,14 +173,14 @@ impl Package { for file_glob in spec.file_globs { let path = base_dir.join(file_glob); let path_str = extract_glob_path(path); - log::debug!("resolving glob pattern: {}", path_str); + debug!("resolving glob pattern: {}", path_str); for entry in glob(&path_str).unwrap() { let physical_path = entry.unwrap() .canonicalize() .unwrap(); - log::debug!(" - adding file: {:?}", physical_path); + debug!(" - adding file: {:?}", physical_path); // turn this back in to a path that is relative to the TAR file root let cp = physical_path.clone(); diff --git a/crates/tower-package/tests/package_test.rs b/crates/tower-package/tests/package_test.rs index d74aa30d..033bdc18 100644 --- a/crates/tower-package/tests/package_test.rs +++ b/crates/tower-package/tests/package_test.rs @@ -12,14 +12,11 @@ use async_compression::tokio::bufread::GzipDecoder; use tokio_tar::Archive; use tower_package::{Package, PackageSpec}; +use tower_telemetry::debug; use config::Towerfile; #[tokio::test] async fn it_creates_package() { - // We enable env_logger here as a way of debugging this test. There might be a way of doing - // this globally...but I don't know what it is. - let _ = env_logger::try_init(); - let tmp_dir = TmpDir::new("example").await.expect("Failed to create temp dir"); create_test_file(tmp_dir.to_path_buf(), "Towerfile", "").await; create_test_file(tmp_dir.to_path_buf(), "main.py", "print('Hello, world!')").await; @@ -50,10 +47,6 @@ async fn it_creates_package() { #[tokio::test] async fn it_respects_complex_file_globs() { - // We enable env_logger here as a way of debugging this test. There might be a way of doing - // this globally...but I don't know what it is. - let _ = env_logger::try_init(); - let tmp_dir = TmpDir::new("example").await.expect("Failed to create temp dir"); create_test_file(tmp_dir.to_path_buf(), "Towerfile", "").await; create_test_file(tmp_dir.to_path_buf(), "main.py", "print('Hello, world!')").await; @@ -90,8 +83,6 @@ async fn it_respects_complex_file_globs() { #[tokio::test] async fn it_respects_workspace_settings() { - let _ = env_logger::try_init(); - let tmp_dir = TmpDir::new("example").await.expect("Failed to create temp dir"); create_test_file(tmp_dir.to_path_buf(), "app/Towerfile", "").await; create_test_file(tmp_dir.to_path_buf(), "app/main.py", "print('Hello, world!')").await; @@ -182,7 +173,7 @@ async fn create_test_file(tempdir: PathBuf, path: &str, contents: &str) { } } - log::debug!("creating test file at: {:?} with content {:?}", path, contents); + debug!("creating test file at: {:?} with content {:?}", path, contents); let mut file = File::create(&path).await.expect("Failed to create file"); file.write_all(contents.as_bytes()).await.expect("Failed to write content to file") } diff --git a/crates/tower-runtime/Cargo.toml b/crates/tower-runtime/Cargo.toml index 5c42d871..184a5be6 100644 --- a/crates/tower-runtime/Cargo.toml +++ b/crates/tower-runtime/Cargo.toml @@ -9,6 +9,6 @@ license = { workspace = true } [dependencies] chrono = { workspace = true } tokio = { workspace = true } -log = { workspace = true } snafu = { workspace = true } tower-package = { workspace = true } +tower-telemetry = { workspace = true } diff --git a/crates/tower-runtime/src/lib.rs b/crates/tower-runtime/src/lib.rs index 39f26cf0..a04a7fea 100644 --- a/crates/tower-runtime/src/lib.rs +++ b/crates/tower-runtime/src/lib.rs @@ -11,6 +11,7 @@ use tokio::sync::mpsc::{ use chrono::{DateTime, Utc}; use tower_package::Package; +use tower_telemetry::debug; pub mod local; pub mod errors; @@ -128,7 +129,7 @@ impl AppLauncher { pub async fn terminate(&mut self) -> Result<(), Error> { if let Some(app) = &mut self.app { if let Err(err) = app.terminate().await { - log::debug!("failed to terminate app: {}", err); + debug!("failed to terminate app: {}", err); Err(err) } else { self.app = None; diff --git a/crates/tower-runtime/src/local.rs b/crates/tower-runtime/src/local.rs index 054d668a..91f8f43d 100644 --- a/crates/tower-runtime/src/local.rs +++ b/crates/tower-runtime/src/local.rs @@ -25,6 +25,7 @@ use tokio::{ }; use tower_package::{Manifest, Package}; +use tower_telemetry::debug; use crate::{ FD, @@ -132,7 +133,7 @@ impl App for LocalApp { .to_path_buf(); let mut python_path = find_python(None).await?; - log::debug!("using system python at {:?}", python_path); + debug!("using system python at {:?}", python_path); // set for later on. let working_dir = if let Some(dir) = opts.cwd { @@ -144,7 +145,7 @@ impl App for LocalApp { let mut is_virtualenv = false; if Path::new(&package_path.join("requirements.txt")).exists() { - log::debug!("requirements.txt file found. installing dependencies"); + debug!("requirements.txt file found. installing dependencies"); // There's a requirements.txt, so we'll create a new virtualenv and install the files // taht we want in there. @@ -169,7 +170,7 @@ impl App for LocalApp { // // TODO: Find a better way to operate in the context of a virtual env here. python_path = find_python(Some(working_dir.join(".venv").join("bin"))).await?; - log::debug!("using virtualenv python at {:?}", python_path); + debug!("using virtualenv python at {:?}", python_path); is_virtualenv = true; @@ -195,16 +196,16 @@ impl App for LocalApp { } - log::debug!("waiting for dependency installation to complete"); + debug!("waiting for dependency installation to complete"); // Wait for the child to complete entirely. child.wait().await.expect("child failed to exit"); } } else { - log::debug!("missing requirements.txt file found. no dependencies to install"); + debug!("missing requirements.txt file found. no dependencies to install"); } - log::debug!(" - working directory: {:?}", &working_dir); + debug!(" - working directory: {:?}", &working_dir); let res = if package.manifest.invoke.ends_with(".sh") { let manifest = &package.manifest; @@ -245,7 +246,7 @@ impl App for LocalApp { status: Mutex::new(None), }) } else { - log::error!("failed to spawn process: {}", res.err().unwrap()); + debug!("failed to spawn process: {}", res.err().unwrap()); Err(Error::SpawnFailed) } } @@ -282,7 +283,7 @@ impl App for LocalApp { let mut child = proc.lock().await; if let Err(err) = child.kill().await { - log::warn!("failed to terminate app: {}", err); + debug!("failed to terminate app: {}", err); Err(Error::TerminateFailed) } else { Ok(()) @@ -306,7 +307,7 @@ impl LocalApp { params: HashMap, other_env_vars: HashMap, ) -> Result { - log::debug!(" - python script {}", manifest.invoke); + debug!(" - python script {}", manifest.invoke); let child = Command::new(python_path) .current_dir(&cwd) @@ -333,9 +334,9 @@ impl LocalApp { other_env_vars: HashMap, ) -> Result { let bash_path = find_bash().await?; - log::debug!("using bash at {:?}", bash_path); + debug!("using bash at {:?}", bash_path); - log::debug!(" - bash script {}", manifest.invoke); + debug!(" - bash script {}", manifest.invoke); let child = Command::new(bash_path) .current_dir(&cwd) @@ -363,20 +364,20 @@ fn make_env_var_key(src: &str) -> String { fn make_env_vars(env: &str, cwd: &PathBuf, is_virtualenv: bool, secs: &HashMap, params: &HashMap, other_env_vars: &HashMap) -> HashMap { let mut res = HashMap::new(); - log::debug!("converting {} env variables", (params.len() + secs.len())); + debug!("converting {} env variables", (params.len() + secs.len())); for (key, value) in secs.into_iter() { - log::debug!("adding key {}", make_env_var_key(&key)); + debug!("adding key {}", make_env_var_key(&key)); res.insert(make_env_var_key(&key), value.to_string()); } for (key, value) in params.into_iter() { - log::debug!("adding key {}", make_env_var_key(&key)); + debug!("adding key {}", make_env_var_key(&key)); res.insert(key.to_string(), value.to_string()); } for (key, value) in other_env_vars.into_iter() { - log::debug!("adding key {}", &key); + debug!("adding key {}", &key); res.insert(key.to_string(), value.to_string()); } @@ -429,13 +430,13 @@ async fn wait_for_process(sx: oneshot::Sender, proc: Arc>) { break status.code().expect("no status code"); } else { // something went wrong. - log::error!("failed to get status due to some kind of IO error: {}" , res.err().expect("no error somehow")); + debug!("failed to get status due to some kind of IO error: {}" , res.err().expect("no error somehow")); break -1; } } }; - log::debug!("process exited with code {}", code); + debug!("process exited with code {}", code); // this just shuts up the compiler about ignoring the results. let _ = sx.send(code); diff --git a/crates/tower-telemetry/Cargo.toml b/crates/tower-telemetry/Cargo.toml index cba648f2..ad1fb53a 100644 --- a/crates/tower-telemetry/Cargo.toml +++ b/crates/tower-telemetry/Cargo.toml @@ -8,3 +8,4 @@ license = { workspace = true } [dependencies] tracing = { workspace = true } +tracing-subscriber = { workspace = true } diff --git a/crates/tower-telemetry/src/context.rs b/crates/tower-telemetry/src/context.rs index 68918892..559a2f81 100644 --- a/crates/tower-telemetry/src/context.rs +++ b/crates/tower-telemetry/src/context.rs @@ -1,5 +1,17 @@ - +#[derive(Debug, Clone, PartialEq, Eq)] pub struct Context { - /// run_id is the ID of the run in the current context. - run_id: Option, + /// runid is the ID of the run in the current context. + pub(crate) runid: Option, +} + +impl Context { + pub fn with_runid(runid: String) -> Self { + Self { + runid: Some(runid), + } + } + + pub fn new() -> Self { + Self { runid: None } + } } diff --git a/crates/tower-telemetry/src/lib.rs b/crates/tower-telemetry/src/lib.rs index ad9b5360..1afa8be1 100644 --- a/crates/tower-telemetry/src/lib.rs +++ b/crates/tower-telemetry/src/lib.rs @@ -2,3 +2,31 @@ pub mod logging; pub mod context; pub use context::Context; + +/// reexport tracing to make sure that it gets included everywhere. +pub use tracing; +use tracing_subscriber; + +pub enum LogLevel { + Debug, + Info, + Warn, + Error, +} + +impl Into for LogLevel { + fn into(self) -> tracing_subscriber::filter::LevelFilter { + match self { + LogLevel::Debug => tracing_subscriber::filter::LevelFilter::DEBUG, + LogLevel::Info => tracing_subscriber::filter::LevelFilter::INFO, + LogLevel::Warn => tracing_subscriber::filter::LevelFilter::WARN, + LogLevel::Error => tracing_subscriber::filter::LevelFilter::ERROR, + } + } +} + +pub fn enable_logging(level: LogLevel) { + tracing_subscriber::fmt() + .with_max_level(level) + .init(); +} diff --git a/crates/tower-telemetry/src/logging.rs b/crates/tower-telemetry/src/logging.rs index 8b071526..957c51f0 100644 --- a/crates/tower-telemetry/src/logging.rs +++ b/crates/tower-telemetry/src/logging.rs @@ -1,77 +1,110 @@ -use tracing::event; - -macro_rules! debug { - // Handle case with context, format string and arguments - ($ctx:expr, $fmt:expr, $($arg:tt)*) => { - if let Some(run_id) = $ctx.run_id { - event!(tracing::Level::DEBUG, runid = %run_id, "{}", format!($fmt, $($arg)*)); +#[macro_export] +macro_rules! event_with_level { + // With context + ($level:expr, ctx: $ctx:expr, $fmt:expr, $($arg:tt)*) => { + if let Some(runid) = $ctx.runid { + $crate::tracing::event!($level, runid = %runid, "{}", format!($fmt, $($arg)*)) } else { - event!(tracing::Level::DEBUG, "{}", format!($fmt, $($arg)*)); + $crate::tracing::event!($level, "{}", format!($fmt, $($arg)*)) } }; - // Handle case with context and just a message (no formatting) - ($ctx:expr, $msg:expr) => { - if let Some(run_id) = $ctx.run_id { - event!(tracing::Level::DEBUG, runid = %run_id, $msg); - } else { - event!(tracing::Level::DEBUG, "{}", $msg); - } + + // Without context + ($level:expr, $fmt:expr, $($arg:tt)*) => { + $crate::tracing::event!($level, "{}", format!($fmt, $($arg)*)) + }; +} + +#[macro_export] +macro_rules! debug { + // With context, format string and arguments + (ctx: $ctx:expr, $fmt:expr, $($arg:tt)*) => { + $crate::event_with_level!($crate::tracing::Level::DEBUG, $ctx, $fmt, $($arg)*) + }; + + // With context, just message + (ctx: $ctx:expr, $msg:expr) => { + $crate::event_with_level!($crate::tracing::Level::DEBUG, $ctx, "{}", $msg) + }; + + // Without context, format string and arguments + ($fmt:expr, $($arg:tt)*) => { + $crate::event_with_level!($crate::tracing::Level::DEBUG, $fmt, $($arg)*) + }; + + // Without context, just message + ($msg:expr) => { + $crate::event_with_level!($crate::tracing::Level::DEBUG, "{}", $msg) }; } +#[macro_export] macro_rules! info { - // Handle case with context, format string and arguments - ($ctx:expr, $fmt:expr, $($arg:tt)*) => { - if let Some(run_id) = $ctx.run_id { - event!(tracing::Level::INFO, runid = %run_id, "{}", format!($fmt, $($arg)*)); - } else { - event!(tracing::Level::INFO, "{}", format!($fmt, $($arg)*)); - } + // With context, format string and arguments + (ctx: $ctx:expr, $fmt:expr, $($arg:tt)*) => { + $crate::event_with_level!($crate::tracing::Level::INFO, $ctx, $fmt, $($arg)*) }; - // Handle case with context and just a message (no formatting) - ($ctx:expr, $msg:expr) => { - if let Some(run_id) = $ctx.run_id { - event!(tracing::Level::INFO, runid = %run_id, $msg); - } else { - event!(tracing::Level::INFO, "{}", $msg); - } + + // With context, just message + (ctx: $ctx:expr, $msg:expr) => { + $crate::event_with_level!($crate::tracing::Level::INFO, $ctx, "{}", $msg) + }; + + // Without context, format string and arguments + ($fmt:expr, $($arg:tt)*) => { + $crate::event_with_level!($crate::tracing::Level::INFO, $fmt, $($arg)*) + }; + + // Without context, just message + ($msg:expr) => { + $crate::event_with_level!($crate::tracing::Level::INFO, "{}", $msg) }; } +#[macro_export] macro_rules! warn { - // Handle case with context, format string and arguments - ($ctx:expr, $fmt:expr, $($arg:tt)*) => { - if let Some(run_id) = $ctx.run_id { - event!(tracing::Level::WARN, runid = %run_id, "{}", format!($fmt, $($arg)*)); - } else { - event!(tracing::Level::WARN, "{}", format!($fmt, $($arg)*)); - } + // With context, format string and arguments + (ctx: $ctx:expr, $fmt:expr, $($arg:tt)*) => { + $crate::event_with_level!($crate::tracing::Level::WARN, $ctx, $fmt, $($arg)*) }; - // Handle case with context and just a message (no formatting) - ($ctx:expr, $msg:expr) => { - if let Some(run_id) = $ctx.run_id { - event!(tracing::Level::WARN, runid = %run_id, $msg); - } else { - event!(tracing::Level::WARN, "{}", $msg); - } + + // With context, just message + (ctx: $ctx:expr, $msg:expr) => { + $crate::event_with_level!($crate::tracing::Level::WARN, $ctx, "{}", $msg) + }; + + // Without context, format string and arguments + ($fmt:expr, $($arg:tt)*) => { + $crate::event_with_level!($crate::tracing::Level::WARN, $fmt, $($arg)*) + }; + + // Without context, just message + ($msg:expr) => { + $crate::event_with_level!($crate::tracing::Level::WARN, "{}", $msg) }; } +#[macro_export] macro_rules! error { - // Handle case with context, format string and arguments - ($ctx:expr, $fmt:expr, $($arg:tt)*) => { - if let Some(run_id) = $ctx.run_id { - event!(tracing::Level::ERROR, runid = %run_id, "{}", format!($fmt, $($arg)*)); - } else { - event!(tracing::Level::ERROR, "{}", format!($fmt, $($arg)*)); - } + // With context, format string and arguments + (ctx: $ctx:expr, $fmt:expr, $($arg:tt)*) => { + $crate::event_with_level!($crate::tracing::Level::ERROR, $ctx, $fmt, $($arg)*) }; - // Handle case with context and just a message (no formatting) - ($ctx:expr, $msg:expr) => { - if let Some(run_id) = $ctx.run_id { - event!(tracing::Level::ERROR, runid = %run_id, $msg); - } else { - event!(tracing::Level::ERROR, "{}", $msg); - } + + // With context, just message + (ctx: $ctx:expr, $msg:expr) => { + $crate::event_with_level!($crate::tracing::Level::ERROR, $ctx, "{}", $msg) + }; + + // Without context, format string and arguments + ($fmt:expr, $($arg:tt)*) => { + $crate::event_with_level!($crate::tracing::Level::ERROR, $fmt, $($arg)*) + }; + + // Without context, just message + ($msg:expr) => { + $crate::event_with_level!($crate::tracing::Level::ERROR, "{}", $msg) }; } + + diff --git a/crates/tower-version/Cargo.toml b/crates/tower-version/Cargo.toml index ea04e519..7782ed4e 100644 --- a/crates/tower-version/Cargo.toml +++ b/crates/tower-version/Cargo.toml @@ -12,6 +12,6 @@ repository.workspace = true anyhow = { workspace = true } chrono = { workspace = true } config = { workspace = true } -log = { workspace = true } reqwest = { workspace = true } serde_json = { workspace = true } +tower-telemetry = { workspace = true } diff --git a/crates/tower-version/src/lib.rs b/crates/tower-version/src/lib.rs index 5dca2dc8..19813d41 100644 --- a/crates/tower-version/src/lib.rs +++ b/crates/tower-version/src/lib.rs @@ -1,8 +1,8 @@ use anyhow::Result; -use log; use reqwest; use serde_json::Value; use chrono::{Utc, Duration}; +use tower_telemetry::debug; pub fn current_version() -> &'static str { env!("CARGO_PKG_VERSION") @@ -28,7 +28,7 @@ pub async fn check_latest_version() -> Result> { .await?; let status = resp.status(); - log::debug!("PyPI returned status code: {}", status); + debug!("PyPI returned status code: {}", status); if status.is_success() { // Update the config so we don't check more often. From 48fdb4217e990a8aa824e1b65e786808453137a9 Mon Sep 17 00:00:00 2001 From: Brad Heller Date: Thu, 5 Jun 2025 15:09:42 -0700 Subject: [PATCH 3/7] chore: Instrument tower-runtime with context --- crates/tower-cmd/src/run.rs | 4 +- crates/tower-runtime/src/lib.rs | 3 ++ crates/tower-runtime/src/local.rs | 54 +++++++++++++++------------ crates/tower-telemetry/src/context.rs | 4 +- crates/tower-telemetry/src/logging.rs | 14 +++---- 5 files changed, 44 insertions(+), 35 deletions(-) diff --git a/crates/tower-cmd/src/run.rs b/crates/tower-cmd/src/run.rs index d4c10452..5d818769 100644 --- a/crates/tower-cmd/src/run.rs +++ b/crates/tower-cmd/src/run.rs @@ -4,7 +4,7 @@ use std::collections::HashMap; use std::path::PathBuf; use tower_package::{Package, PackageSpec}; use tower_runtime::{local::LocalApp, App, AppLauncher, OutputReceiver}; -use tower_telemetry::debug; +use tower_telemetry::{Context, debug}; use crate::{ output, @@ -131,7 +131,7 @@ async fn do_run_local(config: Config, path: PathBuf, mut params: HashMap = AppLauncher::default(); if let Err(err) = launcher - .launch(sender, package, env, secrets, params, catalogs) + .launch(Context::new(), sender, package, env, secrets, params, catalogs) .await { output::runtime_error(err); diff --git a/crates/tower-runtime/src/lib.rs b/crates/tower-runtime/src/lib.rs index a04a7fea..4384521d 100644 --- a/crates/tower-runtime/src/lib.rs +++ b/crates/tower-runtime/src/lib.rs @@ -92,6 +92,7 @@ pub fn create_output_stream() -> (OutputSender, OutputReceiver) { impl AppLauncher { pub async fn launch( &mut self, + ctx: tower_telemetry::Context, output_sender: OutputSender, package: Package, environment: String, @@ -102,6 +103,7 @@ impl AppLauncher { let cwd = package.unpacked_path.clone().unwrap().to_path_buf(); let opts = StartOptions { + ctx, output_sender: Some(output_sender), cwd: Some(cwd), environment, @@ -143,6 +145,7 @@ impl AppLauncher { } pub struct StartOptions { + pub ctx: tower_telemetry::Context, pub package: Package, pub cwd: Option, pub environment: String, diff --git a/crates/tower-runtime/src/local.rs b/crates/tower-runtime/src/local.rs index 91f8f43d..9160056c 100644 --- a/crates/tower-runtime/src/local.rs +++ b/crates/tower-runtime/src/local.rs @@ -35,6 +35,8 @@ use crate::{ }; pub struct LocalApp { + ctx: tower_telemetry::Context, + // LocalApp needs to take ownership of the package as a way of taking responsibility for it's // lifetime and, most importantly, it's contents. The compiler complains that we never actually // use this struct member, so we allow the dead_code attribute to silence the warning. @@ -125,6 +127,7 @@ async fn find_bash() -> Result { impl App for LocalApp { async fn start(opts: StartOptions) -> Result { + let ctx = opts.ctx.clone(); let package = opts.package; let environment = opts.environment; let package_path = package.unpacked_path @@ -133,7 +136,7 @@ impl App for LocalApp { .to_path_buf(); let mut python_path = find_python(None).await?; - debug!("using system python at {:?}", python_path); + debug!(ctx: &ctx, "using system python at {:?}", python_path); // set for later on. let working_dir = if let Some(dir) = opts.cwd { @@ -145,7 +148,7 @@ impl App for LocalApp { let mut is_virtualenv = false; if Path::new(&package_path.join("requirements.txt")).exists() { - debug!("requirements.txt file found. installing dependencies"); + debug!(ctx: &ctx, "requirements.txt file found. installing dependencies"); // There's a requirements.txt, so we'll create a new virtualenv and install the files // taht we want in there. @@ -170,7 +173,7 @@ impl App for LocalApp { // // TODO: Find a better way to operate in the context of a virtual env here. python_path = find_python(Some(working_dir.join(".venv").join("bin"))).await?; - debug!("using virtualenv python at {:?}", python_path); + debug!(ctx: &ctx, "using virtualenv python at {:?}", python_path); is_virtualenv = true; @@ -196,16 +199,16 @@ impl App for LocalApp { } - debug!("waiting for dependency installation to complete"); + debug!(ctx: &ctx, "waiting for dependency installation to complete"); // Wait for the child to complete entirely. child.wait().await.expect("child failed to exit"); } } else { - debug!("missing requirements.txt file found. no dependencies to install"); + debug!(ctx: &ctx, "missing requirements.txt file found. no dependencies to install"); } - debug!(" - working directory: {:?}", &working_dir); + debug!(ctx: &ctx, " - working directory: {:?}", &working_dir); let res = if package.manifest.invoke.ends_with(".sh") { let manifest = &package.manifest; @@ -213,14 +216,14 @@ impl App for LocalApp { let params= opts.parameters; let other_env_vars = opts.env_vars; - Self::execute_bash_program(&environment, working_dir, is_virtualenv, package_path, &manifest, secrets, params, other_env_vars).await + Self::execute_bash_program(&ctx, &environment, working_dir, is_virtualenv, package_path, &manifest, secrets, params, other_env_vars).await } else { let manifest = &package.manifest; let secrets = opts.secrets; let params= opts.parameters; let other_env_vars = opts.env_vars; - Self::execute_python_program(&environment, working_dir, is_virtualenv, python_path, package_path, &manifest, secrets, params, other_env_vars).await + Self::execute_python_program(&ctx, &environment, working_dir, is_virtualenv, python_path, package_path, &manifest, secrets, params, other_env_vars).await }; if let Ok(mut child) = res { @@ -237,16 +240,17 @@ impl App for LocalApp { let child = Arc::new(Mutex::new(child)); let (sx, rx) = oneshot::channel::(); - tokio::spawn(wait_for_process(sx, Arc::clone(&child))); + tokio::spawn(wait_for_process(ctx.clone(), sx, Arc::clone(&child))); Ok(Self { + ctx, package: Some(package), child: Some(child), waiter: Mutex::new(rx), status: Mutex::new(None), }) } else { - debug!("failed to spawn process: {}", res.err().unwrap()); + debug!(ctx: &ctx, "failed to spawn process: {}", res.err().unwrap()); Err(Error::SpawnFailed) } } @@ -283,7 +287,7 @@ impl App for LocalApp { let mut child = proc.lock().await; if let Err(err) = child.kill().await { - debug!("failed to terminate app: {}", err); + debug!(ctx: &self.ctx, "failed to terminate app: {}", err); Err(Error::TerminateFailed) } else { Ok(()) @@ -297,6 +301,7 @@ impl App for LocalApp { impl LocalApp { async fn execute_python_program( + ctx: &tower_telemetry::Context, env: &str, cwd: PathBuf, is_virtualenv: bool, @@ -307,7 +312,7 @@ impl LocalApp { params: HashMap, other_env_vars: HashMap, ) -> Result { - debug!(" - python script {}", manifest.invoke); + debug!(ctx: &ctx, " - python script {}", manifest.invoke); let child = Command::new(python_path) .current_dir(&cwd) @@ -316,7 +321,7 @@ impl LocalApp { .stdin(Stdio::null()) .stdout(Stdio::piped()) .stderr(Stdio::piped()) - .envs(make_env_vars(env, &cwd, is_virtualenv, &secrets, ¶ms, &other_env_vars)) + .envs(make_env_vars(&ctx, env, &cwd, is_virtualenv, &secrets, ¶ms, &other_env_vars)) .kill_on_drop(true) .spawn()?; @@ -324,6 +329,7 @@ impl LocalApp { } async fn execute_bash_program( + ctx: &tower_telemetry::Context, env: &str, cwd: PathBuf, is_virtualenv: bool, @@ -334,9 +340,9 @@ impl LocalApp { other_env_vars: HashMap, ) -> Result { let bash_path = find_bash().await?; - debug!("using bash at {:?}", bash_path); + debug!(ctx: &ctx, "using bash at {:?}", bash_path); - debug!(" - bash script {}", manifest.invoke); + debug!(ctx: &ctx, " - bash script {}", manifest.invoke); let child = Command::new(bash_path) .current_dir(&cwd) @@ -344,7 +350,7 @@ impl LocalApp { .stdin(Stdio::null()) .stdout(Stdio::piped()) .stderr(Stdio::piped()) - .envs(make_env_vars(env, &cwd, is_virtualenv, &secrets, ¶ms, &other_env_vars)) + .envs(make_env_vars(&ctx, env, &cwd, is_virtualenv, &secrets, ¶ms, &other_env_vars)) .kill_on_drop(true) .spawn()?; @@ -361,23 +367,23 @@ fn make_env_var_key(src: &str) -> String { } } -fn make_env_vars(env: &str, cwd: &PathBuf, is_virtualenv: bool, secs: &HashMap, params: &HashMap, other_env_vars: &HashMap) -> HashMap { +fn make_env_vars(ctx: &tower_telemetry::Context, env: &str, cwd: &PathBuf, is_virtualenv: bool, secs: &HashMap, params: &HashMap, other_env_vars: &HashMap) -> HashMap { let mut res = HashMap::new(); - debug!("converting {} env variables", (params.len() + secs.len())); + debug!(ctx: &ctx, "converting {} env variables", (params.len() + secs.len())); for (key, value) in secs.into_iter() { - debug!("adding key {}", make_env_var_key(&key)); + debug!(ctx: &ctx, "adding key {}", make_env_var_key(&key)); res.insert(make_env_var_key(&key), value.to_string()); } for (key, value) in params.into_iter() { - debug!("adding key {}", make_env_var_key(&key)); + debug!(ctx: &ctx, "adding key {}", make_env_var_key(&key)); res.insert(key.to_string(), value.to_string()); } for (key, value) in other_env_vars.into_iter() { - debug!("adding key {}", &key); + debug!(ctx: &ctx, "adding key {}", &key); res.insert(key.to_string(), value.to_string()); } @@ -419,7 +425,7 @@ fn make_env_vars(env: &str, cwd: &PathBuf, is_virtualenv: bool, secs: &HashMap, proc: Arc>) { +async fn wait_for_process(ctx: tower_telemetry::Context, sx: oneshot::Sender, proc: Arc>) { let code = loop { let mut child = proc.lock().await; let timeout = timeout(Duration::from_millis(250), child.wait()).await; @@ -430,13 +436,13 @@ async fn wait_for_process(sx: oneshot::Sender, proc: Arc>) { break status.code().expect("no status code"); } else { // something went wrong. - debug!("failed to get status due to some kind of IO error: {}" , res.err().expect("no error somehow")); + debug!(ctx: &ctx, "failed to get status due to some kind of IO error: {}" , res.err().expect("no error somehow")); break -1; } } }; - debug!("process exited with code {}", code); + debug!(ctx: &ctx, "process exited with code {}", code); // this just shuts up the compiler about ignoring the results. let _ = sx.send(code); diff --git a/crates/tower-telemetry/src/context.rs b/crates/tower-telemetry/src/context.rs index 559a2f81..053ca98b 100644 --- a/crates/tower-telemetry/src/context.rs +++ b/crates/tower-telemetry/src/context.rs @@ -1,11 +1,11 @@ #[derive(Debug, Clone, PartialEq, Eq)] pub struct Context { /// runid is the ID of the run in the current context. - pub(crate) runid: Option, + pub runid: Option, } impl Context { - pub fn with_runid(runid: String) -> Self { + pub fn from_runid(runid: String) -> Self { Self { runid: Some(runid), } diff --git a/crates/tower-telemetry/src/logging.rs b/crates/tower-telemetry/src/logging.rs index 957c51f0..4b6247cb 100644 --- a/crates/tower-telemetry/src/logging.rs +++ b/crates/tower-telemetry/src/logging.rs @@ -1,11 +1,11 @@ #[macro_export] macro_rules! event_with_level { // With context - ($level:expr, ctx: $ctx:expr, $fmt:expr, $($arg:tt)*) => { - if let Some(runid) = $ctx.runid { - $crate::tracing::event!($level, runid = %runid, "{}", format!($fmt, $($arg)*)) + ($level:expr, ctx: $ctx:expr, $fmt:expr, $($arg:tt)+) => { + if let Some(runid) = &$ctx.runid { + $crate::tracing::event!($level, runid = %runid, "{}", format!($fmt, $($arg)+)) } else { - $crate::tracing::event!($level, "{}", format!($fmt, $($arg)*)) + $crate::tracing::event!($level, "{}", format!($fmt, $($arg)+)) } }; @@ -18,13 +18,13 @@ macro_rules! event_with_level { #[macro_export] macro_rules! debug { // With context, format string and arguments - (ctx: $ctx:expr, $fmt:expr, $($arg:tt)*) => { - $crate::event_with_level!($crate::tracing::Level::DEBUG, $ctx, $fmt, $($arg)*) + (ctx: $ctx:expr, $fmt:expr, $($arg:tt)+) => { + $crate::event_with_level!($crate::tracing::Level::DEBUG, ctx: $ctx, $fmt, $($arg)+) }; // With context, just message (ctx: $ctx:expr, $msg:expr) => { - $crate::event_with_level!($crate::tracing::Level::DEBUG, $ctx, "{}", $msg) + $crate::event_with_level!($crate::tracing::Level::DEBUG, ctx: $ctx, "{}", $msg) }; // Without context, format string and arguments From 763b2699a6d59e3d199a022e69c547fade5c3306 Mon Sep 17 00:00:00 2001 From: Brad Heller Date: Thu, 5 Jun 2025 15:42:58 -0700 Subject: [PATCH 4/7] chore: Add destinations and formats to logging --- Cargo.lock | 107 ++++++++++++++++++++++++++++++ Cargo.toml | 3 +- crates/tower-cmd/src/lib.rs | 12 +++- crates/tower-telemetry/Cargo.toml | 1 + crates/tower-telemetry/src/lib.rs | 69 ++++++++++++++++--- 5 files changed, 178 insertions(+), 14 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 19411dd5..db7dc17f 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -52,6 +52,15 @@ dependencies = [ "subtle", ] +[[package]] +name = "aho-corasick" +version = "1.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e60d3430d3a69478ad0993f19238d2df97c507009a52b3c10addcd7f6bcb916" +dependencies = [ + "memchr", +] + [[package]] name = "android-tzdata" version = "0.1.1" @@ -442,6 +451,21 @@ dependencies = [ "cfg-if", ] +[[package]] +name = "crossbeam-channel" +version = "0.5.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "82b8f8f868b36967f9606790d1903570de9ceaf870a7bf9fbbd3016d636a2cb2" +dependencies = [ + "crossbeam-utils", +] + +[[package]] +name = "crossbeam-utils" +version = "0.8.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d0a5c400df2834b80a4c3327b3aad3a4c4cd4de0629063962b03235697506a28" + [[package]] name = "crypto" version = "0.3.14" @@ -1389,6 +1413,15 @@ version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3e2e65a1a2e43cfcb47a895c4c8b10d1f4a61097f9f254f183aee60cad9c651d" +[[package]] +name = "matchers" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8263075bb86c5a1b1427b5ae862e8889656f126e9f77c484496e8b47cf5c5558" +dependencies = [ + "regex-automata 0.1.10", +] + [[package]] name = "memchr" version = "2.7.4" @@ -1888,6 +1921,50 @@ dependencies = [ "thiserror", ] +[[package]] +name = "regex" +version = "1.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b544ef1b4eac5dc2db33ea63606ae9ffcfac26c1416a2806ae0bf5f56b201191" +dependencies = [ + "aho-corasick", + "memchr", + "regex-automata 0.4.9", + "regex-syntax 0.8.5", +] + +[[package]] +name = "regex-automata" +version = "0.1.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6c230d73fb8d8c1b9c0b3135c5142a8acee3a0558fb8db5cf1cb65f8d7862132" +dependencies = [ + "regex-syntax 0.6.29", +] + +[[package]] +name = "regex-automata" +version = "0.4.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "809e8dc61f6de73b46c85f4c96486310fe304c434cfa43669d7b40f711150908" +dependencies = [ + "aho-corasick", + "memchr", + "regex-syntax 0.8.5", +] + +[[package]] +name = "regex-syntax" +version = "0.6.29" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f162c6dd7b008981e4d40210aca20b4bd0f9b60ca9271061b07f78537722f2e1" + +[[package]] +name = "regex-syntax" +version = "0.8.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2b15c43186be67a4fd63bee50d0303afffcef381492ebe2c5d87f324e1b8815c" + [[package]] name = "reqwest" version = "0.12.15" @@ -2816,6 +2893,7 @@ name = "tower-telemetry" version = "0.3.14" dependencies = [ "tracing", + "tracing-appender", "tracing-subscriber", ] @@ -2842,6 +2920,18 @@ dependencies = [ "tracing-core", ] +[[package]] +name = "tracing-appender" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3566e8ce28cc0a3fe42519fc80e6b4c943cc4c8cef275620eb8dac2d3d4e06cf" +dependencies = [ + "crossbeam-channel", + "thiserror", + "time", + "tracing-subscriber", +] + [[package]] name = "tracing-attributes" version = "0.1.28" @@ -2874,18 +2964,35 @@ dependencies = [ "tracing-core", ] +[[package]] +name = "tracing-serde" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "704b1aeb7be0d0a84fc9828cae51dab5970fee5088f83d1dd7ee6f6246fc6ff1" +dependencies = [ + "serde", + "tracing-core", +] + [[package]] name = "tracing-subscriber" version = "0.3.19" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e8189decb5ac0fa7bc8b96b7cb9b2701d60d48805aca84a238004d665fcc4008" dependencies = [ + "matchers", "nu-ansi-term", + "once_cell", + "regex", + "serde", + "serde_json", "sharded-slab", "smallvec", "thread_local", + "tracing", "tracing-core", "tracing-log", + "tracing-serde", ] [[package]] diff --git a/Cargo.toml b/Cargo.toml index f144a738..3dd3d344 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -60,7 +60,8 @@ tower-package = { path = "crates/tower-package" } tower-runtime = { path = "crates/tower-runtime" } tower-telemetry = { path = "crates/tower-telemetry" } tracing = { version = "0.1" } -tracing-subscriber = { version = "0.3" } +tracing-appender = "0.2" +tracing-subscriber = { version = "0.3", features = ["json", "env-filter"] } url = { version = "2", features = ["serde"] } webbrowser = "1" diff --git a/crates/tower-cmd/src/lib.rs b/crates/tower-cmd/src/lib.rs index 1c5d4874..b34cb323 100644 --- a/crates/tower-cmd/src/lib.rs +++ b/crates/tower-cmd/src/lib.rs @@ -59,9 +59,17 @@ impl App { if config.debug { // Set log level to "DEBUG" - tower_telemetry::enable_logging(tower_telemetry::LogLevel::Debug); + tower_telemetry::enable_logging( + tower_telemetry::LogLevel::Debug, + tower_telemetry::LogFormat::Plain, + tower_telemetry::LogDestination::Stdout, + ); } else { - tower_telemetry::enable_logging(tower_telemetry::LogLevel::Warn); + tower_telemetry::enable_logging( + tower_telemetry::LogLevel::Warn, + tower_telemetry::LogFormat::Plain, + tower_telemetry::LogDestination::Stdout, + ); } // Check for newer version only if we successfully get a latest version diff --git a/crates/tower-telemetry/Cargo.toml b/crates/tower-telemetry/Cargo.toml index ad1fb53a..74ea3557 100644 --- a/crates/tower-telemetry/Cargo.toml +++ b/crates/tower-telemetry/Cargo.toml @@ -8,4 +8,5 @@ license = { workspace = true } [dependencies] tracing = { workspace = true } +tracing-appender = { workspace = true } tracing-subscriber = { workspace = true } diff --git a/crates/tower-telemetry/src/lib.rs b/crates/tower-telemetry/src/lib.rs index 1afa8be1..7c42d40a 100644 --- a/crates/tower-telemetry/src/lib.rs +++ b/crates/tower-telemetry/src/lib.rs @@ -5,8 +5,10 @@ pub use context::Context; /// reexport tracing to make sure that it gets included everywhere. pub use tracing; -use tracing_subscriber; +use tracing_subscriber::prelude::*; +use tracing_subscriber::{registry::Registry, layer::Layer, fmt, EnvFilter}; +/// LogLevel describes the various log levels that can be used in the application. pub enum LogLevel { Debug, Info, @@ -14,19 +16,64 @@ pub enum LogLevel { Error, } -impl Into for LogLevel { - fn into(self) -> tracing_subscriber::filter::LevelFilter { +impl AsRef for LogLevel { + fn as_ref(&self) -> &str { match self { - LogLevel::Debug => tracing_subscriber::filter::LevelFilter::DEBUG, - LogLevel::Info => tracing_subscriber::filter::LevelFilter::INFO, - LogLevel::Warn => tracing_subscriber::filter::LevelFilter::WARN, - LogLevel::Error => tracing_subscriber::filter::LevelFilter::ERROR, + LogLevel::Debug => "debug", + LogLevel::Info => "info", + LogLevel::Warn => "warn", + LogLevel::Error => "error", } } } -pub fn enable_logging(level: LogLevel) { - tracing_subscriber::fmt() - .with_max_level(level) - .init(); +pub enum LogDestination { + Stdout, + File(String), +} + +pub enum LogFormat { + Plain, + Json, +} + +type BoxedFmtLayer = Box + Send + Sync>; + +fn create_fmt_layer(format: LogFormat, destination: LogDestination) -> BoxedFmtLayer { + match destination { + LogDestination::Stdout => { + match format { + LogFormat::Plain => Box::new(fmt::layer().event_format(fmt::format().pretty())), + LogFormat::Json => Box::new(fmt::layer().event_format(fmt::format().json())), + } + } + LogDestination::File(path) => { + let file_appender = tracing_appender::rolling::daily(".", path); + match format { + LogFormat::Plain => { + Box::new( + fmt::layer() + .event_format(fmt::format().pretty()) + .with_writer(file_appender) + ) + } + LogFormat::Json => { + Box::new( + fmt::layer() + .event_format(fmt::format().json()) + .with_writer(file_appender) + ) + } + } + } + } +} + +pub fn enable_logging(level: LogLevel, format: LogFormat, destination: LogDestination) { + let fmt_layer = create_fmt_layer(format, destination); + let filter = EnvFilter::new(level); + let subscriber = tracing_subscriber::registry().with(fmt_layer).with(filter); + + tracing::subscriber::set_global_default(subscriber) + .expect("Failed to set global default subscriber"); } From 6b1dc433ec388f7552743a893eb1950fd651456d Mon Sep 17 00:00:00 2001 From: Brad Heller Date: Thu, 5 Jun 2025 15:44:32 -0700 Subject: [PATCH 5/7] chore: Update to v0.3.16 --- Cargo.lock | 20 ++++++++++---------- Cargo.toml | 3 ++- pyproject.toml | 3 ++- uv.lock | 2 +- 4 files changed, 15 insertions(+), 13 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index db7dc17f..e928d008 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -371,7 +371,7 @@ dependencies = [ [[package]] name = "config" -version = "0.3.14" +version = "0.3.16" dependencies = [ "chrono", "clap", @@ -468,7 +468,7 @@ checksum = "d0a5c400df2834b80a4c3327b3aad3a4c4cd4de0629063962b03235697506a28" [[package]] name = "crypto" -version = "0.3.14" +version = "0.3.16" dependencies = [ "aes-gcm", "base64", @@ -2567,7 +2567,7 @@ dependencies = [ [[package]] name = "testutils" -version = "0.3.14" +version = "0.3.16" dependencies = [ "pem", "rsa", @@ -2779,7 +2779,7 @@ dependencies = [ [[package]] name = "tower" -version = "0.3.14" +version = "0.3.16" dependencies = [ "tokio", "tower-api", @@ -2803,7 +2803,7 @@ dependencies = [ [[package]] name = "tower-api" -version = "0.3.14" +version = "0.3.16" dependencies = [ "reqwest", "serde", @@ -2816,7 +2816,7 @@ dependencies = [ [[package]] name = "tower-cmd" -version = "0.3.14" +version = "0.3.16" dependencies = [ "anyhow", "bytes", @@ -2855,7 +2855,7 @@ checksum = "121c2a6cda46980bb0fcd1647ffaf6cd3fc79a013de288782836f6df9c48780e" [[package]] name = "tower-package" -version = "0.3.14" +version = "0.3.16" dependencies = [ "async-compression", "config", @@ -2873,7 +2873,7 @@ dependencies = [ [[package]] name = "tower-runtime" -version = "0.3.14" +version = "0.3.16" dependencies = [ "chrono", "snafu", @@ -2890,7 +2890,7 @@ checksum = "8df9b6e13f2d32c91b9bd719c00d1958837bc7dec474d94952798cc8e69eeec3" [[package]] name = "tower-telemetry" -version = "0.3.14" +version = "0.3.16" dependencies = [ "tracing", "tracing-appender", @@ -2899,7 +2899,7 @@ dependencies = [ [[package]] name = "tower-version" -version = "0.3.14" +version = "0.3.16" dependencies = [ "anyhow", "chrono", diff --git a/Cargo.toml b/Cargo.toml index 3dd3d344..2a088f1b 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -4,7 +4,8 @@ resolver = "2" [workspace.package] edition = "2021" -version = "0.3.14" +version = "0.3.16" + description = "Tower is the best way to host Python data apps in production" diff --git a/pyproject.toml b/pyproject.toml index 13a48d6b..e243e341 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -4,7 +4,8 @@ build-backend = "maturin" [project] name = "tower" -version = "0.3.14" +version = "0.3.16" + description = "Tower CLI and runtime environment for Tower." diff --git a/uv.lock b/uv.lock index 5953f46c..e4d04689 100644 --- a/uv.lock +++ b/uv.lock @@ -1176,7 +1176,7 @@ wheels = [ [[package]] name = "tower" -version = "0.3.14" +version = "0.3.16" source = { editable = "." } dependencies = [ { name = "attrs" }, From 9d0ece12c561e0851d93cc0a57aa94f1710ca013 Mon Sep 17 00:00:00 2001 From: Brad Heller Date: Thu, 5 Jun 2025 15:47:09 -0700 Subject: [PATCH 6/7] chore: Upgrade rust and python clients to latest --- Cargo.lock | 1 - crates/tower-api/Cargo.toml | 1 - crates/tower-api/README.md | 4 +- crates/tower-api/src/apis/configuration.rs | 2 +- crates/tower-api/src/apis/default_api.rs | 86 +++++- .../src/models/accept_invitation_params.rs | 2 +- .../src/models/accept_invitation_response.rs | 2 +- crates/tower-api/src/models/account.rs | 2 +- .../src/models/acknowledge_alert_response.rs | 2 +- crates/tower-api/src/models/alert.rs | 2 +- crates/tower-api/src/models/api_key.rs | 2 +- crates/tower-api/src/models/app.rs | 2 +- crates/tower-api/src/models/app_statistics.rs | 2 +- crates/tower-api/src/models/app_summary.rs | 2 +- crates/tower-api/src/models/app_version.rs | 2 +- .../src/models/cancel_run_response.rs | 2 +- crates/tower-api/src/models/catalog.rs | 2 +- .../tower-api/src/models/catalog_property.rs | 2 +- .../claim_device_login_ticket_params.rs | 2 +- .../claim_device_login_ticket_response.rs | 2 +- .../src/models/create_account_params.rs | 2 +- .../create_account_params_flags_struct.rs | 2 +- .../src/models/create_account_response.rs | 2 +- .../src/models/create_api_key_params.rs | 2 +- .../src/models/create_api_key_response.rs | 2 +- .../tower-api/src/models/create_app_params.rs | 2 +- .../src/models/create_app_response.rs | 2 +- .../src/models/create_catalog_params.rs | 4 +- .../src/models/create_catalog_response.rs | 2 +- .../create_device_login_ticket_response.rs | 2 +- .../models/create_password_reset_params.rs | 2 +- .../models/create_password_reset_response.rs | 2 +- .../src/models/create_secret_params.rs | 2 +- .../src/models/create_secret_response.rs | 2 +- .../src/models/create_session_params.rs | 2 +- .../src/models/create_session_response.rs | 2 +- .../src/models/create_team_params.rs | 2 +- .../src/models/create_team_response.rs | 2 +- .../src/models/delete_api_key_params.rs | 2 +- .../src/models/delete_api_key_response.rs | 2 +- .../src/models/delete_app_response.rs | 2 +- .../src/models/delete_catalog_response.rs | 2 +- .../src/models/delete_secret_response.rs | 2 +- .../models/delete_team_invitation_params.rs | 2 +- .../models/delete_team_invitation_response.rs | 2 +- .../src/models/delete_team_params.rs | 2 +- .../src/models/delete_team_response.rs | 2 +- .../src/models/deploy_app_response.rs | 2 +- .../src/models/describe_app_response.rs | 2 +- .../models/describe_app_version_response.rs | 2 +- .../describe_device_login_session_response.rs | 2 +- .../src/models/describe_run_logs_response.rs | 2 +- .../src/models/describe_run_response.rs | 2 +- .../models/describe_secrets_key_response.rs | 2 +- .../src/models/describe_session_response.rs | 2 +- .../src/models/encrypted_catalog_property.rs | 2 +- crates/tower-api/src/models/error_detail.rs | 2 +- crates/tower-api/src/models/error_model.rs | 2 +- .../src/models/export_catalogs_params.rs | 2 +- .../src/models/export_catalogs_response.rs | 2 +- .../src/models/export_secrets_params.rs | 2 +- .../src/models/export_secrets_response.rs | 2 +- .../tower-api/src/models/exported_catalog.rs | 2 +- .../src/models/exported_catalog_property.rs | 2 +- .../tower-api/src/models/exported_secret.rs | 2 +- .../generate_app_statistics_response.rs | 2 +- .../generate_run_statistics_response.rs | 2 +- .../src/models/invite_team_member_params.rs | 2 +- .../src/models/invite_team_member_response.rs | 2 +- .../src/models/leave_team_response.rs | 2 +- .../src/models/list_alerts_200_response.rs | 2 +- .../src/models/list_alerts_response.rs | 2 +- .../src/models/list_api_keys_response.rs | 2 +- .../models/list_app_environments_response.rs | 2 +- .../src/models/list_app_versions_response.rs | 2 +- .../src/models/list_apps_response.rs | 2 +- .../src/models/list_catalogs_response.rs | 2 +- .../list_my_team_invitations_response.rs | 2 +- .../src/models/list_runs_response.rs | 2 +- .../list_secret_environments_response.rs | 2 +- .../src/models/list_secrets_response.rs | 2 +- .../models/list_team_invitations_response.rs | 2 +- .../src/models/list_team_members_response.rs | 2 +- .../src/models/list_teams_response.rs | 2 +- crates/tower-api/src/models/log_line.rs | 2 +- crates/tower-api/src/models/mod.rs | 2 + crates/tower-api/src/models/pagination.rs | 2 +- crates/tower-api/src/models/parameter.rs | 2 +- .../src/models/refresh_session_params.rs | 2 +- .../src/models/refresh_session_response.rs | 2 +- .../src/models/remove_team_member_params.rs | 2 +- .../src/models/remove_team_member_response.rs | 2 +- .../models/resend_team_invitation_params.rs | 2 +- .../models/resend_team_invitation_response.rs | 2 +- crates/tower-api/src/models/run.rs | 8 +- crates/tower-api/src/models/run_app_params.rs | 2 +- .../tower-api/src/models/run_app_response.rs | 2 +- .../tower-api/src/models/run_failure_alert.rs | 2 +- crates/tower-api/src/models/run_log_line.rs | 2 +- crates/tower-api/src/models/run_parameter.rs | 2 +- crates/tower-api/src/models/run_results.rs | 2 +- crates/tower-api/src/models/run_statistics.rs | 2 +- .../src/models/search_runs_response.rs | 34 +++ crates/tower-api/src/models/secret.rs | 2 +- crates/tower-api/src/models/series_point.rs | 2 +- crates/tower-api/src/models/session.rs | 2 +- crates/tower-api/src/models/sse_warning.rs | 2 +- .../src/models/statistics_settings.rs | 2 +- .../stream_alerts_200_response_inner.rs | 6 +- .../stream_run_logs_200_response_inner.rs | 6 +- crates/tower-api/src/models/team.rs | 2 +- .../tower-api/src/models/team_invitation.rs | 2 +- crates/tower-api/src/models/token.rs | 2 +- .../src/models/update_account_slug_params.rs | 2 +- .../models/update_account_slug_response.rs | 2 +- .../tower-api/src/models/update_app_params.rs | 2 +- .../src/models/update_app_response.rs | 2 +- .../src/models/update_catalog_params.rs | 2 +- .../src/models/update_catalog_response.rs | 2 +- .../update_my_team_invitation_params.rs | 2 +- .../update_my_team_invitation_response.rs | 2 +- .../models/update_password_reset_params.rs | 2 +- .../models/update_password_reset_response.rs | 2 +- .../src/models/update_secret_params.rs | 2 +- .../src/models/update_secret_response.rs | 2 +- .../src/models/update_team_params.rs | 2 +- .../src/models/update_team_response.rs | 2 +- .../src/models/update_user_params.rs | 2 +- .../src/models/update_user_response.rs | 2 +- crates/tower-api/src/models/user.rs | 2 +- scripts/rust-client-templates/Cargo.mustache | 1 - .../api/default/acknowledge_alert.py | 30 +-- .../api/default/create_password_reset.py | 172 ++++++++++++ .../api/default/list_alerts.py | 34 ++- .../tower_api_client/api/default/list_runs.py | 36 +-- .../api/default/search_runs.py | 253 ++++++++++++++++++ .../api/default/stream_alerts.py | 158 +++++++++++ .../api/default/stream_run_logs.py | 26 +- .../api/default/update_password_reset.py | 183 +++++++++++++ src/tower/tower_api_client/models/__init__.py | 28 +- src/tower/tower_api_client/models/alert.py | 90 ------- .../models/alert_alert_type.py | 9 - .../tower_api_client/models/alert_detail.py | 47 ---- .../tower_api_client/models/alert_status.py | 10 - .../models/create_catalog_params_type.py | 1 + .../models/create_password_reset_params.py | 51 ++++ .../models/create_password_reset_response.py | 51 ++++ .../models/list_alerts_response.py | 10 +- .../models/list_alerts_response_alert.py | 107 ++++++++ src/tower/tower_api_client/models/run.py | 14 + .../models/run_failure_alert.py | 55 ++++ .../models/search_runs_response.py | 75 ++++++ .../models/search_runs_status_item.py | 15 ++ .../{log_line_error.py => sse_warning.py} | 10 +- .../models/update_password_reset_params.py | 51 ++++ .../models/update_password_reset_response.py | 51 ++++ tests/tower/test_client.py | 2 + 157 files changed, 1587 insertions(+), 375 deletions(-) create mode 100644 crates/tower-api/src/models/search_runs_response.rs create mode 100644 src/tower/tower_api_client/api/default/create_password_reset.py create mode 100644 src/tower/tower_api_client/api/default/search_runs.py create mode 100644 src/tower/tower_api_client/api/default/stream_alerts.py create mode 100644 src/tower/tower_api_client/api/default/update_password_reset.py delete mode 100644 src/tower/tower_api_client/models/alert.py delete mode 100644 src/tower/tower_api_client/models/alert_alert_type.py delete mode 100644 src/tower/tower_api_client/models/alert_detail.py delete mode 100644 src/tower/tower_api_client/models/alert_status.py create mode 100644 src/tower/tower_api_client/models/create_password_reset_params.py create mode 100644 src/tower/tower_api_client/models/create_password_reset_response.py create mode 100644 src/tower/tower_api_client/models/list_alerts_response_alert.py create mode 100644 src/tower/tower_api_client/models/run_failure_alert.py create mode 100644 src/tower/tower_api_client/models/search_runs_response.py create mode 100644 src/tower/tower_api_client/models/search_runs_status_item.py rename src/tower/tower_api_client/models/{log_line_error.py => sse_warning.py} (85%) create mode 100644 src/tower/tower_api_client/models/update_password_reset_params.py create mode 100644 src/tower/tower_api_client/models/update_password_reset_response.py diff --git a/Cargo.lock b/Cargo.lock index e928d008..c813fcd7 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2810,7 +2810,6 @@ dependencies = [ "serde_json", "serde_repr", "serde_with", - "tower-telemetry", "url", ] diff --git a/crates/tower-api/Cargo.toml b/crates/tower-api/Cargo.toml index 6ed715af..e9427c14 100644 --- a/crates/tower-api/Cargo.toml +++ b/crates/tower-api/Cargo.toml @@ -13,4 +13,3 @@ serde_json = "^1.0" serde_repr = "^0.1" url = "^2.5" reqwest = { version = "^0.12", default-features = false, features = ["json", "multipart"] } -tower-telemetry = { workspace = true } diff --git a/crates/tower-api/README.md b/crates/tower-api/README.md index 0c59d9ef..ba73ea5f 100644 --- a/crates/tower-api/README.md +++ b/crates/tower-api/README.md @@ -8,7 +8,7 @@ For more information, please visit [https://tower.dev](https://tower.dev) This API client was generated by the [OpenAPI Generator](https://openapi-generator.tech) project. By using the [openapi-spec](https://openapis.org) from a remote server, you can easily generate an API client. -- API version: v0.5.23 +- API version: v0.6.3 - Package version: 1.0.0 - Generator version: 7.13.0 - Build package: `org.openapitools.codegen.languages.RustClientCodegen` @@ -78,6 +78,7 @@ Class | Method | HTTP request | Description *DefaultApi* | [**remove_team_member**](docs/DefaultApi.md#remove_team_member) | **DELETE** /teams/{slug}/members | Remove team member *DefaultApi* | [**resend_team_invitation**](docs/DefaultApi.md#resend_team_invitation) | **POST** /teams/{slug}/invites/resend | Resend team invitation *DefaultApi* | [**run_app**](docs/DefaultApi.md#run_app) | **POST** /apps/{slug}/runs | Run app +*DefaultApi* | [**search_runs**](docs/DefaultApi.md#search_runs) | **GET** /runs | Search runs *DefaultApi* | [**stream_alerts**](docs/DefaultApi.md#stream_alerts) | **GET** /alerts/stream | Stream alert notifications *DefaultApi* | [**stream_run_logs**](docs/DefaultApi.md#stream_run_logs) | **GET** /apps/{slug}/runs/{seq}/logs/stream | Stream run logs *DefaultApi* | [**update_account_slug**](docs/DefaultApi.md#update_account_slug) | **PUT** /accounts/{slug} | Update account slug @@ -188,6 +189,7 @@ Class | Method | HTTP request | Description - [RunParameter](docs/RunParameter.md) - [RunResults](docs/RunResults.md) - [RunStatistics](docs/RunStatistics.md) + - [SearchRunsResponse](docs/SearchRunsResponse.md) - [Secret](docs/Secret.md) - [SeriesPoint](docs/SeriesPoint.md) - [Session](docs/Session.md) diff --git a/crates/tower-api/src/apis/configuration.rs b/crates/tower-api/src/apis/configuration.rs index 9563d78b..d32c753d 100644 --- a/crates/tower-api/src/apis/configuration.rs +++ b/crates/tower-api/src/apis/configuration.rs @@ -3,7 +3,7 @@ * * REST API to interact with Tower Services. * - * The version of the OpenAPI document: v0.5.23 + * The version of the OpenAPI document: v0.6.3 * Contact: hello@tower.dev * Generated by: https://openapi-generator.tech */ diff --git a/crates/tower-api/src/apis/default_api.rs b/crates/tower-api/src/apis/default_api.rs index bdd0bd69..52723851 100644 --- a/crates/tower-api/src/apis/default_api.rs +++ b/crates/tower-api/src/apis/default_api.rs @@ -3,7 +3,7 @@ * * REST API to interact with Tower Services. * - * The version of the OpenAPI document: v0.5.23 + * The version of the OpenAPI document: v0.6.3 * Contact: hello@tower.dev * Generated by: https://openapi-generator.tech */ @@ -370,6 +370,21 @@ pub struct RunAppParams { pub run_app_params: models::RunAppParams } +/// struct for passing parameters to the method [`search_runs`] +#[derive(Clone, Debug)] +pub struct SearchRunsParams { + /// The page number to fetch. + pub page: Option, + /// The number of records to fetch on each page. + pub page_size: Option, + /// Filter runs by status(es). Define multiple with a comma-separated list. Supplying none will return all statuses. + pub status: Option>, + /// Filter runs scheduled after this datetime (inclusive). Provide timestamps in ISO-8601 format. + pub start_at: Option, + /// Filter runs scheduled before or at this datetime (inclusive). Provide timestamps in ISO-8601 format. + pub end_at: Option +} + /// struct for passing parameters to the method [`stream_run_logs`] #[derive(Clone, Debug)] pub struct StreamRunLogsParams { @@ -848,6 +863,14 @@ pub enum RunAppSuccess { UnknownValue(serde_json::Value), } +/// struct for typed successes of method [`search_runs`] +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(untagged)] +pub enum SearchRunsSuccess { + Status200(models::SearchRunsResponse), + UnknownValue(serde_json::Value), +} + /// struct for typed successes of method [`stream_alerts`] #[derive(Debug, Clone, Serialize, Deserialize)] #[serde(untagged)] @@ -1339,6 +1362,14 @@ pub enum RunAppError { UnknownValue(serde_json::Value), } +/// struct for typed errors of method [`search_runs`] +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(untagged)] +pub enum SearchRunsError { + DefaultResponse(models::ErrorModel), + UnknownValue(serde_json::Value), +} + /// struct for typed errors of method [`stream_alerts`] #[derive(Debug, Clone, Serialize, Deserialize)] #[serde(untagged)] @@ -3328,6 +3359,59 @@ pub async fn run_app(configuration: &configuration::Configuration, params: RunAp } } +/// Search, filter, and list runs across all of the apps in your account. +pub async fn search_runs(configuration: &configuration::Configuration, params: SearchRunsParams) -> Result, Error> { + + let uri_str = format!("{}/runs", configuration.base_path); + let mut req_builder = configuration.client.request(reqwest::Method::GET, &uri_str); + + if let Some(ref param_value) = params.page { + req_builder = req_builder.query(&[("page", ¶m_value.to_string())]); + } + if let Some(ref param_value) = params.page_size { + req_builder = req_builder.query(&[("page_size", ¶m_value.to_string())]); + } + if let Some(ref param_value) = params.status { + req_builder = match "csv" { + "multi" => req_builder.query(¶m_value.into_iter().map(|p| ("status".to_owned(), p.to_string())).collect::>()), + _ => req_builder.query(&[("status", ¶m_value.into_iter().map(|p| p.to_string()).collect::>().join(",").to_string())]), + }; + } + if let Some(ref param_value) = params.start_at { + req_builder = req_builder.query(&[("start_at", ¶m_value.to_string())]); + } + if let Some(ref param_value) = params.end_at { + req_builder = req_builder.query(&[("end_at", ¶m_value.to_string())]); + } + if let Some(ref user_agent) = configuration.user_agent { + req_builder = req_builder.header(reqwest::header::USER_AGENT, user_agent.clone()); + } + if let Some(ref token) = configuration.bearer_access_token { + req_builder = req_builder.bearer_auth(token.to_owned()); + }; + + let req = req_builder.build()?; + let resp = configuration.client.execute(req).await?; + + let status = resp.status(); + + let tower_trace_id = resp + .headers() + .get("x-tower-trace-id") + .and_then(|v| v.to_str().ok()) + .map_or(String::from(DEFAULT_TOWER_TRACE_ID), String::from); + + if !status.is_client_error() && !status.is_server_error() { + let content = resp.text().await?; + let entity: Option = serde_json::from_str(&content).ok(); + Ok(ResponseContent { tower_trace_id, status, content, entity }) + } else { + let content = resp.text().await?; + let entity: Option = serde_json::from_str(&content).ok(); + Err(Error::ResponseError(ResponseContent { tower_trace_id, status, content, entity })) + } +} + /// Streams alert notifications in real-time pub async fn stream_alerts(configuration: &configuration::Configuration) -> Result, Error> { diff --git a/crates/tower-api/src/models/accept_invitation_params.rs b/crates/tower-api/src/models/accept_invitation_params.rs index a787f06b..80861c3a 100644 --- a/crates/tower-api/src/models/accept_invitation_params.rs +++ b/crates/tower-api/src/models/accept_invitation_params.rs @@ -3,7 +3,7 @@ * * REST API to interact with Tower Services. * - * The version of the OpenAPI document: v0.5.23 + * The version of the OpenAPI document: v0.6.3 * Contact: hello@tower.dev * Generated by: https://openapi-generator.tech */ diff --git a/crates/tower-api/src/models/accept_invitation_response.rs b/crates/tower-api/src/models/accept_invitation_response.rs index 5f312d1c..022cbc53 100644 --- a/crates/tower-api/src/models/accept_invitation_response.rs +++ b/crates/tower-api/src/models/accept_invitation_response.rs @@ -3,7 +3,7 @@ * * REST API to interact with Tower Services. * - * The version of the OpenAPI document: v0.5.23 + * The version of the OpenAPI document: v0.6.3 * Contact: hello@tower.dev * Generated by: https://openapi-generator.tech */ diff --git a/crates/tower-api/src/models/account.rs b/crates/tower-api/src/models/account.rs index 40bdb7ca..2285f2bc 100644 --- a/crates/tower-api/src/models/account.rs +++ b/crates/tower-api/src/models/account.rs @@ -3,7 +3,7 @@ * * REST API to interact with Tower Services. * - * The version of the OpenAPI document: v0.5.23 + * The version of the OpenAPI document: v0.6.3 * Contact: hello@tower.dev * Generated by: https://openapi-generator.tech */ diff --git a/crates/tower-api/src/models/acknowledge_alert_response.rs b/crates/tower-api/src/models/acknowledge_alert_response.rs index ec30a448..22de16c7 100644 --- a/crates/tower-api/src/models/acknowledge_alert_response.rs +++ b/crates/tower-api/src/models/acknowledge_alert_response.rs @@ -3,7 +3,7 @@ * * REST API to interact with Tower Services. * - * The version of the OpenAPI document: v0.5.23 + * The version of the OpenAPI document: v0.6.3 * Contact: hello@tower.dev * Generated by: https://openapi-generator.tech */ diff --git a/crates/tower-api/src/models/alert.rs b/crates/tower-api/src/models/alert.rs index d85d2e6a..60d39eaf 100644 --- a/crates/tower-api/src/models/alert.rs +++ b/crates/tower-api/src/models/alert.rs @@ -3,7 +3,7 @@ * * REST API to interact with Tower Services. * - * The version of the OpenAPI document: v0.5.23 + * The version of the OpenAPI document: v0.6.3 * Contact: hello@tower.dev * Generated by: https://openapi-generator.tech */ diff --git a/crates/tower-api/src/models/api_key.rs b/crates/tower-api/src/models/api_key.rs index e4170523..bc5787d7 100644 --- a/crates/tower-api/src/models/api_key.rs +++ b/crates/tower-api/src/models/api_key.rs @@ -3,7 +3,7 @@ * * REST API to interact with Tower Services. * - * The version of the OpenAPI document: v0.5.23 + * The version of the OpenAPI document: v0.6.3 * Contact: hello@tower.dev * Generated by: https://openapi-generator.tech */ diff --git a/crates/tower-api/src/models/app.rs b/crates/tower-api/src/models/app.rs index 682fe569..23cd99ec 100644 --- a/crates/tower-api/src/models/app.rs +++ b/crates/tower-api/src/models/app.rs @@ -3,7 +3,7 @@ * * REST API to interact with Tower Services. * - * The version of the OpenAPI document: v0.5.23 + * The version of the OpenAPI document: v0.6.3 * Contact: hello@tower.dev * Generated by: https://openapi-generator.tech */ diff --git a/crates/tower-api/src/models/app_statistics.rs b/crates/tower-api/src/models/app_statistics.rs index 5f7ba6c1..9ce5e492 100644 --- a/crates/tower-api/src/models/app_statistics.rs +++ b/crates/tower-api/src/models/app_statistics.rs @@ -3,7 +3,7 @@ * * REST API to interact with Tower Services. * - * The version of the OpenAPI document: v0.5.23 + * The version of the OpenAPI document: v0.6.3 * Contact: hello@tower.dev * Generated by: https://openapi-generator.tech */ diff --git a/crates/tower-api/src/models/app_summary.rs b/crates/tower-api/src/models/app_summary.rs index 2c5ca011..f6e8688d 100644 --- a/crates/tower-api/src/models/app_summary.rs +++ b/crates/tower-api/src/models/app_summary.rs @@ -3,7 +3,7 @@ * * REST API to interact with Tower Services. * - * The version of the OpenAPI document: v0.5.23 + * The version of the OpenAPI document: v0.6.3 * Contact: hello@tower.dev * Generated by: https://openapi-generator.tech */ diff --git a/crates/tower-api/src/models/app_version.rs b/crates/tower-api/src/models/app_version.rs index aecf75c7..43c43fe9 100644 --- a/crates/tower-api/src/models/app_version.rs +++ b/crates/tower-api/src/models/app_version.rs @@ -3,7 +3,7 @@ * * REST API to interact with Tower Services. * - * The version of the OpenAPI document: v0.5.23 + * The version of the OpenAPI document: v0.6.3 * Contact: hello@tower.dev * Generated by: https://openapi-generator.tech */ diff --git a/crates/tower-api/src/models/cancel_run_response.rs b/crates/tower-api/src/models/cancel_run_response.rs index 03b3af90..ff32cb47 100644 --- a/crates/tower-api/src/models/cancel_run_response.rs +++ b/crates/tower-api/src/models/cancel_run_response.rs @@ -3,7 +3,7 @@ * * REST API to interact with Tower Services. * - * The version of the OpenAPI document: v0.5.23 + * The version of the OpenAPI document: v0.6.3 * Contact: hello@tower.dev * Generated by: https://openapi-generator.tech */ diff --git a/crates/tower-api/src/models/catalog.rs b/crates/tower-api/src/models/catalog.rs index 4347e485..2c12df4d 100644 --- a/crates/tower-api/src/models/catalog.rs +++ b/crates/tower-api/src/models/catalog.rs @@ -3,7 +3,7 @@ * * REST API to interact with Tower Services. * - * The version of the OpenAPI document: v0.5.23 + * The version of the OpenAPI document: v0.6.3 * Contact: hello@tower.dev * Generated by: https://openapi-generator.tech */ diff --git a/crates/tower-api/src/models/catalog_property.rs b/crates/tower-api/src/models/catalog_property.rs index 81849353..882f8b77 100644 --- a/crates/tower-api/src/models/catalog_property.rs +++ b/crates/tower-api/src/models/catalog_property.rs @@ -3,7 +3,7 @@ * * REST API to interact with Tower Services. * - * The version of the OpenAPI document: v0.5.23 + * The version of the OpenAPI document: v0.6.3 * Contact: hello@tower.dev * Generated by: https://openapi-generator.tech */ diff --git a/crates/tower-api/src/models/claim_device_login_ticket_params.rs b/crates/tower-api/src/models/claim_device_login_ticket_params.rs index d33d3967..e3965e8a 100644 --- a/crates/tower-api/src/models/claim_device_login_ticket_params.rs +++ b/crates/tower-api/src/models/claim_device_login_ticket_params.rs @@ -3,7 +3,7 @@ * * REST API to interact with Tower Services. * - * The version of the OpenAPI document: v0.5.23 + * The version of the OpenAPI document: v0.6.3 * Contact: hello@tower.dev * Generated by: https://openapi-generator.tech */ diff --git a/crates/tower-api/src/models/claim_device_login_ticket_response.rs b/crates/tower-api/src/models/claim_device_login_ticket_response.rs index 08ab208c..a9446135 100644 --- a/crates/tower-api/src/models/claim_device_login_ticket_response.rs +++ b/crates/tower-api/src/models/claim_device_login_ticket_response.rs @@ -3,7 +3,7 @@ * * REST API to interact with Tower Services. * - * The version of the OpenAPI document: v0.5.23 + * The version of the OpenAPI document: v0.6.3 * Contact: hello@tower.dev * Generated by: https://openapi-generator.tech */ diff --git a/crates/tower-api/src/models/create_account_params.rs b/crates/tower-api/src/models/create_account_params.rs index 408d1403..6e845cb8 100644 --- a/crates/tower-api/src/models/create_account_params.rs +++ b/crates/tower-api/src/models/create_account_params.rs @@ -3,7 +3,7 @@ * * REST API to interact with Tower Services. * - * The version of the OpenAPI document: v0.5.23 + * The version of the OpenAPI document: v0.6.3 * Contact: hello@tower.dev * Generated by: https://openapi-generator.tech */ diff --git a/crates/tower-api/src/models/create_account_params_flags_struct.rs b/crates/tower-api/src/models/create_account_params_flags_struct.rs index ce05443c..1a67be61 100644 --- a/crates/tower-api/src/models/create_account_params_flags_struct.rs +++ b/crates/tower-api/src/models/create_account_params_flags_struct.rs @@ -3,7 +3,7 @@ * * REST API to interact with Tower Services. * - * The version of the OpenAPI document: v0.5.23 + * The version of the OpenAPI document: v0.6.3 * Contact: hello@tower.dev * Generated by: https://openapi-generator.tech */ diff --git a/crates/tower-api/src/models/create_account_response.rs b/crates/tower-api/src/models/create_account_response.rs index c41c58b1..4b2d9829 100644 --- a/crates/tower-api/src/models/create_account_response.rs +++ b/crates/tower-api/src/models/create_account_response.rs @@ -3,7 +3,7 @@ * * REST API to interact with Tower Services. * - * The version of the OpenAPI document: v0.5.23 + * The version of the OpenAPI document: v0.6.3 * Contact: hello@tower.dev * Generated by: https://openapi-generator.tech */ diff --git a/crates/tower-api/src/models/create_api_key_params.rs b/crates/tower-api/src/models/create_api_key_params.rs index 189b0596..b47a6e13 100644 --- a/crates/tower-api/src/models/create_api_key_params.rs +++ b/crates/tower-api/src/models/create_api_key_params.rs @@ -3,7 +3,7 @@ * * REST API to interact with Tower Services. * - * The version of the OpenAPI document: v0.5.23 + * The version of the OpenAPI document: v0.6.3 * Contact: hello@tower.dev * Generated by: https://openapi-generator.tech */ diff --git a/crates/tower-api/src/models/create_api_key_response.rs b/crates/tower-api/src/models/create_api_key_response.rs index 046483d6..80731a40 100644 --- a/crates/tower-api/src/models/create_api_key_response.rs +++ b/crates/tower-api/src/models/create_api_key_response.rs @@ -3,7 +3,7 @@ * * REST API to interact with Tower Services. * - * The version of the OpenAPI document: v0.5.23 + * The version of the OpenAPI document: v0.6.3 * Contact: hello@tower.dev * Generated by: https://openapi-generator.tech */ diff --git a/crates/tower-api/src/models/create_app_params.rs b/crates/tower-api/src/models/create_app_params.rs index f37cc621..a3638b55 100644 --- a/crates/tower-api/src/models/create_app_params.rs +++ b/crates/tower-api/src/models/create_app_params.rs @@ -3,7 +3,7 @@ * * REST API to interact with Tower Services. * - * The version of the OpenAPI document: v0.5.23 + * The version of the OpenAPI document: v0.6.3 * Contact: hello@tower.dev * Generated by: https://openapi-generator.tech */ diff --git a/crates/tower-api/src/models/create_app_response.rs b/crates/tower-api/src/models/create_app_response.rs index 7509cc30..34d9cbab 100644 --- a/crates/tower-api/src/models/create_app_response.rs +++ b/crates/tower-api/src/models/create_app_response.rs @@ -3,7 +3,7 @@ * * REST API to interact with Tower Services. * - * The version of the OpenAPI document: v0.5.23 + * The version of the OpenAPI document: v0.6.3 * Contact: hello@tower.dev * Generated by: https://openapi-generator.tech */ diff --git a/crates/tower-api/src/models/create_catalog_params.rs b/crates/tower-api/src/models/create_catalog_params.rs index 8eb7f7cb..90582248 100644 --- a/crates/tower-api/src/models/create_catalog_params.rs +++ b/crates/tower-api/src/models/create_catalog_params.rs @@ -3,7 +3,7 @@ * * REST API to interact with Tower Services. * - * The version of the OpenAPI document: v0.5.23 + * The version of the OpenAPI document: v0.6.3 * Contact: hello@tower.dev * Generated by: https://openapi-generator.tech */ @@ -47,6 +47,8 @@ pub enum Type { SnowflakeOpenCatalog, #[serde(rename = "apache-polaris")] ApachePolaris, + #[serde(rename = "cloudflare-r2-catalog")] + CloudflareR2Catalog, } impl Default for Type { diff --git a/crates/tower-api/src/models/create_catalog_response.rs b/crates/tower-api/src/models/create_catalog_response.rs index bde6c20b..b65bc497 100644 --- a/crates/tower-api/src/models/create_catalog_response.rs +++ b/crates/tower-api/src/models/create_catalog_response.rs @@ -3,7 +3,7 @@ * * REST API to interact with Tower Services. * - * The version of the OpenAPI document: v0.5.23 + * The version of the OpenAPI document: v0.6.3 * Contact: hello@tower.dev * Generated by: https://openapi-generator.tech */ diff --git a/crates/tower-api/src/models/create_device_login_ticket_response.rs b/crates/tower-api/src/models/create_device_login_ticket_response.rs index 8f4c72a3..93893ec5 100644 --- a/crates/tower-api/src/models/create_device_login_ticket_response.rs +++ b/crates/tower-api/src/models/create_device_login_ticket_response.rs @@ -3,7 +3,7 @@ * * REST API to interact with Tower Services. * - * The version of the OpenAPI document: v0.5.23 + * The version of the OpenAPI document: v0.6.3 * Contact: hello@tower.dev * Generated by: https://openapi-generator.tech */ diff --git a/crates/tower-api/src/models/create_password_reset_params.rs b/crates/tower-api/src/models/create_password_reset_params.rs index bfec67cd..e0b6892a 100644 --- a/crates/tower-api/src/models/create_password_reset_params.rs +++ b/crates/tower-api/src/models/create_password_reset_params.rs @@ -3,7 +3,7 @@ * * REST API to interact with Tower Services. * - * The version of the OpenAPI document: v0.5.23 + * The version of the OpenAPI document: v0.6.3 * Contact: hello@tower.dev * Generated by: https://openapi-generator.tech */ diff --git a/crates/tower-api/src/models/create_password_reset_response.rs b/crates/tower-api/src/models/create_password_reset_response.rs index 8e306f19..c7bffc94 100644 --- a/crates/tower-api/src/models/create_password_reset_response.rs +++ b/crates/tower-api/src/models/create_password_reset_response.rs @@ -3,7 +3,7 @@ * * REST API to interact with Tower Services. * - * The version of the OpenAPI document: v0.5.23 + * The version of the OpenAPI document: v0.6.3 * Contact: hello@tower.dev * Generated by: https://openapi-generator.tech */ diff --git a/crates/tower-api/src/models/create_secret_params.rs b/crates/tower-api/src/models/create_secret_params.rs index 7f938168..952713d6 100644 --- a/crates/tower-api/src/models/create_secret_params.rs +++ b/crates/tower-api/src/models/create_secret_params.rs @@ -3,7 +3,7 @@ * * REST API to interact with Tower Services. * - * The version of the OpenAPI document: v0.5.23 + * The version of the OpenAPI document: v0.6.3 * Contact: hello@tower.dev * Generated by: https://openapi-generator.tech */ diff --git a/crates/tower-api/src/models/create_secret_response.rs b/crates/tower-api/src/models/create_secret_response.rs index 678f8173..03ff6122 100644 --- a/crates/tower-api/src/models/create_secret_response.rs +++ b/crates/tower-api/src/models/create_secret_response.rs @@ -3,7 +3,7 @@ * * REST API to interact with Tower Services. * - * The version of the OpenAPI document: v0.5.23 + * The version of the OpenAPI document: v0.6.3 * Contact: hello@tower.dev * Generated by: https://openapi-generator.tech */ diff --git a/crates/tower-api/src/models/create_session_params.rs b/crates/tower-api/src/models/create_session_params.rs index a7af824e..c47c3ae0 100644 --- a/crates/tower-api/src/models/create_session_params.rs +++ b/crates/tower-api/src/models/create_session_params.rs @@ -3,7 +3,7 @@ * * REST API to interact with Tower Services. * - * The version of the OpenAPI document: v0.5.23 + * The version of the OpenAPI document: v0.6.3 * Contact: hello@tower.dev * Generated by: https://openapi-generator.tech */ diff --git a/crates/tower-api/src/models/create_session_response.rs b/crates/tower-api/src/models/create_session_response.rs index 159459e9..4ec4d947 100644 --- a/crates/tower-api/src/models/create_session_response.rs +++ b/crates/tower-api/src/models/create_session_response.rs @@ -3,7 +3,7 @@ * * REST API to interact with Tower Services. * - * The version of the OpenAPI document: v0.5.23 + * The version of the OpenAPI document: v0.6.3 * Contact: hello@tower.dev * Generated by: https://openapi-generator.tech */ diff --git a/crates/tower-api/src/models/create_team_params.rs b/crates/tower-api/src/models/create_team_params.rs index 09b7dbb8..5f59c92d 100644 --- a/crates/tower-api/src/models/create_team_params.rs +++ b/crates/tower-api/src/models/create_team_params.rs @@ -3,7 +3,7 @@ * * REST API to interact with Tower Services. * - * The version of the OpenAPI document: v0.5.23 + * The version of the OpenAPI document: v0.6.3 * Contact: hello@tower.dev * Generated by: https://openapi-generator.tech */ diff --git a/crates/tower-api/src/models/create_team_response.rs b/crates/tower-api/src/models/create_team_response.rs index 91b4063c..e63c6923 100644 --- a/crates/tower-api/src/models/create_team_response.rs +++ b/crates/tower-api/src/models/create_team_response.rs @@ -3,7 +3,7 @@ * * REST API to interact with Tower Services. * - * The version of the OpenAPI document: v0.5.23 + * The version of the OpenAPI document: v0.6.3 * Contact: hello@tower.dev * Generated by: https://openapi-generator.tech */ diff --git a/crates/tower-api/src/models/delete_api_key_params.rs b/crates/tower-api/src/models/delete_api_key_params.rs index 5e471039..13c95185 100644 --- a/crates/tower-api/src/models/delete_api_key_params.rs +++ b/crates/tower-api/src/models/delete_api_key_params.rs @@ -3,7 +3,7 @@ * * REST API to interact with Tower Services. * - * The version of the OpenAPI document: v0.5.23 + * The version of the OpenAPI document: v0.6.3 * Contact: hello@tower.dev * Generated by: https://openapi-generator.tech */ diff --git a/crates/tower-api/src/models/delete_api_key_response.rs b/crates/tower-api/src/models/delete_api_key_response.rs index 9c912a23..964a8eaf 100644 --- a/crates/tower-api/src/models/delete_api_key_response.rs +++ b/crates/tower-api/src/models/delete_api_key_response.rs @@ -3,7 +3,7 @@ * * REST API to interact with Tower Services. * - * The version of the OpenAPI document: v0.5.23 + * The version of the OpenAPI document: v0.6.3 * Contact: hello@tower.dev * Generated by: https://openapi-generator.tech */ diff --git a/crates/tower-api/src/models/delete_app_response.rs b/crates/tower-api/src/models/delete_app_response.rs index 46d979f9..592bf18a 100644 --- a/crates/tower-api/src/models/delete_app_response.rs +++ b/crates/tower-api/src/models/delete_app_response.rs @@ -3,7 +3,7 @@ * * REST API to interact with Tower Services. * - * The version of the OpenAPI document: v0.5.23 + * The version of the OpenAPI document: v0.6.3 * Contact: hello@tower.dev * Generated by: https://openapi-generator.tech */ diff --git a/crates/tower-api/src/models/delete_catalog_response.rs b/crates/tower-api/src/models/delete_catalog_response.rs index c36cf46c..8e0d205b 100644 --- a/crates/tower-api/src/models/delete_catalog_response.rs +++ b/crates/tower-api/src/models/delete_catalog_response.rs @@ -3,7 +3,7 @@ * * REST API to interact with Tower Services. * - * The version of the OpenAPI document: v0.5.23 + * The version of the OpenAPI document: v0.6.3 * Contact: hello@tower.dev * Generated by: https://openapi-generator.tech */ diff --git a/crates/tower-api/src/models/delete_secret_response.rs b/crates/tower-api/src/models/delete_secret_response.rs index 5d0b8414..f3e94e9e 100644 --- a/crates/tower-api/src/models/delete_secret_response.rs +++ b/crates/tower-api/src/models/delete_secret_response.rs @@ -3,7 +3,7 @@ * * REST API to interact with Tower Services. * - * The version of the OpenAPI document: v0.5.23 + * The version of the OpenAPI document: v0.6.3 * Contact: hello@tower.dev * Generated by: https://openapi-generator.tech */ diff --git a/crates/tower-api/src/models/delete_team_invitation_params.rs b/crates/tower-api/src/models/delete_team_invitation_params.rs index 72b5eb5c..3bd3aedd 100644 --- a/crates/tower-api/src/models/delete_team_invitation_params.rs +++ b/crates/tower-api/src/models/delete_team_invitation_params.rs @@ -3,7 +3,7 @@ * * REST API to interact with Tower Services. * - * The version of the OpenAPI document: v0.5.23 + * The version of the OpenAPI document: v0.6.3 * Contact: hello@tower.dev * Generated by: https://openapi-generator.tech */ diff --git a/crates/tower-api/src/models/delete_team_invitation_response.rs b/crates/tower-api/src/models/delete_team_invitation_response.rs index 46cb1ae4..ab963775 100644 --- a/crates/tower-api/src/models/delete_team_invitation_response.rs +++ b/crates/tower-api/src/models/delete_team_invitation_response.rs @@ -3,7 +3,7 @@ * * REST API to interact with Tower Services. * - * The version of the OpenAPI document: v0.5.23 + * The version of the OpenAPI document: v0.6.3 * Contact: hello@tower.dev * Generated by: https://openapi-generator.tech */ diff --git a/crates/tower-api/src/models/delete_team_params.rs b/crates/tower-api/src/models/delete_team_params.rs index bb989a04..d23ccd10 100644 --- a/crates/tower-api/src/models/delete_team_params.rs +++ b/crates/tower-api/src/models/delete_team_params.rs @@ -3,7 +3,7 @@ * * REST API to interact with Tower Services. * - * The version of the OpenAPI document: v0.5.23 + * The version of the OpenAPI document: v0.6.3 * Contact: hello@tower.dev * Generated by: https://openapi-generator.tech */ diff --git a/crates/tower-api/src/models/delete_team_response.rs b/crates/tower-api/src/models/delete_team_response.rs index e27ed138..e88a4a4e 100644 --- a/crates/tower-api/src/models/delete_team_response.rs +++ b/crates/tower-api/src/models/delete_team_response.rs @@ -3,7 +3,7 @@ * * REST API to interact with Tower Services. * - * The version of the OpenAPI document: v0.5.23 + * The version of the OpenAPI document: v0.6.3 * Contact: hello@tower.dev * Generated by: https://openapi-generator.tech */ diff --git a/crates/tower-api/src/models/deploy_app_response.rs b/crates/tower-api/src/models/deploy_app_response.rs index c5f38a2f..34d52d0d 100644 --- a/crates/tower-api/src/models/deploy_app_response.rs +++ b/crates/tower-api/src/models/deploy_app_response.rs @@ -3,7 +3,7 @@ * * REST API to interact with Tower Services. * - * The version of the OpenAPI document: v0.5.23 + * The version of the OpenAPI document: v0.6.3 * Contact: hello@tower.dev * Generated by: https://openapi-generator.tech */ diff --git a/crates/tower-api/src/models/describe_app_response.rs b/crates/tower-api/src/models/describe_app_response.rs index e865cff6..240fb9c9 100644 --- a/crates/tower-api/src/models/describe_app_response.rs +++ b/crates/tower-api/src/models/describe_app_response.rs @@ -3,7 +3,7 @@ * * REST API to interact with Tower Services. * - * The version of the OpenAPI document: v0.5.23 + * The version of the OpenAPI document: v0.6.3 * Contact: hello@tower.dev * Generated by: https://openapi-generator.tech */ diff --git a/crates/tower-api/src/models/describe_app_version_response.rs b/crates/tower-api/src/models/describe_app_version_response.rs index 24b1cb5d..f3fdeb73 100644 --- a/crates/tower-api/src/models/describe_app_version_response.rs +++ b/crates/tower-api/src/models/describe_app_version_response.rs @@ -3,7 +3,7 @@ * * REST API to interact with Tower Services. * - * The version of the OpenAPI document: v0.5.23 + * The version of the OpenAPI document: v0.6.3 * Contact: hello@tower.dev * Generated by: https://openapi-generator.tech */ diff --git a/crates/tower-api/src/models/describe_device_login_session_response.rs b/crates/tower-api/src/models/describe_device_login_session_response.rs index 0793dbae..22e02fa0 100644 --- a/crates/tower-api/src/models/describe_device_login_session_response.rs +++ b/crates/tower-api/src/models/describe_device_login_session_response.rs @@ -3,7 +3,7 @@ * * REST API to interact with Tower Services. * - * The version of the OpenAPI document: v0.5.23 + * The version of the OpenAPI document: v0.6.3 * Contact: hello@tower.dev * Generated by: https://openapi-generator.tech */ diff --git a/crates/tower-api/src/models/describe_run_logs_response.rs b/crates/tower-api/src/models/describe_run_logs_response.rs index 19a18634..9f05716a 100644 --- a/crates/tower-api/src/models/describe_run_logs_response.rs +++ b/crates/tower-api/src/models/describe_run_logs_response.rs @@ -3,7 +3,7 @@ * * REST API to interact with Tower Services. * - * The version of the OpenAPI document: v0.5.23 + * The version of the OpenAPI document: v0.6.3 * Contact: hello@tower.dev * Generated by: https://openapi-generator.tech */ diff --git a/crates/tower-api/src/models/describe_run_response.rs b/crates/tower-api/src/models/describe_run_response.rs index f04127b8..7e28f03b 100644 --- a/crates/tower-api/src/models/describe_run_response.rs +++ b/crates/tower-api/src/models/describe_run_response.rs @@ -3,7 +3,7 @@ * * REST API to interact with Tower Services. * - * The version of the OpenAPI document: v0.5.23 + * The version of the OpenAPI document: v0.6.3 * Contact: hello@tower.dev * Generated by: https://openapi-generator.tech */ diff --git a/crates/tower-api/src/models/describe_secrets_key_response.rs b/crates/tower-api/src/models/describe_secrets_key_response.rs index 8a53c13c..f9fd75c4 100644 --- a/crates/tower-api/src/models/describe_secrets_key_response.rs +++ b/crates/tower-api/src/models/describe_secrets_key_response.rs @@ -3,7 +3,7 @@ * * REST API to interact with Tower Services. * - * The version of the OpenAPI document: v0.5.23 + * The version of the OpenAPI document: v0.6.3 * Contact: hello@tower.dev * Generated by: https://openapi-generator.tech */ diff --git a/crates/tower-api/src/models/describe_session_response.rs b/crates/tower-api/src/models/describe_session_response.rs index 3dcf91a0..4693d389 100644 --- a/crates/tower-api/src/models/describe_session_response.rs +++ b/crates/tower-api/src/models/describe_session_response.rs @@ -3,7 +3,7 @@ * * REST API to interact with Tower Services. * - * The version of the OpenAPI document: v0.5.23 + * The version of the OpenAPI document: v0.6.3 * Contact: hello@tower.dev * Generated by: https://openapi-generator.tech */ diff --git a/crates/tower-api/src/models/encrypted_catalog_property.rs b/crates/tower-api/src/models/encrypted_catalog_property.rs index def93651..bf567417 100644 --- a/crates/tower-api/src/models/encrypted_catalog_property.rs +++ b/crates/tower-api/src/models/encrypted_catalog_property.rs @@ -3,7 +3,7 @@ * * REST API to interact with Tower Services. * - * The version of the OpenAPI document: v0.5.23 + * The version of the OpenAPI document: v0.6.3 * Contact: hello@tower.dev * Generated by: https://openapi-generator.tech */ diff --git a/crates/tower-api/src/models/error_detail.rs b/crates/tower-api/src/models/error_detail.rs index 5e672933..f943a76a 100644 --- a/crates/tower-api/src/models/error_detail.rs +++ b/crates/tower-api/src/models/error_detail.rs @@ -3,7 +3,7 @@ * * REST API to interact with Tower Services. * - * The version of the OpenAPI document: v0.5.23 + * The version of the OpenAPI document: v0.6.3 * Contact: hello@tower.dev * Generated by: https://openapi-generator.tech */ diff --git a/crates/tower-api/src/models/error_model.rs b/crates/tower-api/src/models/error_model.rs index 7d15c235..0e215e7d 100644 --- a/crates/tower-api/src/models/error_model.rs +++ b/crates/tower-api/src/models/error_model.rs @@ -3,7 +3,7 @@ * * REST API to interact with Tower Services. * - * The version of the OpenAPI document: v0.5.23 + * The version of the OpenAPI document: v0.6.3 * Contact: hello@tower.dev * Generated by: https://openapi-generator.tech */ diff --git a/crates/tower-api/src/models/export_catalogs_params.rs b/crates/tower-api/src/models/export_catalogs_params.rs index 1ab0f730..1c2e886f 100644 --- a/crates/tower-api/src/models/export_catalogs_params.rs +++ b/crates/tower-api/src/models/export_catalogs_params.rs @@ -3,7 +3,7 @@ * * REST API to interact with Tower Services. * - * The version of the OpenAPI document: v0.5.23 + * The version of the OpenAPI document: v0.6.3 * Contact: hello@tower.dev * Generated by: https://openapi-generator.tech */ diff --git a/crates/tower-api/src/models/export_catalogs_response.rs b/crates/tower-api/src/models/export_catalogs_response.rs index 43e7713e..297fa7eb 100644 --- a/crates/tower-api/src/models/export_catalogs_response.rs +++ b/crates/tower-api/src/models/export_catalogs_response.rs @@ -3,7 +3,7 @@ * * REST API to interact with Tower Services. * - * The version of the OpenAPI document: v0.5.23 + * The version of the OpenAPI document: v0.6.3 * Contact: hello@tower.dev * Generated by: https://openapi-generator.tech */ diff --git a/crates/tower-api/src/models/export_secrets_params.rs b/crates/tower-api/src/models/export_secrets_params.rs index cd83b955..41901a0a 100644 --- a/crates/tower-api/src/models/export_secrets_params.rs +++ b/crates/tower-api/src/models/export_secrets_params.rs @@ -3,7 +3,7 @@ * * REST API to interact with Tower Services. * - * The version of the OpenAPI document: v0.5.23 + * The version of the OpenAPI document: v0.6.3 * Contact: hello@tower.dev * Generated by: https://openapi-generator.tech */ diff --git a/crates/tower-api/src/models/export_secrets_response.rs b/crates/tower-api/src/models/export_secrets_response.rs index 9a766f17..cd3aeec4 100644 --- a/crates/tower-api/src/models/export_secrets_response.rs +++ b/crates/tower-api/src/models/export_secrets_response.rs @@ -3,7 +3,7 @@ * * REST API to interact with Tower Services. * - * The version of the OpenAPI document: v0.5.23 + * The version of the OpenAPI document: v0.6.3 * Contact: hello@tower.dev * Generated by: https://openapi-generator.tech */ diff --git a/crates/tower-api/src/models/exported_catalog.rs b/crates/tower-api/src/models/exported_catalog.rs index e62ab464..5b0f2374 100644 --- a/crates/tower-api/src/models/exported_catalog.rs +++ b/crates/tower-api/src/models/exported_catalog.rs @@ -3,7 +3,7 @@ * * REST API to interact with Tower Services. * - * The version of the OpenAPI document: v0.5.23 + * The version of the OpenAPI document: v0.6.3 * Contact: hello@tower.dev * Generated by: https://openapi-generator.tech */ diff --git a/crates/tower-api/src/models/exported_catalog_property.rs b/crates/tower-api/src/models/exported_catalog_property.rs index 08329d89..25172ed0 100644 --- a/crates/tower-api/src/models/exported_catalog_property.rs +++ b/crates/tower-api/src/models/exported_catalog_property.rs @@ -3,7 +3,7 @@ * * REST API to interact with Tower Services. * - * The version of the OpenAPI document: v0.5.23 + * The version of the OpenAPI document: v0.6.3 * Contact: hello@tower.dev * Generated by: https://openapi-generator.tech */ diff --git a/crates/tower-api/src/models/exported_secret.rs b/crates/tower-api/src/models/exported_secret.rs index 22a94d1a..6f3cc7af 100644 --- a/crates/tower-api/src/models/exported_secret.rs +++ b/crates/tower-api/src/models/exported_secret.rs @@ -3,7 +3,7 @@ * * REST API to interact with Tower Services. * - * The version of the OpenAPI document: v0.5.23 + * The version of the OpenAPI document: v0.6.3 * Contact: hello@tower.dev * Generated by: https://openapi-generator.tech */ diff --git a/crates/tower-api/src/models/generate_app_statistics_response.rs b/crates/tower-api/src/models/generate_app_statistics_response.rs index 3a7e92f6..32e50fff 100644 --- a/crates/tower-api/src/models/generate_app_statistics_response.rs +++ b/crates/tower-api/src/models/generate_app_statistics_response.rs @@ -3,7 +3,7 @@ * * REST API to interact with Tower Services. * - * The version of the OpenAPI document: v0.5.23 + * The version of the OpenAPI document: v0.6.3 * Contact: hello@tower.dev * Generated by: https://openapi-generator.tech */ diff --git a/crates/tower-api/src/models/generate_run_statistics_response.rs b/crates/tower-api/src/models/generate_run_statistics_response.rs index 547c058e..188bc565 100644 --- a/crates/tower-api/src/models/generate_run_statistics_response.rs +++ b/crates/tower-api/src/models/generate_run_statistics_response.rs @@ -3,7 +3,7 @@ * * REST API to interact with Tower Services. * - * The version of the OpenAPI document: v0.5.23 + * The version of the OpenAPI document: v0.6.3 * Contact: hello@tower.dev * Generated by: https://openapi-generator.tech */ diff --git a/crates/tower-api/src/models/invite_team_member_params.rs b/crates/tower-api/src/models/invite_team_member_params.rs index 73f11055..8e0cd0b7 100644 --- a/crates/tower-api/src/models/invite_team_member_params.rs +++ b/crates/tower-api/src/models/invite_team_member_params.rs @@ -3,7 +3,7 @@ * * REST API to interact with Tower Services. * - * The version of the OpenAPI document: v0.5.23 + * The version of the OpenAPI document: v0.6.3 * Contact: hello@tower.dev * Generated by: https://openapi-generator.tech */ diff --git a/crates/tower-api/src/models/invite_team_member_response.rs b/crates/tower-api/src/models/invite_team_member_response.rs index 276f36d8..a14221ad 100644 --- a/crates/tower-api/src/models/invite_team_member_response.rs +++ b/crates/tower-api/src/models/invite_team_member_response.rs @@ -3,7 +3,7 @@ * * REST API to interact with Tower Services. * - * The version of the OpenAPI document: v0.5.23 + * The version of the OpenAPI document: v0.6.3 * Contact: hello@tower.dev * Generated by: https://openapi-generator.tech */ diff --git a/crates/tower-api/src/models/leave_team_response.rs b/crates/tower-api/src/models/leave_team_response.rs index d211f537..400ea583 100644 --- a/crates/tower-api/src/models/leave_team_response.rs +++ b/crates/tower-api/src/models/leave_team_response.rs @@ -3,7 +3,7 @@ * * REST API to interact with Tower Services. * - * The version of the OpenAPI document: v0.5.23 + * The version of the OpenAPI document: v0.6.3 * Contact: hello@tower.dev * Generated by: https://openapi-generator.tech */ diff --git a/crates/tower-api/src/models/list_alerts_200_response.rs b/crates/tower-api/src/models/list_alerts_200_response.rs index 8625b11c..e5bfab1c 100644 --- a/crates/tower-api/src/models/list_alerts_200_response.rs +++ b/crates/tower-api/src/models/list_alerts_200_response.rs @@ -3,7 +3,7 @@ * * REST API to interact with Tower Services. * - * The version of the OpenAPI document: v0.5.23 + * The version of the OpenAPI document: v0.6.3 * Contact: hello@tower.dev * Generated by: https://openapi-generator.tech */ diff --git a/crates/tower-api/src/models/list_alerts_response.rs b/crates/tower-api/src/models/list_alerts_response.rs index 036ec12d..ee8faa72 100644 --- a/crates/tower-api/src/models/list_alerts_response.rs +++ b/crates/tower-api/src/models/list_alerts_response.rs @@ -3,7 +3,7 @@ * * REST API to interact with Tower Services. * - * The version of the OpenAPI document: v0.5.23 + * The version of the OpenAPI document: v0.6.3 * Contact: hello@tower.dev * Generated by: https://openapi-generator.tech */ diff --git a/crates/tower-api/src/models/list_api_keys_response.rs b/crates/tower-api/src/models/list_api_keys_response.rs index 240b4ca5..7287a7d1 100644 --- a/crates/tower-api/src/models/list_api_keys_response.rs +++ b/crates/tower-api/src/models/list_api_keys_response.rs @@ -3,7 +3,7 @@ * * REST API to interact with Tower Services. * - * The version of the OpenAPI document: v0.5.23 + * The version of the OpenAPI document: v0.6.3 * Contact: hello@tower.dev * Generated by: https://openapi-generator.tech */ diff --git a/crates/tower-api/src/models/list_app_environments_response.rs b/crates/tower-api/src/models/list_app_environments_response.rs index 1a281df7..86526883 100644 --- a/crates/tower-api/src/models/list_app_environments_response.rs +++ b/crates/tower-api/src/models/list_app_environments_response.rs @@ -3,7 +3,7 @@ * * REST API to interact with Tower Services. * - * The version of the OpenAPI document: v0.5.23 + * The version of the OpenAPI document: v0.6.3 * Contact: hello@tower.dev * Generated by: https://openapi-generator.tech */ diff --git a/crates/tower-api/src/models/list_app_versions_response.rs b/crates/tower-api/src/models/list_app_versions_response.rs index 73938658..672f3c82 100644 --- a/crates/tower-api/src/models/list_app_versions_response.rs +++ b/crates/tower-api/src/models/list_app_versions_response.rs @@ -3,7 +3,7 @@ * * REST API to interact with Tower Services. * - * The version of the OpenAPI document: v0.5.23 + * The version of the OpenAPI document: v0.6.3 * Contact: hello@tower.dev * Generated by: https://openapi-generator.tech */ diff --git a/crates/tower-api/src/models/list_apps_response.rs b/crates/tower-api/src/models/list_apps_response.rs index 91ce242a..8a4f2442 100644 --- a/crates/tower-api/src/models/list_apps_response.rs +++ b/crates/tower-api/src/models/list_apps_response.rs @@ -3,7 +3,7 @@ * * REST API to interact with Tower Services. * - * The version of the OpenAPI document: v0.5.23 + * The version of the OpenAPI document: v0.6.3 * Contact: hello@tower.dev * Generated by: https://openapi-generator.tech */ diff --git a/crates/tower-api/src/models/list_catalogs_response.rs b/crates/tower-api/src/models/list_catalogs_response.rs index feeb3da1..33d17241 100644 --- a/crates/tower-api/src/models/list_catalogs_response.rs +++ b/crates/tower-api/src/models/list_catalogs_response.rs @@ -3,7 +3,7 @@ * * REST API to interact with Tower Services. * - * The version of the OpenAPI document: v0.5.23 + * The version of the OpenAPI document: v0.6.3 * Contact: hello@tower.dev * Generated by: https://openapi-generator.tech */ diff --git a/crates/tower-api/src/models/list_my_team_invitations_response.rs b/crates/tower-api/src/models/list_my_team_invitations_response.rs index 6a2278b0..3365125f 100644 --- a/crates/tower-api/src/models/list_my_team_invitations_response.rs +++ b/crates/tower-api/src/models/list_my_team_invitations_response.rs @@ -3,7 +3,7 @@ * * REST API to interact with Tower Services. * - * The version of the OpenAPI document: v0.5.23 + * The version of the OpenAPI document: v0.6.3 * Contact: hello@tower.dev * Generated by: https://openapi-generator.tech */ diff --git a/crates/tower-api/src/models/list_runs_response.rs b/crates/tower-api/src/models/list_runs_response.rs index 99f46d92..b8932e07 100644 --- a/crates/tower-api/src/models/list_runs_response.rs +++ b/crates/tower-api/src/models/list_runs_response.rs @@ -3,7 +3,7 @@ * * REST API to interact with Tower Services. * - * The version of the OpenAPI document: v0.5.23 + * The version of the OpenAPI document: v0.6.3 * Contact: hello@tower.dev * Generated by: https://openapi-generator.tech */ diff --git a/crates/tower-api/src/models/list_secret_environments_response.rs b/crates/tower-api/src/models/list_secret_environments_response.rs index 95ff371b..46605b1f 100644 --- a/crates/tower-api/src/models/list_secret_environments_response.rs +++ b/crates/tower-api/src/models/list_secret_environments_response.rs @@ -3,7 +3,7 @@ * * REST API to interact with Tower Services. * - * The version of the OpenAPI document: v0.5.23 + * The version of the OpenAPI document: v0.6.3 * Contact: hello@tower.dev * Generated by: https://openapi-generator.tech */ diff --git a/crates/tower-api/src/models/list_secrets_response.rs b/crates/tower-api/src/models/list_secrets_response.rs index e65b988e..5ae5ffbf 100644 --- a/crates/tower-api/src/models/list_secrets_response.rs +++ b/crates/tower-api/src/models/list_secrets_response.rs @@ -3,7 +3,7 @@ * * REST API to interact with Tower Services. * - * The version of the OpenAPI document: v0.5.23 + * The version of the OpenAPI document: v0.6.3 * Contact: hello@tower.dev * Generated by: https://openapi-generator.tech */ diff --git a/crates/tower-api/src/models/list_team_invitations_response.rs b/crates/tower-api/src/models/list_team_invitations_response.rs index 09471a0d..c34b76b3 100644 --- a/crates/tower-api/src/models/list_team_invitations_response.rs +++ b/crates/tower-api/src/models/list_team_invitations_response.rs @@ -3,7 +3,7 @@ * * REST API to interact with Tower Services. * - * The version of the OpenAPI document: v0.5.23 + * The version of the OpenAPI document: v0.6.3 * Contact: hello@tower.dev * Generated by: https://openapi-generator.tech */ diff --git a/crates/tower-api/src/models/list_team_members_response.rs b/crates/tower-api/src/models/list_team_members_response.rs index 7bc3667e..82fa49d3 100644 --- a/crates/tower-api/src/models/list_team_members_response.rs +++ b/crates/tower-api/src/models/list_team_members_response.rs @@ -3,7 +3,7 @@ * * REST API to interact with Tower Services. * - * The version of the OpenAPI document: v0.5.23 + * The version of the OpenAPI document: v0.6.3 * Contact: hello@tower.dev * Generated by: https://openapi-generator.tech */ diff --git a/crates/tower-api/src/models/list_teams_response.rs b/crates/tower-api/src/models/list_teams_response.rs index 6ebafa68..61d038a8 100644 --- a/crates/tower-api/src/models/list_teams_response.rs +++ b/crates/tower-api/src/models/list_teams_response.rs @@ -3,7 +3,7 @@ * * REST API to interact with Tower Services. * - * The version of the OpenAPI document: v0.5.23 + * The version of the OpenAPI document: v0.6.3 * Contact: hello@tower.dev * Generated by: https://openapi-generator.tech */ diff --git a/crates/tower-api/src/models/log_line.rs b/crates/tower-api/src/models/log_line.rs index f950aafa..b24ce7f9 100644 --- a/crates/tower-api/src/models/log_line.rs +++ b/crates/tower-api/src/models/log_line.rs @@ -3,7 +3,7 @@ * * REST API to interact with Tower Services. * - * The version of the OpenAPI document: v0.5.23 + * The version of the OpenAPI document: v0.6.3 * Contact: hello@tower.dev * Generated by: https://openapi-generator.tech */ diff --git a/crates/tower-api/src/models/mod.rs b/crates/tower-api/src/models/mod.rs index 3e12ab5d..22c28a51 100644 --- a/crates/tower-api/src/models/mod.rs +++ b/crates/tower-api/src/models/mod.rs @@ -190,6 +190,8 @@ pub mod run_results; pub use self::run_results::RunResults; pub mod run_statistics; pub use self::run_statistics::RunStatistics; +pub mod search_runs_response; +pub use self::search_runs_response::SearchRunsResponse; pub mod secret; pub use self::secret::Secret; pub mod series_point; diff --git a/crates/tower-api/src/models/pagination.rs b/crates/tower-api/src/models/pagination.rs index 57d75546..88a96c51 100644 --- a/crates/tower-api/src/models/pagination.rs +++ b/crates/tower-api/src/models/pagination.rs @@ -3,7 +3,7 @@ * * REST API to interact with Tower Services. * - * The version of the OpenAPI document: v0.5.23 + * The version of the OpenAPI document: v0.6.3 * Contact: hello@tower.dev * Generated by: https://openapi-generator.tech */ diff --git a/crates/tower-api/src/models/parameter.rs b/crates/tower-api/src/models/parameter.rs index 6c2f39a7..8049c9d6 100644 --- a/crates/tower-api/src/models/parameter.rs +++ b/crates/tower-api/src/models/parameter.rs @@ -3,7 +3,7 @@ * * REST API to interact with Tower Services. * - * The version of the OpenAPI document: v0.5.23 + * The version of the OpenAPI document: v0.6.3 * Contact: hello@tower.dev * Generated by: https://openapi-generator.tech */ diff --git a/crates/tower-api/src/models/refresh_session_params.rs b/crates/tower-api/src/models/refresh_session_params.rs index e041d0e2..db250e6f 100644 --- a/crates/tower-api/src/models/refresh_session_params.rs +++ b/crates/tower-api/src/models/refresh_session_params.rs @@ -3,7 +3,7 @@ * * REST API to interact with Tower Services. * - * The version of the OpenAPI document: v0.5.23 + * The version of the OpenAPI document: v0.6.3 * Contact: hello@tower.dev * Generated by: https://openapi-generator.tech */ diff --git a/crates/tower-api/src/models/refresh_session_response.rs b/crates/tower-api/src/models/refresh_session_response.rs index d460dabf..bc47e0b2 100644 --- a/crates/tower-api/src/models/refresh_session_response.rs +++ b/crates/tower-api/src/models/refresh_session_response.rs @@ -3,7 +3,7 @@ * * REST API to interact with Tower Services. * - * The version of the OpenAPI document: v0.5.23 + * The version of the OpenAPI document: v0.6.3 * Contact: hello@tower.dev * Generated by: https://openapi-generator.tech */ diff --git a/crates/tower-api/src/models/remove_team_member_params.rs b/crates/tower-api/src/models/remove_team_member_params.rs index 3cca2531..ba382184 100644 --- a/crates/tower-api/src/models/remove_team_member_params.rs +++ b/crates/tower-api/src/models/remove_team_member_params.rs @@ -3,7 +3,7 @@ * * REST API to interact with Tower Services. * - * The version of the OpenAPI document: v0.5.23 + * The version of the OpenAPI document: v0.6.3 * Contact: hello@tower.dev * Generated by: https://openapi-generator.tech */ diff --git a/crates/tower-api/src/models/remove_team_member_response.rs b/crates/tower-api/src/models/remove_team_member_response.rs index 0ee7b65c..75d2923f 100644 --- a/crates/tower-api/src/models/remove_team_member_response.rs +++ b/crates/tower-api/src/models/remove_team_member_response.rs @@ -3,7 +3,7 @@ * * REST API to interact with Tower Services. * - * The version of the OpenAPI document: v0.5.23 + * The version of the OpenAPI document: v0.6.3 * Contact: hello@tower.dev * Generated by: https://openapi-generator.tech */ diff --git a/crates/tower-api/src/models/resend_team_invitation_params.rs b/crates/tower-api/src/models/resend_team_invitation_params.rs index d29ad4fd..8a7d6981 100644 --- a/crates/tower-api/src/models/resend_team_invitation_params.rs +++ b/crates/tower-api/src/models/resend_team_invitation_params.rs @@ -3,7 +3,7 @@ * * REST API to interact with Tower Services. * - * The version of the OpenAPI document: v0.5.23 + * The version of the OpenAPI document: v0.6.3 * Contact: hello@tower.dev * Generated by: https://openapi-generator.tech */ diff --git a/crates/tower-api/src/models/resend_team_invitation_response.rs b/crates/tower-api/src/models/resend_team_invitation_response.rs index 07bafd59..c62a365f 100644 --- a/crates/tower-api/src/models/resend_team_invitation_response.rs +++ b/crates/tower-api/src/models/resend_team_invitation_response.rs @@ -3,7 +3,7 @@ * * REST API to interact with Tower Services. * - * The version of the OpenAPI document: v0.5.23 + * The version of the OpenAPI document: v0.6.3 * Contact: hello@tower.dev * Generated by: https://openapi-generator.tech */ diff --git a/crates/tower-api/src/models/run.rs b/crates/tower-api/src/models/run.rs index af42a3c5..3adb0854 100644 --- a/crates/tower-api/src/models/run.rs +++ b/crates/tower-api/src/models/run.rs @@ -3,7 +3,7 @@ * * REST API to interact with Tower Services. * - * The version of the OpenAPI document: v0.5.23 + * The version of the OpenAPI document: v0.6.3 * Contact: hello@tower.dev * Generated by: https://openapi-generator.tech */ @@ -25,6 +25,9 @@ pub struct Run { pub ended_at: Option, #[serde(rename = "environment")] pub environment: String, + /// Exit code of the run, if the run is completed. Null if there is no exit code + #[serde(rename = "exit_code", deserialize_with = "Option::deserialize")] + pub exit_code: Option, #[serde(rename = "number")] pub number: i64, /// Parameters used to invoke this run. @@ -43,7 +46,7 @@ pub struct Run { } impl Run { - pub fn new(app_slug: String, app_version: String, cancelled_at: Option, created_at: String, ended_at: Option, environment: String, number: i64, parameters: Vec, run_id: String, scheduled_at: String, started_at: Option, status: Status, status_group: StatusGroup) -> Run { + pub fn new(app_slug: String, app_version: String, cancelled_at: Option, created_at: String, ended_at: Option, environment: String, exit_code: Option, number: i64, parameters: Vec, run_id: String, scheduled_at: String, started_at: Option, status: Status, status_group: StatusGroup) -> Run { Run { app_slug, app_version, @@ -51,6 +54,7 @@ impl Run { created_at, ended_at, environment, + exit_code, number, parameters, run_id, diff --git a/crates/tower-api/src/models/run_app_params.rs b/crates/tower-api/src/models/run_app_params.rs index bc34d13e..8d89ddee 100644 --- a/crates/tower-api/src/models/run_app_params.rs +++ b/crates/tower-api/src/models/run_app_params.rs @@ -3,7 +3,7 @@ * * REST API to interact with Tower Services. * - * The version of the OpenAPI document: v0.5.23 + * The version of the OpenAPI document: v0.6.3 * Contact: hello@tower.dev * Generated by: https://openapi-generator.tech */ diff --git a/crates/tower-api/src/models/run_app_response.rs b/crates/tower-api/src/models/run_app_response.rs index ee61bbcd..09a0bebd 100644 --- a/crates/tower-api/src/models/run_app_response.rs +++ b/crates/tower-api/src/models/run_app_response.rs @@ -3,7 +3,7 @@ * * REST API to interact with Tower Services. * - * The version of the OpenAPI document: v0.5.23 + * The version of the OpenAPI document: v0.6.3 * Contact: hello@tower.dev * Generated by: https://openapi-generator.tech */ diff --git a/crates/tower-api/src/models/run_failure_alert.rs b/crates/tower-api/src/models/run_failure_alert.rs index ed284bd8..6ce978e9 100644 --- a/crates/tower-api/src/models/run_failure_alert.rs +++ b/crates/tower-api/src/models/run_failure_alert.rs @@ -3,7 +3,7 @@ * * REST API to interact with Tower Services. * - * The version of the OpenAPI document: v0.5.23 + * The version of the OpenAPI document: v0.6.3 * Contact: hello@tower.dev * Generated by: https://openapi-generator.tech */ diff --git a/crates/tower-api/src/models/run_log_line.rs b/crates/tower-api/src/models/run_log_line.rs index e638cfa4..9794a42f 100644 --- a/crates/tower-api/src/models/run_log_line.rs +++ b/crates/tower-api/src/models/run_log_line.rs @@ -3,7 +3,7 @@ * * REST API to interact with Tower Services. * - * The version of the OpenAPI document: v0.5.23 + * The version of the OpenAPI document: v0.6.3 * Contact: hello@tower.dev * Generated by: https://openapi-generator.tech */ diff --git a/crates/tower-api/src/models/run_parameter.rs b/crates/tower-api/src/models/run_parameter.rs index 473922e6..066d44c2 100644 --- a/crates/tower-api/src/models/run_parameter.rs +++ b/crates/tower-api/src/models/run_parameter.rs @@ -3,7 +3,7 @@ * * REST API to interact with Tower Services. * - * The version of the OpenAPI document: v0.5.23 + * The version of the OpenAPI document: v0.6.3 * Contact: hello@tower.dev * Generated by: https://openapi-generator.tech */ diff --git a/crates/tower-api/src/models/run_results.rs b/crates/tower-api/src/models/run_results.rs index 95479358..f0625009 100644 --- a/crates/tower-api/src/models/run_results.rs +++ b/crates/tower-api/src/models/run_results.rs @@ -3,7 +3,7 @@ * * REST API to interact with Tower Services. * - * The version of the OpenAPI document: v0.5.23 + * The version of the OpenAPI document: v0.6.3 * Contact: hello@tower.dev * Generated by: https://openapi-generator.tech */ diff --git a/crates/tower-api/src/models/run_statistics.rs b/crates/tower-api/src/models/run_statistics.rs index d1f35429..ded34c0e 100644 --- a/crates/tower-api/src/models/run_statistics.rs +++ b/crates/tower-api/src/models/run_statistics.rs @@ -3,7 +3,7 @@ * * REST API to interact with Tower Services. * - * The version of the OpenAPI document: v0.5.23 + * The version of the OpenAPI document: v0.6.3 * Contact: hello@tower.dev * Generated by: https://openapi-generator.tech */ diff --git a/crates/tower-api/src/models/search_runs_response.rs b/crates/tower-api/src/models/search_runs_response.rs new file mode 100644 index 00000000..6f414960 --- /dev/null +++ b/crates/tower-api/src/models/search_runs_response.rs @@ -0,0 +1,34 @@ +/* + * Tower API + * + * REST API to interact with Tower Services. + * + * The version of the OpenAPI document: v0.6.3 + * Contact: hello@tower.dev + * Generated by: https://openapi-generator.tech + */ + +use crate::models; +use serde::{Deserialize, Serialize}; + +#[derive(Clone, Default, Debug, PartialEq, Serialize, Deserialize)] +pub struct SearchRunsResponse { + /// A URL to the JSON Schema for this object. + #[serde(rename = "$schema", skip_serializing_if = "Option::is_none")] + pub schema: Option, + #[serde(rename = "pages")] + pub pages: Box, + #[serde(rename = "runs")] + pub runs: Vec, +} + +impl SearchRunsResponse { + pub fn new(pages: models::Pagination, runs: Vec) -> SearchRunsResponse { + SearchRunsResponse { + schema: None, + pages: Box::new(pages), + runs, + } + } +} + diff --git a/crates/tower-api/src/models/secret.rs b/crates/tower-api/src/models/secret.rs index 993e79e2..b695504c 100644 --- a/crates/tower-api/src/models/secret.rs +++ b/crates/tower-api/src/models/secret.rs @@ -3,7 +3,7 @@ * * REST API to interact with Tower Services. * - * The version of the OpenAPI document: v0.5.23 + * The version of the OpenAPI document: v0.6.3 * Contact: hello@tower.dev * Generated by: https://openapi-generator.tech */ diff --git a/crates/tower-api/src/models/series_point.rs b/crates/tower-api/src/models/series_point.rs index 279a0e51..0b6f4f24 100644 --- a/crates/tower-api/src/models/series_point.rs +++ b/crates/tower-api/src/models/series_point.rs @@ -3,7 +3,7 @@ * * REST API to interact with Tower Services. * - * The version of the OpenAPI document: v0.5.23 + * The version of the OpenAPI document: v0.6.3 * Contact: hello@tower.dev * Generated by: https://openapi-generator.tech */ diff --git a/crates/tower-api/src/models/session.rs b/crates/tower-api/src/models/session.rs index dc03f5aa..db8b6da0 100644 --- a/crates/tower-api/src/models/session.rs +++ b/crates/tower-api/src/models/session.rs @@ -3,7 +3,7 @@ * * REST API to interact with Tower Services. * - * The version of the OpenAPI document: v0.5.23 + * The version of the OpenAPI document: v0.6.3 * Contact: hello@tower.dev * Generated by: https://openapi-generator.tech */ diff --git a/crates/tower-api/src/models/sse_warning.rs b/crates/tower-api/src/models/sse_warning.rs index b789d31c..67e31016 100644 --- a/crates/tower-api/src/models/sse_warning.rs +++ b/crates/tower-api/src/models/sse_warning.rs @@ -3,7 +3,7 @@ * * REST API to interact with Tower Services. * - * The version of the OpenAPI document: v0.5.23 + * The version of the OpenAPI document: v0.6.3 * Contact: hello@tower.dev * Generated by: https://openapi-generator.tech */ diff --git a/crates/tower-api/src/models/statistics_settings.rs b/crates/tower-api/src/models/statistics_settings.rs index 130697c4..7a4ce556 100644 --- a/crates/tower-api/src/models/statistics_settings.rs +++ b/crates/tower-api/src/models/statistics_settings.rs @@ -3,7 +3,7 @@ * * REST API to interact with Tower Services. * - * The version of the OpenAPI document: v0.5.23 + * The version of the OpenAPI document: v0.6.3 * Contact: hello@tower.dev * Generated by: https://openapi-generator.tech */ diff --git a/crates/tower-api/src/models/stream_alerts_200_response_inner.rs b/crates/tower-api/src/models/stream_alerts_200_response_inner.rs index 0cbefa59..7aa830ea 100644 --- a/crates/tower-api/src/models/stream_alerts_200_response_inner.rs +++ b/crates/tower-api/src/models/stream_alerts_200_response_inner.rs @@ -3,7 +3,7 @@ * * REST API to interact with Tower Services. * - * The version of the OpenAPI document: v0.5.23 + * The version of the OpenAPI document: v0.6.3 * Contact: hello@tower.dev * Generated by: https://openapi-generator.tech */ @@ -14,13 +14,13 @@ use serde::{Deserialize, Serialize}; #[derive(Clone, Debug, PartialEq, Serialize, Deserialize)] #[serde(untagged)] pub enum StreamAlerts200ResponseInner { - RunFailureAlert(models::RunFailureAlert), SseWarning(models::SseWarning), + RunFailureAlert(models::RunFailureAlert), } impl Default for StreamAlerts200ResponseInner { fn default() -> Self { - Self::RunFailureAlert(Default::default()) + Self::SseWarning(Default::default()) } } diff --git a/crates/tower-api/src/models/stream_run_logs_200_response_inner.rs b/crates/tower-api/src/models/stream_run_logs_200_response_inner.rs index dd91adab..a55ab09c 100644 --- a/crates/tower-api/src/models/stream_run_logs_200_response_inner.rs +++ b/crates/tower-api/src/models/stream_run_logs_200_response_inner.rs @@ -3,7 +3,7 @@ * * REST API to interact with Tower Services. * - * The version of the OpenAPI document: v0.5.23 + * The version of the OpenAPI document: v0.6.3 * Contact: hello@tower.dev * Generated by: https://openapi-generator.tech */ @@ -14,13 +14,13 @@ use serde::{Deserialize, Serialize}; #[derive(Clone, Debug, PartialEq, Serialize, Deserialize)] #[serde(untagged)] pub enum StreamRunLogs200ResponseInner { - SseWarning(models::SseWarning), LogLine(models::LogLine), + SseWarning(models::SseWarning), } impl Default for StreamRunLogs200ResponseInner { fn default() -> Self { - Self::SseWarning(Default::default()) + Self::LogLine(Default::default()) } } /// The channel (either Program or Setup) this log line belongs to. diff --git a/crates/tower-api/src/models/team.rs b/crates/tower-api/src/models/team.rs index 836265a6..6119fe0d 100644 --- a/crates/tower-api/src/models/team.rs +++ b/crates/tower-api/src/models/team.rs @@ -3,7 +3,7 @@ * * REST API to interact with Tower Services. * - * The version of the OpenAPI document: v0.5.23 + * The version of the OpenAPI document: v0.6.3 * Contact: hello@tower.dev * Generated by: https://openapi-generator.tech */ diff --git a/crates/tower-api/src/models/team_invitation.rs b/crates/tower-api/src/models/team_invitation.rs index 05332f1d..9823eca2 100644 --- a/crates/tower-api/src/models/team_invitation.rs +++ b/crates/tower-api/src/models/team_invitation.rs @@ -3,7 +3,7 @@ * * REST API to interact with Tower Services. * - * The version of the OpenAPI document: v0.5.23 + * The version of the OpenAPI document: v0.6.3 * Contact: hello@tower.dev * Generated by: https://openapi-generator.tech */ diff --git a/crates/tower-api/src/models/token.rs b/crates/tower-api/src/models/token.rs index 46f84f68..3e2540ca 100644 --- a/crates/tower-api/src/models/token.rs +++ b/crates/tower-api/src/models/token.rs @@ -3,7 +3,7 @@ * * REST API to interact with Tower Services. * - * The version of the OpenAPI document: v0.5.23 + * The version of the OpenAPI document: v0.6.3 * Contact: hello@tower.dev * Generated by: https://openapi-generator.tech */ diff --git a/crates/tower-api/src/models/update_account_slug_params.rs b/crates/tower-api/src/models/update_account_slug_params.rs index 82ef1c5f..f49dbc49 100644 --- a/crates/tower-api/src/models/update_account_slug_params.rs +++ b/crates/tower-api/src/models/update_account_slug_params.rs @@ -3,7 +3,7 @@ * * REST API to interact with Tower Services. * - * The version of the OpenAPI document: v0.5.23 + * The version of the OpenAPI document: v0.6.3 * Contact: hello@tower.dev * Generated by: https://openapi-generator.tech */ diff --git a/crates/tower-api/src/models/update_account_slug_response.rs b/crates/tower-api/src/models/update_account_slug_response.rs index 8f3cae5b..e76fd4d0 100644 --- a/crates/tower-api/src/models/update_account_slug_response.rs +++ b/crates/tower-api/src/models/update_account_slug_response.rs @@ -3,7 +3,7 @@ * * REST API to interact with Tower Services. * - * The version of the OpenAPI document: v0.5.23 + * The version of the OpenAPI document: v0.6.3 * Contact: hello@tower.dev * Generated by: https://openapi-generator.tech */ diff --git a/crates/tower-api/src/models/update_app_params.rs b/crates/tower-api/src/models/update_app_params.rs index d2bf3fdc..39c6dfe6 100644 --- a/crates/tower-api/src/models/update_app_params.rs +++ b/crates/tower-api/src/models/update_app_params.rs @@ -3,7 +3,7 @@ * * REST API to interact with Tower Services. * - * The version of the OpenAPI document: v0.5.23 + * The version of the OpenAPI document: v0.6.3 * Contact: hello@tower.dev * Generated by: https://openapi-generator.tech */ diff --git a/crates/tower-api/src/models/update_app_response.rs b/crates/tower-api/src/models/update_app_response.rs index be7e074d..b54443a2 100644 --- a/crates/tower-api/src/models/update_app_response.rs +++ b/crates/tower-api/src/models/update_app_response.rs @@ -3,7 +3,7 @@ * * REST API to interact with Tower Services. * - * The version of the OpenAPI document: v0.5.23 + * The version of the OpenAPI document: v0.6.3 * Contact: hello@tower.dev * Generated by: https://openapi-generator.tech */ diff --git a/crates/tower-api/src/models/update_catalog_params.rs b/crates/tower-api/src/models/update_catalog_params.rs index 906b8106..c7e31858 100644 --- a/crates/tower-api/src/models/update_catalog_params.rs +++ b/crates/tower-api/src/models/update_catalog_params.rs @@ -3,7 +3,7 @@ * * REST API to interact with Tower Services. * - * The version of the OpenAPI document: v0.5.23 + * The version of the OpenAPI document: v0.6.3 * Contact: hello@tower.dev * Generated by: https://openapi-generator.tech */ diff --git a/crates/tower-api/src/models/update_catalog_response.rs b/crates/tower-api/src/models/update_catalog_response.rs index b230591b..79f8c568 100644 --- a/crates/tower-api/src/models/update_catalog_response.rs +++ b/crates/tower-api/src/models/update_catalog_response.rs @@ -3,7 +3,7 @@ * * REST API to interact with Tower Services. * - * The version of the OpenAPI document: v0.5.23 + * The version of the OpenAPI document: v0.6.3 * Contact: hello@tower.dev * Generated by: https://openapi-generator.tech */ diff --git a/crates/tower-api/src/models/update_my_team_invitation_params.rs b/crates/tower-api/src/models/update_my_team_invitation_params.rs index cd5a634e..b1c1f6c9 100644 --- a/crates/tower-api/src/models/update_my_team_invitation_params.rs +++ b/crates/tower-api/src/models/update_my_team_invitation_params.rs @@ -3,7 +3,7 @@ * * REST API to interact with Tower Services. * - * The version of the OpenAPI document: v0.5.23 + * The version of the OpenAPI document: v0.6.3 * Contact: hello@tower.dev * Generated by: https://openapi-generator.tech */ diff --git a/crates/tower-api/src/models/update_my_team_invitation_response.rs b/crates/tower-api/src/models/update_my_team_invitation_response.rs index 9cd34924..b7843503 100644 --- a/crates/tower-api/src/models/update_my_team_invitation_response.rs +++ b/crates/tower-api/src/models/update_my_team_invitation_response.rs @@ -3,7 +3,7 @@ * * REST API to interact with Tower Services. * - * The version of the OpenAPI document: v0.5.23 + * The version of the OpenAPI document: v0.6.3 * Contact: hello@tower.dev * Generated by: https://openapi-generator.tech */ diff --git a/crates/tower-api/src/models/update_password_reset_params.rs b/crates/tower-api/src/models/update_password_reset_params.rs index 52319283..7a671e4f 100644 --- a/crates/tower-api/src/models/update_password_reset_params.rs +++ b/crates/tower-api/src/models/update_password_reset_params.rs @@ -3,7 +3,7 @@ * * REST API to interact with Tower Services. * - * The version of the OpenAPI document: v0.5.23 + * The version of the OpenAPI document: v0.6.3 * Contact: hello@tower.dev * Generated by: https://openapi-generator.tech */ diff --git a/crates/tower-api/src/models/update_password_reset_response.rs b/crates/tower-api/src/models/update_password_reset_response.rs index 1f689a59..1b291482 100644 --- a/crates/tower-api/src/models/update_password_reset_response.rs +++ b/crates/tower-api/src/models/update_password_reset_response.rs @@ -3,7 +3,7 @@ * * REST API to interact with Tower Services. * - * The version of the OpenAPI document: v0.5.23 + * The version of the OpenAPI document: v0.6.3 * Contact: hello@tower.dev * Generated by: https://openapi-generator.tech */ diff --git a/crates/tower-api/src/models/update_secret_params.rs b/crates/tower-api/src/models/update_secret_params.rs index 04116bd6..12613519 100644 --- a/crates/tower-api/src/models/update_secret_params.rs +++ b/crates/tower-api/src/models/update_secret_params.rs @@ -3,7 +3,7 @@ * * REST API to interact with Tower Services. * - * The version of the OpenAPI document: v0.5.23 + * The version of the OpenAPI document: v0.6.3 * Contact: hello@tower.dev * Generated by: https://openapi-generator.tech */ diff --git a/crates/tower-api/src/models/update_secret_response.rs b/crates/tower-api/src/models/update_secret_response.rs index b506ab44..5204f386 100644 --- a/crates/tower-api/src/models/update_secret_response.rs +++ b/crates/tower-api/src/models/update_secret_response.rs @@ -3,7 +3,7 @@ * * REST API to interact with Tower Services. * - * The version of the OpenAPI document: v0.5.23 + * The version of the OpenAPI document: v0.6.3 * Contact: hello@tower.dev * Generated by: https://openapi-generator.tech */ diff --git a/crates/tower-api/src/models/update_team_params.rs b/crates/tower-api/src/models/update_team_params.rs index 135258cc..9cb80b94 100644 --- a/crates/tower-api/src/models/update_team_params.rs +++ b/crates/tower-api/src/models/update_team_params.rs @@ -3,7 +3,7 @@ * * REST API to interact with Tower Services. * - * The version of the OpenAPI document: v0.5.23 + * The version of the OpenAPI document: v0.6.3 * Contact: hello@tower.dev * Generated by: https://openapi-generator.tech */ diff --git a/crates/tower-api/src/models/update_team_response.rs b/crates/tower-api/src/models/update_team_response.rs index 3dfe54d7..48eca16c 100644 --- a/crates/tower-api/src/models/update_team_response.rs +++ b/crates/tower-api/src/models/update_team_response.rs @@ -3,7 +3,7 @@ * * REST API to interact with Tower Services. * - * The version of the OpenAPI document: v0.5.23 + * The version of the OpenAPI document: v0.6.3 * Contact: hello@tower.dev * Generated by: https://openapi-generator.tech */ diff --git a/crates/tower-api/src/models/update_user_params.rs b/crates/tower-api/src/models/update_user_params.rs index 95523496..b0fb6281 100644 --- a/crates/tower-api/src/models/update_user_params.rs +++ b/crates/tower-api/src/models/update_user_params.rs @@ -3,7 +3,7 @@ * * REST API to interact with Tower Services. * - * The version of the OpenAPI document: v0.5.23 + * The version of the OpenAPI document: v0.6.3 * Contact: hello@tower.dev * Generated by: https://openapi-generator.tech */ diff --git a/crates/tower-api/src/models/update_user_response.rs b/crates/tower-api/src/models/update_user_response.rs index 4dd9a467..08ee8488 100644 --- a/crates/tower-api/src/models/update_user_response.rs +++ b/crates/tower-api/src/models/update_user_response.rs @@ -3,7 +3,7 @@ * * REST API to interact with Tower Services. * - * The version of the OpenAPI document: v0.5.23 + * The version of the OpenAPI document: v0.6.3 * Contact: hello@tower.dev * Generated by: https://openapi-generator.tech */ diff --git a/crates/tower-api/src/models/user.rs b/crates/tower-api/src/models/user.rs index cc91414b..2da8803a 100644 --- a/crates/tower-api/src/models/user.rs +++ b/crates/tower-api/src/models/user.rs @@ -3,7 +3,7 @@ * * REST API to interact with Tower Services. * - * The version of the OpenAPI document: v0.5.23 + * The version of the OpenAPI document: v0.6.3 * Contact: hello@tower.dev * Generated by: https://openapi-generator.tech */ diff --git a/scripts/rust-client-templates/Cargo.mustache b/scripts/rust-client-templates/Cargo.mustache index 69e86f6f..13842efa 100644 --- a/scripts/rust-client-templates/Cargo.mustache +++ b/scripts/rust-client-templates/Cargo.mustache @@ -7,7 +7,6 @@ rust-version = { workspace = true } license = { workspace = true } [dependencies] -log = { workspace = true } serde = { version = "^1.0", features = ["derive"] } {{#serdeWith}} serde_with = { version = "^3.8", default-features = false, features = ["base64", "std", "macros"] } diff --git a/src/tower/tower_api_client/api/default/acknowledge_alert.py b/src/tower/tower_api_client/api/default/acknowledge_alert.py index 6723ac2d..5ce161a5 100644 --- a/src/tower/tower_api_client/api/default/acknowledge_alert.py +++ b/src/tower/tower_api_client/api/default/acknowledge_alert.py @@ -10,12 +10,12 @@ def _get_kwargs( - alert_id: str, + alert_seq: int, ) -> dict[str, Any]: _kwargs: dict[str, Any] = { "method": "post", - "url": "/alerts/{alert_id}/acknowledge".format( - alert_id=alert_id, + "url": "/alerts/{alert_seq}/acknowledge".format( + alert_seq=alert_seq, ), } @@ -47,7 +47,7 @@ def _build_response( def sync_detailed( - alert_id: str, + alert_seq: int, *, client: AuthenticatedClient, ) -> Response[AcknowledgeAlertResponse]: @@ -56,7 +56,7 @@ def sync_detailed( Mark an alert as acknowledged Args: - alert_id (str): ID of the alert to acknowledge + alert_seq (int): Seq of the alert to acknowledge Raises: errors.UnexpectedStatus: If the server returns an undocumented status code and Client.raise_on_unexpected_status is True. @@ -67,7 +67,7 @@ def sync_detailed( """ kwargs = _get_kwargs( - alert_id=alert_id, + alert_seq=alert_seq, ) response = client.get_httpx_client().request( @@ -78,7 +78,7 @@ def sync_detailed( def sync( - alert_id: str, + alert_seq: int, *, client: AuthenticatedClient, ) -> Optional[AcknowledgeAlertResponse]: @@ -87,7 +87,7 @@ def sync( Mark an alert as acknowledged Args: - alert_id (str): ID of the alert to acknowledge + alert_seq (int): Seq of the alert to acknowledge Raises: errors.UnexpectedStatus: If the server returns an undocumented status code and Client.raise_on_unexpected_status is True. @@ -98,13 +98,13 @@ def sync( """ return sync_detailed( - alert_id=alert_id, + alert_seq=alert_seq, client=client, ).parsed async def asyncio_detailed( - alert_id: str, + alert_seq: int, *, client: AuthenticatedClient, ) -> Response[AcknowledgeAlertResponse]: @@ -113,7 +113,7 @@ async def asyncio_detailed( Mark an alert as acknowledged Args: - alert_id (str): ID of the alert to acknowledge + alert_seq (int): Seq of the alert to acknowledge Raises: errors.UnexpectedStatus: If the server returns an undocumented status code and Client.raise_on_unexpected_status is True. @@ -124,7 +124,7 @@ async def asyncio_detailed( """ kwargs = _get_kwargs( - alert_id=alert_id, + alert_seq=alert_seq, ) response = await client.get_async_httpx_client().request(**kwargs) @@ -133,7 +133,7 @@ async def asyncio_detailed( async def asyncio( - alert_id: str, + alert_seq: int, *, client: AuthenticatedClient, ) -> Optional[AcknowledgeAlertResponse]: @@ -142,7 +142,7 @@ async def asyncio( Mark an alert as acknowledged Args: - alert_id (str): ID of the alert to acknowledge + alert_seq (int): Seq of the alert to acknowledge Raises: errors.UnexpectedStatus: If the server returns an undocumented status code and Client.raise_on_unexpected_status is True. @@ -154,7 +154,7 @@ async def asyncio( return ( await asyncio_detailed( - alert_id=alert_id, + alert_seq=alert_seq, client=client, ) ).parsed diff --git a/src/tower/tower_api_client/api/default/create_password_reset.py b/src/tower/tower_api_client/api/default/create_password_reset.py new file mode 100644 index 00000000..c54d75de --- /dev/null +++ b/src/tower/tower_api_client/api/default/create_password_reset.py @@ -0,0 +1,172 @@ +from http import HTTPStatus +from typing import Any, Optional, Union + +import httpx + +from ... import errors +from ...client import AuthenticatedClient, Client +from ...models.create_password_reset_params import CreatePasswordResetParams +from ...models.create_password_reset_response import CreatePasswordResetResponse +from ...types import Response + + +def _get_kwargs( + *, + body: CreatePasswordResetParams, +) -> dict[str, Any]: + headers: dict[str, Any] = {} + + _kwargs: dict[str, Any] = { + "method": "post", + "url": "/accounts/password-reset", + } + + _body = body.to_dict() + + _kwargs["json"] = _body + headers["Content-Type"] = "application/json" + + _kwargs["headers"] = headers + return _kwargs + + +def _parse_response( + *, client: Union[AuthenticatedClient, Client], response: httpx.Response +) -> Optional[CreatePasswordResetResponse]: + if response.status_code == 200: + response_200 = CreatePasswordResetResponse.from_dict(response.json()) + + return response_200 + if client.raise_on_unexpected_status: + raise errors.UnexpectedStatus(response.status_code, response.content) + else: + return None + + +def _build_response( + *, client: Union[AuthenticatedClient, Client], response: httpx.Response +) -> Response[CreatePasswordResetResponse]: + return Response( + status_code=HTTPStatus(response.status_code), + content=response.content, + headers=response.headers, + parsed=_parse_response(client=client, response=response), + ) + + +def sync_detailed( + *, + client: Union[AuthenticatedClient, Client], + body: CreatePasswordResetParams, +) -> Response[CreatePasswordResetResponse]: + """Create password reset + + Starts the password reset process for an account. If an email address exists for the account + supplied, you will get a reset password email. + + Args: + body (CreatePasswordResetParams): + + Raises: + errors.UnexpectedStatus: If the server returns an undocumented status code and Client.raise_on_unexpected_status is True. + httpx.TimeoutException: If the request takes longer than Client.timeout. + + Returns: + Response[CreatePasswordResetResponse] + """ + + kwargs = _get_kwargs( + body=body, + ) + + response = client.get_httpx_client().request( + **kwargs, + ) + + return _build_response(client=client, response=response) + + +def sync( + *, + client: Union[AuthenticatedClient, Client], + body: CreatePasswordResetParams, +) -> Optional[CreatePasswordResetResponse]: + """Create password reset + + Starts the password reset process for an account. If an email address exists for the account + supplied, you will get a reset password email. + + Args: + body (CreatePasswordResetParams): + + Raises: + errors.UnexpectedStatus: If the server returns an undocumented status code and Client.raise_on_unexpected_status is True. + httpx.TimeoutException: If the request takes longer than Client.timeout. + + Returns: + CreatePasswordResetResponse + """ + + return sync_detailed( + client=client, + body=body, + ).parsed + + +async def asyncio_detailed( + *, + client: Union[AuthenticatedClient, Client], + body: CreatePasswordResetParams, +) -> Response[CreatePasswordResetResponse]: + """Create password reset + + Starts the password reset process for an account. If an email address exists for the account + supplied, you will get a reset password email. + + Args: + body (CreatePasswordResetParams): + + Raises: + errors.UnexpectedStatus: If the server returns an undocumented status code and Client.raise_on_unexpected_status is True. + httpx.TimeoutException: If the request takes longer than Client.timeout. + + Returns: + Response[CreatePasswordResetResponse] + """ + + kwargs = _get_kwargs( + body=body, + ) + + response = await client.get_async_httpx_client().request(**kwargs) + + return _build_response(client=client, response=response) + + +async def asyncio( + *, + client: Union[AuthenticatedClient, Client], + body: CreatePasswordResetParams, +) -> Optional[CreatePasswordResetResponse]: + """Create password reset + + Starts the password reset process for an account. If an email address exists for the account + supplied, you will get a reset password email. + + Args: + body (CreatePasswordResetParams): + + Raises: + errors.UnexpectedStatus: If the server returns an undocumented status code and Client.raise_on_unexpected_status is True. + httpx.TimeoutException: If the request takes longer than Client.timeout. + + Returns: + CreatePasswordResetResponse + """ + + return ( + await asyncio_detailed( + client=client, + body=body, + ) + ).parsed diff --git a/src/tower/tower_api_client/api/default/list_alerts.py b/src/tower/tower_api_client/api/default/list_alerts.py index 1157cfd2..b154f827 100644 --- a/src/tower/tower_api_client/api/default/list_alerts.py +++ b/src/tower/tower_api_client/api/default/list_alerts.py @@ -13,18 +13,16 @@ def _get_kwargs( *, alert_type: Union[Unset, str] = UNSET, - acked: Union[Unset, bool] = UNSET, start_at: Union[Unset, datetime.datetime] = UNSET, end_at: Union[Unset, datetime.datetime] = UNSET, page: Union[Unset, int] = UNSET, page_size: Union[Unset, int] = UNSET, + acked: Union[Unset, str] = UNSET, ) -> dict[str, Any]: params: dict[str, Any] = {} params["alert_type"] = alert_type - params["acked"] = acked - json_start_at: Union[Unset, str] = UNSET if not isinstance(start_at, Unset): json_start_at = start_at.isoformat() @@ -39,6 +37,8 @@ def _get_kwargs( params["page_size"] = page_size + params["acked"] = acked + params = {k: v for k, v in params.items() if v is not UNSET and v is not None} _kwargs: dict[str, Any] = { @@ -78,11 +78,11 @@ def sync_detailed( *, client: AuthenticatedClient, alert_type: Union[Unset, str] = UNSET, - acked: Union[Unset, bool] = UNSET, start_at: Union[Unset, datetime.datetime] = UNSET, end_at: Union[Unset, datetime.datetime] = UNSET, page: Union[Unset, int] = UNSET, page_size: Union[Unset, int] = UNSET, + acked: Union[Unset, str] = UNSET, ) -> Response[ListAlertsResponse]: """List alerts @@ -90,14 +90,13 @@ def sync_detailed( Args: alert_type (Union[Unset, str]): Filter alerts by alert type - acked (Union[Unset, bool]): Filter by acknowledgement status (true=acknowledged, - false=unacknowledged) start_at (Union[Unset, datetime.datetime]): Filter alerts created after or at this datetime (inclusive) end_at (Union[Unset, datetime.datetime]): Filter alerts created before or at this datetime (inclusive) page (Union[Unset, int]): The page number to fetch. page_size (Union[Unset, int]): The number of records to fetch on each page. + acked (Union[Unset, str]): Filter alerts by acknowledged status. Raises: errors.UnexpectedStatus: If the server returns an undocumented status code and Client.raise_on_unexpected_status is True. @@ -109,11 +108,11 @@ def sync_detailed( kwargs = _get_kwargs( alert_type=alert_type, - acked=acked, start_at=start_at, end_at=end_at, page=page, page_size=page_size, + acked=acked, ) response = client.get_httpx_client().request( @@ -127,11 +126,11 @@ def sync( *, client: AuthenticatedClient, alert_type: Union[Unset, str] = UNSET, - acked: Union[Unset, bool] = UNSET, start_at: Union[Unset, datetime.datetime] = UNSET, end_at: Union[Unset, datetime.datetime] = UNSET, page: Union[Unset, int] = UNSET, page_size: Union[Unset, int] = UNSET, + acked: Union[Unset, str] = UNSET, ) -> Optional[ListAlertsResponse]: """List alerts @@ -139,14 +138,13 @@ def sync( Args: alert_type (Union[Unset, str]): Filter alerts by alert type - acked (Union[Unset, bool]): Filter by acknowledgement status (true=acknowledged, - false=unacknowledged) start_at (Union[Unset, datetime.datetime]): Filter alerts created after or at this datetime (inclusive) end_at (Union[Unset, datetime.datetime]): Filter alerts created before or at this datetime (inclusive) page (Union[Unset, int]): The page number to fetch. page_size (Union[Unset, int]): The number of records to fetch on each page. + acked (Union[Unset, str]): Filter alerts by acknowledged status. Raises: errors.UnexpectedStatus: If the server returns an undocumented status code and Client.raise_on_unexpected_status is True. @@ -159,11 +157,11 @@ def sync( return sync_detailed( client=client, alert_type=alert_type, - acked=acked, start_at=start_at, end_at=end_at, page=page, page_size=page_size, + acked=acked, ).parsed @@ -171,11 +169,11 @@ async def asyncio_detailed( *, client: AuthenticatedClient, alert_type: Union[Unset, str] = UNSET, - acked: Union[Unset, bool] = UNSET, start_at: Union[Unset, datetime.datetime] = UNSET, end_at: Union[Unset, datetime.datetime] = UNSET, page: Union[Unset, int] = UNSET, page_size: Union[Unset, int] = UNSET, + acked: Union[Unset, str] = UNSET, ) -> Response[ListAlertsResponse]: """List alerts @@ -183,14 +181,13 @@ async def asyncio_detailed( Args: alert_type (Union[Unset, str]): Filter alerts by alert type - acked (Union[Unset, bool]): Filter by acknowledgement status (true=acknowledged, - false=unacknowledged) start_at (Union[Unset, datetime.datetime]): Filter alerts created after or at this datetime (inclusive) end_at (Union[Unset, datetime.datetime]): Filter alerts created before or at this datetime (inclusive) page (Union[Unset, int]): The page number to fetch. page_size (Union[Unset, int]): The number of records to fetch on each page. + acked (Union[Unset, str]): Filter alerts by acknowledged status. Raises: errors.UnexpectedStatus: If the server returns an undocumented status code and Client.raise_on_unexpected_status is True. @@ -202,11 +199,11 @@ async def asyncio_detailed( kwargs = _get_kwargs( alert_type=alert_type, - acked=acked, start_at=start_at, end_at=end_at, page=page, page_size=page_size, + acked=acked, ) response = await client.get_async_httpx_client().request(**kwargs) @@ -218,11 +215,11 @@ async def asyncio( *, client: AuthenticatedClient, alert_type: Union[Unset, str] = UNSET, - acked: Union[Unset, bool] = UNSET, start_at: Union[Unset, datetime.datetime] = UNSET, end_at: Union[Unset, datetime.datetime] = UNSET, page: Union[Unset, int] = UNSET, page_size: Union[Unset, int] = UNSET, + acked: Union[Unset, str] = UNSET, ) -> Optional[ListAlertsResponse]: """List alerts @@ -230,14 +227,13 @@ async def asyncio( Args: alert_type (Union[Unset, str]): Filter alerts by alert type - acked (Union[Unset, bool]): Filter by acknowledgement status (true=acknowledged, - false=unacknowledged) start_at (Union[Unset, datetime.datetime]): Filter alerts created after or at this datetime (inclusive) end_at (Union[Unset, datetime.datetime]): Filter alerts created before or at this datetime (inclusive) page (Union[Unset, int]): The page number to fetch. page_size (Union[Unset, int]): The number of records to fetch on each page. + acked (Union[Unset, str]): Filter alerts by acknowledged status. Raises: errors.UnexpectedStatus: If the server returns an undocumented status code and Client.raise_on_unexpected_status is True. @@ -251,10 +247,10 @@ async def asyncio( await asyncio_detailed( client=client, alert_type=alert_type, - acked=acked, start_at=start_at, end_at=end_at, page=page, page_size=page_size, + acked=acked, ) ).parsed diff --git a/src/tower/tower_api_client/api/default/list_runs.py b/src/tower/tower_api_client/api/default/list_runs.py index 6bdafe7c..88c4cc49 100644 --- a/src/tower/tower_api_client/api/default/list_runs.py +++ b/src/tower/tower_api_client/api/default/list_runs.py @@ -14,8 +14,8 @@ def _get_kwargs( slug: str, *, - page: Union[Unset, int] = UNSET, - page_size: Union[Unset, int] = UNSET, + page: Union[Unset, int] = 1, + page_size: Union[Unset, int] = 20, status: Union[Unset, list[ListRunsStatusItem]] = UNSET, start_at: Union[Unset, datetime.datetime] = UNSET, end_at: Union[Unset, datetime.datetime] = UNSET, @@ -86,8 +86,8 @@ def sync_detailed( slug: str, *, client: AuthenticatedClient, - page: Union[Unset, int] = UNSET, - page_size: Union[Unset, int] = UNSET, + page: Union[Unset, int] = 1, + page_size: Union[Unset, int] = 20, status: Union[Unset, list[ListRunsStatusItem]] = UNSET, start_at: Union[Unset, datetime.datetime] = UNSET, end_at: Union[Unset, datetime.datetime] = UNSET, @@ -99,8 +99,8 @@ def sync_detailed( Args: slug (str): The slug of the app to fetch runs for. - page (Union[Unset, int]): The page number to fetch. - page_size (Union[Unset, int]): The number of records to fetch on each page. + page (Union[Unset, int]): The page number to fetch. Default: 1. + page_size (Union[Unset, int]): The number of records to fetch on each page. Default: 20. status (Union[Unset, list[ListRunsStatusItem]]): Filter runs by status(es) (comma separated for multiple). start_at (Union[Unset, datetime.datetime]): Filter runs scheduled after or at this @@ -136,8 +136,8 @@ def sync( slug: str, *, client: AuthenticatedClient, - page: Union[Unset, int] = UNSET, - page_size: Union[Unset, int] = UNSET, + page: Union[Unset, int] = 1, + page_size: Union[Unset, int] = 20, status: Union[Unset, list[ListRunsStatusItem]] = UNSET, start_at: Union[Unset, datetime.datetime] = UNSET, end_at: Union[Unset, datetime.datetime] = UNSET, @@ -149,8 +149,8 @@ def sync( Args: slug (str): The slug of the app to fetch runs for. - page (Union[Unset, int]): The page number to fetch. - page_size (Union[Unset, int]): The number of records to fetch on each page. + page (Union[Unset, int]): The page number to fetch. Default: 1. + page_size (Union[Unset, int]): The number of records to fetch on each page. Default: 20. status (Union[Unset, list[ListRunsStatusItem]]): Filter runs by status(es) (comma separated for multiple). start_at (Union[Unset, datetime.datetime]): Filter runs scheduled after or at this @@ -181,8 +181,8 @@ async def asyncio_detailed( slug: str, *, client: AuthenticatedClient, - page: Union[Unset, int] = UNSET, - page_size: Union[Unset, int] = UNSET, + page: Union[Unset, int] = 1, + page_size: Union[Unset, int] = 20, status: Union[Unset, list[ListRunsStatusItem]] = UNSET, start_at: Union[Unset, datetime.datetime] = UNSET, end_at: Union[Unset, datetime.datetime] = UNSET, @@ -194,8 +194,8 @@ async def asyncio_detailed( Args: slug (str): The slug of the app to fetch runs for. - page (Union[Unset, int]): The page number to fetch. - page_size (Union[Unset, int]): The number of records to fetch on each page. + page (Union[Unset, int]): The page number to fetch. Default: 1. + page_size (Union[Unset, int]): The number of records to fetch on each page. Default: 20. status (Union[Unset, list[ListRunsStatusItem]]): Filter runs by status(es) (comma separated for multiple). start_at (Union[Unset, datetime.datetime]): Filter runs scheduled after or at this @@ -229,8 +229,8 @@ async def asyncio( slug: str, *, client: AuthenticatedClient, - page: Union[Unset, int] = UNSET, - page_size: Union[Unset, int] = UNSET, + page: Union[Unset, int] = 1, + page_size: Union[Unset, int] = 20, status: Union[Unset, list[ListRunsStatusItem]] = UNSET, start_at: Union[Unset, datetime.datetime] = UNSET, end_at: Union[Unset, datetime.datetime] = UNSET, @@ -242,8 +242,8 @@ async def asyncio( Args: slug (str): The slug of the app to fetch runs for. - page (Union[Unset, int]): The page number to fetch. - page_size (Union[Unset, int]): The number of records to fetch on each page. + page (Union[Unset, int]): The page number to fetch. Default: 1. + page_size (Union[Unset, int]): The number of records to fetch on each page. Default: 20. status (Union[Unset, list[ListRunsStatusItem]]): Filter runs by status(es) (comma separated for multiple). start_at (Union[Unset, datetime.datetime]): Filter runs scheduled after or at this diff --git a/src/tower/tower_api_client/api/default/search_runs.py b/src/tower/tower_api_client/api/default/search_runs.py new file mode 100644 index 00000000..9999fe9b --- /dev/null +++ b/src/tower/tower_api_client/api/default/search_runs.py @@ -0,0 +1,253 @@ +import datetime +from http import HTTPStatus +from typing import Any, Optional, Union + +import httpx + +from ... import errors +from ...client import AuthenticatedClient, Client +from ...models.search_runs_response import SearchRunsResponse +from ...models.search_runs_status_item import SearchRunsStatusItem +from ...types import UNSET, Response, Unset + + +def _get_kwargs( + *, + page: Union[Unset, int] = 1, + page_size: Union[Unset, int] = 20, + status: Union[Unset, list[SearchRunsStatusItem]] = UNSET, + start_at: Union[Unset, datetime.datetime] = UNSET, + end_at: Union[Unset, datetime.datetime] = UNSET, +) -> dict[str, Any]: + params: dict[str, Any] = {} + + params["page"] = page + + params["page_size"] = page_size + + json_status: Union[Unset, list[str]] = UNSET + if not isinstance(status, Unset): + json_status = [] + for status_item_data in status: + status_item = status_item_data.value + json_status.append(status_item) + + params["status"] = json_status + + json_start_at: Union[Unset, str] = UNSET + if not isinstance(start_at, Unset): + json_start_at = start_at.isoformat() + params["start_at"] = json_start_at + + json_end_at: Union[Unset, str] = UNSET + if not isinstance(end_at, Unset): + json_end_at = end_at.isoformat() + params["end_at"] = json_end_at + + params = {k: v for k, v in params.items() if v is not UNSET and v is not None} + + _kwargs: dict[str, Any] = { + "method": "get", + "url": "/runs", + "params": params, + } + + return _kwargs + + +def _parse_response( + *, client: Union[AuthenticatedClient, Client], response: httpx.Response +) -> Optional[SearchRunsResponse]: + if response.status_code == 200: + response_200 = SearchRunsResponse.from_dict(response.json()) + + return response_200 + if client.raise_on_unexpected_status: + raise errors.UnexpectedStatus(response.status_code, response.content) + else: + return None + + +def _build_response( + *, client: Union[AuthenticatedClient, Client], response: httpx.Response +) -> Response[SearchRunsResponse]: + return Response( + status_code=HTTPStatus(response.status_code), + content=response.content, + headers=response.headers, + parsed=_parse_response(client=client, response=response), + ) + + +def sync_detailed( + *, + client: AuthenticatedClient, + page: Union[Unset, int] = 1, + page_size: Union[Unset, int] = 20, + status: Union[Unset, list[SearchRunsStatusItem]] = UNSET, + start_at: Union[Unset, datetime.datetime] = UNSET, + end_at: Union[Unset, datetime.datetime] = UNSET, +) -> Response[SearchRunsResponse]: + """Search runs + + Search, filter, and list runs across all of the apps in your account. + + Args: + page (Union[Unset, int]): The page number to fetch. Default: 1. + page_size (Union[Unset, int]): The number of records to fetch on each page. Default: 20. + status (Union[Unset, list[SearchRunsStatusItem]]): Filter runs by status(es). Define + multiple with a comma-separated list. Supplying none will return all statuses. + start_at (Union[Unset, datetime.datetime]): Filter runs scheduled after this datetime + (inclusive). Provide timestamps in ISO-8601 format. + end_at (Union[Unset, datetime.datetime]): Filter runs scheduled before or at this datetime + (inclusive). Provide timestamps in ISO-8601 format. + + Raises: + errors.UnexpectedStatus: If the server returns an undocumented status code and Client.raise_on_unexpected_status is True. + httpx.TimeoutException: If the request takes longer than Client.timeout. + + Returns: + Response[SearchRunsResponse] + """ + + kwargs = _get_kwargs( + page=page, + page_size=page_size, + status=status, + start_at=start_at, + end_at=end_at, + ) + + response = client.get_httpx_client().request( + **kwargs, + ) + + return _build_response(client=client, response=response) + + +def sync( + *, + client: AuthenticatedClient, + page: Union[Unset, int] = 1, + page_size: Union[Unset, int] = 20, + status: Union[Unset, list[SearchRunsStatusItem]] = UNSET, + start_at: Union[Unset, datetime.datetime] = UNSET, + end_at: Union[Unset, datetime.datetime] = UNSET, +) -> Optional[SearchRunsResponse]: + """Search runs + + Search, filter, and list runs across all of the apps in your account. + + Args: + page (Union[Unset, int]): The page number to fetch. Default: 1. + page_size (Union[Unset, int]): The number of records to fetch on each page. Default: 20. + status (Union[Unset, list[SearchRunsStatusItem]]): Filter runs by status(es). Define + multiple with a comma-separated list. Supplying none will return all statuses. + start_at (Union[Unset, datetime.datetime]): Filter runs scheduled after this datetime + (inclusive). Provide timestamps in ISO-8601 format. + end_at (Union[Unset, datetime.datetime]): Filter runs scheduled before or at this datetime + (inclusive). Provide timestamps in ISO-8601 format. + + Raises: + errors.UnexpectedStatus: If the server returns an undocumented status code and Client.raise_on_unexpected_status is True. + httpx.TimeoutException: If the request takes longer than Client.timeout. + + Returns: + SearchRunsResponse + """ + + return sync_detailed( + client=client, + page=page, + page_size=page_size, + status=status, + start_at=start_at, + end_at=end_at, + ).parsed + + +async def asyncio_detailed( + *, + client: AuthenticatedClient, + page: Union[Unset, int] = 1, + page_size: Union[Unset, int] = 20, + status: Union[Unset, list[SearchRunsStatusItem]] = UNSET, + start_at: Union[Unset, datetime.datetime] = UNSET, + end_at: Union[Unset, datetime.datetime] = UNSET, +) -> Response[SearchRunsResponse]: + """Search runs + + Search, filter, and list runs across all of the apps in your account. + + Args: + page (Union[Unset, int]): The page number to fetch. Default: 1. + page_size (Union[Unset, int]): The number of records to fetch on each page. Default: 20. + status (Union[Unset, list[SearchRunsStatusItem]]): Filter runs by status(es). Define + multiple with a comma-separated list. Supplying none will return all statuses. + start_at (Union[Unset, datetime.datetime]): Filter runs scheduled after this datetime + (inclusive). Provide timestamps in ISO-8601 format. + end_at (Union[Unset, datetime.datetime]): Filter runs scheduled before or at this datetime + (inclusive). Provide timestamps in ISO-8601 format. + + Raises: + errors.UnexpectedStatus: If the server returns an undocumented status code and Client.raise_on_unexpected_status is True. + httpx.TimeoutException: If the request takes longer than Client.timeout. + + Returns: + Response[SearchRunsResponse] + """ + + kwargs = _get_kwargs( + page=page, + page_size=page_size, + status=status, + start_at=start_at, + end_at=end_at, + ) + + response = await client.get_async_httpx_client().request(**kwargs) + + return _build_response(client=client, response=response) + + +async def asyncio( + *, + client: AuthenticatedClient, + page: Union[Unset, int] = 1, + page_size: Union[Unset, int] = 20, + status: Union[Unset, list[SearchRunsStatusItem]] = UNSET, + start_at: Union[Unset, datetime.datetime] = UNSET, + end_at: Union[Unset, datetime.datetime] = UNSET, +) -> Optional[SearchRunsResponse]: + """Search runs + + Search, filter, and list runs across all of the apps in your account. + + Args: + page (Union[Unset, int]): The page number to fetch. Default: 1. + page_size (Union[Unset, int]): The number of records to fetch on each page. Default: 20. + status (Union[Unset, list[SearchRunsStatusItem]]): Filter runs by status(es). Define + multiple with a comma-separated list. Supplying none will return all statuses. + start_at (Union[Unset, datetime.datetime]): Filter runs scheduled after this datetime + (inclusive). Provide timestamps in ISO-8601 format. + end_at (Union[Unset, datetime.datetime]): Filter runs scheduled before or at this datetime + (inclusive). Provide timestamps in ISO-8601 format. + + Raises: + errors.UnexpectedStatus: If the server returns an undocumented status code and Client.raise_on_unexpected_status is True. + httpx.TimeoutException: If the request takes longer than Client.timeout. + + Returns: + SearchRunsResponse + """ + + return ( + await asyncio_detailed( + client=client, + page=page, + page_size=page_size, + status=status, + start_at=start_at, + end_at=end_at, + ) + ).parsed diff --git a/src/tower/tower_api_client/api/default/stream_alerts.py b/src/tower/tower_api_client/api/default/stream_alerts.py new file mode 100644 index 00000000..18534507 --- /dev/null +++ b/src/tower/tower_api_client/api/default/stream_alerts.py @@ -0,0 +1,158 @@ +from http import HTTPStatus +from typing import Any, Optional, Union + +import httpx + +from ... import errors +from ...client import AuthenticatedClient, Client +from ...models.run_failure_alert import RunFailureAlert +from ...models.sse_warning import SSEWarning +from ...types import Response + + +def _get_kwargs() -> dict[str, Any]: + _kwargs: dict[str, Any] = { + "method": "get", + "url": "/alerts/stream", + } + + return _kwargs + + +def _parse_response( + *, client: Union[AuthenticatedClient, Client], response: httpx.Response +) -> Optional[list[Union["RunFailureAlert", "SSEWarning"]]]: + if response.status_code == 200: + response_200 = [] + _response_200 = response.text + for response_200_item_data in _response_200: + + def _parse_response_200_item( + data: object, + ) -> Union["RunFailureAlert", "SSEWarning"]: + try: + if not isinstance(data, dict): + raise TypeError() + response_200_item_type_0 = SSEWarning.from_dict(data) + + return response_200_item_type_0 + except: # noqa: E722 + pass + if not isinstance(data, dict): + raise TypeError() + response_200_item_type_1 = RunFailureAlert.from_dict(data) + + return response_200_item_type_1 + + response_200_item = _parse_response_200_item(response_200_item_data) + + response_200.append(response_200_item) + + return response_200 + if client.raise_on_unexpected_status: + raise errors.UnexpectedStatus(response.status_code, response.content) + else: + return None + + +def _build_response( + *, client: Union[AuthenticatedClient, Client], response: httpx.Response +) -> Response[list[Union["RunFailureAlert", "SSEWarning"]]]: + return Response( + status_code=HTTPStatus(response.status_code), + content=response.content, + headers=response.headers, + parsed=_parse_response(client=client, response=response), + ) + + +def sync_detailed( + *, + client: AuthenticatedClient, +) -> Response[list[Union["RunFailureAlert", "SSEWarning"]]]: + """Stream alert notifications + + Streams alert notifications in real-time + + Raises: + errors.UnexpectedStatus: If the server returns an undocumented status code and Client.raise_on_unexpected_status is True. + httpx.TimeoutException: If the request takes longer than Client.timeout. + + Returns: + Response[list[Union['RunFailureAlert', 'SSEWarning']]] + """ + + kwargs = _get_kwargs() + + response = client.get_httpx_client().request( + **kwargs, + ) + + return _build_response(client=client, response=response) + + +def sync( + *, + client: AuthenticatedClient, +) -> Optional[list[Union["RunFailureAlert", "SSEWarning"]]]: + """Stream alert notifications + + Streams alert notifications in real-time + + Raises: + errors.UnexpectedStatus: If the server returns an undocumented status code and Client.raise_on_unexpected_status is True. + httpx.TimeoutException: If the request takes longer than Client.timeout. + + Returns: + list[Union['RunFailureAlert', 'SSEWarning']] + """ + + return sync_detailed( + client=client, + ).parsed + + +async def asyncio_detailed( + *, + client: AuthenticatedClient, +) -> Response[list[Union["RunFailureAlert", "SSEWarning"]]]: + """Stream alert notifications + + Streams alert notifications in real-time + + Raises: + errors.UnexpectedStatus: If the server returns an undocumented status code and Client.raise_on_unexpected_status is True. + httpx.TimeoutException: If the request takes longer than Client.timeout. + + Returns: + Response[list[Union['RunFailureAlert', 'SSEWarning']]] + """ + + kwargs = _get_kwargs() + + response = await client.get_async_httpx_client().request(**kwargs) + + return _build_response(client=client, response=response) + + +async def asyncio( + *, + client: AuthenticatedClient, +) -> Optional[list[Union["RunFailureAlert", "SSEWarning"]]]: + """Stream alert notifications + + Streams alert notifications in real-time + + Raises: + errors.UnexpectedStatus: If the server returns an undocumented status code and Client.raise_on_unexpected_status is True. + httpx.TimeoutException: If the request takes longer than Client.timeout. + + Returns: + list[Union['RunFailureAlert', 'SSEWarning']] + """ + + return ( + await asyncio_detailed( + client=client, + ) + ).parsed diff --git a/src/tower/tower_api_client/api/default/stream_run_logs.py b/src/tower/tower_api_client/api/default/stream_run_logs.py index 687e6b4a..9888ffef 100644 --- a/src/tower/tower_api_client/api/default/stream_run_logs.py +++ b/src/tower/tower_api_client/api/default/stream_run_logs.py @@ -6,7 +6,7 @@ from ... import errors from ...client import AuthenticatedClient, Client from ...models.log_line import LogLine -from ...models.log_line_error import LogLineError +from ...models.sse_warning import SSEWarning from ...types import Response @@ -27,7 +27,7 @@ def _get_kwargs( def _parse_response( *, client: Union[AuthenticatedClient, Client], response: httpx.Response -) -> Optional[list[Union["LogLine", "LogLineError"]]]: +) -> Optional[list[Union["LogLine", "SSEWarning"]]]: if response.status_code == 200: response_200 = [] _response_200 = response.text @@ -35,7 +35,7 @@ def _parse_response( def _parse_response_200_item( data: object, - ) -> Union["LogLine", "LogLineError"]: + ) -> Union["LogLine", "SSEWarning"]: try: if not isinstance(data, dict): raise TypeError() @@ -46,7 +46,7 @@ def _parse_response_200_item( pass if not isinstance(data, dict): raise TypeError() - response_200_item_type_1 = LogLineError.from_dict(data) + response_200_item_type_1 = SSEWarning.from_dict(data) return response_200_item_type_1 @@ -63,7 +63,7 @@ def _parse_response_200_item( def _build_response( *, client: Union[AuthenticatedClient, Client], response: httpx.Response -) -> Response[list[Union["LogLine", "LogLineError"]]]: +) -> Response[list[Union["LogLine", "SSEWarning"]]]: return Response( status_code=HTTPStatus(response.status_code), content=response.content, @@ -77,7 +77,7 @@ def sync_detailed( seq: int, *, client: AuthenticatedClient, -) -> Response[list[Union["LogLine", "LogLineError"]]]: +) -> Response[list[Union["LogLine", "SSEWarning"]]]: """Stream run logs Streams the logs associated with a particular run of an app in real-time. @@ -91,7 +91,7 @@ def sync_detailed( httpx.TimeoutException: If the request takes longer than Client.timeout. Returns: - Response[list[Union['LogLine', 'LogLineError']]] + Response[list[Union['LogLine', 'SSEWarning']]] """ kwargs = _get_kwargs( @@ -111,7 +111,7 @@ def sync( seq: int, *, client: AuthenticatedClient, -) -> Optional[list[Union["LogLine", "LogLineError"]]]: +) -> Optional[list[Union["LogLine", "SSEWarning"]]]: """Stream run logs Streams the logs associated with a particular run of an app in real-time. @@ -125,7 +125,7 @@ def sync( httpx.TimeoutException: If the request takes longer than Client.timeout. Returns: - list[Union['LogLine', 'LogLineError']] + list[Union['LogLine', 'SSEWarning']] """ return sync_detailed( @@ -140,7 +140,7 @@ async def asyncio_detailed( seq: int, *, client: AuthenticatedClient, -) -> Response[list[Union["LogLine", "LogLineError"]]]: +) -> Response[list[Union["LogLine", "SSEWarning"]]]: """Stream run logs Streams the logs associated with a particular run of an app in real-time. @@ -154,7 +154,7 @@ async def asyncio_detailed( httpx.TimeoutException: If the request takes longer than Client.timeout. Returns: - Response[list[Union['LogLine', 'LogLineError']]] + Response[list[Union['LogLine', 'SSEWarning']]] """ kwargs = _get_kwargs( @@ -172,7 +172,7 @@ async def asyncio( seq: int, *, client: AuthenticatedClient, -) -> Optional[list[Union["LogLine", "LogLineError"]]]: +) -> Optional[list[Union["LogLine", "SSEWarning"]]]: """Stream run logs Streams the logs associated with a particular run of an app in real-time. @@ -186,7 +186,7 @@ async def asyncio( httpx.TimeoutException: If the request takes longer than Client.timeout. Returns: - list[Union['LogLine', 'LogLineError']] + list[Union['LogLine', 'SSEWarning']] """ return ( diff --git a/src/tower/tower_api_client/api/default/update_password_reset.py b/src/tower/tower_api_client/api/default/update_password_reset.py new file mode 100644 index 00000000..b5ad6c2c --- /dev/null +++ b/src/tower/tower_api_client/api/default/update_password_reset.py @@ -0,0 +1,183 @@ +from http import HTTPStatus +from typing import Any, Optional, Union + +import httpx + +from ... import errors +from ...client import AuthenticatedClient, Client +from ...models.update_password_reset_params import UpdatePasswordResetParams +from ...models.update_password_reset_response import UpdatePasswordResetResponse +from ...types import Response + + +def _get_kwargs( + code: str, + *, + body: UpdatePasswordResetParams, +) -> dict[str, Any]: + headers: dict[str, Any] = {} + + _kwargs: dict[str, Any] = { + "method": "post", + "url": "/accounts/password-reset/{code}".format( + code=code, + ), + } + + _body = body.to_dict() + + _kwargs["json"] = _body + headers["Content-Type"] = "application/json" + + _kwargs["headers"] = headers + return _kwargs + + +def _parse_response( + *, client: Union[AuthenticatedClient, Client], response: httpx.Response +) -> Optional[UpdatePasswordResetResponse]: + if response.status_code == 200: + response_200 = UpdatePasswordResetResponse.from_dict(response.json()) + + return response_200 + if client.raise_on_unexpected_status: + raise errors.UnexpectedStatus(response.status_code, response.content) + else: + return None + + +def _build_response( + *, client: Union[AuthenticatedClient, Client], response: httpx.Response +) -> Response[UpdatePasswordResetResponse]: + return Response( + status_code=HTTPStatus(response.status_code), + content=response.content, + headers=response.headers, + parsed=_parse_response(client=client, response=response), + ) + + +def sync_detailed( + code: str, + *, + client: Union[AuthenticatedClient, Client], + body: UpdatePasswordResetParams, +) -> Response[UpdatePasswordResetResponse]: + """Update password reset + + Updates the password reset code with the new password + + Args: + code (str): The password reset code that was sent to you + body (UpdatePasswordResetParams): + + Raises: + errors.UnexpectedStatus: If the server returns an undocumented status code and Client.raise_on_unexpected_status is True. + httpx.TimeoutException: If the request takes longer than Client.timeout. + + Returns: + Response[UpdatePasswordResetResponse] + """ + + kwargs = _get_kwargs( + code=code, + body=body, + ) + + response = client.get_httpx_client().request( + **kwargs, + ) + + return _build_response(client=client, response=response) + + +def sync( + code: str, + *, + client: Union[AuthenticatedClient, Client], + body: UpdatePasswordResetParams, +) -> Optional[UpdatePasswordResetResponse]: + """Update password reset + + Updates the password reset code with the new password + + Args: + code (str): The password reset code that was sent to you + body (UpdatePasswordResetParams): + + Raises: + errors.UnexpectedStatus: If the server returns an undocumented status code and Client.raise_on_unexpected_status is True. + httpx.TimeoutException: If the request takes longer than Client.timeout. + + Returns: + UpdatePasswordResetResponse + """ + + return sync_detailed( + code=code, + client=client, + body=body, + ).parsed + + +async def asyncio_detailed( + code: str, + *, + client: Union[AuthenticatedClient, Client], + body: UpdatePasswordResetParams, +) -> Response[UpdatePasswordResetResponse]: + """Update password reset + + Updates the password reset code with the new password + + Args: + code (str): The password reset code that was sent to you + body (UpdatePasswordResetParams): + + Raises: + errors.UnexpectedStatus: If the server returns an undocumented status code and Client.raise_on_unexpected_status is True. + httpx.TimeoutException: If the request takes longer than Client.timeout. + + Returns: + Response[UpdatePasswordResetResponse] + """ + + kwargs = _get_kwargs( + code=code, + body=body, + ) + + response = await client.get_async_httpx_client().request(**kwargs) + + return _build_response(client=client, response=response) + + +async def asyncio( + code: str, + *, + client: Union[AuthenticatedClient, Client], + body: UpdatePasswordResetParams, +) -> Optional[UpdatePasswordResetResponse]: + """Update password reset + + Updates the password reset code with the new password + + Args: + code (str): The password reset code that was sent to you + body (UpdatePasswordResetParams): + + Raises: + errors.UnexpectedStatus: If the server returns an undocumented status code and Client.raise_on_unexpected_status is True. + httpx.TimeoutException: If the request takes longer than Client.timeout. + + Returns: + UpdatePasswordResetResponse + """ + + return ( + await asyncio_detailed( + code=code, + client=client, + body=body, + ) + ).parsed diff --git a/src/tower/tower_api_client/models/__init__.py b/src/tower/tower_api_client/models/__init__.py index a1a30cfe..861b6115 100644 --- a/src/tower/tower_api_client/models/__init__.py +++ b/src/tower/tower_api_client/models/__init__.py @@ -4,10 +4,6 @@ from .accept_invitation_response import AcceptInvitationResponse from .account import Account from .acknowledge_alert_response import AcknowledgeAlertResponse -from .alert import Alert -from .alert_alert_type import AlertAlertType -from .alert_detail import AlertDetail -from .alert_status import AlertStatus from .api_key import APIKey from .app import App from .app_statistics import AppStatistics @@ -30,6 +26,8 @@ from .create_catalog_params_type import CreateCatalogParamsType from .create_catalog_response import CreateCatalogResponse from .create_device_login_ticket_response import CreateDeviceLoginTicketResponse +from .create_password_reset_params import CreatePasswordResetParams +from .create_password_reset_response import CreatePasswordResetResponse from .create_secret_params import CreateSecretParams from .create_secret_response import CreateSecretResponse from .create_session_params import CreateSessionParams @@ -69,6 +67,7 @@ from .invite_team_member_response import InviteTeamMemberResponse from .leave_team_response import LeaveTeamResponse from .list_alerts_response import ListAlertsResponse +from .list_alerts_response_alert import ListAlertsResponseAlert from .list_api_keys_response import ListAPIKeysResponse from .list_app_environments_response import ListAppEnvironmentsResponse from .list_app_versions_response import ListAppVersionsResponse @@ -85,7 +84,6 @@ from .list_teams_response import ListTeamsResponse from .log_line import LogLine from .log_line_channel import LogLineChannel -from .log_line_error import LogLineError from .pagination import Pagination from .parameter import Parameter from .refresh_session_params import RefreshSessionParams @@ -98,15 +96,19 @@ from .run_app_params import RunAppParams from .run_app_params_parameters import RunAppParamsParameters from .run_app_response import RunAppResponse +from .run_failure_alert import RunFailureAlert from .run_log_line import RunLogLine from .run_parameter import RunParameter from .run_results import RunResults from .run_statistics import RunStatistics from .run_status import RunStatus from .run_status_group import RunStatusGroup +from .search_runs_response import SearchRunsResponse +from .search_runs_status_item import SearchRunsStatusItem from .secret import Secret from .series_point import SeriesPoint from .session import Session +from .sse_warning import SSEWarning from .statistics_settings import StatisticsSettings from .team import Team from .team_invitation import TeamInvitation @@ -119,6 +121,8 @@ from .update_catalog_response import UpdateCatalogResponse from .update_my_team_invitation_params import UpdateMyTeamInvitationParams from .update_my_team_invitation_response import UpdateMyTeamInvitationResponse +from .update_password_reset_params import UpdatePasswordResetParams +from .update_password_reset_response import UpdatePasswordResetResponse from .update_secret_params import UpdateSecretParams from .update_secret_response import UpdateSecretResponse from .update_team_params import UpdateTeamParams @@ -132,10 +136,6 @@ "AcceptInvitationResponse", "Account", "AcknowledgeAlertResponse", - "Alert", - "AlertAlertType", - "AlertDetail", - "AlertStatus", "APIKey", "App", "AppStatistics", @@ -158,6 +158,8 @@ "CreateCatalogParamsType", "CreateCatalogResponse", "CreateDeviceLoginTicketResponse", + "CreatePasswordResetParams", + "CreatePasswordResetResponse", "CreateSecretParams", "CreateSecretResponse", "CreateSessionParams", @@ -197,6 +199,7 @@ "InviteTeamMemberResponse", "LeaveTeamResponse", "ListAlertsResponse", + "ListAlertsResponseAlert", "ListAPIKeysResponse", "ListAppEnvironmentsResponse", "ListAppsResponse", @@ -213,7 +216,6 @@ "ListTeamsResponse", "LogLine", "LogLineChannel", - "LogLineError", "Pagination", "Parameter", "RefreshSessionParams", @@ -226,15 +228,19 @@ "RunAppParams", "RunAppParamsParameters", "RunAppResponse", + "RunFailureAlert", "RunLogLine", "RunParameter", "RunResults", "RunStatistics", "RunStatus", "RunStatusGroup", + "SearchRunsResponse", + "SearchRunsStatusItem", "Secret", "SeriesPoint", "Session", + "SSEWarning", "StatisticsSettings", "Team", "TeamInvitation", @@ -247,6 +253,8 @@ "UpdateCatalogResponse", "UpdateMyTeamInvitationParams", "UpdateMyTeamInvitationResponse", + "UpdatePasswordResetParams", + "UpdatePasswordResetResponse", "UpdateSecretParams", "UpdateSecretResponse", "UpdateTeamParams", diff --git a/src/tower/tower_api_client/models/alert.py b/src/tower/tower_api_client/models/alert.py deleted file mode 100644 index 4882aa9e..00000000 --- a/src/tower/tower_api_client/models/alert.py +++ /dev/null @@ -1,90 +0,0 @@ -import datetime -from collections.abc import Mapping -from typing import TYPE_CHECKING, Any, TypeVar - -from attrs import define as _attrs_define -from dateutil.parser import isoparse - -from ..models.alert_alert_type import AlertAlertType -from ..models.alert_status import AlertStatus - -if TYPE_CHECKING: - from ..models.alert_detail import AlertDetail - - -T = TypeVar("T", bound="Alert") - - -@_attrs_define -class Alert: - """ - Attributes: - alert_type (AlertAlertType): Type of the alert - created_at (datetime.datetime): Time when the alert was created - details (list['AlertDetail']): Detailed description of the alert - id (str): Unique identifier for the alert - status (AlertStatus): Status of the alert - """ - - alert_type: AlertAlertType - created_at: datetime.datetime - details: list["AlertDetail"] - id: str - status: AlertStatus - - def to_dict(self) -> dict[str, Any]: - alert_type = self.alert_type.value - - created_at = self.created_at.isoformat() - - details = [] - for details_item_data in self.details: - details_item = details_item_data.to_dict() - details.append(details_item) - - id = self.id - - status = self.status.value - - field_dict: dict[str, Any] = {} - field_dict.update( - { - "alert_type": alert_type, - "created_at": created_at, - "details": details, - "id": id, - "status": status, - } - ) - - return field_dict - - @classmethod - def from_dict(cls: type[T], src_dict: Mapping[str, Any]) -> T: - from ..models.alert_detail import AlertDetail - - d = dict(src_dict) - alert_type = AlertAlertType(d.pop("alert_type")) - - created_at = isoparse(d.pop("created_at")) - - details = [] - _details = d.pop("details") - for details_item_data in _details: - details_item = AlertDetail.from_dict(details_item_data) - - details.append(details_item) - - id = d.pop("id") - - status = AlertStatus(d.pop("status")) - - alert = cls( - alert_type=alert_type, - created_at=created_at, - details=details, - id=id, - status=status, - ) - - return alert diff --git a/src/tower/tower_api_client/models/alert_alert_type.py b/src/tower/tower_api_client/models/alert_alert_type.py deleted file mode 100644 index a93fe3e2..00000000 --- a/src/tower/tower_api_client/models/alert_alert_type.py +++ /dev/null @@ -1,9 +0,0 @@ -from enum import Enum - - -class AlertAlertType(str, Enum): - ERROR = "error" - SUCCESS = "success" - - def __str__(self) -> str: - return str(self.value) diff --git a/src/tower/tower_api_client/models/alert_detail.py b/src/tower/tower_api_client/models/alert_detail.py deleted file mode 100644 index 90ae1c29..00000000 --- a/src/tower/tower_api_client/models/alert_detail.py +++ /dev/null @@ -1,47 +0,0 @@ -from collections.abc import Mapping -from typing import Any, TypeVar - -from attrs import define as _attrs_define - -T = TypeVar("T", bound="AlertDetail") - - -@_attrs_define -class AlertDetail: - """ - Attributes: - description (str): - name (str): - """ - - description: str - name: str - - def to_dict(self) -> dict[str, Any]: - description = self.description - - name = self.name - - field_dict: dict[str, Any] = {} - field_dict.update( - { - "description": description, - "name": name, - } - ) - - return field_dict - - @classmethod - def from_dict(cls: type[T], src_dict: Mapping[str, Any]) -> T: - d = dict(src_dict) - description = d.pop("description") - - name = d.pop("name") - - alert_detail = cls( - description=description, - name=name, - ) - - return alert_detail diff --git a/src/tower/tower_api_client/models/alert_status.py b/src/tower/tower_api_client/models/alert_status.py deleted file mode 100644 index 41c75f41..00000000 --- a/src/tower/tower_api_client/models/alert_status.py +++ /dev/null @@ -1,10 +0,0 @@ -from enum import Enum - - -class AlertStatus(str, Enum): - ERRORED = "errored" - PENDING = "pending" - SENT = "sent" - - def __str__(self) -> str: - return str(self.value) diff --git a/src/tower/tower_api_client/models/create_catalog_params_type.py b/src/tower/tower_api_client/models/create_catalog_params_type.py index 3b9be242..a2a7cf10 100644 --- a/src/tower/tower_api_client/models/create_catalog_params_type.py +++ b/src/tower/tower_api_client/models/create_catalog_params_type.py @@ -3,6 +3,7 @@ class CreateCatalogParamsType(str, Enum): APACHE_POLARIS = "apache-polaris" + CLOUDFLARE_R2_CATALOG = "cloudflare-r2-catalog" SNOWFLAKE_OPEN_CATALOG = "snowflake-open-catalog" def __str__(self) -> str: diff --git a/src/tower/tower_api_client/models/create_password_reset_params.py b/src/tower/tower_api_client/models/create_password_reset_params.py new file mode 100644 index 00000000..7dd0988c --- /dev/null +++ b/src/tower/tower_api_client/models/create_password_reset_params.py @@ -0,0 +1,51 @@ +from collections.abc import Mapping +from typing import Any, TypeVar, Union + +from attrs import define as _attrs_define + +from ..types import UNSET, Unset + +T = TypeVar("T", bound="CreatePasswordResetParams") + + +@_attrs_define +class CreatePasswordResetParams: + """ + Attributes: + email (str): The email address to send the password reset email to + schema (Union[Unset, str]): A URL to the JSON Schema for this object. Example: + https://api.tower.dev/v1/schemas/CreatePasswordResetParams.json. + """ + + email: str + schema: Union[Unset, str] = UNSET + + def to_dict(self) -> dict[str, Any]: + email = self.email + + schema = self.schema + + field_dict: dict[str, Any] = {} + field_dict.update( + { + "email": email, + } + ) + if schema is not UNSET: + field_dict["$schema"] = schema + + return field_dict + + @classmethod + def from_dict(cls: type[T], src_dict: Mapping[str, Any]) -> T: + d = dict(src_dict) + email = d.pop("email") + + schema = d.pop("$schema", UNSET) + + create_password_reset_params = cls( + email=email, + schema=schema, + ) + + return create_password_reset_params diff --git a/src/tower/tower_api_client/models/create_password_reset_response.py b/src/tower/tower_api_client/models/create_password_reset_response.py new file mode 100644 index 00000000..a694a76b --- /dev/null +++ b/src/tower/tower_api_client/models/create_password_reset_response.py @@ -0,0 +1,51 @@ +from collections.abc import Mapping +from typing import Any, TypeVar, Union + +from attrs import define as _attrs_define + +from ..types import UNSET, Unset + +T = TypeVar("T", bound="CreatePasswordResetResponse") + + +@_attrs_define +class CreatePasswordResetResponse: + """ + Attributes: + ok (bool): A boolean indicating the request was successfully processed. + schema (Union[Unset, str]): A URL to the JSON Schema for this object. Example: + https://api.tower.dev/v1/schemas/CreatePasswordResetResponse.json. + """ + + ok: bool + schema: Union[Unset, str] = UNSET + + def to_dict(self) -> dict[str, Any]: + ok = self.ok + + schema = self.schema + + field_dict: dict[str, Any] = {} + field_dict.update( + { + "ok": ok, + } + ) + if schema is not UNSET: + field_dict["$schema"] = schema + + return field_dict + + @classmethod + def from_dict(cls: type[T], src_dict: Mapping[str, Any]) -> T: + d = dict(src_dict) + ok = d.pop("ok") + + schema = d.pop("$schema", UNSET) + + create_password_reset_response = cls( + ok=ok, + schema=schema, + ) + + return create_password_reset_response diff --git a/src/tower/tower_api_client/models/list_alerts_response.py b/src/tower/tower_api_client/models/list_alerts_response.py index 585f75ab..c970579a 100644 --- a/src/tower/tower_api_client/models/list_alerts_response.py +++ b/src/tower/tower_api_client/models/list_alerts_response.py @@ -6,7 +6,7 @@ from ..types import UNSET, Unset if TYPE_CHECKING: - from ..models.alert import Alert + from ..models.list_alerts_response_alert import ListAlertsResponseAlert from ..models.pagination import Pagination @@ -17,13 +17,13 @@ class ListAlertsResponse: """ Attributes: - alerts (list['Alert']): List of alerts + alerts (list['ListAlertsResponseAlert']): List of alerts pages (Pagination): schema (Union[Unset, str]): A URL to the JSON Schema for this object. Example: https://api.tower.dev/v1/schemas/ListAlertsResponse.json. """ - alerts: list["Alert"] + alerts: list["ListAlertsResponseAlert"] pages: "Pagination" schema: Union[Unset, str] = UNSET @@ -51,14 +51,14 @@ def to_dict(self) -> dict[str, Any]: @classmethod def from_dict(cls: type[T], src_dict: Mapping[str, Any]) -> T: - from ..models.alert import Alert + from ..models.list_alerts_response_alert import ListAlertsResponseAlert from ..models.pagination import Pagination d = dict(src_dict) alerts = [] _alerts = d.pop("alerts") for alerts_item_data in _alerts: - alerts_item = Alert.from_dict(alerts_item_data) + alerts_item = ListAlertsResponseAlert.from_dict(alerts_item_data) alerts.append(alerts_item) diff --git a/src/tower/tower_api_client/models/list_alerts_response_alert.py b/src/tower/tower_api_client/models/list_alerts_response_alert.py new file mode 100644 index 00000000..167646c6 --- /dev/null +++ b/src/tower/tower_api_client/models/list_alerts_response_alert.py @@ -0,0 +1,107 @@ +import datetime +from collections.abc import Mapping +from typing import TYPE_CHECKING, Any, TypeVar + +from attrs import define as _attrs_define +from attrs import field as _attrs_field +from dateutil.parser import isoparse + +if TYPE_CHECKING: + from ..models.run_failure_alert import RunFailureAlert + + +T = TypeVar("T", bound="ListAlertsResponseAlert") + + +@_attrs_define +class ListAlertsResponseAlert: + """ + Attributes: + acked (bool): Whether the alert has been acknowledged + alert_type (str): Type of the alert + created_at (datetime.datetime): When the alert was created + detail (RunFailureAlert): + seq (int): Sequence number of the alert + status (str): Current status of the alert + """ + + acked: bool + alert_type: str + created_at: datetime.datetime + detail: "RunFailureAlert" + seq: int + status: str + additional_properties: dict[str, Any] = _attrs_field(init=False, factory=dict) + + def to_dict(self) -> dict[str, Any]: + acked = self.acked + + alert_type = self.alert_type + + created_at = self.created_at.isoformat() + + detail = self.detail.to_dict() + + seq = self.seq + + status = self.status + + field_dict: dict[str, Any] = {} + field_dict.update(self.additional_properties) + field_dict.update( + { + "acked": acked, + "alert_type": alert_type, + "created_at": created_at, + "detail": detail, + "seq": seq, + "status": status, + } + ) + + return field_dict + + @classmethod + def from_dict(cls: type[T], src_dict: Mapping[str, Any]) -> T: + from ..models.run_failure_alert import RunFailureAlert + + d = dict(src_dict) + acked = d.pop("acked") + + alert_type = d.pop("alert_type") + + created_at = isoparse(d.pop("created_at")) + + detail = RunFailureAlert.from_dict(d.pop("detail")) + + seq = d.pop("seq") + + status = d.pop("status") + + list_alerts_response_alert = cls( + acked=acked, + alert_type=alert_type, + created_at=created_at, + detail=detail, + seq=seq, + status=status, + ) + + list_alerts_response_alert.additional_properties = d + return list_alerts_response_alert + + @property + def additional_keys(self) -> list[str]: + return list(self.additional_properties.keys()) + + def __getitem__(self, key: str) -> Any: + return self.additional_properties[key] + + def __setitem__(self, key: str, value: Any) -> None: + self.additional_properties[key] = value + + def __delitem__(self, key: str) -> None: + del self.additional_properties[key] + + def __contains__(self, key: str) -> bool: + return key in self.additional_properties diff --git a/src/tower/tower_api_client/models/run.py b/src/tower/tower_api_client/models/run.py index b439348c..14632d0b 100644 --- a/src/tower/tower_api_client/models/run.py +++ b/src/tower/tower_api_client/models/run.py @@ -25,6 +25,7 @@ class Run: created_at (datetime.datetime): ended_at (Union[None, datetime.datetime]): environment (str): + exit_code (Union[None, int]): Exit code of the run, if the run is completed. Null if there is no exit code number (int): parameters (list['RunParameter']): Parameters used to invoke this run. run_id (str): @@ -40,6 +41,7 @@ class Run: created_at: datetime.datetime ended_at: Union[None, datetime.datetime] environment: str + exit_code: Union[None, int] number: int parameters: list["RunParameter"] run_id: str @@ -69,6 +71,9 @@ def to_dict(self) -> dict[str, Any]: environment = self.environment + exit_code: Union[None, int] + exit_code = self.exit_code + number = self.number parameters = [] @@ -99,6 +104,7 @@ def to_dict(self) -> dict[str, Any]: "created_at": created_at, "ended_at": ended_at, "environment": environment, + "exit_code": exit_code, "number": number, "parameters": parameters, "run_id": run_id, @@ -154,6 +160,13 @@ def _parse_ended_at(data: object) -> Union[None, datetime.datetime]: environment = d.pop("environment") + def _parse_exit_code(data: object) -> Union[None, int]: + if data is None: + return data + return cast(Union[None, int], data) + + exit_code = _parse_exit_code(d.pop("exit_code")) + number = d.pop("number") parameters = [] @@ -193,6 +206,7 @@ def _parse_started_at(data: object) -> Union[None, datetime.datetime]: created_at=created_at, ended_at=ended_at, environment=environment, + exit_code=exit_code, number=number, parameters=parameters, run_id=run_id, diff --git a/src/tower/tower_api_client/models/run_failure_alert.py b/src/tower/tower_api_client/models/run_failure_alert.py new file mode 100644 index 00000000..5038c55c --- /dev/null +++ b/src/tower/tower_api_client/models/run_failure_alert.py @@ -0,0 +1,55 @@ +from collections.abc import Mapping +from typing import TYPE_CHECKING, Any, TypeVar + +from attrs import define as _attrs_define + +if TYPE_CHECKING: + from ..models.app import App + from ..models.run import Run + + +T = TypeVar("T", bound="RunFailureAlert") + + +@_attrs_define +class RunFailureAlert: + """ + Attributes: + app (App): + run (Run): + """ + + app: "App" + run: "Run" + + def to_dict(self) -> dict[str, Any]: + app = self.app.to_dict() + + run = self.run.to_dict() + + field_dict: dict[str, Any] = {} + field_dict.update( + { + "app": app, + "run": run, + } + ) + + return field_dict + + @classmethod + def from_dict(cls: type[T], src_dict: Mapping[str, Any]) -> T: + from ..models.app import App + from ..models.run import Run + + d = dict(src_dict) + app = App.from_dict(d.pop("app")) + + run = Run.from_dict(d.pop("run")) + + run_failure_alert = cls( + app=app, + run=run, + ) + + return run_failure_alert diff --git a/src/tower/tower_api_client/models/search_runs_response.py b/src/tower/tower_api_client/models/search_runs_response.py new file mode 100644 index 00000000..7ee4755d --- /dev/null +++ b/src/tower/tower_api_client/models/search_runs_response.py @@ -0,0 +1,75 @@ +from collections.abc import Mapping +from typing import TYPE_CHECKING, Any, TypeVar, Union + +from attrs import define as _attrs_define + +from ..types import UNSET, Unset + +if TYPE_CHECKING: + from ..models.pagination import Pagination + from ..models.run import Run + + +T = TypeVar("T", bound="SearchRunsResponse") + + +@_attrs_define +class SearchRunsResponse: + """ + Attributes: + pages (Pagination): + runs (list['Run']): + schema (Union[Unset, str]): A URL to the JSON Schema for this object. Example: + https://api.tower.dev/v1/schemas/SearchRunsResponse.json. + """ + + pages: "Pagination" + runs: list["Run"] + schema: Union[Unset, str] = UNSET + + def to_dict(self) -> dict[str, Any]: + pages = self.pages.to_dict() + + runs = [] + for runs_item_data in self.runs: + runs_item = runs_item_data.to_dict() + runs.append(runs_item) + + schema = self.schema + + field_dict: dict[str, Any] = {} + field_dict.update( + { + "pages": pages, + "runs": runs, + } + ) + if schema is not UNSET: + field_dict["$schema"] = schema + + return field_dict + + @classmethod + def from_dict(cls: type[T], src_dict: Mapping[str, Any]) -> T: + from ..models.pagination import Pagination + from ..models.run import Run + + d = dict(src_dict) + pages = Pagination.from_dict(d.pop("pages")) + + runs = [] + _runs = d.pop("runs") + for runs_item_data in _runs: + runs_item = Run.from_dict(runs_item_data) + + runs.append(runs_item) + + schema = d.pop("$schema", UNSET) + + search_runs_response = cls( + pages=pages, + runs=runs, + schema=schema, + ) + + return search_runs_response diff --git a/src/tower/tower_api_client/models/search_runs_status_item.py b/src/tower/tower_api_client/models/search_runs_status_item.py new file mode 100644 index 00000000..6aef57d6 --- /dev/null +++ b/src/tower/tower_api_client/models/search_runs_status_item.py @@ -0,0 +1,15 @@ +from enum import Enum + + +class SearchRunsStatusItem(str, Enum): + CANCELLED = "cancelled" + CRASHED = "crashed" + ERRORED = "errored" + EXITED = "exited" + PENDING = "pending" + RUNNING = "running" + SCHEDULED = "scheduled" + VALUE_7 = "" + + def __str__(self) -> str: + return str(self.value) diff --git a/src/tower/tower_api_client/models/log_line_error.py b/src/tower/tower_api_client/models/sse_warning.py similarity index 85% rename from src/tower/tower_api_client/models/log_line_error.py rename to src/tower/tower_api_client/models/sse_warning.py index 261b5f71..8fee3757 100644 --- a/src/tower/tower_api_client/models/log_line_error.py +++ b/src/tower/tower_api_client/models/sse_warning.py @@ -5,14 +5,14 @@ from attrs import define as _attrs_define from dateutil.parser import isoparse -T = TypeVar("T", bound="LogLineError") +T = TypeVar("T", bound="SSEWarning") @_attrs_define -class LogLineError: +class SSEWarning: """ Attributes: - content (str): Contents of the error. + content (str): Contents of the warning. reported_at (datetime.datetime): Timestamp of the event. """ @@ -41,9 +41,9 @@ def from_dict(cls: type[T], src_dict: Mapping[str, Any]) -> T: reported_at = isoparse(d.pop("reported_at")) - log_line_error = cls( + sse_warning = cls( content=content, reported_at=reported_at, ) - return log_line_error + return sse_warning diff --git a/src/tower/tower_api_client/models/update_password_reset_params.py b/src/tower/tower_api_client/models/update_password_reset_params.py new file mode 100644 index 00000000..7b55294a --- /dev/null +++ b/src/tower/tower_api_client/models/update_password_reset_params.py @@ -0,0 +1,51 @@ +from collections.abc import Mapping +from typing import Any, TypeVar, Union + +from attrs import define as _attrs_define + +from ..types import UNSET, Unset + +T = TypeVar("T", bound="UpdatePasswordResetParams") + + +@_attrs_define +class UpdatePasswordResetParams: + """ + Attributes: + password (str): The new password that you want to set for your account + schema (Union[Unset, str]): A URL to the JSON Schema for this object. Example: + https://api.tower.dev/v1/schemas/UpdatePasswordResetParams.json. + """ + + password: str + schema: Union[Unset, str] = UNSET + + def to_dict(self) -> dict[str, Any]: + password = self.password + + schema = self.schema + + field_dict: dict[str, Any] = {} + field_dict.update( + { + "password": password, + } + ) + if schema is not UNSET: + field_dict["$schema"] = schema + + return field_dict + + @classmethod + def from_dict(cls: type[T], src_dict: Mapping[str, Any]) -> T: + d = dict(src_dict) + password = d.pop("password") + + schema = d.pop("$schema", UNSET) + + update_password_reset_params = cls( + password=password, + schema=schema, + ) + + return update_password_reset_params diff --git a/src/tower/tower_api_client/models/update_password_reset_response.py b/src/tower/tower_api_client/models/update_password_reset_response.py new file mode 100644 index 00000000..62573168 --- /dev/null +++ b/src/tower/tower_api_client/models/update_password_reset_response.py @@ -0,0 +1,51 @@ +from collections.abc import Mapping +from typing import Any, TypeVar, Union + +from attrs import define as _attrs_define + +from ..types import UNSET, Unset + +T = TypeVar("T", bound="UpdatePasswordResetResponse") + + +@_attrs_define +class UpdatePasswordResetResponse: + """ + Attributes: + ok (bool): A boolean indicating the request was successfully processed. + schema (Union[Unset, str]): A URL to the JSON Schema for this object. Example: + https://api.tower.dev/v1/schemas/UpdatePasswordResetResponse.json. + """ + + ok: bool + schema: Union[Unset, str] = UNSET + + def to_dict(self) -> dict[str, Any]: + ok = self.ok + + schema = self.schema + + field_dict: dict[str, Any] = {} + field_dict.update( + { + "ok": ok, + } + ) + if schema is not UNSET: + field_dict["$schema"] = schema + + return field_dict + + @classmethod + def from_dict(cls: type[T], src_dict: Mapping[str, Any]) -> T: + d = dict(src_dict) + ok = d.pop("ok") + + schema = d.pop("$schema", UNSET) + + update_password_reset_response = cls( + ok=ok, + schema=schema, + ) + + return update_password_reset_response diff --git a/tests/tower/test_client.py b/tests/tower/test_client.py index 55174841..13598c36 100644 --- a/tests/tower/test_client.py +++ b/tests/tower/test_client.py @@ -50,6 +50,7 @@ def _create_run_response( "scheduled_at": "2025-04-25T20:54:58.761867Z", "started_at": "2025-04-25T20:54:59.366937Z", "status": status, + "exit_code": None, "status_group": status_group, "parameters": parameters } @@ -75,6 +76,7 @@ def _create_run( parameters = [] return Run( + exit_code=None, app_slug=app_slug, app_version=app_version, cancelled_at=None, From 6db00fab1df424afcbe1155b68c023c0172d5d93 Mon Sep 17 00:00:00 2001 From: Brad Heller Date: Thu, 5 Jun 2025 17:52:15 -0700 Subject: [PATCH 7/7] chore: Lock dependencies to an explicit version --- pyproject.toml | 18 ++-- uv.lock | 240 ++++++++++++++++++++++--------------------------- 2 files changed, 114 insertions(+), 144 deletions(-) diff --git a/pyproject.toml b/pyproject.toml index ca441128..4f3c0f9a 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -36,14 +36,14 @@ classifiers = [ "Topic :: Software Development :: Quality Assurance", ] dependencies = [ - "attrs>=24.2.0", - "httpx>=0.23.3", - "python-dateutil>=2.9.0.post0", + "attrs==24.2.0", + "httpx==0.28.1", + "python-dateutil==2.9.0.post0", ] [project.optional-dependencies] -ai = ["huggingface-hub>=0.30.2", "ollama>=0.4.7"] -iceberg = ["polars>=1.27.1", "pyarrow>=19.0.1", "pyiceberg>=0.9.0"] +ai = ["huggingface-hub==0.30.2", "ollama==0.4.7"] +iceberg = ["polars==1.27.1", "pyarrow==19.0.1", "pyiceberg==0.9.0"] all = ["tower[ai,iceberg]"] [tool.maturin] @@ -60,8 +60,8 @@ tower = { workspace = true } [dependency-groups] dev = [ - "openapi-python-client>=0.12.1", - "pytest>=8.3.5", - "pytest-httpx>=0.35.0", - "pyiceberg[sql-sqlite]>=0.9.0", + "openapi-python-client==0.24.3", + "pytest==8.3.5", + "pytest-httpx==0.35.0", + "pyiceberg[sql-sqlite]==0.9.0", ] diff --git a/uv.lock b/uv.lock index e613bf60..b79e08fe 100644 --- a/uv.lock +++ b/uv.lock @@ -32,11 +32,11 @@ wheels = [ [[package]] name = "attrs" -version = "25.3.0" +version = "24.2.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/5a/b0/1367933a8532ee6ff8d63537de4f1177af4bff9f3e829baf7331f595bb24/attrs-25.3.0.tar.gz", hash = "sha256:75d7cefc7fb576747b2c81b4442d4d4a1ce0900973527c011d1030fd3bf4af1b", size = 812032, upload_time = "2025-03-13T11:10:22.779Z" } +sdist = { url = "https://files.pythonhosted.org/packages/fc/0f/aafca9af9315aee06a89ffde799a10a582fe8de76c563ee80bbcdc08b3fb/attrs-24.2.0.tar.gz", hash = "sha256:5cfb1b9148b5b086569baec03f20d7b6bf3bcacc9a42bebf87ffaaca362f6346", size = 792678, upload_time = "2024-08-06T14:37:38.364Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/77/06/bb80f5f86020c4551da315d78b3ab75e8228f89f0162f2c3a819e407941a/attrs-25.3.0-py3-none-any.whl", hash = "sha256:427318ce031701fea540783410126f03899a97ffc6f61596ad581ac2e40e3bc3", size = 63815, upload_time = "2025-03-13T11:10:21.14Z" }, + { url = "https://files.pythonhosted.org/packages/6a/21/5b6702a7f963e95456c0de2d495f67bf5fd62840ac655dc451586d23d39a/attrs-24.2.0-py3-none-any.whl", hash = "sha256:81921eb96de3191c8258c199618104dd27ac608d9366f5e35d011eae1867ede2", size = 63001, upload_time = "2024-08-06T14:37:36.958Z" }, ] [[package]] @@ -270,21 +270,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/04/4b/29cac41a4d98d144bf5f6d33995617b185d14b22401f75ca86f384e87ff1/h11-0.16.0-py3-none-any.whl", hash = "sha256:63cf8bbe7522de3bf65932fda1d9c2772064ffb3dae62d55932da54b31cb6c86", size = 37515, upload_time = "2025-04-24T03:35:24.344Z" }, ] -[[package]] -name = "hf-xet" -version = "1.1.3" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/75/dc/dc091aeeb671e71cbec30e84963f9c0202c17337b24b0a800e7d205543e8/hf_xet-1.1.3.tar.gz", hash = "sha256:a5f09b1dd24e6ff6bcedb4b0ddab2d81824098bb002cf8b4ffa780545fa348c3", size = 488127, upload_time = "2025-06-04T00:47:27.456Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/9b/1f/bc01a4c0894973adebbcd4aa338a06815c76333ebb3921d94dcbd40dae6a/hf_xet-1.1.3-cp37-abi3-macosx_10_12_x86_64.whl", hash = "sha256:c3b508b5f583a75641aebf732853deb058953370ce8184f5dabc49f803b0819b", size = 2256929, upload_time = "2025-06-04T00:47:21.206Z" }, - { url = "https://files.pythonhosted.org/packages/78/07/6ef50851b5c6b45b77a6e018fa299c69a2db3b8bbd0d5af594c0238b1ceb/hf_xet-1.1.3-cp37-abi3-macosx_11_0_arm64.whl", hash = "sha256:b788a61977fbe6b5186e66239e2a329a3f0b7e7ff50dad38984c0c74f44aeca1", size = 2153719, upload_time = "2025-06-04T00:47:19.302Z" }, - { url = "https://files.pythonhosted.org/packages/52/48/e929e6e3db6e4758c2adf0f2ca2c59287f1b76229d8bdc1a4c9cfc05212e/hf_xet-1.1.3-cp37-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fd2da210856444a34aad8ada2fc12f70dabed7cc20f37e90754d1d9b43bc0534", size = 4820519, upload_time = "2025-06-04T00:47:17.244Z" }, - { url = "https://files.pythonhosted.org/packages/28/2e/03f89c5014a5aafaa9b150655f811798a317036646623bdaace25f485ae8/hf_xet-1.1.3-cp37-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:8203f52827e3df65981984936654a5b390566336956f65765a8aa58c362bb841", size = 4964121, upload_time = "2025-06-04T00:47:15.17Z" }, - { url = "https://files.pythonhosted.org/packages/47/8b/5cd399a92b47d98086f55fc72d69bc9ea5e5c6f27a9ed3e0cdd6be4e58a3/hf_xet-1.1.3-cp37-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:30c575a5306f8e6fda37edb866762140a435037365eba7a17ce7bd0bc0216a8b", size = 5283017, upload_time = "2025-06-04T00:47:23.239Z" }, - { url = "https://files.pythonhosted.org/packages/53/e3/2fcec58d2fcfd25ff07feb876f466cfa11f8dcf9d3b742c07fe9dd51ee0a/hf_xet-1.1.3-cp37-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:7c1a6aa6abed1f696f8099aa9796ca04c9ee778a58728a115607de9cc4638ff1", size = 4970349, upload_time = "2025-06-04T00:47:25.383Z" }, - { url = "https://files.pythonhosted.org/packages/53/bf/10ca917e335861101017ff46044c90e517b574fbb37219347b83be1952f6/hf_xet-1.1.3-cp37-abi3-win_amd64.whl", hash = "sha256:b578ae5ac9c056296bb0df9d018e597c8dc6390c5266f35b5c44696003cde9f3", size = 2310934, upload_time = "2025-06-04T00:47:29.632Z" }, -] - [[package]] name = "httpcore" version = "1.0.9" @@ -315,21 +300,20 @@ wheels = [ [[package]] name = "huggingface-hub" -version = "0.32.4" +version = "0.30.2" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "filelock" }, { name = "fsspec" }, - { name = "hf-xet", marker = "platform_machine == 'aarch64' or platform_machine == 'amd64' or platform_machine == 'arm64' or platform_machine == 'x86_64'" }, { name = "packaging" }, { name = "pyyaml" }, { name = "requests" }, { name = "tqdm" }, { name = "typing-extensions" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/60/c8/4f7d270285c46324fd66f62159eb16739aa5696f422dba57678a8c6b78e9/huggingface_hub-0.32.4.tar.gz", hash = "sha256:f61d45cd338736f59fb0e97550b74c24ee771bcc92c05ae0766b9116abe720be", size = 424494, upload_time = "2025-06-03T09:59:46.105Z" } +sdist = { url = "https://files.pythonhosted.org/packages/df/22/8eb91736b1dcb83d879bd49050a09df29a57cc5cd9f38e48a4b1c45ee890/huggingface_hub-0.30.2.tar.gz", hash = "sha256:9a7897c5b6fd9dad3168a794a8998d6378210f5b9688d0dfc180b1a228dc2466", size = 400868, upload_time = "2025-04-08T08:32:45.26Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/67/8b/222140f3cfb6f17b0dd8c4b9a0b36bd4ebefe9fb0098ba35d6960abcda0f/huggingface_hub-0.32.4-py3-none-any.whl", hash = "sha256:37abf8826b38d971f60d3625229221c36e53fe58060286db9baf619cfbf39767", size = 512101, upload_time = "2025-06-03T09:59:44.099Z" }, + { url = "https://files.pythonhosted.org/packages/93/27/1fb384a841e9661faad1c31cbfa62864f59632e876df5d795234da51c395/huggingface_hub-0.30.2-py3-none-any.whl", hash = "sha256:68ff05969927058cfa41df4f2155d4bb48f5f54f719dd0390103eefa9b191e28", size = 481433, upload_time = "2025-04-08T08:32:43.305Z" }, ] [[package]] @@ -541,15 +525,15 @@ wheels = [ [[package]] name = "ollama" -version = "0.5.1" +version = "0.4.7" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "httpx" }, { name = "pydantic" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/8d/96/c7fe0d2d1b3053be614822a7b722c7465161b3672ce90df71515137580a0/ollama-0.5.1.tar.gz", hash = "sha256:5a799e4dc4e7af638b11e3ae588ab17623ee019e496caaf4323efbaa8feeff93", size = 41112, upload_time = "2025-05-30T21:32:48.679Z" } +sdist = { url = "https://files.pythonhosted.org/packages/b0/6d/dc77539c735bbed5d0c873fb029fb86aa9f0163df169b34152914331c369/ollama-0.4.7.tar.gz", hash = "sha256:891dcbe54f55397d82d289c459de0ea897e103b86a3f1fad0fdb1895922a75ff", size = 12843, upload_time = "2025-01-21T18:51:48.288Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/d6/76/3f96c8cdbf3955d7a73ee94ce3e0db0755d6de1e0098a70275940d1aff2f/ollama-0.5.1-py3-none-any.whl", hash = "sha256:4c8839f35bc173c7057b1eb2cbe7f498c1a7e134eafc9192824c8aecb3617506", size = 13369, upload_time = "2025-05-30T21:32:47.429Z" }, + { url = "https://files.pythonhosted.org/packages/31/83/c3ffac86906c10184c88c2e916460806b072a2cfe34cdcaf3a0c0e836d39/ollama-0.4.7-py3-none-any.whl", hash = "sha256:85505663cca67a83707be5fb3aeff0ea72e67846cea5985529d8eca4366564a1", size = 13210, upload_time = "2025-01-21T18:51:46.199Z" }, ] [[package]] @@ -594,78 +578,65 @@ wheels = [ [[package]] name = "polars" -version = "1.30.0" +version = "1.27.1" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/82/b6/8dbdf626c0705a57f052708c9fc0860ffc2aa97955930d5faaf6a66fcfd3/polars-1.30.0.tar.gz", hash = "sha256:dfe94ae84a5efd9ba74e616e3e125b24ca155494a931890a8f17480737c4db45", size = 4668318, upload_time = "2025-05-21T13:33:24.175Z" } +sdist = { url = "https://files.pythonhosted.org/packages/e1/96/56ab877d3d690bd8e67f5c6aabfd3aa8bc7c33ee901767905f564a6ade36/polars-1.27.1.tar.gz", hash = "sha256:94fcb0216b56cd0594aa777db1760a41ad0dfffed90d2ca446cf9294d2e97f02", size = 4555382, upload_time = "2025-04-11T10:26:24.708Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/40/48/e9b2cb379abcc9f7aff2e701098fcdb9fe6d85dc4ad4cec7b35d39c70951/polars-1.30.0-cp39-abi3-macosx_10_12_x86_64.whl", hash = "sha256:4c33bc97c29b7112f0e689a2f8a33143973a3ff466c70b25c7fd1880225de6dd", size = 35704342, upload_time = "2025-05-21T13:32:22.996Z" }, - { url = "https://files.pythonhosted.org/packages/36/ca/f545f61282f75eea4dfde4db2944963dcd59abd50c20e33a1c894da44dad/polars-1.30.0-cp39-abi3-macosx_11_0_arm64.whl", hash = "sha256:e3d05914c364b8e39a5b10dcf97e84d76e516b3b1693880bf189a93aab3ca00d", size = 32459857, upload_time = "2025-05-21T13:32:27.728Z" }, - { url = "https://files.pythonhosted.org/packages/76/20/e018cd87d7cb6f8684355f31f4e193222455a6e8f7b942f4a2934f5969c7/polars-1.30.0-cp39-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1a52af3862082b868c1febeae650af8ae8a2105d2cb28f0449179a7b44f54ccf", size = 36267243, upload_time = "2025-05-21T13:32:31.796Z" }, - { url = "https://files.pythonhosted.org/packages/cb/e7/b88b973021be07b13d91b9301cc14392c994225ef5107a32a8ffd3fd6424/polars-1.30.0-cp39-abi3-manylinux_2_24_aarch64.whl", hash = "sha256:ffb3ef133454275d4254442257c5f71dd6e393ce365c97997dadeb6fa9d6d4b5", size = 33416871, upload_time = "2025-05-21T13:32:35.077Z" }, - { url = "https://files.pythonhosted.org/packages/dd/7c/d46d4381adeac537b8520b653dc30cb8b7edbf59883d71fbb989e9005de1/polars-1.30.0-cp39-abi3-win_amd64.whl", hash = "sha256:c26b633a9bd530c5fc09d317fca3bb3e16c772bd7df7549a9d8ec1934773cc5d", size = 36363630, upload_time = "2025-05-21T13:32:38.286Z" }, - { url = "https://files.pythonhosted.org/packages/fb/b5/5056d0c12aadb57390d0627492bef8b1abf3549474abb9ae0fd4e2bfa885/polars-1.30.0-cp39-abi3-win_arm64.whl", hash = "sha256:476f1bde65bc7b4d9f80af370645c2981b5798d67c151055e58534e89e96f2a8", size = 32643590, upload_time = "2025-05-21T13:32:42.107Z" }, + { url = "https://files.pythonhosted.org/packages/a0/f4/be965ca4e1372805d0d2313bb4ed8eae88804fc3bfeb6cb0a07c53191bdb/polars-1.27.1-cp39-abi3-macosx_10_12_x86_64.whl", hash = "sha256:ba7ad4f8046d00dd97c1369e46a4b7e00ffcff5d38c0f847ee4b9b1bb182fb18", size = 34756840, upload_time = "2025-04-11T10:25:19.734Z" }, + { url = "https://files.pythonhosted.org/packages/c0/1a/ae019d323e83c6e8a9b4323f3fea94e047715847dfa4c4cbaf20a6f8444e/polars-1.27.1-cp39-abi3-macosx_11_0_arm64.whl", hash = "sha256:339e3948748ad6fa7a42e613c3fb165b497ed797e93fce1aa2cddf00fbc16cac", size = 31616000, upload_time = "2025-04-11T10:25:24.867Z" }, + { url = "https://files.pythonhosted.org/packages/20/c1/c65924c0ca186f481c02b531f1ec66c34f9bbecc11d70246562bb4949876/polars-1.27.1-cp39-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f801e0d9da198eb97cfb4e8af4242b8396878ff67b655c71570b7e333102b72b", size = 35388976, upload_time = "2025-04-11T10:25:28.426Z" }, + { url = "https://files.pythonhosted.org/packages/88/c2/37720b8794935f1e77bde439564fa421a41f5fed8111aeb7b9ca0ebafb2d/polars-1.27.1-cp39-abi3-manylinux_2_24_aarch64.whl", hash = "sha256:4d18a29c65222451818b63cd397b2e95c20412ea0065d735a20a4a79a7b26e8a", size = 32586083, upload_time = "2025-04-11T10:25:32.424Z" }, + { url = "https://files.pythonhosted.org/packages/41/3d/1bb108eb278c1eafb303f78c515fb71c9828944eba3fb5c0ac432b9fad28/polars-1.27.1-cp39-abi3-win_amd64.whl", hash = "sha256:a4f832cf478b282d97f8bf86eeae2df66fa1384de1c49bc61f7224a10cc6a5df", size = 35602500, upload_time = "2025-04-11T10:25:35.701Z" }, + { url = "https://files.pythonhosted.org/packages/0f/5c/cc23daf0a228d6fadbbfc8a8c5165be33157abe5b9d72af3e127e0542857/polars-1.27.1-cp39-abi3-win_arm64.whl", hash = "sha256:4f238ee2e3c5660345cb62c0f731bbd6768362db96c058098359ecffa42c3c6c", size = 31891470, upload_time = "2025-04-11T10:25:38.74Z" }, ] [[package]] name = "pyarrow" -version = "20.0.0" +version = "19.0.1" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/a2/ee/a7810cb9f3d6e9238e61d312076a9859bf3668fd21c69744de9532383912/pyarrow-20.0.0.tar.gz", hash = "sha256:febc4a913592573c8d5805091a6c2b5064c8bd6e002131f01061797d91c783c1", size = 1125187, upload_time = "2025-04-27T12:34:23.264Z" } +sdist = { url = "https://files.pythonhosted.org/packages/7f/09/a9046344212690f0632b9c709f9bf18506522feb333c894d0de81d62341a/pyarrow-19.0.1.tar.gz", hash = "sha256:3bf266b485df66a400f282ac0b6d1b500b9d2ae73314a153dbe97d6d5cc8a99e", size = 1129437, upload_time = "2025-02-18T18:55:57.027Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/5b/23/77094eb8ee0dbe88441689cb6afc40ac312a1e15d3a7acc0586999518222/pyarrow-20.0.0-cp310-cp310-macosx_12_0_arm64.whl", hash = "sha256:c7dd06fd7d7b410ca5dc839cc9d485d2bc4ae5240851bcd45d85105cc90a47d7", size = 30832591, upload_time = "2025-04-27T12:27:27.89Z" }, - { url = "https://files.pythonhosted.org/packages/c3/d5/48cc573aff00d62913701d9fac478518f693b30c25f2c157550b0b2565cb/pyarrow-20.0.0-cp310-cp310-macosx_12_0_x86_64.whl", hash = "sha256:d5382de8dc34c943249b01c19110783d0d64b207167c728461add1ecc2db88e4", size = 32273686, upload_time = "2025-04-27T12:27:36.816Z" }, - { url = "https://files.pythonhosted.org/packages/37/df/4099b69a432b5cb412dd18adc2629975544d656df3d7fda6d73c5dba935d/pyarrow-20.0.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6415a0d0174487456ddc9beaead703d0ded5966129fa4fd3114d76b5d1c5ceae", size = 41337051, upload_time = "2025-04-27T12:27:44.4Z" }, - { url = "https://files.pythonhosted.org/packages/4c/27/99922a9ac1c9226f346e3a1e15e63dee6f623ed757ff2893f9d6994a69d3/pyarrow-20.0.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:15aa1b3b2587e74328a730457068dc6c89e6dcbf438d4369f572af9d320a25ee", size = 42404659, upload_time = "2025-04-27T12:27:51.715Z" }, - { url = "https://files.pythonhosted.org/packages/21/d1/71d91b2791b829c9e98f1e0d85be66ed93aff399f80abb99678511847eaa/pyarrow-20.0.0-cp310-cp310-manylinux_2_28_aarch64.whl", hash = "sha256:5605919fbe67a7948c1f03b9f3727d82846c053cd2ce9303ace791855923fd20", size = 40695446, upload_time = "2025-04-27T12:27:59.643Z" }, - { url = "https://files.pythonhosted.org/packages/f1/ca/ae10fba419a6e94329707487835ec721f5a95f3ac9168500bcf7aa3813c7/pyarrow-20.0.0-cp310-cp310-manylinux_2_28_x86_64.whl", hash = "sha256:a5704f29a74b81673d266e5ec1fe376f060627c2e42c5c7651288ed4b0db29e9", size = 42278528, upload_time = "2025-04-27T12:28:07.297Z" }, - { url = "https://files.pythonhosted.org/packages/7a/a6/aba40a2bf01b5d00cf9cd16d427a5da1fad0fb69b514ce8c8292ab80e968/pyarrow-20.0.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:00138f79ee1b5aca81e2bdedb91e3739b987245e11fa3c826f9e57c5d102fb75", size = 42918162, upload_time = "2025-04-27T12:28:15.716Z" }, - { url = "https://files.pythonhosted.org/packages/93/6b/98b39650cd64f32bf2ec6d627a9bd24fcb3e4e6ea1873c5e1ea8a83b1a18/pyarrow-20.0.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:f2d67ac28f57a362f1a2c1e6fa98bfe2f03230f7e15927aecd067433b1e70ce8", size = 44550319, upload_time = "2025-04-27T12:28:27.026Z" }, - { url = "https://files.pythonhosted.org/packages/ab/32/340238be1eb5037e7b5de7e640ee22334417239bc347eadefaf8c373936d/pyarrow-20.0.0-cp310-cp310-win_amd64.whl", hash = "sha256:4a8b029a07956b8d7bd742ffca25374dd3f634b35e46cc7a7c3fa4c75b297191", size = 25770759, upload_time = "2025-04-27T12:28:33.702Z" }, - { url = "https://files.pythonhosted.org/packages/47/a2/b7930824181ceadd0c63c1042d01fa4ef63eee233934826a7a2a9af6e463/pyarrow-20.0.0-cp311-cp311-macosx_12_0_arm64.whl", hash = "sha256:24ca380585444cb2a31324c546a9a56abbe87e26069189e14bdba19c86c049f0", size = 30856035, upload_time = "2025-04-27T12:28:40.78Z" }, - { url = "https://files.pythonhosted.org/packages/9b/18/c765770227d7f5bdfa8a69f64b49194352325c66a5c3bb5e332dfd5867d9/pyarrow-20.0.0-cp311-cp311-macosx_12_0_x86_64.whl", hash = "sha256:95b330059ddfdc591a3225f2d272123be26c8fa76e8c9ee1a77aad507361cfdb", size = 32309552, upload_time = "2025-04-27T12:28:47.051Z" }, - { url = "https://files.pythonhosted.org/packages/44/fb/dfb2dfdd3e488bb14f822d7335653092dde150cffc2da97de6e7500681f9/pyarrow-20.0.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5f0fb1041267e9968c6d0d2ce3ff92e3928b243e2b6d11eeb84d9ac547308232", size = 41334704, upload_time = "2025-04-27T12:28:55.064Z" }, - { url = "https://files.pythonhosted.org/packages/58/0d/08a95878d38808051a953e887332d4a76bc06c6ee04351918ee1155407eb/pyarrow-20.0.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b8ff87cc837601532cc8242d2f7e09b4e02404de1b797aee747dd4ba4bd6313f", size = 42399836, upload_time = "2025-04-27T12:29:02.13Z" }, - { url = "https://files.pythonhosted.org/packages/f3/cd/efa271234dfe38f0271561086eedcad7bc0f2ddd1efba423916ff0883684/pyarrow-20.0.0-cp311-cp311-manylinux_2_28_aarch64.whl", hash = "sha256:7a3a5dcf54286e6141d5114522cf31dd67a9e7c9133d150799f30ee302a7a1ab", size = 40711789, upload_time = "2025-04-27T12:29:09.951Z" }, - { url = "https://files.pythonhosted.org/packages/46/1f/7f02009bc7fc8955c391defee5348f510e589a020e4b40ca05edcb847854/pyarrow-20.0.0-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:a6ad3e7758ecf559900261a4df985662df54fb7fdb55e8e3b3aa99b23d526b62", size = 42301124, upload_time = "2025-04-27T12:29:17.187Z" }, - { url = "https://files.pythonhosted.org/packages/4f/92/692c562be4504c262089e86757a9048739fe1acb4024f92d39615e7bab3f/pyarrow-20.0.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:6bb830757103a6cb300a04610e08d9636f0cd223d32f388418ea893a3e655f1c", size = 42916060, upload_time = "2025-04-27T12:29:24.253Z" }, - { url = "https://files.pythonhosted.org/packages/a4/ec/9f5c7e7c828d8e0a3c7ef50ee62eca38a7de2fa6eb1b8fa43685c9414fef/pyarrow-20.0.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:96e37f0766ecb4514a899d9a3554fadda770fb57ddf42b63d80f14bc20aa7db3", size = 44547640, upload_time = "2025-04-27T12:29:32.782Z" }, - { url = "https://files.pythonhosted.org/packages/54/96/46613131b4727f10fd2ffa6d0d6f02efcc09a0e7374eff3b5771548aa95b/pyarrow-20.0.0-cp311-cp311-win_amd64.whl", hash = "sha256:3346babb516f4b6fd790da99b98bed9708e3f02e734c84971faccb20736848dc", size = 25781491, upload_time = "2025-04-27T12:29:38.464Z" }, - { url = "https://files.pythonhosted.org/packages/a1/d6/0c10e0d54f6c13eb464ee9b67a68b8c71bcf2f67760ef5b6fbcddd2ab05f/pyarrow-20.0.0-cp312-cp312-macosx_12_0_arm64.whl", hash = "sha256:75a51a5b0eef32727a247707d4755322cb970be7e935172b6a3a9f9ae98404ba", size = 30815067, upload_time = "2025-04-27T12:29:44.384Z" }, - { url = "https://files.pythonhosted.org/packages/7e/e2/04e9874abe4094a06fd8b0cbb0f1312d8dd7d707f144c2ec1e5e8f452ffa/pyarrow-20.0.0-cp312-cp312-macosx_12_0_x86_64.whl", hash = "sha256:211d5e84cecc640c7a3ab900f930aaff5cd2702177e0d562d426fb7c4f737781", size = 32297128, upload_time = "2025-04-27T12:29:52.038Z" }, - { url = "https://files.pythonhosted.org/packages/31/fd/c565e5dcc906a3b471a83273039cb75cb79aad4a2d4a12f76cc5ae90a4b8/pyarrow-20.0.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4ba3cf4182828be7a896cbd232aa8dd6a31bd1f9e32776cc3796c012855e1199", size = 41334890, upload_time = "2025-04-27T12:29:59.452Z" }, - { url = "https://files.pythonhosted.org/packages/af/a9/3bdd799e2c9b20c1ea6dc6fa8e83f29480a97711cf806e823f808c2316ac/pyarrow-20.0.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2c3a01f313ffe27ac4126f4c2e5ea0f36a5fc6ab51f8726cf41fee4b256680bd", size = 42421775, upload_time = "2025-04-27T12:30:06.875Z" }, - { url = "https://files.pythonhosted.org/packages/10/f7/da98ccd86354c332f593218101ae56568d5dcedb460e342000bd89c49cc1/pyarrow-20.0.0-cp312-cp312-manylinux_2_28_aarch64.whl", hash = "sha256:a2791f69ad72addd33510fec7bb14ee06c2a448e06b649e264c094c5b5f7ce28", size = 40687231, upload_time = "2025-04-27T12:30:13.954Z" }, - { url = "https://files.pythonhosted.org/packages/bb/1b/2168d6050e52ff1e6cefc61d600723870bf569cbf41d13db939c8cf97a16/pyarrow-20.0.0-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:4250e28a22302ce8692d3a0e8ec9d9dde54ec00d237cff4dfa9c1fbf79e472a8", size = 42295639, upload_time = "2025-04-27T12:30:21.949Z" }, - { url = "https://files.pythonhosted.org/packages/b2/66/2d976c0c7158fd25591c8ca55aee026e6d5745a021915a1835578707feb3/pyarrow-20.0.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:89e030dc58fc760e4010148e6ff164d2f44441490280ef1e97a542375e41058e", size = 42908549, upload_time = "2025-04-27T12:30:29.551Z" }, - { url = "https://files.pythonhosted.org/packages/31/a9/dfb999c2fc6911201dcbf348247f9cc382a8990f9ab45c12eabfd7243a38/pyarrow-20.0.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:6102b4864d77102dbbb72965618e204e550135a940c2534711d5ffa787df2a5a", size = 44557216, upload_time = "2025-04-27T12:30:36.977Z" }, - { url = "https://files.pythonhosted.org/packages/a0/8e/9adee63dfa3911be2382fb4d92e4b2e7d82610f9d9f668493bebaa2af50f/pyarrow-20.0.0-cp312-cp312-win_amd64.whl", hash = "sha256:96d6a0a37d9c98be08f5ed6a10831d88d52cac7b13f5287f1e0f625a0de8062b", size = 25660496, upload_time = "2025-04-27T12:30:42.809Z" }, - { url = "https://files.pythonhosted.org/packages/9b/aa/daa413b81446d20d4dad2944110dcf4cf4f4179ef7f685dd5a6d7570dc8e/pyarrow-20.0.0-cp313-cp313-macosx_12_0_arm64.whl", hash = "sha256:a15532e77b94c61efadde86d10957950392999503b3616b2ffcef7621a002893", size = 30798501, upload_time = "2025-04-27T12:30:48.351Z" }, - { url = "https://files.pythonhosted.org/packages/ff/75/2303d1caa410925de902d32ac215dc80a7ce7dd8dfe95358c165f2adf107/pyarrow-20.0.0-cp313-cp313-macosx_12_0_x86_64.whl", hash = "sha256:dd43f58037443af715f34f1322c782ec463a3c8a94a85fdb2d987ceb5658e061", size = 32277895, upload_time = "2025-04-27T12:30:55.238Z" }, - { url = "https://files.pythonhosted.org/packages/92/41/fe18c7c0b38b20811b73d1bdd54b1fccba0dab0e51d2048878042d84afa8/pyarrow-20.0.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:aa0d288143a8585806e3cc7c39566407aab646fb9ece164609dac1cfff45f6ae", size = 41327322, upload_time = "2025-04-27T12:31:05.587Z" }, - { url = "https://files.pythonhosted.org/packages/da/ab/7dbf3d11db67c72dbf36ae63dcbc9f30b866c153b3a22ef728523943eee6/pyarrow-20.0.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b6953f0114f8d6f3d905d98e987d0924dabce59c3cda380bdfaa25a6201563b4", size = 42411441, upload_time = "2025-04-27T12:31:15.675Z" }, - { url = "https://files.pythonhosted.org/packages/90/c3/0c7da7b6dac863af75b64e2f827e4742161128c350bfe7955b426484e226/pyarrow-20.0.0-cp313-cp313-manylinux_2_28_aarch64.whl", hash = "sha256:991f85b48a8a5e839b2128590ce07611fae48a904cae6cab1f089c5955b57eb5", size = 40677027, upload_time = "2025-04-27T12:31:24.631Z" }, - { url = "https://files.pythonhosted.org/packages/be/27/43a47fa0ff9053ab5203bb3faeec435d43c0d8bfa40179bfd076cdbd4e1c/pyarrow-20.0.0-cp313-cp313-manylinux_2_28_x86_64.whl", hash = "sha256:97c8dc984ed09cb07d618d57d8d4b67a5100a30c3818c2fb0b04599f0da2de7b", size = 42281473, upload_time = "2025-04-27T12:31:31.311Z" }, - { url = "https://files.pythonhosted.org/packages/bc/0b/d56c63b078876da81bbb9ba695a596eabee9b085555ed12bf6eb3b7cab0e/pyarrow-20.0.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:9b71daf534f4745818f96c214dbc1e6124d7daf059167330b610fc69b6f3d3e3", size = 42893897, upload_time = "2025-04-27T12:31:39.406Z" }, - { url = "https://files.pythonhosted.org/packages/92/ac/7d4bd020ba9145f354012838692d48300c1b8fe5634bfda886abcada67ed/pyarrow-20.0.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:e8b88758f9303fa5a83d6c90e176714b2fd3852e776fc2d7e42a22dd6c2fb368", size = 44543847, upload_time = "2025-04-27T12:31:45.997Z" }, - { url = "https://files.pythonhosted.org/packages/9d/07/290f4abf9ca702c5df7b47739c1b2c83588641ddfa2cc75e34a301d42e55/pyarrow-20.0.0-cp313-cp313-win_amd64.whl", hash = "sha256:30b3051b7975801c1e1d387e17c588d8ab05ced9b1e14eec57915f79869b5031", size = 25653219, upload_time = "2025-04-27T12:31:54.11Z" }, - { url = "https://files.pythonhosted.org/packages/95/df/720bb17704b10bd69dde086e1400b8eefb8f58df3f8ac9cff6c425bf57f1/pyarrow-20.0.0-cp313-cp313t-macosx_12_0_arm64.whl", hash = "sha256:ca151afa4f9b7bc45bcc791eb9a89e90a9eb2772767d0b1e5389609c7d03db63", size = 30853957, upload_time = "2025-04-27T12:31:59.215Z" }, - { url = "https://files.pythonhosted.org/packages/d9/72/0d5f875efc31baef742ba55a00a25213a19ea64d7176e0fe001c5d8b6e9a/pyarrow-20.0.0-cp313-cp313t-macosx_12_0_x86_64.whl", hash = "sha256:4680f01ecd86e0dd63e39eb5cd59ef9ff24a9d166db328679e36c108dc993d4c", size = 32247972, upload_time = "2025-04-27T12:32:05.369Z" }, - { url = "https://files.pythonhosted.org/packages/d5/bc/e48b4fa544d2eea72f7844180eb77f83f2030b84c8dad860f199f94307ed/pyarrow-20.0.0-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7f4c8534e2ff059765647aa69b75d6543f9fef59e2cd4c6d18015192565d2b70", size = 41256434, upload_time = "2025-04-27T12:32:11.814Z" }, - { url = "https://files.pythonhosted.org/packages/c3/01/974043a29874aa2cf4f87fb07fd108828fc7362300265a2a64a94965e35b/pyarrow-20.0.0-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3e1f8a47f4b4ae4c69c4d702cfbdfe4d41e18e5c7ef6f1bb1c50918c1e81c57b", size = 42353648, upload_time = "2025-04-27T12:32:20.766Z" }, - { url = "https://files.pythonhosted.org/packages/68/95/cc0d3634cde9ca69b0e51cbe830d8915ea32dda2157560dda27ff3b3337b/pyarrow-20.0.0-cp313-cp313t-manylinux_2_28_aarch64.whl", hash = "sha256:a1f60dc14658efaa927f8214734f6a01a806d7690be4b3232ba526836d216122", size = 40619853, upload_time = "2025-04-27T12:32:28.1Z" }, - { url = "https://files.pythonhosted.org/packages/29/c2/3ad40e07e96a3e74e7ed7cc8285aadfa84eb848a798c98ec0ad009eb6bcc/pyarrow-20.0.0-cp313-cp313t-manylinux_2_28_x86_64.whl", hash = "sha256:204a846dca751428991346976b914d6d2a82ae5b8316a6ed99789ebf976551e6", size = 42241743, upload_time = "2025-04-27T12:32:35.792Z" }, - { url = "https://files.pythonhosted.org/packages/eb/cb/65fa110b483339add6a9bc7b6373614166b14e20375d4daa73483755f830/pyarrow-20.0.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:f3b117b922af5e4c6b9a9115825726cac7d8b1421c37c2b5e24fbacc8930612c", size = 42839441, upload_time = "2025-04-27T12:32:46.64Z" }, - { url = "https://files.pythonhosted.org/packages/98/7b/f30b1954589243207d7a0fbc9997401044bf9a033eec78f6cb50da3f304a/pyarrow-20.0.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:e724a3fd23ae5b9c010e7be857f4405ed5e679db5c93e66204db1a69f733936a", size = 44503279, upload_time = "2025-04-27T12:32:56.503Z" }, - { url = "https://files.pythonhosted.org/packages/37/40/ad395740cd641869a13bcf60851296c89624662575621968dcfafabaa7f6/pyarrow-20.0.0-cp313-cp313t-win_amd64.whl", hash = "sha256:82f1ee5133bd8f49d31be1299dc07f585136679666b502540db854968576faf9", size = 25944982, upload_time = "2025-04-27T12:33:04.72Z" }, - { url = "https://files.pythonhosted.org/packages/10/53/421820fa125138c868729b930d4bc487af2c4b01b1c6104818aab7e98f13/pyarrow-20.0.0-cp39-cp39-macosx_12_0_arm64.whl", hash = "sha256:1bcbe471ef3349be7714261dea28fe280db574f9d0f77eeccc195a2d161fd861", size = 30844702, upload_time = "2025-04-27T12:33:12.122Z" }, - { url = "https://files.pythonhosted.org/packages/2e/70/fd75e03312b715e90d928fb91ed8d45c9b0520346e5231b1c69293afd4c7/pyarrow-20.0.0-cp39-cp39-macosx_12_0_x86_64.whl", hash = "sha256:a18a14baef7d7ae49247e75641fd8bcbb39f44ed49a9fc4ec2f65d5031aa3b96", size = 32287180, upload_time = "2025-04-27T12:33:20.597Z" }, - { url = "https://files.pythonhosted.org/packages/c4/e3/21e5758e46219fdedf5e6c800574dd9d17e962e80014cfe08d6d475be863/pyarrow-20.0.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cb497649e505dc36542d0e68eca1a3c94ecbe9799cb67b578b55f2441a247fbc", size = 41351968, upload_time = "2025-04-27T12:33:28.215Z" }, - { url = "https://files.pythonhosted.org/packages/ac/f5/ed6a4c4b11f9215092a35097a985485bb7d879cb79d93d203494e8604f4e/pyarrow-20.0.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:11529a2283cb1f6271d7c23e4a8f9f8b7fd173f7360776b668e509d712a02eec", size = 42415208, upload_time = "2025-04-27T12:33:37.04Z" }, - { url = "https://files.pythonhosted.org/packages/44/e5/466a63668ba25788ee8d38d55f853a60469ae7ad1cda343db9f3f45e0b0a/pyarrow-20.0.0-cp39-cp39-manylinux_2_28_aarch64.whl", hash = "sha256:6fc1499ed3b4b57ee4e090e1cea6eb3584793fe3d1b4297bbf53f09b434991a5", size = 40708556, upload_time = "2025-04-27T12:33:46.483Z" }, - { url = "https://files.pythonhosted.org/packages/e8/d7/4c4d4e4cf6e53e16a519366dfe9223ee4a7a38e6e28c1c0d372b38ba3fe7/pyarrow-20.0.0-cp39-cp39-manylinux_2_28_x86_64.whl", hash = "sha256:db53390eaf8a4dab4dbd6d93c85c5cf002db24902dbff0ca7d988beb5c9dd15b", size = 42291754, upload_time = "2025-04-27T12:33:55.4Z" }, - { url = "https://files.pythonhosted.org/packages/07/d5/79effb32585b7c18897d3047a2163034f3f9c944d12f7b2fd8df6a2edc70/pyarrow-20.0.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:851c6a8260ad387caf82d2bbf54759130534723e37083111d4ed481cb253cc0d", size = 42936483, upload_time = "2025-04-27T12:34:03.694Z" }, - { url = "https://files.pythonhosted.org/packages/09/5c/f707603552c058b2e9129732de99a67befb1f13f008cc58856304a62c38b/pyarrow-20.0.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:e22f80b97a271f0a7d9cd07394a7d348f80d3ac63ed7cc38b6d1b696ab3b2619", size = 44558895, upload_time = "2025-04-27T12:34:13.26Z" }, - { url = "https://files.pythonhosted.org/packages/26/cc/1eb6a01c1bbc787f596c270c46bcd2273e35154a84afcb1d0cb4cc72457e/pyarrow-20.0.0-cp39-cp39-win_amd64.whl", hash = "sha256:9965a050048ab02409fb7cbbefeedba04d3d67f2cc899eff505cc084345959ca", size = 25785667, upload_time = "2025-04-27T12:34:19.739Z" }, + { url = "https://files.pythonhosted.org/packages/36/01/b23b514d86b839956238d3f8ef206fd2728eee87ff1b8ce150a5678d9721/pyarrow-19.0.1-cp310-cp310-macosx_12_0_arm64.whl", hash = "sha256:fc28912a2dc924dddc2087679cc8b7263accc71b9ff025a1362b004711661a69", size = 30688914, upload_time = "2025-02-18T18:51:37.575Z" }, + { url = "https://files.pythonhosted.org/packages/c6/68/218ff7cf4a0652a933e5f2ed11274f724dd43b9813cb18dd72c0a35226a2/pyarrow-19.0.1-cp310-cp310-macosx_12_0_x86_64.whl", hash = "sha256:fca15aabbe9b8355800d923cc2e82c8ef514af321e18b437c3d782aa884eaeec", size = 32102866, upload_time = "2025-02-18T18:51:44.358Z" }, + { url = "https://files.pythonhosted.org/packages/98/01/c295050d183014f4a2eb796d7d2bbfa04b6cccde7258bb68aacf6f18779b/pyarrow-19.0.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ad76aef7f5f7e4a757fddcdcf010a8290958f09e3470ea458c80d26f4316ae89", size = 41147682, upload_time = "2025-02-18T18:51:49.481Z" }, + { url = "https://files.pythonhosted.org/packages/40/17/a6c3db0b5f3678f33bbb552d2acbc16def67f89a72955b67b0109af23eb0/pyarrow-19.0.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d03c9d6f2a3dffbd62671ca070f13fc527bb1867b4ec2b98c7eeed381d4f389a", size = 42179192, upload_time = "2025-02-18T18:51:56.265Z" }, + { url = "https://files.pythonhosted.org/packages/cf/75/c7c8e599300d8cebb6cb339014800e1c720c9db2a3fcb66aa64ec84bac72/pyarrow-19.0.1-cp310-cp310-manylinux_2_28_aarch64.whl", hash = "sha256:65cf9feebab489b19cdfcfe4aa82f62147218558d8d3f0fc1e9dea0ab8e7905a", size = 40517272, upload_time = "2025-02-18T18:52:02.969Z" }, + { url = "https://files.pythonhosted.org/packages/ef/c9/68ab123ee1528699c4d5055f645ecd1dd68ff93e4699527249d02f55afeb/pyarrow-19.0.1-cp310-cp310-manylinux_2_28_x86_64.whl", hash = "sha256:41f9706fbe505e0abc10e84bf3a906a1338905cbbcf1177b71486b03e6ea6608", size = 42069036, upload_time = "2025-02-18T18:52:10.173Z" }, + { url = "https://files.pythonhosted.org/packages/54/e3/d5cfd7654084e6c0d9c3ce949e5d9e0ccad569ae1e2d5a68a3ec03b2be89/pyarrow-19.0.1-cp310-cp310-win_amd64.whl", hash = "sha256:c6cb2335a411b713fdf1e82a752162f72d4a7b5dbc588e32aa18383318b05866", size = 25277951, upload_time = "2025-02-18T18:52:15.459Z" }, + { url = "https://files.pythonhosted.org/packages/a0/55/f1a8d838ec07fe3ca53edbe76f782df7b9aafd4417080eebf0b42aab0c52/pyarrow-19.0.1-cp311-cp311-macosx_12_0_arm64.whl", hash = "sha256:cc55d71898ea30dc95900297d191377caba257612f384207fe9f8293b5850f90", size = 30713987, upload_time = "2025-02-18T18:52:20.463Z" }, + { url = "https://files.pythonhosted.org/packages/13/12/428861540bb54c98a140ae858a11f71d041ef9e501e6b7eb965ca7909505/pyarrow-19.0.1-cp311-cp311-macosx_12_0_x86_64.whl", hash = "sha256:7a544ec12de66769612b2d6988c36adc96fb9767ecc8ee0a4d270b10b1c51e00", size = 32135613, upload_time = "2025-02-18T18:52:25.29Z" }, + { url = "https://files.pythonhosted.org/packages/2f/8a/23d7cc5ae2066c6c736bce1db8ea7bc9ac3ef97ac7e1c1667706c764d2d9/pyarrow-19.0.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0148bb4fc158bfbc3d6dfe5001d93ebeed253793fff4435167f6ce1dc4bddeae", size = 41149147, upload_time = "2025-02-18T18:52:30.975Z" }, + { url = "https://files.pythonhosted.org/packages/a2/7a/845d151bb81a892dfb368bf11db584cf8b216963ccce40a5cf50a2492a18/pyarrow-19.0.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f24faab6ed18f216a37870d8c5623f9c044566d75ec586ef884e13a02a9d62c5", size = 42178045, upload_time = "2025-02-18T18:52:36.859Z" }, + { url = "https://files.pythonhosted.org/packages/a7/31/e7282d79a70816132cf6cae7e378adfccce9ae10352d21c2fecf9d9756dd/pyarrow-19.0.1-cp311-cp311-manylinux_2_28_aarch64.whl", hash = "sha256:4982f8e2b7afd6dae8608d70ba5bd91699077323f812a0448d8b7abdff6cb5d3", size = 40532998, upload_time = "2025-02-18T18:52:42.578Z" }, + { url = "https://files.pythonhosted.org/packages/b8/82/20f3c290d6e705e2ee9c1fa1d5a0869365ee477e1788073d8b548da8b64c/pyarrow-19.0.1-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:49a3aecb62c1be1d822f8bf629226d4a96418228a42f5b40835c1f10d42e4db6", size = 42084055, upload_time = "2025-02-18T18:52:48.749Z" }, + { url = "https://files.pythonhosted.org/packages/ff/77/e62aebd343238863f2c9f080ad2ef6ace25c919c6ab383436b5b81cbeef7/pyarrow-19.0.1-cp311-cp311-win_amd64.whl", hash = "sha256:008a4009efdb4ea3d2e18f05cd31f9d43c388aad29c636112c2966605ba33466", size = 25283133, upload_time = "2025-02-18T18:52:54.549Z" }, + { url = "https://files.pythonhosted.org/packages/78/b4/94e828704b050e723f67d67c3535cf7076c7432cd4cf046e4bb3b96a9c9d/pyarrow-19.0.1-cp312-cp312-macosx_12_0_arm64.whl", hash = "sha256:80b2ad2b193e7d19e81008a96e313fbd53157945c7be9ac65f44f8937a55427b", size = 30670749, upload_time = "2025-02-18T18:53:00.062Z" }, + { url = "https://files.pythonhosted.org/packages/7e/3b/4692965e04bb1df55e2c314c4296f1eb12b4f3052d4cf43d29e076aedf66/pyarrow-19.0.1-cp312-cp312-macosx_12_0_x86_64.whl", hash = "sha256:ee8dec072569f43835932a3b10c55973593abc00936c202707a4ad06af7cb294", size = 32128007, upload_time = "2025-02-18T18:53:06.581Z" }, + { url = "https://files.pythonhosted.org/packages/22/f7/2239af706252c6582a5635c35caa17cb4d401cd74a87821ef702e3888957/pyarrow-19.0.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4d5d1ec7ec5324b98887bdc006f4d2ce534e10e60f7ad995e7875ffa0ff9cb14", size = 41144566, upload_time = "2025-02-18T18:53:11.958Z" }, + { url = "https://files.pythonhosted.org/packages/fb/e3/c9661b2b2849cfefddd9fd65b64e093594b231b472de08ff658f76c732b2/pyarrow-19.0.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f3ad4c0eb4e2a9aeb990af6c09e6fa0b195c8c0e7b272ecc8d4d2b6574809d34", size = 42202991, upload_time = "2025-02-18T18:53:17.678Z" }, + { url = "https://files.pythonhosted.org/packages/fe/4f/a2c0ed309167ef436674782dfee4a124570ba64299c551e38d3fdaf0a17b/pyarrow-19.0.1-cp312-cp312-manylinux_2_28_aarch64.whl", hash = "sha256:d383591f3dcbe545f6cc62daaef9c7cdfe0dff0fb9e1c8121101cabe9098cfa6", size = 40507986, upload_time = "2025-02-18T18:53:26.263Z" }, + { url = "https://files.pythonhosted.org/packages/27/2e/29bb28a7102a6f71026a9d70d1d61df926887e36ec797f2e6acfd2dd3867/pyarrow-19.0.1-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:b4c4156a625f1e35d6c0b2132635a237708944eb41df5fbe7d50f20d20c17832", size = 42087026, upload_time = "2025-02-18T18:53:33.063Z" }, + { url = "https://files.pythonhosted.org/packages/16/33/2a67c0f783251106aeeee516f4806161e7b481f7d744d0d643d2f30230a5/pyarrow-19.0.1-cp312-cp312-win_amd64.whl", hash = "sha256:5bd1618ae5e5476b7654c7b55a6364ae87686d4724538c24185bbb2952679960", size = 25250108, upload_time = "2025-02-18T18:53:38.462Z" }, + { url = "https://files.pythonhosted.org/packages/2b/8d/275c58d4b00781bd36579501a259eacc5c6dfb369be4ddeb672ceb551d2d/pyarrow-19.0.1-cp313-cp313-macosx_12_0_arm64.whl", hash = "sha256:e45274b20e524ae5c39d7fc1ca2aa923aab494776d2d4b316b49ec7572ca324c", size = 30653552, upload_time = "2025-02-18T18:53:44.357Z" }, + { url = "https://files.pythonhosted.org/packages/a0/9e/e6aca5cc4ef0c7aec5f8db93feb0bde08dbad8c56b9014216205d271101b/pyarrow-19.0.1-cp313-cp313-macosx_12_0_x86_64.whl", hash = "sha256:d9dedeaf19097a143ed6da37f04f4051aba353c95ef507764d344229b2b740ae", size = 32103413, upload_time = "2025-02-18T18:53:52.971Z" }, + { url = "https://files.pythonhosted.org/packages/6a/fa/a7033f66e5d4f1308c7eb0dfcd2ccd70f881724eb6fd1776657fdf65458f/pyarrow-19.0.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6ebfb5171bb5f4a52319344ebbbecc731af3f021e49318c74f33d520d31ae0c4", size = 41134869, upload_time = "2025-02-18T18:53:59.471Z" }, + { url = "https://files.pythonhosted.org/packages/2d/92/34d2569be8e7abdc9d145c98dc410db0071ac579b92ebc30da35f500d630/pyarrow-19.0.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f2a21d39fbdb948857f67eacb5bbaaf36802de044ec36fbef7a1c8f0dd3a4ab2", size = 42192626, upload_time = "2025-02-18T18:54:06.062Z" }, + { url = "https://files.pythonhosted.org/packages/0a/1f/80c617b1084fc833804dc3309aa9d8daacd46f9ec8d736df733f15aebe2c/pyarrow-19.0.1-cp313-cp313-manylinux_2_28_aarch64.whl", hash = "sha256:99bc1bec6d234359743b01e70d4310d0ab240c3d6b0da7e2a93663b0158616f6", size = 40496708, upload_time = "2025-02-18T18:54:12.347Z" }, + { url = "https://files.pythonhosted.org/packages/e6/90/83698fcecf939a611c8d9a78e38e7fed7792dcc4317e29e72cf8135526fb/pyarrow-19.0.1-cp313-cp313-manylinux_2_28_x86_64.whl", hash = "sha256:1b93ef2c93e77c442c979b0d596af45e4665d8b96da598db145b0fec014b9136", size = 42075728, upload_time = "2025-02-18T18:54:19.364Z" }, + { url = "https://files.pythonhosted.org/packages/40/49/2325f5c9e7a1c125c01ba0c509d400b152c972a47958768e4e35e04d13d8/pyarrow-19.0.1-cp313-cp313-win_amd64.whl", hash = "sha256:d9d46e06846a41ba906ab25302cf0fd522f81aa2a85a71021826f34639ad31ef", size = 25242568, upload_time = "2025-02-18T18:54:25.846Z" }, + { url = "https://files.pythonhosted.org/packages/3f/72/135088d995a759d4d916ec4824cb19e066585b4909ebad4ab196177aa825/pyarrow-19.0.1-cp313-cp313t-macosx_12_0_arm64.whl", hash = "sha256:c0fe3dbbf054a00d1f162fda94ce236a899ca01123a798c561ba307ca38af5f0", size = 30702371, upload_time = "2025-02-18T18:54:30.665Z" }, + { url = "https://files.pythonhosted.org/packages/2e/01/00beeebd33d6bac701f20816a29d2018eba463616bbc07397fdf99ac4ce3/pyarrow-19.0.1-cp313-cp313t-macosx_12_0_x86_64.whl", hash = "sha256:96606c3ba57944d128e8a8399da4812f56c7f61de8c647e3470b417f795d0ef9", size = 32116046, upload_time = "2025-02-18T18:54:35.995Z" }, + { url = "https://files.pythonhosted.org/packages/1f/c9/23b1ea718dfe967cbd986d16cf2a31fe59d015874258baae16d7ea0ccabc/pyarrow-19.0.1-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8f04d49a6b64cf24719c080b3c2029a3a5b16417fd5fd7c4041f94233af732f3", size = 41091183, upload_time = "2025-02-18T18:54:42.662Z" }, + { url = "https://files.pythonhosted.org/packages/3a/d4/b4a3aa781a2c715520aa8ab4fe2e7fa49d33a1d4e71c8fc6ab7b5de7a3f8/pyarrow-19.0.1-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5a9137cf7e1640dce4c190551ee69d478f7121b5c6f323553b319cac936395f6", size = 42171896, upload_time = "2025-02-18T18:54:49.808Z" }, + { url = "https://files.pythonhosted.org/packages/23/1b/716d4cd5a3cbc387c6e6745d2704c4b46654ba2668260d25c402626c5ddb/pyarrow-19.0.1-cp313-cp313t-manylinux_2_28_aarch64.whl", hash = "sha256:7c1bca1897c28013db5e4c83944a2ab53231f541b9e0c3f4791206d0c0de389a", size = 40464851, upload_time = "2025-02-18T18:54:57.073Z" }, + { url = "https://files.pythonhosted.org/packages/ed/bd/54907846383dcc7ee28772d7e646f6c34276a17da740002a5cefe90f04f7/pyarrow-19.0.1-cp313-cp313t-manylinux_2_28_x86_64.whl", hash = "sha256:58d9397b2e273ef76264b45531e9d552d8ec8a6688b7390b5be44c02a37aade8", size = 42085744, upload_time = "2025-02-18T18:55:08.562Z" }, + { url = "https://files.pythonhosted.org/packages/16/26/0ec396ebe98adefaffc0fff8e0dc14c8912e61093226284cf4b76faffd22/pyarrow-19.0.1-cp39-cp39-macosx_12_0_arm64.whl", hash = "sha256:b9766a47a9cb56fefe95cb27f535038b5a195707a08bf61b180e642324963b46", size = 30701112, upload_time = "2025-02-18T18:55:15.112Z" }, + { url = "https://files.pythonhosted.org/packages/ba/10/c35d96686bf7f13e55bb87f06fe06e7d95533c271ef7f9a5a76e26b16fc2/pyarrow-19.0.1-cp39-cp39-macosx_12_0_x86_64.whl", hash = "sha256:6c5941c1aac89a6c2f2b16cd64fe76bcdb94b2b1e99ca6459de4e6f07638d755", size = 32117180, upload_time = "2025-02-18T18:55:20.073Z" }, + { url = "https://files.pythonhosted.org/packages/8c/0d/81881a55302b6847ea2ea187517faa039c219d80b55050904e354c2eddde/pyarrow-19.0.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fd44d66093a239358d07c42a91eebf5015aa54fccba959db899f932218ac9cc8", size = 41161334, upload_time = "2025-02-18T18:55:26.155Z" }, + { url = "https://files.pythonhosted.org/packages/af/17/ea60a07ec6f6bb0740f11715e0d22ab8fdfcc94bc729832321f498370d75/pyarrow-19.0.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:335d170e050bcc7da867a1ed8ffb8b44c57aaa6e0843b156a501298657b1e972", size = 42190375, upload_time = "2025-02-18T18:55:34.216Z" }, + { url = "https://files.pythonhosted.org/packages/f2/87/4ef05a088b18082cde4950bdfca752dd31effb3ec201b8026e4816d0f3fa/pyarrow-19.0.1-cp39-cp39-manylinux_2_28_aarch64.whl", hash = "sha256:1c7556165bd38cf0cd992df2636f8bcdd2d4b26916c6b7e646101aff3c16f76f", size = 40530649, upload_time = "2025-02-18T18:55:41.864Z" }, + { url = "https://files.pythonhosted.org/packages/59/1e/9fb9a66a64eae4ff332a8f149d803d8c6c556714803d20d54ed2e9524a3b/pyarrow-19.0.1-cp39-cp39-manylinux_2_28_x86_64.whl", hash = "sha256:699799f9c80bebcf1da0983ba86d7f289c5a2a5c04b945e2f2bcf7e874a91911", size = 42081576, upload_time = "2025-02-18T18:55:48.912Z" }, + { url = "https://files.pythonhosted.org/packages/1b/ee/c110d8da8bdde8e832ccf1ff90be747cb684874e2dc8acf26840058b0c32/pyarrow-19.0.1-cp39-cp39-win_amd64.whl", hash = "sha256:8464c9fbe6d94a7fe1599e7e8965f350fd233532868232ab2596a71586c5a429", size = 25465593, upload_time = "2025-02-18T18:55:54.191Z" }, ] [[package]] @@ -803,7 +774,7 @@ wheels = [ [[package]] name = "pyiceberg" -version = "0.9.1" +version = "0.9.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "cachetools" }, @@ -819,36 +790,36 @@ dependencies = [ { name = "strictyaml" }, { name = "tenacity" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/bd/6a/6c1ac381ff0b8e03a9abc2f05722f6002d7452a2c05118697b3f3910e171/pyiceberg-0.9.1.tar.gz", hash = "sha256:3634134ce33859a441768b39df179b2c6f3de2bbbf506622884f553b013ee799", size = 617629, upload_time = "2025-04-30T14:59:34.306Z" } +sdist = { url = "https://files.pythonhosted.org/packages/55/35/1c67977f26eea825104d18fc3f0e01b14e15de41fe9c0d06e5bb501c4be8/pyiceberg-0.9.0.tar.gz", hash = "sha256:70d255903dda31ed1f7753d41fec0c031aae36ef95e8a824cdae7df593439d8b", size = 611994, upload_time = "2025-03-04T15:17:40.692Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/ea/5d/bb10c86b85895d4ba471b8a0e187031d4aaa82592a639242b83dd9354861/pyiceberg-0.9.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:0a183d9217eb82159c01b23c683057f96c8b2375f592b921721d1c157895e2df", size = 527097, upload_time = "2025-04-30T14:58:52.39Z" }, - { url = "https://files.pythonhosted.org/packages/ec/b9/1d6f0d334bc51cd64a58b7320d521e54af3810a6bd748fe2e89db1ad8d5f/pyiceberg-0.9.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:57030bb15c397b0379242907c5611f5b4338fb799e972353fd0edafde6cfd2ef", size = 523267, upload_time = "2025-04-30T14:58:53.978Z" }, - { url = "https://files.pythonhosted.org/packages/02/f5/bd43a9c1d2cd3aeb987cbf2b7f25e2b10306fa81522ea00df250fb23cc84/pyiceberg-0.9.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3ba4cd9a8f6a04cfbc68e0c83f2db3ffd14244da8601a142cc05965d4b343645", size = 838616, upload_time = "2025-04-30T14:58:55.252Z" }, - { url = "https://files.pythonhosted.org/packages/d0/01/c68f9e03413dc983ddadc2c471038af2ff792449fc451731f58a958a7696/pyiceberg-0.9.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:d5a48c6a2016d0dcde8c9079cc5e6b6d2e2ac663eddfe4697e7ea03a0edc40b7", size = 838290, upload_time = "2025-04-30T14:58:56.412Z" }, - { url = "https://files.pythonhosted.org/packages/ab/80/b7cba54a33b8b7be3655ff656d6bb8594fec0316eec5cafa231ec7f6ff74/pyiceberg-0.9.1-cp310-cp310-win_amd64.whl", hash = "sha256:8bebfa5a804a95a9f3d98d88cbeb37430b09add04592238bba2a2b2e0466d60d", size = 523612, upload_time = "2025-04-30T14:58:59.507Z" }, - { url = "https://files.pythonhosted.org/packages/f6/75/c8b4ebba7d345b5e736ebf4976121b97dd7091dcad401a17ca57152704c5/pyiceberg-0.9.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:0e75c502dd56ac3d77036ce8a3b2566348da5ff4367c7c671981616ef6dcc883", size = 566274, upload_time = "2025-04-30T14:59:00.626Z" }, - { url = "https://files.pythonhosted.org/packages/e0/a0/9494c7930e5e4dc951d95abba584d8ffdb7403368398796ede21ff25c26f/pyiceberg-0.9.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:0a8189c9b3ba81dd12493d6bb874a656a4d4909904552b97a629d1d43b3a0e90", size = 560157, upload_time = "2025-04-30T14:59:02.082Z" }, - { url = "https://files.pythonhosted.org/packages/4a/d4/351776b1ae83de187d7cf37b100f4f124c7a71e35337182d3aef308156d1/pyiceberg-0.9.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7c03065d5c5b704444ab8fb18cdd232ec43994db95b9e53444008ebc2cf9dc2c", size = 1052290, upload_time = "2025-04-30T14:59:03.232Z" }, - { url = "https://files.pythonhosted.org/packages/40/17/d8fea681afb52f20bf6a640f9044dcf621a47165f67cc5320bf3c6e82e4e/pyiceberg-0.9.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:93f2586a5da737de6e4643bf096a01772f068d1eedb7ffde6b36c60b6b9e6bd3", size = 1047503, upload_time = "2025-04-30T14:59:04.38Z" }, - { url = "https://files.pythonhosted.org/packages/d0/e0/d173fc2aa8dc252d7aac71703ba2c0491e4988b3a160cf5abb531cfb9086/pyiceberg-0.9.1-cp311-cp311-win_amd64.whl", hash = "sha256:94e45c10051110ba7a43b85a1f0a680b4a31d1d6cee593c8e62e14d22d18c47d", size = 559491, upload_time = "2025-04-30T14:59:05.615Z" }, - { url = "https://files.pythonhosted.org/packages/52/26/77983c2884b4a5f13f8a35e5c5e762ae699f6c511efd16730ab883000c1b/pyiceberg-0.9.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:b8a958e3bbe919026533cee1f0fb6b7040928fce8d42c2ecea228de7c17578fa", size = 605755, upload_time = "2025-04-30T14:59:07.087Z" }, - { url = "https://files.pythonhosted.org/packages/6d/67/e6ea7fcc43aebc85aea5a67a69d01c9015283478061c3121b6b8aa158ce4/pyiceberg-0.9.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:b7e956b35c6822600c45fd8f3ea8cfea328cc406fefa534afeb6fdb325d05406", size = 597325, upload_time = "2025-04-30T14:59:08.644Z" }, - { url = "https://files.pythonhosted.org/packages/7f/cf/178a9f63fac1bfdd13bc85169e7ab903955d082e2cd80507b1921a6f64dc/pyiceberg-0.9.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1e4e585164d7d86f5c9a609a1bc2abeae2f0ea0680a11a2064d3a945866b5311", size = 1277399, upload_time = "2025-04-30T14:59:10.193Z" }, - { url = "https://files.pythonhosted.org/packages/d1/6b/78d1739eb1d5b18529ee438aed75dac3e0b246f5e4d800931f9d1e37cda2/pyiceberg-0.9.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:5fee08dac30e8524526f7d18468f9670f8606905b850b261314c597c6633f3b4", size = 1269083, upload_time = "2025-04-30T14:59:11.964Z" }, - { url = "https://files.pythonhosted.org/packages/67/69/c0087d19c8d8e8530acee3ba485d54aedeebf2963784a16692ca4b439566/pyiceberg-0.9.1-cp312-cp312-win_amd64.whl", hash = "sha256:124793c54a0c2fb5ac4ab19c38da116c068e277c85cbaa7e4064e635a70b595e", size = 595512, upload_time = "2025-04-30T14:59:14.464Z" }, - { url = "https://files.pythonhosted.org/packages/08/12/8d46a700af1a2a9cb41d612115303d462a71646edd0f196ec961b09e9dba/pyiceberg-0.9.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:a6e29eb5ce63e8a14738f3efeb54022093456e02b681f0b8c815f7ef9e20ddcb", size = 488285, upload_time = "2025-04-30T14:59:15.823Z" }, - { url = "https://files.pythonhosted.org/packages/35/47/35b0e1466b79d8a98881c1e5bd02b75a6611d27f8202dcbcc3bbcccd71fc/pyiceberg-0.9.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:1ebd4f74da8a3f7b78ad746c1d91d8cd9aa9cf97f4d36da164e3550f6a06b00e", size = 486373, upload_time = "2025-04-30T14:59:17.297Z" }, - { url = "https://files.pythonhosted.org/packages/97/cf/a55aedec089b521445b6bb18f703e3e8f666f22c7b81db0b8668b6727ed6/pyiceberg-0.9.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b357638a58d9b0a5d7018fbe88fa84469c980c80d86441b7b9cd99871512447d", size = 645018, upload_time = "2025-04-30T14:59:18.41Z" }, - { url = "https://files.pythonhosted.org/packages/fc/b1/32f25ea1905c0e7581d68d30e5a0b69182f9cab0acd3e8a9d1648429a39e/pyiceberg-0.9.1-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:f8a93c1e4ab35195018ce8fbbb6d973e099194ffe06d859bdf069d7b846da7aa", size = 644838, upload_time = "2025-04-30T14:59:19.515Z" }, - { url = "https://files.pythonhosted.org/packages/40/0f/d3ade290baddef6cfa31430e131bb36f3e34a8ec2d3bc5caf107e58dbbda/pyiceberg-0.9.1-cp39-cp39-win_amd64.whl", hash = "sha256:5c1b3598d521476ffce13949ae762a3dec49287198b26de445caa0daf2e395fa", size = 487809, upload_time = "2025-04-30T14:59:20.61Z" }, - { url = "https://files.pythonhosted.org/packages/aa/62/0153ed3a39d6f4b3235d430123703d4684eec7ba780404bbc118ace7406a/pyiceberg-0.9.1-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:77aec1c77d675603e0c5358e74adcae8d13b323753d702011be3f309d26af355", size = 668261, upload_time = "2025-04-30T14:59:21.751Z" }, - { url = "https://files.pythonhosted.org/packages/24/bd/c4cec142686dd8124032c69b6b02ba3703abc114ce787d0f02088b1f43d8/pyiceberg-0.9.1-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:cf567438bf6267bbb67fdfdfc72ac500d523725fca9a6a38f93e8acd4146190e", size = 657439, upload_time = "2025-04-30T14:59:23.304Z" }, - { url = "https://files.pythonhosted.org/packages/ae/74/bbfc70bb1857f9d55d06fee1330a0236876b8ae4aa6fc5d815e2c4fef4f7/pyiceberg-0.9.1-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5992db7c00d789a33ff117700d453126803e769507a5edeb79bb6510ff72fc00", size = 1352983, upload_time = "2025-04-30T14:59:25.023Z" }, - { url = "https://files.pythonhosted.org/packages/90/20/e33e1716d1368b2471b80d9f1e338110f1e781b34ebffc5e320523102ffc/pyiceberg-0.9.1-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:c9e460fca26162a3822c0e8d50b49c80928a0e35cb41698748d7a26f8c016215", size = 657563, upload_time = "2025-04-30T14:59:27.004Z" }, - { url = "https://files.pythonhosted.org/packages/c9/37/9d531ce880a5ccd458a408b0b8d65305201822166d6cabdb6daa5a1f1f6f/pyiceberg-0.9.1-pp39-pypy39_pp73-macosx_10_15_x86_64.whl", hash = "sha256:037aa7a8bfaf7f1482e6a3532217b5f4281bc81db6698c3ea87771d0453a8232", size = 637004, upload_time = "2025-04-30T14:59:28.948Z" }, - { url = "https://files.pythonhosted.org/packages/eb/fd/d370f11fcb8da9c4146356dd635ef6a6615372f1e202e37cb4a9e47fafd5/pyiceberg-0.9.1-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:5150464428a0568c4f46405884bc777dde37935580fb72b0030dfa28805d82e7", size = 627370, upload_time = "2025-04-30T14:59:30.559Z" }, - { url = "https://files.pythonhosted.org/packages/af/66/843ce33ab3dbcce71fa8dec4368f930c4349d0c403990087a2ae996d387e/pyiceberg-0.9.1-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:af2a6c273cfaf2b21b319fcf79489f87604220a0497942303b2a715a9d0f29e9", size = 1315204, upload_time = "2025-04-30T14:59:31.959Z" }, - { url = "https://files.pythonhosted.org/packages/1c/56/f0c7014cd16bd9990bdfa9b901fe6ecc344d6b9775676dc35c48b3a6aca1/pyiceberg-0.9.1-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:023c3fcee36a441b7e20418b6e9cdc6f904141bfda09f8580dfe022d7faa7a53", size = 626539, upload_time = "2025-04-30T14:59:33.17Z" }, + { url = "https://files.pythonhosted.org/packages/46/05/41a3543cfc7f10440df8e4533d4a27a99e221c8d8048a1f38acff76bc764/pyiceberg-0.9.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:b454d186c33aa3f0d03e4fa888df50d4861ffa4cdcc7c6f766237485d9a091d9", size = 525475, upload_time = "2025-03-04T15:16:42.905Z" }, + { url = "https://files.pythonhosted.org/packages/32/22/cf2afaaf7771080efc6e716270d498090408df640ffab3fbbfa4a5bc709c/pyiceberg-0.9.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:e4f6800f8bd5cb30fd095cf58498b45d8c42709330a0ce72df4e92e030eba402", size = 521645, upload_time = "2025-03-04T15:16:45.97Z" }, + { url = "https://files.pythonhosted.org/packages/52/e4/ef7a98aa3595d7403148f5e5279bc15cb5c84653d5566049772f7242c5b9/pyiceberg-0.9.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c7a7f83805dfc3af8aaaa88ac7d208aafe5005400cb9238d2195d8b7113927ef", size = 836989, upload_time = "2025-03-04T15:16:48.035Z" }, + { url = "https://files.pythonhosted.org/packages/3c/0e/2fcdea061032faf11d0343613aacc01e119389b9a5439e45b0b87510e251/pyiceberg-0.9.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:218d31b81c91cd3acf775bd796f8c02740b4bdb8a7bde7278029710c94eb136a", size = 836664, upload_time = "2025-03-04T15:16:50.343Z" }, + { url = "https://files.pythonhosted.org/packages/ef/7d/70eb575b8363a348e98dbca4e79943b1a93e9f65a655e79cdd4a23ae649a/pyiceberg-0.9.0-cp310-cp310-win_amd64.whl", hash = "sha256:f3680ac4aa6bada5a6823d4ded1e78ac86207fd3b275ca1a688bad5cb9191c3b", size = 521952, upload_time = "2025-03-04T15:16:52.947Z" }, + { url = "https://files.pythonhosted.org/packages/87/6a/7d2102aa2c12c2fa858b61006a5dd9bc23a64bd48ed5f5a8b3b15c3e5830/pyiceberg-0.9.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:0e37f2dc0fef4fba1a51e5a7c87d3aee5bb98bdd82cde9f219b5542201919055", size = 564652, upload_time = "2025-03-04T15:16:54.37Z" }, + { url = "https://files.pythonhosted.org/packages/2d/8f/2008df00285d6d028e06daa4b82d48f2d44526f422061a2fa077951e20b7/pyiceberg-0.9.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:b9d4939c41daf94562b9a29ef322fe42e1aa2c886a23cefe23b5f013f27b3854", size = 558538, upload_time = "2025-03-04T15:16:57.415Z" }, + { url = "https://files.pythonhosted.org/packages/12/b7/fd41db8092dfd1d2b19f10c7bd4725da382de3d9650ea022d9ae0a88ee4b/pyiceberg-0.9.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:91c86e00684427d02ace00fb765af13f75bbff3dd813a6e3928f2974b0ff150c", size = 1050661, upload_time = "2025-03-04T15:16:59.762Z" }, + { url = "https://files.pythonhosted.org/packages/d3/65/f42f3fe3d1c63ac6bb913476d90365d3fc8aabb0108445c9e27005334232/pyiceberg-0.9.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:d5c4d6819b2668c3da82683a8f0e69b282b8092c390d7b2c2c99d6234905574c", size = 1045874, upload_time = "2025-03-04T15:17:02.224Z" }, + { url = "https://files.pythonhosted.org/packages/79/6b/6fc237561861b99e1b0c1bb125f58050debf81e798c15ef06aace7054611/pyiceberg-0.9.0-cp311-cp311-win_amd64.whl", hash = "sha256:a1832f49831d92aac3f62462f2d5fbad05eeb5e93f25e0e308c0d8053cab9fa6", size = 557840, upload_time = "2025-03-04T15:17:04.482Z" }, + { url = "https://files.pythonhosted.org/packages/d0/af/5dc5f2aaa65e3508c7eab7a1fafb8d481af9574e8dd1c37a07c57ec5717c/pyiceberg-0.9.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:6b868726045ccc013a723130aaa7cf2f2ddeae359930b0c54de8bc29f7103326", size = 604132, upload_time = "2025-03-04T15:17:06.049Z" }, + { url = "https://files.pythonhosted.org/packages/8c/24/64706626f6e538bdbb412d7efc5afc767c5523480e5fb107bb4b1b75ffcc/pyiceberg-0.9.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:785b5ee8d00b1f38c8643f9c1ca22f2dd034cf9610804972fddfc6ac97ced002", size = 595703, upload_time = "2025-03-04T15:17:07.45Z" }, + { url = "https://files.pythonhosted.org/packages/a7/06/e8d4d667a7e1e9fa8c16ef926a2089672959d5fa3be8dd4dacb6cefe26f8/pyiceberg-0.9.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d6630cac07feb5894c2311be5ca62ffa3432803878fb112ae47c1d3edbd08609", size = 1275772, upload_time = "2025-03-04T15:17:10.419Z" }, + { url = "https://files.pythonhosted.org/packages/e1/31/b5609e727ea6137b27bb8e0559cbab33a9fac4d56dc1e5799c492a962116/pyiceberg-0.9.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:ac640aa29f57b2cb282f9a25427b73373d6fb54e82a589e8cc616f90e6f5e5b7", size = 1267452, upload_time = "2025-03-04T15:17:12.681Z" }, + { url = "https://files.pythonhosted.org/packages/fa/73/211fd2460b894c1b3413e832069168d07f273abdaf2834170ea0035b53f9/pyiceberg-0.9.0-cp312-cp312-win_amd64.whl", hash = "sha256:c13328f6b5bd5210e845e6a69977b38f2d0272ed431d27c825c587b6d7999b5e", size = 593838, upload_time = "2025-03-04T15:17:14.962Z" }, + { url = "https://files.pythonhosted.org/packages/64/4f/fd290363c10ce8d8e8d53957f318bd7429e89acdad8ae1fee2e838a7ba48/pyiceberg-0.9.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:868c795b9bb49cea30b32cee4ba3fceb346664e24abbba5a3c0330a0015388c2", size = 486661, upload_time = "2025-03-04T15:17:16.528Z" }, + { url = "https://files.pythonhosted.org/packages/75/e8/74d44c7e35f8f23e00f060cd8ffb310f5bca2a37d5999854837949703cbd/pyiceberg-0.9.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:58ceef4fbacf4eda19e2b84a9a850ffc661b489e08d5010a2c206583f387df83", size = 484748, upload_time = "2025-03-04T15:17:18.656Z" }, + { url = "https://files.pythonhosted.org/packages/56/05/58c55f5658e7b5a8ff1f1a3423a94dc72621d96e39c50ac9b80f3a85a49a/pyiceberg-0.9.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:38d221a963907a4f706fbd811e638e451efd4491952166550664df156e1ca02c", size = 643384, upload_time = "2025-03-04T15:17:20.97Z" }, + { url = "https://files.pythonhosted.org/packages/36/71/e45e7bb33a3432d892fc31c743b529a2e1c566f6145acbdf6c76035bf5b4/pyiceberg-0.9.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:b7b4de0b94d5f4c83bab443aa449a1714f784953d56f415380a8bc4b5e14c988", size = 643207, upload_time = "2025-03-04T15:17:22.541Z" }, + { url = "https://files.pythonhosted.org/packages/3e/8c/beea9780c70c52ae9f92150901edda472c96b0cfbd4c3e72303b07f43a2a/pyiceberg-0.9.0-cp39-cp39-win_amd64.whl", hash = "sha256:c3bca11ccabfa98a17962b4ffe6d3eaaa83f66d6b997b79c20966907b9c7ccb0", size = 486154, upload_time = "2025-03-04T15:17:23.918Z" }, + { url = "https://files.pythonhosted.org/packages/5b/60/fbcc8847ca1b23dea34f6e69e55e1e87e8bef1496b9e6a4bf3f8e22fb98e/pyiceberg-0.9.0-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:6d818b01ab259f4892e486b960e999b7a724b6829f9e3919d2ec454f5f3f857b", size = 666638, upload_time = "2025-03-04T15:17:25.507Z" }, + { url = "https://files.pythonhosted.org/packages/4b/19/55f93aba1c6fe8fa5f90c32bf1011b1dd7f276b1a9e2136c5867cda50bb1/pyiceberg-0.9.0-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:8161dc350e885d7bdc46f4fb4e9698bf1a84861056687823d53eaeed217e4324", size = 655812, upload_time = "2025-03-04T15:17:27.672Z" }, + { url = "https://files.pythonhosted.org/packages/54/8f/b0b102e795b8524504e8534d774e43f22d049823863d275e753a225baeaf/pyiceberg-0.9.0-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f3bf765b91e96f66a01205a87cd8fd0eb8ffb148fdd9bf621d9a2a3249336116", size = 1351349, upload_time = "2025-03-04T15:17:29.356Z" }, + { url = "https://files.pythonhosted.org/packages/4a/0c/09267e34e2979a71612a3b2d02d25c51fcf35921542fcd9f40bf15073ed0/pyiceberg-0.9.0-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:a9a8699dbdec4ee81ac4dfc77d7489bffac3a7625a28df296657cec1edf79d6d", size = 655880, upload_time = "2025-03-04T15:17:30.882Z" }, + { url = "https://files.pythonhosted.org/packages/53/2d/1e01798c613d1cde58ea87697394680cf0fc96c85e1397d4dafbf2ba954b/pyiceberg-0.9.0-pp39-pypy39_pp73-macosx_10_15_x86_64.whl", hash = "sha256:821c8ff026819038780559207cd32ee0500f719fd51ed2a1ab919b21a60ce5f2", size = 635380, upload_time = "2025-03-04T15:17:33.064Z" }, + { url = "https://files.pythonhosted.org/packages/54/28/574e202c121c8afe3d59962b474c6271e3fe5edb8b980d9cceaca2bcb969/pyiceberg-0.9.0-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:2ed7af929ba1b8faef98113b8da0512914450bdcb90d2fb46efe5319800c36ad", size = 625746, upload_time = "2025-03-04T15:17:34.505Z" }, + { url = "https://files.pythonhosted.org/packages/b7/f1/fca8de00dad04e842e0b3fc9543329b2da32ee5e144d2ff6fd8a78c27642/pyiceberg-0.9.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:936fea58f468359a58e9fd03b7d6b1136bf6c5163a5a666e5ea43ebe70a0dba0", size = 1313574, upload_time = "2025-03-04T15:17:36.719Z" }, + { url = "https://files.pythonhosted.org/packages/00/d7/f774e49496194e90694e270df065bf823bb78eba8bc06d059a0eecbb1180/pyiceberg-0.9.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:76581d226ae67d8be5210bdab60dcdd8fc3a4d6745192a2b446eb746201abdb3", size = 624863, upload_time = "2025-03-04T15:17:39.009Z" }, ] [package.optional-dependencies] @@ -867,7 +838,7 @@ wheels = [ [[package]] name = "pytest" -version = "8.4.0" +version = "8.3.5" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "colorama", marker = "sys_platform == 'win32'" }, @@ -875,12 +846,11 @@ dependencies = [ { name = "iniconfig" }, { name = "packaging" }, { name = "pluggy" }, - { name = "pygments" }, { name = "tomli", marker = "python_full_version < '3.11'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/fb/aa/405082ce2749be5398045152251ac69c0f3578c7077efc53431303af97ce/pytest-8.4.0.tar.gz", hash = "sha256:14d920b48472ea0dbf68e45b96cd1ffda4705f33307dcc86c676c1b5104838a6", size = 1515232, upload_time = "2025-06-02T17:36:30.03Z" } +sdist = { url = "https://files.pythonhosted.org/packages/ae/3c/c9d525a414d506893f0cd8a8d0de7706446213181570cdbd766691164e40/pytest-8.3.5.tar.gz", hash = "sha256:f4efe70cc14e511565ac476b57c279e12a855b11f48f212af1080ef2263d3845", size = 1450891, upload_time = "2025-03-02T12:54:54.503Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/2f/de/afa024cbe022b1b318a3d224125aa24939e99b4ff6f22e0ba639a2eaee47/pytest-8.4.0-py3-none-any.whl", hash = "sha256:f40f825768ad76c0977cbacdf1fd37c6f7a468e460ea6a0636078f8972d4517e", size = 363797, upload_time = "2025-06-02T17:36:27.859Z" }, + { url = "https://files.pythonhosted.org/packages/30/3d/64ad57c803f1fa1e963a7946b6e0fea4a70df53c1a7fed304586539c2bac/pytest-8.3.5-py3-none-any.whl", hash = "sha256:c69214aa47deac29fad6c2a4f590b9c4a9fdb16a403176fe154b79c0b4d4d820", size = 343634, upload_time = "2025-03-02T12:54:52.069Z" }, ] [[package]] @@ -1267,24 +1237,24 @@ dev = [ [package.metadata] requires-dist = [ - { name = "attrs", specifier = ">=24.2.0" }, - { name = "httpx", specifier = ">=0.23.3" }, - { name = "huggingface-hub", marker = "extra == 'ai'", specifier = ">=0.30.2" }, - { name = "ollama", marker = "extra == 'ai'", specifier = ">=0.4.7" }, - { name = "polars", marker = "extra == 'iceberg'", specifier = ">=1.27.1" }, - { name = "pyarrow", marker = "extra == 'iceberg'", specifier = ">=19.0.1" }, - { name = "pyiceberg", marker = "extra == 'iceberg'", specifier = ">=0.9.0" }, - { name = "python-dateutil", specifier = ">=2.9.0.post0" }, + { name = "attrs", specifier = "==24.2.0" }, + { name = "httpx", specifier = "==0.28.1" }, + { name = "huggingface-hub", marker = "extra == 'ai'", specifier = "==0.30.2" }, + { name = "ollama", marker = "extra == 'ai'", specifier = "==0.4.7" }, + { name = "polars", marker = "extra == 'iceberg'", specifier = "==1.27.1" }, + { name = "pyarrow", marker = "extra == 'iceberg'", specifier = "==19.0.1" }, + { name = "pyiceberg", marker = "extra == 'iceberg'", specifier = "==0.9.0" }, + { name = "python-dateutil", specifier = "==2.9.0.post0" }, { name = "tower", extras = ["ai", "iceberg"], marker = "extra == 'all'", editable = "." }, ] provides-extras = ["ai", "iceberg", "all"] [package.metadata.requires-dev] dev = [ - { name = "openapi-python-client", specifier = ">=0.12.1" }, - { name = "pyiceberg", extras = ["sql-sqlite"], specifier = ">=0.9.0" }, - { name = "pytest", specifier = ">=8.3.5" }, - { name = "pytest-httpx", specifier = ">=0.35.0" }, + { name = "openapi-python-client", specifier = "==0.24.3" }, + { name = "pyiceberg", extras = ["sql-sqlite"], specifier = "==0.9.0" }, + { name = "pytest", specifier = "==8.3.5" }, + { name = "pytest-httpx", specifier = "==0.35.0" }, ] [[package]]