Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
22 changes: 11 additions & 11 deletions Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 1 addition & 1 deletion Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ resolver = "2"

[workspace.package]
edition = "2021"
version = "0.3.55"
version = "0.3.56"
description = "Tower is the best way to host Python data apps in production"
rust-version = "1.81"
authors = ["Brad Heller <brad@tower.dev>"]
Expand Down
7 changes: 5 additions & 2 deletions crates/config/src/error.rs
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,9 @@ pub enum Error {
#[snafu(display("No home directory found"))]
NoHomeDir,

#[snafu(display("IO error: {}", source))]
Io { source: std::io::Error },

#[snafu(display("No session file found"))]
NoSession,

Expand All @@ -33,8 +36,8 @@ pub enum Error {
}

impl From<std::io::Error> for Error {
fn from(_: std::io::Error) -> Self {
Error::ConfigDirNotFound
fn from(source: std::io::Error) -> Self {
Error::Io { source }
}
}

Expand Down
20 changes: 18 additions & 2 deletions crates/config/src/lib.rs
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
use serde::{Deserialize, Serialize};
use std::path::PathBuf;
use tower_api::apis::configuration::Configuration;
use tower_api::apis::configuration::{ApiKey, Configuration};
use url::Url;

mod error;
Expand All @@ -9,7 +9,7 @@ mod towerfile;

pub use error::Error;
pub use session::{default_tower_url, Session, Team, Token, User};
pub use towerfile::Towerfile;
pub use towerfile::{Parameter, Towerfile};

pub use session::{get_last_version_check_timestamp, set_last_version_check_timestamp};

Expand All @@ -22,6 +22,9 @@ pub struct Config {
#[serde(skip_serializing, skip_deserializing)]
pub session: Option<Session>,

#[serde(skip_serializing, skip_deserializing)]
pub api_key: Option<String>,

// cache_dir is the directory that we should cache uv artifacts within.
pub cache_dir: Option<PathBuf>,
}
Expand All @@ -33,6 +36,7 @@ impl Config {
tower_url: default_tower_url(),
json: false,
session: None,
api_key: None,
cache_dir: Some(default_cache_dir()),
}
}
Expand All @@ -44,12 +48,14 @@ impl Config {
} else {
default_tower_url()
};
let api_key = std::env::var("TOWER_API_KEY").ok();

Self {
debug,
tower_url,
json: false,
session: None,
api_key,
cache_dir: Some(default_cache_dir()),
}
}
Expand Down Expand Up @@ -78,6 +84,7 @@ impl Config {
tower_url: sess.tower_url.clone(),
json: self.json,
session: Some(sess),
api_key: self.api_key,
cache_dir: Some(default_cache_dir()),
}
}
Expand Down Expand Up @@ -181,6 +188,15 @@ impl Config {

configuration.base_path = base_path.to_string();

// API key takes precedence over session-based auth
if let Some(ref key) = self.api_key {
configuration.api_key = Some(ApiKey {
prefix: None,
key: key.clone(),
});
return configuration;
}

// Always read from disk to pick up team switches
if let Ok(session) = Session::from_config_dir() {
if let Some(active_team) = &session.active_team {
Expand Down
63 changes: 49 additions & 14 deletions crates/config/src/towerfile.rs
Original file line number Diff line number Diff line change
Expand Up @@ -119,14 +119,21 @@ impl Towerfile {
Ok(())
}

/// add_parameter adds a new parameter to the Towerfile
pub fn add_parameter(&mut self, name: String, description: String, default: String) {
self.parameters.push(Parameter {
name,
description,
default,
hidden: false,
});
/// set_parameter upserts a parameter by lookup name. If a parameter with the given name
/// exists, it is replaced. Otherwise, the parameter is appended.
pub fn set_parameter(&mut self, lookup_name: &str, param: Parameter) {
if let Some(existing) = self.parameters.iter_mut().find(|p| p.name == lookup_name) {
*existing = param;
} else {
self.parameters.push(param);
}
}

/// remove_parameter removes a parameter by name, returning true if it was found
pub fn remove_parameter(&mut self, name: &str) -> bool {
let len_before = self.parameters.len();
self.parameters.retain(|p| p.name != name);
self.parameters.len() < len_before
}
}

Expand Down Expand Up @@ -299,20 +306,48 @@ mod test {
}

#[test]
fn test_add_parameter() {
fn test_set_parameter() {
let mut towerfile = crate::Towerfile::default();
assert_eq!(towerfile.parameters.len(), 0);

towerfile.add_parameter(
"test-param".to_string(),
"A test parameter".to_string(),
"default-value".to_string(),
);
towerfile.set_parameter("test-param", crate::Parameter {
name: "test-param".to_string(),
description: "A test parameter".to_string(),
default: "default-value".to_string(),
hidden: false,
});

assert_eq!(towerfile.parameters.len(), 1);
assert_eq!(towerfile.parameters[0].name, "test-param");
assert_eq!(towerfile.parameters[0].description, "A test parameter");
assert_eq!(towerfile.parameters[0].default, "default-value");
assert!(!towerfile.parameters[0].hidden);

// upsert should replace, not duplicate
towerfile.set_parameter("test-param", crate::Parameter {
name: "test-param".to_string(),
description: "Updated".to_string(),
default: "new-value".to_string(),
hidden: false,
});

assert_eq!(towerfile.parameters.len(), 1);
assert_eq!(towerfile.parameters[0].description, "Updated");
}

#[test]
fn test_remove_parameter() {
let mut towerfile = crate::Towerfile::default();
towerfile.set_parameter("param1", crate::Parameter {
name: "param1".to_string(),
description: "".to_string(),
default: "".to_string(),
hidden: false,
});

assert!(towerfile.remove_parameter("param1"));
assert_eq!(towerfile.parameters.len(), 0);
assert!(!towerfile.remove_parameter("param1"));
}

#[test]
Expand Down
Loading
Loading